Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dotnet/aspnetcore.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Fowler <davidfowl@gmail.com>2022-08-25 08:32:42 +0300
committerGitHub <noreply@github.com>2022-08-25 08:32:42 +0300
commit30819bbede0fefb1dcdf7abd5bcec7651ff7a81b (patch)
tree01e87c4c3db9852d509ff2c7a2d8c86f54f73765
parentb1d92017bffd02ea39ca4d00334b61f85e8de529 (diff)
parent0eaabe0fe5d714753f58ba84c9880403977a7f82 (diff)
Merge branch 'main' into davidfowl/indicate-completiondavidfowl/indicate-completion
-rw-r--r--.azure/pipelines/azure-pipelines-mirror-within-azdo.yml70
-rw-r--r--.azure/pipelines/ci.yml2
-rw-r--r--.azure/pipelines/components-e2e-tests.yml2
-rw-r--r--.azure/pipelines/jobs/default-build.yml17
-rw-r--r--.azure/pipelines/localization.yml28
-rw-r--r--.config/CredScanSuppressions.json16
-rw-r--r--.config/dotnet-tools.json18
-rw-r--r--.editorconfig8
-rw-r--r--.github/CODEOWNERS3
-rw-r--r--.github/ISSUE_TEMPLATE/config.yml3
-rw-r--r--.github/dependabot.yml26
-rw-r--r--.github/fabricbot.json5949
-rw-r--r--.github/workflows/backport.yml8
-rw-r--r--.github/workflows/runtime-sync.yml6
-rw-r--r--.gitignore3
-rw-r--r--.vsconfig2
-rw-r--r--AspNetCore.sln588
-rw-r--r--NuGet.config2
-rw-r--r--README.md8
-rw-r--r--docs/APIReviewProcess.md2
-rw-r--r--docs/AddingNewProjects.md54
-rw-r--r--docs/Helix.md17
-rw-r--r--docs/README.md2
-rw-r--r--docs/Trimming.md4
-rw-r--r--docs/UpdatingMajorVersionAndTFM.md5
-rw-r--r--docs/WebTransport.md301
-rw-r--r--eng/Build.props5
-rw-r--r--eng/Dependencies.props5
-rw-r--r--eng/Localize/LocExclusions.json7
-rw-r--r--eng/ProjectReferences.props5
-rw-r--r--eng/SharedFramework.External.props1
-rw-r--r--eng/SharedFramework.Local.props3
-rw-r--r--eng/Signing.props1
-rw-r--r--eng/SourceBuild.props15
-rw-r--r--eng/TrimmableProjects.props49
-rw-r--r--eng/Version.Details.xml297
-rw-r--r--eng/Versions.props211
-rw-r--r--eng/Workarounds.props6
-rw-r--r--eng/common/SetupNugetSources.ps118
-rwxr-xr-xeng/common/SetupNugetSources.sh68
-rwxr-xr-xeng/common/build.sh17
-rwxr-xr-xeng/common/cross/build-rootfs.sh304
-rw-r--r--eng/common/cross/riscv64/sources.list.sid1
-rw-r--r--eng/common/cross/toolchain.cmake98
-rw-r--r--eng/common/generate-locproject.ps145
-rw-r--r--eng/common/generate-sbom-prep.ps12
-rw-r--r--eng/common/generate-sbom-prep.sh12
-rw-r--r--eng/common/init-tools-native.ps115
-rw-r--r--eng/common/internal/Tools.csproj3
-rw-r--r--eng/common/native/init-compiler.sh2
-rw-r--r--eng/common/sdk-task.ps12
-rw-r--r--eng/common/sdl/sdl.ps137
-rw-r--r--eng/common/templates/job/execute-sdl.yml2
-rw-r--r--eng/common/templates/job/onelocbuild.yml4
-rw-r--r--eng/common/templates/job/source-index-stage1.yml21
-rw-r--r--eng/common/templates/jobs/jobs.yml2
-rw-r--r--eng/common/templates/post-build/post-build.yml10
-rw-r--r--eng/common/templates/steps/execute-sdl.yml58
-rw-r--r--eng/common/templates/steps/send-to-helix.yml10
-rw-r--r--eng/common/tools.ps119
-rwxr-xr-xeng/common/tools.sh2
-rw-r--r--eng/docker/rhel.Dockerfile12
-rw-r--r--eng/helix/Directory.Build.props3
-rw-r--r--eng/helix/Directory.Build.targets3
-rw-r--r--eng/helix/content/RunTests/Directory.Build.props1
-rw-r--r--eng/helix/content/RunTests/Directory.Build.targets1
-rw-r--r--eng/helix/content/RunTests/ProcessResult.cs20
-rw-r--r--eng/helix/content/RunTests/ProcessUtil.cs212
-rw-r--r--eng/helix/content/RunTests/Program.cs58
-rw-r--r--eng/helix/content/RunTests/RunTests.csproj13
-rw-r--r--eng/helix/content/RunTests/RunTestsOptions.cs99
-rw-r--r--eng/helix/content/RunTests/TestRunner.cs312
-rw-r--r--eng/helix/content/runtests.cmd22
-rw-r--r--eng/helix/content/runtests.sh23
-rw-r--r--eng/helix/helix.proj34
-rw-r--r--eng/scripts/CodeCheck.ps11
-rw-r--r--eng/scripts/RunHelix.ps14
-rw-r--r--eng/scripts/vs.17.buildtools.intpreview.json2
-rw-r--r--eng/scripts/vs.17.buildtools.json2
-rw-r--r--eng/scripts/vs.17.buildtools.preview.json2
-rw-r--r--eng/scripts/vs.17.intpreview.json2
-rw-r--r--eng/scripts/vs.17.json2
-rw-r--r--eng/scripts/vs.17.preview.json2
-rw-r--r--eng/targets/Cpp.Common.props11
-rw-r--r--eng/targets/Helix.Common.props3
-rw-r--r--eng/targets/Helix.targets10
-rw-r--r--eng/targets/Npm.Common.targets5
-rw-r--r--eng/test-configuration.json26
-rw-r--r--eng/tools/GenerateFiles/GenerateFiles.csproj11
-rw-r--r--eng/tools/GenerateFiles/dotnet-tools.json.in30
-rw-r--r--eng/tools/HelixTestRunner/HelixTestRunner.csproj32
-rw-r--r--eng/tools/HelixTestRunner/HelixTestRunnerOptions.cs98
-rw-r--r--eng/tools/HelixTestRunner/ProcessResult.cs18
-rw-r--r--eng/tools/HelixTestRunner/ProcessUtil.cs213
-rw-r--r--eng/tools/HelixTestRunner/Program.cs68
-rw-r--r--eng/tools/HelixTestRunner/TestRunner.cs333
-rw-r--r--eng/tools/tools.slnf7
-rw-r--r--global.json12
-rw-r--r--src/Analyzers/Analyzers/src/BuildServiceProviderAnalyzer.cs2
-rw-r--r--src/Analyzers/Analyzers/src/ConfigureMethodVisitor.cs2
-rw-r--r--src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs2
-rw-r--r--src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs2
-rw-r--r--src/Analyzers/Analyzers/src/MiddlewareItem.cs2
-rw-r--r--src/Analyzers/Analyzers/src/OptionsAnalysis.cs2
-rw-r--r--src/Analyzers/Analyzers/src/OptionsAnalyzer.cs2
-rw-r--r--src/Analyzers/Analyzers/src/OptionsItem.cs2
-rw-r--r--src/Analyzers/Analyzers/src/ServicesAnalysis.cs2
-rw-r--r--src/Analyzers/Analyzers/src/ServicesAnalyzer.cs2
-rw-r--r--src/Analyzers/Analyzers/src/ServicesItem.cs2
-rw-r--r--src/Analyzers/Analyzers/src/StartupAnalysis.cs2
-rw-r--r--src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs2
-rw-r--r--src/Analyzers/Analyzers/src/StartupSymbols.cs2
-rw-r--r--src/Analyzers/Analyzers/src/UseAuthorizationAnalyzer.cs2
-rw-r--r--src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs2
-rw-r--r--src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/Assert.cs2
-rw-r--r--src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/CodeFixRunner.cs3
-rw-r--r--src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/DiagnosticVerifier.cs2
-rw-r--r--src/Antiforgery/src/Internal/AntiforgeryFeature.cs2
-rw-r--r--src/Antiforgery/src/Internal/AntiforgeryOptionsSetup.cs2
-rw-r--r--src/Antiforgery/src/Internal/AntiforgerySerializationContext.cs2
-rw-r--r--src/Antiforgery/src/Internal/AntiforgerySerializationContextPooledObjectPolicy.cs2
-rw-r--r--src/Antiforgery/src/Internal/DefaultAntiforgery.cs4
-rw-r--r--src/Antiforgery/src/Internal/DefaultAntiforgeryAdditionalDataProvider.cs2
-rw-r--r--src/Antiforgery/src/Internal/DefaultAntiforgeryTokenGenerator.cs2
-rw-r--r--src/Antiforgery/src/Internal/DefaultAntiforgeryTokenSerializer.cs2
-rw-r--r--src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs2
-rw-r--r--src/Antiforgery/src/Internal/DefaultClaimUidExtractor.cs2
-rw-r--r--src/Antiforgery/src/Microsoft.AspNetCore.Antiforgery.csproj2
-rw-r--r--src/Azure/Azure.slnf6
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Controllers/AccountController.cs45
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml10
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml.cs23
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml23
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml.cs39
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml10
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml.cs30
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/_ViewImports.cshtml2
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/_ViewStart.cshtml13
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAccountControllerFeatureProvider.cs21
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs204
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADCookieOptionsConfiguration.cs58
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs44
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADJwtBearerOptionsConfiguration.cs58
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOpenIdConnectOptionsConfiguration.cs60
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptions.cs72
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsConfiguration.cs38
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsValidation.cs20
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADSchemeOptions.cs22
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj20
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/Properties/AssemblyInfo.cs6
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Shipped.txt47
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/test/AzureADAuthenticationBuilderExtensionsTests.cs506
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/test/Controllers/AccountControllerTests.cs276
-rw-r--r--src/Azure/AzureAD/Authentication.AzureAD.UI/test/xunit.runner.json3
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Controllers/AccountController.cs81
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml10
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml.cs23
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml23
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml.cs39
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml10
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml.cs30
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/_ViewImports.cshtml2
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/_ViewStart.cshtml13
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CAccountControllerFeatureProvider.cs21
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CCookieOptionsConfiguration.cs53
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CJwtBearerOptionsConfiguration.cs53
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2COpenIdConnectOptionsConfiguration.cs75
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CAuthenticationBuilderExtensions.cs223
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs49
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COpenIDConnectEventHandlers.cs84
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptions.cs87
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptionsConfiguration.cs38
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CSchemeOptions.cs22
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj20
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Properties/AssemblyInfo.cs6
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Shipped.txt53
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2CAuthenticationBuilderExtensionsTests.cs423
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2COpenIDConnectEventHandlersTests.cs169
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Controllers/AccountControllerTests.cs383
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test.csproj20
-rw-r--r--src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/xunit.runner.json3
-rw-r--r--src/Azure/AzureAD/Directory.Build.props7
-rw-r--r--src/Azure/AzureAD/README.md4
-rw-r--r--src/Azure/AzureAD/test/FunctionalTests/ApiAuthenticationTests.cs88
-rw-r--r--src/Azure/AzureAD/test/FunctionalTests/Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests.csproj21
-rw-r--r--src/Azure/AzureAD/test/FunctionalTests/WebAuthenticationTests.cs210
-rw-r--r--src/Azure/AzureAD/test/FunctionalTests/xunit.runner.json3
-rw-r--r--src/Azure/AzureAD/test/testassets/AzureAD.WebSite/AzureAD.WebSite.csproj16
-rw-r--r--src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Controllers/TestController.cs14
-rw-r--r--src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Program.cs20
-rw-r--r--src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Startup.cs26
-rw-r--r--src/Caching/SqlServer/src/DatabaseOperations.cs37
-rw-r--r--src/Caching/SqlServer/src/SqlQueries.cs2
-rw-r--r--src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj1
-rw-r--r--src/Caching/StackExchangeRedis/src/RedisCache.Log.cs16
-rw-r--r--src/Caching/StackExchangeRedis/src/RedisCache.cs39
-rw-r--r--src/Caching/StackExchangeRedis/src/RedisCacheImpl.cs20
-rw-r--r--src/Caching/StackExchangeRedis/src/StackExchangeRedisCacheServiceCollectionExtensions.cs3
-rw-r--r--src/Caching/StackExchangeRedis/test/CacheServiceExtensionsTests.cs69
-rw-r--r--src/Components/Analyzers/src/ComponentSymbols.cs2
-rw-r--r--src/Components/Analyzers/src/InternalUsageAnalyzer.cs2
-rw-r--r--src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs4
-rw-r--r--src/Components/Authorization/src/AuthorizeDataAdapter.cs2
-rw-r--r--src/Components/Authorization/src/AuthorizeRouteView.cs2
-rw-r--r--src/Components/Components.slnf3
-rw-r--r--src/Components/Components/perf/RenderTreeDiffBuilderBenchmark.cs4
-rw-r--r--src/Components/Components/src/BindConverter.cs2
-rw-r--r--src/Components/Components/src/CascadingParameterState.cs5
-rw-r--r--src/Components/Components/src/ChangeDetection.cs2
-rw-r--r--src/Components/Components/src/CompilerServices/RuntimeHelpers.cs74
-rw-r--r--src/Components/Components/src/DefaultComponentActivator.cs2
-rw-r--r--src/Components/Components/src/DynamicComponent.cs1
-rw-r--r--src/Components/Components/src/EventCallbackFactoryBinderExtensions.cs744
-rw-r--r--src/Components/Components/src/LayoutAttribute.cs5
-rw-r--r--src/Components/Components/src/LayoutView.cs1
-rw-r--r--src/Components/Components/src/NavigationManager.cs247
-rw-r--r--src/Components/Components/src/NavigationOptions.cs5
-rw-r--r--src/Components/Components/src/OwningComponentBase.cs10
-rw-r--r--src/Components/Components/src/PublicAPI.Shipped.txt16
-rw-r--r--src/Components/Components/src/PublicAPI.Unshipped.txt56
-rw-r--r--src/Components/Components/src/Reflection/ComponentProperties.cs2
-rw-r--r--src/Components/Components/src/Reflection/MemberAssignment.cs2
-rw-r--r--src/Components/Components/src/RenderTree/RenderTreeFrameArrayBuilder.cs2
-rw-r--r--src/Components/Components/src/RenderTree/StackObjectPool.cs2
-rw-r--r--src/Components/Components/src/Rendering/ComponentState.cs2
-rw-r--r--src/Components/Components/src/Rendering/RenderBatchBuilder.cs2
-rw-r--r--src/Components/Components/src/Rendering/RenderTreeUpdater.cs2
-rw-r--r--src/Components/Components/src/Rendering/RendererSynchronizationContext.cs8
-rw-r--r--src/Components/Components/src/Rendering/RendererSynchronizationContextDispatcher.cs2
-rw-r--r--src/Components/Components/src/Rendering/SimplifiedStringHashComparer.cs2
-rw-r--r--src/Components/Components/src/RouteView.cs3
-rw-r--r--src/Components/Components/src/Routing/LocationChangedEventArgs.cs5
-rw-r--r--src/Components/Components/src/Routing/LocationChangingContext.cs41
-rw-r--r--src/Components/Components/src/Routing/RouteContext.cs2
-rw-r--r--src/Components/Components/src/Routing/RouteEntry.cs2
-rw-r--r--src/Components/Components/src/Routing/RouteTable.cs2
-rw-r--r--src/Components/Components/src/Routing/RouteTableFactory.cs3
-rw-r--r--src/Components/Components/src/Routing/RouteTemplate.cs2
-rw-r--r--src/Components/Components/src/Routing/TemplateParser.cs2
-rw-r--r--src/Components/Components/src/Routing/TemplateSegment.cs2
-rw-r--r--src/Components/Components/src/Sections/SectionContent.cs2
-rw-r--r--src/Components/Components/src/Sections/SectionOutlet.cs2
-rw-r--r--src/Components/Components/test/NavigationManagerTest.cs664
-rw-r--r--src/Components/Components/test/RendererTest.cs194
-rw-r--r--src/Components/Components/test/Routing/RouterTest.cs2
-rw-r--r--src/Components/ComponentsNoDeps.slnf4
-rw-r--r--src/Components/CustomElements/src/JSComponentConfigurationExtensions.cs21
-rw-r--r--src/Components/CustomElements/src/Microsoft.AspNetCore.Components.CustomElements.csproj86
-rw-r--r--src/Components/CustomElements/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Components/CustomElements/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Components/CustomElements/src/js/.npmrc1
-rw-r--r--src/Components/CustomElements/src/js/BlazorCustomElements.ts156
-rw-r--r--src/Components/CustomElements/src/js/babel.config.json3
-rw-r--r--src/Components/CustomElements/src/js/dist/.gitignore3
-rw-r--r--src/Components/CustomElements/src/js/package.json29
-rw-r--r--src/Components/CustomElements/src/js/tsconfig.json11
-rw-r--r--src/Components/CustomElements/src/js/webpack.config.js70
-rw-r--r--src/Components/CustomElements/src/js/yarn.lock2797
-rw-r--r--src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs3
-rw-r--r--src/Components/Forms/src/FieldState.cs2
-rw-r--r--src/Components/Forms/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor2
-rw-r--r--src/Components/Samples/BlazorServerApp/wwwroot/css/site.css6
-rw-r--r--src/Components/Server/src/BlazorPack/NonDefaultHubProtocolAttribute.cs2
-rw-r--r--src/Components/Server/src/BlazorPack/SequenceOfT.cs4
-rw-r--r--src/Components/Server/src/Builder/ComponentEndpointConventionBuilder.cs8
-rw-r--r--src/Components/Server/src/CircuitJavaScriptInitializationMiddleware.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitClientProxy.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitFactory.cs1
-rw-r--r--src/Components/Server/src/Circuits/CircuitHandle.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitHost.cs40
-rw-r--r--src/Components/Server/src/Circuits/CircuitIdFactory.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitJSComponentInterop.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitOptionsJSInteropDetailedErrorsConfiguration.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitOptionsJavaScriptInitializersConfiguration.cs2
-rw-r--r--src/Components/Server/src/Circuits/CircuitRegistry.cs2
-rw-r--r--src/Components/Server/src/Circuits/ComponentDescriptor.cs2
-rw-r--r--src/Components/Server/src/Circuits/DefaultCircuitAccessor.cs2
-rw-r--r--src/Components/Server/src/Circuits/RemoteJSRuntime.cs2
-rw-r--r--src/Components/Server/src/Circuits/RemoteNavigationManager.cs68
-rw-r--r--src/Components/Server/src/Circuits/RemoteRenderer.cs2
-rw-r--r--src/Components/Server/src/ComponentHub.cs15
-rw-r--r--src/Components/Server/src/DependencyInjection/ComponentServiceCollectionExtensions.cs4
-rw-r--r--src/Components/Server/src/DependencyInjection/ConfigureStaticFilesOptions.cs2
-rw-r--r--src/Components/Server/src/Microsoft.AspNetCore.Components.Server.csproj1
-rw-r--r--src/Components/Server/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Components/Server/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/Components/Server/test/Circuits/ComponentHubTest.cs17
-rw-r--r--src/Components/Server/test/Circuits/TestCircuitHost.cs6
-rw-r--r--src/Components/Server/test/ComponentEndpointRouteBuilderExtensionsTest.cs70
-rw-r--r--src/Components/Shared/src/ArrayBuilder.cs12
-rw-r--r--src/Components/Shared/src/BrowserNavigationManagerInterop.cs2
-rw-r--r--src/Components/Shared/src/ComponentParametersTypeCache.cs4
-rw-r--r--src/Components/Shared/src/RenderBatchWriter.cs2
-rw-r--r--src/Components/Shared/src/RootComponentTypeCache.cs4
-rw-r--r--src/Components/Web.JS/.npmrc1
-rw-r--r--src/Components/Web.JS/@types/dotnet/.npmrc1
-rw-r--r--src/Components/Web.JS/@types/dotnet/dotnet.d.ts258
-rw-r--r--src/Components/Web.JS/dist/Release/blazor.server.js2
-rw-r--r--src/Components/Web.JS/dist/Release/blazor.webview.js2
-rw-r--r--src/Components/Web.JS/package.json15
-rw-r--r--src/Components/Web.JS/src/Boot.Server.ts8
-rw-r--r--src/Components/Web.JS/src/Boot.WebAssembly.ts14
-rw-r--r--src/Components/Web.JS/src/Boot.WebView.ts4
-rw-r--r--src/Components/Web.JS/src/GlobalExports.ts3
-rw-r--r--src/Components/Web.JS/src/NavigationLock.ts33
-rw-r--r--src/Components/Web.JS/src/Platform/BootConfig.ts12
-rw-r--r--src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts2
-rw-r--r--src/Components/Web.JS/src/Platform/Mono/MonoPlatform.ts70
-rw-r--r--src/Components/Web.JS/src/Platform/WebView/WebViewIpcReceiver.ts4
-rw-r--r--src/Components/Web.JS/src/Platform/WebView/WebViewIpcSender.ts9
-rw-r--r--src/Components/Web.JS/src/Rendering/BrowserRenderer.ts13
-rw-r--r--src/Components/Web.JS/src/Rendering/Events/EventTypes.ts4
-rw-r--r--src/Components/Web.JS/src/Services/NavigationManager.ts155
-rw-r--r--src/Components/Web.JS/src/Virtualize.ts6
-rw-r--r--src/Components/Web.JS/yarn.lock1985
-rw-r--r--src/Components/Web/src/Forms/InputFile/InputFileJsCallbacksRelay.cs2
-rw-r--r--src/Components/Web/src/JSComponents/JSComponentConfigurationStore.cs18
-rw-r--r--src/Components/Web/src/JSComponents/JSComponentInterop.cs4
-rw-r--r--src/Components/Web/src/Microsoft.AspNetCore.Components.Web.WarningSuppressions.xml14
-rw-r--r--src/Components/Web/src/PublicAPI.Shipped.txt3
-rw-r--r--src/Components/Web/src/PublicAPI.Unshipped.txt12
-rw-r--r--src/Components/Web/src/Routing/FocusOnNavigate.cs2
-rw-r--r--src/Components/Web/src/Routing/NavigationLock.cs83
-rw-r--r--src/Components/Web/src/Routing/NavigationLockInterop.cs13
-rw-r--r--src/Components/Web/src/Virtualization/Virtualize.cs16
-rw-r--r--src/Components/Web/src/Virtualization/VirtualizeJsInterop.cs2
-rw-r--r--src/Components/Web/src/Web/MouseEventArgs.cs10
-rw-r--r--src/Components/Web/src/WebEventData/MouseEventArgsReader.cs10
-rw-r--r--src/Components/Web/src/WebEventData/WebEventData.cs2
-rw-r--r--src/Components/Web/test/WebEventData/MouseEventArgsReaderTest.cs4
-rw-r--r--src/Components/WebAssembly/Authentication.Msal/src/Interop/.npmrc1
-rw-r--r--src/Components/WebAssembly/Authentication.Msal/src/Interop/package.json12
-rw-r--r--src/Components/WebAssembly/Authentication.Msal/src/Interop/yarn.lock671
-rw-r--r--src/Components/WebAssembly/Authentication.Msal/src/MsalWebAssemblyServiceCollectionExtensions.cs2
-rw-r--r--src/Components/WebAssembly/Authentication.Msal/src/PublicAPI.Shipped.txt6
-rw-r--r--src/Components/WebAssembly/DevServer/src/Program.cs2
-rw-r--r--src/Components/WebAssembly/DevServer/src/Server/Startup.cs2
-rw-r--r--src/Components/WebAssembly/JSInterop/src/WebAssemblyJSObjectReference.cs8
-rw-r--r--src/Components/WebAssembly/JSInterop/src/WebAssemblyJSRuntime.cs9
-rw-r--r--src/Components/WebAssembly/Server/src/ContentEncodingNegotiator.cs2
-rw-r--r--src/Components/WebAssembly/Server/src/TargetPickerUi.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/.npmrc1
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/AuthenticationService.ts183
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/package.json12
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/yarn.lock668
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.WarningSuppressions.xml10
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.csproj10
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractionType.cs29
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractiveRequestOptions.cs132
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationContext.cs5
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationStatus.cs3
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/NavigationManagerExtensions.cs82
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultApiAuthorizationOptionsConfiguration.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultOidcProviderOptionsConfiguration.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/PublicAPI.Unshipped.txt27
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/QueryStringHelper.cs73
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticationBuilder.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.Log.cs57
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.cs193
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenProviderAccessor.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenResult.cs32
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Services/DefaultRemoteApplicationPathsProvider.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Services/ExpiredTokenException.cs29
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Services/RemoteAuthenticationService.cs161
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/Services/SignOutSessionStateManager.cs1
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/src/WebAssemblyAuthenticationServiceCollectionExtensions.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/test/AuthorizationMessageHandlerTests.cs15
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticationServiceTests.cs112
-rw-r--r--src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticatorCoreTests.cs158
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Hosting/LoggingBuilder.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Hosting/RegisteredComponentsInterop.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs4
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHost.cs3
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs12
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/HotReload/HotReloadAgent.cs14
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/HotReload/WebAssemblyHotReload.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Infrastructure/JSInteropMethods.cs20
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj1
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Prerendering/ClientComponentParameterDeserializer.cs5
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Rendering/NullDispatcher.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs4
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Services/LazyAssemblyLoader.cs4
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLogger.cs29
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLoggerProvider.cs2
-rw-r--r--src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyNavigationManager.cs65
-rw-r--r--src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs6
-rw-r--r--src/Components/WebAssembly/WebAssembly/test/JSObjectReferenceJsonConverterTest.cs14
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/Token.razor77
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/UserPreferences.razor10
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Program.cs2
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/LoginDisplay.razor19
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/NavMenu.razor5
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/RedirectToLogin.razor4
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Client/wwwroot/appsettings.json9
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Controllers/OidcConfigurationController.cs1
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Startup.cs7
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Wasm.Authentication.Server.csproj21
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.cmd1
-rw-r--r--src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.sh1
-rw-r--r--src/Components/WebView/WebView/src/FileExtensionContentTypeProvider.cs2
-rw-r--r--src/Components/WebView/WebView/src/IpcCommon.cs5
-rw-r--r--src/Components/WebView/WebView/src/IpcReceiver.cs16
-rw-r--r--src/Components/WebView/WebView/src/IpcSender.cs12
-rw-r--r--src/Components/WebView/WebView/src/PageContext.cs2
-rw-r--r--src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs2
-rw-r--r--src/Components/WebView/WebView/src/Services/WebViewNavigationInterception.cs2
-rw-r--r--src/Components/WebView/WebView/src/Services/WebViewNavigationManager.cs86
-rw-r--r--src/Components/WebView/WebView/src/Services/WebViewRenderer.cs4
-rw-r--r--src/Components/WebView/WebView/src/StaticContentProvider.cs2
-rw-r--r--src/Components/WebView/WebView/src/WebViewManager.cs4
-rw-r--r--src/Components/benchmarkapps/BlazingPizza.Server/NuGet.config2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/ConsoleHostRenderer.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/NullDispatcher.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Program.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Scenarios/GridScenario.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMeasurement.cs4
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMetadata.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkOutput.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkResult.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkScenarioResult.cs4
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/Driver/Selenium.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/TestApp/PersonJsonContext.cs2
-rw-r--r--src/Components/benchmarkapps/Wasm.Performance/dockerfile2
-rw-r--r--src/Components/test/E2ETest/.npmrc1
-rw-r--r--src/Components/test/E2ETest/Tests/BindTest.cs73
-rw-r--r--src/Components/test/E2ETest/Tests/CustomElementsTest.cs128
-rw-r--r--src/Components/test/E2ETest/Tests/FormsInputDateTest.cs1
-rw-r--r--src/Components/test/E2ETest/Tests/GlobalizationTest.cs1
-rw-r--r--src/Components/test/E2ETest/Tests/InteropTest.cs6
-rw-r--r--src/Components/test/E2ETest/Tests/RoutingTest.cs679
-rw-r--r--src/Components/test/E2ETest/Tests/VirtualizationTest.cs24
-rw-r--r--src/Components/test/E2ETest/Tests/WebAssemblyAuthenticationTests.cs100
-rw-r--r--src/Components/test/E2ETest/Tests/WebAssemblyICUShardingTest.cs2
-rw-r--r--src/Components/test/E2ETest/yarn.lock1150
-rw-r--r--src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj4
-rw-r--r--src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor19
-rw-r--r--src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor48
-rw-r--r--src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor75
-rw-r--r--src/Components/test/testassets/BasicTestApp/HttpClientTest/HttpRequestsComponent.razor2
-rw-r--r--src/Components/test/testassets/BasicTestApp/Index.razor2
-rw-r--r--src/Components/test/testassets/BasicTestApp/InteropComponent.razor102
-rw-r--r--src/Components/test/testassets/BasicTestApp/NavigateOnSubmit.razor6
-rw-r--r--src/Components/test/testassets/BasicTestApp/Program.cs1
-rw-r--r--src/Components/test/testassets/BasicTestApp/RouterTest/ConfigurableNavigationLock.razor99
-rw-r--r--src/Components/test/testassets/BasicTestApp/RouterTest/Links.razor3
-rw-r--r--src/Components/test/testassets/BasicTestApp/RouterTest/NavigationManagerComponent.razor71
-rw-r--r--src/Components/test/testassets/BasicTestApp/RouterTest/Other.razor2
-rw-r--r--src/Components/test/testassets/BasicTestApp/RouterTest/ProgrammaticNavigationCases.razor12
-rw-r--r--src/Components/test/testassets/BasicTestApp/VirtualizationTable.razor28
-rw-r--r--src/Components/test/testassets/BasicTestApp/wwwroot/index.html4
-rw-r--r--src/Components/test/testassets/BasicTestApp/wwwroot/js/customElementTests.js10
-rw-r--r--src/Components/test/testassets/BasicTestApp/wwwroot/js/jsinteroptests.js10
-rw-r--r--src/DataProtection/Abstractions/src/DataProtectionCommonExtensions.cs2
-rw-r--r--src/DataProtection/Abstractions/src/IDataProtector.cs2
-rw-r--r--src/DataProtection/Cryptography.Internal/src/Cng/OSVersionUtil.cs38
-rw-r--r--src/DataProtection/Cryptography.Internal/src/SafeHandles/SafeLibraryHandle.cs72
-rw-r--r--src/DataProtection/Cryptography.Internal/src/UnsafeNativeMethods.cs539
-rw-r--r--src/DataProtection/DataProtection/src/ActivatorExtensions.cs3
-rw-r--r--src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/AuthenticatedEncryptorDescriptorDeserializer.cs1
-rw-r--r--src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngCbcAuthenticatedEncryptorDescriptorDeserializer.cs1
-rw-r--r--src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngGcmAuthenticatedEncryptorDescriptorDeserializer.cs1
-rw-r--r--src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/IAuthenticatedEncryptorDescriptorDeserializer.cs1
-rw-r--r--src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/ManagedAuthenticatedEncryptorDescriptorDeserializer.cs4
-rw-r--r--src/DataProtection/DataProtection/src/AuthenticatedEncryption/ManagedAuthenticatedEncryptorFactory.cs2
-rw-r--r--src/DataProtection/DataProtection/src/Cng/DpapiSecretSerializerHelper.cs4
-rw-r--r--src/DataProtection/DataProtection/src/EphemeralDataProtectionProvider.cs1
-rw-r--r--src/DataProtection/DataProtection/src/IPersistedDataProtector.cs1
-rw-r--r--src/DataProtection/DataProtection/src/IRegistryPolicyResolver.cs1
-rw-r--r--src/DataProtection/DataProtection/src/Internal/DataProtectionBuilder.cs2
-rw-r--r--src/DataProtection/DataProtection/src/Internal/DataProtectionHostedService.cs2
-rw-r--r--src/DataProtection/DataProtection/src/Internal/DataProtectionOptionsSetup.cs4
-rw-r--r--src/DataProtection/DataProtection/src/Internal/HostingApplicationDiscriminator.cs24
-rw-r--r--src/DataProtection/DataProtection/src/Internal/IActivator.cs3
-rw-r--r--src/DataProtection/DataProtection/src/Internal/KeyManagementOptionsSetup.cs2
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/DeferredKey.cs3
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/IKeyManager.cs1
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/Internal/ICacheableKeyRingProvider.cs1
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/Internal/IInternalXmlKeyManager.cs1
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/Internal/IKeyRingProvider.cs1
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/KeyRingBasedDataProtector.cs4
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/KeyRingProvider.cs5
-rw-r--r--src/DataProtection/DataProtection/src/KeyManagement/XmlKeyManager.cs34
-rw-r--r--src/DataProtection/DataProtection/src/PublicAPI.Shipped.txt4
-rw-r--r--src/DataProtection/DataProtection/src/PublicAPI.Unshipped.txt4
-rw-r--r--src/DataProtection/DataProtection/src/RegistryPolicy.cs2
-rw-r--r--src/DataProtection/DataProtection/src/RegistryPolicyResolver.cs10
-rw-r--r--src/DataProtection/DataProtection/src/Repositories/DefaultKeyStorageDirectories.cs21
-rw-r--r--src/DataProtection/DataProtection/src/Repositories/EphemeralXmlRepository.cs6
-rw-r--r--src/DataProtection/DataProtection/src/SimpleActivator.cs7
-rw-r--r--src/DataProtection/DataProtection/src/TypeExtensions.cs14
-rw-r--r--src/DataProtection/DataProtection/src/TypeForwardingActivator.cs45
-rw-r--r--src/DataProtection/DataProtection/src/XmlEncryption/EncryptedXmlDecryptor.cs2
-rw-r--r--src/DataProtection/DataProtection/src/XmlEncryption/XmlEncryptionExtensions.cs31
-rw-r--r--src/DataProtection/DataProtection/src/XmlEncryption/XmlKeyDecryptionOptions.cs2
-rw-r--r--src/DataProtection/DataProtection/test/DataProtectionUtilityExtensionsTests.cs48
-rw-r--r--src/DataProtection/DataProtection/test/RegistryPolicyResolverTests.cs18
-rw-r--r--src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs5
-rw-r--r--src/DataProtection/EntityFrameworkCore/src/PublicAPI.Shipped.txt2
-rw-r--r--src/DataProtection/Extensions/src/DataProtectionAdvancedExtensions.cs6
-rw-r--r--src/DataProtection/Extensions/src/ITimeLimitedDataProtector.cs2
-rw-r--r--src/DataProtection/Extensions/src/TimeLimitedDataProtector.cs5
-rw-r--r--src/DataProtection/Extensions/test/DataProtectionProviderTests.cs3
-rw-r--r--src/DataProtection/shared/src/TrimmerWarning.cs9
-rw-r--r--src/DefaultBuilder/src/ConfigureWebHostBuilder.cs2
-rw-r--r--src/DefaultBuilder/src/Microsoft.AspNetCore.csproj9
-rw-r--r--src/DefaultBuilder/src/StartupLinkerOptions.cs12
-rw-r--r--src/DefaultBuilder/src/WebApplicationBuilder.cs31
-rw-r--r--src/DefaultBuilder/src/WebHost.cs3
-rw-r--r--src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs4
-rw-r--r--src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj1
-rw-r--r--src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs120
-rw-r--r--src/Extensions/Features/src/FeatureCollection.cs2
-rw-r--r--src/Extensions/Features/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Features/JsonPatch/src/PublicAPI.Shipped.txt2
-rw-r--r--src/FileProviders/Embedded/src/EnumerableDirectoryContents.cs2
-rw-r--r--src/FileProviders/Embedded/src/Manifest/EmbeddedFilesManifest.cs2
-rw-r--r--src/FileProviders/Embedded/src/Manifest/ManifestDirectoryContents.cs2
-rw-r--r--src/FileProviders/Embedded/src/Manifest/ManifestDirectoryInfo.cs2
-rw-r--r--src/FileProviders/Embedded/src/Manifest/ManifestFile.cs4
-rw-r--r--src/FileProviders/Embedded/src/Manifest/ManifestFileInfo.cs2
-rw-r--r--src/FileProviders/Embedded/src/Manifest/ManifestRootDirectory.cs2
-rw-r--r--src/FileProviders/Embedded/src/Manifest/ManifestSinkDirectory.cs2
-rw-r--r--src/FileProviders/Manifest.MSBuildTask/src/Entry.cs2
-rw-r--r--src/FileProviders/Manifest.MSBuildTask/src/Manifest.cs2
-rw-r--r--src/Framework/App.Ref/src/Microsoft.AspNetCore.App.Ref.csproj3
-rw-r--r--src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj80
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs36
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/RenderTreeBuilder/RenderTreeBuilderAnalyzer.cs39
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMismatchedParameterOptionality.cs12
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMisplacedLambdaAttribute.cs15
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowReturningActionResultFromMapMethods.cs10
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/RouteHandlerAnalyzer.cs63
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs186
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs24
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs7
-rw-r--r--src/Framework/AspNetCoreAnalyzers/src/CodeFixes/WebApplicationBuilderFixer.cs169
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowReturningActionResultsFromMapMethodsTest.cs49
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs4
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpWebApplicationBuilderCodeFixVerifier.cs86
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs233
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostBuilderConfigureWebHostTest.cs4
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostLoggingTest.cs354
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureServicesTest.cs321
-rw-r--r--src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/UseTopLevelRouteRegistrationInsteadOfUseEndpointsTest.cs229
-rw-r--r--src/Framework/Framework.slnf1
-rw-r--r--src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj11
-rw-r--r--src/Framework/test/PackageTests.cs145
-rw-r--r--src/Framework/test/SharedFxTests.cs30
-rw-r--r--src/Framework/test/TargetingPackTests.cs36
-rw-r--r--src/Framework/test/TestData.cs274
-rw-r--r--src/Grpc/Grpc.slnf6
-rw-r--r--src/Grpc/Interop/test/testassets/InteropClient/InteropClient.csproj2
-rw-r--r--src/Grpc/Interop/test/testassets/InteropWebsite/InteropWebsite.csproj2
-rw-r--r--src/Grpc/Interop/test/testassets/InteropWebsite/TestServiceImpl.cs3
-rw-r--r--src/Grpc/JsonTranscoding/perf/Microsoft.AspNetCore.Grpc.Microbenchmarks/Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/GrpcJsonTranscodingServiceExtensions.cs24
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/JsonTranscodingProviderServiceBinder.cs (renamed from src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/HttpApiProviderSeviceBinder.cs)19
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/JsonTranscodingServiceMethodProvider.cs (renamed from src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/HttpApiServiceMethodProvider.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/CallHandlerDescriptorInfo.cs5
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/ServerCallHandlerBase.cs5
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/UnaryServerCallHandler.cs14
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpContextStreamWriter.cs69
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/AnyConverter.cs20
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForEnum.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForMessage.cs38
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWellKnownTypes.cs18
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWrappers.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterHelper.cs110
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageConverter.cs187
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageTypeInfoResolver.cs177
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonRequestHelpers.cs159
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingRouteAdapter.cs210
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingServerCallContext.cs (renamed from src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpApiServerCallContext.cs)10
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj4
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/PublicAPI.Unshipped.txt4
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs (renamed from src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcHttpApiDescriptionProvider.cs)3
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsDocumentFilter.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsOperationFilter.cs2
-rw-r--r--src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Microsoft.AspNetCore.Grpc.Swagger.csproj2
-rw-r--r--src/Grpc/JsonTranscoding/src/Shared/AuthContextHelpers.cs3
-rw-r--r--src/Grpc/JsonTranscoding/src/Shared/HttpRoutePattern.cs35
-rw-r--r--src/Grpc/JsonTranscoding/src/Shared/HttpRoutePatternParser.cs349
-rw-r--r--src/Grpc/JsonTranscoding/src/Shared/Server/InterceptorPipelineBuilder.cs4
-rw-r--r--src/Grpc/JsonTranscoding/src/Shared/ServiceDescriptorHelpers.cs57
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TaskExtensions.cs158
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TestHelpers.cs5
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/RouteTests.cs108
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/ServerStreamingTests.cs34
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/UnaryTests.cs1
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterReadTests.cs22
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterWriteTests.cs12
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/GrpcJsonTranscodingServiceExtensionsTests.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/GrpcHttpApiServiceExtensionsTests.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpRoutePatternParserTests.cs325
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/JsonTranscodingGreeterService.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/HttpApiGreeterService.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/TestHelpers.cs5
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingRouteAdapterTests.cs223
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingServerCallContextTests.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpApiServerCallContextTests.cs)4
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingServiceMethodProviderTests.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpApiServiceMethodProviderTests.cs)3
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj4
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/httpbody.proto31
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/transcoding.proto1
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ServerStreamingServerCallHandlerTests.cs92
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpBodyService.cs22
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingGreeterService.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiGreeterService.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidBodyGreeterService.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidBodyGreeterService.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidPatternGreeterService.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidPatternGreeterService.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidResponseBodyGreeterService.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidResponseBodyGreeterService.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingStreamingService.cs (renamed from src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiStreamingService.cs)0
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/UnaryServerCallHandlerTests.cs394
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/google/api/httpbody.proto81
-rw-r--r--src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj2
-rw-r--r--src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/IntegrationTestsWebsite.csproj2
-rw-r--r--src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/Protos/greet.proto28
-rw-r--r--src/Grpc/JsonTranscoding/test/testassets/Sandbox/Sandbox.csproj2
-rw-r--r--src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj4
-rw-r--r--src/HealthChecks/Abstractions/src/PublicAPI.Shipped.txt2
-rw-r--r--src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs4
-rw-r--r--src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilder.cs2
-rw-r--r--src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilderAddCheckExtensions.cs38
-rw-r--r--src/HealthChecks/HealthChecks/src/HealthCheckLogScope.cs2
-rw-r--r--src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj7
-rw-r--r--src/Hosting/Hosting/src/GenericHost/GenericWebHostApplicationLifetime.cs2
-rw-r--r--src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs2
-rw-r--r--src/Hosting/Hosting/src/GenericHost/GenericWebHostServiceOptions.cs2
-rw-r--r--src/Hosting/Hosting/src/Http/DefaultHttpContextFactory.cs10
-rw-r--r--src/Hosting/Hosting/src/Internal/ApplicationLifetime.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/ConfigureBuilder.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/ConfigureContainerBuilder.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/ConfigureServicesBuilder.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/HostedServiceExecutor.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/HostingApplication.cs4
-rw-r--r--src/Hosting/Hosting/src/Internal/HostingApplicationDiagnostics.cs72
-rw-r--r--src/Hosting/Hosting/src/Internal/HostingEnvironment.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/HostingEnvironmentExtensions.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/HostingRequestFinishedLog.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/HostingRequestStartingLog.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/StartupLoader.cs4
-rw-r--r--src/Hosting/Hosting/src/Internal/StartupMethods.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/WebHost.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/WebHostLifetime.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/WebHostOptions.cs2
-rw-r--r--src/Hosting/Hosting/src/Internal/WebHostUtilities.cs2
-rw-r--r--src/Hosting/Hosting/src/Startup/ConventionBasedStartup.cs2
-rw-r--r--src/Hosting/Hosting/src/WebHostBuilder.cs1
-rw-r--r--src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs44
-rw-r--r--src/Hosting/Hosting/test/HostingApplicationTests.cs4
-rw-r--r--src/Hosting/Hosting/test/Http/DefaultHttpContextFactoryTests.cs37
-rw-r--r--src/Hosting/Server.IntegrationTesting/src/Common/LoggingHandler.cs4
-rw-r--r--src/Hosting/Server.IntegrationTesting/src/Deployers/RemoteWindowsDeployer/RemoteWindowsDeployer.cs2
-rw-r--r--src/Hosting/Server.IntegrationTesting/src/ProcessHelpers.cs2
-rw-r--r--src/Hosting/TestHost/src/ApplicationWrapper.cs2
-rw-r--r--src/Hosting/TestHost/src/AsyncStreamWrapper.cs2
-rw-r--r--src/Hosting/TestHost/src/ClientHandler.cs14
-rw-r--r--src/Hosting/TestHost/src/HttpContextBuilder.cs18
-rw-r--r--src/Hosting/TestHost/src/NoopHostLifetime.cs2
-rw-r--r--src/Hosting/TestHost/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Hosting/TestHost/src/PublicAPI.Unshipped.txt5
-rw-r--r--src/Hosting/TestHost/src/RequestBodyDetectionFeature.cs2
-rw-r--r--src/Hosting/TestHost/src/RequestFeature.cs41
-rw-r--r--src/Hosting/TestHost/src/RequestLifetimeFeature.cs2
-rw-r--r--src/Hosting/TestHost/src/ResponseBodyPipeWriter.cs2
-rw-r--r--src/Hosting/TestHost/src/ResponseBodyReaderStream.cs2
-rw-r--r--src/Hosting/TestHost/src/ResponseBodyWriterStream.cs2
-rw-r--r--src/Hosting/TestHost/src/ResponseFeature.cs2
-rw-r--r--src/Hosting/TestHost/src/ResponseTrailersFeature.cs2
-rw-r--r--src/Hosting/TestHost/src/TestServer.cs40
-rw-r--r--src/Hosting/TestHost/src/TestWebSocket.cs37
-rw-r--r--src/Hosting/TestHost/src/UpgradeFeature.cs2
-rw-r--r--src/Hosting/TestHost/src/WebHostBuilderExtensions.cs4
-rw-r--r--src/Hosting/TestHost/src/WebSocketClient.cs2
-rw-r--r--src/Hosting/TestHost/test/ClientHandlerTests.cs53
-rw-r--r--src/Hosting/TestHost/test/TestClientTests.cs22
-rw-r--r--src/Hosting/TestHost/test/TestServerTests.cs18
-rw-r--r--src/Hosting/test/FunctionalTests/LinkedApplicationTests.cs1
-rw-r--r--src/Html.Abstractions/Html.Abstractions.slnf11
-rw-r--r--src/Html.Abstractions/src/Microsoft.AspNetCore.Html.Abstractions.csproj2
-rw-r--r--src/Html.Abstractions/startvs.cmd3
-rw-r--r--src/Html.Abstractions/startvscode.cmd3
-rw-r--r--src/Html.Abstractions/startvscode.sh5
-rw-r--r--src/Html.Abstractions/test/HtmlContentBuilderExtensionsTest.cs729
-rw-r--r--src/Html.Abstractions/test/HtmlContentBuilderTest.cs456
-rw-r--r--src/Html.Abstractions/test/HtmlFormattableStringTest.cs330
-rw-r--r--src/Http/Authentication.Abstractions/src/AuthenticateResult.cs4
-rw-r--r--src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs18
-rw-r--r--src/Http/Authentication.Abstractions/src/IAuthenticationConfigurationProvider.cs19
-rw-r--r--src/Http/Authentication.Abstractions/src/Properties/AssemblyInfo.cs8
-rw-r--r--src/Http/Authentication.Abstractions/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs23
-rw-r--r--src/Http/Authentication.Core/src/PublicAPI.Shipped.txt6
-rw-r--r--src/Http/Authentication.Core/src/PublicAPI.Unshipped.txt6
-rw-r--r--src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs101
-rw-r--r--src/Http/Headers/src/CacheControlHeaderValue.cs2
-rw-r--r--src/Http/Headers/src/ContentDispositionHeaderValue.cs4
-rw-r--r--src/Http/Headers/src/HeaderNames.cs7
-rw-r--r--src/Http/Headers/src/HeaderUtilities.cs2
-rw-r--r--src/Http/Headers/src/SetCookieHeaderValue.cs39
-rw-r--r--src/Http/Http.Abstractions/src/AsParametersAttribute.cs17
-rw-r--r--src/Http/Http.Abstractions/src/CookieBuilder.cs20
-rw-r--r--src/Http/Http.Abstractions/src/DefaultEndpointFilterInvocationContext.cs34
-rw-r--r--src/Http/Http.Abstractions/src/EndpointFilterDelegate.cs (renamed from src/Http/Http.Abstractions/src/RouteHandlerFilterDelegate.cs)4
-rw-r--r--src/Http/Http.Abstractions/src/EndpointFilterFactoryContext.cs46
-rw-r--r--src/Http/Http.Abstractions/src/EndpointFilterInvocationContext.cs32
-rw-r--r--src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.cs1385
-rw-r--r--src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.tt130
-rw-r--r--src/Http/Http.Abstractions/src/Extensions/EndpointBuilder.cs13
-rw-r--r--src/Http/Http.Abstractions/src/Extensions/IEndpointConventionBuilder.cs7
-rw-r--r--src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs11
-rw-r--r--src/Http/Http.Abstractions/src/HttpResults/IContentTypeHttpResult.cs16
-rw-r--r--src/Http/Http.Abstractions/src/HttpResults/IFileHttpResult.cs20
-rw-r--r--src/Http/Http.Abstractions/src/HttpResults/INestedHttpResult.cs17
-rw-r--r--src/Http/Http.Abstractions/src/HttpResults/IResult.cs (renamed from src/Http/Http.Abstractions/src/IResult.cs)0
-rw-r--r--src/Http/Http.Abstractions/src/HttpResults/IStatusCodeHttpResult.cs16
-rw-r--r--src/Http/Http.Abstractions/src/HttpResults/IValueHttpResult.cs28
-rw-r--r--src/Http/Http.Abstractions/src/IApplicationBuilder.cs3
-rw-r--r--src/Http/Http.Abstractions/src/IBindableFromHttpContextOfT.cs22
-rw-r--r--src/Http/Http.Abstractions/src/IEndpointFilter.cs (renamed from src/Http/Http.Abstractions/src/IRouteHandlerFilter.cs)8
-rw-r--r--src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs2
-rw-r--r--src/Http/Http.Abstractions/src/Metadata/IRequestSizeLimitMetadata.cs15
-rw-r--r--src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj23
-rw-r--r--src/Http/Http.Abstractions/src/ProblemDetails/HttpValidationProblemDetails.cs (renamed from src/Http/Http.Extensions/src/HttpValidationProblemDetails.cs)2
-rw-r--r--src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsService.cs23
-rw-r--r--src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsWriter.cs24
-rw-r--r--src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetails.cs (renamed from src/Http/Http.Extensions/src/ProblemDetails.cs)0
-rw-r--r--src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetailsContext.cs34
-rw-r--r--src/Http/Http.Abstractions/src/PublicAPI.Shipped.txt6
-rw-r--r--src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt87
-rw-r--r--src/Http/Http.Abstractions/src/RequestDelegateResult.cs3
-rw-r--r--src/Http/Http.Abstractions/src/RouteHandlerContext.cs34
-rw-r--r--src/Http/Http.Abstractions/src/RouteHandlerInvocationContext.cs35
-rw-r--r--src/Http/Http.Abstractions/src/Routing/EndpointHttpContextExtensions.cs2
-rw-r--r--src/Http/Http.Abstractions/src/Routing/EndpointMetadataCollection.cs13
-rw-r--r--src/Http/Http.Abstractions/test/CookieBuilderTests.cs24
-rw-r--r--src/Http/Http.Abstractions/test/EndpointFilterInvocationContextOfTTests.cs89
-rw-r--r--src/Http/Http.Abstractions/test/HttpValidationProblemDetailsJsonConverterTest.cs (renamed from src/Http/Http.Extensions/test/HttpValidationProblemDetailsJsonConverterTest.cs)11
-rw-r--r--src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj9
-rw-r--r--src/Http/Http.Abstractions/test/ProblemDetailsJsonConverterTest.cs (renamed from src/Http/Http.Extensions/test/ProblemDetailsJsonConverterTest.cs)14
-rw-r--r--src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs68
-rw-r--r--src/Http/Http.Extensions/src/DefaultProblemDetailsWriter.cs72
-rw-r--r--src/Http/Http.Extensions/src/EndpointMetadataContext.cs13
-rw-r--r--src/Http/Http.Extensions/src/EndpointParameterMetadataContext.cs13
-rw-r--r--src/Http/Http.Extensions/src/HttpJsonServiceExtensions.cs13
-rw-r--r--src/Http/Http.Extensions/src/HttpResponseJsonExtensions.cs1
-rw-r--r--src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj8
-rw-r--r--src/Http/Http.Extensions/src/ProblemDetailsOptions.cs16
-rw-r--r--src/Http/Http.Extensions/src/ProblemDetailsService.cs58
-rw-r--r--src/Http/Http.Extensions/src/ProblemDetailsServiceCollectionExtensions.cs49
-rw-r--r--src/Http/Http.Extensions/src/Properties/AssemblyInfo.cs3
-rw-r--r--src/Http/Http.Extensions/src/PublicAPI.Unshipped.txt61
-rw-r--r--src/Http/Http.Extensions/src/QueryBuilder.cs2
-rw-r--r--src/Http/Http.Extensions/src/RequestDelegateFactory.cs717
-rw-r--r--src/Http/Http.Extensions/src/RequestDelegateFactoryOptions.cs20
-rw-r--r--src/Http/Http.Extensions/test/EndpointMetadataContextTests.cs26
-rw-r--r--src/Http/Http.Extensions/test/ParameterBindingMethodCacheTests.cs441
-rw-r--r--src/Http/Http.Extensions/test/ProblemDetailsDefaultWriterTest.cs229
-rw-r--r--src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs61
-rw-r--r--src/Http/Http.Extensions/test/ProblemDetailsServiceTest.cs133
-rw-r--r--src/Http/Http.Extensions/test/PropertyAsParameterInfoTests.cs224
-rw-r--r--src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs1721
-rw-r--r--src/Http/Http.Features/src/CookieOptions.cs61
-rw-r--r--src/Http/Http.Features/src/IHttpExtendedConnectFeature.cs30
-rw-r--r--src/Http/Http.Features/src/IHttpWebTransportFeature.cs25
-rw-r--r--src/Http/Http.Features/src/IRequestCookieCollection.cs2
-rw-r--r--src/Http/Http.Features/src/IWebTransportSession.cs39
-rw-r--r--src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj3
-rw-r--r--src/Http/Http.Features/src/PublicAPI.Shipped.txt17
-rw-r--r--src/Http/Http.Features/src/PublicAPI.Unshipped.txt15
-rw-r--r--src/Http/Http.Results/src/Accepted.cs13
-rw-r--r--src/Http/Http.Results/src/AcceptedAtRoute.cs8
-rw-r--r--src/Http/Http.Results/src/AcceptedAtRouteOfT.cs10
-rw-r--r--src/Http/Http.Results/src/AcceptedOfT.cs10
-rw-r--r--src/Http/Http.Results/src/BadRequest.cs8
-rw-r--r--src/Http/Http.Results/src/BadRequestOfT.cs10
-rw-r--r--src/Http/Http.Results/src/ChallengeHttpResult.cs23
-rw-r--r--src/Http/Http.Results/src/Conflict.cs8
-rw-r--r--src/Http/Http.Results/src/ConflictOfT.cs10
-rw-r--r--src/Http/Http.Results/src/ContentHttpResult.cs4
-rw-r--r--src/Http/Http.Results/src/Created.cs8
-rw-r--r--src/Http/Http.Results/src/CreatedAtRoute.cs8
-rw-r--r--src/Http/Http.Results/src/CreatedAtRouteOfT.cs10
-rw-r--r--src/Http/Http.Results/src/CreatedOfT.cs10
-rw-r--r--src/Http/Http.Results/src/EmptyHttpResult.cs2
-rw-r--r--src/Http/Http.Results/src/FileContentHttpResult.cs4
-rw-r--r--src/Http/Http.Results/src/FileStreamHttpResult.cs4
-rw-r--r--src/Http/Http.Results/src/ForbidHttpResult.cs12
-rw-r--r--src/Http/Http.Results/src/HttpResultsHelper.cs47
-rw-r--r--src/Http/Http.Results/src/JsonHttpResultOfT.cs20
-rw-r--r--src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj2
-rw-r--r--src/Http/Http.Results/src/NoContent.cs8
-rw-r--r--src/Http/Http.Results/src/NotFound.cs8
-rw-r--r--src/Http/Http.Results/src/NotFoundOfT.cs10
-rw-r--r--src/Http/Http.Results/src/Ok.cs8
-rw-r--r--src/Http/Http.Results/src/OkOfT.cs10
-rw-r--r--src/Http/Http.Results/src/PhysicalFileHttpResult.cs4
-rw-r--r--src/Http/Http.Results/src/ProblemHttpResult.cs14
-rw-r--r--src/Http/Http.Results/src/PublicAPI.Unshipped.txt106
-rw-r--r--src/Http/Http.Results/src/PushStreamHttpResult.cs4
-rw-r--r--src/Http/Http.Results/src/RedirectHttpResult.cs12
-rw-r--r--src/Http/Http.Results/src/RedirectToRouteHttpResult.cs36
-rw-r--r--src/Http/Http.Results/src/ResultExtensions.cs2
-rw-r--r--src/Http/Http.Results/src/Results.cs185
-rw-r--r--src/Http/Http.Results/src/ResultsOfT.Generated.cs (renamed from src/Http/Http.Results/src/ResultsOfT.cs)40
-rw-r--r--src/Http/Http.Results/src/SignInHttpResult.cs4
-rw-r--r--src/Http/Http.Results/src/SignOutHttpResult.cs22
-rw-r--r--src/Http/Http.Results/src/StatusCodeHttpResult.cs10
-rw-r--r--src/Http/Http.Results/src/TypedResults.cs150
-rw-r--r--src/Http/Http.Results/src/UnauthorizedHttpResult.cs6
-rw-r--r--src/Http/Http.Results/src/UnprocessableEntity.cs8
-rw-r--r--src/Http/Http.Results/src/UnprocessableEntityOfT.cs10
-rw-r--r--src/Http/Http.Results/src/Utf8ContentHttpResult.cs68
-rw-r--r--src/Http/Http.Results/src/ValidationProblem.cs16
-rw-r--r--src/Http/Http.Results/src/VirtualFileHttpResult.cs6
-rw-r--r--src/Http/Http.Results/test/AcceptedAtRouteOfTResultTests.cs69
-rw-r--r--src/Http/Http.Results/test/AcceptedAtRouteResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/AcceptedOfTResultTests.cs53
-rw-r--r--src/Http/Http.Results/test/AcceptedResultTests.cs30
-rw-r--r--src/Http/Http.Results/test/BadRequestOfTResultTests.cs53
-rw-r--r--src/Http/Http.Results/test/BadRequestResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/ChallengeResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/ConflictOfTResultTests.cs52
-rw-r--r--src/Http/Http.Results/test/ConflictResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/ContentResultTests.cs44
-rw-r--r--src/Http/Http.Results/test/CreatedAtRouteOfTResultTests.cs66
-rw-r--r--src/Http/Http.Results/test/CreatedAtRouteResultTests.cs33
-rw-r--r--src/Http/Http.Results/test/CreatedOfTResultTests.cs57
-rw-r--r--src/Http/Http.Results/test/CreatedResultTests.cs31
-rw-r--r--src/Http/Http.Results/test/EmptyResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/EmptyServiceProvider.cs11
-rw-r--r--src/Http/Http.Results/test/FileContentResultTests.cs25
-rw-r--r--src/Http/Http.Results/test/ForbidResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/HttpFileStreamResultTests.cs35
-rw-r--r--src/Http/Http.Results/test/JsonResultTests.cs70
-rw-r--r--src/Http/Http.Results/test/Microsoft.AspNetCore.Http.Results.Tests.csproj2
-rw-r--r--src/Http/Http.Results/test/NoContentResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/NotFoundOfTResultTests.cs52
-rw-r--r--src/Http/Http.Results/test/NotFoundResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/OkOfTResultTests.cs52
-rw-r--r--src/Http/Http.Results/test/OkResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/PhysicalFileResultTest.cs25
-rw-r--r--src/Http/Http.Results/test/ProblemResultTests.cs91
-rw-r--r--src/Http/Http.Results/test/PushStreamResultTests.cs36
-rw-r--r--src/Http/Http.Results/test/RedirectResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/RedirectToRouteResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/ResultsOfTTests.Generated.cs45
-rw-r--r--src/Http/Http.Results/test/ResultsOfTTests.cs11
-rw-r--r--src/Http/Http.Results/test/ResultsTests.cs393
-rw-r--r--src/Http/Http.Results/test/SignInResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/SignOutResultTests.cs11
-rw-r--r--src/Http/Http.Results/test/StatusCodeResultTests.cs19
-rw-r--r--src/Http/Http.Results/test/TypedResultsTests.cs267
-rw-r--r--src/Http/Http.Results/test/UnauthorizedResultTests.cs19
-rw-r--r--src/Http/Http.Results/test/UnprocessableEntityOfTResultTests.cs54
-rw-r--r--src/Http/Http.Results/test/UnprocessableEntityResultTests.cs28
-rw-r--r--src/Http/Http.Results/test/Utf8ContentResultTests.cs105
-rw-r--r--src/Http/Http.Results/test/ValidationProblemResultTests.cs64
-rw-r--r--src/Http/Http.Results/test/VirtualFileResultTests.cs25
-rw-r--r--src/Http/Http.Results/tools/ResultsOfTGenerator/Program.cs77
-rw-r--r--src/Http/Http.Results/tools/ResultsOfTGenerator/ResultsOfTGenerator.csproj1
-rw-r--r--src/Http/Http/src/Builder/ApplicationBuilder.cs11
-rw-r--r--src/Http/Http/src/Features/FormFeature.cs35
-rw-r--r--src/Http/Http/src/Features/RequestBodyPipeFeature.cs5
-rw-r--r--src/Http/Http/src/HttpContextAccessor.cs2
-rw-r--r--src/Http/Http/src/Internal/ItemsDictionary.cs4
-rw-r--r--src/Http/Http/src/Internal/ReferenceReadStream.cs5
-rw-r--r--src/Http/Http/src/Internal/RequestCookieCollection.cs4
-rw-r--r--src/Http/Http/src/Internal/ResponseCookies.cs41
-rw-r--r--src/Http/Http/src/Properties/AssemblyInfo.cs1
-rw-r--r--src/Http/Http/src/PublicAPI.Shipped.txt3
-rw-r--r--src/Http/Http/src/QueryCollectionInternal.cs2
-rw-r--r--src/Http/Http/test/ApplicationBuilderTests.cs8
-rw-r--r--src/Http/Http/test/CookieOptionsTests.cs63
-rw-r--r--src/Http/Http/test/Features/FormFeatureTests.cs54
-rw-r--r--src/Http/Http/test/Features/RequestBodyPipeFeatureTests.cs25
-rw-r--r--src/Http/Http/test/ResponseCookiesTest.cs47
-rw-r--r--src/Http/HttpAbstractions.slnf14
-rw-r--r--src/Http/Owin/src/DictionaryStringArrayWrapper.cs2
-rw-r--r--src/Http/Owin/src/DictionaryStringValuesWrapper.cs2
-rw-r--r--src/Http/Owin/src/OwinExtensions.cs2
-rw-r--r--src/Http/Routing.Abstractions/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Http/Routing.Abstractions/src/PublicAPI.Unshipped.txt4
-rw-r--r--src/Http/Routing/perf/Microbenchmarks/EndpointMetadataCollectionBenchmark.cs18
-rw-r--r--src/Http/Routing/perf/Microbenchmarks/LinkGeneration/SingleRouteRouteValuesAddressSchemeBenchmark.cs2
-rw-r--r--src/Http/Routing/perf/Microbenchmarks/Matching/MatcherBuilderMultipleEntryBenchmark.cs10
-rw-r--r--src/Http/Routing/perf/Microbenchmarks/Matching/TrivialMatcherBuilder.cs2
-rw-r--r--src/Http/Routing/src/Builder/EndpointFilterExtensions.cs120
-rw-r--r--src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs298
-rw-r--r--src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs21
-rw-r--r--src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs33
-rw-r--r--src/Http/Routing/src/Builder/OpenApiRouteHandlerBuilderExtensions.cs124
-rw-r--r--src/Http/Routing/src/Builder/RouteHandlerBuilder.cs39
-rw-r--r--src/Http/Routing/src/Builder/RouteHandlerFilterExtensions.cs82
-rw-r--r--src/Http/Routing/src/Builder/RoutingBuilderExtensions.cs22
-rw-r--r--src/Http/Routing/src/Builder/RoutingEndpointConventionBuilderExtensions.cs40
-rw-r--r--src/Http/Routing/src/CompositeEndpointDataSource.cs292
-rw-r--r--src/Http/Routing/src/ConfigureRouteHandlerOptions.cs6
-rw-r--r--src/Http/Routing/src/ConfigureRouteOptions.cs4
-rw-r--r--src/Http/Routing/src/Constraints/NullRouteConstraint.cs2
-rw-r--r--src/Http/Routing/src/DecisionTree/DecisionCriterion.cs2
-rw-r--r--src/Http/Routing/src/DecisionTree/DecisionCriterionValueEqualityComparer.cs2
-rw-r--r--src/Http/Routing/src/DecisionTree/DecisionTreeBuilder.cs4
-rw-r--r--src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs2
-rw-r--r--src/Http/Routing/src/DecisionTree/ItemDescriptor.cs2
-rw-r--r--src/Http/Routing/src/DefaultEndpointConventionBuilder.cs48
-rw-r--r--src/Http/Routing/src/DefaultEndpointDataSource.cs6
-rw-r--r--src/Http/Routing/src/DefaultEndpointRouteBuilder.cs2
-rw-r--r--src/Http/Routing/src/DefaultParameterPolicyFactory.cs2
-rw-r--r--src/Http/Routing/src/EndpointDataSource.cs153
-rw-r--r--src/Http/Routing/src/EndpointMiddleware.cs35
-rw-r--r--src/Http/Routing/src/EndpointRoutingMiddleware.cs4
-rw-r--r--src/Http/Routing/src/HttpMethodMetadata.cs2
-rw-r--r--src/Http/Routing/src/IHttpMethodMetadata.cs8
-rw-r--r--src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs10
-rw-r--r--src/Http/Routing/src/Matching/AcceptsMatcherPolicy.cs4
-rw-r--r--src/Http/Routing/src/Matching/AmbiguousMatchException.cs6
-rw-r--r--src/Http/Routing/src/Matching/DfaMatcherBuilder.cs4
-rw-r--r--src/Http/Routing/src/Matching/DfaMatcherFactory.cs2
-rw-r--r--src/Http/Routing/src/Matching/DfaNode.cs2
-rw-r--r--src/Http/Routing/src/Matching/DictionaryJumpTable.cs4
-rw-r--r--src/Http/Routing/src/Matching/EndpointComparer.cs6
-rw-r--r--src/Http/Routing/src/Matching/EndpointMetadataComparer.cs2
-rw-r--r--src/Http/Routing/src/Matching/HostMatcherPolicy.cs4
-rw-r--r--src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs6
-rw-r--r--src/Http/Routing/src/Matching/ILEmitTrieFactory.cs4
-rw-r--r--src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs2
-rw-r--r--src/Http/Routing/src/Matching/LinearSearchJumpTable.cs4
-rw-r--r--src/Http/Routing/src/Matching/SingleEntryAsciiJumpTable.cs2
-rw-r--r--src/Http/Routing/src/Matching/SingleEntryJumpTable.cs4
-rw-r--r--src/Http/Routing/src/Matching/ZeroEntryJumpTable.cs4
-rw-r--r--src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj1
-rw-r--r--src/Http/Routing/src/ModelEndpointDataSource.cs38
-rw-r--r--src/Http/Routing/src/NullRouter.cs2
-rw-r--r--src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs2
-rw-r--r--src/Http/Routing/src/Patterns/RoutePattern.cs2
-rw-r--r--src/Http/Routing/src/Patterns/RoutePatternException.cs3
-rw-r--r--src/Http/Routing/src/Patterns/RoutePatternFactory.cs124
-rw-r--r--src/Http/Routing/src/Patterns/RoutePatternMatcher.cs2
-rw-r--r--src/Http/Routing/src/Patterns/RoutePatternParser.cs2
-rw-r--r--src/Http/Routing/src/PublicAPI.Shipped.txt7
-rw-r--r--src/Http/Routing/src/PublicAPI.Unshipped.txt40
-rw-r--r--src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs35
-rw-r--r--src/Http/Routing/src/Resources.resx15
-rw-r--r--src/Http/Routing/src/Route.cs8
-rw-r--r--src/Http/Routing/src/RouteBase.cs2
-rw-r--r--src/Http/Routing/src/RouteEndpointBuilder.cs66
-rw-r--r--src/Http/Routing/src/RouteEndpointDataSource.cs319
-rw-r--r--src/Http/Routing/src/RouteGroupBuilder.cs131
-rw-r--r--src/Http/Routing/src/RouteGroupContext.cs45
-rw-r--r--src/Http/Routing/src/RouteOptions.cs2
-rw-r--r--src/Http/Routing/src/RouteValuesAddressScheme.cs2
-rw-r--r--src/Http/Routing/src/RoutingMarkerService.cs2
-rw-r--r--src/Http/Routing/src/Template/TemplateBinder.cs2
-rw-r--r--src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs6
-rw-r--r--src/Http/Routing/src/UriBuilderContextPooledObjectPolicy.cs2
-rw-r--r--src/Http/Routing/test/FunctionalTests/EndpointRoutingIntegrationTest.cs37
-rw-r--r--src/Http/Routing/test/FunctionalTests/RouteHandlerTest.cs65
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/EndpointRoutingApplicationBuilderExtensionsTest.cs2
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/GroupTest.cs399
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/OpenApiRouteHandlerBuilderExtensionsTest.cs158
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/RequestDelegateEndpointRouteBuilderExtensionsTest.cs175
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/RouteHandlerEndpointRouteBuilderExtensionsTest.cs249
-rw-r--r--src/Http/Routing/test/UnitTests/Builder/RoutingEndpointConventionBuilderExtensionsTest.cs138
-rw-r--r--src/Http/Routing/test/UnitTests/CompositeEndpointDataSourceTest.cs355
-rw-r--r--src/Http/Routing/test/UnitTests/EndpointMiddlewareTest.cs29
-rw-r--r--src/Http/Routing/test/UnitTests/EndpointRoutingMiddlewareTest.cs1
-rw-r--r--src/Http/Routing/test/UnitTests/Patterns/RoutePatternFactoryTest.cs129
-rw-r--r--src/Http/Routing/test/UnitTests/RouteEndpointBuilderTest.cs102
-rw-r--r--src/Http/Routing/test/UnitTests/RouteHandlerOptionsTests.cs5
-rw-r--r--src/Http/Routing/test/UnitTests/RoutingEndpointConventionBuilderExtensionsTests.cs40
-rw-r--r--src/Http/Routing/test/testassets/RoutingSandbox/Framework/FrameworkEndpointDataSource.cs2
-rw-r--r--src/Http/Routing/tools/Swaggatherer/RouteEntry.cs2
-rw-r--r--src/Http/Routing/tools/Swaggatherer/SwaggathererApplication.cs2
-rw-r--r--src/Http/WebUtilities/src/BufferedReadStream.cs5
-rw-r--r--src/Http/WebUtilities/src/FileBufferingReadStream.cs11
-rw-r--r--src/Http/WebUtilities/src/FileBufferingWriteStream.cs10
-rw-r--r--src/Http/WebUtilities/src/FormMultipartSection.cs13
-rw-r--r--src/Http/WebUtilities/src/FormPipeReader.cs6
-rw-r--r--src/Http/WebUtilities/src/HttpRequestStreamReader.cs30
-rw-r--r--src/Http/WebUtilities/src/HttpResponseStreamWriter.cs30
-rw-r--r--src/Http/WebUtilities/src/MultipartBoundary.cs2
-rw-r--r--src/Http/WebUtilities/src/MultipartReader.cs5
-rw-r--r--src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs26
-rw-r--r--src/Http/WebUtilities/src/PagedByteBuffer.cs5
-rw-r--r--src/Http/WebUtilities/src/PublicAPI.Shipped.txt3
-rw-r--r--src/Http/WebUtilities/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs107
-rw-r--r--src/Http/WebUtilities/test/MultipartReaderTests.cs12
-rw-r--r--src/Http/samples/MinimalSample/MinimalSample.csproj1
-rw-r--r--src/Http/samples/MinimalSample/Program.cs87
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtBearerOptionsConfiguration.cs6
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtPolicySchemeForwardSelector.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Authentication/StaticConfigurationManager.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/AspNetConventionsConfigureOptions.cs2
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ClientDefinition.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiResources.cs2
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiScopes.cs2
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClientScopes.cs2
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClients.cs2
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureIdentityResources.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureSigningCredentials.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityResourceDefinition.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityServerJwtApiDescriptor.cs2
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeyDefinition.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeySources.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Configuration/SigningKeysLoader.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AbsoluteUrlFactory.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AutoRedirectEndSessionEndpoint.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Extensions/DefaultClientRequestParametersProvider.cs5
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/src/Extensions/RelativeRedirectUriValidator.cs4
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/test/Authentication/IdentityServerJwtBearerConfigurationTest.cs (renamed from src/Identity/ApiAuthorization.IdentityServer/test/Authentication/LocalApiJwtBearerConfigurationTest.cs)7
-rw-r--r--src/Identity/ApiAuthorization.IdentityServer/test/Extensions/DefaultClientRequestParametersProviderTests.cs7
-rw-r--r--src/Identity/Core/src/IdentityBuilderExtensions.cs3
-rw-r--r--src/Identity/Core/src/IdentityServiceCollectionExtensions.cs5
-rw-r--r--src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj4
-rw-r--r--src/Identity/Core/src/PublicAPI.Shipped.txt196
-rw-r--r--src/Identity/Core/src/PublicAPI.Unshipped.txt219
-rw-r--r--src/Identity/EntityFrameworkCore/src/IdentityUserContext.cs2
-rw-r--r--src/Identity/EntityFrameworkCore/src/PublicAPI.Shipped.txt268
-rw-r--r--src/Identity/EntityFrameworkCore/src/PublicAPI.Unshipped.txt250
-rw-r--r--src/Identity/EntityFrameworkCore/src/RoleStore.cs5
-rw-r--r--src/Identity/EntityFrameworkCore/src/UserStore.cs3
-rw-r--r--src/Identity/Extensions.Core/src/Base32.cs8
-rw-r--r--src/Identity/Extensions.Core/src/IdentityBuilder.cs34
-rw-r--r--src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj6
-rw-r--r--src/Identity/Extensions.Core/src/PublicAPI.Shipped.txt828
-rw-r--r--src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt925
-rw-r--r--src/Identity/Extensions.Core/src/UserLoginInfo.cs2
-rw-r--r--src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj4
-rw-r--r--src/Identity/Extensions.Stores/src/PublicAPI.Shipped.txt348
-rw-r--r--src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt345
-rw-r--r--src/Identity/Extensions.Stores/src/RoleStoreBase.cs4
-rw-r--r--src/Identity/Extensions.Stores/src/UserStoreBase.cs6
-rw-r--r--src/Identity/README.md5
-rw-r--r--src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs2
-rw-r--r--src/Identity/Specification.Tests/src/UserManagerSpecificationTests.cs8
-rw-r--r--src/Identity/UI/src/Areas/Identity/Filters/ExternalLoginsPageFilter.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmail.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmailChange.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ExternalLogin.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ForgotPassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Login.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWith2fa.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWithRecoveryCode.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Logout.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ChangePassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DeletePersonalData.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Disable2fa.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DownloadPersonalData.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Email.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/EnableAuthenticator.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ExternalLogins.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/GenerateRecoveryCodes.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Index.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ResetAuthenticator.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/SetPassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/TwoFactorAuthentication.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResendEmailConfirmation.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResetPassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V4/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmail.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmailChange.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml6
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml24
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml16
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Logout.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml12
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Disable2fa.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DownloadPersonalData.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml12
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ExternalLogins.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/GenerateRecoveryCodes.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml8
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ResetAuthenticator.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml8
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/TwoFactorAuthentication.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml18
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/RegisterConfirmation.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml14
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml.cs2
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/_Layout.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Pages/V5/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Identity/UI/src/Areas/Identity/Services/EmailSender.cs2
-rw-r--r--src/Identity/UI/src/IdentityBuilderUIExtensions.cs8
-rw-r--r--src/Identity/UI/src/IdentityDefaultUIConfigureOptions.cs2
-rw-r--r--src/Identity/UI/src/IdentityPageModelConvention.cs2
-rw-r--r--src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj21
-rw-r--r--src/Identity/UI/src/PublicAPI.Shipped.txt888
-rw-r--r--src/Identity/UI/src/PublicAPI.Unshipped.txt888
-rw-r--r--src/Identity/UI/src/THIRD-PARTY-NOTICES.txt20
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/LICENSE.txt29
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js11
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery/LICENSE.txt19
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.js227
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Identity/UI/src/assets/V5/css/site.css20
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/LICENSE.txt29
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js11
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery/LICENSE.txt19
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.js227
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_Layout.cshtml4
-rw-r--r--src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_ValidationScriptsPartial.cshtml2
-rw-r--r--src/Identity/samples/IdentitySample.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml2
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_Layout.cshtml4
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_ValidationScriptsPartial.cshtml6
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt29
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js11
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV2/ancm_iis_expressv2.wxs16
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/CustomAction/aspnetcoreCA.vcxproj5
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h116
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx42
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h14
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h124
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h325
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h666
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h2797
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h3404
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h243
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h163
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h63
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx225
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx225
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h40
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h305
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h85
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h88
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h193
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h730
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h24
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h515
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h243
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h105
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h850
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj16
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx443
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp1734
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx482
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx247
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx480
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx414
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx890
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h18
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp1767
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp1289
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx1416
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx74
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/lib/iisca.vcxproj5
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/wix/setupstrings.wxl255
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHS/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHT/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CSY/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/DEU/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ESN/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/FRA/misc/setupstrings.wxl352
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ITA/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/JPN/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/KOR/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PLK/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PTB/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/RUS/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/TRK/misc/setupstrings.wxl351
-rw-r--r--src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props7
-rw-r--r--src/Installers/Windows/SharedFramework/Product.wxs8
-rw-r--r--src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs1
-rw-r--r--src/Installers/Windows/TargetingPack/Product.wxs2
-rw-r--r--src/Installers/Windows/files/eula.rtf113
-rw-r--r--src/Installers/Windows/files/eula.txt23
-rw-r--r--src/JSInterop/Microsoft.JSInterop.JS/src/.npmrc1
-rw-r--r--src/JSInterop/Microsoft.JSInterop.JS/src/package.json8
-rw-r--r--src/JSInterop/Microsoft.JSInterop.JS/src/src/Microsoft.JSInterop.ts10
-rw-r--r--src/JSInterop/Microsoft.JSInterop.JS/src/yarn.lock325
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReference.cs5
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReferenceOfT.cs10
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledObjectReference.cs4
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledRuntime.cs4
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/Implementation/JSObjectReference.cs5
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetDispatcher.cs28
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverter.cs4
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverterFactory.cs2
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/Infrastructure/TaskGenericsUtil.cs6
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs4
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/Microsoft.JSInterop.WarningSuppressions.xml16
-rw-r--r--src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj3
-rw-r--r--src/Localization/Localization/src/Internal/AssemblyWrapper.cs2
-rw-r--r--src/Localization/Localization/src/Internal/ResourceManagerStringProvider.cs2
-rw-r--r--src/Localization/Localization/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Localization/Localization/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Logging.AzureAppServices/src/BatchingLogger.cs2
-rw-r--r--src/Logging.AzureAppServices/src/BlobAppendReferenceWrapper.cs2
-rw-r--r--src/Logging.AzureAppServices/src/BlobLoggerConfigureOptions.cs2
-rw-r--r--src/Logging.AzureAppServices/src/ConfigurationBasedLevelSwitcher.cs2
-rw-r--r--src/Logging.AzureAppServices/src/FileLoggerConfigureOptions.cs2
-rw-r--r--src/Logging.AzureAppServices/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Logging.AzureAppServices/src/SiteConfigurationProvider.cs2
-rw-r--r--src/Logging.AzureAppServices/src/WebAppContext.cs2
-rw-r--r--src/Logging.AzureAppServices/test/AzureAppendBlobTests.cs1
-rw-r--r--src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj2
-rw-r--r--src/Middleware/CORS/src/PublicAPI.Shipped.txt18
-rw-r--r--src/Middleware/CORS/src/PublicAPI.Unshipped.txt8
-rw-r--r--src/Middleware/CORS/test/testassets/CorsMiddlewareWebSite/Properties/launchSettings.json2
-rw-r--r--src/Middleware/ConcurrencyLimiter/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Middleware/ConcurrencyLimiter/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Middleware/ConcurrencyLimiter/src/QueuePolicies/BasePolicy.cs11
-rw-r--r--src/Middleware/ConcurrencyLimiter/src/QueuePolicies/QueuePolicy.cs2
-rw-r--r--src/Middleware/ConcurrencyLimiter/src/QueuePolicies/StackPolicy.cs2
-rw-r--r--src/Middleware/Diagnostics.Abstractions/src/Microsoft.AspNetCore.Diagnostics.Abstractions.csproj2
-rw-r--r--src/Middleware/Diagnostics.Abstractions/src/PublicAPI.Shipped.txt7
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/DatabaseContextDetails.cs2
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj2
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/MigrationsEndPointMiddleware.cs6
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Shipped.txt8
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Unshipped.txt8
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.Designer.cs2
-rw-r--r--src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPageModel.cs10
-rw-r--r--src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageExtensions.cs6
-rw-r--r--src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddleware.cs258
-rw-r--r--src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs337
-rw-r--r--src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/CompilationErrorModel.cs2
-rw-r--r--src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/EndpointModel.cs2
-rw-r--r--src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/ErrorPageModel.cs2
-rw-r--r--src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerExtensions.cs25
-rw-r--r--src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddleware.cs156
-rw-r--r--src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddlewareImpl.cs216
-rw-r--r--src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj3
-rw-r--r--src/Middleware/Diagnostics/src/PublicAPI.Shipped.txt8
-rw-r--r--src/Middleware/Diagnostics/src/PublicAPI.Unshipped.txt8
-rw-r--r--src/Middleware/Diagnostics/src/Resources.resx4
-rw-r--r--src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesExtensions.cs16
-rw-r--r--src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesOptions.cs23
-rw-r--r--src/Middleware/Diagnostics/src/WelcomePage/Views/Obsolete/WelcomePage.cs2
-rw-r--r--src/Middleware/Diagnostics/src/WelcomePage/Views/WelcomePage.Designer.cs2
-rw-r--r--src/Middleware/Diagnostics/test/FunctionalTests/DeveloperExceptionPageSampleTest.cs23
-rw-r--r--src/Middleware/Diagnostics/test/FunctionalTests/ProblemDetailsExceptionHandlerSampleTest.cs37
-rw-r--r--src/Middleware/Diagnostics/test/FunctionalTests/StatusCodeSampleTest.cs24
-rw-r--r--src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerTest.cs3
-rw-r--r--src/Middleware/Diagnostics/test/testassets/DatabaseErrorPageSample/Properties/launchSettings.json2
-rw-r--r--src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/DeveloperExceptionPageSample.csproj2
-rw-r--r--src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Properties/launchSettings.json2
-rw-r--r--src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Startup.cs8
-rw-r--r--src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/ExceptionHandlerSample.csproj3
-rw-r--r--src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Program.cs22
-rw-r--r--src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Properties/launchSettings.json2
-rw-r--r--src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Startup.cs15
-rw-r--r--src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/StartupWithProblemDetails.cs40
-rw-r--r--src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Properties/launchSettings.json2
-rw-r--r--src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Startup.cs5
-rw-r--r--src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/StatusCodePagesSample.csproj2
-rw-r--r--src/Middleware/Diagnostics/test/testassets/WelcomePageSample/Properties/launchSettings.json2
-rw-r--r--src/Middleware/HeaderPropagation/src/Microsoft.AspNetCore.HeaderPropagation.csproj2
-rw-r--r--src/Middleware/HeaderPropagation/src/PublicAPI.Shipped.txt10
-rw-r--r--src/Middleware/HeaderPropagation/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj2
-rw-r--r--src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs3
-rw-r--r--src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj2
-rw-r--r--src/Middleware/HealthChecks/src/PublicAPI.Shipped.txt9
-rw-r--r--src/Middleware/HealthChecks/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj2
-rw-r--r--src/Middleware/HostFiltering/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Middleware/HttpLogging/samples/Logging.W3C.Sample/Startup.cs3
-rw-r--r--src/Middleware/HttpLogging/src/BufferingStream.cs3
-rw-r--r--src/Middleware/HttpLogging/src/FileLoggerProcessor.cs54
-rw-r--r--src/Middleware/HttpLogging/src/HttpLoggingExtensions.cs7
-rw-r--r--src/Middleware/HttpLogging/src/HttpLoggingFields.cs16
-rw-r--r--src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs8
-rw-r--r--src/Middleware/HttpLogging/src/HttpLoggingOptions.cs6
-rw-r--r--src/Middleware/HttpLogging/src/HttpLoggingServicesExtensions.cs1
-rw-r--r--src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj4
-rw-r--r--src/Middleware/HttpLogging/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/Middleware/HttpLogging/src/StatusCodeHelper.cs148
-rw-r--r--src/Middleware/HttpLogging/src/SystemDateTime.cs2
-rw-r--r--src/Middleware/HttpLogging/src/W3CLogger.cs41
-rw-r--r--src/Middleware/HttpLogging/src/W3CLoggerOptions.cs36
-rw-r--r--src/Middleware/HttpLogging/src/W3CLoggerProcessor.cs12
-rw-r--r--src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs35
-rw-r--r--src/Middleware/HttpLogging/test/FileLoggerProcessorTests.cs293
-rw-r--r--src/Middleware/HttpLogging/test/Helpers.cs16
-rw-r--r--src/Middleware/HttpLogging/test/HttpLoggingMiddlewareTests.cs35
-rw-r--r--src/Middleware/HttpLogging/test/TestW3CLogger.cs14
-rw-r--r--src/Middleware/HttpLogging/test/W3CLoggerTests.cs12
-rw-r--r--src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs149
-rw-r--r--src/Middleware/HttpOverrides/src/CertificateForwardingFeature.cs39
-rw-r--r--src/Middleware/HttpOverrides/src/PublicAPI.Shipped.txt29
-rw-r--r--src/Middleware/HttpOverrides/src/PublicAPI.Unshipped.txt9
-rw-r--r--src/Middleware/HttpOverrides/test/CertificateForwardingTest.cs1
-rw-r--r--src/Middleware/HttpsPolicy/src/HttpsRedirectionMiddleware.cs6
-rw-r--r--src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj2
-rw-r--r--src/Middleware/HttpsPolicy/src/PublicAPI.Shipped.txt12
-rw-r--r--src/Middleware/HttpsPolicy/src/PublicAPI.Unshipped.txt12
-rw-r--r--src/Middleware/Localization.Routing/src/Microsoft.AspNetCore.Localization.Routing.csproj2
-rw-r--r--src/Middleware/Localization.Routing/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj2
-rw-r--r--src/Middleware/Localization/src/PublicAPI.Shipped.txt19
-rw-r--r--src/Middleware/Localization/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Middleware/Localization/testassets/LocalizationWebsite/Properties/launchSettings.json2
-rw-r--r--src/Middleware/Middleware.slnf10
-rw-r--r--src/Middleware/MiddlewareAnalysis/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Middleware/OutputCaching/OutputCaching.slnf10
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/launch.json35
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/tasks.json41
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/Gravatar.cs17
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/OutputCachingSample.csproj14
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/Properties/launchSettings.json27
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/README.md6
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/Startup.cs75
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.Development.json10
-rw-r--r--src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.json10
-rw-r--r--src/Middleware/OutputCaching/src/CacheEntryHelpers.cs59
-rw-r--r--src/Middleware/OutputCaching/src/CacheVaryByRules.cs42
-rw-r--r--src/Middleware/OutputCaching/src/CachedResponseBody.cs53
-rw-r--r--src/Middleware/OutputCaching/src/DispatcherExtensions.cs89
-rw-r--r--src/Middleware/OutputCaching/src/IOutputCacheFeature.cs15
-rw-r--r--src/Middleware/OutputCaching/src/IOutputCacheKeyProvider.cs14
-rw-r--r--src/Middleware/OutputCaching/src/IOutputCachePolicy.cs30
-rw-r--r--src/Middleware/OutputCaching/src/IOutputCacheStore.cs36
-rw-r--r--src/Middleware/OutputCaching/src/ISystemClock.cs15
-rw-r--r--src/Middleware/OutputCaching/src/LoggerExtensions.cs55
-rw-r--r--src/Middleware/OutputCaching/src/Memory/MemoryOutputCacheStore.cs96
-rw-r--r--src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj26
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheApplicationBuilderExtensions.cs23
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheAttribute.cs103
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheContext.cs77
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheEntry.cs34
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheEntryFormatter.cs81
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheFeature.cs14
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheKeyProvider.cs214
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheMiddleware.cs621
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheOptions.cs96
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheOptionsSetup.cs21
-rw-r--r--src/Middleware/OutputCaching/src/OutputCachePolicyBuilder.cs269
-rw-r--r--src/Middleware/OutputCaching/src/OutputCacheServiceCollectionExtensions.cs58
-rw-r--r--src/Middleware/OutputCaching/src/Policies/CompositePolicy.cs48
-rw-r--r--src/Middleware/OutputCaching/src/Policies/DefaultPolicy.cs83
-rw-r--r--src/Middleware/OutputCaching/src/Policies/EnableCachePolicy.cs37
-rw-r--r--src/Middleware/OutputCaching/src/Policies/ExpirationPolicy.cs41
-rw-r--r--src/Middleware/OutputCaching/src/Policies/LockingPolicy.cs47
-rw-r--r--src/Middleware/OutputCaching/src/Policies/NamedPolicy.cs82
-rw-r--r--src/Middleware/OutputCaching/src/Policies/NoLookupPolicy.cs36
-rw-r--r--src/Middleware/OutputCaching/src/Policies/NoStorePolicy.cs36
-rw-r--r--src/Middleware/OutputCaching/src/Policies/OutputCacheConventionBuilderExtensions.cs81
-rw-r--r--src/Middleware/OutputCaching/src/Policies/PredicatePolicy.cs76
-rw-r--r--src/Middleware/OutputCaching/src/Policies/TagsPolicy.cs44
-rw-r--r--src/Middleware/OutputCaching/src/Policies/TypedPolicy.cs54
-rw-r--r--src/Middleware/OutputCaching/src/Policies/VaryByHeaderPolicy.cs68
-rw-r--r--src/Middleware/OutputCaching/src/Policies/VaryByQueryPolicy.cs72
-rw-r--r--src/Middleware/OutputCaching/src/Policies/VaryByRouteValuePolicy.cs68
-rw-r--r--src/Middleware/OutputCaching/src/Policies/VaryByValuePolicy.cs82
-rw-r--r--src/Middleware/OutputCaching/src/PublicAPI.Shipped.txt (renamed from src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Unshipped.txt)0
-rw-r--r--src/Middleware/OutputCaching/src/PublicAPI.Unshipped.txt98
-rw-r--r--src/Middleware/OutputCaching/src/Resources.resx123
-rw-r--r--src/Middleware/OutputCaching/src/Serialization/FormatterEntry.cs12
-rw-r--r--src/Middleware/OutputCaching/src/Serialization/FormatterEntrySerializerContext.cs12
-rw-r--r--src/Middleware/OutputCaching/src/Streams/OutputCacheStream.cs187
-rw-r--r--src/Middleware/OutputCaching/src/Streams/SegmentWriteStream.cs199
-rw-r--r--src/Middleware/OutputCaching/src/Streams/StreamUtilities.cs13
-rw-r--r--src/Middleware/OutputCaching/src/StringBuilderExtensions.cs23
-rw-r--r--src/Middleware/OutputCaching/src/SystemClock.cs15
-rw-r--r--src/Middleware/OutputCaching/startvs.cmd3
-rw-r--r--src/Middleware/OutputCaching/test/CachedResponseBodyTests.cs122
-rw-r--r--src/Middleware/OutputCaching/test/MemoryOutputCacheStoreTests.cs155
-rw-r--r--src/Middleware/OutputCaching/test/Microsoft.AspNetCore.OutputCaching.Tests.csproj (renamed from src/Azure/AzureAD/Authentication.AzureAD.UI/test/Microsoft.AspNetCore.Authentication.AzureAD.UI.Test.csproj)10
-rw-r--r--src/Middleware/OutputCaching/test/OutputCacheAttributeTests.cs138
-rw-r--r--src/Middleware/OutputCaching/test/OutputCacheEntryFormatterTests.cs66
-rw-r--r--src/Middleware/OutputCaching/test/OutputCacheKeyProviderTests.cs224
-rw-r--r--src/Middleware/OutputCaching/test/OutputCacheMiddlewareTests.cs911
-rw-r--r--src/Middleware/OutputCaching/test/OutputCachePoliciesTests.cs289
-rw-r--r--src/Middleware/OutputCaching/test/OutputCachePolicyBuilderTests.cs276
-rw-r--r--src/Middleware/OutputCaching/test/OutputCachePolicyProviderTests.cs397
-rw-r--r--src/Middleware/OutputCaching/test/OutputCacheTests.cs985
-rw-r--r--src/Middleware/OutputCaching/test/SegmentWriteStreamTests.cs105
-rw-r--r--src/Middleware/OutputCaching/test/TestDocument.txt1
-rw-r--r--src/Middleware/OutputCaching/test/TestUtils.cs374
-rw-r--r--src/Middleware/RateLimiting/samples/RateLimitingSample/Program.cs123
-rw-r--r--src/Middleware/RateLimiting/samples/RateLimitingSample/Properties/launchSettings.json31
-rw-r--r--src/Middleware/RateLimiting/samples/RateLimitingSample/RateLimitingSample.csproj19
-rw-r--r--src/Middleware/RateLimiting/samples/RateLimitingSample/SampleRateLimiterPolicy.cs37
-rw-r--r--src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.Development.json8
-rw-r--r--src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.json9
-rw-r--r--src/Middleware/RateLimiting/src/DefaultCombinedLease.cs99
-rw-r--r--src/Middleware/RateLimiting/src/DefaultKeyType.cs21
-rw-r--r--src/Middleware/RateLimiting/src/DefaultKeyTypeEqualityComparer.cs30
-rw-r--r--src/Middleware/RateLimiting/src/DefaultRateLimiterPolicy.cs26
-rw-r--r--src/Middleware/RateLimiting/src/DisableRateLimitingAttribute.cs16
-rw-r--r--src/Middleware/RateLimiting/src/EnableRateLimitingAttribute.cs41
-rw-r--r--src/Middleware/RateLimiting/src/IRateLimiterPolicy.cs24
-rw-r--r--src/Middleware/RateLimiting/src/LeaseContext.cs18
-rw-r--r--src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj5
-rw-r--r--src/Middleware/RateLimiting/src/NoLimiter.cs36
-rw-r--r--src/Middleware/RateLimiting/src/OnRejectedContext.cs23
-rw-r--r--src/Middleware/RateLimiting/src/PolicyNameKey.cs23
-rw-r--r--src/Middleware/RateLimiting/src/PublicAPI.Unshipped.txt44
-rw-r--r--src/Middleware/RateLimiting/src/RateLimiterApplicationBuilderExtensions.cs (renamed from src/Middleware/RateLimiting/src/RateLimitingApplicationBuilderExtensions.cs)10
-rw-r--r--src/Middleware/RateLimiting/src/RateLimiterEndpointConventionBuilderExtensions.cs69
-rw-r--r--src/Middleware/RateLimiting/src/RateLimiterOptions.cs121
-rw-r--r--src/Middleware/RateLimiting/src/RateLimiterOptionsExtensions.cs102
-rw-r--r--src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs28
-rw-r--r--src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs194
-rw-r--r--src/Middleware/RateLimiting/test/RateLimiterEndpointConventionBuilderExtensionsTests.cs94
-rw-r--r--src/Middleware/RateLimiting/test/RateLimitingApplicationBuilderExtensionsTests.cs10
-rw-r--r--src/Middleware/RateLimiting/test/RateLimitingMiddlewareTests.cs556
-rw-r--r--src/Middleware/RateLimiting/test/RateLimitingOptionsTests.cs33
-rw-r--r--src/Middleware/RateLimiting/test/TestPartitionedRateLimiter.cs10
-rw-r--r--src/Middleware/RateLimiting/test/TestRateLimiter.cs7
-rw-r--r--src/Middleware/RateLimiting/test/TestRateLimiterPolicy.cs35
-rw-r--r--src/Middleware/RequestDecompression/perf/Microbenchmarks/AssemblyInfo.cs (renamed from src/ProjectTemplates/test/AssemblyInfo.AssemblyFixtures.cs)5
-rw-r--r--src/Middleware/RequestDecompression/perf/Microbenchmarks/Microsoft.AspNetCore.RequestDecompression.Microbenchmarks.csproj15
-rw-r--r--src/Middleware/RequestDecompression/perf/Microbenchmarks/RequestDecompressionMiddlewareBenchmark.cs92
-rw-r--r--src/Middleware/RequestDecompression/sample/CustomDecompressionProvider.cs15
-rw-r--r--src/Middleware/RequestDecompression/sample/Properties/launchsettings.json27
-rw-r--r--src/Middleware/RequestDecompression/sample/RequestDecompressionSample.csproj13
-rw-r--r--src/Middleware/RequestDecompression/sample/Startup.cs48
-rw-r--r--src/Middleware/RequestDecompression/src/BrotliDecompressionProvider.cs18
-rw-r--r--src/Middleware/RequestDecompression/src/DefaultRequestDecompressionProvider.cs90
-rw-r--r--src/Middleware/RequestDecompression/src/DeflateDecompressionProvider.cs18
-rw-r--r--src/Middleware/RequestDecompression/src/GZipDecompressionProvider.cs18
-rw-r--r--src/Middleware/RequestDecompression/src/IDecompressionProvider.cs17
-rw-r--r--src/Middleware/RequestDecompression/src/IRequestDecompressionProvider.cs19
-rw-r--r--src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj25
-rw-r--r--src/Middleware/RequestDecompression/src/PublicAPI.Shipped.txt1
-rw-r--r--src/Middleware/RequestDecompression/src/PublicAPI.Unshipped.txt13
-rw-r--r--src/Middleware/RequestDecompression/src/RequestDecompressionBuilderExtensions.cs26
-rw-r--r--src/Middleware/RequestDecompression/src/RequestDecompressionMiddleware.cs141
-rw-r--r--src/Middleware/RequestDecompression/src/RequestDecompressionOptions.cs20
-rw-r--r--src/Middleware/RequestDecompression/src/RequestDecompressionServiceExtensions.cs52
-rw-r--r--src/Middleware/RequestDecompression/src/SizeLimitedStream.cs94
-rw-r--r--src/Middleware/RequestDecompression/test/DefaultRequestDecompressionProviderTests.cs176
-rw-r--r--src/Middleware/RequestDecompression/test/Microsoft.AspNetCore.RequestDecompression.Tests.csproj14
-rw-r--r--src/Middleware/RequestDecompression/test/RequestDecompressionBuilderExtensionsTests.cs22
-rw-r--r--src/Middleware/RequestDecompression/test/RequestDecompressionMiddlewareTests.cs945
-rw-r--r--src/Middleware/RequestDecompression/test/RequestDecompressionOptionsTests.cs30
-rw-r--r--src/Middleware/RequestDecompression/test/RequestDecompressionServiceExtensionsTests.cs37
-rw-r--r--src/Middleware/RequestDecompression/test/SizeLimitedStreamTests.cs107
-rw-r--r--src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj2
-rw-r--r--src/Middleware/ResponseCaching.Abstractions/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Middleware/ResponseCaching/src/CacheEntry/CachedResponse.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/CacheEntry/CachedResponseBody.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/CacheEntry/CachedVaryByRules.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/FastGuid.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/MemoryCachedResponse.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/MemoryResponseCache.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj2
-rw-r--r--src/Middleware/ResponseCaching/src/PublicAPI.Shipped.txt5
-rw-r--r--src/Middleware/ResponseCaching/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Middleware/ResponseCaching/src/ResponseCachingContext.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs4
-rw-r--r--src/Middleware/ResponseCaching/src/ResponseCachingPolicyProvider.cs12
-rw-r--r--src/Middleware/ResponseCaching/src/Streams/ResponseCachingStream.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/Streams/SegmentWriteStream.cs2
-rw-r--r--src/Middleware/ResponseCaching/src/SystemClock.cs2
-rw-r--r--src/Middleware/ResponseCompression/src/CompressionProviderCollection.cs6
-rw-r--r--src/Middleware/ResponseCompression/src/CompressionProviderFactory.cs8
-rw-r--r--src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj2
-rw-r--r--src/Middleware/ResponseCompression/src/PublicAPI.Shipped.txt15
-rw-r--r--src/Middleware/ResponseCompression/src/PublicAPI.Unshipped.txt9
-rw-r--r--src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/ApacheModRewriteRule.cs4
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/Condition.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/ConditionPatternParser.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/CookieActionFactory.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/FileParser.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/FlagParser.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/Flags.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/ParsedModRewriteCondition.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/RuleBuilder.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/RuleRegexParser.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/TestStringParser.cs2
-rw-r--r--src/Middleware/Rewrite/src/ApacheModRewrite/Tokenizer.cs2
-rw-r--r--src/Middleware/Rewrite/src/BackReferenceCollection.cs2
-rw-r--r--src/Middleware/Rewrite/src/DelegateRule.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/ConditionCollection.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMap.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMapCollection.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/IISUrlRewriteRule.cs4
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/InputParser.cs11
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/InvalidUrlRewriteFormatException.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/UriMatchCondition.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteFileParser.cs2
-rw-r--r--src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteRuleBuilder.cs2
-rw-r--r--src/Middleware/Rewrite/src/MatchResults.cs2
-rw-r--r--src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj6
-rw-r--r--src/Middleware/Rewrite/src/ParserContext.cs2
-rw-r--r--src/Middleware/Rewrite/src/Pattern.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/ConditionMatchSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/DateTimeSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/HeaderSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/IISServerVariableSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/IsHttpsModSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/IsHttpsUrlSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/IsIPV6Segment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/LiteralSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/LocalAddressSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/LocalPortSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/QueryStringSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/RemoteAddressSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/RemotePortSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/RequestFilenameSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/RequestMethodSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/RewriteMapSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/RuleMatchSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/SchemeSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/ServerProtocolSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/ToLowerSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/UrlDecodeSegment.cs29
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/UrlEncodeSegment.cs5
-rw-r--r--src/Middleware/Rewrite/src/PatternSegments/UrlSegment.cs2
-rw-r--r--src/Middleware/Rewrite/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Middleware/Rewrite/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Middleware/Rewrite/src/RedirectRule.cs8
-rw-r--r--src/Middleware/Rewrite/src/RedirectToHttpsRule.cs4
-rw-r--r--src/Middleware/Rewrite/src/RedirectToNonWwwRule.cs2
-rw-r--r--src/Middleware/Rewrite/src/RedirectToWwwRule.cs2
-rw-r--r--src/Middleware/Rewrite/src/RewriteBuilderExtensions.cs15
-rw-r--r--src/Middleware/Rewrite/src/RewriteRule.cs4
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/AbortAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/ChangeCookieAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/CustomResponseAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/ForbiddenAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/GoneAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/NoneAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/RedirectAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlActions/RewriteAction.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/ExactMatch.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/FileSizeMatch.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/IntegerMatch.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/IsDirectoryMatch.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/IsFileMatch.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/RegexMatch.cs2
-rw-r--r--src/Middleware/Rewrite/src/UrlMatches/StringMatch.cs2
-rw-r--r--src/Middleware/Rewrite/test/IISUrlRewrite/InputParserTests.cs31
-rw-r--r--src/Middleware/Rewrite/test/MiddlewareTests.cs32
-rw-r--r--src/Middleware/Rewrite/test/PatternSegments/UrlDecodeSegmentTests.cs28
-rw-r--r--src/Middleware/Session/src/DistributedSession.cs6
-rw-r--r--src/Middleware/Session/src/EncodedKey.cs2
-rw-r--r--src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj2
-rw-r--r--src/Middleware/Session/src/NoOpSessionStore.cs2
-rw-r--r--src/Middleware/Session/src/PublicAPI.Shipped.txt7
-rw-r--r--src/Middleware/Session/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Middleware/Session/src/SessionMiddleware.cs14
-rw-r--r--src/Middleware/Session/src/SessionOptions.cs2
-rw-r--r--src/Middleware/Spa/SpaProxy/src/Microsoft.AspNetCore.SpaProxy.csproj2
-rw-r--r--src/Middleware/Spa/SpaProxy/src/SpaDevelopmentServerOptions.cs2
-rw-r--r--src/Middleware/Spa/SpaProxy/src/SpaHostingStartup.cs12
-rw-r--r--src/Middleware/Spa/SpaProxy/src/SpaProxyLaunchManager.cs8
-rw-r--r--src/Middleware/Spa/SpaProxy/src/SpaProxyMiddleware.cs2
-rw-r--r--src/Middleware/Spa/SpaProxy/src/SpaProxyStartupFilter.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/DefaultSpaBuilder.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/Npm/NodeScriptRunner.cs11
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/Proxying/ConditionalProxyMiddleware.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/SpaDefaultPageMiddleware.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/StaticFiles/DefaultSpaStaticFileProvider.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamReader.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamStringReader.cs2
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/test/.npmrc1
-rw-r--r--src/Middleware/Spa/SpaServices.Extensions/test/ListLoggerFactory.cs5
-rw-r--r--src/Middleware/StaticFiles/src/DefaultFilesMiddleware.cs2
-rw-r--r--src/Middleware/StaticFiles/src/DirectoryBrowserMiddleware.cs4
-rw-r--r--src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj2
-rw-r--r--src/Middleware/StaticFiles/src/PublicAPI.Shipped.txt8
-rw-r--r--src/Middleware/StaticFiles/src/PublicAPI.Unshipped.txt8
-rw-r--r--src/Middleware/StaticFiles/src/StaticFileMiddleware.cs6
-rw-r--r--src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs13
-rw-r--r--src/Middleware/StaticFiles/test/UnitTests/DefaultFilesMiddlewareTests.cs47
-rw-r--r--src/Middleware/StaticFiles/test/UnitTests/DirectoryBrowserMiddlewareTests.cs41
-rw-r--r--src/Middleware/StaticFiles/test/UnitTests/StaticFileMiddlewareTests.cs82
-rw-r--r--src/Middleware/WebSockets/samples/EchoApp/EchoApp.csproj7
-rw-r--r--src/Middleware/WebSockets/samples/EchoApp/Program.cs88
-rw-r--r--src/Middleware/WebSockets/samples/EchoApp/Properties/launchSettings.json2
-rw-r--r--src/Middleware/WebSockets/samples/EchoApp/Startup.cs96
-rw-r--r--src/Middleware/WebSockets/samples/EchoApp/appsettings.json8
-rw-r--r--src/Middleware/WebSockets/src/HandshakeHelpers.cs29
-rw-r--r--src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj2
-rw-r--r--src/Middleware/WebSockets/src/PublicAPI.Shipped.txt5
-rw-r--r--src/Middleware/WebSockets/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Middleware/WebSockets/src/WebSocketMiddleware.cs94
-rw-r--r--src/Middleware/WebSockets/test/UnitTests/BufferStream.cs5
-rw-r--r--src/Middleware/WebSockets/test/UnitTests/Http2WebSocketTests.cs74
-rw-r--r--src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj1
-rw-r--r--src/Middleware/perf/ResponseCaching.Microbenchmarks/ResponseCachingBenchmark.cs2
-rw-r--r--src/Middleware/tools/RazorPageGenerator/Program.cs6
-rw-r--r--src/Mvc/Mvc.Abstractions/src/ModelBinding/BindingInfo.cs2
-rw-r--r--src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelStateDictionary.cs2
-rw-r--r--src/Mvc/Mvc.Abstractions/src/PublicAPI.Shipped.txt13
-rw-r--r--src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs4
-rw-r--r--src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCodeFixProvider.cs2
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/ApiParameterContext.cs4
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/ApiResponseTypeProvider.cs79
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/DefaultApiDescriptionProvider.cs30
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs87
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/EndpointModelMetadata.cs2
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj1
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Mvc/Mvc.ApiExplorer/test/DefaultApiDescriptionProviderTest.cs80
-rw-r--r--src/Mvc/Mvc.ApiExplorer/test/EndpointMetadataApiDescriptionProviderTest.cs206
-rw-r--r--src/Mvc/Mvc.Core/src/AcceptVerbsAttribute.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ActionConstraints/ActionConstraintCache.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ActionConstraints/DefaultActionConstraintProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/ApiBehaviorApplicationModelProvider.cs1
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/ApiConventionApplicationModelConvention.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/ApplicationModelFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/AttributeRouteModel.cs8
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/AuthorizationApplicationModelProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/ControllerActionDescriptorProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationModels/EndpointMetadataConvention.cs97
-rw-r--r--src/Mvc/Mvc.Core/src/ApplicationParts/RelatedAssemblyAttribute.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs15
-rw-r--r--src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs15
-rw-r--r--src/Mvc/Mvc.Core/src/Builder/MvcApplicationBuilderExtensions.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Builder/MvcAreaRouteBuilderExtensions.cs9
-rw-r--r--src/Mvc/Mvc.Core/src/ControllerBase.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/Controllers/ControllerActionDescriptor.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/Controllers/ControllerFactoryProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Controllers/DefaultControllerActivator.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Controllers/DefaultControllerFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/ApiBehaviorOptionsSetup.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/ApplicationModelConventionExtensions.cs8
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/MvcBuilder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreBuilder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreRouteOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreServiceCollectionExtensions.cs6
-rw-r--r--src/Mvc/Mvc.Core/src/DependencyInjection/MvcMarkerService.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/DisableRequestSizeLimitAttribute.cs12
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/ControllerActionFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/ControllerResultFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/DefaultFilterProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/DisableRequestSizeLimitFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/FilterDescriptorOrderComparer.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/IOutputCacheFilter.cs11
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/MiddlewareFilter.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilderStartupFilter.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterConfigurationProvider.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterFeature.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/OutputCacheFilter.cs56
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/RequestFormLimitsFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/RequestSizeLimitFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilterExecutor.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ForbidResult.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Formatters/HttpNoContentOutputFormatter.cs1
-rw-r--r--src/Mvc/Mvc.Core/src/Formatters/TextOutputFormatter.cs15
-rw-r--r--src/Mvc/Mvc.Core/src/FromServicesAttribute.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/HttpDeleteAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/HttpGetAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/HttpHeadAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/HttpOptionsAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/HttpPatchAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/HttpPostAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/HttpPutAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ActionContextAccessor.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ActionInvokerFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ActionMethodExecutor.cs176
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ActionResultTypeMapper.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ActionSelectionTable.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ActionSelector.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ClientErrorResultFilter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvoker.cs6
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCache.cs6
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCacheEntry.cs10
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ControllerEndpointFilterInvocationContext.cs48
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/CopyOnWriteList.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/DefaultActionDescriptorCollectionProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/DefaultApiProblemDetailsWriter.cs90
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/DefaultProblemDetailsFactory.cs8
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpRequestStreamReaderFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpResponseStreamWriterFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ModelStateInvalidFilterFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/MvcCoreMvcOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/NonDisposableStream.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ObjectResultExecutor.cs15
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProviderCache.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ProblemDetailsClientErrorFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/StringArrayComparer.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/TypeActivatorCache.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Infrastructure/ValidationProblemDetailsJsonConverter.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj5
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Binders/BodyModelBinder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Binders/CollectionModelBinder.cs23
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormCollectionModelBinder.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormFileModelBinder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Binders/HeaderModelBinder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Binders/TryParseModelBinder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/DefaultPropertyFilterProvider.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/ElementalValueProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/EmptyModelMetadataProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/FormValueHelper.cs9
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/FormValueProvider.cs10
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/JQueryFormValueProvider.cs19
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultCompositeMetadataDetailsProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultValidationMetadataProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/ModelBinderFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs6
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/NoOpBinder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/PlaceholderBinder.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultCollectionValidationStrategy.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultModelValidatorProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultObjectValidator.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/ExplicitIndexCollectionValidationStrategy.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/ShortFormDictionaryValidationStrategy.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationStack.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Properties/AssemblyInfo.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt22
-rw-r--r--src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt35
-rw-r--r--src/Mvc/Mvc.Core/src/RequestSizeLimitAttribute.cs8
-rw-r--r--src/Mvc/Mvc.Core/src/Resources.resx5
-rw-r--r--src/Mvc/Mvc.Core/src/RouteAttribute.cs4
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ActionConstraintMatcherPolicy.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ActionEndpointDataSourceBase.cs34
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ActionEndpointFactory.cs167
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/AttributeRoute.cs8
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSource.cs40
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceIdProvider.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ControllerEndpointDataSourceIdMetadata.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ControllerRequestDelegateFactory.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/ConventionalRouteEntry.cs5
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointMatcherPolicy.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelector.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelectorCache.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/DynamicControllerMetadata.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/DynamicControllerRouteValueTransformerMetadata.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/EndpointRoutingUrlHelper.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/HttpMethodAttribute.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs3
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/KnownRouteValueConstraint.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/MvcAttributeRouteHandler.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/MvcRouteHandler.cs2
-rw-r--r--src/Mvc/Mvc.Core/src/Routing/NullRouter.cs2
-rw-r--r--src/Mvc/Mvc.Core/test/ApplicationModels/ApiBehaviorApplicationModelProviderTest.cs9
-rw-r--r--src/Mvc/Mvc.Core/test/ApplicationModels/ControllerActionDescriptorProviderTests.cs45
-rw-r--r--src/Mvc/Mvc.Core/test/ApplicationModels/DefaultApplicationModelProviderTest.cs28
-rw-r--r--src/Mvc/Mvc.Core/test/ApplicationModels/EndpointMetadataConventionTest.cs386
-rw-r--r--src/Mvc/Mvc.Core/test/ControllerBaseTest.cs63
-rw-r--r--src/Mvc/Mvc.Core/test/DependencyInjection/ApiBehaviorOptionsSetupTest.cs4
-rw-r--r--src/Mvc/Mvc.Core/test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs8
-rw-r--r--src/Mvc/Mvc.Core/test/Filters/MiddlewareFilterTest.cs4
-rw-r--r--src/Mvc/Mvc.Core/test/Formatters/NoContentFormatterTests.cs20
-rw-r--r--src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs1
-rw-r--r--src/Mvc/Mvc.Core/test/Formatters/TextOutputFormatterTests.cs3
-rw-r--r--src/Mvc/Mvc.Core/test/Infrastructure/ActionMethodExecutorTest.cs283
-rw-r--r--src/Mvc/Mvc.Core/test/Infrastructure/ControllerActionInvokerTest.cs2
-rw-r--r--src/Mvc/Mvc.Core/test/Infrastructure/DefaultApiProblemDetailsWriterTest.cs210
-rw-r--r--src/Mvc/Mvc.Core/test/Infrastructure/ObjectResultExecutorTest.cs4
-rw-r--r--src/Mvc/Mvc.Core/test/Infrastructure/ProblemDetalsClientErrorFactoryTest.cs2
-rw-r--r--src/Mvc/Mvc.Core/test/ModelBinding/Binders/CollectionModelBinderTest.cs59
-rw-r--r--src/Mvc/Mvc.Core/test/ModelBinding/FormValueProviderTest.cs25
-rw-r--r--src/Mvc/Mvc.Core/test/ModelBinding/JQueryFormValueProviderTest.cs25
-rw-r--r--src/Mvc/Mvc.Core/test/Routing/ActionEndpointDataSourceBaseTest.cs2
-rw-r--r--src/Mvc/Mvc.Core/test/Routing/ActionEndpointFactoryTest.cs57
-rw-r--r--src/Mvc/Mvc.Core/test/Routing/ControllerActionEndpointDataSourceTest.cs170
-rw-r--r--src/Mvc/Mvc.Cors/src/CorsApplicationModelProvider.cs44
-rw-r--r--src/Mvc/Mvc.Cors/src/CorsAuthorizationFilterFactory.cs2
-rw-r--r--src/Mvc/Mvc.Cors/src/CorsHttpMethodActionConstraint.cs2
-rw-r--r--src/Mvc/Mvc.Cors/src/DisableCorsAuthorizationFilter.cs2
-rw-r--r--src/Mvc/Mvc.Cors/test/CorsApplicationModelProviderTest.cs46
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/CompareAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsClientModelValidatorProvider.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsMetadataProvider.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsModelValidator.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DataTypeAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DefaultClientModelValidatorProvider.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsLocalizationOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsMvcOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/FileExtensionsAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/MaxLengthAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/MinLengthAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidator.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidatorProvider.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/RangeAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/RegularExpressionAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/StringLengthAttributeAdapter.cs2
-rw-r--r--src/Mvc/Mvc.DataAnnotations/src/ValidatableObjectAdapter.cs2
-rw-r--r--src/Mvc/Mvc.Formatters.Xml/src/ProblemDetailsWrapperProviderFactory.cs4
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/BsonTempDataSerializer.cs2
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/DependencyInjection/NewtonsoftJsonMvcOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/JsonArrayPool.cs2
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/JsonSerializerObjectPolicy.cs2
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonHelper.cs2
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonResultExecutor.cs2
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Mvc/Mvc.NewtonsoftJson/src/ValidationProblemDetailsConverter.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedException.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedExceptionFactory.cs4
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/PageActionDescriptorChangeProvider.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorProjectPageRouteModelProvider.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorReferenceManager.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeCompilationFileProvider.cs2
-rw-r--r--src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeViewCompiler.cs4
-rw-r--r--src/Mvc/Mvc.Razor/src/Compilation/DefaultRazorPageFactoryProvider.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/Compilation/DefaultViewCompiler.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/DependencyInjection/MvcRazorMvcViewOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/Infrastructure/DefaultFileVersionProvider.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/Infrastructure/DefaultTagHelperActivator.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Mvc/Mvc.Razor/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Mvc/Mvc.Razor/src/RazorPagePropertyActivator.cs4
-rw-r--r--src/Mvc/Mvc.Razor/src/RazorViewEngineOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/ServiceBasedTagHelperActivator.cs2
-rw-r--r--src/Mvc/Mvc.Razor/src/TagHelperComponentManager.cs4
-rw-r--r--src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentPropertyActivator.cs14
-rw-r--r--src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentTagHelper.cs23
-rw-r--r--src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs78
-rw-r--r--src/Mvc/Mvc.Razor/src/ViewLocationCacheResult.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/AuthorizationPageApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/AutoValidateAntiforgeryPageApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/CompiledPageRouteModelProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelProvider.cs6
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/PageConventionCollection.cs8
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/ResponseCacheFilterApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/TempDataFilterPageApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/ApplicationModels/ViewDataAttributePageApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Builder/PageActionEndpointConventionBuilder.cs17
-rw-r--r--src/Mvc/Mvc.RazorPages/src/DependencyInjection/PageConventionCollectionExtensions.cs7
-rw-r--r--src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesRazorViewEngineOptionsSetup.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerPageFilter.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerResultFIlter.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Filters/PageResponseCacheFilter.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilter.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilterFactory.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Filters/PageViewDataAttributeFilterFactory.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageActivatorProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageFactoryProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageHandlerMethodSelector.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageLoader.cs5
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelActivatorProvider.cs8
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelFactoryProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointMatcherPolicy.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelector.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelectorCache.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageMetadata.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageRouteValueTransformerMetadata.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/ExecutorFactory.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSource.cs24
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceIdProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvoker.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvokerProvider.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/Infrastructure/PageEndpointDataSourceIdMetadata.cs2
-rw-r--r--src/Mvc/Mvc.RazorPages/src/PageBase.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/PageModel.cs4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt13
-rw-r--r--src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs16
-rw-r--r--src/Mvc/Mvc.RazorPages/test/Infrastructure/DefaultPageLoaderTest.cs12
-rw-r--r--src/Mvc/Mvc.RazorPages/test/Infrastructure/PageActionEndpointDataSourceTest.cs174
-rw-r--r--src/Mvc/Mvc.RazorPages/test/Infrastructure/PageBinderFactoryTest.cs18
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/CacheTagHelper.cs15
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/CurrentValues.cs2
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingDirectory.cs7
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingFile.cs13
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/GlobbingUrlBuilder.cs24
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs90
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/ModeAttributesOfT.cs2
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/PersistComponentStateTagHelper.cs2
-rw-r--r--src/Mvc/Mvc.TagHelpers/src/TagHelperOutputExtensions.cs68
-rw-r--r--src/Mvc/Mvc.TagHelpers/test/InputTagHelperTest.cs69
-rw-r--r--src/Mvc/Mvc.Testing/src/DeferredHostBuilder.cs4
-rw-r--r--src/Mvc/Mvc.Testing/src/Handlers/RedirectHandler.cs4
-rw-r--r--src/Mvc/Mvc.Testing/src/Microsoft.AspNetCore.Mvc.Testing.targets4
-rw-r--r--src/Mvc/Mvc.Testing/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/AntiforgeryExtensions.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/AttributeDictionary.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/ArrayPoolBufferSource.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/CharArrayBufferSource.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/MemoryPoolViewBufferScope.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedCharBuffer.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBuffer.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferPage.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferTextWriter.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/DefaultEditorTemplates.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/DefaultHtmlGenerator.cs81
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/MvcViewOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/TempDataMvcOptionsSetup.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/DynamicViewData.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/AutoValidateAntiforgeryTokenAuthorizationFilter.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilter.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilterFactory.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilter.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilterFactory.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/SaveTempDataFilter.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/TempDataApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Filters/ViewDataAttributeApplicationModelProvider.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/FormContext.cs31
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/HtmlHelperOptions.cs10
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Infrastructure/DefaultTempDataSerializer.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Infrastructure/HttpNavigationManager.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/LambdaExpressionComparer.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/MemberExpressionCacheKeyComparer.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/NameAndIdProvider.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/NullView.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Shipped.txt12
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt15
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/RazorComponents/PrerenderingErrorBoundaryLogger.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/RazorComponents/StaticComponentRenderer.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/RazorComponents/UnsupportedJavaScriptRuntime.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Rendering/FormInputRenderMode.cs25
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Rendering/SystemTextJsonHelper.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/Rendering/TagBuilder.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ServerComponentInvocationSequence.cs4
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ServerComponentSerializer.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/TemplateBuilder.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/TemplateRenderer.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentActivator.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvoker.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvokerFactory.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentSelector.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ViewComponents/ViewComponentInvokerCache.cs6
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/ViewDataDictionary.cs11
-rw-r--r--src/Mvc/Mvc.ViewFeatures/src/WebAssemblyComponentSerializer.cs2
-rw-r--r--src/Mvc/Mvc.ViewFeatures/test/DefaultHtmlGeneratorTest.cs91
-rw-r--r--src/Mvc/Mvc.slnf3
-rw-r--r--src/Mvc/Mvc/src/MvcServiceCollectionExtensions.cs2
-rw-r--r--src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ActionSelectorBenchmark.cs4
-rw-r--r--src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ControllerActionEndpointDatasourceBenchmark.cs16
-rw-r--r--src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/RuntimePerformanceBenchmarkBase.cs6
-rw-r--r--src/Mvc/perf/benchmarkapps/NuGet.config2
-rw-r--r--src/Mvc/samples/MvcSandbox/MvcSandbox.csproj2
-rw-r--r--src/Mvc/samples/MvcSandbox/Startup.cs19
-rw-r--r--src/Mvc/shared/Mvc.Core.TestCommon/CommonFilterTest.cs2
-rw-r--r--src/Mvc/shared/Mvc.Core.TestCommon/TestModelMetadataProvider.cs4
-rw-r--r--src/Mvc/shared/Mvc.Views.TestCommon/TestFileChangeToken.cs2
-rw-r--r--src/Mvc/shared/Mvc.Views.TestCommon/TestFileProvider.cs2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/ControllerEndpointFiltersTest.cs76
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/CustomValueProviderTest.cs93
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationTest.cs2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/RequestServicesTestBase.cs1
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsTest.cs54
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsWithMetadataTest.cs37
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureTests.cs13
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Customer.Index.html2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Customer.html2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.EmployeeList.html6
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.Encoded.html10
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.html8
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Product.Encoded.html2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductList.html6
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpers.html6
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpersWithNullModel.html2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Warehouse.html2
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.Invalid.html6
-rw-r--r--src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.html6
-rw-r--r--src/Mvc/test/Mvc.IntegrationTests/ServicesModelBinderIntegrationTest.cs4
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/Controllers/CustomValueProviderController.cs26
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/Controllers/RequestScopedServiceController.cs9
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/Controllers/TestingController.cs11
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/StartupWithCustomValueProvider.cs27
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/ValueProviders/CustomValueProviderFactory.cs45
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/_bower.json2
-rw-r--r--src/Mvc/test/WebSites/BasicWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Mvc/test/WebSites/GenericHostWebSite/Controllers/TestingController.cs11
-rw-r--r--src/Mvc/test/WebSites/GenericHostWebSite/_bower.json2
-rw-r--r--src/Mvc/test/WebSites/GenericHostWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/Controllers/ConventionalControllerWithMetadata.cs16
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/Controllers/ItemsController.cs26
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/ManualControllerFeatureProvider.cs23
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/MetadataAttribute.cs15
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/StartupForEndpointFilters.cs57
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/StartupForGroups.cs35
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/StartupForRouteGroupsWithMetadata.cs51
-rw-r--r--src/Mvc/test/WebSites/RoutingWebSite/TestParameterTransformer.cs2
-rw-r--r--src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/Program.cs3
-rw-r--r--src/ObjectPool/src/DisposableObjectPool.cs8
-rw-r--r--src/ObjectPool/src/LeakTrackingObjectPool.cs4
-rw-r--r--src/ObjectPool/src/LeakTrackingObjectPoolProvider.cs2
-rw-r--r--src/ObjectPool/src/PublicAPI.Shipped.txt8
-rwxr-xr-x[-rw-r--r--]src/OpenApi/build.sh0
-rw-r--r--src/OpenApi/src/Microsoft.AspNetCore.OpenApi.csproj1
-rw-r--r--src/OpenApi/src/OpenApiEndpointConventionBuilderExtensions.cs107
-rw-r--r--src/OpenApi/src/OpenApiGenerator.cs124
-rw-r--r--src/OpenApi/src/OpenApiRouteHandlerBuilderExtensions.cs82
-rw-r--r--src/OpenApi/src/PublicAPI.Unshipped.txt6
-rw-r--r--src/OpenApi/src/SchemaGenerator.cs44
-rw-r--r--src/OpenApi/test/OpenApiGeneratorTests.cs380
-rw-r--r--src/OpenApi/test/OpenApiRouteHandlerBuilderExtensionTests.cs187
-rw-r--r--src/ProjectTemplates/ProjectTemplates.slnf11
-rw-r--r--src/ProjectTemplates/ProjectTemplatesNoDeps.slnf8
-rw-r--r--src/ProjectTemplates/README.md110
-rw-r--r--src/ProjectTemplates/Shared/ArgConstants.cs28
-rw-r--r--src/ProjectTemplates/Shared/AssemblyInfo.AssemblyFixtures.cs (renamed from src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs)5
-rw-r--r--src/ProjectTemplates/Shared/BlazorTemplateTest.cs (renamed from src/ProjectTemplates/test/BlazorTemplateTest.cs)30
-rw-r--r--src/ProjectTemplates/Shared/ProcessResult.cs2
-rw-r--r--src/ProjectTemplates/Shared/Project.cs224
-rw-r--r--src/ProjectTemplates/Shared/ProjectFactoryFixture.cs54
-rw-r--r--src/ProjectTemplates/Shared/TemplatePackageInstaller.cs24
-rw-r--r--src/ProjectTemplates/Shared/TestOutputLogger.cs2
-rw-r--r--src/ProjectTemplates/THIRD-PARTY-NOTICES20
-rw-r--r--src/ProjectTemplates/TestInfrastructure/PrepareForTest.targets21
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.cs.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.de.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.es.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.fr.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.it.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ja.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ko.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pl.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pt-BR.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ru.json10
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.tr.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hans.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hant.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.cs.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.de.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.es.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.fr.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.it.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ja.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ko.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pl.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pt-BR.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ru.json10
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.tr.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hans.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hant.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.cs.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.de.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.es.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.fr.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.it.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ja.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ko.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pl.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pt-BR.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ru.json10
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.tr.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hans.json8
-rw-r--r--src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hant.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.cs.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.de.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.es.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.fr.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.it.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ja.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ko.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pl.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pt-BR.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ru.json12
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.tr.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hant.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.cs.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.de.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.es.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.fr.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.it.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ja.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ko.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pl.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pt-BR.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ru.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.tr.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hant.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.cs.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.de.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.es.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.fr.json12
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.it.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ja.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ko.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pl.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pt-BR.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ru.json16
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.tr.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hant.json14
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.cs.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.de.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.es.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.fr.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.it.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ja.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ko.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pl.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pt-BR.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ru.json10
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.tr.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hant.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.cs.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.de.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.es.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.fr.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.it.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ja.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ko.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pl.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pt-BR.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ru.json8
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.tr.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json6
-rw-r--r--src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hant.json6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/EmptyBlazorServerWeb-CSharp.csproj.in11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Client.csproj.in33
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Server.csproj.in21
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Shared.csproj.in12
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/ide.host.json47
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json74
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json80
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/template.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecast.cs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecastService.cs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/FetchData.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/_Host.cshtml1
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.Main.cs9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.cs5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Properties/launchSettings.json21
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsMicrosoftGraph.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsWebApi.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.NoGraphOrApi.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.razor.css6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.icobin5430 -> 0 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.pngbin0 -> 1148 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json42
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json86
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json90
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json88
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/template.json19
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Pages/FetchData.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.Main.cs6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualLocalAuth.razor11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualMsalAuth.razor9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsMicrosoftGraph.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsWebApi.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.NoGraphOrApi.razor2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.razor.css6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css39
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.icobin5430 -> 0 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.pngbin0 -> 1148 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/index.html9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Controllers/WeatherForecastController.cs6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.Main.cs9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.cs7
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Shared/WeatherForecast.cs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/dotnetcli.host.json35
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide.host.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide/icon.pngbin0 -> 1148 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json17
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/template.json198
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/App.razor12
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/MainLayout.razor3
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/Index.razor3
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/_Host.cshtml30
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Program.cs27
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Properties/launchSettings.json43
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/_Imports.razor4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.Development.json9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.json9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/wwwroot/css/site.css28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/dotnetcli.host.json42
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide.host.json29
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide/icon.pngbin0 -> 1148 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/template.json276
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/App.razor12
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/MainLayout.razor3
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Pages/Index.razor3
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Program.cs22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json46
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/_Imports.razor11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/icon-512.pngbin0 -> 6311 bytes
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/index.html27
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/manifest.json16
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.js4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.published.js47
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/EmptyComponentsWebAssembly-CSharp.sln64
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Program.cs33
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json44
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.Development.json8
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.json9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Shared/SharedClass.cs1
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/ide.host.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.cs.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.de.json30
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.en.json5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.es.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.fr.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.it.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ja.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ko.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pl.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ru.json34
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.tr.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json32
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json21
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/ide.host.json19
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.cs.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.de.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.es.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.fr.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.it.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ja.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ko.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pl.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ru.json30
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.tr.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json21
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/ide.host.json6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.cs.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.de.json24
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.en.json5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.es.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.fr.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.it.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ja.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ko.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pl.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pt-BR.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ru.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.tr.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hant.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/template.json2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Program.Main.cs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Properties/launchSettings.json13
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/ide.host.json5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.cs.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.de.json20
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.es.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.fr.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.it.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ja.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ko.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pl.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pt-BR.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ru.json24
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.tr.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hant.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/ide.host.json47
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.cs.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.de.json74
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.en.json11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.es.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.fr.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.it.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ja.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ko.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pl.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ru.json80
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.tr.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.Main.cs7
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.cs5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Properties/launchSettings.json23
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/css/site.css4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt29
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/ide.host.json47
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.cs.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.de.json76
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.en.json11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.es.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.fr.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.it.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ja.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ko.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pl.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ru.json80
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.tr.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json78
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/template.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.Main.cs7
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.cs5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Properties/launchSettings.json21
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/css/site.css4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt29
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.cs.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.de.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.es.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.fr.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.it.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ja.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ko.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pl.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ru.json30
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.tr.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/template.json4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Properties/launchSettings.json21
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt29
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/cs/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/cs-CZ/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/de/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/de-DE/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/en/strings.json9
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/es/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/es-ES/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/fr/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/fr-FR/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ide.host.json43
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/it/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/it-IT/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ja/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ja-JP/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ko/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ko-KR/strings.json)6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.cs.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.de.json70
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.en.json11
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.es.json70
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.fr.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.it.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ja.json70
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ko.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pl.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pt-BR.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ru.json74
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.tr.json72
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json70
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hant.json70
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pl/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pl-PL/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pt-BR/strings.json4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ru/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ru-RU/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/template.json36
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/tr/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/tr-TR/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-Hans/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-CN/strings.json)8
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-Hant/strings.json (renamed from src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-TW/strings.json)4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Controllers/WeatherForecastController.cs6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.Main.cs224
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs30
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.WindowsOrNoAuth.cs15
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.cs5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Properties/launchSettings.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/WeatherForecast.cs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/ide.host.json19
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.cs.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.de.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.en.json6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.es.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.fr.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.it.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ja.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ko.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pl.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pt-BR.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ru.json30
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.tr.json28
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hant.json26
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/template.json10
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Properties/launchSettings.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/ide.host.json6
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.cs.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.de.json20
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.en.json5
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.es.json20
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.fr.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.it.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ja.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ko.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pl.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pt-BR.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ru.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.tr.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hant.json22
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/template.json2
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/Program.Main.cs4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/ide.host.json4
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.cs.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.de.json16
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.es.json16
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.fr.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.it.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ja.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ko.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pl.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pt-BR.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ru.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.tr.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json18
-rw-r--r--src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hant.json18
-rw-r--r--src/ProjectTemplates/scripts/.gitignore17
-rw-r--r--src/ProjectTemplates/scripts/Run-WebApiProgamMainMinimal-Locally.ps112
-rw-r--r--src/ProjectTemplates/scripts/Test-Template.ps18
-rw-r--r--src/ProjectTemplates/test/BlazorServerTemplateTest.cs52
-rw-r--r--src/ProjectTemplates/test/BlazorWasmTemplateTest.cs253
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Server.Tests/.gitattributes (renamed from src/ProjectTemplates/BlazorTemplates.Tests/.gitattributes)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Server.Tests/BlazorServerTemplateTest.cs93
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Server.Tests/EmptyBlazorServerTemplateTest.cs31
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Server.Tests/Templates.Blazor.Server.Tests.csproj68
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/.gitattributes (renamed from src/ProjectTemplates/test/.gitattributes)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/.npmrc1
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorServerTemplateTest.cs (renamed from src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs)14
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs (renamed from src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs)4
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWasmTemplateTest.cs (renamed from src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs)17
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/PlaywrightFixture.cs (renamed from src/ProjectTemplates/BlazorTemplates.Tests/PlaywrightFixture.cs)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/Templates.Blazor.Tests.csproj (renamed from src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplates.Tests.csproj)16
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/package.json (renamed from src/ProjectTemplates/test/package.json)2
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.linux.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.linux.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.osx.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.osx.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.win.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.win.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.debug.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.debug.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.linux.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.linux.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.osx.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.osx.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.win.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.win.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/template-baselines.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/template-baselines.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.Tests/yarn.lock (renamed from src/ProjectTemplates/BlazorTemplates.Tests/yarn.lock)46
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/BlazorWasmTemplateAuthTest.cs316
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/Templates.Blazor.WebAssembly.Auth.Tests.csproj68
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/BlazorWasmTemplateTest.cs113
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/EmptyBlazorWasmTemplateTest.cs105
-rw-r--r--src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/Templates.Blazor.WebAssembly.Tests.csproj68
-rw-r--r--src/ProjectTemplates/test/Templates.Mvc.Tests/.gitattributes1
-rw-r--r--src/ProjectTemplates/test/Templates.Mvc.Tests/MvcTemplateTest.cs (renamed from src/ProjectTemplates/test/MvcTemplateTest.cs)110
-rw-r--r--src/ProjectTemplates/test/Templates.Mvc.Tests/RazorPagesTemplateTest.cs (renamed from src/ProjectTemplates/test/RazorPagesTemplateTest.cs)112
-rw-r--r--src/ProjectTemplates/test/Templates.Mvc.Tests/Templates.Mvc.Tests.csproj68
-rw-r--r--src/ProjectTemplates/test/Templates.Mvc.Tests/WebApiTemplateTest.cs289
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/.gitattributes1
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/.npmrc1
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/BaselineTest.cs (renamed from src/ProjectTemplates/test/BaselineTest.cs)70
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/ByteOrderMarkTest.cs (renamed from src/ProjectTemplates/test/ByteOrderMarkTest.cs)0
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/EmptyWebTemplateTest.cs (renamed from src/ProjectTemplates/test/EmptyWebTemplateTest.cs)30
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/GrpcTemplateTest.cs (renamed from src/ProjectTemplates/test/GrpcTemplateTest.cs)8
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/IdentityUIPackageTest.cs (renamed from src/ProjectTemplates/test/IdentityUIPackageTest.cs)4
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/ItemTemplateTests/BlazorServerTests.cs (renamed from src/ProjectTemplates/test/ItemTemplateTests/BlazorServerTests.cs)2
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/RazorClassLibraryTemplateTest.cs (renamed from src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs)4
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/SpaTemplatesTest.cs (renamed from src/ProjectTemplates/test/SpaTemplatesTest.cs)12
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/Templates.Tests.csproj (renamed from src/ProjectTemplates/test/ProjectTemplates.Tests.csproj)30
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/WorkerTemplateTest.cs (renamed from src/ProjectTemplates/test/WorkerTemplateTest.cs)8
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/e2eTestSettings.ci.json (renamed from src/ProjectTemplates/test/e2eTestSettings.ci.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/e2eTestSettings.json (renamed from src/ProjectTemplates/test/e2eTestSettings.json)0
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/package.json (renamed from src/ProjectTemplates/BlazorTemplates.Tests/package.json)2
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/template-baselines.json (renamed from src/ProjectTemplates/test/template-baselines.json)572
-rw-r--r--src/ProjectTemplates/test/Templates.Tests/yarn.lock (renamed from src/ProjectTemplates/test/yarn.lock)46
-rw-r--r--src/ProjectTemplates/test/WebApiTemplateTest.cs142
-rw-r--r--src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj22
-rw-r--r--src/Razor/Razor.Runtime/src/Hosting/DefaultRazorCompiledItem.cs4
-rw-r--r--src/Razor/Razor.Runtime/src/Runtime/TagHelpers/TagHelperScopeManager.cs2
-rw-r--r--src/Razor/Razor/src/TagHelpers/DefaultTagHelperContent.cs2
-rw-r--r--src/Security/Authentication/Certificate/src/AuthenticateResults.cs11
-rw-r--r--src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs10
-rw-r--r--src/Security/Authentication/Certificate/src/CertificateValidationCache.cs2
-rw-r--r--src/Security/Authentication/Certificate/src/Microsoft.AspNetCore.Authentication.Certificate.csproj2
-rw-r--r--src/Security/Authentication/Certificate/src/PublicAPI.Shipped.txt2
-rw-r--r--src/Security/Authentication/Certificate/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Security/Authentication/Cookies/src/AuthenticateResults.cs13
-rw-r--r--src/Security/Authentication/Cookies/src/CookieAuthenticationEvents.cs2
-rw-r--r--src/Security/Authentication/Cookies/src/CookieAuthenticationHandler.cs47
-rw-r--r--src/Security/Authentication/Cookies/src/ITicketStore.cs39
-rw-r--r--src/Security/Authentication/Cookies/src/Microsoft.AspNetCore.Authentication.Cookies.csproj2
-rw-r--r--src/Security/Authentication/Cookies/src/PublicAPI.Unshipped.txt4
-rw-r--r--src/Security/Authentication/Core/src/AuthAppBuilderExtensions.cs3
-rw-r--r--src/Security/Authentication/Core/src/AuthenticationBuilder.cs21
-rw-r--r--src/Security/Authentication/Core/src/AuthenticationConfigurationProviderExtensions.cs32
-rw-r--r--src/Security/Authentication/Core/src/AuthenticationServiceCollectionExtensions.cs2
-rw-r--r--src/Security/Authentication/Core/src/DefaultAuthenticationConfigurationProvider.cs19
-rw-r--r--src/Security/Authentication/Core/src/HandleRequestResult.cs19
-rw-r--r--src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj2
-rw-r--r--src/Security/Authentication/Core/src/PublicAPI.Shipped.txt22
-rw-r--r--src/Security/Authentication/Core/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs2
-rw-r--r--src/Security/Authentication/Core/src/RemoteAuthenticationOptions.cs2
-rw-r--r--src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj2
-rw-r--r--src/Security/Authentication/Facebook/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj2
-rw-r--r--src/Security/Authentication/Google/src/PublicAPI.Shipped.txt10
-rw-r--r--src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/MinimalJwtBearerSample.csproj17
-rw-r--r--src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Program.cs31
-rw-r--r--src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Properties/launchSettings.json31
-rw-r--r--src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.Development.json34
-rw-r--r--src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.json9
-rw-r--r--src/Security/Authentication/JwtBearer/src/AuthenticateResults.cs9
-rw-r--r--src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs102
-rw-r--r--src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs13
-rw-r--r--src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs46
-rw-r--r--src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj6
-rw-r--r--src/Security/Authentication/JwtBearer/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Security/Authentication/JwtBearer/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj2
-rw-r--r--src/Security/Authentication/Negotiate/src/Internal/NegotiateOptionsValidationStartupFilter.cs2
-rw-r--r--src/Security/Authentication/Negotiate/src/Internal/NegotiateState.cs88
-rw-r--r--src/Security/Authentication/Negotiate/src/Internal/NegotiateStateFactory.cs (renamed from src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateStateFactory.cs)4
-rw-r--r--src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateState.cs208
-rw-r--r--src/Security/Authentication/Negotiate/src/Internal/SecurityStatusPalErrorCode.cs53
-rw-r--r--src/Security/Authentication/Negotiate/src/Microsoft.AspNetCore.Authentication.Negotiate.csproj2
-rw-r--r--src/Security/Authentication/Negotiate/src/NegotiateHandler.cs2
-rw-r--r--src/Security/Authentication/Negotiate/src/NegotiateOptions.cs2
-rw-r--r--src/Security/Authentication/Negotiate/test/Negotiate.Test/EventTests.cs2
-rw-r--r--src/Security/Authentication/Negotiate/test/Negotiate.Test/NegotiateHandlerTests.cs4
-rw-r--r--src/Security/Authentication/Negotiate/test/Negotiate.Test/ServerDeferralTests.cs2
-rw-r--r--src/Security/Authentication/OAuth/src/HandleRequestResults.cs9
-rw-r--r--src/Security/Authentication/OAuth/src/Microsoft.AspNetCore.Authentication.OAuth.csproj2
-rw-r--r--src/Security/Authentication/OAuth/src/OAuthHandler.cs4
-rw-r--r--src/Security/Authentication/OAuth/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/MinimalOpenIdConnectSample.csproj15
-rw-r--r--src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Program.cs18
-rw-r--r--src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Properties/launchSettings.json37
-rw-r--r--src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.Development.json8
-rw-r--r--src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.json9
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/HandleRequestResults.cs10
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj6
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/OpenIdConnectConfigureOptions.cs128
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/OpenIdConnectExtensions.cs1
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/OpenIdConnectHandler.cs5
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs2
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/OpenIdConnectPostConfigureOptions.cs2
-rw-r--r--src/Security/Authentication/OpenIdConnect/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Security/Authentication/Twitter/src/HandleRequestResults.cs9
-rw-r--r--src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj2
-rw-r--r--src/Security/Authentication/Twitter/src/PublicAPI.Shipped.txt31
-rw-r--r--src/Security/Authentication/Twitter/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Security/Authentication/Twitter/src/TwitterError.cs2
-rw-r--r--src/Security/Authentication/Twitter/src/TwitterErrorResponse.cs2
-rw-r--r--src/Security/Authentication/Twitter/src/TwitterHandler.cs21
-rw-r--r--src/Security/Authentication/Twitter/src/TwitterOptions.cs2
-rw-r--r--src/Security/Authentication/WsFederation/src/HandleRequestResults.cs10
-rw-r--r--src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj2
-rw-r--r--src/Security/Authentication/WsFederation/src/PublicAPI.Shipped.txt56
-rw-r--r--src/Security/Authentication/WsFederation/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Security/Authentication/WsFederation/src/WsFederationHandler.cs4
-rw-r--r--src/Security/Authentication/test/AuthenticationMiddlewareTests.cs47
-rw-r--r--src/Security/Authentication/test/CertificateTests.cs8
-rw-r--r--src/Security/Authentication/test/CookieTests.cs159
-rw-r--r--src/Security/Authentication/test/FacebookTests.cs6
-rw-r--r--src/Security/Authentication/test/GoogleTests.cs4
-rwxr-xr-xsrc/Security/Authentication/test/JwtBearerTests.cs72
-rw-r--r--src/Security/Authentication/test/Microsoft.AspNetCore.Authentication.Test.csproj1
-rw-r--r--src/Security/Authentication/test/OAuthTests.cs10
-rw-r--r--src/Security/Authentication/test/OpenIdConnect/OpenIdConnectConfigurationTests.cs24
-rw-r--r--src/Security/Authentication/test/OpenIdConnect/OpenIdConnectTests.cs155
-rw-r--r--src/Security/Authentication/test/PolicyTests.cs11
-rw-r--r--src/Security/Authentication/test/RemoteAuthenticationTests.cs2
-rw-r--r--src/Security/Authentication/test/SharedAuthenticationTests.cs23
-rw-r--r--src/Security/Authentication/test/TestExtensions.cs10
-rw-r--r--src/Security/Authentication/test/WsFederation/WsFederationTest.cs2
-rw-r--r--src/Security/Authorization/Core/src/AuthorizationBuilder.cs149
-rw-r--r--src/Security/Authorization/Core/src/AuthorizationFailure.cs8
-rw-r--r--src/Security/Authorization/Core/src/AuthorizationOptions.cs28
-rw-r--r--src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs4
-rw-r--r--src/Security/Authorization/Core/src/AuthorizationResult.cs7
-rw-r--r--src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs29
-rw-r--r--src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs6
-rw-r--r--src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs9
-rw-r--r--src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs7
-rw-r--r--src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj5
-rw-r--r--src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs13
-rw-r--r--src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs20
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI.Unshipped.txt6
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Shipped.txt (renamed from src/Security/Authorization/Core/src/PublicAPI.Shipped.txt)4
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Unshipped.txt15
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Shipped.txt171
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt17
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt171
-rw-r--r--src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt15
-rw-r--r--src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs16
-rw-r--r--src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs3
-rw-r--r--src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs1
-rw-r--r--src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs47
-rw-r--r--src/Security/Authorization/Policy/src/AuthorizationMiddlewareResultHandler.cs54
-rw-r--r--src/Security/Authorization/Policy/src/AuthorizationPolicyCache.cs42
-rw-r--r--src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs2
-rw-r--r--src/Security/Authorization/Policy/src/Microsoft.AspNetCore.Authorization.Policy.csproj3
-rw-r--r--src/Security/Authorization/Policy/src/PolicyAuthorizationResult.cs17
-rw-r--r--src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs10
-rw-r--r--src/Security/Authorization/Policy/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/Security/Authorization/test/AssertionRequirementsTests.cs5
-rw-r--r--src/Security/Authorization/test/AuthorizationBuilderTests.cs116
-rw-r--r--src/Security/Authorization/test/AuthorizationMiddlewareTests.cs176
-rw-r--r--src/Security/Authorization/test/DefaultAuthorizationServiceTests.cs111
-rw-r--r--src/Security/Authorization/test/Microsoft.AspNetCore.Authorization.Test.csproj1
-rw-r--r--src/Security/Authorization/test/PassThroughAuthorizationHandlerTests.cs72
-rw-r--r--src/Security/CookiePolicy/src/CookiePolicyMiddleware.cs2
-rw-r--r--src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj2
-rw-r--r--src/Security/CookiePolicy/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Security/CookiePolicy/src/PublicAPI.Unshipped.txt4
-rw-r--r--src/Security/CookiePolicy/src/ResponseCookiesWrapper.cs17
-rw-r--r--src/Security/CookiePolicy/test/CookieChunkingTests.cs97
-rw-r--r--src/Security/CookiePolicy/test/CookieConsentTests.cs2
-rw-r--r--src/Security/CookiePolicy/test/CookiePolicyTests.cs6
-rw-r--r--src/Security/Security.slnf4
-rw-r--r--src/Security/perf/Microbenchmarks/AuthorizationMiddlewareBenchmark.cs2
-rw-r--r--src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml4
-rw-r--r--src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Security/samples/ClaimsTransformation/bower.json4
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json12
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js43
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json15
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Security/samples/Cookies/Views/Shared/_Layout.cshtml4
-rw-r--r--src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Security/samples/Cookies/bower.json4
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json12
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js43
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json15
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs10
-rw-r--r--src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml4
-rw-r--r--src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json12
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js43
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json15
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs4
-rw-r--r--src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml4
-rw-r--r--src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json12
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js43
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json15
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml4
-rw-r--r--src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Security/samples/PathSchemeSelection/bower.json4
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json12
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js43
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json15
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml4
-rw-r--r--src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml4
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json12
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js43
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js13
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json15
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt19
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js227
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js4
-rw-r--r--src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map2
-rw-r--r--src/Servers/Connections.Abstractions/src/Features/IStreamClosedFeature.cs21
-rw-r--r--src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj7
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Shipped.txt (renamed from src/Servers/Connections.Abstractions/src/PublicAPI.Shipped.txt)0
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt3
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Shipped.txt182
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt19
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt182
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt3
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt182
-rw-r--r--src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt3
-rw-r--r--src/Servers/Connections.Abstractions/src/TlsConnectionCallbackContext.cs32
-rw-r--r--src/Servers/Connections.Abstractions/src/TlsConnectionCallbackOptions.cs33
-rw-r--r--src/Servers/HttpSys/src/ApplicationRequestContextFactory.cs2
-rw-r--r--src/Servers/HttpSys/src/AsyncAcceptContext.cs4
-rw-r--r--src/Servers/HttpSys/src/AuthenticationHandler.cs2
-rw-r--r--src/Servers/HttpSys/src/HttpSysListener.cs37
-rw-r--r--src/Servers/HttpSys/src/HttpSysOptions.cs17
-rw-r--r--src/Servers/HttpSys/src/MessagePump.cs27
-rw-r--r--src/Servers/HttpSys/src/NativeInterop/DisconnectListener.cs4
-rw-r--r--src/Servers/HttpSys/src/NativeInterop/HttpApi.cs93
-rw-r--r--src/Servers/HttpSys/src/NativeInterop/RequestQueue.cs70
-rw-r--r--src/Servers/HttpSys/src/NativeInterop/SafeLibraryHandle.cs26
-rw-r--r--src/Servers/HttpSys/src/NativeInterop/ServerSession.cs2
-rw-r--r--src/Servers/HttpSys/src/NativeInterop/UrlGroup.cs74
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/OpaqueStream.cs2
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/Request.cs2
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/RequestContext.FeatureCollection.cs10
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/RequestContext.cs12
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/RequestContextOfT.cs17
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/RequestStream.cs25
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/RequestStreamAsyncResult.cs32
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs10
-rw-r--r--src/Servers/HttpSys/src/RequestProcessing/ResponseStreamAsyncResult.cs2
-rw-r--r--src/Servers/HttpSys/src/ResponseStream.cs2
-rw-r--r--src/Servers/HttpSys/src/ServerDelegationPropertyFeature.cs30
-rw-r--r--src/Servers/HttpSys/src/WebHostBuilderHttpSysExtensions.cs7
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/DelegateTests.cs39
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/Http2Tests.cs75
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/Http3Tests.cs20
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/Listener/AuthenticationOnExistingQueueTests.cs82
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/Listener/ServerOnExistingQueueTests.cs83
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/Listener/Utilities.cs29
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests.csproj8
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs64
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/RequestBodyTests.cs43
-rw-r--r--src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs32
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj5
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rcbin3324 -> 3074 bytes
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm80
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm79
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/ancm_error_page.htm (renamed from src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm)5
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp18
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/resource.h6
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/CommonLib/file_utility.h6
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/CommonLibTests/CommonLibTests.vcxproj43
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc8
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj2
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h40
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp5
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/resource.h4
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc2
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj2
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm81
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp2
-rw-r--r--src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h2
-rw-r--r--src/Servers/IIS/IIS/perf/Microbenchmarks/FirstRequestConfig.cs2
-rw-r--r--src/Servers/IIS/IIS/perf/Microbenchmarks/IIS.Microbenchmarks.csproj1
-rw-r--r--src/Servers/IIS/IIS/samples/NativeIISSample/NativeIISSample.csproj1
-rw-r--r--src/Servers/IIS/IIS/src/Core/DuplexStream.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/EmptyStream.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/HttpRequestStream.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/HttpResponseStream.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/HttpUpgradeStream.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISConfigurationData.cs66
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISHttpContext.FeatureCollection.cs13
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISHttpContext.IO.cs9
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISHttpContextOfT.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISHttpServer.cs4
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISNativeApplication.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISServerAuthenticationHandlerInternal.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IISServerSetupFilter.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Flush.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Read.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Write.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.cs74
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/NativeSafeHandle.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/OutputProducer.cs15
-rw-r--r--src/Servers/IIS/IIS/src/Core/ServerAddressesFeature.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/Streams.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/ThrowingWasUpgradedWriteOnlyStreamInternal.cs2
-rw-r--r--src/Servers/IIS/IIS/src/Core/WrappingStream.cs7
-rw-r--r--src/Servers/IIS/IIS/src/CoreStrings.resx61
-rw-r--r--src/Servers/IIS/IIS/src/NativeMethods.cs139
-rw-r--r--src/Servers/IIS/IIS/src/StartupHook.cs2
-rw-r--r--src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs5
-rw-r--r--src/Servers/IIS/IIS/test/Common.FunctionalTests/Http2Tests.cs52
-rw-r--r--src/Servers/IIS/IIS/test/Common.FunctionalTests/Infrastructure/FunctionalTestsBase.cs4
-rw-r--r--src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs5
-rw-r--r--src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs3
-rw-r--r--src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http2TrailersResetTests.cs27
-rw-r--r--src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http3Tests.cs20
-rw-r--r--src/Servers/IIS/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj10
-rw-r--r--src/Servers/IIS/IIS/test/IIS.LongTests/IIS.LongTests.csproj1
-rw-r--r--src/Servers/IIS/IIS/test/IIS.NewHandler.FunctionalTests/IIS.NewHandler.FunctionalTests.csproj1
-rw-r--r--src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/IIS.NewShim.FunctionalTests.csproj1
-rw-r--r--src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/NewShimTests.cs3
-rw-r--r--src/Servers/IIS/IIS/test/IIS.ShadowCopy.Tests/ShadowCopyTests.cs2
-rw-r--r--src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/ApplicationInitializationTests.cs1
-rw-r--r--src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/StdOutRedirectionTests.cs3
-rw-r--r--src/Servers/IIS/IIS/test/IIS.Tests/IIS.Tests.csproj2
-rw-r--r--src/Servers/IIS/IIS/test/IIS.Tests/ResponseAbortTests.cs1
-rw-r--r--src/Servers/IIS/IIS/test/IIS.Tests/ResponseBodySizeTests.cs32
-rw-r--r--src/Servers/IIS/IIS/test/IIS.Tests/Utilities/TestServer.cs24
-rw-r--r--src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj3
-rw-r--r--src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs62
-rw-r--r--src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj8
-rw-r--r--src/Servers/IIS/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj2
-rw-r--r--src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs14
-rw-r--r--src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs11
-rw-r--r--src/Servers/IIS/IIS/test/testassets/shared/WebSockets/HandshakeHelpers.cs5
-rw-r--r--src/Servers/IIS/IISIntegration/src/AuthenticationHandler.cs2
-rw-r--r--src/Servers/IIS/IISIntegration/src/ForwardedTlsConnectionFeature.cs2
-rw-r--r--src/Servers/IIS/IISIntegration/src/IISMiddleware.cs20
-rw-r--r--src/Servers/IIS/IISIntegration/src/IISSetupFilter.cs2
-rw-r--r--src/Servers/IIS/IISIntegration/src/NativeMethods.cs8
-rw-r--r--src/Servers/IIS/IISIntegration/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Servers/IIS/IISIntegration/src/PublicAPI.Unshipped.txt4
-rw-r--r--src/Servers/IIS/IISIntegration/src/WebHostBuilderIISExtensions.cs5
-rw-r--r--src/Servers/IIS/IntegrationTesting.IIS/src/ApplicationDeployerFactory.cs10
-rw-r--r--src/Servers/IIS/IntegrationTesting.IIS/src/IISDeployer.cs128
-rw-r--r--src/Servers/IIS/IntegrationTesting.IIS/src/IISExpressDeployer.cs45
-rw-r--r--src/Servers/IIS/IntegrationTesting.IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj4
-rw-r--r--src/Servers/IIS/IntegrationTesting.IIS/src/ProcessTracker.cs16
-rw-r--r--src/Servers/IIS/build/Build.Common.Settings7
-rw-r--r--src/Servers/Kestrel/Core/src/CoreStrings.resx54
-rw-r--r--src/Servers/Kestrel/Core/src/Http2Limits.cs25
-rw-r--r--src/Servers/Kestrel/Core/src/HttpsConnectionAdapterOptions.cs9
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/AddressBindContext.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/AddressBinder.cs26
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Certificates/CertificateConfigLoader.cs19
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Certificates/ICertificateConfigLoader.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ConfigurationReader.cs10
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ConnectionDispatcher.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ConnectionLogScope.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/ChunkWriter.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/DateHeaderValueManager.cs6
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs28
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs16
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpHeaders.Generated.cs1958
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs309
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.FeatureCollection.cs40
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.Generated.cs46
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs69
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestHeaders.cs13
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestStream.cs7
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/HttpResponseHeaders.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs6
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/InputFlowControl.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/StreamInputFlowControl.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.Generated.cs25
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs20
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs46
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2KeepAlive.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs9
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs5
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.FeatureCollection.cs5
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs35
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/DefaultStreamDirectionFeature.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Frames/Http3RawFrame.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3Connection.cs363
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3ConnectionErrorException.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs91
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStreamOfT.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameReader.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameWriter.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3MessageBody.cs9
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3OutputProducer.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3PeerSettings.cs16
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStream.cs103
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStreamException.cs15
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3SettingType.cs15
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.FeatureCollection.cs5
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.cs272
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamContext.cs16
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamErrorException.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamOfT.cs6
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3Stream.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3StreamLifetimeHandler.cs1
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DecoderStreamReader.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DynamicTable.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/QPack/EncoderStreamReader.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Http3/StreamCompletionFlags.cs14
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/HttpConnection.cs18
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/HttpMultiplexedConnectionContext.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/HttpProtocolsFeature.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/BodyControl.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionManager.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionReference.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/Constants.cs5
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/Disposable.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/Heartbeat.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/HeartbeatManager.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/HttpUtilities.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnectionOfT.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.BadRequests.cs58
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Connections.cs102
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.General.cs87
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http2.cs134
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http3.cs106
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.cs416
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/PipeWriterHelpers/TimingPipeFlusher.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/ResourceCounter.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/StreamCloseAwaitable.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/SystemClock.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/ThreadPoolAwaitable.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimeoutControl.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportConnectionManager.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportManager.cs84
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/KestrelServerImpl.cs42
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/KestrelServerOptionsSetup.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs3
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ServerAddressesCollection.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ServerAddressesFeature.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ServiceContext.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs23
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/ThrowHelper.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportSession.cs192
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStream.cs120
-rw-r--r--src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStreamType.cs23
-rw-r--r--src/Servers/Kestrel/Core/src/KestrelConfigurationLoader.cs52
-rw-r--r--src/Servers/Kestrel/Core/src/KestrelServerOptions.cs93
-rw-r--r--src/Servers/Kestrel/Core/src/ListenOptions.cs1
-rw-r--r--src/Servers/Kestrel/Core/src/ListenOptionsHttpsExtensions.cs35
-rw-r--r--src/Servers/Kestrel/Core/src/LocalhostListenOptions.cs1
-rw-r--r--src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj4
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/ConnectionLimitMiddleware.cs4
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/HttpConnectionMiddleware.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/HttpMultiplexedConnectionMiddleware.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs12
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs20
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/LoggingConnectionMiddleware.cs2
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/LoggingDuplexPipe.cs9
-rw-r--r--src/Servers/Kestrel/Core/src/Middleware/LoggingMultiplexedConnectionMiddleware.cs6
-rw-r--r--src/Servers/Kestrel/Core/src/PublicAPI.Shipped.txt4
-rw-r--r--src/Servers/Kestrel/Core/src/PublicAPI.Unshipped.txt4
-rw-r--r--src/Servers/Kestrel/Core/test/AddressBinderTests.cs14
-rw-r--r--src/Servers/Kestrel/Core/test/Http1/Http1ConnectionTests.cs11
-rw-r--r--src/Servers/Kestrel/Core/test/Http1/Http1HttpProtocolFeatureCollectionTests.cs4
-rw-r--r--src/Servers/Kestrel/Core/test/Http3/Http3HttpProtocolFeatureCollectionTests.cs8
-rw-r--r--src/Servers/Kestrel/Core/test/HttpParserTests.cs291
-rw-r--r--src/Servers/Kestrel/Core/test/HttpRequestHeadersTests.cs88
-rw-r--r--src/Servers/Kestrel/Core/test/KestrelServerTests.cs37
-rw-r--r--src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs169
-rw-r--r--src/Servers/Kestrel/Core/test/StartLineTests.cs49
-rw-r--r--src/Servers/Kestrel/Kestrel.slnf24
-rw-r--r--src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs15
-rw-r--r--src/Servers/Kestrel/Kestrel/test/GeneratedCodeTests.cs7
-rw-r--r--src/Servers/Kestrel/Kestrel/test/KestrelConfigurationLoaderTests.cs8
-rw-r--r--src/Servers/Kestrel/Kestrel/test/Microsoft.AspNetCore.Server.Kestrel.Tests.csproj1
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/ISystemClock.cs2
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionContext.cs38
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs161
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/QuicLog.cs67
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.FeatureCollection.cs36
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.cs209
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Internal/QuicTransportContext.cs2
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj3
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/PublicAPI.Unshipped.txt10
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/QuicConnectionFactory.cs45
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/QuicTransportFactory.cs38
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/QuicTransportOptions.cs51
-rw-r--r--src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs2
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests.csproj9
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/NoParallelCollection.cs10
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/QuicConnectionContextTests.cs135
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/QuicConnectionListenerTests.cs227
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/QuicStreamContextTests.cs114
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/QuicTestHelpers.cs75
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/QuicTransportFactoryTests.cs30
-rw-r--r--src/Servers/Kestrel/Transport.Quic/test/WebHostTests.cs200
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs12
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/IOQueue.cs2
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketAwaitableEventArgs.cs13
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs109
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketOperationResult.cs29
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketReceiver.cs20
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSender.cs20
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderPool.cs2
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Shipped.txt3
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Unshipped.txt3
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs47
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/SocketTransportFactory.cs10
-rw-r--r--src/Servers/Kestrel/Transport.Sockets/src/SocketTransportOptions.cs22
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackDecoderBenchmark.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionBenchmarkBase.cs72
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionEmptyBenchmark.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Http3/Http3ConnectionBenchmarkBase.cs13
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Http3/QPackDecoderBenchmark.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/InMemoryTransportBenchmark.cs6
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockDuplexPipe.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockSystemClock.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockTimeoutControl.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullParser.cs2
-rw-r--r--src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullPipeWriter.cs2
-rw-r--r--src/Servers/Kestrel/samples/Http3SampleApp/Program.cs17
-rw-r--r--src/Servers/Kestrel/samples/Http3SampleApp/Startup.cs3
-rw-r--r--src/Servers/Kestrel/samples/Http3SampleApp/appsettings.Development.json4
-rw-r--r--src/Servers/Kestrel/samples/HttpClientApp/HttpClientApp.csproj5
-rw-r--r--src/Servers/Kestrel/samples/SampleApp/Startup.cs7
-rw-r--r--src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Program.cs201
-rw-r--r--src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Properties/launchSettings.json13
-rw-r--r--src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/WebTransportInteractiveSampleApp.csproj30
-rw-r--r--src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.Development.json10
-rw-r--r--src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.json10
-rw-r--r--src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/wwwroot/index.html366
-rw-r--r--src/Servers/Kestrel/samples/WebTransportSampleApp/Program.cs92
-rw-r--r--src/Servers/Kestrel/samples/WebTransportSampleApp/Properties/launchSettings.json11
-rw-r--r--src/Servers/Kestrel/samples/WebTransportSampleApp/WebTransportSampleApp.csproj21
-rw-r--r--src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.Development.json10
-rw-r--r--src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.json10
-rw-r--r--src/Servers/Kestrel/samples/http2cat/http2cat.csproj3
-rw-r--r--src/Servers/Kestrel/shared/KnownHeaders.cs115
-rw-r--r--src/Servers/Kestrel/shared/TransportConnection.Generated.cs22
-rw-r--r--src/Servers/Kestrel/shared/test/CertHelper.cs191
-rw-r--r--src/Servers/Kestrel/shared/test/CertificateAuthority.cs951
-rw-r--r--src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs125
-rw-r--r--src/Servers/Kestrel/shared/test/HttpParsingData.cs37
-rw-r--r--src/Servers/Kestrel/shared/test/RevocationResponder.cs426
-rw-r--r--src/Servers/Kestrel/shared/test/ServerRetryHelper.cs41
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.crt11
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.key8
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.crt11
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.key8
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.crt23
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.key8
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/root_ca.crt10
-rw-r--r--src/Servers/Kestrel/shared/test/TestCertificates/root_ca.key8
-rw-r--r--src/Servers/Kestrel/shared/test/TestContextFactory.cs36
-rw-r--r--src/Servers/Kestrel/shared/test/TestResources.cs34
-rw-r--r--src/Servers/Kestrel/shared/test/TestServiceContext.cs14
-rw-r--r--src/Servers/Kestrel/shared/test/TransportTestHelpers/HttpSysHttp3SupportedAttribute.cs4
-rw-r--r--src/Servers/Kestrel/shared/test/TransportTestHelpers/MsQuicSupportedAttribute.cs4
-rw-r--r--src/Servers/Kestrel/stress/HttpStress.csproj4
-rw-r--r--src/Servers/Kestrel/stress/Program.cs120
-rw-r--r--src/Servers/Kestrel/test/BindTests/AddressRegistrationTests.cs38
-rw-r--r--src/Servers/Kestrel/test/FunctionalTests/RequestTests.cs45
-rw-r--r--src/Servers/Kestrel/test/FunctionalTests/ResponseTests.cs1
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs197
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2ConnectionTests.cs344
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs1096
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs120
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs7
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2WebSocketTests.cs440
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs212
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3StreamTests.cs1236
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TestBase.cs31
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TimeoutTests.cs295
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportHandshakeTests.cs166
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportSessionTests.cs101
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportStreamTests.cs52
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportTestUtilities.cs199
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpProtocolSelectionTests.cs7
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs79
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsTests.cs129
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTargetProcessingTests.cs16
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTests.cs74
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseHeaderTests.cs37
-rw-r--r--src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseTests.cs124
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/H2SpecCommands.cs6
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs1
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3RequestTests.cs335
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs96
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/HttpClientHttp2InteropTests.cs9
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs16
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/Interop.FunctionalTests.csproj9
-rw-r--r--src/Servers/Kestrel/test/Interop.FunctionalTests/NoParallelCollection.cs10
-rw-r--r--src/Servers/Kestrel/test/SystemdActivation/Dockerfile23
-rwxr-xr-xsrc/Servers/Kestrel/test/SystemdActivation/docker-entrypoint.sh14
-rwxr-xr-xsrc/Servers/Kestrel/test/SystemdActivation/docker.sh26
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/CodeGenerator.csproj3
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/FeatureCollectionGenerator.cs6
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/Http2Connection.cs32
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/HttpProtocolFeatureCollection.cs108
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/CombinationsWithoutRepetition.cs4
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilities.cs10
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilitiesGeneratorHelpers.cs6
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/Program.cs15
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/ReadOnlySpanStaticDataGenerator.cs82
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/TransportConnectionFeatureCollection.cs39
-rw-r--r--src/Servers/Kestrel/tools/CodeGenerator/TransportMultiplexedConnectionFeatureCollection.cs2
-rw-r--r--src/Servers/test/FunctionalTests/HelloWorldTest.cs54
-rw-r--r--src/Servers/testassets/ServerComparison.TestSites/Startup.cs8
-rw-r--r--src/Shared/BenchmarkRunner/DefaultCoreConfig.cs2
-rw-r--r--src/Shared/BenchmarkRunner/DefaultCoreDebugConfig.cs2
-rw-r--r--src/Shared/BenchmarkRunner/DefaultCorePerfLabConfig.cs2
-rw-r--r--src/Shared/BenchmarkRunner/DefaultCoreProfileConfig.cs2
-rw-r--r--src/Shared/BenchmarkRunner/DefaultCoreValidationConfig.cs2
-rw-r--r--src/Shared/BenchmarkRunner/ParameterizedJobConfigAttribute.cs2
-rw-r--r--src/Shared/BenchmarkRunner/Program.cs2
-rw-r--r--src/Shared/BrowserTesting/src/BrowserTestOutputLogger.cs2
-rw-r--r--src/Shared/Buffers.MemoryPool/DiagnosticMemoryPool.cs2
-rw-r--r--src/Shared/Buffers.MemoryPool/MemoryPoolThrowHelper.cs4
-rw-r--r--src/Shared/Buffers.Testing/BufferSegment.cs2
-rw-r--r--src/Shared/Buffers.Testing/CustomMemoryForTest.cs2
-rw-r--r--src/Shared/Buffers.Testing/ReadOnlySequenceFactory.cs10
-rw-r--r--src/Shared/CancellationTokenSourcePool.cs (renamed from src/Servers/Kestrel/Core/src/Internal/CancellationTokenSourcePool.cs)6
-rw-r--r--src/Shared/CertificateGeneration/CertificateManager.cs85
-rw-r--r--src/Shared/CertificateGeneration/EnsureCertificateResult.cs2
-rw-r--r--src/Shared/CertificateGeneration/MacOSCertificateManager.cs387
-rw-r--r--src/Shared/CertificateGeneration/UnixCertificateManager.cs2
-rw-r--r--src/Shared/CertificateGeneration/WindowsCertificateManager.cs3
-rw-r--r--src/Shared/ChunkingCookieManager/ChunkingCookieManager.cs48
-rw-r--r--src/Shared/CommandLineUtils/CommandLine/AnsiConsole.cs2
-rw-r--r--src/Shared/CommandLineUtils/CommandLine/CommandArgument.cs2
-rw-r--r--src/Shared/CommandLineUtils/CommandLine/CommandLineApplication.cs8
-rw-r--r--src/Shared/CommandLineUtils/CommandLine/CommandOption.cs2
-rw-r--r--src/Shared/CommandLineUtils/CommandLine/CommandParsingException.cs2
-rw-r--r--src/Shared/Components/PrerenderComponentApplicationStore.cs2
-rw-r--r--src/Shared/Components/ProtectedPrerenderComponentApplicationStore.cs2
-rw-r--r--src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs30
-rw-r--r--src/Shared/Diagnostics/AttributeValue.cs2
-rw-r--r--src/Shared/Diagnostics/HelperResult.cs2
-rw-r--r--src/Shared/Dictionary/AdaptiveCapacityDictionary.cs2
-rw-r--r--src/Shared/E2ETesting/BrowserFixture.cs2
-rw-r--r--src/Shared/E2ETesting/SeleniumStandaloneServer.cs8
-rw-r--r--src/Shared/E2ETesting/WaitAssert.cs2
-rw-r--r--src/Shared/E2ETesting/selenium-config.json2
-rw-r--r--src/Shared/ErrorPage/ErrorPage.Designer.cs2
-rw-r--r--src/Shared/ErrorPage/ErrorPageModel.cs2
-rw-r--r--src/Shared/EventSource.Testing/TestCounterListener.cs2
-rw-r--r--src/Shared/EventSource.Testing/TestEventListener.cs2
-rw-r--r--src/Shared/Hpack/DynamicHPackEncoder.cs2
-rw-r--r--src/Shared/Hpack/EncoderHeaderEntry.cs2
-rw-r--r--src/Shared/Http2cat/Http2CatHostedService.cs2
-rw-r--r--src/Shared/Http2cat/Http2CatOptions.cs2
-rw-r--r--src/Shared/Http2cat/Http2Utilities.cs64
-rw-r--r--src/Shared/HttpSys/NativeInterop/SafeLocalFreeChannelBinding.cs2
-rw-r--r--src/Shared/HttpSys/NativeInterop/SafeNativeOverlapped.cs2
-rw-r--r--src/Shared/HttpSys/NativeInterop/SocketAddress.cs2
-rw-r--r--src/Shared/HttpSys/NativeInterop/UnsafeNativeMethods.cs78
-rw-r--r--src/Shared/HttpSys/RequestProcessing/HeaderCollection.cs2
-rw-r--r--src/Shared/HttpSys/RequestProcessing/NativeRequestContext.cs2
-rw-r--r--src/Shared/HttpSys/RequestProcessing/RequestHeaders.cs2
-rw-r--r--src/Shared/InternalHeaderNames.cs29
-rw-r--r--src/Shared/LinkerFlags.cs5
-rw-r--r--src/Shared/NullScope.cs2
-rw-r--r--src/Shared/ParameterBindingMethodCache.cs186
-rw-r--r--src/Shared/ProblemDetails/HttpValidationProblemDetailsJsonConverter.cs (renamed from src/Shared/HttpValidationProblemDetailsJsonConverter.cs)0
-rw-r--r--src/Shared/ProblemDetails/ProblemDetailsDefaults.cs (renamed from src/Shared/ProblemDetailsDefaults.cs)37
-rw-r--r--src/Shared/ProblemDetails/ProblemDetailsJsonConverter.cs (renamed from src/Shared/ProblemDetailsJsonConverter.cs)0
-rw-r--r--src/Shared/Process/ProcessEx.cs2
-rw-r--r--src/Shared/PropertyActivator/PropertyActivator.cs2
-rw-r--r--src/Shared/PropertyAsParameterInfo.cs191
-rw-r--r--src/Shared/QueryStringEnumerable.cs25
-rw-r--r--src/Shared/Razor/CaseSensitiveBoundAttributeComparer.cs2
-rw-r--r--src/Shared/RazorShared/RazorDiagnosticJsonConverter.cs2
-rw-r--r--src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs2
-rw-r--r--src/Shared/RazorViews/AttributeValue.cs2
-rw-r--r--src/Shared/RazorViews/HelperResult.cs2
-rw-r--r--src/Shared/Reroute.cs34
-rw-r--r--src/Shared/ResultsTests/PhysicalFileResultTestBase.cs2
-rw-r--r--src/Shared/ResultsTests/VirtualFileResultTestBase.cs2
-rw-r--r--src/Shared/RoslynUtils/GeneratedNameParser.cs30
-rw-r--r--src/Shared/RoslynUtils/TypeHelper.cs39
-rw-r--r--src/Shared/ServerInfrastructure/DuplexPipe.cs2
-rw-r--r--src/Shared/ServerInfrastructure/Http2/Http2Frame.Continuation.cs2
-rw-r--r--src/Shared/ServerInfrastructure/Http2/Http2PeerSettings.cs8
-rw-r--r--src/Shared/ServerInfrastructure/Http2/Http2SettingsParameter.cs2
-rw-r--r--src/Shared/ServerInfrastructure/SslDuplexPipe.cs2
-rw-r--r--src/Shared/ServerInfrastructure/StringUtilities.cs2
-rw-r--r--src/Shared/SignalR/InProcessTestServer.cs2
-rw-r--r--src/Shared/SignalR/LogSinkProvider.cs4
-rw-r--r--src/Shared/SignalR/WrappingLoggerFactory.cs4
-rw-r--r--src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs2
-rw-r--r--src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs2
-rw-r--r--src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs2
-rw-r--r--src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs2
-rw-r--r--src/Shared/StackTrace/StackFrame/StackFrameInfo.cs2
-rw-r--r--src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs2
-rw-r--r--src/Shared/StackTrace/StackFrame/StackTraceHelper.cs2
-rw-r--r--src/Shared/StaticWebAssets/ManifestStaticWebAssetFileProvider.cs2
-rw-r--r--src/Shared/StringHelpers.cs17
-rw-r--r--src/Shared/TaskToApm.cs2
-rw-r--r--src/Shared/TrimmingAttributes.cs114
-rw-r--r--src/Shared/UrlDecoder/UrlDecoder.cs2
-rw-r--r--src/Shared/runtime/Http2/Hpack/HPackDecoder.cs2
-rw-r--r--src/Shared/runtime/Http2/Hpack/IntegerDecoder.cs4
-rw-r--r--src/Shared/runtime/Http2/Hpack/IntegerEncoder.cs4
-rw-r--r--src/Shared/runtime/Http2/Hpack/StatusCodes.cs193
-rw-r--r--src/Shared/runtime/Http3/Helpers/VariableLengthIntegerHelper.cs4
-rw-r--r--src/Shared/runtime/Http3/Http3SettingType.cs15
-rw-r--r--src/Shared/runtime/Http3/Http3StreamType.cs10
-rw-r--r--src/Shared/runtime/Http3/QPack/H3StaticTable.Http3.cs2
-rw-r--r--src/Shared/runtime/Http3/QPack/QPackDecoder.cs2
-rw-r--r--src/Shared/runtime/Http3/QPack/QPackEncoder.cs10
-rw-r--r--src/Shared/runtime/NetEventSource.Common.cs683
-rw-r--r--src/Shared/test/Certificates/Certificates.cs2
-rw-r--r--src/SignalR/SignalR.slnf1
-rw-r--r--src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs8
-rw-r--r--src/SignalR/clients/csharp/Client.Core/src/Internal/ConnectionLogScope.cs2
-rw-r--r--src/SignalR/clients/csharp/Client.Core/src/Internal/DefaultRetryPolicy.cs2
-rw-r--r--src/SignalR/clients/csharp/Client.Core/src/Internal/InvocationRequest.cs4
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/GeneratorHelpers.cs9
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Emitter.cs18
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs4
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.SourceGenerationSpec.cs8
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.cs2
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Emitter.cs16
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Parser.cs2
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.SourceGenerationSpec.cs8
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.cs2
-rw-r--r--src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj2
-rw-r--r--src/SignalR/clients/csharp/Client/src/HubConnectionBuilderHttpExtensions.cs4
-rw-r--r--src/SignalR/clients/csharp/Client/test/UnitTests/HttpConnectionTests.Transport.cs310
-rw-r--r--src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs2
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.Log.cs6
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.cs8
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/AccessTokenHttpMessageHandler.cs40
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ConnectionLogScope.cs2
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/LongPollingTransport.cs2
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/SendUtils.cs3
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ServerSentEventsMessageParser.cs6
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Shipped.txt2
-rw-r--r--src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/SignalR/clients/java/signalr/build.gradle4
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/ActionBase.java4
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/CallbackMap.java38
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function1Single.java17
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function2Single.java18
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function3Single.java19
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function4Single.java20
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function5Single.java21
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function6Single.java22
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function7Single.java23
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function8Single.java24
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionBase.java15
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionSingle.java15
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java170
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/InvocationHandler.java10
-rw-r--r--src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Subscription.java5
-rw-r--r--src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnection.ReturnResultTest.java398
-rw-r--r--src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java294
-rw-r--r--src/SignalR/clients/ts/.npmrc1
-rw-r--r--src/SignalR/clients/ts/FunctionalTests/.npmrc1
-rw-r--r--src/SignalR/clients/ts/FunctionalTests/Startup.cs8
-rw-r--r--src/SignalR/clients/ts/FunctionalTests/package.json6
-rw-r--r--src/SignalR/clients/ts/FunctionalTests/ts/ConnectionTests.ts3
-rw-r--r--src/SignalR/clients/ts/FunctionalTests/ts/HubConnectionTests.ts23
-rw-r--r--src/SignalR/clients/ts/FunctionalTests/yarn.lock554
-rw-r--r--src/SignalR/clients/ts/common/.npmrc1
-rw-r--r--src/SignalR/clients/ts/common/package.json16
-rw-r--r--src/SignalR/clients/ts/common/yarn.lock1082
-rw-r--r--src/SignalR/clients/ts/signalr-protocol-msgpack/.npmrc1
-rw-r--r--src/SignalR/clients/ts/signalr-protocol-msgpack/package.json2
-rw-r--r--src/SignalR/clients/ts/signalr-protocol-msgpack/yarn.lock61
-rw-r--r--src/SignalR/clients/ts/signalr/.npmrc1
-rw-r--r--src/SignalR/clients/ts/signalr/package.json9
-rw-r--r--src/SignalR/clients/ts/signalr/src/FetchHttpClient.ts18
-rw-r--r--src/SignalR/clients/ts/signalr/src/XhrHttpClient.ts16
-rw-r--r--src/SignalR/clients/ts/signalr/tests/FetchHttpClient.test.ts48
-rw-r--r--src/SignalR/clients/ts/signalr/yarn.lock59
-rw-r--r--src/SignalR/common/Http.Connections.Common/src/NegotiateProtocol.cs2
-rw-r--r--src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilder.cs6
-rw-r--r--src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs10
-rw-r--r--src/SignalR/common/Http.Connections/src/Internal/ConnectionLogScope.cs2
-rw-r--r--src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs2
-rw-r--r--src/SignalR/common/Http.Connections/src/Internal/HttpConnectionDispatcher.cs4
-rw-r--r--src/SignalR/common/Http.Connections/src/Internal/HttpConnectionsEventSource.cs2
-rw-r--r--src/SignalR/common/Http.Connections/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj1
-rw-r--r--src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs47
-rw-r--r--src/SignalR/common/Protocols.Json/src/PublicAPI.Shipped.txt2
-rw-r--r--src/SignalR/common/Protocols.Json/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj1
-rw-r--r--src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs2
-rw-r--r--src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocolWorker.cs38
-rw-r--r--src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Shipped.txt2
-rw-r--r--src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj1
-rw-r--r--src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs49
-rw-r--r--src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Shipped.txt2
-rw-r--r--src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Unshipped.txt2
-rw-r--r--src/SignalR/common/Shared/AsyncEnumerableAdapters.cs8
-rw-r--r--src/SignalR/common/Shared/ClientResultsManager.cs4
-rw-r--r--src/SignalR/common/Shared/DuplexPipe.cs2
-rw-r--r--src/SignalR/common/Shared/JsonUtils.cs2
-rw-r--r--src/SignalR/common/Shared/PipeWriterStream.cs2
-rw-r--r--src/SignalR/common/Shared/SystemClock.cs2
-rw-r--r--src/SignalR/common/Shared/TimerAwaitable.cs2
-rw-r--r--src/SignalR/common/Shared/TryGetReturnType.cs24
-rw-r--r--src/SignalR/common/SignalR.Common/src/IInvocationBinder.cs9
-rw-r--r--src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj7
-rw-r--r--src/SignalR/common/SignalR.Common/src/PublicAPI/net462/PublicAPI.Shipped.txt (renamed from src/SignalR/common/SignalR.Common/src/PublicAPI.Shipped.txt)0
-rw-r--r--src/SignalR/common/SignalR.Common/src/PublicAPI/net462/PublicAPI.Unshipped.txt (renamed from src/SignalR/common/SignalR.Common/src/PublicAPI.Unshipped.txt)0
-rw-r--r--src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Shipped.txt98
-rw-r--r--src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt5
-rw-r--r--src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt98
-rw-r--r--src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt4
-rw-r--r--src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs30
-rw-r--r--src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTests.cs19
-rw-r--r--src/SignalR/perf/Microbenchmarks/RedisHubLifetimeManagerBenchmark.cs2
-rw-r--r--src/SignalR/perf/Microbenchmarks/RedisProtocolBenchmark.cs2
-rw-r--r--src/SignalR/perf/Microbenchmarks/TypedClientBuilderBenchmark.cs2
-rw-r--r--src/SignalR/perf/benchmarkapps/Crankier/Commands/AgentCommand.cs2
-rw-r--r--src/SignalR/perf/benchmarkapps/Crankier/Commands/LocalCommand.cs2
-rw-r--r--src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs2
-rw-r--r--src/SignalR/perf/benchmarkapps/Crankier/Commands/WorkerCommand.cs2
-rw-r--r--src/SignalR/samples/SignalRSamples/Hubs/Streaming.cs6
-rw-r--r--src/SignalR/samples/SocialWeather/SocialWeather.csproj2
-rw-r--r--src/SignalR/server/Core/src/ClientProxyExtensions.cs22
-rw-r--r--src/SignalR/server/Core/src/DefaultHubLifetimeManager.cs8
-rw-r--r--src/SignalR/server/Core/src/HubConnectionContext.cs9
-rw-r--r--src/SignalR/server/Core/src/HubConnectionHandler.cs3
-rw-r--r--src/SignalR/server/Core/src/HubLifetimeManager.cs4
-rw-r--r--src/SignalR/server/Core/src/IHubCallerClients.cs10
-rw-r--r--src/SignalR/server/Core/src/IHubClients.cs4
-rw-r--r--src/SignalR/server/Core/src/IHubClients`T.cs7
-rw-r--r--src/SignalR/server/Core/src/ISingleClientProxy.cs4
-rw-r--r--src/SignalR/server/Core/src/Internal/ChannelBasedSemaphore.cs77
-rw-r--r--src/SignalR/server/Core/src/Internal/DefaultHubActivator.cs6
-rw-r--r--src/SignalR/server/Core/src/Internal/DefaultHubCallerContext.cs2
-rw-r--r--src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs45
-rw-r--r--src/SignalR/server/Core/src/Internal/DefaultHubDispatcherLog.cs3
-rw-r--r--src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs4
-rw-r--r--src/SignalR/server/Core/src/Internal/DynamicClientProxy.cs2
-rw-r--r--src/SignalR/server/Core/src/Internal/GroupManager.cs2
-rw-r--r--src/SignalR/server/Core/src/Internal/HubCallerClients.cs115
-rw-r--r--src/SignalR/server/Core/src/Internal/HubClients.cs10
-rw-r--r--src/SignalR/server/Core/src/Internal/HubClients`T.cs10
-rw-r--r--src/SignalR/server/Core/src/Internal/HubConnectionBinder.cs8
-rw-r--r--src/SignalR/server/Core/src/Internal/HubContext.cs4
-rw-r--r--src/SignalR/server/Core/src/Internal/HubContext`T.cs4
-rw-r--r--src/SignalR/server/Core/src/Internal/HubDispatcher.cs1
-rw-r--r--src/SignalR/server/Core/src/Internal/HubFilterFactory.cs2
-rw-r--r--src/SignalR/server/Core/src/Internal/HubGroupList.cs4
-rw-r--r--src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs2
-rw-r--r--src/SignalR/server/Core/src/Internal/NonInvokingSingleClientProxy.cs22
-rw-r--r--src/SignalR/server/Core/src/Internal/Proxies.cs37
-rw-r--r--src/SignalR/server/Core/src/Internal/SemaphoreSlimExtensions.cs36
-rw-r--r--src/SignalR/server/Core/src/Internal/SignalRBuilder.cs2
-rw-r--r--src/SignalR/server/Core/src/Internal/SignalRCoreMarkerService.cs4
-rw-r--r--src/SignalR/server/Core/src/Internal/TypedHubClients.cs9
-rw-r--r--src/SignalR/server/Core/src/Internal/Utf8HashLookup.cs160
-rw-r--r--src/SignalR/server/Core/src/PublicAPI.Shipped.txt24
-rw-r--r--src/SignalR/server/Core/src/PublicAPI.Unshipped.txt38
-rw-r--r--src/SignalR/server/Core/src/StreamTracker.cs4
-rw-r--r--src/SignalR/server/SignalR/src/HubEndpointConventionBuilder.cs6
-rw-r--r--src/SignalR/server/SignalR/src/PublicAPI.Unshipped.txt1
-rw-r--r--src/SignalR/server/SignalR/src/SignalRMarkerService.cs4
-rw-r--r--src/SignalR/server/SignalR/test/ClientProxyTests.cs4
-rw-r--r--src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs74
-rw-r--r--src/SignalR/server/SignalR/test/HubConnectionHandlerTests.ClientResult.cs373
-rw-r--r--src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs39
-rw-r--r--src/SignalR/server/Specification.Tests/src/HubLifetimeManagerTestBase.cs14
-rw-r--r--src/SignalR/server/Specification.Tests/src/ScaleoutHubLifetimeManagerTests.cs14
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/Internal/AckHandler.cs4
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/Internal/DefaultHubMessageSerializer.cs2
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs2
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/Internal/RedisLog.cs3
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/Internal/RedisProtocol.cs2
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/Internal/RedisSubscriptionManager.cs15
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/PublicAPI.Shipped.txt6
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/PublicAPI.Unshipped.txt6
-rw-r--r--src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs52
-rw-r--r--src/SignalR/server/StackExchangeRedis/test/RedisHubLifetimeManagerTests.cs42
-rw-r--r--src/SignalR/server/StackExchangeRedis/test/TestConnectionMultiplexer.cs17
-rw-r--r--src/Testing/src/AssemblyTestLog.cs10
-rw-r--r--src/Testing/src/DumpCollector/DumpCollector.Windows.cs2
-rw-r--r--src/Testing/src/HelixHelper.cs24
-rw-r--r--src/Testing/src/Logging/LogValuesAssert.cs2
-rw-r--r--src/Testing/src/Logging/TestLogger.cs2
-rw-r--r--src/Testing/src/Logging/XunitLoggerProvider.cs2
-rw-r--r--src/Testing/src/xunit/AspNetTestCaseRunner.cs2
-rw-r--r--src/Testing/src/xunit/AspNetTestClassRunner.cs2
-rw-r--r--src/Testing/src/xunit/AspNetTestInvoker.cs2
-rw-r--r--src/Testing/src/xunit/AspNetTestMethodRunner.cs2
-rw-r--r--src/Testing/src/xunit/AspNetTestRunner.cs2
-rw-r--r--src/Testing/src/xunit/AspNetTheoryTestCaseRunner.cs2
-rw-r--r--src/Testing/src/xunit/ConditionalFactDiscoverer.cs2
-rw-r--r--src/Testing/src/xunit/ConditionalTheoryDiscoverer.cs2
-rw-r--r--src/Testing/src/xunit/SkipNonHelix.cs4
-rw-r--r--src/Testing/src/xunit/SkipOnCIAttribute.cs4
-rw-r--r--src/Testing/src/xunit/SkipOnHelixAttribute.cs4
-rw-r--r--src/Testing/src/xunit/WORKAROUND_SkippedDataRowTestCase.cs2
-rw-r--r--src/Testing/test/QuarantinedTestAttributeTest.cs8
-rw-r--r--src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs8
-rw-r--r--src/Tools/GetDocumentInsider/src/CommandException.cs2
-rw-r--r--src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommand.cs4
-rw-r--r--src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommandWorker.cs2
-rw-r--r--src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj2
-rw-r--r--src/Tools/GetDocumentInsider/src/Program.cs2
-rw-r--r--src/Tools/LinkabilityChecker/LinkabilityChecker.csproj1
-rw-r--r--src/Tools/LinkabilityChecker/Program.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Application.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Commands/AddCommand.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Commands/AddFileCommand.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Commands/AddProjectCommand.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Commands/AddURLCommand.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Commands/RefreshCommand.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Commands/RemoveCommand.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Internal/OpenapiDependencyAttribute.cs2
-rw-r--r--src/Tools/Microsoft.dotnet-openapi/src/Microsoft.dotnet-openapi.csproj1
-rw-r--r--src/Tools/SDK-Analyzers/Components/src/ComponentSymbols.cs2
-rw-r--r--src/Tools/SDK-Analyzers/Components/src/InternalUsageAnalyzer.cs2
-rw-r--r--src/Tools/SDK-Analyzers/Components/test/Verifiers/DiagnosticVerifier.cs4
-rw-r--r--src/Tools/Shared/SecretsHelpers/MsBuildProjectFinder.cs (renamed from src/Tools/dotnet-user-secrets/src/Internal/MsBuildProjectFinder.cs)13
-rw-r--r--src/Tools/Shared/SecretsHelpers/ProjectIdResolver.cs (renamed from src/Tools/dotnet-user-secrets/src/Internal/ProjectIdResolver.cs)26
-rw-r--r--src/Tools/Shared/SecretsHelpers/SecretsHelpersResources.resx147
-rw-r--r--src/Tools/Shared/SecretsHelpers/UserSecretsCreator.cs84
-rw-r--r--src/Tools/Shared/SecretsHelpers/assets/SecretManager.targets (renamed from src/Tools/dotnet-user-secrets/src/assets/SecretManager.targets)0
-rw-r--r--src/Tools/Shared/TestHelpers/TestConsole.cs2
-rw-r--r--src/Tools/Tools.slnf34
-rw-r--r--src/Tools/dotnet-dev-certs/src/Program.cs27
-rw-r--r--src/Tools/dotnet-dev-certs/src/ReporterEventListener.cs2
-rw-r--r--src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj4
-rw-r--r--src/Tools/dotnet-getdocument/src/Commands/InvokeCommand.cs2
-rw-r--r--src/Tools/dotnet-getdocument/src/Program.cs2
-rw-r--r--src/Tools/dotnet-getdocument/src/ProjectOptions.cs2
-rw-r--r--src/Tools/dotnet-sql-cache/src/SqlQueries.cs2
-rw-r--r--src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj1
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/ClearCommand.cs70
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/CreateCommand.cs271
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/KeyCommand.cs88
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/ListCommand.cs74
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/PrintCommand.cs58
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/ProjectCommandLineApplication.cs32
-rw-r--r--src/Tools/dotnet-user-jwts/src/Commands/RemoveCommand.cs56
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/ConsoleTable.cs137
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/DevJwtCliHelpers.cs208
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/DevJwtDefaults.cs14
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/Jwt.cs34
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/JwtAuthenticationSchemeSettings.cs79
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/JwtCreatorOptions.cs15
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/JwtIssuer.cs88
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/JwtStore.cs44
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/SigningKey.cs7
-rw-r--r--src/Tools/dotnet-user-jwts/src/Helpers/SigningKeysHandler.cs104
-rw-r--r--src/Tools/dotnet-user-jwts/src/Program.cs64
-rw-r--r--src/Tools/dotnet-user-jwts/src/Resources.resx318
-rw-r--r--src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj39
-rw-r--r--src/Tools/dotnet-user-jwts/test/UserJwtsTestFixture.cs127
-rw-r--r--src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs558
-rw-r--r--src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj17
-rw-r--r--src/Tools/dotnet-user-secrets/src/Internal/ClearCommand.cs2
-rw-r--r--src/Tools/dotnet-user-secrets/src/Internal/InitCommand.cs74
-rw-r--r--src/Tools/dotnet-user-secrets/src/Internal/ListCommand.cs2
-rw-r--r--src/Tools/dotnet-user-secrets/src/Internal/RemoveCommand.cs2
-rw-r--r--src/Tools/dotnet-user-secrets/src/Internal/SetCommand.cs6
-rw-r--r--src/Tools/dotnet-user-secrets/src/Program.cs10
-rw-r--r--src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj12
-rw-r--r--src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj4
-rw-r--r--src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj2
m---------src/submodules/MessagePack-CSharp0
m---------src/submodules/googletest0
m---------src/submodules/spa-templates0
3533 files changed, 94032 insertions, 66040 deletions
diff --git a/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml b/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml
new file mode 100644
index 0000000000..cbf529762b
--- /dev/null
+++ b/.azure/pipelines/azure-pipelines-mirror-within-azdo.yml
@@ -0,0 +1,70 @@
+# Configure which branches trigger builds
+trigger:
+ batch: true
+ branches:
+ include:
+ - internal/release/6.0
+
+parameters:
+# Run the pipeline manually (usually disallowed)
+- name: manualRun
+ default: false
+ displayName: Are you sure you want to run this pipeline manually?
+ type: boolean
+
+variables:
+ - group: Mirror-Credentials
+
+# Merges code from one AzDO branch into another
+jobs:
+- ${{ if and(contains(variables['Build.SourceBranch'], 'internal'), or(eq(variables['Build.Reason'], 'BatchedCI'), eq(parameters.manualRun, 'true'))) }}:
+ - template: /eng/common/templates/jobs/jobs.yml
+ parameters:
+ enableTelemetry: true
+ helixRepo: dotnet/aspnetcore
+ jobs:
+ - job: Merge_Azure_DevOps_Branches
+ enableSBOM: false
+ pool:
+ name: NetCore1ESPool-Internal
+ demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ variables:
+ - name: WorkingDirectoryName
+ value: repo-dir
+ - name: AzdoRepo
+ value: dotnet-aspnetcore
+ steps:
+ - powershell: |
+ $branch = "$(Build.SourceBranch)".Replace("refs/heads/", "");
+ $suffix = "-nonstable"
+ Write-Host "##vso[task.setvariable variable=BranchToMirror]$branch"
+ Write-Host "##vso[task.setvariable variable=TargetBranchName]$branch$suffix"
+ displayName: Calculate Mirrored Branch Names
+ - script: |
+ git clone https://dn-bot:$(dn-bot-dnceng-build-rw-code-rw)@dev.azure.com/dnceng/internal/_git/$(AzdoRepo) $(WorkingDirectoryName) --recursive --no-tags --branch $(TargetBranchName)
+ displayName: Clone AzDO repo
+ - script: |
+ git -c user.email="dotnet-bot@microsoft.com" -c user.name="dotnet-bot" merge origin/$(BranchToMirror) -m "Merge in '$(BranchToMirror)' changes"
+ displayName: Merge head branch to target branch
+ workingDirectory: $(WorkingDirectoryName)
+ - script: |
+ git push origin $(TargetBranchName)
+ displayName: Push changes to Azure DevOps repo
+ workingDirectory: $(WorkingDirectoryName)
+
+ - task: PowerShell@1
+ displayName: Broadcast target, branch, commit in metadata
+ continueOnError: true
+ condition: always()
+ inputs:
+ scriptType: inlineScript
+ arguments: '$(BranchToMirror)'
+ workingDirectory: $(WorkingDirectoryName)
+ inlineScript: |
+ param([string]$branch)
+
+ $commit = (git rev-parse HEAD).Substring(0, 7)
+ $target = "$branch".Replace('/', ' ')
+
+ Write-Host "##vso[build.updatebuildnumber]$target $commit"
+ Write-Host "##vso[build.addbuildtag]$target"
diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml
index ce8da1c3ad..6aa298db30 100644
--- a/.azure/pipelines/ci.yml
+++ b/.azure/pipelines/ci.yml
@@ -293,7 +293,7 @@ stages:
path: artifacts/bin/ANCMv2
- name: Windows_ANCMIISExpress_Msi
path: artifacts/bin/AncmIISExpressV2
-
+
# Build Windows ARM
- template: jobs/default-build.yml
parameters:
diff --git a/.azure/pipelines/components-e2e-tests.yml b/.azure/pipelines/components-e2e-tests.yml
index ef9c8dcf87..7badaca296 100644
--- a/.azure/pipelines/components-e2e-tests.yml
+++ b/.azure/pipelines/components-e2e-tests.yml
@@ -40,7 +40,7 @@ jobs:
displayName: Update submodules
- script: ./restore.sh
displayName: Run restore.sh
- - script: npm install --prefix ./src/Components/test/E2ETest
+ - script: yarn install --frozen-lockfile --cwd ./src/Components/test/E2ETest
displayName: NPM install
- script: .dotnet/dotnet build ./src/Components/test/E2ETest -c $(BuildConfiguration) --no-restore
displayName: Build
diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml
index f578913979..6c5bc60105 100644
--- a/.azure/pipelines/jobs/default-build.yml
+++ b/.azure/pipelines/jobs/default-build.yml
@@ -100,13 +100,15 @@ jobs:
enableTelemetry: true
helixRepo: dotnet/aspnetcore
helixType: build.product/
+ ${{ if ne(variables['System.TeamProject'], 'internal') }}:
+ skipComponentGovernanceDetection: true
workspace:
clean: all
# Map friendly OS names to the right queue
# See https://github.com/dotnet/arcade/blob/master/Documentation/ChoosingAMachinePool.md
pool:
${{ if eq(parameters.agentOs, 'macOS') }}:
- vmImage: macOS-10.15
+ vmImage: macOS-11
${{ if eq(parameters.agentOs, 'Linux') }}:
${{ if and(eq(parameters.useHostedUbuntu, true), or(ne(variables['System.TeamProject'], 'internal'), in(variables['Build.Reason'], 'Manual', 'PullRequest', 'Schedule'))) }}:
vmImage: ubuntu-18.04
@@ -120,16 +122,11 @@ jobs:
${{ if eq(parameters.agentOs, 'Windows') }}:
${{ if eq(variables['System.TeamProject'], 'public') }}:
name: NetCore1ESPool-Public
- ${{ if ne(parameters.isAzDOTestingJob, true) }}:
- # Visual Studio Build Tools
- demands: ImageOverride -equals Build.Server.Amd64.VS2019.BT.Open
- ${{ if eq(parameters.isAzDOTestingJob, true) }}:
- # Visual Studio Enterprise - contains some stuff, like SQL Server and IIS Express, that we use for testing
- demands: ImageOverride -equals Build.Server.Amd64.VS2019.Open
+ demands: ImageOverride -equals 1es-windows-2022-open
${{ if eq(variables['System.TeamProject'], 'internal') }}:
name: NetCore1ESPool-Internal
# Visual Studio Enterprise - contains some stuff, like SQL Server and IIS Express, that we use for testing
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals 1es-windows-2022
${{ if ne(parameters.container, '') }}:
container: ${{ parameters.container }}
${{ if ne(parameters.disableComponentGovernance, '') }}:
@@ -165,8 +162,8 @@ jobs:
- script: df -h
displayName: Disk size
- ${{ if eq(parameters.agentOs, 'macOS') }}:
- - script: sudo xcode-select -s /Applications/Xcode_12.2.app/Contents/Developer
- displayName: Use XCode 12.2
+ - script: sudo xcode-select -s /Applications/Xcode_12.5.1.app/Contents/Developer
+ displayName: Use XCode 12.5.1
- checkout: self
clean: true
- ${{ if and(eq(parameters.agentOs, 'Windows'), eq(parameters.isAzDOTestingJob, true)) }}:
diff --git a/.azure/pipelines/localization.yml b/.azure/pipelines/localization.yml
new file mode 100644
index 0000000000..544f8ca1bb
--- /dev/null
+++ b/.azure/pipelines/localization.yml
@@ -0,0 +1,28 @@
+#
+# See https://docs.microsoft.com/en-us/vsts/pipelines/yaml-schema for details on this file.
+#
+
+schedules:
+# Cron timezone is UTC.
+- cron: "0 18 * * *"
+ displayName: Run tests daily at 6 PM UTC (11 AM PT)
+ branches:
+ include:
+ - main
+ always: true
+
+# Do not run in PR builds nor support other triggers.
+pr: none
+trigger: none
+
+variables:
+- name: _TeamName
+ value: AspNetCore
+
+jobs:
+- ${{ if and(ne(variables['System.TeamProject'], 'public'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) }}:
+ - template: /eng/common/templates/job/onelocbuild.yml
+ parameters:
+ LclPackageId: 'LCL-JUNO-PROD-ASPNETCORE'
+ LclSource: lclFilesFromPackage
+ MirrorRepo: aspnetcore
diff --git a/.config/CredScanSuppressions.json b/.config/CredScanSuppressions.json
index 278b3b79c9..ea43bfc6d7 100644
--- a/.config/CredScanSuppressions.json
+++ b/.config/CredScanSuppressions.json
@@ -158,6 +158,22 @@
"_justification": "Legitimate key file used for testing"
},
{
+ "file": "\\src\\Servers\\Kestrel\\shared\\test\\TestCertificates\\intermediate2_ca.key",
+ "_justification": "Legitimate key file used for testing"
+ },
+ {
+ "file": "\\src\\Servers\\Kestrel\\shared\\test\\TestCertificates\\intermediate_ca.key",
+ "_justification": "Legitimate key file used for testing"
+ },
+ {
+ "file": "\\src\\Servers\\Kestrel\\shared\\test\\TestCertificates\\leaf.com.key",
+ "_justification": "Legitimate key file used for testing"
+ },
+ {
+ "file": "\\src\\Servers\\Kestrel\\shared\\test\\TestCertificates\\root_ca.key",
+ "_justification": "Legitimate key file used for testing"
+ },
+ {
"file": "\\src\\SignalR\\clients\\ts\\FunctionalTests\\node_modules\\https-proxy-agent\\node_modules\\agent-base\\test\\ssl-cert-snakeoil.key",
"_justification": "Legitimate key file used for testing"
}
diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json
deleted file mode 100644
index 00a32e6c11..0000000000
--- a/.config/dotnet-tools.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "version": 1,
- "isRoot": true,
- "tools": {
- "dotnet-serve": {
- "version": "1.8.15",
- "commands": [
- "dotnet-serve"
- ]
- },
- "Microsoft.Playwright.CLI": {
- "version": "1.2.2",
- "commands": [
- "playwright"
- ]
- }
- }
-}
diff --git a/.editorconfig b/.editorconfig
index 06b74cd958..c532bc0d1f 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -77,6 +77,9 @@ charset = utf-8-bom
[*.{cs,vb}]
+# SYSLIB1054: Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time
+dotnet_diagnostic.SYSLIB1054.severity = warning
+
# CA1018: Mark attributes with AttributeUsageAttribute
dotnet_diagnostic.CA1018.severity = warning
@@ -178,6 +181,9 @@ dotnet_diagnostic.CA1846.severity = warning
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = warning
+# CA1852: Seal internal types
+dotnet_diagnostic.CA1852.severity = warning
+
# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = warning
@@ -302,6 +308,8 @@ dotnet_diagnostic.CA1845.severity = suggestion
dotnet_diagnostic.CA1846.severity = suggestion
# CA1847: Use string.Contains(char) instead of string.Contains(string) with single characters
dotnet_diagnostic.CA1847.severity = suggestion
+# CA1852: Seal internal types
+dotnet_diagnostic.CA1852.severity = suggestion
# CA2007: Consider calling ConfigureAwait on the awaited task
dotnet_diagnostic.CA2007.severity = suggestion
# CA2008: Do not create tasks without passing a TaskScheduler
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index fb9da1cada..b62b25e49f 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -2,6 +2,7 @@
# See https://help.github.com/articles/about-code-owners/
* @Pilchie
+/**/PublicAPI.*Shipped.txt @dotnet/aspnet-api-review
/global.json @dotnet/aspnet-build @dougbu @wtgodbe
/.azure/ @dotnet/aspnet-build @dougbu @wtgodbe
/.azuredevops/ @dotnet/aspnet-build @dougbu @wtgodbe
@@ -36,7 +37,9 @@
/src/Middleware/ @tratcher @BrennanConroy
/src/Middleware/**/PublicAPI.*Shipped.txt @dotnet/aspnet-api-review @tratcher @BrennanConroy
/src/Mvc/ @dotnet/aspnet-blazor-eng
+/src/Mvc/Mvc.ApiExplorer @captainsafia @halter73 @brunolins16
/src/Mvc/**/PublicAPI.*Shipped.txt @dotnet/aspnet-api-review @dotnet/aspnet-blazor-eng
+/src/OpenApi @captainsafia @dotnet/minimal-apis
/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/ @dotnet/aspnet-blazor-eng
/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/ @dotnet/aspnet-blazor-eng
/src/Security/ @tratcher
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index 0cc0833769..7c997be9c0 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -12,6 +12,9 @@ contact_links:
- name: Issue with Entity Framework Core
url: https://github.com/dotnet/efcore/issues/new/choose
about: Please open issues relating to Entity Framework Core in dotnet/efcore.
+ - name: Issue with Razor compiler
+ url: https://github.com/dotnet/razor-compiler/issues/new/choose
+ about: Please open issues relating to the Razor compiler in dotnet/razor-compiler.
- name: Issue with Roslyn compiler
url: https://github.com/dotnet/roslyn/issues/new/choose
about: Please open issues relating to the Roslyn .NET compiler in dotnet/roslyn.
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 92de755b7a..902c5873c3 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -13,15 +13,15 @@ updates:
include: scope
labels:
- area-infrastructure
- - package-ecosystem: "github-actions"
- directory: "/"
- schedule:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
# Weekly interval opens PRs on Monday.
interval: "weekly"
- commit-message:
- prefix: "[main] "
- include: scope
- labels:
+ commit-message:
+ prefix: "[main] "
+ include: scope
+ labels:
- area-infrastructure
# Keep submodules up to date in 'release/*' branches. (Unfortunately Dependabot security PRs can't target these.)
@@ -57,18 +57,6 @@ updates:
allow:
- dependency-type: "all"
commit-message:
- prefix: "[release/5.0] "
- include: scope
- labels:
- - area-infrastructure
- target-branch: "release/5.0"
- - package-ecosystem: "gitsubmodule"
- directory: "/"
- schedule:
- interval: "monthly"
- allow:
- - dependency-type: "all"
- commit-message:
prefix: "[release/6.0] "
include: scope
labels:
diff --git a/.github/fabricbot.json b/.github/fabricbot.json
index 38bad4d89c..841c49e363 100644
--- a/.github/fabricbot.json
+++ b/.github/fabricbot.json
@@ -1,2368 +1,2318 @@
-[
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
+{
+ "version": "1.0",
+ "tasks": [
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssueCommentResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "created"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Status: No Recent Activity"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Needs: Author Feedback"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 7
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isCloseAndComment",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": {
+ "type": "author"
+ }
+ }
+ },
+ {
+ "name": "activitySenderHasPermissions",
+ "parameters": {
+ "permissions": "none"
}
- ]
- },
- {
- "name": "isAction",
- "parameters": {
- "action": "created"
}
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issue_comment"
+ ],
+ "taskName": "[Idle Issue Management] For issues closed due to inactivity, re-open an issue if issue author posts a reply within 7 days.",
+ "actions": [
+ {
+ "name": "reopenIssue",
+ "parameters": {}
},
{
- "name": "hasLabel",
+ "name": "removeLabel",
"parameters": {
"label": "Status: No Recent Activity"
}
},
{
- "name": "hasLabel",
+ "name": "removeLabel",
"parameters": {
"label": "Needs: Author Feedback"
}
},
{
- "operator": "not",
- "operands": [
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 7
+ "name": "addLabel",
+ "parameters": {
+ "label": "Needs: Attention :wave:"
+ }
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssueCommentResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "created"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
}
+ ]
+ },
+ {
+ "name": "activitySenderHasPermissions",
+ "parameters": {
+ "permissions": "none"
}
- ]
+ },
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 7
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isCloseAndComment",
+ "parameters": {}
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issue_comment"
+ ],
+ "taskName": "[Closed Issue Management] For issues closed with no activity over 7 days, ask non-contributor to consider opening a new issue instead.",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hello lovely human, thank you for your comment on this issue. Because this issue has been closed for a period of time, please strongly consider opening a new issue linking to this issue instead to ensure better visibility of your comment. Thank you!\n\nSee [our Issue Management Policies](https://aka.ms/aspnet/issue-policies) for more information."
+ }
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "frequency": [
+ {
+ "weekDay": 0,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isCloseAndComment",
- "parameters": {}
- }
- ]
+ "weekDay": 1,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
},
{
- "name": "isActivitySender",
+ "weekDay": 2,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 6,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isClosed",
+ "parameters": {}
+ },
+ {
+ "name": "noActivitySince",
"parameters": {
- "user": {
- "type": "author"
- }
+ "days": 30
}
},
{
- "name": "activitySenderHasPermissions",
+ "name": "isUnlocked",
+ "parameters": {}
+ },
+ {
+ "name": "isIssue",
+ "parameters": {}
+ },
+ {
+ "name": "noLabel",
+ "parameters": {
+ "label": "Bot: Do Not Lock"
+ }
+ }
+ ],
+ "taskName": "[Closed Issue Management] Lock issues closed without activity for over 30 days",
+ "actions": [
+ {
+ "name": "lockIssue",
"parameters": {
- "permissions": "none"
+ "reason": "resolved"
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "taskName": "[Idle Issue Management] For issues closed due to inactivity, re-open an issue if issue author posts a reply within 7 days.",
- "actions": [
- {
- "name": "reopenIssue",
- "parameters": {}
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssueCommentResponder",
+ "version": "1.0",
+ "config": {
+ "taskName": "[Idle Issue Management] Replace needs author feedback label with needs attention label when the author comments on an issue",
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "created"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Needs: Author Feedback"
+ }
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Author: Migration Bot :robot:"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "activitySenderHasPermissions",
+ "parameters": {
+ "permissions": "write"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": {
+ "type": "author"
+ }
+ }
+ }
+ ]
+ }
+ ]
},
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
+ "actions": [
+ {
+ "name": "addLabel",
+ "parameters": {
+ "label": "Needs: Attention :wave:"
+ }
+ },
+ {
+ "name": "removeLabel",
+ "parameters": {
+ "label": "Needs: Author Feedback"
+ }
}
+ ],
+ "eventType": "issue",
+ "eventNames": [
+ "issue_comment"
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "taskName": "[Closed Issue Management] Remove no recent activity label from issues",
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "closed"
+ }
+ }
+ ]
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Status: No Recent Activity"
+ }
+ }
+ ]
},
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Needs: Author Feedback"
+ "actions": [
+ {
+ "name": "removeLabel",
+ "parameters": {
+ "label": "Status: No Recent Activity"
+ }
}
+ ],
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssueCommentResponder",
+ "version": "1.0",
+ "config": {
+ "taskName": "[Idle Issue Management] Remove no recent activity label when an issue is commented on",
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Status: No Recent Activity"
+ }
+ }
+ ]
},
- {
- "name": "addLabel",
- "parameters": {
- "label": "Needs: Attention :wave:"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "actions": [
{
- "name": "isAction",
+ "name": "removeLabel",
"parameters": {
- "action": "created"
+ "label": "Status: No Recent Activity"
}
+ }
+ ],
+ "eventType": "issue",
+ "eventNames": [
+ "issue_comment"
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "taskName": "[Idle Issue Management] Close stale issues",
+ "frequency": [
+ {
+ "weekDay": 1,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ]
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- }
+ "weekDay": 2,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
]
},
{
- "name": "activitySenderHasPermissions",
- "parameters": {
- "permissions": "none"
- }
+ "weekDay": 3,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ]
},
{
- "name": "noActivitySince",
- "parameters": {
- "days": 7
- }
+ "weekDay": 4,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ]
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isCloseAndComment",
- "parameters": {}
- }
+ "weekDay": 5,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
]
}
- ]
- },
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ],
- "taskName": "[Closed Issue Management] For issues closed with no activity over 7 days, ask non-contributor to consider opening a new issue instead.",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hello lovely human, thank you for your comment on this issue. Because this issue has been closed for a period of time, please strongly consider opening a new issue linking to this issue instead to ensure better visibility of your comment. Thank you!\n\nSee [our Issue Management Policies](https://aka.ms/aspnet/issue-policies) for more information."
- }
- }
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "frequency": [
- {
- "weekDay": 0,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 1,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 2,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 3,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 4,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 5,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 6,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- }
- ],
- "searchTerms": [
- {
- "name": "isClosed",
- "parameters": {}
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 30
- }
- },
- {
- "name": "isUnlocked",
- "parameters": {}
- },
- {
- "name": "isIssue",
- "parameters": {}
- },
- {
- "name": "noLabel",
- "parameters": {
- "label": "Bot: Do Not Lock"
- }
- }
- ],
- "taskName": "[Closed Issue Management] Lock issues closed without activity for over 30 days",
- "actions": [
- {
- "name": "lockIssue",
- "parameters": {
- "reason": "resolved"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Idle Issue Management] Replace needs author feedback label with needs attention label when the author comments on an issue",
- "conditions": {
- "operator": "and",
- "operands": [
+ ],
+ "searchTerms": [
+ {
+ "name": "isIssue",
+ "parameters": {}
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
{
- "name": "isAction",
+ "name": "hasLabel",
"parameters": {
- "action": "created"
+ "label": "Needs: Author Feedback"
}
},
{
"name": "hasLabel",
"parameters": {
- "label": "Needs: Author Feedback"
+ "label": "Status: No Recent Activity"
}
},
{
- "name": "isOpen",
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 3
+ }
+ }
+ ],
+ "actions": [
+ {
+ "name": "closeIssue",
"parameters": {}
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "taskName": "[Idle Issue Management] Add no recent activity label to issues",
+ "frequency": [
+ {
+ "weekDay": 1,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ]
},
{
- "operator": "or",
- "operands": [
- {
- "operator": "and",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "Author: Migration Bot :robot:"
- }
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "activitySenderHasPermissions",
- "parameters": {
- "permissions": "write"
- }
- }
- ]
- }
- ]
- },
- {
- "name": "isActivitySender",
- "parameters": {
- "user": {
- "type": "author"
- }
- }
- }
+ "weekDay": 2,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
]
- }
- ]
- },
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "Needs: Attention :wave:"
- }
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Needs: Author Feedback"
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Closed Issue Management] Remove no recent activity label from issues",
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isAction",
- "parameters": {
- "action": "closed"
- }
- }
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ]
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
+ ]
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 0,
+ 1,
+ 2,
+ 3,
+ 4,
+ 5,
+ 6,
+ 7,
+ 8,
+ 9,
+ 10,
+ 11,
+ 12,
+ 13,
+ 14,
+ 15,
+ 16,
+ 17,
+ 18,
+ 19,
+ 20,
+ 21,
+ 22,
+ 23
]
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isIssue",
+ "parameters": {}
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
},
{
"name": "hasLabel",
"parameters": {
+ "label": "Needs: Author Feedback"
+ }
+ },
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 4
+ }
+ },
+ {
+ "name": "noLabel",
+ "parameters": {
"label": "Status: No Recent Activity"
}
}
- ]
- },
- "actions": [
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssueCommentResponder",
- "version": "1.0",
- "config": {
- "taskName": "[Idle Issue Management] Remove no recent activity label when an issue is commented on",
- "conditions": {
- "operator": "and",
- "operands": [
+ ],
+ "actions": [
{
- "name": "hasLabel",
+ "name": "addLabel",
"parameters": {
"label": "Status: No Recent Activity"
}
+ },
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **4 days**. It will be closed if no further activity occurs **within 3 days of this comment**. If it *is* closed, feel free to comment when you are able to provide the additional information and we will re-investigate.\n\nSee [our Issue Management Policies](https://aka.ms/aspnet/issue-policies) for more information."
+ }
}
]
- },
- "actions": [
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
- }
- }
- ],
- "eventType": "issue",
- "eventNames": [
- "issue_comment"
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "taskName": "[Idle Issue Management] Close stale issues",
- "frequency": [
- {
- "weekDay": 1,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 2,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 3,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 4,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 5,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- }
- ],
- "searchTerms": [
- {
- "name": "isIssue",
- "parameters": {}
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "Needs: Author Feedback"
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "taskName": "[Resolved Issue Management] Close resolved issues",
+ "frequency": [
+ {
+ "weekDay": 0,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 1,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 2,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 6,
+ "hours": [
+ 2,
+ 5,
+ 8,
+ 11,
+ 14,
+ 17,
+ 20,
+ 23
+ ],
+ "timezoneOffset": -8
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isIssue",
+ "parameters": {}
+ },
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Status: Resolved"
+ }
+ },
+ {
+ "name": "noActivitySince",
+ "parameters": {
+ "days": 1
+ }
}
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 3
+ ],
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "This issue has been resolved and has not had any activity for **1 day**. It will be closed for housekeeping purposes.\n\nSee [our Issue Management Policies](https://aka.ms/aspnet/issue-policies) for more information."
+ }
+ },
+ {
+ "name": "closeIssue",
+ "parameters": {}
}
- }
- ],
- "actions": [
- {
- "name": "closeIssue",
- "parameters": {}
- }
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "taskName": "[Idle Issue Management] Add no recent activity label to issues",
- "frequency": [
- {
- "weekDay": 1,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 2,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 3,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 4,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
- ]
- },
- {
- "weekDay": 5,
- "hours": [
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- 10,
- 11,
- 12,
- 13,
- 14,
- 15,
- 16,
- 17,
- 18,
- 19,
- 20,
- 21,
- 22,
- 23
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "vsfeedback"
+ }
+ },
+ {
+ "name": "bodyContains",
+ "parameters": {
+ "bodyPattern": "Copied from original issue"
+ }
+ }
+ ]
+ }
]
- }
- ],
- "searchTerms": [
- {
- "name": "isIssue",
- "parameters": {}
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "Needs: Author Feedback"
- }
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 4
- }
},
- {
- "name": "noLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
- }
- }
- ],
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
- }
- },
- {
- "name": "addReply",
- "parameters": {
- "comment": "This issue has been automatically marked as stale because it has been marked as requiring author feedback but has not had any activity for **4 days**. It will be closed if no further activity occurs **within 3 days of this comment**. If it *is* closed, feel free to comment when you are able to provide the additional information and we will re-investigate.\n\nSee [our Issue Management Policies](https://aka.ms/aspnet/issue-policies) for more information."
- }
- }
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "taskName": "[Resolved Issue Management] Close resolved issues",
- "frequency": [
- {
- "weekDay": 0,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 1,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 2,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 3,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 4,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 5,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 6,
- "hours": [
- 2,
- 5,
- 8,
- 11,
- 14,
- 17,
- 20,
- 23
- ],
- "timezoneOffset": -8
- }
- ],
- "searchTerms": [
- {
- "name": "isIssue",
- "parameters": {}
- },
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "Status: Resolved"
- }
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 1
- }
- }
- ],
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "This issue has been resolved and has not had any activity for **1 day**. It will be closed for housekeeping purposes.\n\nSee [our Issue Management Policies](https://aka.ms/aspnet/issue-policies) for more information."
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Migration Bots] Tag issues opened by migration bots",
+ "actions": [
+ {
+ "name": "addLabel",
+ "parameters": {
+ "label": "Author: Migration Bot :robot:"
+ }
}
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "Discussions"
+ }
+ }
+ ]
},
- {
- "name": "closeIssue",
- "parameters": {}
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Discussions Management] Remove Workflow Labels when moved to Discussions",
+ "actions": [
{
- "name": "isAction",
+ "name": "removeLabel",
"parameters": {
- "action": "opened"
+ "label": "Needs: Author Feedback"
}
},
{
- "operator": "or",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "vsfeedback"
- }
- },
- {
- "name": "bodyContains",
- "parameters": {
- "bodyPattern": "Copied from original issue"
- }
- }
- ]
- }
- ]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "[Migration Bots] Tag issues opened by migration bots",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "Author: Migration Bot :robot:"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "addedToMilestone",
+ "name": "removeLabel",
"parameters": {
- "milestoneName": "Discussions"
+ "label": "Status: No Recent Activity"
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "[Discussions Management] Remove Workflow Labels when moved to Discussions",
- "actions": [
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Needs: Author Feedback"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "dotnet-maestro[bot]",
+ "association": "CONTRIBUTOR"
+ }
+ },
+ {
+ "name": "titleContains",
+ "parameters": {
+ "titlePattern": "Update dependencies"
+ }
+ }
+ ]
},
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Status: No Recent Activity"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Infrastructure PRs] Add area-infrastructure label to dependency update Pull Requests",
+ "actions": [
{
- "name": "isAction",
+ "name": "addLabel",
"parameters": {
- "action": "opened"
+ "label": "area-infrastructure"
}
},
{
- "name": "isActivitySender",
+ "name": "addLabel",
"parameters": {
- "user": "dotnet-maestro[bot]",
- "association": "CONTRIBUTOR"
+ "label": "Type: Dependency Update :arrow_up_small:"
}
},
{
- "name": "titleContains",
+ "name": "approvePullRequest",
"parameters": {
- "titlePattern": "Update dependencies"
+ "comment": "Auto-approving dependency update."
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "[Infrastructure PRs] Add area-infrastructure label to dependency update Pull Requests",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "area-infrastructure"
- }
- },
- {
- "name": "addLabel",
- "parameters": {
- "label": "Type: Dependency Update :arrow_up_small:"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "dotnet-maestro-bot"
+ }
+ },
+ {
+ "name": "titleContains",
+ "parameters": {
+ "titlePattern": "Merge branch"
+ }
+ }
+ ]
},
- {
- "name": "approvePullRequest",
- "parameters": {
- "comment": "Auto-approving dependency update."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Infrastructure PRs] Add area-infrastructure label to auto-merge Pull Requests",
+ "actions": [
{
- "name": "isAction",
+ "name": "addLabel",
"parameters": {
- "action": "opened"
+ "label": "area-infrastructure"
}
},
{
- "name": "isActivitySender",
+ "name": "addLabel",
"parameters": {
- "user": "dotnet-maestro-bot"
+ "label": "Type: Merge Forward :fast_forward:"
}
},
{
- "name": "titleContains",
+ "name": "approvePullRequest",
"parameters": {
- "titlePattern": "Merge branch"
+ "comment": "Auto-approving branch merge."
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "[Infrastructure PRs] Add area-infrastructure label to auto-merge Pull Requests",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "area-infrastructure"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": ":heavy_check_mark: Resolution: Answered"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": ":heavy_check_mark: Resolution: By Design"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": ":heavy_check_mark: Resolution: Duplicate"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": ":heavy_check_mark: Resolution: Won't Fix"
+ }
+ }
+ ]
},
- {
- "name": "addLabel",
- "parameters": {
- "label": "Type: Merge Forward :fast_forward:"
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Resolved Issue Management] Apply Resolved label",
+ "actions": [
+ {
+ "name": "addLabel",
+ "parameters": {
+ "label": "Status: Resolved"
+ }
}
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "prIncludesModifiedFile",
+ "parameters": {
+ "pathFilter": "src/Shared/Runtime"
+ }
+ }
+ ]
+ }
+ ]
},
- {
- "name": "approvePullRequest",
- "parameters": {
- "comment": "Auto-approving branch merge."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "or",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Shared Code PRs] Flag PRs that affect shared code src/Shared/Runtime",
+ "actions": [
{
- "name": "labelAdded",
+ "name": "addReply",
"parameters": {
- "label": ":heavy_check_mark: Resolution: Answered"
+ "comment": "Greetings human! You've submitted a PR that modifies code that is shared with https://github.com/dotnet/runtime . Please make sure you synchronize this code with the changes in that repo!"
}
},
{
- "name": "labelAdded",
+ "name": "addLabel",
"parameters": {
- "label": ":heavy_check_mark: Resolution: By Design"
+ "label": "Attention: Shared Code Modified"
}
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "frequency": [
+ {
+ "weekDay": 0,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
},
{
- "name": "labelAdded",
+ "weekDay": 1,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 2,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 6,
+ "hours": [
+ 0,
+ 6,
+ 12,
+ 18
+ ],
+ "timezoneOffset": -8
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "isIssue",
+ "parameters": {}
+ },
+ {
+ "name": "isPartOfMilestone",
"parameters": {
- "label": ":heavy_check_mark: Resolution: Duplicate"
+ "label": "question",
+ "milestone": "Discussions"
}
},
{
- "name": "labelAdded",
+ "name": "noActivitySince",
"parameters": {
- "label": ":heavy_check_mark: Resolution: Won't Fix"
+ "days": 60
+ }
+ },
+ {
+ "name": "noLabel",
+ "parameters": {
+ "label": "announcement"
}
}
- ]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "[Resolved Issue Management] Apply Resolved label",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "Status: Resolved"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ ],
+ "taskName": "[Discussions Management] Closed with no activity",
+ "actions": [
{
- "name": "isAction",
+ "name": "addReply",
"parameters": {
- "action": "opened"
+ "comment": "Thank you for contacting us. Due to a lack of activity on this discussion issue we're closing it in an effort to keep our backlog clean. If you believe there is a concern related to the ASP.NET Core framework, which hasn't been addressed yet, please file a new issue.\n\nThis issue will be locked after 30 more days of inactivity. If you still wish to discuss this subject after then, please create a new issue!"
}
},
{
- "operator": "or",
- "operands": [
- {
- "name": "prIncludesModifiedFile",
- "parameters": {
- "pathFilter": "src/Shared/Runtime"
- }
- }
- ]
+ "name": "closeIssue",
+ "parameters": {}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "[Shared Code PRs] Flag PRs that affect shared code src/Shared/Runtime",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Greetings human! You've submitted a PR that modifies code that is shared with https://github.com/dotnet/runtime . Please make sure you synchronize this code with the changes in that repo!"
- }
- },
- {
- "name": "addLabel",
- "parameters": {
- "label": "Attention: Shared Code Modified"
- }
- }
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "frequency": [
- {
- "weekDay": 0,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 1,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 2,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 3,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 4,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 5,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 6,
- "hours": [
- 0,
- 6,
- 12,
- 18
- ],
- "timezoneOffset": -8
- }
- ],
- "searchTerms": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "name": "isIssue",
- "parameters": {}
- },
- {
- "name": "isPartOfMilestone",
- "parameters": {
- "label": "question",
- "milestone": "Discussions"
- }
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 60
- }
- },
- {
- "name": "noLabel",
- "parameters": {
- "label": "announcement"
- }
- }
- ],
- "taskName": "[Discussions Management] Closed with no activity",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Thank you for contacting us. Due to a lack of activity on this discussion issue we're closing it in an effort to keep our backlog clean. If you believe there is a concern related to the ASP.NET Core framework, which hasn't been addressed yet, please file a new issue.\n\nThis issue will be locked after 30 more days of inactivity. If you still wish to discuss this subject after then, please create a new issue!"
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "PrAutoLabel",
+ "subCapability": "Path",
+ "version": "1.0",
+ "config": {
+ "taskName": "[PR Labelling] Apply `area-` labels to PRs",
+ "configs": [
+ {
+ "label": "area-blazor",
+ "pathFilter": [
+ "src/Components/",
+ "src/ProjectTemplates/BlazorWasm.ProjectTemplates/"
+ ]
+ },
+ {
+ "label": "area-commandlinetools",
+ "pathFilter": [
+ "src/Tools/"
+ ]
+ },
+ {
+ "label": "area-dataprotection",
+ "pathFilter": [
+ "src/DataProtection/"
+ ]
+ },
+ {
+ "label": "area-identity",
+ "pathFilter": [
+ "src/Identity/"
+ ]
+ },
+ {
+ "label": "area-infrastructure",
+ "pathFilter": [
+ "global.json",
+ ".azure",
+ ".config",
+ ".github",
+ "eng",
+ "src/Framework/",
+ "src/Installers/"
+ ]
+ },
+ {
+ "label": "area-mvc",
+ "pathFilter": [
+ "src/ProjectTemplates/",
+ "src/Razor/",
+ "src/Mvc/Mvc.Localization/",
+ "src/Mvc/Mvc.DataAnnotations/",
+ "src/Mvc/Mvc.Razor.RuntimeCompilation/",
+ "src/Mvc/Mvc.Razor/",
+ "src/Mvc/Mvc.RazorPages/",
+ "src/Mvc/Mvc.TagHelpers/",
+ "src/Mvc/Mvc.ViewFeatures/"
+ ]
+ },
+ {
+ "label": "area-security",
+ "pathFilter": [
+ "src/Security/",
+ "src/Azure/AzureAD/"
+ ]
+ },
+ {
+ "label": "area-runtime",
+ "pathFilter": [
+ "src/Servers/",
+ "src/Http/",
+ "src/Azure/AzureAppServicesIntegration/",
+ "src/Azure/AzureAppServices.HostingStartup/",
+ "src/Middleware/",
+ "src/HttpClientFactory/",
+ "src/Hosting/",
+ "src/SiteExtensions/",
+ "src/DefaultBuilder/"
+ ]
+ },
+ {
+ "label": "area-signalr",
+ "pathFilter": [
+ "src/SignalR/"
+ ]
+ },
+ {
+ "label": "area-grpc",
+ "pathFilter": [
+ "src/Grpc/"
+ ]
+ },
+ {
+ "label": "area-web-frameworks",
+ "pathFilter": [
+ "src/Mvc/Mvc.Abstractions/",
+ "src/Mvc/Mvc.Analyzers/",
+ "src/Mvc/Mvc.Api.Analyzers/",
+ "src/Mvc/Mvc.ApiExplorer/",
+ "src/Mvc/Mvc.Core/",
+ "src/Mvc/Mvc.Cors/",
+ "src/Mvc/Mvc.Formatters.Json/",
+ "src/Mvc/Mvc.Formatters.Xml/",
+ "src/Mvc/Mvc.NewtonsoftJson/",
+ "src/Mvc/Mvc.Testing.Tasks/src/",
+ "src/Mvc/Mvc.Testing/",
+ "src/Mvc/Mvc/",
+ "src/OpenApi/",
+ "src/Mvc/perf/"
+ ]
}
- },
- {
- "name": "closeIssue",
- "parameters": {}
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "PrAutoLabel",
- "subCapability": "Path",
- "version": "1.0",
- "config": {
- "taskName": "[PR Labelling] Apply `area-` labels to PRs",
- "configs": [
- {
- "label": "area-blazor",
- "pathFilter": [
- "src/Components/",
- "src/ProjectTemplates/BlazorWasm.ProjectTemplates/"
- ]
- },
- {
- "label": "area-commandlinetools",
- "pathFilter": [
- "src/Tools/"
- ]
- },
- {
- "label": "area-dataprotection",
- "pathFilter": [
- "src/DataProtection/"
- ]
- },
- {
- "label": "area-identity",
- "pathFilter": [
- "src/Identity/"
- ]
- },
- {
- "label": "area-infrastructure",
- "pathFilter": [
- "global.json",
- ".azure",
- ".config",
- "eng",
- "src/Framework/",
- "src/Installers/"
- ]
- },
- {
- "label": "area-mvc",
- "pathFilter": [
- "src/ProjectTemplates/",
- "src/Razor/",
- "src/Mvc/Mvc.Localization/",
- "src/Mvc/Mvc.DataAnnotations/",
- "src/Mvc/Mvc.Razor.RuntimeCompilation/",
- "src/Mvc/Mvc.Razor/",
- "src/Mvc/Mvc.RazorPages/",
- "src/Mvc/Mvc.TagHelpers/",
- "src/Mvc/Mvc.ViewFeatures/"
- ]
- },
- {
- "label": "area-security",
- "pathFilter": [
- "src/Security/",
- "src/Azure/AzureAD/"
- ]
- },
- {
- "label": "area-runtime",
- "pathFilter": [
- "src/Servers/",
- "src/Http/",
- "src/Azure/AzureAppServicesIntegration/",
- "src/Azure/AzureAppServices.HostingStartup/",
- "src/Middleware/",
- "src/HttpClientFactory/",
- "src/Hosting/",
- "src/SiteExtensions/",
- "src/DefaultBuilder/"
- ]
- },
- {
- "label": "area-signalr",
- "pathFilter": [
- "src/SignalR/"
- ]
- },
- {
- "label": "area-grpc",
- "pathFilter": [
- "src/Grpc/"
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "AutoMerge",
+ "subCapability": "AutoMerge",
+ "version": "1.0",
+ "config": {
+ "taskName": "Auto Merge PRs",
+ "label": "auto-merge",
+ "minMinutesOpen": "60",
+ "mergeType": "squash",
+ "removeLabelOnPush": true,
+ "conditionalMergeTypes": [
+ {
+ "mergeType": "merge",
+ "condition": {
+ "placeholder": "labels",
+ "operator": "contains",
+ "label_name": "Type: Merge Forward :fast_forward:"
+ }
+ }
+ ],
+ "deleteBranches": true
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "api-ready-for-review"
+ }
+ }
]
},
- {
- "label": "area-web-frameworks",
- "pathFilter": [
- "src/Mvc/Mvc.Abstractions/",
- "src/Mvc/Mvc.Analyzers/",
- "src/Mvc/Mvc.Api.Analyzers/",
- "src/Mvc/Mvc.ApiExplorer/",
- "src/Mvc/Mvc.Core/",
- "src/Mvc/Mvc.Cors/",
- "src/Mvc/Mvc.Formatters.Json/",
- "src/Mvc/Mvc.Formatters.Xml/",
- "src/Mvc/Mvc.NewtonsoftJson/",
- "src/Mvc/Mvc.Testing.Tasks/src/",
- "src/Mvc/Mvc.Testing/",
- "src/Mvc/Mvc/",
- "src/Mvc/perf/"
- ]
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "AutoMerge",
- "subCapability": "AutoMerge",
- "version": "1.0",
- "config": {
- "taskName": "Auto Merge PRs",
- "label": "auto-merge",
- "minMinutesOpen": "60",
- "mergeType": "squash",
- "removeLabelOnPush": true,
- "conditionalMergeTypes": [
- {
- "mergeType": "merge",
- "condition": {
- "placeholder": "labels",
- "operator": "contains",
- "label_name": "Type: Merge Forward :fast_forward:"
- }
- }
- ],
- "deleteBranches": true
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "labelAdded",
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[API Review] PR Marked Ready",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Thank you for your API proposal. I'm removing the `api-ready-for-review` label. API Proposals should be submitted for review through Issues based on [this](https://github.com/dotnet/aspnetcore/issues/new?assignees=&labels=api-suggestion&template=25_api_proposal.md&title=]) template."
+ }
+ },
+ {
+ "name": "removeLabel",
"parameters": {
"label": "api-ready-for-review"
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "[API Review] PR Marked Ready",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Thank you for your API proposal. I'm removing the `api-ready-for-review` label. API Proposals should be submitted for review through Issues based on [this](https://github.com/dotnet/aspnetcore/issues/new?assignees=&labels=api-suggestion&template=25_api_proposal.md&title=]) template."
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "Backlog"
+ }
+ }
+ ]
},
- {
- "name": "removeLabel",
- "parameters": {
- "label": "api-ready-for-review"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Comment: Issue moved to Backlog",
+ "actions": [
{
- "name": "addedToMilestone",
+ "name": "addReply",
"parameters": {
- "milestoneName": "Backlog"
+ "comment": "We've moved this issue to the Backlog milestone. This means that it is not going to be worked on for the coming release. We will reassess the backlog following the current release and consider this item at that time. To learn more about our issue management process and to have better expectation regarding different types of issues you can read our [Triage Process](https://github.com/dotnet/aspnetcore/blob/main/docs/TriageProcess.md)."
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Comment: Issue moved to Backlog",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "We've moved this issue to the Backlog milestone. This means that it is not going to be worked on for the coming release. We will reassess the backlog following the current release and consider this item at that time. To learn more about our issue management process and to have better expectation regarding different types of issues you can read our [Triage Process](https://github.com/dotnet/aspnetcore/blob/main/docs/TriageProcess.md)."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "addedToMilestone",
- "parameters": {
- "milestoneName": ".NET 7 Planning"
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": ".NET 7 Planning"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "investigate"
+ }
}
- },
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Comment when an investigation issue moved to .NET 7 Planning",
+ "actions": [
{
- "name": "hasLabel",
+ "name": "addReply",
"parameters": {
- "label": "investigate"
+ "comment": "Thanks for contacting us.\nWe're moving this issue to the `.NET 7 Planning` milestone for future evaluation / consideration. Because it's not immediately obvious that this is a bug in our framework, we would like to keep this around to collect more feedback, which can later help us determine the impact of it. We will re-evaluate this issue, during our next planning meeting(s). \nIf we later determine, that the issue has no community involvement, or it's very rare and low-impact issue, we will close it - so that the team can focus on more important and high impact issues.\nTo learn more about what to expect next and how this issue will be handled you can read more about our triage process [here](https://github.com/dotnet/aspnetcore/blob/main/docs/TriageProcess.md)."
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Comment when an investigation issue moved to .NET 7 Planning",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Thanks for contacting us.\nWe're moving this issue to the `.NET 7 Planning` milestone for future evaluation / consideration. Because it's not immediately obvious that this is a bug in our framework, we would like to keep this around to collect more feedback, which can later help us determine the impact of it. We will re-evaluate this issue, during our next planning meeting(s). \nIf we later determine, that the issue has no community involvement, or it's very rare and low-impact issue, we will close it - so that the team can focus on more important and high impact issues.\nTo learn more about what to expect next and how this issue will be handled you can read more about our triage process [here](https://github.com/dotnet/aspnetcore/blob/main/docs/TriageProcess.md)."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "closed"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Working"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Issue management: mark working issues as done when closed]",
+ "actions": [
{
- "name": "isAction",
+ "name": "addLabel",
"parameters": {
- "action": "closed"
+ "label": "Done"
}
},
{
- "name": "hasLabel",
+ "name": "removeLabel",
"parameters": {
"label": "Working"
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "[Issue management: mark working issues as done when closed]",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "Done"
- }
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Working"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestCommentResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isOpen",
- "parameters": {}
- }
- ]
- },
- {
- "name": "isAction",
- "parameters": {
- "action": "created"
- }
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isCloseAndComment",
- "parameters": {}
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestCommentResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "created"
}
- ]
- },
- {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "Tratcher"
- }
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "pranavkm"
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isCloseAndComment",
+ "parameters": {}
+ }
+ ]
+ },
+ {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "Tratcher"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "SteveSandersonMS"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "SteveSandersonMS"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "captainsafia"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "captainsafia"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "HaoK"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "HaoK"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "javiercn"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "javiercn"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "dougbu"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "dougbu"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "halter73"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "halter73"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "davidfowl"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "davidfowl"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "JamesNK"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "JamesNK"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "Pilchie"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "Pilchie"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "sebastienros"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "sebastienros"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "NTaylorMullen"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "NTaylorMullen"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "BrennanConroy"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "BrennanConroy"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "jkotalik"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "jkotalik"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "TanayParikh"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "TanayParikh"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "ryanbrandenburg"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "ryanbrandenburg"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "mkArtakMSFT"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "mkArtakMSFT"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "wtgodbe"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "wtgodbe"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "github-actions[bot]"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "github-actions[bot]"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "rafikiassumaniMSFT"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "rafikiassumaniMSFT"
+ }
}
- }
- ]
- },
- {
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "adityamandaleeka"
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "adityamandaleeka"
+ }
}
- }
- ]
- }
- ]
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "issue_comment"
+ ],
+ "taskName": "Comment on a closed PR",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hi @${contextualAuthor}. It looks like you just commented on a closed PR. The team will most probably miss it. If you'd like to bring something important up to their attention, consider filing a new issue and add enough details to build context."
+ }
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "issue_comment"
- ],
- "taskName": "Comment on a closed PR",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${contextualAuthor}. It looks like you just commented on a closed PR. The team will most probably miss it. If you'd like to bring something important up to their attention, consider filing a new issue and add enough details to build context."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "dotnet-maestro-bot"
+ }
+ },
+ {
+ "name": "titleContains",
+ "parameters": {
+ "titlePattern": "Merge branch"
+ }
+ },
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "main"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "[Infrastructure PRs] Add auto-merge label to branch merge Pull Requests in main",
+ "actions": [
{
- "name": "isAction",
+ "name": "addLabel",
"parameters": {
- "action": "opened"
+ "label": "auto-merge"
}
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "frequency": [
+ {
+ "weekDay": 0,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
},
{
- "name": "isActivitySender",
+ "weekDay": 1,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 2,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 6,
+ "hours": [
+ 1,
+ 4,
+ 7,
+ 10,
+ 13,
+ 16,
+ 19,
+ 22
+ ],
+ "timezoneOffset": -8
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "isPr",
+ "parameters": {}
+ },
+ {
+ "name": "hasLabel",
"parameters": {
- "user": "dotnet-maestro-bot"
+ "label": "pr: pending author input"
}
},
{
- "name": "titleContains",
+ "name": "noActivitySince",
"parameters": {
- "titlePattern": "Merge branch"
+ "days": 10
}
},
{
- "name": "prTargetsBranch",
+ "name": "noLabel",
"parameters": {
- "branchName": "main"
+ "label": "stale"
}
}
- ]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "[Infrastructure PRs] Add auto-merge label to branch merge Pull Requests in main",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "auto-merge"
- }
- }
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "frequency": [
- {
- "weekDay": 0,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 1,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 2,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 3,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 4,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 5,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 6,
- "hours": [
- 1,
- 4,
- 7,
- 10,
- 13,
- 16,
- 19,
- 22
- ],
- "timezoneOffset": -8
- }
- ],
- "searchTerms": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "name": "isPr",
- "parameters": {}
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "pr: pending author input"
- }
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 10
- }
- },
- {
- "name": "noLabel",
- "parameters": {
- "label": "stale"
- }
- }
- ],
- "taskName": "Stale PR reminder",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}.\nIt seems you haven't touched this PR for the last two weeks. To avoid accumulating old PRs, we're marking it as `stale`. As a result, it will be closed if no further activity occurs **within 4 days of this comment**. You can learn more about our Issue Management Policies [here](https://aka.ms/aspnet/issue-policies)."
- }
- },
- {
- "name": "addLabel",
- "parameters": {
- "label": "stale"
- }
- }
- ]
- }
- },
- {
- "taskType": "scheduled",
- "capabilityId": "ScheduledSearch",
- "subCapability": "ScheduledSearch",
- "version": "1.1",
- "config": {
- "frequency": [
- {
- "weekDay": 0,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 1,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 2,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 3,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 4,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 5,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- },
- {
- "weekDay": 6,
- "hours": [
- 1,
- 5,
- 9,
- 13,
- 17,
- 21
- ],
- "timezoneOffset": -8
- }
- ],
- "searchTerms": [
- {
- "name": "isOpen",
- "parameters": {}
- },
- {
- "name": "isPr",
- "parameters": {}
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "pr: pending author input"
- }
- },
- {
- "name": "noActivitySince",
- "parameters": {
- "days": 4
- }
- },
- {
- "name": "hasLabel",
- "parameters": {
- "label": "stale"
- }
- }
- ],
- "taskName": "Close stale PRs",
- "actions": [
- {
- "name": "closeIssue",
- "parameters": {}
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ ],
+ "taskName": "Stale PR reminder",
+ "actions": [
{
- "name": "hasLabel",
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hi @${issueAuthor}.\nIt seems you haven't touched this PR for the last two weeks. To avoid accumulating old PRs, we're marking it as `stale`. As a result, it will be closed if no further activity occurs **within 4 days of this comment**. You can learn more about our Issue Management Policies [here](https://aka.ms/aspnet/issue-policies)."
+ }
+ },
+ {
+ "name": "addLabel",
"parameters": {
"label": "stale"
}
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "scheduled",
+ "capabilityId": "ScheduledSearch",
+ "subCapability": "ScheduledSearch",
+ "version": "1.1",
+ "config": {
+ "frequency": [
+ {
+ "weekDay": 0,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 1,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 2,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 3,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 4,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 5,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ },
+ {
+ "weekDay": 6,
+ "hours": [
+ 1,
+ 5,
+ 9,
+ 13,
+ 17,
+ 21
+ ],
+ "timezoneOffset": -8
+ }
+ ],
+ "searchTerms": [
+ {
+ "name": "isOpen",
+ "parameters": {}
+ },
+ {
+ "name": "isPr",
+ "parameters": {}
},
{
"name": "hasLabel",
@@ -2371,927 +2321,1058 @@
}
},
{
- "name": "isActivitySender",
+ "name": "noActivitySince",
"parameters": {
- "user": {
- "type": "author"
- }
+ "days": 4
}
},
{
- "operator": "not",
- "operands": [
- {
- "name": "activitySenderHasPermissions",
- "parameters": {
- "permissions": "write"
- }
- }
- ]
- }
- ]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Revitalize stale PR and reopen",
- "actions": [
- {
- "name": "reopenIssue",
- "parameters": {}
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "stale"
- }
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "pr: pending author input"
- }
- },
- {
- "name": "reopenIssue",
- "parameters": {}
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "labelAdded",
+ "name": "hasLabel",
"parameters": {
- "label": "Needs: Author Feedback"
+ "label": "stale"
}
}
- ]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Replace `Needs Author Feedback` by `pr: pending author input` for PRs",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hello. I see that you've just added `Needs: Author Feedback` label to this PR.\nThat label is for Issues and not for PRs. Don't worry, I'm going to replace it with the correct one."
- }
- },
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Needs: Author Feedback"
+ ],
+ "taskName": "Close stale PRs",
+ "actions": [
+ {
+ "name": "closeIssue",
+ "parameters": {}
}
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "stale"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "pr: pending author input"
+ }
+ },
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": {
+ "type": "author"
+ }
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "activitySenderHasPermissions",
+ "parameters": {
+ "permissions": "write"
+ }
+ }
+ ]
+ }
+ ]
},
- {
- "name": "addLabel",
- "parameters": {
- "label": "pr: pending author input"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Revitalize stale PR and reopen",
+ "actions": [
{
- "name": "isAction",
- "parameters": {
- "action": "opened"
- }
+ "name": "reopenIssue",
+ "parameters": {}
},
{
- "name": "activitySenderHasPermissions",
+ "name": "removeLabel",
"parameters": {
- "permissions": "read"
+ "label": "stale"
}
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "dotnet-maestro"
- }
- }
- ]
+ "name": "removeLabel",
+ "parameters": {
+ "label": "pr: pending author input"
+ }
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isActivitySender",
- "parameters": {
- "user": "dotnet-maestro-bot "
- }
- }
- ]
+ "name": "reopenIssue",
+ "parameters": {}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Label community PRs with `community contribution` label",
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "community-contribution"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "Needs: Author Feedback"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Replace `Needs Author Feedback` by `pr: pending author input` for PRs",
+ "actions": [
{
- "name": "isAction",
+ "name": "addReply",
"parameters": {
- "action": "merged"
+ "comment": "Hello. I see that you've just added `Needs: Author Feedback` label to this PR.\nThat label is for Issues and not for PRs. Don't worry, I'm going to replace it with the correct one."
}
},
{
- "name": "prTargetsBranch",
+ "name": "removeLabel",
"parameters": {
- "branchName": "main"
- }
- }
- ]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "actions": [
- {
- "name": "addMilestone",
- "parameters": {
- "milestoneName": "7.0-preview4"
- }
- }
- ],
- "taskName": "Assign `Current Milestone` to PRs merged to main"
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "addedToProjectColumn",
- "parameters": {
- "projectName": " ASP.NET Core 7 Web UI",
- "columnName": "In Progress"
+ "label": "Needs: Author Feedback"
}
},
{
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "Working"
- }
- }
- ]
+ "name": "addLabel",
+ "parameters": {
+ "label": "pr: pending author input"
+ }
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "actions": [
- {
- "name": "addLabel",
- "parameters": {
- "label": "Working"
- }
- }
- ],
- "taskName": "Add `Working` label to items moved to `In Progress` column on the ` ASP.NET Core 7 Web UI` project"
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "activitySenderHasPermissions",
+ "parameters": {
+ "permissions": "read"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "dotnet-maestro"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isActivitySender",
+ "parameters": {
+ "user": "dotnet-maestro-bot "
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Label community PRs with `community contribution` label",
+ "actions": [
{
- "name": "addedToMilestone",
+ "name": "addLabel",
"parameters": {
- "milestoneName": ".NET 7 Planning"
+ "label": "community-contribution"
}
},
{
- "operator": "not",
- "operands": [
- {
- "name": "hasLabel",
- "parameters": {
- "label": "investigate"
- }
- }
- ]
+ "name": "addReply",
+ "parameters": {
+ "comment": "Thanks for your PR, @${issueAuthor}. Someone from the team will get assigned to your PR shortly and we'll get it reviewed."
+ }
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Comment when an issue is moved to `.NET 7 Planning` milestone",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Thanks for contacting us.\n\nWe're moving this issue to the `.NET 7 Planning` milestone for future evaluation / consideration. We would like to keep this around to collect more feedback, which can help us with prioritizing this work. We will re-evaluate this issue, during our next planning meeting(s). \nIf we later determine, that the issue has no community involvement, or it's very rare and low-impact issue, we will close it - so that the team can focus on more important and high impact issues.\nTo learn more about what to expect next and how this issue will be handled you can read more about our triage process [here](https://github.com/dotnet/aspnetcore/blob/main/docs/TriageProcess.md)."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "merged"
+ }
+ },
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "main"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "actions": [
+ {
+ "name": "addMilestone",
+ "parameters": {
+ "milestoneName": "8.0-alpha1"
+ }
+ }
+ ],
+ "taskName": "Assign `Current Milestone` to PRs merged to main"
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToProjectColumn",
+ "parameters": {
+ "projectName": " ASP.NET Core 7 Web UI",
+ "columnName": "In Progress"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Working"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "actions": [
{
- "name": "isAction",
+ "name": "addLabel",
"parameters": {
- "action": "labeled"
+ "label": "Working"
}
- },
+ }
+ ],
+ "taskName": "Add `Working` label to items moved to `In Progress` column on the ` ASP.NET Core 7 Web UI` project"
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": ".NET 7 Planning"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "investigate"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Comment when an issue is moved to `.NET 7 Planning` milestone",
+ "actions": [
{
- "name": "labelAdded",
+ "name": "addReply",
"parameters": {
- "label": "feature-blazor-debugging"
+ "comment": "Thanks for contacting us.\n\nWe're moving this issue to the `.NET 7 Planning` milestone for future evaluation / consideration. We would like to keep this around to collect more feedback, which can help us with prioritizing this work. We will re-evaluate this issue, during our next planning meeting(s). \nIf we later determine, that the issue has no community involvement, or it's very rare and low-impact issue, we will close it - so that the team can focus on more important and high impact issues.\nTo learn more about what to expect next and how this issue will be handled you can read more about our triage process [here](https://github.com/dotnet/aspnetcore/blob/main/docs/TriageProcess.md)."
}
- },
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "labeled"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "feature-blazor-debugging"
+ }
+ },
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "INTERNAL: Debug"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Provide Blazor WASM Debugging Troubleshooting link",
+ "actions": [
{
- "name": "hasLabel",
+ "name": "addReply",
"parameters": {
- "label": "INTERNAL: Debug"
+ "comment": "Thanks for contacting us.\nIt looks like this issue is related to debugging in Blazor WebAssembly application.\nBecause there are different components involved in providing debugging experience, we've put together a small troubleshooting guide that you can follow, to help us better understand where to direct this issue to, to get a faster resolution.\nYou can find it [here](https://docs.microsoft.com/en-us/aspnet/core/blazor/debug?view=aspnetcore-5.0&tabs=visual-studio#troubleshoot).\nIf these troubleshooting docs resolve your problem, please close the issue. Otherwise we'll follow up."
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Provide Blazor WASM Debugging Troubleshooting link",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Thanks for contacting us.\nIt looks like this issue is related to debugging in Blazor WebAssembly application.\nBecause there are different components involved in providing debugging experience, we've put together a small troubleshooting guide that you can follow, to help us better understand where to direct this issue to, to get a faster resolution.\nYou can find it [here](https://docs.microsoft.com/en-us/aspnet/core/blazor/debug?view=aspnetcore-5.0&tabs=visual-studio#troubleshoot).\nIf these troubleshooting docs resolve your problem, please close the issue. Otherwise we'll follow up."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "labelAdded",
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "api-ready-for-review"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "API Proposal Ready For Review",
+ "actions": [
+ {
+ "name": "addReply",
"parameters": {
- "label": "api-ready-for-review"
+ "comment": "Thank you for submitting this for API review. This will be reviewed by @dotnet/aspnet-api-review at the next meeting of the ASP.NET Core API Review group. Please ensure you take a look at [the API review process documentation](https://github.com/dotnet/aspnetcore/blob/main/docs/APIReviewProcess.md) and ensure that:\n\n* The PR contains changes to the reference-assembly that describe the API change. **Or**, you have included a snippet of reference-assembly-style code that illustrates the API change.\n* The PR describes the impact to users, both positive (useful new APIs) and negative (breaking changes).\n* Someone is assigned to \"champion\" this change in the meeting, and they understand the impact and design of the change."
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "API Proposal Ready For Review",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Thank you for submitting this for API review. This will be reviewed by @dotnet/aspnet-api-review at the next meeting of the ASP.NET Core API Review group. Please ensure you take a look at [the API review process documentation](https://github.com/dotnet/aspnetcore/blob/main/docs/APIReviewProcess.md) and ensure that:\n\n* The PR contains changes to the reference-assembly that describe the API change. **Or**, you have included a snippet of reference-assembly-style code that illustrates the API change.\n* The PR describes the impact to users, both positive (useful new APIs) and negative (breaking changes).\n* Someone is assigned to \"champion\" this change in the meeting, and they understand the impact and design of the change."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "merged"
+ }
+ },
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "release/6.0"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Assign milestone to PRs merged to \"release/6.0\"",
+ "actions": [
{
- "name": "isAction",
+ "name": "addMilestone",
"parameters": {
- "action": "merged"
+ "milestoneName": "6.0.2"
}
- },
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "Servicing-consider"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Use servicing template for `servicing-consider` issues",
+ "actions": [
{
- "name": "prTargetsBranch",
+ "name": "addReply",
"parameters": {
- "branchName": "release/6.0"
+ "comment": "Hi @${issueAuthor}. Please make sure you've updated the PR description to use the [Shiproom Template](https://aka.ms/aspnet/servicing/template). Also, make sure this PR is not marked as a draft and is ready-to-merge.\n\nTo learn more about how to prepare a servicing PR [click here](https://aka.ms/aspnet/servicing)."
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Assign milestone to PRs merged to \"release/6.0\"",
- "actions": [
- {
- "name": "addMilestone",
- "parameters": {
- "milestoneName": "6.0.2"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "labelAdded",
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "hasLabel",
+ "parameters": {
+ "label": "Servicing-consider"
+ }
+ },
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "Servicing-approved"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Remove the `Servicing-consider` label, when `Servicing-approved` label added",
+ "actions": [
+ {
+ "name": "removeLabel",
"parameters": {
"label": "Servicing-consider"
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Use servicing template for `servicing-consider` issues",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}. Please make sure you've updated the PR description to use the [Shiproom Template](https://aka.ms/aspnet/servicing/template). Also, make sure this PR is not marked as a draft and is ready-to-merge.\n\nTo learn more about how to prepare a servicing PR [click here](https://aka.ms/aspnet/servicing)."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "Needs: Author Feedback"
+ }
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add comment when 'Needs Author Feedback' is applied to issue",
+ "actions": [
{
- "name": "hasLabel",
+ "name": "addReply",
"parameters": {
- "label": "Servicing-consider"
+ "comment": "Hi @${issueAuthor}. We have added the \"Needs: Author Feedback\" label to this issue, which indicates that we have an open question for you before we can take further action. This issue will be closed automatically in 7 days if we do not hear back from you by then - please feel free to re-open it if you come back to this issue after that time."
}
- },
+ }
+ ]
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "6.0.x"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Servicing"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add 6.0 servicing issues to the servicing project board",
+ "actions": [
{
- "name": "labelAdded",
+ "name": "addToProject",
"parameters": {
- "label": "Servicing-approved"
+ "projectName": "Servicing",
+ "columnName": "6.0.x"
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Remove the `Servicing-consider` label, when `Servicing-approved` label added",
- "actions": [
- {
- "name": "removeLabel",
- "parameters": {
- "label": "Servicing-consider"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "labelAdded",
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "5.0.x"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Servicing"
+ }
+ }
+ ]
+ }
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add 5.0 servicing issues to the servicing project board",
+ "actions": [
+ {
+ "name": "addToProject",
"parameters": {
- "label": "Needs: Author Feedback"
+ "projectName": "Servicing",
+ "columnName": "5.0.x"
}
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Add comment when 'Needs Author Feedback' is applied to issue",
- "actions": [
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}. We have added the \"Needs: Author Feedback\" label to this issue, which indicates that we have an open question for you before we can take further action. This issue will be closed automatically in 7 days if we do not hear back from you by then - please feel free to re-open it if you come back to this issue after that time."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "addedToMilestone",
- "parameters": {
- "milestoneName": "6.0.x"
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "IssuesOnlyResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "3.1.x"
+ }
+ },
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Servicing"
+ }
+ }
+ ]
}
- },
+ ]
+ },
+ "eventType": "issue",
+ "eventNames": [
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add 3.1 servicing issues to the servicing project board",
+ "actions": [
{
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Servicing"
- }
- }
- ]
+ "name": "addToProject",
+ "parameters": {
+ "projectName": "Servicing",
+ "columnName": "3.1.x"
+ }
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Add 6.0 servicing issues to the servicing project board",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "6.0.x"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "addedToMilestone",
- "parameters": {
- "milestoneName": "5.0.x"
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "operator": "not",
+ "operands": [
+ {
+ "name": "isInProject",
+ "parameters": {
+ "projectName": "Servicing"
+ }
+ }
+ ]
+ },
+ {
+ "operator": "or",
+ "operands": [
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "6.0.x"
+ }
+ },
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "5.0.x"
+ }
+ },
+ {
+ "name": "addedToMilestone",
+ "parameters": {
+ "milestoneName": "3.1.x"
+ }
+ }
+ ]
}
- },
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add servicing PRs to the servicing project board",
+ "actions": [
{
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Servicing"
- }
- }
- ]
+ "name": "addToProject",
+ "parameters": {
+ "projectName": "Servicing",
+ "columnName": "In Progress"
+ }
}
]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Add 5.0 servicing issues to the servicing project board",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "5.0.x"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "IssuesOnlyResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "name": "addedToMilestone",
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "release/3.1"
+ }
+ },
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add release/3.1 targeting PRs to the servicing project",
+ "actions": [
+ {
+ "name": "addMilestone",
"parameters": {
"milestoneName": "3.1.x"
}
},
{
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Servicing"
- }
- }
- ]
- }
- ]
- },
- "eventType": "issue",
- "eventNames": [
- "issues",
- "project_card"
- ],
- "taskName": "Add 3.1 servicing issues to the servicing project board",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "3.1.x"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
- {
- "operator": "not",
- "operands": [
- {
- "name": "isInProject",
- "parameters": {
- "projectName": "Servicing"
- }
- }
- ]
+ "name": "addToProject",
+ "parameters": {
+ "projectName": "Servicing",
+ "columnName": "In Progress"
+ }
},
{
- "operator": "or",
- "operands": [
- {
- "name": "addedToMilestone",
- "parameters": {
- "milestoneName": "6.0.x"
- }
- },
- {
- "name": "addedToMilestone",
- "parameters": {
- "milestoneName": "5.0.x"
- }
- },
- {
- "name": "addedToMilestone",
- "parameters": {
- "milestoneName": "3.1.x"
- }
- }
- ]
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
+ }
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Add servicing PRs to the servicing project board",
- "actions": [
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "In Progress"
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "release/5.0"
+ }
+ }
+ ]
+ },
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add release/5.0 targeting PRs to the servicing project",
+ "actions": [
{
- "name": "prTargetsBranch",
+ "name": "addMilestone",
"parameters": {
- "branchName": "release/3.1"
+ "milestoneName": "5.0.x"
}
},
{
- "name": "isAction",
+ "name": "addToProject",
"parameters": {
- "action": "opened"
+ "projectName": "Servicing",
+ "columnName": "In Progress"
+ }
+ },
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Add release/3.1 targeting PRs to the servicing project",
- "actions": [
- {
- "name": "addMilestone",
- "parameters": {
- "milestoneName": "3.1.x"
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "In Progress"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "release/6.0"
+ }
+ }
+ ]
},
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add release/6.0 targeting PRs to the servicing project",
+ "actions": [
+ {
+ "name": "addMilestone",
+ "parameters": {
+ "milestoneName": "6.0.x"
+ }
+ },
{
- "name": "isAction",
+ "name": "addToProject",
"parameters": {
- "action": "opened"
+ "projectName": "Servicing",
+ "columnName": "In Progress"
}
},
{
- "name": "prTargetsBranch",
+ "name": "addReply",
"parameters": {
- "branchName": "release/5.0"
+ "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Add release/5.0 targeting PRs to the servicing project",
- "actions": [
- {
- "name": "addMilestone",
- "parameters": {
- "milestoneName": "5.0.x"
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "In Progress"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "opened"
+ }
+ },
+ {
+ "name": "prTargetsBranch",
+ "parameters": {
+ "branchName": "release/2.1"
+ }
+ }
+ ]
},
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add release/2.1 targeting PRs to the servicing project",
+ "actions": [
+ {
+ "name": "addMilestone",
+ "parameters": {
+ "milestoneName": "2.1.x"
+ }
+ },
{
- "name": "isAction",
+ "name": "addToProject",
"parameters": {
- "action": "opened"
+ "projectName": "Servicing",
+ "columnName": "In Progress"
}
},
{
- "name": "prTargetsBranch",
+ "name": "addReply",
"parameters": {
- "branchName": "release/6.0"
+ "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Add release/6.0 targeting PRs to the servicing project",
- "actions": [
- {
- "name": "addMilestone",
- "parameters": {
- "milestoneName": "6.0.x"
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "In Progress"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "area-infrastructure"
+ }
+ },
+ {
+ "name": "isAction",
+ "parameters": {
+ "action": "labeled"
+ }
+ }
+ ]
},
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
- }
- }
- ]
- }
- },
- {
- "taskType": "trigger",
- "capabilityId": "IssueResponder",
- "subCapability": "PullRequestResponder",
- "version": "1.0",
- "config": {
- "conditions": {
- "operator": "and",
- "operands": [
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Ping the build team on infrastructure issues",
+ "actions": [
{
- "name": "isAction",
+ "name": "addReply",
"parameters": {
- "action": "opened"
+ "comment": "Hey @dotnet/aspnet-build, looks like this PR is something you want to take a look at."
}
},
{
- "name": "prTargetsBranch",
+ "name": "assignToUser",
"parameters": {
- "branchName": "release/2.1"
+ "user": "aspnet-build"
}
}
]
- },
- "eventType": "pull_request",
- "eventNames": [
- "pull_request",
- "issues",
- "project_card"
- ],
- "taskName": "Add release/2.1 targeting PRs to the servicing project",
- "actions": [
- {
- "name": "addMilestone",
- "parameters": {
- "milestoneName": "2.1.x"
- }
- },
- {
- "name": "addToProject",
- "parameters": {
- "projectName": "Servicing",
- "columnName": "In Progress"
- }
+ }
+ },
+ {
+ "taskType": "trigger",
+ "capabilityId": "IssueResponder",
+ "subCapability": "PullRequestResponder",
+ "version": "1.0",
+ "config": {
+ "conditions": {
+ "operator": "and",
+ "operands": [
+ {
+ "name": "labelAdded",
+ "parameters": {
+ "label": "blog-candidate"
+ }
+ }
+ ]
},
- {
- "name": "addReply",
- "parameters": {
- "comment": "Hi @${issueAuthor}. If this is not a tell-mode PR, please make sure to follow the instructions laid out in the [servicing process](https://aka.ms/aspnet/servicing) document.\nOtherwise, please add `tell-mode` label."
+ "eventType": "pull_request",
+ "eventNames": [
+ "pull_request",
+ "issues",
+ "project_card"
+ ],
+ "taskName": "Add comment when blog-candidate label is added",
+ "actions": [
+ {
+ "name": "addReply",
+ "parameters": {
+ "comment": "@${issueAuthor}, this change will be considered for inclusion in the blog post for the release it'll ship in. Nice work!\n\nPlease ensure that the original comment in this thread contains a clear explanation of what the change does, why it's important (what problem does it solve?), and, if relevant, include things like code samples and/or performance numbers.\n\nThis content may not be exactly what goes into the blog post, but it will help the team putting together the announcement.\n\nThanks!"
+ }
}
- }
- ]
+ ]
+ }
}
- }
-]
+ ],
+ "userGroups": []
+}
diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml
index c4eef86470..3c87042454 100644
--- a/.github/workflows/backport.yml
+++ b/.github/workflows/backport.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-20.04
steps:
- name: Extract backport target branch
- uses: actions/github-script@v3
+ uses: actions/github-script@v6
id: target-branch-extractor
with:
result-encoding: string
@@ -28,18 +28,18 @@ jobs:
return target_branch[1];
- name: Post backport started comment to pull request
- uses: actions/github-script@v3
+ uses: actions/github-script@v6
with:
script: |
const backport_start_body = `Started backporting to ${{ steps.target-branch-extractor.outputs.result }}: https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${process.env.GITHUB_RUN_ID}`;
- await github.issues.createComment({
+ await github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: backport_start_body
});
- name: Checkout repo
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Run backport
diff --git a/.github/workflows/runtime-sync.yml b/.github/workflows/runtime-sync.yml
index 15896560d2..e80c233326 100644
--- a/.github/workflows/runtime-sync.yml
+++ b/.github/workflows/runtime-sync.yml
@@ -21,14 +21,14 @@ jobs:
runs-on: windows-latest
steps:
- name: Checkout aspnetcore
- uses: actions/checkout@v2.0.0
+ uses: actions/checkout@v3
with:
# Test this script using changes in a fork
repository: 'dotnet/aspnetcore'
path: aspnetcore
ref: main
- name: Checkout runtime
- uses: actions/checkout@v2.0.0
+ uses: actions/checkout@v3
with:
# Test this script using changes in a fork
repository: 'dotnet/runtime'
@@ -47,7 +47,7 @@ jobs:
mkdir ..\artifacts
git status > ..\artifacts\status.txt
git diff > ..\artifacts\diff.txt
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v3
with:
name: results
path: artifacts
diff --git a/.gitignore b/.gitignore
index 25e7ded856..5f426a1c8a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,16 +31,17 @@ modules/
*.snk
*.so
*.suo
+*.svclog
*.tlog
*.user
*.userprefs
*.vspx
# Specific files, typically generated by tools
+.config/dotnet-tools.json
msbuild.ProjectImports.zip
StyleCop.Cache
UpgradeLog.htm
.idea
-*.svclog
mono_crash.*.json
mono_crash.*.blob
diff --git a/.vsconfig b/.vsconfig
index 3dff770c10..e0fa83eab9 100644
--- a/.vsconfig
+++ b/.vsconfig
@@ -12,7 +12,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NetWeb",
diff --git a/AspNetCore.sln b/AspNetCore.sln
index 3ed16097b0..471d8bde4c 100644
--- a/AspNetCore.sln
+++ b/AspNetCore.sln
@@ -1,5 +1,4 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
+Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31606.5
MinimumVisualStudioVersion = 15.0.26124.0
@@ -249,24 +248,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Antifo
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Azure", "Azure", "{DFDEED51-6B9B-41B9-A684-9F3FFC07C9B4}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AzureAD", "AzureAD", "{2757D342-5E89-4C4B-9659-714AC8536FD4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authentication.AzureAD.UI", "Authentication.AzureAD.UI", "{CE6853C2-73AE-42EB-AD8C-2A094B2A4A36}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.AzureAD.UI", "src\Azure\AzureAD\Authentication.AzureAD.UI\src\Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj", "{42E30C98-1358-497F-960B-E1AA17F46704}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.AzureAD.UI.Test", "src\Azure\AzureAD\Authentication.AzureAD.UI\test\Microsoft.AspNetCore.Authentication.AzureAD.UI.Test.csproj", "{4870B11E-7F67-4757-BC9A-45E5895AC712}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authentication.AzureADB2C.UI", "Authentication.AzureADB2C.UI", "{B95A22C8-71B7-49DE-94B2-16402A36B914}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.AzureADB2C.UI", "src\Azure\AzureAD\Authentication.AzureADB2C.UI\src\Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj", "{600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test", "src\Azure\AzureAD\Authentication.AzureADB2C.UI\test\Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test.csproj", "{27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{16653D2A-AC79-44ED-B908-2EEB58684C50}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests", "src\Azure\AzureAD\test\FunctionalTests\Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests.csproj", "{B70B1843-4360-4731-9D5C-599189CC1198}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kestrel", "Kestrel", "{4FDDC525-4E60-4CAF-83A3-261C5B43721F}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Kestrel", "Kestrel", "{89472057-8BB2-44A8-B0FC-D9F3ADB1181C}"
@@ -996,9 +977,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.Client
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.DotNet.Web.ItemTemplates", "src\ProjectTemplates\Web.ItemTemplates\Microsoft.DotNet.Web.ItemTemplates.csproj", "{D0E73F40-0DA9-42A9-8A88-EED8D5EFBEFB}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProjectTemplates.Tests", "src\ProjectTemplates\test\ProjectTemplates.Tests.csproj", "{6DE03095-7EAC-41DF-8AE4-3018ED29BC61}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Tests", "src\ProjectTemplates\test\Templates.Tests\Templates.Tests.csproj", "{6DE03095-7EAC-41DF-8AE4-3018ED29BC61}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BlazorTemplates.Tests", "src\ProjectTemplates\BlazorTemplates.Tests\BlazorTemplates.Tests.csproj", "{18CE63FC-3BFE-47DF-A8D7-9D716FEB04C9}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Blazor.Tests", "src\ProjectTemplates\test\Templates.Blazor.Tests\Templates.Blazor.Tests.csproj", "{18CE63FC-3BFE-47DF-A8D7-9D716FEB04C9}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{A4C26078-B6D8-4FD8-87A6-7C15A3482038}"
EndProject
@@ -1584,10 +1565,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.App.Co
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.App.Analyzers.Test", "src\Framework\AspNetCoreAnalyzers\test\Microsoft.AspNetCore.App.Analyzers.Test.csproj", "{40F493E2-FE59-4787-BE44-3AED39D585BF}"
EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{5420BABA-BDC5-4FBF-81B4-6D7C02C4814D}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureAD.WebSite", "src\Azure\AzureAD\test\testassets\AzureAD.WebSite\AzureAD.WebSite.csproj", "{05F4BC5A-060D-49B2-9069-95088402F99B}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{97F9F7E9-56DA-49FE-B672-499E68EBB9DA}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ClassLibraryWithPortablePdbs", "src\Middleware\Diagnostics\test\testassets\ClassLibraryWithPortablePdbs\ClassLibraryWithPortablePdbs.csproj", "{6F335C66-C1D6-45FA-8529-6503B7CD42CC}"
@@ -1618,8 +1595,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CorsMiddlewareWebSite", "src\Middleware\CORS\test\testassets\CorsMiddlewareWebSite\CorsMiddlewareWebSite.csproj", "{9B240135-3D1E-4EE6-B870-D810F3C856FB}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetToolsInstaller", "src\ProjectTemplates\testassets\DotNetToolsInstaller\DotNetToolsInstaller.csproj", "{C0FD6DB3-9407-4F07-B909-16762E579ECB}"
-EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Installers", "Installers", "{5E46DC83-C39C-4E3A-B242-C064607F4367}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "aspnetcoreCA", "src\Installers\Windows\AspNetCoreModule-Setup\CustomAction\aspnetcoreCA.vcxproj", "{7C27E72F-54D0-4820-8CFA-5E4BE640974B}"
@@ -1656,6 +1631,22 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Compon
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.SdkAnalyzers.Tests", "src\Tools\SDK-Analyzers\Components\test\Microsoft.AspNetCore.Components.SdkAnalyzers.Tests.csproj", "{DC349A25-0DBF-4468-99E1-B95C22D3A7EF}"
EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OutputCaching", "OutputCaching", "{AA5ABFBC-177C-421E-B743-005E0FD1248B}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.OutputCaching", "src\Middleware\OutputCaching\src\Microsoft.AspNetCore.OutputCaching.csproj", "{5D5A3B60-A014-447C-9126-B1FA6C821C8D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{B5AC1D8B-9D43-4261-AE0F-6B7574656F2C}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OutputCachingSample", "src\Middleware\OutputCaching\samples\OutputCachingSample\OutputCachingSample.csproj", "{C3FFA4E4-0E7E-4866-A15F-034245BFD800}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RequestDecompression", "RequestDecompression", "{5465F96F-33D5-454E-9C40-494E58AEEE5D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.RequestDecompression.Tests", "src\Middleware\RequestDecompression\test\Microsoft.AspNetCore.RequestDecompression.Tests.csproj", "{97996D39-7722-4AFC-A41A-AD61CA7A413D}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RequestDecompressionSample", "src\Middleware\RequestDecompression\sample\RequestDecompressionSample.csproj", "{37144E52-611B-40E8-807C-2821F5A814CB}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.RequestDecompression", "src\Middleware\RequestDecompression\src\Microsoft.AspNetCore.RequestDecompression.csproj", "{559FE354-7E08-4310-B4F3-AE30F34DEED5}"
+EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "LinkabilityChecker", "LinkabilityChecker", "{94F95276-7CDF-44A8-B159-D09702EF6794}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LinkabilityChecker", "src\Tools\LinkabilityChecker\LinkabilityChecker.csproj", "{EA7D844B-C180-41C7-9D55-273AD88BF71F}"
@@ -1694,6 +1685,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BuildAfterTargetingPack", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildAfterTargetingPack", "src\BuildAfterTargetingPack\BuildAfterTargetingPack.csproj", "{8FED7E65-A7DD-4F13-8980-BF03E77B6C85}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.OutputCaching.Tests", "src\Middleware\OutputCaching\test\Microsoft.AspNetCore.OutputCaching.Tests.csproj", "{046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ResultsOfTGenerator", "src\Http\Http.Results\tools\ResultsOfTGenerator\ResultsOfTGenerator.csproj", "{9716D0D0-2251-44DD-8596-67D253EEF41C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OpenApi", "OpenApi", "{2299CCD8-8F9C-4F2B-A633-9BF4DA81022B}"
@@ -1706,6 +1699,52 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.RateLi
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.RateLimiting.Tests", "src\Middleware\RateLimiting\test\Microsoft.AspNetCore.RateLimiting.Tests.csproj", "{41FF4F96-98D2-4482-A2A7-4B179E80D285}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HelixTestRunner", "eng\tools\HelixTestRunner\HelixTestRunner.csproj", "{51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Html.Abstractions.Tests", "src\Html.Abstractions\test\Microsoft.AspNetCore.Html.Abstractions.Tests.csproj", "{487EF7BE-5009-4C70-B79E-45519BDD9603}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "RateLimiting", "RateLimiting", "{1D865E78-7A66-4CA9-92EE-2B350E45281F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.RequestDecompression.Microbenchmarks", "src\Middleware\RequestDecompression\perf\Microbenchmarks\Microsoft.AspNetCore.RequestDecompression.Microbenchmarks.csproj", "{3309FA1E-4E95-49E9-BE2A-827D01FD63C0}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-user-jwts", "src\Tools\dotnet-user-jwts\src\dotnet-user-jwts.csproj", "{B34CB502-0286-4939-B25F-45998528A802}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dotnet-user-jwts", "dotnet-user-jwts", "{AB4B9E75-719C-4589-B852-20FBFD727730}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinimalJwtBearerSample", "src\Security\Authentication\JwtBearer\samples\MinimalJwtBearerSample\MinimalJwtBearerSample.csproj", "{7F079E92-32D5-4257-B95B-CFFB0D49C160}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dotnet-user-jwts.Tests", "src\Tools\dotnet-user-jwts\test\dotnet-user-jwts.Tests.csproj", "{89896261-C5DD-4901-BCA7-7A5F718BC008}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestInfrastructure", "TestInfrastructure", "{F0FBA346-D8BC-4FAE-A4B2-85B33FA23055}"
+ ProjectSection(SolutionItems) = preProject
+ src\ProjectTemplates\TestInfrastructure\Directory.Build.props.in = src\ProjectTemplates\TestInfrastructure\Directory.Build.props.in
+ src\ProjectTemplates\TestInfrastructure\Directory.Build.targets.in = src\ProjectTemplates\TestInfrastructure\Directory.Build.targets.in
+ src\ProjectTemplates\TestInfrastructure\PrepareForTest.targets = src\ProjectTemplates\TestInfrastructure\PrepareForTest.targets
+ src\ProjectTemplates\TestInfrastructure\runtimeconfig.norollforward.json = src\ProjectTemplates\TestInfrastructure\runtimeconfig.norollforward.json
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Mvc.Tests", "src\ProjectTemplates\test\Templates.Mvc.Tests\Templates.Mvc.Tests.csproj", "{AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Blazor.Server.Tests", "src\ProjectTemplates\test\Templates.Blazor.Server.Tests\Templates.Blazor.Server.Tests.csproj", "{281BF9DB-7B8A-446B-9611-10A60903F125}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "stress", "stress", "{A5946454-4788-4871-8F23-A9471D55F115}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.CustomElements", "src\Components\CustomElements\src\Microsoft.AspNetCore.Components.CustomElements.csproj", "{76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CustomElements", "CustomElements", "{0BB58FB6-8B66-4C6D-BA8A-DF3AFAF9AB8F}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Blazor.WebAssembly.Tests", "src\ProjectTemplates\test\Templates.Blazor.WebAssembly.Tests\Templates.Blazor.WebAssembly.Tests.csproj", "{7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RateLimitingSample", "src\Middleware\RateLimiting\samples\RateLimitingSample\RateLimitingSample.csproj", "{91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebTransportSampleApp", "src\Servers\Kestrel\samples\WebTransportSampleApp\WebTransportSampleApp.csproj", "{F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MinimalOpenIdConnectSample", "src\Security\Authentication\OpenIdConnect\samples\MinimalOpenIdConnectSample\MinimalOpenIdConnectSample.csproj", "{07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebTransportInteractiveSampleApp", "src\Servers\Kestrel\samples\WebTransportInteractiveSampleApp\WebTransportInteractiveSampleApp.csproj", "{BA649043-EF2B-42DC-B422-A46127BE8296}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Templates.Blazor.WebAssembly.Auth.Tests", "src\ProjectTemplates\test\Templates.Blazor.WebAssembly.Auth.Tests\Templates.Blazor.WebAssembly.Auth.Tests.csproj", "{3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -2582,86 +2621,6 @@ Global
{78C5ACC3-6718-4682-B350-737EDA1E4F35}.Release|x64.Build.0 = Release|Any CPU
{78C5ACC3-6718-4682-B350-737EDA1E4F35}.Release|x86.ActiveCfg = Release|Any CPU
{78C5ACC3-6718-4682-B350-737EDA1E4F35}.Release|x86.Build.0 = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|arm64.Build.0 = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|x64.ActiveCfg = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|x64.Build.0 = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|x86.ActiveCfg = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Debug|x86.Build.0 = Debug|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|Any CPU.Build.0 = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|arm64.ActiveCfg = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|arm64.Build.0 = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|x64.ActiveCfg = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|x64.Build.0 = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|x86.ActiveCfg = Release|Any CPU
- {42E30C98-1358-497F-960B-E1AA17F46704}.Release|x86.Build.0 = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|arm64.Build.0 = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|x64.Build.0 = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Debug|x86.Build.0 = Debug|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|Any CPU.Build.0 = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|arm64.ActiveCfg = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|arm64.Build.0 = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|x64.ActiveCfg = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|x64.Build.0 = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|x86.ActiveCfg = Release|Any CPU
- {4870B11E-7F67-4757-BC9A-45E5895AC712}.Release|x86.Build.0 = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|arm64.Build.0 = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|x64.ActiveCfg = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|x64.Build.0 = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|x86.ActiveCfg = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Debug|x86.Build.0 = Debug|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|Any CPU.Build.0 = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|arm64.ActiveCfg = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|arm64.Build.0 = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|x64.ActiveCfg = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|x64.Build.0 = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|x86.ActiveCfg = Release|Any CPU
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A}.Release|x86.Build.0 = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|arm64.Build.0 = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|x64.Build.0 = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Debug|x86.Build.0 = Debug|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|Any CPU.Build.0 = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|arm64.ActiveCfg = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|arm64.Build.0 = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|x64.ActiveCfg = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|x64.Build.0 = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|x86.ActiveCfg = Release|Any CPU
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0}.Release|x86.Build.0 = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|arm64.Build.0 = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|x64.Build.0 = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Debug|x86.Build.0 = Debug|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|Any CPU.Build.0 = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|arm64.ActiveCfg = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|arm64.Build.0 = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|x64.ActiveCfg = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|x64.Build.0 = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|x86.ActiveCfg = Release|Any CPU
- {B70B1843-4360-4731-9D5C-599189CC1198}.Release|x86.Build.0 = Release|Any CPU
{D40C86C9-0E5D-4974-84D8-A835B58B2A8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D40C86C9-0E5D-4974-84D8-A835B58B2A8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D40C86C9-0E5D-4974-84D8-A835B58B2A8F}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -9586,22 +9545,6 @@ Global
{40F493E2-FE59-4787-BE44-3AED39D585BF}.Release|x64.Build.0 = Release|Any CPU
{40F493E2-FE59-4787-BE44-3AED39D585BF}.Release|x86.ActiveCfg = Release|Any CPU
{40F493E2-FE59-4787-BE44-3AED39D585BF}.Release|x86.Build.0 = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|arm64.Build.0 = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|x64.Build.0 = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Debug|x86.Build.0 = Debug|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|Any CPU.Build.0 = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|arm64.ActiveCfg = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|arm64.Build.0 = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|x64.ActiveCfg = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|x64.Build.0 = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|x86.ActiveCfg = Release|Any CPU
- {05F4BC5A-060D-49B2-9069-95088402F99B}.Release|x86.Build.0 = Release|Any CPU
{6F335C66-C1D6-45FA-8529-6503B7CD42CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6F335C66-C1D6-45FA-8529-6503B7CD42CC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6F335C66-C1D6-45FA-8529-6503B7CD42CC}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -9778,22 +9721,6 @@ Global
{9B240135-3D1E-4EE6-B870-D810F3C856FB}.Release|x64.Build.0 = Release|Any CPU
{9B240135-3D1E-4EE6-B870-D810F3C856FB}.Release|x86.ActiveCfg = Release|Any CPU
{9B240135-3D1E-4EE6-B870-D810F3C856FB}.Release|x86.Build.0 = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|arm64.ActiveCfg = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|arm64.Build.0 = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|x64.Build.0 = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Debug|x86.Build.0 = Debug|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|Any CPU.Build.0 = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|arm64.ActiveCfg = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|arm64.Build.0 = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|x64.ActiveCfg = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|x64.Build.0 = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|x86.ActiveCfg = Release|Any CPU
- {C0FD6DB3-9407-4F07-B909-16762E579ECB}.Release|x86.Build.0 = Release|Any CPU
{7C27E72F-54D0-4820-8CFA-5E4BE640974B}.Debug|Any CPU.ActiveCfg = Debug|Win32
{7C27E72F-54D0-4820-8CFA-5E4BE640974B}.Debug|arm64.ActiveCfg = Debug|Win32
{7C27E72F-54D0-4820-8CFA-5E4BE640974B}.Debug|x64.ActiveCfg = Debug|x64
@@ -9971,6 +9898,86 @@ Global
{DC349A25-0DBF-4468-99E1-B95C22D3A7EF}.Release|x64.Build.0 = Release|Any CPU
{DC349A25-0DBF-4468-99E1-B95C22D3A7EF}.Release|x86.ActiveCfg = Release|Any CPU
{DC349A25-0DBF-4468-99E1-B95C22D3A7EF}.Release|x86.Build.0 = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|arm64.Build.0 = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|x64.Build.0 = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Debug|x86.Build.0 = Debug|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|arm64.ActiveCfg = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|arm64.Build.0 = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|x64.ActiveCfg = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|x64.Build.0 = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|x86.ActiveCfg = Release|Any CPU
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D}.Release|x86.Build.0 = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|arm64.Build.0 = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|x64.Build.0 = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Debug|x86.Build.0 = Debug|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|arm64.ActiveCfg = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|arm64.Build.0 = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|x64.ActiveCfg = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|x64.Build.0 = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|x86.ActiveCfg = Release|Any CPU
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800}.Release|x86.Build.0 = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|arm64.Build.0 = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|x64.Build.0 = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Debug|x86.Build.0 = Debug|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|arm64.ActiveCfg = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|arm64.Build.0 = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|x64.ActiveCfg = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|x64.Build.0 = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|x86.ActiveCfg = Release|Any CPU
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D}.Release|x86.Build.0 = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|arm64.Build.0 = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|x64.Build.0 = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Debug|x86.Build.0 = Debug|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|arm64.ActiveCfg = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|arm64.Build.0 = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|x64.ActiveCfg = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|x64.Build.0 = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|x86.ActiveCfg = Release|Any CPU
+ {37144E52-611B-40E8-807C-2821F5A814CB}.Release|x86.Build.0 = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|arm64.Build.0 = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|x64.Build.0 = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Debug|x86.Build.0 = Debug|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|arm64.ActiveCfg = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|arm64.Build.0 = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|x64.ActiveCfg = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|x64.Build.0 = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|x86.ActiveCfg = Release|Any CPU
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5}.Release|x86.Build.0 = Release|Any CPU
{EA7D844B-C180-41C7-9D55-273AD88BF71F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EA7D844B-C180-41C7-9D55-273AD88BF71F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EA7D844B-C180-41C7-9D55-273AD88BF71F}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -10147,6 +10154,22 @@ Global
{8FED7E65-A7DD-4F13-8980-BF03E77B6C85}.Release|x64.Build.0 = Release|Any CPU
{8FED7E65-A7DD-4F13-8980-BF03E77B6C85}.Release|x86.ActiveCfg = Release|Any CPU
{8FED7E65-A7DD-4F13-8980-BF03E77B6C85}.Release|x86.Build.0 = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|arm64.Build.0 = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|x64.Build.0 = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Debug|x86.Build.0 = Debug|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|arm64.ActiveCfg = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|arm64.Build.0 = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|x64.ActiveCfg = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|x64.Build.0 = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|x86.ActiveCfg = Release|Any CPU
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7}.Release|x86.Build.0 = Release|Any CPU
{9716D0D0-2251-44DD-8596-67D253EEF41C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9716D0D0-2251-44DD-8596-67D253EEF41C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9716D0D0-2251-44DD-8596-67D253EEF41C}.Debug|arm64.ActiveCfg = Debug|Any CPU
@@ -10227,6 +10250,246 @@ Global
{41FF4F96-98D2-4482-A2A7-4B179E80D285}.Release|x64.Build.0 = Release|Any CPU
{41FF4F96-98D2-4482-A2A7-4B179E80D285}.Release|x86.ActiveCfg = Release|Any CPU
{41FF4F96-98D2-4482-A2A7-4B179E80D285}.Release|x86.Build.0 = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|arm64.Build.0 = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|x64.Build.0 = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Debug|x86.Build.0 = Debug|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|arm64.ActiveCfg = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|arm64.Build.0 = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|x64.ActiveCfg = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|x64.Build.0 = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|x86.ActiveCfg = Release|Any CPU
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F}.Release|x86.Build.0 = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|arm64.Build.0 = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|x64.Build.0 = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Debug|x86.Build.0 = Debug|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|Any CPU.Build.0 = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|arm64.ActiveCfg = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|arm64.Build.0 = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|x64.ActiveCfg = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|x64.Build.0 = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|x86.ActiveCfg = Release|Any CPU
+ {487EF7BE-5009-4C70-B79E-45519BDD9603}.Release|x86.Build.0 = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|arm64.Build.0 = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|x64.Build.0 = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Debug|x86.Build.0 = Debug|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|arm64.ActiveCfg = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|arm64.Build.0 = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|x64.ActiveCfg = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|x64.Build.0 = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|x86.ActiveCfg = Release|Any CPU
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0}.Release|x86.Build.0 = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|arm64.Build.0 = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|x64.Build.0 = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Debug|x86.Build.0 = Debug|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|arm64.ActiveCfg = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|arm64.Build.0 = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|x64.ActiveCfg = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|x64.Build.0 = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|x86.ActiveCfg = Release|Any CPU
+ {B34CB502-0286-4939-B25F-45998528A802}.Release|x86.Build.0 = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|arm64.Build.0 = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|x64.Build.0 = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Debug|x86.Build.0 = Debug|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|arm64.ActiveCfg = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|arm64.Build.0 = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|x64.Build.0 = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|x86.ActiveCfg = Release|Any CPU
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160}.Release|x86.Build.0 = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|arm64.Build.0 = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|x64.Build.0 = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Debug|x86.Build.0 = Debug|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|Any CPU.Build.0 = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|arm64.ActiveCfg = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|arm64.Build.0 = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|x64.ActiveCfg = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|x64.Build.0 = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|x86.ActiveCfg = Release|Any CPU
+ {89896261-C5DD-4901-BCA7-7A5F718BC008}.Release|x86.Build.0 = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|arm64.Build.0 = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|x64.Build.0 = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Debug|x86.Build.0 = Debug|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|arm64.ActiveCfg = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|arm64.Build.0 = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|x64.ActiveCfg = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|x64.Build.0 = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|x86.ActiveCfg = Release|Any CPU
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E}.Release|x86.Build.0 = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|arm64.Build.0 = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|x64.Build.0 = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Debug|x86.Build.0 = Debug|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|Any CPU.Build.0 = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|arm64.ActiveCfg = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|arm64.Build.0 = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|x64.ActiveCfg = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|x64.Build.0 = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|x86.ActiveCfg = Release|Any CPU
+ {281BF9DB-7B8A-446B-9611-10A60903F125}.Release|x86.Build.0 = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|arm64.Build.0 = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|x64.Build.0 = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Debug|x86.Build.0 = Debug|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|arm64.ActiveCfg = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|arm64.Build.0 = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|x64.ActiveCfg = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|x64.Build.0 = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|x86.ActiveCfg = Release|Any CPU
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD}.Release|x86.Build.0 = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|arm64.Build.0 = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|x64.Build.0 = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Debug|x86.Build.0 = Debug|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|arm64.ActiveCfg = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|arm64.Build.0 = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|x64.ActiveCfg = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|x64.Build.0 = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|x86.ActiveCfg = Release|Any CPU
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9}.Release|x86.Build.0 = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|arm64.Build.0 = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|x64.Build.0 = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Debug|x86.Build.0 = Debug|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|arm64.ActiveCfg = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|arm64.Build.0 = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|x64.ActiveCfg = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|x64.Build.0 = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|x86.ActiveCfg = Release|Any CPU
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9}.Release|x86.Build.0 = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|arm64.Build.0 = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|x64.Build.0 = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Debug|x86.Build.0 = Debug|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|arm64.ActiveCfg = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|arm64.Build.0 = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|x64.ActiveCfg = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|x64.Build.0 = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|x86.ActiveCfg = Release|Any CPU
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853}.Release|x86.Build.0 = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|arm64.Build.0 = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|x64.Build.0 = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Debug|x86.Build.0 = Debug|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|arm64.ActiveCfg = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|arm64.Build.0 = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|x64.ActiveCfg = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|x64.Build.0 = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|x86.ActiveCfg = Release|Any CPU
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF}.Release|x86.Build.0 = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|arm64.Build.0 = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|x64.Build.0 = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Debug|x86.Build.0 = Debug|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|arm64.ActiveCfg = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|arm64.Build.0 = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|x64.ActiveCfg = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|x64.Build.0 = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|x86.ActiveCfg = Release|Any CPU
+ {BA649043-EF2B-42DC-B422-A46127BE8296}.Release|x86.Build.0 = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|arm64.ActiveCfg = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|arm64.Build.0 = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|x64.Build.0 = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Debug|x86.Build.0 = Debug|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|arm64.ActiveCfg = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|arm64.Build.0 = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|x64.ActiveCfg = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|x64.Build.0 = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|x86.ActiveCfg = Release|Any CPU
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -10353,15 +10616,6 @@ Global
{C73F3203-4E8C-46BC-A299-1A5BB81DA2C3} = {021E9BF3-2D3D-4169-834E-718ABE0E5B68}
{78C5ACC3-6718-4682-B350-737EDA1E4F35} = {B55A5DE1-5AF3-4B18-AF04-C1735B071DA6}
{DFDEED51-6B9B-41B9-A684-9F3FFC07C9B4} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
- {2757D342-5E89-4C4B-9659-714AC8536FD4} = {DFDEED51-6B9B-41B9-A684-9F3FFC07C9B4}
- {CE6853C2-73AE-42EB-AD8C-2A094B2A4A36} = {2757D342-5E89-4C4B-9659-714AC8536FD4}
- {42E30C98-1358-497F-960B-E1AA17F46704} = {CE6853C2-73AE-42EB-AD8C-2A094B2A4A36}
- {4870B11E-7F67-4757-BC9A-45E5895AC712} = {CE6853C2-73AE-42EB-AD8C-2A094B2A4A36}
- {B95A22C8-71B7-49DE-94B2-16402A36B914} = {2757D342-5E89-4C4B-9659-714AC8536FD4}
- {600BF48B-F5DF-4C9D-A5A7-635A8DD6C32A} = {B95A22C8-71B7-49DE-94B2-16402A36B914}
- {27DF3ACF-F3ED-4D76-BFCB-57251892ABC0} = {B95A22C8-71B7-49DE-94B2-16402A36B914}
- {16653D2A-AC79-44ED-B908-2EEB58684C50} = {2757D342-5E89-4C4B-9659-714AC8536FD4}
- {B70B1843-4360-4731-9D5C-599189CC1198} = {16653D2A-AC79-44ED-B908-2EEB58684C50}
{4FDDC525-4E60-4CAF-83A3-261C5B43721F} = {0ACCEDA7-339C-4B4D-8DD4-1AC271F31C04}
{89472057-8BB2-44A8-B0FC-D9F3ADB1181C} = {4FDDC525-4E60-4CAF-83A3-261C5B43721F}
{D40C86C9-0E5D-4974-84D8-A835B58B2A8F} = {89472057-8BB2-44A8-B0FC-D9F3ADB1181C}
@@ -10864,7 +11118,7 @@ Global
{EE9D0952-6060-4723-B329-94A2950A6762} = {4FDDC525-4E60-4CAF-83A3-261C5B43721F}
{132D43A2-067A-4E24-A520-45B9F14DCB8E} = {EE9D0952-6060-4723-B329-94A2950A6762}
{2EC4E939-513F-44CD-A956-498966EAC929} = {7B976D8F-EA31-4C0B-97BD-DFD9B3CC86FB}
- {987E1C29-F124-40C8-8E6F-1B2B6A4CB62A} = {4FDDC525-4E60-4CAF-83A3-261C5B43721F}
+ {987E1C29-F124-40C8-8E6F-1B2B6A4CB62A} = {A5946454-4788-4871-8F23-A9471D55F115}
{3CBC4802-E9B8-48B7-BC8C-B0AFB9EEC643} = {0ACCEDA7-339C-4B4D-8DD4-1AC271F31C04}
{48E64014-B249-4644-8AEB-CDEE8ABA0DC2} = {3CBC4802-E9B8-48B7-BC8C-B0AFB9EEC643}
{1542DC58-1836-4191-A9C5-51D1716D2543} = {05A169C7-4F20-4516-B10A-B13C5649D346}
@@ -11011,8 +11265,6 @@ Global
{2A150BE3-D7DC-4E2A-8399-6EBAB77DEF00} = {B5D98AEB-9409-4280-8225-9C1EC6A791B2}
{D5F4D764-887D-4EB3-8D00-FCBE23FFDBBC} = {B5D98AEB-9409-4280-8225-9C1EC6A791B2}
{40F493E2-FE59-4787-BE44-3AED39D585BF} = {4DA84F2B-1948-439B-85AB-E99E31331A9C}
- {5420BABA-BDC5-4FBF-81B4-6D7C02C4814D} = {16653D2A-AC79-44ED-B908-2EEB58684C50}
- {05F4BC5A-060D-49B2-9069-95088402F99B} = {5420BABA-BDC5-4FBF-81B4-6D7C02C4814D}
{97F9F7E9-56DA-49FE-B672-499E68EBB9DA} = {41B519F7-CF19-4FB4-B96C-E38A7EF45F70}
{6F335C66-C1D6-45FA-8529-6503B7CD42CC} = {97F9F7E9-56DA-49FE-B672-499E68EBB9DA}
{71A54D7F-245F-43C2-B429-342D80AC6F23} = {97F9F7E9-56DA-49FE-B672-499E68EBB9DA}
@@ -11028,7 +11280,6 @@ Global
{3F0C05F5-47EF-4896-8D32-4C80C4563286} = {B5E22428-DAD8-4275-B8F0-14EC2174DDFE}
{83FA6123-6EC3-47F3-A0DC-A10225B5EB16} = {45211BB8-4F51-427D-ADA2-7478E3398A60}
{9B240135-3D1E-4EE6-B870-D810F3C856FB} = {83FA6123-6EC3-47F3-A0DC-A10225B5EB16}
- {C0FD6DB3-9407-4F07-B909-16762E579ECB} = {08D53E58-4AAE-40C4-8497-63EC8664F304}
{5E46DC83-C39C-4E3A-B242-C064607F4367} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
{7C27E72F-54D0-4820-8CFA-5E4BE640974B} = {D30A658D-61F6-444B-9AC7-F66A1A1B86B6}
{7324770C-0871-4D73-BE3D-5E2F3E9E1B1E} = {D30A658D-61F6-444B-9AC7-F66A1A1B86B6}
@@ -11047,6 +11298,14 @@ Global
{CC45FA2D-128B-485D-BA6D-DFD9735CB3C3} = {6C06163A-80E9-49C1-817C-B391852BA563}
{825BCF97-67A9-4834-B3A8-C3DC97A90E41} = {CC45FA2D-128B-485D-BA6D-DFD9735CB3C3}
{DC349A25-0DBF-4468-99E1-B95C22D3A7EF} = {CC45FA2D-128B-485D-BA6D-DFD9735CB3C3}
+ {AA5ABFBC-177C-421E-B743-005E0FD1248B} = {E5963C9F-20A6-4385-B364-814D2581FADF}
+ {5D5A3B60-A014-447C-9126-B1FA6C821C8D} = {AA5ABFBC-177C-421E-B743-005E0FD1248B}
+ {B5AC1D8B-9D43-4261-AE0F-6B7574656F2C} = {AA5ABFBC-177C-421E-B743-005E0FD1248B}
+ {C3FFA4E4-0E7E-4866-A15F-034245BFD800} = {B5AC1D8B-9D43-4261-AE0F-6B7574656F2C}
+ {5465F96F-33D5-454E-9C40-494E58AEEE5D} = {E5963C9F-20A6-4385-B364-814D2581FADF}
+ {97996D39-7722-4AFC-A41A-AD61CA7A413D} = {5465F96F-33D5-454E-9C40-494E58AEEE5D}
+ {37144E52-611B-40E8-807C-2821F5A814CB} = {5465F96F-33D5-454E-9C40-494E58AEEE5D}
+ {559FE354-7E08-4310-B4F3-AE30F34DEED5} = {5465F96F-33D5-454E-9C40-494E58AEEE5D}
{94F95276-7CDF-44A8-B159-D09702EF6794} = {0B200A66-B809-4ED3-A790-CB1C2E80975E}
{EA7D844B-C180-41C7-9D55-273AD88BF71F} = {94F95276-7CDF-44A8-B159-D09702EF6794}
{7A331A1C-E2C4-4E37-B0A0-B5AA10661229} = {8DAC59BE-CB96-4F04-909C-56C22E7665EB}
@@ -11066,10 +11325,33 @@ Global
{B7DAA48B-8E5E-4A5D-9FEB-E6D49AE76A04} = {41BB7BA4-AC08-4E9A-83EA-6D587A5B951C}
{489020F2-80D9-4468-A5D3-07E785837A5D} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
{8FED7E65-A7DD-4F13-8980-BF03E77B6C85} = {489020F2-80D9-4468-A5D3-07E785837A5D}
+ {046F43BC-BEE4-48B7-8C09-ED0A1054A2D7} = {AA5ABFBC-177C-421E-B743-005E0FD1248B}
{9716D0D0-2251-44DD-8596-67D253EEF41C} = {323C3EB6-1D15-4B3D-918D-699D7F64DED9}
{2299CCD8-8F9C-4F2B-A633-9BF4DA81022B} = {017429CC-C5FB-48B4-9C46-034E29EE2F06}
{3AEFB466-6310-4F3F-923F-9154224E3629} = {2299CCD8-8F9C-4F2B-A633-9BF4DA81022B}
{EFC8EA45-572D-4D8D-A597-9045A2D8EC40} = {2299CCD8-8F9C-4F2B-A633-9BF4DA81022B}
+ {8EE73488-2B92-42BD-96C9-0DD65405C828} = {1D865E78-7A66-4CA9-92EE-2B350E45281F}
+ {41FF4F96-98D2-4482-A2A7-4B179E80D285} = {1D865E78-7A66-4CA9-92EE-2B350E45281F}
+ {51D07AA9-6297-4F66-A7BD-71CE7E3F4A3F} = {0F84F170-57D0-496B-8E2C-7984178EF69F}
+ {487EF7BE-5009-4C70-B79E-45519BDD9603} = {412D4C15-F48F-4DB1-940A-131D1AA87088}
+ {1D865E78-7A66-4CA9-92EE-2B350E45281F} = {E5963C9F-20A6-4385-B364-814D2581FADF}
+ {3309FA1E-4E95-49E9-BE2A-827D01FD63C0} = {5465F96F-33D5-454E-9C40-494E58AEEE5D}
+ {B34CB502-0286-4939-B25F-45998528A802} = {AB4B9E75-719C-4589-B852-20FBFD727730}
+ {AB4B9E75-719C-4589-B852-20FBFD727730} = {0B200A66-B809-4ED3-A790-CB1C2E80975E}
+ {7F079E92-32D5-4257-B95B-CFFB0D49C160} = {7FD32066-C831-4E29-978C-9A2215E85C67}
+ {89896261-C5DD-4901-BCA7-7A5F718BC008} = {AB4B9E75-719C-4589-B852-20FBFD727730}
+ {F0FBA346-D8BC-4FAE-A4B2-85B33FA23055} = {08D53E58-4AAE-40C4-8497-63EC8664F304}
+ {AA7445F5-BD28-400C-8507-E2E0D3CF7D7E} = {08D53E58-4AAE-40C4-8497-63EC8664F304}
+ {281BF9DB-7B8A-446B-9611-10A60903F125} = {08D53E58-4AAE-40C4-8497-63EC8664F304}
+ {A5946454-4788-4871-8F23-A9471D55F115} = {4FDDC525-4E60-4CAF-83A3-261C5B43721F}
+ {76C3E22D-092B-4E8A-81F0-DCF071BFF4CD} = {0BB58FB6-8B66-4C6D-BA8A-DF3AFAF9AB8F}
+ {0BB58FB6-8B66-4C6D-BA8A-DF3AFAF9AB8F} = {60D51C98-2CC0-40DF-B338-44154EFEE2FF}
+ {7CA0A9AF-9088-471C-B0B6-EBF43F21D3B9} = {08D53E58-4AAE-40C4-8497-63EC8664F304}
+ {91C3C03E-EA56-4ABA-9E73-A3DA4C2833D9} = {1D865E78-7A66-4CA9-92EE-2B350E45281F}
+ {F4A9CC79-5FE3-4F2B-9CC3-7F42DEDB4853} = {7B976D8F-EA31-4C0B-97BD-DFD9B3CC86FB}
+ {07FDBE0D-B7A1-43DE-B120-F699C30E7CEF} = {E19E55A2-1562-47A7-8EA6-B51F2CA0CC4C}
+ {BA649043-EF2B-42DC-B422-A46127BE8296} = {7B976D8F-EA31-4C0B-97BD-DFD9B3CC86FB}
+ {3A6FD623-F7F3-404B-8A39-CAFB40CA6A08} = {08D53E58-4AAE-40C4-8497-63EC8664F304}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {3E8720B3-DBDD-498C-B383-2CC32A054E8F}
diff --git a/NuGet.config b/NuGet.config
index d27ff9ced1..918bb8be3a 100644
--- a/NuGet.config
+++ b/NuGet.config
@@ -4,6 +4,8 @@
<clear />
<add key="dotnet-eng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" />
<add key="dotnet-tools" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" />
+ <add key="dotnet8" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json" />
+ <add key="dotnet8-transport" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8-transport/nuget/v3/index.json" />
<add key="dotnet7" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7/nuget/v3/index.json" />
<add key="dotnet7-transport" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet7-transport/nuget/v3/index.json" />
<add key="dotnet6" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json" />
diff --git a/README.md b/README.md
index 526c54be13..781f12868c 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,11 @@
+ASP.NET Core
+============
+
[![.NET Foundation](https://img.shields.io/badge/.NET%20Foundation-blueviolet.svg)](https://www.dotnetfoundation.org/)
[![MIT License](https://img.shields.io/github/license/dotnet/aspnetcore?color=%230b0&style=flat-square)](https://github.com/dotnet/aspnetcore/blob/main/LICENSE.txt) [![Help Wanted](https://img.shields.io/github/issues/dotnet/aspnetcore/help%20wanted?color=%232EA043&label=help%20wanted&style=flat-square)](https://github.com/dotnet/aspnetcore/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22) [![Good First Issues](https://img.shields.io/github/issues/dotnet/aspnetcore/good%20first%20issue?color=%23512BD4&label=good%20first%20issue&style=flat-square)](https://github.com/dotnet/aspnetcore/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)
[![Discord](https://img.shields.io/discord/732297728826277939?style=flat-square&label=Discord&logo=discord&logoColor=white&color=7289DA)](https://aka.ms/dotnet-discord)
-ASP.NET Core
-============
-
-ASP.NET Core is an open-source and cross-platform framework for building modern cloud based internet connected applications, such as web apps, IoT apps and mobile backends. ASP.NET Core apps run on [.NET Core](https://dot.net), a free, cross-platform and open-source application runtime. It was architected to provide an optimized development framework for apps that are deployed to the cloud or run on-premises. It consists of modular components with minimal overhead, so you retain flexibility while constructing your solutions. You can develop and run your ASP.NET Core apps cross-platform on Windows, Mac and Linux. [Learn more about ASP.NET Core](https://docs.microsoft.com/aspnet/core/).
+ASP.NET Core is an open-source and cross-platform framework for building modern cloud based internet connected applications, such as web apps, IoT apps and mobile backends. ASP.NET Core apps run on [.NET](https://dot.net), a free, cross-platform and open-source application runtime. It was architected to provide an optimized development framework for apps that are deployed to the cloud or run on-premises. It consists of modular components with minimal overhead, so you retain flexibility while constructing your solutions. You can develop and run your ASP.NET Core apps cross-platform on Windows, Mac and Linux. [Learn more about ASP.NET Core](https://docs.microsoft.com/aspnet/core/).
## Get Started
diff --git a/docs/APIReviewProcess.md b/docs/APIReviewProcess.md
index fcc3845de4..cd953a73e2 100644
--- a/docs/APIReviewProcess.md
+++ b/docs/APIReviewProcess.md
@@ -1,3 +1,5 @@
+To get the process of adding/modifying API going, file a new issue using [the API Proposal issue template](https://github.com/dotnet/aspnetcore/issues/new?assignees=&labels=api-suggestion&template=30_api_proposal.md&title=). Below is more information about the process.
+
## Process
The goal of the API Review process is to ensure that the new APIs are following common patterns and the best practices.
diff --git a/docs/AddingNewProjects.md b/docs/AddingNewProjects.md
new file mode 100644
index 0000000000..3e4c206112
--- /dev/null
+++ b/docs/AddingNewProjects.md
@@ -0,0 +1,54 @@
+# Adding New Projects To The Repo
+
+Sample PR of final result: https://github.com/dotnet/aspnetcore/pull/41945
+
+## Creating a new project
+1. Create a new folder that will house your `.csproj` and other project-related files.
+2. (EXTREMELY IMPORTANT) Inside this new folder, make a new folder for the source files of your project. For regular functionality-adding project this will be called `src`. However, if you are adding a different kind of project, it will be called something more applicable (ex. `test/` for a test project).
+3. Open the `.slnf` you want to add your project to in VS (preferably via the `startvs.cmd` script located in the same folder as the `.slnf`). Then add a new `Solution Folder` in the new folder with the same name and location as the actual folder created in the first step.
+4. Create the project via the VS `Add` menu (select the folder -> right click -> Add -> New Project... -> follow the wizard).
+
+ **Note:** (Only applicable to `src/` projects) Depending on what kind of project you are creating, VS will create different files in your project. You might also want to add the following files:
+ - `PublicAPI.Shipped.txt`
+ - Lists publically visible APIs that are exported from your final compiled `.dll`.
+ - This only lists APIs that have already been shipped to customers and cannot be changed.
+ - There is an empty template at `eng/PublicAPI.empty.txt` for your reference. You can copy and rename the file to add it to your project. Make sure the name is exactly as shown above.
+ - `PublicAPI.UnShipped.txt`
+ - Lists publicly visible APIs that are exported from your final compiled `.dll`. If this is not configured properly, you will get build errors. VS will warn you though with green squiggly lines. If you see these squiggly lines, open the VS Quick Actions (CTRL + '.') and select the option to and it to the public API.
+ - This only lists APIs that have NOT already been shipped to customers. So, these can still change.
+ - There is an empty template at `eng/PublicAPI.empty.txt` for your reference. You can copy and rename the file to add it to your project. Make sure the name is exactly as shown above.
+ - You can expose internals via `@(InternalsVisibleTo)` items in your `.csproj`.
+ ```XML
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.My.TestProject" />
+ ```
+
+
+## Adding to the rest of the repo
+1. VS should have already registered your `.csproj` in the corresponding solution ([`.sln`](https://github.com/dotnet/aspnetcore/blob/586ccc8c895862b65645c4b0f979db1eecd29626/AspNetCore.sln)) and solution filter ([`.slnf`](https://github.com/dotnet/aspnetcore/blob/586ccc8c895862b65645c4b0f979db1eecd29626/src/Middleware/Middleware.slnf#L107-L109)) files.
+ - If VS has not already modified these files, open the `.slnf` you want to add the project to. Create a solution folder for your project if doesn't exist already. Then right click solution folder -> Add -> Existing Project... -> follow the wizard.
+2. Run the `eng/scripts/GenerateProjectList.ps1` file to regenerate a number of `eng/*.props` files e.g. ProjectReferences.props.
+
+**Note:** If you are adding a new project to the root `src` directory, you will also need to add a reference in both of the `DotNetProjects` lists of the `eng/Build.props` file. The first list (the one with condition `'$(BuildMainlyReferenceProviders)' != 'true'"`) has items in the format of:
+ ```XML
+ <DotNetProjects Include="
+ $(RepoRoot)src\[YOUR FOLDER]\**\*.csproj;
+ ...
+ ```
+while the second (the one with condition `'$(BuildMainlyReferenceProviders)' == 'true'"`) has them in the format of (note the second `src`):
+ ```XML
+ <DotNetProjects Include="
+ $(RepoRoot)src\[YOUR FOLDER]\**\src\*.csproj;
+ ...
+ ```
+
+## (OPTIONAL) Including your project in SharedFx
+1. Add the following line to the `.csproj`'s `PropertyGroup` to include your project in the SharedFx API:
+ ```XML
+ <IsAspNetCoreApp>true</IsAspNetCoreApp>
+ ```
+2. Re-run the `eng/scripts/GenerateProjectList.ps1` to add your project to the `eng/SharedFramework.Local.props` file and, if applicable, the `eng/TrimmableProjects.props` file.
+3. Add your project name to the lists in `src\Framework\test\TestData.cs`. This is not strictly necessary for the project to work but there is a test on CI that will fail if this is not done. Make sure to include your project in a way that maintains alphabetical ordering.
+
+## Manually saving solution and solution filter files
+VS is pretty good at keeping the files up to date and organized correctly. It will also prompt you if it finds an error and, in most cases, offer a solution to fix the issue. Sometimes just saving the file will trigger VS to resolve any issues automatically. However, if you would like to add a new solution filter file or update one manually you can find a tutorial link [here](https://docs.microsoft.com/en-us/visualstudio/ide/filtered-solutions?view=vs-2022).
diff --git a/docs/Helix.md b/docs/Helix.md
index 3d837deab5..3d56c68b16 100644
--- a/docs/Helix.md
+++ b/docs/Helix.md
@@ -137,3 +137,20 @@ Goal is to balance cost/flakiness against having some coverage of supported dist
- Example PR: dotnet/dotnet-buildtools-prereqs-docker#398
- Summary is to update [manifest.json](https://github.com/dotnet/dotnet-buildtools-prereqs-docker/blob/main/manifest.json) with an entry for the new dockerfiles, and then add the docker files as well to dotnet-buildtools-prereqs-docker
- The resulting new docker queue id will be found in: [image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json](https://github.com/dotnet/versions/blob/main/build-info/docker/image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json)
+
+## Investigating helix run time issues
+
+Kusto has all of the helix job data, using a particular job id, with the following query you can get a breakdown of the test projects that take the longest. Ideally to take advantage of the largest fan out, we want smaller test projects since the longest running test project will be the gate for finishing the entire helix test job.
+
+https://dataexplorer.azure.com/clusters/engsrvprod/databases/engineeringdata
+
+```
+WorkItems
+| where JobName == "bc108374-750c-4084-853e-bc5b9b0d553e"
+| where Name != JobName
+| extend RunTime = Finished-Started
+| top 20 by RunTime desc
+| project FriendlyName, RunTime
+```
+
+![image](https://user-images.githubusercontent.com/6537861/144129895-e1e82815-4192-431c-a7b3-dd055b813978.png)
diff --git a/docs/README.md b/docs/README.md
index 73d508e051..d73a3afb2c 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -26,3 +26,5 @@ The table below outlines the different docs in this folder and what they are hel
| [Triage process](TriageProcess.md)| Overview of the issue triage process used in the repo | Anyone looking to understand the triage process on the repo |
| [Updating Major Version & TFM](UpdatingMajorVersionAndTFM.md)| Instructions for updating the repo branding & TFM in preparation for a new major release | Repo developers who want to know more about our branding & release process |
| [Assembly trimming guide](Trimming.md)| Guidance on adding trimming support to an ASP.NET Core assembly | Repo developers who want to help add support for trimming to ASP.NET Core |
+| [Adding new Projects to the Repo](AddingNewProjects.md) | Outlines the process of adding new projects (i.e. `.csproj` files) to the repo | Anyone who finds themselves trying to add a new project and including it in the build.
+| [Using WebTransport in Kestrel](WebTransport.md) | Outlines how to setup Kestrel to use WebTransport | Anyone looking to support WebTransport |
diff --git a/docs/Trimming.md b/docs/Trimming.md
index 8f89d5ba79..277c724fc8 100644
--- a/docs/Trimming.md
+++ b/docs/Trimming.md
@@ -20,8 +20,8 @@ The first step to trimming an ASP.NET Core assembly is adding it to `Linkability
1. Update the project file to enable trimming by adding `<IsTrimmable>true</IsTrimmable>`. This property configures the build to add metadata to the assembly to indicate it supports trimming. It also enables trimming analysis on the project.
2. Run `eng/scripts/GenerateProjectList.ps1` to update the list of projects that are known to be trimmable. The script adds the project to the list of known trimmable projects at [`eng/TrimmableProjects.props`](../eng/TrimmableProjects.props).
-3. Open `Tools.slnf`
-4. Add the project to `Tools.slnf`.
+3. Open `src/Tools/Tools.slnf`
+4. Add the project to `Tools.slnf`:
1. Right-click `LinkabilityCheck` and select *Load Direct Dependencies*.
2. Update the solution filter.
5. Build `LinkabilityChecker`.
diff --git a/docs/UpdatingMajorVersionAndTFM.md b/docs/UpdatingMajorVersionAndTFM.md
index 07cb82f701..13af1ccbf8 100644
--- a/docs/UpdatingMajorVersionAndTFM.md
+++ b/docs/UpdatingMajorVersionAndTFM.md
@@ -33,7 +33,7 @@ Once dotnet/runtime has updated their TFM, we update ours in the dependency upda
* In [eng/Versions.props](/eng/Versions.props), increment `DefaultNetCoreTargetFramework` by 1.
* Do a global repo search for the current version string, and update almost everything by 1 (e.g. find `net7`, replace with `net8`). See the PR linked above for examples - this shouldn't be done blindly, but on a case-by-case basis. Most things should be updated, and most choices should be obvious.
- * Exceptions to this are [eng/tools/RepoTasks/RepoTasks.csproj](/eng/tools/RepoTasks/RepoTasks.csproj), [eng/tools/RepoTasks/RepoTasks.tasks](/eng/tools/RepoTasks/RepoTasks.tasks), and [eng/helix/content/RunTests/RunTests.csproj](/eng/helix/content/RunTests/RunTests.csproj). These build without the workarounds from [eng/tools/GenerateFiles/Directory.Build.targets.in](/eng/tools/GenerateFiles/Directory.Build.targets.in), and need to be kept at the previous TFM until we get an SDK containing a runtime with the new TFM. Generally this means we have to hard-code the previous TFM for these files, rather than using `DefaultNetCoreTargetFramework`.
+ * Exceptions to this are [eng/tools/RepoTasks/RepoTasks.csproj](/eng/tools/RepoTasks/RepoTasks.csproj), [eng/tools/RepoTasks/RepoTasks.tasks](/eng/tools/RepoTasks/RepoTasks.tasks), and [eng/tools/HelixTestRunner/HelixTestRunner.csproj](/eng/tools/HelixTestRunner/HelixTestRunner.csproj). These build without the workarounds from [eng/tools/GenerateFiles/Directory.Build.targets.in](/eng/tools/GenerateFiles/Directory.Build.targets.in), and need to be kept at the previous TFM until we get an SDK containing a runtime with the new TFM. Generally this means we have to hard-code the previous TFM for these files, rather than using `DefaultNetCoreTargetFramework`.
* Add a reference to the new `SiteExtensions` package for the previous Major Version.
1. Add references to [src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj](/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj) to `Microsoft.AspNetCore.AzureAppServices.SiteExtension.{PreviousMajorVersion}.0.x64` and `Microsoft.AspNetCore.AzureAppServices.SiteExtension.{PreviousMajorVersion}.0.x86`.
2. Add entries in [eng/Versions.props](/eng/Versions.props) similar to [these](https://github.com/dotnet/aspnetcore/blob/216c92b78bce31d5e81a70b589707ec2ae5ab21a/eng/Versions.props#L224-L226) - the version should be from the latest released build of .Net.
@@ -48,6 +48,7 @@ Once dotnet/runtime has updated their TFM, we update ours in the dependency upda
1. Create & merge a PR like [this one](https://github.com/dotnet/spa-templates/pull/39) in dotnet/spa-templates updating `precedence` and `identity` elements in all template.json files.
2. Create a PR like [this one](https://github.com/dotnet/aspnetcore/pull/39783) in dotnet/aspnetcore that updates the spa-templates submodule, and updates the `precedence`, `identity`, and (if it exists) `thirdPartyNotices` elements in all template.json files.
3. Make sure the new aka.ms link you're referencing in `thirdPartyNotices` exists.
+* In [src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs](/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs), update the references to `ReferenceAssemblies.Net.Netx0` with the latest version.
### Validation
@@ -56,4 +57,4 @@ Once dotnet/runtime has updated their TFM, we update ours in the dependency upda
## Ingesting an SDK with the new TFM
-Typically we update the SDK we use in `main` every Monday. Once we have one that contains `Microsoft.Netcore.App` entries with the new TFM, we can update [eng/tools/RepoTasks/RepoTasks.csproj](/eng/tools/RepoTasks/RepoTasks.csproj), [eng/tools/RepoTasks/RepoTasks.tasks](/eng/tools/RepoTasks/RepoTasks.tasks), and [eng/helix/content/RunTests/RunTests.csproj](/eng/helix/content/RunTests/RunTests.csproj) to use `DefaultNetCoreTargetFramework` again rather than hard-coding the previous TFM.
+Typically we update the SDK we use in `main` every Monday. Once we have one that contains `Microsoft.Netcore.App` entries with the new TFM, we can update [eng/tools/RepoTasks/RepoTasks.csproj](/eng/tools/RepoTasks/RepoTasks.csproj), [eng/tools/RepoTasks/RepoTasks.tasks](/eng/tools/RepoTasks/RepoTasks.tasks), and [eng/tools/HelixTestRunner/HelixTestRunner.csproj](/eng/helix/tools/HelixTestRunner.csproj) to use `DefaultNetCoreTargetFramework` again rather than hard-coding the previous TFM.
diff --git a/docs/WebTransport.md b/docs/WebTransport.md
new file mode 100644
index 0000000000..e397510500
--- /dev/null
+++ b/docs/WebTransport.md
@@ -0,0 +1,301 @@
+# Using WebTransport in Kestrel
+
+Kestrel currently implements most of the WebTransport [draft-02](https://ietf-wg-webtrans.github.io/draft-ietf-webtrans-http3/draft-ietf-webtrans-http3.html) specification, except for datagrams. Datagrams will be implemented at a later date. This document outlines how to use the already implemented functionality.
+
+## Running the sample apps
+
+To help applications get started on implementing WebTransport, there are two sample apps.
+
+- ### `WebTransportSampleApp` project located at `src\Servers\Kestrel\samples\WebTransportSampleApp`
+To use it, simply run from VS. This will launch the server and a terminal which will show logs from Kestrel as it interacts with the client. Now you should be able to connect to the sample from any client that implements the standard WebTransport draft02 specification.
+
+**Note:** Once you run the `WebTransportSampleApp`, it will print the certificate hash that it is using for the SSL connection. You will need to copy it into your client to make sure that both the server and the client use the same one.
+
+- ### `WebTransportInteractiveSampleApp` project located at `src\Middleware\WebTransport\samples\WebTransportInteractiveSampleApp`
+To use it, simply run from VS. This will launch the server and terminal. Now you can open any browser that supports WebTransport and navigate to `https://localhost:5001`. You will see an interactive WebTransport test page where you can interact with the API and most of its main functionalities.
+
+**Note:** this sample automatically injects the certificate into the client-side code. Therefore, you do not need to handle it manually.
+
+## Using Edge or Chrome DevTools as a client
+
+The Chromium project has implemented a WebTransport client and can be accessed via their JS API from the Chrome or Edge DevTools console. A good sample app demonstrating how to use that API can be found [here](https://github.com/myjimmy/google-webtransport-sample/blob/ee13bde656c4d421d1f2a8e88fd71f572272c163/client.js).
+
+## Note about preview features
+
+WebTransport is a preview feature. Therefore, you must manually enable it via the `EnablePreviewFeatures` property and toggle the `Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams` `RuntimeHostConfigurationOption`. This can be done by adding the following `ItemGroup` to your csproj file:
+```xml
+<ItemGroup>
+ <RuntimeHostConfigurationOption Include="Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams" Value="true" />
+</ItemGroup>
+```
+
+## Obtaining a test certificate
+
+The current Kestrel default testing certificate cannot be used for WebTransport connections as it does not meet the requirements needed for WebTransport over HTTP/3. You can generate a new certificate for testing via the following C# (this function will also automatically handle cert rotation every time one expires):
+```C#
+static X509Certificate2 GenerateManualCertificate()
+{
+ X509Certificate2 cert = null;
+ var store = new X509Store("KestrelWebTransportCertificates", StoreLocation.CurrentUser);
+ store.Open(OpenFlags.ReadWrite);
+ if (store.Certificates.Count > 0)
+ {
+ cert = store.Certificates[^1];
+
+ // rotate key after it expires
+ if (DateTime.Parse(cert.GetExpirationDateString(), null) < DateTimeOffset.UtcNow)
+ {
+ cert = null;
+ }
+ }
+ if (cert == null)
+ {
+ // generate a new cert
+ var now = DateTimeOffset.UtcNow;
+ SubjectAlternativeNameBuilder sanBuilder = new();
+ sanBuilder.AddDnsName("localhost");
+ using var ec = ECDsa.Create(ECCurve.NamedCurves.nistP256);
+ CertificateRequest req = new("CN=localhost", ec, HashAlgorithmName.SHA256);
+ // Adds purpose
+ req.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(new OidCollection
+ {
+ new("1.3.6.1.5.5.7.3.1") // serverAuth
+ }, false));
+ // Adds usage
+ req.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, false));
+ // Adds subject alternate names
+ req.CertificateExtensions.Add(sanBuilder.Build());
+ // Sign
+ using var crt = req.CreateSelfSigned(now, now.AddDays(14)); // 14 days is the max duration of a certificate for this
+ cert = new(crt.Export(X509ContentType.Pfx));
+
+ // Save
+ store.Add(cert);
+ }
+ store.Close();
+
+ var hash = SHA256.HashData(cert.RawData);
+ var certStr = Convert.ToBase64String(hash);
+ Console.WriteLine($"\n\n\n\n\nCertificate: {certStr}\n\n\n\n"); // <-- you will need to put this output into the JS API call to allow the connection
+ return cert;
+}
+// Adapted from: https://github.com/wegylexy/webtransport
+```
+
+## Overview of the Kestrel WebTransport API
+
+### Setting up a connection
+
+To setup a WebTransport connection, you will first need to configure a host upon which you open a port. A very minimal example is shown below:
+```C#
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.ConfigureKestrel((context, options) =>
+{
+ // Port configured for WebTransport
+ options.Listen([SOME IP ADDRESS], [SOME PORT], listenOptions =>
+ {
+ listenOptions.UseHttps(GenerateManualCertificate());
+ listenOptions.UseConnectionLogging();
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ });
+});
+var host = builder.Build();
+```
+**Note:** As WebTransport uses HTTP/3, you must make sure to select the `listenOptions.UseHttps` setting as well as set the `listenOptions.Protocols` to include HTTP/3.
+
+**Note:** The default Kestrel certificate cannot be used for WebTransport connections. For local testing you can use the workaround described in the [Obtaining a test certificate section](#Obtaining-a-test-certificate).
+
+Next, we defined the code that will run when Kestrel receives a connection.
+```C#
+host.Run(async (context) =>
+{
+ var feature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+ if (!feature.IsWebTransportRequest)
+ {
+ return;
+ }
+ var session = await feature.AcceptAsync(CancellationToken.None);
+
+ // Use WebTransport via the newly established session.
+});
+
+await host.RunAsync();
+```
+The `Run` method is the main entry-point of your application logic. It is triggered every time there is a connection request. Once the request is a WebTransport request (which is defined by getting the `IHttpWebTransportFeature` feature and then checking the `IsWebTransportRequest` property), you will be able to accept WebTransport sessions and interact with the client. The last line (`await host.RunAsync();`) will start the server and start accepting connections.
+
+### Available WebTransport Features in Kestrel
+
+This section highlights some of the most significant features of WebTransport that Kestrel implements. However, this is not an exhaustive list.
+
+- Accept a WebTransport Session
+```C#
+var session = await feature.AcceptAsync(CancellationToken token);
+```
+This will wait for the next incoming WebTransport session and return an instance of `IWebTransportSession` when a connection is completed. A session must be created prior to any streams being created or any data is sent. Note that only clients can initiate a session, thus the server passively waits until one is received and cannot initiate its own session. The cancellation token can be used to stop the operation.
+
+- Accepting a WebTransport stream
+```C#
+var connectionContext = await session.AcceptStreamAsync(CancellationToken token);
+```
+This will wait for the next incoming WebTransport stream and return an instance of `ConnectionContext`. Note that streams are buffered in order. So, this call will return the next least recently received stream by popping from the front of the queue of pending streams. If no streams are pending, it will block until it receives one. You can use the cancellation token to stop the operation.
+
+**Note:** This method will return both bidirectional and unidirectional streams. They can be distinguished based on the `IStreamDirectionFeature.CanRead` and `IStreamDirectionFeature.CanWrite` properties.
+
+- Opening a new WebTransport stream from the server
+```C#
+var connectionContext = await session.OpenUnidirectionalStreamAsync(CancellationToken token);
+```
+This will attempt to open a new unidirectional stream from the server to the client and return an instance of `ConnectionContext`. You can use the cancellation token to stop the operation.
+
+- Sending data over a WebTransport stream
+```C#
+var stream = connectionContext.Transport.Output;
+await stream.WriteAsync(ReadOnlyMemory<byte> bytes);
+```
+`stream.WriteAsync` will write data to the stream and then automatically flush (i.e. send it to the client).
+
+**Note:** You can only send data on streams that have `IStreamDirectionFeature.CanWrite` set as `true`. Sending data on non-writable streams will throw an `NotSupportedException` exception.
+
+- Reading data from a WebTransport stream
+```C#
+var stream = connectionContext.Transport.Input.AsStream();
+var length = await stream.ReadAsync(Memory<byte> memory);
+```
+`stream.ReadAsync` will read data from the stream and copy it into the provided `memory` parameter. It will then return the number of bytes read.
+
+**Note:** You can only read data from streams that have `IStreamDirectionFeature.CanRead` set as `true`. Reading data on non-readable streams will throw an `NotSupportedException` exception.
+
+- Aborting a WebTransport session
+```C#
+session.Abort(int errorCode);
+```
+Aborting a WebTransport session will result in severing the connection with the client and aborting all the streams. You can optionally specify an error code that will be passed down into the logs. The default value (256) represents no error.
+
+**Note:** valid error codes are defined [here](https://www.rfc-editor.org/rfc/rfc9114.html#name-http-3-error-codes).
+
+- Aborting a WebTransport stream
+```C#
+stream.Abort(ConnectionAbortedException exception);
+```
+Aborting a WebTransport stream will result in abruptly ending all data transmission over the stream. You can optionally specify an aborted exception that will be passed down into the logs. A default message is used if no message is provided.
+
+- Soft closing a WebTransport stream
+```C#
+stream.DisposeAsync();
+```
+Disposing a WebTransport stream will result in ending data transmission and closing the stream gracefully.
+
+
+### Examples
+
+#### Example 1
+
+This example waits for a bidirectional stream. Once it receives one, it will read the data from it, reverse it and then write it back to the stream.
+```C#
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.ConfigureKestrel((context, options) =>
+{
+ // Port configured for WebTransport
+ options.Listen(IPAddress.Any, 5007, listenOptions =>
+ {
+ listenOptions.UseHttps(GenerateManualCertificate());
+ listenOptions.UseConnectionLogging();
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ });
+});
+var host = builder.Build();
+
+host.Run(async (context) =>
+{
+ var feature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+ if (!feature.IsWebTransportRequest)
+ {
+ return;
+ }
+ var session = await feature.AcceptAsync(CancellationToken.None);
+
+ ConnectionContext? stream = null;
+ IStreamDirectionFeature? direction = null;
+ while (true)
+ {
+ // wait until we get a stream
+ stream = await session.AcceptStreamAsync(CancellationToken.None);
+ if (stream is not null)
+ {
+
+ // check that the stream is bidirectional. If yes, keep going, otherwise
+ // dispose its resources and keep waiting.
+ direction = stream.Features.GetRequiredFeature<IStreamDirectionFeature>();
+ if (direction.CanRead && direction.CanWrite)
+ {
+ break;
+ }
+ else
+ {
+ await stream.DisposeAsync();
+ }
+ }
+ else
+ {
+ // if a stream is null, this means that the session failed to get the next one.
+ // Thus, the session has ended or some other issue has occurred. We end the
+ // connection in this case.
+ return;
+ }
+ }
+
+ var inputPipe = stream!.Transport.Input;
+ var outputPipe = stream!.Transport.Output;
+
+ // read some data from the stream into the memory
+ var length = await inputPipe.AsStream().ReadAsync(memory);
+
+ // slice to only keep the relevant parts of the memory
+ var outputMemory = memory[..length];
+
+ // do some operations on the contents of the data
+ outputMemory.Span.Reverse();
+
+ // write back the data to the stream
+ await outputPipe.WriteAsync(outputMemory);
+});
+
+await host.RunAsync();
+```
+
+#### Example 2
+
+This example opens a new stream from the server side and then sends data.
+```C#
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.ConfigureKestrel((context, options) =>
+{
+ // Port configured for WebTransport
+ options.Listen(IPAddress.Any, 5007, listenOptions =>
+ {
+ listenOptions.UseHttps(GenerateManualCertificate());
+ listenOptions.UseConnectionLogging();
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ });
+});
+var host = builder.Build();
+
+host.Run(async (context) =>
+{
+ var feature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+ if (!feature.IsWebTransportRequest)
+ {
+ return;
+ }
+ var session = await feature.AcceptAsync(CancellationToken.None);
+ // open a new stream from the server to the client
+ var stream = await session.OpenUnidirectionalStreamAsync(CancellationToken.None);
+
+ // write data to the stream
+ var outputPipe = stream.Transport.Output;
+ await outputPipe.WriteAsync(new Memory<byte>(new byte[] { 65, 66, 67, 68, 69 }), CancellationToken.None);
+ await outputPipe.FlushAsync(CancellationToken.None);
+});
+
+await host.RunAsync();
+```
diff --git a/eng/Build.props b/eng/Build.props
index afd7af63ef..6599b9d6f2 100644
--- a/eng/Build.props
+++ b/eng/Build.props
@@ -169,7 +169,7 @@
$(RepoRoot)src\Hosting\**\*.*proj;
$(RepoRoot)src\Http\**\*.*proj;
$(RepoRoot)src\HttpClientFactory\**\*.*proj;
- $(RepoRoot)src\Html.Abstractions\*.*proj;
+ $(RepoRoot)src\Html.Abstractions\**\*.*proj;
$(RepoRoot)src\Identity\**\*.*proj;
$(RepoRoot)src\Servers\**\*.csproj;
$(RepoRoot)src\Security\**\*.*proj;
@@ -194,11 +194,12 @@
$(RepoRoot)src\HealthChecks\**\*.csproj;
$(RepoRoot)src\Testing\**\*.csproj;
$(RepoRoot)src\Grpc\**\*.csproj;
- $(RepoRoot)src\ProjectTemplates\*\*.csproj;
+ $(RepoRoot)src\ProjectTemplates\**\*.csproj;
$(RepoRoot)src\submodules\spa-templates\src\*.csproj;
$(RepoRoot)src\Extensions\**\*.csproj;
$(RepoRoot)src\BuildAfterTargetingPack\*.csproj;
$(RepoRoot)src\OpenApi\**\*.csproj;
+ $(RepoRoot)eng\tools\HelixTestRunner\HelixTestRunner.csproj;
"
Exclude="
@(ProjectToBuild);
diff --git a/eng/Dependencies.props b/eng/Dependencies.props
index 0fbdbd667a..c1b35e4853 100644
--- a/eng/Dependencies.props
+++ b/eng/Dependencies.props
@@ -68,16 +68,20 @@ and are generated based on the last package release.
<LatestPackageReference Include="System.CommandLine.Experimental" />
<LatestPackageReference Include="System.ComponentModel" />
<LatestPackageReference Include="System.ComponentModel.Annotations" />
+ <LatestPackageReference Include="System.Configuration.ConfigurationManager" />
<LatestPackageReference Include="System.Diagnostics.DiagnosticSource" />
<LatestPackageReference Include="System.Diagnostics.EventLog" />
<LatestPackageReference Include="System.DirectoryServices.Protocols" />
+ <LatestPackageReference Include="System.IdentityModel.Tokens.Jwt" />
<LatestPackageReference Include="System.IO.Pipelines" />
<LatestPackageReference Include="System.Net.Http" />
<LatestPackageReference Include="System.Net.Http.Json" />
<LatestPackageReference Include="System.Net.Sockets" />
+ <LatestPackageReference Include="System.Private.Uri" />
<LatestPackageReference Include="System.Reflection.Metadata" />
<LatestPackageReference Include="System.Runtime.InteropServices.RuntimeInformation" />
<LatestPackageReference Include="System.Security.Cryptography.Pkcs" />
+ <LatestPackageReference Include="System.Security.Cryptography.X509Certificates" />
<LatestPackageReference Include="System.Security.Cryptography.Xml" />
<LatestPackageReference Include="System.Security.Permissions" />
<LatestPackageReference Include="System.Security.Principal.Windows" />
@@ -151,7 +155,6 @@ and are generated based on the last package release.
<LatestPackageReference Include="Microsoft.Web.Administration" />
<LatestPackageReference Include="Microsoft.Web.Xdt" />
<LatestPackageReference Include="NETStandard.Library" />
- <LatestPackageReference Include="System.IdentityModel.Tokens.Jwt" />
<LatestPackageReference Include="System.Net.Experimental.MsQuic" />
<LatestPackageReference Include="System.Net.Http.WinHttpHandler" />
<LatestPackageReference Include="System.ServiceProcess.ServiceController" />
diff --git a/eng/Localize/LocExclusions.json b/eng/Localize/LocExclusions.json
new file mode 100644
index 0000000000..ae5482d60a
--- /dev/null
+++ b/eng/Localize/LocExclusions.json
@@ -0,0 +1,7 @@
+{
+ "Exclusions": [
+ "src\\Installers\\Windows\\AspNetCoreModule-Setup\\setupstrings.wxl",
+ "src\\Installers\\Windows\\SharedFramework\\Strings.wxl",
+ "src\\Installers\\Windows\\TargetingPack\\Strings.wxl"
+ ]
+}
diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props
index d59faa1b0d..9643ae81d3 100644
--- a/eng/ProjectReferences.props
+++ b/eng/ProjectReferences.props
@@ -89,7 +89,9 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Localization.Routing" ProjectPath="$(RepoRoot)src\Middleware\Localization.Routing\src\Microsoft.AspNetCore.Localization.Routing.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Localization" ProjectPath="$(RepoRoot)src\Middleware\Localization\src\Microsoft.AspNetCore.Localization.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.MiddlewareAnalysis" ProjectPath="$(RepoRoot)src\Middleware\MiddlewareAnalysis\src\Microsoft.AspNetCore.MiddlewareAnalysis.csproj" />
+ <ProjectReferenceProvider Include="Microsoft.AspNetCore.OutputCaching" ProjectPath="$(RepoRoot)src\Middleware\OutputCaching\src\Microsoft.AspNetCore.OutputCaching.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.RateLimiting" ProjectPath="$(RepoRoot)src\Middleware\RateLimiting\src\Microsoft.AspNetCore.RateLimiting.csproj" />
+ <ProjectReferenceProvider Include="Microsoft.AspNetCore.RequestDecompression" ProjectPath="$(RepoRoot)src\Middleware\RequestDecompression\src\Microsoft.AspNetCore.RequestDecompression.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" ProjectPath="$(RepoRoot)src\Middleware\ResponseCaching.Abstractions\src\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.ResponseCaching" ProjectPath="$(RepoRoot)src\Middleware\ResponseCaching\src\Microsoft.AspNetCore.ResponseCaching.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.ResponseCompression" ProjectPath="$(RepoRoot)src\Middleware\ResponseCompression\src\Microsoft.AspNetCore.ResponseCompression.csproj" />
@@ -118,8 +120,6 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.Testing" ProjectPath="$(RepoRoot)src\Mvc\Mvc.Testing\src\Microsoft.AspNetCore.Mvc.Testing.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc.ViewFeatures" ProjectPath="$(RepoRoot)src\Mvc\Mvc.ViewFeatures\src\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Mvc" ProjectPath="$(RepoRoot)src\Mvc\Mvc\src\Microsoft.AspNetCore.Mvc.csproj" />
- <ProjectReferenceProvider Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" ProjectPath="$(RepoRoot)src\Azure\AzureAD\Authentication.AzureAD.UI\src\Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj" />
- <ProjectReferenceProvider Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" ProjectPath="$(RepoRoot)src\Azure\AzureAD\Authentication.AzureADB2C.UI\src\Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.AzureAppServices.HostingStartup" ProjectPath="$(RepoRoot)src\Azure\AzureAppServices.HostingStartup\src\Microsoft.AspNetCore.AzureAppServices.HostingStartup.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.AzureAppServicesIntegration" ProjectPath="$(RepoRoot)src\Azure\AzureAppServicesIntegration\src\Microsoft.AspNetCore.AzureAppServicesIntegration.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.Client.Core" ProjectPath="$(RepoRoot)src\SignalR\clients\csharp\Client.Core\src\Microsoft.AspNetCore.SignalR.Client.Core.csproj" />
@@ -138,6 +138,7 @@
<ProjectReferenceProvider Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" ProjectPath="$(RepoRoot)src\SignalR\server\StackExchangeRedis\src\Microsoft.AspNetCore.SignalR.StackExchangeRedis.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Authorization" ProjectPath="$(RepoRoot)src\Components\Authorization\src\Microsoft.AspNetCore.Components.Authorization.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components" ProjectPath="$(RepoRoot)src\Components\Components\src\Microsoft.AspNetCore.Components.csproj" />
+ <ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.CustomElements" ProjectPath="$(RepoRoot)src\Components\CustomElements\src\Microsoft.AspNetCore.Components.CustomElements.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Forms" ProjectPath="$(RepoRoot)src\Components\Forms\src\Microsoft.AspNetCore.Components.Forms.csproj" />
<ProjectReferenceProvider Include="Microsoft.AspNetCore.Components.Server" ProjectPath="$(RepoRoot)src\Components\Server\src\Microsoft.AspNetCore.Components.Server.csproj" />
<ProjectReferenceProvider Include="Microsoft.Authentication.WebAssembly.Msal" ProjectPath="$(RepoRoot)src\Components\WebAssembly\Authentication.Msal\src\Microsoft.Authentication.WebAssembly.Msal.csproj" />
diff --git a/eng/SharedFramework.External.props b/eng/SharedFramework.External.props
index f7cfee0ff3..2f7d2bdc37 100644
--- a/eng/SharedFramework.External.props
+++ b/eng/SharedFramework.External.props
@@ -42,6 +42,7 @@
<ExternalAspNetCoreAppReference Include="Microsoft.Extensions.Primitives" Version="$(MicrosoftExtensionsPrimitivesVersion)" />
<ExternalAspNetCoreAppReference Include="System.IO.Pipelines" Version="$(SystemIOPipelinesVersion)" />
<ExternalAspNetCoreAppReference Include="System.Security.Cryptography.Xml" Version="$(SystemSecurityCryptographyXmlVersion)" />
+ <ExternalAspNetCoreAppReference Include="System.Threading.RateLimiting" Version="$(SystemThreadingRateLimitingVersion)" />
<!--
Transitive dependencies of other assemblies in the shared framework. These are listed separately and should not be included directly
diff --git a/eng/SharedFramework.Local.props b/eng/SharedFramework.Local.props
index f32bf007b8..d19b15de2d 100644
--- a/eng/SharedFramework.Local.props
+++ b/eng/SharedFramework.Local.props
@@ -18,6 +18,7 @@
<AspNetCoreAppReferenceAndPackage Include="Microsoft.Extensions.Identity.Stores" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Connections.Abstractions" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Authorization" />
+ <AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.RateLimiting" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Connections.Common" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Protocols.Json" />
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.SignalR.Common" />
@@ -77,6 +78,8 @@
<AspNetCoreAppReference Include="Microsoft.AspNetCore.HttpsPolicy" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Localization.Routing" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Localization" />
+ <AspNetCoreAppReference Include="Microsoft.AspNetCore.OutputCaching" />
+ <AspNetCoreAppReference Include="Microsoft.AspNetCore.RequestDecompression" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.ResponseCaching" />
<AspNetCoreAppReference Include="Microsoft.AspNetCore.ResponseCompression" />
diff --git a/eng/Signing.props b/eng/Signing.props
index 66f8dc2ce8..db20e2e9a4 100644
--- a/eng/Signing.props
+++ b/eng/Signing.props
@@ -79,6 +79,7 @@
<FileSignInfo Include="dotnet-user-secrets.exe" CertificateName="MicrosoftDotNet500" />
<FileSignInfo Include="dotnet-watch.exe" CertificateName="MicrosoftDotNet500" />
<FileSignInfo Include="dotnet-openapi.exe" CertificateName="MicrosoftDotNet500" />
+ <FileSignInfo Include="dotnet-user-jwts.exe" CertificateName="MicrosoftDotNet500" />
<FileSignInfo Include="Microsoft.AspNetCore.Blazor.Build.exe" CertificateName="MicrosoftDotNet500" />
<FileSignInfo Include="sni.dll" CertificateName="MicrosoftDotNet500" />
diff --git a/eng/SourceBuild.props b/eng/SourceBuild.props
index f81ea7e5fe..aa175db452 100644
--- a/eng/SourceBuild.props
+++ b/eng/SourceBuild.props
@@ -72,4 +72,19 @@
</PropertyGroup>
</Target>
+ <Target Name="GetAspnetcoreCategorizedIntermediateNupkgContents"
+ BeforeTargets="GetCategorizedIntermediateNupkgContents">
+ <PropertyGroup>
+ <InstallersArtifactsDir>$(CurrentRepoSourceBuildArtifactsDir)\installers\$(Configuration)\</InstallersArtifactsDir>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <!--
+ Add the internal installers artifacts required by dotnet/installer.
+ -->
+ <IntermediateNupkgArtifactFile Include="$(InstallersArtifactsDir)aspnetcore-runtime-internal-*.tar.gz" />
+ <IntermediateNupkgArtifactFile Include="$(InstallersArtifactsDir)aspnetcore_base_runtime.version" />
+ </ItemGroup>
+ </Target>
+
</Project>
diff --git a/eng/TrimmableProjects.props b/eng/TrimmableProjects.props
index 2721673fb8..50a1520c57 100644
--- a/eng/TrimmableProjects.props
+++ b/eng/TrimmableProjects.props
@@ -7,6 +7,7 @@
-->
<Project>
<ItemGroup>
+ <TrimmableProject Include="Microsoft.AspNetCore" />
<TrimmableProject Include="Microsoft.AspNetCore.DataProtection.Abstractions" />
<TrimmableProject Include="Microsoft.AspNetCore.Cryptography.Internal" />
<TrimmableProject Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" />
@@ -14,6 +15,7 @@
<TrimmableProject Include="Microsoft.AspNetCore.DataProtection.EntityFrameworkCore" />
<TrimmableProject Include="Microsoft.AspNetCore.DataProtection.Extensions" />
<TrimmableProject Include="Microsoft.AspNetCore.DataProtection.StackExchangeRedis" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Antiforgery" />
<TrimmableProject Include="Microsoft.AspNetCore.Hosting.Abstractions" />
<TrimmableProject Include="Microsoft.AspNetCore.Hosting" />
<TrimmableProject Include="Microsoft.AspNetCore.Hosting.Server.Abstractions" />
@@ -28,6 +30,10 @@
<TrimmableProject Include="Microsoft.AspNetCore.Routing.Abstractions" />
<TrimmableProject Include="Microsoft.AspNetCore.Routing" />
<TrimmableProject Include="Microsoft.AspNetCore.WebUtilities" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Html.Abstractions" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Identity" />
+ <TrimmableProject Include="Microsoft.Extensions.Identity.Core" />
+ <TrimmableProject Include="Microsoft.Extensions.Identity.Stores" />
<TrimmableProject Include="Microsoft.AspNetCore.Connections.Abstractions" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.HttpSys" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.IISIntegration" />
@@ -36,18 +42,61 @@
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" />
<TrimmableProject Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.Certificate" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.Cookies" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.Facebook" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.Google" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.Negotiate" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.OAuth" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.Twitter" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authentication.WsFederation" />
<TrimmableProject Include="Microsoft.AspNetCore.Authorization" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Authorization.Policy" />
+ <TrimmableProject Include="Microsoft.AspNetCore.CookiePolicy" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Cors" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Diagnostics.Abstractions" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Diagnostics" />
+ <TrimmableProject Include="Microsoft.AspNetCore.HeaderPropagation" />
+ <TrimmableProject Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Diagnostics.HealthChecks" />
+ <TrimmableProject Include="Microsoft.AspNetCore.HostFiltering" />
+ <TrimmableProject Include="Microsoft.AspNetCore.HttpLogging" />
<TrimmableProject Include="Microsoft.AspNetCore.HttpOverrides" />
+ <TrimmableProject Include="Microsoft.AspNetCore.HttpsPolicy" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Localization.Routing" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Localization" />
+ <TrimmableProject Include="Microsoft.AspNetCore.OutputCaching" />
+ <TrimmableProject Include="Microsoft.AspNetCore.RateLimiting" />
+ <TrimmableProject Include="Microsoft.AspNetCore.RequestDecompression" />
+ <TrimmableProject Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" />
+ <TrimmableProject Include="Microsoft.AspNetCore.ResponseCaching" />
+ <TrimmableProject Include="Microsoft.AspNetCore.ResponseCompression" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Rewrite" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Session" />
+ <TrimmableProject Include="Microsoft.AspNetCore.SpaProxy" />
+ <TrimmableProject Include="Microsoft.AspNetCore.SpaServices.Extensions" />
+ <TrimmableProject Include="Microsoft.AspNetCore.StaticFiles" />
+ <TrimmableProject Include="Microsoft.AspNetCore.WebSockets" />
<TrimmableProject Include="Microsoft.AspNetCore.Components.Authorization" />
<TrimmableProject Include="Microsoft.AspNetCore.Components" />
+ <TrimmableProject Include="Microsoft.AspNetCore.Components.CustomElements" />
<TrimmableProject Include="Microsoft.AspNetCore.Components.Forms" />
<TrimmableProject Include="Microsoft.Authentication.WebAssembly.Msal" />
<TrimmableProject Include="Microsoft.JSInterop.WebAssembly" />
<TrimmableProject Include="Microsoft.AspNetCore.Components.WebAssembly.Authentication" />
<TrimmableProject Include="Microsoft.AspNetCore.Components.WebAssembly" />
<TrimmableProject Include="Microsoft.AspNetCore.Components.Web" />
+ <TrimmableProject Include="Microsoft.Extensions.Localization.Abstractions" />
<TrimmableProject Include="Microsoft.Extensions.ObjectPool" />
<TrimmableProject Include="Microsoft.JSInterop" />
+ <TrimmableProject Include="Microsoft.Extensions.WebEncoders" />
+ <TrimmableProject Include="Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" />
+ <TrimmableProject Include="Microsoft.Extensions.Diagnostics.HealthChecks" />
<TrimmableProject Include="Microsoft.Extensions.Features" />
</ItemGroup>
</Project>
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 62ed2f8163..6e23ae0129 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -9,301 +9,310 @@
-->
<Dependencies>
<ProductDependencies>
- <Dependency Name="dotnet-ef" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="dotnet-ef" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore.InMemory" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore.Relational" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore.Tools" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.EntityFrameworkCore.Design" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.EntityFrameworkCore.Design" Version="8.0.0-alpha.1.22422.17">
<Uri>https://github.com/dotnet/efcore</Uri>
- <Sha>2a9e7c67627ebf5c6944e93e191c634e89a138a6</Sha>
+ <Sha>7c60ac7c135b8e4debc16dd00d616b38c4027813</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Caching.Memory" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Caching.Memory" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.Binder" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.CommandLine" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.FileExtensions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.Ini" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.Json" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.Json" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration.Xml" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Configuration" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Configuration" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.DependencyInjection" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.DependencyInjection" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.FileProviders.Abstractions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.FileProviders.Composite" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.FileProviders.Physical" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.FileSystemGlobbing" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.HostFactoryResolver.Sources" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Hosting" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Hosting" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Http" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Http" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.Abstractions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.Configuration" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.Console" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.Console" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.Debug" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.Debug" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.EventSource" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.EventLog" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging.TraceSource" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Logging" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Logging" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Options.DataAnnotations" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Options" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Options" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.Primitives" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.Primitives" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Internal.Runtime.AspNetCore.Transport" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Internal.Runtime.AspNetCore.Transport" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Diagnostics.DiagnosticSource" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.SourceBuild.Intermediate.source-build-externals" Version="7.0.0-alpha.1.22409.1">
+ <Uri>https://github.com/dotnet/source-build-externals</Uri>
+ <Sha>ee790b0477953dd30ea83e0e47af909a04fd0ca3</Sha>
+ <SourceBuild RepoName="source-build-externals" ManagedOnly="true" />
+ </Dependency>
+ <Dependency Name="System.Configuration.ConfigurationManager" Version="8.0.0-alpha.1.22423.18">
+ <Uri>https://github.com/dotnet/runtime</Uri>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
+ </Dependency>
+ <Dependency Name="System.Diagnostics.DiagnosticSource" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Diagnostics.EventLog" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Diagnostics.EventLog" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.DirectoryServices.Protocols" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.DirectoryServices.Protocols" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.IO.Pipelines" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.IO.Pipelines" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Net.Http.Json" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Net.Http.Json" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Net.Http.WinHttpHandler" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Net.Http.WinHttpHandler" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Reflection.Metadata" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Reflection.Metadata" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Resources.Extensions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Resources.Extensions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Security.Cryptography.Pkcs" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Security.Cryptography.Pkcs" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Security.Cryptography.Xml" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Security.Cryptography.Xml" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Security.Permissions" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Security.Permissions" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.ServiceProcess.ServiceController" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.ServiceProcess.ServiceController" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Text.Encodings.Web" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Text.Encodings.Web" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Text.Json" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Text.Json" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Threading.AccessControl" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Threading.AccessControl" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Threading.Channels" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Threading.Channels" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="System.Threading.RateLimiting" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="System.Threading.RateLimiting" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.Extensions.DependencyModel" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.Extensions.DependencyModel" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.NETCore.App.Ref" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NETCore.App.Ref" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.NET.Runtime.MonoAOTCompiler.Task" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NET.Runtime.MonoAOTCompiler.Task" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.NET.Runtime.WebAssembly.Sdk" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NET.Runtime.WebAssembly.Sdk" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
<!--
Win-x64 is used here because we have picked an arbitrary runtime identifier to flow the version of the latest NETCore.App runtime.
All Runtime.$rid packages should have the same version.
-->
- <Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NETCore.App.Runtime.win-x64" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NETCore.App.Runtime.AOT.win-x64.Cross.browser-wasm" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.NETCore.BrowserDebugHost.Transport" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NETCore.BrowserDebugHost.Transport" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
</ProductDependencies>
<ToolsetDependencies>
<!-- Listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
- <Dependency Name="Microsoft.NETCore.Platforms" Version="7.0.0-preview.4.22218.7">
+ <Dependency Name="Microsoft.NETCore.Platforms" Version="8.0.0-alpha.1.22423.18">
<Uri>https://github.com/dotnet/runtime</Uri>
- <Sha>778b5226df678f5bf2653e7605e7ce75e8840da4</Sha>
+ <Sha>03c21467c97e75103d429a0e67504e402f6da17d</Sha>
</Dependency>
- <Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="7.0.0-beta.22215.2">
+ <Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="7.0.0-beta.22419.1">
<Uri>https://github.com/dotnet/arcade</Uri>
- <Sha>4000024394df3049886c50e54ad0a2b903221ef0</Sha>
+ <Sha>34dff939b4a91e4693f78a856e0e055c1a3f3fba</Sha>
<SourceBuild RepoName="arcade" ManagedOnly="true" />
</Dependency>
- <Dependency Name="Microsoft.DotNet.Build.Tasks.Installers" Version="7.0.0-beta.22215.2">
+ <Dependency Name="Microsoft.DotNet.Build.Tasks.Installers" Version="7.0.0-beta.22419.1">
<Uri>https://github.com/dotnet/arcade</Uri>
- <Sha>4000024394df3049886c50e54ad0a2b903221ef0</Sha>
+ <Sha>34dff939b4a91e4693f78a856e0e055c1a3f3fba</Sha>
</Dependency>
- <Dependency Name="Microsoft.DotNet.Build.Tasks.Templating" Version="7.0.0-beta.22215.2">
+ <Dependency Name="Microsoft.DotNet.Build.Tasks.Templating" Version="7.0.0-beta.22419.1">
<Uri>https://github.com/dotnet/arcade</Uri>
- <Sha>4000024394df3049886c50e54ad0a2b903221ef0</Sha>
+ <Sha>34dff939b4a91e4693f78a856e0e055c1a3f3fba</Sha>
</Dependency>
- <Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="7.0.0-beta.22215.2">
+ <Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="7.0.0-beta.22419.1">
<Uri>https://github.com/dotnet/arcade</Uri>
- <Sha>4000024394df3049886c50e54ad0a2b903221ef0</Sha>
+ <Sha>34dff939b4a91e4693f78a856e0e055c1a3f3fba</Sha>
</Dependency>
</ToolsetDependencies>
</Dependencies>
diff --git a/eng/Versions.props b/eng/Versions.props
index 162b9821ac..de206178c4 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -6,18 +6,18 @@
-->
<Project>
<PropertyGroup Label="Version settings">
- <AspNetCoreMajorVersion>7</AspNetCoreMajorVersion>
+ <AspNetCoreMajorVersion>8</AspNetCoreMajorVersion>
<AspNetCoreMinorVersion>0</AspNetCoreMinorVersion>
<AspNetCorePatchVersion>0</AspNetCorePatchVersion>
- <PreReleaseVersionIteration>4</PreReleaseVersionIteration>
+ <PreReleaseVersionIteration>1</PreReleaseVersionIteration>
<ValidateBaseline>true</ValidateBaseline>
<!--
When StabilizePackageVersion is set to 'true', this branch will produce stable outputs for 'Shipping' packages
-->
<StabilizePackageVersion Condition="'$(StabilizePackageVersion)' == ''">false</StabilizePackageVersion>
<DotNetFinalVersionKind Condition="'$(StabilizePackageVersion)' == 'true'">release</DotNetFinalVersionKind>
- <PreReleaseVersionLabel>preview</PreReleaseVersionLabel>
- <PreReleaseBrandingLabel>Preview $(PreReleaseVersionIteration)</PreReleaseBrandingLabel>
+ <PreReleaseVersionLabel>alpha</PreReleaseVersionLabel>
+ <PreReleaseBrandingLabel>Alpha $(PreReleaseVersionIteration)</PreReleaseBrandingLabel>
<IncludePreReleaseLabelInPackageVersion>true</IncludePreReleaseLabelInPackageVersion>
<IncludePreReleaseLabelInPackageVersion Condition=" '$(DotNetFinalVersionKind)' == 'release' ">false</IncludePreReleaseLabelInPackageVersion>
<AspNetCoreMajorMinorVersion>$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)</AspNetCoreMajorMinorVersion>
@@ -50,6 +50,8 @@
<UsingToolNetFrameworkReferenceAssemblies Condition="'$(OS)' != 'Windows_NT'">true</UsingToolNetFrameworkReferenceAssemblies>
<!-- Disable XLIFF tasks -->
<UsingToolXliff>false</UsingToolXliff>
+ <!-- Use custom version of Roslyn Compiler -->
+ <UsingToolMicrosoftNetCompilers>true</UsingToolMicrosoftNetCompilers>
</PropertyGroup>
<!--
@@ -63,79 +65,82 @@
-->
<PropertyGroup Label="Automated">
<!-- Packages from dotnet/runtime -->
- <MicrosoftExtensionsDependencyModelVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsDependencyModelVersion>
- <MicrosoftNETCoreAppRefVersion>7.0.0-preview.4.22218.7</MicrosoftNETCoreAppRefVersion>
- <MicrosoftNETCoreAppRuntimewinx64Version>7.0.0-preview.4.22218.7</MicrosoftNETCoreAppRuntimewinx64Version>
- <MicrosoftNETRuntimeMonoAOTCompilerTaskVersion>7.0.0-preview.4.22218.7</MicrosoftNETRuntimeMonoAOTCompilerTaskVersion>
- <MicrosoftNETRuntimeWebAssemblySdkVersion>7.0.0-preview.4.22218.7</MicrosoftNETRuntimeWebAssemblySdkVersion>
- <MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion>7.0.0-preview.4.22218.7</MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion>
- <MicrosoftNETCoreBrowserDebugHostTransportVersion>7.0.0-preview.4.22218.7</MicrosoftNETCoreBrowserDebugHostTransportVersion>
- <MicrosoftExtensionsCachingAbstractionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsCachingAbstractionsVersion>
- <MicrosoftExtensionsCachingMemoryVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsCachingMemoryVersion>
- <MicrosoftExtensionsConfigurationAbstractionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationAbstractionsVersion>
- <MicrosoftExtensionsConfigurationBinderVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationBinderVersion>
- <MicrosoftExtensionsConfigurationCommandLineVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationCommandLineVersion>
- <MicrosoftExtensionsConfigurationEnvironmentVariablesVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationEnvironmentVariablesVersion>
- <MicrosoftExtensionsConfigurationFileExtensionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationFileExtensionsVersion>
- <MicrosoftExtensionsConfigurationIniVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationIniVersion>
- <MicrosoftExtensionsConfigurationJsonVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationJsonVersion>
- <MicrosoftExtensionsConfigurationVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationVersion>
- <MicrosoftExtensionsConfigurationUserSecretsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationUserSecretsVersion>
- <MicrosoftExtensionsConfigurationXmlVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsConfigurationXmlVersion>
- <MicrosoftExtensionsDependencyInjectionAbstractionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsDependencyInjectionAbstractionsVersion>
- <MicrosoftExtensionsDependencyInjectionVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsDependencyInjectionVersion>
- <MicrosoftExtensionsFileProvidersAbstractionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsFileProvidersAbstractionsVersion>
- <MicrosoftExtensionsFileProvidersCompositeVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsFileProvidersCompositeVersion>
- <MicrosoftExtensionsFileProvidersPhysicalVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsFileProvidersPhysicalVersion>
- <MicrosoftExtensionsFileSystemGlobbingVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsFileSystemGlobbingVersion>
- <MicrosoftExtensionsHostFactoryResolverSourcesVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsHostFactoryResolverSourcesVersion>
- <MicrosoftExtensionsHostingAbstractionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsHostingAbstractionsVersion>
- <MicrosoftExtensionsHostingVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsHostingVersion>
- <MicrosoftExtensionsHttpVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsHttpVersion>
- <MicrosoftExtensionsLoggingAbstractionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingAbstractionsVersion>
- <MicrosoftExtensionsLoggingConfigurationVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingConfigurationVersion>
- <MicrosoftExtensionsLoggingConsoleVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingConsoleVersion>
- <MicrosoftExtensionsLoggingDebugVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingDebugVersion>
- <MicrosoftExtensionsLoggingEventSourceVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingEventSourceVersion>
- <MicrosoftExtensionsLoggingEventLogVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingEventLogVersion>
- <MicrosoftExtensionsLoggingVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingVersion>
- <MicrosoftExtensionsLoggingTraceSourceVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsLoggingTraceSourceVersion>
- <MicrosoftExtensionsOptionsConfigurationExtensionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsOptionsConfigurationExtensionsVersion>
- <MicrosoftExtensionsOptionsDataAnnotationsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsOptionsDataAnnotationsVersion>
- <MicrosoftExtensionsOptionsVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsOptionsVersion>
- <MicrosoftExtensionsPrimitivesVersion>7.0.0-preview.4.22218.7</MicrosoftExtensionsPrimitivesVersion>
- <MicrosoftInternalRuntimeAspNetCoreTransportVersion>7.0.0-preview.4.22218.7</MicrosoftInternalRuntimeAspNetCoreTransportVersion>
- <SystemDiagnosticsDiagnosticSourceVersion>7.0.0-preview.4.22218.7</SystemDiagnosticsDiagnosticSourceVersion>
- <SystemDiagnosticsEventLogVersion>7.0.0-preview.4.22218.7</SystemDiagnosticsEventLogVersion>
- <SystemDirectoryServicesProtocolsVersion>7.0.0-preview.4.22218.7</SystemDirectoryServicesProtocolsVersion>
- <SystemIOPipelinesVersion>7.0.0-preview.4.22218.7</SystemIOPipelinesVersion>
- <SystemNetHttpJsonVersion>7.0.0-preview.4.22218.7</SystemNetHttpJsonVersion>
- <SystemNetHttpWinHttpHandlerVersion>7.0.0-preview.4.22218.7</SystemNetHttpWinHttpHandlerVersion>
- <SystemReflectionMetadataVersion>7.0.0-preview.4.22218.7</SystemReflectionMetadataVersion>
- <SystemResourcesExtensionsVersion>7.0.0-preview.4.22218.7</SystemResourcesExtensionsVersion>
- <SystemSecurityCryptographyPkcsVersion>7.0.0-preview.4.22218.7</SystemSecurityCryptographyPkcsVersion>
- <SystemSecurityCryptographyXmlVersion>7.0.0-preview.4.22218.7</SystemSecurityCryptographyXmlVersion>
- <SystemSecurityPermissionsVersion>7.0.0-preview.4.22218.7</SystemSecurityPermissionsVersion>
- <SystemServiceProcessServiceControllerVersion>7.0.0-preview.4.22218.7</SystemServiceProcessServiceControllerVersion>
- <SystemTextEncodingsWebVersion>7.0.0-preview.4.22218.7</SystemTextEncodingsWebVersion>
- <SystemTextJsonVersion>7.0.0-preview.4.22218.7</SystemTextJsonVersion>
- <SystemThreadingAccessControlVersion>7.0.0-preview.4.22218.7</SystemThreadingAccessControlVersion>
- <SystemThreadingChannelsVersion>7.0.0-preview.4.22218.7</SystemThreadingChannelsVersion>
- <SystemThreadingRateLimitingVersion>7.0.0-preview.4.22218.7</SystemThreadingRateLimitingVersion>
+ <MicrosoftExtensionsDependencyModelVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsDependencyModelVersion>
+ <MicrosoftNETCoreAppRefVersion>8.0.0-alpha.1.22423.18</MicrosoftNETCoreAppRefVersion>
+ <MicrosoftNETCoreAppRuntimewinx64Version>8.0.0-alpha.1.22423.18</MicrosoftNETCoreAppRuntimewinx64Version>
+ <MicrosoftNETRuntimeMonoAOTCompilerTaskVersion>8.0.0-alpha.1.22423.18</MicrosoftNETRuntimeMonoAOTCompilerTaskVersion>
+ <MicrosoftNETRuntimeWebAssemblySdkVersion>8.0.0-alpha.1.22423.18</MicrosoftNETRuntimeWebAssemblySdkVersion>
+ <MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion>8.0.0-alpha.1.22423.18</MicrosoftNETCoreAppRuntimeAOTwinx64CrossbrowserwasmVersion>
+ <MicrosoftNETCoreBrowserDebugHostTransportVersion>8.0.0-alpha.1.22423.18</MicrosoftNETCoreBrowserDebugHostTransportVersion>
+ <MicrosoftExtensionsCachingAbstractionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsCachingAbstractionsVersion>
+ <MicrosoftExtensionsCachingMemoryVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsCachingMemoryVersion>
+ <MicrosoftExtensionsConfigurationAbstractionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationAbstractionsVersion>
+ <MicrosoftExtensionsConfigurationBinderVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationBinderVersion>
+ <MicrosoftExtensionsConfigurationCommandLineVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationCommandLineVersion>
+ <MicrosoftExtensionsConfigurationEnvironmentVariablesVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationEnvironmentVariablesVersion>
+ <MicrosoftExtensionsConfigurationFileExtensionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationFileExtensionsVersion>
+ <MicrosoftExtensionsConfigurationIniVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationIniVersion>
+ <MicrosoftExtensionsConfigurationJsonVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationJsonVersion>
+ <MicrosoftExtensionsConfigurationVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationVersion>
+ <MicrosoftExtensionsConfigurationUserSecretsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationUserSecretsVersion>
+ <MicrosoftExtensionsConfigurationXmlVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsConfigurationXmlVersion>
+ <MicrosoftExtensionsDependencyInjectionAbstractionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsDependencyInjectionAbstractionsVersion>
+ <MicrosoftExtensionsDependencyInjectionVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsDependencyInjectionVersion>
+ <MicrosoftExtensionsFileProvidersAbstractionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsFileProvidersAbstractionsVersion>
+ <MicrosoftExtensionsFileProvidersCompositeVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsFileProvidersCompositeVersion>
+ <MicrosoftExtensionsFileProvidersPhysicalVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsFileProvidersPhysicalVersion>
+ <MicrosoftExtensionsFileSystemGlobbingVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsFileSystemGlobbingVersion>
+ <MicrosoftExtensionsHostFactoryResolverSourcesVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsHostFactoryResolverSourcesVersion>
+ <MicrosoftExtensionsHostingAbstractionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsHostingAbstractionsVersion>
+ <MicrosoftExtensionsHostingVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsHostingVersion>
+ <MicrosoftExtensionsHttpVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsHttpVersion>
+ <MicrosoftExtensionsLoggingAbstractionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingAbstractionsVersion>
+ <MicrosoftExtensionsLoggingConfigurationVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingConfigurationVersion>
+ <MicrosoftExtensionsLoggingConsoleVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingConsoleVersion>
+ <MicrosoftExtensionsLoggingDebugVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingDebugVersion>
+ <MicrosoftExtensionsLoggingEventSourceVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingEventSourceVersion>
+ <MicrosoftExtensionsLoggingEventLogVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingEventLogVersion>
+ <MicrosoftExtensionsLoggingVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingVersion>
+ <MicrosoftExtensionsLoggingTraceSourceVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsLoggingTraceSourceVersion>
+ <MicrosoftExtensionsOptionsConfigurationExtensionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsOptionsConfigurationExtensionsVersion>
+ <MicrosoftExtensionsOptionsDataAnnotationsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsOptionsDataAnnotationsVersion>
+ <MicrosoftExtensionsOptionsVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsOptionsVersion>
+ <MicrosoftExtensionsPrimitivesVersion>8.0.0-alpha.1.22423.18</MicrosoftExtensionsPrimitivesVersion>
+ <MicrosoftInternalRuntimeAspNetCoreTransportVersion>8.0.0-alpha.1.22423.18</MicrosoftInternalRuntimeAspNetCoreTransportVersion>
+ <SystemConfigurationConfigurationManagerVersion>8.0.0-alpha.1.22423.18</SystemConfigurationConfigurationManagerVersion>
+ <SystemDiagnosticsDiagnosticSourceVersion>8.0.0-alpha.1.22423.18</SystemDiagnosticsDiagnosticSourceVersion>
+ <SystemDiagnosticsEventLogVersion>8.0.0-alpha.1.22423.18</SystemDiagnosticsEventLogVersion>
+ <SystemDirectoryServicesProtocolsVersion>8.0.0-alpha.1.22423.18</SystemDirectoryServicesProtocolsVersion>
+ <SystemIOPipelinesVersion>8.0.0-alpha.1.22423.18</SystemIOPipelinesVersion>
+ <SystemNetHttpJsonVersion>8.0.0-alpha.1.22423.18</SystemNetHttpJsonVersion>
+ <SystemNetHttpWinHttpHandlerVersion>8.0.0-alpha.1.22423.18</SystemNetHttpWinHttpHandlerVersion>
+ <SystemReflectionMetadataVersion>8.0.0-alpha.1.22423.18</SystemReflectionMetadataVersion>
+ <SystemResourcesExtensionsVersion>8.0.0-alpha.1.22423.18</SystemResourcesExtensionsVersion>
+ <SystemSecurityCryptographyPkcsVersion>8.0.0-alpha.1.22423.18</SystemSecurityCryptographyPkcsVersion>
+ <SystemSecurityCryptographyXmlVersion>8.0.0-alpha.1.22423.18</SystemSecurityCryptographyXmlVersion>
+ <SystemSecurityPermissionsVersion>8.0.0-alpha.1.22423.18</SystemSecurityPermissionsVersion>
+ <SystemServiceProcessServiceControllerVersion>8.0.0-alpha.1.22423.18</SystemServiceProcessServiceControllerVersion>
+ <SystemTextEncodingsWebVersion>8.0.0-alpha.1.22423.18</SystemTextEncodingsWebVersion>
+ <SystemTextJsonVersion>8.0.0-alpha.1.22423.18</SystemTextJsonVersion>
+ <SystemThreadingAccessControlVersion>8.0.0-alpha.1.22423.18</SystemThreadingAccessControlVersion>
+ <SystemThreadingChannelsVersion>8.0.0-alpha.1.22423.18</SystemThreadingChannelsVersion>
+ <SystemThreadingRateLimitingVersion>8.0.0-alpha.1.22423.18</SystemThreadingRateLimitingVersion>
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
- <MicrosoftNETCorePlatformsVersion>7.0.0-preview.4.22218.7</MicrosoftNETCorePlatformsVersion>
+ <MicrosoftNETCorePlatformsVersion>8.0.0-alpha.1.22423.18</MicrosoftNETCorePlatformsVersion>
<!-- Packages from dotnet/efcore -->
- <dotnetefVersion>7.0.0-preview.4.22218.7</dotnetefVersion>
- <MicrosoftEntityFrameworkCoreInMemoryVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreInMemoryVersion>
- <MicrosoftEntityFrameworkCoreRelationalVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreRelationalVersion>
- <MicrosoftEntityFrameworkCoreSqliteVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreSqliteVersion>
- <MicrosoftEntityFrameworkCoreSqlServerVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreSqlServerVersion>
- <MicrosoftEntityFrameworkCoreToolsVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreToolsVersion>
- <MicrosoftEntityFrameworkCoreVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreVersion>
- <MicrosoftEntityFrameworkCoreDesignVersion>7.0.0-preview.4.22218.7</MicrosoftEntityFrameworkCoreDesignVersion>
+ <dotnetefVersion>8.0.0-alpha.1.22422.17</dotnetefVersion>
+ <MicrosoftEntityFrameworkCoreInMemoryVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreInMemoryVersion>
+ <MicrosoftEntityFrameworkCoreRelationalVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreRelationalVersion>
+ <MicrosoftEntityFrameworkCoreSqliteVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreSqliteVersion>
+ <MicrosoftEntityFrameworkCoreSqlServerVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreSqlServerVersion>
+ <MicrosoftEntityFrameworkCoreToolsVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreToolsVersion>
+ <MicrosoftEntityFrameworkCoreVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreVersion>
+ <MicrosoftEntityFrameworkCoreDesignVersion>8.0.0-alpha.1.22422.17</MicrosoftEntityFrameworkCoreDesignVersion>
<!-- Packages from dotnet/arcade -->
- <MicrosoftDotNetBuildTasksInstallersVersion>7.0.0-beta.22215.2</MicrosoftDotNetBuildTasksInstallersVersion>
- <MicrosoftDotNetBuildTasksTemplatingVersion>7.0.0-beta.22215.2</MicrosoftDotNetBuildTasksTemplatingVersion>
+ <MicrosoftDotNetBuildTasksInstallersVersion>7.0.0-beta.22419.1</MicrosoftDotNetBuildTasksInstallersVersion>
+ <MicrosoftDotNetBuildTasksTemplatingVersion>7.0.0-beta.22419.1</MicrosoftDotNetBuildTasksTemplatingVersion>
+ <!-- Packages from dotnet/source-build-externals -->
+ <MicrosoftSourceBuildIntermediatesourcebuildexternalsVersion>7.0.0-alpha.1.22409.1</MicrosoftSourceBuildIntermediatesourcebuildexternalsVersion>
</PropertyGroup>
<!--
@@ -168,6 +173,8 @@
<SystemComponentModelVersion>4.3.0</SystemComponentModelVersion>
<SystemNetHttpVersion>4.3.4</SystemNetHttpVersion>
<SystemNetSocketsVersion>4.3.0</SystemNetSocketsVersion>
+ <SystemPrivateUriVersion>4.3.2</SystemPrivateUriVersion>
+ <SystemSecurityCryptographyX509CertificatesVersion>4.3.2</SystemSecurityCryptographyX509CertificatesVersion>
<SystemRuntimeInteropServicesRuntimeInformationVersion>4.3.0</SystemRuntimeInteropServicesRuntimeInformationVersion>
<SystemThreadingTasksExtensionsVersion>4.5.4</SystemThreadingTasksExtensionsVersion>
<SystemValueTupleVersion>4.5.0</SystemValueTupleVersion>
@@ -192,6 +199,10 @@
-->
<MicrosoftNETTestSdkVersion>17.1.0-preview-20211109-03</MicrosoftNETTestSdkVersion>
<!--
+ Use a compiler new enough to use required keyword
+ -->
+ <MicrosoftNetCompilersToolsetVersion>4.4.0-1.22358.14</MicrosoftNetCompilersToolsetVersion>
+ <!--
Versions of Microsoft.CodeAnalysis packages referenced by analyzers shipped in the SDK.
This need to be pinned since they're used in 3.1 apps and need to be loadable in VS 2019.
-->
@@ -200,9 +211,9 @@
<MicrosoftCodeAnalysisCommonVersion>4.2.0-2.22128.1</MicrosoftCodeAnalysisCommonVersion>
<MicrosoftCodeAnalysisCSharpVersion>4.2.0-2.22128.1</MicrosoftCodeAnalysisCSharpVersion>
<MicrosoftCodeAnalysisCSharpWorkspacesVersion>4.2.0-2.22128.1</MicrosoftCodeAnalysisCSharpWorkspacesVersion>
- <MicrosoftCodeAnalysisPublicApiAnalyzersVersion>3.3.0</MicrosoftCodeAnalysisPublicApiAnalyzersVersion>
- <MicrosoftCodeAnalysisCSharpAnalyzerTestingXUnitVersion>1.1.1-beta1.21413.1</MicrosoftCodeAnalysisCSharpAnalyzerTestingXUnitVersion>
- <MicrosoftCodeAnalysisCSharpCodeFixTestingXUnitVersion>1.1.1-beta1.21413.1</MicrosoftCodeAnalysisCSharpCodeFixTestingXUnitVersion>
+ <MicrosoftCodeAnalysisPublicApiAnalyzersVersion>3.3.3</MicrosoftCodeAnalysisPublicApiAnalyzersVersion>
+ <MicrosoftCodeAnalysisCSharpAnalyzerTestingXUnitVersion>1.1.2-beta1.22276.1</MicrosoftCodeAnalysisCSharpAnalyzerTestingXUnitVersion>
+ <MicrosoftCodeAnalysisCSharpCodeFixTestingXUnitVersion>1.1.2-beta1.22276.1</MicrosoftCodeAnalysisCSharpCodeFixTestingXUnitVersion>
<MicrosoftCssParserVersion>1.0.0-20200708.1</MicrosoftCssParserVersion>
<MicrosoftIdentityModelLoggingVersion>6.15.1</MicrosoftIdentityModelLoggingVersion>
<MicrosoftIdentityModelProtocolsOpenIdConnectVersion>6.15.1</MicrosoftIdentityModelProtocolsOpenIdConnectVersion>
@@ -213,23 +224,23 @@
<MicrosoftOwinTestingVersion>3.0.1</MicrosoftOwinTestingVersion>
<MicrosoftWebAdministrationVersion>11.1.0</MicrosoftWebAdministrationVersion>
<MicrosoftWebXdtVersion>1.4.0</MicrosoftWebXdtVersion>
- <SystemIdentityModelTokensJwtVersion>6.15.1</SystemIdentityModelTokensJwtVersion>
- <NuGetPackagingVersion>5.11.0</NuGetPackagingVersion>
- <NuGetVersioningVersion>5.11.0</NuGetVersioningVersion>
- <NuGetFrameworksVersion>5.11.0</NuGetFrameworksVersion>
+ <SystemIdentityModelTokensJwtVersion>6.21.0</SystemIdentityModelTokensJwtVersion>
+ <NuGetPackagingVersion>6.2.0</NuGetPackagingVersion>
+ <NuGetVersioningVersion>6.2.0</NuGetVersioningVersion>
+ <NuGetFrameworksVersion>6.2.0</NuGetFrameworksVersion>
<SystemComponentModelAnnotationsVersion>5.0.0</SystemComponentModelAnnotationsVersion>
<SystemNetExperimentalMsQuicVersion>5.0.0-alpha.20560.6</SystemNetExperimentalMsQuicVersion>
<SystemSecurityPrincipalWindowsVersion>5.0.0</SystemSecurityPrincipalWindowsVersion>
<!-- Packages from 2.1, 3.1, and 5.0 branches used for site extension build. -->
<MicrosoftAspNetCoreAzureAppServicesSiteExtension21Version>2.1.1</MicrosoftAspNetCoreAzureAppServicesSiteExtension21Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension22Version>2.2.0</MicrosoftAspNetCoreAzureAppServicesSiteExtension22Version>
- <MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version>3.1.24-servicing-22180-6</MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version>
+ <MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version>3.1.28-servicing-22364-2</MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension31x64Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension31x64Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension31x86Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension31Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension31x86Version>
- <MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version>5.0.16-servicing-22167-6</MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version>
+ <MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version>5.0.17-servicing-22215-7</MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension50x64Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension50x64Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension50x86Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension50Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension50x86Version>
- <MicrosoftAspNetCoreAzureAppServicesSiteExtension60Version>6.0.4-servicing-22172-4</MicrosoftAspNetCoreAzureAppServicesSiteExtension60Version>
+ <MicrosoftAspNetCoreAzureAppServicesSiteExtension60Version>6.0.8-servicing-22363-16</MicrosoftAspNetCoreAzureAppServicesSiteExtension60Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension60x64Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension60Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension60x64Version>
<MicrosoftAspNetCoreAzureAppServicesSiteExtension60x86Version>$(MicrosoftAspNetCoreAzureAppServicesSiteExtension60Version)</MicrosoftAspNetCoreAzureAppServicesSiteExtension60x86Version>
<!-- 3rd party dependencies -->
@@ -240,16 +251,16 @@
<FSharpCoreVersion>6.0.0</FSharpCoreVersion>
<GoogleApiCommonProtosVersion>2.5.0</GoogleApiCommonProtosVersion>
<GoogleProtobufVersion>3.18.1</GoogleProtobufVersion>
- <GrpcAspNetCoreVersion>2.43.0</GrpcAspNetCoreVersion>
- <GrpcAspNetCoreServerVersion>2.43.0</GrpcAspNetCoreServerVersion>
- <GrpcAuthVersion>2.43.0</GrpcAuthVersion>
- <GrpcNetClientVersion>2.43.0</GrpcNetClientVersion>
- <GrpcToolsVersion>2.43.0</GrpcToolsVersion>
- <DuendeIdentityServerAspNetIdentityVersion>5.2.0</DuendeIdentityServerAspNetIdentityVersion>
- <DuendeIdentityServerEntityFrameworkVersion>5.2.0</DuendeIdentityServerEntityFrameworkVersion>
- <DuendeIdentityServerVersion>5.2.0</DuendeIdentityServerVersion>
- <DuendeIdentityServerStorageVersion>5.2.0</DuendeIdentityServerStorageVersion>
- <DuendeIdentityServerEntityFrameworkStorageVersion>5.2.0</DuendeIdentityServerEntityFrameworkStorageVersion>
+ <GrpcAspNetCoreVersion>2.45.0</GrpcAspNetCoreVersion>
+ <GrpcAspNetCoreServerVersion>2.45.0</GrpcAspNetCoreServerVersion>
+ <GrpcAuthVersion>2.45.0</GrpcAuthVersion>
+ <GrpcNetClientVersion>2.45.0</GrpcNetClientVersion>
+ <GrpcToolsVersion>2.45.0</GrpcToolsVersion>
+ <DuendeIdentityServerAspNetIdentityVersion>6.0.4</DuendeIdentityServerAspNetIdentityVersion>
+ <DuendeIdentityServerEntityFrameworkVersion>6.0.4</DuendeIdentityServerEntityFrameworkVersion>
+ <DuendeIdentityServerVersion>6.0.4</DuendeIdentityServerVersion>
+ <DuendeIdentityServerStorageVersion>6.0.4</DuendeIdentityServerStorageVersion>
+ <DuendeIdentityServerEntityFrameworkStorageVersion>6.0.4</DuendeIdentityServerEntityFrameworkStorageVersion>
<MessagePackVersion>2.1.90</MessagePackVersion>
<MicrosoftIdentityWebVersion>1.16.0</MicrosoftIdentityWebVersion>
<MicrosoftIdentityWebMicrosoftGraphVersion>1.16.0</MicrosoftIdentityWebMicrosoftGraphVersion>
@@ -265,14 +276,14 @@
<MicrosoftPlaywrightVersion>1.17.3</MicrosoftPlaywrightVersion>
<PollyExtensionsHttpVersion>3.0.0</PollyExtensionsHttpVersion>
<PollyVersion>7.2.3</PollyVersion>
- <SeleniumSupportVersion>4.1.0</SeleniumSupportVersion>
- <SeleniumWebDriverChromeDriverVersion>98.0.4758.10200</SeleniumWebDriverChromeDriverVersion>
- <SeleniumWebDriverVersion>4.1.0</SeleniumWebDriverVersion>
+ <SeleniumSupportVersion>4.3.0</SeleniumSupportVersion>
+ <SeleniumWebDriverChromeDriverVersion>103.0.5060.13400</SeleniumWebDriverChromeDriverVersion>
+ <SeleniumWebDriverVersion>4.3.0</SeleniumWebDriverVersion>
<SerilogExtensionsLoggingVersion>1.4.0</SerilogExtensionsLoggingVersion>
<SerilogSinksFileVersion>4.0.0</SerilogSinksFileVersion>
<StackExchangeRedisVersion>2.2.4</StackExchangeRedisVersion>
<SystemReactiveLinqVersion>5.0.0</SystemReactiveLinqVersion>
- <SwashbuckleAspNetCoreVersion>6.2.3</SwashbuckleAspNetCoreVersion>
+ <SwashbuckleAspNetCoreVersion>6.4.0</SwashbuckleAspNetCoreVersion>
<XunitAbstractionsVersion>2.0.3</XunitAbstractionsVersion>
<XunitAnalyzersVersion>0.10.0</XunitAnalyzersVersion>
<XunitVersion>2.4.1</XunitVersion>
@@ -283,6 +294,10 @@
<MicrosoftDataSqlClientVersion>4.0.1</MicrosoftDataSqlClientVersion>
<MicrosoftAspNetCoreAppVersion>6.0.0-preview.3.21167.1</MicrosoftAspNetCoreAppVersion>
<MicrosoftOpenApiVersion>1.2.3</MicrosoftOpenApiVersion>
+ <!-- dotnet tool versions (see also auto-updated DotnetEfVersion property). -->
+ <DotnetDumpVersion>6.0.322601</DotnetDumpVersion>
+ <DotnetServeVersion>1.10.93</DotnetServeVersion>
+ <MicrosoftPlaywrightCLIVersion>1.2.3</MicrosoftPlaywrightCLIVersion>
</PropertyGroup>
<!-- Restore feeds -->
<PropertyGroup Label="Restore feeds">
diff --git a/eng/Workarounds.props b/eng/Workarounds.props
index 0718781a8d..a9561f8376 100644
--- a/eng/Workarounds.props
+++ b/eng/Workarounds.props
@@ -42,10 +42,4 @@
<ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles>
</PropertyGroup>
- <!-- Trim analyzers are automatically enabled by IsTrimming=true. They currently break when run on aspnetcore.
- Remove when trimming analyzers are fixed: https://github.com/dotnet/aspnetcore/issues/41016 -->
- <PropertyGroup>
- <EnableTrimAnalyzer Condition=" '$(EnableTrimAnalyzer)' == ''">false</EnableTrimAnalyzer>
- </PropertyGroup>
-
</Project>
diff --git a/eng/common/SetupNugetSources.ps1 b/eng/common/SetupNugetSources.ps1
index 18823840b1..6e99723945 100644
--- a/eng/common/SetupNugetSources.ps1
+++ b/eng/common/SetupNugetSources.ps1
@@ -146,22 +146,22 @@ $userName = "dn-bot"
# Insert credential nodes for Maestro's private feeds
InsertMaestroPrivateFeedCredentials -Sources $sources -Creds $creds -Username $userName -Password $Password
+# 3.1 uses a different feed url format so it's handled differently here
$dotnet31Source = $sources.SelectSingleNode("add[@key='dotnet3.1']")
if ($dotnet31Source -ne $null) {
AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
AddPackageSource -Sources $sources -SourceName "dotnet3.1-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
}
-$dotnet5Source = $sources.SelectSingleNode("add[@key='dotnet5']")
-if ($dotnet5Source -ne $null) {
- AddPackageSource -Sources $sources -SourceName "dotnet5-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
- AddPackageSource -Sources $sources -SourceName "dotnet5-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
-}
+$dotnetVersions = @('5','6','7')
-$dotnet6Source = $sources.SelectSingleNode("add[@key='dotnet6']")
-if ($dotnet6Source -ne $null) {
- AddPackageSource -Sources $sources -SourceName "dotnet6-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
- AddPackageSource -Sources $sources -SourceName "dotnet6-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
+foreach ($dotnetVersion in $dotnetVersions) {
+ $feedPrefix = "dotnet" + $dotnetVersion;
+ $dotnetSource = $sources.SelectSingleNode("add[@key='$feedPrefix']")
+ if ($dotnetSource -ne $null) {
+ AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal/nuget/v2" -Creds $creds -Username $userName -Password $Password
+ AddPackageSource -Sources $sources -SourceName "$feedPrefix-internal-transport" -SourceEndPoint "https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix-internal-transport/nuget/v2" -Creds $creds -Username $userName -Password $Password
+ }
}
$doc.Save($filename)
diff --git a/eng/common/SetupNugetSources.sh b/eng/common/SetupNugetSources.sh
index ad3fb74fd2..8af7d899db 100755
--- a/eng/common/SetupNugetSources.sh
+++ b/eng/common/SetupNugetSources.sh
@@ -105,53 +105,33 @@ if [ "$?" == "0" ]; then
PackageSources+=('dotnet3.1-internal-transport')
fi
-# Ensure dotnet5-internal and dotnet5-internal-transport are in the packageSources if the public dotnet5 feeds are present
-grep -i "<add key=\"dotnet5\"" $ConfigFile
-if [ "$?" == "0" ]; then
- grep -i "<add key=\"dotnet5-internal\"" $ConfigFile
- if [ "$?" != "0" ]; then
- echo "Adding dotnet5-internal to the packageSources."
- PackageSourcesNodeFooter="</packageSources>"
- PackageSourceTemplate="${TB}<add key=\"dotnet5-internal\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v2\" />"
-
- sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
- fi
- PackageSources+=('dotnet5-internal')
-
- grep -i "<add key=\"dotnet5-internal-transport\">" $ConfigFile
- if [ "$?" != "0" ]; then
- echo "Adding dotnet5-internal-transport to the packageSources."
- PackageSourcesNodeFooter="</packageSources>"
- PackageSourceTemplate="${TB}<add key=\"dotnet5-internal-transport\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal-transport/nuget/v2\" />"
-
- sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
- fi
- PackageSources+=('dotnet5-internal-transport')
-fi
-
-# Ensure dotnet6-internal and dotnet6-internal-transport are in the packageSources if the public dotnet6 feeds are present
-grep -i "<add key=\"dotnet6\"" $ConfigFile
-if [ "$?" == "0" ]; then
- grep -i "<add key=\"dotnet6-internal\"" $ConfigFile
- if [ "$?" != "0" ]; then
- echo "Adding dotnet6-internal to the packageSources."
- PackageSourcesNodeFooter="</packageSources>"
- PackageSourceTemplate="${TB}<add key=\"dotnet6-internal\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal/nuget/v2\" />"
+DotNetVersions=('5' '6' '7')
+
+for DotNetVersion in ${DotNetVersions[@]} ; do
+ FeedPrefix="dotnet${DotNetVersion}";
+ grep -i "<add key=\"$FeedPrefix\"" $ConfigFile
+ if [ "$?" == "0" ]; then
+ grep -i "<add key=\"$FeedPrefix-internal\"" $ConfigFile
+ if [ "$?" != "0" ]; then
+ echo "Adding $FeedPrefix-internal to the packageSources."
+ PackageSourcesNodeFooter="</packageSources>"
+ PackageSourceTemplate="${TB}<add key=\"$FeedPrefix-internal\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/$FeedPrefix-internal/nuget/v2\" />"
+
+ sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
+ fi
+ PackageSources+=("$FeedPrefix-internal")
- sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
- fi
- PackageSources+=('dotnet6-internal')
+ grep -i "<add key=\"$FeedPrefix-internal-transport\">" $ConfigFile
+ if [ "$?" != "0" ]; then
+ echo "Adding $FeedPrefix-internal-transport to the packageSources."
+ PackageSourcesNodeFooter="</packageSources>"
+ PackageSourceTemplate="${TB}<add key=\"$FeedPrefix-internal-transport\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/$FeedPrefix-internal-transport/nuget/v2\" />"
- grep -i "<add key=\"dotnet6-internal-transport\">" $ConfigFile
- if [ "$?" != "0" ]; then
- echo "Adding dotnet6-internal-transport to the packageSources."
- PackageSourcesNodeFooter="</packageSources>"
- PackageSourceTemplate="${TB}<add key=\"dotnet6-internal-transport\" value=\"https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet6-internal-transport/nuget/v2\" />"
-
- sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
+ sed -i.bak "s|$PackageSourcesNodeFooter|$PackageSourceTemplate${NL}$PackageSourcesNodeFooter|" $ConfigFile
+ fi
+ PackageSources+=("$FeedPrefix-internal-transport")
fi
- PackageSources+=('dotnet6-internal-transport')
-fi
+done
# I want things split line by line
PrevIFS=$IFS
diff --git a/eng/common/build.sh b/eng/common/build.sh
index 55b298f16c..50af40cdd2 100755
--- a/eng/common/build.sh
+++ b/eng/common/build.sh
@@ -19,6 +19,9 @@ usage()
echo "Actions:"
echo " --restore Restore dependencies (short: -r)"
echo " --build Build solution (short: -b)"
+ echo " --sourceBuild Source-build the solution (short: -sb)"
+ echo " Will additionally trigger the following actions: --restore, --build, --pack"
+ echo " If --configuration is not set explicitly, will also set it to 'Release'"
echo " --rebuild Rebuild solution"
echo " --test Run all unit tests in the solution (short: -t)"
echo " --integrationTest Run all integration tests in the solution"
@@ -55,6 +58,7 @@ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
restore=false
build=false
+source_build=false
rebuild=false
test=false
integration_test=false
@@ -73,7 +77,7 @@ exclude_ci_binary_log=false
pipelines_log=false
projects=''
-configuration='Debug'
+configuration=''
prepare_machine=false
verbosity='minimal'
runtime_source_feed=''
@@ -119,6 +123,12 @@ while [[ $# > 0 ]]; do
-pack)
pack=true
;;
+ -sourcebuild|-sb)
+ build=true
+ source_build=true
+ restore=true
+ pack=true
+ ;;
-test|-t)
test=true
;;
@@ -168,6 +178,10 @@ while [[ $# > 0 ]]; do
shift
done
+if [[ -z "$configuration" ]]; then
+ if [[ "$source_build" = true ]]; then configuration="Release"; else configuration="Debug"; fi
+fi
+
if [[ "$ci" == true ]]; then
pipelines_log=true
node_reuse=false
@@ -205,6 +219,7 @@ function Build {
/p:RepoRoot="$repo_root" \
/p:Restore=$restore \
/p:Build=$build \
+ /p:ArcadeBuildFromSource=$source_build \
/p:Rebuild=$rebuild \
/p:Test=$test \
/p:Pack=$pack \
diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh
index e784c9c005..032f5f1937 100755
--- a/eng/common/cross/build-rootfs.sh
+++ b/eng/common/cross/build-rootfs.sh
@@ -4,22 +4,27 @@ set -e
usage()
{
- echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [--skipunmount] --rootfsdir <directory>]"
- echo "BuildArch can be: arm(default), armel, arm64, x86"
+ echo "Usage: $0 [BuildArch] [CodeName] [lldbx.y] [llvmx[.y]] [--skipunmount] --rootfsdir <directory>]"
+ echo "BuildArch can be: arm(default), arm64, armel, armv6, ppc64le, riscv64, s390x, x64, x86"
echo "CodeName - optional, Code name for Linux, can be: xenial(default), zesty, bionic, alpine, alpine3.13 or alpine3.14. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen."
echo " for FreeBSD can be: freebsd12, freebsd13"
- echo " for illumos can be: illumos."
+ echo " for illumos can be: illumos"
+ echo " for Haiku can be: haiku."
echo "lldbx.y - optional, LLDB version, can be: lldb3.9(default), lldb4.0, lldb5.0, lldb6.0 no-lldb. Ignored for alpine and FreeBSD"
+ echo "llvmx[.y] - optional, LLVM version for LLVM related packages."
echo "--skipunmount - optional, will skip the unmount of rootfs folder."
echo "--use-mirror - optional, use mirror URL to fetch resources, when available."
+ echo "--jobs N - optional, restrict to N jobs."
exit 1
}
__CodeName=xenial
__CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
-__InitialDir=$PWD
__BuildArch=arm
__AlpineArch=armv7
+__FreeBSDArch=arm
+__FreeBSDMachineArch=armv7
+__IllumosArch=arm7
__QEMUArch=arm
__UbuntuArch=armhf
__UbuntuRepo="http://ports.ubuntu.com/"
@@ -39,7 +44,7 @@ __AlpinePackages+=" libedit"
# symlinks fixer
__UbuntuPackages+=" symlinks"
-# CoreCLR and CoreFX dependencies
+# runtime dependencies
__UbuntuPackages+=" libicu-dev"
__UbuntuPackages+=" liblttng-ust-dev"
__UbuntuPackages+=" libunwind8-dev"
@@ -48,8 +53,9 @@ __AlpinePackages+=" gettext-dev"
__AlpinePackages+=" icu-dev"
__AlpinePackages+=" libunwind-dev"
__AlpinePackages+=" lttng-ust-dev"
+__AlpinePackages+=" compiler-rt-static"
-# CoreFX dependencies
+# runtime libraries' dependencies
__UbuntuPackages+=" libcurl4-openssl-dev"
__UbuntuPackages+=" libkrb5-dev"
__UbuntuPackages+=" libssl-dev"
@@ -70,26 +76,38 @@ __FreeBSDPackages+=" openssl"
__FreeBSDPackages+=" krb5"
__FreeBSDPackages+=" terminfo-db"
-__IllumosPackages="icu-64.2nb2"
-__IllumosPackages+=" mit-krb5-1.16.2nb4"
-__IllumosPackages+=" openssl-1.1.1e"
-__IllumosPackages+=" zlib-1.2.11"
+__IllumosPackages="icu"
+__IllumosPackages+=" mit-krb5"
+__IllumosPackages+=" openssl"
+__IllumosPackages+=" zlib"
+
+__HaikuPackages="gmp"
+__HaikuPackages+=" gmp_devel"
+__HaikuPackages+=" krb5"
+__HaikuPackages+=" krb5_devel"
+__HaikuPackages+=" libiconv"
+__HaikuPackages+=" libiconv_devel"
+__HaikuPackages+=" llvm12_libunwind"
+__HaikuPackages+=" llvm12_libunwind_devel"
+__HaikuPackages+=" mpfr"
+__HaikuPackages+=" mpfr_devel"
# ML.NET dependencies
__UbuntuPackages+=" libomp5"
__UbuntuPackages+=" libomp-dev"
+__Keyring=
__UseMirror=0
__UnprocessedBuildArgs=
while :; do
- if [ $# -le 0 ]; then
+ if [[ "$#" -le 0 ]]; then
break
fi
- lowerI="$(echo $1 | tr "[:upper:]" "[:lower:]")"
+ lowerI="$(echo "$1" | tr "[:upper:]" "[:lower:]")"
case $lowerI in
- -?|-h|--help)
+ -\?|-h|--help)
usage
exit 1
;;
@@ -99,20 +117,13 @@ while :; do
__AlpineArch=armv7
__QEMUArch=arm
;;
- armv6)
- __BuildArch=armv6
- __UbuntuArch=armhf
- __QEMUArch=arm
- __UbuntuRepo="http://raspbian.raspberrypi.org/raspbian/"
- __CodeName=buster
- __LLDB_Package="liblldb-6.0-dev"
- __Keyring="/usr/share/keyrings/raspbian-archive-keyring.gpg"
- ;;
arm64)
__BuildArch=arm64
__UbuntuArch=arm64
__AlpineArch=aarch64
__QEMUArch=aarch64
+ __FreeBSDArch=arm64
+ __FreeBSDMachineArch=aarch64
;;
armel)
__BuildArch=armel
@@ -120,6 +131,18 @@ while :; do
__UbuntuRepo="http://ftp.debian.org/debian/"
__CodeName=jessie
;;
+ armv6)
+ __BuildArch=armv6
+ __UbuntuArch=armhf
+ __QEMUArch=arm
+ __UbuntuRepo="http://raspbian.raspberrypi.org/raspbian/"
+ __CodeName=buster
+ __LLDB_Package="liblldb-6.0-dev"
+
+ if [[ -e "/usr/share/keyrings/raspbian-archive-keyring.gpg" ]]; then
+ __Keyring="--keyring /usr/share/keyrings/raspbian-archive-keyring.gpg"
+ fi
+ ;;
ppc64le)
__BuildArch=ppc64le
__UbuntuArch=ppc64el
@@ -129,6 +152,18 @@ while :; do
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp5//')
unset __LLDB_Package
;;
+ riscv64)
+ __BuildArch=riscv64
+ __UbuntuArch=riscv64
+ __UbuntuRepo="http://deb.debian.org/debian-ports"
+ __CodeName=sid
+ __UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libunwind8-dev//')
+ unset __LLDB_Package
+
+ if [[ -e "/usr/share/keyrings/debian-ports-archive-keyring.gpg" ]]; then
+ __Keyring="--keyring /usr/share/keyrings/debian-ports-archive-keyring.gpg --include=debian-ports-archive-keyring"
+ fi
+ ;;
s390x)
__BuildArch=s390x
__UbuntuArch=s390x
@@ -138,6 +173,14 @@ while :; do
__UbuntuPackages=$(echo ${__UbuntuPackages} | sed 's/ libomp5//')
unset __LLDB_Package
;;
+ x64)
+ __BuildArch=x64
+ __UbuntuArch=amd64
+ __FreeBSDArch=amd64
+ __FreeBSDMachineArch=amd64
+ __illumosArch=x86_64
+ __UbuntuRepo=
+ ;;
x86)
__BuildArch=x86
__UbuntuArch=i386
@@ -164,18 +207,27 @@ while :; do
no-lldb)
unset __LLDB_Package
;;
+ llvm*)
+ version="$(echo "$lowerI" | tr -d '[:alpha:]-=')"
+ parts=(${version//./ })
+ __LLVM_MajorVersion="${parts[0]}"
+ __LLVM_MinorVersion="${parts[1]}"
+ if [[ -z "$__LLVM_MinorVersion" && "$__LLVM_MajorVersion" -le 6 ]]; then
+ __LLVM_MinorVersion=0;
+ fi
+ ;;
xenial) # Ubuntu 16.04
- if [ "$__CodeName" != "jessie" ]; then
+ if [[ "$__CodeName" != "jessie" ]]; then
__CodeName=xenial
fi
;;
zesty) # Ubuntu 17.04
- if [ "$__CodeName" != "jessie" ]; then
+ if [[ "$__CodeName" != "jessie" ]]; then
__CodeName=zesty
fi
;;
bionic) # Ubuntu 18.04
- if [ "$__CodeName" != "jessie" ]; then
+ if [[ "$__CodeName" != "jessie" ]]; then
__CodeName=bionic
fi
;;
@@ -194,11 +246,6 @@ while :; do
__LLDB_Package="liblldb-6.0-dev"
;;
tizen)
- if [ "$__BuildArch" != "arm" ] && [ "$__BuildArch" != "armel" ] && [ "$__BuildArch" != "arm64" ] && [ "$__BuildArch" != "x86" ] ; then
- echo "Tizen is available only for arm, armel, arm64 and x86."
- usage;
- exit 1;
- fi
__CodeName=
__UbuntuRepo=
__Tizen=tizen
@@ -217,18 +264,20 @@ while :; do
;;
freebsd12)
__CodeName=freebsd
- __BuildArch=x64
__SkipUnmount=1
;;
freebsd13)
__CodeName=freebsd
__FreeBSDBase="13.0-RELEASE"
__FreeBSDABI="13"
- __BuildArch=x64
__SkipUnmount=1
;;
illumos)
__CodeName=illumos
+ __SkipUnmount=1
+ ;;
+ haiku)
+ __CodeName=haiku
__BuildArch=x64
__SkipUnmount=1
;;
@@ -237,11 +286,15 @@ while :; do
;;
--rootfsdir|-rootfsdir)
shift
- __RootfsDir=$1
+ __RootfsDir="$1"
;;
--use-mirror)
__UseMirror=1
;;
+ --use-jobs)
+ shift
+ MAXJOBS=$1
+ ;;
*)
__UnprocessedBuildArgs="$__UnprocessedBuildArgs $1"
;;
@@ -250,77 +303,76 @@ while :; do
shift
done
-if [ -e "$__Keyring" ]; then
- __Keyring="--keyring=$__Keyring"
-else
- __Keyring=""
-fi
-
-if [ "$__BuildArch" == "armel" ]; then
+if [[ "$__BuildArch" == "armel" ]]; then
__LLDB_Package="lldb-3.5-dev"
fi
+
__UbuntuPackages+=" ${__LLDB_Package:-}"
-if [ -z "$__RootfsDir" ] && [ ! -z "$ROOTFS_DIR" ]; then
- __RootfsDir=$ROOTFS_DIR
+if [[ -n "$__LLVM_MajorVersion" ]]; then
+ __UbuntuPackages+=" libclang-common-${__LLVM_MajorVersion}${__LLVM_MinorVersion:+.$__LLVM_MinorVersion}-dev"
fi
-if [ -z "$__RootfsDir" ]; then
+if [[ -z "$__RootfsDir" && -n "$ROOTFS_DIR" ]]; then
+ __RootfsDir="$ROOTFS_DIR"
+fi
+
+if [[ -z "$__RootfsDir" ]]; then
__RootfsDir="$__CrossDir/../../../.tools/rootfs/$__BuildArch"
fi
-if [ -d "$__RootfsDir" ]; then
- if [ $__SkipUnmount == 0 ]; then
- umount $__RootfsDir/* || true
+if [[ -d "$__RootfsDir" ]]; then
+ if [[ "$__SkipUnmount" == "0" ]]; then
+ umount "$__RootfsDir"/* || true
fi
- rm -rf $__RootfsDir
+ rm -rf "$__RootfsDir"
fi
-mkdir -p $__RootfsDir
+mkdir -p "$__RootfsDir"
__RootfsDir="$( cd "$__RootfsDir" && pwd )"
if [[ "$__CodeName" == "alpine" ]]; then
__ApkToolsVersion=2.9.1
- __ApkToolsDir=$(mktemp -d)
- wget https://github.com/alpinelinux/apk-tools/releases/download/v$__ApkToolsVersion/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -P $__ApkToolsDir
- tar -xf $__ApkToolsDir/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -C $__ApkToolsDir
- mkdir -p $__RootfsDir/usr/bin
- cp -v /usr/bin/qemu-$__QEMUArch-static $__RootfsDir/usr/bin
-
- $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \
- -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main \
- -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community \
- -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \
+ __ApkToolsDir="$(mktemp -d)"
+ wget "https://github.com/alpinelinux/apk-tools/releases/download/v$__ApkToolsVersion/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz" -P "$__ApkToolsDir"
+ tar -xf "$__ApkToolsDir/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz" -C "$__ApkToolsDir"
+ mkdir -p "$__RootfsDir"/usr/bin
+ cp -v "/usr/bin/qemu-$__QEMUArch-static" "$__RootfsDir/usr/bin"
+
+ "$__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk" \
+ -X "http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main" \
+ -X "http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community" \
+ -U --allow-untrusted --root "$__RootfsDir" --arch "$__AlpineArch" --initdb \
add $__AlpinePackages
- rm -r $__ApkToolsDir
+ rm -r "$__ApkToolsDir"
elif [[ "$__CodeName" == "freebsd" ]]; then
- mkdir -p $__RootfsDir/usr/local/etc
- JOBS="$(getconf _NPROCESSORS_ONLN)"
- wget -O - https://download.freebsd.org/ftp/releases/amd64/${__FreeBSDBase}/base.txz | tar -C $__RootfsDir -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
- echo "ABI = \"FreeBSD:${__FreeBSDABI}:amd64\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > ${__RootfsDir}/usr/local/etc/pkg.conf
- echo "FreeBSD: { url: "pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > ${__RootfsDir}/etc/pkg/FreeBSD.conf
- mkdir -p $__RootfsDir/tmp
+ mkdir -p "$__RootfsDir"/usr/local/etc
+ JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"}
+ wget -O - "https://download.freebsd.org/ftp/releases/${__FreeBSDArch}/${__FreeBSDMachineArch}/${__FreeBSDBase}/base.txz" | tar -C "$__RootfsDir" -Jxf - ./lib ./usr/lib ./usr/libdata ./usr/include ./usr/share/keys ./etc ./bin/freebsd-version
+ echo "ABI = \"FreeBSD:${__FreeBSDABI}:${__FreeBSDMachineArch}\"; FINGERPRINTS = \"${__RootfsDir}/usr/share/keys\"; REPOS_DIR = [\"${__RootfsDir}/etc/pkg\"]; REPO_AUTOUPDATE = NO; RUN_SCRIPTS = NO;" > "${__RootfsDir}"/usr/local/etc/pkg.conf
+ echo "FreeBSD: { url: \"pkg+http://pkg.FreeBSD.org/\${ABI}/quarterly\", mirror_type: \"srv\", signature_type: \"fingerprints\", fingerprints: \"${__RootfsDir}/usr/share/keys/pkg\", enabled: yes }" > "${__RootfsDir}"/etc/pkg/FreeBSD.conf
+ mkdir -p "$__RootfsDir"/tmp
# get and build package manager
- wget -O - https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz | tar -C $__RootfsDir/tmp -zxf -
- cd $__RootfsDir/tmp/pkg-${__FreeBSDPkg}
+ wget -O - "https://github.com/freebsd/pkg/archive/${__FreeBSDPkg}.tar.gz" | tar -C "$__RootfsDir"/tmp -zxf -
+ cd "$__RootfsDir/tmp/pkg-${__FreeBSDPkg}"
# needed for install to succeed
- mkdir -p $__RootfsDir/host/etc
- ./autogen.sh && ./configure --prefix=$__RootfsDir/host && make -j "$JOBS" && make install
- rm -rf $__RootfsDir/tmp/pkg-${__FreeBSDPkg}
+ mkdir -p "$__RootfsDir"/host/etc
+ ./autogen.sh && ./configure --prefix="$__RootfsDir"/host && make -j "$JOBS" && make install
+ rm -rf "$__RootfsDir/tmp/pkg-${__FreeBSDPkg}"
# install packages we need.
- INSTALL_AS_USER=$(whoami) $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf update
- INSTALL_AS_USER=$(whoami) $__RootfsDir/host/sbin/pkg -r $__RootfsDir -C $__RootfsDir/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages
+ INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf update
+ INSTALL_AS_USER=$(whoami) "$__RootfsDir"/host/sbin/pkg -r "$__RootfsDir" -C "$__RootfsDir"/usr/local/etc/pkg.conf install --yes $__FreeBSDPackages
elif [[ "$__CodeName" == "illumos" ]]; then
mkdir "$__RootfsDir/tmp"
pushd "$__RootfsDir/tmp"
- JOBS="$(getconf _NPROCESSORS_ONLN)"
+ JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"}
echo "Downloading sysroot."
wget -O - https://github.com/illumos/sysroot/releases/download/20181213-de6af22ae73b-v1/illumos-sysroot-i386-20181213-de6af22ae73b-v1.tar.gz | tar -C "$__RootfsDir" -xzf -
echo "Building binutils. Please wait.."
wget -O - https://ftp.gnu.org/gnu/binutils/binutils-2.33.1.tar.bz2 | tar -xjf -
mkdir build-binutils && cd build-binutils
- ../binutils-2.33.1/configure --prefix="$__RootfsDir" --target="x86_64-sun-solaris2.10" --program-prefix="x86_64-illumos-" --with-sysroot="$__RootfsDir"
+ ../binutils-2.33.1/configure --prefix="$__RootfsDir" --target="${__illumosArch}-sun-solaris2.10" --program-prefix="${__illumosArch}-illumos-" --with-sysroot="$__RootfsDir"
make -j "$JOBS" && make install && cd ..
echo "Building gcc. Please wait.."
wget -O - https://ftp.gnu.org/gnu/gcc/gcc-8.4.0/gcc-8.4.0.tar.xz | tar -xJf -
@@ -330,7 +382,7 @@ elif [[ "$__CodeName" == "illumos" ]]; then
CFLAGS_FOR_TARGET="-fPIC"
export CFLAGS CXXFLAGS CXXFLAGS_FOR_TARGET CFLAGS_FOR_TARGET
mkdir build-gcc && cd build-gcc
- ../gcc-8.4.0/configure --prefix="$__RootfsDir" --target="x86_64-sun-solaris2.10" --program-prefix="x86_64-illumos-" --with-sysroot="$__RootfsDir" --with-gnu-as \
+ ../gcc-8.4.0/configure --prefix="$__RootfsDir" --target="${__illumosArch}-sun-solaris2.10" --program-prefix="${__illumosArch}-illumos-" --with-sysroot="$__RootfsDir" --with-gnu-as \
--with-gnu-ld --disable-nls --disable-libgomp --disable-libquadmath --disable-libssp --disable-libvtv --disable-libcilkrts --disable-libada --disable-libsanitizer \
--disable-libquadmath-support --disable-shared --enable-tls
make -j "$JOBS" && make install && cd ..
@@ -338,14 +390,18 @@ elif [[ "$__CodeName" == "illumos" ]]; then
if [[ "$__UseMirror" == 1 ]]; then
BaseUrl=http://pkgsrc.smartos.skylime.net
fi
- BaseUrl="$BaseUrl"/packages/SmartOS/2020Q1/x86_64/All
+ BaseUrl="$BaseUrl/packages/SmartOS/trunk/${__illumosArch}/All"
+ echo "Downloading manifest"
+ wget "$BaseUrl"
echo "Downloading dependencies."
read -ra array <<<"$__IllumosPackages"
for package in "${array[@]}"; do
- echo "Installing $package..."
+ echo "Installing '$package'"
+ package="$(grep ">$package-[0-9]" All | sed -En 's/.*href="(.*)\.tgz".*/\1/p')"
+ echo "Resolved name '$package'"
wget "$BaseUrl"/"$package".tgz
ar -x "$package".tgz
- tar --skip-old-files -xzf "$package".tmp.tgz -C "$__RootfsDir" 2>/dev/null
+ tar --skip-old-files -xzf "$package".tmp.tg* -C "$__RootfsDir" 2>/dev/null
done
echo "Cleaning up temporary files."
popd
@@ -356,26 +412,90 @@ elif [[ "$__CodeName" == "illumos" ]]; then
wget -P "$__RootfsDir"/usr/include/net https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/io/bpf/net/dlt.h
wget -P "$__RootfsDir"/usr/include/netpacket https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/inet/sockmods/netpacket/packet.h
wget -P "$__RootfsDir"/usr/include/sys https://raw.githubusercontent.com/illumos/illumos-gate/master/usr/src/uts/common/sys/sdt.h
-elif [[ -n $__CodeName ]]; then
- qemu-debootstrap $__Keyring --arch $__UbuntuArch $__CodeName $__RootfsDir $__UbuntuRepo
- cp $__CrossDir/$__BuildArch/sources.list.$__CodeName $__RootfsDir/etc/apt/sources.list
- chroot $__RootfsDir apt-get update
- chroot $__RootfsDir apt-get -f -y install
- chroot $__RootfsDir apt-get -y install $__UbuntuPackages
- chroot $__RootfsDir symlinks -cr /usr
- chroot $__RootfsDir apt-get clean
-
- if [ $__SkipUnmount == 0 ]; then
- umount $__RootfsDir/* || true
+elif [[ "$__CodeName" == "haiku" ]]; then
+ JOBS=${MAXJOBS:="$(getconf _NPROCESSORS_ONLN)"}
+
+ echo "Building Haiku sysroot for x86_64"
+ mkdir -p "$__RootfsDir/tmp"
+ cd "$__RootfsDir/tmp"
+ git clone -b hrev56235 https://review.haiku-os.org/haiku
+ git clone -b btrev43195 https://review.haiku-os.org/buildtools
+ cd "$__RootfsDir/tmp/buildtools" && git checkout 7487388f5110021d400b9f3b88e1a7f310dc066d
+
+ # Fetch some unmerged patches
+ cd "$__RootfsDir/tmp/haiku"
+ ## Add development build profile (slimmer than nightly)
+ git fetch origin refs/changes/64/4164/1 && git -c commit.gpgsign=false cherry-pick FETCH_HEAD
+
+ # Build jam
+ cd "$__RootfsDir/tmp/buildtools/jam"
+ make
+
+ # Configure cross tools
+ echo "Building cross-compiler"
+ mkdir -p "$__RootfsDir/generated"
+ cd "$__RootfsDir/generated"
+ "$__RootfsDir/tmp/haiku/configure" -j"$JOBS" --sysroot "$__RootfsDir" --cross-tools-source "$__RootfsDir/tmp/buildtools" --build-cross-tools x86_64
+
+ # Build Haiku packages
+ echo "Building Haiku"
+ echo 'HAIKU_BUILD_PROFILE = "development-raw" ;' > UserProfileConfig
+ "$__RootfsDir/tmp/buildtools/jam/jam0" -j"$JOBS" -q '<build>package' '<repository>Haiku'
+
+ BaseUrl="https://depot.haiku-os.org/__api/v2/pkg/get-pkg"
+
+ # Download additional packages
+ echo "Downloading additional required packages"
+ read -ra array <<<"$__HaikuPackages"
+ for package in "${array[@]}"; do
+ echo "Downloading $package..."
+ # API documented here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L60
+ # The schema here: https://github.com/haiku/haikudepotserver/blob/master/haikudepotserver-api2/src/main/resources/api2/pkg.yaml#L598
+ hpkgDownloadUrl="$(wget -qO- --post-data='{"name":"'"$package"'","repositorySourceCode":"haikuports_x86_64","versionType":"LATEST","naturalLanguageCode":"en"}' \
+ --header='Content-Type:application/json' "$BaseUrl" | jq -r '.result.versions[].hpkgDownloadURL')"
+ wget -P "$__RootfsDir/generated/download" "$hpkgDownloadUrl"
+ done
+
+ # Setup the sysroot
+ echo "Setting up sysroot and extracting needed packages"
+ mkdir -p "$__RootfsDir/boot/system"
+ for file in "$__RootfsDir/generated/objects/haiku/x86_64/packaging/packages/"*.hpkg; do
+ "$__RootfsDir/generated/objects/linux/x86_64/release/tools/package/package" extract -C "$__RootfsDir/boot/system" "$file"
+ done
+ for file in "$__RootfsDir/generated/download/"*.hpkg; do
+ "$__RootfsDir/generated/objects/linux/x86_64/release/tools/package/package" extract -C "$__RootfsDir/boot/system" "$file"
+ done
+
+ # Cleaning up temporary files
+ echo "Cleaning up temporary files"
+ rm -rf "$__RootfsDir/tmp"
+ for name in "$__RootfsDir/generated/"*; do
+ if [[ "$name" =~ "cross-tools-" ]]; then
+ : # Keep the cross-compiler
+ else
+ rm -rf "$name"
+ fi
+ done
+elif [[ -n "$__CodeName" ]]; then
+ qemu-debootstrap $__Keyring --arch "$__UbuntuArch" "$__CodeName" "$__RootfsDir" "$__UbuntuRepo"
+ cp "$__CrossDir/$__BuildArch/sources.list.$__CodeName" "$__RootfsDir/etc/apt/sources.list"
+ chroot "$__RootfsDir" apt-get update
+ chroot "$__RootfsDir" apt-get -f -y install
+ chroot "$__RootfsDir" apt-get -y install $__UbuntuPackages
+ chroot "$__RootfsDir" symlinks -cr /usr
+ chroot "$__RootfsDir" apt-get clean
+
+ if [[ "$__SkipUnmount" == "0" ]]; then
+ umount "$__RootfsDir"/* || true
fi
if [[ "$__BuildArch" == "armel" && "$__CodeName" == "jessie" ]]; then
- pushd $__RootfsDir
- patch -p1 < $__CrossDir/$__BuildArch/armel.jessie.patch
+ pushd "$__RootfsDir"
+ patch -p1 < "$__CrossDir/$__BuildArch/armel.jessie.patch"
popd
fi
elif [[ "$__Tizen" == "tizen" ]]; then
- ROOTFS_DIR=$__RootfsDir $__CrossDir/$__BuildArch/tizen-build-rootfs.sh
+ ROOTFS_DIR="$__RootfsDir" "$__CrossDir/$__BuildArch/tizen-build-rootfs.sh"
else
echo "Unsupported target platform."
usage;
diff --git a/eng/common/cross/riscv64/sources.list.sid b/eng/common/cross/riscv64/sources.list.sid
new file mode 100644
index 0000000000..65f730d224
--- /dev/null
+++ b/eng/common/cross/riscv64/sources.list.sid
@@ -0,0 +1 @@
+deb http://deb.debian.org/debian-ports sid main
diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake
index eaeeab38fa..561576be97 100644
--- a/eng/common/cross/toolchain.cmake
+++ b/eng/common/cross/toolchain.cmake
@@ -7,6 +7,8 @@ if(EXISTS ${CROSS_ROOTFS}/bin/freebsd-version)
elseif(EXISTS ${CROSS_ROOTFS}/usr/platform/i86pc)
set(CMAKE_SYSTEM_NAME SunOS)
set(ILLUMOS 1)
+elseif(EXISTS ${CROSS_ROOTFS}/boot/system/develop/headers/config/HaikuConfig.h)
+ set(CMAKE_SYSTEM_NAME Haiku)
else()
set(CMAKE_SYSTEM_NAME Linux)
set(LINUX 1)
@@ -19,13 +21,7 @@ elseif(EXISTS ${CROSS_ROOTFS}/android_platform)
set(ANDROID 1)
endif()
-if(TARGET_ARCH_NAME STREQUAL "armel")
- set(CMAKE_SYSTEM_PROCESSOR armv7l)
- set(TOOLCHAIN "arm-linux-gnueabi")
- if(TIZEN)
- set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/9.2.0")
- endif()
-elseif(TARGET_ARCH_NAME STREQUAL "arm")
+if(TARGET_ARCH_NAME STREQUAL "arm")
set(CMAKE_SYSTEM_PROCESSOR armv7l)
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv7-alpine-linux-musleabihf)
set(TOOLCHAIN "armv7-alpine-linux-musleabihf")
@@ -37,43 +33,62 @@ elseif(TARGET_ARCH_NAME STREQUAL "arm")
if(TIZEN)
set(TIZEN_TOOLCHAIN "armv7hl-tizen-linux-gnueabihf/9.2.0")
endif()
-elseif(TARGET_ARCH_NAME STREQUAL "armv6")
- set(CMAKE_SYSTEM_PROCESSOR armv6l)
- if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
- set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
- else()
- set(TOOLCHAIN "arm-linux-gnueabihf")
- endif()
elseif(TARGET_ARCH_NAME STREQUAL "arm64")
set(CMAKE_SYSTEM_PROCESSOR aarch64)
if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl)
set(TOOLCHAIN "aarch64-alpine-linux-musl")
- else()
+ elseif(LINUX)
set(TOOLCHAIN "aarch64-linux-gnu")
+ if(TIZEN)
+ set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0")
+ endif()
+ elseif(FREEBSD)
+ set(triple "aarch64-unknown-freebsd12")
endif()
+elseif(TARGET_ARCH_NAME STREQUAL "armel")
+ set(CMAKE_SYSTEM_PROCESSOR armv7l)
+ set(TOOLCHAIN "arm-linux-gnueabi")
if(TIZEN)
- set(TIZEN_TOOLCHAIN "aarch64-tizen-linux-gnu/9.2.0")
+ set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/9.2.0")
+ endif()
+elseif(TARGET_ARCH_NAME STREQUAL "armv6")
+ set(CMAKE_SYSTEM_PROCESSOR armv6l)
+ if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf)
+ set(TOOLCHAIN "armv6-alpine-linux-musleabihf")
+ else()
+ set(TOOLCHAIN "arm-linux-gnueabihf")
endif()
elseif(TARGET_ARCH_NAME STREQUAL "ppc64le")
set(CMAKE_SYSTEM_PROCESSOR ppc64le)
set(TOOLCHAIN "powerpc64le-linux-gnu")
+elseif(TARGET_ARCH_NAME STREQUAL "riscv64")
+ set(CMAKE_SYSTEM_PROCESSOR riscv64)
+ set(TOOLCHAIN "riscv64-linux-gnu")
elseif(TARGET_ARCH_NAME STREQUAL "s390x")
set(CMAKE_SYSTEM_PROCESSOR s390x)
set(TOOLCHAIN "s390x-linux-gnu")
+elseif(TARGET_ARCH_NAME STREQUAL "x64")
+ set(CMAKE_SYSTEM_PROCESSOR x86_64)
+ if(LINUX)
+ set(TOOLCHAIN "x86_64-linux-gnu")
+ if(TIZEN)
+ set(TIZEN_TOOLCHAIN "x86_64-tizen-linux-gnu/9.2.0")
+ endif()
+ elseif(FREEBSD)
+ set(triple "x86_64-unknown-freebsd12")
+ elseif(ILLUMOS)
+ set(TOOLCHAIN "x86_64-illumos")
+ elseif(HAIKU)
+ set(TOOLCHAIN "x64_64-unknown-haiku")
+ endif()
elseif(TARGET_ARCH_NAME STREQUAL "x86")
set(CMAKE_SYSTEM_PROCESSOR i686)
set(TOOLCHAIN "i686-linux-gnu")
if(TIZEN)
set(TIZEN_TOOLCHAIN "i586-tizen-linux-gnu/9.2.0")
endif()
-elseif (FREEBSD)
- set(CMAKE_SYSTEM_PROCESSOR "x86_64")
- set(triple "x86_64-unknown-freebsd12")
-elseif (ILLUMOS)
- set(CMAKE_SYSTEM_PROCESSOR "x86_64")
- set(TOOLCHAIN "x86_64-illumos")
else()
- message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, armv6, arm64, ppc64le, s390x and x86 are supported!")
+ message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only arm, arm64, armel, armv6, ppc64le, riscv64, s390x, x64 and x86 are supported!")
endif()
if(DEFINED ENV{TOOLCHAIN})
@@ -159,6 +174,41 @@ elseif(ILLUMOS)
set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
+elseif(HAIKU)
+ set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
+
+ set(TOOLSET_PREFIX ${TOOLCHAIN}-)
+ function(locate_toolchain_exec exec var)
+ string(TOUPPER ${exec} EXEC_UPPERCASE)
+ if(NOT "$ENV{CLR_${EXEC_UPPERCASE}}" STREQUAL "")
+ set(${var} "$ENV{CLR_${EXEC_UPPERCASE}}" PARENT_SCOPE)
+ return()
+ endif()
+
+ set(SEARCH_PATH "${CROSS_ROOTFS}/generated/cross-tools-x86_64/bin")
+
+ find_program(EXEC_LOCATION_${exec}
+ PATHS ${SEARCH_PATH}
+ NAMES
+ "${TOOLSET_PREFIX}${exec}${CLR_CMAKE_COMPILER_FILE_NAME_VERSION}"
+ "${TOOLSET_PREFIX}${exec}")
+
+ if (EXEC_LOCATION_${exec} STREQUAL "EXEC_LOCATION_${exec}-NOTFOUND")
+ message(FATAL_ERROR "Unable to find toolchain executable. Name: ${exec}, Prefix: ${TOOLSET_PREFIX}.")
+ endif()
+ set(${var} ${EXEC_LOCATION_${exec}} PARENT_SCOPE)
+ endfunction()
+
+ set(CMAKE_SYSTEM_PREFIX_PATH "${CROSS_ROOTFS}")
+
+ locate_toolchain_exec(gcc CMAKE_C_COMPILER)
+ locate_toolchain_exec(g++ CMAKE_CXX_COMPILER)
+
+ set(CMAKE_C_STANDARD_LIBRARIES "${CMAKE_C_STANDARD_LIBRARIES} -lssp")
+ set(CMAKE_CXX_STANDARD_LIBRARIES "${CMAKE_CXX_STANDARD_LIBRARIES} -lssp")
+
+ # let CMake set up the correct search paths
+ include(Platform/Haiku)
else()
set(CMAKE_SYSROOT "${CROSS_ROOTFS}")
@@ -218,7 +268,7 @@ endif()
# Specify compile options
-if((TARGET_ARCH_NAME MATCHES "^(arm|armv6|armel|arm64|ppc64le|s390x)$" AND NOT ANDROID) OR ILLUMOS)
+if((TARGET_ARCH_NAME MATCHES "^(arm|arm64|armel|armv6|ppc64le|riscv64|s390x)$" AND NOT ANDROID AND NOT FREEBSD) OR ILLUMOS OR HAIKU)
set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN})
set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN})
set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN})
diff --git a/eng/common/generate-locproject.ps1 b/eng/common/generate-locproject.ps1
index 25e97ac007..846e7950ce 100644
--- a/eng/common/generate-locproject.ps1
+++ b/eng/common/generate-locproject.ps1
@@ -10,9 +10,7 @@ Param(
Set-StrictMode -Version 2.0
$ErrorActionPreference = "Stop"
-. $PSScriptRoot\tools.ps1
-
-Import-Module -Name (Join-Path $PSScriptRoot 'native\CommonLibrary.psm1')
+. $PSScriptRoot\pipeline-logging-functions.ps1
$exclusionsFilePath = "$SourcesDirectory\eng\Localize\LocExclusions.json"
$exclusions = @{ Exclusions = @() }
@@ -28,13 +26,15 @@ $jsonFiles = @()
$jsonTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\.template\.config\\localize\\.+\.en\.json" } # .NET templating pattern
$jsonTemplateFiles | ForEach-Object {
$null = $_.Name -Match "(.+)\.[\w-]+\.json" # matches '[filename].[langcode].json
-
+
$destinationFile = "$($_.Directory.FullName)\$($Matches.1).json"
$jsonFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru
}
$jsonWinformsTemplateFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "en\\strings\.json" } # current winforms pattern
+$wxlFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory" | Where-Object { $_.FullName -Match "\\.+\.wxl" -And -Not( $_.Directory.Name -Match "\d{4}" ) } # localized files live in four digit lang ID directories; this excludes them
+
$xlfFiles = @()
$allXlfFiles = Get-ChildItem -Recurse -Path "$SourcesDirectory\*\*.xlf"
@@ -46,7 +46,7 @@ if ($allXlfFiles) {
}
$langXlfFiles | ForEach-Object {
$null = $_.Name -Match "(.+)\.[\w-]+\.xlf" # matches '[filename].[langcode].xlf
-
+
$destinationFile = "$($_.Directory.FullName)\$($Matches.1).xlf"
$xlfFiles += Copy-Item "$($_.FullName)" -Destination $destinationFile -PassThru
}
@@ -59,7 +59,7 @@ $locJson = @{
LanguageSet = $LanguageSet
LocItems = @(
$locFiles | ForEach-Object {
- $outputPath = "$(($_.DirectoryName | Resolve-Path -Relative) + "\")"
+ $outputPath = "$(($_.DirectoryName | Resolve-Path -Relative) + "\")"
$continue = $true
foreach ($exclusion in $exclusions.Exclusions) {
if ($outputPath.Contains($exclusion))
@@ -79,8 +79,7 @@ $locJson = @{
CopyOption = "LangIDOnPath"
OutputPath = "$($_.Directory.Parent.FullName | Resolve-Path -Relative)\"
}
- }
- else {
+ } else {
return @{
SourceFile = $sourceFile
CopyOption = "LangIDOnName"
@@ -90,6 +89,32 @@ $locJson = @{
}
}
)
+ },
+ @{
+ CloneLanguageSet = "WiX_CloneLanguages"
+ LssFiles = @( "wxl_loc.lss" )
+ LocItems = @(
+ $wxlFiles | ForEach-Object {
+ $outputPath = "$($_.Directory.FullName | Resolve-Path -Relative)\"
+ $continue = $true
+ foreach ($exclusion in $exclusions.Exclusions) {
+ if ($outputPath.Contains($exclusion))
+ {
+ $continue = $false
+ }
+ }
+ $sourceFile = ($_.FullName | Resolve-Path -Relative)
+ if ($continue)
+ {
+ return @{
+ SourceFile = $sourceFile
+ CopyOption = "LangIDOnPath"
+ OutputPath = $outputPath
+ Languages = "cs-CZ;de-DE;es-ES;fr-FR;it-IT;ja-JP;ko-KR;pl-PL;pt-BR;ru-RU;tr-TR;zh-CN;zh-TW"
+ }
+ }
+ }
+ )
}
)
}
@@ -108,10 +133,10 @@ else {
if ((Get-FileHash "$SourcesDirectory\eng\Localize\LocProject-generated.json").Hash -ne (Get-FileHash "$SourcesDirectory\eng\Localize\LocProject.json").Hash) {
Write-PipelineTelemetryError -Category "OneLocBuild" -Message "Existing LocProject.json differs from generated LocProject.json. Download LocProject-generated.json and compare them."
-
+
exit 1
}
else {
Write-Host "Generated LocProject.json and current LocProject.json are identical."
}
-} \ No newline at end of file
+}
diff --git a/eng/common/generate-sbom-prep.ps1 b/eng/common/generate-sbom-prep.ps1
index a733a88858..3e5c1c74a1 100644
--- a/eng/common/generate-sbom-prep.ps1
+++ b/eng/common/generate-sbom-prep.ps1
@@ -2,6 +2,8 @@ Param(
[Parameter(Mandatory=$true)][string] $ManifestDirPath # Manifest directory where sbom will be placed
)
+. $PSScriptRoot\pipeline-logging-functions.ps1
+
Write-Host "Creating dir $ManifestDirPath"
# create directory for sbom manifest to be placed
if (!(Test-Path -path $ManifestDirPath))
diff --git a/eng/common/generate-sbom-prep.sh b/eng/common/generate-sbom-prep.sh
index f6c7745314..d5c76dc827 100644
--- a/eng/common/generate-sbom-prep.sh
+++ b/eng/common/generate-sbom-prep.sh
@@ -2,6 +2,18 @@
source="${BASH_SOURCE[0]}"
+# resolve $SOURCE until the file is no longer a symlink
+while [[ -h $source ]]; do
+ scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
+ source="$(readlink "$source")"
+
+ # if $source was a relative symlink, we need to resolve it relative to the path where the
+ # symlink file was located
+ [[ $source != /* ]] && source="$scriptroot/$source"
+done
+scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
+. $scriptroot/pipeline-logging-functions.sh
+
manifest_dir=$1
if [ ! -d "$manifest_dir" ] ; then
diff --git a/eng/common/init-tools-native.ps1 b/eng/common/init-tools-native.ps1
index 413adea436..8d48ec5680 100644
--- a/eng/common/init-tools-native.ps1
+++ b/eng/common/init-tools-native.ps1
@@ -87,13 +87,14 @@ try {
$NativeTools.PSObject.Properties | ForEach-Object {
$ToolName = $_.Name
$ToolVersion = $_.Value
+ $InstalledTools = @{}
if ((Get-Command "$ToolName" -ErrorAction SilentlyContinue) -eq $null) {
if ($ToolVersion -eq "latest") {
$ToolVersion = ""
}
$ArcadeToolsDirectory = "C:\arcade-tools"
- if (Test-Path $ArcadeToolsDirectory -eq $False) {
+ if (-not (Test-Path $ArcadeToolsDirectory)) {
Write-Error "Arcade tools directory '$ArcadeToolsDirectory' was not found; artifacts were not properly installed."
exit 1
}
@@ -103,16 +104,18 @@ try {
exit 1
}
$BinPathFile = "$($ToolDirectory.FullName)\binpath.txt"
- if (Test-Path -Path "$BinPathFile" -eq $False) {
+ if (-not (Test-Path -Path "$BinPathFile")) {
Write-Error "Unable to find binpath.txt in '$($ToolDirectory.FullName)' ($ToolName $ToolVersion); artifact is either installed incorrectly or is not a bootstrappable tool."
exit 1
}
$BinPath = Get-Content "$BinPathFile"
- Write-Host "Adding $ToolName to the path ($(Convert-Path -Path $BinPath))..."
- Write-Host "##vso[task.prependpath]$(Convert-Path -Path $BinPath)"
+ $ToolPath = Convert-Path -Path $BinPath
+ Write-Host "Adding $ToolName to the path ($ToolPath)..."
+ Write-Host "##vso[task.prependpath]$ToolPath"
+ $InstalledTools += @{ $ToolName = $ToolDirectory.FullName }
}
}
- exit 0
+ return $InstalledTools
} else {
$NativeTools.PSObject.Properties | ForEach-Object {
$ToolName = $_.Name
@@ -188,7 +191,7 @@ try {
Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)"
return $InstallBin
}
- else {
+ elseif (-not ($PathPromotion)) {
Write-PipelineTelemetryError -Category 'NativeToolsBootstrap' -Message 'Native tools install directory does not exist, installation failed'
exit 1
}
diff --git a/eng/common/internal/Tools.csproj b/eng/common/internal/Tools.csproj
index beb9c4648e..7f5ce6d608 100644
--- a/eng/common/internal/Tools.csproj
+++ b/eng/common/internal/Tools.csproj
@@ -8,6 +8,9 @@
<ItemGroup>
<!-- Clear references, the SDK may add some depending on UsuingToolXxx settings, but we only want to restore the following -->
<PackageReference Remove="@(PackageReference)"/>
+ <PackageReference Include="Microsoft.ManifestTool.CrossPlatform" Version="$(MicrosoftManifestToolCrossPlatformVersion)" />
+ <PackageReference Include="Microsoft.VisualStudioEng.MicroBuild.Core" Version="$(MicrosoftVisualStudioEngMicroBuildCoreVersion)" />
+ <PackageReference Include="Microsoft.VisualStudioEng.MicroBuild.Plugins.SwixBuild" Version="$(MicrosoftVisualStudioEngMicroBuildPluginsSwixBuildVersion)" />
<PackageReference Include="Microsoft.DotNet.IBCMerge" Version="$(MicrosoftDotNetIBCMergeVersion)" Condition="'$(UsingToolIbcOptimization)' == 'true'" />
<PackageReference Include="Drop.App" Version="$(DropAppVersion)" ExcludeAssets="all" Condition="'$(UsingToolVisualStudioIbcTraining)' == 'true'"/>
</ItemGroup>
diff --git a/eng/common/native/init-compiler.sh b/eng/common/native/init-compiler.sh
index 6d7ba15e5f..41a26d802a 100644
--- a/eng/common/native/init-compiler.sh
+++ b/eng/common/native/init-compiler.sh
@@ -71,7 +71,7 @@ if [[ -z "$CLR_CC" ]]; then
# Set default versions
if [[ -z "$majorVersion" ]]; then
# note: gcc (all versions) and clang versions higher than 6 do not have minor version in file name, if it is zero.
- if [[ "$compiler" == "clang" ]]; then versions=( 13 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 )
+ if [[ "$compiler" == "clang" ]]; then versions=( 15 14 13 12 11 10 9 8 7 6.0 5.0 4.0 3.9 3.8 3.7 3.6 3.5 )
elif [[ "$compiler" == "gcc" ]]; then versions=( 12 11 10 9 8 7 6 5 4.9 ); fi
for version in "${versions[@]}"; do
diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1
index b1bca63ab1..c35087a060 100644
--- a/eng/common/sdk-task.ps1
+++ b/eng/common/sdk-task.ps1
@@ -64,7 +64,7 @@ try {
$GlobalJson.tools | Add-Member -Name "vs" -Value (ConvertFrom-Json "{ `"version`": `"16.5`" }") -MemberType NoteProperty
}
if( -not ($GlobalJson.tools.PSObject.Properties.Name -match "xcopy-msbuild" )) {
- $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "16.10.0-preview2" -MemberType NoteProperty
+ $GlobalJson.tools | Add-Member -Name "xcopy-msbuild" -Value "17.2.1" -MemberType NoteProperty
}
if ($GlobalJson.tools."xcopy-msbuild".Trim() -ine "none") {
$xcopyMSBuildToolsFolder = InitializeXCopyMSBuild $GlobalJson.tools."xcopy-msbuild" -install $true
diff --git a/eng/common/sdl/sdl.ps1 b/eng/common/sdl/sdl.ps1
new file mode 100644
index 0000000000..ac196e164a
--- /dev/null
+++ b/eng/common/sdl/sdl.ps1
@@ -0,0 +1,37 @@
+
+function Install-Gdn {
+ param(
+ [string]$Path,
+
+ # If omitted, install the latest version of Guardian, otherwise install that specific version.
+ [string]$Version
+ )
+
+ $ErrorActionPreference = 'Stop'
+ Set-StrictMode -Version 2.0
+ $disableConfigureToolsetImport = $true
+ $global:LASTEXITCODE = 0
+
+ # `tools.ps1` checks $ci to perform some actions. Since the SDL
+ # scripts don't necessarily execute in the same agent that run the
+ # build.ps1/sh script this variable isn't automatically set.
+ $ci = $true
+ . $PSScriptRoot\..\tools.ps1
+
+ $argumentList = @("install", "Microsoft.Guardian.Cli", "-Source https://securitytools.pkgs.visualstudio.com/_packaging/Guardian/nuget/v3/index.json", "-OutputDirectory $Path", "-NonInteractive", "-NoCache")
+
+ if ($Version) {
+ $argumentList += "-Version $Version"
+ }
+
+ Start-Process nuget -Verbose -ArgumentList $argumentList -NoNewWindow -Wait
+
+ $gdnCliPath = Get-ChildItem -Filter guardian.cmd -Recurse -Path $Path
+
+ if (!$gdnCliPath)
+ {
+ Write-PipelineTelemetryError -Category 'Sdl' -Message 'Failure installing Guardian'
+ }
+
+ return $gdnCliPath.FullName
+} \ No newline at end of file
diff --git a/eng/common/templates/job/execute-sdl.yml b/eng/common/templates/job/execute-sdl.yml
index 24cec0424e..9ff6a10a68 100644
--- a/eng/common/templates/job/execute-sdl.yml
+++ b/eng/common/templates/job/execute-sdl.yml
@@ -54,7 +54,7 @@ jobs:
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- checkout: self
clean: true
diff --git a/eng/common/templates/job/onelocbuild.yml b/eng/common/templates/job/onelocbuild.yml
index 9d1e3042d8..6c523b714f 100644
--- a/eng/common/templates/job/onelocbuild.yml
+++ b/eng/common/templates/job/onelocbuild.yml
@@ -41,7 +41,7 @@ jobs:
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
variables:
- group: OneLocBuildVariables # Contains the CeapexPat and GithubPat
@@ -72,8 +72,8 @@ jobs:
lclSource: ${{ parameters.LclSource }}
lclPackageId: ${{ parameters.LclPackageId }}
isCreatePrSelected: ${{ parameters.CreatePr }}
+ isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }}
${{ if eq(parameters.CreatePr, true) }}:
- isAutoCompletePrSelected: ${{ parameters.AutoCompletePr }}
isUseLfLineEndingsSelected: ${{ parameters.UseLfLineEndings }}
${{ if eq(parameters.RepoType, 'gitHub') }}:
isShouldReusePrSelected: ${{ parameters.ReusePr }}
diff --git a/eng/common/templates/job/source-index-stage1.yml b/eng/common/templates/job/source-index-stage1.yml
index 4af724eb1a..c85044a684 100644
--- a/eng/common/templates/job/source-index-stage1.yml
+++ b/eng/common/templates/job/source-index-stage1.yml
@@ -1,12 +1,13 @@
parameters:
runAsPublic: false
- sourceIndexPackageVersion: 1.0.1-20210614.1
+ sourceIndexPackageVersion: 1.0.1-20220804.1
sourceIndexPackageSource: https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json
sourceIndexBuildCommand: powershell -NoLogo -NoProfile -ExecutionPolicy Bypass -Command "eng/common/build.ps1 -restore -build -binarylog -ci"
preSteps: []
binlogPath: artifacts/log/Debug/Build.binlog
condition: ''
dependsOn: ''
+ pool: ''
jobs:
- job: SourceIndexStage1
@@ -22,13 +23,17 @@ jobs:
- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
- group: source-dot-net stage1 variables
- pool:
- ${{ if eq(variables['System.TeamProject'], 'public') }}:
- name: NetCore1ESPool-Public
- demands: ImageOverride -equals Build.Server.Amd64.VS2019.Open
- ${{ if eq(variables['System.TeamProject'], 'internal') }}:
- name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ ${{ if ne(parameters.pool, '') }}:
+ pool: ${{ parameters.pool }}
+ ${{ if eq(parameters.pool, '') }}:
+ pool:
+ ${{ if eq(variables['System.TeamProject'], 'public') }}:
+ name: NetCore1ESPool-Public
+ demands: ImageOverride -equals windows.vs2019.amd64.open
+ ${{ if eq(variables['System.TeamProject'], 'internal') }}:
+ name: NetCore1ESPool-Internal
+ demands: ImageOverride -equals windows.vs2019.amd64
+
steps:
- ${{ each preStep in parameters.preSteps }}:
- ${{ preStep }}
diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml
index 2cca53c2d1..64e5929f22 100644
--- a/eng/common/templates/jobs/jobs.yml
+++ b/eng/common/templates/jobs/jobs.yml
@@ -96,7 +96,7 @@ jobs:
# If it's not devdiv, it's dnceng
${{ if ne(variables['System.TeamProject'], 'DevDiv') }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
runAsPublic: ${{ parameters.runAsPublic }}
publishUsingPipelines: ${{ parameters.enablePublishUsingPipelines }}
diff --git a/eng/common/templates/post-build/post-build.yml b/eng/common/templates/post-build/post-build.yml
index 5a9056f6b2..87fcae940c 100644
--- a/eng/common/templates/post-build/post-build.yml
+++ b/eng/common/templates/post-build/post-build.yml
@@ -49,6 +49,7 @@ parameters:
type: object
default:
enable: false
+ publishGdn: false
continueOnError: false
params: ''
artifactNames: ''
@@ -106,7 +107,7 @@ stages:
# If it's not devdiv, it's dnceng
${{ else }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
@@ -143,7 +144,7 @@ stages:
# If it's not devdiv, it's dnceng
${{ else }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
parameters:
@@ -203,7 +204,7 @@ stages:
# If it's not devdiv, it's dnceng
${{ else }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
parameters:
@@ -235,6 +236,7 @@ stages:
- template: /eng/common/templates/job/execute-sdl.yml
parameters:
enable: ${{ parameters.SDLValidationParameters.enable }}
+ publishGuardianDirectoryToPipeline: ${{ parameters.SDLValidationParameters.publishGdn }}
additionalParameters: ${{ parameters.SDLValidationParameters.params }}
continueOnError: ${{ parameters.SDLValidationParameters.continueOnError }}
artifactNames: ${{ parameters.SDLValidationParameters.artifactNames }}
@@ -261,7 +263,7 @@ stages:
# If it's not devdiv, it's dnceng
${{ else }}:
name: NetCore1ESPool-Internal
- demands: ImageOverride -equals Build.Server.Amd64.VS2019
+ demands: ImageOverride -equals windows.vs2019.amd64
steps:
- template: setup-maestro-vars.yml
parameters:
diff --git a/eng/common/templates/steps/execute-sdl.yml b/eng/common/templates/steps/execute-sdl.yml
index 7b8ee18a28..86cf578c43 100644
--- a/eng/common/templates/steps/execute-sdl.yml
+++ b/eng/common/templates/steps/execute-sdl.yml
@@ -8,29 +8,26 @@ parameters:
condition: ''
steps:
-- ${{ if ne(parameters.overrideGuardianVersion, '') }}:
- - powershell: |
- $content = Get-Content $(GuardianPackagesConfigFile)
-
- Write-Host "packages.config content was:`n$content"
-
- $content = $content.Replace('$(DefaultGuardianVersion)', '$(GuardianVersion)')
- $content | Set-Content $(GuardianPackagesConfigFile)
-
- Write-Host "packages.config content updated to:`n$content"
- displayName: Use overridden Guardian version ${{ parameters.overrideGuardianVersion }}
+- task: NuGetAuthenticate@1
+ inputs:
+ nuGetServiceConnections: GuardianConnect
- task: NuGetToolInstaller@1
displayName: 'Install NuGet.exe'
-- task: NuGetCommand@2
- displayName: 'Install Guardian'
- inputs:
- restoreSolution: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
- feedsToUse: config
- nugetConfigPath: $(Build.SourcesDirectory)\eng\common\sdl\NuGet.config
- externalFeedCredentials: GuardianConnect
- restoreDirectory: $(Build.SourcesDirectory)\.packages
+- ${{ if ne(parameters.overrideGuardianVersion, '') }}:
+ - pwsh: |
+ . $(Build.SourcesDirectory)\eng\common\sdl\sdl.ps1
+ $guardianCliLocation = Install-Gdn -Path $(Build.SourcesDirectory)\.artifacts -Version ${{ parameters.overrideGuardianVersion }}
+ Write-Host "##vso[task.setvariable variable=GuardianCliLocation]$guardianCliLocation"
+ displayName: Install Guardian (Overridden)
+
+- ${{ if eq(parameters.overrideGuardianVersion, '') }}:
+ - pwsh: |
+ . $(Build.SourcesDirectory)\eng\common\sdl\sdl.ps1
+ $guardianCliLocation = Install-Gdn -Path $(Build.SourcesDirectory)\.artifacts
+ Write-Host "##vso[task.setvariable variable=GuardianCliLocation]$guardianCliLocation"
+ displayName: Install Guardian
- ${{ if ne(parameters.overrideParameters, '') }}:
- powershell: ${{ parameters.executeAllSdlToolsScript }} ${{ parameters.overrideParameters }}
@@ -40,7 +37,7 @@ steps:
- ${{ if eq(parameters.overrideParameters, '') }}:
- powershell: ${{ parameters.executeAllSdlToolsScript }}
- -GuardianPackageName Microsoft.Guardian.Cli.$(GuardianVersion)
+ -GuardianCliLocation $(GuardianCliLocation)
-NugetPackageDirectory $(Build.SourcesDirectory)\.packages
-AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw)
${{ parameters.additionalParameters }}
@@ -62,7 +59,28 @@ steps:
c
i
condition: succeededOrFailed()
+
- publish: $(Agent.BuildDirectory)/.gdn
artifact: GuardianConfiguration
displayName: Publish GuardianConfiguration
+ condition: succeededOrFailed()
+
+ # Publish the SARIF files in a container named CodeAnalysisLogs to enable integration
+ # with the "SARIF SAST Scans Tab" Azure DevOps extension
+ - task: CopyFiles@2
+ displayName: Copy SARIF files
+ inputs:
+ flattenFolders: true
+ sourceFolder: $(Agent.BuildDirectory)/.gdn/rc/
+ contents: '**/*.sarif'
+ targetFolder: $(Build.SourcesDirectory)/CodeAnalysisLogs
+ condition: succeededOrFailed()
+
+ # Use PublishBuildArtifacts because the SARIF extension only checks this case
+ # see microsoft/sarif-azuredevops-extension#4
+ - task: PublishBuildArtifacts@1
+ displayName: Publish SARIF files to CodeAnalysisLogs container
+ inputs:
+ pathToPublish: $(Build.SourcesDirectory)/CodeAnalysisLogs
+ artifactName: CodeAnalysisLogs
condition: succeededOrFailed() \ No newline at end of file
diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml
index 09a223989f..3eb7e2d5f8 100644
--- a/eng/common/templates/steps/send-to-helix.yml
+++ b/eng/common/templates/steps/send-to-helix.yml
@@ -3,7 +3,7 @@ parameters:
HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/
HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/'
HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number
- HelixTargetQueues: '' # required -- semicolon delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues
+ HelixTargetQueues: '' # required -- semicolon-delimited list of Helix queues to test on; see https://helix.dot.net/ for a list of queues
HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group
HelixConfiguration: '' # optional -- additional property attached to a job
HelixPreCommands: '' # optional -- commands to run before Helix work item execution
@@ -12,7 +12,7 @@ parameters:
WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects
WorkItemTimeout: '' # optional -- a timeout in TimeSpan.Parse-ready value (e.g. 00:02:00) for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects
CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload
- XUnitProjects: '' # optional -- semicolon delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true
+ XUnitProjects: '' # optional -- semicolon-delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true
XUnitWorkItemTimeout: '' # optional -- the workitem timeout in seconds for all workitems created from the xUnit projects specified by XUnitProjects
XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects
XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner
@@ -22,14 +22,14 @@ parameters:
DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/main/release-notes/releases-index.json
WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget."
IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set
- HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting int)
+ HelixBaseUri: 'https://helix.dot.net/' # optional -- sets the Helix API base URI (allows targeting https://helix.int-dot.net )
Creator: '' # optional -- if the build is external, use this to specify who is sending the job
DisplayNamePrefix: 'Run Tests' # optional -- rename the beginning of the displayName of the steps in AzDO
condition: succeeded() # optional -- condition for step to execute; defaults to succeeded()
continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false
steps:
- - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /restore /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"'
+ - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"'
displayName: ${{ parameters.DisplayNamePrefix }} (Windows)
env:
BuildConfig: $(_BuildConfig)
@@ -59,7 +59,7 @@ steps:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT'))
continueOnError: ${{ parameters.continueOnError }}
- - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /restore /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
+ - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /restore /p:TreatWarningsAsErrors=false /t:Test /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog
displayName: ${{ parameters.DisplayNamePrefix }} (Unix)
env:
BuildConfig: $(_BuildConfig)
diff --git a/eng/common/tools.ps1 b/eng/common/tools.ps1
index f1e1cb5395..aba6308ad3 100644
--- a/eng/common/tools.ps1
+++ b/eng/common/tools.ps1
@@ -365,10 +365,17 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
# If the version of msbuild is going to be xcopied,
# use this version. Version matches a package here:
- # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=16.10.0-preview2&view=overview
- $defaultXCopyMSBuildVersion = '16.10.0-preview2'
+ # https://dev.azure.com/dnceng/public/_packaging?_a=package&feed=dotnet-eng&package=RoslynTools.MSBuild&protocolType=NuGet&version=17.2.1&view=overview
+ $defaultXCopyMSBuildVersion = '17.2.1'
- if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
+ if (!$vsRequirements) {
+ if (Get-Member -InputObject $GlobalJson.tools -Name 'vs') {
+ $vsRequirements = $GlobalJson.tools.vs
+ }
+ else {
+ $vsRequirements = New-Object PSObject -Property @{ version = $vsMinVersionReqdStr }
+ }
+ }
$vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { $vsMinVersionReqdStr }
$vsMinVersion = [Version]::new($vsMinVersionStr)
@@ -573,7 +580,7 @@ function InitializeBuildTool() {
ExitWithExitCode 1
}
$dotnetPath = Join-Path $dotnetRoot (GetExecutableFileName 'dotnet')
- $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'netcoreapp3.1' }
+ $buildTool = @{ Path = $dotnetPath; Command = 'msbuild'; Tool = 'dotnet'; Framework = 'net7.0' }
} elseif ($msbuildEngine -eq "vs") {
try {
$msbuildPath = InitializeVisualStudioMSBuild -install:$restore
@@ -635,6 +642,10 @@ function InitializeNativeTools() {
InstallDirectory = "$ToolsDir"
}
}
+ if ($env:NativeToolsOnMachine) {
+ Write-Host "Variable NativeToolsOnMachine detected, enabling native tool path promotion..."
+ $nativeArgs += @{ PathPromotion = $true }
+ }
& "$PSScriptRoot/init-tools-native.ps1" @nativeArgs
}
}
diff --git a/eng/common/tools.sh b/eng/common/tools.sh
index 17f0a36580..c110d0ed41 100755
--- a/eng/common/tools.sh
+++ b/eng/common/tools.sh
@@ -312,7 +312,7 @@ function InitializeBuildTool {
# return values
_InitializeBuildTool="$_InitializeDotNetCli/dotnet"
_InitializeBuildToolCommand="msbuild"
- _InitializeBuildToolFramework="netcoreapp3.1"
+ _InitializeBuildToolFramework="net7.0"
}
# Set RestoreNoCache as a workaround for https://github.com/NuGet/Home/issues/3116
diff --git a/eng/docker/rhel.Dockerfile b/eng/docker/rhel.Dockerfile
index 61d42539e8..7e465bc45f 100644
--- a/eng/docker/rhel.Dockerfile
+++ b/eng/docker/rhel.Dockerfile
@@ -1,5 +1,5 @@
# Dockerfile that creates a container suitable to build dotnet-cli
-FROM mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-rpmpkg-20210714125435-9b5bbc2
+FROM mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-rpmpkg-20220505130359-d0fa36f
# Setup User to match Host User, and give superuser permissions
ARG USER
@@ -9,22 +9,12 @@ ARG WORKDIR
WORKDIR ${WORKDIR}
-# Workaround per https://github.com/dotnet/aspnetcore/pull/37192#issuecomment-936589233
-RUN gem uninstall fpm
-RUN yum remove -y rubygems
-RUN yum remove -y ruby-devel
-RUN yum --enablerepo=centos-sclo-rh -y install rh-ruby25
-RUN yum --enablerepo=centos-sclo-rh -y install rh-ruby25-ruby-devel
-RUN yum --enablerepo=centos-sclo-rh -y install rh-ruby25-rubygems
-RUN scl enable rh-ruby25 'gem install --no-document fpm'
-
RUN useradd -m ${USER} --uid ${USER_ID} -g root
RUN echo '${USER} ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
# With the User Change, we need to change permssions on these directories
RUN chmod -R a+rwx /usr/local
RUN chmod -R a+rwx /home
-RUN chown root:root /usr/bin/sudo && chmod 4755 /usr/bin/sudo
# Set user to the one we just created
USER $USER_ID
diff --git a/eng/helix/Directory.Build.props b/eng/helix/Directory.Build.props
index 8c119d5413..058246e408 100644
--- a/eng/helix/Directory.Build.props
+++ b/eng/helix/Directory.Build.props
@@ -1,2 +1 @@
-<Project>
-</Project>
+<Project />
diff --git a/eng/helix/Directory.Build.targets b/eng/helix/Directory.Build.targets
index 8c119d5413..058246e408 100644
--- a/eng/helix/Directory.Build.targets
+++ b/eng/helix/Directory.Build.targets
@@ -1,2 +1 @@
-<Project>
-</Project>
+<Project />
diff --git a/eng/helix/content/RunTests/Directory.Build.props b/eng/helix/content/RunTests/Directory.Build.props
deleted file mode 100644
index 058246e408..0000000000
--- a/eng/helix/content/RunTests/Directory.Build.props
+++ /dev/null
@@ -1 +0,0 @@
-<Project />
diff --git a/eng/helix/content/RunTests/Directory.Build.targets b/eng/helix/content/RunTests/Directory.Build.targets
deleted file mode 100644
index 058246e408..0000000000
--- a/eng/helix/content/RunTests/Directory.Build.targets
+++ /dev/null
@@ -1 +0,0 @@
-<Project />
diff --git a/eng/helix/content/RunTests/ProcessResult.cs b/eng/helix/content/RunTests/ProcessResult.cs
deleted file mode 100644
index 9e293c02c8..0000000000
--- a/eng/helix/content/RunTests/ProcessResult.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-namespace RunTests
-{
- public class ProcessResult
- {
- public ProcessResult(string standardOutput, string standardError, int exitCode)
- {
- StandardOutput = standardOutput;
- StandardError = standardError;
- ExitCode = exitCode;
- }
-
- public string StandardOutput { get; }
- public string StandardError { get; }
- public int ExitCode { get; }
- }
-}
diff --git a/eng/helix/content/RunTests/ProcessUtil.cs b/eng/helix/content/RunTests/ProcessUtil.cs
deleted file mode 100644
index 416ec05a90..0000000000
--- a/eng/helix/content/RunTests/ProcessUtil.cs
+++ /dev/null
@@ -1,212 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
-
-#nullable enable
-
-namespace RunTests
-{
- public static class ProcessUtil
- {
- [DllImport("libc", SetLastError = true, EntryPoint = "kill")]
- private static extern int sys_kill(int pid, int sig);
-
- public static Task CaptureDumpAsync()
- {
- var dumpDirectoryPath = Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
-
- if (dumpDirectoryPath == null)
- {
- return Task.CompletedTask;
- }
-
- var process = Process.GetCurrentProcess();
- var dumpFilePath = Path.Combine(dumpDirectoryPath, $"{process.ProcessName}-{process.Id}.dmp");
-
- return CaptureDumpAsync(process.Id, dumpFilePath);
- }
-
- public static Task CaptureDumpAsync(int pid)
- {
- var dumpDirectoryPath = Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
-
- if (dumpDirectoryPath == null)
- {
- return Task.CompletedTask;
- }
-
- var process = Process.GetProcessById(pid);
- var dumpFilePath = Path.Combine(dumpDirectoryPath, $"{process.ProcessName}.{process.Id}.dmp");
-
- return CaptureDumpAsync(process.Id, dumpFilePath);
- }
-
- public static Task CaptureDumpAsync(int pid, string dumpFilePath)
- {
- // Skip this on OSX, we know it's unsupported right now
- if (OperatingSystem.IsMacOS())
- {
- // Can we capture stacks or do a gcdump instead?
- return Task.CompletedTask;
- }
-
- if (!File.Exists($"{Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT")}/dotnet-dump") &&
- !File.Exists($"{Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT")}/dotnet-dump.exe"))
- {
- return Task.CompletedTask;
- }
-
- return RunAsync($"{Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT")}/dotnet-dump", $"collect -p {pid} -o \"{dumpFilePath}\"");
- }
-
- public static async Task<ProcessResult> RunAsync(
- string filename,
- string arguments,
- string? workingDirectory = null,
- string? dumpDirectoryPath = null,
- bool throwOnError = true,
- IDictionary<string, string?>? environmentVariables = null,
- Action<string>? outputDataReceived = null,
- Action<string>? errorDataReceived = null,
- Action<int>? onStart = null,
- CancellationToken cancellationToken = default)
- {
- Console.WriteLine($"Running '{filename} {arguments}'");
- using var process = new Process()
- {
- StartInfo =
- {
- FileName = filename,
- Arguments = arguments,
- RedirectStandardOutput = true,
- RedirectStandardError = true,
- UseShellExecute = false,
- CreateNoWindow = true,
- },
- EnableRaisingEvents = true
- };
-
-
- if (workingDirectory != null)
- {
- process.StartInfo.WorkingDirectory = workingDirectory;
- }
-
- dumpDirectoryPath ??= Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
-
- if (dumpDirectoryPath != null)
- {
- process.StartInfo.EnvironmentVariables["COMPlus_DbgEnableMiniDump"] = "1";
- process.StartInfo.EnvironmentVariables["COMPlus_DbgMiniDumpName"] = Path.Combine(dumpDirectoryPath, $"{Path.GetFileName(filename)}.%d.dmp");
- }
-
- if (environmentVariables != null)
- {
- foreach (var kvp in environmentVariables)
- {
- process.StartInfo.Environment.Add(kvp);
- }
- }
-
- var outputBuilder = new StringBuilder();
- process.OutputDataReceived += (_, e) =>
- {
- if (e.Data != null)
- {
- if (outputDataReceived != null)
- {
- outputDataReceived.Invoke(e.Data);
- }
- else
- {
- outputBuilder.AppendLine(e.Data);
- }
- }
- };
-
- var errorBuilder = new StringBuilder();
- process.ErrorDataReceived += (_, e) =>
- {
- if (e.Data != null)
- {
- if (errorDataReceived != null)
- {
- errorDataReceived.Invoke(e.Data);
- }
- else
- {
- errorBuilder.AppendLine(e.Data);
- }
- }
- };
-
- var processLifetimeTask = new TaskCompletionSource<ProcessResult>();
-
- process.Exited += (_, e) =>
- {
- Console.WriteLine($"'{process.StartInfo.FileName} {process.StartInfo.Arguments}' completed with exit code '{process.ExitCode}'");
- if (throwOnError && process.ExitCode != 0)
- {
- processLifetimeTask.TrySetException(new InvalidOperationException($"Command {filename} {arguments} returned exit code {process.ExitCode} output: {outputBuilder.ToString()}"));
- }
- else
- {
- processLifetimeTask.TrySetResult(new ProcessResult(outputBuilder.ToString(), errorBuilder.ToString(), process.ExitCode));
- }
- };
-
- process.Start();
- onStart?.Invoke(process.Id);
-
- process.BeginOutputReadLine();
- process.BeginErrorReadLine();
-
- var canceledTcs = new TaskCompletionSource<object?>();
- await using var _ = cancellationToken.Register(() => canceledTcs.TrySetResult(null));
-
- var result = await Task.WhenAny(processLifetimeTask.Task, canceledTcs.Task);
-
- if (result == canceledTcs.Task)
- {
- if (dumpDirectoryPath != null)
- {
- var dumpFilePath = Path.Combine(dumpDirectoryPath, $"{Path.GetFileName(filename)}.{process.Id}.dmp");
- // Capture a process dump if the dumpDirectory is set
- await CaptureDumpAsync(process.Id, dumpFilePath);
- }
-
- if (!OperatingSystem.IsWindows())
- {
- sys_kill(process.Id, sig: 2); // SIGINT
-
- var cancel = new CancellationTokenSource();
-
- await Task.WhenAny(processLifetimeTask.Task, Task.Delay(TimeSpan.FromSeconds(5), cancel.Token));
-
- cancel.Cancel();
- }
-
- if (!process.HasExited)
- {
- process.CloseMainWindow();
-
- if (!process.HasExited)
- {
- process.Kill();
- }
- }
- }
-
- return await processLifetimeTask.Task;
- }
- }
-}
diff --git a/eng/helix/content/RunTests/Program.cs b/eng/helix/content/RunTests/Program.cs
deleted file mode 100644
index 7247c80c36..0000000000
--- a/eng/helix/content/RunTests/Program.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Threading.Tasks;
-
-namespace RunTests
-{
- class Program
- {
- static async Task Main(string[] args)
- {
- try
- {
- var runner = new TestRunner(RunTestsOptions.Parse(args));
-
- var keepGoing = runner.SetupEnvironment();
- if (keepGoing)
- {
- keepGoing = await runner.InstallDotnetToolsAsync();
- }
-#if INSTALLPLAYWRIGHT
- if (keepGoing)
- {
- keepGoing = await runner.InstallPlaywrightAsync();
- }
-#else
- Console.WriteLine("Playwright install skipped.");
-#endif
-
- runner.DisplayContents();
-
- if (keepGoing)
- {
- if (!await runner.CheckTestDiscoveryAsync())
- {
- Console.WriteLine("RunTest stopping due to test discovery failure.");
- Environment.Exit(1);
- return;
- }
-
- var exitCode = await runner.RunTestsAsync();
- runner.UploadResults();
- Console.WriteLine($"Completed Helix job with exit code '{exitCode}'");
- Environment.Exit(exitCode);
- }
-
- Console.WriteLine("Tests were not run due to previous failures. Exit code=1");
- Environment.Exit(1);
- }
- catch (Exception e)
- {
- Console.WriteLine($"RunTests uncaught exception: {e.ToString()}");
- Environment.Exit(1);
- }
- }
- }
-}
diff --git a/eng/helix/content/RunTests/RunTests.csproj b/eng/helix/content/RunTests/RunTests.csproj
deleted file mode 100644
index bc8b4f09cf..0000000000
--- a/eng/helix/content/RunTests/RunTests.csproj
+++ /dev/null
@@ -1,13 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <OutputType>Exe</OutputType>
- <TargetFramework>net7.0</TargetFramework>
- <DefineConstants Condition=" '$(InstallPlaywright)' == 'true' ">$(DefineConstants);INSTALLPLAYWRIGHT</DefineConstants>
- </PropertyGroup>
-
- <ItemGroup>
- <PackageReference Include="System.CommandLine" Version="2.0.0-beta1.20158.1" />
- <PackageReference Condition=" '$(InstallPlaywright)' == 'true' " Include="Microsoft.Playwright" Version="1.17.3" />
- </ItemGroup>
-</Project>
diff --git a/eng/helix/content/RunTests/RunTestsOptions.cs b/eng/helix/content/RunTests/RunTestsOptions.cs
deleted file mode 100644
index bafda9df2d..0000000000
--- a/eng/helix/content/RunTests/RunTestsOptions.cs
+++ /dev/null
@@ -1,99 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.CommandLine;
-using System.Globalization;
-using System.IO;
-using System.Runtime.InteropServices;
-using System.Threading.Tasks;
-
-namespace RunTests
-{
- public class RunTestsOptions
- {
- public static RunTestsOptions Parse(string[] args)
- {
- var command = new RootCommand()
- {
- new Option(
- aliases: new string[] { "--target", "-t" },
- description: "The test dll to run")
- { Argument = new Argument<string>(), Required = true },
-
- new Option(
- aliases: new string[] { "--runtime" },
- description: "The version of the ASP.NET runtime being installed and used")
- { Argument = new Argument<string>(), Required = true },
-
- new Option(
- aliases: new string[] { "--queue" },
- description: "The name of the Helix queue being run on")
- { Argument = new Argument<string>(), Required = true },
-
- new Option(
- aliases: new string[] { "--arch" },
- description: "The architecture being run on")
- { Argument = new Argument<string>(), Required = true },
-
- new Option(
- aliases: new string[] { "--quarantined" },
- description: "Whether quarantined tests should run or not")
- { Argument = new Argument<bool>(), Required = true },
-
- new Option(
- aliases: new string[] { "--ef" },
- description: "The version of the EF tool to use")
- { Argument = new Argument<string>(), Required = true },
-
- new Option(
- aliases: new string[] { "--helixTimeout" },
- description: "The timeout duration of the Helix job")
- { Argument = new Argument<string>(), Required = true },
-
- new Option(
- aliases: new string[] { "--source" },
- description: "The restore sources to use during testing")
- { Argument = new Argument<string>() { Arity = ArgumentArity.ZeroOrMore }, Required = true }
- };
-
- var parseResult = command.Parse(args);
- var sharedFxVersion = parseResult.ValueForOption<string>("--runtime");
- var options = new RunTestsOptions
- {
- Architecture = parseResult.ValueForOption<string>("--arch"),
- EfVersion = parseResult.ValueForOption<string>("--ef"),
- HelixQueue = parseResult.ValueForOption<string>("--queue"),
- Quarantined = parseResult.ValueForOption<bool>("--quarantined"),
- RuntimeVersion = sharedFxVersion,
- Target = parseResult.ValueForOption<string>("--target"),
- Timeout = TimeSpan.Parse(parseResult.ValueForOption<string>("--helixTimeout"), CultureInfo.InvariantCulture),
-
- // When targeting pack builds, it has exactly the same version as the shared framework.
- AspNetRef = $"Microsoft.AspNetCore.App.Ref.{sharedFxVersion}.nupkg",
- AspNetRuntime = $"Microsoft.AspNetCore.App.Runtime.win-x64.{sharedFxVersion}.nupkg",
-
- DotnetRoot = Environment.GetEnvironmentVariable("DOTNET_ROOT"),
- HELIX_WORKITEM_ROOT = Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT"),
- Path = Environment.GetEnvironmentVariable("PATH"),
- };
-
- return options;
- }
-
- public string Architecture { get; private set; }
- public string EfVersion { get; private set; }
- public string HelixQueue { get; private set; }
- public bool Quarantined { get; private set; }
- public string RuntimeVersion { get; private set; }
- public string Target { get; private set; }
- public TimeSpan Timeout { get; private set; }
-
- public string AspNetRef { get; private set; }
- public string AspNetRuntime { get; private set; }
- public string HELIX_WORKITEM_ROOT { get; private set; }
- public string DotnetRoot { get; private set; }
- public string Path { get; set; }
- }
-}
diff --git a/eng/helix/content/RunTests/TestRunner.cs b/eng/helix/content/RunTests/TestRunner.cs
deleted file mode 100644
index 68c01a06f2..0000000000
--- a/eng/helix/content/RunTests/TestRunner.cs
+++ /dev/null
@@ -1,312 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.IO.Compression;
-using System.Runtime.InteropServices;
-using System.Threading;
-using System.Threading.Tasks;
-#if INSTALLPLAYWRIGHT
-using Microsoft.Playwright;
-#endif
-
-namespace RunTests
-{
- public class TestRunner
- {
- public TestRunner(RunTestsOptions options)
- {
- Options = options;
- EnvironmentVariables = new Dictionary<string, string>();
- }
-
- public RunTestsOptions Options { get; set; }
- public Dictionary<string, string> EnvironmentVariables { get; set; }
-
- public bool SetupEnvironment()
- {
- try
- {
- EnvironmentVariables.Add("DOTNET_CLI_HOME", Options.HELIX_WORKITEM_ROOT);
- EnvironmentVariables.Add("PATH", Options.Path);
- EnvironmentVariables.Add("helix", Options.HelixQueue);
-
- Console.WriteLine($"Current Directory: {Options.HELIX_WORKITEM_ROOT}");
- var helixDir = Options.HELIX_WORKITEM_ROOT;
- Console.WriteLine($"Setting HELIX_DIR: {helixDir}");
- EnvironmentVariables.Add("HELIX_DIR", helixDir);
- EnvironmentVariables.Add("NUGET_FALLBACK_PACKAGES", helixDir);
- var nugetRestore = Path.Combine(helixDir, "nugetRestore");
- EnvironmentVariables.Add("NUGET_RESTORE", nugetRestore);
- var dotnetEFFullPath = Path.Combine(nugetRestore, helixDir, "dotnet-ef.exe");
- Console.WriteLine($"Set DotNetEfFullPath: {dotnetEFFullPath}");
- EnvironmentVariables.Add("DotNetEfFullPath", dotnetEFFullPath);
- var dumpPath = Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
- Console.WriteLine($"Set VSTEST_DUMP_PATH: {dumpPath}");
- EnvironmentVariables.Add("VSTEST_DUMP_PATH", dumpPath);
-
-#if INSTALLPLAYWRIGHT
- // Playwright will download and look for browsers to this directory
- var playwrightBrowsers = Environment.GetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH");
- Console.WriteLine($"Setting PLAYWRIGHT_BROWSERS_PATH: {playwrightBrowsers}");
- EnvironmentVariables.Add("PLAYWRIGHT_BROWSERS_PATH", playwrightBrowsers);
-#else
- Console.WriteLine($"Skipping setting PLAYWRIGHT_BROWSERS_PATH");
-#endif
-
- Console.WriteLine($"Creating nuget restore directory: {nugetRestore}");
- Directory.CreateDirectory(nugetRestore);
-
- // Rename default.runner.json to xunit.runner.json if there is not a custom one from the project
- if (!File.Exists("xunit.runner.json"))
- {
- File.Copy("default.runner.json", "xunit.runner.json");
- }
-
- DisplayContents(Path.Combine(Options.DotnetRoot, "host", "fxr"));
- DisplayContents(Path.Combine(Options.DotnetRoot, "shared", "Microsoft.NETCore.App"));
- DisplayContents(Path.Combine(Options.DotnetRoot, "shared", "Microsoft.AspNetCore.App"));
- DisplayContents(Path.Combine(Options.DotnetRoot, "packs", "Microsoft.AspNetCore.App.Ref"));
-
- return true;
- }
- catch (Exception e)
- {
- Console.WriteLine($"Exception in SetupEnvironment: {e.ToString()}");
- return false;
- }
- }
-
- public void DisplayContents(string path = "./")
- {
- try
- {
- Console.WriteLine();
- Console.WriteLine($"Displaying directory contents for {path}:");
- foreach (var file in Directory.EnumerateFiles(path))
- {
- Console.WriteLine(Path.GetFileName(file));
- }
- foreach (var file in Directory.EnumerateDirectories(path))
- {
- Console.WriteLine(Path.GetFileName(file));
- }
- Console.WriteLine();
- }
- catch (Exception e)
- {
- Console.WriteLine($"Exception in DisplayContents: {e.ToString()}");
- }
- }
-
-#if INSTALLPLAYWRIGHT
- public async Task<bool> InstallPlaywrightAsync()
- {
- try
- {
- Console.WriteLine($"Installing Playwright Browsers to {Environment.GetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH")}");
-
- var exitCode = Microsoft.Playwright.Program.Main(new[] { "install" });
-
- DisplayContents(Environment.GetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH"));
- return true;
- }
- catch (Exception e)
- {
- Console.WriteLine($"Exception installing playwright: {e.ToString()}");
- return false;
- }
- }
-#endif
-
- public async Task<bool> InstallDotnetToolsAsync()
- {
- try
- {
- // Install dotnet-dump first so we can catch any failures from running dotnet after this (installing tools, running tests, etc.)
- await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- $"tool install dotnet-dump --tool-path {Options.HELIX_WORKITEM_ROOT} --version 5.0.0-*",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
-
- Console.WriteLine($"Adding current directory to nuget sources: {Options.HELIX_WORKITEM_ROOT}");
-
- await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- $"nuget add source {Options.HELIX_WORKITEM_ROOT} --configfile NuGet.config",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
-
- // Write nuget sources to console, useful for debugging purposes
- await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- "nuget list source",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
-
- await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- $"tool install dotnet-ef --version {Options.EfVersion} --tool-path {Options.HELIX_WORKITEM_ROOT}",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
-
- await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- $"tool install dotnet-serve --tool-path {Options.HELIX_WORKITEM_ROOT}",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
-
- return true;
- }
- catch (Exception e)
- {
- Console.WriteLine($"Exception in InstallDotnetTools: {e}");
- return false;
- }
- }
-
- public async Task<bool> CheckTestDiscoveryAsync()
- {
- try
- {
- // Run test discovery so we know if there are tests to run
- var discoveryResult = await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- $"vstest {Options.Target} -lt",
- environmentVariables: EnvironmentVariables,
- cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
-
- if (discoveryResult.StandardOutput.Contains("Exception thrown"))
- {
- Console.WriteLine("Exception thrown during test discovery.");
- Console.WriteLine(discoveryResult.StandardOutput);
- return false;
- }
- return true;
- }
- catch (Exception e)
- {
- Console.WriteLine($"Exception in CheckTestDiscovery: {e.ToString()}");
- return false;
- }
- }
-
- public async Task<int> RunTestsAsync()
- {
- var exitCode = 0;
- try
- {
- // Timeout test run 5 minutes before the Helix job would timeout
- var cts = new CancellationTokenSource(Options.Timeout.Subtract(TimeSpan.FromMinutes(5)));
- var diagLog = Path.Combine(Environment.GetEnvironmentVariable("HELIX_WORKITEM_UPLOAD_ROOT"), "vstest.log");
- var commonTestArgs = $"test {Options.Target} --diag:{diagLog} --logger:xunit --logger:\"console;verbosity=normal\" --blame \"CollectHangDump;TestTimeout=15m\"";
- if (Options.Quarantined)
- {
- Console.WriteLine("Running quarantined tests.");
-
- // Filter syntax: https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md
- var result = await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- commonTestArgs + " --TestCaseFilter:\"Quarantined=true\"",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: cts.Token);
-
- if (result.ExitCode != 0)
- {
- Console.WriteLine($"Failure in quarantined tests. Exit code: {result.ExitCode}.");
- }
- }
- else
- {
- Console.WriteLine("Running non-quarantined tests.");
-
- // Filter syntax: https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md
- var result = await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
- commonTestArgs + " --TestCaseFilter:\"Quarantined!=true|Quarantined=false\"",
- environmentVariables: EnvironmentVariables,
- outputDataReceived: Console.WriteLine,
- errorDataReceived: Console.Error.WriteLine,
- throwOnError: false,
- cancellationToken: cts.Token);
-
- if (result.ExitCode != 0)
- {
- Console.WriteLine($"Failure in non-quarantined tests. Exit code: {result.ExitCode}.");
- exitCode = result.ExitCode;
- }
- }
- }
- catch (Exception e)
- {
- Console.WriteLine($"Exception in RunTests: {e.ToString()}");
- exitCode = 1;
- }
- return exitCode;
- }
-
- public void UploadResults()
- {
- // 'testResults.xml' is the file Helix looks for when processing test results
- Console.WriteLine("Trying to upload results...");
- if (File.Exists("TestResults/TestResults.xml"))
- {
- Console.WriteLine("Copying TestResults/TestResults.xml to ./testResults.xml");
- File.Copy("TestResults/TestResults.xml", "testResults.xml", overwrite: true);
- }
- else
- {
- Console.WriteLine("No test results found.");
- }
-
- var HELIX_WORKITEM_UPLOAD_ROOT = Environment.GetEnvironmentVariable("HELIX_WORKITEM_UPLOAD_ROOT");
- if (string.IsNullOrEmpty(HELIX_WORKITEM_UPLOAD_ROOT))
- {
- Console.WriteLine("No HELIX_WORKITEM_UPLOAD_ROOT specified, skipping log copy");
- return;
- }
- Console.WriteLine($"Copying artifacts/log/ to {HELIX_WORKITEM_UPLOAD_ROOT}/");
- if (Directory.Exists("artifacts/log"))
- {
- foreach (var file in Directory.EnumerateFiles("artifacts/log", "*.log", SearchOption.AllDirectories))
- {
- // Combine the directory name + log name for the copied log file name to avoid overwriting duplicate test names in different test projects
- var logName = $"{Path.GetFileName(Path.GetDirectoryName(file))}_{Path.GetFileName(file)}";
- Console.WriteLine($"Copying: {file} to {Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, logName)}");
- File.Copy(file, Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, logName));
- }
- }
- else
- {
- Console.WriteLine("No logs found in artifacts/log");
- }
- Console.WriteLine($"Copying TestResults/**/Sequence*.xml to {HELIX_WORKITEM_UPLOAD_ROOT}/");
- if (Directory.Exists("TestResults"))
- {
- foreach (var file in Directory.EnumerateFiles("TestResults", "Sequence*.xml", SearchOption.AllDirectories))
- {
- var fileName = Path.GetFileName(file);
- Console.WriteLine($"Copying: {file} to {Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, fileName)}");
- File.Copy(file, Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, fileName));
- }
- }
- else
- {
- Console.WriteLine("No TestResults directory found.");
- }
- }
- }
-}
diff --git a/eng/helix/content/runtests.cmd b/eng/helix/content/runtests.cmd
index e105281f34..ae89869107 100644
--- a/eng/helix/content/runtests.cmd
+++ b/eng/helix/content/runtests.cmd
@@ -7,33 +7,25 @@ set $aspRuntimeVersion=%2
set $queue=%3
set $arch=%4
set $quarantined=%5
-set $ef=%6
-set $helixTimeout=%7
-set $installPlaywright=%8
+set $helixTimeout=%6
+set $installPlaywright=%7
REM Batch only supports up to 9 arguments using the %# syntax, need to shift to get more
set DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
set DOTNET_MULTILEVEL_LOOKUP=0
-set InstallPlaywright=%$installPlaywright%
set PLAYWRIGHT_BROWSERS_PATH=%CD%\ms-playwright
+REM Avoid https://github.com/dotnet/aspnetcore/issues/41937 in current session.
+set ASPNETCORE_ENVIRONMENT=
+
set "PATH=%HELIX_WORKITEM_ROOT%;%PATH%;%HELIX_WORKITEM_ROOT%\node\bin"
echo Set path to: "%PATH%"
echo.
set exit_code=0
-echo "Restore: dotnet restore RunTests\RunTests.csproj --ignore-failed-sources"
-dotnet restore RunTests\RunTests.csproj --ignore-failed-sources
-
-if not errorlevel 0 (
- set exit_code=%errorlevel%
- echo "Restore runtests failed: exit_code=%exit_code%"
- EXIT /b %exit_code%
-)
-
-echo "Running tests: dotnet run --no-restore --project RunTests\RunTests.csproj -- --target %$target% --runtime %$aspRuntimeVersion% --queue %$queue% --arch %$arch% --quarantined %$quarantined% --ef %$ef% --helixTimeout %$helixTimeout%"
-dotnet run --no-restore --project RunTests\RunTests.csproj -- --target %$target% --runtime %$aspRuntimeVersion% --queue %$queue% --arch %$arch% --quarantined %$quarantined% --ef %$ef% --helixTimeout %$helixTimeout%
+echo "Running tests: %HELIX_CORRELATION_PAYLOAD%/HelixTestRunner/HelixTestRunner.exe --target %$target% --runtime %$aspRuntimeVersion% --queue %$queue% --arch %$arch% --quarantined %$quarantined% --helixTimeout %$helixTimeout% --playwright %$installPlaywright%"
+%HELIX_CORRELATION_PAYLOAD%/HelixTestRunner/HelixTestRunner.exe --target %$target% --runtime %$aspRuntimeVersion% --queue %$queue% --arch %$arch% --quarantined %$quarantined% --helixTimeout %$helixTimeout% --playwright %$installPlaywright%
if not errorlevel 0 (
set exit_code=%errorlevel%
)
diff --git a/eng/helix/content/runtests.sh b/eng/helix/content/runtests.sh
index af91c928ab..ba9ce79418 100644
--- a/eng/helix/content/runtests.sh
+++ b/eng/helix/content/runtests.sh
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
helixQueue="$3"
-installPlaywright="$8"
+installPlaywright="$7"
RESET="\033[0m"
RED="\033[0;31m"
@@ -13,6 +13,9 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export DOTNET_MULTILEVEL_LOOKUP=0
export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1
+# Avoid https://github.com/dotnet/aspnetcore/issues/41937 in current session.
+unset ASPNETCORE_ENVIRONMENT
+
export PATH="$PATH:$DIR:$DIR/node/bin"
# Set playwright stuff
@@ -23,7 +26,7 @@ else
export PLAYWRIGHT_DRIVER_PATH="$DIR/.playwright/unix/native/playwright.sh"
PLAYWRIGHT_NODE_PATH=$DIR/.playwright/unix/native/node
fi
-export InstallPlaywright="$installPlaywright"
+
if [ -f "$PLAYWRIGHT_DRIVER_PATH" ]; then
if [[ "$helixQueue" != *"OSX"* ]]; then
echo "Installing Playwright requirements..."
@@ -75,20 +78,8 @@ sync
exit_code=0
-echo "Restore: dotnet restore RunTests/RunTests.csproj --ignore-failed-sources"
-
-# --verbosity diagnostic can be removed when random failures are identified
-dotnet restore RunTests/RunTests.csproj --ignore-failed-sources --verbosity diagnostic
-
-exit_code=$?
-
-if [[ $exit_code != 0 ]]; then
- echo "Restore runtests failed: exit_code=$exit_code"
- exit $exit_code
-fi
-
-echo "Running tests: dotnet run --no-restore --project RunTests/RunTests.csproj -- --target $1 --runtime $2 --queue $helixQueue --arch $4 --quarantined $5 --ef $6 --helixTimeout $7"
-dotnet run --no-restore --project RunTests/RunTests.csproj -- --target $1 --runtime $2 --queue $helixQueue --arch $4 --quarantined $5 --ef $6 --helixTimeout $7
+echo "Running tests: dotnet $HELIX_CORRELATION_PAYLOAD/HelixTestRunner/HelixTestRunner.dll --target $1 --runtime $2 --queue $helixQueue --arch $4 --quarantined $5 --helixTimeout $6 --playwright $installPlaywright"
+dotnet $HELIX_CORRELATION_PAYLOAD/HelixTestRunner/HelixTestRunner.dll --target $1 --runtime $2 --queue $helixQueue --arch $4 --quarantined $5 --helixTimeout $6 --playwright $installPlaywright
exit_code=$?
echo "Finished tests...exit_code=$exit_code"
diff --git a/eng/helix/helix.proj b/eng/helix/helix.proj
index fb07e56722..bd87b1cb45 100644
--- a/eng/helix/helix.proj
+++ b/eng/helix/helix.proj
@@ -1,4 +1,5 @@
-<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test" TreatAsLocalProperty="ProjectToBuild">
+<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test"
+ TreatAsLocalProperty="ProjectToBuild;TreatWarningsAsErrors">
<PropertyGroup>
<!--
When invoking helix.proj for the whole repo with build.cmd, ProjectToBuild will be set to the path to this project.
@@ -35,8 +36,17 @@
<DotNetCliChannel>Current</DotNetCliChannel>
<!-- Similar to ProjectLayout.props in the Arcade SDK. The Helix SDK contains nothing similar. -->
+ <ArtifactsBinDir Condition=" '$(ArtifactsBinDir)' == '' "
+ >$([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'artifacts', 'bin'))</ArtifactsBinDir>
<OutputPath Condition=" '$(OutputPath)' == '' "
- >$([MSBuild]::NormalizeDirectory('$(RepoRoot)', 'artifacts', 'bin', '$(MSBuildProjectName)'))</OutputPath>
+ >$([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', '$(MSBuildProjectName)'))</OutputPath>
+
+ <!--
+ Define $(HelixTestConfigurationFilePath) so the Helix SDK automatically includes our test config file in the
+ correlation payload. The Helix SDK has a fallback value that doesn't work w/o including the Arcade SDK and
+ we intentionally do not do that in this project.
+ -->
+ <HelixTestConfigurationFilePath>$(RepoRoot)eng/test-configuration.json</HelixTestConfigurationFilePath>
</PropertyGroup>
<!-- Specify the .NET runtime we need which will be included as a correlation payload. -->
@@ -47,6 +57,15 @@
<AdditionalDotNetPackage Include="$(MicrosoftNETCoreBrowserDebugHostTransportVersion)">
<PackageType>runtime</PackageType>
</AdditionalDotNetPackage>
+
+ <!-- Grab the tool packages for what HelixTestRunner installs. -->
+ <HelixCorrelationPayload Include="$(NUGET_PACKAGES)\dotnet-dump\$(DotnetDumpVersion)\dotnet-dump.$(DotnetDumpVersion).nupkg" />
+ <HelixCorrelationPayload Include="$(NUGET_PACKAGES)\dotnet-ef\$(DotnetEfVersion)\dotnet-ef.$(DotnetEfVersion).nupkg" />
+ <HelixCorrelationPayload Include="$(NUGET_PACKAGES)\dotnet-serve\$(DotnetServeVersion)\dotnet-serve.$(DotnetServeVersion).nupkg" />
+
+ <!-- Grab published `HelixTestRunner` project output. -->
+ <HelixCorrelationPayload Include="$(ArtifactsBinDir)HelixTestRunner\$(Configuration)\net7.0\publish\"
+ Destination="HelixTestRunner" />
</ItemGroup>
<Choose>
@@ -144,4 +163,15 @@
<Output TaskParameter="TargetOutputs" ItemName="HelixWorkItem" />
</MSBuild>
</Target>
+
+ <!--
+ The inner (per-queue) CoreTest target executes the SendHelixJob task and that may warn about expiring
+ queues. Those warnings should not break the build but should be visible. Disable warn-as-error as close
+ to target as we can get to avoid ignoring the many warnings that _should_ fail our build.
+ -->
+ <Target Name="TreatWarningsAsWarnings" BeforeTargets="CoreTest" Condition=" '$(HelixTargetQueue)' != '' ">
+ <PropertyGroup>
+ <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+ </PropertyGroup>
+ </Target>
</Project>
diff --git a/eng/scripts/CodeCheck.ps1 b/eng/scripts/CodeCheck.ps1
index 83af2d8547..b2c96d9951 100644
--- a/eng/scripts/CodeCheck.ps1
+++ b/eng/scripts/CodeCheck.ps1
@@ -99,7 +99,6 @@ try {
$expectedVersion = $dep.Version
if ($dep.Name -in $globalJson.'msbuild-sdks'.PSObject.Properties.Name) {
-
$actualVersion = $globalJson.'msbuild-sdks'.($dep.Name)
if ($expectedVersion -ne $actualVersion) {
diff --git a/eng/scripts/RunHelix.ps1 b/eng/scripts/RunHelix.ps1
index d0099e0173..92592100b9 100644
--- a/eng/scripts/RunHelix.ps1
+++ b/eng/scripts/RunHelix.ps1
@@ -16,7 +16,7 @@
OSX.1015.Amd64.Open
OSX.1100.Amd64.Open
Windows.10.Amd64.Server20H2.Open
- Windows.11.Amd64.ClientPre.Open
+ Windows.11.Amd64.Client.Open
Windows.Amd64.Server2022.Open
.PARAMETER RunQuarantinedTests
By default quarantined tests are not run. Set this to $true to run only the quarantined tests.
@@ -59,4 +59,4 @@ $HelixQueues = $HelixQueues -replace ";", "%3B"
dotnet msbuild $Project /t:Helix /p:TargetArchitecture="$TargetArchitecture" `
/p:HelixTargetQueues=$HelixQueues /p:RunQuarantinedTests=$RunQuarantinedTests `
/p:_UseHelixOpenQueues=true /p:CrossgenOutput=false /p:ASPNETCORE_TEST_LOG_DIR=artifacts/log `
- /p:DoNotRequireSharedFxHelix=true @MSBuildArguments
+ /p:DoNotRequireSharedFxHelix=true /p:NUGET_PACKAGES=$env:HOMEPATH/.nuget/packages/ @MSBuildArguments
diff --git a/eng/scripts/vs.17.buildtools.intpreview.json b/eng/scripts/vs.17.buildtools.intpreview.json
index e1fe46fad9..8a7c5ac445 100644
--- a/eng/scripts/vs.17.buildtools.intpreview.json
+++ b/eng/scripts/vs.17.buildtools.intpreview.json
@@ -20,7 +20,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools",
"Microsoft.VisualStudio.Workload.MSBuildTools",
"Microsoft.VisualStudio.Workload.NetCoreBuildTools",
diff --git a/eng/scripts/vs.17.buildtools.json b/eng/scripts/vs.17.buildtools.json
index ead9add6d6..3a125c9d35 100644
--- a/eng/scripts/vs.17.buildtools.json
+++ b/eng/scripts/vs.17.buildtools.json
@@ -20,7 +20,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools",
"Microsoft.VisualStudio.Workload.MSBuildTools",
"Microsoft.VisualStudio.Workload.NetCoreBuildTools",
diff --git a/eng/scripts/vs.17.buildtools.preview.json b/eng/scripts/vs.17.buildtools.preview.json
index c200518a15..571a499781 100644
--- a/eng/scripts/vs.17.buildtools.preview.json
+++ b/eng/scripts/vs.17.buildtools.preview.json
@@ -20,7 +20,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktopBuildTools",
"Microsoft.VisualStudio.Workload.MSBuildTools",
"Microsoft.VisualStudio.Workload.NetCoreBuildTools",
diff --git a/eng/scripts/vs.17.intpreview.json b/eng/scripts/vs.17.intpreview.json
index bdf5c862b9..67b7a1f8e9 100644
--- a/eng/scripts/vs.17.intpreview.json
+++ b/eng/scripts/vs.17.intpreview.json
@@ -17,7 +17,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NetWeb",
diff --git a/eng/scripts/vs.17.json b/eng/scripts/vs.17.json
index a626179c32..86acfd28fd 100644
--- a/eng/scripts/vs.17.json
+++ b/eng/scripts/vs.17.json
@@ -17,7 +17,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NetWeb",
diff --git a/eng/scripts/vs.17.preview.json b/eng/scripts/vs.17.preview.json
index 943b5697c1..39f8297f1f 100644
--- a/eng/scripts/vs.17.preview.json
+++ b/eng/scripts/vs.17.preview.json
@@ -17,7 +17,7 @@
"Microsoft.VisualStudio.Component.VC.14.29.16.11.x86.x64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL.ARM64",
"Microsoft.VisualStudio.Component.VC.14.29.16.11.ATL",
- "Microsoft.VisualStudio.Component.Windows10SDK.18362",
+ "Microsoft.VisualStudio.Component.Windows10SDK.19041",
"Microsoft.VisualStudio.Workload.ManagedDesktop",
"Microsoft.VisualStudio.Workload.NativeDesktop",
"Microsoft.VisualStudio.Workload.NetWeb",
diff --git a/eng/targets/Cpp.Common.props b/eng/targets/Cpp.Common.props
index b11c00f03e..c824b87caa 100644
--- a/eng/targets/Cpp.Common.props
+++ b/eng/targets/Cpp.Common.props
@@ -15,6 +15,17 @@
<TestProjectSkipReason>You cannot test native ARM64 projects on a x86/x64 machine</TestProjectSkipReason>
</PropertyGroup>
+ <PropertyGroup Label="Configuration">
+ <Configuration Condition="'$(Configuration)'==''">Debug</Configuration>
+ <VCProjectVersion>15.0</VCProjectVersion>
+ <Keyword>Win32Proj</Keyword>
+ <Platform Condition="'$(Platform)' == ''">x64</Platform>
+ <PlatformToolsetVersion>v143</PlatformToolsetVersion>
+ <PlatformToolset>$(PlatformToolsetVersion)</PlatformToolset>
+ <!-- If the following line is updated ensure that the /eng/scripts/vs.17.*.json files are updated to include the same version component too. -->
+ <WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.19041.0</WindowsTargetPlatformVersion>
+ </PropertyGroup>
+
<Import Project="MicroBuild.Plugin.props" Condition="'$(MicroBuildSentinelFile)' == ''" />
<Import Project="$(MicroBuildPluginDirectory)\MicroBuild.Plugins.*\**\build\MicroBuild.Plugins.*.props" Condition=" '$(MicroBuildPluginDirectory)' != ''" />
diff --git a/eng/targets/Helix.Common.props b/eng/targets/Helix.Common.props
index 889be1562a..48aa7945ac 100644
--- a/eng/targets/Helix.Common.props
+++ b/eng/targets/Helix.Common.props
@@ -29,7 +29,7 @@
<ItemGroup>
<HelixAvailableTargetQueue Include="Ubuntu.1804.Amd64.Open" Platform="Linux" />
<HelixAvailableTargetQueue Include="OSX.1100.Amd64.Open" Platform="OSX" />
- <HelixAvailableTargetQueue Include="Windows.11.Amd64.ClientPre.Open" Platform="Windows" />
+ <HelixAvailableTargetQueue Include="Windows.11.Amd64.Client.Open" Platform="Windows" />
</ItemGroup>
</When>
<Otherwise>
@@ -51,7 +51,6 @@
<HelixAvailableTargetQueue Include="OSX.1015.Amd64.Open" Platform="OSX" />
<!-- Windows -->
- <HelixAvailableTargetQueue Include="Windows.10.Amd64.Server20H2.Open" Platform="Windows" />
<HelixAvailableTargetQueue Include="Windows.Amd64.Server2022.Open" Platform="Windows" />
<!-- IIS Express isn't supported on arm64 and most of the IsWindowsOnlyTests depend on its setup scripts. -->
diff --git a/eng/targets/Helix.targets b/eng/targets/Helix.targets
index 695862e56c..c290255176 100644
--- a/eng/targets/Helix.targets
+++ b/eng/targets/Helix.targets
@@ -188,9 +188,9 @@
SkipUnchangedFiles="$(SkipCopyUnchangedFiles)" />
<!--
- Use the shared framework and ref/ assemblies copied to the Helix agents and expanded by RunTests. Unfortunately,
- tests of Microsoft.NET.Sdk.Web templates will not reference the just-built Microsoft.NET.Sdk.Razor. Adding a
- package reference for that would confuse tests of Microsoft.NET.Sdk templates.
+ Use the shared framework and ref/ assemblies copied to the Helix agents and expanded by HelixTestRunner.
+ Unfortunately, tests of Microsoft.NET.Sdk.Web templates will not reference the just-built
+ Microsoft.NET.Sdk.Razor. Adding a package reference for that would confuse tests of Microsoft.NET.Sdk templates.
-->
<Copy SourceFiles="$(ArtifactsBinDir)GenerateFiles\Directory.Build.props"
DestinationFiles="$(PublishDir)Directory.Build.props"
@@ -220,8 +220,8 @@
When the targeting pack builds, it has exactly the same version as the shared framework. Passing
SharedFxVersion because that's needed even when the targeting pack isn't building.
-->
- <Command Condition="$(IsWindowsHelixQueue)">call runtests.cmd $(TargetFileName) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(_TestingArchitecture) $(RunQuarantinedTests) $(DotnetEfVersion) $(HelixTimeout) $(TestDependsOnPlaywright)</Command>
- <Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(_TestingArchitecture) $(RunQuarantinedTests) $(DotnetEfVersion) $(HelixTimeout) $(TestDependsOnPlaywright)</Command>
+ <Command Condition="$(IsWindowsHelixQueue)">call runtests.cmd $(TargetFileName) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(_TestingArchitecture) $(RunQuarantinedTests) $(HelixTimeout) $(TestDependsOnPlaywright)</Command>
+ <Command Condition="!$(IsWindowsHelixQueue)">./runtests.sh $(TargetFileName) $(SharedFxVersion) $(_HelixFriendlyNameTargetQueue) $(_TestingArchitecture) $(RunQuarantinedTests) $(HelixTimeout) $(TestDependsOnPlaywright)</Command>
<Command Condition="'$(HelixCommand)' != ''">$(HelixCommand)</Command>
<Timeout>$(HelixTimeout)</Timeout>
</HelixWorkItem>
diff --git a/eng/targets/Npm.Common.targets b/eng/targets/Npm.Common.targets
index b236c04bac..97f7c9cf4d 100644
--- a/eng/targets/Npm.Common.targets
+++ b/eng/targets/Npm.Common.targets
@@ -42,7 +42,10 @@
<Target Name="Restore">
<Telemetry EventName="NETCORE_ENGINEERING_TELEMETRY" EventData="Category=Restore" />
<Message Importance="High" Text="Running yarn install on $(MSBuildProjectFullPath)" />
- <Yarn Command="install --mutex network $(InstallArgs)" StandardOutputImportance="High" StandardErrorImportance="High" IgnoreStandardErrorWarningFormat="$(IgnoreYarnWarnings)" />
+ <Yarn Command="install --mutex network $(InstallArgs) --frozen-lockfile"
+ StandardOutputImportance="High"
+ StandardErrorImportance="High"
+ IgnoreStandardErrorWarningFormat="$(IgnoreYarnWarnings)" />
</Target>
<Target Name="PrepareForBuild">
diff --git a/eng/test-configuration.json b/eng/test-configuration.json
index b60a9f5d38..c25b3e1b13 100644
--- a/eng/test-configuration.json
+++ b/eng/test-configuration.json
@@ -3,14 +3,28 @@
"defaultOnFailure": "fail",
"localRerunCount" : 3,
"retryOnRules": [
- {"testName": {"contains": "AppOfflineDroppedWhileSiteStarting_SiteShutsDown_InProcess"}},
- {"testName": {"contains": "CheckFrebDisconnect"}},
- {"testName": {"contains": "CheckStdoutWithLargeWrites"}},
- {"testName": {"contains": "ServerShutsDownWhenMainExitsStress" }},
- {"testName": {"contains": "AddressRegistrationTests" }},
+ {"testName": {"contains": "FlakyTestToEnsureRetryWorks" }},
{"testName": {"contains": "MaxRequestBufferSizeTests.LargeUpload" }},
{"testName": {"contains": "ReaderThrowsResetExceptionOnInvalidBody" }},
- {"failureMessage": "network disconnected" }
+ {"testName": {"contains": "AttributeRouting_RouteNameTokenReplace_Reachable" }},
+ {"testName": {"contains": "Http3RequestTests"}},
+ {"testName": {"contains": "Http3TlsTests"}},
+ {"testName": {"contains": "StreamPool_StreamAbortedOnClientAndServer_NotPooled"}},
+ {"testName": {"contains": "ServerCertificateSelector_Invoked"}},
+ {"testName": {"contains": "TraceIdentifierIsUnique"}},
+ {"testName": {"contains": "LocationChangingHandlers_CannotCancelTheNavigationAsynchronously_UntilReturning"}},
+ {"testName": {"contains": "ClientAbortingConnectionImmediatelyIsNotLoggedHigherThanDebug"}},
+ {"testName": {"contains": "Listen_Http3AndSocketsCoexistOnSameEndpoint_AltSvcEnabled_Upgrade"}},
+ {"testName": {"contains": "Listen_Http3AndSocketsCoexistOnSameEndpoint_AltSvcDisabled_NoUpgrade"}},
+ {"testName": {"contains": "WebConfigAppendsHostingStartup_OutOfProcess"}},
+ {"testName": {"contains": "HttpsConnectionClosedWhenResponseDoesNotSatisfyMinimumDataRate"}},
+ {"testName": {"contains": "BidirectionalStream_ServerReadsDataAndCompletes_GracefullyClosed"}},
+ {"testName": {"contains": "POST_ServerAbort_ClientReceivesAbort"}},
+ {"testName": {"contains": "VariableMultipleStreamsInSequence"}},
+ {"testName": {"contains": "POST_ServerAbortAfterWrite_ClientReceivesAbort"}},
+ {"testAssembly": {"contains": "IIS"}},
+ {"failureMessage": {"contains":"(Site is started but no worker process found)"}},
+ {"failureMessage": {"contains": "network disconnected"}}
],
"failOnRules": [
],
diff --git a/eng/tools/GenerateFiles/GenerateFiles.csproj b/eng/tools/GenerateFiles/GenerateFiles.csproj
index 6b4aff35d2..0b6322f44b 100644
--- a/eng/tools/GenerateFiles/GenerateFiles.csproj
+++ b/eng/tools/GenerateFiles/GenerateFiles.csproj
@@ -3,6 +3,8 @@
<!-- Use fixed version instead of $(DefaultNetCoreTargetFramework) to avoid needing workarounds set up here. -->
<TargetFramework>net5.0</TargetFramework>
<ExcludeFromSourceBuild>false</ExcludeFromSourceBuild>
+
+ <ConfigDirectory>$([MSBuild]::NormalizeDirectory('$(RepoRoot)', '.config'))</ConfigDirectory>
</PropertyGroup>
<ItemGroup>
@@ -15,10 +17,14 @@
<_TemplateProperties>
AspNetCorePatchVersion=$(AspNetCorePatchVersion);
DefaultNetCoreTargetFramework=$(DefaultNetCoreTargetFramework);
+ DotnetDumpVersion=$(DotnetDumpVersion);
+ DotnetEfVersion=$(DotnetEfVersion);
+ DotnetServeVersion=$(DotnetServeVersion);
MicrosoftAspNetCoreAppRefVersion=$(TargetingPackVersion);
MicrosoftAspNetCoreAppRuntimeVersion=$(SharedFxVersion);
MicrosoftNETCoreAppRefVersion=$(MicrosoftNETCoreAppRefVersion);
MicrosoftNETCoreAppRuntimeVersion=$(MicrosoftNETCoreAppRuntimeVersion);
+ MicrosoftPlaywrightCLIVersion=$(MicrosoftPlaywrightCLIVersion);
LibNetHostAppPackVersion=$(BundledNETCoreAppPackageVersion);
SupportedRuntimeIdentifiers=$(SupportedRuntimeIdentifiers.Trim())
</_TemplateProperties>
@@ -35,5 +41,10 @@
<GenerateFileFromTemplate TemplateFile="$(MSBuildThisFileDirectory)Directory.Build.targets.in"
Properties="$(_TemplateProperties)"
OutputPath="$(BaseOutputPath)Directory.Build.targets" />
+
+ <Message Importance="High" Text="$(MSBuildProjectName) -&gt; $(ConfigDirectory)dotnet-tools.json" />
+ <GenerateFileFromTemplate TemplateFile="$(MSBuildThisFileDirectory)dotnet-tools.json.in"
+ Properties="$(_TemplateProperties)"
+ OutputPath="$(ConfigDirectory)dotnet-tools.json" />
</Target>
</Project>
diff --git a/eng/tools/GenerateFiles/dotnet-tools.json.in b/eng/tools/GenerateFiles/dotnet-tools.json.in
new file mode 100644
index 0000000000..34302527d1
--- /dev/null
+++ b/eng/tools/GenerateFiles/dotnet-tools.json.in
@@ -0,0 +1,30 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "dotnet-dump": {
+ "version": "${DotnetDumpVersion}",
+ "commands": [
+ "dotnet-dump"
+ ]
+ },
+ "dotnet-ef": {
+ "version": "${DotnetEfVersion}",
+ "commands": [
+ "dotnet-ef"
+ ]
+ },
+ "dotnet-serve": {
+ "version": "${DotnetServeVersion}",
+ "commands": [
+ "dotnet-serve"
+ ]
+ },
+ "Microsoft.Playwright.CLI": {
+ "version": "${MicrosoftPlaywrightCLIVersion}",
+ "commands": [
+ "playwright"
+ ]
+ }
+ }
+}
diff --git a/eng/tools/HelixTestRunner/HelixTestRunner.csproj b/eng/tools/HelixTestRunner/HelixTestRunner.csproj
new file mode 100644
index 0000000000..54a443530e
--- /dev/null
+++ b/eng/tools/HelixTestRunner/HelixTestRunner.csproj
@@ -0,0 +1,32 @@
+<Project>
+ <PropertyGroup>
+ <!-- Despite project name, treat as a test asset to avoid both IsTestProject and IsImplementationProject. -->
+ <IsTestAssetProject>true</IsTestAssetProject>
+ <IsUnitTestProject>false</IsUnitTestProject>
+ </PropertyGroup>
+ <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
+
+ <PropertyGroup>
+ <!-- Update helix.proj when this TFM is updated. -->
+ <TargetFramework>net7.0</TargetFramework>
+
+ <OutputType>Exe</OutputType>
+ <NoWarn>$(NoWarn);CA2007;NU5104</NoWarn>
+ <IsPackable>false</IsPackable>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+
+ <!-- We don't need this unless building for tests. -->
+ <ExcludeFromBuild Condition=" '$(DotNetBuildFromSource)' == 'true' OR '$(SkipTestBuild)' == 'true' ">true</ExcludeFromBuild>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.Playwright" />
+ <PackageReference Include="System.CommandLine" Version="2.0.0-beta1.20158.1" AllowExplicitReference="true" />
+ </ItemGroup>
+
+ <Target Name="PublishThisProject" AfterTargets="Build" Condition=" '$(ExcludeFromBuild)' != 'true' " >
+ <MSBuild Projects="$(MSBuildProjectFullPath)" Targets="Publish" />
+ </Target>
+
+ <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
+</Project>
diff --git a/eng/tools/HelixTestRunner/HelixTestRunnerOptions.cs b/eng/tools/HelixTestRunner/HelixTestRunnerOptions.cs
new file mode 100644
index 0000000000..13d483d64c
--- /dev/null
+++ b/eng/tools/HelixTestRunner/HelixTestRunnerOptions.cs
@@ -0,0 +1,98 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.CommandLine;
+using System.Globalization;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Threading.Tasks;
+
+namespace HelixTestRunner;
+
+public class HelixTestRunnerOptions
+{
+ public static HelixTestRunnerOptions Parse(string[] args)
+ {
+ var command = new RootCommand()
+ {
+ new Option(
+ aliases: new string[] { "--target", "-t" },
+ description: "The test dll to run")
+ { Argument = new Argument<string>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--runtime" },
+ description: "The version of the ASP.NET runtime being installed and used")
+ { Argument = new Argument<string>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--queue" },
+ description: "The name of the Helix queue being run on")
+ { Argument = new Argument<string>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--arch" },
+ description: "The architecture being run on")
+ { Argument = new Argument<string>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--playwright" },
+ description: "Whether to install Microsoft.Playwright browsers or not")
+ { Argument = new Argument<bool>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--quarantined" },
+ description: "Whether quarantined tests should run or not")
+ { Argument = new Argument<bool>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--helixTimeout" },
+ description: "The timeout duration of the Helix job")
+ { Argument = new Argument<string>(), Required = true },
+
+ new Option(
+ aliases: new string[] { "--source" },
+ description: "The restore sources to use during testing")
+ { Argument = new Argument<string>() { Arity = ArgumentArity.ZeroOrMore }, Required = true }
+ };
+
+ var parseResult = command.Parse(args);
+ var sharedFxVersion = parseResult.ValueForOption<string>("--runtime");
+ var options = new HelixTestRunnerOptions
+ {
+ Architecture = parseResult.ValueForOption<string>("--arch"),
+ HelixQueue = parseResult.ValueForOption<string>("--queue"),
+ InstallPlaywright = parseResult.ValueForOption<bool>("--playwright"),
+ Quarantined = parseResult.ValueForOption<bool>("--quarantined"),
+ RuntimeVersion = sharedFxVersion,
+ Target = parseResult.ValueForOption<string>("--target"),
+ Timeout = TimeSpan.Parse(parseResult.ValueForOption<string>("--helixTimeout"), CultureInfo.InvariantCulture),
+
+ // When targeting pack builds, it has exactly the same version as the shared framework.
+ AspNetRef = $"Microsoft.AspNetCore.App.Ref.{sharedFxVersion}.nupkg",
+ AspNetRuntime = $"Microsoft.AspNetCore.App.Runtime.win-x64.{sharedFxVersion}.nupkg",
+
+ DotnetRoot = Environment.GetEnvironmentVariable("DOTNET_ROOT"),
+ HELIX_WORKITEM_ROOT = Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT"),
+ Path = Environment.GetEnvironmentVariable("PATH"),
+ };
+
+ return options;
+ }
+
+ public string Architecture { get; private set; }
+ public string HelixQueue { get; private set; }
+ public bool InstallPlaywright { get; private set; }
+ public bool Quarantined { get; private set; }
+ public string RuntimeVersion { get; private set; }
+ public string Target { get; private set; }
+ public TimeSpan Timeout { get; private set; }
+
+ public string AspNetRef { get; private set; }
+ public string AspNetRuntime { get; private set; }
+ public string HELIX_WORKITEM_ROOT { get; private set; }
+ public string DotnetRoot { get; private set; }
+ public string Path { get; set; }
+}
diff --git a/eng/tools/HelixTestRunner/ProcessResult.cs b/eng/tools/HelixTestRunner/ProcessResult.cs
new file mode 100644
index 0000000000..29a8b3bc1e
--- /dev/null
+++ b/eng/tools/HelixTestRunner/ProcessResult.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace HelixTestRunner;
+
+public class ProcessResult
+{
+ public ProcessResult(string standardOutput, string standardError, int exitCode)
+ {
+ StandardOutput = standardOutput;
+ StandardError = standardError;
+ ExitCode = exitCode;
+ }
+
+ public string StandardOutput { get; }
+ public string StandardError { get; }
+ public int ExitCode { get; }
+}
diff --git a/eng/tools/HelixTestRunner/ProcessUtil.cs b/eng/tools/HelixTestRunner/ProcessUtil.cs
new file mode 100644
index 0000000000..b895fa86f5
--- /dev/null
+++ b/eng/tools/HelixTestRunner/ProcessUtil.cs
@@ -0,0 +1,213 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Globalization;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+#nullable enable
+
+namespace HelixTestRunner;
+
+public static partial class ProcessUtil
+{
+ [LibraryImport("libc", SetLastError = true, EntryPoint = "kill")]
+ private static partial int sys_kill(int pid, int sig);
+
+ public static Task CaptureDumpAsync()
+ {
+ var dumpDirectoryPath = Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
+
+ if (dumpDirectoryPath == null)
+ {
+ return Task.CompletedTask;
+ }
+
+ var process = Process.GetCurrentProcess();
+ var dumpFilePath = Path.Combine(dumpDirectoryPath, $"{process.ProcessName}-{process.Id}.dmp");
+
+ return CaptureDumpAsync(process.Id, dumpFilePath);
+ }
+
+ public static Task CaptureDumpAsync(int pid)
+ {
+ var dumpDirectoryPath = Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
+
+ if (dumpDirectoryPath == null)
+ {
+ return Task.CompletedTask;
+ }
+
+ var process = Process.GetProcessById(pid);
+ var dumpFilePath = Path.Combine(dumpDirectoryPath, $"{process.ProcessName}.{process.Id}.dmp");
+
+ return CaptureDumpAsync(process.Id, dumpFilePath);
+ }
+
+ public static Task CaptureDumpAsync(int pid, string dumpFilePath)
+ {
+ // Skip this on OSX, we know it's unsupported right now
+ if (OperatingSystem.IsMacOS())
+ {
+ // Can we capture stacks or do a gcdump instead?
+ return Task.CompletedTask;
+ }
+
+ if (!File.Exists($"{Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT")}/dotnet-dump") &&
+ !File.Exists($"{Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT")}/dotnet-dump.exe"))
+ {
+ return Task.CompletedTask;
+ }
+
+ return RunAsync($"{Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT")}/dotnet-dump", $"collect -p {pid} -o \"{dumpFilePath}\"");
+ }
+
+ public static async Task<ProcessResult> RunAsync(
+ string filename,
+ string arguments,
+ string? workingDirectory = null,
+ string? dumpDirectoryPath = null,
+ bool throwOnError = true,
+ IDictionary<string, string?>? environmentVariables = null,
+ Action<string>? outputDataReceived = null,
+ Action<string>? errorDataReceived = null,
+ Action<int>? onStart = null,
+ CancellationToken cancellationToken = default)
+ {
+ PrintMessage($"Running '{filename} {arguments}'");
+ using var process = new Process()
+ {
+ StartInfo =
+ {
+ FileName = filename,
+ Arguments = arguments,
+ RedirectStandardOutput = true,
+ RedirectStandardError = true,
+ UseShellExecute = false,
+ CreateNoWindow = true,
+ },
+ EnableRaisingEvents = true
+ };
+
+ if (workingDirectory != null)
+ {
+ process.StartInfo.WorkingDirectory = workingDirectory;
+ }
+
+ dumpDirectoryPath ??= Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
+
+ if (dumpDirectoryPath != null)
+ {
+ process.StartInfo.EnvironmentVariables["COMPlus_DbgEnableMiniDump"] = "1";
+ process.StartInfo.EnvironmentVariables["COMPlus_DbgMiniDumpName"] = Path.Combine(dumpDirectoryPath, $"{Path.GetFileName(filename)}.%d.dmp");
+ }
+
+ if (environmentVariables != null)
+ {
+ foreach (var kvp in environmentVariables)
+ {
+ process.StartInfo.Environment.Add(kvp);
+ }
+ }
+
+ var outputBuilder = new StringBuilder();
+ process.OutputDataReceived += (_, e) =>
+ {
+ if (e.Data != null)
+ {
+ if (outputDataReceived != null)
+ {
+ outputDataReceived.Invoke(e.Data);
+ }
+ else
+ {
+ outputBuilder.AppendLine(e.Data);
+ }
+ }
+ };
+
+ var errorBuilder = new StringBuilder();
+ process.ErrorDataReceived += (_, e) =>
+ {
+ if (e.Data != null)
+ {
+ if (errorDataReceived != null)
+ {
+ errorDataReceived.Invoke(e.Data);
+ }
+ else
+ {
+ errorBuilder.AppendLine(e.Data);
+ }
+ }
+ };
+
+ var processLifetimeTask = new TaskCompletionSource<ProcessResult>();
+
+ process.Exited += (_, e) =>
+ {
+ PrintMessage($"'{process.StartInfo.FileName} {process.StartInfo.Arguments}' completed with exit code '{process.ExitCode}'");
+ if (throwOnError && process.ExitCode != 0)
+ {
+ processLifetimeTask.TrySetException(new InvalidOperationException($"Command {filename} {arguments} returned exit code {process.ExitCode} output: {outputBuilder.ToString()}"));
+ }
+ else
+ {
+ processLifetimeTask.TrySetResult(new ProcessResult(outputBuilder.ToString(), errorBuilder.ToString(), process.ExitCode));
+ }
+ };
+
+ process.Start();
+ onStart?.Invoke(process.Id);
+
+ process.BeginOutputReadLine();
+ process.BeginErrorReadLine();
+
+ var canceledTcs = new TaskCompletionSource<object?>();
+ await using var _ = cancellationToken.Register(() => canceledTcs.TrySetResult(null));
+
+ var result = await Task.WhenAny(processLifetimeTask.Task, canceledTcs.Task);
+
+ if (result == canceledTcs.Task)
+ {
+ if (dumpDirectoryPath != null)
+ {
+ var dumpFilePath = Path.Combine(dumpDirectoryPath, $"{Path.GetFileName(filename)}.{process.Id}.dmp");
+ // Capture a process dump if the dumpDirectory is set
+ await CaptureDumpAsync(process.Id, dumpFilePath);
+ }
+
+ if (!OperatingSystem.IsWindows())
+ {
+ sys_kill(process.Id, sig: 2); // SIGINT
+
+ var cancel = new CancellationTokenSource();
+
+ await Task.WhenAny(processLifetimeTask.Task, Task.Delay(TimeSpan.FromSeconds(5), cancel.Token));
+
+ cancel.Cancel();
+ }
+
+ if (!process.HasExited)
+ {
+ process.CloseMainWindow();
+
+ if (!process.HasExited)
+ {
+ process.Kill();
+ }
+ }
+ }
+
+ return await processLifetimeTask.Task;
+ }
+
+ public static void PrintMessage(string message) => Console.WriteLine($"{DateTime.UtcNow.ToString("O", CultureInfo.InvariantCulture)} {message}");
+ public static void PrintErrorMessage(string message) => Console.Error.WriteLine($"{DateTime.UtcNow.ToString("O", CultureInfo.InvariantCulture)} {message}");
+}
diff --git a/eng/tools/HelixTestRunner/Program.cs b/eng/tools/HelixTestRunner/Program.cs
new file mode 100644
index 0000000000..e2afbb1395
--- /dev/null
+++ b/eng/tools/HelixTestRunner/Program.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Globalization;
+using System.Threading.Tasks;
+
+namespace HelixTestRunner;
+
+class Program
+{
+ static async Task Main(string[] args)
+ {
+ try
+ {
+ var runner = new TestRunner(HelixTestRunnerOptions.Parse(args));
+
+ var keepGoing = runner.SetupEnvironment();
+ if (keepGoing)
+ {
+ keepGoing = await runner.InstallDotnetToolsAsync();
+ }
+
+ if (keepGoing)
+ {
+ if (runner.Options.InstallPlaywright)
+ {
+ keepGoing = runner.InstallPlaywright();
+ }
+ else
+ {
+ ProcessUtil.PrintMessage("Playwright install skipped.");
+ }
+ }
+
+ runner.DisplayContents();
+
+ if (keepGoing)
+ {
+ if (!await runner.CheckTestDiscoveryAsync())
+ {
+ ProcessUtil.PrintMessage("RunTest stopping due to test discovery failure.");
+ Environment.Exit(1);
+ return;
+ }
+
+ ProcessUtil.PrintMessage("Start running tests");
+ var exitCode = await runner.RunTestsAsync();
+ ProcessUtil.PrintMessage("Running tests complete");
+
+ ProcessUtil.PrintMessage("Uploading test results");
+ runner.UploadResults();
+ ProcessUtil.PrintMessage("Test results uploaded");
+
+ ProcessUtil.PrintMessage($"Completed Helix job with exit code '{exitCode}'");
+ Environment.Exit(exitCode);
+ }
+
+ ProcessUtil.PrintMessage("Tests were not run due to previous failures. Exit code=1");
+ Environment.Exit(1);
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"HelixTestRunner uncaught exception: {e.ToString()}");
+ Environment.Exit(1);
+ }
+ }
+}
diff --git a/eng/tools/HelixTestRunner/TestRunner.cs b/eng/tools/HelixTestRunner/TestRunner.cs
new file mode 100644
index 0000000000..30285e90ee
--- /dev/null
+++ b/eng/tools/HelixTestRunner/TestRunner.cs
@@ -0,0 +1,333 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace HelixTestRunner;
+
+public class TestRunner
+{
+ public TestRunner(HelixTestRunnerOptions options)
+ {
+ Options = options;
+ EnvironmentVariables = new Dictionary<string, string>();
+ }
+
+ public HelixTestRunnerOptions Options { get; set; }
+ public Dictionary<string, string> EnvironmentVariables { get; set; }
+
+ public bool SetupEnvironment()
+ {
+ try
+ {
+ EnvironmentVariables.Add("DOTNET_CLI_HOME", Options.HELIX_WORKITEM_ROOT);
+ EnvironmentVariables.Add("PATH", Options.Path);
+ EnvironmentVariables.Add("helix", Options.HelixQueue);
+
+ ProcessUtil.PrintMessage($"Current Directory: {Options.HELIX_WORKITEM_ROOT}");
+ var helixDir = Options.HELIX_WORKITEM_ROOT;
+ ProcessUtil.PrintMessage($"Setting HELIX_DIR: {helixDir}");
+ EnvironmentVariables.Add("HELIX_DIR", helixDir);
+ EnvironmentVariables.Add("NUGET_FALLBACK_PACKAGES", helixDir);
+ var nugetRestore = Path.Combine(helixDir, "nugetRestore");
+ EnvironmentVariables.Add("NUGET_RESTORE", nugetRestore);
+ var dotnetEFFullPath = Path.Combine(nugetRestore, helixDir, "dotnet-ef.exe");
+ ProcessUtil.PrintMessage($"Set DotNetEfFullPath: {dotnetEFFullPath}");
+ EnvironmentVariables.Add("DotNetEfFullPath", dotnetEFFullPath);
+ var dumpPath = Environment.GetEnvironmentVariable("HELIX_DUMP_FOLDER");
+ ProcessUtil.PrintMessage($"Set VSTEST_DUMP_PATH: {dumpPath}");
+ EnvironmentVariables.Add("VSTEST_DUMP_PATH", dumpPath);
+ EnvironmentVariables.Add("DOTNET_CLI_VSTEST_TRACE", "1");
+
+ if (Options.InstallPlaywright)
+ {
+ // Playwright will download and look for browsers to this directory
+ var playwrightBrowsers = Environment.GetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH");
+ ProcessUtil.PrintMessage($"Setting PLAYWRIGHT_BROWSERS_PATH: {playwrightBrowsers}");
+ EnvironmentVariables.Add("PLAYWRIGHT_BROWSERS_PATH", playwrightBrowsers);
+ }
+ else
+ {
+ ProcessUtil.PrintMessage($"Skipping setting PLAYWRIGHT_BROWSERS_PATH");
+ }
+
+ ProcessUtil.PrintMessage($"Creating nuget restore directory: {nugetRestore}");
+ Directory.CreateDirectory(nugetRestore);
+
+ // Rename default.runner.json to xunit.runner.json if there is not a custom one from the project
+ if (!File.Exists("xunit.runner.json"))
+ {
+ File.Copy("default.runner.json", "xunit.runner.json");
+ }
+
+ DisplayContents(Path.Combine(Options.DotnetRoot, "host", "fxr"));
+ DisplayContents(Path.Combine(Options.DotnetRoot, "shared", "Microsoft.NETCore.App"));
+ DisplayContents(Path.Combine(Options.DotnetRoot, "shared", "Microsoft.AspNetCore.App"));
+ DisplayContents(Path.Combine(Options.DotnetRoot, "packs", "Microsoft.AspNetCore.App.Ref"));
+
+ return true;
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception in SetupEnvironment: {e}");
+ return false;
+ }
+ }
+
+ public void DisplayContents(string path = "./")
+ {
+ try
+ {
+ Console.WriteLine();
+ ProcessUtil.PrintMessage($"Displaying directory contents for {path}:");
+ foreach (var file in Directory.EnumerateFiles(path))
+ {
+ ProcessUtil.PrintMessage(Path.GetFileName(file));
+ }
+ foreach (var file in Directory.EnumerateDirectories(path))
+ {
+ ProcessUtil.PrintMessage(Path.GetFileName(file));
+ }
+ Console.WriteLine();
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception in DisplayContents: {e}");
+ }
+ }
+
+ public bool InstallPlaywright()
+ {
+ try
+ {
+ ProcessUtil.PrintMessage($"Installing Playwright Browsers to {Environment.GetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH")}");
+
+ var exitCode = Microsoft.Playwright.Program.Main(new[] { "install" });
+
+ DisplayContents(Environment.GetEnvironmentVariable("PLAYWRIGHT_BROWSERS_PATH"));
+ return true;
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception installing playwright: {e}");
+ return false;
+ }
+ }
+
+ public async Task<bool> InstallDotnetToolsAsync()
+ {
+ const string filename = "NuGet.config";
+ const string backupFilename = "NuGet.save";
+ var correlationPayload = Environment.GetEnvironmentVariable("HELIX_CORRELATION_PAYLOAD");
+
+ try
+ {
+ // Do not use network for dotnet tool installations.
+ File.Move(filename, backupFilename);
+
+ // Install dotnet-dump first so we can catch any failures from running dotnet after this
+ // (installing tools, running tests, etc.)
+ await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ $"tool install dotnet-dump --tool-path {Options.HELIX_WORKITEM_ROOT} --add-source {correlationPayload}",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
+
+ await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ $"tool install dotnet-ef --tool-path {Options.HELIX_WORKITEM_ROOT} --add-source {correlationPayload}",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
+
+ await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ $"tool install dotnet-serve --tool-path {Options.HELIX_WORKITEM_ROOT} --add-source {correlationPayload}",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception in InstallDotnetTools: {e}");
+ return false;
+ }
+ finally
+ {
+ File.Move(backupFilename, filename);
+ }
+
+ try
+ {
+ ProcessUtil.PrintMessage($"Adding current directory to nuget sources: {Options.HELIX_WORKITEM_ROOT}");
+
+ await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ $"nuget add source {Options.HELIX_WORKITEM_ROOT} --configfile {filename}",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
+
+ // Write nuget sources to console, useful for debugging purposes
+ await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ "nuget list source",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception in InstallDotnetTools: {e}");
+ return false;
+ }
+
+ return true;
+ }
+
+ public async Task<bool> CheckTestDiscoveryAsync()
+ {
+ try
+ {
+ // Run test discovery so we know if there are tests to run
+ var discoveryResult = await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ $"vstest {Options.Target} -lt",
+ environmentVariables: EnvironmentVariables,
+ cancellationToken: new CancellationTokenSource(TimeSpan.FromMinutes(2)).Token);
+
+ if (discoveryResult.StandardOutput.Contains("Exception thrown"))
+ {
+ ProcessUtil.PrintMessage("Exception thrown during test discovery.");
+ ProcessUtil.PrintMessage(discoveryResult.StandardOutput);
+ return false;
+ }
+ return true;
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception in CheckTestDiscovery: {e}");
+ return false;
+ }
+ }
+
+ public async Task<int> RunTestsAsync()
+ {
+ var exitCode = 0;
+ try
+ {
+ // Timeout test run 5 minutes before the Helix job would timeout
+ var testProcessTimeout = Options.Timeout.Subtract(TimeSpan.FromMinutes(5));
+ var cts = new CancellationTokenSource(testProcessTimeout);
+ var diagLog = Path.Combine(Environment.GetEnvironmentVariable("HELIX_WORKITEM_UPLOAD_ROOT"), "vstest.log");
+ var commonTestArgs = $"test {Options.Target} --diag:{diagLog} --logger xunit --logger \"console;verbosity=normal\" " +
+ "--blame-crash --blame-hang-timeout 15m";
+ if (Options.Quarantined)
+ {
+ ProcessUtil.PrintMessage("Running quarantined tests.");
+
+ // Filter syntax: https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md
+ var result = await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ commonTestArgs + " --filter \"Quarantined=true\"",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: cts.Token);
+
+ if (cts.Token.IsCancellationRequested)
+ {
+ ProcessUtil.PrintMessage($"Quarantined tests exceeded configured timeout: {testProcessTimeout.TotalMinutes}m.");
+ }
+ if (result.ExitCode != 0)
+ {
+ ProcessUtil.PrintMessage($"Failure in quarantined tests. Exit code: {result.ExitCode}.");
+ }
+ }
+ else
+ {
+ ProcessUtil.PrintMessage("Running non-quarantined tests.");
+
+ // Filter syntax: https://github.com/Microsoft/vstest-docs/blob/master/docs/filter.md
+ var result = await ProcessUtil.RunAsync($"{Options.DotnetRoot}/dotnet",
+ commonTestArgs + " --filter \"Quarantined!=true|Quarantined=false\"",
+ environmentVariables: EnvironmentVariables,
+ outputDataReceived: ProcessUtil.PrintMessage,
+ errorDataReceived: ProcessUtil.PrintErrorMessage,
+ throwOnError: false,
+ cancellationToken: cts.Token);
+
+ if (cts.Token.IsCancellationRequested)
+ {
+ ProcessUtil.PrintMessage($"Non-quarantined tests exceeded configured timeout: {testProcessTimeout.TotalMinutes}m.");
+ }
+ if (result.ExitCode != 0)
+ {
+ ProcessUtil.PrintMessage($"Failure in non-quarantined tests. Exit code: {result.ExitCode}.");
+ exitCode = result.ExitCode;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ ProcessUtil.PrintMessage($"Exception in HelixTestRunner: {e}");
+ exitCode = 1;
+ }
+ return exitCode;
+ }
+
+ public void UploadResults()
+ {
+ // 'testResults.xml' is the file Helix looks for when processing test results
+ ProcessUtil.PrintMessage("Trying to upload results...");
+ if (File.Exists("TestResults/TestResults.xml"))
+ {
+ ProcessUtil.PrintMessage("Copying TestResults/TestResults.xml to ./testResults.xml");
+ File.Copy("TestResults/TestResults.xml", "testResults.xml", overwrite: true);
+ }
+ else
+ {
+ ProcessUtil.PrintMessage("No test results found.");
+ }
+
+ var HELIX_WORKITEM_UPLOAD_ROOT = Environment.GetEnvironmentVariable("HELIX_WORKITEM_UPLOAD_ROOT");
+ if (string.IsNullOrEmpty(HELIX_WORKITEM_UPLOAD_ROOT))
+ {
+ ProcessUtil.PrintMessage("No HELIX_WORKITEM_UPLOAD_ROOT specified, skipping log copy");
+ return;
+ }
+ ProcessUtil.PrintMessage($"Copying artifacts/log/ to {HELIX_WORKITEM_UPLOAD_ROOT}/");
+ if (Directory.Exists("artifacts/log"))
+ {
+ foreach (var file in Directory.EnumerateFiles("artifacts/log", "*.log", SearchOption.AllDirectories))
+ {
+ // Combine the directory name + log name for the copied log file name to avoid overwriting
+ // duplicate test names in different test projects
+ var logName = $"{Path.GetFileName(Path.GetDirectoryName(file))}_{Path.GetFileName(file)}";
+ ProcessUtil.PrintMessage($"Copying: {file} to {Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, logName)}");
+ File.Copy(file, Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, logName));
+ }
+ }
+ else
+ {
+ ProcessUtil.PrintMessage("No logs found in artifacts/log");
+ }
+ ProcessUtil.PrintMessage($"Copying TestResults/**/Sequence*.xml to {HELIX_WORKITEM_UPLOAD_ROOT}/");
+ if (Directory.Exists("TestResults"))
+ {
+ foreach (var file in Directory.EnumerateFiles("TestResults", "Sequence*.xml", SearchOption.AllDirectories))
+ {
+ var fileName = Path.GetFileName(file);
+ ProcessUtil.PrintMessage($"Copying: {file} to {Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, fileName)}");
+ File.Copy(file, Path.Combine(HELIX_WORKITEM_UPLOAD_ROOT, fileName));
+ }
+ }
+ else
+ {
+ ProcessUtil.PrintMessage("No TestResults directory found.");
+ }
+ }
+}
diff --git a/eng/tools/tools.slnf b/eng/tools/tools.slnf
index 9aaedcfb4a..bdd4896e94 100644
--- a/eng/tools/tools.slnf
+++ b/eng/tools/tools.slnf
@@ -1,9 +1,10 @@
-{
+{
"solution": {
"path": "..\\..\\AspNetCore.sln",
- "projects" : [
+ "projects": [
"eng\\tools\\BaselineGenerator\\BaselineGenerator.csproj",
- "eng\\tools\\RepoTasks\\RepoTasks.csproj"
+ "eng\\tools\\RepoTasks\\RepoTasks.csproj",
+ "eng\\tools\\HelixTestRunner\\HelixTestRunner.csproj"
]
}
}
diff --git a/global.json b/global.json
index 6ef32403bf..8df4289e55 100644
--- a/global.json
+++ b/global.json
@@ -1,9 +1,9 @@
{
"sdk": {
- "version": "7.0.100-preview.4.22204.1"
+ "version": "7.0.100-rc.1.22375.2"
},
"tools": {
- "dotnet": "7.0.100-preview.4.22204.1",
+ "dotnet": "7.0.100-rc.1.22375.2",
"runtimes": {
"dotnet/x86": [
"$(MicrosoftNETCoreBrowserDebugHostTransportVersion)"
@@ -15,7 +15,7 @@
"Git": "2.22.0",
"jdk": "11.0.3",
"vs": {
- "version": "16.8",
+ "version": "17.2",
"components": [
"Microsoft.VisualStudio.Component.VC.ATL",
"Microsoft.VisualStudio.Component.VC.ATL.ARM64",
@@ -23,11 +23,11 @@
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64"
]
},
- "xcopy-msbuild": "16.5.0-alpha"
+ "xcopy-msbuild": "17.1.0"
},
"msbuild-sdks": {
"Yarn.MSBuild": "1.22.10",
- "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.22215.2",
- "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.22215.2"
+ "Microsoft.DotNet.Arcade.Sdk": "7.0.0-beta.22419.1",
+ "Microsoft.DotNet.Helix.Sdk": "7.0.0-beta.22419.1"
}
}
diff --git a/src/Analyzers/Analyzers/src/BuildServiceProviderAnalyzer.cs b/src/Analyzers/Analyzers/src/BuildServiceProviderAnalyzer.cs
index 01d00d1582..1ec96de466 100644
--- a/src/Analyzers/Analyzers/src/BuildServiceProviderAnalyzer.cs
+++ b/src/Analyzers/Analyzers/src/BuildServiceProviderAnalyzer.cs
@@ -7,7 +7,7 @@ using Microsoft.CodeAnalysis.Diagnostics;
namespace Microsoft.AspNetCore.Analyzers;
-internal class BuildServiceProviderAnalyzer
+internal sealed class BuildServiceProviderAnalyzer
{
private readonly StartupAnalysis _context;
diff --git a/src/Analyzers/Analyzers/src/ConfigureMethodVisitor.cs b/src/Analyzers/Analyzers/src/ConfigureMethodVisitor.cs
index c47f372b9e..277ea537a4 100644
--- a/src/Analyzers/Analyzers/src/ConfigureMethodVisitor.cs
+++ b/src/Analyzers/Analyzers/src/ConfigureMethodVisitor.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class ConfigureMethodVisitor : SymbolVisitor
+internal sealed class ConfigureMethodVisitor : SymbolVisitor
{
public static List<IMethodSymbol> FindConfigureMethods(StartupSymbols symbols, IAssemblySymbol assembly)
{
diff --git a/src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs b/src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs
index 137e685d52..c7f63c234a 100644
--- a/src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs
+++ b/src/Analyzers/Analyzers/src/MiddlewareAnalysis.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class MiddlewareAnalysis
+internal sealed class MiddlewareAnalysis
{
public MiddlewareAnalysis(IMethodSymbol configureMethod, ImmutableArray<MiddlewareItem> middleware)
{
diff --git a/src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs b/src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs
index 6fc9bcdf86..a54c8bf6e8 100644
--- a/src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs
+++ b/src/Analyzers/Analyzers/src/MiddlewareAnalyzer.cs
@@ -8,7 +8,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.AspNetCore.Analyzers;
-internal class MiddlewareAnalyzer
+internal sealed class MiddlewareAnalyzer
{
private readonly StartupAnalysisBuilder _context;
diff --git a/src/Analyzers/Analyzers/src/MiddlewareItem.cs b/src/Analyzers/Analyzers/src/MiddlewareItem.cs
index d60e568da7..ee5574e1d6 100644
--- a/src/Analyzers/Analyzers/src/MiddlewareItem.cs
+++ b/src/Analyzers/Analyzers/src/MiddlewareItem.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.AspNetCore.Analyzers;
-internal class MiddlewareItem
+internal sealed class MiddlewareItem
{
public MiddlewareItem(IInvocationOperation operation)
{
diff --git a/src/Analyzers/Analyzers/src/OptionsAnalysis.cs b/src/Analyzers/Analyzers/src/OptionsAnalysis.cs
index 2223958504..bb5d801ad5 100644
--- a/src/Analyzers/Analyzers/src/OptionsAnalysis.cs
+++ b/src/Analyzers/Analyzers/src/OptionsAnalysis.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class OptionsAnalysis
+internal sealed class OptionsAnalysis
{
public OptionsAnalysis(IMethodSymbol configureServicesMethod, ImmutableArray<OptionsItem> options)
{
diff --git a/src/Analyzers/Analyzers/src/OptionsAnalyzer.cs b/src/Analyzers/Analyzers/src/OptionsAnalyzer.cs
index 98e15f6937..87baf69d15 100644
--- a/src/Analyzers/Analyzers/src/OptionsAnalyzer.cs
+++ b/src/Analyzers/Analyzers/src/OptionsAnalyzer.cs
@@ -9,7 +9,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.AspNetCore.Analyzers;
-internal class OptionsAnalyzer
+internal sealed class OptionsAnalyzer
{
private readonly StartupAnalysisBuilder _context;
diff --git a/src/Analyzers/Analyzers/src/OptionsItem.cs b/src/Analyzers/Analyzers/src/OptionsItem.cs
index 760059dcf6..3e5220b737 100644
--- a/src/Analyzers/Analyzers/src/OptionsItem.cs
+++ b/src/Analyzers/Analyzers/src/OptionsItem.cs
@@ -5,7 +5,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class OptionsItem
+internal sealed class OptionsItem
{
public OptionsItem(IPropertySymbol property, object constantValue)
{
diff --git a/src/Analyzers/Analyzers/src/ServicesAnalysis.cs b/src/Analyzers/Analyzers/src/ServicesAnalysis.cs
index ff16faa246..b78060d40e 100644
--- a/src/Analyzers/Analyzers/src/ServicesAnalysis.cs
+++ b/src/Analyzers/Analyzers/src/ServicesAnalysis.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class ServicesAnalysis
+internal sealed class ServicesAnalysis
{
public ServicesAnalysis(IMethodSymbol configureServicesMethod, ImmutableArray<ServicesItem> services)
{
diff --git a/src/Analyzers/Analyzers/src/ServicesAnalyzer.cs b/src/Analyzers/Analyzers/src/ServicesAnalyzer.cs
index 874c5b653b..3c31d5e668 100644
--- a/src/Analyzers/Analyzers/src/ServicesAnalyzer.cs
+++ b/src/Analyzers/Analyzers/src/ServicesAnalyzer.cs
@@ -8,7 +8,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.AspNetCore.Analyzers;
-internal class ServicesAnalyzer
+internal sealed class ServicesAnalyzer
{
private readonly StartupAnalysisBuilder _context;
diff --git a/src/Analyzers/Analyzers/src/ServicesItem.cs b/src/Analyzers/Analyzers/src/ServicesItem.cs
index e9a94a0199..9f6bdfacb9 100644
--- a/src/Analyzers/Analyzers/src/ServicesItem.cs
+++ b/src/Analyzers/Analyzers/src/ServicesItem.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.AspNetCore.Analyzers;
-internal class ServicesItem
+internal sealed class ServicesItem
{
public ServicesItem(IInvocationOperation operation)
{
diff --git a/src/Analyzers/Analyzers/src/StartupAnalysis.cs b/src/Analyzers/Analyzers/src/StartupAnalysis.cs
index 40bf4e2c3a..cb23758e2a 100644
--- a/src/Analyzers/Analyzers/src/StartupAnalysis.cs
+++ b/src/Analyzers/Analyzers/src/StartupAnalysis.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class StartupAnalysis
+internal sealed class StartupAnalysis
{
private readonly ImmutableDictionary<INamedTypeSymbol, ImmutableArray<object>> _analysesByType;
diff --git a/src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs b/src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs
index 501a9f1b90..9b784066ab 100644
--- a/src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs
+++ b/src/Analyzers/Analyzers/src/StartupAnalysisBuilder.cs
@@ -7,7 +7,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class StartupAnalysisBuilder
+internal sealed class StartupAnalysisBuilder
{
private readonly Dictionary<INamedTypeSymbol, List<object>> _analysesByType;
private readonly StartupAnalyzer _analyzer;
diff --git a/src/Analyzers/Analyzers/src/StartupSymbols.cs b/src/Analyzers/Analyzers/src/StartupSymbols.cs
index 70412c7ec9..9435275862 100644
--- a/src/Analyzers/Analyzers/src/StartupSymbols.cs
+++ b/src/Analyzers/Analyzers/src/StartupSymbols.cs
@@ -5,7 +5,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Analyzers;
-internal class StartupSymbols
+internal sealed class StartupSymbols
{
public StartupSymbols(Compilation compilation)
{
diff --git a/src/Analyzers/Analyzers/src/UseAuthorizationAnalyzer.cs b/src/Analyzers/Analyzers/src/UseAuthorizationAnalyzer.cs
index 2f2e885adf..d6c46f0a2e 100644
--- a/src/Analyzers/Analyzers/src/UseAuthorizationAnalyzer.cs
+++ b/src/Analyzers/Analyzers/src/UseAuthorizationAnalyzer.cs
@@ -8,7 +8,7 @@ using Microsoft.CodeAnalysis.Diagnostics;
namespace Microsoft.AspNetCore.Analyzers;
-internal class UseAuthorizationAnalyzer
+internal sealed class UseAuthorizationAnalyzer
{
private readonly StartupAnalysis _context;
diff --git a/src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs b/src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs
index 72b02fde34..9064b4bbe6 100644
--- a/src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs
+++ b/src/Analyzers/Analyzers/src/UseMvcAnalyzer.cs
@@ -7,7 +7,7 @@ using Microsoft.CodeAnalysis.Diagnostics;
namespace Microsoft.AspNetCore.Analyzers;
-internal class UseMvcAnalyzer
+internal sealed class UseMvcAnalyzer
{
private readonly StartupAnalysis _context;
diff --git a/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/Assert.cs b/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/Assert.cs
index 2f0272439b..7f0f69a709 100644
--- a/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/Assert.cs
+++ b/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/Assert.cs
@@ -38,7 +38,7 @@ public class AnalyzerAssert
}
}
- private class DiagnosticLocationAssertException : EqualException
+ private sealed class DiagnosticLocationAssertException : EqualException
{
public DiagnosticLocationAssertException(
DiagnosticLocation expected,
diff --git a/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/CodeFixRunner.cs b/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/CodeFixRunner.cs
index 1b0493f4fe..7163503d7e 100644
--- a/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/CodeFixRunner.cs
+++ b/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/CodeFixRunner.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.Globalization;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
@@ -52,7 +53,7 @@ public class CodeFixRunner
{
var message = string.Join(
Environment.NewLine,
- diagnostics.Select(d => CSharpDiagnosticFormatter.Instance.Format(d)));
+ diagnostics.Select(d => CSharpDiagnosticFormatter.Instance.Format(d, CultureInfo.InvariantCulture)));
throw new InvalidOperationException($"Compilation failed:{Environment.NewLine}{message}");
}
}
diff --git a/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/DiagnosticVerifier.cs b/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/DiagnosticVerifier.cs
index d50d18a67d..4e498567c8 100644
--- a/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/DiagnosticVerifier.cs
+++ b/src/Analyzers/Microsoft.AspNetCore.Analyzer.Testing/src/DiagnosticVerifier.cs
@@ -185,7 +185,7 @@ public abstract class DiagnosticVerifier
}
// Required to resolve compilation assemblies inside unit tests
- private class AppLocalResolver : ICompilationAssemblyResolver
+ private sealed class AppLocalResolver : ICompilationAssemblyResolver
{
public bool TryResolveAssemblyPaths(CompilationLibrary library, List<string> assemblies)
{
diff --git a/src/Antiforgery/src/Internal/AntiforgeryFeature.cs b/src/Antiforgery/src/Internal/AntiforgeryFeature.cs
index 43c155bc06..83455f7994 100644
--- a/src/Antiforgery/src/Internal/AntiforgeryFeature.cs
+++ b/src/Antiforgery/src/Internal/AntiforgeryFeature.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Antiforgery;
/// <summary>
/// Used to hold per-request state.
/// </summary>
-internal class AntiforgeryFeature : IAntiforgeryFeature
+internal sealed class AntiforgeryFeature : IAntiforgeryFeature
{
public bool HaveDeserializedCookieToken { get; set; }
diff --git a/src/Antiforgery/src/Internal/AntiforgeryOptionsSetup.cs b/src/Antiforgery/src/Internal/AntiforgeryOptionsSetup.cs
index dc5dd48b10..f180d61605 100644
--- a/src/Antiforgery/src/Internal/AntiforgeryOptionsSetup.cs
+++ b/src/Antiforgery/src/Internal/AntiforgeryOptionsSetup.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Antiforgery;
-internal class AntiforgeryOptionsSetup : IConfigureOptions<AntiforgeryOptions>
+internal sealed class AntiforgeryOptionsSetup : IConfigureOptions<AntiforgeryOptions>
{
private readonly DataProtectionOptions _dataProtectionOptions;
diff --git a/src/Antiforgery/src/Internal/AntiforgerySerializationContext.cs b/src/Antiforgery/src/Internal/AntiforgerySerializationContext.cs
index c492e3b9c1..a4e416155a 100644
--- a/src/Antiforgery/src/Internal/AntiforgerySerializationContext.cs
+++ b/src/Antiforgery/src/Internal/AntiforgerySerializationContext.cs
@@ -5,7 +5,7 @@ using System.Text;
namespace Microsoft.AspNetCore.Antiforgery;
-internal class AntiforgerySerializationContext
+internal sealed class AntiforgerySerializationContext
{
// Avoid allocating 256 bytes (the default) and using 18 (the AntiforgeryToken minimum). 64 bytes is enough for
// a short username or claim UID and some additional data. MemoryStream bumps capacity to 256 if exceeded.
diff --git a/src/Antiforgery/src/Internal/AntiforgerySerializationContextPooledObjectPolicy.cs b/src/Antiforgery/src/Internal/AntiforgerySerializationContextPooledObjectPolicy.cs
index dac85b55d1..dad41c3677 100644
--- a/src/Antiforgery/src/Internal/AntiforgerySerializationContextPooledObjectPolicy.cs
+++ b/src/Antiforgery/src/Internal/AntiforgerySerializationContextPooledObjectPolicy.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.ObjectPool;
namespace Microsoft.AspNetCore.Antiforgery;
-internal class AntiforgerySerializationContextPooledObjectPolicy : IPooledObjectPolicy<AntiforgerySerializationContext>
+internal sealed class AntiforgerySerializationContextPooledObjectPolicy : IPooledObjectPolicy<AntiforgerySerializationContext>
{
public AntiforgerySerializationContext Create()
{
diff --git a/src/Antiforgery/src/Internal/DefaultAntiforgery.cs b/src/Antiforgery/src/Internal/DefaultAntiforgery.cs
index 447e7a0cc1..b90c62793a 100644
--- a/src/Antiforgery/src/Internal/DefaultAntiforgery.cs
+++ b/src/Antiforgery/src/Internal/DefaultAntiforgery.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Antiforgery;
/// Provides access to the antiforgery system, which provides protection against
/// Cross-site Request Forgery (XSRF, also called CSRF) attacks.
/// </summary>
-internal class DefaultAntiforgery : IAntiforgery
+internal sealed class DefaultAntiforgery : IAntiforgery
{
private readonly AntiforgeryOptions _options;
private readonly IAntiforgeryTokenGenerator _tokenGenerator;
@@ -373,7 +373,7 @@ internal class DefaultAntiforgery : IAntiforgery
/// Sets the 'Cache-Control' header to 'no-cache, no-store' and 'Pragma' header to 'no-cache' overriding any user set value.
/// </summary>
/// <param name="httpContext">The <see cref="HttpContext"/>.</param>
- protected virtual void SetDoNotCacheHeaders(HttpContext httpContext)
+ private void SetDoNotCacheHeaders(HttpContext httpContext)
{
var logWarning = false;
var responseHeaders = httpContext.Response.Headers;
diff --git a/src/Antiforgery/src/Internal/DefaultAntiforgeryAdditionalDataProvider.cs b/src/Antiforgery/src/Internal/DefaultAntiforgeryAdditionalDataProvider.cs
index 96b62c4087..188a80919c 100644
--- a/src/Antiforgery/src/Internal/DefaultAntiforgeryAdditionalDataProvider.cs
+++ b/src/Antiforgery/src/Internal/DefaultAntiforgeryAdditionalDataProvider.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Antiforgery;
/// <summary>
/// A default <see cref="IAntiforgeryAdditionalDataProvider"/> implementation.
/// </summary>
-internal class DefaultAntiforgeryAdditionalDataProvider : IAntiforgeryAdditionalDataProvider
+internal sealed class DefaultAntiforgeryAdditionalDataProvider : IAntiforgeryAdditionalDataProvider
{
/// <inheritdoc />
public string GetAdditionalData(HttpContext context)
diff --git a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenGenerator.cs b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenGenerator.cs
index 4fc284aa64..782b075576 100644
--- a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenGenerator.cs
+++ b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenGenerator.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Antiforgery;
-internal class DefaultAntiforgeryTokenGenerator : IAntiforgeryTokenGenerator
+internal sealed class DefaultAntiforgeryTokenGenerator : IAntiforgeryTokenGenerator
{
private readonly IClaimUidExtractor _claimUidExtractor;
private readonly IAntiforgeryAdditionalDataProvider _additionalDataProvider;
diff --git a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenSerializer.cs b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenSerializer.cs
index 329d905465..f269a5968c 100644
--- a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenSerializer.cs
+++ b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenSerializer.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.ObjectPool;
namespace Microsoft.AspNetCore.Antiforgery;
-internal class DefaultAntiforgeryTokenSerializer : IAntiforgeryTokenSerializer
+internal sealed class DefaultAntiforgeryTokenSerializer : IAntiforgeryTokenSerializer
{
private const string Purpose = "Microsoft.AspNetCore.Antiforgery.AntiforgeryToken.v1";
private const byte TokenVersion = 0x01;
diff --git a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs
index b50ff40aae..7821a303df 100644
--- a/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs
+++ b/src/Antiforgery/src/Internal/DefaultAntiforgeryTokenStore.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Antiforgery;
-internal class DefaultAntiforgeryTokenStore : IAntiforgeryTokenStore
+internal sealed class DefaultAntiforgeryTokenStore : IAntiforgeryTokenStore
{
private readonly AntiforgeryOptions _options;
diff --git a/src/Antiforgery/src/Internal/DefaultClaimUidExtractor.cs b/src/Antiforgery/src/Internal/DefaultClaimUidExtractor.cs
index c539be6efa..31ffcd37f0 100644
--- a/src/Antiforgery/src/Internal/DefaultClaimUidExtractor.cs
+++ b/src/Antiforgery/src/Internal/DefaultClaimUidExtractor.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Antiforgery;
/// <summary>
/// Default implementation of <see cref="IClaimUidExtractor"/>.
/// </summary>
-internal class DefaultClaimUidExtractor : IClaimUidExtractor
+internal sealed class DefaultClaimUidExtractor : IClaimUidExtractor
{
private readonly ObjectPool<AntiforgerySerializationContext> _pool;
diff --git a/src/Antiforgery/src/Microsoft.AspNetCore.Antiforgery.csproj b/src/Antiforgery/src/Microsoft.AspNetCore.Antiforgery.csproj
index 4723a65cec..38e1754535 100644
--- a/src/Antiforgery/src/Microsoft.AspNetCore.Antiforgery.csproj
+++ b/src/Antiforgery/src/Microsoft.AspNetCore.Antiforgery.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;antiforgery</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Azure/Azure.slnf b/src/Azure/Azure.slnf
index 18804c595b..2b2e575990 100644
--- a/src/Azure/Azure.slnf
+++ b/src/Azure/Azure.slnf
@@ -2,12 +2,6 @@
"solution": {
"path": "..\\..\\AspNetCore.sln",
"projects" : [
- "src\\Azure\\AzureAD\\Authentication.AzureAD.UI\\src\\Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj",
- "src\\Azure\\AzureAD\\Authentication.AzureAD.UI\\test\\Microsoft.AspNetCore.Authentication.AzureAD.UI.Test.csproj",
- "src\\Azure\\AzureAD\\Authentication.AzureADB2C.UI\\src\\Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj",
- "src\\Azure\\AzureAD\\Authentication.AzureADB2C.UI\\test\\Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test.csproj",
- "src\\Azure\\AzureAD\\test\\FunctionalTests\\Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests.csproj",
- "src\\Azure\\AzureAD\\test\\testassets\\AzureAD.WebSite\\AzureAD.WebSite.csproj",
"src\\Azure\\samples\\AzureAppServicesSample\\AzureAppServicesSample.csproj",
"src\\Azure\\samples\\AzureAppServicesHostingStartupSample\\AzureAppServicesHostingStartupSample.csproj",
"src\\Servers\\Kestrel\\Kestrel\\src\\Microsoft.AspNetCore.Server.Kestrel.csproj",
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Controllers/AccountController.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Controllers/AccountController.cs
deleted file mode 100644
index f0e97b7414..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Controllers/AccountController.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureAD.Controllers.Internal;
-
-[NonController]
-[AllowAnonymous]
-[Area("AzureAD")]
-[Route("[area]/[controller]/[action]")]
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AccountController : Controller
-{
- public AccountController(IOptionsMonitor<AzureADOptions> options)
- {
- Options = options;
- }
-
- public IOptionsMonitor<AzureADOptions> Options { get; }
-
- [HttpGet("{scheme?}")]
- public IActionResult SignIn([FromRoute] string scheme)
- {
- scheme = scheme ?? AzureADDefaults.AuthenticationScheme;
- var redirectUrl = Url.Content("~/");
- return Challenge(
- new AuthenticationProperties { RedirectUri = redirectUrl },
- scheme);
- }
-
- [HttpGet("{scheme?}")]
- public IActionResult SignOut([FromRoute] string scheme)
- {
- scheme = scheme ?? AzureADDefaults.AuthenticationScheme;
- var options = Options.Get(scheme);
- var callbackUrl = Url.Page("/Account/SignedOut", pageHandler: null, values: null, protocol: Request.Scheme);
- return SignOut(
- new AuthenticationProperties { RedirectUri = callbackUrl },
- options.CookieSchemeName,
- options.OpenIdConnectSchemeName);
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml
deleted file mode 100644
index 591045d3cd..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml
+++ /dev/null
@@ -1,10 +0,0 @@
-@page
-@model AccessDeniedModel
-@{
- ViewData["Title"] = "Access denied";
-}
-
-<header>
- <h1 id="AzureADAccessDeniedTitle" class="text-danger">@ViewData["Title"]</h1>
- <p id="AzureADAccessDeniedText" class="text-danger">You do not have access to this resource.</p>
-</header>
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml.cs
deleted file mode 100644
index 744f9d9159..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/AccessDenied.cshtml.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal;
-
-/// <summary>
-/// This API supports infrastructure and is not intended to be used
-/// directly from your code.This API may change or be removed in future releases
-/// </summary>
-[AllowAnonymous]
-public class AccessDeniedModel : PageModel
-{
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public void OnGet()
- {
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml
deleted file mode 100644
index 173f083425..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml
+++ /dev/null
@@ -1,23 +0,0 @@
-@page
-@model ErrorModel
-@{
- ViewData["Title"] = "Error";
-}
-
-<h1 id="AzureADErrorTitle" class="text-danger">Error.</h1>
-<h2 id="AzureADErrorSub" class="text-danger">An error occurred while processing your request.</h2>
-
-@if (Model.ShowRequestId)
-{
-<p id="AzureADErrorRequestId">
- <strong>Request ID:</strong> <code>@Model.RequestId</code>
-</p>
-}
-
-<h3 id="AzureADErrorDevNoticeTitle">Development Mode</h3>
-<p id="AzureADErrorDevNoticeText1">
- Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
-</p>
-<p id="AzureADErrorDevNoticeText2">
- <strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
-</p>
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml.cs
deleted file mode 100644
index cae1f97746..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/Error.cshtml.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal;
-
-/// <summary>
-/// This API supports infrastructure and is not intended to be used
-/// directly from your code.This API may change or be removed in future releases
-/// </summary>
-[AllowAnonymous]
-[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
-public class ErrorModel : PageModel
-{
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public string RequestId { get; set; }
-
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
-
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public void OnGet()
- {
- RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml
deleted file mode 100644
index 92ede3a145..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml
+++ /dev/null
@@ -1,10 +0,0 @@
-@page
-@model SignedOutModel
-@{
- ViewData["Title"] = "Signed out";
-}
-
-<h2 id="AzureADSignedOutTitle">@ViewData["Title"]</h2>
-<p id="AzureADSignedOutText">
- You have successfully signed out.
-</p>
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml.cs
deleted file mode 100644
index 5d4b01e8b5..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/SignedOut.cshtml.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal;
-
-/// <summary>
-/// This API supports infrastructure and is not intended to be used
-/// directly from your code.This API may change or be removed in future releases
-/// </summary>
-[AllowAnonymous]
-public class SignedOutModel : PageModel
-{
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public IActionResult OnGet()
- {
- if (User.Identity.IsAuthenticated)
- {
- return LocalRedirect("~/");
- }
-
- return Page();
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/_ViewImports.cshtml b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/_ViewImports.cshtml
deleted file mode 100644
index 69cc620e98..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/Account/_ViewImports.cshtml
+++ /dev/null
@@ -1,2 +0,0 @@
-@using Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal
-@namespace Microsoft.AspNetCore.Authentication.AzureAD.UI.Pages.Internal \ No newline at end of file
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/_ViewStart.cshtml b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/_ViewStart.cshtml
deleted file mode 100644
index c51721cd40..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Areas/AzureAD/Pages/_ViewStart.cshtml
+++ /dev/null
@@ -1,13 +0,0 @@
-@using Microsoft.AspNetCore.Hosting
-@using Microsoft.AspNetCore.Mvc.ViewEngines
-
-@inject IWebHostEnvironment Environment
-@inject ICompositeViewEngine Engine
-
-@{
- var result = Engine.FindView(ViewContext, "_Layout", isMainPage: false);
- if (result.Success)
- {
- Layout = "_Layout";
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAccountControllerFeatureProvider.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAccountControllerFeatureProvider.cs
deleted file mode 100644
index d4e8d4d121..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAccountControllerFeatureProvider.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Reflection;
-using Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureAD.Controllers.Internal;
-using Microsoft.AspNetCore.Mvc.ApplicationParts;
-using Microsoft.AspNetCore.Mvc.Controllers;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADAccountControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>, IApplicationFeatureProvider
-{
- public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
- {
- if (!feature.Controllers.Contains(typeof(AccountController).GetTypeInfo()))
- {
- feature.Controllers.Add(typeof(AccountController).GetTypeInfo());
- }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs
deleted file mode 100644
index 893910fda1..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADAuthenticationBuilderExtensions.cs
+++ /dev/null
@@ -1,204 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.AzureAD.UI;
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication;
-
-/// <summary>
-/// Extension methods to add Azure Active Directory Authentication to your application.
-/// </summary>
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-public static class AzureADAuthenticationBuilderExtensions
-{
- /// <summary>
- /// Adds JWT Bearer authentication to your app for Azure Active Directory Applications.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADOptions}"/> to configure the
- /// <see cref="AzureADOptions"/>.
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureADBearer(this AuthenticationBuilder builder, Action<AzureADOptions> configureOptions) =>
- builder.AddAzureADBearer(
- AzureADDefaults.BearerAuthenticationScheme,
- AzureADDefaults.JwtBearerAuthenticationScheme,
- configureOptions);
-
- /// <summary>
- /// Adds JWT Bearer authentication to your app for Azure Active Directory Applications.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="scheme">The identifier for the virtual scheme.</param>
- /// <param name="jwtBearerScheme">The identifier for the underlying JWT Bearer scheme.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADOptions}"/> to configure the
- /// <see cref="AzureADOptions"/>.
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureADBearer(
- this AuthenticationBuilder builder,
- string scheme,
- string jwtBearerScheme,
- Action<AzureADOptions> configureOptions)
- {
-
- builder.AddPolicyScheme(scheme, displayName: null, configureOptions: o =>
- {
- o.ForwardDefault = jwtBearerScheme;
- });
-
- builder.Services.Configure(TryAddJwtBearerSchemeMapping(scheme, jwtBearerScheme));
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<AzureADOptions>, AzureADOptionsConfiguration>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IValidateOptions<AzureADOptions>, AzureADOptionsValidation>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<JwtBearerOptions>, AzureADJwtBearerOptionsConfiguration>());
-
- builder.Services.Configure(scheme, configureOptions);
- builder.AddJwtBearer(jwtBearerScheme, o => { });
-
- return builder;
- }
-
- /// <summary>
- /// Adds Azure Active Directory Authentication to your application.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADOptions}"/> to configure the
- /// <see cref="AzureADOptions"/>
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureAD(this AuthenticationBuilder builder, Action<AzureADOptions> configureOptions) =>
- builder.AddAzureAD(
- AzureADDefaults.AuthenticationScheme,
- AzureADDefaults.OpenIdScheme,
- AzureADDefaults.CookieScheme,
- AzureADDefaults.DisplayName,
- configureOptions);
-
- /// <summary>
- /// Adds Azure Active Directory Authentication to your application.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="scheme">The identifier for the virtual scheme.</param>
- /// <param name="openIdConnectScheme">The identifier for the underlying Open ID Connect scheme.</param>
- /// <param name="cookieScheme">The identifier for the underlying cookie scheme.</param>
- /// <param name="displayName">The display name for the scheme.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADOptions}"/> to configure the
- /// <see cref="AzureADOptions"/>
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureAD(
- this AuthenticationBuilder builder,
- string scheme,
- string openIdConnectScheme,
- string cookieScheme,
- string displayName,
- Action<AzureADOptions> configureOptions)
- {
- AddAdditionalMvcApplicationParts(builder.Services);
- builder.AddPolicyScheme(scheme, displayName, o =>
- {
- o.ForwardDefault = cookieScheme;
- o.ForwardChallenge = openIdConnectScheme;
- });
-
- builder.Services.Configure(TryAddOpenIDCookieSchemeMappings(scheme, openIdConnectScheme, cookieScheme));
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<AzureADOptions>, AzureADOptionsConfiguration>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IValidateOptions<AzureADOptions>, AzureADOptionsValidation>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<OpenIdConnectOptions>, AzureADOpenIdConnectOptionsConfiguration>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<CookieAuthenticationOptions>, AzureADCookieOptionsConfiguration>());
-
- builder.Services.Configure(scheme, configureOptions);
-
- builder.AddOpenIdConnect(openIdConnectScheme, null, o => { });
- builder.AddCookie(cookieScheme, null, o => { });
-
- return builder;
- }
-
- private static Action<AzureADSchemeOptions> TryAddJwtBearerSchemeMapping(string scheme, string jwtBearerScheme)
- {
- return TryAddMapping;
-
- void TryAddMapping(AzureADSchemeOptions o)
- {
- if (o.JwtBearerMappings.ContainsKey(scheme))
- {
- throw new InvalidOperationException($"A scheme with the name '{scheme}' was already added.");
- }
- foreach (var mapping in o.JwtBearerMappings)
- {
- if (mapping.Value.JwtBearerScheme == jwtBearerScheme)
- {
- throw new InvalidOperationException(
- $"The JSON Web Token Bearer scheme '{jwtBearerScheme}' can't be associated with the Azure Active Directory scheme '{scheme}'. " +
- $"The JSON Web Token Bearer scheme '{jwtBearerScheme}' is already mapped to the Azure Active Directory scheme '{mapping.Key}'");
- }
- }
- o.JwtBearerMappings.Add(scheme, new AzureADSchemeOptions.JwtBearerSchemeMapping
- {
- JwtBearerScheme = jwtBearerScheme
- });
- };
- }
-
- private static Action<AzureADSchemeOptions> TryAddOpenIDCookieSchemeMappings(string scheme, string openIdConnectScheme, string cookieScheme)
- {
- return TryAddMapping;
-
- void TryAddMapping(AzureADSchemeOptions o)
- {
- if (o.OpenIDMappings.ContainsKey(scheme))
- {
- throw new InvalidOperationException($"A scheme with the name '{scheme}' was already added.");
- }
- foreach (var mapping in o.OpenIDMappings)
- {
- if (mapping.Value.CookieScheme == cookieScheme)
- {
- throw new InvalidOperationException(
- $"The cookie scheme '{cookieScheme}' can't be associated with the Azure Active Directory scheme '{scheme}'. " +
- $"The cookie scheme '{cookieScheme}' is already mapped to the Azure Active Directory scheme '{mapping.Key}'");
- }
-
- if (mapping.Value.OpenIdConnectScheme == openIdConnectScheme)
- {
- throw new InvalidOperationException(
- $"The Open ID Connect scheme '{openIdConnectScheme}' can't be associated with the Azure Active Directory scheme '{scheme}'. " +
- $"The Open ID Connect scheme '{openIdConnectScheme}' is already mapped to the Azure Active Directory scheme '{mapping.Key}'");
- }
- }
- o.OpenIDMappings.Add(scheme, new AzureADSchemeOptions.AzureADOpenIDSchemeMapping
- {
- OpenIdConnectScheme = openIdConnectScheme,
- CookieScheme = cookieScheme
- });
- };
- }
-
- private static void AddAdditionalMvcApplicationParts(IServiceCollection services)
- {
- var mvcBuilder = services
- .AddMvc()
- .ConfigureApplicationPartManager(apm =>
- {
- apm.FeatureProviders.Add(new AzureADAccountControllerFeatureProvider());
- });
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADCookieOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADCookieOptionsConfiguration.cs
deleted file mode 100644
index a392fcb05e..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADCookieOptionsConfiguration.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADCookieOptionsConfiguration : IConfigureNamedOptions<CookieAuthenticationOptions>
-{
- private readonly IOptions<AzureADSchemeOptions> _schemeOptions;
- private readonly IOptionsMonitor<AzureADOptions> _AzureADOptions;
-
- public AzureADCookieOptionsConfiguration(IOptions<AzureADSchemeOptions> schemeOptions, IOptionsMonitor<AzureADOptions> AzureADOptions)
- {
- _schemeOptions = schemeOptions;
- _AzureADOptions = AzureADOptions;
- }
-
- public void Configure(string name, CookieAuthenticationOptions options)
- {
- var AzureADScheme = GetAzureADScheme(name);
- if (AzureADScheme is null)
- {
- return;
- }
-
- var AzureADOptions = _AzureADOptions.Get(AzureADScheme);
- if (name != AzureADOptions.CookieSchemeName)
- {
- return;
- }
-
- options.LoginPath = $"/AzureAD/Account/SignIn/{AzureADScheme}";
- options.LogoutPath = $"/AzureAD/Account/SignOut/{AzureADScheme}";
- options.AccessDeniedPath = "/AzureAD/Account/AccessDenied";
- options.Cookie.SameSite = SameSiteMode.None;
- }
-
- public void Configure(CookieAuthenticationOptions options)
- {
- }
-
- private string GetAzureADScheme(string name)
- {
- foreach (var mapping in _schemeOptions.Value.OpenIDMappings)
- {
- if (mapping.Value.CookieScheme == name)
- {
- return mapping.Key;
- }
- }
-
- return null;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs
deleted file mode 100644
index 2365930877..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADDefaults.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-/// <summary>
-/// Constants for different Azure Active Directory authentication components.
-/// </summary>
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-public static class AzureADDefaults
-{
- /// <summary>
- /// The scheme name for Open ID Connect when using
- /// <see cref="AzureADAuthenticationBuilderExtensions.AddAzureAD(AuthenticationBuilder, System.Action{AzureADOptions})"/>.
- /// </summary>
- public const string OpenIdScheme = "AzureADOpenID";
-
- /// <summary>
- /// The scheme name for cookies when using
- /// <see cref="AzureADAuthenticationBuilderExtensions.AddAzureAD(AuthenticationBuilder, System.Action{AzureADOptions})"/>.
- /// </summary>
- public const string CookieScheme = "AzureADCookie";
-
- /// <summary>
- /// The default scheme for Azure Active Directory Bearer.
- /// </summary>
- public const string BearerAuthenticationScheme = "AzureADBearer";
-
- /// <summary>
- /// The scheme name for JWT Bearer when using
- /// <see cref="AzureADAuthenticationBuilderExtensions.AddAzureADBearer(AuthenticationBuilder, System.Action{AzureADOptions})"/>.
- /// </summary>
- public const string JwtBearerAuthenticationScheme = "AzureADJwtBearer";
-
- /// <summary>
- /// The default scheme for Azure Active Directory.
- /// </summary>
- public const string AuthenticationScheme = "AzureAD";
-
- /// <summary>
- /// The display name for Azure Active Directory.
- /// </summary>
- public static readonly string DisplayName = "Azure Active Directory";
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADJwtBearerOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADJwtBearerOptionsConfiguration.cs
deleted file mode 100644
index 3e8396995a..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADJwtBearerOptionsConfiguration.cs
+++ /dev/null
@@ -1,58 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.AzureAD.UI;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADJwtBearerOptionsConfiguration : IConfigureNamedOptions<JwtBearerOptions>
-{
- private readonly IOptions<AzureADSchemeOptions> _schemeOptions;
- private readonly IOptionsMonitor<AzureADOptions> _azureADOptions;
-
- public AzureADJwtBearerOptionsConfiguration(
- IOptions<AzureADSchemeOptions> schemeOptions,
- IOptionsMonitor<AzureADOptions> azureADOptions)
- {
- _schemeOptions = schemeOptions;
- _azureADOptions = azureADOptions;
- }
-
- public void Configure(string name, JwtBearerOptions options)
- {
- var azureADScheme = GetAzureADScheme(name);
- if (azureADScheme is null)
- {
- return;
- }
-
- var azureADOptions = _azureADOptions.Get(azureADScheme);
- if (name != azureADOptions.JwtBearerSchemeName)
- {
- return;
- }
-
- options.Audience = azureADOptions.ClientId;
- options.Authority = new Uri(new Uri(azureADOptions.Instance), azureADOptions.TenantId).ToString();
- }
-
- public void Configure(JwtBearerOptions options)
- {
- }
-
- private string GetAzureADScheme(string name)
- {
- foreach (var mapping in _schemeOptions.Value.JwtBearerMappings)
- {
- if (mapping.Value.JwtBearerScheme == name)
- {
- return mapping.Key;
- }
- }
-
- return null;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOpenIdConnectOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOpenIdConnectOptionsConfiguration.cs
deleted file mode 100644
index 344a3bc9c1..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOpenIdConnectOptionsConfiguration.cs
+++ /dev/null
@@ -1,60 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADOpenIdConnectOptionsConfiguration : IConfigureNamedOptions<OpenIdConnectOptions>
-{
- private readonly IOptions<AzureADSchemeOptions> _schemeOptions;
- private readonly IOptionsMonitor<AzureADOptions> _azureADOptions;
-
- public AzureADOpenIdConnectOptionsConfiguration(IOptions<AzureADSchemeOptions> schemeOptions, IOptionsMonitor<AzureADOptions> azureADOptions)
- {
- _schemeOptions = schemeOptions;
- _azureADOptions = azureADOptions;
- }
-
- public void Configure(string name, OpenIdConnectOptions options)
- {
- var azureADScheme = GetAzureADScheme(name);
- if (azureADScheme is null)
- {
- return;
- }
-
- var azureADOptions = _azureADOptions.Get(azureADScheme);
- if (name != azureADOptions.OpenIdConnectSchemeName)
- {
- return;
- }
-
- options.ClientId = azureADOptions.ClientId;
- options.ClientSecret = azureADOptions.ClientSecret;
- options.Authority = new Uri(new Uri(azureADOptions.Instance), azureADOptions.TenantId).ToString();
- options.CallbackPath = azureADOptions.CallbackPath ?? options.CallbackPath;
- options.SignedOutCallbackPath = azureADOptions.SignedOutCallbackPath ?? options.SignedOutCallbackPath;
- options.SignInScheme = azureADOptions.CookieSchemeName;
- options.UseTokenLifetime = true;
- }
-
- private string GetAzureADScheme(string name)
- {
- foreach (var mapping in _schemeOptions.Value.OpenIDMappings)
- {
- if (mapping.Value.OpenIdConnectScheme == name)
- {
- return mapping.Key;
- }
- }
-
- return null;
- }
-
- public void Configure(OpenIdConnectOptions options)
- {
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptions.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptions.cs
deleted file mode 100644
index 38c16e9153..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptions.cs
+++ /dev/null
@@ -1,72 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-/// <summary>
-/// Options for configuring authentication using Azure Active Directory.
-/// </summary>
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-public class AzureADOptions
-{
- /// <summary>
- /// Gets or sets the OpenID Connect authentication scheme to use for authentication with this instance
- /// of Azure Active Directory authentication.
- /// </summary>
- public string OpenIdConnectSchemeName { get; set; } = OpenIdConnectDefaults.AuthenticationScheme;
-
- /// <summary>
- /// Gets or sets the Cookie authentication scheme to use for sign in with this instance of
- /// Azure Active Directory authentication.
- /// </summary>
- public string CookieSchemeName { get; set; } = CookieAuthenticationDefaults.AuthenticationScheme;
-
- /// <summary>
- /// Gets or sets the Jwt bearer authentication scheme to use for validating access tokens for this
- /// instance of Azure Active Directory Bearer authentication.
- /// </summary>
- public string JwtBearerSchemeName { get; internal set; }
-
- /// <summary>
- /// Gets or sets the client Id.
- /// </summary>
- public string ClientId { get; set; }
-
- /// <summary>
- /// Gets or sets the client secret.
- /// </summary>
- public string ClientSecret { get; set; }
-
- /// <summary>
- /// Gets or sets the tenant Id.
- /// </summary>
- public string TenantId { get; set; }
-
- /// <summary>
- /// Gets or sets the Azure Active Directory instance.
- /// </summary>
- public string Instance { get; set; }
-
- /// <summary>
- /// Gets or sets the domain of the Azure Active Directory tenant.
- /// </summary>
- public string Domain { get; set; }
-
- /// <summary>
- /// Gets or sets the sign in callback path.
- /// </summary>
- public string CallbackPath { get; set; }
-
- /// <summary>
- /// Gets or sets the sign out callback path.
- /// </summary>
- public string SignedOutCallbackPath { get; set; }
-
- /// <summary>
- /// Gets all the underlying authentication schemes.
- /// </summary>
- public string[] AllSchemes => new[] { CookieSchemeName, OpenIdConnectSchemeName };
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsConfiguration.cs
deleted file mode 100644
index d5edae6c4f..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsConfiguration.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADOptionsConfiguration : IConfigureNamedOptions<AzureADOptions>
-{
- private readonly IOptions<AzureADSchemeOptions> _schemeOptions;
-
- public AzureADOptionsConfiguration(IOptions<AzureADSchemeOptions> schemeOptions)
- {
- _schemeOptions = schemeOptions;
- }
-
- public void Configure(string name, AzureADOptions options)
- {
- // This can be called because of someone configuring JWT or someone configuring
- // Open ID + Cookie.
- if (_schemeOptions.Value.OpenIDMappings.TryGetValue(name, out var webMapping))
- {
- options.OpenIdConnectSchemeName = webMapping.OpenIdConnectScheme;
- options.CookieSchemeName = webMapping.CookieScheme;
- return;
- }
- if (_schemeOptions.Value.JwtBearerMappings.TryGetValue(name, out var mapping))
- {
- options.JwtBearerSchemeName = mapping.JwtBearerScheme;
- return;
- }
- }
-
- public void Configure(AzureADOptions options)
- {
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsValidation.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsValidation.cs
deleted file mode 100644
index d29011a61f..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADOptionsValidation.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADOptionsValidation : IValidateOptions<AzureADOptions>
-{
- public ValidateOptionsResult Validate(string name, AzureADOptions options)
- {
- if (string.IsNullOrEmpty(options.Instance))
- {
- return ValidateOptionsResult.Fail($"The '{nameof(AzureADOptions.Instance)}' option must be provided.");
- }
-
- return ValidateOptionsResult.Success;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADSchemeOptions.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADSchemeOptions.cs
deleted file mode 100644
index 6f4879da31..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/AzureADSchemeOptions.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI;
-
-internal class AzureADSchemeOptions
-{
- public IDictionary<string, AzureADOpenIDSchemeMapping> OpenIDMappings { get; set; } = new Dictionary<string, AzureADOpenIDSchemeMapping>();
-
- public IDictionary<string, JwtBearerSchemeMapping> JwtBearerMappings { get; set; } = new Dictionary<string, JwtBearerSchemeMapping>();
-
- public class AzureADOpenIDSchemeMapping
- {
- public string OpenIdConnectScheme { get; set; }
- public string CookieScheme { get; set; }
- }
-
- public class JwtBearerSchemeMapping
- {
- public string JwtBearerScheme { get; set; }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj
deleted file mode 100644
index bd90d1d641..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Razor">
-
- <PropertyGroup>
- <Description>ASP.NET Core Azure Active Directory Integration provides components for easily integrating Azure Active Directory authentication within your ASP.NET Core application.</Description>
- <RazorAssemblyDescription>Precompiled views assembly for the ASP.NET Core Azure Active Directory Integration package.</RazorAssemblyDescription>
- <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <PackageTags>aspnetcore;authentication;AzureAD</PackageTags>
- <GenerateDocumentationFile>true</GenerateDocumentationFile>
- <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
- <Nullable>disable</Nullable>
- </PropertyGroup>
-
- <ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Mvc" />
- <Reference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
- <Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
- <Reference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" />
- </ItemGroup>
-
-</Project>
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Properties/AssemblyInfo.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Properties/AssemblyInfo.cs
deleted file mode 100644
index b1d976bdd1..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Runtime.CompilerServices;
-
-[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Authentication.AzureAD.UI.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Shipped.txt b/src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Shipped.txt
deleted file mode 100644
index 6d3e971583..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Shipped.txt
+++ /dev/null
@@ -1,47 +0,0 @@
-#nullable enable
-~const Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults.AuthenticationScheme = "AzureAD" -> string
-~const Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults.BearerAuthenticationScheme = "AzureADBearer" -> string
-~const Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults.CookieScheme = "AzureADCookie" -> string
-~const Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults.JwtBearerAuthenticationScheme = "AzureADJwtBearer" -> string
-~const Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults.OpenIdScheme = "AzureADOpenID" -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.AllSchemes.get -> string[]
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.CallbackPath.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.CallbackPath.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.ClientId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.ClientId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.ClientSecret.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.ClientSecret.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.CookieSchemeName.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.CookieSchemeName.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.Domain.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.Domain.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.Instance.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.Instance.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.JwtBearerSchemeName.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.OpenIdConnectSchemeName.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.OpenIdConnectSchemeName.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.SignedOutCallbackPath.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.SignedOutCallbackPath.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.TenantId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.TenantId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.ErrorModel.RequestId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.ErrorModel.RequestId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.SignedOutModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~static Microsoft.AspNetCore.Authentication.AzureADAuthenticationBuilderExtensions.AddAzureAD(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, string scheme, string openIdConnectScheme, string cookieScheme, string displayName, System.Action<Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static Microsoft.AspNetCore.Authentication.AzureADAuthenticationBuilderExtensions.AddAzureAD(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, System.Action<Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static Microsoft.AspNetCore.Authentication.AzureADAuthenticationBuilderExtensions.AddAzureADBearer(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, string scheme, string jwtBearerScheme, System.Action<Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static Microsoft.AspNetCore.Authentication.AzureADAuthenticationBuilderExtensions.AddAzureADBearer(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, System.Action<Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static readonly Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults.DisplayName -> string
-Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADDefaults
-Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions
-Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureADOptions.AzureADOptions() -> void
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.AccessDeniedModel
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.AccessDeniedModel.AccessDeniedModel() -> void
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.AccessDeniedModel.OnGet() -> void
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.ErrorModel
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.ErrorModel.ErrorModel() -> void
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.ErrorModel.OnGet() -> void
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.ErrorModel.ShowRequestId.get -> bool
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.SignedOutModel
-Microsoft.AspNetCore.Authentication.AzureAD.UI.Internal.SignedOutModel.SignedOutModel() -> void
-Microsoft.AspNetCore.Authentication.AzureADAuthenticationBuilderExtensions
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/AzureADAuthenticationBuilderExtensionsTests.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/test/AzureADAuthenticationBuilderExtensionsTests.cs
deleted file mode 100644
index 8070f11abb..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/AzureADAuthenticationBuilderExtensionsTests.cs
+++ /dev/null
@@ -1,506 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.AzureAD.UI;
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication;
-
-public class AzureADAuthenticationBuilderExtensionsTests
-{
- [Fact]
- public void AddAzureAD_AddsAllAuthenticationHandlers()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureAD(o => { });
- var provider = services.BuildServiceProvider();
-
- // Assert
- Assert.NotNull(provider.GetService<OpenIdConnectHandler>());
- Assert.NotNull(provider.GetService<CookieAuthenticationHandler>());
- Assert.NotNull(provider.GetService<PolicySchemeHandler>());
- }
-
- [Fact]
- public void AddAzureAD_ConfiguresAllOptions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureAD(o =>
- {
- o.Instance = "https://login.microsoftonline.com";
- o.ClientId = "ClientId";
- o.ClientSecret = "ClientSecret";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.TenantId = "Common";
- });
- var provider = services.BuildServiceProvider();
-
- // Assert
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
- Assert.NotNull(azureADOptionsMonitor);
- var azureADOptions = azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme);
- Assert.Equal(AzureADDefaults.OpenIdScheme, azureADOptions.OpenIdConnectSchemeName);
- Assert.Equal(AzureADDefaults.CookieScheme, azureADOptions.CookieSchemeName);
- Assert.Equal("https://login.microsoftonline.com", azureADOptions.Instance);
- Assert.Equal("ClientId", azureADOptions.ClientId);
- Assert.Equal("ClientSecret", azureADOptions.ClientSecret);
- Assert.Equal("/signin-oidc", azureADOptions.CallbackPath);
- Assert.Equal("domain.onmicrosoft.com", azureADOptions.Domain);
-
- var openIdOptionsMonitor = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
- Assert.NotNull(openIdOptionsMonitor);
- var openIdOptions = openIdOptionsMonitor.Get(AzureADDefaults.OpenIdScheme);
- Assert.Equal("ClientId", openIdOptions.ClientId);
- Assert.Equal($"https://login.microsoftonline.com/Common", openIdOptions.Authority);
- Assert.True(openIdOptions.UseTokenLifetime);
- Assert.Equal("/signin-oidc", openIdOptions.CallbackPath);
- Assert.Equal(AzureADDefaults.CookieScheme, openIdOptions.SignInScheme);
-
- var cookieAuthenticationOptionsMonitor = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
- Assert.NotNull(cookieAuthenticationOptionsMonitor);
- var cookieAuthenticationOptions = cookieAuthenticationOptionsMonitor.Get(AzureADDefaults.CookieScheme);
- Assert.Equal("/AzureAD/Account/SignIn/AzureAD", cookieAuthenticationOptions.LoginPath);
- Assert.Equal("/AzureAD/Account/SignOut/AzureAD", cookieAuthenticationOptions.LogoutPath);
- Assert.Equal("/AzureAD/Account/AccessDenied", cookieAuthenticationOptions.AccessDeniedPath);
- Assert.Equal(SameSiteMode.None, cookieAuthenticationOptions.Cookie.SameSite);
- }
-
- [Fact]
- public void AddAzureAD_AllowsOverridingCookiesAndOpenIdConnectSettings()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureAD(o =>
- {
- o.Instance = "https://login.microsoftonline.com";
- o.ClientId = "ClientId";
- o.ClientSecret = "ClientSecret";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.TenantId = "Common";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, o =>
- {
- o.Authority = "https://overriden.com";
- });
-
- services.Configure<CookieAuthenticationOptions>(AzureADDefaults.CookieScheme, o =>
- {
- o.AccessDeniedPath = "/Overriden";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var openIdOptionsMonitor = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
- Assert.NotNull(openIdOptionsMonitor);
- var openIdOptions = openIdOptionsMonitor.Get(AzureADDefaults.OpenIdScheme);
- Assert.Equal("ClientId", openIdOptions.ClientId);
- Assert.Equal($"https://overriden.com", openIdOptions.Authority);
-
- var cookieAuthenticationOptionsMonitor = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
- Assert.NotNull(cookieAuthenticationOptionsMonitor);
- var cookieAuthenticationOptions = cookieAuthenticationOptionsMonitor.Get(AzureADDefaults.CookieScheme);
- Assert.Equal("/AzureAD/Account/SignIn/AzureAD", cookieAuthenticationOptions.LoginPath);
- Assert.Equal("/Overriden", cookieAuthenticationOptions.AccessDeniedPath);
- }
-
- [Fact]
- public void AddAzureAD_RegisteringAddCookiesAndAddOpenIdConnectHasNoImpactOnAzureAAExtensions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddOpenIdConnect()
- .AddCookie()
- .AddAzureAD(o =>
- {
- o.Instance = "https://login.microsoftonline.com";
- o.ClientId = "ClientId";
- o.ClientSecret = "ClientSecret";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.TenantId = "Common";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, o =>
- {
- o.Authority = "https://overriden.com";
- });
-
- services.Configure<CookieAuthenticationOptions>(AzureADDefaults.CookieScheme, o =>
- {
- o.AccessDeniedPath = "/Overriden";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var openIdOptionsMonitor = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
- Assert.NotNull(openIdOptionsMonitor);
- var openIdOptions = openIdOptionsMonitor.Get(AzureADDefaults.OpenIdScheme);
- Assert.Equal("ClientId", openIdOptions.ClientId);
- Assert.Equal($"https://overriden.com", openIdOptions.Authority);
-
- var cookieAuthenticationOptionsMonitor = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
- Assert.NotNull(cookieAuthenticationOptionsMonitor);
- var cookieAuthenticationOptions = cookieAuthenticationOptionsMonitor.Get(AzureADDefaults.CookieScheme);
- Assert.Equal("/AzureAD/Account/SignIn/AzureAD", cookieAuthenticationOptions.LoginPath);
- Assert.Equal("/Overriden", cookieAuthenticationOptions.AccessDeniedPath);
- }
-
- [Fact]
- public void AddAzureAD_ThrowsForDuplicatedSchemes()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureAD(o => { })
- .AddAzureAD(o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Equal("A scheme with the name 'AzureAD' was already added.", exception.Message);
- }
-
- [Fact]
- public void AddAzureAD_ThrowsWhenOpenIdSchemeIsAlreadyInUse()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureAD(o => { })
- .AddAzureAD("Custom", AzureADDefaults.OpenIdScheme, "Cookie", null, o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- var expectedMessage = $"The Open ID Connect scheme 'AzureADOpenID' can't be associated with the Azure Active Directory scheme 'Custom'. " +
- "The Open ID Connect scheme 'AzureADOpenID' is already mapped to the Azure Active Directory scheme 'AzureAD'";
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Equal(expectedMessage, exception.Message);
- }
-
- [Fact]
- public void AddAzureAD_ThrowsWhenCookieSchemeIsAlreadyInUse()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureAD(o => { })
- .AddAzureAD("Custom", "OpenID", AzureADDefaults.CookieScheme, null, o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- var expectedMessage = $"The cookie scheme 'AzureADCookie' can't be associated with the Azure Active Directory scheme 'Custom'. " +
- "The cookie scheme 'AzureADCookie' is already mapped to the Azure Active Directory scheme 'AzureAD'";
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Equal(expectedMessage, exception.Message);
- }
-
- [Fact]
- public void AddAzureAD_ThrowsWhenInstanceIsNotSet()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureAD(o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- var expectedMessage = "The 'Instance' option must be provided.";
-
- // Act & Assert
- var exception = Assert.Throws<OptionsValidationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Contains(expectedMessage, exception.Failures);
- }
-
- [Fact]
- public void AddAzureAD_SkipsOptionsValidationForNonAzureCookies()
- {
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureAD(o => { })
- .AddCookie("other");
-
- var provider = services.BuildServiceProvider();
- var cookieAuthOptions = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
-
- Assert.NotNull(cookieAuthOptions.Get("other"));
- }
-
- [Fact]
- public void AddAzureADBearer_AddsAllAuthenticationHandlers()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADBearer(o => { });
- var provider = services.BuildServiceProvider();
-
- // Assert
- Assert.NotNull(provider.GetService<JwtBearerHandler>());
- Assert.NotNull(provider.GetService<PolicySchemeHandler>());
- }
-
- [Fact]
- public void AddAzureADBearer_ConfiguresAllOptions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.TenantId = "TenantId";
- });
- var provider = services.BuildServiceProvider();
-
- // Assert
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
- Assert.NotNull(azureADOptionsMonitor);
- var options = azureADOptionsMonitor.Get(AzureADDefaults.BearerAuthenticationScheme);
- Assert.Equal(AzureADDefaults.JwtBearerAuthenticationScheme, options.JwtBearerSchemeName);
- Assert.Equal("https://login.microsoftonline.com/", options.Instance);
- Assert.Equal("ClientId", options.ClientId);
- Assert.Equal("domain.onmicrosoft.com", options.Domain);
-
- var bearerOptionsMonitor = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
- Assert.NotNull(bearerOptionsMonitor);
- var bearerOptions = bearerOptionsMonitor.Get(AzureADDefaults.JwtBearerAuthenticationScheme);
- Assert.Equal("ClientId", bearerOptions.Audience);
- Assert.Equal($"https://login.microsoftonline.com/TenantId", bearerOptions.Authority);
- }
-
- [Fact]
- public void AddAzureADBearer_CanOverrideJwtBearerOptionsConfiguration()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.TenantId = "TenantId";
- });
-
- services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, o =>
- {
- o.Audience = "http://overriden.com";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var bearerOptionsMonitor = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
- Assert.NotNull(bearerOptionsMonitor);
- var bearerOptions = bearerOptionsMonitor.Get(AzureADDefaults.JwtBearerAuthenticationScheme);
- Assert.Equal("http://overriden.com", bearerOptions.Audience);
- Assert.Equal($"https://login.microsoftonline.com/TenantId", bearerOptions.Authority);
- }
-
- [Fact]
- public void AddAzureADBearer_RegisteringJwtBearerHasNoImpactOnAzureAAExtensions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddJwtBearer()
- .AddAzureADBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.TenantId = "TenantId";
- });
-
- services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, o =>
- {
- o.Audience = "http://overriden.com";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var bearerOptionsMonitor = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
- Assert.NotNull(bearerOptionsMonitor);
- var bearerOptions = bearerOptionsMonitor.Get(AzureADDefaults.JwtBearerAuthenticationScheme);
- Assert.Equal("http://overriden.com", bearerOptions.Audience);
- Assert.Equal($"https://login.microsoftonline.com/TenantId", bearerOptions.Authority);
- }
-
- [Fact]
- public void AddAzureADBearer_ThrowsForDuplicatedSchemes()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADBearer(o => { })
- .AddAzureADBearer(o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Equal("A scheme with the name 'AzureADBearer' was already added.", exception.Message);
- }
-
- [Fact]
- public void AddAzureADBearer_ThrowsWhenBearerSchemeIsAlreadyInUse()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADBearer(o => { })
- .AddAzureADBearer("Custom", AzureADDefaults.JwtBearerAuthenticationScheme, o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- var expectedMessage = $"The JSON Web Token Bearer scheme 'AzureADJwtBearer' can't be associated with the Azure Active Directory scheme 'Custom'. " +
- "The JSON Web Token Bearer scheme 'AzureADJwtBearer' is already mapped to the Azure Active Directory scheme 'AzureADBearer'";
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Equal(expectedMessage, exception.Message);
- }
-
- [Fact]
- public void AddAzureADBearer_ThrowsWhenInstanceIsNotSet()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADBearer(o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADOptionsMonitor = provider.GetService<IOptionsMonitor<AzureADOptions>>();
-
- var expectedMessage = "The 'Instance' option must be provided.";
-
- // Act & Assert
- var exception = Assert.Throws<OptionsValidationException>(
- () => azureADOptionsMonitor.Get(AzureADDefaults.AuthenticationScheme));
-
- Assert.Contains(expectedMessage, exception.Failures);
- }
-
- [Fact]
- public void AddAzureADBearer_SkipsOptionsValidationForNonAzureCookies()
- {
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADBearer(o => { })
- .AddJwtBearer("other", o => { });
-
- var provider = services.BuildServiceProvider();
- var jwtOptions = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
-
- Assert.NotNull(jwtOptions.Get("other"));
- }
-
- [Fact]
- public void AddAzureAD_SkipsOptionsValidationForNonAzureOpenIdConnect()
- {
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureAD(o => { })
- .AddOpenIdConnect("other", null, o =>
- {
- o.ClientId = "ClientId";
- o.Authority = "https://authority.com";
- });
-
- var provider = services.BuildServiceProvider();
- var openIdConnectOptions = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
-
- Assert.NotNull(openIdConnectOptions.Get("other"));
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/Controllers/AccountControllerTests.cs b/src/Azure/AzureAD/Authentication.AzureAD.UI/test/Controllers/AccountControllerTests.cs
deleted file mode 100644
index 688686767e..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/Controllers/AccountControllerTests.cs
+++ /dev/null
@@ -1,276 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Security.Claims;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Abstractions;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.AspNetCore.Mvc.Routing;
-using Microsoft.AspNetCore.Routing;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
-using Moq;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.UI.AzureAD.Controllers.Internal;
-
-public class AccountControllerTests
-{
- [Fact]
- public void SignInNoScheme_ChallengesAADAzureADDefaultScheme()
- {
- // Arrange
- var controller = new AccountController(
- new OptionsMonitor(AzureADDefaults.AuthenticationScheme, new AzureADOptions()
- {
- OpenIdConnectSchemeName = AzureADDefaults.OpenIdScheme,
- CookieSchemeName = AzureADDefaults.CookieScheme
- }))
- {
- Url = new TestUrlHelper("~/", "https://localhost/")
- };
-
- // Act
- var result = controller.SignIn(null);
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal(AzureADDefaults.AuthenticationScheme, challengedScheme);
- Assert.NotNull(challenge.Properties.RedirectUri);
- Assert.Equal("https://localhost/", challenge.Properties.RedirectUri);
- }
-
- [Fact]
- public void SignInProvidedScheme_ChallengesCustomScheme()
- {
- // Arrange
- var controller = new AccountController(new OptionsMonitor("Custom", new AzureADOptions()));
- controller.Url = new TestUrlHelper("~/", "https://localhost/");
-
- // Act
- var result = controller.SignIn("Custom");
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal("Custom", challengedScheme);
- }
-
- private ClaimsPrincipal CreateAuthenticatedPrincipal(string scheme) =>
- new ClaimsPrincipal(new ClaimsIdentity(scheme));
-
- private static ControllerContext CreateControllerContext(ClaimsPrincipal principal = null)
- {
- principal = principal ?? new ClaimsPrincipal(new ClaimsIdentity());
- var mock = new Mock<IAuthenticationService>();
- mock.Setup(authS => authS.AuthenticateAsync(It.IsAny<HttpContext>(), It.IsAny<string>()))
- .ReturnsAsync<HttpContext, string, IAuthenticationService, AuthenticateResult>(
- (ctx, scheme) =>
- {
- if (principal.Identity.IsAuthenticated)
- {
- return AuthenticateResult.Success(new AuthenticationTicket(principal, scheme));
- }
- else
- {
- return AuthenticateResult.NoResult();
- }
- });
- return new ControllerContext()
- {
- HttpContext = new DefaultHttpContext()
- {
- RequestServices = new ServiceCollection()
- .AddSingleton(mock.Object)
- .BuildServiceProvider()
- }
- };
- }
-
- [Fact]
- public void SignOutNoScheme_SignsOutDefaultCookiesAndDefaultOpenIDConnectAADAzureADSchemesAsync()
- {
- // Arrange
- var options = new AzureADOptions()
- {
- CookieSchemeName = AzureADDefaults.CookieScheme,
- OpenIdConnectSchemeName = AzureADDefaults.OpenIdScheme
- };
-
- var controllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal(AzureADDefaults.AuthenticationScheme));
-
- var descriptor = new PageActionDescriptor()
- {
- AttributeRouteInfo = new AttributeRouteInfo()
- {
- Template = "/Account/SignedOut"
- }
- };
- var controller = new AccountController(new OptionsMonitor(AzureADDefaults.AuthenticationScheme, options))
- {
- Url = new TestUrlHelper(
- controllerContext.HttpContext,
- new RouteData(),
- descriptor,
- "/Account/SignedOut",
- "https://localhost/Account/SignedOut"),
- ControllerContext = new ControllerContext()
- {
- HttpContext = controllerContext.HttpContext
- }
- };
- controller.Request.Scheme = "https";
-
- // Act
- var result = controller.SignOut(null);
-
- // Assert
- var signOut = Assert.IsAssignableFrom<SignOutResult>(result);
- Assert.Equal(new[] { AzureADDefaults.CookieScheme, AzureADDefaults.OpenIdScheme }, signOut.AuthenticationSchemes);
- Assert.NotNull(signOut.Properties.RedirectUri);
- Assert.Equal("https://localhost/Account/SignedOut", signOut.Properties.RedirectUri);
- }
-
- [Fact]
- public void SignOutProvidedScheme_SignsOutCustomCookiesAndCustomOpenIDConnectAADAzureADSchemesAsync()
- {
- // Arrange
- var options = new AzureADOptions()
- {
- CookieSchemeName = "Cookie",
- OpenIdConnectSchemeName = "OpenID"
- };
-
- var controllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal(AzureADDefaults.AuthenticationScheme));
- var descriptor = new PageActionDescriptor()
- {
- AttributeRouteInfo = new AttributeRouteInfo()
- {
- Template = "/Account/SignedOut"
- }
- };
-
- var controller = new AccountController(new OptionsMonitor("Custom", options))
- {
- Url = new TestUrlHelper(
- controllerContext.HttpContext,
- new RouteData(),
- descriptor,
- "/Account/SignedOut",
- "https://localhost/Account/SignedOut"),
- ControllerContext = new ControllerContext()
- {
- HttpContext = controllerContext.HttpContext
- }
- };
- controller.Request.Scheme = "https";
-
- // Act
- var result = controller.SignOut("Custom");
-
- // Assert
- var signOut = Assert.IsAssignableFrom<SignOutResult>(result);
- Assert.Equal(new[] { "Cookie", "OpenID" }, signOut.AuthenticationSchemes);
- }
-
- private class OptionsMonitor : IOptionsMonitor<AzureADOptions>
- {
- public OptionsMonitor(string scheme, AzureADOptions options)
- {
- Scheme = scheme;
- Options = options;
- }
-
- public AzureADOptions CurrentValue => throw new NotImplementedException();
-
- public string Scheme { get; }
- public AzureADOptions Options { get; }
-
- public AzureADOptions Get(string name)
- {
- if (name == Scheme)
- {
- return Options;
- }
-
- return null;
- }
-
- public IDisposable OnChange(Action<AzureADOptions, string> listener)
- {
- throw new NotImplementedException();
- }
- }
-
- private class TestUrlHelper : IUrlHelper
- {
- public TestUrlHelper(string contentPath, string url)
- {
- ContentPath = contentPath;
- Url = url;
- }
-
- public TestUrlHelper(
- HttpContext context,
- RouteData routeData,
- ActionDescriptor descriptor,
- string contentPath,
- string url)
- {
- HttpContext = context;
- RouteData = routeData;
- ActionDescriptor = descriptor;
- ContentPath = contentPath;
- Url = url;
- }
-
- public ActionContext ActionContext =>
- new ActionContext(HttpContext, RouteData, ActionDescriptor);
-
- public string ContentPath { get; }
- public string Url { get; }
- public HttpContext HttpContext { get; }
- public RouteData RouteData { get; }
- public ActionDescriptor ActionDescriptor { get; }
-
- public string Action(UrlActionContext actionContext)
- {
- throw new NotImplementedException();
- }
-
- public string Content(string contentPath)
- {
- if (ContentPath == contentPath)
- {
- return Url;
- }
- return "";
- }
-
- public bool IsLocalUrl(string url)
- {
- throw new NotImplementedException();
- }
-
- public string Link(string routeName, object values)
- {
- throw new NotImplementedException();
- }
-
- public string RouteUrl(UrlRouteContext routeContext)
- {
- if (routeContext.Values is RouteValueDictionary dicionary &&
- dicionary.TryGetValue("page", out var page) &&
- page is string pagePath &&
- ContentPath == pagePath)
- {
- return Url;
- }
-
- return null;
- }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/xunit.runner.json b/src/Azure/AzureAD/Authentication.AzureAD.UI/test/xunit.runner.json
deleted file mode 100644
index 42db7ef95e..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/xunit.runner.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "shadowCopy": false
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Controllers/AccountController.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Controllers/AccountController.cs
deleted file mode 100644
index 90b5dee6e5..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Controllers/AccountController.cs
+++ /dev/null
@@ -1,81 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2C.Controllers.Internal;
-
-[NonController]
-[AllowAnonymous]
-[Area("AzureADB2C")]
-[Route("[area]/[controller]/[action]")]
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AccountController : Controller
-{
- private readonly IOptionsMonitor<AzureADB2COptions> _options;
-
- public AccountController(IOptionsMonitor<AzureADB2COptions> AzureADB2COptions)
- {
- _options = AzureADB2COptions;
- }
-
- [HttpGet("{scheme?}")]
- public IActionResult SignIn([FromRoute] string scheme)
- {
- scheme = scheme ?? AzureADB2CDefaults.AuthenticationScheme;
- var redirectUrl = Url.Content("~/");
- return Challenge(
- new AuthenticationProperties { RedirectUri = redirectUrl },
- scheme);
- }
-
- [HttpGet("{scheme?}")]
- public IActionResult ResetPassword([FromRoute] string scheme)
- {
- scheme = scheme ?? AzureADB2CDefaults.AuthenticationScheme;
- var options = _options.Get(scheme);
-
- var redirectUrl = Url.Content("~/");
- var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
- properties.Items[AzureADB2CDefaults.PolicyKey] = options.ResetPasswordPolicyId;
- return Challenge(properties, scheme);
- }
-
- [HttpGet("{scheme?}")]
- public async Task<IActionResult> EditProfile([FromRoute] string scheme)
- {
- scheme = scheme ?? AzureADB2CDefaults.AuthenticationScheme;
- var authenticated = await HttpContext.AuthenticateAsync(scheme);
- if (!authenticated.Succeeded)
- {
- return Challenge(scheme);
- }
-
- var options = _options.Get(scheme);
-
- var redirectUrl = Url.Content("~/");
- var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
- properties.Items[AzureADB2CDefaults.PolicyKey] = options.EditProfilePolicyId;
- return Challenge(properties, scheme);
- }
-
- [HttpGet("{scheme?}")]
- public async Task<IActionResult> SignOut([FromRoute] string scheme)
- {
- scheme = scheme ?? AzureADB2CDefaults.AuthenticationScheme;
- var authenticated = await HttpContext.AuthenticateAsync(scheme);
- if (!authenticated.Succeeded)
- {
- return Challenge(scheme);
- }
-
- var options = _options.Get(scheme);
-
- var callbackUrl = Url.Page("/Account/SignedOut", pageHandler: null, values: null, protocol: Request.Scheme);
- return SignOut(
- new AuthenticationProperties { RedirectUri = callbackUrl },
- options.AllSchemes);
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml
deleted file mode 100644
index 2084bbf67a..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml
+++ /dev/null
@@ -1,10 +0,0 @@
-@page
-@model AccessDeniedModel
-@{
- ViewData["Title"] = "Access denied";
-}
-
-<header>
- <h1 id="AzureADB2CAccessDeniedTitle" class="text-danger">@ViewData["Title"]</h1>
- <p id="AzureADB2CAccessDeniedText" class="text-danger">You do not have access to this resource.</p>
-</header>
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml.cs
deleted file mode 100644
index 57631fa590..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/AccessDenied.cshtml.cs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal;
-
-/// <summary>
-/// This API supports infrastructure and is not intended to be used
-/// directly from your code.This API may change or be removed in future releases
-/// </summary>
-[AllowAnonymous]
-public class AccessDeniedModel : PageModel
-{
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public void OnGet()
- {
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml
deleted file mode 100644
index 046fdddb56..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml
+++ /dev/null
@@ -1,23 +0,0 @@
-@page
-@model ErrorModel
-@{
- ViewData["Title"] = "Error";
-}
-
-<h1 id="AzureADB2CErrorTitle" class="text-danger">Error.</h1>
-<h2 id="AzureADB2CErrorSub" class="text-danger">An error occurred while processing your request.</h2>
-
-@if (Model.ShowRequestId)
-{
-<p id="AzureADB2CRequestId">
- <strong>Request ID:</strong> <code>@Model.RequestId</code>
-</p>
-}
-
-<h3 id="AzureADB2CErrorDevNoticeTitle">Development Mode</h3>
-<p id="AzureADB2CErrorDevNoticeText1">
- Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
-</p>
-<p id="AzureADB2CErrorDevNoticeText2">
- <strong>Development environment should not be enabled in deployed applications</strong>, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>, and restarting the application.
-</p>
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml.cs
deleted file mode 100644
index c7e8d7d0d2..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/Error.cshtml.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal;
-
-/// <summary>
-/// This API supports infrastructure and is not intended to be used
-/// directly from your code.This API may change or be removed in future releases
-/// </summary>
-[AllowAnonymous]
-[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
-public class ErrorModel : PageModel
-{
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public string RequestId { get; set; }
-
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
-
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public void OnGet()
- {
- RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml
deleted file mode 100644
index 13e90c4216..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml
+++ /dev/null
@@ -1,10 +0,0 @@
-@page
-@model SignedOutModel
-@{
- ViewData["Title"] = "Signed out";
-}
-
-<h2 id="AzureADB2CSignedOutTitle">@ViewData["Title"]</h2>
-<p id="AzureADB2CSignedOutText">
- You have successfully signed out.
-</p>
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml.cs
deleted file mode 100644
index e8a607d269..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/SignedOut.cshtml.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal;
-
-/// <summary>
-/// This API supports infrastructure and is not intended to be used
-/// directly from your code.This API may change or be removed in future releases
-/// </summary>
-[AllowAnonymous]
-public class SignedOutModel : PageModel
-{
- /// <summary>
- /// This API supports infrastructure and is not intended to be used
- /// directly from your code.This API may change or be removed in future releases
- /// </summary>
- public IActionResult OnGet()
- {
- if (User.Identity.IsAuthenticated)
- {
- return LocalRedirect("~/");
- }
-
- return Page();
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/_ViewImports.cshtml b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/_ViewImports.cshtml
deleted file mode 100644
index 655317c358..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/Account/_ViewImports.cshtml
+++ /dev/null
@@ -1,2 +0,0 @@
-@using Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal
-@namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Pages.Internal \ No newline at end of file
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/_ViewStart.cshtml b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/_ViewStart.cshtml
deleted file mode 100644
index c51721cd40..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Areas/AzureADB2C/Pages/_ViewStart.cshtml
+++ /dev/null
@@ -1,13 +0,0 @@
-@using Microsoft.AspNetCore.Hosting
-@using Microsoft.AspNetCore.Mvc.ViewEngines
-
-@inject IWebHostEnvironment Environment
-@inject ICompositeViewEngine Engine
-
-@{
- var result = Engine.FindView(ViewContext, "_Layout", isMainPage: false);
- if (result.Success)
- {
- Layout = "_Layout";
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CAccountControllerFeatureProvider.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CAccountControllerFeatureProvider.cs
deleted file mode 100644
index 0f621b4ccf..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CAccountControllerFeatureProvider.cs
+++ /dev/null
@@ -1,21 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Reflection;
-using Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2C.Controllers.Internal;
-using Microsoft.AspNetCore.Mvc.ApplicationParts;
-using Microsoft.AspNetCore.Mvc.Controllers;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADB2CAccountControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>, IApplicationFeatureProvider
-{
- public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
- {
- if (!feature.Controllers.Contains(typeof(AccountController).GetTypeInfo()))
- {
- feature.Controllers.Add(typeof(AccountController).GetTypeInfo());
- }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CCookieOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CCookieOptionsConfiguration.cs
deleted file mode 100644
index 091702a192..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CCookieOptionsConfiguration.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADB2CCookieOptionsConfiguration : IConfigureNamedOptions<CookieAuthenticationOptions>
-{
- private readonly IOptions<AzureADB2CSchemeOptions> _schemeOptions;
- private readonly IOptionsMonitor<AzureADB2COptions> _azureADB2COptions;
-
- public AzureADB2CCookieOptionsConfiguration(IOptions<AzureADB2CSchemeOptions> schemeOptions, IOptionsMonitor<AzureADB2COptions> azureADB2COptions)
- {
- _schemeOptions = schemeOptions;
- _azureADB2COptions = azureADB2COptions;
- }
-
- public void Configure(string name, CookieAuthenticationOptions options)
- {
- var azureADB2CScheme = GetAzureADB2CScheme(name);
- var azureADB2COptions = _azureADB2COptions.Get(azureADB2CScheme);
- if (name != azureADB2COptions.CookieSchemeName)
- {
- return;
- }
-
- options.LoginPath = $"/AzureADB2C/Account/SignIn/{azureADB2CScheme}";
- options.LogoutPath = $"/AzureADB2C/Account/SignOut/{azureADB2CScheme}";
- options.AccessDeniedPath = "/AzureADB2C/Account/AccessDenied";
- options.Cookie.SameSite = SameSiteMode.None;
- }
-
- public void Configure(CookieAuthenticationOptions options)
- {
- }
-
- private string GetAzureADB2CScheme(string name)
- {
- foreach (var mapping in _schemeOptions.Value.OpenIDMappings)
- {
- if (mapping.Value.CookieScheme == name)
- {
- return mapping.Key;
- }
- }
-
- return null;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CJwtBearerOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CJwtBearerOptionsConfiguration.cs
deleted file mode 100644
index e616d8c4ba..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2CJwtBearerOptionsConfiguration.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADB2CJwtBearerOptionsConfiguration : IConfigureNamedOptions<JwtBearerOptions>
-{
- private readonly IOptions<AzureADB2CSchemeOptions> _schemeOptions;
- private readonly IOptionsMonitor<AzureADB2COptions> _azureADB2COptions;
-
- public AzureADB2CJwtBearerOptionsConfiguration(
- IOptions<AzureADB2CSchemeOptions> schemeOptions,
- IOptionsMonitor<AzureADB2COptions> azureADB2COptions)
- {
- _schemeOptions = schemeOptions;
- _azureADB2COptions = azureADB2COptions;
- }
-
- public void Configure(string name, JwtBearerOptions options)
- {
- var azureADB2CScheme = GetAzureADB2CScheme(name);
- var azureADB2COptions = _azureADB2COptions.Get(azureADB2CScheme);
- if (name != azureADB2COptions.JwtBearerSchemeName)
- {
- return;
- }
-
- options.Audience = azureADB2COptions.ClientId;
- options.Authority = AzureADB2COpenIdConnectOptionsConfiguration.BuildAuthority(azureADB2COptions);
- }
-
- public void Configure(JwtBearerOptions options)
- {
- }
-
- private string GetAzureADB2CScheme(string name)
- {
- foreach (var mapping in _schemeOptions.Value.JwtBearerMappings)
- {
- if (mapping.Value.JwtBearerScheme == name)
- {
- return mapping.Key;
- }
- }
-
- return null;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2COpenIdConnectOptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2COpenIdConnectOptionsConfiguration.cs
deleted file mode 100644
index cbde0dcab0..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureADB2COpenIdConnectOptionsConfiguration.cs
+++ /dev/null
@@ -1,75 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.Options;
-using Microsoft.IdentityModel.Tokens;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADB2COpenIdConnectOptionsConfiguration : IConfigureNamedOptions<OpenIdConnectOptions>
-{
- private readonly IOptions<AzureADB2CSchemeOptions> _schemeOptions;
- private readonly IOptionsMonitor<AzureADB2COptions> _azureADB2COptions;
-
- public AzureADB2COpenIdConnectOptionsConfiguration(IOptions<AzureADB2CSchemeOptions> schemeOptions, IOptionsMonitor<AzureADB2COptions> azureADB2COptions)
- {
- _schemeOptions = schemeOptions;
- _azureADB2COptions = azureADB2COptions;
- }
-
- public void Configure(string name, OpenIdConnectOptions options)
- {
- var azureADB2CScheme = GetAzureADB2CScheme(name);
- var azureADB2COptions = _azureADB2COptions.Get(azureADB2CScheme);
- if (name != azureADB2COptions.OpenIdConnectSchemeName)
- {
- return;
- }
-
- options.ClientId = azureADB2COptions.ClientId;
- options.ClientSecret = azureADB2COptions.ClientSecret;
- options.Authority = BuildAuthority(azureADB2COptions);
- options.CallbackPath = azureADB2COptions.CallbackPath ?? options.CallbackPath;
- options.SignedOutCallbackPath = azureADB2COptions.SignedOutCallbackPath ?? options.SignedOutCallbackPath;
- options.SignInScheme = azureADB2COptions.CookieSchemeName;
- options.UseTokenLifetime = true;
- options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" };
-
- var handlers = new AzureADB2COpenIDConnectEventHandlers(azureADB2CScheme, azureADB2COptions);
- options.Events = new OpenIdConnectEvents
- {
- OnRedirectToIdentityProvider = handlers.OnRedirectToIdentityProvider,
- OnRemoteFailure = handlers.OnRemoteFailure
- };
- }
-
- internal static string BuildAuthority(AzureADB2COptions AzureADB2COptions)
- {
- var baseUri = new Uri(AzureADB2COptions.Instance);
- var pathBase = baseUri.PathAndQuery.TrimEnd('/');
- var domain = AzureADB2COptions.Domain;
- var policy = AzureADB2COptions.DefaultPolicy;
-
- return new Uri(baseUri, new PathString($"{pathBase}/{domain}/{policy}/v2.0")).ToString();
- }
-
- private string GetAzureADB2CScheme(string name)
- {
- foreach (var mapping in _schemeOptions.Value.OpenIDMappings)
- {
- if (mapping.Value.OpenIdConnectScheme == name)
- {
- return mapping.Key;
- }
- }
-
- return null;
- }
-
- public void Configure(OpenIdConnectOptions options)
- {
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CAuthenticationBuilderExtensions.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CAuthenticationBuilderExtensions.cs
deleted file mode 100644
index 75768be528..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CAuthenticationBuilderExtensions.cs
+++ /dev/null
@@ -1,223 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Linq;
-using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Mvc.ApplicationParts;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication;
-
-/// <summary>
-/// Extension methods to add Azure Active Directory B2C Authentication to your application.
-/// </summary>
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-public static class AzureADB2CAuthenticationBuilderExtensions
-{
- /// <summary>
- /// Adds JWT Bearer authentication to your app for Azure AD B2C Applications.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADB2COptions}"/> to configure the
- /// <see cref="AzureADB2COptions"/>.
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureADB2CBearer(this AuthenticationBuilder builder, Action<AzureADB2COptions> configureOptions) =>
- builder.AddAzureADB2CBearer(
- AzureADB2CDefaults.BearerAuthenticationScheme,
- AzureADB2CDefaults.JwtBearerAuthenticationScheme,
- configureOptions);
-
- /// <summary>
- /// Adds JWT Bearer authentication to your app for Azure AD B2C Applications.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="scheme">The identifier for the virtual scheme.</param>
- /// <param name="jwtBearerScheme">The identifier for the underlying JWT Bearer scheme.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADB2COptions}"/> to configure the
- /// <see cref="AzureADB2COptions"/>.
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureADB2CBearer(
- this AuthenticationBuilder builder,
- string scheme,
- string jwtBearerScheme,
- Action<AzureADB2COptions> configureOptions)
- {
- builder.AddPolicyScheme(scheme, displayName: null, configureOptions: o =>
- {
- o.ForwardDefault = jwtBearerScheme;
- });
-
- builder.Services.Configure(TryAddJwtBearerSchemeMapping(scheme, jwtBearerScheme));
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<AzureADB2COptions>, AzureADB2COptionsConfiguration>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<JwtBearerOptions>, AzureADB2CJwtBearerOptionsConfiguration>());
-
- builder.Services.Configure(scheme, configureOptions);
- builder.AddJwtBearer(jwtBearerScheme, o => { });
-
- return builder;
- }
-
- /// <summary>
- /// Adds Azure Active Directory B2C Authentication to your application.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADB2COptions}"/> to configure the
- /// <see cref="AzureADB2COptions"/>
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureADB2C(this AuthenticationBuilder builder, Action<AzureADB2COptions> configureOptions) =>
- builder.AddAzureADB2C(
- AzureADB2CDefaults.AuthenticationScheme,
- AzureADB2CDefaults.OpenIdScheme,
- AzureADB2CDefaults.CookieScheme,
- AzureADB2CDefaults.DisplayName,
- configureOptions);
-
- /// <summary>
- /// Adds Azure Active Directory B2C Authentication to your application.
- /// </summary>
- /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
- /// <param name="scheme">The identifier for the virtual scheme.</param>
- /// <param name="openIdConnectScheme">The identifier for the underlying Open ID Connect scheme.</param>
- /// <param name="cookieScheme">The identifier for the underlying cookie scheme.</param>
- /// <param name="displayName">The display name for the scheme.</param>
- /// <param name="configureOptions">The <see cref="Action{AzureADB2COptions}"/> to configure the
- /// <see cref="AzureADB2COptions"/>
- /// </param>
- /// <returns>The <see cref="AuthenticationBuilder"/>.</returns>
- [Obsolete("This is obsolete and will be removed in a future version. Use AddMicrosoftWebApiAuthentication from Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
- public static AuthenticationBuilder AddAzureADB2C(
- this AuthenticationBuilder builder,
- string scheme,
- string openIdConnectScheme,
- string cookieScheme,
- string displayName,
- Action<AzureADB2COptions> configureOptions)
- {
- AddAdditionalMvcApplicationParts(builder.Services);
- builder.AddPolicyScheme(scheme, displayName, o =>
- {
- o.ForwardDefault = cookieScheme;
- o.ForwardChallenge = openIdConnectScheme;
- });
-
- builder.Services.Configure(TryAddOpenIDCookieSchemeMappings(scheme, openIdConnectScheme, cookieScheme));
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<AzureADB2COptions>, AzureADB2COptionsConfiguration>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<OpenIdConnectOptions>, AzureADB2COpenIdConnectOptionsConfiguration>());
-
- builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<CookieAuthenticationOptions>, AzureADB2CCookieOptionsConfiguration>());
-
- builder.Services.Configure(scheme, configureOptions);
-
- builder.AddOpenIdConnect(openIdConnectScheme, null, o => { });
- builder.AddCookie(cookieScheme, null, o => { });
-
- return builder;
- }
-
- private static Action<AzureADB2CSchemeOptions> TryAddJwtBearerSchemeMapping(string scheme, string jwtBearerScheme)
- {
- return TryAddMapping;
-
- void TryAddMapping(AzureADB2CSchemeOptions o)
- {
- if (o.JwtBearerMappings.ContainsKey(scheme))
- {
- throw new InvalidOperationException($"A scheme with the name '{scheme}' was already added.");
- }
- foreach (var mapping in o.JwtBearerMappings)
- {
- if (mapping.Value.JwtBearerScheme == jwtBearerScheme)
- {
- throw new InvalidOperationException(
- $"The JSON Web Token Bearer scheme '{jwtBearerScheme}' can't be associated with the Azure Active Directory B2C scheme '{scheme}'. " +
- $"The JSON Web Token Bearer scheme '{jwtBearerScheme}' is already mapped to the Azure Active Directory B2C scheme '{mapping.Key}'");
- }
- }
- o.JwtBearerMappings.Add(scheme, new AzureADB2CSchemeOptions.JwtBearerSchemeMapping
- {
- JwtBearerScheme = jwtBearerScheme
- });
- };
- }
-
- private static Action<AzureADB2CSchemeOptions> TryAddOpenIDCookieSchemeMappings(string scheme, string openIdConnectScheme, string cookieScheme)
- {
- return TryAddMapping;
-
- void TryAddMapping(AzureADB2CSchemeOptions o)
- {
- if (o.OpenIDMappings.ContainsKey(scheme))
- {
- throw new InvalidOperationException($"A scheme with the name '{scheme}' was already added.");
- }
- foreach (var mapping in o.OpenIDMappings)
- {
- if (mapping.Value.CookieScheme == cookieScheme)
- {
- throw new InvalidOperationException(
- $"The cookie scheme '{cookieScheme}' can't be associated with the Azure Active Directory B2C scheme '{scheme}'. " +
- $"The cookie scheme '{cookieScheme}' is already mapped to the Azure Active Directory B2C scheme '{mapping.Key}'");
- }
-
- if (mapping.Value.OpenIdConnectScheme == openIdConnectScheme)
- {
- throw new InvalidOperationException(
- $"The Open ID Connect scheme '{openIdConnectScheme}' can't be associated with the Azure Active Directory B2C scheme '{scheme}'. " +
- $"The Open ID Connect scheme '{openIdConnectScheme}' is already mapped to the Azure Active Directory B2C scheme '{mapping.Key}'");
- }
- }
- o.OpenIDMappings.Add(scheme, new AzureADB2CSchemeOptions.AzureADB2COpenIDSchemeMapping
- {
- OpenIdConnectScheme = openIdConnectScheme,
- CookieScheme = cookieScheme
- });
- };
- }
-
- private static void AddAdditionalMvcApplicationParts(IServiceCollection services)
- {
- var additionalParts = GetAdditionalParts();
- var mvcBuilder = services
- .AddMvc()
- .ConfigureApplicationPartManager(apm =>
- {
- foreach (var part in additionalParts)
- {
- if (!apm.ApplicationParts.Any(ap => HasSameName(ap.Name, part.Name)))
- {
- apm.ApplicationParts.Add(part);
- }
- }
-
- apm.FeatureProviders.Add(new AzureADB2CAccountControllerFeatureProvider());
- });
-
- static bool HasSameName(string left, string right) => string.Equals(left, right, StringComparison.Ordinal);
- }
-
- private static IEnumerable<ApplicationPart> GetAdditionalParts()
- {
- var thisAssembly = typeof(AzureADB2CAuthenticationBuilderExtensions).Assembly;
- var relatedAssemblies = RelatedAssemblyAttribute.GetRelatedAssemblies(thisAssembly, throwOnError: true);
-
- foreach (var reference in relatedAssemblies)
- {
- yield return new CompiledRazorAssemblyPart(reference);
- }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs
deleted file mode 100644
index 7bcfc79a11..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CDefaults.cs
+++ /dev/null
@@ -1,49 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-/// <summary>
-/// Constants for different Azure Active Directory B2C authentication components.
-/// </summary>
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-public static class AzureADB2CDefaults
-{
- /// <summary>
- /// The key for the policy used in <see cref="AuthenticationProperties"/>.
- /// </summary>
- public static readonly string PolicyKey = "Policy";
-
- /// <summary>
- /// The scheme name for Open ID Connect when using
- /// <see cref="AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C(AuthenticationBuilder, System.Action{AzureADB2COptions})"/>.
- /// </summary>
- public const string OpenIdScheme = "AzureADB2COpenID";
-
- /// <summary>
- /// The scheme name for cookies when using
- /// <see cref="AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C(AuthenticationBuilder, System.Action{AzureADB2COptions})"/>.
- /// </summary>
- public const string CookieScheme = "AzureADB2CCookie";
-
- /// <summary>
- /// The default scheme for Azure Active Directory B2C Bearer.
- /// </summary>
- public const string BearerAuthenticationScheme = "AzureADB2CBearer";
-
- /// <summary>
- /// The scheme name for JWT Bearer when using
- /// <see cref="AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2CBearer(AuthenticationBuilder, System.Action{AzureADB2COptions})"/>.
- /// </summary>
- public const string JwtBearerAuthenticationScheme = "AzureADB2CJwtBearer";
-
- /// <summary>
- /// The default scheme for Azure Active Directory B2C.
- /// </summary>
- public const string AuthenticationScheme = "AzureADB2C";
-
- /// <summary>
- /// The display name for Azure Active Directory B2C.
- /// </summary>
- public static readonly string DisplayName = "Azure Active Directory B2C";
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COpenIDConnectEventHandlers.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COpenIDConnectEventHandlers.cs
deleted file mode 100644
index cf27554c70..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COpenIDConnectEventHandlers.cs
+++ /dev/null
@@ -1,84 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADB2COpenIDConnectEventHandlers
-{
- private readonly IDictionary<string, string> _policyToIssuerAddress =
- new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
-
- public AzureADB2COpenIDConnectEventHandlers(string schemeName, AzureADB2COptions options)
- {
- SchemeName = schemeName;
- Options = options;
- }
-
- public string SchemeName { get; }
-
- public AzureADB2COptions Options { get; }
-
- public Task OnRedirectToIdentityProvider(RedirectContext context)
- {
- var defaultPolicy = Options.DefaultPolicy;
- if (context.Properties.Items.TryGetValue(AzureADB2CDefaults.PolicyKey, out var policy) &&
- !string.IsNullOrEmpty(policy) &&
- !string.Equals(policy, defaultPolicy, StringComparison.OrdinalIgnoreCase))
- {
- context.ProtocolMessage.Scope = OpenIdConnectScope.OpenIdProfile;
- context.ProtocolMessage.ResponseType = OpenIdConnectResponseType.IdToken;
- context.ProtocolMessage.IssuerAddress = BuildIssuerAddress(context, defaultPolicy, policy);
- context.Properties.Items.Remove(AzureADB2CDefaults.PolicyKey);
- }
-
- return Task.CompletedTask;
- }
-
- private string BuildIssuerAddress(RedirectContext context, string defaultPolicy, string policy)
- {
- if (!_policyToIssuerAddress.TryGetValue(policy, out _))
- {
- _policyToIssuerAddress[policy] = context.ProtocolMessage.IssuerAddress.ToLowerInvariant()
- .Replace($"/{defaultPolicy.ToLowerInvariant()}/", $"/{policy.ToLowerInvariant()}/");
- }
-
- return _policyToIssuerAddress[policy];
- }
-
- public Task OnRemoteFailure(RemoteFailureContext context)
- {
- context.HandleResponse();
- // Handle the error code that Azure Active Directory B2C throws when trying to reset a password from the login page
- // because password reset is not supported by a "sign-up or sign-in policy".
- // Below is a sample error message:
- // 'access_denied', error_description: 'AADB2C90118: The user has forgotten their password.
- // Correlation ID: f99deff4-f43b-43cc-b4e7-36141dbaf0a0
- // Timestamp: 2018-03-05 02:49:35Z
- //', error_uri: 'error_uri is null'.
- if (context.Failure is OpenIdConnectProtocolException && context.Failure.Message.Contains("AADB2C90118"))
- {
- // If the user clicked the reset password link, redirect to the reset password route
- context.Response.Redirect($"{context.Request.PathBase}/AzureADB2C/Account/ResetPassword/{SchemeName}");
- }
- // Access denied errors happen when a user cancels an action on the Azure Active Directory B2C UI. We just redirect back to
- // the main page in that case.
- // Message contains error: 'access_denied', error_description: 'AADB2C90091: The user has cancelled entering self-asserted information.
- // Correlation ID: d01c8878-0732-4eb2-beb8-da82a57432e0
- // Timestamp: 2018-03-05 02:56:49Z
- // ', error_uri: 'error_uri is null'.
- else if (context.Failure is OpenIdConnectProtocolException && context.Failure.Message.Contains("access_denied"))
- {
- context.Response.Redirect($"{context.Request.PathBase}/");
- }
- else
- {
- context.Response.Redirect($"{context.Request.PathBase}/AzureADB2C/Account/Error");
- }
-
- return Task.CompletedTask;
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptions.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptions.cs
deleted file mode 100644
index a1c4bf84b5..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptions.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-/// <summary>
-/// Options for configuring authentication using Azure Active Directory B2C.
-/// </summary>
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-public class AzureADB2COptions
-{
- /// <summary>
- /// Gets or sets the OpenID Connect authentication scheme to use for authentication with this instance
- /// of Azure Active Directory B2C authentication.
- /// </summary>
- public string OpenIdConnectSchemeName { get; set; } = OpenIdConnectDefaults.AuthenticationScheme;
-
- /// <summary>
- /// Gets or sets the Cookie authentication scheme to use for sign in with this instance of
- /// Azure Active Directory B2C authentication.
- /// </summary>
- public string CookieSchemeName { get; set; } = CookieAuthenticationDefaults.AuthenticationScheme;
-
- /// <summary>
- /// Gets or sets the Jwt bearer authentication scheme to use for validating access tokens for this
- /// instance of Azure Active Directory B2C Bearer authentication.
- /// </summary>
- public string JwtBearerSchemeName { get; internal set; }
-
- /// <summary>
- /// Gets or sets the client Id.
- /// </summary>
- public string ClientId { get; set; }
-
- /// <summary>
- /// Gets or sets the client secret.
- /// </summary>
- public string ClientSecret { get; set; }
-
- /// <summary>
- /// Gets or sets the Azure Active Directory B2C instance.
- /// </summary>
- public string Instance { get; set; }
-
- /// <summary>
- /// Gets or sets the domain of the Azure Active Directory B2C tenant.
- /// </summary>
- public string Domain { get; set; }
-
- /// <summary>
- /// Gets or sets the edit profile policy name.
- /// </summary>
- public string EditProfilePolicyId { get; set; }
-
- /// <summary>
- /// Gets or sets the sign up or sign in policy name.
- /// </summary>
- public string SignUpSignInPolicyId { get; set; }
-
- /// <summary>
- /// Gets or sets the reset password policy id.
- /// </summary>
- public string ResetPasswordPolicyId { get; set; }
-
- /// <summary>
- /// Gets or sets the sign in callback path.
- /// </summary>
- public string CallbackPath { get; set; }
-
- /// <summary>
- /// Gets or sets the sign out callback path.
- /// </summary>
- public string SignedOutCallbackPath { get; set; }
-
- /// <summary>
- /// Gets or sets the default policy.
- /// </summary>
- public string DefaultPolicy => SignUpSignInPolicyId;
-
- /// <summary>
- /// Gets all the underlying authentication schemes.
- /// </summary>
- public string[] AllSchemes => new[] { CookieSchemeName, OpenIdConnectSchemeName };
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptionsConfiguration.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptionsConfiguration.cs
deleted file mode 100644
index 4708f6727b..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2COptionsConfiguration.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-[Obsolete("This is obsolete and will be removed in a future version. Use Microsoft.Identity.Web instead. See https://aka.ms/ms-identity-web.")]
-internal class AzureADB2COptionsConfiguration : IConfigureNamedOptions<AzureADB2COptions>
-{
- private readonly IOptions<AzureADB2CSchemeOptions> _schemeOptions;
-
- public AzureADB2COptionsConfiguration(IOptions<AzureADB2CSchemeOptions> schemeOptions)
- {
- _schemeOptions = schemeOptions;
- }
-
- public void Configure(string name, AzureADB2COptions options)
- {
- // This can be called because of someone configuring JWT or someone configuring
- // Open ID + Cookie.
- if (_schemeOptions.Value.OpenIDMappings.TryGetValue(name, out var webMapping))
- {
- options.OpenIdConnectSchemeName = webMapping.OpenIdConnectScheme;
- options.CookieSchemeName = webMapping.CookieScheme;
- return;
- }
- if (_schemeOptions.Value.JwtBearerMappings.TryGetValue(name, out var mapping))
- {
- options.JwtBearerSchemeName = mapping.JwtBearerScheme;
- return;
- }
- }
-
- public void Configure(AzureADB2COptions options)
- {
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CSchemeOptions.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CSchemeOptions.cs
deleted file mode 100644
index 5d57c617ed..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/AzureAdB2CSchemeOptions.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-internal class AzureADB2CSchemeOptions
-{
- public IDictionary<string, AzureADB2COpenIDSchemeMapping> OpenIDMappings { get; set; } = new Dictionary<string, AzureADB2COpenIDSchemeMapping>();
-
- public IDictionary<string, JwtBearerSchemeMapping> JwtBearerMappings { get; set; } = new Dictionary<string, JwtBearerSchemeMapping>();
-
- public class AzureADB2COpenIDSchemeMapping
- {
- public string OpenIdConnectScheme { get; set; }
- public string CookieScheme { get; set; }
- }
-
- public class JwtBearerSchemeMapping
- {
- public string JwtBearerScheme { get; set; }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj
deleted file mode 100644
index 4616851307..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Razor">
-
- <PropertyGroup>
- <Description>ASP.NET Core Azure Active Directory B2C Integration provides components for easily integrating Azure Active Directory B2C authentication within your ASP.NET Core application.</Description>
- <RazorAssemblyDescription>Precompiled views assembly for the ASP.NET Core Azure Active Directory B2C Integration package.</RazorAssemblyDescription>
- <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <PackageTags>aspnetcore;authentication;AzureADB2C</PackageTags>
- <GenerateDocumentationFile>true</GenerateDocumentationFile>
- <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
- <Nullable>disable</Nullable>
- </PropertyGroup>
-
- <ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Mvc" />
- <Reference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
- <Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
- <Reference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" />
- </ItemGroup>
-
-</Project>
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Properties/AssemblyInfo.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Properties/AssemblyInfo.cs
deleted file mode 100644
index b6d8d50d08..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,6 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Runtime.CompilerServices;
-
-[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Shipped.txt b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Shipped.txt
deleted file mode 100644
index 09fe171474..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Shipped.txt
+++ /dev/null
@@ -1,53 +0,0 @@
-#nullable enable
-~const Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.AuthenticationScheme = "AzureADB2C" -> string
-~const Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.BearerAuthenticationScheme = "AzureADB2CBearer" -> string
-~const Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.CookieScheme = "AzureADB2CCookie" -> string
-~const Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.JwtBearerAuthenticationScheme = "AzureADB2CJwtBearer" -> string
-~const Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.OpenIdScheme = "AzureADB2COpenID" -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.AllSchemes.get -> string[]
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.CallbackPath.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.CallbackPath.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.ClientId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.ClientId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.ClientSecret.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.ClientSecret.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.CookieSchemeName.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.CookieSchemeName.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.DefaultPolicy.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.Domain.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.Domain.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.EditProfilePolicyId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.EditProfilePolicyId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.Instance.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.Instance.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.JwtBearerSchemeName.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.OpenIdConnectSchemeName.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.OpenIdConnectSchemeName.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.ResetPasswordPolicyId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.ResetPasswordPolicyId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.SignedOutCallbackPath.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.SignedOutCallbackPath.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.SignUpSignInPolicyId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.SignUpSignInPolicyId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.ErrorModel.RequestId.get -> string
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.ErrorModel.RequestId.set -> void
-~Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.SignedOutModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~static Microsoft.AspNetCore.Authentication.AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, string scheme, string openIdConnectScheme, string cookieScheme, string displayName, System.Action<Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static Microsoft.AspNetCore.Authentication.AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2C(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, System.Action<Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static Microsoft.AspNetCore.Authentication.AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2CBearer(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, string scheme, string jwtBearerScheme, System.Action<Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static Microsoft.AspNetCore.Authentication.AzureADB2CAuthenticationBuilderExtensions.AddAzureADB2CBearer(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, System.Action<Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions> configureOptions) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
-~static readonly Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.DisplayName -> string
-~static readonly Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults.PolicyKey -> string
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2CDefaults
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2COptions.AzureADB2COptions() -> void
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.AccessDeniedModel
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.AccessDeniedModel.AccessDeniedModel() -> void
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.AccessDeniedModel.OnGet() -> void
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.ErrorModel
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.ErrorModel.ErrorModel() -> void
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.ErrorModel.OnGet() -> void
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.ErrorModel.ShowRequestId.get -> bool
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.SignedOutModel
-Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Internal.SignedOutModel.SignedOutModel() -> void
-Microsoft.AspNetCore.Authentication.AzureADB2CAuthenticationBuilderExtensions
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Unshipped.txt b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Unshipped.txt
deleted file mode 100644
index 7dc5c58110..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/src/PublicAPI.Unshipped.txt
+++ /dev/null
@@ -1 +0,0 @@
-#nullable enable
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2CAuthenticationBuilderExtensionsTests.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2CAuthenticationBuilderExtensionsTests.cs
deleted file mode 100644
index 8c61fdb798..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2CAuthenticationBuilderExtensionsTests.cs
+++ /dev/null
@@ -1,423 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-using Microsoft.AspNetCore.Authentication.Cookies;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Authentication;
-
-public class AzureADB2CAuthenticationBuilderExtensionsTests
-{
- [Fact]
- public void AddAzureADB2C_AddsAllAuthenticationHandlers()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADB2C(o => { });
- var provider = services.BuildServiceProvider();
-
- // Assert
- Assert.NotNull(provider.GetService<OpenIdConnectHandler>());
- Assert.NotNull(provider.GetService<CookieAuthenticationHandler>());
- Assert.NotNull(provider.GetService<PolicySchemeHandler>());
- }
-
- [Fact]
- public void AddAzureADB2C_ConfiguresAllOptions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADB2C(o =>
- {
- o.Instance = "https://login.microsoftonline.com/tfp";
- o.ClientId = "ClientId";
- o.ClientSecret = "ClientSecret";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.SignUpSignInPolicyId = "B2C_1_SiUpIn";
- o.ResetPasswordPolicyId = "B2C_1_SSPR";
- o.EditProfilePolicyId = "B2C_1_SiPe";
- });
- var provider = services.BuildServiceProvider();
-
- // Assert
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
- Assert.NotNull(azureADB2COptionsMonitor);
- var azureADB2COptions = azureADB2COptionsMonitor.Get(AzureADB2CDefaults.AuthenticationScheme);
- Assert.Equal(AzureADB2CDefaults.OpenIdScheme, azureADB2COptions.OpenIdConnectSchemeName);
- Assert.Equal(AzureADB2CDefaults.CookieScheme, azureADB2COptions.CookieSchemeName);
- Assert.Equal("https://login.microsoftonline.com/tfp", azureADB2COptions.Instance);
- Assert.Equal("ClientId", azureADB2COptions.ClientId);
- Assert.Equal("ClientSecret", azureADB2COptions.ClientSecret);
- Assert.Equal("/signin-oidc", azureADB2COptions.CallbackPath);
- Assert.Equal("domain.onmicrosoft.com", azureADB2COptions.Domain);
- Assert.Equal("B2C_1_SiUpIn", azureADB2COptions.SignUpSignInPolicyId);
- Assert.Equal("B2C_1_SSPR", azureADB2COptions.ResetPasswordPolicyId);
- Assert.Equal("B2C_1_SiPe", azureADB2COptions.EditProfilePolicyId);
-
- var openIdOptionsMonitor = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
- Assert.NotNull(openIdOptionsMonitor);
- var openIdOptions = openIdOptionsMonitor.Get(AzureADB2CDefaults.OpenIdScheme);
- Assert.Equal("ClientId", openIdOptions.ClientId);
- Assert.Equal($"https://login.microsoftonline.com/tfp/domain.onmicrosoft.com/B2C_1_SiUpIn/v2.0", openIdOptions.Authority);
- Assert.True(openIdOptions.UseTokenLifetime);
- Assert.Equal("/signin-oidc", openIdOptions.CallbackPath);
- Assert.Equal(AzureADB2CDefaults.CookieScheme, openIdOptions.SignInScheme);
- Assert.NotNull(openIdOptions.TokenValidationParameters);
- Assert.Equal("name", openIdOptions.TokenValidationParameters.NameClaimType);
- Assert.NotNull(openIdOptions.Events);
- var redirectHandler = openIdOptions.Events.OnRedirectToIdentityProvider;
- Assert.NotNull(redirectHandler);
- Assert.IsType<AzureADB2COpenIDConnectEventHandlers>(redirectHandler.Target);
- var remoteFailureHanlder = openIdOptions.Events.OnRemoteFailure;
- Assert.NotNull(remoteFailureHanlder);
- Assert.IsType<AzureADB2COpenIDConnectEventHandlers>(redirectHandler.Target);
-
- var cookieAuthenticationOptionsMonitor = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
- Assert.NotNull(cookieAuthenticationOptionsMonitor);
- var cookieAuthenticationOptions = cookieAuthenticationOptionsMonitor.Get(AzureADB2CDefaults.CookieScheme);
- Assert.Equal("/AzureADB2C/Account/SignIn/AzureADB2C", cookieAuthenticationOptions.LoginPath);
- Assert.Equal("/AzureADB2C/Account/SignOut/AzureADB2C", cookieAuthenticationOptions.LogoutPath);
- Assert.Equal("/AzureADB2C/Account/AccessDenied", cookieAuthenticationOptions.AccessDeniedPath);
- Assert.Equal(SameSiteMode.None, cookieAuthenticationOptions.Cookie.SameSite);
- }
-
- [Fact]
- public void AddAzureADB2C_AllowsOverridingCookiesAndOpenIdConnectSettings()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADB2C(o =>
- {
- o.Instance = "https://login.microsoftonline.com";
- o.ClientId = "ClientId";
- o.ClientSecret = "ClientSecret";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, o =>
- {
- o.Authority = "https://overriden.com";
- });
-
- services.Configure<CookieAuthenticationOptions>(AzureADB2CDefaults.CookieScheme, o =>
- {
- o.AccessDeniedPath = "/Overriden";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var openIdOptionsMonitor = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
- Assert.NotNull(openIdOptionsMonitor);
- var openIdOptions = openIdOptionsMonitor.Get(AzureADB2CDefaults.OpenIdScheme);
- Assert.Equal("ClientId", openIdOptions.ClientId);
- Assert.Equal($"https://overriden.com", openIdOptions.Authority);
-
- var cookieAuthenticationOptionsMonitor = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
- Assert.NotNull(cookieAuthenticationOptionsMonitor);
- var cookieAuthenticationOptions = cookieAuthenticationOptionsMonitor.Get(AzureADB2CDefaults.CookieScheme);
- Assert.Equal("/AzureADB2C/Account/SignIn/AzureADB2C", cookieAuthenticationOptions.LoginPath);
- Assert.Equal("/Overriden", cookieAuthenticationOptions.AccessDeniedPath);
- }
-
- [Fact]
- public void AddAzureADB2C_RegisteringAddCookiesAndAddOpenIdConnectHasNoImpactOnAzureAAExtensions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddCookie()
- .AddOpenIdConnect()
- .AddAzureADB2C(o =>
- {
- o.Instance = "https://login.microsoftonline.com";
- o.ClientId = "ClientId";
- o.ClientSecret = "ClientSecret";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, o =>
- {
- o.Authority = "https://overriden.com";
- });
-
- services.Configure<CookieAuthenticationOptions>(AzureADB2CDefaults.CookieScheme, o =>
- {
- o.AccessDeniedPath = "/Overriden";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var openIdOptionsMonitor = provider.GetService<IOptionsMonitor<OpenIdConnectOptions>>();
- Assert.NotNull(openIdOptionsMonitor);
- var openIdOptions = openIdOptionsMonitor.Get(AzureADB2CDefaults.OpenIdScheme);
- Assert.Equal("ClientId", openIdOptions.ClientId);
- Assert.Equal($"https://overriden.com", openIdOptions.Authority);
-
- var cookieAuthenticationOptionsMonitor = provider.GetService<IOptionsMonitor<CookieAuthenticationOptions>>();
- Assert.NotNull(cookieAuthenticationOptionsMonitor);
- var cookieAuthenticationOptions = cookieAuthenticationOptionsMonitor.Get(AzureADB2CDefaults.CookieScheme);
- Assert.Equal("/AzureADB2C/Account/SignIn/AzureADB2C", cookieAuthenticationOptions.LoginPath);
- Assert.Equal("/Overriden", cookieAuthenticationOptions.AccessDeniedPath);
- }
-
- [Fact]
- public void AddAzureADB2C_ThrowsForDuplicatedSchemes()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADB2C(o => { })
- .AddAzureADB2C(o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADB2COptionsMonitor.Get(AzureADB2CDefaults.AuthenticationScheme));
-
- Assert.Equal("A scheme with the name 'AzureADB2C' was already added.", exception.Message);
- }
-
- [Fact]
- public void AddAzureADB2C_ThrowsWhenOpenIdSchemeIsAlreadyInUse()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADB2C(o => { })
- .AddAzureADB2C("Custom", AzureADB2CDefaults.OpenIdScheme, "Cookie", null, o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
-
- var expectedMessage = $"The Open ID Connect scheme 'AzureADB2COpenID' can't be associated with the Azure Active Directory B2C scheme 'Custom'. " +
- "The Open ID Connect scheme 'AzureADB2COpenID' is already mapped to the Azure Active Directory B2C scheme 'AzureADB2C'";
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADB2COptionsMonitor.Get(AzureADB2CDefaults.AuthenticationScheme));
-
- Assert.Equal(expectedMessage, exception.Message);
- }
-
- [Fact]
- public void AddAzureADB2C_ThrowsWhenCookieSchemeIsAlreadyInUse()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADB2C(o => { })
- .AddAzureADB2C("Custom", "OpenID", AzureADB2CDefaults.CookieScheme, null, o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
-
- var expectedMessage = $"The cookie scheme 'AzureADB2CCookie' can't be associated with the Azure Active Directory B2C scheme 'Custom'. " +
- "The cookie scheme 'AzureADB2CCookie' is already mapped to the Azure Active Directory B2C scheme 'AzureADB2C'";
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADB2COptionsMonitor.Get(AzureADB2CDefaults.AuthenticationScheme));
-
- Assert.Equal(expectedMessage, exception.Message);
- }
-
- [Fact]
- public void AddAzureADB2CBearer_AddsAllAuthenticationHandlers()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADB2CBearer(o => { });
- var provider = services.BuildServiceProvider();
-
- // Assert
- Assert.NotNull(provider.GetService<JwtBearerHandler>());
- Assert.NotNull(provider.GetService<PolicySchemeHandler>());
- }
-
- [Fact]
- public void AddAzureADB2CBearer_ConfiguresAllOptions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADB2CBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/tfp";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.SignUpSignInPolicyId = "B2C_1_SiUpIn";
- });
- var provider = services.BuildServiceProvider();
-
- // Assert
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
- Assert.NotNull(azureADB2COptionsMonitor);
- var options = azureADB2COptionsMonitor.Get(AzureADB2CDefaults.BearerAuthenticationScheme);
- Assert.Equal(AzureADB2CDefaults.JwtBearerAuthenticationScheme, options.JwtBearerSchemeName);
- Assert.Equal("https://login.microsoftonline.com/tfp", options.Instance);
- Assert.Equal("ClientId", options.ClientId);
- Assert.Equal("domain.onmicrosoft.com", options.Domain);
- Assert.Equal("B2C_1_SiUpIn", options.DefaultPolicy);
-
- var bearerOptionsMonitor = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
- Assert.NotNull(bearerOptionsMonitor);
- var bearerOptions = bearerOptionsMonitor.Get(AzureADB2CDefaults.JwtBearerAuthenticationScheme);
- Assert.Equal("ClientId", bearerOptions.Audience);
- Assert.Equal($"https://login.microsoftonline.com/tfp/domain.onmicrosoft.com/B2C_1_SiUpIn/v2.0", bearerOptions.Authority);
- }
-
- [Fact]
- public void AddAzureADB2CBearer_CanOverrideJwtBearerOptionsConfiguration()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddAzureADB2CBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.SignUpSignInPolicyId = "B2C_1_SiUpIn";
- });
-
- services.Configure<JwtBearerOptions>(AzureADB2CDefaults.JwtBearerAuthenticationScheme, o =>
- {
- o.Audience = "http://overriden.com";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var bearerOptionsMonitor = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
- Assert.NotNull(bearerOptionsMonitor);
- var bearerOptions = bearerOptionsMonitor.Get(AzureADB2CDefaults.JwtBearerAuthenticationScheme);
- Assert.Equal("https://login.microsoftonline.com/domain.onmicrosoft.com/B2C_1_SiUpIn/v2.0", bearerOptions.Authority);
- Assert.Equal("http://overriden.com", bearerOptions.Audience);
- }
-
- [Fact]
- public void AddAzureADB2CBearer_RegisteringJwtBearerHasNoImpactOnAzureAAExtensions()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- // Act
- services.AddAuthentication()
- .AddJwtBearer()
- .AddAzureADB2CBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "domain.onmicrosoft.com";
- o.SignUpSignInPolicyId = "B2C_1_SiUpIn";
- });
-
- services.Configure<JwtBearerOptions>(AzureADB2CDefaults.JwtBearerAuthenticationScheme, o =>
- {
- o.Audience = "http://overriden.com";
- });
-
- var provider = services.BuildServiceProvider();
-
- // Assert
- var bearerOptionsMonitor = provider.GetService<IOptionsMonitor<JwtBearerOptions>>();
- Assert.NotNull(bearerOptionsMonitor);
- var bearerOptions = bearerOptionsMonitor.Get(AzureADB2CDefaults.JwtBearerAuthenticationScheme);
- Assert.Equal("https://login.microsoftonline.com/domain.onmicrosoft.com/B2C_1_SiUpIn/v2.0", bearerOptions.Authority);
- Assert.Equal("http://overriden.com", bearerOptions.Audience);
- }
-
- [Fact]
- public void AddAzureADB2CBearer_ThrowsForDuplicatedSchemes()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADB2CBearer(o => { })
- .AddAzureADB2CBearer(o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADB2COptionsMonitor.Get(AzureADB2CDefaults.AuthenticationScheme));
-
- Assert.Equal("A scheme with the name 'AzureADB2CBearer' was already added.", exception.Message);
- }
-
- [Fact]
- public void AddAzureADB2CBearer_ThrowsWhenBearerSchemeIsAlreadyInUse()
- {
- // Arrange
- var services = new ServiceCollection();
- services.AddSingleton<ILoggerFactory>(new NullLoggerFactory());
-
- services.AddAuthentication()
- .AddAzureADB2CBearer(o => { })
- .AddAzureADB2CBearer("Custom", AzureADB2CDefaults.JwtBearerAuthenticationScheme, o => { });
-
- var provider = services.BuildServiceProvider();
- var azureADB2COptionsMonitor = provider.GetService<IOptionsMonitor<AzureADB2COptions>>();
-
- var expectedMessage = $"The JSON Web Token Bearer scheme 'AzureADB2CJwtBearer' can't be associated with the Azure Active Directory B2C scheme 'Custom'. " +
- "The JSON Web Token Bearer scheme 'AzureADB2CJwtBearer' is already mapped to the Azure Active Directory B2C scheme 'AzureADB2CBearer'";
-
- // Act & Assert
- var exception = Assert.Throws<InvalidOperationException>(
- () => azureADB2COptionsMonitor.Get(AzureADB2CDefaults.AuthenticationScheme));
-
- Assert.Equal(expectedMessage, exception.Message);
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2COpenIDConnectEventHandlersTests.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2COpenIDConnectEventHandlersTests.cs
deleted file mode 100644
index 5b9d701366..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/AzureAdB2COpenIDConnectEventHandlersTests.cs
+++ /dev/null
@@ -1,169 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Http;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-
-public class AzureADB2COpenIDConnectEventHandlersTests
-{
- [Fact]
- public async Task OnRedirectToIdentityProviderHandler_DoesNothingForTheDefaultPolicy()
- {
- // Arrange
- var handlers = new AzureADB2COpenIDConnectEventHandlers(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { SignUpSignInPolicyId = "B2C_1_SiUpIn" });
-
- var authenticationProperties = new AuthenticationProperties(new Dictionary<string, string>
- {
- [AzureADB2CDefaults.PolicyKey] = "B2C_1_SiUpIn"
- });
- var redirectContext = new RedirectContext(
- new DefaultHttpContext(),
- new AuthenticationScheme(AzureADB2CDefaults.AuthenticationScheme, "", typeof(OpenIdConnectHandler)),
- new OpenIdConnectOptions(),
- authenticationProperties)
- {
- ProtocolMessage = new OpenIdConnectMessage
- {
- Scope = OpenIdConnectScope.OpenId,
- ResponseType = OpenIdConnectResponseType.Code,
- IssuerAddress = "https://login.microsoftonline.com/tfp/domain.onmicrosoft.com/B2C_1_SiUpIn/v2.0"
- }
- };
-
- // Act
- await handlers.OnRedirectToIdentityProvider(redirectContext);
-
- // Assert
- Assert.Equal(OpenIdConnectScope.OpenId, redirectContext.ProtocolMessage.Scope);
- Assert.Equal(OpenIdConnectResponseType.Code, redirectContext.ProtocolMessage.ResponseType);
- Assert.Equal(
- "https://login.microsoftonline.com/tfp/domain.onmicrosoft.com/B2C_1_SiUpIn/v2.0",
- redirectContext.ProtocolMessage.IssuerAddress);
- Assert.True(authenticationProperties.Items.ContainsKey(AzureADB2CDefaults.PolicyKey));
- }
-
- [Fact]
- public async Task OnRedirectToIdentityProviderHandler_UpdatesRequestForOtherPolicies()
- {
- // Arrange
-
- var handlers = new AzureADB2COpenIDConnectEventHandlers(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { SignUpSignInPolicyId = "B2C_1_SiUpIn" });
-
- var authenticationProperties = new AuthenticationProperties(new Dictionary<string, string>
- {
- [AzureADB2CDefaults.PolicyKey] = "B2C_1_EP"
- });
- var redirectContext = new RedirectContext(
- new DefaultHttpContext(),
- new AuthenticationScheme(AzureADB2CDefaults.AuthenticationScheme, "", typeof(OpenIdConnectHandler)),
- new OpenIdConnectOptions(),
- authenticationProperties)
- {
- ProtocolMessage = new OpenIdConnectMessage
- {
- Scope = OpenIdConnectScope.OpenId,
- ResponseType = OpenIdConnectResponseType.Code,
- IssuerAddress = "https://login.microsoftonline.com/tfp/domain.onmicrosoft.com/B2C_1_EP/v2.0"
- }
- };
-
- // Act
- await handlers.OnRedirectToIdentityProvider(redirectContext);
-
- // Assert
- Assert.Equal(OpenIdConnectScope.OpenIdProfile, redirectContext.ProtocolMessage.Scope);
- Assert.Equal(OpenIdConnectResponseType.IdToken, redirectContext.ProtocolMessage.ResponseType);
- Assert.Equal(
- "https://login.microsoftonline.com/tfp/domain.onmicrosoft.com/b2c_1_ep/v2.0",
- redirectContext.ProtocolMessage.IssuerAddress);
- Assert.False(authenticationProperties.Items.ContainsKey(AzureADB2CDefaults.PolicyKey));
- }
-
- [Fact]
- public async Task OnRemoteError_HandlesResponseWhenTryingToResetPasswordFromTheLoginPage()
- {
- // Arrange
-
- var handlers = new AzureADB2COpenIDConnectEventHandlers(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { SignUpSignInPolicyId = "B2C_1_SiUpIn" });
-
- var remoteFailureContext = new RemoteFailureContext(
- new DefaultHttpContext(),
- new AuthenticationScheme(
- AzureADB2CDefaults.AuthenticationScheme,
- displayName: null,
- handlerType: typeof(OpenIdConnectHandler)),
- new OpenIdConnectOptions(),
- new OpenIdConnectProtocolException("AADB2C90118"));
-
- // Act
- await handlers.OnRemoteFailure(remoteFailureContext);
-
- // Assert
- Assert.Equal(StatusCodes.Status302Found, remoteFailureContext.Response.StatusCode);
- Assert.Equal("/AzureADB2C/Account/ResetPassword/AzureADB2C", remoteFailureContext.Response.Headers.Location);
- Assert.True(remoteFailureContext.Result.Handled);
- }
-
- [Fact]
- public async Task OnRemoteError_HandlesResponseWhenUserCancelsFlowFromTheAzureADB2CUserInterface()
- {
- // Arrange
-
- var handlers = new AzureADB2COpenIDConnectEventHandlers(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { SignUpSignInPolicyId = "B2C_1_SiUpIn" });
-
- var remoteFailureContext = new RemoteFailureContext(
- new DefaultHttpContext(),
- new AuthenticationScheme(
- AzureADB2CDefaults.AuthenticationScheme,
- displayName: null,
- handlerType: typeof(OpenIdConnectHandler)),
- new OpenIdConnectOptions(),
- new OpenIdConnectProtocolException("access_denied"));
-
- // Act
- await handlers.OnRemoteFailure(remoteFailureContext);
-
- // Assert
- Assert.Equal(StatusCodes.Status302Found, remoteFailureContext.Response.StatusCode);
- Assert.Equal("/", remoteFailureContext.Response.Headers.Location);
- Assert.True(remoteFailureContext.Result.Handled);
- }
-
- [Fact]
- public async Task OnRemoteError_HandlesResponseWhenErrorIsUnknown()
- {
- // Arrange
-
- var handlers = new AzureADB2COpenIDConnectEventHandlers(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { SignUpSignInPolicyId = "B2C_1_SiUpIn" });
-
- var remoteFailureContext = new RemoteFailureContext(
- new DefaultHttpContext(),
- new AuthenticationScheme(
- AzureADB2CDefaults.AuthenticationScheme,
- displayName: null,
- handlerType: typeof(OpenIdConnectHandler)),
- new OpenIdConnectOptions(),
- new OpenIdConnectProtocolException("some_other_error"));
-
- // Act
- await handlers.OnRemoteFailure(remoteFailureContext);
-
- // Assert
- Assert.Equal(StatusCodes.Status302Found, remoteFailureContext.Response.StatusCode);
- Assert.Equal("/AzureADB2C/Account/Error", remoteFailureContext.Response.Headers.Location);
- Assert.True(remoteFailureContext.Result.Handled);
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Controllers/AccountControllerTests.cs b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Controllers/AccountControllerTests.cs
deleted file mode 100644
index 53034f30b7..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Controllers/AccountControllerTests.cs
+++ /dev/null
@@ -1,383 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Security.Claims;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.AspNetCore.Mvc.Abstractions;
-using Microsoft.AspNetCore.Mvc.RazorPages;
-using Microsoft.AspNetCore.Mvc.Routing;
-using Microsoft.AspNetCore.Routing;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Options;
-using Moq;
-
-namespace Microsoft.AspNetCore.Authentication.AzureADB2C.UI.AzureADB2C.Controllers.Internal;
-
-public class AccountControllerTests
-{
- [Fact]
- public void SignInNoScheme_ChallengesAADAzureADB2CDefaultScheme()
- {
- // Arrange
- var controller = new AccountController(
- new OptionsMonitor(AzureADB2CDefaults.AuthenticationScheme, new AzureADB2COptions()
- {
- OpenIdConnectSchemeName = AzureADB2CDefaults.OpenIdScheme,
- CookieSchemeName = AzureADB2CDefaults.CookieScheme
- }))
- {
- Url = new TestUrlHelper("~/", "https://localhost/")
- };
-
- // Act
- var result = controller.SignIn(null);
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal(AzureADB2CDefaults.AuthenticationScheme, challengedScheme);
- Assert.NotNull(challenge.Properties.RedirectUri);
- Assert.Equal("https://localhost/", challenge.Properties.RedirectUri);
- }
-
- [Fact]
- public void SignInProvidedScheme_ChallengesCustomScheme()
- {
- // Arrange
- var controller = new AccountController(new OptionsMonitor("Custom", new AzureADB2COptions()));
- controller.Url = new TestUrlHelper("~/", "https://localhost/");
-
- // Act
- var result = controller.SignIn("Custom");
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal("Custom", challengedScheme);
- }
-
- [Fact]
- public void ResetPasswordNoScheme_ChallengesAADAzureADB2CDefaultSchemeWithResetPassworPolicyAsync()
- {
- // Arrange
- var controller = new AccountController(
- new OptionsMonitor(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { ResetPasswordPolicyId = "Reset" }))
- {
- Url = new TestUrlHelper("~/", "https://localhost/")
- };
- controller.ControllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal(AzureADB2CDefaults.AuthenticationScheme));
-
- // Act
- var result = controller.ResetPassword(null);
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal(AzureADB2CDefaults.AuthenticationScheme, challengedScheme);
- Assert.NotNull(challenge.Properties.RedirectUri);
- Assert.Equal("https://localhost/", challenge.Properties.RedirectUri);
- Assert.NotNull(challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- Assert.Equal("Reset", challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- }
-
- [Fact]
- public void ResetPasswordCustomScheme_ChallengesAADAzureADB2CDefaultSchemeWithResetPassworPolicyFromCustomSchemeAsync()
- {
- // Arrange
- var controller = new AccountController(
- new OptionsMonitor(
- "Custom",
- new AzureADB2COptions() { ResetPasswordPolicyId = "CustomReset" }))
- {
- Url = new TestUrlHelper("~/", "https://localhost/")
- };
- controller.ControllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal("Custom"));
-
- // Act
- var result = controller.ResetPassword("Custom");
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal("Custom", challengedScheme);
- Assert.NotNull(challenge.Properties.RedirectUri);
- Assert.Equal("https://localhost/", challenge.Properties.RedirectUri);
- Assert.NotNull(challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- Assert.Equal("CustomReset", challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- }
-
- [Fact]
- public async Task EditProfileNoScheme_ChallengesAADAzureADB2CCustomSchemeWithEditProfilePolicyAsync()
- {
- // Arrange
- var controller = new AccountController(
- new OptionsMonitor(
- AzureADB2CDefaults.AuthenticationScheme,
- new AzureADB2COptions() { EditProfilePolicyId = "EditProfile" }))
- {
- Url = new TestUrlHelper("~/", "https://localhost/")
- };
- controller.ControllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal(AzureADB2CDefaults.AuthenticationScheme));
-
- // Act
- var result = await controller.EditProfile(null);
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal(AzureADB2CDefaults.AuthenticationScheme, challengedScheme);
- Assert.NotNull(challenge.Properties.RedirectUri);
- Assert.Equal("https://localhost/", challenge.Properties.RedirectUri);
- Assert.NotNull(challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- Assert.Equal("EditProfile", challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- }
-
- private ClaimsPrincipal CreateAuthenticatedPrincipal(string scheme) =>
- new ClaimsPrincipal(new ClaimsIdentity(scheme));
-
- private static ControllerContext CreateControllerContext(ClaimsPrincipal principal = null)
- {
- principal = principal ?? new ClaimsPrincipal(new ClaimsIdentity());
- var mock = new Mock<IAuthenticationService>();
- mock.Setup(authS => authS.AuthenticateAsync(It.IsAny<HttpContext>(), It.IsAny<string>()))
- .ReturnsAsync<HttpContext, string, IAuthenticationService, AuthenticateResult>(
- (ctx, scheme) =>
- {
- if (principal.Identity.IsAuthenticated)
- {
- return AuthenticateResult.Success(new AuthenticationTicket(principal, scheme));
- }
- else
- {
- return AuthenticateResult.NoResult();
- }
- });
- return new ControllerContext()
- {
- HttpContext = new DefaultHttpContext()
- {
- RequestServices = new ServiceCollection()
- .AddSingleton(mock.Object)
- .BuildServiceProvider()
- }
- };
- }
-
- [Fact]
- public async Task EditProfileCustomScheme_ChallengesAADAzureADB2CCustomSchemeWithEditProfilePolicyFromCustomSchemeAsync()
- {
- // Arrange
- var controller = new AccountController(
- new OptionsMonitor(
- "Custom",
- new AzureADB2COptions() { EditProfilePolicyId = "CustomEditProfile" }))
- {
- Url = new TestUrlHelper("~/", "https://localhost/")
- };
- controller.ControllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal("Custom"));
- // Act
- var result = await controller.EditProfile("Custom");
-
- // Assert
- var challenge = Assert.IsAssignableFrom<ChallengeResult>(result);
- var challengedScheme = Assert.Single(challenge.AuthenticationSchemes);
- Assert.Equal("Custom", challengedScheme);
- Assert.NotNull(challenge.Properties.RedirectUri);
- Assert.Equal("https://localhost/", challenge.Properties.RedirectUri);
- Assert.NotNull(challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- Assert.Equal("CustomEditProfile", challenge.Properties.Items[AzureADB2CDefaults.PolicyKey]);
- }
-
- [Fact]
- public async Task SignOutNoScheme_SignsOutDefaultCookiesAndDefaultOpenIDConnectAADAzureADB2CSchemesAsync()
- {
- // Arrange
- var options = new AzureADB2COptions()
- {
- CookieSchemeName = AzureADB2CDefaults.CookieScheme,
- OpenIdConnectSchemeName = AzureADB2CDefaults.OpenIdScheme
- };
-
- var controllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal(AzureADB2CDefaults.AuthenticationScheme));
-
- var descriptor = new PageActionDescriptor()
- {
- AttributeRouteInfo = new AttributeRouteInfo()
- {
- Template = "/Account/SignedOut"
- }
- };
- var controller = new AccountController(new OptionsMonitor(AzureADB2CDefaults.AuthenticationScheme, options))
- {
- Url = new TestUrlHelper(
- controllerContext.HttpContext,
- new RouteData(),
- descriptor,
- "/Account/SignedOut",
- "https://localhost/Account/SignedOut"),
- ControllerContext = new ControllerContext()
- {
- HttpContext = controllerContext.HttpContext
- }
- };
- controller.Request.Scheme = "https";
-
- // Act
- var result = await controller.SignOut(null);
-
- // Assert
- var signOut = Assert.IsAssignableFrom<SignOutResult>(result);
- Assert.Equal(new[] { AzureADB2CDefaults.CookieScheme, AzureADB2CDefaults.OpenIdScheme }, signOut.AuthenticationSchemes);
- Assert.NotNull(signOut.Properties.RedirectUri);
- Assert.Equal("https://localhost/Account/SignedOut", signOut.Properties.RedirectUri);
- }
-
- [Fact]
- public async Task SignOutProvidedScheme_SignsOutCustomCookiesAndCustomOpenIDConnectAADAzureADB2CSchemesAsync()
- {
- // Arrange
- var options = new AzureADB2COptions()
- {
- CookieSchemeName = "Cookie",
- OpenIdConnectSchemeName = "OpenID"
- };
-
- var controllerContext = CreateControllerContext(
- CreateAuthenticatedPrincipal(AzureADB2CDefaults.AuthenticationScheme));
- var descriptor = new PageActionDescriptor()
- {
- AttributeRouteInfo = new AttributeRouteInfo()
- {
- Template = "/Account/SignedOut"
- }
- };
-
- var controller = new AccountController(new OptionsMonitor("Custom", options))
- {
- Url = new TestUrlHelper(
- controllerContext.HttpContext,
- new RouteData(),
- descriptor,
- "/Account/SignedOut",
- "https://localhost/Account/SignedOut"),
- ControllerContext = new ControllerContext()
- {
- HttpContext = controllerContext.HttpContext
- }
- };
- controller.Request.Scheme = "https";
-
- // Act
- var result = await controller.SignOut("Custom");
-
- // Assert
- var signOut = Assert.IsAssignableFrom<SignOutResult>(result);
- Assert.Equal(new[] { "Cookie", "OpenID" }, signOut.AuthenticationSchemes);
- }
-
- private class OptionsMonitor : IOptionsMonitor<AzureADB2COptions>
- {
- public OptionsMonitor(string scheme, AzureADB2COptions options)
- {
- Scheme = scheme;
- Options = options;
- }
-
- public AzureADB2COptions CurrentValue => throw new NotImplementedException();
-
- public string Scheme { get; }
- public AzureADB2COptions Options { get; }
-
- public AzureADB2COptions Get(string name)
- {
- if (name == Scheme)
- {
- return Options;
- }
-
- return null;
- }
-
- public IDisposable OnChange(Action<AzureADB2COptions, string> listener)
- {
- throw new NotImplementedException();
- }
- }
-
- private class TestUrlHelper : IUrlHelper
- {
- public TestUrlHelper(string contentPath, string url)
- {
- ContentPath = contentPath;
- Url = url;
- }
-
- public TestUrlHelper(
- HttpContext context,
- RouteData routeData,
- ActionDescriptor descriptor,
- string contentPath,
- string url)
- {
- HttpContext = context;
- RouteData = routeData;
- ActionDescriptor = descriptor;
- ContentPath = contentPath;
- Url = url;
- }
-
- public ActionContext ActionContext =>
- new ActionContext(HttpContext, RouteData, ActionDescriptor);
-
- public string ContentPath { get; }
- public string Url { get; }
- public HttpContext HttpContext { get; }
- public RouteData RouteData { get; }
- public ActionDescriptor ActionDescriptor { get; }
-
- public string Action(UrlActionContext actionContext)
- {
- throw new NotImplementedException();
- }
-
- public string Content(string contentPath)
- {
- if (ContentPath == contentPath)
- {
- return Url;
- }
- return "";
- }
-
- public bool IsLocalUrl(string url)
- {
- throw new NotImplementedException();
- }
-
- public string Link(string routeName, object values)
- {
- throw new NotImplementedException();
- }
-
- public string RouteUrl(UrlRouteContext routeContext)
- {
- if (routeContext.Values is RouteValueDictionary dicionary &&
- dicionary.TryGetValue("page", out var page) &&
- page is string pagePath &&
- ContentPath == pagePath)
- {
- return Url;
- }
-
- return null;
- }
- }
-}
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test.csproj b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test.csproj
deleted file mode 100644
index 65c330077b..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/Microsoft.AspNetCore.Authentication.AzureADB2C.UI.Test.csproj
+++ /dev/null
@@ -1,20 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
- <PropertyGroup>
- <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <RootNamespace>Microsoft.AspNetCore.Authentication.AzureADB2C.UI</RootNamespace>
- <!-- This package will be deprecated -->
- <NoWarn>$(NoWarn);CS0618</NoWarn>
- </PropertyGroup>
-
- <ItemGroup>
- <Content Include="xunit.runner.json">
- <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
- </Content>
- </ItemGroup>
-
- <ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" />
- </ItemGroup>
-
-</Project>
diff --git a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/xunit.runner.json b/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/xunit.runner.json
deleted file mode 100644
index 42db7ef95e..0000000000
--- a/src/Azure/AzureAD/Authentication.AzureADB2C.UI/test/xunit.runner.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "shadowCopy": false
-}
diff --git a/src/Azure/AzureAD/Directory.Build.props b/src/Azure/AzureAD/Directory.Build.props
deleted file mode 100644
index 1bfcce80a3..0000000000
--- a/src/Azure/AzureAD/Directory.Build.props
+++ /dev/null
@@ -1,7 +0,0 @@
-<Project>
- <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
-
- <PropertyGroup>
- <WarningsNotAsErrors>xUnit1026:$(WarningsNotAsErrors)</WarningsNotAsErrors>
- </PropertyGroup>
-</Project>
diff --git a/src/Azure/AzureAD/README.md b/src/Azure/AzureAD/README.md
deleted file mode 100644
index 6086294419..0000000000
--- a/src/Azure/AzureAD/README.md
+++ /dev/null
@@ -1,4 +0,0 @@
-Azure Active Directory Integration
-==================================
-
-ASP.NET Core Azure Active Directory Integration provides seamless authentication integration with different Azure Active Directory services like Azure Active Directory and Azure Active Directory B2C for ASP.NET Core applications. \ No newline at end of file
diff --git a/src/Azure/AzureAD/test/FunctionalTests/ApiAuthenticationTests.cs b/src/Azure/AzureAD/test/FunctionalTests/ApiAuthenticationTests.cs
deleted file mode 100644
index 4386d27d71..0000000000
--- a/src/Azure/AzureAD/test/FunctionalTests/ApiAuthenticationTests.cs
+++ /dev/null
@@ -1,88 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Net;
-using AzureAD.WebSite;
-using Microsoft.AspNetCore.Authentication.AzureAD.UI;
-using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-using Microsoft.AspNetCore.Authentication.JwtBearer;
-using Microsoft.AspNetCore.Mvc.Testing;
-using Microsoft.AspNetCore.TestHost;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests;
-
-public class ApiAuthenticationTests : IClassFixture<WebApplicationFactory<Startup>>
-{
- public ApiAuthenticationTests(WebApplicationFactory<Startup> fixture)
- {
- Factory = fixture;
- }
-
- public WebApplicationFactory<Startup> Factory { get; }
-
- [Fact]
- public async Task BearerAzureAD_Challenges_UnauthorizedRequests()
- {
- // Arrange
- var client = Factory.WithWebHostBuilder(builder => builder.ConfigureTestServices(
- services =>
- {
- services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
- .AddAzureADBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.Domain = "test.onmicrosoft.com";
- o.ClientId = "ClientId";
- o.TenantId = "TenantId";
- });
-
- services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, o =>
- {
- o.Configuration = new OpenIdConnectConfiguration()
- {
- Issuer = "https://www.example.com",
- };
- });
- })).CreateDefaultClient();
-
- // Act
- var response = await client.GetAsync("/api/get");
-
- // Assert
- Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
- }
-
- [Fact]
- public async Task BearerAzureADB2C_Challenges_UnauthorizedRequests()
- {
- // Arrange
- var client = Factory.WithWebHostBuilder(builder => builder.ConfigureTestServices(
- services =>
- {
- services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
- .AddAzureADB2CBearer(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.Domain = "test.onmicrosoft.com";
- o.ClientId = "ClientId";
- o.SignUpSignInPolicyId = "B2c_1_SiSu";
- });
-
- services.Configure<JwtBearerOptions>(AzureADB2CDefaults.JwtBearerAuthenticationScheme, o =>
- {
- o.Configuration = new OpenIdConnectConfiguration()
- {
- Issuer = "https://www.example.com",
- };
- });
- })).CreateDefaultClient();
-
- // Act
- var response = await client.GetAsync("/api/get");
-
- // Assert
- Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode);
- }
-}
diff --git a/src/Azure/AzureAD/test/FunctionalTests/Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests.csproj b/src/Azure/AzureAD/test/FunctionalTests/Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests.csproj
deleted file mode 100644
index 1fd12016e2..0000000000
--- a/src/Azure/AzureAD/test/FunctionalTests/Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests.csproj
+++ /dev/null
@@ -1,21 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
- <PropertyGroup>
- <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <!-- This test will be deprecated -->
- <NoWarn>$(NoWarn);CS0618</NoWarn>
- </PropertyGroup>
-
- <ItemGroup>
- <ProjectReference Include="..\testassets\AzureAD.WebSite\AzureAD.WebSite.csproj" />
- </ItemGroup>
-
- <ItemGroup>
- <None Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
- </ItemGroup>
-
- <ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Mvc.Testing" />
- </ItemGroup>
-
- <Import Project="$(MvcTestingTargets)" Condition="'$(MvcTestingTargets)' != ''" />
-</Project>
diff --git a/src/Azure/AzureAD/test/FunctionalTests/WebAuthenticationTests.cs b/src/Azure/AzureAD/test/FunctionalTests/WebAuthenticationTests.cs
deleted file mode 100644
index 77f3da9701..0000000000
--- a/src/Azure/AzureAD/test/FunctionalTests/WebAuthenticationTests.cs
+++ /dev/null
@@ -1,210 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Net;
-using AzureAD.WebSite;
-using Microsoft.AspNetCore.Authentication.AzureAD.UI;
-using Microsoft.AspNetCore.Authentication.AzureADB2C.UI;
-using Microsoft.AspNetCore.Authentication.OpenIdConnect;
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc.Authorization;
-using Microsoft.AspNetCore.Mvc.Testing;
-using Microsoft.AspNetCore.TestHost;
-using Microsoft.AspNetCore.WebUtilities;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Primitives;
-using Microsoft.IdentityModel.Protocols.OpenIdConnect;
-
-namespace Microsoft.AspNetCore.Authentication.AzureAD.FunctionalTests;
-
-public class WebAuthenticationTests : IClassFixture<WebApplicationFactory<Startup>>
-{
- public WebAuthenticationTests(WebApplicationFactory<Startup> fixture)
- {
- Factory = fixture;
- }
-
- public WebApplicationFactory<Startup> Factory { get; }
-
- public static TheoryData<string> NotAddedEndpoints =>
- new TheoryData<string>()
- {
- "/AzureAD/Account/SignIn",
- "/AzureAD/Account/SignOut",
- "/AzureADB2C/Account/SignIn",
- "/AzureADB2C/Account/ResetPassword",
- "/AzureADB2C/Account/EditProfile",
- "/AzureADB2C/Account/SignOut",
- };
-
- [Theory]
- [MemberData(nameof(NotAddedEndpoints))]
- public async Task Endpoints_NotAvailable_When_Authentication_NotAdded(string endpoint)
- {
- // Act & Assert
- var response = await Factory.CreateDefaultClient().GetAsync(endpoint);
-
- // Assert
- Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
- }
-
- public static TheoryData<string, HttpStatusCode> AddedEndpointsStatusCodesAD =>
- new TheoryData<string, HttpStatusCode>()
- {
- { "/AzureAD/Account/AccessDenied", HttpStatusCode.OK },
- { "/AzureAD/Account/Error", HttpStatusCode.OK },
- { "/AzureAD/Account/SignedOut", HttpStatusCode.OK },
- { "/AzureAD/Account/SignIn", HttpStatusCode.Redirect },
- { "/AzureAD/Account/SignOut", HttpStatusCode.Redirect },
- };
-
- [Theory]
- [MemberData(nameof(AddedEndpointsStatusCodesAD))]
- public async Task ADEndpoints_AreAvailable_When_Authentication_IsAdded(string endpoint, HttpStatusCode expectedStatusCode)
- {
- // Act & Assert
- var client = Factory.WithWebHostBuilder(builder => builder.ConfigureTestServices(
- services =>
- {
- services
- .AddAuthentication(AzureADDefaults.AuthenticationScheme)
- .AddAzureAD(o =>
- {
- o.Instance = "https://login.microsoftonline.com/";
- o.Domain = "test.onmicrosoft.com";
- o.ClientId = "ClientId";
- o.TenantId = "TenantId";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, o =>
- {
- o.Configuration = new OpenIdConnectConfiguration()
- {
- Issuer = "https://www.example.com",
- TokenEndpoint = "https://www.example.com/token",
- AuthorizationEndpoint = "https://www.example.com/authorize",
- EndSessionEndpoint = "https://www.example.com/logout"
- };
- });
-
- services.AddMvc(o => o.Filters.Add(
- new AuthorizeFilter(new AuthorizationPolicyBuilder(new[] { AzureADDefaults.AuthenticationScheme })
- .RequireAuthenticatedUser().Build())));
- })).CreateDefaultClient();
-
- var response = await client.GetAsync(endpoint);
-
- // Assert
- Assert.Equal(expectedStatusCode, response.StatusCode);
- }
-
- public static TheoryData<string, HttpStatusCode> AddedEndpointsStatusCodesADB2C =>
- new TheoryData<string, HttpStatusCode>()
- {
- { "/AzureADB2C/Account/AccessDenied", HttpStatusCode.OK },
- { "/AzureADB2C/Account/Error", HttpStatusCode.OK },
- { "/AzureADB2C/Account/SignedOut", HttpStatusCode.OK },
- { "/AzureADB2C/Account/SignIn", HttpStatusCode.Redirect },
- { "/AzureADB2C/Account/ResetPassword", HttpStatusCode.Redirect },
- { "/AzureADB2C/Account/EditProfile", HttpStatusCode.Redirect },
- { "/AzureADB2C/Account/SignOut", HttpStatusCode.Redirect }
- };
-
- [Theory]
- [MemberData(nameof(AddedEndpointsStatusCodesADB2C))]
- public async Task ADB2CEndpoints_AreAvailable_When_Authentication_IsAdded(string endpoint, HttpStatusCode expectedStatusCode)
- {
- // Act & Assert
- var client = Factory.WithWebHostBuilder(builder => builder.ConfigureTestServices(
- services =>
- {
- services
- .AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
- .AddAzureADB2C(o =>
- {
- o.Instance = "https://login.microsoftonline.com/tfp/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "test.onmicrosoft.com";
- o.SignUpSignInPolicyId = "B2C_1_SiUpIn";
- o.ResetPasswordPolicyId = "B2C_1_SSPR";
- o.EditProfilePolicyId = "B2C_1_SiPe";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, o =>
- {
- o.Configuration = new OpenIdConnectConfiguration()
- {
- Issuer = "https://www.example.com",
- TokenEndpoint = "https://www.example.com/token",
- AuthorizationEndpoint = "https://www.example.com/authorize",
- EndSessionEndpoint = "https://www.example.com/logout"
- };
- });
-
- services.AddMvc(o => o.Filters.Add(
- new AuthorizeFilter(new AuthorizationPolicyBuilder(new[] { AzureADB2CDefaults.AuthenticationScheme })
- .RequireAuthenticatedUser().Build())));
- })).CreateDefaultClient();
-
- var response = await client.GetAsync(endpoint);
-
- // Assert
- Assert.Equal(expectedStatusCode, response.StatusCode);
- }
-
- [Fact]
- public async Task ADB2C_EndToEnd_PasswordReset()
- {
- var client = Factory.WithWebHostBuilder(builder => builder.ConfigureTestServices(
- services =>
- {
- services
- .AddAuthentication(AzureADB2CDefaults.AuthenticationScheme)
- .AddAzureADB2C(o =>
- {
- o.Instance = "https://login.microsoftonline.com/tfp/";
- o.ClientId = "ClientId";
- o.CallbackPath = "/signin-oidc";
- o.Domain = "test.onmicrosoft.com";
- o.SignUpSignInPolicyId = "B2C_1_SiUpIn";
- o.ResetPasswordPolicyId = "B2C_1_SSPR";
- o.EditProfilePolicyId = "B2C_1_SiPe";
- });
-
- services.Configure<OpenIdConnectOptions>(AzureADB2CDefaults.OpenIdScheme, o =>
- {
- o.Configuration = new OpenIdConnectConfiguration()
- {
- Issuer = "https://www.example.com",
- TokenEndpoint = "https://www.example.com/token",
- AuthorizationEndpoint = "https://www.example.com/authorize",
- EndSessionEndpoint = "https://www.example.com/logout"
- };
- // CookieContainer doesn't allow cookies from other paths
- o.CorrelationCookie.Path = "/";
- o.NonceCookie.Path = "/";
- });
-
- services.AddMvc(o => o.Filters.Add(
- new AuthorizeFilter(new AuthorizationPolicyBuilder(new[] { AzureADB2CDefaults.AuthenticationScheme })
- .RequireAuthenticatedUser().Build())));
- })).CreateClient(new WebApplicationFactoryClientOptions() { AllowAutoRedirect = false });
-
- var response = await client.GetAsync("/api/get");
- Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
-
- var location = response.Headers.Location;
- Assert.StartsWith("https://www.example.com/authorize", location.AbsoluteUri);
- var queryString = location.Query;
- var query = QueryHelpers.ParseQuery(queryString);
- var state = query["state"];
- Assert.False(StringValues.IsNullOrEmpty(state));
-
- // Mock Authorization response
- response = await client.GetAsync($"/signin-oidc?error=access_denied&error_description=AADB2C90118&state={state}");
-
- Assert.Equal(HttpStatusCode.Redirect, response.StatusCode);
- Assert.Equal("/AzureADB2C/Account/ResetPassword/AzureADB2C", response.Headers.Location.OriginalString);
- }
-}
diff --git a/src/Azure/AzureAD/test/FunctionalTests/xunit.runner.json b/src/Azure/AzureAD/test/FunctionalTests/xunit.runner.json
deleted file mode 100644
index 42db7ef95e..0000000000
--- a/src/Azure/AzureAD/test/FunctionalTests/xunit.runner.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "shadowCopy": false
-}
diff --git a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/AzureAD.WebSite.csproj b/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/AzureAD.WebSite.csproj
deleted file mode 100644
index c00bf75a2e..0000000000
--- a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/AzureAD.WebSite.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
-
- <PropertyGroup>
- <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- </PropertyGroup>
-
- <ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" />
- <Reference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" />
- <Reference Include="Microsoft.AspNetCore.Authorization" />
- <Reference Include="Microsoft.AspNetCore.DataProtection.Extensions" />
- <Reference Include="Microsoft.AspNetCore" />
- <Reference Include="Microsoft.AspNetCore.Mvc" />
- </ItemGroup>
-
-</Project>
diff --git a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Controllers/TestController.cs b/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Controllers/TestController.cs
deleted file mode 100644
index 824605c321..0000000000
--- a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Controllers/TestController.cs
+++ /dev/null
@@ -1,14 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Authorization;
-using Microsoft.AspNetCore.Mvc;
-
-namespace AzureAD.WebSite.Controllers;
-
-public class TestController : Controller
-{
- [Authorize]
- [HttpGet("/api/get")]
- public IActionResult Get() => Ok();
-}
diff --git a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Program.cs b/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Program.cs
deleted file mode 100644
index b1d9112629..0000000000
--- a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Program.cs
+++ /dev/null
@@ -1,20 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore;
-
-namespace AzureAD.WebSite;
-
-public class Program
-{
- public static void Main(string[] args)
- {
- CreateWebHostBuilder(args).Build().Run();
- }
-
- public static IWebHostBuilder CreateWebHostBuilder(string[] args)
- {
- return WebHost.CreateDefaultBuilder()
- .UseStartup<Startup>();
- }
-}
diff --git a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Startup.cs b/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Startup.cs
deleted file mode 100644
index 72de5fc3b9..0000000000
--- a/src/Azure/AzureAD/test/testassets/AzureAD.WebSite/Startup.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace AzureAD.WebSite;
-
-public class Startup
-{
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddMvc();
- }
-
- public void Configure(IApplicationBuilder app)
- {
- app.UseRouting();
-
- app.UseAuthentication();
- app.UseAuthorization();
-
- app.UseEndpoints(endpoints =>
- {
- endpoints.MapDefaultControllerRoute();
- endpoints.MapRazorPages();
- });
- }
-}
diff --git a/src/Caching/SqlServer/src/DatabaseOperations.cs b/src/Caching/SqlServer/src/DatabaseOperations.cs
index cb6755b20c..04544e600a 100644
--- a/src/Caching/SqlServer/src/DatabaseOperations.cs
+++ b/src/Caching/SqlServer/src/DatabaseOperations.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.Extensions.Caching.SqlServer;
-internal class DatabaseOperations : IDatabaseOperations
+internal sealed class DatabaseOperations : IDatabaseOperations
{
/// <summary>
/// Since there is no specific exception type representing a 'duplicate key' error, we are relying on
@@ -24,11 +24,6 @@ internal class DatabaseOperations : IDatabaseOperations
/// </summary>
private const int DuplicateKeyErrorId = 2627;
- protected const string GetTableSchemaErrorText =
- "Could not retrieve information of table with schema '{0}' and " +
- "name '{1}'. Make sure you have the table setup and try again. " +
- "Connection string: {2}";
-
public DatabaseOperations(
string connectionString, string schemaName, string tableName, ISystemClock systemClock)
{
@@ -39,15 +34,15 @@ internal class DatabaseOperations : IDatabaseOperations
SqlQueries = new SqlQueries(schemaName, tableName);
}
- protected SqlQueries SqlQueries { get; }
+ internal SqlQueries SqlQueries { get; }
- protected string ConnectionString { get; }
+ internal string ConnectionString { get; }
- protected string SchemaName { get; }
+ internal string SchemaName { get; }
- protected string TableName { get; }
+ internal string TableName { get; }
- protected ISystemClock SystemClock { get; }
+ private ISystemClock SystemClock { get; }
public void DeleteCacheItem(string key)
{
@@ -77,12 +72,12 @@ internal class DatabaseOperations : IDatabaseOperations
}
}
- public virtual byte[]? GetCacheItem(string key)
+ public byte[]? GetCacheItem(string key)
{
return GetCacheItem(key, includeValue: true);
}
- public virtual async Task<byte[]?> GetCacheItemAsync(string key, CancellationToken token = default(CancellationToken))
+ public async Task<byte[]?> GetCacheItemAsync(string key, CancellationToken token = default(CancellationToken))
{
token.ThrowIfCancellationRequested();
@@ -101,7 +96,7 @@ internal class DatabaseOperations : IDatabaseOperations
await GetCacheItemAsync(key, includeValue: false, token: token).ConfigureAwait(false);
}
- public virtual void DeleteExpiredCacheItems()
+ public void DeleteExpiredCacheItems()
{
var utcNow = SystemClock.UtcNow;
@@ -116,7 +111,7 @@ internal class DatabaseOperations : IDatabaseOperations
}
}
- public virtual void SetCacheItem(string key, byte[] value, DistributedCacheEntryOptions options)
+ public void SetCacheItem(string key, byte[] value, DistributedCacheEntryOptions options)
{
var utcNow = SystemClock.UtcNow;
@@ -154,7 +149,7 @@ internal class DatabaseOperations : IDatabaseOperations
}
}
- public virtual async Task SetCacheItemAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken))
+ public async Task SetCacheItemAsync(string key, byte[] value, DistributedCacheEntryOptions options, CancellationToken token = default(CancellationToken))
{
token.ThrowIfCancellationRequested();
@@ -194,7 +189,7 @@ internal class DatabaseOperations : IDatabaseOperations
}
}
- protected virtual byte[]? GetCacheItem(string key, bool includeValue)
+ private byte[]? GetCacheItem(string key, bool includeValue)
{
var utcNow = SystemClock.UtcNow;
@@ -238,7 +233,7 @@ internal class DatabaseOperations : IDatabaseOperations
return value;
}
- protected virtual async Task<byte[]?> GetCacheItemAsync(string key, bool includeValue, CancellationToken token = default(CancellationToken))
+ private async Task<byte[]?> GetCacheItemAsync(string key, bool includeValue, CancellationToken token = default(CancellationToken))
{
token.ThrowIfCancellationRequested();
@@ -285,7 +280,7 @@ internal class DatabaseOperations : IDatabaseOperations
return value;
}
- protected static bool IsDuplicateKeyException(SqlException ex)
+ private static bool IsDuplicateKeyException(SqlException ex)
{
if (ex.Errors != null)
{
@@ -294,7 +289,7 @@ internal class DatabaseOperations : IDatabaseOperations
return false;
}
- protected static DateTimeOffset? GetAbsoluteExpiration(DateTimeOffset utcNow, DistributedCacheEntryOptions options)
+ private static DateTimeOffset? GetAbsoluteExpiration(DateTimeOffset utcNow, DistributedCacheEntryOptions options)
{
// calculate absolute expiration
DateTimeOffset? absoluteExpiration = null;
@@ -314,7 +309,7 @@ internal class DatabaseOperations : IDatabaseOperations
return absoluteExpiration;
}
- protected static void ValidateOptions(TimeSpan? slidingExpiration, DateTimeOffset? absoluteExpiration)
+ private static void ValidateOptions(TimeSpan? slidingExpiration, DateTimeOffset? absoluteExpiration)
{
if (!slidingExpiration.HasValue && !absoluteExpiration.HasValue)
{
diff --git a/src/Caching/SqlServer/src/SqlQueries.cs b/src/Caching/SqlServer/src/SqlQueries.cs
index 4806423a76..aef47bd4d5 100644
--- a/src/Caching/SqlServer/src/SqlQueries.cs
+++ b/src/Caching/SqlServer/src/SqlQueries.cs
@@ -5,7 +5,7 @@ using System.Globalization;
namespace Microsoft.Extensions.Caching.SqlServer;
-internal class SqlQueries
+internal sealed class SqlQueries
{
private const string TableInfoFormat =
"SELECT TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE " +
diff --git a/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj b/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj
index f07c6649f3..1cc286f7ad 100644
--- a/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj
+++ b/src/Caching/StackExchangeRedis/src/Microsoft.Extensions.Caching.StackExchangeRedis.csproj
@@ -12,6 +12,7 @@
<ItemGroup>
<Reference Include="Microsoft.Extensions.Caching.Abstractions" />
+ <Reference Include="Microsoft.Extensions.Logging.Abstractions" />
<Reference Include="Microsoft.Extensions.Options" />
<Reference Include="StackExchange.Redis" />
</ItemGroup>
diff --git a/src/Caching/StackExchangeRedis/src/RedisCache.Log.cs b/src/Caching/StackExchangeRedis/src/RedisCache.Log.cs
new file mode 100644
index 0000000000..c20e93f52c
--- /dev/null
+++ b/src/Caching/StackExchangeRedis/src/RedisCache.Log.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.Extensions.Caching.StackExchangeRedis;
+
+public partial class RedisCache
+{
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Warning, "Could not determine the Redis server version. Falling back to use HMSET command instead of HSET.", EventName = "CouldNotDetermineServerVersion")]
+ public static partial void CouldNotDetermineServerVersion(ILogger logger, Exception exception);
+ }
+}
diff --git a/src/Caching/StackExchangeRedis/src/RedisCache.cs b/src/Caching/StackExchangeRedis/src/RedisCache.cs
index 66dd4fadaf..2a309d7f90 100644
--- a/src/Caching/StackExchangeRedis/src/RedisCache.cs
+++ b/src/Caching/StackExchangeRedis/src/RedisCache.cs
@@ -7,6 +7,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using StackExchange.Redis;
@@ -16,7 +17,7 @@ namespace Microsoft.Extensions.Caching.StackExchangeRedis;
/// Distributed cache implementation using Redis.
/// <para>Uses <c>StackExchange.Redis</c> as the Redis client.</para>
/// </summary>
-public class RedisCache : IDistributedCache, IDisposable
+public partial class RedisCache : IDistributedCache, IDisposable
{
// -- Explanation of why two kinds of SetScript are used --
// * Redis 2.0 had HSET key field value for setting individual hash fields,
@@ -58,6 +59,7 @@ public class RedisCache : IDistributedCache, IDisposable
private readonly RedisCacheOptions _options;
private readonly string _instance;
+ private readonly ILogger _logger;
private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(initialCount: 1, maxCount: 1);
@@ -66,13 +68,29 @@ public class RedisCache : IDistributedCache, IDisposable
/// </summary>
/// <param name="optionsAccessor">The configuration options.</param>
public RedisCache(IOptions<RedisCacheOptions> optionsAccessor)
+ : this(optionsAccessor, Logging.Abstractions.NullLoggerFactory.Instance.CreateLogger<RedisCache>())
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of <see cref="RedisCache"/>.
+ /// </summary>
+ /// <param name="optionsAccessor">The configuration options.</param>
+ /// <param name="logger">The logger.</param>
+ internal RedisCache(IOptions<RedisCacheOptions> optionsAccessor, ILogger logger)
{
if (optionsAccessor == null)
{
throw new ArgumentNullException(nameof(optionsAccessor));
}
+ if (logger == null)
+ {
+ throw new ArgumentNullException(nameof(logger));
+ }
+
_options = optionsAccessor.Value;
+ _logger = logger;
// This allows partitioning a single backend cache for use with multiple apps/services.
_instance = _options.InstanceName ?? string.Empty;
@@ -292,14 +310,25 @@ public class RedisCache : IDistributedCache, IDisposable
{
_ = _connection ?? throw new InvalidOperationException($"{nameof(_connection)} cannot be null.");
- foreach (var endPoint in _connection.GetEndPoints())
+ try
{
- if (_connection.GetServer(endPoint).Version < ServerVersionWithExtendedSetCommand)
+ foreach (var endPoint in _connection.GetEndPoints())
{
- _setScript = SetScriptPreExtendedSetCommand;
- return;
+ if (_connection.GetServer(endPoint).Version < ServerVersionWithExtendedSetCommand)
+ {
+ _setScript = SetScriptPreExtendedSetCommand;
+ return;
+ }
}
}
+ catch (NotSupportedException ex)
+ {
+ Log.CouldNotDetermineServerVersion(_logger, ex);
+
+ // The GetServer call may not be supported with some configurations, in which
+ // case let's also fall back to using the older command.
+ _setScript = SetScriptPreExtendedSetCommand;
+ }
}
private void TryRegisterProfiler()
diff --git a/src/Caching/StackExchangeRedis/src/RedisCacheImpl.cs b/src/Caching/StackExchangeRedis/src/RedisCacheImpl.cs
new file mode 100644
index 0000000000..dab5bfc865
--- /dev/null
+++ b/src/Caching/StackExchangeRedis/src/RedisCacheImpl.cs
@@ -0,0 +1,20 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Extensions.Caching.StackExchangeRedis;
+
+internal sealed class RedisCacheImpl : RedisCache
+{
+ public RedisCacheImpl(IOptions<RedisCacheOptions> optionsAccessor, ILogger<RedisCache> logger)
+ : base(optionsAccessor, logger)
+ {
+ }
+
+ public RedisCacheImpl(IOptions<RedisCacheOptions> optionsAccessor)
+ : base(optionsAccessor)
+ {
+ }
+}
diff --git a/src/Caching/StackExchangeRedis/src/StackExchangeRedisCacheServiceCollectionExtensions.cs b/src/Caching/StackExchangeRedis/src/StackExchangeRedisCacheServiceCollectionExtensions.cs
index 4d2b3c71c2..061bde7f61 100644
--- a/src/Caching/StackExchangeRedis/src/StackExchangeRedisCacheServiceCollectionExtensions.cs
+++ b/src/Caching/StackExchangeRedis/src/StackExchangeRedisCacheServiceCollectionExtensions.cs
@@ -32,8 +32,9 @@ public static class StackExchangeRedisCacheServiceCollectionExtensions
}
services.AddOptions();
+
services.Configure(setupAction);
- services.Add(ServiceDescriptor.Singleton<IDistributedCache, RedisCache>());
+ services.Add(ServiceDescriptor.Singleton<IDistributedCache, RedisCacheImpl>());
return services;
}
diff --git a/src/Caching/StackExchangeRedis/test/CacheServiceExtensionsTests.cs b/src/Caching/StackExchangeRedis/test/CacheServiceExtensionsTests.cs
index d2ceab0c7c..29a49a7cec 100644
--- a/src/Caching/StackExchangeRedis/test/CacheServiceExtensionsTests.cs
+++ b/src/Caching/StackExchangeRedis/test/CacheServiceExtensionsTests.cs
@@ -4,6 +4,8 @@
using System.Linq;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
using Moq;
using Xunit;
@@ -44,7 +46,7 @@ public class CacheServiceExtensionsTests
Assert.NotNull(distributedCache);
Assert.Equal(ServiceLifetime.Scoped, distributedCache.Lifetime);
- Assert.IsType<RedisCache>(serviceProvider.GetRequiredService<IDistributedCache>());
+ Assert.IsAssignableFrom<RedisCache>(serviceProvider.GetRequiredService<IDistributedCache>());
}
[Fact]
@@ -54,4 +56,69 @@ public class CacheServiceExtensionsTests
Assert.Same(services, services.AddStackExchangeRedisCache(_ => { }));
}
+
+ [Fact]
+ public void AddStackExchangeRedisCache_IDistributedCacheWithoutLoggingCanBeResolved()
+ {
+ // Arrange
+ var services = new ServiceCollection();
+
+ // Act
+ services.AddStackExchangeRedisCache(options => { });
+
+ // Assert
+ using var serviceProvider = services.BuildServiceProvider();
+ var distributedCache = serviceProvider.GetRequiredService<IDistributedCache>();
+
+ Assert.NotNull(distributedCache);
+ }
+
+ [Fact]
+ public void AddStackExchangeRedisCache_IDistributedCacheWithLoggingCanBeResolved()
+ {
+ // Arrange
+ var services = new ServiceCollection();
+
+ // Act
+ services.AddStackExchangeRedisCache(options => { });
+ services.AddLogging();
+
+ // Assert
+ using var serviceProvider = services.BuildServiceProvider();
+ var distributedCache = serviceProvider.GetRequiredService<IDistributedCache>();
+
+ Assert.NotNull(distributedCache);
+ }
+
+ [Fact]
+ public void AddStackExchangeRedisCache_UsesLoggerFactoryAlreadyRegisteredWithServiceCollection()
+ {
+ // Arrange
+ var services = new ServiceCollection();
+ services.AddScoped(typeof(IDistributedCache), sp => Mock.Of<IDistributedCache>());
+
+ var loggerFactory = new Mock<ILoggerFactory>();
+
+ loggerFactory
+ .Setup(lf => lf.CreateLogger(It.IsAny<string>()))
+ .Returns((string name) => NullLoggerFactory.Instance.CreateLogger(name))
+ .Verifiable();
+
+ services.AddScoped(typeof(ILoggerFactory), _ => loggerFactory.Object);
+
+ // Act
+ services.AddLogging();
+ services.AddStackExchangeRedisCache(options => { });
+
+ // Assert
+ var serviceProvider = services.BuildServiceProvider();
+
+ var distributedCache = services.FirstOrDefault(desc => desc.ServiceType == typeof(IDistributedCache));
+
+ Assert.NotNull(distributedCache);
+ Assert.Equal(ServiceLifetime.Scoped, distributedCache.Lifetime);
+ Assert.IsAssignableFrom<RedisCache>(serviceProvider.GetRequiredService<IDistributedCache>());
+
+ loggerFactory.Verify();
+ }
}
diff --git a/src/Components/Analyzers/src/ComponentSymbols.cs b/src/Components/Analyzers/src/ComponentSymbols.cs
index f1fb2233da..ccdca61d97 100644
--- a/src/Components/Analyzers/src/ComponentSymbols.cs
+++ b/src/Components/Analyzers/src/ComponentSymbols.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Components.Analyzers;
-internal class ComponentSymbols
+internal sealed class ComponentSymbols
{
public static bool TryCreate(Compilation compilation, out ComponentSymbols symbols)
{
diff --git a/src/Components/Analyzers/src/InternalUsageAnalyzer.cs b/src/Components/Analyzers/src/InternalUsageAnalyzer.cs
index fe6ce82a35..264ec4bcc2 100644
--- a/src/Components/Analyzers/src/InternalUsageAnalyzer.cs
+++ b/src/Components/Analyzers/src/InternalUsageAnalyzer.cs
@@ -9,7 +9,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.Extensions.Internal;
-internal class InternalUsageAnalyzer
+internal sealed class InternalUsageAnalyzer
{
private readonly Func<ISymbol, bool> _isInternalNamespace;
private readonly Func<ISymbol, bool> _hasInternalAttribute;
diff --git a/src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs b/src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs
index f020e0a221..8dde75a736 100644
--- a/src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs
+++ b/src/Components/Analyzers/test/Verifiers/DiagnosticVerifier.cs
@@ -169,13 +169,13 @@ public abstract partial class DiagnosticVerifier
expected.Severity, actual.Severity, FormatDiagnostics(analyzer, actual)));
}
- if (actual.GetMessage() != expected.Message)
+ if (actual.GetMessage(CultureInfo.InvariantCulture) != expected.Message)
{
Assert.True(false,
string.Format(
CultureInfo.InvariantCulture,
"Expected diagnostic message to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n",
- expected.Message, actual.GetMessage(), FormatDiagnostics(analyzer, actual)));
+ expected.Message, actual.GetMessage(CultureInfo.InvariantCulture), FormatDiagnostics(analyzer, actual)));
}
}
}
diff --git a/src/Components/Authorization/src/AuthorizeDataAdapter.cs b/src/Components/Authorization/src/AuthorizeDataAdapter.cs
index 874d753257..ceffbf17d0 100644
--- a/src/Components/Authorization/src/AuthorizeDataAdapter.cs
+++ b/src/Components/Authorization/src/AuthorizeDataAdapter.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Authorization;
namespace Microsoft.AspNetCore.Components.Authorization;
// This is so the AuthorizeView can avoid implementing IAuthorizeData (even privately)
-internal class AuthorizeDataAdapter : IAuthorizeData
+internal sealed class AuthorizeDataAdapter : IAuthorizeData
{
private readonly AuthorizeView _component;
diff --git a/src/Components/Authorization/src/AuthorizeRouteView.cs b/src/Components/Authorization/src/AuthorizeRouteView.cs
index 05a7749225..137b999e4d 100644
--- a/src/Components/Authorization/src/AuthorizeRouteView.cs
+++ b/src/Components/Authorization/src/AuthorizeRouteView.cs
@@ -99,6 +99,8 @@ public sealed class AuthorizeRouteView : RouteView
Justification = "OpenComponent already has the right set of attributes")]
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2110:RequiresUnreferencedCode",
Justification = "OpenComponent already has the right set of attributes")]
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2118:RequiresUnreferencedCode",
+ Justification = "OpenComponent already has the right set of attributes")]
private void RenderContentInDefaultLayout(RenderTreeBuilder builder, RenderFragment content)
{
builder.OpenComponent<LayoutView>(0);
diff --git a/src/Components/Components.slnf b/src/Components/Components.slnf
index d867f6dc47..04fdac617c 100644
--- a/src/Components/Components.slnf
+++ b/src/Components/Components.slnf
@@ -11,6 +11,7 @@
"src\\Components\\Components\\perf\\Microsoft.AspNetCore.Components.Performance.csproj",
"src\\Components\\Components\\src\\Microsoft.AspNetCore.Components.csproj",
"src\\Components\\Components\\test\\Microsoft.AspNetCore.Components.Tests.csproj",
+ "src\\Components\\CustomElements\\src\\Microsoft.AspNetCore.Components.CustomElements.csproj",
"src\\Components\\Forms\\src\\Microsoft.AspNetCore.Components.Forms.csproj",
"src\\Components\\Forms\\test\\Microsoft.AspNetCore.Components.Forms.Tests.csproj",
"src\\Components\\Samples\\BlazorServerApp\\BlazorServerApp.csproj",
@@ -140,4 +141,4 @@
"src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj"
]
}
-} \ No newline at end of file
+}
diff --git a/src/Components/Components/perf/RenderTreeDiffBuilderBenchmark.cs b/src/Components/Components/perf/RenderTreeDiffBuilderBenchmark.cs
index 20c8dfa744..172dc920d2 100644
--- a/src/Components/Components/perf/RenderTreeDiffBuilderBenchmark.cs
+++ b/src/Components/Components/perf/RenderTreeDiffBuilderBenchmark.cs
@@ -83,7 +83,7 @@ public class RenderTreeDiffBuilderBenchmark
GC.KeepAlive(diff);
}
- private class FakeRenderer : Renderer
+ private sealed class FakeRenderer : Renderer
{
public FakeRenderer()
: base(new TestServiceProvider(), NullLoggerFactory.Instance)
@@ -101,7 +101,7 @@ public class RenderTreeDiffBuilderBenchmark
=> Task.CompletedTask;
}
- private class TestServiceProvider : IServiceProvider
+ private sealed class TestServiceProvider : IServiceProvider
{
public object GetService(Type serviceType)
{
diff --git a/src/Components/Components/src/BindConverter.cs b/src/Components/Components/src/BindConverter.cs
index bffc60a76e..dffc03107d 100644
--- a/src/Components/Components/src/BindConverter.cs
+++ b/src/Components/Components/src/BindConverter.cs
@@ -1826,6 +1826,7 @@ public static class BindConverter
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect unknown underlying types are configured by application code to be retained.")]
private static BindFormatter<T> MakeTypeConverterFormatter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>()
{
var typeConverter = TypeDescriptor.GetConverter(typeof(T));
@@ -2028,6 +2029,7 @@ public static class BindConverter
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect unknown underlying types are configured by application code to be retained.")]
private static BindParser<T> MakeTypeConverterConverter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>()
{
var typeConverter = TypeDescriptor.GetConverter(typeof(T));
diff --git a/src/Components/Components/src/CascadingParameterState.cs b/src/Components/Components/src/CascadingParameterState.cs
index 1296f251c2..0430fbe9ae 100644
--- a/src/Components/Components/src/CascadingParameterState.cs
+++ b/src/Components/Components/src/CascadingParameterState.cs
@@ -6,6 +6,7 @@ using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.AspNetCore.Components.Reflection;
using Microsoft.AspNetCore.Components.Rendering;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components;
@@ -75,7 +76,7 @@ internal readonly struct CascadingParameterState
}
private static ReflectedCascadingParameterInfo[] GetReflectedCascadingParameterInfos(
- [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type componentType)
+ [DynamicallyAccessedMembers(Component)] Type componentType)
{
if (!_cachedInfos.TryGetValue(componentType, out var infos))
{
@@ -87,7 +88,7 @@ internal readonly struct CascadingParameterState
}
private static ReflectedCascadingParameterInfo[] CreateReflectedCascadingParameterInfos(
- [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties)] Type componentType)
+ [DynamicallyAccessedMembers(Component)] Type componentType)
{
List<ReflectedCascadingParameterInfo>? result = null;
var candidateProps = ComponentProperties.GetCandidateBindableProperties(componentType);
diff --git a/src/Components/Components/src/ChangeDetection.cs b/src/Components/Components/src/ChangeDetection.cs
index 0228350dd8..68351d6346 100644
--- a/src/Components/Components/src/ChangeDetection.cs
+++ b/src/Components/Components/src/ChangeDetection.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components;
-internal class ChangeDetection
+internal sealed class ChangeDetection
{
public static bool MayHaveChanged<T1, T2>(T1 oldValue, T2 newValue)
{
diff --git a/src/Components/Components/src/CompilerServices/RuntimeHelpers.cs b/src/Components/Components/src/CompilerServices/RuntimeHelpers.cs
index 8404807e4c..8abdc5faf0 100644
--- a/src/Components/Components/src/CompilerServices/RuntimeHelpers.cs
+++ b/src/Components/Components/src/CompilerServices/RuntimeHelpers.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Runtime.CompilerServices;
+
namespace Microsoft.AspNetCore.Components.CompilerServices;
/// <summary>
@@ -50,4 +52,76 @@ public static class RuntimeHelpers
{
return EventCallback.Factory.Create<T>(receiver, callback);
}
+
+ /// <summary>
+ /// Not intended for use by application code.
+ /// </summary>
+ /// <param name="receiver"></param>
+ /// <param name="callback"></param>
+ /// <param name="value"></param>
+ /// <returns></returns>
+ //
+ // This method is used with `@bind-Value` for components. When a component has a generic type, it's
+ // really messy to write the parameter type for ValueChanged - because it can contain generic
+ // type parameters. We're using a trick of type inference to generate the proper typing for the delegate
+ // so that method-group-to-delegate conversion works.
+ public static EventCallback<T> CreateInferredEventCallback<T>(object receiver, EventCallback<T> callback, T value)
+ {
+ return EventCallback.Factory.Create<T>(receiver, callback);
+ }
+
+ /// <summary>
+ /// Not intended for use by application code.
+ /// </summary>
+ /// <param name="callback"></param>
+ /// <returns></returns>
+ //
+ // This method is used with `@bind-Value:after` for components. When :after is provided we don't know the
+ // type of the expression provided by the developer or if we can invoke it directly, as it can be a lambda
+ // and unlike in JavaScript, C# doesn't support Immediately Invoked Function Expressions so we need to pass
+ // the expression to this helper method and invoke it inside.
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void InvokeSynchronousDelegate(Action callback)
+ {
+ callback();
+ }
+
+ /// <summary>
+ /// Not intended for use by application code.
+ /// </summary>
+ /// <param name="callback"></param>
+ /// <returns></returns>
+ //
+ // This method is used with `@bind-Value:after` for components. When :after is provided we don't know the
+ // type of the expression provided by the developer or if we can invoke it directly, as it can be a lambda
+ // and unlike in JavaScript, C# doesn't support Immediately Invoked Function Expressions so we need to pass
+ // the expression to this helper method and invoke it inside.
+ // In addition to that, when the receiving target delegate property result is awaitable, we can receive either
+ // an Action or a Func<Task> and we don't have that information at compile time, so we use this helper to
+ // normalize both operations into a Task in the same way we do for EventCallback
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static Task InvokeAsynchronousDelegate(Action callback)
+ {
+ callback();
+ return Task.CompletedTask;
+ }
+
+ /// <summary>
+ /// Not intended for use by application code.
+ /// </summary>
+ /// <param name="callback"></param>
+ /// <returns></returns>
+ //
+ // This method is used with `@bind-Value:after` for components. When :after is provided we don't know the
+ // type of the expression provided by the developer or if we can invoke it directly, as it can be a lambda
+ // and unlike in JavaScript, C# doesn't support Immediately Invoked Function Expressions so we need to pass
+ // the expression to this helper method and invoke it inside.
+ // In addition to that, when the receiving target delegate property result is awaitable, we can receive either
+ // an Action or a Func<Task> and we don't have that information at compile time, so we use this helper to
+ // normalize both operations into a Task in the same way we do for EventCallback
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static Task InvokeAsynchronousDelegate(Func<Task> callback)
+ {
+ return callback();
+ }
}
diff --git a/src/Components/Components/src/DefaultComponentActivator.cs b/src/Components/Components/src/DefaultComponentActivator.cs
index 9ce7781a92..d57ff19e2a 100644
--- a/src/Components/Components/src/DefaultComponentActivator.cs
+++ b/src/Components/Components/src/DefaultComponentActivator.cs
@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.Components;
-internal class DefaultComponentActivator : IComponentActivator
+internal sealed class DefaultComponentActivator : IComponentActivator
{
public static IComponentActivator Instance { get; } = new DefaultComponentActivator();
diff --git a/src/Components/Components/src/DynamicComponent.cs b/src/Components/Components/src/DynamicComponent.cs
index 2941b024a4..35252350bb 100644
--- a/src/Components/Components/src/DynamicComponent.cs
+++ b/src/Components/Components/src/DynamicComponent.cs
@@ -59,6 +59,7 @@ public class DynamicComponent : IComponent
}
/// <inheritdoc />
+ [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "We expect that types used with DynamicComponent will be defined in assemblies that don't get trimmed.")]
public Task SetParametersAsync(ParameterView parameters)
{
// This manual parameter assignment logic will be marginally faster than calling
diff --git a/src/Components/Components/src/EventCallbackFactoryBinderExtensions.cs b/src/Components/Components/src/EventCallbackFactoryBinderExtensions.cs
index 733c80e6e4..42328e8f8f 100644
--- a/src/Components/Components/src/EventCallbackFactoryBinderExtensions.cs
+++ b/src/Components/Components/src/EventCallbackFactoryBinderExtensions.cs
@@ -55,6 +55,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<string?> setter,
+ string existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<string?>(factory, receiver, setter, culture, ConvertToString);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<bool> setter,
bool existingValue,
CultureInfo? culture = null)
@@ -73,6 +93,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<bool> setter,
+ bool existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<bool>(factory, receiver, setter, culture, ConvertToBool);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
Action<bool?> setter,
@@ -95,6 +135,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<bool?> setter,
+ bool? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<bool?>(factory, receiver, setter, culture, ConvertToNullableBool);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<int> setter,
int existingValue,
CultureInfo? culture = null)
@@ -115,6 +175,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<int> setter,
+ int existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<int>(factory, receiver, setter, culture, ConvertToInt);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<int?> setter,
int? existingValue,
CultureInfo? culture = null)
@@ -135,6 +215,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<int?> setter,
+ int? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<int?>(factory, receiver, setter, culture, ConvertToNullableInt);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<long> setter,
long existingValue,
CultureInfo? culture = null)
@@ -155,6 +255,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<long> setter,
+ long existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<long>(factory, receiver, setter, culture, ConvertToLong);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<short> setter,
short existingValue,
CultureInfo? culture = null)
@@ -175,6 +295,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<short> setter,
+ short existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<short>(factory, receiver, setter, culture, ConvertToShort);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<long?> setter,
long? existingValue,
CultureInfo? culture = null)
@@ -195,6 +335,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<long?> setter,
+ long? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<long?>(factory, receiver, setter, culture, ConvertToNullableLong);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<short?> setter,
short? existingValue,
CultureInfo? culture = null)
@@ -215,6 +375,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<short?> setter,
+ short? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<short?>(factory, receiver, setter, culture, ConvertToNullableShort);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<float> setter,
float existingValue,
CultureInfo? culture = null)
@@ -235,6 +415,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<float> setter,
+ float existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<float>(factory, receiver, setter, culture, ConvertToFloat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<float?> setter,
float? existingValue,
CultureInfo? culture = null)
@@ -255,6 +455,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<float?> setter,
+ float? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<float?>(factory, receiver, setter, culture, ConvertToNullableFloat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<double> setter,
double existingValue,
CultureInfo? culture = null)
@@ -275,6 +495,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<double> setter,
+ double existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<double>(factory, receiver, setter, culture, ConvertToDoubleDelegate);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<double?> setter,
double? existingValue,
CultureInfo? culture = null)
@@ -295,6 +535,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<double?> setter,
+ double? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<double?>(factory, receiver, setter, culture, ConvertToNullableDoubleDelegate);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<decimal> setter,
decimal existingValue,
CultureInfo? culture = null)
@@ -315,6 +575,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<decimal> setter,
+ decimal existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<decimal>(factory, receiver, setter, culture, ConvertToDecimal);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<decimal?> setter,
decimal? existingValue,
CultureInfo? culture = null)
@@ -335,6 +615,26 @@ public static class EventCallbackFactoryBinderExtensions
public static EventCallback<ChangeEventArgs> CreateBinder(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<decimal?> setter,
+ decimal? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<decimal?>(factory, receiver, setter, culture, ConvertToNullableDecimal);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
Action<DateTime> setter,
DateTime existingValue,
CultureInfo? culture = null)
@@ -349,6 +649,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTime> setter,
+ DateTime existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTime>(factory, receiver, setter, culture, ConvertToDateTime);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -371,6 +691,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTime> setter,
+ DateTime existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTime>(factory, receiver, setter, culture, format, ConvertToDateTimeWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -391,6 +733,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTime?> setter,
+ DateTime? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTime?>(factory, receiver, setter, culture, ConvertToNullableDateTime);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -413,6 +775,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTime?> setter,
+ DateTime? existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTime?>(factory, receiver, setter, culture, format, ConvertToNullableDateTimeWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -433,6 +817,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTimeOffset> setter,
+ DateTimeOffset existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTimeOffset>(factory, receiver, setter, culture, ConvertToDateTimeOffset);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -455,6 +859,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTimeOffset> setter,
+ DateTimeOffset existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTimeOffset>(factory, receiver, setter, culture, format, ConvertToDateTimeOffsetWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -475,6 +901,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTimeOffset?> setter,
+ DateTimeOffset? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTimeOffset?>(factory, receiver, setter, culture, ConvertToNullableDateTimeOffset);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -497,6 +943,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateTimeOffset?> setter,
+ DateTimeOffset? existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateTimeOffset?>(factory, receiver, setter, culture, format, ConvertToNullableDateTimeOffsetWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -517,6 +985,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateOnly> setter,
+ DateOnly existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateOnly>(factory, receiver, setter, culture, ConvertToDateOnly);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -539,6 +1027,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateOnly> setter,
+ DateOnly existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateOnly>(factory, receiver, setter, culture, format, ConvertToDateOnlyWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -559,6 +1069,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateOnly?> setter,
+ DateOnly? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateOnly?>(factory, receiver, setter, culture, ConvertToNullableDateOnly);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -581,6 +1111,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<DateOnly?> setter,
+ DateOnly? existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<DateOnly?>(factory, receiver, setter, culture, format, ConvertToNullableDateOnlyWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -601,6 +1153,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<TimeOnly> setter,
+ TimeOnly existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<TimeOnly>(factory, receiver, setter, culture, ConvertToTimeOnly);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -623,6 +1195,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<TimeOnly> setter,
+ TimeOnly existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<TimeOnly>(factory, receiver, setter, culture, format, ConvertToTimeOnlyWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="culture"></param>
/// <returns></returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
@@ -643,6 +1237,26 @@ public static class EventCallbackFactoryBinderExtensions
/// <param name="receiver"></param>
/// <param name="setter"></param>
/// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<TimeOnly?> setter,
+ TimeOnly? existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<TimeOnly?>(factory, receiver, setter, culture, ConvertToNullableTimeOnly);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
/// <param name="format"></param>
/// <param name="culture"></param>
/// <returns></returns>
@@ -661,6 +1275,28 @@ public static class EventCallbackFactoryBinderExtensions
/// <summary>
/// For internal use only.
/// </summary>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="format"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<TimeOnly?> setter,
+ TimeOnly? existingValue,
+ string format,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<TimeOnly?>(factory, receiver, setter, culture, format, ConvertToNullableTimeOnlyWithFormat);
+ }
+
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="factory"></param>
/// <param name="receiver"></param>
@@ -679,6 +1315,27 @@ public static class EventCallbackFactoryBinderExtensions
return CreateBinderCore<T>(factory, receiver, setter, culture, ParserDelegateCache.Get<T>());
}
+ /// <summary>
+ /// For internal use only.
+ /// </summary>
+ /// <typeparam name="T"></typeparam>
+ /// <param name="factory"></param>
+ /// <param name="receiver"></param>
+ /// <param name="setter"></param>
+ /// <param name="existingValue"></param>
+ /// <param name="culture"></param>
+ /// <returns></returns>
+ [SuppressMessage("ApiDesign", "RS0026:Do not add multiple public overloads with optional parameters", Justification = "Required to maintain compatibility")]
+ public static EventCallback<ChangeEventArgs> CreateBinder<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] T>(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<T> setter,
+ T existingValue,
+ CultureInfo? culture = null)
+ {
+ return CreateBinderCore<T>(factory, receiver, setter, culture, ParserDelegateCache.Get<T>());
+ }
+
private static EventCallback<ChangeEventArgs> CreateBinderCore<T>(
this EventCallbackFactory factory,
object receiver,
@@ -725,6 +1382,49 @@ public static class EventCallbackFactoryBinderExtensions
private static EventCallback<ChangeEventArgs> CreateBinderCore<T>(
this EventCallbackFactory factory,
object receiver,
+ EventCallback<T> setter,
+ CultureInfo? culture,
+ BindConverter.BindParser<T> converter)
+ {
+ Func<ChangeEventArgs, Task> callback = async e =>
+ {
+ T? value = default;
+ var converted = false;
+ try
+ {
+ converted = converter(e.Value, culture, out value);
+ }
+ catch
+ {
+ }
+
+ // We only invoke the setter if the conversion didn't throw, or if the newly-entered value is empty.
+ // If the user entered some non-empty value we couldn't parse, we leave the state of the .NET field
+ // unchanged, which for a two-way binding results in the UI reverting to its previous valid state
+ // because the diff will see the current .NET output no longer matches the render tree since we
+ // patched it to reflect the state of the UI.
+ //
+ // This reversion behavior is valuable because alternatives are problematic:
+ // - If we assigned default(T) on failure, the user would lose whatever data they were editing,
+ // for example if they accidentally pressed an alphabetical key while editing a number with
+ // @bind:event="oninput"
+ // - If the diff mechanism didn't revert to the previous good value, the user wouldn't necessarily
+ // know that the data they are submitting is different from what they think they've typed
+ if (converted)
+ {
+ await setter.InvokeAsync(value!);
+ }
+ else if (string.Empty.Equals(e.Value))
+ {
+ await setter.InvokeAsync(default!);
+ }
+ };
+ return factory.Create<ChangeEventArgs>(receiver, callback);
+ }
+
+ private static EventCallback<ChangeEventArgs> CreateBinderCore<T>(
+ this EventCallbackFactory factory,
+ object receiver,
Action<T> setter,
CultureInfo? culture,
string format,
@@ -765,4 +1465,48 @@ public static class EventCallbackFactoryBinderExtensions
};
return factory.Create<ChangeEventArgs>(receiver, callback);
}
+
+ private static EventCallback<ChangeEventArgs> CreateBinderCore<T>(
+ this EventCallbackFactory factory,
+ object receiver,
+ EventCallback<T> setter,
+ CultureInfo? culture,
+ string format,
+ BindConverter.BindParserWithFormat<T> converter)
+ {
+ Func<ChangeEventArgs, Task> callback = async e =>
+ {
+ T? value = default;
+ var converted = false;
+ try
+ {
+ converted = converter(e.Value, culture, format, out value);
+ }
+ catch
+ {
+ }
+
+ // We only invoke the setter if the conversion didn't throw, or if the newly-entered value is empty.
+ // If the user entered some non-empty value we couldn't parse, we leave the state of the .NET field
+ // unchanged, which for a two-way binding results in the UI reverting to its previous valid state
+ // because the diff will see the current .NET output no longer matches the render tree since we
+ // patched it to reflect the state of the UI.
+ //
+ // This reversion behavior is valuable because alternatives are problematic:
+ // - If we assigned default(T) on failure, the user would lose whatever data they were editing,
+ // for example if they accidentally pressed an alphabetical key while editing a number with
+ // @bind:event="oninput"
+ // - If the diff mechanism didn't revert to the previous good value, the user wouldn't necessarily
+ // know that the data they are submitting is different from what they think they've typed
+ if (converted)
+ {
+ await setter.InvokeAsync(value!);
+ }
+ else if (string.Empty.Equals(e.Value))
+ {
+ await setter.InvokeAsync(default!);
+ }
+ };
+ return factory.Create<ChangeEventArgs>(receiver, callback);
+ }
}
diff --git a/src/Components/Components/src/LayoutAttribute.cs b/src/Components/Components/src/LayoutAttribute.cs
index e5f7baa9d2..b7249f82c6 100644
--- a/src/Components/Components/src/LayoutAttribute.cs
+++ b/src/Components/Components/src/LayoutAttribute.cs
@@ -1,6 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
+
namespace Microsoft.AspNetCore.Components;
/// <summary>
@@ -13,7 +16,7 @@ public sealed class LayoutAttribute : Attribute
/// Constructs an instance of <see cref="LayoutAttribute"/>.
/// </summary>
/// <param name="layoutType">The type of the layout.</param>
- public LayoutAttribute(Type layoutType)
+ public LayoutAttribute([DynamicallyAccessedMembers(Component)] Type layoutType)
{
LayoutType = layoutType ?? throw new ArgumentNullException(nameof(layoutType));
diff --git a/src/Components/Components/src/LayoutView.cs b/src/Components/Components/src/LayoutView.cs
index de5025d6cc..60fa323cd9 100644
--- a/src/Components/Components/src/LayoutView.cs
+++ b/src/Components/Components/src/LayoutView.cs
@@ -46,6 +46,7 @@ public class LayoutView : IComponent
return Task.CompletedTask;
}
+ [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "Layout components are preserved because the LayoutAttribute constructor parameter is correctly annotated.")]
private void Render()
{
// In the middle goes the supplied content
diff --git a/src/Components/Components/src/NavigationManager.cs b/src/Components/Components/src/NavigationManager.cs
index 88052761e3..4344cc9737 100644
--- a/src/Components/Components/src/NavigationManager.cs
+++ b/src/Components/Components/src/NavigationManager.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Buffers;
using Microsoft.AspNetCore.Components.Routing;
namespace Microsoft.AspNetCore.Components;
@@ -10,6 +11,8 @@ namespace Microsoft.AspNetCore.Components;
/// </summary>
public abstract class NavigationManager
{
+ private static readonly char[] UriPathEndChar = new[] { '#', '?' };
+
/// <summary>
/// An event that fires when the navigation location has changed.
/// </summary>
@@ -29,13 +32,16 @@ public abstract class NavigationManager
private EventHandler<LocationChangedEventArgs>? _locationChanged;
+ private readonly List<Func<LocationChangingContext, ValueTask>> _locationChangingHandlers = new();
+
+ private CancellationTokenSource? _locationChangingCts;
+
// For the baseUri it's worth storing as a System.Uri so we can do operations
// on that type. System.Uri gives us access to the original string anyway.
private Uri? _baseUri;
// The URI. Always represented an absolute URI.
private string? _uri;
-
private bool _isInitialized;
/// <summary>
@@ -84,6 +90,14 @@ public abstract class NavigationManager
}
/// <summary>
+ /// Gets or sets the state associated with the current navigation.
+ /// </summary>
+ /// <remarks>
+ /// Setting <see cref="HistoryEntryState" /> will not trigger the <see cref="LocationChanged" /> event.
+ /// </remarks>
+ public string? HistoryEntryState { get; protected set; }
+
+ /// <summary>
/// Navigates to the specified URI.
/// </summary>
/// <param name="uri">The destination URI. This can be absolute, or relative to the base URI
@@ -217,9 +231,9 @@ public abstract class NavigationManager
return uri.Substring(_baseUri.OriginalString.Length);
}
- var hashIndex = uri.IndexOf('#');
- var uriWithoutHash = hashIndex < 0 ? uri : uri.Substring(0, hashIndex);
- if ($"{uriWithoutHash}/".Equals(_baseUri.OriginalString, StringComparison.Ordinal))
+ var pathEndIndex = uri.IndexOfAny(UriPathEndChar);
+ var uriPathOnly = pathEndIndex < 0 ? uri : uri.Substring(0, pathEndIndex);
+ if ($"{uriPathOnly}/".Equals(_baseUri.OriginalString, StringComparison.Ordinal))
{
// Special case: for the base URI "/something/", if you're at
// "/something" then treat it as if you were at "/something/" (i.e.,
@@ -252,7 +266,12 @@ public abstract class NavigationManager
{
try
{
- _locationChanged?.Invoke(this, new LocationChangedEventArgs(_uri!, isInterceptedLink));
+ _locationChanged?.Invoke(
+ this,
+ new LocationChangedEventArgs(_uri!, isInterceptedLink)
+ {
+ HistoryEntryState = HistoryEntryState
+ });
}
catch (Exception ex)
{
@@ -260,6 +279,201 @@ public abstract class NavigationManager
}
}
+ /// <summary>
+ /// Notifies the registered handlers of the current location change.
+ /// </summary>
+ /// <param name="uri">The destination URI. This can be absolute, or relative to the base URI.</param>
+ /// <param name="state">The state associated with the target history entry.</param>
+ /// <param name="isNavigationIntercepted">Whether this navigation was intercepted from a link.</param>
+ /// <returns>A <see cref="ValueTask{TResult}"/> representing the completion of the operation. If the result is <see langword="true"/>, the navigation should continue.</returns>
+ protected async ValueTask<bool> NotifyLocationChangingAsync(string uri, string? state, bool isNavigationIntercepted)
+ {
+ _locationChangingCts?.Cancel();
+ _locationChangingCts = null;
+
+ var handlerCount = _locationChangingHandlers.Count;
+
+ if (handlerCount == 0)
+ {
+ return true;
+ }
+
+ var cts = new CancellationTokenSource();
+
+ _locationChangingCts = cts;
+
+ var cancellationToken = cts.Token;
+ var context = new LocationChangingContext
+ {
+ TargetLocation = uri,
+ HistoryEntryState = state,
+ IsNavigationIntercepted = isNavigationIntercepted,
+ CancellationToken = cancellationToken,
+ };
+
+ try
+ {
+ if (handlerCount == 1)
+ {
+ var handlerTask = InvokeLocationChangingHandlerAsync(_locationChangingHandlers[0], context);
+
+ if (handlerTask.IsFaulted)
+ {
+ await handlerTask;
+ return false; // Unreachable because the previous line will throw.
+ }
+
+ if (context.DidPreventNavigation)
+ {
+ return false;
+ }
+
+ if (!handlerTask.IsCompletedSuccessfully)
+ {
+ await handlerTask.AsTask().WaitAsync(cancellationToken);
+ }
+ }
+ else
+ {
+ var locationChangingHandlersCopy = ArrayPool<Func<LocationChangingContext, ValueTask>>.Shared.Rent(handlerCount);
+
+ try
+ {
+ _locationChangingHandlers.CopyTo(locationChangingHandlersCopy);
+
+ var locationChangingTasks = new HashSet<Task>();
+
+ for (var i = 0; i < handlerCount; i++)
+ {
+ var handlerTask = InvokeLocationChangingHandlerAsync(locationChangingHandlersCopy[i], context);
+
+ if (handlerTask.IsFaulted)
+ {
+ await handlerTask;
+ return false; // Unreachable because the previous line will throw.
+ }
+
+ if (context.DidPreventNavigation)
+ {
+ return false;
+ }
+
+ locationChangingTasks.Add(handlerTask.AsTask());
+ }
+
+ while (locationChangingTasks.Count != 0)
+ {
+ var completedHandlerTask = await Task.WhenAny(locationChangingTasks).WaitAsync(cancellationToken);
+
+ if (completedHandlerTask.IsFaulted)
+ {
+ await completedHandlerTask;
+ return false; // Unreachable because the previous line will throw.
+ }
+
+ if (context.DidPreventNavigation)
+ {
+ return false;
+ }
+
+ locationChangingTasks.Remove(completedHandlerTask);
+ }
+ }
+ finally
+ {
+ ArrayPool<Func<LocationChangingContext, ValueTask>>.Shared.Return(locationChangingHandlersCopy);
+ }
+ }
+
+ return !context.DidPreventNavigation;
+ }
+ catch (TaskCanceledException ex)
+ {
+ if (ex.CancellationToken == cancellationToken)
+ {
+ // This navigation was in progress when a successive navigation occurred.
+ // We treat this as a canceled navigation.
+ return false;
+ }
+
+ throw;
+ }
+ finally
+ {
+ cts.Cancel();
+ cts.Dispose();
+
+ if (_locationChangingCts == cts)
+ {
+ _locationChangingCts = null;
+ }
+ }
+ }
+
+ private async ValueTask InvokeLocationChangingHandlerAsync(Func<LocationChangingContext, ValueTask> handler, LocationChangingContext context)
+ {
+ try
+ {
+ await handler(context);
+ }
+ catch (OperationCanceledException)
+ {
+ // Ignore exceptions caused by cancellations.
+ }
+ catch (Exception ex)
+ {
+ HandleLocationChangingHandlerException(ex, context);
+ }
+ }
+
+ /// <summary>
+ /// Handles exceptions thrown in location changing handlers.
+ /// </summary>
+ /// <param name="ex">The exception to handle.</param>
+ /// <param name="context">The context passed to the handler.</param>
+ protected virtual void HandleLocationChangingHandlerException(Exception ex, LocationChangingContext context)
+ => throw new InvalidOperationException($"To support navigation locks, {GetType().Name} must override {nameof(HandleLocationChangingHandlerException)}");
+
+ /// <summary>
+ /// Sets whether navigation is currently locked. If it is, then implementations should not update <see cref="Uri"/> and call
+ /// <see cref="NotifyLocationChanged(bool)"/> until they have first confirmed the navigation by calling
+ /// <see cref="NotifyLocationChangingAsync(string, string?, bool)"/>.
+ /// </summary>
+ /// <param name="value">Whether navigation is currently locked.</param>
+ protected virtual void SetNavigationLockState(bool value)
+ => throw new NotSupportedException($"To support navigation locks, {GetType().Name} must override {nameof(SetNavigationLockState)}");
+
+ /// <summary>
+ /// Registers a handler to process incoming navigation events.
+ /// </summary>
+ /// <param name="locationChangingHandler">The handler to process incoming navigation events.</param>
+ /// <returns>An <see cref="IDisposable"/> that can be disposed to unregister the location changing handler.</returns>
+ public IDisposable RegisterLocationChangingHandler(Func<LocationChangingContext, ValueTask> locationChangingHandler)
+ {
+ AssertInitialized();
+
+ var isFirstHandler = _locationChangingHandlers.Count == 0;
+
+ _locationChangingHandlers.Add(locationChangingHandler);
+
+ if (isFirstHandler)
+ {
+ SetNavigationLockState(true);
+ }
+
+ return new LocationChangingRegistration(locationChangingHandler, this);
+ }
+
+ private void RemoveLocationChangingHandler(Func<LocationChangingContext, ValueTask> locationChangingHandler)
+ {
+ AssertInitialized();
+
+ if (_locationChangingHandlers.Remove(locationChangingHandler) && _locationChangingHandlers.Count == 0)
+ {
+ SetNavigationLockState(false);
+ }
+ }
+
private void AssertInitialized()
{
if (!_isInitialized)
@@ -283,9 +497,9 @@ public abstract class NavigationManager
return true;
}
- var hashIndex = uri.IndexOf('#');
- var uriWithoutHash = hashIndex < 0 ? uri : uri.Substring(0, hashIndex);
- if ($"{uriWithoutHash}/".Equals(baseUri.OriginalString, StringComparison.Ordinal))
+ var pathEndIndex = uri.IndexOfAny(UriPathEndChar);
+ var uriPathOnly = pathEndIndex < 0 ? uri : uri.Substring(0, pathEndIndex);
+ if ($"{uriPathOnly}/".Equals(baseUri.OriginalString, StringComparison.Ordinal))
{
// Special case: for the base URI "/something/", if you're at
// "/something" then treat it as if you were at "/something/" (i.e.,
@@ -314,4 +528,21 @@ public abstract class NavigationManager
throw new ArgumentException(message);
}
}
+
+ private sealed class LocationChangingRegistration : IDisposable
+ {
+ private readonly Func<LocationChangingContext, ValueTask> _handler;
+ private readonly NavigationManager _navigationManager;
+
+ public LocationChangingRegistration(Func<LocationChangingContext, ValueTask> handler, NavigationManager navigationManager)
+ {
+ _handler = handler;
+ _navigationManager = navigationManager;
+ }
+
+ public void Dispose()
+ {
+ _navigationManager.RemoveLocationChangingHandler(_handler);
+ }
+ }
}
diff --git a/src/Components/Components/src/NavigationOptions.cs b/src/Components/Components/src/NavigationOptions.cs
index e7423783af..0e501b1c49 100644
--- a/src/Components/Components/src/NavigationOptions.cs
+++ b/src/Components/Components/src/NavigationOptions.cs
@@ -18,4 +18,9 @@ public readonly struct NavigationOptions
/// If false, appends the new entry to the history stack.
/// </summary>
public bool ReplaceHistoryEntry { get; init; }
+
+ /// <summary>
+ /// Gets or sets the state to append to the history entry.
+ /// </summary>
+ public string? HistoryEntryState { get; init; }
}
diff --git a/src/Components/Components/src/OwningComponentBase.cs b/src/Components/Components/src/OwningComponentBase.cs
index 97b42f78a8..739f061425 100644
--- a/src/Components/Components/src/OwningComponentBase.cs
+++ b/src/Components/Components/src/OwningComponentBase.cs
@@ -37,10 +37,7 @@ public abstract class OwningComponentBase : ComponentBase, IDisposable
throw new InvalidOperationException("Services cannot be accessed before the component is initialized.");
}
- if (IsDisposed)
- {
- throw new ObjectDisposedException(GetType().Name);
- }
+ ObjectDisposedException.ThrowIf(IsDisposed, this);
_scope ??= ScopeFactory.CreateAsyncScope();
return _scope.Value.ServiceProvider;
@@ -85,10 +82,7 @@ public abstract class OwningComponentBase<TService> : OwningComponentBase, IDisp
{
get
{
- if (IsDisposed)
- {
- throw new ObjectDisposedException(GetType().Name);
- }
+ ObjectDisposedException.ThrowIf(IsDisposed, this);
// We cache this because we don't know the lifetime. We have to assume that it could be transient.
_item ??= ScopedServices.GetRequiredService<TService>();
diff --git a/src/Components/Components/src/PublicAPI.Shipped.txt b/src/Components/Components/src/PublicAPI.Shipped.txt
index 374ace74be..874d6125b2 100644
--- a/src/Components/Components/src/PublicAPI.Shipped.txt
+++ b/src/Components/Components/src/PublicAPI.Shipped.txt
@@ -74,6 +74,7 @@ Microsoft.AspNetCore.Components.DynamicComponent.Type.set -> void
Microsoft.AspNetCore.Components.EditorRequiredAttribute
Microsoft.AspNetCore.Components.EditorRequiredAttribute.EditorRequiredAttribute() -> void
Microsoft.AspNetCore.Components.ElementReference
+Microsoft.AspNetCore.Components.ElementReference.ElementReference() -> void
Microsoft.AspNetCore.Components.ElementReference.Context.get -> Microsoft.AspNetCore.Components.ElementReferenceContext?
Microsoft.AspNetCore.Components.ElementReference.ElementReference(string! id) -> void
Microsoft.AspNetCore.Components.ElementReference.ElementReference(string! id, Microsoft.AspNetCore.Components.ElementReferenceContext? context) -> void
@@ -91,11 +92,13 @@ Microsoft.AspNetCore.Components.ErrorBoundaryBase.MaximumErrorCount.get -> int
Microsoft.AspNetCore.Components.ErrorBoundaryBase.MaximumErrorCount.set -> void
Microsoft.AspNetCore.Components.ErrorBoundaryBase.Recover() -> void
Microsoft.AspNetCore.Components.EventCallback
+Microsoft.AspNetCore.Components.EventCallback.EventCallback() -> void
Microsoft.AspNetCore.Components.EventCallback.EventCallback(Microsoft.AspNetCore.Components.IHandleEvent? receiver, System.MulticastDelegate? delegate) -> void
Microsoft.AspNetCore.Components.EventCallback.HasDelegate.get -> bool
Microsoft.AspNetCore.Components.EventCallback.InvokeAsync() -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.Components.EventCallback.InvokeAsync(object? arg) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.Components.EventCallback<TValue>
+Microsoft.AspNetCore.Components.EventCallback<TValue>.EventCallback() -> void
Microsoft.AspNetCore.Components.EventCallback<TValue>.EventCallback(Microsoft.AspNetCore.Components.IHandleEvent? receiver, System.MulticastDelegate? delegate) -> void
Microsoft.AspNetCore.Components.EventCallback<TValue>.HasDelegate.get -> bool
Microsoft.AspNetCore.Components.EventCallback<TValue>.InvokeAsync() -> System.Threading.Tasks.Task!
@@ -118,6 +121,7 @@ Microsoft.AspNetCore.Components.EventCallbackFactory.EventCallbackFactory() -> v
Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions
Microsoft.AspNetCore.Components.EventCallbackFactoryEventArgsExtensions
Microsoft.AspNetCore.Components.EventCallbackWorkItem
+Microsoft.AspNetCore.Components.EventCallbackWorkItem.EventCallbackWorkItem() -> void
Microsoft.AspNetCore.Components.EventCallbackWorkItem.EventCallbackWorkItem(System.MulticastDelegate? delegate) -> void
Microsoft.AspNetCore.Components.EventCallbackWorkItem.InvokeAsync(object? arg) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.Components.EventHandlerAttribute
@@ -164,6 +168,7 @@ Microsoft.AspNetCore.Components.LayoutView.SetParametersAsync(Microsoft.AspNetCo
Microsoft.AspNetCore.Components.LocationChangeException
Microsoft.AspNetCore.Components.LocationChangeException.LocationChangeException(string! message, System.Exception! innerException) -> void
Microsoft.AspNetCore.Components.MarkupString
+Microsoft.AspNetCore.Components.MarkupString.MarkupString() -> void
Microsoft.AspNetCore.Components.MarkupString.MarkupString(string! value) -> void
Microsoft.AspNetCore.Components.MarkupString.Value.get -> string!
Microsoft.AspNetCore.Components.NavigationException
@@ -202,11 +207,14 @@ Microsoft.AspNetCore.Components.ParameterAttribute.CaptureUnmatchedValues.get ->
Microsoft.AspNetCore.Components.ParameterAttribute.CaptureUnmatchedValues.set -> void
Microsoft.AspNetCore.Components.ParameterAttribute.ParameterAttribute() -> void
Microsoft.AspNetCore.Components.ParameterValue
+Microsoft.AspNetCore.Components.ParameterValue.ParameterValue() -> void
Microsoft.AspNetCore.Components.ParameterValue.Cascading.get -> bool
Microsoft.AspNetCore.Components.ParameterValue.Name.get -> string!
Microsoft.AspNetCore.Components.ParameterValue.Value.get -> object!
Microsoft.AspNetCore.Components.ParameterView
Microsoft.AspNetCore.Components.ParameterView.Enumerator
+Microsoft.AspNetCore.Components.ParameterView.Enumerator.Enumerator() -> void
+Microsoft.AspNetCore.Components.ParameterView.ParameterView() -> void
Microsoft.AspNetCore.Components.ParameterView.Enumerator.Current.get -> Microsoft.AspNetCore.Components.ParameterValue
Microsoft.AspNetCore.Components.ParameterView.Enumerator.MoveNext() -> bool
Microsoft.AspNetCore.Components.ParameterView.GetEnumerator() -> Microsoft.AspNetCore.Components.ParameterView.Enumerator
@@ -220,10 +228,12 @@ Microsoft.AspNetCore.Components.PersistentComponentState.PersistAsJson<TValue>(s
Microsoft.AspNetCore.Components.PersistentComponentState.RegisterOnPersisting(System.Func<System.Threading.Tasks.Task!>! callback) -> Microsoft.AspNetCore.Components.PersistingComponentStateSubscription
Microsoft.AspNetCore.Components.PersistentComponentState.TryTakeFromJson<TValue>(string! key, out TValue? instance) -> bool
Microsoft.AspNetCore.Components.PersistingComponentStateSubscription
+Microsoft.AspNetCore.Components.PersistingComponentStateSubscription.PersistingComponentStateSubscription() -> void
Microsoft.AspNetCore.Components.PersistingComponentStateSubscription.Dispose() -> void
Microsoft.AspNetCore.Components.RenderFragment
Microsoft.AspNetCore.Components.RenderFragment<TValue>
Microsoft.AspNetCore.Components.RenderHandle
+Microsoft.AspNetCore.Components.RenderHandle.RenderHandle() -> void
Microsoft.AspNetCore.Components.RenderHandle.Dispatcher.get -> Microsoft.AspNetCore.Components.Dispatcher!
Microsoft.AspNetCore.Components.RenderHandle.IsInitialized.get -> bool
Microsoft.AspNetCore.Components.RenderHandle.IsRenderingOnMetadataUpdate.get -> bool
@@ -260,11 +270,13 @@ Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.RenderTreeBuilder()
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.SetKey(object? value) -> void
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.SetUpdatesAttributeName(string! updatesAttributeName) -> void
Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<T>
+Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<T>.ArrayBuilderSegment() -> void
Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<T>.Array.get -> T[]!
Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<T>.Count.get -> int
Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<T>.Offset.get -> int
Microsoft.AspNetCore.Components.RenderTree.ArrayBuilderSegment<T>.this[int index].get -> T
Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T>
+Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T>.ArrayRange() -> void
Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T>.ArrayRange(T[]! array, int count) -> void
Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T>.Clone() -> Microsoft.AspNetCore.Components.RenderTree.ArrayRange<T>
Microsoft.AspNetCore.Components.RenderTree.EventFieldInfo
@@ -274,6 +286,7 @@ Microsoft.AspNetCore.Components.RenderTree.EventFieldInfo.EventFieldInfo() -> vo
Microsoft.AspNetCore.Components.RenderTree.EventFieldInfo.FieldValue.get -> object!
Microsoft.AspNetCore.Components.RenderTree.EventFieldInfo.FieldValue.set -> void
Microsoft.AspNetCore.Components.RenderTree.RenderBatch
+Microsoft.AspNetCore.Components.RenderTree.RenderBatch.RenderBatch() -> void
Microsoft.AspNetCore.Components.RenderTree.RenderBatch.DisposedComponentIDs.get -> Microsoft.AspNetCore.Components.RenderTree.ArrayRange<int>
Microsoft.AspNetCore.Components.RenderTree.RenderBatch.DisposedEventHandlerIDs.get -> Microsoft.AspNetCore.Components.RenderTree.ArrayRange<ulong>
Microsoft.AspNetCore.Components.RenderTree.RenderBatch.ReferenceFrames.get -> Microsoft.AspNetCore.Components.RenderTree.ArrayRange<Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame>
@@ -294,7 +307,9 @@ Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderRootComponentAsync(int
Microsoft.AspNetCore.Components.RenderTree.Renderer.RenderRootComponentAsync(int componentId, Microsoft.AspNetCore.Components.ParameterView initialParameters) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.Components.RenderTree.Renderer.UnhandledSynchronizationException -> System.UnhandledExceptionEventHandler!
Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff
+Microsoft.AspNetCore.Components.RenderTree.RenderTreeDiff.RenderTreeDiff() -> void
Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit
+Microsoft.AspNetCore.Components.RenderTree.RenderTreeEdit.RenderTreeEdit() -> void
Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType
Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.PermutationListEnd = 10 -> Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType
Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.PermutationListEntry = 9 -> Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType
@@ -307,6 +322,7 @@ Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.StepOut = 7 -> Mic
Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.UpdateMarkup = 8 -> Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType
Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType.UpdateText = 5 -> Microsoft.AspNetCore.Components.RenderTree.RenderTreeEditType
Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame
+Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.RenderTreeFrame() -> void
Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.AttributeEventHandlerId.get -> ulong
Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentId.get -> int
Microsoft.AspNetCore.Components.RenderTree.RenderTreeFrame.ComponentReferenceCaptureParentFrameIndex.get -> int
diff --git a/src/Components/Components/src/PublicAPI.Unshipped.txt b/src/Components/Components/src/PublicAPI.Unshipped.txt
index 53b72159ad..68457b0dbc 100644
--- a/src/Components/Components/src/PublicAPI.Unshipped.txt
+++ b/src/Components/Components/src/PublicAPI.Unshipped.txt
@@ -1,2 +1,58 @@
#nullable enable
+Microsoft.AspNetCore.Components.NavigationManager.HistoryEntryState.get -> string?
+Microsoft.AspNetCore.Components.NavigationManager.HistoryEntryState.set -> void
+Microsoft.AspNetCore.Components.NavigationManager.NotifyLocationChangingAsync(string! uri, string? state, bool isNavigationIntercepted) -> System.Threading.Tasks.ValueTask<bool>
+Microsoft.AspNetCore.Components.NavigationManager.RegisterLocationChangingHandler(System.Func<Microsoft.AspNetCore.Components.Routing.LocationChangingContext!, System.Threading.Tasks.ValueTask>! locationChangingHandler) -> System.IDisposable!
+Microsoft.AspNetCore.Components.NavigationOptions.HistoryEntryState.get -> string?
+Microsoft.AspNetCore.Components.NavigationOptions.HistoryEntryState.init -> void
Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder.AddContent(int sequence, Microsoft.AspNetCore.Components.MarkupString? markupContent) -> void
+Microsoft.AspNetCore.Components.Routing.LocationChangedEventArgs.HistoryEntryState.get -> string?
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.CancellationToken.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.CancellationToken.init -> void
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.HistoryEntryState.get -> string?
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.HistoryEntryState.init -> void
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.IsNavigationIntercepted.get -> bool
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.IsNavigationIntercepted.init -> void
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.LocationChangingContext() -> void
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.PreventNavigation() -> void
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.TargetLocation.get -> string!
+Microsoft.AspNetCore.Components.Routing.LocationChangingContext.TargetLocation.init -> void
+static Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.CreateInferredEventCallback<T>(object! receiver, Microsoft.AspNetCore.Components.EventCallback<T> callback, T value) -> Microsoft.AspNetCore.Components.EventCallback<T>
+static Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.InvokeAsynchronousDelegate(System.Action! callback) -> System.Threading.Tasks.Task!
+static Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.InvokeAsynchronousDelegate(System.Func<System.Threading.Tasks.Task!>! callback) -> System.Threading.Tasks.Task!
+static Microsoft.AspNetCore.Components.CompilerServices.RuntimeHelpers.InvokeSynchronousDelegate(System.Action! callback) -> void
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateOnly> setter, System.DateOnly existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateOnly> setter, System.DateOnly existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateOnly?> setter, System.DateOnly? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateOnly?> setter, System.DateOnly? existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTime> setter, System.DateTime existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTime> setter, System.DateTime existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTime?> setter, System.DateTime? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTime?> setter, System.DateTime? existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTimeOffset> setter, System.DateTimeOffset existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.DateTimeOffset?> setter, System.DateTimeOffset? existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.TimeOnly> setter, System.TimeOnly existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.TimeOnly> setter, System.TimeOnly existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.TimeOnly?> setter, System.TimeOnly? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<System.TimeOnly?> setter, System.TimeOnly? existingValue, string! format, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<bool> setter, bool existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<bool?> setter, bool? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<decimal> setter, decimal existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<decimal?> setter, decimal? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<double> setter, double existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<double?> setter, double? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<float> setter, float existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<float?> setter, float? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<int> setter, int existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<int?> setter, int? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<long> setter, long existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<long?> setter, long? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<short> setter, short existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<short?> setter, short? existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<string?> setter, string! existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+static Microsoft.AspNetCore.Components.EventCallbackFactoryBinderExtensions.CreateBinder<T>(this Microsoft.AspNetCore.Components.EventCallbackFactory! factory, object! receiver, Microsoft.AspNetCore.Components.EventCallback<T> setter, T existingValue, System.Globalization.CultureInfo? culture = null) -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.ChangeEventArgs!>
+virtual Microsoft.AspNetCore.Components.NavigationManager.HandleLocationChangingHandlerException(System.Exception! ex, Microsoft.AspNetCore.Components.Routing.LocationChangingContext! context) -> void
+virtual Microsoft.AspNetCore.Components.NavigationManager.SetNavigationLockState(bool value) -> void
diff --git a/src/Components/Components/src/Reflection/ComponentProperties.cs b/src/Components/Components/src/Reflection/ComponentProperties.cs
index b74670bd81..ecf5eafc66 100644
--- a/src/Components/Components/src/Reflection/ComponentProperties.cs
+++ b/src/Components/Components/src/Reflection/ComponentProperties.cs
@@ -247,7 +247,7 @@ internal static class ComponentProperties
$"The property must be assignable from 'Dictionary<string, object>'.");
}
- private class WritersForType
+ private sealed class WritersForType
{
private const int MaxCachedWriterLookups = 100;
private readonly Dictionary<string, PropertySetter> _underlyingWriters;
diff --git a/src/Components/Components/src/Reflection/MemberAssignment.cs b/src/Components/Components/src/Reflection/MemberAssignment.cs
index e2fc2846c8..68467423d8 100644
--- a/src/Components/Components/src/Reflection/MemberAssignment.cs
+++ b/src/Components/Components/src/Reflection/MemberAssignment.cs
@@ -8,7 +8,7 @@ using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components.Reflection;
-internal class MemberAssignment
+internal sealed class MemberAssignment
{
public static IEnumerable<PropertyInfo> GetPropertiesIncludingInherited(
[DynamicallyAccessedMembers(Component)] Type type,
diff --git a/src/Components/Components/src/RenderTree/RenderTreeFrameArrayBuilder.cs b/src/Components/Components/src/RenderTree/RenderTreeFrameArrayBuilder.cs
index a1ff61d8cc..fad0fddc5c 100644
--- a/src/Components/Components/src/RenderTree/RenderTreeFrameArrayBuilder.cs
+++ b/src/Components/Components/src/RenderTree/RenderTreeFrameArrayBuilder.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Components.RenderTree;
/// <summary>
/// A special subclass of <see cref="ArrayBuilder{T}"/> that contains methods optimized for appending <see cref="RenderTreeFrame"/> entries.
/// </summary>
-internal class RenderTreeFrameArrayBuilder : ArrayBuilder<RenderTreeFrame>
+internal sealed class RenderTreeFrameArrayBuilder : ArrayBuilder<RenderTreeFrame>
{
// You may notice a repeated block at the top of each of these methods. This is intentionally inlined into each
// method because doing so improves intensive rendering scenarios by around 1% (based on the FastGrid benchmark).
diff --git a/src/Components/Components/src/RenderTree/StackObjectPool.cs b/src/Components/Components/src/RenderTree/StackObjectPool.cs
index 8b9dcc6aae..566c631a2e 100644
--- a/src/Components/Components/src/RenderTree/StackObjectPool.cs
+++ b/src/Components/Components/src/RenderTree/StackObjectPool.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Components.RenderTree;
// balanced as in a stack. It retains up to 'maxPreservedItems' instances in
// memory, then for any further requests it supplies untracked instances.
-internal class StackObjectPool<T> where T : class
+internal sealed class StackObjectPool<T> where T : class
{
private readonly int _maxPreservedItems;
private readonly Func<T> _instanceFactory;
diff --git a/src/Components/Components/src/Rendering/ComponentState.cs b/src/Components/Components/src/Rendering/ComponentState.cs
index 166fe48f00..9c71310e37 100644
--- a/src/Components/Components/src/Rendering/ComponentState.cs
+++ b/src/Components/Components/src/Rendering/ComponentState.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Components.Rendering;
/// within the context of a <see cref="Renderer"/>. This is an internal implementation
/// detail of <see cref="Renderer"/>.
/// </summary>
-internal class ComponentState : IDisposable
+internal sealed class ComponentState : IDisposable
{
private readonly Renderer _renderer;
private readonly IReadOnlyList<CascadingParameterState> _cascadingParameters;
diff --git a/src/Components/Components/src/Rendering/RenderBatchBuilder.cs b/src/Components/Components/src/Rendering/RenderBatchBuilder.cs
index 048cfbe543..27c3e537d5 100644
--- a/src/Components/Components/src/Rendering/RenderBatchBuilder.cs
+++ b/src/Components/Components/src/Rendering/RenderBatchBuilder.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Components.Rendering;
/// and the intermediate states (such as the queue of components still to
/// be rendered).
/// </summary>
-internal class RenderBatchBuilder : IDisposable
+internal sealed class RenderBatchBuilder : IDisposable
{
// A value that, if changed, causes expiry of all ParameterView instances issued
// for this RenderBatchBuilder. This is to prevent invalid reads from arrays that
diff --git a/src/Components/Components/src/Rendering/RenderTreeUpdater.cs b/src/Components/Components/src/Rendering/RenderTreeUpdater.cs
index 9a69c18a50..6410510044 100644
--- a/src/Components/Components/src/Rendering/RenderTreeUpdater.cs
+++ b/src/Components/Components/src/Rendering/RenderTreeUpdater.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Components.RenderTree;
namespace Microsoft.AspNetCore.Components.Rendering;
-internal class RenderTreeUpdater
+internal sealed class RenderTreeUpdater
{
public static void UpdateToMatchClientState(RenderTreeBuilder renderTreeBuilder, ulong eventHandlerId, object newFieldValue)
{
diff --git a/src/Components/Components/src/Rendering/RendererSynchronizationContext.cs b/src/Components/Components/src/Rendering/RendererSynchronizationContext.cs
index 3f22836ac2..8f68c3b040 100644
--- a/src/Components/Components/src/Rendering/RendererSynchronizationContext.cs
+++ b/src/Components/Components/src/Rendering/RendererSynchronizationContext.cs
@@ -8,7 +8,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Components.Rendering;
[DebuggerDisplay("{_state,nq}")]
-internal class RendererSynchronizationContext : SynchronizationContext
+internal sealed class RendererSynchronizationContext : SynchronizationContext
{
private static readonly ContextCallback ExecutionContextThunk = (object state) =>
{
@@ -278,7 +278,7 @@ internal class RendererSynchronizationContext : SynchronizationContext
}
}
- private class State
+ private sealed class State
{
public bool IsBusy; // Just for debugging
public object Lock = new object();
@@ -290,7 +290,7 @@ internal class RendererSynchronizationContext : SynchronizationContext
}
}
- private class WorkItem
+ private sealed class WorkItem
{
public RendererSynchronizationContext SynchronizationContext;
public ExecutionContext ExecutionContext;
@@ -298,7 +298,7 @@ internal class RendererSynchronizationContext : SynchronizationContext
public object State;
}
- private class RendererSynchronizationTaskCompletionSource<TCallback, TResult> : TaskCompletionSource<TResult>
+ private sealed class RendererSynchronizationTaskCompletionSource<TCallback, TResult> : TaskCompletionSource<TResult>
{
public RendererSynchronizationTaskCompletionSource(TCallback callback)
{
diff --git a/src/Components/Components/src/Rendering/RendererSynchronizationContextDispatcher.cs b/src/Components/Components/src/Rendering/RendererSynchronizationContextDispatcher.cs
index c29e7d78c2..2c8c893351 100644
--- a/src/Components/Components/src/Rendering/RendererSynchronizationContextDispatcher.cs
+++ b/src/Components/Components/src/Rendering/RendererSynchronizationContextDispatcher.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.Rendering;
-internal class RendererSynchronizationContextDispatcher : Dispatcher
+internal sealed class RendererSynchronizationContextDispatcher : Dispatcher
{
private readonly RendererSynchronizationContext _context;
diff --git a/src/Components/Components/src/Rendering/SimplifiedStringHashComparer.cs b/src/Components/Components/src/Rendering/SimplifiedStringHashComparer.cs
index 2c5737bd02..a945fee7b9 100644
--- a/src/Components/Components/src/Rendering/SimplifiedStringHashComparer.cs
+++ b/src/Components/Components/src/Rendering/SimplifiedStringHashComparer.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Components.Rendering;
/// to detect when one attribute is overriding another, but in the vast majority of cases attributes don't
/// actually override each other.
/// </summary>
-internal class SimplifiedStringHashComparer : IEqualityComparer<string>
+internal sealed class SimplifiedStringHashComparer : IEqualityComparer<string>
{
public static readonly SimplifiedStringHashComparer Instance = new SimplifiedStringHashComparer();
diff --git a/src/Components/Components/src/RouteView.cs b/src/Components/Components/src/RouteView.cs
index 66336d4fb4..349060c1e6 100644
--- a/src/Components/Components/src/RouteView.cs
+++ b/src/Components/Components/src/RouteView.cs
@@ -3,6 +3,7 @@
#nullable disable warnings
+using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.AspNetCore.Components.Rendering;
using Microsoft.AspNetCore.Components.Routing;
@@ -72,6 +73,8 @@ public class RouteView : IComponent
/// Renders the component.
/// </summary>
/// <param name="builder">The <see cref="RenderTreeBuilder"/>.</param>
+ [UnconditionalSuppressMessage("Trimming", "IL2111", Justification = "Layout components are preserved because the LayoutAttribute constructor parameter is correctly annotated.")]
+ [UnconditionalSuppressMessage("Trimming", "IL2118", Justification = "Layout components are preserved because the LayoutAttribute constructor parameter is correctly annotated.")]
protected virtual void Render(RenderTreeBuilder builder)
{
var pageLayoutType = RouteData.PageType.GetCustomAttribute<LayoutAttribute>()?.LayoutType
diff --git a/src/Components/Components/src/Routing/LocationChangedEventArgs.cs b/src/Components/Components/src/Routing/LocationChangedEventArgs.cs
index abb9fbd002..7b865c4bc0 100644
--- a/src/Components/Components/src/Routing/LocationChangedEventArgs.cs
+++ b/src/Components/Components/src/Routing/LocationChangedEventArgs.cs
@@ -28,4 +28,9 @@ public class LocationChangedEventArgs : EventArgs
/// Gets a value that determines if navigation for the link was intercepted.
/// </summary>
public bool IsNavigationIntercepted { get; }
+
+ /// <summary>
+ /// Gets the state associated with the current history entry.
+ /// </summary>
+ public string? HistoryEntryState { get; internal init; }
}
diff --git a/src/Components/Components/src/Routing/LocationChangingContext.cs b/src/Components/Components/src/Routing/LocationChangingContext.cs
new file mode 100644
index 0000000000..3de5f9e270
--- /dev/null
+++ b/src/Components/Components/src/Routing/LocationChangingContext.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Components.Routing;
+
+/// <summary>
+/// Contains context for a change to the browser's current location.
+/// </summary>
+public sealed class LocationChangingContext
+{
+ internal bool DidPreventNavigation { get; private set; }
+
+ /// <summary>
+ /// Gets the target location.
+ /// </summary>
+ public required string TargetLocation { get; init; }
+
+ /// <summary>
+ /// Gets the state associated with the target history entry.
+ /// </summary>
+ public string? HistoryEntryState { get; init; }
+
+ /// <summary>
+ /// Gets whether this navigation was intercepted from a link.
+ /// </summary>
+ public bool IsNavigationIntercepted { get; init; }
+
+ /// <summary>
+ /// Gets a <see cref="System.Threading.CancellationToken"/> that can be used to determine if this navigation was canceled
+ /// (for example, because the user has triggered a different navigation).
+ /// </summary>
+ public CancellationToken CancellationToken { get; init; }
+
+ /// <summary>
+ /// Prevents this navigation from continuing.
+ /// </summary>
+ public void PreventNavigation()
+ {
+ DidPreventNavigation = true;
+ }
+}
diff --git a/src/Components/Components/src/Routing/RouteContext.cs b/src/Components/Components/src/Routing/RouteContext.cs
index 7fd306a839..f5565d0128 100644
--- a/src/Components/Components/src/Routing/RouteContext.cs
+++ b/src/Components/Components/src/Routing/RouteContext.cs
@@ -6,7 +6,7 @@ using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components.Routing;
-internal class RouteContext
+internal sealed class RouteContext
{
public RouteContext(string path)
{
diff --git a/src/Components/Components/src/Routing/RouteEntry.cs b/src/Components/Components/src/Routing/RouteEntry.cs
index eb593fd20c..1b8af2ade0 100644
--- a/src/Components/Components/src/Routing/RouteEntry.cs
+++ b/src/Components/Components/src/Routing/RouteEntry.cs
@@ -10,7 +10,7 @@ using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components.Routing;
[DebuggerDisplay("Handler = {Handler}, Template = {Template}")]
-internal class RouteEntry
+internal sealed class RouteEntry
{
public RouteEntry(RouteTemplate template, [DynamicallyAccessedMembers(Component)] Type handler, List<string>? unusedRouteParameterNames)
{
diff --git a/src/Components/Components/src/Routing/RouteTable.cs b/src/Components/Components/src/Routing/RouteTable.cs
index 0379edbaa4..b8956252ff 100644
--- a/src/Components/Components/src/Routing/RouteTable.cs
+++ b/src/Components/Components/src/Routing/RouteTable.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.Routing;
-internal class RouteTable
+internal sealed class RouteTable
{
public RouteTable(RouteEntry[] routes)
{
diff --git a/src/Components/Components/src/Routing/RouteTableFactory.cs b/src/Components/Components/src/Routing/RouteTableFactory.cs
index 34ecb8fb03..ace100b649 100644
--- a/src/Components/Components/src/Routing/RouteTableFactory.cs
+++ b/src/Components/Components/src/Routing/RouteTableFactory.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Concurrent;
+using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.AspNetCore.Components.Routing;
@@ -30,6 +31,7 @@ internal static class RouteTableFactory
public static void ClearCaches() => Cache.Clear();
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Application code does not get trimmed, and the framework does not define routable components.")]
private static List<Type> GetRouteableComponents(RouteKey routeKey)
{
var routeableComponents = new List<Type>();
@@ -86,6 +88,7 @@ internal static class RouteTableFactory
return Create(templatesByHandler);
}
+ [UnconditionalSuppressMessage("Trimming", "IL2067", Justification = "Application code does not get trimmed, and the framework does not define routable components.")]
internal static RouteTable Create(Dictionary<Type, string[]> templatesByHandler)
{
var routes = new List<RouteEntry>();
diff --git a/src/Components/Components/src/Routing/RouteTemplate.cs b/src/Components/Components/src/Routing/RouteTemplate.cs
index a61a42e24a..6b1ebb7868 100644
--- a/src/Components/Components/src/Routing/RouteTemplate.cs
+++ b/src/Components/Components/src/Routing/RouteTemplate.cs
@@ -6,7 +6,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Components.Routing;
[DebuggerDisplay("{TemplateText}")]
-internal class RouteTemplate
+internal sealed class RouteTemplate
{
public RouteTemplate(string templateText, TemplateSegment[] segments)
{
diff --git a/src/Components/Components/src/Routing/TemplateParser.cs b/src/Components/Components/src/Routing/TemplateParser.cs
index 2a1ef5037b..b9e95872eb 100644
--- a/src/Components/Components/src/Routing/TemplateParser.cs
+++ b/src/Components/Components/src/Routing/TemplateParser.cs
@@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Components.Routing;
// * Literal path segments. (Like /Path/To/Some/Page)
// * Parameter path segments (Like /Customer/{Id}/Orders/{OrderId})
// * Catch-all parameters (Like /blog/{*slug})
-internal class TemplateParser
+internal sealed class TemplateParser
{
public static readonly char[] InvalidParameterNameCharacters =
new char[] { '{', '}', '=', '.' };
diff --git a/src/Components/Components/src/Routing/TemplateSegment.cs b/src/Components/Components/src/Routing/TemplateSegment.cs
index 028bbe7dc1..8450e9120d 100644
--- a/src/Components/Components/src/Routing/TemplateSegment.cs
+++ b/src/Components/Components/src/Routing/TemplateSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.Routing;
-internal class TemplateSegment
+internal sealed class TemplateSegment
{
public TemplateSegment(string template, string segment, bool isParameter)
{
diff --git a/src/Components/Components/src/Sections/SectionContent.cs b/src/Components/Components/src/Sections/SectionContent.cs
index 325ef7444b..e8342597c5 100644
--- a/src/Components/Components/src/Sections/SectionContent.cs
+++ b/src/Components/Components/src/Sections/SectionContent.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Components.Sections;
/// <summary>
/// Provides content to <see cref="SectionOutlet"/> components with matching <see cref="Name"/>s.
/// </summary>
-internal class SectionContent : ISectionContentProvider, IComponent, IDisposable
+internal sealed class SectionContent : ISectionContentProvider, IComponent, IDisposable
{
private string? _registeredName;
private SectionRegistry _registry = default!;
diff --git a/src/Components/Components/src/Sections/SectionOutlet.cs b/src/Components/Components/src/Sections/SectionOutlet.cs
index 5c69a6b549..e9a7e2d067 100644
--- a/src/Components/Components/src/Sections/SectionOutlet.cs
+++ b/src/Components/Components/src/Sections/SectionOutlet.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Components.Sections;
/// <summary>
/// Renders content provided by <see cref="SectionContent"/> components with matching <see cref="Name"/>s.
/// </summary>
-internal class SectionOutlet : ISectionContentSubscriber, IComponent, IDisposable
+internal sealed class SectionOutlet : ISectionContentSubscriber, IComponent, IDisposable
{
private static readonly RenderFragment _emptyRenderFragment = _ => { };
diff --git a/src/Components/Components/test/NavigationManagerTest.cs b/src/Components/Components/test/NavigationManagerTest.cs
index 6476991e6a..801205870f 100644
--- a/src/Components/Components/test/NavigationManagerTest.cs
+++ b/src/Components/Components/test/NavigationManagerTest.cs
@@ -1,10 +1,17 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
+using Microsoft.AspNetCore.Components.Routing;
+
namespace Microsoft.AspNetCore.Components;
public class NavigationManagerTest
{
+ // Nothing should exceed the timeout in a successful run of the the tests, this is just here to catch
+ // failures.
+ private static readonly TimeSpan Timeout = Debugger.IsAttached ? System.Threading.Timeout.InfiniteTimeSpan : TimeSpan.FromSeconds(10);
+
[Theory]
[InlineData("scheme://host/", "scheme://host/")]
[InlineData("scheme://host:123/", "scheme://host:123/")]
@@ -208,6 +215,639 @@ public class NavigationManagerTest
Assert.StartsWith("Cannot have empty query parameter names.", exception.Message);
}
+ [Fact]
+ public void LocationChangingHandlers_CanContinueTheNavigationSynchronously_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.True(navigation1.Result);
+
+ static ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ return ValueTask.CompletedTask;
+ };
+ }
+
+ [Fact]
+ public void LocationChangingHandlers_CanContinueTheNavigationSynchronously_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var initialHandlerCount = 3;
+ var completedHandlerCount = 0;
+
+ // Act
+ for (var i = 0; i < initialHandlerCount; i++)
+ {
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+ }
+
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.True(navigation1.Result);
+ Assert.Equal(initialHandlerCount, completedHandlerCount);
+
+ ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ completedHandlerCount++;
+ return ValueTask.CompletedTask;
+ };
+ }
+
+ [Fact]
+ public void LocationChangingHandlers_CanContinueTheNavigationAsynchronously_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var tcs = new TaskCompletionSource();
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.False(navigation1.IsCompleted);
+ tcs.SetResult();
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.True(navigation1.Result);
+
+ async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ await tcs.Task;
+ };
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_CanContinueTheNavigationAsynchronously_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var initialHandlerCount = 3;
+ var completedHandlerCount = 0;
+
+ // Act
+ for (var i = 0; i < initialHandlerCount; i++)
+ {
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+ }
+
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+ var navigation1Result = await navigation1.WaitAsync(Timeout);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.True(navigation1Result);
+ Assert.Equal(initialHandlerCount, completedHandlerCount);
+
+ async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ await Task.Yield();
+ Interlocked.Increment(ref completedHandlerCount);
+ };
+ }
+
+ [Fact]
+ public void LocationChangingHandlers_CanCancelTheNavigationSynchronously_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+
+ static ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ context.PreventNavigation();
+ return ValueTask.CompletedTask;
+ }
+ }
+
+ [Fact]
+ public void LocationChangingHandlers_CanCancelTheNavigationSynchronously_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var invokedHandlerCount = 0;
+
+ // The first two handlers run, but the third doesn't because the navigation gets prevented after the second.
+ var expectedInvokedHandlerCount = 2;
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_AllowNavigation);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_PreventNavigation);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_AllowNavigation);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+ Assert.Equal(expectedInvokedHandlerCount, invokedHandlerCount);
+
+ ValueTask HandleLocationChanging_AllowNavigation(LocationChangingContext context)
+ {
+ invokedHandlerCount++;
+ return ValueTask.CompletedTask;
+ }
+
+ ValueTask HandleLocationChanging_PreventNavigation(LocationChangingContext context)
+ {
+ invokedHandlerCount++;
+ context.PreventNavigation();
+ return ValueTask.CompletedTask;
+ }
+ }
+
+ [Fact]
+ public void LocationChangingHandlers_CanCancelTheNavigationSynchronously_BeforeReturning_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var tcs = new TaskCompletionSource();
+ var isHandlerCompleted = false;
+ LocationChangingContext currentContext = null;
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+ Assert.True(currentContext.DidPreventNavigation);
+ Assert.True(currentContext.CancellationToken.IsCancellationRequested);
+ Assert.False(isHandlerCompleted);
+
+ tcs.SetResult();
+
+ Assert.True(isHandlerCompleted);
+
+ async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ currentContext = context;
+ context.PreventNavigation();
+ await tcs.Task;
+ isHandlerCompleted = true;
+ }
+ }
+
+ [Fact]
+ public void LocationChangingHandlers_CanCancelTheNavigationSynchronously_BeforeReturning_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var tcs = new TaskCompletionSource();
+ var isFirstHandlerCompleted = false;
+ var isSecondHandlerCompleted = false;
+ LocationChangingContext currentContext = null;
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_PreventNavigation);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_AllowNavigation);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+ Assert.True(currentContext.DidPreventNavigation);
+ Assert.True(currentContext.CancellationToken.IsCancellationRequested);
+ Assert.False(isFirstHandlerCompleted);
+ Assert.False(isSecondHandlerCompleted);
+
+ tcs.SetResult();
+
+ Assert.True(isFirstHandlerCompleted);
+ Assert.False(isSecondHandlerCompleted);
+
+ async ValueTask HandleLocationChanging_PreventNavigation(LocationChangingContext context)
+ {
+ currentContext = context;
+ context.PreventNavigation();
+ await tcs.Task;
+ isFirstHandlerCompleted = true;
+ }
+
+ ValueTask HandleLocationChanging_AllowNavigation(LocationChangingContext context)
+ {
+ isSecondHandlerCompleted = true;
+ return ValueTask.CompletedTask;
+ }
+ }
+
+ [Fact]
+ public async void LocationChangingHandlers_CanCancelTheNavigationAsynchronously_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+ var navigation1Result = await navigation1.WaitAsync(Timeout);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1Result);
+
+ static async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ await Task.Yield();
+ context.PreventNavigation();
+ }
+ }
+
+ [Fact]
+ public async void LocationChangingHandlers_CanCancelTheNavigationAsynchronously_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var blockNavigationHandlerCount = 2;
+ var canceledBlockNavigationHandlerCount = 0;
+ var tcs = new TaskCompletionSource();
+
+ for (var i = 0; i < blockNavigationHandlerCount; i++)
+ {
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_BlockNavigation);
+ }
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_PreventNavigation);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+ var navigation1Result = await navigation1.WaitAsync(Timeout);
+
+ await tcs.Task.WaitAsync(Timeout);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+ Assert.Equal(blockNavigationHandlerCount, canceledBlockNavigationHandlerCount);
+
+ async ValueTask HandleLocationChanging_BlockNavigation(LocationChangingContext context)
+ {
+ try
+ {
+ await Task.Delay(System.Threading.Timeout.Infinite, context.CancellationToken);
+ }
+ catch (TaskCanceledException ex)
+ {
+ if (ex.CancellationToken == context.CancellationToken)
+ {
+ lock (navigationManager)
+ {
+ canceledBlockNavigationHandlerCount++;
+
+ if (canceledBlockNavigationHandlerCount == blockNavigationHandlerCount)
+ {
+ tcs.SetResult();
+ }
+ }
+ }
+
+ throw;
+ }
+ }
+
+ static async ValueTask HandleLocationChanging_PreventNavigation(LocationChangingContext context)
+ {
+ await Task.Yield();
+ context.PreventNavigation();
+ }
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_AreCanceledBySuccessiveNavigations_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var canceledHandlerTaskIds = new HashSet<string>();
+ var tcs = new TaskCompletionSource();
+
+ // Act
+ var locationChangingRegistration = navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+ locationChangingRegistration.Dispose();
+ var navigation2 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir2", null, false);
+
+ await tcs.Task.WaitAsync(Timeout);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+
+ Assert.True(navigation2.IsCompletedSuccessfully);
+ Assert.True(navigation2.Result);
+
+ async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ try
+ {
+ await Task.Delay(System.Threading.Timeout.Infinite, context.CancellationToken);
+ }
+ catch (TaskCanceledException ex)
+ {
+ if (ex.CancellationToken == context.CancellationToken)
+ {
+ tcs.SetResult();
+ }
+
+ throw;
+ }
+ };
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_AreCanceledBySuccessiveNavigations_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var canceledHandlerTaskIds = new HashSet<string>();
+ var initialHandlerCount = 3;
+ var expectedCanceledHandlerCount = 6; // 3 handlers canceled 2 times
+ var canceledHandlerCount = 0;
+ var completedHandlerCount = 0;
+ var locationChangingRegistrations = new IDisposable[initialHandlerCount];
+ var tcs = new TaskCompletionSource();
+
+ // Act
+ for (var i = 0; i < initialHandlerCount; i++)
+ {
+ locationChangingRegistrations[i] = navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+ }
+
+ // These two navigations get canceled
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+ var navigation2 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir2", null, false);
+
+ for (var i = 0; i < initialHandlerCount; i++)
+ {
+ locationChangingRegistrations[i].Dispose();
+ }
+
+ // This navigation continues without getting canceled
+ var navigation3 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir3", null, false);
+
+ await tcs.Task.WaitAsync(Timeout);
+
+ // Assert
+ Assert.True(navigation1.IsCompletedSuccessfully);
+ Assert.False(navigation1.Result);
+
+ Assert.True(navigation2.IsCompletedSuccessfully);
+ Assert.False(navigation2.Result);
+
+ Assert.True(navigation3.IsCompletedSuccessfully);
+ Assert.True(navigation3.Result);
+
+ Assert.Equal(expectedCanceledHandlerCount, canceledHandlerCount);
+ Assert.Equal(0, completedHandlerCount);
+
+ async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ try
+ {
+ await Task.Delay(System.Threading.Timeout.Infinite, context.CancellationToken);
+ Interlocked.Increment(ref completedHandlerCount);
+ }
+ catch (TaskCanceledException ex)
+ {
+ if (ex.CancellationToken == context.CancellationToken)
+ {
+ lock (navigationManager)
+ {
+ canceledHandlerCount++;
+
+ if (canceledHandlerCount == expectedCanceledHandlerCount)
+ {
+ tcs.SetResult();
+ }
+ }
+ }
+
+ throw;
+ }
+ };
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_CanThrowCatchableExceptionsAsynchronously_AfterNavigationEnds()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManagerWithLocationChangingExceptionTracking(baseUri);
+ var exceptionMessage = "Thrown from a test handler";
+ var preventNavigationTcs = new TaskCompletionSource();
+ var throwExceptionTcs = new TaskCompletionSource();
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_PreventNavigation);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_ThrowException);
+
+ // Act
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+ preventNavigationTcs.SetResult();
+ var navigation1Result = await navigation1;
+
+ // Assert
+ Assert.False(navigation1Result);
+ Assert.Empty(navigationManager.ExceptionsThrownFromLocationChangingHandlers);
+
+ throwExceptionTcs.SetResult();
+
+ var ex = Assert.Single(navigationManager.ExceptionsThrownFromLocationChangingHandlers);
+ Assert.Equal(exceptionMessage, ex.Message);
+
+ async ValueTask HandleLocationChanging_PreventNavigation(LocationChangingContext context)
+ {
+ await preventNavigationTcs.Task;
+ context.PreventNavigation();
+ }
+
+ async ValueTask HandleLocationChanging_ThrowException(LocationChangingContext context)
+ {
+ await throwExceptionTcs.Task;
+ throw new InvalidOperationException(exceptionMessage);
+ }
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_DoNotBubbleExceptionsThroughNotifyLocationChangingAsync_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManagerWithLocationChangingExceptionTracking(baseUri);
+ var exceptionMessage = "Thrown from a test handler";
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_ThrowException);
+
+ // Act
+ var navigation1Result = await navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1Result);
+ var ex = Assert.Single(navigationManager.ExceptionsThrownFromLocationChangingHandlers);
+ Assert.Equal(exceptionMessage, ex.Message);
+
+ async ValueTask HandleLocationChanging_ThrowException(LocationChangingContext context)
+ {
+ await Task.Yield();
+ throw new InvalidOperationException(exceptionMessage);
+ }
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_DoNotBubbleExceptionsThroughNotifyLocationChangingAsync_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManagerWithLocationChangingExceptionTracking(baseUri);
+ var exceptionMessage = "Thrown from a test handler";
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_AllowNavigation);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_ThrowException);
+
+ // Act
+ var navigation1Result = await navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Assert
+ Assert.True(navigation1Result);
+ var ex = Assert.Single(navigationManager.ExceptionsThrownFromLocationChangingHandlers);
+ Assert.Equal(exceptionMessage, ex.Message);
+
+ async ValueTask HandleLocationChanging_AllowNavigation(LocationChangingContext context)
+ {
+ await Task.Yield();
+ }
+
+ async ValueTask HandleLocationChanging_ThrowException(LocationChangingContext context)
+ {
+ await Task.Yield();
+ throw new InvalidOperationException(exceptionMessage);
+ }
+ }
+
+ [Fact]
+ public async Task LocationChangingAsync_Throws_WithoutHandleLocationChangingHandlerOverride_WhenALocationChangingHandlerThrows_WhenOneHandlerIsRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var exceptionMessage = "Thrown from a test handler";
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_ThrowException);
+
+ // Act
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false));
+ Assert.StartsWith("To support navigation locks", ex.Message);
+
+ async ValueTask HandleLocationChanging_ThrowException(LocationChangingContext context)
+ {
+ await Task.Yield();
+ throw new InvalidOperationException(exceptionMessage);
+ }
+ }
+
+ [Fact]
+ public async Task LocationChangingAsync_Throws_WithoutHandleLocationChangingHandlerOverride_WhenALocationChangingHandlerThrows_WhenMultipleHandlersAreRegistered()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var exceptionMessage = "Thrown from a test handler";
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_AllowNavigation);
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging_ThrowException);
+
+ // Act
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false));
+ Assert.StartsWith("To support navigation locks", ex.Message);
+
+ async ValueTask HandleLocationChanging_AllowNavigation(LocationChangingContext context)
+ {
+ await Task.Yield();
+ }
+
+ async ValueTask HandleLocationChanging_ThrowException(LocationChangingContext context)
+ {
+ await Task.Yield();
+ throw new InvalidOperationException(exceptionMessage);
+ }
+ }
+
+ [Fact]
+ public async Task LocationChangingHandlers_CannotCancelTheNavigationAsynchronously_UntilReturning()
+ {
+ // Arrange
+ var baseUri = "scheme://host/";
+ var navigationManager = new TestNavigationManager(baseUri);
+ var navigationPreventedTcs = new TaskCompletionSource();
+ var completeHandlerTcs = new TaskCompletionSource();
+ LocationChangingContext currentContext = null;
+
+ navigationManager.RegisterLocationChangingHandler(HandleLocationChanging);
+
+ // Act/Assert
+ var navigation1 = navigationManager.RunNotifyLocationChangingAsync($"{baseUri}/subdir1", null, false);
+
+ // Wait for the navigation to be prevented asynchronously
+ await navigationPreventedTcs.Task.WaitAsync(Timeout);
+
+ // Assert that we have prevented the navigation but the cancellation token has requested cancellation
+ Assert.True(currentContext.DidPreventNavigation);
+ Assert.False(currentContext.CancellationToken.IsCancellationRequested);
+
+ // Let the handler complete
+ completeHandlerTcs.SetResult();
+
+ var navigation1Result = await navigation1;
+
+ // Assert that the cancellation token has requested cancellation now that the handler has finished
+ Assert.True(currentContext.CancellationToken.IsCancellationRequested);
+ Assert.False(navigation1Result);
+
+ async ValueTask HandleLocationChanging(LocationChangingContext context)
+ {
+ currentContext = context;
+
+ // Force the navigation to be prevented asynchronously
+ await Task.Yield();
+
+ context.PreventNavigation();
+ navigationPreventedTcs.SetResult();
+
+ await completeHandlerTcs.Task;
+ }
+ }
+
private class TestNavigationManager : NavigationManager
{
public TestNavigationManager()
@@ -224,9 +864,33 @@ public class NavigationManagerTest
base.Initialize(baseUri, uri);
}
+ public async Task<bool> RunNotifyLocationChangingAsync(string uri, string state, bool isNavigationIntercepted)
+ => await NotifyLocationChangingAsync(uri, state, isNavigationIntercepted);
+
protected override void NavigateToCore(string uri, bool forceLoad)
{
throw new System.NotImplementedException();
}
+
+ protected override void SetNavigationLockState(bool value)
+ {
+ }
+ }
+
+ private class TestNavigationManagerWithLocationChangingExceptionTracking : TestNavigationManager
+ {
+ private readonly List<Exception> _exceptionsThrownFromLocationChangingHandlers = new();
+
+ public IReadOnlyList<Exception> ExceptionsThrownFromLocationChangingHandlers => _exceptionsThrownFromLocationChangingHandlers;
+
+ public TestNavigationManagerWithLocationChangingExceptionTracking(string baseUri = null, string uri = null)
+ : base(baseUri, uri)
+ {
+ }
+
+ protected override void HandleLocationChangingHandlerException(Exception ex, LocationChangingContext context)
+ {
+ _exceptionsThrownFromLocationChangingHandlers.Add(ex);
+ }
}
}
diff --git a/src/Components/Components/test/RendererTest.cs b/src/Components/Components/test/RendererTest.cs
index 6959ccc0d3..164dc17e39 100644
--- a/src/Components/Components/test/RendererTest.cs
+++ b/src/Components/Components/test/RendererTest.cs
@@ -5,6 +5,7 @@ using System.Collections.Concurrent;
using System.Diagnostics;
using System.Globalization;
using System.Runtime.ExceptionServices;
+using Microsoft.AspNetCore.Components.CompilerServices;
using Microsoft.AspNetCore.Components.HotReload;
using Microsoft.AspNetCore.Components.Rendering;
using Microsoft.AspNetCore.Components.RenderTree;
@@ -3043,6 +3044,199 @@ public class RendererTest
}
[Fact]
+ public async Task BindWithSynchronousSetter_Lambda()
+ {
+ // Arrange
+ var renderer = new TestRenderer();
+ var component = new OuterEventComponent();
+ var value = "value";
+ component.RenderFragment = (builder) =>
+ {
+ builder.OpenElement(0, "input");
+ builder.AddAttribute(1, "onchange", EventCallback.Factory.CreateBinder(
+ component,
+ RuntimeHelpers.CreateInferredEventCallback(component, __value => value = __value, value),
+ value));
+ builder.CloseElement();
+ };
+ var componentId = renderer.AssignRootComponentId(component);
+ await component.TriggerRenderAsync();
+ var checkboxChangeEventHandlerId = renderer.Batches.Single()
+ .ReferenceFrames
+ .First(frame => frame.FrameType == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerId != 0)
+ .AttributeEventHandlerId;
+
+ // Act: Trigger change event
+ var eventArgs = new ChangeEventArgs { Value = "hello" };
+ var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs);
+ await renderTask;
+
+ // Assert
+ Assert.Equal("hello", value);
+ }
+
+ [Fact]
+ public async Task BindWithAsynchronousSetter_MethodGroupToDelegate()
+ {
+ // This test represents https://github.com/dotnet/blazor/issues/624
+
+ // Arrange: Rendered with textbox enabled
+ var renderer = new TestRenderer();
+ var component = new OuterEventComponent();
+ var value = "value";
+ async Task SetValue(string __value)
+ {
+ value = __value;
+ await Task.CompletedTask;
+ }
+ component.RenderFragment = (builder) =>
+ {
+ builder.OpenElement(0, "input");
+ builder.AddAttribute(1, "onchange", EventCallback.Factory.CreateBinder(
+ component,
+ RuntimeHelpers.CreateInferredEventCallback(component, SetValue, value),
+ value));
+ builder.CloseElement();
+ };
+ var componentId = renderer.AssignRootComponentId(component);
+ await component.TriggerRenderAsync();
+ var checkboxChangeEventHandlerId = renderer.Batches.Single()
+ .ReferenceFrames
+ .First(frame => frame.FrameType == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerId != 0)
+ .AttributeEventHandlerId;
+
+ // Act: Trigger change event
+ var eventArgs = new ChangeEventArgs { Value = "hello" };
+ var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs);
+ await renderTask;
+
+ // Assert
+ Assert.Equal("hello", value);
+ }
+
+ [Fact]
+ public async Task BindWithAsynchronousSetter_ExistingEventCallback()
+ {
+ // This test represents https://github.com/dotnet/blazor/issues/624
+
+ // Arrange: Rendered with textbox enabled
+ var renderer = new TestRenderer();
+ var component = new OuterEventComponent();
+#nullable enable
+ var value = "value";
+ var eventCallback = new EventCallback<string?>(component, (string? __value) =>
+ {
+ value = __value;
+ });
+#nullable disable
+ component.RenderFragment = (builder) =>
+ {
+ builder.OpenElement(0, "input");
+ builder.AddAttribute(1, "onchange", EventCallback.Factory.CreateBinder(
+ component,
+ RuntimeHelpers.CreateInferredEventCallback(component, eventCallback, value),
+ value));
+ builder.CloseElement();
+ };
+ var componentId = renderer.AssignRootComponentId(component);
+ await component.TriggerRenderAsync();
+ var checkboxChangeEventHandlerId = renderer.Batches.Single()
+ .ReferenceFrames
+ .First(frame => frame.FrameType == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerId != 0)
+ .AttributeEventHandlerId;
+
+ // Act: Trigger change event
+ var eventArgs = new ChangeEventArgs { Value = "hello" };
+ var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs);
+ await renderTask;
+
+ // Assert
+ Assert.Equal("hello", value);
+ }
+
+ [Fact]
+ public async Task BindWithAfter()
+ {
+ // This test represents https://github.com/dotnet/blazor/issues/624
+
+ // Arrange: Rendered with textbox enabled
+ var renderer = new TestRenderer();
+ var component = new OuterEventComponent();
+ string value = "value";
+ component.RenderFragment = (builder) =>
+ {
+ builder.OpenElement(0, "input");
+ builder.AddAttribute(1, "onchange", EventCallback.Factory.CreateBinder(
+ component,
+ RuntimeHelpers.CreateInferredEventCallback(
+ component,
+ async __value =>
+ {
+ value = __value;
+ await EventCallback.Factory.Create(component, () => Task.CompletedTask).InvokeAsync();
+ },
+ value),
+ value));
+ builder.CloseElement();
+ };
+ var componentId = renderer.AssignRootComponentId(component);
+ await component.TriggerRenderAsync();
+ var checkboxChangeEventHandlerId = renderer.Batches.Single()
+ .ReferenceFrames
+ .First(frame => frame.FrameType == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerId != 0)
+ .AttributeEventHandlerId;
+
+ // Act: Trigger change event
+ var eventArgs = new ChangeEventArgs { Value = "hello" };
+ var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs);
+ await renderTask;
+
+ // Assert
+ Assert.Equal("hello", value);
+ }
+
+ [Fact]
+ public async Task BindWithAfter_Action()
+ {
+ // This test represents https://github.com/dotnet/blazor/issues/624
+
+ // Arrange: Rendered with textbox enabled
+ var renderer = new TestRenderer();
+ var component = new OuterEventComponent();
+ string value = "value";
+ component.RenderFragment = (builder) =>
+ {
+ builder.OpenElement(0, "input");
+ builder.AddAttribute(1, "onchange", EventCallback.Factory.CreateBinder(
+ component,
+ RuntimeHelpers.CreateInferredEventCallback(
+ component,
+ async __value =>
+ {
+ value = __value;
+ await EventCallback.Factory.Create(component, () => { }).InvokeAsync();
+ },
+ value),
+ value));
+ builder.CloseElement();
+ };
+ var componentId = renderer.AssignRootComponentId(component);
+ await component.TriggerRenderAsync();
+ var checkboxChangeEventHandlerId = renderer.Batches.Single()
+ .ReferenceFrames
+ .First(frame => frame.FrameType == RenderTreeFrameType.Attribute && frame.AttributeEventHandlerId != 0)
+ .AttributeEventHandlerId;
+
+ // Act: Trigger change event
+ var eventArgs = new ChangeEventArgs { Value = "hello" };
+ var renderTask = renderer.DispatchEventAsync(checkboxChangeEventHandlerId, eventArgs);
+ await renderTask;
+
+ // Assert
+ Assert.Equal("hello", value);
+ }
+
+ [Fact]
public void HandlesNestedElementCapturesDuringRefresh()
{
// This may seem like a very arbitrary test case, but at once stage there was a bug
diff --git a/src/Components/Components/test/Routing/RouterTest.cs b/src/Components/Components/test/Routing/RouterTest.cs
index d97a2800f6..01323d2568 100644
--- a/src/Components/Components/test/Routing/RouterTest.cs
+++ b/src/Components/Components/test/Routing/RouterTest.cs
@@ -203,7 +203,7 @@ public class RouterTest
public TestNavigationManager() =>
Initialize("https://www.example.com/subdir/", "https://www.example.com/subdir/jan");
- public void NotifyLocationChanged(string uri, bool intercepted)
+ public void NotifyLocationChanged(string uri, bool intercepted, string state = null)
{
Uri = uri;
NotifyLocationChanged(intercepted);
diff --git a/src/Components/ComponentsNoDeps.slnf b/src/Components/ComponentsNoDeps.slnf
index b94e14c908..384d48cb49 100644
--- a/src/Components/ComponentsNoDeps.slnf
+++ b/src/Components/ComponentsNoDeps.slnf
@@ -47,10 +47,12 @@
"src\\Components\\benchmarkapps\\Wasm.Performance\\TestApp\\Wasm.Performance.TestApp.csproj",
"src\\Components\\test\\E2ETest\\Microsoft.AspNetCore.Components.E2ETests.csproj",
"src\\Components\\test\\testassets\\BasicTestApp\\BasicTestApp.csproj",
+ "src\\Components\\test\\testassets\\ComponentsApp.App\\ComponentsApp.App.csproj",
"src\\Components\\test\\testassets\\ComponentsApp.Server\\ComponentsApp.Server.csproj",
"src\\Components\\test\\testassets\\GlobalizationWasmApp\\GlobalizationWasmApp.csproj",
+ "src\\Components\\test\\testassets\\LazyTestContentPackage\\LazyTestContentPackage.csproj",
"src\\Components\\test\\testassets\\TestContentPackage\\TestContentPackage.csproj",
"src\\Components\\test\\testassets\\TestServer\\Components.TestServer.csproj"
]
}
-}
+} \ No newline at end of file
diff --git a/src/Components/CustomElements/src/JSComponentConfigurationExtensions.cs b/src/Components/CustomElements/src/JSComponentConfigurationExtensions.cs
new file mode 100644
index 0000000000..8ff0f184af
--- /dev/null
+++ b/src/Components/CustomElements/src/JSComponentConfigurationExtensions.cs
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+
+namespace Microsoft.AspNetCore.Components.Web;
+
+/// <summary>
+/// Extension methods for registering custom elements from an <see cref="IJSComponentConfiguration"/>.
+/// </summary>
+public static class CustomElementsJSComponentConfigurationExtensions
+{
+ /// <summary>
+ /// Marks the specified component type as allowed for use as a custom element.
+ /// </summary>
+ /// <typeparam name="TComponent">The component type.</typeparam>
+ /// <param name="configuration">The <see cref="IJSComponentConfiguration"/>.</param>
+ /// <param name="identifier">A unique name for the custom element. This must conform to custom element naming rules, so it must contain a dash character.</param>
+ public static void RegisterCustomElement<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TComponent>(this IJSComponentConfiguration configuration, string identifier) where TComponent : IComponent
+ => configuration.RegisterForJavaScript<TComponent>(identifier, "registerBlazorCustomElement");
+}
diff --git a/src/Components/CustomElements/src/Microsoft.AspNetCore.Components.CustomElements.csproj b/src/Components/CustomElements/src/Microsoft.AspNetCore.Components.CustomElements.csproj
new file mode 100644
index 0000000000..95c2b5ab32
--- /dev/null
+++ b/src/Components/CustomElements/src/Microsoft.AspNetCore.Components.CustomElements.csproj
@@ -0,0 +1,86 @@
+<Project Sdk="Microsoft.NET.Sdk.Razor">
+
+ <Import Project="Sdk.props" Sdk="Yarn.MSBuild" Condition=" '$(DotNetBuildFromSource)' != 'true'" />
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <Description>Provides a mechanism for using Blazor components as custom HTML elements.</Description>
+ <IsTrimmable>true</IsTrimmable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Components.Web" />
+ </ItemGroup>
+
+ <PropertyGroup>
+ <YarnWorkingDir>$(MSBuildThisFileDirectory)js\</YarnWorkingDir>
+ <ResolveStaticWebAssetsInputsDependsOn>
+ CompileJs;
+ IncludeCompileJsOutput;
+ $(ResolveStaticWebAssetsInputsDependsOn)
+ </ResolveStaticWebAssetsInputsDependsOn>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <YarnInputs Include="$(YarnWorkingDir)**" Exclude="$(YarnWorkingDir)node_modules\**;$(YarnWorkingDir)*.d.ts;$(YarnWorkingDir)dist\**" />
+ <YarnOutputs Include="$(YarnWorkingDir)dist\$(Configuration)\BlazorCustomElements.js" />
+
+ <Content Remove="$(YarnWorkingDir)**" />
+ <None Include="$(YarnWorkingDir)*" Exclude="$(YarnWorkingDir)node_modules\**" />
+
+ <UpToDateCheckInput Include="@(YarnInputs)" Set="StaticWebassets" />
+ <UpToDateCheckInput Include="@(YarnOutputs)" Set="StaticWebassets" />
+ </ItemGroup>
+
+ <Target Name="_CreateJsHash" BeforeTargets="CompileJs" Condition="'$(BuildNodeJS)' != 'false' AND '$(DesignTimeBuild)' != 'true'">
+
+ <PropertyGroup>
+ <JsCompilationCacheFile>$(IntermediateOutputPath)js.cache</JsCompilationCacheFile>
+ </PropertyGroup>
+
+ <Hash ItemsToHash="@(YarnInputs)">
+ <Output TaskParameter="HashResult" PropertyName="_YarnInputsHash" />
+ </Hash>
+
+ <WriteLinesToFile Lines="$(_YarnInputsHash)" File="$(JsCompilationCacheFile)" Overwrite="True" WriteOnlyWhenDifferent="True" />
+
+ <ItemGroup>
+ <FileWrites Include="$(JsCompilationCacheFile)" />
+ </ItemGroup>
+
+ </Target>
+
+ <Target Name="CompileJs" Condition="'$(BuildNodeJS)' != 'false' AND '$(DesignTimeBuild)' != 'true'" Inputs="$(JsCompilationCacheFile)" Outputs="@(YarnOutputs)">
+ <Yarn Command="install --mutex network --frozen-lockfile" WorkingDirectory="$(YarnWorkingDir)" IgnoreStandardErrorWarningFormat="$(IgnoreYarnWarnings)" />
+ <Yarn Command="run build:production" WorkingDirectory="$(YarnWorkingDir)" Condition="'$(Configuration)' == 'Release'" IgnoreStandardErrorWarningFormat="$(IgnoreYarnWarnings)" />
+ <Yarn Command="run build:debug" WorkingDirectory="$(YarnWorkingDir)" Condition="'$(Configuration)' == 'Debug'" IgnoreStandardErrorWarningFormat="$(IgnoreYarnWarnings)" />
+
+ <Message Importance="high" Text="@(_JsBuildOutput->'Emitted %(FullPath)')" />
+
+ </Target>
+
+ <Target Name="IncludeCompileJsOutput">
+ <ItemGroup>
+ <_JsBuildOutput Include="$(YarnWorkingDir)dist\$(Configuration)\**" Exclude="$(YarnWorkingDir)dist\.gitignore" />
+ </ItemGroup>
+
+ <DefineStaticWebAssets Condition="'@(_JsBuildOutput)' != ''"
+ SourceType="Computed"
+ SourceId="$(PackageId)"
+ ContentRoot="$(YarnWorkingDir)dist\$(Configuration)\"
+ BasePath="_content\$(PackageId)"
+ CandidateAssets="@(_JsBuildOutput)"
+ RelativePathFilter="**.js"
+ >
+ <Output TaskParameter="Assets" ItemName="StaticWebAsset" />
+ </DefineStaticWebAssets>
+
+ <ItemGroup>
+ <_JsBuildOutput Include="$(YarnWorkingDir)dist\$(Configuration)\**" Exclude="$(YarnWorkingDir)dist\.gitignore" />
+ <FileWrites Include="$(_JsBuildOutput)" />
+ </ItemGroup>
+ </Target>
+
+ <Import Project="Sdk.targets" Sdk="Yarn.MSBuild" Condition=" '$(DotNetBuildFromSource)' != 'true'" />
+
+</Project>
diff --git a/src/Components/CustomElements/src/PublicAPI.Shipped.txt b/src/Components/CustomElements/src/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..ab058de62d
--- /dev/null
+++ b/src/Components/CustomElements/src/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Components/CustomElements/src/PublicAPI.Unshipped.txt b/src/Components/CustomElements/src/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..d4fcfd03d8
--- /dev/null
+++ b/src/Components/CustomElements/src/PublicAPI.Unshipped.txt
@@ -0,0 +1,3 @@
+#nullable enable
+Microsoft.AspNetCore.Components.Web.CustomElementsJSComponentConfigurationExtensions
+static Microsoft.AspNetCore.Components.Web.CustomElementsJSComponentConfigurationExtensions.RegisterCustomElement<TComponent>(this Microsoft.AspNetCore.Components.Web.IJSComponentConfiguration! configuration, string! identifier) -> void
diff --git a/src/Components/CustomElements/src/js/.npmrc b/src/Components/CustomElements/src/js/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Components/CustomElements/src/js/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Components/CustomElements/src/js/BlazorCustomElements.ts b/src/Components/CustomElements/src/js/BlazorCustomElements.ts
new file mode 100644
index 0000000000..b963cc0274
--- /dev/null
+++ b/src/Components/CustomElements/src/js/BlazorCustomElements.ts
@@ -0,0 +1,156 @@
+declare const Blazor: any;
+
+// This function is called by the framework because RegisterAsCustomElement sets it as the initializer function
+(window as any).registerBlazorCustomElement = function defaultRegisterCustomElement(elementName: string, parameters: JSComponentParameter[]): void {
+ customElements.define(elementName, class ConfiguredBlazorCustomElement extends BlazorCustomElement {
+ static get observedAttributes() {
+ return BlazorCustomElement.getObservedAttributes(parameters);
+ }
+
+ constructor() {
+ super(parameters);
+ }
+ });
+}
+
+export class BlazorCustomElement extends HTMLElement {
+ private _attributeMappings: { [attributeName: string]: JSComponentParameter };
+ private _parameterValues: { [dotNetName: string]: any } = {};
+ private _addRootComponentPromise: Promise<any>;
+ private _hasPendingSetParameters = true; // The constructor will call setParameters, so it starts true
+ private _isDisposed = false;
+ private _disposalTimeoutHandle: any;
+
+ public renderIntoElement = this;
+
+ // Subclasses will need to call this if they want to retain the built-in behavior for knowing which
+ // attribute names to observe, since they have to return it from a static function
+ static getObservedAttributes(parameters: JSComponentParameter[]): string[] {
+ return parameters.map(p => dasherize(p.name));
+ }
+
+ constructor(parameters: JSComponentParameter[]) {
+ super();
+
+ // Keep track of how we'll map the attributes to parameters
+ this._attributeMappings = {};
+ parameters.forEach(parameter => {
+ const attributeName = dasherize(parameter.name);
+ this._attributeMappings[attributeName] = parameter;
+ });
+
+ // Defer until end of execution cycle so that (1) we know the heap is unlocked, and (2) the initial parameter
+ // values will be populated from the initial attributes before we send them to .NET
+ this._addRootComponentPromise = Promise.resolve().then(() => {
+ this._hasPendingSetParameters = false;
+ return Blazor.rootComponents.add(this.renderIntoElement, this.localName, this._parameterValues);
+ });
+
+ // Also allow assignment of parameters via properties. This is the only way to set complex-typed values.
+ for (const [attributeName, parameterInfo] of Object.entries(this._attributeMappings)) {
+ const dotNetName = parameterInfo.name;
+ Object.defineProperty(this, camelCase(dotNetName), {
+ get: () => this._parameterValues[dotNetName],
+ set: newValue => {
+ if (this.hasAttribute(attributeName)) {
+ // It's nice to keep the DOM in sync with the properties. This set a string representation
+ // of the value, but this will get overwritten with the original typed value before we send it to .NET
+ this.setAttribute(attributeName, newValue);
+ }
+
+ this._parameterValues[dotNetName] = newValue;
+ this._supplyUpdatedParameters();
+ }
+ });
+ }
+ }
+
+ connectedCallback() {
+ if (this._isDisposed) {
+ throw new Error(`Cannot connect component ${this.localName} to the document after it has been disposed.`);
+ }
+
+ clearTimeout(this._disposalTimeoutHandle);
+ }
+
+ disconnectedCallback() {
+ this._disposalTimeoutHandle = setTimeout(async () => {
+ this._isDisposed = true;
+ const rootComponent = await this._addRootComponentPromise;
+ rootComponent.dispose();
+ }, 1000);
+ }
+
+ attributeChangedCallback(name: string, oldValue: string, newValue: string) {
+ const parameterInfo = this._attributeMappings[name];
+ if (parameterInfo) {
+ this._parameterValues[parameterInfo.name] = BlazorCustomElement.parseAttributeValue(newValue, parameterInfo.type, parameterInfo.name);
+ this._supplyUpdatedParameters();
+ }
+ }
+
+ private async _supplyUpdatedParameters() {
+ if (!this._hasPendingSetParameters) {
+ this._hasPendingSetParameters = true;
+
+ // Continuation from here will always be async, so at the earliest it will be at
+ // the end of the current JS execution cycle
+ const rootComponent = await this._addRootComponentPromise;
+ if (!this._isDisposed) {
+ const setParametersPromise = rootComponent.setParameters(this._parameterValues);
+ this._hasPendingSetParameters = false; // We just snapshotted _parameterValues, so we need to start allowing new calls in case it changes further
+ await setParametersPromise;
+ }
+ }
+ }
+
+ static parseAttributeValue(attributeValue: string, type: JSComponentParameterType, parameterName: string): any {
+ switch (type) {
+ case 'string':
+ return attributeValue;
+ case 'boolean':
+ switch (attributeValue) {
+ case 'true':
+ case 'True':
+ return true;
+ case 'false':
+ case 'False':
+ return false;
+ default:
+ throw new Error(`Invalid boolean value '${attributeValue}' for parameter '${parameterName}'`);
+ }
+ case 'number':
+ const number = Number(attributeValue);
+ if (Number.isNaN(number)) {
+ throw new Error(`Invalid number value '${attributeValue}' for parameter '${parameterName}'`);
+ } else {
+ return number;
+ }
+ case 'boolean?':
+ return attributeValue ? BlazorCustomElement.parseAttributeValue(attributeValue, 'boolean', parameterName) : null;
+ case 'number?':
+ return attributeValue ? BlazorCustomElement.parseAttributeValue(attributeValue, 'number', parameterName) : null;
+ case 'object':
+ throw new Error(`The parameter '${parameterName}' accepts a complex-typed object so it cannot be set using an attribute. Try setting it as a element property instead.`);
+ default:
+ throw new Error(`Unknown type '${type}' for parameter '${parameterName}'`);
+ }
+ }
+}
+
+function dasherize(value: string): string {
+ return camelCase(value).replace(/([A-Z])/g, "-$1").toLowerCase();
+}
+
+function camelCase(value: string): string {
+ return value[0].toLowerCase() + value.substring(1);
+}
+
+interface JSComponentParameter {
+ name: string;
+ type: JSComponentParameterType;
+}
+
+// JSON-primitive types, plus for those whose .NET equivalent isn't nullable, a '?' to indicate nullability
+// This allows custom element authors to coerce attribute strings into the appropriate type
+type JSComponentParameterType = 'string' | 'boolean' | 'boolean?' | 'number' | 'number?' | 'object';
diff --git a/src/Components/CustomElements/src/js/babel.config.json b/src/Components/CustomElements/src/js/babel.config.json
new file mode 100644
index 0000000000..d48662a9cf
--- /dev/null
+++ b/src/Components/CustomElements/src/js/babel.config.json
@@ -0,0 +1,3 @@
+{
+ "presets": [ [ "@babel/preset-env", { "targets": { "node": true } } ] ]
+}
diff --git a/src/Components/CustomElements/src/js/dist/.gitignore b/src/Components/CustomElements/src/js/dist/.gitignore
new file mode 100644
index 0000000000..bd25200e2b
--- /dev/null
+++ b/src/Components/CustomElements/src/js/dist/.gitignore
@@ -0,0 +1,3 @@
+**/*.js
+**/*.js.map
+**/*.txt
diff --git a/src/Components/CustomElements/src/js/package.json b/src/Components/CustomElements/src/js/package.json
new file mode 100644
index 0000000000..c0dabb13c8
--- /dev/null
+++ b/src/Components/CustomElements/src/js/package.json
@@ -0,0 +1,29 @@
+{
+ "private": true,
+ "scripts": {
+ "preclean": "yarn install --mutex network --frozen-lockfile",
+ "clean": "node node_modules/rimraf/bin.js ./dist/Debug ./dist/Release",
+ "prebuild": "yarn run clean && yarn install --mutex network --frozen-lockfile",
+ "build": "yarn run build:debug && yarn run build:production",
+ "build:debug": "node node_modules/webpack-cli/bin/cli.js --mode development --config ./webpack.config.js",
+ "build:production": "node node_modules/webpack-cli/bin/cli.js --mode production --config ./webpack.config.js"
+ },
+ "devDependencies": {
+ "@babel/core": "^7.15.0",
+ "@babel/preset-env": "^7.15.0",
+ "@typescript-eslint/eslint-plugin": "^5.26.0",
+ "@typescript-eslint/parser": "^5.26.0",
+ "eslint": "^8.16.0",
+ "inspectpack": "^4.7.1",
+ "rimraf": "^3.0.2",
+ "terser": "^5.14.2",
+ "ts-loader": "^9.2.5",
+ "typescript": "^4.4.2",
+ "webpack": "^5.72.1",
+ "webpack-cli": "^4.9.2"
+ },
+ "resolutions": {
+ "ansi-regex": "5.0.1",
+ "minimist": ">=1.2.6"
+ }
+}
diff --git a/src/Components/CustomElements/src/js/tsconfig.json b/src/Components/CustomElements/src/js/tsconfig.json
new file mode 100644
index 0000000000..13316f2a9e
--- /dev/null
+++ b/src/Components/CustomElements/src/js/tsconfig.json
@@ -0,0 +1,11 @@
+{
+ "compilerOptions": {
+ "target": "ES2019",
+ "module": "commonjs",
+ "lib": [ "DOM", "ES2019" ],
+ "sourceMap": true,
+ "strict": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true
+ }
+}
diff --git a/src/Components/CustomElements/src/js/webpack.config.js b/src/Components/CustomElements/src/js/webpack.config.js
new file mode 100644
index 0000000000..5dacdcf860
--- /dev/null
+++ b/src/Components/CustomElements/src/js/webpack.config.js
@@ -0,0 +1,70 @@
+const path = require('path');
+const webpack = require('webpack');
+const TerserJsPlugin = require("terser-webpack-plugin");
+const { DuplicatesPlugin } = require("inspectpack/plugin");
+
+module.exports = (env, args) => ({
+ resolve: {
+ extensions: ['.ts', '.js'],
+ },
+ devtool: false, // Source maps configured below
+ module: {
+ rules: [{ test: /\.ts?$/, loader: 'ts-loader' }]
+ },
+ entry: {
+ 'BlazorCustomElements': './BlazorCustomElements.ts',
+ },
+ output: { path: path.join(__dirname, 'dist', args.mode == 'development' ? 'Debug' : 'Release'), filename: '[name].js' },
+ performance: {
+ maxAssetSize: 122880,
+ },
+ optimization: {
+ sideEffects: true,
+ concatenateModules: true,
+ providedExports: true,
+ usedExports: true,
+ innerGraph: true,
+ minimize: true,
+ minimizer: [new TerserJsPlugin({
+ terserOptions: {
+ ecma: 2019,
+ compress: {
+ passes: 3
+ },
+ mangle: {
+ },
+ module: false,
+ format: {
+ ecma: 2019
+ },
+ keep_classnames: false,
+ keep_fnames: false,
+ toplevel: true
+ }
+ })]
+ },
+ plugins: Array.prototype.concat.apply([
+ new webpack.DefinePlugin({
+ 'process.env.NODE_DEBUG': false,
+ 'Platform.isNode': false
+ }),
+ new DuplicatesPlugin({
+ emitErrors: false,
+ emitHandler: undefined,
+ ignoredPackages: undefined,
+ verbose: false
+ }),
+ ], args.mode !== 'development' ? [] : [
+ // In most cases we want to use external source map files
+ new webpack.SourceMapDevToolPlugin({
+ filename: '[name].js.map',
+ exclude: 'blazor.webview.js',
+ })
+ ]),
+ stats: {
+ warnings: true,
+ errors: true,
+ performance: true,
+ optimizationBailout: true
+ }
+});
diff --git a/src/Components/CustomElements/src/js/yarn.lock b/src/Components/CustomElements/src/js/yarn.lock
new file mode 100644
index 0000000000..00becb2ca0
--- /dev/null
+++ b/src/Components/CustomElements/src/js/yarn.lock
@@ -0,0 +1,2797 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
+ integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.1.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
+ integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+ dependencies:
+ "@babel/highlight" "^7.16.7"
+
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.17.10":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471"
+ integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==
+
+"@babel/core@^7.15.0":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000"
+ integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.18.2"
+ "@babel/helper-compilation-targets" "^7.18.2"
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helpers" "^7.18.2"
+ "@babel/parser" "^7.18.5"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.18.5"
+ "@babel/types" "^7.18.4"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.1"
+ semver "^6.3.0"
+
+"@babel/generator@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d"
+ integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==
+ dependencies:
+ "@babel/types" "^7.18.2"
+ "@jridgewell/gen-mapping" "^0.3.0"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862"
+ integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b"
+ integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.17.10", "@babel/helper-compilation-targets@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b"
+ integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-validator-option" "^7.16.7"
+ browserslist "^4.20.2"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.17.12", "@babel/helper-create-class-features-plugin@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz#fac430912606331cb075ea8d82f9a4c145a4da19"
+ integrity sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-member-expression-to-functions" "^7.17.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+
+"@babel/helper-create-regexp-features-plugin@^7.16.7", "@babel/helper-create-regexp-features-plugin@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz#bb37ca467f9694bbe55b884ae7a5cc1e0084e4fd"
+ integrity sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ regexpu-core "^5.0.1"
+
+"@babel/helper-define-polyfill-provider@^0.3.1":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
+ integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.13.0"
+ "@babel/helper-module-imports" "^7.12.13"
+ "@babel/helper-plugin-utils" "^7.13.0"
+ "@babel/traverse" "^7.13.0"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd"
+ integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==
+
+"@babel/helper-explode-assignable-expression@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a"
+ integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-function-name@^7.16.7", "@babel/helper-function-name@^7.17.9":
+ version "7.17.9"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12"
+ integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-hoist-variables@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
+ integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-member-expression-to-functions@^7.17.7":
+ version "7.17.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz#a34013b57d8542a8c4ff8ba3f747c02452a4d8c4"
+ integrity sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==
+ dependencies:
+ "@babel/types" "^7.17.0"
+
+"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
+ integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-module-transforms@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd"
+ integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.16.7"
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-simple-access" "^7.17.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.18.0"
+ "@babel/types" "^7.18.0"
+
+"@babel/helper-optimise-call-expression@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2"
+ integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.17.12", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz#86c2347da5acbf5583ba0a10aed4c9bf9da9cf96"
+ integrity sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==
+
+"@babel/helper-remap-async-to-generator@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3"
+ integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-wrap-function" "^7.16.8"
+ "@babel/types" "^7.16.8"
+
+"@babel/helper-replace-supers@^7.16.7", "@babel/helper-replace-supers@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz#41fdfcc9abaf900e18ba6e5931816d9062a7b2e0"
+ integrity sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.2"
+ "@babel/helper-member-expression-to-functions" "^7.17.7"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/traverse" "^7.18.2"
+ "@babel/types" "^7.18.2"
+
+"@babel/helper-simple-access@^7.17.7", "@babel/helper-simple-access@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9"
+ integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==
+ dependencies:
+ "@babel/types" "^7.18.2"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
+ version "7.16.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
+ integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==
+ dependencies:
+ "@babel/types" "^7.16.0"
+
+"@babel/helper-split-export-declaration@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
+ integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
+ dependencies:
+ "@babel/types" "^7.16.7"
+
+"@babel/helper-validator-identifier@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
+ integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
+
+"@babel/helper-validator-option@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
+ integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
+
+"@babel/helper-wrap-function@^7.16.8":
+ version "7.16.8"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200"
+ integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==
+ dependencies:
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.16.8"
+ "@babel/types" "^7.16.8"
+
+"@babel/helpers@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384"
+ integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==
+ dependencies:
+ "@babel/template" "^7.16.7"
+ "@babel/traverse" "^7.18.2"
+ "@babel/types" "^7.18.2"
+
+"@babel/highlight@^7.16.7":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351"
+ integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.16.7", "@babel/parser@^7.18.5":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c"
+ integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz#1dca338caaefca368639c9ffb095afbd4d420b1e"
+ integrity sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz#0d498ec8f0374b1e2eb54b9cb2c4c78714c77753"
+ integrity sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.17.12"
+
+"@babel/plugin-proposal-async-generator-functions@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz#094a417e31ce7e692d84bab06c8e2a607cbeef03"
+ integrity sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-remap-async-to-generator" "^7.16.8"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz#84f65c0cc247d46f40a6da99aadd6438315d80a4"
+ integrity sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-proposal-class-static-block@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz#7d02253156e3c3793bdb9f2faac3a1c05f0ba710"
+ integrity sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-dynamic-import@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2"
+ integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz#b22864ccd662db9606edb2287ea5fd1709f05378"
+ integrity sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz#f4642951792437233216d8c1af370bb0fbff4664"
+ integrity sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz#c64a1bcb2b0a6d0ed2ff674fd120f90ee4b88a23"
+ integrity sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz#1e93079bbc2cbc756f6db6a1925157c4a92b94be"
+ integrity sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9"
+ integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz#79f2390c892ba2a68ec112eb0d895cfbd11155e8"
+ integrity sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-compilation-targets" "^7.17.10"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.17.12"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf"
+ integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz#f96949e9bacace3a9066323a5cf90cfb9de67174"
+ integrity sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz#c2ca3a80beb7539289938da005ad525a038a819c"
+ integrity sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-proposal-private-property-in-object@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz#b02efb7f106d544667d91ae97405a9fd8c93952d"
+ integrity sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.17.12", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz#3dbd7a67bd7f94c8238b394da112d86aaf32ad4d"
+ integrity sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz#58096a92b11b2e4e54b24c6a0cc0e5e607abcedd"
+ integrity sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-arrow-functions@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz#dddd783b473b1b1537ef46423e3944ff24898c45"
+ integrity sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-async-to-generator@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz#dbe5511e6b01eee1496c944e35cdfe3f58050832"
+ integrity sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-remap-async-to-generator" "^7.16.8"
+
+"@babel/plugin-transform-block-scoped-functions@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620"
+ integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-block-scoping@^7.17.12":
+ version "7.18.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz#7988627b3e9186a13e4d7735dc9c34a056613fb9"
+ integrity sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-classes@^7.17.12":
+ version "7.18.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz#51310b812a090b846c784e47087fa6457baef814"
+ integrity sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.16.7"
+ "@babel/helper-environment-visitor" "^7.18.2"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-optimise-call-expression" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-replace-supers" "^7.18.2"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz#bca616a83679698f3258e892ed422546e531387f"
+ integrity sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-destructuring@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz#dc4f92587e291b4daa78aa20cc2d7a63aa11e858"
+ integrity sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241"
+ integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-duplicate-keys@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz#a09aa709a3310013f8e48e0e23bc7ace0f21477c"
+ integrity sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-exponentiation-operator@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b"
+ integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-for-of@^7.18.1":
+ version "7.18.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz#ed14b657e162b72afbbb2b4cdad277bf2bb32036"
+ integrity sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-function-name@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf"
+ integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.16.7"
+ "@babel/helper-function-name" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-literals@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz#97131fbc6bbb261487105b4b3edbf9ebf9c830ae"
+ integrity sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-member-expression-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384"
+ integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-modules-amd@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz#7ef1002e67e36da3155edc8bf1ac9398064c02ed"
+ integrity sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz#1aa8efa2e2a6e818b6a7f2235fceaf09bdb31e9e"
+ integrity sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-simple-access" "^7.18.2"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.18.0":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz#87f11c44fbfd3657be000d4897e192d9cb535996"
+ integrity sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-validator-identifier" "^7.16.7"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz#56aac64a2c2a1922341129a4597d1fd5c3ff020f"
+ integrity sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.0"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz#9c4a5a5966e0434d515f2675c227fd8cc8606931"
+ integrity sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.17.12"
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-new-target@^7.17.12":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz#8c228c4a07501dd12c95c5f23d1622131cc23931"
+ integrity sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-object-super@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94"
+ integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-replace-supers" "^7.16.7"
+
+"@babel/plugin-transform-parameters@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz#eb467cd9586ff5ff115a9880d6fdbd4a846b7766"
+ integrity sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-property-literals@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55"
+ integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-regenerator@^7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz#44274d655eb3f1af3f3a574ba819d3f48caf99d5"
+ integrity sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ regenerator-transform "^0.15.0"
+
+"@babel/plugin-transform-reserved-words@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz#7dbd349f3cdffba751e817cf40ca1386732f652f"
+ integrity sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-shorthand-properties@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a"
+ integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-spread@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz#c112cad3064299f03ea32afed1d659223935d1f5"
+ integrity sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+
+"@babel/plugin-transform-sticky-regex@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660"
+ integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-template-literals@^7.18.2":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz#31ed6915721864847c48b656281d0098ea1add28"
+ integrity sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-typeof-symbol@^7.17.12":
+ version "7.17.12"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz#0f12f57ac35e98b35b4ed34829948d42bd0e6889"
+ integrity sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.17.12"
+
+"@babel/plugin-transform-unicode-escapes@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3"
+ integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/plugin-transform-unicode-regex@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2"
+ integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+
+"@babel/preset-env@^7.15.0":
+ version "7.18.2"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.2.tgz#f47d3000a098617926e674c945d95a28cb90977a"
+ integrity sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==
+ dependencies:
+ "@babel/compat-data" "^7.17.10"
+ "@babel/helper-compilation-targets" "^7.18.2"
+ "@babel/helper-plugin-utils" "^7.17.12"
+ "@babel/helper-validator-option" "^7.16.7"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.17.12"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.17.12"
+ "@babel/plugin-proposal-async-generator-functions" "^7.17.12"
+ "@babel/plugin-proposal-class-properties" "^7.17.12"
+ "@babel/plugin-proposal-class-static-block" "^7.18.0"
+ "@babel/plugin-proposal-dynamic-import" "^7.16.7"
+ "@babel/plugin-proposal-export-namespace-from" "^7.17.12"
+ "@babel/plugin-proposal-json-strings" "^7.17.12"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.17.12"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.17.12"
+ "@babel/plugin-proposal-numeric-separator" "^7.16.7"
+ "@babel/plugin-proposal-object-rest-spread" "^7.18.0"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
+ "@babel/plugin-proposal-optional-chaining" "^7.17.12"
+ "@babel/plugin-proposal-private-methods" "^7.17.12"
+ "@babel/plugin-proposal-private-property-in-object" "^7.17.12"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.17.12"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.17.12"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-transform-arrow-functions" "^7.17.12"
+ "@babel/plugin-transform-async-to-generator" "^7.17.12"
+ "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
+ "@babel/plugin-transform-block-scoping" "^7.17.12"
+ "@babel/plugin-transform-classes" "^7.17.12"
+ "@babel/plugin-transform-computed-properties" "^7.17.12"
+ "@babel/plugin-transform-destructuring" "^7.18.0"
+ "@babel/plugin-transform-dotall-regex" "^7.16.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.17.12"
+ "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
+ "@babel/plugin-transform-for-of" "^7.18.1"
+ "@babel/plugin-transform-function-name" "^7.16.7"
+ "@babel/plugin-transform-literals" "^7.17.12"
+ "@babel/plugin-transform-member-expression-literals" "^7.16.7"
+ "@babel/plugin-transform-modules-amd" "^7.18.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.18.2"
+ "@babel/plugin-transform-modules-systemjs" "^7.18.0"
+ "@babel/plugin-transform-modules-umd" "^7.18.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.17.12"
+ "@babel/plugin-transform-new-target" "^7.17.12"
+ "@babel/plugin-transform-object-super" "^7.16.7"
+ "@babel/plugin-transform-parameters" "^7.17.12"
+ "@babel/plugin-transform-property-literals" "^7.16.7"
+ "@babel/plugin-transform-regenerator" "^7.18.0"
+ "@babel/plugin-transform-reserved-words" "^7.17.12"
+ "@babel/plugin-transform-shorthand-properties" "^7.16.7"
+ "@babel/plugin-transform-spread" "^7.17.12"
+ "@babel/plugin-transform-sticky-regex" "^7.16.7"
+ "@babel/plugin-transform-template-literals" "^7.18.2"
+ "@babel/plugin-transform-typeof-symbol" "^7.17.12"
+ "@babel/plugin-transform-unicode-escapes" "^7.16.7"
+ "@babel/plugin-transform-unicode-regex" "^7.16.7"
+ "@babel/preset-modules" "^0.1.5"
+ "@babel/types" "^7.18.2"
+ babel-plugin-polyfill-corejs2 "^0.3.0"
+ babel-plugin-polyfill-corejs3 "^0.5.0"
+ babel-plugin-polyfill-regenerator "^0.3.0"
+ core-js-compat "^3.22.1"
+ semver "^6.3.0"
+
+"@babel/preset-modules@^0.1.5":
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9"
+ integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
+ "@babel/plugin-transform-dotall-regex" "^7.4.4"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/runtime@^7.8.4":
+ version "7.18.3"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.3.tgz#c7b654b57f6f63cf7f8b418ac9ca04408c4579f4"
+ integrity sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.16.7":
+ version "7.16.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
+ integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/parser" "^7.16.7"
+ "@babel/types" "^7.16.7"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.8", "@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5":
+ version "7.18.5"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd"
+ integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==
+ dependencies:
+ "@babel/code-frame" "^7.16.7"
+ "@babel/generator" "^7.18.2"
+ "@babel/helper-environment-visitor" "^7.18.2"
+ "@babel/helper-function-name" "^7.17.9"
+ "@babel/helper-hoist-variables" "^7.16.7"
+ "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/parser" "^7.18.5"
+ "@babel/types" "^7.18.4"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4", "@babel/types@^7.4.4":
+ version "7.18.4"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354"
+ integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.16.7"
+ to-fast-properties "^2.0.0"
+
+"@discoveryjs/json-ext@^0.5.0":
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
+ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
+ dependencies:
+ ajv "^6.12.4"
+ debug "^4.3.2"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
+ import-fresh "^3.2.1"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
+ strip-json-comments "^3.1.1"
+
+"@humanwhocodes/config-array@^0.9.2":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
+ integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jridgewell/gen-mapping@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
+ integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9"
+ integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe"
+ integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==
+
+"@jridgewell/set-array@^1.0.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea"
+ integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c"
+ integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==
+
+"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.13"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea"
+ integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@nodelib/fs.scandir@2.1.5":
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
+ integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==
+ dependencies:
+ "@nodelib/fs.stat" "2.0.5"
+ run-parallel "^1.1.9"
+
+"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b"
+ integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
+
+"@nodelib/fs.walk@^1.2.3":
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a"
+ integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==
+ dependencies:
+ "@nodelib/fs.scandir" "2.1.5"
+ fastq "^1.6.0"
+
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.4.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.3.tgz#5c92815a3838b1985c90034cd85f26f59d9d0ece"
+ integrity sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*", "@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@types/node@*":
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
+ integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
+
+"@typescript-eslint/eslint-plugin@^5.26.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz#c67794d2b0fd0b4a47f50266088acdc52a08aab6"
+ integrity sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.29.0"
+ "@typescript-eslint/type-utils" "5.29.0"
+ "@typescript-eslint/utils" "5.29.0"
+ debug "^4.3.4"
+ functional-red-black-tree "^1.0.1"
+ ignore "^5.2.0"
+ regexpp "^3.2.0"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.26.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.29.0.tgz#41314b195b34d44ff38220caa55f3f93cfca43cf"
+ integrity sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.29.0"
+ "@typescript-eslint/types" "5.29.0"
+ "@typescript-eslint/typescript-estree" "5.29.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.29.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz#2a6a32e3416cb133e9af8dcf54bf077a916aeed3"
+ integrity sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==
+ dependencies:
+ "@typescript-eslint/types" "5.29.0"
+ "@typescript-eslint/visitor-keys" "5.29.0"
+
+"@typescript-eslint/type-utils@5.29.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz#241918001d164044020b37d26d5b9f4e37cc3d5d"
+ integrity sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==
+ dependencies:
+ "@typescript-eslint/utils" "5.29.0"
+ debug "^4.3.4"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.29.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.29.0.tgz#7861d3d288c031703b2d97bc113696b4d8c19aab"
+ integrity sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==
+
+"@typescript-eslint/typescript-estree@5.29.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz#e83d19aa7fd2e74616aab2f25dfbe4de4f0b5577"
+ integrity sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==
+ dependencies:
+ "@typescript-eslint/types" "5.29.0"
+ "@typescript-eslint/visitor-keys" "5.29.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.29.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.29.0.tgz#775046effd5019667bd086bcf326acbe32cd0082"
+ integrity sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.29.0"
+ "@typescript-eslint/types" "5.29.0"
+ "@typescript-eslint/typescript-estree" "5.29.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.29.0":
+ version "5.29.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz#7a4749fa7ef5160c44a451bf060ac1dc6dfb77ee"
+ integrity sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==
+ dependencies:
+ "@typescript-eslint/types" "5.29.0"
+ eslint-visitor-keys "^3.3.0"
+
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+
+"@webassemblyjs/ieee754@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-opt" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
+ integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
+
+"@webpack-cli/info@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
+ integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
+ dependencies:
+ envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.7.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
+ integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
+
+acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
+
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-regex@5.0.1, ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
+array-union@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
+ integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-polyfill-corejs2@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
+ integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
+ dependencies:
+ "@babel/compat-data" "^7.13.11"
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
+ integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+ core-js-compat "^3.21.0"
+
+babel-plugin-polyfill-regenerator@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
+ integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.1"
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.20.4:
+ version "4.21.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe"
+ integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==
+ dependencies:
+ caniuse-lite "^1.0.30001358"
+ electron-to-chromium "^1.4.164"
+ node-releases "^2.0.5"
+ update-browserslist-db "^1.0.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+call-bind@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+caniuse-lite@^1.0.30001358:
+ version "1.0.30001358"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz#473d35dabf5e448b463095cab7924e96ccfb8c00"
+ integrity sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw==
+
+chalk@^2.0.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0, chalk@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chrome-trace-event@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac"
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colorette@^2.0.14:
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^7.0.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+core-js-compat@^3.21.0, core-js-compat@^3.22.1:
+ version "3.23.2"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.2.tgz#5cbf8a9c8812d665392845b85ae91b5bcc7b615c"
+ integrity sha512-lrgZvxFwbQp9v7E8mX0rJ+JX7Bvh4eGULZXA1IAyjlsnWvCdw6TF8Tg6xtaSUSJMrSrMaLdpmk+V54LM1dvfOA==
+ dependencies:
+ browserslist "^4.20.4"
+ semver "7.0.0"
+
+cross-spawn@^7.0.2, cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+deep-is@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+define-properties@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+dir-glob@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
+ integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==
+ dependencies:
+ path-type "^4.0.0"
+
+doctrine@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
+ integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
+ dependencies:
+ esutils "^2.0.2"
+
+electron-to-chromium@^1.4.164:
+ version "1.4.165"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.165.tgz#a1ae079a4412b0c2d3bf6908e8db54511fb0bbac"
+ integrity sha512-DKQW1lqUSAYQvn9dnpK7mWaDpWbNOXQLXhfCi7Iwx0BKxdZOxkKcCyKw1l3ihWWW5iWSxKKbhEUoNRoHvl/hbA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3:
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
+ integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+envinfo@^7.7.3:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
+ integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
+
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
+
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
+
+eslint-visitor-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
+ integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
+
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.16.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.18.0.tgz#78d565d16c993d0b73968c523c0446b13da784fd"
+ integrity sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==
+ dependencies:
+ "@eslint/eslintrc" "^1.3.0"
+ "@humanwhocodes/config-array" "^0.9.2"
+ ajv "^6.10.0"
+ chalk "^4.0.0"
+ cross-spawn "^7.0.2"
+ debug "^4.3.2"
+ doctrine "^3.0.0"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.2"
+ esquery "^1.4.0"
+ esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
+ file-entry-cache "^6.0.1"
+ functional-red-black-tree "^1.0.1"
+ glob-parent "^6.0.1"
+ globals "^13.15.0"
+ ignore "^5.2.0"
+ import-fresh "^3.0.0"
+ imurmurhash "^0.1.4"
+ is-glob "^4.0.0"
+ js-yaml "^4.1.0"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.4.1"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
+ natural-compare "^1.4.0"
+ optionator "^0.9.1"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
+ strip-json-comments "^3.1.0"
+ text-table "^0.2.0"
+ v8-compile-cache "^2.0.3"
+
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
+ dependencies:
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
+
+esquery@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
+ dependencies:
+ "@nodelib/fs.stat" "^2.0.2"
+ "@nodelib/fs.walk" "^1.2.3"
+ glob-parent "^5.1.2"
+ merge2 "^1.3.0"
+ micromatch "^4.0.4"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastest-levenshtein@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
+ integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==
+
+fastq@^1.6.0:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c"
+ integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==
+ dependencies:
+ reusify "^1.0.4"
+
+file-entry-cache@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027"
+ integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==
+ dependencies:
+ flat-cache "^3.0.4"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-up@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
+ integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==
+ dependencies:
+ flatted "^3.1.0"
+ rimraf "^3.0.2"
+
+flatted@^3.1.0:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
+ integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
+
+fp-ts@^2.6.1:
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.12.1.tgz#e389488bfd1507af06bd5965e97367edcd4fabad"
+ integrity sha512-oxvgqUYR6O9VkKXrxkJ0NOyU0FrE705MeqgBUMEPWyTu6Pwn768cJbHChw2XOBlgFLKfIHxjr2OOBFpv2mUGZw==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
+ integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.3"
+
+glob-parent@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^7.1.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
+ dependencies:
+ type-fest "^0.20.2"
+
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
+ dependencies:
+ array-union "^2.1.0"
+ dir-glob "^3.0.1"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
+ slash "^3.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.1, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+
+import-fresh@^3.0.0, import-fresh@^3.2.1:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b"
+ integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==
+ dependencies:
+ parent-module "^1.0.0"
+ resolve-from "^4.0.0"
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inspectpack@^4.7.1:
+ version "4.7.1"
+ resolved "https://registry.yarnpkg.com/inspectpack/-/inspectpack-4.7.1.tgz#baf081bae0b5b31bbedd534424e658f32d60f97a"
+ integrity sha512-XoDJbKSM9I2KA+8+OLFJHm8m4NM2pMEgsDD2hze6swVfynEed9ngCx36mRR+otzOsskwnxIZWXjI23FTW1uHqA==
+ dependencies:
+ chalk "^4.1.0"
+ fp-ts "^2.6.1"
+ io-ts "^2.2.13"
+ io-ts-reporters "^1.2.2"
+ pify "^5.0.0"
+ semver-compare "^1.0.0"
+ yargs "^16.2.0"
+
+interpret@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
+io-ts-reporters@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/io-ts-reporters/-/io-ts-reporters-1.2.2.tgz#4d3219777ea5219c7d8f6ffac01fd68e72426dd1"
+ integrity sha512-igASwWWkDY757OutNcM6zTtdJf/eTZYkoe2ymsX2qpm5bKZLo74FJYjsCtMQOEdY7dRHLLEulCyFQwdN69GBCg==
+
+io-ts@^2.2.13:
+ version "2.2.16"
+ resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.16.tgz#597dffa03db1913fc318c9c6df6931cb4ed808b2"
+ integrity sha512-y5TTSa6VP6le0hhmIyN0dqEXkrZeJLeC5KApJq6VLci3UEKF80lZ+KuoUs02RhBxNWlrqSNxzfI7otLX1Euv8Q==
+
+is-core-module@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
+ dependencies:
+ has "^1.0.3"
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+levn@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade"
+ integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==
+ dependencies:
+ prelude-ls "^1.2.1"
+ type-check "~0.4.0"
+
+loader-runner@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+merge2@^1.3.0, merge2@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
+ integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+
+micromatch@^4.0.0, micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.27:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@>=1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+node-releases@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666"
+ integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+optionator@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
+ integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==
+ dependencies:
+ deep-is "^0.1.3"
+ fast-levenshtein "^2.0.6"
+ levn "^0.4.1"
+ prelude-ls "^1.2.1"
+ type-check "^0.4.0"
+ word-wrap "^1.2.3"
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parent-module@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
+ integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
+ dependencies:
+ callsites "^3.0.0"
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
+ integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f"
+ integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+prelude-ls@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
+ integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+queue-microtask@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
+ integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+rechoir@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
+ integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
+ dependencies:
+ resolve "^1.9.0"
+
+regenerate-unicode-properties@^10.0.1:
+ version "10.0.1"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
+ integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
+ dependencies:
+ regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.9"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+regenerator-transform@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
+ integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regexpp@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
+
+regexpu-core@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3"
+ integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==
+ dependencies:
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^10.0.1"
+ regjsgen "^0.6.0"
+ regjsparser "^0.8.2"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.0.0"
+
+regjsgen@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
+ integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
+
+regjsparser@^0.8.2:
+ version "0.8.4"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
+ integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
+ dependencies:
+ jsesc "~0.5.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
+ integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve@^1.14.2, resolve@^1.9.0:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+reusify@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
+ integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==
+
+rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+run-parallel@^1.1.9:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
+ integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==
+ dependencies:
+ queue-microtask "^1.2.2"
+
+safe-buffer@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+semver-compare@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
+ integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
+
+semver@7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
+ integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+
+semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.4, semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
+serialize-javascript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+ dependencies:
+ randombytes "^2.1.0"
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@^0.6.0:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+tapable@^2.1.1, tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+terser-webpack-plugin@^5.1.3:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90"
+ integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.7"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
+ terser "^5.7.2"
+
+terser@^5.14.2, terser@^5.7.2:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
+text-table@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+ts-loader@^9.2.5:
+ version "9.3.1"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4"
+ integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==
+ dependencies:
+ chalk "^4.1.0"
+ enhanced-resolve "^5.0.0"
+ micromatch "^4.0.0"
+ semver "^7.3.4"
+
+tslib@^1.8.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
+ integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+
+tsutils@^3.21.0:
+ version "3.21.0"
+ resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
+ integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
+ dependencies:
+ tslib "^1.8.1"
+
+type-check@^0.4.0, type-check@~0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1"
+ integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==
+ dependencies:
+ prelude-ls "^1.2.1"
+
+type-fest@^0.20.2:
+ version "0.20.2"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
+ integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
+
+typescript@^4.4.2:
+ version "4.7.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
+ integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz#1a01aa57247c14c568b89775a54938788189a714"
+ integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8"
+ integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==
+
+update-browserslist-db@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.3.tgz#6c47cb996f34afb363e924748e2f6e4d983c6fc1"
+ integrity sha512-ufSazemeh9Gty0qiWtoRpJ9F5Q5W3xdIPm1UZQqYQv/q0Nyb9EMHUB2lu+O9x1re9WsorpMAUu4Y6Lxcs5n+XQ==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+v8-compile-cache@^2.0.3:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
+ integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
+
+watchpack@^2.3.1:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
+ integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+webpack-cli@^4.9.2:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31"
+ integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
+ dependencies:
+ "@discoveryjs/json-ext" "^0.5.0"
+ "@webpack-cli/configtest" "^1.2.0"
+ "@webpack-cli/info" "^1.5.0"
+ "@webpack-cli/serve" "^1.7.0"
+ colorette "^2.0.14"
+ commander "^7.0.0"
+ cross-spawn "^7.0.3"
+ fastest-levenshtein "^1.0.12"
+ import-local "^3.0.2"
+ interpret "^2.2.0"
+ rechoir "^0.7.0"
+ webpack-merge "^5.7.3"
+
+webpack-merge@^5.7.3:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
+ integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+ dependencies:
+ clone-deep "^4.0.1"
+ wildcard "^2.0.0"
+
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.72.1:
+ version "5.73.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38"
+ integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/wasm-edit" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ acorn "^8.4.1"
+ acorn-import-assertions "^1.7.6"
+ browserslist "^4.14.5"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.9.3"
+ es-module-lexer "^0.9.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
+ loader-runner "^4.2.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^3.1.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.1.3"
+ watchpack "^2.3.1"
+ webpack-sources "^3.2.3"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wildcard@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
+
+word-wrap@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
+ integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"
diff --git a/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs b/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs
index 981c452127..7a926e0ee8 100644
--- a/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs
+++ b/src/Components/Forms/src/EditContextDataAnnotationsExtensions.cs
@@ -83,6 +83,7 @@ public static class EditContextDataAnnotationsExtensions
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Model types are expected to be defined in assemblies that do not get trimmed.")]
private void OnFieldChanged(object? sender, FieldChangedEventArgs eventArgs)
{
var fieldIdentifier = eventArgs.FieldIdentifier;
@@ -108,6 +109,7 @@ public static class EditContextDataAnnotationsExtensions
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Model types are expected to be defined in assemblies that do not get trimmed.")]
private void OnValidationRequested(object? sender, ValidationRequestedEventArgs e)
{
var validationContext = new ValidationContext(_editContext.Model, _serviceProvider, items: null);
@@ -152,6 +154,7 @@ public static class EditContextDataAnnotationsExtensions
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2080", Justification = "Model types are expected to be defined in assemblies that do not get trimmed.")]
private static bool TryGetValidatableProperty(in FieldIdentifier fieldIdentifier, [NotNullWhen(true)] out PropertyInfo? propertyInfo)
{
var cacheKey = (ModelType: fieldIdentifier.Model.GetType(), fieldIdentifier.FieldName);
diff --git a/src/Components/Forms/src/FieldState.cs b/src/Components/Forms/src/FieldState.cs
index 4c87ea47bd..8ddae490f0 100644
--- a/src/Components/Forms/src/FieldState.cs
+++ b/src/Components/Forms/src/FieldState.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.Forms;
-internal class FieldState
+internal sealed class FieldState
{
private readonly FieldIdentifier _fieldIdentifier;
diff --git a/src/Components/Forms/src/PublicAPI.Shipped.txt b/src/Components/Forms/src/PublicAPI.Shipped.txt
index 93df780985..2c73c120ce 100644
--- a/src/Components/Forms/src/PublicAPI.Shipped.txt
+++ b/src/Components/Forms/src/PublicAPI.Shipped.txt
@@ -31,6 +31,7 @@ Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs
Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs.FieldChangedEventArgs(in Microsoft.AspNetCore.Components.Forms.FieldIdentifier fieldIdentifier) -> void
Microsoft.AspNetCore.Components.Forms.FieldChangedEventArgs.FieldIdentifier.get -> Microsoft.AspNetCore.Components.Forms.FieldIdentifier
Microsoft.AspNetCore.Components.Forms.FieldIdentifier
+Microsoft.AspNetCore.Components.Forms.FieldIdentifier.FieldIdentifier() -> void
Microsoft.AspNetCore.Components.Forms.FieldIdentifier.Equals(Microsoft.AspNetCore.Components.Forms.FieldIdentifier otherIdentifier) -> bool
Microsoft.AspNetCore.Components.Forms.FieldIdentifier.FieldIdentifier(object! model, string! fieldName) -> void
Microsoft.AspNetCore.Components.Forms.FieldIdentifier.FieldName.get -> string!
diff --git a/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor b/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor
index 5f6f4ae391..115c0aae1b 100644
--- a/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor
+++ b/src/Components/Samples/BlazorServerApp/Shared/NavMenu.razor
@@ -5,7 +5,7 @@
</button>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<ul class="nav flex-column">
<li class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css b/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css
index bdca6fbfcb..75d73f9f61 100644
--- a/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css
+++ b/src/Components/Samples/BlazorServerApp/wwwroot/css/site.css
@@ -181,4 +181,10 @@ app {
/* Never collapse the sidebar for wide screens */
display: block;
}
+
+ .nav-scrollable {
+ /* Allow sidebar to scroll for tall menus */
+ height: calc(100vh - 3.5rem);
+ overflow-y: auto;
+ }
}
diff --git a/src/Components/Server/src/BlazorPack/NonDefaultHubProtocolAttribute.cs b/src/Components/Server/src/BlazorPack/NonDefaultHubProtocolAttribute.cs
index 34e7d1d16c..941bb81e64 100644
--- a/src/Components/Server/src/BlazorPack/NonDefaultHubProtocolAttribute.cs
+++ b/src/Components/Server/src/BlazorPack/NonDefaultHubProtocolAttribute.cs
@@ -5,6 +5,6 @@ namespace Microsoft.AspNetCore.SignalR.Internal;
// Tells SignalR not to add the IHubProtocol with this attribute to all hubs by default
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
-internal class NonDefaultHubProtocolAttribute : Attribute
+internal sealed class NonDefaultHubProtocolAttribute : Attribute
{
}
diff --git a/src/Components/Server/src/BlazorPack/SequenceOfT.cs b/src/Components/Server/src/BlazorPack/SequenceOfT.cs
index 4ed60d04e1..057ba95b16 100644
--- a/src/Components/Server/src/BlazorPack/SequenceOfT.cs
+++ b/src/Components/Server/src/BlazorPack/SequenceOfT.cs
@@ -18,7 +18,7 @@ using System.Runtime.InteropServices;
/// Instance members are not thread-safe.
/// </remarks>
[DebuggerDisplay("{" + nameof(DebuggerDisplay) + ",nq}")]
-internal class Sequence<T> : IBufferWriter<T>, IDisposable
+internal sealed class Sequence<T> : IBufferWriter<T>, IDisposable
{
private static readonly int DefaultLengthFromArrayPool = 1 + (4095 / Marshal.SizeOf<T>());
@@ -291,7 +291,7 @@ internal class Sequence<T> : IBufferWriter<T>, IDisposable
return segment;
}
- private class SequenceSegment : ReadOnlySequenceSegment<T>
+ private sealed class SequenceSegment : ReadOnlySequenceSegment<T>
{
/// <summary>
/// A value indicating whether the element is a value type.
diff --git a/src/Components/Server/src/Builder/ComponentEndpointConventionBuilder.cs b/src/Components/Server/src/Builder/ComponentEndpointConventionBuilder.cs
index ce3d686fee..a8372a7024 100644
--- a/src/Components/Server/src/Builder/ComponentEndpointConventionBuilder.cs
+++ b/src/Components/Server/src/Builder/ComponentEndpointConventionBuilder.cs
@@ -29,4 +29,12 @@ public sealed class ComponentEndpointConventionBuilder : IHubEndpointConventionB
_disconnectEndpoint.Add(convention);
_jsInitializersEndpoint.Add(convention);
}
+
+ /// <inheritdoc/>
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ _hubEndpoint.Finally(finalConvention);
+ _disconnectEndpoint.Finally(finalConvention);
+ _jsInitializersEndpoint.Finally(finalConvention);
+ }
}
diff --git a/src/Components/Server/src/CircuitJavaScriptInitializationMiddleware.cs b/src/Components/Server/src/CircuitJavaScriptInitializationMiddleware.cs
index b169c47cc5..d8d2895c8b 100644
--- a/src/Components/Server/src/CircuitJavaScriptInitializationMiddleware.cs
+++ b/src/Components/Server/src/CircuitJavaScriptInitializationMiddleware.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Builder;
-internal class CircuitJavaScriptInitializationMiddleware
+internal sealed class CircuitJavaScriptInitializationMiddleware
{
private readonly IList<string> _initializers;
diff --git a/src/Components/Server/src/Circuits/CircuitClientProxy.cs b/src/Components/Server/src/Circuits/CircuitClientProxy.cs
index b9a72d9d14..ef1d939518 100644
--- a/src/Components/Server/src/Circuits/CircuitClientProxy.cs
+++ b/src/Components/Server/src/Circuits/CircuitClientProxy.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.SignalR;
namespace Microsoft.AspNetCore.Components.Server.Circuits;
-internal class CircuitClientProxy : IClientProxy
+internal sealed class CircuitClientProxy : IClientProxy
{
public CircuitClientProxy()
{
diff --git a/src/Components/Server/src/Circuits/CircuitFactory.cs b/src/Components/Server/src/Circuits/CircuitFactory.cs
index 3d896533ff..1a2bd05a37 100644
--- a/src/Components/Server/src/Circuits/CircuitFactory.cs
+++ b/src/Components/Server/src/Circuits/CircuitFactory.cs
@@ -84,6 +84,7 @@ internal sealed partial class CircuitFactory : ICircuitFactory
renderer,
components,
jsRuntime,
+ navigationManager,
circuitHandlers,
_loggerFactory.CreateLogger<CircuitHost>());
Log.CreatedCircuit(_logger, circuitHost);
diff --git a/src/Components/Server/src/Circuits/CircuitHandle.cs b/src/Components/Server/src/Circuits/CircuitHandle.cs
index c220be3505..9535294489 100644
--- a/src/Components/Server/src/Circuits/CircuitHandle.cs
+++ b/src/Components/Server/src/Circuits/CircuitHandle.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits;
//
// We can't refer to Hub.Items from a CircuitHost - but we want need to be
// able to break the link between Hub.Items and a CircuitHost.
-internal class CircuitHandle
+internal sealed class CircuitHandle
{
public CircuitHost CircuitHost { get; set; }
}
diff --git a/src/Components/Server/src/Circuits/CircuitHost.cs b/src/Components/Server/src/Circuits/CircuitHost.cs
index 368a499907..7611caf874 100644
--- a/src/Components/Server/src/Circuits/CircuitHost.cs
+++ b/src/Components/Server/src/Circuits/CircuitHost.cs
@@ -12,11 +12,14 @@ using Microsoft.JSInterop.Infrastructure;
namespace Microsoft.AspNetCore.Components.Server.Circuits;
+#pragma warning disable CA1852 // Seal internal types
internal partial class CircuitHost : IAsyncDisposable
+#pragma warning restore CA1852 // Seal internal types
{
private readonly AsyncServiceScope _scope;
private readonly CircuitOptions _options;
private readonly CircuitHandler[] _circuitHandlers;
+ private readonly RemoteNavigationManager _navigationManager;
private readonly ILogger _logger;
private bool _initialized;
private bool _disposed;
@@ -37,6 +40,7 @@ internal partial class CircuitHost : IAsyncDisposable
RemoteRenderer renderer,
IReadOnlyList<ComponentDescriptor> descriptors,
RemoteJSRuntime jsRuntime,
+ RemoteNavigationManager navigationManager,
CircuitHandler[] circuitHandlers,
ILogger logger)
{
@@ -53,6 +57,7 @@ internal partial class CircuitHost : IAsyncDisposable
Renderer = renderer ?? throw new ArgumentNullException(nameof(renderer));
Descriptors = descriptors ?? throw new ArgumentNullException(nameof(descriptors));
JSRuntime = jsRuntime ?? throw new ArgumentNullException(nameof(jsRuntime));
+ _navigationManager = navigationManager ?? throw new ArgumentNullException(nameof(navigationManager));
_circuitHandlers = circuitHandlers ?? throw new ArgumentNullException(nameof(circuitHandlers));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
@@ -66,6 +71,8 @@ internal partial class CircuitHost : IAsyncDisposable
Renderer.UnhandledSynchronizationException += SynchronizationContext_UnhandledException;
JSRuntime.UnhandledException += ReportAndInvoke_UnhandledException;
+
+ _navigationManager.UnhandledException += ReportAndInvoke_UnhandledException;
}
public CircuitHandle Handle { get; }
@@ -491,7 +498,7 @@ internal partial class CircuitHost : IAsyncDisposable
// OnLocationChangedAsync is used in a fire-and-forget context, so it's responsible for its own
// error handling.
- public async Task OnLocationChangedAsync(string uri, bool intercepted)
+ public async Task OnLocationChangedAsync(string uri, string state, bool intercepted)
{
AssertInitialized();
AssertNotDisposed();
@@ -501,8 +508,7 @@ internal partial class CircuitHost : IAsyncDisposable
await Renderer.Dispatcher.InvokeAsync(() =>
{
Log.LocationChange(_logger, uri, CircuitId);
- var navigationManager = (RemoteNavigationManager)Services.GetRequiredService<NavigationManager>();
- navigationManager.NotifyLocationChanged(uri, intercepted);
+ _navigationManager.NotifyLocationChanged(uri, state, intercepted);
Log.LocationChangeSucceeded(_logger, uri, CircuitId);
});
}
@@ -534,6 +540,31 @@ internal partial class CircuitHost : IAsyncDisposable
}
}
+ public async Task OnLocationChangingAsync(int callId, string uri, string? state, bool intercepted)
+ {
+ AssertInitialized();
+ AssertNotDisposed();
+
+ try
+ {
+ var shouldContinueNavigation = await Renderer.Dispatcher.InvokeAsync(async () =>
+ {
+ Log.LocationChanging(_logger, uri, CircuitId);
+ return await _navigationManager.HandleLocationChangingAsync(uri, state, intercepted);
+ });
+
+ await Client.SendAsync("JS.EndLocationChanging", callId, shouldContinueNavigation);
+ }
+ catch (Exception ex)
+ {
+ // An exception caught at this point was probably thrown inside the NavigationManager. Treat
+ // this like bad data.
+ Log.LocationChangeFailed(_logger, uri, CircuitId, ex);
+ await TryNotifyClientErrorAsync(Client, GetClientErrorMessage(ex, $"Location change to '{uri}' failed."));
+ UnhandledException?.Invoke(this, new UnhandledExceptionEventArgs(ex, isTerminating: false));
+ }
+ }
+
public void SetCircuitUser(ClaimsPrincipal user)
{
// This can be called before the circuit is initialized.
@@ -728,6 +759,9 @@ internal partial class CircuitHost : IAsyncDisposable
[LoggerMessage(210, LogLevel.Debug, "Location change to '{URI}' in circuit '{CircuitId}' failed.", EventName = "LocationChangeFailed")]
public static partial void LocationChangeFailed(ILogger logger, string uri, CircuitId circuitId, Exception exception);
+ [LoggerMessage(211, LogLevel.Debug, "Location is about to change to {URI} in ciruit '{CircuitId}'.", EventName = "LocationChanging")]
+ public static partial void LocationChanging(ILogger logger, string uri, CircuitId circuitId);
+
[LoggerMessage(212, LogLevel.Debug, "Failed to complete render batch '{RenderId}' in circuit host '{CircuitId}'.", EventName = "OnRenderCompletedFailed")]
public static partial void OnRenderCompletedFailed(ILogger logger, long renderId, CircuitId circuitId, Exception e);
diff --git a/src/Components/Server/src/Circuits/CircuitIdFactory.cs b/src/Components/Server/src/Circuits/CircuitIdFactory.cs
index cdf26af992..ce4ffa327c 100644
--- a/src/Components/Server/src/Circuits/CircuitIdFactory.cs
+++ b/src/Components/Server/src/Circuits/CircuitIdFactory.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits;
// This is a singleton instance
// Generates strong cryptographic ids for circuits that are protected with authenticated encryption.
-internal class CircuitIdFactory
+internal sealed class CircuitIdFactory
{
private const string CircuitIdProtectorPurpose = "Microsoft.AspNetCore.Components.Server.CircuitIdFactory,V1";
diff --git a/src/Components/Server/src/Circuits/CircuitJSComponentInterop.cs b/src/Components/Server/src/Circuits/CircuitJSComponentInterop.cs
index ace83e28ba..1896429673 100644
--- a/src/Components/Server/src/Circuits/CircuitJSComponentInterop.cs
+++ b/src/Components/Server/src/Circuits/CircuitJSComponentInterop.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Components.Web.Infrastructure;
namespace Microsoft.AspNetCore.Components.Server.Circuits;
-internal class CircuitJSComponentInterop : JSComponentInterop
+internal sealed class CircuitJSComponentInterop : JSComponentInterop
{
private readonly CircuitOptions _circuitOptions;
private int _jsRootComponentCount;
diff --git a/src/Components/Server/src/Circuits/CircuitOptionsJSInteropDetailedErrorsConfiguration.cs b/src/Components/Server/src/Circuits/CircuitOptionsJSInteropDetailedErrorsConfiguration.cs
index 9044156412..00c851bfd3 100644
--- a/src/Components/Server/src/Circuits/CircuitOptionsJSInteropDetailedErrorsConfiguration.cs
+++ b/src/Components/Server/src/Circuits/CircuitOptionsJSInteropDetailedErrorsConfiguration.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Components.Server;
-internal class CircuitOptionsJSInteropDetailedErrorsConfiguration : IConfigureOptions<CircuitOptions>
+internal sealed class CircuitOptionsJSInteropDetailedErrorsConfiguration : IConfigureOptions<CircuitOptions>
{
public CircuitOptionsJSInteropDetailedErrorsConfiguration(IConfiguration configuration)
{
diff --git a/src/Components/Server/src/Circuits/CircuitOptionsJavaScriptInitializersConfiguration.cs b/src/Components/Server/src/Circuits/CircuitOptionsJavaScriptInitializersConfiguration.cs
index 14616f7817..9e9f7d2a24 100644
--- a/src/Components/Server/src/Circuits/CircuitOptionsJavaScriptInitializersConfiguration.cs
+++ b/src/Components/Server/src/Circuits/CircuitOptionsJavaScriptInitializersConfiguration.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Components.Server.Circuits;
-internal class CircuitOptionsJavaScriptInitializersConfiguration : IConfigureOptions<CircuitOptions>
+internal sealed class CircuitOptionsJavaScriptInitializersConfiguration : IConfigureOptions<CircuitOptions>
{
private readonly IWebHostEnvironment _environment;
diff --git a/src/Components/Server/src/Circuits/CircuitRegistry.cs b/src/Components/Server/src/Circuits/CircuitRegistry.cs
index 522501b409..81a7b0d04b 100644
--- a/src/Components/Server/src/Circuits/CircuitRegistry.cs
+++ b/src/Components/Server/src/Circuits/CircuitRegistry.cs
@@ -33,7 +33,9 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits;
/// Consequently, we have to account for reconnects and disconnects occuring simultaneously as well as appearing out of order.
/// To manage this, we use a critical section to manage all state transitions.
/// </remarks>
+#pragma warning disable CA1852 // Seal internal types
internal partial class CircuitRegistry
+#pragma warning restore CA1852 // Seal internal types
{
private readonly object CircuitRegistryLock = new object();
private readonly CircuitOptions _options;
diff --git a/src/Components/Server/src/Circuits/ComponentDescriptor.cs b/src/Components/Server/src/Circuits/ComponentDescriptor.cs
index fd11460cea..7d25f132f7 100644
--- a/src/Components/Server/src/Circuits/ComponentDescriptor.cs
+++ b/src/Components/Server/src/Circuits/ComponentDescriptor.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.Server;
-internal class ComponentDescriptor
+internal sealed class ComponentDescriptor
{
public Type ComponentType { get; set; }
diff --git a/src/Components/Server/src/Circuits/DefaultCircuitAccessor.cs b/src/Components/Server/src/Circuits/DefaultCircuitAccessor.cs
index f3b9041e70..50e37ee5ca 100644
--- a/src/Components/Server/src/Circuits/DefaultCircuitAccessor.cs
+++ b/src/Components/Server/src/Circuits/DefaultCircuitAccessor.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.Server.Circuits;
-internal class DefaultCircuitAccessor : ICircuitAccessor
+internal sealed class DefaultCircuitAccessor : ICircuitAccessor
{
public Circuit Circuit { get; set; }
}
diff --git a/src/Components/Server/src/Circuits/RemoteJSRuntime.cs b/src/Components/Server/src/Circuits/RemoteJSRuntime.cs
index dba326c705..be04cc436f 100644
--- a/src/Components/Server/src/Circuits/RemoteJSRuntime.cs
+++ b/src/Components/Server/src/Circuits/RemoteJSRuntime.cs
@@ -11,7 +11,9 @@ using Microsoft.JSInterop.Infrastructure;
namespace Microsoft.AspNetCore.Components.Server.Circuits;
+#pragma warning disable CA1852 // Seal internal types
internal partial class RemoteJSRuntime : JSRuntime
+#pragma warning restore CA1852 // Seal internal types
{
private readonly CircuitOptions _options;
private readonly ILogger<RemoteJSRuntime> _logger;
diff --git a/src/Components/Server/src/Circuits/RemoteNavigationManager.cs b/src/Components/Server/src/Circuits/RemoteNavigationManager.cs
index 540355421e..439faaebc6 100644
--- a/src/Components/Server/src/Circuits/RemoteNavigationManager.cs
+++ b/src/Components/Server/src/Circuits/RemoteNavigationManager.cs
@@ -16,6 +16,9 @@ internal sealed partial class RemoteNavigationManager : NavigationManager, IHost
{
private readonly ILogger<RemoteNavigationManager> _logger;
private IJSRuntime _jsRuntime;
+ private bool? _navigationLockStateBeforeJsRuntimeAttached;
+
+ public event EventHandler<Exception>? UnhandledException;
/// <summary>
/// Creates a new <see cref="RemoteNavigationManager"/> instance.
@@ -54,16 +57,28 @@ internal sealed partial class RemoteNavigationManager : NavigationManager, IHost
}
_jsRuntime = jsRuntime;
+
+ if (_navigationLockStateBeforeJsRuntimeAttached.HasValue)
+ {
+ SetHasLocationChangingListeners(_navigationLockStateBeforeJsRuntimeAttached.Value);
+ _navigationLockStateBeforeJsRuntimeAttached = null;
+ }
}
- public void NotifyLocationChanged(string uri, bool intercepted)
+ public void NotifyLocationChanged(string uri, string state, bool intercepted)
{
Log.ReceivedLocationChangedNotification(_logger, uri, intercepted);
Uri = uri;
+ HistoryEntryState = state;
NotifyLocationChanged(intercepted);
}
+ public async ValueTask<bool> HandleLocationChangingAsync(string uri, string? state, bool intercepted)
+ {
+ return await NotifyLocationChangingAsync(uri, state, intercepted);
+ }
+
/// <inheritdoc />
[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(NavigationOptions))]
protected override void NavigateToCore(string uri, NavigationOptions options)
@@ -76,9 +91,52 @@ internal sealed partial class RemoteNavigationManager : NavigationManager, IHost
throw new NavigationException(absoluteUriString);
}
- _jsRuntime.InvokeVoidAsync(Interop.NavigateTo, uri, options).Preserve();
+ _ = PerformNavigationAsync();
+
+ async Task PerformNavigationAsync()
+ {
+ try
+ {
+ var shouldContinueNavigation = await NotifyLocationChangingAsync(uri, options.HistoryEntryState, false);
+
+ if (!shouldContinueNavigation)
+ {
+ Log.NavigationCanceled(_logger, uri);
+ return;
+ }
+
+ await _jsRuntime.InvokeVoidAsync(Interop.NavigateTo, uri, options);
+ }
+ catch (Exception ex)
+ {
+ // We shouldn't ever reach this since exceptions thrown from handlers are handled in HandleLocationChangingHandlerException.
+ // But if some other exception gets thrown, we still want to know about it.
+ Log.NavigationFailed(_logger, uri, ex);
+ UnhandledException?.Invoke(this, ex);
+ }
+ }
+ }
+
+ protected override void HandleLocationChangingHandlerException(Exception ex, LocationChangingContext context)
+ {
+ Log.NavigationFailed(_logger, context.TargetLocation, ex);
+ UnhandledException?.Invoke(this, ex);
}
+ protected override void SetNavigationLockState(bool value)
+ {
+ if (_jsRuntime is null)
+ {
+ _navigationLockStateBeforeJsRuntimeAttached = value;
+ return;
+ }
+
+ SetHasLocationChangingListeners(value);
+ }
+
+ private void SetHasLocationChangingListeners(bool value)
+ => _jsRuntime.InvokeVoidAsync(Interop.SetHasLocationChangingListeners, value).Preserve();
+
private static partial class Log
{
[LoggerMessage(1, LogLevel.Debug, "Requesting navigation to URI {Uri} with forceLoad={ForceLoad}, replace={Replace}", EventName = "RequestingNavigation")]
@@ -89,5 +147,11 @@ internal sealed partial class RemoteNavigationManager : NavigationManager, IHost
[LoggerMessage(2, LogLevel.Debug, "Received notification that the URI has changed to {Uri} with isIntercepted={IsIntercepted}", EventName = "ReceivedLocationChangedNotification")]
public static partial void ReceivedLocationChangedNotification(ILogger logger, string uri, bool isIntercepted);
+
+ [LoggerMessage(3, LogLevel.Debug, "Navigation canceled when changing the location to {Uri}", EventName = "NavigationCanceled")]
+ public static partial void NavigationCanceled(ILogger logger, string uri);
+
+ [LoggerMessage(4, LogLevel.Error, "Navigation failed when changing the location to {Uri}", EventName = "NavigationFailed")]
+ public static partial void NavigationFailed(ILogger logger, string uri, Exception exception);
}
}
diff --git a/src/Components/Server/src/Circuits/RemoteRenderer.cs b/src/Components/Server/src/Circuits/RemoteRenderer.cs
index 71aee572e9..dc8c705ede 100644
--- a/src/Components/Server/src/Circuits/RemoteRenderer.cs
+++ b/src/Components/Server/src/Circuits/RemoteRenderer.cs
@@ -10,7 +10,9 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Components.Server.Circuits;
+#pragma warning disable CA1852 // Seal internal types
internal partial class RemoteRenderer : WebRenderer
+#pragma warning restore CA1852 // Seal internal types
{
private static readonly Task CanceledTask = Task.FromCanceled(new CancellationToken(canceled: true));
diff --git a/src/Components/Server/src/ComponentHub.cs b/src/Components/Server/src/ComponentHub.cs
index 3a51792a81..ecfda9e35f 100644
--- a/src/Components/Server/src/ComponentHub.cs
+++ b/src/Components/Server/src/ComponentHub.cs
@@ -285,7 +285,7 @@ internal sealed partial class ComponentHub : Hub
_ = circuitHost.OnRenderCompletedAsync(renderId, errorMessageOrNull);
}
- public async ValueTask OnLocationChanged(string uri, bool intercepted)
+ public async ValueTask OnLocationChanged(string uri, string? state, bool intercepted)
{
var circuitHost = await GetActiveCircuitAsync();
if (circuitHost == null)
@@ -293,7 +293,18 @@ internal sealed partial class ComponentHub : Hub
return;
}
- _ = circuitHost.OnLocationChangedAsync(uri, intercepted);
+ _ = circuitHost.OnLocationChangedAsync(uri, state, intercepted);
+ }
+
+ public async ValueTask OnLocationChanging(int callId, string uri, string? state, bool intercepted)
+ {
+ var circuitHost = await GetActiveCircuitAsync();
+ if (circuitHost == null)
+ {
+ return;
+ }
+
+ _ = circuitHost.OnLocationChangingAsync(callId, uri, state, intercepted);
}
// We store the CircuitHost through a *handle* here because Context.Items is tied to the lifetime
diff --git a/src/Components/Server/src/DependencyInjection/ComponentServiceCollectionExtensions.cs b/src/Components/Server/src/DependencyInjection/ComponentServiceCollectionExtensions.cs
index b23c3c0dec..631a36e9c3 100644
--- a/src/Components/Server/src/DependencyInjection/ComponentServiceCollectionExtensions.cs
+++ b/src/Components/Server/src/DependencyInjection/ComponentServiceCollectionExtensions.cs
@@ -79,7 +79,7 @@ public static class ComponentServiceCollectionExtensions
services.AddScoped<NavigationManager, RemoteNavigationManager>();
services.AddScoped<IJSRuntime, RemoteJSRuntime>();
services.AddScoped<INavigationInterception, RemoteNavigationInterception>();
- services.AddScoped<AuthenticationStateProvider, ServerAuthenticationStateProvider>();
+ services.TryAddScoped<AuthenticationStateProvider, ServerAuthenticationStateProvider>();
services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<CircuitOptions>, CircuitOptionsJSInteropDetailedErrorsConfiguration>());
services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<CircuitOptions>, CircuitOptionsJavaScriptInitializersConfiguration>());
@@ -92,7 +92,7 @@ public static class ComponentServiceCollectionExtensions
return builder;
}
- private class DefaultServerSideBlazorBuilder : IServerSideBlazorBuilder
+ private sealed class DefaultServerSideBlazorBuilder : IServerSideBlazorBuilder
{
public DefaultServerSideBlazorBuilder(IServiceCollection services)
{
diff --git a/src/Components/Server/src/DependencyInjection/ConfigureStaticFilesOptions.cs b/src/Components/Server/src/DependencyInjection/ConfigureStaticFilesOptions.cs
index 8a7f5737c7..7df97792f6 100644
--- a/src/Components/Server/src/DependencyInjection/ConfigureStaticFilesOptions.cs
+++ b/src/Components/Server/src/DependencyInjection/ConfigureStaticFilesOptions.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Components.Server;
-internal class ConfigureStaticFilesOptions : IPostConfigureOptions<StaticFileOptions>
+internal sealed class ConfigureStaticFilesOptions : IPostConfigureOptions<StaticFileOptions>
{
public ConfigureStaticFilesOptions(IWebHostEnvironment environment)
{
diff --git a/src/Components/Server/src/Microsoft.AspNetCore.Components.Server.csproj b/src/Components/Server/src/Microsoft.AspNetCore.Components.Server.csproj
index 884967d73d..8c3fd43461 100644
--- a/src/Components/Server/src/Microsoft.AspNetCore.Components.Server.csproj
+++ b/src/Components/Server/src/Microsoft.AspNetCore.Components.Server.csproj
@@ -69,6 +69,7 @@
<Compile Include="$(RepoRoot)src\SignalR\common\Shared\BinaryMessageParser.cs" LinkBase="BlazorPack" />
<Compile Include="$(RepoRoot)src\SignalR\common\Shared\MemoryBufferWriter.cs" LinkBase="BlazorPack" />
<Compile Include="$(RepoRoot)src\SignalR\common\Protocols.MessagePack\src\Protocol\MessagePackHubProtocolWorker.cs" LinkBase="BlazorPack" />
+ <Compile Include="$(RepoRoot)src\SignalR\common\Shared\TryGetReturnType.cs" LinkBase="BlazorPack" />
<!-- MessagePack -->
<Compile Include="$(MessagePackRoot)BufferWriter.cs" LinkBase="BlazorPack\MessagePack" />
diff --git a/src/Components/Server/src/PublicAPI.Shipped.txt b/src/Components/Server/src/PublicAPI.Shipped.txt
index 88f629ca7a..b1cf77ca24 100644
--- a/src/Components/Server/src/PublicAPI.Shipped.txt
+++ b/src/Components/Server/src/PublicAPI.Shipped.txt
@@ -33,6 +33,7 @@ Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserS
Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserStorage.SetAsync(string! key, object! value) -> System.Threading.Tasks.ValueTask
Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserStorage.SetAsync(string! purpose, string! key, object! value) -> System.Threading.Tasks.ValueTask
Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserStorageResult<TValue>
+Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserStorageResult<TValue>.ProtectedBrowserStorageResult() -> void
Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserStorageResult<TValue>.Success.get -> bool
Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedBrowserStorageResult<TValue>.Value.get -> TValue?
Microsoft.AspNetCore.Components.Server.ProtectedBrowserStorage.ProtectedLocalStorage
diff --git a/src/Components/Server/src/PublicAPI.Unshipped.txt b/src/Components/Server/src/PublicAPI.Unshipped.txt
index 7dc5c58110..d1b663a4de 100644
--- a/src/Components/Server/src/PublicAPI.Unshipped.txt
+++ b/src/Components/Server/src/PublicAPI.Unshipped.txt
@@ -1 +1,2 @@
#nullable enable
+Microsoft.AspNetCore.Builder.ComponentEndpointConventionBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finalConvention) -> void
diff --git a/src/Components/Server/test/Circuits/ComponentHubTest.cs b/src/Components/Server/test/Circuits/ComponentHubTest.cs
index 98031f4560..ba20840471 100644
--- a/src/Components/Server/test/Circuits/ComponentHubTest.cs
+++ b/src/Components/Server/test/Circuits/ComponentHubTest.cs
@@ -79,13 +79,24 @@ public class ComponentHubTest
{
var (mockClientProxy, hub) = InitializeComponentHub();
- await hub.OnLocationChanged("https://localhost:5000/subdir/page", false);
+ await hub.OnLocationChanged("https://localhost:5000/subdir/page", null, false);
var errorMessage = "Circuit not initialized.";
mockClientProxy.Verify(m => m.SendCoreAsync("JS.Error", new[] { errorMessage }, It.IsAny<CancellationToken>()), Times.Once());
}
- private static (Mock<IClientProxy>, ComponentHub) InitializeComponentHub()
+ [Fact]
+ public async Task CannotInvokeOnLocationChangingBeforeInitialization()
+ {
+ var (mockClientProxy, hub) = InitializeComponentHub();
+
+ await hub.OnLocationChanging(0, "https://localhost:5000/subdir/page", null, false);
+
+ var errorMessage = "Circuit not initialized.";
+ mockClientProxy.Verify(m => m.SendCoreAsync("JS.Error", new[] { errorMessage }, It.IsAny<CancellationToken>()), Times.Once());
+ }
+
+ private static (Mock<ISingleClientProxy>, ComponentHub) InitializeComponentHub()
{
var ephemeralDataProtectionProvider = new EphemeralDataProtectionProvider();
var circuitIdFactory = new CircuitIdFactory(ephemeralDataProtectionProvider);
@@ -112,7 +123,7 @@ public class ComponentHubTest
// Here we mock out elements of the Hub that are typically configured
// by SignalR as clients connect to the hub.
var mockCaller = new Mock<IHubCallerClients>();
- var mockClientProxy = new Mock<IClientProxy>();
+ var mockClientProxy = new Mock<ISingleClientProxy>();
mockCaller.Setup(x => x.Caller).Returns(mockClientProxy.Object);
hub.Clients = mockCaller.Object;
var mockContext = new Mock<HubCallerContext>();
diff --git a/src/Components/Server/test/Circuits/TestCircuitHost.cs b/src/Components/Server/test/Circuits/TestCircuitHost.cs
index 05af6431f5..edfb90a417 100644
--- a/src/Components/Server/test/Circuits/TestCircuitHost.cs
+++ b/src/Components/Server/test/Circuits/TestCircuitHost.cs
@@ -13,8 +13,8 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits;
internal class TestCircuitHost : CircuitHost
{
- private TestCircuitHost(CircuitId circuitId, AsyncServiceScope scope, CircuitOptions options, CircuitClientProxy client, RemoteRenderer renderer, IReadOnlyList<ComponentDescriptor> descriptors, RemoteJSRuntime jsRuntime, CircuitHandler[] circuitHandlers, ILogger logger)
- : base(circuitId, scope, options, client, renderer, descriptors, jsRuntime, circuitHandlers, logger)
+ private TestCircuitHost(CircuitId circuitId, AsyncServiceScope scope, CircuitOptions options, CircuitClientProxy client, RemoteRenderer renderer, IReadOnlyList<ComponentDescriptor> descriptors, RemoteJSRuntime jsRuntime, RemoteNavigationManager navigationManager, CircuitHandler[] circuitHandlers, ILogger logger)
+ : base(circuitId, scope, options, client, renderer, descriptors, jsRuntime, navigationManager, circuitHandlers, logger)
{
}
@@ -29,6 +29,7 @@ internal class TestCircuitHost : CircuitHost
serviceScope = serviceScope ?? new AsyncServiceScope(Mock.Of<IServiceScope>());
clientProxy = clientProxy ?? new CircuitClientProxy(Mock.Of<IClientProxy>(), Guid.NewGuid().ToString());
var jsRuntime = new RemoteJSRuntime(Options.Create(new CircuitOptions()), Options.Create(new HubOptions<ComponentHub>()), Mock.Of<ILogger<RemoteJSRuntime>>());
+ var navigationManager = new RemoteNavigationManager(Mock.Of<ILogger<RemoteNavigationManager>>());
var serviceProvider = new Mock<IServiceProvider>();
serviceProvider
.Setup(services => services.GetService(typeof(IJSRuntime)))
@@ -55,6 +56,7 @@ internal class TestCircuitHost : CircuitHost
remoteRenderer,
descriptors ?? new List<ComponentDescriptor>(),
jsRuntime,
+ navigationManager,
handlers,
NullLogger<CircuitHost>.Instance);
}
diff --git a/src/Components/Server/test/ComponentEndpointRouteBuilderExtensionsTest.cs b/src/Components/Server/test/ComponentEndpointRouteBuilderExtensionsTest.cs
index 35b397fece..5d28dae0be 100644
--- a/src/Components/Server/test/ComponentEndpointRouteBuilderExtensionsTest.cs
+++ b/src/Components/Server/test/ComponentEndpointRouteBuilderExtensionsTest.cs
@@ -4,6 +4,7 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
@@ -52,6 +53,75 @@ public class ComponentEndpointRouteBuilderExtensionsTest
Assert.True(called);
}
+ [Fact]
+ public void MapBlazorHub_AppliesFinalConventionToEachBuilder()
+ {
+ // Arrange
+ var applicationBuilder = CreateAppBuilder();
+ var buildersAffected = new List<string>();
+ var called = false;
+
+ // Act
+ var app = applicationBuilder
+ .UseRouting()
+ .UseEndpoints(endpoints =>
+ {
+ endpoints
+ .MapBlazorHub(dispatchOptions => called = true)
+ .WithMetadata("initial-md")
+ .Finally(builder =>
+ {
+ if (builder.Metadata.Any(md => md is string smd && smd == "initial-md"))
+ {
+ buildersAffected.Add(builder.DisplayName);
+ }
+ });
+ }).Build();
+
+ // Trigger endpoint construction
+ app.Invoke(new DefaultHttpContext());
+
+ // Assert
+ Assert.True(called);
+ // Final conventions are applied to each of the builders
+ // in the Blazor component hub
+ Assert.Equal(4, buildersAffected.Count);
+ Assert.Contains("/_blazor/negotiate", buildersAffected);
+ Assert.Contains("/_blazor", buildersAffected);
+ Assert.Contains("Blazor disconnect", buildersAffected);
+ Assert.Contains("Blazor initializers", buildersAffected);
+ }
+
+ [Fact]
+ public void MapBlazorHub_AppliesFinalConventionsInFIFOOrder()
+ {
+ // Arrange
+ var applicationBuilder = CreateAppBuilder();
+ var called = false;
+ var populatedMetadata = Array.Empty<string>();
+
+ // Act
+ var app = applicationBuilder
+ .UseRouting()
+ .UseEndpoints(endpoints =>
+ {
+ var builder = endpoints.MapBlazorHub(dispatchOptions => called = true);
+ builder.Finally(b => b.Metadata.Add("first-in"));
+ builder.Finally(b => b.Metadata.Add("last-in"));
+ builder.Finally(b =>
+ {
+ populatedMetadata = b.Metadata.OfType<string>().ToArray();
+ });
+ }).Build();
+
+ // Trigger endpoint construction
+ app.Invoke(new DefaultHttpContext());
+
+ // Assert
+ Assert.True(called);
+ Assert.Equal(new[] { "first-in", "last-in" }, populatedMetadata);
+ }
+
private IApplicationBuilder CreateAppBuilder()
{
var environment = new Mock<IWebHostEnvironment>();
diff --git a/src/Components/Shared/src/ArrayBuilder.cs b/src/Components/Shared/src/ArrayBuilder.cs
index f56afe81f9..23c1994bf2 100644
--- a/src/Components/Shared/src/ArrayBuilder.cs
+++ b/src/Components/Shared/src/ArrayBuilder.cs
@@ -26,7 +26,9 @@ namespace Microsoft.AspNetCore.Components.RenderTree;
/// components can be long-lived and re-render frequently, with the rendered size
/// varying dramatically depending on the user's navigation in the app.
/// </summary>
+#pragma warning disable CA1852 // Seal internal types
internal class ArrayBuilder<T> : IDisposable
+#pragma warning restore CA1852 // Seal internal types
{
// The following fields are memory mapped to the WASM client. Do not re-order or use auto-properties.
protected T[] _items;
@@ -172,10 +174,7 @@ internal class ArrayBuilder<T> : IDisposable
// If someone tries to do something that would require non-zero storage then
// this is a use-after-free. Throwing here is an easy way to prevent that without
// introducing overhead to every method.
- if (_disposed)
- {
- ThrowObjectDisposedException();
- }
+ ObjectDisposedException.ThrowIf(_disposed, null);
var newCapacity = Math.Max(desiredCapacity, _minCapacity);
Debug.Assert(newCapacity > _items.Length);
@@ -214,9 +213,4 @@ internal class ArrayBuilder<T> : IDisposable
{
throw new ArgumentOutOfRangeException("index");
}
-
- private static void ThrowObjectDisposedException()
- {
- throw new ObjectDisposedException(objectName: null);
- }
}
diff --git a/src/Components/Shared/src/BrowserNavigationManagerInterop.cs b/src/Components/Shared/src/BrowserNavigationManagerInterop.cs
index 2481fa8348..bb550b21fc 100644
--- a/src/Components/Shared/src/BrowserNavigationManagerInterop.cs
+++ b/src/Components/Shared/src/BrowserNavigationManagerInterop.cs
@@ -15,4 +15,6 @@ internal static class BrowserNavigationManagerInterop
public const string GetBaseUri = Prefix + "getUnmarshalledBaseURI";
public const string NavigateTo = Prefix + "navigateTo";
+
+ public const string SetHasLocationChangingListeners = Prefix + "setHasLocationChangingListeners";
}
diff --git a/src/Components/Shared/src/ComponentParametersTypeCache.cs b/src/Components/Shared/src/ComponentParametersTypeCache.cs
index 1a77fe6e63..6d0992362c 100644
--- a/src/Components/Shared/src/ComponentParametersTypeCache.cs
+++ b/src/Components/Shared/src/ComponentParametersTypeCache.cs
@@ -7,7 +7,7 @@ using System.Reflection;
namespace Microsoft.AspNetCore.Components;
-internal class ComponentParametersTypeCache
+internal sealed class ComponentParametersTypeCache
{
private readonly ConcurrentDictionary<Key, Type?> _typeToKeyLookUp = new();
@@ -24,7 +24,7 @@ internal class ComponentParametersTypeCache
}
}
- [RequiresUnreferencedCode("This type attempts to load component parameters that may be trimmed.")]
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to preserve component parameters.")]
private static Type? ResolveType(Key key, Assembly[] assemblies)
{
Assembly? assembly = null;
diff --git a/src/Components/Shared/src/RenderBatchWriter.cs b/src/Components/Shared/src/RenderBatchWriter.cs
index b9ab5c28e0..43ef1714e4 100644
--- a/src/Components/Shared/src/RenderBatchWriter.cs
+++ b/src/Components/Shared/src/RenderBatchWriter.cs
@@ -31,7 +31,7 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits;
///
/// We don't have or need a .NET reader for this format. We only read it from JS code.
/// </summary>
-internal class RenderBatchWriter : IDisposable
+internal sealed class RenderBatchWriter : IDisposable
{
private readonly ArrayBuilder<string> _strings;
private readonly Dictionary<string, int> _deduplicatedStringIndices;
diff --git a/src/Components/Shared/src/RootComponentTypeCache.cs b/src/Components/Shared/src/RootComponentTypeCache.cs
index e6f0889237..9949bf5fae 100644
--- a/src/Components/Shared/src/RootComponentTypeCache.cs
+++ b/src/Components/Shared/src/RootComponentTypeCache.cs
@@ -2,12 +2,13 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Concurrent;
+using System.Diagnostics.CodeAnalysis;
using System.Reflection;
namespace Microsoft.AspNetCore.Components;
// A cache for root component types
-internal class RootComponentTypeCache
+internal sealed class RootComponentTypeCache
{
private readonly ConcurrentDictionary<Key, Type?> _typeToKeyLookUp = new();
@@ -24,6 +25,7 @@ internal class RootComponentTypeCache
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Root components are expected to be defined in assemblies that do not get trimmed.")]
private static Type? ResolveType(Key key, Assembly[] assemblies)
{
Assembly? assembly = null;
diff --git a/src/Components/Web.JS/.npmrc b/src/Components/Web.JS/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Components/Web.JS/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Components/Web.JS/@types/dotnet/.npmrc b/src/Components/Web.JS/@types/dotnet/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Components/Web.JS/@types/dotnet/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Components/Web.JS/@types/dotnet/dotnet.d.ts b/src/Components/Web.JS/@types/dotnet/dotnet.d.ts
index 0baceaec3c..0e7590eadf 100644
--- a/src/Components/Web.JS/@types/dotnet/dotnet.d.ts
+++ b/src/Components/Web.JS/@types/dotnet/dotnet.d.ts
@@ -3,7 +3,7 @@
//!
//! This is generated file, see src/mono/wasm/runtime/rollup.config.js
-//! This is not considered public API with backward compatibility guarantees.
+//! This is not considered public API with backward compatibility guarantees.
declare interface ManagedPointer {
__brandManagedPointer: "ManagedPointer";
@@ -43,8 +43,12 @@ declare interface EmscriptenModule {
UTF8ArrayToString(u8Array: Uint8Array, idx?: number, maxBytesToRead?: number): string;
FS_createPath(parent: string, path: string, canRead?: boolean, canWrite?: boolean): string;
FS_createDataFile(parent: string, name: string, data: TypedArray, canRead: boolean, canWrite: boolean, canOwn?: boolean): string;
+ FS_readFile(filename: string, opts: any): any;
removeRunDependency(id: string): void;
addRunDependency(id: string): void;
+ stackSave(): VoidPtr;
+ stackRestore(stack: VoidPtr): void;
+ stackAlloc(size: number): VoidPtr;
ready: Promise<unknown>;
preInit?: (() => any)[];
preRun?: (() => any)[];
@@ -65,13 +69,18 @@ declare type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Arra
*/
declare function mono_wasm_new_root_buffer(capacity: number, name?: string): WasmRootBuffer;
/**
+ * Allocates a WasmRoot pointing to a root provided and controlled by external code. Typicaly on managed stack.
+ * Releasing this root will not de-allocate the root space. You still need to call .release().
+ */
+declare function mono_wasm_new_external_root<T extends MonoObject>(address: VoidPtr | MonoObjectRef): WasmRoot<T>;
+/**
* Allocates temporary storage for a pointer into the managed heap.
* Pointers stored here will be visible to the GC, ensuring that the object they point to aren't moved or collected.
* If you already have a managed pointer you can pass it as an argument to initialize the temporary storage.
* The result object has get() and set(value) methods, along with a .value property.
* When you are done using the root you must call its .release() method.
*/
-declare function mono_wasm_new_root<T extends ManagedPointer | NativePointer>(value?: T | undefined): WasmRoot<T>;
+declare function mono_wasm_new_root<T extends MonoObject>(value?: T | undefined): WasmRoot<T>;
/**
* Releases 1 or more root or root buffer objects.
* Multiple objects may be passed on the argument list.
@@ -90,26 +99,29 @@ declare class WasmRootBuffer {
constructor(offset: VoidPtr, capacity: number, ownsAllocation: boolean, name?: string);
_throw_index_out_of_range(): void;
_check_in_range(index: number): void;
- get_address(index: number): NativePointer;
+ get_address(index: number): MonoObjectRef;
get_address_32(index: number): number;
get(index: number): ManagedPointer;
set(index: number, value: ManagedPointer): ManagedPointer;
+ copy_value_from_address(index: number, sourceAddress: MonoObjectRef): void;
_unsafe_get(index: number): number;
_unsafe_set(index: number, value: ManagedPointer | NativePointer): void;
clear(): void;
release(): void;
toString(): string;
}
-declare class WasmRoot<T extends ManagedPointer | NativePointer> {
- private __buffer;
- private __index;
- constructor(buffer: WasmRootBuffer, index: number);
- get_address(): NativePointer;
+interface WasmRoot<T extends MonoObject> {
+ get_address(): MonoObjectRef;
get_address_32(): number;
+ get address(): MonoObjectRef;
get(): T;
set(value: T): T;
get value(): T;
set value(value: T);
+ copy_from_address(source: MonoObjectRef): void;
+ copy_to_address(destination: MonoObjectRef): void;
+ copy_from(source: WasmRoot<T>): void;
+ copy_to(destination: WasmRoot<T>): void;
valueOf(): T;
clear(): void;
release(): void;
@@ -125,6 +137,9 @@ interface MonoString extends MonoObject {
interface MonoArray extends MonoObject {
__brand: "MonoArray";
}
+interface MonoObjectRef extends ManagedPointer {
+ __brandMonoObjectRef: "MonoObjectRef";
+}
declare type MonoConfig = {
isError: false;
assembly_root: string;
@@ -141,6 +156,7 @@ declare type MonoConfig = {
aot_profiler_options?: AOTProfilerOptions;
coverage_profiler_options?: CoverageProfilerOptions;
ignore_pdb_load_errors?: boolean;
+ wait_for_debugger?: number;
};
declare type MonoConfigError = {
isError: true;
@@ -155,6 +171,7 @@ declare type AssetEntry = {
culture?: string;
load_remote?: boolean;
is_optional?: boolean;
+ buffer?: ArrayBuffer;
};
interface AssemblyEntry extends AssetEntry {
name: "assembly";
@@ -191,14 +208,18 @@ declare type CoverageProfilerOptions = {
write_at?: string;
send_to?: string;
};
+interface EventPipeSessionOptions {
+ collectRundownEvents?: boolean;
+ providers: string;
+}
declare type DotnetModuleConfig = {
disableDotnet6Compatibility?: boolean;
config?: MonoConfig | MonoConfigError;
configSrc?: string;
- scriptDirectory?: string;
- onConfigLoaded?: () => void;
+ onConfigLoaded?: (config: MonoConfig) => Promise<void>;
onDotnetReady?: () => void;
imports?: DotnetModuleConfigImports;
+ exports?: string[];
} & Partial<EmscriptenModule>;
declare type DotnetModuleConfigImports = {
require?: (name: string) => any;
@@ -222,6 +243,49 @@ declare type DotnetModuleConfigImports = {
url?: any;
};
+declare type EventPipeSessionID = bigint;
+interface EventPipeSession {
+ get sessionID(): EventPipeSessionID;
+ start(): void;
+ stop(): void;
+ getTraceBlob(): Blob;
+}
+declare const eventLevel: {
+ readonly LogAlways: 0;
+ readonly Critical: 1;
+ readonly Error: 2;
+ readonly Warning: 3;
+ readonly Informational: 4;
+ readonly Verbose: 5;
+};
+declare type EventLevel = typeof eventLevel;
+declare type UnnamedProviderConfiguration = Partial<{
+ keyword_mask: string | 0;
+ level: number;
+ args: string;
+}>;
+interface ProviderConfiguration extends UnnamedProviderConfiguration {
+ name: string;
+}
+declare class SessionOptionsBuilder {
+ private _rundown?;
+ private _providers;
+ constructor();
+ static get Empty(): SessionOptionsBuilder;
+ static get DefaultProviders(): SessionOptionsBuilder;
+ setRundownEnabled(enabled: boolean): SessionOptionsBuilder;
+ addProvider(provider: ProviderConfiguration): SessionOptionsBuilder;
+ addRuntimeProvider(overrideOptions?: UnnamedProviderConfiguration): SessionOptionsBuilder;
+ addRuntimePrivateProvider(overrideOptions?: UnnamedProviderConfiguration): SessionOptionsBuilder;
+ addSampleProfilerProvider(overrideOptions?: UnnamedProviderConfiguration): SessionOptionsBuilder;
+ build(): EventPipeSessionOptions;
+}
+interface Diagnostics {
+ EventLevel: EventLevel;
+ SessionOptionsBuilder: typeof SessionOptionsBuilder;
+ createEventPipeSession(options?: EventPipeSessionOptions): EventPipeSession | null;
+}
+
declare function mono_wasm_runtime_ready(): void;
declare function mono_wasm_setenv(name: string, value: string): void;
@@ -238,43 +302,123 @@ declare function mono_wasm_load_config(configFilePath: string): Promise<void>;
declare function mono_wasm_load_icu_data(offset: VoidPtr): boolean;
+/**
+ * @deprecated Not GC or thread safe
+ */
declare function conv_string(mono_obj: MonoString): string | null;
+declare function conv_string_root(root: WasmRoot<MonoString>): string | null;
+declare function js_string_to_mono_string_root(string: string, result: WasmRoot<MonoString>): void;
+/**
+ * @deprecated Not GC or thread safe
+ */
declare function js_string_to_mono_string(string: string): MonoString;
+/**
+ * @deprecated Not GC or thread safe. For blazor use only
+ */
declare function js_to_mono_obj(js_obj: any): MonoObject;
+declare function js_to_mono_obj_root(js_obj: any, result: WasmRoot<MonoObject>, should_add_in_flight: boolean): void;
+declare function js_typed_array_to_array_root(js_obj: any, result: WasmRoot<MonoArray>): void;
+/**
+ * @deprecated Not GC or thread safe
+ */
declare function js_typed_array_to_array(js_obj: any): MonoArray;
declare function unbox_mono_obj(mono_obj: MonoObject): any;
+declare function unbox_mono_obj_root(root: WasmRoot<any>): any;
declare function mono_array_to_js_array(mono_array: MonoArray): any[] | null;
+declare function mono_array_root_to_js_array(arrayRoot: WasmRoot<MonoArray>): any[] | null;
declare function mono_bind_static_method(fqn: string, signature?: string): Function;
declare function mono_call_assembly_entry_point(assembly: string, args?: any[], signature?: string): number;
declare function mono_wasm_load_bytes_into_heap(bytes: Uint8Array): VoidPtr;
-declare type _MemOffset = number | VoidPtr | NativePointer;
+declare type _MemOffset = number | VoidPtr | NativePointer | ManagedPointer;
+declare type _NumberOrPointer = number | VoidPtr | NativePointer | ManagedPointer;
+declare function setB32(offset: _MemOffset, value: number | boolean): void;
declare function setU8(offset: _MemOffset, value: number): void;
declare function setU16(offset: _MemOffset, value: number): void;
-declare function setU32(offset: _MemOffset, value: number): void;
+declare function setU32(offset: _MemOffset, value: _NumberOrPointer): void;
declare function setI8(offset: _MemOffset, value: number): void;
declare function setI16(offset: _MemOffset, value: number): void;
declare function setI32(offset: _MemOffset, value: number): void;
-declare function setI64(offset: _MemOffset, value: number): void;
+/**
+ * Throws for values which are not 52 bit integer. See Number.isSafeInteger()
+ */
+declare function setI52(offset: _MemOffset, value: number): void;
+/**
+ * Throws for values which are not 52 bit integer or are negative. See Number.isSafeInteger().
+ */
+declare function setU52(offset: _MemOffset, value: number): void;
+declare function setI64Big(offset: _MemOffset, value: bigint): void;
declare function setF32(offset: _MemOffset, value: number): void;
declare function setF64(offset: _MemOffset, value: number): void;
+declare function getB32(offset: _MemOffset): boolean;
declare function getU8(offset: _MemOffset): number;
declare function getU16(offset: _MemOffset): number;
declare function getU32(offset: _MemOffset): number;
declare function getI8(offset: _MemOffset): number;
declare function getI16(offset: _MemOffset): number;
declare function getI32(offset: _MemOffset): number;
-declare function getI64(offset: _MemOffset): number;
+/**
+ * Throws for Number.MIN_SAFE_INTEGER > value > Number.MAX_SAFE_INTEGER
+ */
+declare function getI52(offset: _MemOffset): number;
+/**
+ * Throws for 0 > value > Number.MAX_SAFE_INTEGER
+ */
+declare function getU52(offset: _MemOffset): number;
+declare function getI64Big(offset: _MemOffset): bigint;
declare function getF32(offset: _MemOffset): number;
declare function getF64(offset: _MemOffset): number;
declare function mono_run_main_and_exit(main_assembly_name: string, args: string[]): Promise<void>;
declare function mono_run_main(main_assembly_name: string, args: string[]): Promise<number>;
+interface IDisposable {
+ dispose(): void;
+ get isDisposed(): boolean;
+}
+declare class ManagedObject implements IDisposable {
+ dispose(): void;
+ get isDisposed(): boolean;
+ toString(): string;
+}
+declare class ManagedError extends Error implements IDisposable {
+ constructor(message: string);
+ get stack(): string | undefined;
+ dispose(): void;
+ get isDisposed(): boolean;
+ toString(): string;
+}
+declare const enum MemoryViewType {
+ Byte = 0,
+ Int32 = 1,
+ Double = 2
+}
+interface IMemoryView {
+ /**
+ * copies elements from provided source to the wasm memory.
+ * target has to have the elements of the same type as the underlying C# array.
+ * same as TypedArray.set()
+ */
+ set(source: TypedArray, targetOffset?: number): void;
+ /**
+ * copies elements from wasm memory to provided target.
+ * target has to have the elements of the same type as the underlying C# array.
+ */
+ copyTo(target: TypedArray, sourceOffset?: number): void;
+ /**
+ * same as TypedArray.slice()
+ */
+ slice(start?: number, end?: number): TypedArray;
+ get length(): number;
+ get byteLength(): number;
+}
+
+declare function mono_wasm_get_assembly_exports(assembly: string): Promise<any>;
+
declare const MONO: {
mono_wasm_setenv: typeof mono_wasm_setenv;
mono_wasm_load_bytes_into_heap: typeof mono_wasm_load_bytes_into_heap;
@@ -285,50 +429,97 @@ declare const MONO: {
mono_load_runtime_and_bcl_args: typeof mono_load_runtime_and_bcl_args;
mono_wasm_new_root_buffer: typeof mono_wasm_new_root_buffer;
mono_wasm_new_root: typeof mono_wasm_new_root;
+ mono_wasm_new_external_root: typeof mono_wasm_new_external_root;
mono_wasm_release_roots: typeof mono_wasm_release_roots;
mono_run_main: typeof mono_run_main;
mono_run_main_and_exit: typeof mono_run_main_and_exit;
+ mono_wasm_get_assembly_exports: typeof mono_wasm_get_assembly_exports;
mono_wasm_add_assembly: (name: string, data: VoidPtr, size: number) => number;
mono_wasm_load_runtime: (unused: string, debug_level: number) => void;
config: MonoConfig | MonoConfigError;
loaded_files: string[];
+ setB32: typeof setB32;
setI8: typeof setI8;
setI16: typeof setI16;
setI32: typeof setI32;
- setI64: typeof setI64;
+ setI52: typeof setI52;
+ setU52: typeof setU52;
+ setI64Big: typeof setI64Big;
setU8: typeof setU8;
setU16: typeof setU16;
setU32: typeof setU32;
setF32: typeof setF32;
setF64: typeof setF64;
+ getB32: typeof getB32;
getI8: typeof getI8;
getI16: typeof getI16;
getI32: typeof getI32;
- getI64: typeof getI64;
+ getI52: typeof getI52;
+ getU52: typeof getU52;
+ getI64Big: typeof getI64Big;
getU8: typeof getU8;
getU16: typeof getU16;
getU32: typeof getU32;
getF32: typeof getF32;
getF64: typeof getF64;
+ diagnostics: Diagnostics;
};
declare type MONOType = typeof MONO;
declare const BINDING: {
+ /**
+ * @deprecated Not GC or thread safe
+ */
mono_obj_array_new: (size: number) => MonoArray;
+ /**
+ * @deprecated Not GC or thread safe
+ */
mono_obj_array_set: (array: MonoArray, idx: number, obj: MonoObject) => void;
+ /**
+ * @deprecated Not GC or thread safe
+ */
js_string_to_mono_string: typeof js_string_to_mono_string;
+ /**
+ * @deprecated Not GC or thread safe
+ */
js_typed_array_to_array: typeof js_typed_array_to_array;
- js_to_mono_obj: typeof js_to_mono_obj;
+ /**
+ * @deprecated Not GC or thread safe
+ */
mono_array_to_js_array: typeof mono_array_to_js_array;
+ /**
+ * @deprecated Not GC or thread safe
+ */
+ js_to_mono_obj: typeof js_to_mono_obj;
+ /**
+ * @deprecated Not GC or thread safe
+ */
conv_string: typeof conv_string;
+ /**
+ * @deprecated Not GC or thread safe
+ */
+ unbox_mono_obj: typeof unbox_mono_obj;
+ /**
+ * @deprecated Renamed to conv_string_root
+ */
+ conv_string_rooted: typeof conv_string_root;
+ mono_obj_array_new_ref: (size: number, result: MonoObjectRef) => void;
+ mono_obj_array_set_ref: (array: MonoObjectRef, idx: number, obj: MonoObjectRef) => void;
+ js_string_to_mono_string_root: typeof js_string_to_mono_string_root;
+ js_typed_array_to_array_root: typeof js_typed_array_to_array_root;
+ js_to_mono_obj_root: typeof js_to_mono_obj_root;
+ conv_string_root: typeof conv_string_root;
+ unbox_mono_obj_root: typeof unbox_mono_obj_root;
+ mono_array_root_to_js_array: typeof mono_array_root_to_js_array;
bind_static_method: typeof mono_bind_static_method;
call_assembly_entry_point: typeof mono_call_assembly_entry_point;
- unbox_mono_obj: typeof unbox_mono_obj;
};
declare type BINDINGType = typeof BINDING;
interface DotnetPublicAPI {
MONO: typeof MONO;
BINDING: typeof BINDING;
INTERNAL: any;
+ EXPORTS: any;
+ IMPORTS: any;
Module: EmscriptenModule;
RuntimeId: number;
RuntimeBuildInfo: {
@@ -343,4 +534,33 @@ declare global {
function getDotnetRuntime(runtimeId: number): DotnetPublicAPI | undefined;
}
-export { BINDINGType, CreateDotnetRuntimeType, DotnetModuleConfig, DotnetPublicAPI, EmscriptenModule, MONOType, MonoArray, MonoObject, MonoString, VoidPtr, createDotnetRuntime as default };
+/**
+ * Span class is JS wrapper for System.Span<T>. This view doesn't own the memory, nor pin the underlying array.
+ * It's ideal to be used on call from C# with the buffer pinned there or with unmanaged memory.
+ * It is disposed at the end of the call to JS.
+ */
+declare class Span implements IMemoryView, IDisposable {
+ dispose(): void;
+ get isDisposed(): boolean;
+ set(source: TypedArray, targetOffset?: number | undefined): void;
+ copyTo(target: TypedArray, sourceOffset?: number | undefined): void;
+ slice(start?: number | undefined, end?: number | undefined): TypedArray;
+ get length(): number;
+ get byteLength(): number;
+}
+/**
+ * ArraySegment class is JS wrapper for System.ArraySegment<T>.
+ * This wrapper would also pin the underlying array and hold GCHandleType.Pinned until this JS instance is collected.
+ * User could dispose it manualy.
+ */
+declare class ArraySegment implements IMemoryView, IDisposable {
+ dispose(): void;
+ get isDisposed(): boolean;
+ set(source: TypedArray, targetOffset?: number | undefined): void;
+ copyTo(target: TypedArray, sourceOffset?: number | undefined): void;
+ slice(start?: number | undefined, end?: number | undefined): TypedArray;
+ get length(): number;
+ get byteLength(): number;
+}
+
+export { ArraySegment, BINDINGType, CreateDotnetRuntimeType, DotnetModuleConfig, DotnetPublicAPI, EmscriptenModule, IMemoryView, MONOType, ManagedError, ManagedObject, MemoryViewType, MonoArray, MonoObject, MonoString, Span, VoidPtr, createDotnetRuntime as default };
diff --git a/src/Components/Web.JS/dist/Release/blazor.server.js b/src/Components/Web.JS/dist/Release/blazor.server.js
index 9df6b75ac0..47124ecaab 100644
--- a/src/Components/Web.JS/dist/Release/blazor.server.js
+++ b/src/Components/Web.JS/dist/Release/blazor.server.js
@@ -1 +1 @@
-(()=>{"use strict";var e,t,n,r={};r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",s="__byte[]";class i{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const a={},c={0:new i(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,h=1,u=1,d=null;function p(e){t.push(e)}function f(e){if(e&&"object"==typeof e){c[u]=new i(e);const t={[o]:u};return u++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function g(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=f(e);n.__jsObjectId=t.__jsObjectId}catch(t){throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function m(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function y(e,t,n,r){const o=b();if(o.invokeDotNetFromJS){const s=D(r),i=o.invokeDotNetFromJS(e,t,n,s);return i?m(i):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function w(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=h++,s=new Promise(((e,t)=>{a[o]={resolve:e,reject:t}}));try{const s=D(r);b().beginInvokeDotNetFromJS(o,e,t,n,s)}catch(e){v(o,!1,e)}return s}function b(){if(null!==d)return d;throw new Error("No .NET call dispatcher has been set.")}function v(e,t,n){if(!a.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=a[e];delete a[e],t?r.resolve(n):r.reject(n)}function _(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function E(e,t){const n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function S(e){delete c[e]}e.attachDispatcher=function(e){d=e},e.attachReviver=p,e.invokeMethod=function(e,t,...n){return y(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return w(e,t,null,n)},e.createJSObjectReference=f,e.createJSStreamReference=g,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&S(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:E,disposeJSObjectReferenceById:S,invokeJSFromDotNet:(e,t,n,r)=>{const o=T(E(e,r).apply(null,m(t)),n);return null==o?null:D(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const s=new Promise((e=>{e(E(t,o).apply(null,m(n)))}));e&&s.then((t=>b().endInvokeJSFromDotNet(e,!0,D([e,!0,T(t,r)]))),(t=>b().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,_(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?m(n):new Error(n);v(parseInt(e,10),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new k;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return y(null,e,this._id,t)}invokeMethodAsync(e,...t){return w(null,e,this._id,t)}dispose(){w(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,p((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(s)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new I(t.__dotNetStream)}return t}));class I{constructor(e){if(r.has(e))this._streamPromise=r.get(e).streamPromise,r.delete(e);else{const t=new k;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class k{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function T(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return f(e);case l.JSStreamReference:return g(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let x=0;function D(e){return x=0,JSON.stringify(e,R)}function R(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){d.sendByteArray(x,t);const e={[s]:x};return x++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class o{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new o(e,t.value)}return null}}const s=new Map,i=new Map,a=[];function c(e){return s.get(e)}function l(e){const t=s.get(e);return(null==t?void 0:t.browserEventName)||e}function h(e,t){e.forEach((e=>s.set(e,t)))}function u(e){const t=[];for(let n=0;n<e.length;n++){const r=e[n];t.push({identifier:r.identifier,clientX:r.clientX,clientY:r.clientY,screenX:r.screenX,screenY:r.screenY,pageX:r.pageX,pageY:r.pageY})}return t}function d(e){return{detail:e.detail,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,offsetX:e.offsetX,offsetY:e.offsetY,pageX:e.pageX,pageY:e.pageY,button:e.button,buttons:e.buttons,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,type:e.type}}h(["input","change"],{createEventArgs:function(e){const t=e.target;if(function(e){return-1!==p.indexOf(e.getAttribute("type"))}(t)){const e=function(e){const t=e.value,n=e.type;switch(n){case"date":case"month":case"week":return t;case"datetime-local":return 16===t.length?t+":00":t;case"time":return 5===t.length?t+":00":t}throw new Error(`Invalid element type '${n}'.`)}(t);return{value:e}}if(function(e){return e instanceof HTMLSelectElement&&"select-multiple"===e.type}(t)){const e=t;return{value:Array.from(e.options).filter((e=>e.selected)).map((e=>e.value))}}{const e=function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t);return{value:e?!!t.checked:t.value}}}}),h(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),h(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),h(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),h(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","mouseleave","mouseenter","dblclick"],{createEventArgs:e=>d(e)}),h(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),h(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),h(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),h(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),h(["toggle"],{createEventArgs:()=>({})});const p=["date","datetime-local","month","time","week"],f=new Map;let g,m,y=0;const w={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++y).toString();f.set(r,e);const o=await _().invokeMethodAsync("AddRootComponent",t,r),s=new v(o,m[t]);return await s.setParameters(n),s}};class b{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class v{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new b)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return _().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await _().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function _(){if(!g)throw new Error("Dynamic root components have not been enabled in this application.");return g}const E=new Map;let S;const C=new Promise((e=>{S=e}));function I(e,t,n){return T(e,t.eventHandlerId,(()=>k(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function k(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let T=(e,t,n)=>n();const x=N(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),D={submit:!0},R=N(["click","dblclick","mousedown","mousemove","mouseup"]);class P{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++P.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new U(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),s=o.getHandler(t);if(s)this.eventInfoStore.update(s.eventHandlerId,n);else{const s={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(s),o.setHandler(t,s)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,i.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let r=n.shift(),s=null,i=!1;const a=Object.prototype.hasOwnProperty.call(x,e);let l=!1;for(;r;){const d=r,p=this.getEventHandlerInfosForElement(d,!1);if(p){const n=p.getHandler(e);if(n&&(h=d,u=t.type,!((h instanceof HTMLButtonElement||h instanceof HTMLInputElement||h instanceof HTMLTextAreaElement||h instanceof HTMLSelectElement)&&Object.prototype.hasOwnProperty.call(R,u)&&h.disabled))){if(!i){const n=c(e);s=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},i=!0}Object.prototype.hasOwnProperty.call(D,t.type)&&t.preventDefault(),I(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:o.fromEvent(n.renderingComponentId,t)},s)}p.stopPropagation(e)&&(l=!0),p.preventDefault(e)&&t.preventDefault()}r=a||l?void 0:n.shift()}var h,u}getEventHandlerInfosForElement(e,t){return Object.prototype.hasOwnProperty.call(e,this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new A:null}}P.nextEventDelegatorId=0;class U{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},a.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=l(e),Object.prototype.hasOwnProperty.call(this.countByEventName,e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=Object.prototype.hasOwnProperty.call(x,e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(Object.prototype.hasOwnProperty.call(this.infosByEventHandlerId,t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=l(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(Object.prototype.hasOwnProperty.call(this.countByEventName,e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class A{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return Object.prototype.hasOwnProperty.call(this.handlers,e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function N(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const $=G("_blazorLogicalChildren"),B=G("_blazorLogicalParent"),L=G("_blazorLogicalEnd");function M(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return $ in e||(e[$]=[]),e}function O(e,t){const n=document.createComment("!");return F(n,e,t),n}function F(e,t,n){const r=e;if(e instanceof Comment&&J(r)&&J(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(H(r))throw new Error("Not implemented: moving existing logical children");const o=J(t);if(n<o.length){const t=o[n];t.parentNode.insertBefore(e,t),o.splice(n,0,r)}else X(e,t),o.push(r);r[B]=t,$ in r||(r[$]=[])}function j(e,t){const n=J(e).splice(t,1)[0];if(n instanceof Comment){const e=J(n);if(e)for(;e.length>0;)j(n,0)}const r=n;r.parentNode.removeChild(r)}function H(e){return e[B]||null}function W(e,t){return J(e)[t]}function z(e){const t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function J(e){return e[$]}function q(e,t){const n=J(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=document.createComment("marker");t.moveToBeforeMarker=r;const o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let s=r;for(;s;){const e=s.nextSibling;if(n.insertBefore(s,t),s===o)break;s=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function K(e){const t=J(H(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=K(t);n?n.parentNode.insertBefore(e,n):X(e,H(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=K(e);if(t)return t.previousSibling;{const t=H(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function Q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${Q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",ee=document.createElement("template"),te=document.createElementNS("http://www.w3.org/2000/svg","g"),ne={},re="__internal_",oe="preventDefault_",se="stopPropagation_";class ie{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new P(e),this.eventDelegator.notifyAfterClick((e=>{if(!fe)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;e<t.length;e++){const n=t[e];if(n instanceof Element&&"A"===n.tagName)return n}return null}return Se(e.target,"A")}(e);if(t&&function(e){const t=e.getAttribute("target");return(!t||"_self"===t)&&e.hasAttribute("href")&&!e.hasAttribute("download")}(t)){const n=Ee(t.getAttribute("href"));Ce(n)&&(e.preventDefault(),be(n,!0,!1))}}))}attachRootComponentToLogicalElement(e,t,n){this.attachComponentToElement(e,t),this.rootComponentIds.add(e),n||(ne[e]=t)}updateComponent(e,t,n,r){var o;const s=this.childComponentLocations[t];if(!s)throw new Error(`No element is currently associated with component ${t}`);const i=ne[t];if(i){const e=function(e){return e[L]||null}(i);delete ne[t],e?function(e,t){const n=H(e);if(!n)throw new Error("Can't clear between nodes. The start node does not have a logical parent.");const r=J(n),o=r.indexOf(e)+1,s=r.indexOf(t);for(let e=o;e<=s;e++)j(n,o);e.textContent="!"}(i,e):function(e){let t;for(;t=e.firstChild;)e.removeChild(t)}(i)}const a=null===(o=V(s))||void 0===o?void 0:o.getRootNode(),c=a&&a.activeElement;this.applyEdits(e,t,s,0,n,r),c instanceof HTMLElement&&a&&a.activeElement!==c&&c.focus()}disposeComponent(e){this.rootComponentIds.delete(e)&&function(e){const t=J(e);for(;t.length;)j(e,0)}(this.childComponentLocations[e]),delete this.childComponentLocations[e]}disposeEventHandler(e){this.eventDelegator.removeListener(e)}attachComponentToElement(e,t){this.childComponentLocations[e]=t}applyEdits(e,n,r,o,s,i){let a,c=0,l=o;const h=e.arrayBuilderSegmentReader,u=e.editReader,d=e.frameReader,p=h.values(s),f=h.offset(s),g=f+h.count(s);for(let s=f;s<g;s++){const h=e.diffReader.editsEntry(p,s),f=u.editType(h);switch(f){case t.prependFrame:{const t=u.newTreeIndex(h),o=e.referenceFramesEntry(i,t),s=u.siblingIndex(h);this.insertFrame(e,n,r,l+s,i,o,t);break}case t.removeFrame:j(r,l+u.siblingIndex(h));break;case t.setAttribute:{const t=u.newTreeIndex(h),o=e.referenceFramesEntry(i,t),s=W(r,l+u.siblingIndex(h));if(!(s instanceof Element))throw new Error("Cannot set attribute on non-element child");this.applyAttribute(e,n,s,o);break}case t.removeAttribute:{const t=W(r,l+u.siblingIndex(h));if(!(t instanceof HTMLElement))throw new Error("Cannot remove attribute from non-element child");{const n=u.removedAttributeName(h);this.tryApplySpecialProperty(e,t,n,null)||t.removeAttribute(n)}break}case t.updateText:{const t=u.newTreeIndex(h),n=e.referenceFramesEntry(i,t),o=W(r,l+u.siblingIndex(h));if(!(o instanceof Text))throw new Error("Cannot set text content on non-text child");o.textContent=d.textContent(n);break}case t.updateMarkup:{const t=u.newTreeIndex(h),n=e.referenceFramesEntry(i,t),o=u.siblingIndex(h);j(r,l+o),this.insertMarkup(e,r,l+o,n);break}case t.stepIn:r=W(r,l+u.siblingIndex(h)),c++,l=0;break;case t.stepOut:r=H(r),c--,l=0===c?o:0;break;case t.permutationListEntry:a=a||[],a.push({fromSiblingIndex:l+u.siblingIndex(h),toSiblingIndex:l+u.moveToSiblingIndex(h)});break;case t.permutationListEnd:q(r,a),a=void 0;break;default:throw new Error(`Unknown edit type: ${f}`)}}}insertFrame(e,t,r,o,s,i,a){const c=e.frameReader,l=c.frameType(i);switch(l){case n.element:return this.insertElement(e,t,r,o,s,i,a),1;case n.text:return this.insertText(e,r,o,i),1;case n.attribute:throw new Error("Attribute frames should only be present as leading children of element frames.");case n.component:return this.insertComponent(e,r,o,i),1;case n.region:return this.insertFrameRange(e,t,r,o,s,a+1,a+c.subtreeLength(i));case n.elementReferenceCapture:if(r instanceof Element)return h=r,u=c.elementReferenceCaptureId(i),h.setAttribute(Q(u),""),0;throw new Error("Reference capture frames can only be children of element frames.");case n.markup:return this.insertMarkup(e,r,o,i),1;default:throw new Error(`Unknown frame type: ${l}`)}var h,u}insertElement(e,t,r,o,s,i,a){const c=e.frameReader,l=c.elementName(i),h="svg"===l||z(r)?document.createElementNS("http://www.w3.org/2000/svg",l):document.createElement(l),u=M(h);let d=!1;const p=a+c.subtreeLength(i);for(let i=a+1;i<p;i++){const a=e.referenceFramesEntry(s,i);if(c.frameType(a)!==n.attribute){F(h,r,o),d=!0,this.insertFrameRange(e,t,u,0,s,i,p);break}this.applyAttribute(e,t,h,a)}d||F(h,r,o),h instanceof HTMLOptionElement?this.trySetSelectValueFromOptionElement(h):Z in h&&ue(h,h._blazorDeferredValue)}trySetSelectValueFromOptionElement(e){const t=this.findClosestAncestorSelectElement(e);if(!function(e){return!!e&&Z in e}(t))return!1;if(le(t))e.selected=-1!==t._blazorDeferredValue.indexOf(e.value);else{if(t._blazorDeferredValue!==e.value)return!1;he(t,e.value),delete t._blazorDeferredValue}return!0}insertComponent(e,t,n,r){const o=O(t,n),s=e.frameReader.componentId(r);this.attachComponentToElement(s,o)}insertText(e,t,n,r){const o=e.frameReader.textContent(r);F(document.createTextNode(o),t,n)}insertMarkup(e,t,n,r){const o=O(t,n),s=(i=e.frameReader.markupContent(r),z(t)?(te.innerHTML=i||" ",te):(ee.innerHTML=i||" ",ee.content));var i;let a=0;for(;s.firstChild;)F(s.firstChild,o,a++)}applyAttribute(e,t,n,r){const o=e.frameReader,s=o.attributeName(r),i=o.attributeEventHandlerId(r);if(i){const e=ce(s);this.eventDelegator.setListener(n,e,i,t)}else this.tryApplySpecialProperty(e,n,s,r)||n.setAttribute(s,o.attributeValue(r))}tryApplySpecialProperty(e,t,n,r){switch(n){case"value":return this.tryApplyValueProperty(e,t,r);case"checked":return this.tryApplyCheckedProperty(e,t,r);default:return!!n.startsWith(re)&&(this.applyInternalAttribute(e,t,n.substring(re.length),r),!0)}}applyInternalAttribute(e,t,n,r){const o=r?e.frameReader.attributeValue(r):null;if(n.startsWith(se)){const e=ce(n.substring(se.length));this.eventDelegator.setStopPropagation(t,e,null!==o)}else{if(!n.startsWith(oe))throw new Error(`Unsupported internal attribute '${n}'`);{const e=ce(n.substring(oe.length));this.eventDelegator.setPreventDefault(t,e,null!==o)}}}tryApplyValueProperty(e,t,n){const r=e.frameReader;let o=n?r.attributeValue(n):null;switch(o&&"INPUT"===t.tagName&&(o=function(e,t){switch(t){case"time":return 8===e.length&&e.endsWith("00")?e.substring(0,5):e;case"datetime-local":return 19===e.length&&e.endsWith("00")?e.substring(0,16):e;default:return e}}(o,t.getAttribute("type"))),t.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return o&&t instanceof HTMLSelectElement&&le(t)&&(o=JSON.parse(o)),ue(t,o),t._blazorDeferredValue=o,!0;case"OPTION":return o||""===o?t.setAttribute("value",o):t.removeAttribute("value"),this.trySetSelectValueFromOptionElement(t),!0;default:return!1}}tryApplyCheckedProperty(e,t,n){if("INPUT"===t.tagName){const r=n?e.frameReader.attributeValue(n):null;return t.checked=null!==r,!0}return!1}findClosestAncestorSelectElement(e){for(;e;){if(e instanceof HTMLSelectElement)return e;e=e.parentElement}return null}insertFrameRange(e,t,n,r,o,s,i){const a=r;for(let a=s;a<i;a++){const s=e.referenceFramesEntry(o,a);r+=this.insertFrame(e,t,n,r,o,s,a),a+=ae(e,s)}return r-a}}function ae(e,t){const r=e.frameReader;switch(r.frameType(t)){case n.component:case n.element:case n.region:return r.subtreeLength(t)-1;default:return 0}}function ce(e){if(e.startsWith("on"))return e.substring(2);throw new Error(`Attribute should be an event name, but doesn't start with 'on'. Value: '${e}'`)}function le(e){return"select-multiple"===e.type}function he(e,t){e.value=t||""}function ue(e,t){e instanceof HTMLSelectElement?le(e)?function(e,t){t||(t=[]);for(let n=0;n<e.options.length;n++)e.options[n].selected=-1!==t.indexOf(e.options[n].value)}(e,t):he(e,t):e.value=t}const de={};let pe=!1,fe=!1,ge=!1,me=null;const ye={listenForNavigationEvents:function(e){me=e,ge||(ge=!0,window.addEventListener("popstate",(()=>ve(!1))))},enableNavigationInterception:function(){fe=!0},navigateTo:we,getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function we(e,t,n=!1){const r=Ee(e),o=t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n};!o.forceLoad&&Ce(r)?be(r,!1,o.replaceHistoryEntry):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,o.replaceHistoryEntry)}function be(e,t,n){pe=!0,n?history.replaceState(null,"",e):history.pushState(null,"",e),ve(t)}async function ve(e){me&&await me(location.href,e)}let _e;function Ee(e){return _e=_e||document.createElement("a"),_e.href=e,_e.href}function Se(e,t){return e?e.tagName===t?e:Se(e.parentElement,t):null}function Ce(e){const t=(n=document.baseURI).substr(0,n.lastIndexOf("/")+1);var n;return e.startsWith(t)}const Ie={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},ke={init:function(e,t,n,r=50){const o=xe(t);(o||document.documentElement).style.overflowAnchor="none";const s=document.createRange();h(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const i=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;s.setStartAfter(t),s.setEndBefore(n);const i=s.getBoundingClientRect().height,a=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,i,a):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,i,a)}))}),{root:o,rootMargin:`${r}px`});i.observe(t),i.observe(n);const a=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{h(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),i.unobserve(e),i.observe(e)}));return n.observe(e,t),n}function h(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}Te[e._id]={intersectionObserver:i,mutationObserverBefore:a,mutationObserverAfter:c}},dispose:function(e){const t=Te[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete Te[e._id])}},Te={};function xe(e){return e?"visible"!==getComputedStyle(e).overflowY?e:xe(e.parentElement):null}const De={getAndRemoveExistingTitle:function(){var e;const t=document.head?document.head.getElementsByTagName("title"):[];if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],s=o.previousSibling;s instanceof Comment&&null!==H(s)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Re={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const s=Pe(e,t),i=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(s.blob)})),a=await new Promise((function(e){var t;const s=Math.min(1,r/i.width),a=Math.min(1,o/i.height),c=Math.min(s,a),l=document.createElement("canvas");l.width=Math.round(i.width*c),l.height=Math.round(i.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(i,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:s.lastModified,name:s.name,size:(null==a?void 0:a.size)||0,contentType:n,blob:a||s.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Pe(e,t).blob}};function Pe(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed.`);return n}async function Ue(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)}const Ae=new Map,Ne={navigateTo:we,registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(s.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=i.get(t.browserEventName);n?n.push(e):i.set(t.browserEventName,[e]),a.forEach((n=>n(e,t.browserEventName)))}s.set(e,t)},rootComponents:w,_internal:{navigationManager:ye,domWrapper:Ie,Virtualize:ke,PageTitle:De,InputFile:Re,getJSDataStreamChunk:Ue,receiveDotNetDataStream:function(t,n,r,o){let s=Ae.get(t);if(!s){const n=new ReadableStream({start(e){Ae.set(t,e),s=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(s.error(o),Ae.delete(t)):0===r?(s.close(),Ae.delete(t)):s.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(g)throw new Error("Dynamic root components have already been enabled.");g=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(k(t),r,o),S()}}};window.Blazor=Ne;const $e=[0,2e3,1e4,3e4,null];class Be{constructor(e){this._retryDelays=void 0!==e?[...e,null]:$e}nextRetryDelayInMilliseconds(e){return this._retryDelays[e.previousRetryCount]}}class Le extends Error{constructor(e,t){const n=new.target.prototype;super(`${e}: Status code '${t}'`),this.statusCode=t,this.__proto__=n}}class Me extends Error{constructor(e="A timeout occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Oe extends Error{constructor(e="An abort occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Fe extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="UnsupportedTransportError",this.__proto__=n}}class je extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="DisabledTransportError",this.__proto__=n}}class He extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="FailedToStartTransportError",this.__proto__=n}}class We extends Error{constructor(e){const t=new.target.prototype;super(e),this.errorType="FailedToNegotiateWithServerError",this.__proto__=t}}class ze extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.innerErrors=t,this.__proto__=n}}class Je{constructor(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}}class qe{get(e,t){return this.send({...t,method:"GET",url:e})}post(e,t){return this.send({...t,method:"POST",url:e})}delete(e,t){return this.send({...t,method:"DELETE",url:e})}getCookieString(e){return""}}var Ve,Ke,Xe,Ye,Ge;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(Ve||(Ve={}));class Qe{constructor(){}log(e,t){}}Qe.instance=new Qe;class Ze{static isRequired(e,t){if(null==e)throw new Error(`The '${t}' argument is required.`)}static isNotEmpty(e,t){if(!e||e.match(/^\s*$/))throw new Error(`The '${t}' argument should not be empty.`)}static isIn(e,t,n){if(!(e in t))throw new Error(`Unknown ${n} value: ${e}.`)}}class et{static get isBrowser(){return"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return"object"==typeof self&&"importScripts"in self}static get isReactNative(){return"object"==typeof window&&void 0===window.document}static get isNode(){return!this.isBrowser&&!this.isWebWorker&&!this.isReactNative}}function tt(e,t){let n="";return nt(e)?(n=`Binary data of length ${e.byteLength}`,t&&(n+=`. Content: '${function(e){const t=new Uint8Array(e);let n="";return t.forEach((e=>{n+=`0x${e<16?"0":""}${e.toString(16)} `})),n.substr(0,n.length-1)}(e)}'`)):"string"==typeof e&&(n=`String data of length ${e.length}`,t&&(n+=`. Content: '${e}'`)),n}function nt(e){return e&&"undefined"!=typeof ArrayBuffer&&(e instanceof ArrayBuffer||e.constructor&&"ArrayBuffer"===e.constructor.name)}async function rt(e,t,n,r,o,s,i){let a={};if(o){const e=await o();e&&(a={Authorization:`Bearer ${e}`})}const[c,l]=it();a[c]=l,e.log(Ve.Trace,`(${t} transport) sending data. ${tt(s,i.logMessageContent)}.`);const h=nt(s)?"arraybuffer":"text",u=await n.post(r,{content:s,headers:{...a,...i.headers},responseType:h,timeout:i.timeout,withCredentials:i.withCredentials});e.log(Ve.Trace,`(${t} transport) request complete. Response status: ${u.statusCode}.`)}class ot{constructor(e,t){this._subject=e,this._observer=t}dispose(){const e=this._subject.observers.indexOf(this._observer);e>-1&&this._subject.observers.splice(e,1),0===this._subject.observers.length&&this._subject.cancelCallback&&this._subject.cancelCallback().catch((e=>{}))}}class st{constructor(e){this._minLevel=e,this.out=console}log(e,t){if(e>=this._minLevel){const n=`[${(new Date).toISOString()}] ${Ve[e]}: ${t}`;switch(e){case Ve.Critical:case Ve.Error:this.out.error(n);break;case Ve.Warning:this.out.warn(n);break;case Ve.Information:this.out.info(n);break;default:this.out.log(n)}}}}function it(){let e="X-SignalR-User-Agent";return et.isNode&&(e="User-Agent"),[e,at("0.0.0-DEV_BUILD",ct(),et.isNode?"NodeJS":"Browser",lt())]}function at(e,t,n,r){let o="Microsoft SignalR/";const s=e.split(".");return o+=`${s[0]}.${s[1]}`,o+=` (${e}; `,o+=t&&""!==t?`${t}; `:"Unknown OS; ",o+=`${n}`,o+=r?`; ${r}`:"; Unknown Runtime Version",o+=")",o}function ct(){if(!et.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function lt(){if(et.isNode)return process.versions.node}function ht(e){return e.stack?e.stack:e.message?e.message:`${e}`}class ut extends qe{constructor(e){if(super(),this._logger=e,"undefined"==typeof fetch){const e=require;this._jar=new(e("tough-cookie").CookieJar),this._fetchType=e("node-fetch"),this._fetchType=e("fetch-cookie")(this._fetchType,this._jar)}else this._fetchType=fetch.bind(function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("could not find global")}());if("undefined"==typeof AbortController){const e=require;this._abortControllerType=e("abort-controller")}else this._abortControllerType=AbortController}async send(e){if(e.abortSignal&&e.abortSignal.aborted)throw new Oe;if(!e.method)throw new Error("No method defined.");if(!e.url)throw new Error("No url defined.");const t=new this._abortControllerType;let n;e.abortSignal&&(e.abortSignal.onabort=()=>{t.abort(),n=new Oe});let r,o=null;if(e.timeout){const r=e.timeout;o=setTimeout((()=>{t.abort(),this._logger.log(Ve.Warning,"Timeout from HTTP request."),n=new Me}),r)}try{r=await this._fetchType(e.url,{body:e.content,cache:"no-cache",credentials:!0===e.withCredentials?"include":"same-origin",headers:{"Content-Type":"text/plain;charset=UTF-8","X-Requested-With":"XMLHttpRequest",...e.headers},method:e.method,mode:"cors",redirect:"follow",signal:t.signal})}catch(e){if(n)throw n;throw this._logger.log(Ve.Warning,`Error from HTTP request. ${e}.`),e}finally{o&&clearTimeout(o),e.abortSignal&&(e.abortSignal.onabort=null)}if(!r.ok){const e=await dt(r,"text");throw new Le(e||r.statusText,r.status)}const s=dt(r,e.responseType),i=await s;return new Je(r.status,r.statusText,i)}getCookieString(e){return""}}function dt(e,t){let n;switch(t){case"arraybuffer":n=e.arrayBuffer();break;case"text":default:n=e.text();break;case"blob":case"document":case"json":throw new Error(`${t} is not supported.`)}return n}class pt extends qe{constructor(e){super(),this._logger=e}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Oe):e.method?e.url?new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),r.withCredentials=void 0===e.withCredentials||e.withCredentials,r.setRequestHeader("X-Requested-With","XMLHttpRequest"),r.setRequestHeader("Content-Type","text/plain;charset=UTF-8");const o=e.headers;o&&Object.keys(o).forEach((e=>{r.setRequestHeader(e,o[e])})),e.responseType&&(r.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=()=>{r.abort(),n(new Oe)}),e.timeout&&(r.timeout=e.timeout),r.onload=()=>{e.abortSignal&&(e.abortSignal.onabort=null),r.status>=200&&r.status<300?t(new Je(r.status,r.statusText,r.response||r.responseText)):n(new Le(r.response||r.responseText||r.statusText,r.status))},r.onerror=()=>{this._logger.log(Ve.Warning,`Error from HTTP request. ${r.status}: ${r.statusText}.`),n(new Le(r.statusText,r.status))},r.ontimeout=()=>{this._logger.log(Ve.Warning,"Timeout from HTTP request."),n(new Me)},r.send(e.content||"")})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class ft extends qe{constructor(e){if(super(),"undefined"!=typeof fetch)this._httpClient=new ut(e);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this._httpClient=new pt(e)}}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Oe):e.method?e.url?this._httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}getCookieString(e){return this._httpClient.getCookieString(e)}}class gt{}gt.Authorization="Authorization",gt.Cookie="Cookie",function(e){e[e.None=0]="None",e[e.WebSockets=1]="WebSockets",e[e.ServerSentEvents=2]="ServerSentEvents",e[e.LongPolling=4]="LongPolling"}(Ke||(Ke={})),function(e){e[e.Text=1]="Text",e[e.Binary=2]="Binary"}(Xe||(Xe={}));class mt{constructor(){this._isAborted=!1,this.onabort=null}abort(){this._isAborted||(this._isAborted=!0,this.onabort&&this.onabort())}get signal(){return this}get aborted(){return this._isAborted}}class yt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._pollAbort=new mt,this._options=r,this._running=!1,this.onreceive=null,this.onclose=null}get pollAborted(){return this._pollAbort.aborted}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._url=e,this._logger.log(Ve.Trace,"(LongPolling transport) Connecting."),t===Xe.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[n,r]=it(),o={[n]:r,...this._options.headers},s={abortSignal:this._pollAbort.signal,headers:o,timeout:1e5,withCredentials:this._options.withCredentials};t===Xe.Binary&&(s.responseType="arraybuffer"),await this._updateHeaderToken(s);const i=`${e}&_=${Date.now()}`;this._logger.log(Ve.Trace,`(LongPolling transport) polling: ${i}.`);const a=await this._httpClient.get(i,s);200!==a.statusCode?(this._logger.log(Ve.Error,`(LongPolling transport) Unexpected response code: ${a.statusCode}.`),this._closeError=new Le(a.statusText||"",a.statusCode),this._running=!1):this._running=!0,this._receiving=this._poll(this._url,s)}async _updateHeaderToken(e){if(e.headers||(e.headers={}),this._accessTokenFactory){const t=await this._accessTokenFactory();t?e.headers[gt.Authorization]=`Bearer ${t}`:e.headers[gt.Authorization]&&delete e.headers[gt.Authorization]}}async _poll(e,t){try{for(;this._running;){await this._updateHeaderToken(t);try{const n=`${e}&_=${Date.now()}`;this._logger.log(Ve.Trace,`(LongPolling transport) polling: ${n}.`);const r=await this._httpClient.get(n,t);204===r.statusCode?(this._logger.log(Ve.Information,"(LongPolling transport) Poll terminated by server."),this._running=!1):200!==r.statusCode?(this._logger.log(Ve.Error,`(LongPolling transport) Unexpected response code: ${r.statusCode}.`),this._closeError=new Le(r.statusText||"",r.statusCode),this._running=!1):r.content?(this._logger.log(Ve.Trace,`(LongPolling transport) data received. ${tt(r.content,this._options.logMessageContent)}.`),this.onreceive&&this.onreceive(r.content)):this._logger.log(Ve.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(e){this._running?e instanceof Me?this._logger.log(Ve.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this._closeError=e,this._running=!1):this._logger.log(Ve.Trace,`(LongPolling transport) Poll errored after shutdown: ${e.message}`)}}}finally{this._logger.log(Ve.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this._raiseOnClose()}}async send(e){return this._running?rt(this._logger,"LongPolling",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}async stop(){this._logger.log(Ve.Trace,"(LongPolling transport) Stopping polling."),this._running=!1,this._pollAbort.abort();try{await this._receiving,this._logger.log(Ve.Trace,`(LongPolling transport) sending DELETE request to ${this._url}.`);const e={},[t,n]=it();e[t]=n;const r={headers:{...e,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials};await this._updateHeaderToken(r),await this._httpClient.delete(this._url,r),this._logger.log(Ve.Trace,"(LongPolling transport) DELETE request sent.")}finally{this._logger.log(Ve.Trace,"(LongPolling transport) Stop finished."),this._raiseOnClose()}}_raiseOnClose(){if(this.onclose){let e="(LongPolling transport) Firing onclose event.";this._closeError&&(e+=" Error: "+this._closeError),this._logger.log(Ve.Trace,e),this.onclose(this._closeError)}}}class wt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._options=r,this.onreceive=null,this.onclose=null}async connect(e,t){if(Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._logger.log(Ve.Trace,"(SSE transport) Connecting."),this._url=e,this._accessTokenFactory){const t=await this._accessTokenFactory();t&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(t)}`)}return new Promise(((n,r)=>{let o,s=!1;if(t===Xe.Text){if(et.isBrowser||et.isWebWorker)o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials});else{const t=this._httpClient.getCookieString(e),n={};n.Cookie=t;const[r,s]=it();n[r]=s,o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials,headers:{...n,...this._options.headers}})}try{o.onmessage=e=>{if(this.onreceive)try{this._logger.log(Ve.Trace,`(SSE transport) data received. ${tt(e.data,this._options.logMessageContent)}.`),this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onerror=e=>{s?this._close():r(new Error("EventSource failed to connect. The connection could not be found on the server, either the connection ID is not present on the server, or a proxy is refusing/buffering the connection. If you have multiple servers check that sticky sessions are enabled."))},o.onopen=()=>{this._logger.log(Ve.Information,`SSE connected to ${this._url}`),this._eventSource=o,s=!0,n()}}catch(e){return void r(e)}}else r(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(e){return this._eventSource?rt(this._logger,"SSE",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}stop(){return this._close(),Promise.resolve()}_close(e){this._eventSource&&(this._eventSource.close(),this._eventSource=void 0,this.onclose&&this.onclose(e))}}class bt{constructor(e,t,n,r,o,s){this._logger=n,this._accessTokenFactory=t,this._logMessageContent=r,this._webSocketConstructor=o,this._httpClient=e,this.onreceive=null,this.onclose=null,this._headers=s}async connect(e,t){let n;return Ze.isRequired(e,"url"),Ze.isRequired(t,"transferFormat"),Ze.isIn(t,Xe,"transferFormat"),this._logger.log(Ve.Trace,"(WebSockets transport) Connecting."),this._accessTokenFactory&&(n=await this._accessTokenFactory()),new Promise(((r,o)=>{let s;e=e.replace(/^http/,"ws");const i=this._httpClient.getCookieString(e);let a=!1;if(et.isReactNative){const t={},[r,o]=it();t[r]=o,n&&(t[gt.Authorization]=`Bearer ${n}`),i&&(t[gt.Cookie]=i),s=new this._webSocketConstructor(e,void 0,{headers:{...t,...this._headers}})}else n&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(n)}`);s||(s=new this._webSocketConstructor(e)),t===Xe.Binary&&(s.binaryType="arraybuffer"),s.onopen=t=>{this._logger.log(Ve.Information,`WebSocket connected to ${e}.`),this._webSocket=s,a=!0,r()},s.onerror=e=>{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"There was an error with the transport",this._logger.log(Ve.Information,`(WebSockets transport) ${t}.`)},s.onmessage=e=>{if(this._logger.log(Ve.Trace,`(WebSockets transport) data received. ${tt(e.data,this._logMessageContent)}.`),this.onreceive)try{this.onreceive(e.data)}catch(e){return void this._close(e)}},s.onclose=e=>{if(a)this._close(e);else{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.",o(new Error(t))}}}))}send(e){return this._webSocket&&this._webSocket.readyState===this._webSocketConstructor.OPEN?(this._logger.log(Ve.Trace,`(WebSockets transport) sending data. ${tt(e,this._logMessageContent)}.`),this._webSocket.send(e),Promise.resolve()):Promise.reject("WebSocket is not in the OPEN state")}stop(){return this._webSocket&&this._close(void 0),Promise.resolve()}_close(e){this._webSocket&&(this._webSocket.onclose=()=>{},this._webSocket.onmessage=()=>{},this._webSocket.onerror=()=>{},this._webSocket.close(),this._webSocket=void 0),this._logger.log(Ve.Trace,"(WebSockets transport) socket closed."),this.onclose&&(!this._isCloseEvent(e)||!1!==e.wasClean&&1e3===e.code?e instanceof Error?this.onclose(e):this.onclose():this.onclose(new Error(`WebSocket closed with status code: ${e.code} (${e.reason||"no reason given"}).`)))}_isCloseEvent(e){return e&&"boolean"==typeof e.wasClean&&"number"==typeof e.code}}class vt{constructor(e,t={}){var n;if(this._stopPromiseResolver=()=>{},this.features={},this._negotiateVersion=1,Ze.isRequired(e,"url"),this._logger=void 0===(n=t.logger)?new st(Ve.Information):null===n?Qe.instance:void 0!==n.log?n:new st(n),this.baseUrl=this._resolveUrl(e),(t=t||{}).logMessageContent=void 0!==t.logMessageContent&&t.logMessageContent,"boolean"!=typeof t.withCredentials&&void 0!==t.withCredentials)throw new Error("withCredentials option was not a 'boolean' or 'undefined' value");t.withCredentials=void 0===t.withCredentials||t.withCredentials,t.timeout=void 0===t.timeout?1e5:t.timeout,"undefined"==typeof WebSocket||t.WebSocket||(t.WebSocket=WebSocket),"undefined"==typeof EventSource||t.EventSource||(t.EventSource=EventSource),this._httpClient=t.httpClient||new ft(this._logger),this._connectionState="Disconnected",this._connectionStarted=!1,this._options=t,this.onreceive=null,this.onclose=null}async start(e){if(e=e||Xe.Binary,Ze.isIn(e,Xe,"transferFormat"),this._logger.log(Ve.Debug,`Starting connection with transfer format '${Xe[e]}'.`),"Disconnected"!==this._connectionState)return Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."));if(this._connectionState="Connecting",this._startInternalPromise=this._startInternal(e),await this._startInternalPromise,"Disconnecting"===this._connectionState){const e="Failed to start the HttpConnection before stop() was called.";return this._logger.log(Ve.Error,e),await this._stopPromise,Promise.reject(new Oe(e))}if("Connected"!==this._connectionState){const e="HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!";return this._logger.log(Ve.Error,e),Promise.reject(new Oe(e))}this._connectionStarted=!0}send(e){return"Connected"!==this._connectionState?Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")):(this._sendQueue||(this._sendQueue=new _t(this.transport)),this._sendQueue.send(e))}async stop(e){return"Disconnected"===this._connectionState?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this._connectionState?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState="Disconnecting",this._stopPromise=new Promise((e=>{this._stopPromiseResolver=e})),await this._stopInternal(e),void await this._stopPromise)}async _stopInternal(e){this._stopError=e;try{await this._startInternalPromise}catch(e){}if(this.transport){try{await this.transport.stop()}catch(e){this._logger.log(Ve.Error,`HttpConnection.transport.stop() threw error '${e}'.`),this._stopConnection()}this.transport=void 0}else this._logger.log(Ve.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async _startInternal(e){let t=this.baseUrl;this._accessTokenFactory=this._options.accessTokenFactory;try{if(this._options.skipNegotiation){if(this._options.transport!==Ke.WebSockets)throw new Error("Negotiation can only be skipped when using the WebSocket transport directly.");this.transport=this._constructTransport(Ke.WebSockets),await this._startTransport(t,e)}else{let n=null,r=0;do{if(n=await this._getNegotiationResponse(t),"Disconnecting"===this._connectionState||"Disconnected"===this._connectionState)throw new Oe("The connection was stopped during negotiation.");if(n.error)throw new Error(n.error);if(n.ProtocolVersion)throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.");if(n.url&&(t=n.url),n.accessToken){const e=n.accessToken;this._accessTokenFactory=()=>e}r++}while(n.url&&r<100);if(100===r&&n.url)throw new Error("Negotiate redirection limit exceeded.");await this._createTransport(t,this._options.transport,n,e)}this.transport instanceof yt&&(this.features.inherentKeepAlive=!0),"Connecting"===this._connectionState&&(this._logger.log(Ve.Debug,"The HttpConnection connected successfully."),this._connectionState="Connected")}catch(e){return this._logger.log(Ve.Error,"Failed to start the connection: "+e),this._connectionState="Disconnected",this.transport=void 0,this._stopPromiseResolver(),Promise.reject(e)}}async _getNegotiationResponse(e){const t={};if(this._accessTokenFactory){const e=await this._accessTokenFactory();e&&(t[gt.Authorization]=`Bearer ${e}`)}const[n,r]=it();t[n]=r;const o=this._resolveNegotiateUrl(e);this._logger.log(Ve.Debug,`Sending negotiation request: ${o}.`);try{const e=await this._httpClient.post(o,{content:"",headers:{...t,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials});if(200!==e.statusCode)return Promise.reject(new Error(`Unexpected status code returned from negotiate '${e.statusCode}'`));const n=JSON.parse(e.content);return(!n.negotiateVersion||n.negotiateVersion<1)&&(n.connectionToken=n.connectionId),n}catch(e){let t="Failed to complete negotiation with the server: "+e;return e instanceof Le&&404===e.statusCode&&(t+=" Either this is not a SignalR endpoint or there is a proxy blocking the connection."),this._logger.log(Ve.Error,t),Promise.reject(new We(t))}}_createConnectUrl(e,t){return t?e+(-1===e.indexOf("?")?"?":"&")+`id=${t}`:e}async _createTransport(e,t,n,r){let o=this._createConnectUrl(e,n.connectionToken);if(this._isITransport(t))return this._logger.log(Ve.Debug,"Connection was provided an instance of ITransport, using that directly."),this.transport=t,await this._startTransport(o,r),void(this.connectionId=n.connectionId);const s=[],i=n.availableTransports||[];let a=n;for(const n of i){const i=this._resolveTransportOrError(n,t,r);if(i instanceof Error)s.push(`${n.transport} failed:`),s.push(i);else if(this._isITransport(i)){if(this.transport=i,!a){try{a=await this._getNegotiationResponse(e)}catch(e){return Promise.reject(e)}o=this._createConnectUrl(e,a.connectionToken)}try{return await this._startTransport(o,r),void(this.connectionId=a.connectionId)}catch(e){if(this._logger.log(Ve.Error,`Failed to start the transport '${n.transport}': ${e}`),a=void 0,s.push(new He(`${n.transport} failed: ${e}`,Ke[n.transport])),"Connecting"!==this._connectionState){const e="Failed to select transport before stop() was called.";return this._logger.log(Ve.Debug,e),Promise.reject(new Oe(e))}}}}return s.length>0?Promise.reject(new ze(`Unable to connect to the server with any of the available transports. ${s.join(" ")}`,s)):Promise.reject(new Error("None of the transports supported by the client are supported by the server."))}_constructTransport(e){switch(e){case Ke.WebSockets:if(!this._options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new bt(this._httpClient,this._accessTokenFactory,this._logger,this._options.logMessageContent,this._options.WebSocket,this._options.headers||{});case Ke.ServerSentEvents:if(!this._options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new wt(this._httpClient,this._accessTokenFactory,this._logger,this._options);case Ke.LongPolling:return new yt(this._httpClient,this._accessTokenFactory,this._logger,this._options);default:throw new Error(`Unknown transport: ${e}.`)}}_startTransport(e,t){return this.transport.onreceive=this.onreceive,this.transport.onclose=e=>this._stopConnection(e),this.transport.connect(e,t)}_resolveTransportOrError(e,t,n){const r=Ke[e.transport];if(null==r)return this._logger.log(Ve.Debug,`Skipping transport '${e.transport}' because it is not supported by this client.`),new Error(`Skipping transport '${e.transport}' because it is not supported by this client.`);if(!function(e,t){return!e||0!=(t&e)}(t,r))return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it was disabled by the client.`),new je(`'${Ke[r]}' is disabled by the client.`,r);if(!(e.transferFormats.map((e=>Xe[e])).indexOf(n)>=0))return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it does not support the requested transfer format '${Xe[n]}'.`),new Error(`'${Ke[r]}' does not support ${Xe[n]}.`);if(r===Ke.WebSockets&&!this._options.WebSocket||r===Ke.ServerSentEvents&&!this._options.EventSource)return this._logger.log(Ve.Debug,`Skipping transport '${Ke[r]}' because it is not supported in your environment.'`),new Fe(`'${Ke[r]}' is not supported in your environment.`,r);this._logger.log(Ve.Debug,`Selecting transport '${Ke[r]}'.`);try{return this._constructTransport(r)}catch(e){return e}}_isITransport(e){return e&&"object"==typeof e&&"connect"in e}_stopConnection(e){if(this._logger.log(Ve.Debug,`HttpConnection.stopConnection(${e}) called while in state ${this._connectionState}.`),this.transport=void 0,e=this._stopError||e,this._stopError=void 0,"Disconnected"!==this._connectionState){if("Connecting"===this._connectionState)throw this._logger.log(Ve.Warning,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is still in the connecting state.`),new Error(`HttpConnection.stopConnection(${e}) was called while the connection is still in the connecting state.`);if("Disconnecting"===this._connectionState&&this._stopPromiseResolver(),e?this._logger.log(Ve.Error,`Connection disconnected with error '${e}'.`):this._logger.log(Ve.Information,"Connection disconnected."),this._sendQueue&&(this._sendQueue.stop().catch((e=>{this._logger.log(Ve.Error,`TransportSendQueue.stop() threw error '${e}'.`)})),this._sendQueue=void 0),this.connectionId=void 0,this._connectionState="Disconnected",this._connectionStarted){this._connectionStarted=!1;try{this.onclose&&this.onclose(e)}catch(t){this._logger.log(Ve.Error,`HttpConnection.onclose(${e}) threw error '${t}'.`)}}}else this._logger.log(Ve.Debug,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is already in the disconnected state.`)}_resolveUrl(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!et.isBrowser)throw new Error(`Cannot resolve '${e}'.`);const t=window.document.createElement("a");return t.href=e,this._logger.log(Ve.Information,`Normalizing '${e}' to '${t.href}'.`),t.href}_resolveNegotiateUrl(e){const t=e.indexOf("?");let n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",n+=-1===t?"":e.substring(t),-1===n.indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this._negotiateVersion),n}}class _t{constructor(e){this._transport=e,this._buffer=[],this._executing=!0,this._sendBufferedData=new Et,this._transportResult=new Et,this._sendLoopPromise=this._sendLoop()}send(e){return this._bufferData(e),this._transportResult||(this._transportResult=new Et),this._transportResult.promise}stop(){return this._executing=!1,this._sendBufferedData.resolve(),this._sendLoopPromise}_bufferData(e){if(this._buffer.length&&typeof this._buffer[0]!=typeof e)throw new Error(`Expected data to be of type ${typeof this._buffer} but was of type ${typeof e}`);this._buffer.push(e),this._sendBufferedData.resolve()}async _sendLoop(){for(;;){if(await this._sendBufferedData.promise,!this._executing){this._transportResult&&this._transportResult.reject("Connection stopped.");break}this._sendBufferedData=new Et;const e=this._transportResult;this._transportResult=void 0;const t="string"==typeof this._buffer[0]?this._buffer.join(""):_t._concatBuffers(this._buffer);this._buffer.length=0;try{await this._transport.send(t),e.resolve()}catch(t){e.reject(t)}}}static _concatBuffers(e){const t=e.map((e=>e.byteLength)).reduce(((e,t)=>e+t)),n=new Uint8Array(t);let r=0;for(const t of e)n.set(new Uint8Array(t),r),r+=t.byteLength;return n.buffer}}class Et{constructor(){this.promise=new Promise(((e,t)=>[this._resolver,this._rejecter]=[e,t]))}resolve(){this._resolver()}reject(e){this._rejecter(e)}}class St{static write(e){return`${e}${St.RecordSeparator}`}static parse(e){if(e[e.length-1]!==St.RecordSeparator)throw new Error("Message is incomplete.");const t=e.split(St.RecordSeparator);return t.pop(),t}}St.RecordSeparatorCode=30,St.RecordSeparator=String.fromCharCode(St.RecordSeparatorCode);class Ct{writeHandshakeRequest(e){return St.write(JSON.stringify(e))}parseHandshakeResponse(e){let t,n;if(nt(e)){const r=new Uint8Array(e),o=r.indexOf(St.RecordSeparatorCode);if(-1===o)throw new Error("Message is incomplete.");const s=o+1;t=String.fromCharCode.apply(null,Array.prototype.slice.call(r.slice(0,s))),n=r.byteLength>s?r.slice(s).buffer:null}else{const r=e,o=r.indexOf(St.RecordSeparator);if(-1===o)throw new Error("Message is incomplete.");const s=o+1;t=r.substring(0,s),n=r.length>s?r.substring(s):null}const r=St.parse(t),o=JSON.parse(r[0]);if(o.type)throw new Error("Expected a handshake response from the server.");return[n,o]}}!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(Ye||(Ye={}));class It{constructor(){this.observers=[]}next(e){for(const t of this.observers)t.next(e)}error(e){for(const t of this.observers)t.error&&t.error(e)}complete(){for(const e of this.observers)e.complete&&e.complete()}subscribe(e){return this.observers.push(e),new ot(this,e)}}!function(e){e.Disconnected="Disconnected",e.Connecting="Connecting",e.Connected="Connected",e.Disconnecting="Disconnecting",e.Reconnecting="Reconnecting"}(Ge||(Ge={}));class kt{constructor(e,t,n,r){this._nextKeepAlive=0,this._freezeEventListener=()=>{this._logger.log(Ve.Warning,"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://docs.microsoft.com/aspnet/core/signalr/javascript-client#bsleep")},Ze.isRequired(e,"connection"),Ze.isRequired(t,"logger"),Ze.isRequired(n,"protocol"),this.serverTimeoutInMilliseconds=3e4,this.keepAliveIntervalInMilliseconds=15e3,this._logger=t,this._protocol=n,this.connection=e,this._reconnectPolicy=r,this._handshakeProtocol=new Ct,this.connection.onreceive=e=>this._processIncomingData(e),this.connection.onclose=e=>this._connectionClosed(e),this._callbacks={},this._methods={},this._closedCallbacks=[],this._reconnectingCallbacks=[],this._reconnectedCallbacks=[],this._invocationId=0,this._receivedHandshakeResponse=!1,this._connectionState=Ge.Disconnected,this._connectionStarted=!1,this._cachedPingMessage=this._protocol.writeMessage({type:Ye.Ping})}static create(e,t,n,r){return new kt(e,t,n,r)}get state(){return this._connectionState}get connectionId(){return this.connection&&this.connection.connectionId||null}get baseUrl(){return this.connection.baseUrl||""}set baseUrl(e){if(this._connectionState!==Ge.Disconnected&&this._connectionState!==Ge.Reconnecting)throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url.");if(!e)throw new Error("The HubConnection url must be a valid url.");this.connection.baseUrl=e}start(){return this._startPromise=this._startWithStateTransitions(),this._startPromise}async _startWithStateTransitions(){if(this._connectionState!==Ge.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this._connectionState=Ge.Connecting,this._logger.log(Ve.Debug,"Starting HubConnection.");try{await this._startInternal(),et.isBrowser&&window.document.addEventListener("freeze",this._freezeEventListener),this._connectionState=Ge.Connected,this._connectionStarted=!0,this._logger.log(Ve.Debug,"HubConnection connected successfully.")}catch(e){return this._connectionState=Ge.Disconnected,this._logger.log(Ve.Debug,`HubConnection failed to start successfully because of error '${e}'.`),Promise.reject(e)}}async _startInternal(){this._stopDuringStartError=void 0,this._receivedHandshakeResponse=!1;const e=new Promise(((e,t)=>{this._handshakeResolver=e,this._handshakeRejecter=t}));await this.connection.start(this._protocol.transferFormat);try{const t={protocol:this._protocol.name,version:this._protocol.version};if(this._logger.log(Ve.Debug,"Sending handshake request."),await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(t)),this._logger.log(Ve.Information,`Using HubProtocol '${this._protocol.name}'.`),this._cleanupTimeout(),this._resetTimeoutPeriod(),this._resetKeepAliveInterval(),await e,this._stopDuringStartError)throw this._stopDuringStartError}catch(e){throw this._logger.log(Ve.Debug,`Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`),this._cleanupTimeout(),this._cleanupPingTimer(),await this.connection.stop(e),e}}async stop(){const e=this._startPromise;this._stopPromise=this._stopInternal(),await this._stopPromise;try{await e}catch(e){}}_stopInternal(e){return this._connectionState===Ge.Disconnected?(this._logger.log(Ve.Debug,`Call to HubConnection.stop(${e}) ignored because it is already in the disconnected state.`),Promise.resolve()):this._connectionState===Ge.Disconnecting?(this._logger.log(Ve.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState=Ge.Disconnecting,this._logger.log(Ve.Debug,"Stopping HubConnection."),this._reconnectDelayHandle?(this._logger.log(Ve.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this._reconnectDelayHandle),this._reconnectDelayHandle=void 0,this._completeClose(),Promise.resolve()):(this._cleanupTimeout(),this._cleanupPingTimer(),this._stopDuringStartError=e||new Oe("The connection was stopped before the hub handshake could complete."),this.connection.stop(e)))}stream(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createStreamInvocation(e,t,r);let s;const i=new It;return i.cancelCallback=()=>{const e=this._createCancelInvocation(o.invocationId);return delete this._callbacks[o.invocationId],s.then((()=>this._sendWithProtocol(e)))},this._callbacks[o.invocationId]=(e,t)=>{t?i.error(t):e&&(e.type===Ye.Completion?e.error?i.error(new Error(e.error)):i.complete():i.next(e.item))},s=this._sendWithProtocol(o).catch((e=>{i.error(e),delete this._callbacks[o.invocationId]})),this._launchStreams(n,s),i}_sendMessage(e){return this._resetKeepAliveInterval(),this.connection.send(e)}_sendWithProtocol(e){return this._sendMessage(this._protocol.writeMessage(e))}send(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._sendWithProtocol(this._createInvocation(e,t,!0,r));return this._launchStreams(n,o),o}invoke(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createInvocation(e,t,!1,r);return new Promise(((e,t)=>{this._callbacks[o.invocationId]=(n,r)=>{r?t(r):n&&(n.type===Ye.Completion?n.error?t(new Error(n.error)):e(n.result):t(new Error(`Unexpected message type: ${n.type}`)))};const r=this._sendWithProtocol(o).catch((e=>{t(e),delete this._callbacks[o.invocationId]}));this._launchStreams(n,r)}))}on(e,t){e&&t&&(e=e.toLowerCase(),this._methods[e]||(this._methods[e]=[]),-1===this._methods[e].indexOf(t)&&this._methods[e].push(t))}off(e,t){if(!e)return;e=e.toLowerCase();const n=this._methods[e];if(n)if(t){const r=n.indexOf(t);-1!==r&&(n.splice(r,1),0===n.length&&delete this._methods[e])}else delete this._methods[e]}onclose(e){e&&this._closedCallbacks.push(e)}onreconnecting(e){e&&this._reconnectingCallbacks.push(e)}onreconnected(e){e&&this._reconnectedCallbacks.push(e)}_processIncomingData(e){if(this._cleanupTimeout(),this._receivedHandshakeResponse||(e=this._processHandshakeResponse(e),this._receivedHandshakeResponse=!0),e){const t=this._protocol.parseMessages(e,this._logger);for(const e of t)switch(e.type){case Ye.Invocation:this._invokeClientMethod(e);break;case Ye.StreamItem:case Ye.Completion:{const t=this._callbacks[e.invocationId];if(t){e.type===Ye.Completion&&delete this._callbacks[e.invocationId];try{t(e)}catch(e){this._logger.log(Ve.Error,`Stream callback threw error: ${ht(e)}`)}}break}case Ye.Ping:break;case Ye.Close:{this._logger.log(Ve.Information,"Close message received from server.");const t=e.error?new Error("Server returned an error on close: "+e.error):void 0;!0===e.allowReconnect?this.connection.stop(t):this._stopPromise=this._stopInternal(t);break}default:this._logger.log(Ve.Warning,`Invalid message type: ${e.type}.`)}}this._resetTimeoutPeriod()}_processHandshakeResponse(e){let t,n;try{[n,t]=this._handshakeProtocol.parseHandshakeResponse(e)}catch(e){const t="Error parsing handshake response: "+e;this._logger.log(Ve.Error,t);const n=new Error(t);throw this._handshakeRejecter(n),n}if(t.error){const e="Server returned handshake error: "+t.error;this._logger.log(Ve.Error,e);const n=new Error(e);throw this._handshakeRejecter(n),n}return this._logger.log(Ve.Debug,"Server handshake complete."),this._handshakeResolver(),n}_resetKeepAliveInterval(){this.connection.features.inherentKeepAlive||(this._nextKeepAlive=(new Date).getTime()+this.keepAliveIntervalInMilliseconds,this._cleanupPingTimer())}_resetTimeoutPeriod(){if(!(this.connection.features&&this.connection.features.inherentKeepAlive||(this._timeoutHandle=setTimeout((()=>this.serverTimeout()),this.serverTimeoutInMilliseconds),void 0!==this._pingServerHandle))){let e=this._nextKeepAlive-(new Date).getTime();e<0&&(e=0),this._pingServerHandle=setTimeout((async()=>{if(this._connectionState===Ge.Connected)try{await this._sendMessage(this._cachedPingMessage)}catch{this._cleanupPingTimer()}}),e)}}serverTimeout(){this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."))}_invokeClientMethod(e){const t=this._methods[e.target.toLowerCase()];if(t){const n=t.slice();try{n.forEach((t=>t.apply(this,e.arguments)))}catch(t){this._logger.log(Ve.Error,`A callback for the method ${e.target.toLowerCase()} threw error '${t}'.`)}if(e.invocationId){const e="Server requested a response, which is not supported in this version of the client.";this._logger.log(Ve.Error,e),this._stopPromise=this._stopInternal(new Error(e))}}else this._logger.log(Ve.Warning,`No client method with the name '${e.target}' found.`)}_connectionClosed(e){this._logger.log(Ve.Debug,`HubConnection.connectionClosed(${e}) called while in state ${this._connectionState}.`),this._stopDuringStartError=this._stopDuringStartError||e||new Oe("The underlying connection was closed before the hub handshake could complete."),this._handshakeResolver&&this._handshakeResolver(),this._cancelCallbacksWithError(e||new Error("Invocation canceled due to the underlying connection being closed.")),this._cleanupTimeout(),this._cleanupPingTimer(),this._connectionState===Ge.Disconnecting?this._completeClose(e):this._connectionState===Ge.Connected&&this._reconnectPolicy?this._reconnect(e):this._connectionState===Ge.Connected&&this._completeClose(e)}_completeClose(e){if(this._connectionStarted){this._connectionState=Ge.Disconnected,this._connectionStarted=!1,et.isBrowser&&window.document.removeEventListener("freeze",this._freezeEventListener);try{this._closedCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(Ve.Error,`An onclose callback called with error '${e}' threw error '${t}'.`)}}}async _reconnect(e){const t=Date.now();let n=0,r=void 0!==e?e:new Error("Attempting to reconnect due to a unknown error."),o=this._getNextRetryDelay(n++,0,r);if(null===o)return this._logger.log(Ve.Debug,"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."),void this._completeClose(e);if(this._connectionState=Ge.Reconnecting,e?this._logger.log(Ve.Information,`Connection reconnecting because of error '${e}'.`):this._logger.log(Ve.Information,"Connection reconnecting."),0!==this._reconnectingCallbacks.length){try{this._reconnectingCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(Ve.Error,`An onreconnecting callback called with error '${e}' threw error '${t}'.`)}if(this._connectionState!==Ge.Reconnecting)return void this._logger.log(Ve.Debug,"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.")}for(;null!==o;){if(this._logger.log(Ve.Information,`Reconnect attempt number ${n} will start in ${o} ms.`),await new Promise((e=>{this._reconnectDelayHandle=setTimeout(e,o)})),this._reconnectDelayHandle=void 0,this._connectionState!==Ge.Reconnecting)return void this._logger.log(Ve.Debug,"Connection left the reconnecting state during reconnect delay. Done reconnecting.");try{if(await this._startInternal(),this._connectionState=Ge.Connected,this._logger.log(Ve.Information,"HubConnection reconnected successfully."),0!==this._reconnectedCallbacks.length)try{this._reconnectedCallbacks.forEach((e=>e.apply(this,[this.connection.connectionId])))}catch(e){this._logger.log(Ve.Error,`An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`)}return}catch(e){if(this._logger.log(Ve.Information,`Reconnect attempt failed because of error '${e}'.`),this._connectionState!==Ge.Reconnecting)return this._logger.log(Ve.Debug,`Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`),void(this._connectionState===Ge.Disconnecting&&this._completeClose());r=e instanceof Error?e:new Error(e.toString()),o=this._getNextRetryDelay(n++,Date.now()-t,r)}}this._logger.log(Ve.Information,`Reconnect retries have been exhausted after ${Date.now()-t} ms and ${n} failed attempts. Connection disconnecting.`),this._completeClose()}_getNextRetryDelay(e,t,n){try{return this._reconnectPolicy.nextRetryDelayInMilliseconds({elapsedMilliseconds:t,previousRetryCount:e,retryReason:n})}catch(n){return this._logger.log(Ve.Error,`IRetryPolicy.nextRetryDelayInMilliseconds(${e}, ${t}) threw error '${n}'.`),null}}_cancelCallbacksWithError(e){const t=this._callbacks;this._callbacks={},Object.keys(t).forEach((n=>{const r=t[n];try{r(null,e)}catch(t){this._logger.log(Ve.Error,`Stream 'error' callback called with '${e}' threw error: ${ht(t)}`)}}))}_cleanupPingTimer(){this._pingServerHandle&&(clearTimeout(this._pingServerHandle),this._pingServerHandle=void 0)}_cleanupTimeout(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}_createInvocation(e,t,n,r){if(n)return 0!==r.length?{arguments:t,streamIds:r,target:e,type:Ye.Invocation}:{arguments:t,target:e,type:Ye.Invocation};{const n=this._invocationId;return this._invocationId++,0!==r.length?{arguments:t,invocationId:n.toString(),streamIds:r,target:e,type:Ye.Invocation}:{arguments:t,invocationId:n.toString(),target:e,type:Ye.Invocation}}}_launchStreams(e,t){if(0!==e.length){t||(t=Promise.resolve());for(const n in e)e[n].subscribe({complete:()=>{t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n))))},error:e=>{let r;r=e instanceof Error?e.message:e&&e.toString?e.toString():"Unknown error",t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n,r))))},next:e=>{t=t.then((()=>this._sendWithProtocol(this._createStreamItemMessage(n,e))))}})}}_replaceStreamingParams(e){const t=[],n=[];for(let r=0;r<e.length;r++){const o=e[r];if(this._isObservable(o)){const s=this._invocationId;this._invocationId++,t[s]=o,n.push(s.toString()),e.splice(r,1)}}return[t,n]}_isObservable(e){return e&&e.subscribe&&"function"==typeof e.subscribe}_createStreamInvocation(e,t,n){const r=this._invocationId;return this._invocationId++,0!==n.length?{arguments:t,invocationId:r.toString(),streamIds:n,target:e,type:Ye.StreamInvocation}:{arguments:t,invocationId:r.toString(),target:e,type:Ye.StreamInvocation}}_createCancelInvocation(e){return{invocationId:e,type:Ye.CancelInvocation}}_createStreamItemMessage(e,t){return{invocationId:e,item:t,type:Ye.StreamItem}}_createCompletionMessage(e,t,n){return t?{error:t,invocationId:e,type:Ye.Completion}:{invocationId:e,result:n,type:Ye.Completion}}}class Tt{constructor(){this.name="json",this.version=1,this.transferFormat=Xe.Text}parseMessages(e,t){if("string"!=typeof e)throw new Error("Invalid input for JSON hub protocol. Expected a string.");if(!e)return[];null===t&&(t=Qe.instance);const n=St.parse(e),r=[];for(const e of n){const n=JSON.parse(e);if("number"!=typeof n.type)throw new Error("Invalid payload.");switch(n.type){case Ye.Invocation:this._isInvocationMessage(n);break;case Ye.StreamItem:this._isStreamItemMessage(n);break;case Ye.Completion:this._isCompletionMessage(n);break;case Ye.Ping:case Ye.Close:break;default:t.log(Ve.Information,"Unknown message type '"+n.type+"' ignored.");continue}r.push(n)}return r}writeMessage(e){return St.write(JSON.stringify(e))}_isInvocationMessage(e){this._assertNotEmptyString(e.target,"Invalid payload for Invocation message."),void 0!==e.invocationId&&this._assertNotEmptyString(e.invocationId,"Invalid payload for Invocation message.")}_isStreamItemMessage(e){if(this._assertNotEmptyString(e.invocationId,"Invalid payload for StreamItem message."),void 0===e.item)throw new Error("Invalid payload for StreamItem message.")}_isCompletionMessage(e){if(e.result&&e.error)throw new Error("Invalid payload for Completion message.");!e.result&&e.error&&this._assertNotEmptyString(e.error,"Invalid payload for Completion message."),this._assertNotEmptyString(e.invocationId,"Invalid payload for Completion message.")}_assertNotEmptyString(e,t){if("string"!=typeof e||""===e)throw new Error(t)}}const xt={trace:Ve.Trace,debug:Ve.Debug,info:Ve.Information,information:Ve.Information,warn:Ve.Warning,warning:Ve.Warning,error:Ve.Error,critical:Ve.Critical,none:Ve.None};class Dt{configureLogging(e){if(Ze.isRequired(e,"logging"),void 0!==e.log)this.logger=e;else if("string"==typeof e){const t=function(e){const t=xt[e.toLowerCase()];if(void 0!==t)return t;throw new Error(`Unknown log level: ${e}`)}(e);this.logger=new st(t)}else this.logger=new st(e);return this}withUrl(e,t){return Ze.isRequired(e,"url"),Ze.isNotEmpty(e,"url"),this.url=e,this.httpConnectionOptions="object"==typeof t?{...this.httpConnectionOptions,...t}:{...this.httpConnectionOptions,transport:t},this}withHubProtocol(e){return Ze.isRequired(e,"protocol"),this.protocol=e,this}withAutomaticReconnect(e){if(this.reconnectPolicy)throw new Error("A reconnectPolicy has already been set.");return e?Array.isArray(e)?this.reconnectPolicy=new Be(e):this.reconnectPolicy=e:this.reconnectPolicy=new Be,this}build(){const e=this.httpConnectionOptions||{};if(void 0===e.logger&&(e.logger=this.logger),!this.url)throw new Error("The 'HubConnectionBuilder.withUrl' method must be called before building the connection.");const t=new vt(this.url,e);return kt.create(t,this.logger||Qe.instance,this.protocol||new Tt,this.reconnectPolicy)}}var Rt=4294967295;function Pt(e,t,n){var r=Math.floor(n/4294967296),o=n;e.setUint32(t,r),e.setUint32(t+4,o)}function Ut(e,t){return 4294967296*e.getInt32(t)+e.getUint32(t+4)}var At=("undefined"==typeof process||"never"!==process.env.TEXT_ENCODING)&&"undefined"!=typeof TextEncoder&&"undefined"!=typeof TextDecoder;function Nt(e){for(var t=e.length,n=0,r=0;r<t;){var o=e.charCodeAt(r++);if(0!=(4294967168&o))if(0==(4294965248&o))n+=2;else{if(o>=55296&&o<=56319&&r<t){var s=e.charCodeAt(r);56320==(64512&s)&&(++r,o=((1023&o)<<10)+(1023&s)+65536)}n+=0==(4294901760&o)?3:4}else n++}return n}var $t=At?new TextEncoder:void 0,Bt=At?"undefined"!=typeof process&&"force"!==process.env.TEXT_ENCODING?200:0:Rt,Lt=(null==$t?void 0:$t.encodeInto)?function(e,t,n){$t.encodeInto(e,t.subarray(n))}:function(e,t,n){t.set($t.encode(e),n)};function Mt(e,t,n){for(var r=t,o=r+n,s=[],i="";r<o;){var a=e[r++];if(0==(128&a))s.push(a);else if(192==(224&a)){var c=63&e[r++];s.push((31&a)<<6|c)}else if(224==(240&a)){c=63&e[r++];var l=63&e[r++];s.push((31&a)<<12|c<<6|l)}else if(240==(248&a)){var h=(7&a)<<18|(c=63&e[r++])<<12|(l=63&e[r++])<<6|63&e[r++];h>65535&&(h-=65536,s.push(h>>>10&1023|55296),h=56320|1023&h),s.push(h)}else s.push(a);s.length>=4096&&(i+=String.fromCharCode.apply(String,s),s.length=0)}return s.length>0&&(i+=String.fromCharCode.apply(String,s)),i}var Ot,Ft=At?new TextDecoder:null,jt=At?"undefined"!=typeof process&&"force"!==process.env.TEXT_DECODER?200:0:Rt,Ht=function(e,t){this.type=e,this.data=t},Wt=(Ot=function(e,t){return Ot=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Ot(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Ot(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),zt=function(e){function t(n){var r=e.call(this,n)||this,o=Object.create(t.prototype);return Object.setPrototypeOf(r,o),Object.defineProperty(r,"name",{configurable:!0,enumerable:!1,value:t.name}),r}return Wt(t,e),t}(Error),Jt={type:-1,encode:function(e){var t,n,r,o;return e instanceof Date?function(e){var t,n=e.sec,r=e.nsec;if(n>=0&&r>=0&&n<=17179869183){if(0===r&&n<=4294967295){var o=new Uint8Array(4);return(t=new DataView(o.buffer)).setUint32(0,n),o}var s=n/4294967296,i=4294967295&n;return o=new Uint8Array(8),(t=new DataView(o.buffer)).setUint32(0,r<<2|3&s),t.setUint32(4,i),o}return o=new Uint8Array(12),(t=new DataView(o.buffer)).setUint32(0,r),Pt(t,4,n),o}((r=1e6*((t=e.getTime())-1e3*(n=Math.floor(t/1e3))),{sec:n+(o=Math.floor(r/1e9)),nsec:r-1e9*o})):null},decode:function(e){var t=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:var n=t.getUint32(0);return{sec:4294967296*(3&n)+t.getUint32(4),nsec:n>>>2};case 12:return{sec:Ut(t,4),nsec:t.getUint32(0)};default:throw new zt("Unrecognized data size for timestamp (expected 4, 8, or 12): "+e.length)}}(e);return new Date(1e3*t.sec+t.nsec/1e6)}},qt=function(){function e(){this.builtInEncoders=[],this.builtInDecoders=[],this.encoders=[],this.decoders=[],this.register(Jt)}return e.prototype.register=function(e){var t=e.type,n=e.encode,r=e.decode;if(t>=0)this.encoders[t]=n,this.decoders[t]=r;else{var o=1+t;this.builtInEncoders[o]=n,this.builtInDecoders[o]=r}},e.prototype.tryToEncode=function(e,t){for(var n=0;n<this.builtInEncoders.length;n++)if(null!=(r=this.builtInEncoders[n])&&null!=(o=r(e,t)))return new Ht(-1-n,o);for(n=0;n<this.encoders.length;n++){var r,o;if(null!=(r=this.encoders[n])&&null!=(o=r(e,t)))return new Ht(n,o)}return e instanceof Ht?e:null},e.prototype.decode=function(e,t,n){var r=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return r?r(e,t,n):new Ht(t,e)},e.defaultCodec=new e,e}();function Vt(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer?new Uint8Array(e):Uint8Array.from(e)}var Kt=function(){function e(e,t,n,r,o,s,i,a){void 0===e&&(e=qt.defaultCodec),void 0===t&&(t=void 0),void 0===n&&(n=100),void 0===r&&(r=2048),void 0===o&&(o=!1),void 0===s&&(s=!1),void 0===i&&(i=!1),void 0===a&&(a=!1),this.extensionCodec=e,this.context=t,this.maxDepth=n,this.initialBufferSize=r,this.sortKeys=o,this.forceFloat32=s,this.ignoreUndefined=i,this.forceIntegerToFloat=a,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}return e.prototype.getUint8Array=function(){return this.bytes.subarray(0,this.pos)},e.prototype.reinitializeState=function(){this.pos=0},e.prototype.encode=function(e){return this.reinitializeState(),this.doEncode(e,1),this.getUint8Array()},e.prototype.doEncode=function(e,t){if(t>this.maxDepth)throw new Error("Too deep objects in depth "+t);null==e?this.encodeNil():"boolean"==typeof e?this.encodeBoolean(e):"number"==typeof e?this.encodeNumber(e):"string"==typeof e?this.encodeString(e):this.encodeObject(e,t)},e.prototype.ensureBufferSizeToWrite=function(e){var t=this.pos+e;this.view.byteLength<t&&this.resizeBuffer(2*t)},e.prototype.resizeBuffer=function(e){var t=new ArrayBuffer(e),n=new Uint8Array(t),r=new DataView(t);n.set(this.bytes),this.view=r,this.bytes=n},e.prototype.encodeNil=function(){this.writeU8(192)},e.prototype.encodeBoolean=function(e){!1===e?this.writeU8(194):this.writeU8(195)},e.prototype.encodeNumber=function(e){Number.isSafeInteger(e)&&!this.forceIntegerToFloat?e>=0?e<128?this.writeU8(e):e<256?(this.writeU8(204),this.writeU8(e)):e<65536?(this.writeU8(205),this.writeU16(e)):e<4294967296?(this.writeU8(206),this.writeU32(e)):(this.writeU8(207),this.writeU64(e)):e>=-32?this.writeU8(224|e+32):e>=-128?(this.writeU8(208),this.writeI8(e)):e>=-32768?(this.writeU8(209),this.writeI16(e)):e>=-2147483648?(this.writeU8(210),this.writeI32(e)):(this.writeU8(211),this.writeI64(e)):this.forceFloat32?(this.writeU8(202),this.writeF32(e)):(this.writeU8(203),this.writeF64(e))},e.prototype.writeStringHeader=function(e){if(e<32)this.writeU8(160+e);else if(e<256)this.writeU8(217),this.writeU8(e);else if(e<65536)this.writeU8(218),this.writeU16(e);else{if(!(e<4294967296))throw new Error("Too long string: "+e+" bytes in UTF-8");this.writeU8(219),this.writeU32(e)}},e.prototype.encodeString=function(e){if(e.length>Bt){var t=Nt(e);this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),Lt(e,this.bytes,this.pos),this.pos+=t}else t=Nt(e),this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),function(e,t,n){for(var r=e.length,o=n,s=0;s<r;){var i=e.charCodeAt(s++);if(0!=(4294967168&i)){if(0==(4294965248&i))t[o++]=i>>6&31|192;else{if(i>=55296&&i<=56319&&s<r){var a=e.charCodeAt(s);56320==(64512&a)&&(++s,i=((1023&i)<<10)+(1023&a)+65536)}0==(4294901760&i)?(t[o++]=i>>12&15|224,t[o++]=i>>6&63|128):(t[o++]=i>>18&7|240,t[o++]=i>>12&63|128,t[o++]=i>>6&63|128)}t[o++]=63&i|128}else t[o++]=i}}(e,this.bytes,this.pos),this.pos+=t},e.prototype.encodeObject=function(e,t){var n=this.extensionCodec.tryToEncode(e,this.context);if(null!=n)this.encodeExtension(n);else if(Array.isArray(e))this.encodeArray(e,t);else if(ArrayBuffer.isView(e))this.encodeBinary(e);else{if("object"!=typeof e)throw new Error("Unrecognized object: "+Object.prototype.toString.apply(e));this.encodeMap(e,t)}},e.prototype.encodeBinary=function(e){var t=e.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else{if(!(t<4294967296))throw new Error("Too large binary: "+t);this.writeU8(198),this.writeU32(t)}var n=Vt(e);this.writeU8a(n)},e.prototype.encodeArray=function(e,t){var n=e.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else{if(!(n<4294967296))throw new Error("Too large array: "+n);this.writeU8(221),this.writeU32(n)}for(var r=0,o=e;r<o.length;r++){var s=o[r];this.doEncode(s,t+1)}},e.prototype.countWithoutUndefined=function(e,t){for(var n=0,r=0,o=t;r<o.length;r++)void 0!==e[o[r]]&&n++;return n},e.prototype.encodeMap=function(e,t){var n=Object.keys(e);this.sortKeys&&n.sort();var r=this.ignoreUndefined?this.countWithoutUndefined(e,n):n.length;if(r<16)this.writeU8(128+r);else if(r<65536)this.writeU8(222),this.writeU16(r);else{if(!(r<4294967296))throw new Error("Too large map object: "+r);this.writeU8(223),this.writeU32(r)}for(var o=0,s=n;o<s.length;o++){var i=s[o],a=e[i];this.ignoreUndefined&&void 0===a||(this.encodeString(i),this.doEncode(a,t+1))}},e.prototype.encodeExtension=function(e){var t=e.data.length;if(1===t)this.writeU8(212);else if(2===t)this.writeU8(213);else if(4===t)this.writeU8(214);else if(8===t)this.writeU8(215);else if(16===t)this.writeU8(216);else if(t<256)this.writeU8(199),this.writeU8(t);else if(t<65536)this.writeU8(200),this.writeU16(t);else{if(!(t<4294967296))throw new Error("Too large extension object: "+t);this.writeU8(201),this.writeU32(t)}this.writeI8(e.type),this.writeU8a(e.data)},e.prototype.writeU8=function(e){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,e),this.pos++},e.prototype.writeU8a=function(e){var t=e.length;this.ensureBufferSizeToWrite(t),this.bytes.set(e,this.pos),this.pos+=t},e.prototype.writeI8=function(e){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,e),this.pos++},e.prototype.writeU16=function(e){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,e),this.pos+=2},e.prototype.writeI16=function(e){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,e),this.pos+=2},e.prototype.writeU32=function(e){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,e),this.pos+=4},e.prototype.writeI32=function(e){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,e),this.pos+=4},e.prototype.writeF32=function(e){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,e),this.pos+=4},e.prototype.writeF64=function(e){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,e),this.pos+=8},e.prototype.writeU64=function(e){this.ensureBufferSizeToWrite(8),function(e,t,n){var r=n/4294967296,o=n;e.setUint32(t,r),e.setUint32(t+4,o)}(this.view,this.pos,e),this.pos+=8},e.prototype.writeI64=function(e){this.ensureBufferSizeToWrite(8),Pt(this.view,this.pos,e),this.pos+=8},e}();function Xt(e){return(e<0?"-":"")+"0x"+Math.abs(e).toString(16).padStart(2,"0")}var Yt=function(){function e(e,t){void 0===e&&(e=16),void 0===t&&(t=16),this.maxKeyLength=e,this.maxLengthPerKey=t,this.hit=0,this.miss=0,this.caches=[];for(var n=0;n<this.maxKeyLength;n++)this.caches.push([])}return e.prototype.canBeCached=function(e){return e>0&&e<=this.maxKeyLength},e.prototype.find=function(e,t,n){e:for(var r=0,o=this.caches[n-1];r<o.length;r++){for(var s=o[r],i=s.bytes,a=0;a<n;a++)if(i[a]!==e[t+a])continue e;return s.str}return null},e.prototype.store=function(e,t){var n=this.caches[e.length-1],r={bytes:e,str:t};n.length>=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)},e.prototype.decode=function(e,t,n){var r=this.find(e,t,n);if(null!=r)return this.hit++,r;this.miss++;var o=Mt(e,t,n),s=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(s,o),o},e}(),Gt=function(e,t){var n,r,o,s,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return s={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(s){return function(a){return function(s){if(n)throw new TypeError("Generator is already executing.");for(;i;)try{if(n=1,r&&(o=2&s[0]?r.return:s[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,s[1])).done)return o;switch(r=0,o&&(s=[2&s[0],o.value]),s[0]){case 0:case 1:o=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,r=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==s[0]&&2!==s[0])){i=0;continue}if(3===s[0]&&(!o||s[1]>o[0]&&s[1]<o[3])){i.label=s[1];break}if(6===s[0]&&i.label<o[1]){i.label=o[1],o=s;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(s);break}o[2]&&i.ops.pop(),i.trys.pop();continue}s=t.call(e,i)}catch(e){s=[6,e],r=0}finally{n=o=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,a])}}},Qt=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){!function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)}(r,o,(t=e[n](t)).done,t.value)}))}}},Zt=function(e){return this instanceof Zt?(this.v=e,this):new Zt(e)},en=function(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(e,t||[]),s=[];return r={},i("next"),i("throw"),i("return"),r[Symbol.asyncIterator]=function(){return this},r;function i(e){o[e]&&(r[e]=function(t){return new Promise((function(n,r){s.push([e,t,n,r])>1||a(e,t)}))})}function a(e,t){try{(n=o[e](t)).value instanceof Zt?Promise.resolve(n.value.v).then(c,l):h(s[0][2],n)}catch(e){h(s[0][3],e)}var n}function c(e){a("next",e)}function l(e){a("throw",e)}function h(e,t){e(t),s.shift(),s.length&&a(s[0][0],s[0][1])}},tn=new DataView(new ArrayBuffer(0)),nn=new Uint8Array(tn.buffer),rn=function(){try{tn.getInt8(0)}catch(e){return e.constructor}throw new Error("never reached")}(),on=new rn("Insufficient data"),sn=new Yt,an=function(){function e(e,t,n,r,o,s,i,a){void 0===e&&(e=qt.defaultCodec),void 0===t&&(t=void 0),void 0===n&&(n=Rt),void 0===r&&(r=Rt),void 0===o&&(o=Rt),void 0===s&&(s=Rt),void 0===i&&(i=Rt),void 0===a&&(a=sn),this.extensionCodec=e,this.context=t,this.maxStrLength=n,this.maxBinLength=r,this.maxArrayLength=o,this.maxMapLength=s,this.maxExtLength=i,this.keyDecoder=a,this.totalPos=0,this.pos=0,this.view=tn,this.bytes=nn,this.headByte=-1,this.stack=[]}return e.prototype.reinitializeState=function(){this.totalPos=0,this.headByte=-1,this.stack.length=0},e.prototype.setBuffer=function(e){this.bytes=Vt(e),this.view=function(e){if(e instanceof ArrayBuffer)return new DataView(e);var t=Vt(e);return new DataView(t.buffer,t.byteOffset,t.byteLength)}(this.bytes),this.pos=0},e.prototype.appendBuffer=function(e){if(-1!==this.headByte||this.hasRemaining(1)){var t=this.bytes.subarray(this.pos),n=Vt(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}else this.setBuffer(e)},e.prototype.hasRemaining=function(e){return this.view.byteLength-this.pos>=e},e.prototype.createExtraByteError=function(e){var t=this.view,n=this.pos;return new RangeError("Extra "+(t.byteLength-n)+" of "+t.byteLength+" byte(s) found at buffer["+e+"]")},e.prototype.decode=function(e){this.reinitializeState(),this.setBuffer(e);var t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t},e.prototype.decodeMulti=function(e){return Gt(this,(function(t){switch(t.label){case 0:this.reinitializeState(),this.setBuffer(e),t.label=1;case 1:return this.hasRemaining(1)?[4,this.doDecodeSync()]:[3,3];case 2:return t.sent(),[3,1];case 3:return[2]}}))},e.prototype.decodeAsync=function(e){var t,n,r,o,s,i,a;return s=this,void 0,a=function(){var s,i,a,c,l,h,u,d;return Gt(this,(function(p){switch(p.label){case 0:s=!1,p.label=1;case 1:p.trys.push([1,6,7,12]),t=Qt(e),p.label=2;case 2:return[4,t.next()];case 3:if((n=p.sent()).done)return[3,5];if(a=n.value,s)throw this.createExtraByteError(this.totalPos);this.appendBuffer(a);try{i=this.doDecodeSync(),s=!0}catch(e){if(!(e instanceof rn))throw e}this.totalPos+=this.pos,p.label=4;case 4:return[3,2];case 5:return[3,12];case 6:return c=p.sent(),r={error:c},[3,12];case 7:return p.trys.push([7,,10,11]),n&&!n.done&&(o=t.return)?[4,o.call(t)]:[3,9];case 8:p.sent(),p.label=9;case 9:return[3,11];case 10:if(r)throw r.error;return[7];case 11:return[7];case 12:if(s){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return[2,i]}throw h=(l=this).headByte,u=l.pos,d=l.totalPos,new RangeError("Insufficient data in parsing "+Xt(h)+" at "+d+" ("+u+" in the current buffer)")}}))},new((i=void 0)||(i=Promise))((function(e,t){function n(e){try{o(a.next(e))}catch(e){t(e)}}function r(e){try{o(a.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof i?o:new i((function(e){e(o)}))).then(n,r)}o((a=a.apply(s,[])).next())}))},e.prototype.decodeArrayStream=function(e){return this.decodeMultiAsync(e,!0)},e.prototype.decodeStream=function(e){return this.decodeMultiAsync(e,!1)},e.prototype.decodeMultiAsync=function(e,t){return en(this,arguments,(function(){var n,r,o,s,i,a,c,l,h;return Gt(this,(function(u){switch(u.label){case 0:n=t,r=-1,u.label=1;case 1:u.trys.push([1,13,14,19]),o=Qt(e),u.label=2;case 2:return[4,Zt(o.next())];case 3:if((s=u.sent()).done)return[3,12];if(i=s.value,t&&0===r)throw this.createExtraByteError(this.totalPos);this.appendBuffer(i),n&&(r=this.readArraySize(),n=!1,this.complete()),u.label=4;case 4:u.trys.push([4,9,,10]),u.label=5;case 5:return[4,Zt(this.doDecodeSync())];case 6:return[4,u.sent()];case 7:return u.sent(),0==--r?[3,8]:[3,5];case 8:return[3,10];case 9:if(!((a=u.sent())instanceof rn))throw a;return[3,10];case 10:this.totalPos+=this.pos,u.label=11;case 11:return[3,2];case 12:return[3,19];case 13:return c=u.sent(),l={error:c},[3,19];case 14:return u.trys.push([14,,17,18]),s&&!s.done&&(h=o.return)?[4,Zt(h.call(o))]:[3,16];case 15:u.sent(),u.label=16;case 16:return[3,18];case 17:if(l)throw l.error;return[7];case 18:return[7];case 19:return[2]}}))}))},e.prototype.doDecodeSync=function(){e:for(;;){var e=this.readHeadByte(),t=void 0;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){if(0!=(r=e-128)){this.pushMapState(r),this.complete();continue e}t={}}else if(e<160){if(0!=(r=e-144)){this.pushArrayState(r),this.complete();continue e}t=[]}else{var n=e-160;t=this.decodeUtf8String(n,0)}else if(192===e)t=null;else if(194===e)t=!1;else if(195===e)t=!0;else if(202===e)t=this.readF32();else if(203===e)t=this.readF64();else if(204===e)t=this.readU8();else if(205===e)t=this.readU16();else if(206===e)t=this.readU32();else if(207===e)t=this.readU64();else if(208===e)t=this.readI8();else if(209===e)t=this.readI16();else if(210===e)t=this.readI32();else if(211===e)t=this.readI64();else if(217===e)n=this.lookU8(),t=this.decodeUtf8String(n,1);else if(218===e)n=this.lookU16(),t=this.decodeUtf8String(n,2);else if(219===e)n=this.lookU32(),t=this.decodeUtf8String(n,4);else if(220===e){if(0!==(r=this.readU16())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(221===e){if(0!==(r=this.readU32())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(222===e){if(0!==(r=this.readU16())){this.pushMapState(r),this.complete();continue e}t={}}else if(223===e){if(0!==(r=this.readU32())){this.pushMapState(r),this.complete();continue e}t={}}else if(196===e){var r=this.lookU8();t=this.decodeBinary(r,1)}else if(197===e)r=this.lookU16(),t=this.decodeBinary(r,2);else if(198===e)r=this.lookU32(),t=this.decodeBinary(r,4);else if(212===e)t=this.decodeExtension(1,0);else if(213===e)t=this.decodeExtension(2,0);else if(214===e)t=this.decodeExtension(4,0);else if(215===e)t=this.decodeExtension(8,0);else if(216===e)t=this.decodeExtension(16,0);else if(199===e)r=this.lookU8(),t=this.decodeExtension(r,1);else if(200===e)r=this.lookU16(),t=this.decodeExtension(r,2);else{if(201!==e)throw new zt("Unrecognized type byte: "+Xt(e));r=this.lookU32(),t=this.decodeExtension(r,4)}this.complete();for(var o=this.stack;o.length>0;){var s=o[o.length-1];if(0===s.type){if(s.array[s.position]=t,s.position++,s.position!==s.size)continue e;o.pop(),t=s.array}else{if(1===s.type){if("string"!=(i=typeof t)&&"number"!==i)throw new zt("The type of key must be string or number but "+typeof t);if("__proto__"===t)throw new zt("The key __proto__ is not allowed");s.key=t,s.type=2;continue e}if(s.map[s.key]=t,s.readCount++,s.readCount!==s.size){s.key=null,s.type=1;continue e}o.pop(),t=s.map}}return t}var i},e.prototype.readHeadByte=function(){return-1===this.headByte&&(this.headByte=this.readU8()),this.headByte},e.prototype.complete=function(){this.headByte=-1},e.prototype.readArraySize=function(){var e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new zt("Unrecognized array type byte: "+Xt(e))}},e.prototype.pushMapState=function(e){if(e>this.maxMapLength)throw new zt("Max length exceeded: map length ("+e+") > maxMapLengthLength ("+this.maxMapLength+")");this.stack.push({type:1,size:e,key:null,readCount:0,map:{}})},e.prototype.pushArrayState=function(e){if(e>this.maxArrayLength)throw new zt("Max length exceeded: array length ("+e+") > maxArrayLength ("+this.maxArrayLength+")");this.stack.push({type:0,size:e,array:new Array(e),position:0})},e.prototype.decodeUtf8String=function(e,t){var n;if(e>this.maxStrLength)throw new zt("Max length exceeded: UTF-8 byte length ("+e+") > maxStrLength ("+this.maxStrLength+")");if(this.bytes.byteLength<this.pos+t+e)throw on;var r,o=this.pos+t;return r=this.stateIsMapKey()&&(null===(n=this.keyDecoder)||void 0===n?void 0:n.canBeCached(e))?this.keyDecoder.decode(this.bytes,o,e):e>jt?function(e,t,n){var r=e.subarray(t,t+n);return Ft.decode(r)}(this.bytes,o,e):Mt(this.bytes,o,e),this.pos+=t+e,r},e.prototype.stateIsMapKey=function(){return this.stack.length>0&&1===this.stack[this.stack.length-1].type},e.prototype.decodeBinary=function(e,t){if(e>this.maxBinLength)throw new zt("Max length exceeded: bin length ("+e+") > maxBinLength ("+this.maxBinLength+")");if(!this.hasRemaining(e+t))throw on;var n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r},e.prototype.decodeExtension=function(e,t){if(e>this.maxExtLength)throw new zt("Max length exceeded: ext length ("+e+") > maxExtLength ("+this.maxExtLength+")");var n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)},e.prototype.lookU8=function(){return this.view.getUint8(this.pos)},e.prototype.lookU16=function(){return this.view.getUint16(this.pos)},e.prototype.lookU32=function(){return this.view.getUint32(this.pos)},e.prototype.readU8=function(){var e=this.view.getUint8(this.pos);return this.pos++,e},e.prototype.readI8=function(){var e=this.view.getInt8(this.pos);return this.pos++,e},e.prototype.readU16=function(){var e=this.view.getUint16(this.pos);return this.pos+=2,e},e.prototype.readI16=function(){var e=this.view.getInt16(this.pos);return this.pos+=2,e},e.prototype.readU32=function(){var e=this.view.getUint32(this.pos);return this.pos+=4,e},e.prototype.readI32=function(){var e=this.view.getInt32(this.pos);return this.pos+=4,e},e.prototype.readU64=function(){var e,t,n=(e=this.view,t=this.pos,4294967296*e.getUint32(t)+e.getUint32(t+4));return this.pos+=8,n},e.prototype.readI64=function(){var e=Ut(this.view,this.pos);return this.pos+=8,e},e.prototype.readF32=function(){var e=this.view.getFloat32(this.pos);return this.pos+=4,e},e.prototype.readF64=function(){var e=this.view.getFloat64(this.pos);return this.pos+=8,e},e}();class cn{static write(e){let t=e.byteLength||e.length;const n=[];do{let e=127&t;t>>=7,t>0&&(e|=128),n.push(e)}while(t>0);t=e.byteLength||e.length;const r=new Uint8Array(n.length+t);return r.set(n,0),r.set(e,n.length),r.buffer}static parse(e){const t=[],n=new Uint8Array(e),r=[0,7,14,21,28];for(let o=0;o<e.byteLength;){let s,i=0,a=0;do{s=n[o+i],a|=(127&s)<<r[i],i++}while(i<Math.min(5,e.byteLength-o)&&0!=(128&s));if(0!=(128&s)&&i<5)throw new Error("Cannot read message size.");if(5===i&&s>7)throw new Error("Messages bigger than 2GB are not supported.");if(!(n.byteLength>=o+i+a))throw new Error("Incomplete message.");t.push(n.slice?n.slice(o+i,o+i+a):n.subarray(o+i,o+i+a)),o=o+i+a}return t}}const ln=new Uint8Array([145,Ye.Ping]);class hn{constructor(e){this.name="messagepack",this.version=1,this.transferFormat=Xe.Binary,this._errorResult=1,this._voidResult=2,this._nonVoidResult=3,e=e||{},this._encoder=new Kt(e.extensionCodec,e.context,e.maxDepth,e.initialBufferSize,e.sortKeys,e.forceFloat32,e.ignoreUndefined,e.forceIntegerToFloat),this._decoder=new an(e.extensionCodec,e.context,e.maxStrLength,e.maxBinLength,e.maxArrayLength,e.maxMapLength,e.maxExtLength)}parseMessages(e,t){if(!(n=e)||"undefined"==typeof ArrayBuffer||!(n instanceof ArrayBuffer||n.constructor&&"ArrayBuffer"===n.constructor.name))throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer.");var n;null===t&&(t=Qe.instance);const r=cn.parse(e),o=[];for(const e of r){const n=this._parseMessage(e,t);n&&o.push(n)}return o}writeMessage(e){switch(e.type){case Ye.Invocation:return this._writeInvocation(e);case Ye.StreamInvocation:return this._writeStreamInvocation(e);case Ye.StreamItem:return this._writeStreamItem(e);case Ye.Completion:return this._writeCompletion(e);case Ye.Ping:return cn.write(ln);case Ye.CancelInvocation:return this._writeCancelInvocation(e);default:throw new Error("Invalid message type.")}}_parseMessage(e,t){if(0===e.length)throw new Error("Invalid payload.");const n=this._decoder.decode(e);if(0===n.length||!(n instanceof Array))throw new Error("Invalid payload.");const r=n[0];switch(r){case Ye.Invocation:return this._createInvocationMessage(this._readHeaders(n),n);case Ye.StreamItem:return this._createStreamItemMessage(this._readHeaders(n),n);case Ye.Completion:return this._createCompletionMessage(this._readHeaders(n),n);case Ye.Ping:return this._createPingMessage(n);case Ye.Close:return this._createCloseMessage(n);default:return t.log(Ve.Information,"Unknown message type '"+r+"' ignored."),null}}_createCloseMessage(e){if(e.length<2)throw new Error("Invalid payload for Close message.");return{allowReconnect:e.length>=3?e[2]:void 0,error:e[1],type:Ye.Close}}_createPingMessage(e){if(e.length<1)throw new Error("Invalid payload for Ping message.");return{type:Ye.Ping}}_createInvocationMessage(e,t){if(t.length<5)throw new Error("Invalid payload for Invocation message.");const n=t[2];return n?{arguments:t[4],headers:e,invocationId:n,streamIds:[],target:t[3],type:Ye.Invocation}:{arguments:t[4],headers:e,streamIds:[],target:t[3],type:Ye.Invocation}}_createStreamItemMessage(e,t){if(t.length<4)throw new Error("Invalid payload for StreamItem message.");return{headers:e,invocationId:t[2],item:t[3],type:Ye.StreamItem}}_createCompletionMessage(e,t){if(t.length<4)throw new Error("Invalid payload for Completion message.");const n=t[3];if(n!==this._voidResult&&t.length<5)throw new Error("Invalid payload for Completion message.");let r,o;switch(n){case this._errorResult:r=t[4];break;case this._nonVoidResult:o=t[4]}return{error:r,headers:e,invocationId:t[2],result:o,type:Ye.Completion}}_writeInvocation(e){let t;return t=e.streamIds?this._encoder.encode([Ye.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments,e.streamIds]):this._encoder.encode([Ye.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments]),cn.write(t.slice())}_writeStreamInvocation(e){let t;return t=e.streamIds?this._encoder.encode([Ye.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments,e.streamIds]):this._encoder.encode([Ye.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments]),cn.write(t.slice())}_writeStreamItem(e){const t=this._encoder.encode([Ye.StreamItem,e.headers||{},e.invocationId,e.item]);return cn.write(t.slice())}_writeCompletion(e){const t=e.error?this._errorResult:e.result?this._nonVoidResult:this._voidResult;let n;switch(t){case this._errorResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t,e.error]);break;case this._voidResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t]);break;case this._nonVoidResult:n=this._encoder.encode([Ye.Completion,e.headers||{},e.invocationId,t,e.result])}return cn.write(n.slice())}_writeCancelInvocation(e){const t=this._encoder.encode([Ye.CancelInvocation,e.headers||{},e.invocationId]);return cn.write(t.slice())}_readHeaders(e){const t=e[1];if("object"!=typeof t)throw new Error("Invalid headers.");return t}}let un=!1;function dn(){const e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),un||(un=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}const pn="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,fn=pn?pn.decode.bind(pn):function(e){let t=0;const n=e.length,r=[],o=[];for(;t<n;){const n=e[t++];if(0===n)break;if(0==(128&n))r.push(n);else if(192==(224&n)){const o=63&e[t++];r.push((31&n)<<6|o)}else if(224==(240&n)){const o=63&e[t++],s=63&e[t++];r.push((31&n)<<12|o<<6|s)}else if(240==(248&n)){let o=(7&n)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++];o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},gn=Math.pow(2,32),mn=Math.pow(2,21)-1;function yn(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function wn(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function bn(e,t){const n=wn(e,t+4);if(n>mn)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*gn+wn(e,t)}class vn{constructor(e){this.batchData=e;const t=new Cn(e);this.arrayRangeReader=new In(e),this.arrayBuilderSegmentReader=new kn(e),this.diffReader=new _n(e),this.editReader=new En(e,t),this.frameReader=new Sn(e,t)}updatedComponents(){return yn(this.batchData,this.batchData.length-20)}referenceFrames(){return yn(this.batchData,this.batchData.length-16)}disposedComponentIds(){return yn(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return yn(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return yn(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return yn(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return bn(this.batchData,n)}}class _n{constructor(e){this.batchDataUint8=e}componentId(e){return yn(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class En{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return yn(this.batchDataUint8,e)}siblingIndex(e){return yn(this.batchDataUint8,e+4)}newTreeIndex(e){return yn(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return yn(this.batchDataUint8,e+8)}removedAttributeName(e){const t=yn(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class Sn{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return yn(this.batchDataUint8,e)}subtreeLength(e){return yn(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return yn(this.batchDataUint8,e+8)}elementName(e){const t=yn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=yn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=yn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return bn(this.batchDataUint8,e+12)}}class Cn{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=yn(e,e.length-4)}readString(e){if(-1===e)return null;{const n=yn(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const s=e[t+o];if(n|=(127&s)<<r,s<128)break;r+=7}return n}(this.batchDataUint8,n),o=n+((t=r)<128?1:t<16384?2:t<2097152?3:4),s=new Uint8Array(this.batchDataUint8.buffer,this.batchDataUint8.byteOffset+o,r);return fn(s)}var t}}class In{constructor(e){this.batchDataUint8=e}count(e){return yn(this.batchDataUint8,e)}values(e){return e+4}}class kn{constructor(e){this.batchDataUint8=e}offset(e){return 0}count(e){return yn(this.batchDataUint8,e)}values(e){return e+4}}var Tn;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(Tn||(Tn={}));class xn{constructor(e,t){this.nextBatchId=2,this.browserRendererId=e,this.logger=t}static getOrCreate(e){return xn.instance||(xn.instance=new xn(0,e)),this.instance}async processBatch(e,t,n){if(e<this.nextBatchId)return await this.completeBatch(n,e),void this.logger.log(Tn.Debug,`Batch ${e} already processed. Waiting for batch ${this.nextBatchId}.`);if(e>this.nextBatchId)return this.fatalError?(this.logger.log(Tn.Debug,`Received a new batch ${e} but errored out on a previous batch ${this.nextBatchId-1}`),void await n.send("OnRenderCompleted",this.nextBatchId-1,this.fatalError.toString())):void this.logger.log(Tn.Debug,`Waiting for batch ${this.nextBatchId}. Batch ${e} not processed.`);try{this.nextBatchId++,this.logger.log(Tn.Debug,`Applying batch ${e}.`),function(e,t){const n=de[e];if(!n)throw new Error(`There is no browser renderer with ID ${e}.`);const r=t.arrayRangeReader,o=t.updatedComponents(),s=r.values(o),i=r.count(o),a=t.referenceFrames(),c=r.values(a),l=t.diffReader;for(let e=0;e<i;e++){const r=t.updatedComponentsEntry(s,e),o=l.componentId(r),i=l.edits(r);n.updateComponent(t,o,i,c)}const h=t.disposedComponentIds(),u=r.values(h),d=r.count(h);for(let e=0;e<d;e++){const r=t.disposedComponentIdsEntry(u,e);n.disposeComponent(r)}const p=t.disposedEventHandlerIds(),f=r.values(p),g=r.count(p);for(let e=0;e<g;e++){const r=t.disposedEventHandlerIdsEntry(f,e);n.disposeEventHandler(r)}pe&&(pe=!1,window.scrollTo&&window.scrollTo(0,0))}(this.browserRendererId,new vn(t)),await this.completeBatch(n,e)}catch(t){throw this.fatalError=t.toString(),this.logger.log(Tn.Error,`There was an error applying batch ${e}.`),n.send("OnRenderCompleted",e,t.toString()),t}}getLastBatchid(){return this.nextBatchId-1}async completeBatch(e,t){try{await e.send("OnRenderCompleted",t,null)}catch{this.logger.log(Tn.Warning,`Failed to deliver completion notification for render '${t}'.`)}}}class Dn{log(e,t){}}Dn.instance=new Dn;class Rn{constructor(e){this.minLevel=e}log(e,t){if(e>=this.minLevel){const n=`[${(new Date).toISOString()}] ${Tn[e]}: ${t}`;switch(e){case Tn.Critical:case Tn.Error:console.error(n);break;case Tn.Warning:console.warn(n);break;case Tn.Information:console.info(n);break;default:console.log(n)}}}}class Pn{constructor(e,t){this.circuitId=void 0,this.components=e,this.applicationState=t}reconnect(e){if(!this.circuitId)throw new Error("Circuit host not initialized.");return e.state!==Ge.Connected?Promise.resolve(!1):e.invoke("ConnectCircuit",this.circuitId)}initialize(e){if(this.circuitId)throw new Error(`Circuit host '${this.circuitId}' already initialized.`);this.circuitId=e}async startCircuit(e){if(e.state!==Ge.Connected)return!1;const t=await e.invoke("StartCircuit",ye.getBaseURI(),ye.getLocationHref(),JSON.stringify(this.components.map((e=>e.toRecord()))),this.applicationState||"");return!!t&&(this.initialize(t),!0)}resolveElement(e){const t=function(e){const t=f.get(e);if(t)return f.delete(e),t}(e);if(t)return M(t,!0);const n=Number.parseInt(e);if(!Number.isNaN(n))return function(e,t){if(!e.parentNode)throw new Error(`Comment not connected to the DOM ${e.textContent}`);const n=e.parentNode,r=M(n,!0),o=J(r);return Array.from(n.childNodes).forEach((e=>o.push(e))),e[B]=r,t&&(e[L]=t,M(t)),M(e)}(this.components[n].start,this.components[n].end);throw new Error(`Invalid sequence number or identifier '${e}'.`)}}const Un={configureSignalR:e=>{},logLevel:Tn.Warning,reconnectionOptions:{maxRetries:8,retryIntervalMilliseconds:2e4,dialogId:"components-reconnect-modal"}};class An{constructor(e,t,n,r){this.maxRetries=t,this.document=n,this.logger=r,this.addedToDom=!1,this.modal=this.document.createElement("div"),this.modal.id=e,this.maxRetries=t,this.modal.style.cssText=["position: fixed","top: 0","right: 0","bottom: 0","left: 0","z-index: 1050","display: none","overflow: hidden","background-color: #fff","opacity: 0.8","text-align: center","font-weight: bold","transition: visibility 0s linear 500ms"].join(";"),this.message=this.document.createElement("h5"),this.message.style.cssText="margin-top: 20px",this.button=this.document.createElement("button"),this.button.style.cssText="margin:5px auto 5px",this.button.textContent="Retry";const o=this.document.createElement("a");o.addEventListener("click",(()=>location.reload())),o.textContent="reload",this.reloadParagraph=this.document.createElement("p"),this.reloadParagraph.textContent="Alternatively, ",this.reloadParagraph.appendChild(o),this.modal.appendChild(this.message),this.modal.appendChild(this.button),this.modal.appendChild(this.reloadParagraph),this.loader=this.getLoader(),this.message.after(this.loader),this.button.addEventListener("click",(async()=>{this.show();try{await Ne.reconnect()||this.rejected()}catch(e){this.logger.log(Tn.Error,e),this.failed()}}))}show(){this.addedToDom||(this.addedToDom=!0,this.document.body.appendChild(this.modal)),this.modal.style.display="block",this.loader.style.display="inline-block",this.button.style.display="none",this.reloadParagraph.style.display="none",this.message.textContent="Attempting to reconnect to the server...",this.modal.style.visibility="hidden",setTimeout((()=>{this.modal.style.visibility="visible"}),0)}update(e){this.message.textContent=`Attempting to reconnect to the server: ${e} of ${this.maxRetries}`}hide(){this.modal.style.display="none"}failed(){this.button.style.display="block",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Reconnection failed. Try "),t=this.document.createElement("a");t.textContent="reloading",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page if you're unable to reconnect.");this.message.replaceChildren(e,t,n)}rejected(){this.button.style.display="none",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Could not reconnect to the server. "),t=this.document.createElement("a");t.textContent="Reload",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page to restore functionality.");this.message.replaceChildren(e,t,n)}getLoader(){const e=this.document.createElement("div");return e.style.cssText=["border: 0.3em solid #f3f3f3","border-top: 0.3em solid #3498db","border-radius: 50%","width: 2em","height: 2em","display: inline-block"].join(";"),e.animate([{transform:"rotate(0deg)"},{transform:"rotate(360deg)"}],{duration:2e3,iterations:1/0}),e}}class Nn{constructor(e,t,n){this.dialog=e,this.maxRetries=t,this.document=n,this.document=n;const r=this.document.getElementById(Nn.MaxRetriesId);r&&(r.innerText=this.maxRetries.toString())}show(){this.removeClasses(),this.dialog.classList.add(Nn.ShowClassName)}update(e){const t=this.document.getElementById(Nn.CurrentAttemptId);t&&(t.innerText=e.toString())}hide(){this.removeClasses(),this.dialog.classList.add(Nn.HideClassName)}failed(){this.removeClasses(),this.dialog.classList.add(Nn.FailedClassName)}rejected(){this.removeClasses(),this.dialog.classList.add(Nn.RejectedClassName)}removeClasses(){this.dialog.classList.remove(Nn.ShowClassName,Nn.HideClassName,Nn.FailedClassName,Nn.RejectedClassName)}}Nn.ShowClassName="components-reconnect-show",Nn.HideClassName="components-reconnect-hide",Nn.FailedClassName="components-reconnect-failed",Nn.RejectedClassName="components-reconnect-rejected",Nn.MaxRetriesId="components-reconnect-max-retries",Nn.CurrentAttemptId="components-reconnect-current-attempt";class $n{constructor(e,t,n){this._currentReconnectionProcess=null,this._logger=e,this._reconnectionDisplay=t,this._reconnectCallback=n||Ne.reconnect}onConnectionDown(e,t){if(!this._reconnectionDisplay){const t=document.getElementById(e.dialogId);this._reconnectionDisplay=t?new Nn(t,e.maxRetries,document):new An(e.dialogId,e.maxRetries,document,this._logger)}this._currentReconnectionProcess||(this._currentReconnectionProcess=new Bn(e,this._logger,this._reconnectCallback,this._reconnectionDisplay))}onConnectionUp(){this._currentReconnectionProcess&&(this._currentReconnectionProcess.dispose(),this._currentReconnectionProcess=null)}}class Bn{constructor(e,t,n,r){this.logger=t,this.reconnectCallback=n,this.isDisposed=!1,this.reconnectDisplay=r,this.reconnectDisplay.show(),this.attemptPeriodicReconnection(e)}dispose(){this.isDisposed=!0,this.reconnectDisplay.hide()}async attemptPeriodicReconnection(e){for(let t=0;t<e.maxRetries;t++){this.reconnectDisplay.update(t+1);const n=0===t&&e.retryIntervalMilliseconds>Bn.MaximumFirstRetryInterval?Bn.MaximumFirstRetryInterval:e.retryIntervalMilliseconds;if(await this.delay(n),this.isDisposed)break;try{return await this.reconnectCallback()?void 0:void this.reconnectDisplay.rejected()}catch(e){this.logger.log(Tn.Error,e)}}this.reconnectDisplay.failed()}delay(e){return new Promise((t=>setTimeout(t,e)))}}Bn.MaximumFirstRetryInterval=3e3;const Ln=/^\s*Blazor-Component-State:(?<state>[a-zA-Z0-9+/=]+)$/;function Mn(e){var t;if(e.nodeType===Node.COMMENT_NODE){const n=e.textContent||"",r=Ln.exec(n),o=r&&r.groups&&r.groups.state;return o&&(null===(t=e.parentNode)||void 0===t||t.removeChild(e)),o}if(!e.hasChildNodes())return;const n=e.childNodes;for(let e=0;e<n.length;e++){const t=Mn(n[e]);if(t)return t}}function On(e,t){if(!e.hasChildNodes())return[];const n=[],r=new zn(e.childNodes);for(;r.next()&&r.currentElement;){const e=jn(r,t);if(e)n.push(e);else{const e=On(r.currentElement,t);for(let t=0;t<e.length;t++){const r=e[t];n.push(r)}}}return n}const Fn=new RegExp(/^\s*Blazor:[^{]*(?<descriptor>.*)$/);function jn(e,t){const n=e.currentElement;if(n&&n.nodeType===Node.COMMENT_NODE&&n.textContent){const r=Fn.exec(n.textContent),o=r&&r.groups&&r.groups.descriptor;if(!o)return;try{const r=function(e){const t=JSON.parse(e),{type:n}=t;if("server"!==n&&"webassembly"!==n)throw new Error(`Invalid component type '${n}'.`);return t}(o);switch(t){case"webassembly":return function(e,t,n){const{type:r,assembly:o,typeName:s,parameterDefinitions:i,parameterValues:a,prerenderId:c}=e;if("webassembly"===r){if(!o)throw new Error("assembly must be defined when using a descriptor.");if(!s)throw new Error("typeName must be defined when using a descriptor.");if(c){const e=Hn(c,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,assembly:o,typeName:s,parameterDefinitions:i&&atob(i),parameterValues:a&&atob(a),start:t,prerenderId:c,end:e}}return{type:r,assembly:o,typeName:s,parameterDefinitions:i&&atob(i),parameterValues:a&&atob(a),start:t}}}(r,n,e);case"server":return function(e,t,n){const{type:r,descriptor:o,sequence:s,prerenderId:i}=e;if("server"===r){if(!o)throw new Error("descriptor must be defined when using a descriptor.");if(void 0===s)throw new Error("sequence must be defined when using a descriptor.");if(!Number.isInteger(s))throw new Error(`Error parsing the sequence '${s}' for component '${JSON.stringify(e)}'`);if(i){const e=Hn(i,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,sequence:s,descriptor:o,start:t,prerenderId:i,end:e}}return{type:r,sequence:s,descriptor:o,start:t}}}(r,n,e)}}catch(e){throw new Error(`Found malformed component comment at ${n.textContent}`)}}}function Hn(e,t){for(;t.next()&&t.currentElement;){const n=t.currentElement;if(n.nodeType!==Node.COMMENT_NODE)continue;if(!n.textContent)continue;const r=Fn.exec(n.textContent),o=r&&r[1];if(o)return Wn(o,e),n}}function Wn(e,t){const n=JSON.parse(e);if(1!==Object.keys(n).length)throw new Error(`Invalid end of component comment: '${e}'`);const r=n.prerenderId;if(!r)throw new Error(`End of component comment must have a value for the prerendered property: '${e}'`);if(r!==t)throw new Error(`End of component comment prerendered property must match the start comment prerender id: '${t}', '${r}'`)}class zn{constructor(e){this.childNodes=e,this.currentIndex=-1,this.length=e.length}next(){return this.currentIndex++,this.currentIndex<this.length?(this.currentElement=this.childNodes[this.currentIndex],!0):(this.currentElement=void 0,!1)}}class Jn{constructor(e,t,n,r,o){this.type=e,this.start=t,this.end=n,this.sequence=r,this.descriptor=o}toRecord(){return{type:this.type,sequence:this.sequence,descriptor:this.descriptor}}}class qn{constructor(e,t,n,r,o,s,i){this.id=qn.globalId++,this.type=e,this.assembly=r,this.typeName=o,this.parameterDefinitions=s,this.parameterValues=i,this.start=t,this.end=n}}qn.globalId=1;class Vn{constructor(){this.afterStartedCallbacks=[]}async importInitializersAsync(e,t){await Promise.all(e.map((e=>async function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:s,afterStarted:i}=o;return i&&e.afterStartedCallbacks.push(i),s?s(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await C,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let Kn,Xn=!1,Yn=!1;async function Gn(e){if(Yn)throw new Error("Blazor has already started.");Yn=!0;const t=function(e){const t={...Un,...e};return e&&e.reconnectionOptions&&(t.reconnectionOptions={...Un.reconnectionOptions,...e.reconnectionOptions}),t}(e),n=await async function(e){const t=await fetch("_blazor/initializers",{method:"GET",credentials:"include",cache:"no-cache"}),n=await t.json(),r=new Vn;return await r.importInitializersAsync(n,[e]),r}(t),r=new Rn(t.logLevel);Ne.reconnect=async e=>{if(Xn)return!1;const n=e||await Qn(t,r,i);return await i.reconnect(n)?(t.reconnectionHandler.onConnectionUp(),!0):(r.log(Tn.Information,"Reconnection attempt to the circuit was rejected by the server. This may indicate that the associated state is no longer available on the server."),!1)},Ne.defaultReconnectionHandler=new $n(r),t.reconnectionHandler=t.reconnectionHandler||Ne.defaultReconnectionHandler,r.log(Tn.Information,"Starting up Blazor server-side application.");const o=function(e,t){return function(e){const t=On(e,"server"),n=[];for(let e=0;e<t.length;e++){const r=t[e],o=new Jn(r.type,r.start,r.end,r.sequence,r.descriptor);n.push(o)}return n.sort(((e,t)=>e.sequence-t.sequence))}(e)}(document),s=Mn(document),i=new Pn(o,s||"");Ne._internal.navigationManager.listenForNavigationEvents(((e,t)=>Kn.send("OnLocationChanged",e,t))),Ne._internal.forceCloseConnection=()=>Kn.stop(),Ne._internal.sendJSDataStream=(e,t,n)=>function(e,t,n,r){setTimeout((async()=>{let o=5,s=(new Date).valueOf();try{const i=t instanceof Blob?t.size:t.byteLength;let a=0,c=0;for(;a<i;){const l=Math.min(r,i-a),h=await Ue(t,a,l);if(o--,o>1)await e.send("ReceiveJSDataChunk",n,c,h,null);else{if(!await e.invoke("ReceiveJSDataChunk",n,c,h,null))break;const t=(new Date).valueOf(),r=t-s;s=t,o=Math.max(1,Math.round(500/Math.max(1,r)))}a+=l,c++}}catch(t){await e.send("ReceiveJSDataChunk",n,-1,null,t.toString())}}),0)}(Kn,e,t,n);const a=await Qn(t,r,i);if(!await i.startCircuit(a))return void r.log(Tn.Error,"Failed to start the circuit.");let c=!1;const l=()=>{if(!c){const e=new FormData,t=i.circuitId;e.append("circuitId",t),c=navigator.sendBeacon("_blazor/disconnect",e)}};Ne.disconnect=l,window.addEventListener("unload",l,{capture:!1,once:!0}),r.log(Tn.Information,"Blazor server-side application started."),n.invokeAfterStartedCallbacks(Ne)}async function Qn(t,n,r){var o,s;const i=new hn;i.name="blazorpack";const a=(new Dt).withUrl("_blazor").withHubProtocol(i);t.configureSignalR(a);const c=a.build();c.on("JS.AttachComponent",((e,t)=>function(e,t,n,r){let o=de[0];o||(o=new ie(0),de[0]=o),o.attachRootComponentToLogicalElement(n,t,!1)}(0,r.resolveElement(t),e))),c.on("JS.BeginInvokeJS",e.jsCallDispatcher.beginInvokeJSFromDotNet),c.on("JS.EndInvokeDotNet",e.jsCallDispatcher.endInvokeDotNetFromJS),c.on("JS.ReceiveByteArray",e.jsCallDispatcher.receiveByteArray),c.on("JS.BeginTransmitStream",(t=>{const n=new ReadableStream({start(e){c.stream("SendDotNetStreamToJS",t).subscribe({next:t=>e.enqueue(t),complete:()=>e.close(),error:t=>e.error(t)})}});e.jsCallDispatcher.supplyDotNetStream(t,n)}));const l=xn.getOrCreate(n);c.on("JS.RenderBatch",((e,t)=>{n.log(Tn.Debug,`Received render batch with id ${e} and ${t.byteLength} bytes.`),l.processBatch(e,t,c)})),c.onclose((e=>!Xn&&t.reconnectionHandler.onConnectionDown(t.reconnectionOptions,e))),c.on("JS.Error",(e=>{Xn=!0,Zn(c,e,n),dn()}));try{await c.start(),Kn=c}catch(e){if(Zn(c,e,n),"FailedToNegotiateWithServerError"===e.errorType)throw e;dn(),e.innerErrors&&(e.innerErrors.some((e=>"UnsupportedTransportError"===e.errorType&&e.transport===Ke.WebSockets))?n.log(Tn.Error,"Unable to connect, please ensure you are using an updated browser that supports WebSockets."):e.innerErrors.some((e=>"FailedToStartTransportError"===e.errorType&&e.transport===Ke.WebSockets))?n.log(Tn.Error,"Unable to connect, please ensure WebSockets are available. A VPN or proxy may be blocking the connection."):e.innerErrors.some((e=>"DisabledTransportError"===e.errorType&&e.transport===Ke.LongPolling))&&n.log(Tn.Error,"Unable to initiate a SignalR connection to the server. This might be because the server is not configured to support WebSockets. For additional details, visit https://aka.ms/blazor-server-websockets-error."))}return(null===(s=null===(o=c.connection)||void 0===o?void 0:o.features)||void 0===s?void 0:s.inherentKeepAlive)&&n.log(Tn.Warning,"Failed to connect via WebSockets, using the Long Polling fallback transport. This may be due to a VPN or proxy blocking the connection. To troubleshoot this, visit https://aka.ms/blazor-server-using-fallback-long-polling."),e.attachDispatcher({beginInvokeDotNetFromJS:(e,t,n,r,o)=>{c.send("BeginInvokeDotNetFromJS",e?e.toString():null,t,n,r||0,o)},endInvokeJSFromDotNet:(e,t,n)=>{c.send("EndInvokeJSFromDotNet",e,t,n)},sendByteArray:(e,t)=>{c.send("ReceiveByteArray",e,t)}}),c}function Zn(e,t,n){n.log(Tn.Error,t),e&&e.stop()}Ne.start=Gn,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&Gn()})(); \ No newline at end of file
+(()=>{"use strict";var e,t,n,r={};r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",i="__byte[]";class s{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const a={},c={0:new s(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,h=1,u=1,d=null;function p(e){t.push(e)}function f(e){if(e&&"object"==typeof e){c[u]=new s(e);const t={[o]:u};return u++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function g(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=f(e);n.__jsObjectId=t.__jsObjectId}catch(t){throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function m(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function y(e,t,n,r){const o=v();if(o.invokeDotNetFromJS){const i=D(r),s=o.invokeDotNetFromJS(e,t,n,i);return s?m(s):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function w(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=h++,i=new Promise(((e,t)=>{a[o]={resolve:e,reject:t}}));try{const i=D(r);v().beginInvokeDotNetFromJS(o,e,t,n,i)}catch(e){b(o,!1,e)}return i}function v(){if(null!==d)return d;throw new Error("No .NET call dispatcher has been set.")}function b(e,t,n){if(!a.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=a[e];delete a[e],t?r.resolve(n):r.reject(n)}function _(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function E(e,t){const n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function S(e){delete c[e]}e.attachDispatcher=function(e){d=e},e.attachReviver=p,e.invokeMethod=function(e,t,...n){return y(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return w(e,t,null,n)},e.createJSObjectReference=f,e.createJSStreamReference=g,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&S(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:E,disposeJSObjectReferenceById:S,invokeJSFromDotNet:(e,t,n,r)=>{const o=T(E(e,r).apply(null,m(t)),n);return null==o?null:D(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const i=new Promise((e=>{e(E(t,o).apply(null,m(n)))}));e&&i.then((t=>D([e,!0,T(t,r)]))).then((t=>v().endInvokeJSFromDotNet(e,!0,t)),(t=>v().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,_(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?m(n):new Error(n);b(parseInt(e,10),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new k;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return y(null,e,this._id,t)}invokeMethodAsync(e,...t){return w(null,e,this._id,t)}dispose(){w(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,p((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(i)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new I(t.__dotNetStream)}return t}));class I{constructor(e){if(r.has(e))this._streamPromise=r.get(e).streamPromise,r.delete(e);else{const t=new k;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class k{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function T(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return f(e);case l.JSStreamReference:return g(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let x=0;function D(e){return x=0,JSON.stringify(e,R)}function R(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){d.sendByteArray(x,t);const e={[i]:x};return x++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class o{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new o(e,t.value)}return null}}const i=new Map,s=new Map,a=[];function c(e){return i.get(e)}function l(e){const t=i.get(e);return(null==t?void 0:t.browserEventName)||e}function h(e,t){e.forEach((e=>i.set(e,t)))}function u(e){const t=[];for(let n=0;n<e.length;n++){const r=e[n];t.push({identifier:r.identifier,clientX:r.clientX,clientY:r.clientY,screenX:r.screenX,screenY:r.screenY,pageX:r.pageX,pageY:r.pageY})}return t}function d(e){return{detail:e.detail,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,offsetX:e.offsetX,offsetY:e.offsetY,pageX:e.pageX,pageY:e.pageY,movementX:e.movementX,movementY:e.movementY,button:e.button,buttons:e.buttons,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,type:e.type}}h(["input","change"],{createEventArgs:function(e){const t=e.target;if(function(e){return-1!==p.indexOf(e.getAttribute("type"))}(t)){const e=function(e){const t=e.value,n=e.type;switch(n){case"date":case"month":case"week":return t;case"datetime-local":return 16===t.length?t+":00":t;case"time":return 5===t.length?t+":00":t}throw new Error(`Invalid element type '${n}'.`)}(t);return{value:e}}if(function(e){return e instanceof HTMLSelectElement&&"select-multiple"===e.type}(t)){const e=t;return{value:Array.from(e.options).filter((e=>e.selected)).map((e=>e.value))}}{const e=function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t);return{value:e?!!t.checked:t.value}}}}),h(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),h(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),h(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),h(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","mouseleave","mouseenter","dblclick"],{createEventArgs:e=>d(e)}),h(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),h(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),h(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),h(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),h(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),h(["toggle"],{createEventArgs:()=>({})});const p=["date","datetime-local","month","time","week"],f=new Map;let g,m,y=0;const w={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++y).toString();f.set(r,e);const o=await _().invokeMethodAsync("AddRootComponent",t,r),i=new b(o,m[t]);return await i.setParameters(n),i}};class v{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class b{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new v)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return _().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await _().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function _(){if(!g)throw new Error("Dynamic root components have not been enabled in this application.");return g}const E=new Map;let S;const C=new Promise((e=>{S=e}));function I(e,t,n){return T(e,t.eventHandlerId,(()=>k(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function k(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let T=(e,t,n)=>n();const x=N(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),D={submit:!0},R=N(["click","dblclick","mousedown","mousemove","mouseup"]);class P{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++P.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new U(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),i=o.getHandler(t);if(i)this.eventInfoStore.update(i.eventHandlerId,n);else{const i={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(i),o.setHandler(t,i)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,s.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let r=n.shift(),i=null,s=!1;const a=Object.prototype.hasOwnProperty.call(x,e);let l=!1;for(;r;){const d=r,p=this.getEventHandlerInfosForElement(d,!1);if(p){const n=p.getHandler(e);if(n&&(h=d,u=t.type,!((h instanceof HTMLButtonElement||h instanceof HTMLInputElement||h instanceof HTMLTextAreaElement||h instanceof HTMLSelectElement)&&Object.prototype.hasOwnProperty.call(R,u)&&h.disabled))){if(!s){const n=c(e);i=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},s=!0}Object.prototype.hasOwnProperty.call(D,t.type)&&t.preventDefault(),I(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:o.fromEvent(n.renderingComponentId,t)},i)}p.stopPropagation(e)&&(l=!0),p.preventDefault(e)&&t.preventDefault()}r=a||l?void 0:n.shift()}var h,u}getEventHandlerInfosForElement(e,t){return Object.prototype.hasOwnProperty.call(e,this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new A:null}}P.nextEventDelegatorId=0;class U{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},a.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=l(e),Object.prototype.hasOwnProperty.call(this.countByEventName,e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=Object.prototype.hasOwnProperty.call(x,e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(Object.prototype.hasOwnProperty.call(this.infosByEventHandlerId,t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=l(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(Object.prototype.hasOwnProperty.call(this.countByEventName,e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class A{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return Object.prototype.hasOwnProperty.call(this.handlers,e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function N(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const $=G("_blazorLogicalChildren"),L=G("_blazorLogicalParent"),B=G("_blazorLogicalEnd");function M(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return $ in e||(e[$]=[]),e}function O(e,t){const n=document.createComment("!");return F(n,e,t),n}function F(e,t,n){const r=e;if(e instanceof Comment&&J(r)&&J(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(H(r))throw new Error("Not implemented: moving existing logical children");const o=J(t);if(n<o.length){const t=o[n];t.parentNode.insertBefore(e,t),o.splice(n,0,r)}else X(e,t),o.push(r);r[L]=t,$ in r||(r[$]=[])}function j(e,t){const n=J(e).splice(t,1)[0];if(n instanceof Comment){const e=J(n);if(e)for(;e.length>0;)j(n,0)}const r=n;r.parentNode.removeChild(r)}function H(e){return e[L]||null}function W(e,t){return J(e)[t]}function z(e){const t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function J(e){return e[$]}function q(e,t){const n=J(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=document.createComment("marker");t.moveToBeforeMarker=r;const o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let i=r;for(;i;){const e=i.nextSibling;if(n.insertBefore(i,t),i===o)break;i=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function K(e){const t=J(H(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=K(t);n?n.parentNode.insertBefore(e,n):X(e,H(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=K(e);if(t)return t.previousSibling;{const t=H(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function Q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${Q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",ee=document.createElement("template"),te=document.createElementNS("http://www.w3.org/2000/svg","g"),ne={},re="__internal_",oe="preventDefault_",ie="stopPropagation_";class se{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new P(e),this.eventDelegator.notifyAfterClick((e=>{if(!fe)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;e<t.length;e++){const n=t[e];if(n instanceof Element&&"A"===n.tagName)return n}return null}return Ae(e.target,"A")}(e);if(t&&function(e){const t=e.getAttribute("target");return(!t||"_self"===t)&&e.hasAttribute("href")&&!e.hasAttribute("download")}(t)){const n=Ue(t.getAttribute("href"));Ne(n)&&(e.preventDefault(),Ie(n,!0,!1))}}))}attachRootComponentToLogicalElement(e,t,n){this.attachComponentToElement(e,t),this.rootComponentIds.add(e),n||(ne[e]=t)}updateComponent(e,t,n,r){var o;const i=this.childComponentLocations[t];if(!i)throw new Error(`No element is currently associated with component ${t}`);const s=ne[t];if(s){const e=function(e){return e[B]||null}(s);delete ne[t],e?function(e,t){const n=H(e);if(!n)throw new Error("Can't clear between nodes. The start node does not have a logical parent.");const r=J(n),o=r.indexOf(e)+1,i=r.indexOf(t);for(let e=o;e<=i;e++)j(n,o);e.textContent="!"}(s,e):function(e){let t;for(;t=e.firstChild;)e.removeChild(t)}(s)}const a=null===(o=V(i))||void 0===o?void 0:o.getRootNode(),c=a&&a.activeElement;this.applyEdits(e,t,i,0,n,r),c instanceof HTMLElement&&a&&a.activeElement!==c&&c.focus()}disposeComponent(e){this.rootComponentIds.delete(e)&&function(e){const t=J(e);for(;t.length;)j(e,0)}(this.childComponentLocations[e]),delete this.childComponentLocations[e]}disposeEventHandler(e){this.eventDelegator.removeListener(e)}attachComponentToElement(e,t){this.childComponentLocations[e]=t}applyEdits(e,n,r,o,i,s){let a,c=0,l=o;const h=e.arrayBuilderSegmentReader,u=e.editReader,d=e.frameReader,p=h.values(i),f=h.offset(i),g=f+h.count(i);for(let i=f;i<g;i++){const h=e.diffReader.editsEntry(p,i),f=u.editType(h);switch(f){case t.prependFrame:{const t=u.newTreeIndex(h),o=e.referenceFramesEntry(s,t),i=u.siblingIndex(h);this.insertFrame(e,n,r,l+i,s,o,t);break}case t.removeFrame:j(r,l+u.siblingIndex(h));break;case t.setAttribute:{const t=u.newTreeIndex(h),o=e.referenceFramesEntry(s,t),i=W(r,l+u.siblingIndex(h));if(!(i instanceof Element))throw new Error("Cannot set attribute on non-element child");this.applyAttribute(e,n,i,o);break}case t.removeAttribute:{const t=W(r,l+u.siblingIndex(h));if(!(t instanceof HTMLElement))throw new Error("Cannot remove attribute from non-element child");{const n=u.removedAttributeName(h);this.tryApplySpecialProperty(e,t,n,null)||t.removeAttribute(n)}break}case t.updateText:{const t=u.newTreeIndex(h),n=e.referenceFramesEntry(s,t),o=W(r,l+u.siblingIndex(h));if(!(o instanceof Text))throw new Error("Cannot set text content on non-text child");o.textContent=d.textContent(n);break}case t.updateMarkup:{const t=u.newTreeIndex(h),n=e.referenceFramesEntry(s,t),o=u.siblingIndex(h);j(r,l+o),this.insertMarkup(e,r,l+o,n);break}case t.stepIn:r=W(r,l+u.siblingIndex(h)),c++,l=0;break;case t.stepOut:r=H(r),c--,l=0===c?o:0;break;case t.permutationListEntry:a=a||[],a.push({fromSiblingIndex:l+u.siblingIndex(h),toSiblingIndex:l+u.moveToSiblingIndex(h)});break;case t.permutationListEnd:q(r,a),a=void 0;break;default:throw new Error(`Unknown edit type: ${f}`)}}}insertFrame(e,t,r,o,i,s,a){const c=e.frameReader,l=c.frameType(s);switch(l){case n.element:return this.insertElement(e,t,r,o,i,s,a),1;case n.text:return this.insertText(e,r,o,s),1;case n.attribute:throw new Error("Attribute frames should only be present as leading children of element frames.");case n.component:return this.insertComponent(e,r,o,s),1;case n.region:return this.insertFrameRange(e,t,r,o,i,a+1,a+c.subtreeLength(s));case n.elementReferenceCapture:if(r instanceof Element)return h=r,u=c.elementReferenceCaptureId(s),h.setAttribute(Q(u),""),0;throw new Error("Reference capture frames can only be children of element frames.");case n.markup:return this.insertMarkup(e,r,o,s),1;default:throw new Error(`Unknown frame type: ${l}`)}var h,u}insertElement(e,t,r,o,i,s,a){const c=e.frameReader,l=c.elementName(s),h="svg"===l||z(r)?document.createElementNS("http://www.w3.org/2000/svg",l):document.createElement(l),u=M(h);let d=!1;const p=a+c.subtreeLength(s);for(let s=a+1;s<p;s++){const a=e.referenceFramesEntry(i,s);if(c.frameType(a)!==n.attribute){F(h,r,o),d=!0,this.insertFrameRange(e,t,u,0,i,s,p);break}this.applyAttribute(e,t,h,a)}d||F(h,r,o),h instanceof HTMLOptionElement?this.trySetSelectValueFromOptionElement(h):Z in h&&ue(h,h._blazorDeferredValue)}trySetSelectValueFromOptionElement(e){const t=this.findClosestAncestorSelectElement(e);if(!function(e){return!!e&&Z in e}(t))return!1;if(le(t))e.selected=-1!==t._blazorDeferredValue.indexOf(e.value);else{if(t._blazorDeferredValue!==e.value)return!1;he(t,e.value),delete t._blazorDeferredValue}return!0}insertComponent(e,t,n,r){const o=O(t,n),i=e.frameReader.componentId(r);this.attachComponentToElement(i,o)}insertText(e,t,n,r){const o=e.frameReader.textContent(r);F(document.createTextNode(o),t,n)}insertMarkup(e,t,n,r){const o=O(t,n),i=(s=e.frameReader.markupContent(r),z(t)?(te.innerHTML=s||" ",te):(ee.innerHTML=s||" ",ee.content));var s;let a=0;for(;i.firstChild;)F(i.firstChild,o,a++)}applyAttribute(e,t,n,r){const o=e.frameReader,i=o.attributeName(r),s=o.attributeEventHandlerId(r);if(s){const e=ce(i);this.eventDelegator.setListener(n,e,s,t)}else this.tryApplySpecialProperty(e,n,i,r)||n.setAttribute(i,o.attributeValue(r))}tryApplySpecialProperty(e,t,n,r){switch(n){case"value":return this.tryApplyValueProperty(e,t,r);case"checked":return this.tryApplyCheckedProperty(e,t,r);default:return!!n.startsWith(re)&&(this.applyInternalAttribute(e,t,n.substring(re.length),r),!0)}}applyInternalAttribute(e,t,n,r){const o=r?e.frameReader.attributeValue(r):null;if(n.startsWith(ie)){const e=ce(n.substring(ie.length));this.eventDelegator.setStopPropagation(t,e,null!==o)}else{if(!n.startsWith(oe))throw new Error(`Unsupported internal attribute '${n}'`);{const e=ce(n.substring(oe.length));this.eventDelegator.setPreventDefault(t,e,null!==o)}}}tryApplyValueProperty(e,t,n){const r=e.frameReader;let o=n?r.attributeValue(n):null;switch(o&&"INPUT"===t.tagName&&(o=function(e,t){switch(t.getAttribute("type")){case"time":return 8!==e.length||!e.endsWith("00")&&t.hasAttribute("step")?e:e.substring(0,5);case"datetime-local":return 19!==e.length||!e.endsWith("00")&&t.hasAttribute("step")?e:e.substring(0,16);default:return e}}(o,t)),t.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return o&&t instanceof HTMLSelectElement&&le(t)&&(o=JSON.parse(o)),ue(t,o),t._blazorDeferredValue=o,!0;case"OPTION":return o||""===o?t.setAttribute("value",o):t.removeAttribute("value"),this.trySetSelectValueFromOptionElement(t),!0;default:return!1}}tryApplyCheckedProperty(e,t,n){if("INPUT"===t.tagName){const r=n?e.frameReader.attributeValue(n):null;return t.checked=null!==r,!0}return!1}findClosestAncestorSelectElement(e){for(;e;){if(e instanceof HTMLSelectElement)return e;e=e.parentElement}return null}insertFrameRange(e,t,n,r,o,i,s){const a=r;for(let a=i;a<s;a++){const i=e.referenceFramesEntry(o,a);r+=this.insertFrame(e,t,n,r,o,i,a),a+=ae(e,i)}return r-a}}function ae(e,t){const r=e.frameReader;switch(r.frameType(t)){case n.component:case n.element:case n.region:return r.subtreeLength(t)-1;default:return 0}}function ce(e){if(e.startsWith("on"))return e.substring(2);throw new Error(`Attribute should be an event name, but doesn't start with 'on'. Value: '${e}'`)}function le(e){return"select-multiple"===e.type}function he(e,t){e.value=t||""}function ue(e,t){e instanceof HTMLSelectElement?le(e)?function(e,t){t||(t=[]);for(let n=0;n<e.options.length;n++)e.options[n].selected=-1!==t.indexOf(e.options[n].value)}(e,t):he(e,t):e.value=t}const de={};let pe=!1,fe=!1,ge=!1,me=!1,ye=0,we=0,ve=null,be=null,_e=async function(e){var t,n,r;if(Te(),me){const o=null!==(n=null===(t=e.state)||void 0===t?void 0:t._index)&&void 0!==n?n:0,i=null===(r=e.state)||void 0===r?void 0:r.userState,s=o-ye,a=location.href;if(await ke(-s),!await xe(a,i,!1))return;await ke(s)}await De(!1)},Ee=null;const Se={listenForNavigationEvents:function(e,t){var n,r;ve=e,be=t,ge||(ge=!0,window.addEventListener("popstate",Re),ye=null!==(r=null===(n=history.state)||void 0===n?void 0:n._index)&&void 0!==r?r:0)},enableNavigationInterception:function(){fe=!0},setHasLocationChangingListeners:function(e){me=e},endLocationChanging:function(e,t){Ee&&e===we&&(Ee(t),Ee=null)},navigateTo:function(e,t){Ce(e,t,!0)},getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function Ce(e,t,n=!1){const r=Ue(e);!t.forceLoad&&Ne(r)?Ie(r,!1,t.replaceHistoryEntry,t.historyEntryState,n):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,t.replaceHistoryEntry)}async function Ie(e,t,n,r,o=!1){Te(),(o||!me||await xe(e,r,t))&&(pe=!0,n?history.replaceState({userState:r,_index:ye},"",e):(ye++,history.pushState({userState:r,_index:ye},"",e)),await De(t))}function ke(e){return new Promise((t=>{const n=_e;_e=()=>{_e=n,t()},history.go(e)}))}function Te(){Ee&&(Ee(!1),Ee=null)}function xe(e,t,n){return new Promise((r=>{Te(),be?(we++,Ee=r,be(we,e,t,n)):r(!1)}))}async function De(e){var t;ve&&await ve(location.href,null===(t=history.state)||void 0===t?void 0:t.userState,e)}async function Re(e){var t,n;_e&&await _e(e),ye=null!==(n=null===(t=history.state)||void 0===t?void 0:t._index)&&void 0!==n?n:0}let Pe;function Ue(e){return Pe=Pe||document.createElement("a"),Pe.href=e,Pe.href}function Ae(e,t){return e?e.tagName===t?e:Ae(e.parentElement,t):null}function Ne(e){const t=(n=document.baseURI).substring(0,n.lastIndexOf("/"));var n;const r=e.charAt(t.length);return e.startsWith(t)&&(""===r||"/"===r||"?"===r||"#"===r)}const $e={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},Le={init:function(e,t,n,r=50){const o=Me(t);(o||document.documentElement).style.overflowAnchor="none";const i=document.createRange();h(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const s=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;i.setStartAfter(t),i.setEndBefore(n);const s=i.getBoundingClientRect().height,a=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,s,a):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,s,a)}))}),{root:o,rootMargin:`${r}px`});s.observe(t),s.observe(n);const a=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{h(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),s.unobserve(e),s.observe(e)}));return n.observe(e,t),n}function h(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}Be[e._id]={intersectionObserver:s,mutationObserverBefore:a,mutationObserverAfter:c}},dispose:function(e){const t=Be[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete Be[e._id])}},Be={};function Me(e){return e&&e!==document.body&&e!==document.documentElement?"visible"!==getComputedStyle(e).overflowY?e:Me(e.parentElement):null}const Oe={getAndRemoveExistingTitle:function(){var e;const t=document.head?document.head.getElementsByTagName("title"):[];if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],i=o.previousSibling;i instanceof Comment&&null!==H(i)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Fe={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const i=je(e,t),s=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(i.blob)})),a=await new Promise((function(e){var t;const i=Math.min(1,r/s.width),a=Math.min(1,o/s.height),c=Math.min(i,a),l=document.createElement("canvas");l.width=Math.round(s.width*c),l.height=Math.round(s.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(s,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:i.lastModified,name:i.name,size:(null==a?void 0:a.size)||0,contentType:n,blob:a||i.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return je(e,t).blob}};function je(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed. See https://aka.ms/aspnet/blazor-input-file-multiple-selections.`);return n}const He=new Set,We={enableNavigationPrompt:function(e){0===He.size&&window.addEventListener("beforeunload",ze),He.add(e)},disableNavigationPrompt:function(e){He.delete(e),0===He.size&&window.removeEventListener("beforeunload",ze)}};function ze(e){e.preventDefault(),e.returnValue=!0}async function Je(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)}const qe=new Map,Ve={navigateTo:function(e,t,n=!1){Ce(e,t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n})},registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(i.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=s.get(t.browserEventName);n?n.push(e):s.set(t.browserEventName,[e]),a.forEach((n=>n(e,t.browserEventName)))}i.set(e,t)},rootComponents:w,_internal:{navigationManager:Se,domWrapper:$e,Virtualize:Le,PageTitle:Oe,InputFile:Fe,NavigationLock:We,getJSDataStreamChunk:Je,receiveDotNetDataStream:function(t,n,r,o){let i=qe.get(t);if(!i){const n=new ReadableStream({start(e){qe.set(t,e),i=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(i.error(o),qe.delete(t)):0===r?(i.close(),qe.delete(t)):i.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(g)throw new Error("Dynamic root components have already been enabled.");g=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(k(t),r,o),S()}}};window.Blazor=Ve;const Ke=[0,2e3,1e4,3e4,null];class Xe{constructor(e){this._retryDelays=void 0!==e?[...e,null]:Ke}nextRetryDelayInMilliseconds(e){return this._retryDelays[e.previousRetryCount]}}class Ye extends Error{constructor(e,t){const n=new.target.prototype;super(`${e}: Status code '${t}'`),this.statusCode=t,this.__proto__=n}}class Ge extends Error{constructor(e="A timeout occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Qe extends Error{constructor(e="An abort occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class Ze extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="UnsupportedTransportError",this.__proto__=n}}class et extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="DisabledTransportError",this.__proto__=n}}class tt extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="FailedToStartTransportError",this.__proto__=n}}class nt extends Error{constructor(e){const t=new.target.prototype;super(e),this.errorType="FailedToNegotiateWithServerError",this.__proto__=t}}class rt extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.innerErrors=t,this.__proto__=n}}class ot{constructor(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}}class it{get(e,t){return this.send({...t,method:"GET",url:e})}post(e,t){return this.send({...t,method:"POST",url:e})}delete(e,t){return this.send({...t,method:"DELETE",url:e})}getCookieString(e){return""}}var st,at,ct,lt,ht;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(st||(st={}));class ut{constructor(){}log(e,t){}}ut.instance=new ut;class dt{static isRequired(e,t){if(null==e)throw new Error(`The '${t}' argument is required.`)}static isNotEmpty(e,t){if(!e||e.match(/^\s*$/))throw new Error(`The '${t}' argument should not be empty.`)}static isIn(e,t,n){if(!(e in t))throw new Error(`Unknown ${n} value: ${e}.`)}}class pt{static get isBrowser(){return"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return"object"==typeof self&&"importScripts"in self}static get isReactNative(){return"object"==typeof window&&void 0===window.document}static get isNode(){return!this.isBrowser&&!this.isWebWorker&&!this.isReactNative}}function ft(e,t){let n="";return gt(e)?(n=`Binary data of length ${e.byteLength}`,t&&(n+=`. Content: '${function(e){const t=new Uint8Array(e);let n="";return t.forEach((e=>{n+=`0x${e<16?"0":""}${e.toString(16)} `})),n.substr(0,n.length-1)}(e)}'`)):"string"==typeof e&&(n=`String data of length ${e.length}`,t&&(n+=`. Content: '${e}'`)),n}function gt(e){return e&&"undefined"!=typeof ArrayBuffer&&(e instanceof ArrayBuffer||e.constructor&&"ArrayBuffer"===e.constructor.name)}async function mt(e,t,n,r,o,i,s){let a={};if(o){const e=await o();e&&(a={Authorization:`Bearer ${e}`})}const[c,l]=vt();a[c]=l,e.log(st.Trace,`(${t} transport) sending data. ${ft(i,s.logMessageContent)}.`);const h=gt(i)?"arraybuffer":"text",u=await n.post(r,{content:i,headers:{...a,...s.headers},responseType:h,timeout:s.timeout,withCredentials:s.withCredentials});e.log(st.Trace,`(${t} transport) request complete. Response status: ${u.statusCode}.`)}class yt{constructor(e,t){this._subject=e,this._observer=t}dispose(){const e=this._subject.observers.indexOf(this._observer);e>-1&&this._subject.observers.splice(e,1),0===this._subject.observers.length&&this._subject.cancelCallback&&this._subject.cancelCallback().catch((e=>{}))}}class wt{constructor(e){this._minLevel=e,this.out=console}log(e,t){if(e>=this._minLevel){const n=`[${(new Date).toISOString()}] ${st[e]}: ${t}`;switch(e){case st.Critical:case st.Error:this.out.error(n);break;case st.Warning:this.out.warn(n);break;case st.Information:this.out.info(n);break;default:this.out.log(n)}}}}function vt(){let e="X-SignalR-User-Agent";return pt.isNode&&(e="User-Agent"),[e,bt("0.0.0-DEV_BUILD",_t(),pt.isNode?"NodeJS":"Browser",Et())]}function bt(e,t,n,r){let o="Microsoft SignalR/";const i=e.split(".");return o+=`${i[0]}.${i[1]}`,o+=` (${e}; `,o+=t&&""!==t?`${t}; `:"Unknown OS; ",o+=`${n}`,o+=r?`; ${r}`:"; Unknown Runtime Version",o+=")",o}function _t(){if(!pt.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function Et(){if(pt.isNode)return process.versions.node}function St(e){return e.stack?e.stack:e.message?e.message:`${e}`}class Ct extends it{constructor(e){if(super(),this._logger=e,"undefined"==typeof fetch){const e=require;this._jar=new(e("tough-cookie").CookieJar),this._fetchType=e("node-fetch"),this._fetchType=e("fetch-cookie")(this._fetchType,this._jar)}else this._fetchType=fetch.bind(function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("could not find global")}());if("undefined"==typeof AbortController){const e=require;this._abortControllerType=e("abort-controller")}else this._abortControllerType=AbortController}async send(e){if(e.abortSignal&&e.abortSignal.aborted)throw new Qe;if(!e.method)throw new Error("No method defined.");if(!e.url)throw new Error("No url defined.");const t=new this._abortControllerType;let n;e.abortSignal&&(e.abortSignal.onabort=()=>{t.abort(),n=new Qe});let r,o=null;if(e.timeout){const r=e.timeout;o=setTimeout((()=>{t.abort(),this._logger.log(st.Warning,"Timeout from HTTP request."),n=new Ge}),r)}""===e.content&&(e.content=void 0),e.content&&(e.headers=e.headers||{},gt(e.content)?e.headers["Content-Type"]="application/octet-stream":e.headers["Content-Type"]="text/plain;charset=UTF-8");try{r=await this._fetchType(e.url,{body:e.content,cache:"no-cache",credentials:!0===e.withCredentials?"include":"same-origin",headers:{"X-Requested-With":"XMLHttpRequest",...e.headers},method:e.method,mode:"cors",redirect:"follow",signal:t.signal})}catch(e){if(n)throw n;throw this._logger.log(st.Warning,`Error from HTTP request. ${e}.`),e}finally{o&&clearTimeout(o),e.abortSignal&&(e.abortSignal.onabort=null)}if(!r.ok){const e=await It(r,"text");throw new Ye(e||r.statusText,r.status)}const i=It(r,e.responseType),s=await i;return new ot(r.status,r.statusText,s)}getCookieString(e){return""}}function It(e,t){let n;switch(t){case"arraybuffer":n=e.arrayBuffer();break;case"text":default:n=e.text();break;case"blob":case"document":case"json":throw new Error(`${t} is not supported.`)}return n}class kt extends it{constructor(e){super(),this._logger=e}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Qe):e.method?e.url?new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),r.withCredentials=void 0===e.withCredentials||e.withCredentials,r.setRequestHeader("X-Requested-With","XMLHttpRequest"),""===e.content&&(e.content=void 0),e.content&&(gt(e.content)?r.setRequestHeader("Content-Type","application/octet-stream"):r.setRequestHeader("Content-Type","text/plain;charset=UTF-8"));const o=e.headers;o&&Object.keys(o).forEach((e=>{r.setRequestHeader(e,o[e])})),e.responseType&&(r.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=()=>{r.abort(),n(new Qe)}),e.timeout&&(r.timeout=e.timeout),r.onload=()=>{e.abortSignal&&(e.abortSignal.onabort=null),r.status>=200&&r.status<300?t(new ot(r.status,r.statusText,r.response||r.responseText)):n(new Ye(r.response||r.responseText||r.statusText,r.status))},r.onerror=()=>{this._logger.log(st.Warning,`Error from HTTP request. ${r.status}: ${r.statusText}.`),n(new Ye(r.statusText,r.status))},r.ontimeout=()=>{this._logger.log(st.Warning,"Timeout from HTTP request."),n(new Ge)},r.send(e.content)})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class Tt extends it{constructor(e){if(super(),"undefined"!=typeof fetch)this._httpClient=new Ct(e);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this._httpClient=new kt(e)}}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new Qe):e.method?e.url?this._httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}getCookieString(e){return this._httpClient.getCookieString(e)}}class xt{}xt.Authorization="Authorization",xt.Cookie="Cookie",function(e){e[e.None=0]="None",e[e.WebSockets=1]="WebSockets",e[e.ServerSentEvents=2]="ServerSentEvents",e[e.LongPolling=4]="LongPolling"}(at||(at={})),function(e){e[e.Text=1]="Text",e[e.Binary=2]="Binary"}(ct||(ct={}));class Dt{constructor(){this._isAborted=!1,this.onabort=null}abort(){this._isAborted||(this._isAborted=!0,this.onabort&&this.onabort())}get signal(){return this}get aborted(){return this._isAborted}}class Rt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._pollAbort=new Dt,this._options=r,this._running=!1,this.onreceive=null,this.onclose=null}get pollAborted(){return this._pollAbort.aborted}async connect(e,t){if(dt.isRequired(e,"url"),dt.isRequired(t,"transferFormat"),dt.isIn(t,ct,"transferFormat"),this._url=e,this._logger.log(st.Trace,"(LongPolling transport) Connecting."),t===ct.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[n,r]=vt(),o={[n]:r,...this._options.headers},i={abortSignal:this._pollAbort.signal,headers:o,timeout:1e5,withCredentials:this._options.withCredentials};t===ct.Binary&&(i.responseType="arraybuffer"),await this._updateHeaderToken(i);const s=`${e}&_=${Date.now()}`;this._logger.log(st.Trace,`(LongPolling transport) polling: ${s}.`);const a=await this._httpClient.get(s,i);200!==a.statusCode?(this._logger.log(st.Error,`(LongPolling transport) Unexpected response code: ${a.statusCode}.`),this._closeError=new Ye(a.statusText||"",a.statusCode),this._running=!1):this._running=!0,this._receiving=this._poll(this._url,i)}async _updateHeaderToken(e){if(e.headers||(e.headers={}),this._accessTokenFactory){const t=await this._accessTokenFactory();t?e.headers[xt.Authorization]=`Bearer ${t}`:e.headers[xt.Authorization]&&delete e.headers[xt.Authorization]}}async _poll(e,t){try{for(;this._running;){await this._updateHeaderToken(t);try{const n=`${e}&_=${Date.now()}`;this._logger.log(st.Trace,`(LongPolling transport) polling: ${n}.`);const r=await this._httpClient.get(n,t);204===r.statusCode?(this._logger.log(st.Information,"(LongPolling transport) Poll terminated by server."),this._running=!1):200!==r.statusCode?(this._logger.log(st.Error,`(LongPolling transport) Unexpected response code: ${r.statusCode}.`),this._closeError=new Ye(r.statusText||"",r.statusCode),this._running=!1):r.content?(this._logger.log(st.Trace,`(LongPolling transport) data received. ${ft(r.content,this._options.logMessageContent)}.`),this.onreceive&&this.onreceive(r.content)):this._logger.log(st.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(e){this._running?e instanceof Ge?this._logger.log(st.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this._closeError=e,this._running=!1):this._logger.log(st.Trace,`(LongPolling transport) Poll errored after shutdown: ${e.message}`)}}}finally{this._logger.log(st.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this._raiseOnClose()}}async send(e){return this._running?mt(this._logger,"LongPolling",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}async stop(){this._logger.log(st.Trace,"(LongPolling transport) Stopping polling."),this._running=!1,this._pollAbort.abort();try{await this._receiving,this._logger.log(st.Trace,`(LongPolling transport) sending DELETE request to ${this._url}.`);const e={},[t,n]=vt();e[t]=n;const r={headers:{...e,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials};await this._updateHeaderToken(r),await this._httpClient.delete(this._url,r),this._logger.log(st.Trace,"(LongPolling transport) DELETE request sent.")}finally{this._logger.log(st.Trace,"(LongPolling transport) Stop finished."),this._raiseOnClose()}}_raiseOnClose(){if(this.onclose){let e="(LongPolling transport) Firing onclose event.";this._closeError&&(e+=" Error: "+this._closeError),this._logger.log(st.Trace,e),this.onclose(this._closeError)}}}class Pt{constructor(e,t,n,r){this._httpClient=e,this._accessTokenFactory=t,this._logger=n,this._options=r,this.onreceive=null,this.onclose=null}async connect(e,t){if(dt.isRequired(e,"url"),dt.isRequired(t,"transferFormat"),dt.isIn(t,ct,"transferFormat"),this._logger.log(st.Trace,"(SSE transport) Connecting."),this._url=e,this._accessTokenFactory){const t=await this._accessTokenFactory();t&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(t)}`)}return new Promise(((n,r)=>{let o,i=!1;if(t===ct.Text){if(pt.isBrowser||pt.isWebWorker)o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials});else{const t=this._httpClient.getCookieString(e),n={};n.Cookie=t;const[r,i]=vt();n[r]=i,o=new this._options.EventSource(e,{withCredentials:this._options.withCredentials,headers:{...n,...this._options.headers}})}try{o.onmessage=e=>{if(this.onreceive)try{this._logger.log(st.Trace,`(SSE transport) data received. ${ft(e.data,this._options.logMessageContent)}.`),this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onerror=e=>{i?this._close():r(new Error("EventSource failed to connect. The connection could not be found on the server, either the connection ID is not present on the server, or a proxy is refusing/buffering the connection. If you have multiple servers check that sticky sessions are enabled."))},o.onopen=()=>{this._logger.log(st.Information,`SSE connected to ${this._url}`),this._eventSource=o,i=!0,n()}}catch(e){return void r(e)}}else r(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(e){return this._eventSource?mt(this._logger,"SSE",this._httpClient,this._url,this._accessTokenFactory,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}stop(){return this._close(),Promise.resolve()}_close(e){this._eventSource&&(this._eventSource.close(),this._eventSource=void 0,this.onclose&&this.onclose(e))}}class Ut{constructor(e,t,n,r,o,i){this._logger=n,this._accessTokenFactory=t,this._logMessageContent=r,this._webSocketConstructor=o,this._httpClient=e,this.onreceive=null,this.onclose=null,this._headers=i}async connect(e,t){let n;return dt.isRequired(e,"url"),dt.isRequired(t,"transferFormat"),dt.isIn(t,ct,"transferFormat"),this._logger.log(st.Trace,"(WebSockets transport) Connecting."),this._accessTokenFactory&&(n=await this._accessTokenFactory()),new Promise(((r,o)=>{let i;e=e.replace(/^http/,"ws");const s=this._httpClient.getCookieString(e);let a=!1;if(pt.isReactNative){const t={},[r,o]=vt();t[r]=o,n&&(t[xt.Authorization]=`Bearer ${n}`),s&&(t[xt.Cookie]=s),i=new this._webSocketConstructor(e,void 0,{headers:{...t,...this._headers}})}else n&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(n)}`);i||(i=new this._webSocketConstructor(e)),t===ct.Binary&&(i.binaryType="arraybuffer"),i.onopen=t=>{this._logger.log(st.Information,`WebSocket connected to ${e}.`),this._webSocket=i,a=!0,r()},i.onerror=e=>{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"There was an error with the transport",this._logger.log(st.Information,`(WebSockets transport) ${t}.`)},i.onmessage=e=>{if(this._logger.log(st.Trace,`(WebSockets transport) data received. ${ft(e.data,this._logMessageContent)}.`),this.onreceive)try{this.onreceive(e.data)}catch(e){return void this._close(e)}},i.onclose=e=>{if(a)this._close(e);else{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.",o(new Error(t))}}}))}send(e){return this._webSocket&&this._webSocket.readyState===this._webSocketConstructor.OPEN?(this._logger.log(st.Trace,`(WebSockets transport) sending data. ${ft(e,this._logMessageContent)}.`),this._webSocket.send(e),Promise.resolve()):Promise.reject("WebSocket is not in the OPEN state")}stop(){return this._webSocket&&this._close(void 0),Promise.resolve()}_close(e){this._webSocket&&(this._webSocket.onclose=()=>{},this._webSocket.onmessage=()=>{},this._webSocket.onerror=()=>{},this._webSocket.close(),this._webSocket=void 0),this._logger.log(st.Trace,"(WebSockets transport) socket closed."),this.onclose&&(!this._isCloseEvent(e)||!1!==e.wasClean&&1e3===e.code?e instanceof Error?this.onclose(e):this.onclose():this.onclose(new Error(`WebSocket closed with status code: ${e.code} (${e.reason||"no reason given"}).`)))}_isCloseEvent(e){return e&&"boolean"==typeof e.wasClean&&"number"==typeof e.code}}class At{constructor(e,t={}){var n;if(this._stopPromiseResolver=()=>{},this.features={},this._negotiateVersion=1,dt.isRequired(e,"url"),this._logger=void 0===(n=t.logger)?new wt(st.Information):null===n?ut.instance:void 0!==n.log?n:new wt(n),this.baseUrl=this._resolveUrl(e),(t=t||{}).logMessageContent=void 0!==t.logMessageContent&&t.logMessageContent,"boolean"!=typeof t.withCredentials&&void 0!==t.withCredentials)throw new Error("withCredentials option was not a 'boolean' or 'undefined' value");t.withCredentials=void 0===t.withCredentials||t.withCredentials,t.timeout=void 0===t.timeout?1e5:t.timeout,"undefined"==typeof WebSocket||t.WebSocket||(t.WebSocket=WebSocket),"undefined"==typeof EventSource||t.EventSource||(t.EventSource=EventSource),this._httpClient=t.httpClient||new Tt(this._logger),this._connectionState="Disconnected",this._connectionStarted=!1,this._options=t,this.onreceive=null,this.onclose=null}async start(e){if(e=e||ct.Binary,dt.isIn(e,ct,"transferFormat"),this._logger.log(st.Debug,`Starting connection with transfer format '${ct[e]}'.`),"Disconnected"!==this._connectionState)return Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."));if(this._connectionState="Connecting",this._startInternalPromise=this._startInternal(e),await this._startInternalPromise,"Disconnecting"===this._connectionState){const e="Failed to start the HttpConnection before stop() was called.";return this._logger.log(st.Error,e),await this._stopPromise,Promise.reject(new Qe(e))}if("Connected"!==this._connectionState){const e="HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!";return this._logger.log(st.Error,e),Promise.reject(new Qe(e))}this._connectionStarted=!0}send(e){return"Connected"!==this._connectionState?Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")):(this._sendQueue||(this._sendQueue=new Nt(this.transport)),this._sendQueue.send(e))}async stop(e){return"Disconnected"===this._connectionState?(this._logger.log(st.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this._connectionState?(this._logger.log(st.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState="Disconnecting",this._stopPromise=new Promise((e=>{this._stopPromiseResolver=e})),await this._stopInternal(e),void await this._stopPromise)}async _stopInternal(e){this._stopError=e;try{await this._startInternalPromise}catch(e){}if(this.transport){try{await this.transport.stop()}catch(e){this._logger.log(st.Error,`HttpConnection.transport.stop() threw error '${e}'.`),this._stopConnection()}this.transport=void 0}else this._logger.log(st.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async _startInternal(e){let t=this.baseUrl;this._accessTokenFactory=this._options.accessTokenFactory;try{if(this._options.skipNegotiation){if(this._options.transport!==at.WebSockets)throw new Error("Negotiation can only be skipped when using the WebSocket transport directly.");this.transport=this._constructTransport(at.WebSockets),await this._startTransport(t,e)}else{let n=null,r=0;do{if(n=await this._getNegotiationResponse(t),"Disconnecting"===this._connectionState||"Disconnected"===this._connectionState)throw new Qe("The connection was stopped during negotiation.");if(n.error)throw new Error(n.error);if(n.ProtocolVersion)throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.");if(n.url&&(t=n.url),n.accessToken){const e=n.accessToken;this._accessTokenFactory=()=>e}r++}while(n.url&&r<100);if(100===r&&n.url)throw new Error("Negotiate redirection limit exceeded.");await this._createTransport(t,this._options.transport,n,e)}this.transport instanceof Rt&&(this.features.inherentKeepAlive=!0),"Connecting"===this._connectionState&&(this._logger.log(st.Debug,"The HttpConnection connected successfully."),this._connectionState="Connected")}catch(e){return this._logger.log(st.Error,"Failed to start the connection: "+e),this._connectionState="Disconnected",this.transport=void 0,this._stopPromiseResolver(),Promise.reject(e)}}async _getNegotiationResponse(e){const t={};if(this._accessTokenFactory){const e=await this._accessTokenFactory();e&&(t[xt.Authorization]=`Bearer ${e}`)}const[n,r]=vt();t[n]=r;const o=this._resolveNegotiateUrl(e);this._logger.log(st.Debug,`Sending negotiation request: ${o}.`);try{const e=await this._httpClient.post(o,{content:"",headers:{...t,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials});if(200!==e.statusCode)return Promise.reject(new Error(`Unexpected status code returned from negotiate '${e.statusCode}'`));const n=JSON.parse(e.content);return(!n.negotiateVersion||n.negotiateVersion<1)&&(n.connectionToken=n.connectionId),n}catch(e){let t="Failed to complete negotiation with the server: "+e;return e instanceof Ye&&404===e.statusCode&&(t+=" Either this is not a SignalR endpoint or there is a proxy blocking the connection."),this._logger.log(st.Error,t),Promise.reject(new nt(t))}}_createConnectUrl(e,t){return t?e+(-1===e.indexOf("?")?"?":"&")+`id=${t}`:e}async _createTransport(e,t,n,r){let o=this._createConnectUrl(e,n.connectionToken);if(this._isITransport(t))return this._logger.log(st.Debug,"Connection was provided an instance of ITransport, using that directly."),this.transport=t,await this._startTransport(o,r),void(this.connectionId=n.connectionId);const i=[],s=n.availableTransports||[];let a=n;for(const n of s){const s=this._resolveTransportOrError(n,t,r);if(s instanceof Error)i.push(`${n.transport} failed:`),i.push(s);else if(this._isITransport(s)){if(this.transport=s,!a){try{a=await this._getNegotiationResponse(e)}catch(e){return Promise.reject(e)}o=this._createConnectUrl(e,a.connectionToken)}try{return await this._startTransport(o,r),void(this.connectionId=a.connectionId)}catch(e){if(this._logger.log(st.Error,`Failed to start the transport '${n.transport}': ${e}`),a=void 0,i.push(new tt(`${n.transport} failed: ${e}`,at[n.transport])),"Connecting"!==this._connectionState){const e="Failed to select transport before stop() was called.";return this._logger.log(st.Debug,e),Promise.reject(new Qe(e))}}}}return i.length>0?Promise.reject(new rt(`Unable to connect to the server with any of the available transports. ${i.join(" ")}`,i)):Promise.reject(new Error("None of the transports supported by the client are supported by the server."))}_constructTransport(e){switch(e){case at.WebSockets:if(!this._options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new Ut(this._httpClient,this._accessTokenFactory,this._logger,this._options.logMessageContent,this._options.WebSocket,this._options.headers||{});case at.ServerSentEvents:if(!this._options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new Pt(this._httpClient,this._accessTokenFactory,this._logger,this._options);case at.LongPolling:return new Rt(this._httpClient,this._accessTokenFactory,this._logger,this._options);default:throw new Error(`Unknown transport: ${e}.`)}}_startTransport(e,t){return this.transport.onreceive=this.onreceive,this.transport.onclose=e=>this._stopConnection(e),this.transport.connect(e,t)}_resolveTransportOrError(e,t,n){const r=at[e.transport];if(null==r)return this._logger.log(st.Debug,`Skipping transport '${e.transport}' because it is not supported by this client.`),new Error(`Skipping transport '${e.transport}' because it is not supported by this client.`);if(!function(e,t){return!e||0!=(t&e)}(t,r))return this._logger.log(st.Debug,`Skipping transport '${at[r]}' because it was disabled by the client.`),new et(`'${at[r]}' is disabled by the client.`,r);if(!(e.transferFormats.map((e=>ct[e])).indexOf(n)>=0))return this._logger.log(st.Debug,`Skipping transport '${at[r]}' because it does not support the requested transfer format '${ct[n]}'.`),new Error(`'${at[r]}' does not support ${ct[n]}.`);if(r===at.WebSockets&&!this._options.WebSocket||r===at.ServerSentEvents&&!this._options.EventSource)return this._logger.log(st.Debug,`Skipping transport '${at[r]}' because it is not supported in your environment.'`),new Ze(`'${at[r]}' is not supported in your environment.`,r);this._logger.log(st.Debug,`Selecting transport '${at[r]}'.`);try{return this._constructTransport(r)}catch(e){return e}}_isITransport(e){return e&&"object"==typeof e&&"connect"in e}_stopConnection(e){if(this._logger.log(st.Debug,`HttpConnection.stopConnection(${e}) called while in state ${this._connectionState}.`),this.transport=void 0,e=this._stopError||e,this._stopError=void 0,"Disconnected"!==this._connectionState){if("Connecting"===this._connectionState)throw this._logger.log(st.Warning,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is still in the connecting state.`),new Error(`HttpConnection.stopConnection(${e}) was called while the connection is still in the connecting state.`);if("Disconnecting"===this._connectionState&&this._stopPromiseResolver(),e?this._logger.log(st.Error,`Connection disconnected with error '${e}'.`):this._logger.log(st.Information,"Connection disconnected."),this._sendQueue&&(this._sendQueue.stop().catch((e=>{this._logger.log(st.Error,`TransportSendQueue.stop() threw error '${e}'.`)})),this._sendQueue=void 0),this.connectionId=void 0,this._connectionState="Disconnected",this._connectionStarted){this._connectionStarted=!1;try{this.onclose&&this.onclose(e)}catch(t){this._logger.log(st.Error,`HttpConnection.onclose(${e}) threw error '${t}'.`)}}}else this._logger.log(st.Debug,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is already in the disconnected state.`)}_resolveUrl(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!pt.isBrowser)throw new Error(`Cannot resolve '${e}'.`);const t=window.document.createElement("a");return t.href=e,this._logger.log(st.Information,`Normalizing '${e}' to '${t.href}'.`),t.href}_resolveNegotiateUrl(e){const t=e.indexOf("?");let n=e.substring(0,-1===t?e.length:t);return"/"!==n[n.length-1]&&(n+="/"),n+="negotiate",n+=-1===t?"":e.substring(t),-1===n.indexOf("negotiateVersion")&&(n+=-1===t?"?":"&",n+="negotiateVersion="+this._negotiateVersion),n}}class Nt{constructor(e){this._transport=e,this._buffer=[],this._executing=!0,this._sendBufferedData=new $t,this._transportResult=new $t,this._sendLoopPromise=this._sendLoop()}send(e){return this._bufferData(e),this._transportResult||(this._transportResult=new $t),this._transportResult.promise}stop(){return this._executing=!1,this._sendBufferedData.resolve(),this._sendLoopPromise}_bufferData(e){if(this._buffer.length&&typeof this._buffer[0]!=typeof e)throw new Error(`Expected data to be of type ${typeof this._buffer} but was of type ${typeof e}`);this._buffer.push(e),this._sendBufferedData.resolve()}async _sendLoop(){for(;;){if(await this._sendBufferedData.promise,!this._executing){this._transportResult&&this._transportResult.reject("Connection stopped.");break}this._sendBufferedData=new $t;const e=this._transportResult;this._transportResult=void 0;const t="string"==typeof this._buffer[0]?this._buffer.join(""):Nt._concatBuffers(this._buffer);this._buffer.length=0;try{await this._transport.send(t),e.resolve()}catch(t){e.reject(t)}}}static _concatBuffers(e){const t=e.map((e=>e.byteLength)).reduce(((e,t)=>e+t)),n=new Uint8Array(t);let r=0;for(const t of e)n.set(new Uint8Array(t),r),r+=t.byteLength;return n.buffer}}class $t{constructor(){this.promise=new Promise(((e,t)=>[this._resolver,this._rejecter]=[e,t]))}resolve(){this._resolver()}reject(e){this._rejecter(e)}}class Lt{static write(e){return`${e}${Lt.RecordSeparator}`}static parse(e){if(e[e.length-1]!==Lt.RecordSeparator)throw new Error("Message is incomplete.");const t=e.split(Lt.RecordSeparator);return t.pop(),t}}Lt.RecordSeparatorCode=30,Lt.RecordSeparator=String.fromCharCode(Lt.RecordSeparatorCode);class Bt{writeHandshakeRequest(e){return Lt.write(JSON.stringify(e))}parseHandshakeResponse(e){let t,n;if(gt(e)){const r=new Uint8Array(e),o=r.indexOf(Lt.RecordSeparatorCode);if(-1===o)throw new Error("Message is incomplete.");const i=o+1;t=String.fromCharCode.apply(null,Array.prototype.slice.call(r.slice(0,i))),n=r.byteLength>i?r.slice(i).buffer:null}else{const r=e,o=r.indexOf(Lt.RecordSeparator);if(-1===o)throw new Error("Message is incomplete.");const i=o+1;t=r.substring(0,i),n=r.length>i?r.substring(i):null}const r=Lt.parse(t),o=JSON.parse(r[0]);if(o.type)throw new Error("Expected a handshake response from the server.");return[n,o]}}!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close"}(lt||(lt={}));class Mt{constructor(){this.observers=[]}next(e){for(const t of this.observers)t.next(e)}error(e){for(const t of this.observers)t.error&&t.error(e)}complete(){for(const e of this.observers)e.complete&&e.complete()}subscribe(e){return this.observers.push(e),new yt(this,e)}}!function(e){e.Disconnected="Disconnected",e.Connecting="Connecting",e.Connected="Connected",e.Disconnecting="Disconnecting",e.Reconnecting="Reconnecting"}(ht||(ht={}));class Ot{constructor(e,t,n,r){this._nextKeepAlive=0,this._freezeEventListener=()=>{this._logger.log(st.Warning,"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://docs.microsoft.com/aspnet/core/signalr/javascript-client#bsleep")},dt.isRequired(e,"connection"),dt.isRequired(t,"logger"),dt.isRequired(n,"protocol"),this.serverTimeoutInMilliseconds=3e4,this.keepAliveIntervalInMilliseconds=15e3,this._logger=t,this._protocol=n,this.connection=e,this._reconnectPolicy=r,this._handshakeProtocol=new Bt,this.connection.onreceive=e=>this._processIncomingData(e),this.connection.onclose=e=>this._connectionClosed(e),this._callbacks={},this._methods={},this._closedCallbacks=[],this._reconnectingCallbacks=[],this._reconnectedCallbacks=[],this._invocationId=0,this._receivedHandshakeResponse=!1,this._connectionState=ht.Disconnected,this._connectionStarted=!1,this._cachedPingMessage=this._protocol.writeMessage({type:lt.Ping})}static create(e,t,n,r){return new Ot(e,t,n,r)}get state(){return this._connectionState}get connectionId(){return this.connection&&this.connection.connectionId||null}get baseUrl(){return this.connection.baseUrl||""}set baseUrl(e){if(this._connectionState!==ht.Disconnected&&this._connectionState!==ht.Reconnecting)throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url.");if(!e)throw new Error("The HubConnection url must be a valid url.");this.connection.baseUrl=e}start(){return this._startPromise=this._startWithStateTransitions(),this._startPromise}async _startWithStateTransitions(){if(this._connectionState!==ht.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this._connectionState=ht.Connecting,this._logger.log(st.Debug,"Starting HubConnection.");try{await this._startInternal(),pt.isBrowser&&window.document.addEventListener("freeze",this._freezeEventListener),this._connectionState=ht.Connected,this._connectionStarted=!0,this._logger.log(st.Debug,"HubConnection connected successfully.")}catch(e){return this._connectionState=ht.Disconnected,this._logger.log(st.Debug,`HubConnection failed to start successfully because of error '${e}'.`),Promise.reject(e)}}async _startInternal(){this._stopDuringStartError=void 0,this._receivedHandshakeResponse=!1;const e=new Promise(((e,t)=>{this._handshakeResolver=e,this._handshakeRejecter=t}));await this.connection.start(this._protocol.transferFormat);try{const t={protocol:this._protocol.name,version:this._protocol.version};if(this._logger.log(st.Debug,"Sending handshake request."),await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(t)),this._logger.log(st.Information,`Using HubProtocol '${this._protocol.name}'.`),this._cleanupTimeout(),this._resetTimeoutPeriod(),this._resetKeepAliveInterval(),await e,this._stopDuringStartError)throw this._stopDuringStartError}catch(e){throw this._logger.log(st.Debug,`Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`),this._cleanupTimeout(),this._cleanupPingTimer(),await this.connection.stop(e),e}}async stop(){const e=this._startPromise;this._stopPromise=this._stopInternal(),await this._stopPromise;try{await e}catch(e){}}_stopInternal(e){return this._connectionState===ht.Disconnected?(this._logger.log(st.Debug,`Call to HubConnection.stop(${e}) ignored because it is already in the disconnected state.`),Promise.resolve()):this._connectionState===ht.Disconnecting?(this._logger.log(st.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState=ht.Disconnecting,this._logger.log(st.Debug,"Stopping HubConnection."),this._reconnectDelayHandle?(this._logger.log(st.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this._reconnectDelayHandle),this._reconnectDelayHandle=void 0,this._completeClose(),Promise.resolve()):(this._cleanupTimeout(),this._cleanupPingTimer(),this._stopDuringStartError=e||new Qe("The connection was stopped before the hub handshake could complete."),this.connection.stop(e)))}stream(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createStreamInvocation(e,t,r);let i;const s=new Mt;return s.cancelCallback=()=>{const e=this._createCancelInvocation(o.invocationId);return delete this._callbacks[o.invocationId],i.then((()=>this._sendWithProtocol(e)))},this._callbacks[o.invocationId]=(e,t)=>{t?s.error(t):e&&(e.type===lt.Completion?e.error?s.error(new Error(e.error)):s.complete():s.next(e.item))},i=this._sendWithProtocol(o).catch((e=>{s.error(e),delete this._callbacks[o.invocationId]})),this._launchStreams(n,i),s}_sendMessage(e){return this._resetKeepAliveInterval(),this.connection.send(e)}_sendWithProtocol(e){return this._sendMessage(this._protocol.writeMessage(e))}send(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._sendWithProtocol(this._createInvocation(e,t,!0,r));return this._launchStreams(n,o),o}invoke(e,...t){const[n,r]=this._replaceStreamingParams(t),o=this._createInvocation(e,t,!1,r);return new Promise(((e,t)=>{this._callbacks[o.invocationId]=(n,r)=>{r?t(r):n&&(n.type===lt.Completion?n.error?t(new Error(n.error)):e(n.result):t(new Error(`Unexpected message type: ${n.type}`)))};const r=this._sendWithProtocol(o).catch((e=>{t(e),delete this._callbacks[o.invocationId]}));this._launchStreams(n,r)}))}on(e,t){e&&t&&(e=e.toLowerCase(),this._methods[e]||(this._methods[e]=[]),-1===this._methods[e].indexOf(t)&&this._methods[e].push(t))}off(e,t){if(!e)return;e=e.toLowerCase();const n=this._methods[e];if(n)if(t){const r=n.indexOf(t);-1!==r&&(n.splice(r,1),0===n.length&&delete this._methods[e])}else delete this._methods[e]}onclose(e){e&&this._closedCallbacks.push(e)}onreconnecting(e){e&&this._reconnectingCallbacks.push(e)}onreconnected(e){e&&this._reconnectedCallbacks.push(e)}_processIncomingData(e){if(this._cleanupTimeout(),this._receivedHandshakeResponse||(e=this._processHandshakeResponse(e),this._receivedHandshakeResponse=!0),e){const t=this._protocol.parseMessages(e,this._logger);for(const e of t)switch(e.type){case lt.Invocation:this._invokeClientMethod(e);break;case lt.StreamItem:case lt.Completion:{const t=this._callbacks[e.invocationId];if(t){e.type===lt.Completion&&delete this._callbacks[e.invocationId];try{t(e)}catch(e){this._logger.log(st.Error,`Stream callback threw error: ${St(e)}`)}}break}case lt.Ping:break;case lt.Close:{this._logger.log(st.Information,"Close message received from server.");const t=e.error?new Error("Server returned an error on close: "+e.error):void 0;!0===e.allowReconnect?this.connection.stop(t):this._stopPromise=this._stopInternal(t);break}default:this._logger.log(st.Warning,`Invalid message type: ${e.type}.`)}}this._resetTimeoutPeriod()}_processHandshakeResponse(e){let t,n;try{[n,t]=this._handshakeProtocol.parseHandshakeResponse(e)}catch(e){const t="Error parsing handshake response: "+e;this._logger.log(st.Error,t);const n=new Error(t);throw this._handshakeRejecter(n),n}if(t.error){const e="Server returned handshake error: "+t.error;this._logger.log(st.Error,e);const n=new Error(e);throw this._handshakeRejecter(n),n}return this._logger.log(st.Debug,"Server handshake complete."),this._handshakeResolver(),n}_resetKeepAliveInterval(){this.connection.features.inherentKeepAlive||(this._nextKeepAlive=(new Date).getTime()+this.keepAliveIntervalInMilliseconds,this._cleanupPingTimer())}_resetTimeoutPeriod(){if(!(this.connection.features&&this.connection.features.inherentKeepAlive||(this._timeoutHandle=setTimeout((()=>this.serverTimeout()),this.serverTimeoutInMilliseconds),void 0!==this._pingServerHandle))){let e=this._nextKeepAlive-(new Date).getTime();e<0&&(e=0),this._pingServerHandle=setTimeout((async()=>{if(this._connectionState===ht.Connected)try{await this._sendMessage(this._cachedPingMessage)}catch{this._cleanupPingTimer()}}),e)}}serverTimeout(){this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."))}async _invokeClientMethod(e){const t=e.target.toLowerCase(),n=this._methods[t];if(!n)return this._logger.log(st.Warning,`No client method with the name '${t}' found.`),void(e.invocationId&&(this._logger.log(st.Warning,`No result given for '${t}' method and invocation ID '${e.invocationId}'.`),await this._sendWithProtocol(this._createCompletionMessage(e.invocationId,"Client didn't provide a result.",null))));const r=n.slice(),o=!!e.invocationId;let i,s,a;for(const n of r)try{const r=i;i=await n.apply(this,e.arguments),o&&i&&r&&(this._logger.log(st.Error,`Multiple results provided for '${t}'. Sending error to server.`),a=this._createCompletionMessage(e.invocationId,"Client provided multiple results.",null)),s=void 0}catch(e){s=e,this._logger.log(st.Error,`A callback for the method '${t}' threw error '${e}'.`)}a?await this._sendWithProtocol(a):o?(s?a=this._createCompletionMessage(e.invocationId,`${s}`,null):void 0!==i?a=this._createCompletionMessage(e.invocationId,null,i):(this._logger.log(st.Warning,`No result given for '${t}' method and invocation ID '${e.invocationId}'.`),a=this._createCompletionMessage(e.invocationId,"Client didn't provide a result.",null)),await this._sendWithProtocol(a)):i&&this._logger.log(st.Error,`Result given for '${t}' method but server is not expecting a result.`)}_connectionClosed(e){this._logger.log(st.Debug,`HubConnection.connectionClosed(${e}) called while in state ${this._connectionState}.`),this._stopDuringStartError=this._stopDuringStartError||e||new Qe("The underlying connection was closed before the hub handshake could complete."),this._handshakeResolver&&this._handshakeResolver(),this._cancelCallbacksWithError(e||new Error("Invocation canceled due to the underlying connection being closed.")),this._cleanupTimeout(),this._cleanupPingTimer(),this._connectionState===ht.Disconnecting?this._completeClose(e):this._connectionState===ht.Connected&&this._reconnectPolicy?this._reconnect(e):this._connectionState===ht.Connected&&this._completeClose(e)}_completeClose(e){if(this._connectionStarted){this._connectionState=ht.Disconnected,this._connectionStarted=!1,pt.isBrowser&&window.document.removeEventListener("freeze",this._freezeEventListener);try{this._closedCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(st.Error,`An onclose callback called with error '${e}' threw error '${t}'.`)}}}async _reconnect(e){const t=Date.now();let n=0,r=void 0!==e?e:new Error("Attempting to reconnect due to a unknown error."),o=this._getNextRetryDelay(n++,0,r);if(null===o)return this._logger.log(st.Debug,"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."),void this._completeClose(e);if(this._connectionState=ht.Reconnecting,e?this._logger.log(st.Information,`Connection reconnecting because of error '${e}'.`):this._logger.log(st.Information,"Connection reconnecting."),0!==this._reconnectingCallbacks.length){try{this._reconnectingCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(st.Error,`An onreconnecting callback called with error '${e}' threw error '${t}'.`)}if(this._connectionState!==ht.Reconnecting)return void this._logger.log(st.Debug,"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.")}for(;null!==o;){if(this._logger.log(st.Information,`Reconnect attempt number ${n} will start in ${o} ms.`),await new Promise((e=>{this._reconnectDelayHandle=setTimeout(e,o)})),this._reconnectDelayHandle=void 0,this._connectionState!==ht.Reconnecting)return void this._logger.log(st.Debug,"Connection left the reconnecting state during reconnect delay. Done reconnecting.");try{if(await this._startInternal(),this._connectionState=ht.Connected,this._logger.log(st.Information,"HubConnection reconnected successfully."),0!==this._reconnectedCallbacks.length)try{this._reconnectedCallbacks.forEach((e=>e.apply(this,[this.connection.connectionId])))}catch(e){this._logger.log(st.Error,`An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`)}return}catch(e){if(this._logger.log(st.Information,`Reconnect attempt failed because of error '${e}'.`),this._connectionState!==ht.Reconnecting)return this._logger.log(st.Debug,`Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`),void(this._connectionState===ht.Disconnecting&&this._completeClose());r=e instanceof Error?e:new Error(e.toString()),o=this._getNextRetryDelay(n++,Date.now()-t,r)}}this._logger.log(st.Information,`Reconnect retries have been exhausted after ${Date.now()-t} ms and ${n} failed attempts. Connection disconnecting.`),this._completeClose()}_getNextRetryDelay(e,t,n){try{return this._reconnectPolicy.nextRetryDelayInMilliseconds({elapsedMilliseconds:t,previousRetryCount:e,retryReason:n})}catch(n){return this._logger.log(st.Error,`IRetryPolicy.nextRetryDelayInMilliseconds(${e}, ${t}) threw error '${n}'.`),null}}_cancelCallbacksWithError(e){const t=this._callbacks;this._callbacks={},Object.keys(t).forEach((n=>{const r=t[n];try{r(null,e)}catch(t){this._logger.log(st.Error,`Stream 'error' callback called with '${e}' threw error: ${St(t)}`)}}))}_cleanupPingTimer(){this._pingServerHandle&&(clearTimeout(this._pingServerHandle),this._pingServerHandle=void 0)}_cleanupTimeout(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}_createInvocation(e,t,n,r){if(n)return 0!==r.length?{arguments:t,streamIds:r,target:e,type:lt.Invocation}:{arguments:t,target:e,type:lt.Invocation};{const n=this._invocationId;return this._invocationId++,0!==r.length?{arguments:t,invocationId:n.toString(),streamIds:r,target:e,type:lt.Invocation}:{arguments:t,invocationId:n.toString(),target:e,type:lt.Invocation}}}_launchStreams(e,t){if(0!==e.length){t||(t=Promise.resolve());for(const n in e)e[n].subscribe({complete:()=>{t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n))))},error:e=>{let r;r=e instanceof Error?e.message:e&&e.toString?e.toString():"Unknown error",t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n,r))))},next:e=>{t=t.then((()=>this._sendWithProtocol(this._createStreamItemMessage(n,e))))}})}}_replaceStreamingParams(e){const t=[],n=[];for(let r=0;r<e.length;r++){const o=e[r];if(this._isObservable(o)){const i=this._invocationId;this._invocationId++,t[i]=o,n.push(i.toString()),e.splice(r,1)}}return[t,n]}_isObservable(e){return e&&e.subscribe&&"function"==typeof e.subscribe}_createStreamInvocation(e,t,n){const r=this._invocationId;return this._invocationId++,0!==n.length?{arguments:t,invocationId:r.toString(),streamIds:n,target:e,type:lt.StreamInvocation}:{arguments:t,invocationId:r.toString(),target:e,type:lt.StreamInvocation}}_createCancelInvocation(e){return{invocationId:e,type:lt.CancelInvocation}}_createStreamItemMessage(e,t){return{invocationId:e,item:t,type:lt.StreamItem}}_createCompletionMessage(e,t,n){return t?{error:t,invocationId:e,type:lt.Completion}:{invocationId:e,result:n,type:lt.Completion}}}class Ft{constructor(){this.name="json",this.version=1,this.transferFormat=ct.Text}parseMessages(e,t){if("string"!=typeof e)throw new Error("Invalid input for JSON hub protocol. Expected a string.");if(!e)return[];null===t&&(t=ut.instance);const n=Lt.parse(e),r=[];for(const e of n){const n=JSON.parse(e);if("number"!=typeof n.type)throw new Error("Invalid payload.");switch(n.type){case lt.Invocation:this._isInvocationMessage(n);break;case lt.StreamItem:this._isStreamItemMessage(n);break;case lt.Completion:this._isCompletionMessage(n);break;case lt.Ping:case lt.Close:break;default:t.log(st.Information,"Unknown message type '"+n.type+"' ignored.");continue}r.push(n)}return r}writeMessage(e){return Lt.write(JSON.stringify(e))}_isInvocationMessage(e){this._assertNotEmptyString(e.target,"Invalid payload for Invocation message."),void 0!==e.invocationId&&this._assertNotEmptyString(e.invocationId,"Invalid payload for Invocation message.")}_isStreamItemMessage(e){if(this._assertNotEmptyString(e.invocationId,"Invalid payload for StreamItem message."),void 0===e.item)throw new Error("Invalid payload for StreamItem message.")}_isCompletionMessage(e){if(e.result&&e.error)throw new Error("Invalid payload for Completion message.");!e.result&&e.error&&this._assertNotEmptyString(e.error,"Invalid payload for Completion message."),this._assertNotEmptyString(e.invocationId,"Invalid payload for Completion message.")}_assertNotEmptyString(e,t){if("string"!=typeof e||""===e)throw new Error(t)}}const jt={trace:st.Trace,debug:st.Debug,info:st.Information,information:st.Information,warn:st.Warning,warning:st.Warning,error:st.Error,critical:st.Critical,none:st.None};class Ht{configureLogging(e){if(dt.isRequired(e,"logging"),void 0!==e.log)this.logger=e;else if("string"==typeof e){const t=function(e){const t=jt[e.toLowerCase()];if(void 0!==t)return t;throw new Error(`Unknown log level: ${e}`)}(e);this.logger=new wt(t)}else this.logger=new wt(e);return this}withUrl(e,t){return dt.isRequired(e,"url"),dt.isNotEmpty(e,"url"),this.url=e,this.httpConnectionOptions="object"==typeof t?{...this.httpConnectionOptions,...t}:{...this.httpConnectionOptions,transport:t},this}withHubProtocol(e){return dt.isRequired(e,"protocol"),this.protocol=e,this}withAutomaticReconnect(e){if(this.reconnectPolicy)throw new Error("A reconnectPolicy has already been set.");return e?Array.isArray(e)?this.reconnectPolicy=new Xe(e):this.reconnectPolicy=e:this.reconnectPolicy=new Xe,this}build(){const e=this.httpConnectionOptions||{};if(void 0===e.logger&&(e.logger=this.logger),!this.url)throw new Error("The 'HubConnectionBuilder.withUrl' method must be called before building the connection.");const t=new At(this.url,e);return Ot.create(t,this.logger||ut.instance,this.protocol||new Ft,this.reconnectPolicy)}}var Wt=4294967295;function zt(e,t,n){var r=Math.floor(n/4294967296),o=n;e.setUint32(t,r),e.setUint32(t+4,o)}function Jt(e,t){return 4294967296*e.getInt32(t)+e.getUint32(t+4)}var qt=("undefined"==typeof process||"never"!==process.env.TEXT_ENCODING)&&"undefined"!=typeof TextEncoder&&"undefined"!=typeof TextDecoder;function Vt(e){for(var t=e.length,n=0,r=0;r<t;){var o=e.charCodeAt(r++);if(0!=(4294967168&o))if(0==(4294965248&o))n+=2;else{if(o>=55296&&o<=56319&&r<t){var i=e.charCodeAt(r);56320==(64512&i)&&(++r,o=((1023&o)<<10)+(1023&i)+65536)}n+=0==(4294901760&o)?3:4}else n++}return n}var Kt=qt?new TextEncoder:void 0,Xt=qt?"undefined"!=typeof process&&"force"!==process.env.TEXT_ENCODING?200:0:Wt,Yt=(null==Kt?void 0:Kt.encodeInto)?function(e,t,n){Kt.encodeInto(e,t.subarray(n))}:function(e,t,n){t.set(Kt.encode(e),n)};function Gt(e,t,n){for(var r=t,o=r+n,i=[],s="";r<o;){var a=e[r++];if(0==(128&a))i.push(a);else if(192==(224&a)){var c=63&e[r++];i.push((31&a)<<6|c)}else if(224==(240&a)){c=63&e[r++];var l=63&e[r++];i.push((31&a)<<12|c<<6|l)}else if(240==(248&a)){var h=(7&a)<<18|(c=63&e[r++])<<12|(l=63&e[r++])<<6|63&e[r++];h>65535&&(h-=65536,i.push(h>>>10&1023|55296),h=56320|1023&h),i.push(h)}else i.push(a);i.length>=4096&&(s+=String.fromCharCode.apply(String,i),i.length=0)}return i.length>0&&(s+=String.fromCharCode.apply(String,i)),s}var Qt,Zt=qt?new TextDecoder:null,en=qt?"undefined"!=typeof process&&"force"!==process.env.TEXT_DECODER?200:0:Wt,tn=function(e,t){this.type=e,this.data=t},nn=(Qt=function(e,t){return Qt=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},Qt(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}Qt(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),rn=function(e){function t(n){var r=e.call(this,n)||this,o=Object.create(t.prototype);return Object.setPrototypeOf(r,o),Object.defineProperty(r,"name",{configurable:!0,enumerable:!1,value:t.name}),r}return nn(t,e),t}(Error),on={type:-1,encode:function(e){var t,n,r,o;return e instanceof Date?function(e){var t,n=e.sec,r=e.nsec;if(n>=0&&r>=0&&n<=17179869183){if(0===r&&n<=4294967295){var o=new Uint8Array(4);return(t=new DataView(o.buffer)).setUint32(0,n),o}var i=n/4294967296,s=4294967295&n;return o=new Uint8Array(8),(t=new DataView(o.buffer)).setUint32(0,r<<2|3&i),t.setUint32(4,s),o}return o=new Uint8Array(12),(t=new DataView(o.buffer)).setUint32(0,r),zt(t,4,n),o}((r=1e6*((t=e.getTime())-1e3*(n=Math.floor(t/1e3))),{sec:n+(o=Math.floor(r/1e9)),nsec:r-1e9*o})):null},decode:function(e){var t=function(e){var t=new DataView(e.buffer,e.byteOffset,e.byteLength);switch(e.byteLength){case 4:return{sec:t.getUint32(0),nsec:0};case 8:var n=t.getUint32(0);return{sec:4294967296*(3&n)+t.getUint32(4),nsec:n>>>2};case 12:return{sec:Jt(t,4),nsec:t.getUint32(0)};default:throw new rn("Unrecognized data size for timestamp (expected 4, 8, or 12): "+e.length)}}(e);return new Date(1e3*t.sec+t.nsec/1e6)}},sn=function(){function e(){this.builtInEncoders=[],this.builtInDecoders=[],this.encoders=[],this.decoders=[],this.register(on)}return e.prototype.register=function(e){var t=e.type,n=e.encode,r=e.decode;if(t>=0)this.encoders[t]=n,this.decoders[t]=r;else{var o=1+t;this.builtInEncoders[o]=n,this.builtInDecoders[o]=r}},e.prototype.tryToEncode=function(e,t){for(var n=0;n<this.builtInEncoders.length;n++)if(null!=(r=this.builtInEncoders[n])&&null!=(o=r(e,t)))return new tn(-1-n,o);for(n=0;n<this.encoders.length;n++){var r,o;if(null!=(r=this.encoders[n])&&null!=(o=r(e,t)))return new tn(n,o)}return e instanceof tn?e:null},e.prototype.decode=function(e,t,n){var r=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return r?r(e,t,n):new tn(t,e)},e.defaultCodec=new e,e}();function an(e){return e instanceof Uint8Array?e:ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):e instanceof ArrayBuffer?new Uint8Array(e):Uint8Array.from(e)}var cn=function(){function e(e,t,n,r,o,i,s,a){void 0===e&&(e=sn.defaultCodec),void 0===t&&(t=void 0),void 0===n&&(n=100),void 0===r&&(r=2048),void 0===o&&(o=!1),void 0===i&&(i=!1),void 0===s&&(s=!1),void 0===a&&(a=!1),this.extensionCodec=e,this.context=t,this.maxDepth=n,this.initialBufferSize=r,this.sortKeys=o,this.forceFloat32=i,this.ignoreUndefined=s,this.forceIntegerToFloat=a,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}return e.prototype.getUint8Array=function(){return this.bytes.subarray(0,this.pos)},e.prototype.reinitializeState=function(){this.pos=0},e.prototype.encode=function(e){return this.reinitializeState(),this.doEncode(e,1),this.getUint8Array()},e.prototype.doEncode=function(e,t){if(t>this.maxDepth)throw new Error("Too deep objects in depth "+t);null==e?this.encodeNil():"boolean"==typeof e?this.encodeBoolean(e):"number"==typeof e?this.encodeNumber(e):"string"==typeof e?this.encodeString(e):this.encodeObject(e,t)},e.prototype.ensureBufferSizeToWrite=function(e){var t=this.pos+e;this.view.byteLength<t&&this.resizeBuffer(2*t)},e.prototype.resizeBuffer=function(e){var t=new ArrayBuffer(e),n=new Uint8Array(t),r=new DataView(t);n.set(this.bytes),this.view=r,this.bytes=n},e.prototype.encodeNil=function(){this.writeU8(192)},e.prototype.encodeBoolean=function(e){!1===e?this.writeU8(194):this.writeU8(195)},e.prototype.encodeNumber=function(e){Number.isSafeInteger(e)&&!this.forceIntegerToFloat?e>=0?e<128?this.writeU8(e):e<256?(this.writeU8(204),this.writeU8(e)):e<65536?(this.writeU8(205),this.writeU16(e)):e<4294967296?(this.writeU8(206),this.writeU32(e)):(this.writeU8(207),this.writeU64(e)):e>=-32?this.writeU8(224|e+32):e>=-128?(this.writeU8(208),this.writeI8(e)):e>=-32768?(this.writeU8(209),this.writeI16(e)):e>=-2147483648?(this.writeU8(210),this.writeI32(e)):(this.writeU8(211),this.writeI64(e)):this.forceFloat32?(this.writeU8(202),this.writeF32(e)):(this.writeU8(203),this.writeF64(e))},e.prototype.writeStringHeader=function(e){if(e<32)this.writeU8(160+e);else if(e<256)this.writeU8(217),this.writeU8(e);else if(e<65536)this.writeU8(218),this.writeU16(e);else{if(!(e<4294967296))throw new Error("Too long string: "+e+" bytes in UTF-8");this.writeU8(219),this.writeU32(e)}},e.prototype.encodeString=function(e){if(e.length>Xt){var t=Vt(e);this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),Yt(e,this.bytes,this.pos),this.pos+=t}else t=Vt(e),this.ensureBufferSizeToWrite(5+t),this.writeStringHeader(t),function(e,t,n){for(var r=e.length,o=n,i=0;i<r;){var s=e.charCodeAt(i++);if(0!=(4294967168&s)){if(0==(4294965248&s))t[o++]=s>>6&31|192;else{if(s>=55296&&s<=56319&&i<r){var a=e.charCodeAt(i);56320==(64512&a)&&(++i,s=((1023&s)<<10)+(1023&a)+65536)}0==(4294901760&s)?(t[o++]=s>>12&15|224,t[o++]=s>>6&63|128):(t[o++]=s>>18&7|240,t[o++]=s>>12&63|128,t[o++]=s>>6&63|128)}t[o++]=63&s|128}else t[o++]=s}}(e,this.bytes,this.pos),this.pos+=t},e.prototype.encodeObject=function(e,t){var n=this.extensionCodec.tryToEncode(e,this.context);if(null!=n)this.encodeExtension(n);else if(Array.isArray(e))this.encodeArray(e,t);else if(ArrayBuffer.isView(e))this.encodeBinary(e);else{if("object"!=typeof e)throw new Error("Unrecognized object: "+Object.prototype.toString.apply(e));this.encodeMap(e,t)}},e.prototype.encodeBinary=function(e){var t=e.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else{if(!(t<4294967296))throw new Error("Too large binary: "+t);this.writeU8(198),this.writeU32(t)}var n=an(e);this.writeU8a(n)},e.prototype.encodeArray=function(e,t){var n=e.length;if(n<16)this.writeU8(144+n);else if(n<65536)this.writeU8(220),this.writeU16(n);else{if(!(n<4294967296))throw new Error("Too large array: "+n);this.writeU8(221),this.writeU32(n)}for(var r=0,o=e;r<o.length;r++){var i=o[r];this.doEncode(i,t+1)}},e.prototype.countWithoutUndefined=function(e,t){for(var n=0,r=0,o=t;r<o.length;r++)void 0!==e[o[r]]&&n++;return n},e.prototype.encodeMap=function(e,t){var n=Object.keys(e);this.sortKeys&&n.sort();var r=this.ignoreUndefined?this.countWithoutUndefined(e,n):n.length;if(r<16)this.writeU8(128+r);else if(r<65536)this.writeU8(222),this.writeU16(r);else{if(!(r<4294967296))throw new Error("Too large map object: "+r);this.writeU8(223),this.writeU32(r)}for(var o=0,i=n;o<i.length;o++){var s=i[o],a=e[s];this.ignoreUndefined&&void 0===a||(this.encodeString(s),this.doEncode(a,t+1))}},e.prototype.encodeExtension=function(e){var t=e.data.length;if(1===t)this.writeU8(212);else if(2===t)this.writeU8(213);else if(4===t)this.writeU8(214);else if(8===t)this.writeU8(215);else if(16===t)this.writeU8(216);else if(t<256)this.writeU8(199),this.writeU8(t);else if(t<65536)this.writeU8(200),this.writeU16(t);else{if(!(t<4294967296))throw new Error("Too large extension object: "+t);this.writeU8(201),this.writeU32(t)}this.writeI8(e.type),this.writeU8a(e.data)},e.prototype.writeU8=function(e){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,e),this.pos++},e.prototype.writeU8a=function(e){var t=e.length;this.ensureBufferSizeToWrite(t),this.bytes.set(e,this.pos),this.pos+=t},e.prototype.writeI8=function(e){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,e),this.pos++},e.prototype.writeU16=function(e){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,e),this.pos+=2},e.prototype.writeI16=function(e){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,e),this.pos+=2},e.prototype.writeU32=function(e){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,e),this.pos+=4},e.prototype.writeI32=function(e){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,e),this.pos+=4},e.prototype.writeF32=function(e){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,e),this.pos+=4},e.prototype.writeF64=function(e){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,e),this.pos+=8},e.prototype.writeU64=function(e){this.ensureBufferSizeToWrite(8),function(e,t,n){var r=n/4294967296,o=n;e.setUint32(t,r),e.setUint32(t+4,o)}(this.view,this.pos,e),this.pos+=8},e.prototype.writeI64=function(e){this.ensureBufferSizeToWrite(8),zt(this.view,this.pos,e),this.pos+=8},e}();function ln(e){return(e<0?"-":"")+"0x"+Math.abs(e).toString(16).padStart(2,"0")}var hn=function(){function e(e,t){void 0===e&&(e=16),void 0===t&&(t=16),this.maxKeyLength=e,this.maxLengthPerKey=t,this.hit=0,this.miss=0,this.caches=[];for(var n=0;n<this.maxKeyLength;n++)this.caches.push([])}return e.prototype.canBeCached=function(e){return e>0&&e<=this.maxKeyLength},e.prototype.find=function(e,t,n){e:for(var r=0,o=this.caches[n-1];r<o.length;r++){for(var i=o[r],s=i.bytes,a=0;a<n;a++)if(s[a]!==e[t+a])continue e;return i.str}return null},e.prototype.store=function(e,t){var n=this.caches[e.length-1],r={bytes:e,str:t};n.length>=this.maxLengthPerKey?n[Math.random()*n.length|0]=r:n.push(r)},e.prototype.decode=function(e,t,n){var r=this.find(e,t,n);if(null!=r)return this.hit++,r;this.miss++;var o=Gt(e,t,n),i=Uint8Array.prototype.slice.call(e,t,t+n);return this.store(i,o),o},e}(),un=function(e,t){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!((o=(o=s.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=t.call(e,s)}catch(e){i=[6,e],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}},dn=function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise((function(r,o){!function(e,t,n,r){Promise.resolve(r).then((function(t){e({value:t,done:n})}),t)}(r,o,(t=e[n](t)).done,t.value)}))}}},pn=function(e){return this instanceof pn?(this.v=e,this):new pn(e)},fn=function(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(e,t||[]),i=[];return r={},s("next"),s("throw"),s("return"),r[Symbol.asyncIterator]=function(){return this},r;function s(e){o[e]&&(r[e]=function(t){return new Promise((function(n,r){i.push([e,t,n,r])>1||a(e,t)}))})}function a(e,t){try{(n=o[e](t)).value instanceof pn?Promise.resolve(n.value.v).then(c,l):h(i[0][2],n)}catch(e){h(i[0][3],e)}var n}function c(e){a("next",e)}function l(e){a("throw",e)}function h(e,t){e(t),i.shift(),i.length&&a(i[0][0],i[0][1])}},gn=new DataView(new ArrayBuffer(0)),mn=new Uint8Array(gn.buffer),yn=function(){try{gn.getInt8(0)}catch(e){return e.constructor}throw new Error("never reached")}(),wn=new yn("Insufficient data"),vn=new hn,bn=function(){function e(e,t,n,r,o,i,s,a){void 0===e&&(e=sn.defaultCodec),void 0===t&&(t=void 0),void 0===n&&(n=Wt),void 0===r&&(r=Wt),void 0===o&&(o=Wt),void 0===i&&(i=Wt),void 0===s&&(s=Wt),void 0===a&&(a=vn),this.extensionCodec=e,this.context=t,this.maxStrLength=n,this.maxBinLength=r,this.maxArrayLength=o,this.maxMapLength=i,this.maxExtLength=s,this.keyDecoder=a,this.totalPos=0,this.pos=0,this.view=gn,this.bytes=mn,this.headByte=-1,this.stack=[]}return e.prototype.reinitializeState=function(){this.totalPos=0,this.headByte=-1,this.stack.length=0},e.prototype.setBuffer=function(e){this.bytes=an(e),this.view=function(e){if(e instanceof ArrayBuffer)return new DataView(e);var t=an(e);return new DataView(t.buffer,t.byteOffset,t.byteLength)}(this.bytes),this.pos=0},e.prototype.appendBuffer=function(e){if(-1!==this.headByte||this.hasRemaining(1)){var t=this.bytes.subarray(this.pos),n=an(e),r=new Uint8Array(t.length+n.length);r.set(t),r.set(n,t.length),this.setBuffer(r)}else this.setBuffer(e)},e.prototype.hasRemaining=function(e){return this.view.byteLength-this.pos>=e},e.prototype.createExtraByteError=function(e){var t=this.view,n=this.pos;return new RangeError("Extra "+(t.byteLength-n)+" of "+t.byteLength+" byte(s) found at buffer["+e+"]")},e.prototype.decode=function(e){this.reinitializeState(),this.setBuffer(e);var t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t},e.prototype.decodeMulti=function(e){return un(this,(function(t){switch(t.label){case 0:this.reinitializeState(),this.setBuffer(e),t.label=1;case 1:return this.hasRemaining(1)?[4,this.doDecodeSync()]:[3,3];case 2:return t.sent(),[3,1];case 3:return[2]}}))},e.prototype.decodeAsync=function(e){var t,n,r,o,i,s,a;return i=this,void 0,a=function(){var i,s,a,c,l,h,u,d;return un(this,(function(p){switch(p.label){case 0:i=!1,p.label=1;case 1:p.trys.push([1,6,7,12]),t=dn(e),p.label=2;case 2:return[4,t.next()];case 3:if((n=p.sent()).done)return[3,5];if(a=n.value,i)throw this.createExtraByteError(this.totalPos);this.appendBuffer(a);try{s=this.doDecodeSync(),i=!0}catch(e){if(!(e instanceof yn))throw e}this.totalPos+=this.pos,p.label=4;case 4:return[3,2];case 5:return[3,12];case 6:return c=p.sent(),r={error:c},[3,12];case 7:return p.trys.push([7,,10,11]),n&&!n.done&&(o=t.return)?[4,o.call(t)]:[3,9];case 8:p.sent(),p.label=9;case 9:return[3,11];case 10:if(r)throw r.error;return[7];case 11:return[7];case 12:if(i){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return[2,s]}throw h=(l=this).headByte,u=l.pos,d=l.totalPos,new RangeError("Insufficient data in parsing "+ln(h)+" at "+d+" ("+u+" in the current buffer)")}}))},new((s=void 0)||(s=Promise))((function(e,t){function n(e){try{o(a.next(e))}catch(e){t(e)}}function r(e){try{o(a.throw(e))}catch(e){t(e)}}function o(t){var o;t.done?e(t.value):(o=t.value,o instanceof s?o:new s((function(e){e(o)}))).then(n,r)}o((a=a.apply(i,[])).next())}))},e.prototype.decodeArrayStream=function(e){return this.decodeMultiAsync(e,!0)},e.prototype.decodeStream=function(e){return this.decodeMultiAsync(e,!1)},e.prototype.decodeMultiAsync=function(e,t){return fn(this,arguments,(function(){var n,r,o,i,s,a,c,l,h;return un(this,(function(u){switch(u.label){case 0:n=t,r=-1,u.label=1;case 1:u.trys.push([1,13,14,19]),o=dn(e),u.label=2;case 2:return[4,pn(o.next())];case 3:if((i=u.sent()).done)return[3,12];if(s=i.value,t&&0===r)throw this.createExtraByteError(this.totalPos);this.appendBuffer(s),n&&(r=this.readArraySize(),n=!1,this.complete()),u.label=4;case 4:u.trys.push([4,9,,10]),u.label=5;case 5:return[4,pn(this.doDecodeSync())];case 6:return[4,u.sent()];case 7:return u.sent(),0==--r?[3,8]:[3,5];case 8:return[3,10];case 9:if(!((a=u.sent())instanceof yn))throw a;return[3,10];case 10:this.totalPos+=this.pos,u.label=11;case 11:return[3,2];case 12:return[3,19];case 13:return c=u.sent(),l={error:c},[3,19];case 14:return u.trys.push([14,,17,18]),i&&!i.done&&(h=o.return)?[4,pn(h.call(o))]:[3,16];case 15:u.sent(),u.label=16;case 16:return[3,18];case 17:if(l)throw l.error;return[7];case 18:return[7];case 19:return[2]}}))}))},e.prototype.doDecodeSync=function(){e:for(;;){var e=this.readHeadByte(),t=void 0;if(e>=224)t=e-256;else if(e<192)if(e<128)t=e;else if(e<144){if(0!=(r=e-128)){this.pushMapState(r),this.complete();continue e}t={}}else if(e<160){if(0!=(r=e-144)){this.pushArrayState(r),this.complete();continue e}t=[]}else{var n=e-160;t=this.decodeUtf8String(n,0)}else if(192===e)t=null;else if(194===e)t=!1;else if(195===e)t=!0;else if(202===e)t=this.readF32();else if(203===e)t=this.readF64();else if(204===e)t=this.readU8();else if(205===e)t=this.readU16();else if(206===e)t=this.readU32();else if(207===e)t=this.readU64();else if(208===e)t=this.readI8();else if(209===e)t=this.readI16();else if(210===e)t=this.readI32();else if(211===e)t=this.readI64();else if(217===e)n=this.lookU8(),t=this.decodeUtf8String(n,1);else if(218===e)n=this.lookU16(),t=this.decodeUtf8String(n,2);else if(219===e)n=this.lookU32(),t=this.decodeUtf8String(n,4);else if(220===e){if(0!==(r=this.readU16())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(221===e){if(0!==(r=this.readU32())){this.pushArrayState(r),this.complete();continue e}t=[]}else if(222===e){if(0!==(r=this.readU16())){this.pushMapState(r),this.complete();continue e}t={}}else if(223===e){if(0!==(r=this.readU32())){this.pushMapState(r),this.complete();continue e}t={}}else if(196===e){var r=this.lookU8();t=this.decodeBinary(r,1)}else if(197===e)r=this.lookU16(),t=this.decodeBinary(r,2);else if(198===e)r=this.lookU32(),t=this.decodeBinary(r,4);else if(212===e)t=this.decodeExtension(1,0);else if(213===e)t=this.decodeExtension(2,0);else if(214===e)t=this.decodeExtension(4,0);else if(215===e)t=this.decodeExtension(8,0);else if(216===e)t=this.decodeExtension(16,0);else if(199===e)r=this.lookU8(),t=this.decodeExtension(r,1);else if(200===e)r=this.lookU16(),t=this.decodeExtension(r,2);else{if(201!==e)throw new rn("Unrecognized type byte: "+ln(e));r=this.lookU32(),t=this.decodeExtension(r,4)}this.complete();for(var o=this.stack;o.length>0;){var i=o[o.length-1];if(0===i.type){if(i.array[i.position]=t,i.position++,i.position!==i.size)continue e;o.pop(),t=i.array}else{if(1===i.type){if("string"!=(s=typeof t)&&"number"!==s)throw new rn("The type of key must be string or number but "+typeof t);if("__proto__"===t)throw new rn("The key __proto__ is not allowed");i.key=t,i.type=2;continue e}if(i.map[i.key]=t,i.readCount++,i.readCount!==i.size){i.key=null,i.type=1;continue e}o.pop(),t=i.map}}return t}var s},e.prototype.readHeadByte=function(){return-1===this.headByte&&(this.headByte=this.readU8()),this.headByte},e.prototype.complete=function(){this.headByte=-1},e.prototype.readArraySize=function(){var e=this.readHeadByte();switch(e){case 220:return this.readU16();case 221:return this.readU32();default:if(e<160)return e-144;throw new rn("Unrecognized array type byte: "+ln(e))}},e.prototype.pushMapState=function(e){if(e>this.maxMapLength)throw new rn("Max length exceeded: map length ("+e+") > maxMapLengthLength ("+this.maxMapLength+")");this.stack.push({type:1,size:e,key:null,readCount:0,map:{}})},e.prototype.pushArrayState=function(e){if(e>this.maxArrayLength)throw new rn("Max length exceeded: array length ("+e+") > maxArrayLength ("+this.maxArrayLength+")");this.stack.push({type:0,size:e,array:new Array(e),position:0})},e.prototype.decodeUtf8String=function(e,t){var n;if(e>this.maxStrLength)throw new rn("Max length exceeded: UTF-8 byte length ("+e+") > maxStrLength ("+this.maxStrLength+")");if(this.bytes.byteLength<this.pos+t+e)throw wn;var r,o=this.pos+t;return r=this.stateIsMapKey()&&(null===(n=this.keyDecoder)||void 0===n?void 0:n.canBeCached(e))?this.keyDecoder.decode(this.bytes,o,e):e>en?function(e,t,n){var r=e.subarray(t,t+n);return Zt.decode(r)}(this.bytes,o,e):Gt(this.bytes,o,e),this.pos+=t+e,r},e.prototype.stateIsMapKey=function(){return this.stack.length>0&&1===this.stack[this.stack.length-1].type},e.prototype.decodeBinary=function(e,t){if(e>this.maxBinLength)throw new rn("Max length exceeded: bin length ("+e+") > maxBinLength ("+this.maxBinLength+")");if(!this.hasRemaining(e+t))throw wn;var n=this.pos+t,r=this.bytes.subarray(n,n+e);return this.pos+=t+e,r},e.prototype.decodeExtension=function(e,t){if(e>this.maxExtLength)throw new rn("Max length exceeded: ext length ("+e+") > maxExtLength ("+this.maxExtLength+")");var n=this.view.getInt8(this.pos+t),r=this.decodeBinary(e,t+1);return this.extensionCodec.decode(r,n,this.context)},e.prototype.lookU8=function(){return this.view.getUint8(this.pos)},e.prototype.lookU16=function(){return this.view.getUint16(this.pos)},e.prototype.lookU32=function(){return this.view.getUint32(this.pos)},e.prototype.readU8=function(){var e=this.view.getUint8(this.pos);return this.pos++,e},e.prototype.readI8=function(){var e=this.view.getInt8(this.pos);return this.pos++,e},e.prototype.readU16=function(){var e=this.view.getUint16(this.pos);return this.pos+=2,e},e.prototype.readI16=function(){var e=this.view.getInt16(this.pos);return this.pos+=2,e},e.prototype.readU32=function(){var e=this.view.getUint32(this.pos);return this.pos+=4,e},e.prototype.readI32=function(){var e=this.view.getInt32(this.pos);return this.pos+=4,e},e.prototype.readU64=function(){var e,t,n=(e=this.view,t=this.pos,4294967296*e.getUint32(t)+e.getUint32(t+4));return this.pos+=8,n},e.prototype.readI64=function(){var e=Jt(this.view,this.pos);return this.pos+=8,e},e.prototype.readF32=function(){var e=this.view.getFloat32(this.pos);return this.pos+=4,e},e.prototype.readF64=function(){var e=this.view.getFloat64(this.pos);return this.pos+=8,e},e}();class _n{static write(e){let t=e.byteLength||e.length;const n=[];do{let e=127&t;t>>=7,t>0&&(e|=128),n.push(e)}while(t>0);t=e.byteLength||e.length;const r=new Uint8Array(n.length+t);return r.set(n,0),r.set(e,n.length),r.buffer}static parse(e){const t=[],n=new Uint8Array(e),r=[0,7,14,21,28];for(let o=0;o<e.byteLength;){let i,s=0,a=0;do{i=n[o+s],a|=(127&i)<<r[s],s++}while(s<Math.min(5,e.byteLength-o)&&0!=(128&i));if(0!=(128&i)&&s<5)throw new Error("Cannot read message size.");if(5===s&&i>7)throw new Error("Messages bigger than 2GB are not supported.");if(!(n.byteLength>=o+s+a))throw new Error("Incomplete message.");t.push(n.slice?n.slice(o+s,o+s+a):n.subarray(o+s,o+s+a)),o=o+s+a}return t}}const En=new Uint8Array([145,lt.Ping]);class Sn{constructor(e){this.name="messagepack",this.version=1,this.transferFormat=ct.Binary,this._errorResult=1,this._voidResult=2,this._nonVoidResult=3,e=e||{},this._encoder=new cn(e.extensionCodec,e.context,e.maxDepth,e.initialBufferSize,e.sortKeys,e.forceFloat32,e.ignoreUndefined,e.forceIntegerToFloat),this._decoder=new bn(e.extensionCodec,e.context,e.maxStrLength,e.maxBinLength,e.maxArrayLength,e.maxMapLength,e.maxExtLength)}parseMessages(e,t){if(!(n=e)||"undefined"==typeof ArrayBuffer||!(n instanceof ArrayBuffer||n.constructor&&"ArrayBuffer"===n.constructor.name))throw new Error("Invalid input for MessagePack hub protocol. Expected an ArrayBuffer.");var n;null===t&&(t=ut.instance);const r=_n.parse(e),o=[];for(const e of r){const n=this._parseMessage(e,t);n&&o.push(n)}return o}writeMessage(e){switch(e.type){case lt.Invocation:return this._writeInvocation(e);case lt.StreamInvocation:return this._writeStreamInvocation(e);case lt.StreamItem:return this._writeStreamItem(e);case lt.Completion:return this._writeCompletion(e);case lt.Ping:return _n.write(En);case lt.CancelInvocation:return this._writeCancelInvocation(e);default:throw new Error("Invalid message type.")}}_parseMessage(e,t){if(0===e.length)throw new Error("Invalid payload.");const n=this._decoder.decode(e);if(0===n.length||!(n instanceof Array))throw new Error("Invalid payload.");const r=n[0];switch(r){case lt.Invocation:return this._createInvocationMessage(this._readHeaders(n),n);case lt.StreamItem:return this._createStreamItemMessage(this._readHeaders(n),n);case lt.Completion:return this._createCompletionMessage(this._readHeaders(n),n);case lt.Ping:return this._createPingMessage(n);case lt.Close:return this._createCloseMessage(n);default:return t.log(st.Information,"Unknown message type '"+r+"' ignored."),null}}_createCloseMessage(e){if(e.length<2)throw new Error("Invalid payload for Close message.");return{allowReconnect:e.length>=3?e[2]:void 0,error:e[1],type:lt.Close}}_createPingMessage(e){if(e.length<1)throw new Error("Invalid payload for Ping message.");return{type:lt.Ping}}_createInvocationMessage(e,t){if(t.length<5)throw new Error("Invalid payload for Invocation message.");const n=t[2];return n?{arguments:t[4],headers:e,invocationId:n,streamIds:[],target:t[3],type:lt.Invocation}:{arguments:t[4],headers:e,streamIds:[],target:t[3],type:lt.Invocation}}_createStreamItemMessage(e,t){if(t.length<4)throw new Error("Invalid payload for StreamItem message.");return{headers:e,invocationId:t[2],item:t[3],type:lt.StreamItem}}_createCompletionMessage(e,t){if(t.length<4)throw new Error("Invalid payload for Completion message.");const n=t[3];if(n!==this._voidResult&&t.length<5)throw new Error("Invalid payload for Completion message.");let r,o;switch(n){case this._errorResult:r=t[4];break;case this._nonVoidResult:o=t[4]}return{error:r,headers:e,invocationId:t[2],result:o,type:lt.Completion}}_writeInvocation(e){let t;return t=e.streamIds?this._encoder.encode([lt.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments,e.streamIds]):this._encoder.encode([lt.Invocation,e.headers||{},e.invocationId||null,e.target,e.arguments]),_n.write(t.slice())}_writeStreamInvocation(e){let t;return t=e.streamIds?this._encoder.encode([lt.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments,e.streamIds]):this._encoder.encode([lt.StreamInvocation,e.headers||{},e.invocationId,e.target,e.arguments]),_n.write(t.slice())}_writeStreamItem(e){const t=this._encoder.encode([lt.StreamItem,e.headers||{},e.invocationId,e.item]);return _n.write(t.slice())}_writeCompletion(e){const t=e.error?this._errorResult:e.result?this._nonVoidResult:this._voidResult;let n;switch(t){case this._errorResult:n=this._encoder.encode([lt.Completion,e.headers||{},e.invocationId,t,e.error]);break;case this._voidResult:n=this._encoder.encode([lt.Completion,e.headers||{},e.invocationId,t]);break;case this._nonVoidResult:n=this._encoder.encode([lt.Completion,e.headers||{},e.invocationId,t,e.result])}return _n.write(n.slice())}_writeCancelInvocation(e){const t=this._encoder.encode([lt.CancelInvocation,e.headers||{},e.invocationId]);return _n.write(t.slice())}_readHeaders(e){const t=e[1];if("object"!=typeof t)throw new Error("Invalid headers.");return t}}let Cn=!1;function In(){const e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),Cn||(Cn=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}const kn="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,Tn=kn?kn.decode.bind(kn):function(e){let t=0;const n=e.length,r=[],o=[];for(;t<n;){const n=e[t++];if(0===n)break;if(0==(128&n))r.push(n);else if(192==(224&n)){const o=63&e[t++];r.push((31&n)<<6|o)}else if(224==(240&n)){const o=63&e[t++],i=63&e[t++];r.push((31&n)<<12|o<<6|i)}else if(240==(248&n)){let o=(7&n)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++];o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},xn=Math.pow(2,32),Dn=Math.pow(2,21)-1;function Rn(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function Pn(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function Un(e,t){const n=Pn(e,t+4);if(n>Dn)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*xn+Pn(e,t)}class An{constructor(e){this.batchData=e;const t=new Bn(e);this.arrayRangeReader=new Mn(e),this.arrayBuilderSegmentReader=new On(e),this.diffReader=new Nn(e),this.editReader=new $n(e,t),this.frameReader=new Ln(e,t)}updatedComponents(){return Rn(this.batchData,this.batchData.length-20)}referenceFrames(){return Rn(this.batchData,this.batchData.length-16)}disposedComponentIds(){return Rn(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return Rn(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return Rn(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return Rn(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return Un(this.batchData,n)}}class Nn{constructor(e){this.batchDataUint8=e}componentId(e){return Rn(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class $n{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return Rn(this.batchDataUint8,e)}siblingIndex(e){return Rn(this.batchDataUint8,e+4)}newTreeIndex(e){return Rn(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return Rn(this.batchDataUint8,e+8)}removedAttributeName(e){const t=Rn(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class Ln{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return Rn(this.batchDataUint8,e)}subtreeLength(e){return Rn(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=Rn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return Rn(this.batchDataUint8,e+8)}elementName(e){const t=Rn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=Rn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=Rn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=Rn(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=Rn(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return Un(this.batchDataUint8,e+12)}}class Bn{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=Rn(e,e.length-4)}readString(e){if(-1===e)return null;{const n=Rn(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const i=e[t+o];if(n|=(127&i)<<r,i<128)break;r+=7}return n}(this.batchDataUint8,n),o=n+((t=r)<128?1:t<16384?2:t<2097152?3:4),i=new Uint8Array(this.batchDataUint8.buffer,this.batchDataUint8.byteOffset+o,r);return Tn(i)}var t}}class Mn{constructor(e){this.batchDataUint8=e}count(e){return Rn(this.batchDataUint8,e)}values(e){return e+4}}class On{constructor(e){this.batchDataUint8=e}offset(e){return 0}count(e){return Rn(this.batchDataUint8,e)}values(e){return e+4}}var Fn;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(Fn||(Fn={}));class jn{constructor(e,t){this.nextBatchId=2,this.browserRendererId=e,this.logger=t}static getOrCreate(e){return jn.instance||(jn.instance=new jn(0,e)),this.instance}async processBatch(e,t,n){if(e<this.nextBatchId)return await this.completeBatch(n,e),void this.logger.log(Fn.Debug,`Batch ${e} already processed. Waiting for batch ${this.nextBatchId}.`);if(e>this.nextBatchId)return this.fatalError?(this.logger.log(Fn.Debug,`Received a new batch ${e} but errored out on a previous batch ${this.nextBatchId-1}`),void await n.send("OnRenderCompleted",this.nextBatchId-1,this.fatalError.toString())):void this.logger.log(Fn.Debug,`Waiting for batch ${this.nextBatchId}. Batch ${e} not processed.`);try{this.nextBatchId++,this.logger.log(Fn.Debug,`Applying batch ${e}.`),function(e,t){const n=de[e];if(!n)throw new Error(`There is no browser renderer with ID ${e}.`);const r=t.arrayRangeReader,o=t.updatedComponents(),i=r.values(o),s=r.count(o),a=t.referenceFrames(),c=r.values(a),l=t.diffReader;for(let e=0;e<s;e++){const r=t.updatedComponentsEntry(i,e),o=l.componentId(r),s=l.edits(r);n.updateComponent(t,o,s,c)}const h=t.disposedComponentIds(),u=r.values(h),d=r.count(h);for(let e=0;e<d;e++){const r=t.disposedComponentIdsEntry(u,e);n.disposeComponent(r)}const p=t.disposedEventHandlerIds(),f=r.values(p),g=r.count(p);for(let e=0;e<g;e++){const r=t.disposedEventHandlerIdsEntry(f,e);n.disposeEventHandler(r)}pe&&(pe=!1,window.scrollTo&&window.scrollTo(0,0))}(this.browserRendererId,new An(t)),await this.completeBatch(n,e)}catch(t){throw this.fatalError=t.toString(),this.logger.log(Fn.Error,`There was an error applying batch ${e}.`),n.send("OnRenderCompleted",e,t.toString()),t}}getLastBatchid(){return this.nextBatchId-1}async completeBatch(e,t){try{await e.send("OnRenderCompleted",t,null)}catch{this.logger.log(Fn.Warning,`Failed to deliver completion notification for render '${t}'.`)}}}class Hn{log(e,t){}}Hn.instance=new Hn;class Wn{constructor(e){this.minLevel=e}log(e,t){if(e>=this.minLevel){const n=`[${(new Date).toISOString()}] ${Fn[e]}: ${t}`;switch(e){case Fn.Critical:case Fn.Error:console.error(n);break;case Fn.Warning:console.warn(n);break;case Fn.Information:console.info(n);break;default:console.log(n)}}}}class zn{constructor(e,t){this.circuitId=void 0,this.components=e,this.applicationState=t}reconnect(e){if(!this.circuitId)throw new Error("Circuit host not initialized.");return e.state!==ht.Connected?Promise.resolve(!1):e.invoke("ConnectCircuit",this.circuitId)}initialize(e){if(this.circuitId)throw new Error(`Circuit host '${this.circuitId}' already initialized.`);this.circuitId=e}async startCircuit(e){if(e.state!==ht.Connected)return!1;const t=await e.invoke("StartCircuit",Se.getBaseURI(),Se.getLocationHref(),JSON.stringify(this.components.map((e=>e.toRecord()))),this.applicationState||"");return!!t&&(this.initialize(t),!0)}resolveElement(e){const t=function(e){const t=f.get(e);if(t)return f.delete(e),t}(e);if(t)return M(t,!0);const n=Number.parseInt(e);if(!Number.isNaN(n))return function(e,t){if(!e.parentNode)throw new Error(`Comment not connected to the DOM ${e.textContent}`);const n=e.parentNode,r=M(n,!0),o=J(r);return Array.from(n.childNodes).forEach((e=>o.push(e))),e[L]=r,t&&(e[B]=t,M(t)),M(e)}(this.components[n].start,this.components[n].end);throw new Error(`Invalid sequence number or identifier '${e}'.`)}}const Jn={configureSignalR:e=>{},logLevel:Fn.Warning,reconnectionOptions:{maxRetries:8,retryIntervalMilliseconds:2e4,dialogId:"components-reconnect-modal"}};class qn{constructor(e,t,n,r){this.maxRetries=t,this.document=n,this.logger=r,this.addedToDom=!1,this.modal=this.document.createElement("div"),this.modal.id=e,this.maxRetries=t,this.modal.style.cssText=["position: fixed","top: 0","right: 0","bottom: 0","left: 0","z-index: 1050","display: none","overflow: hidden","background-color: #fff","opacity: 0.8","text-align: center","font-weight: bold","transition: visibility 0s linear 500ms"].join(";"),this.message=this.document.createElement("h5"),this.message.style.cssText="margin-top: 20px",this.button=this.document.createElement("button"),this.button.style.cssText="margin:5px auto 5px",this.button.textContent="Retry";const o=this.document.createElement("a");o.addEventListener("click",(()=>location.reload())),o.textContent="reload",this.reloadParagraph=this.document.createElement("p"),this.reloadParagraph.textContent="Alternatively, ",this.reloadParagraph.appendChild(o),this.modal.appendChild(this.message),this.modal.appendChild(this.button),this.modal.appendChild(this.reloadParagraph),this.loader=this.getLoader(),this.message.after(this.loader),this.button.addEventListener("click",(async()=>{this.show();try{await Ve.reconnect()||this.rejected()}catch(e){this.logger.log(Fn.Error,e),this.failed()}}))}show(){this.addedToDom||(this.addedToDom=!0,this.document.body.appendChild(this.modal)),this.modal.style.display="block",this.loader.style.display="inline-block",this.button.style.display="none",this.reloadParagraph.style.display="none",this.message.textContent="Attempting to reconnect to the server...",this.modal.style.visibility="hidden",setTimeout((()=>{this.modal.style.visibility="visible"}),0)}update(e){this.message.textContent=`Attempting to reconnect to the server: ${e} of ${this.maxRetries}`}hide(){this.modal.style.display="none"}failed(){this.button.style.display="block",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Reconnection failed. Try "),t=this.document.createElement("a");t.textContent="reloading",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page if you're unable to reconnect.");this.message.replaceChildren(e,t,n)}rejected(){this.button.style.display="none",this.reloadParagraph.style.display="none",this.loader.style.display="none";const e=this.document.createTextNode("Could not reconnect to the server. "),t=this.document.createElement("a");t.textContent="Reload",t.setAttribute("href",""),t.addEventListener("click",(()=>location.reload()));const n=this.document.createTextNode(" the page to restore functionality.");this.message.replaceChildren(e,t,n)}getLoader(){const e=this.document.createElement("div");return e.style.cssText=["border: 0.3em solid #f3f3f3","border-top: 0.3em solid #3498db","border-radius: 50%","width: 2em","height: 2em","display: inline-block"].join(";"),e.animate([{transform:"rotate(0deg)"},{transform:"rotate(360deg)"}],{duration:2e3,iterations:1/0}),e}}class Vn{constructor(e,t,n){this.dialog=e,this.maxRetries=t,this.document=n,this.document=n;const r=this.document.getElementById(Vn.MaxRetriesId);r&&(r.innerText=this.maxRetries.toString())}show(){this.removeClasses(),this.dialog.classList.add(Vn.ShowClassName)}update(e){const t=this.document.getElementById(Vn.CurrentAttemptId);t&&(t.innerText=e.toString())}hide(){this.removeClasses(),this.dialog.classList.add(Vn.HideClassName)}failed(){this.removeClasses(),this.dialog.classList.add(Vn.FailedClassName)}rejected(){this.removeClasses(),this.dialog.classList.add(Vn.RejectedClassName)}removeClasses(){this.dialog.classList.remove(Vn.ShowClassName,Vn.HideClassName,Vn.FailedClassName,Vn.RejectedClassName)}}Vn.ShowClassName="components-reconnect-show",Vn.HideClassName="components-reconnect-hide",Vn.FailedClassName="components-reconnect-failed",Vn.RejectedClassName="components-reconnect-rejected",Vn.MaxRetriesId="components-reconnect-max-retries",Vn.CurrentAttemptId="components-reconnect-current-attempt";class Kn{constructor(e,t,n){this._currentReconnectionProcess=null,this._logger=e,this._reconnectionDisplay=t,this._reconnectCallback=n||Ve.reconnect}onConnectionDown(e,t){if(!this._reconnectionDisplay){const t=document.getElementById(e.dialogId);this._reconnectionDisplay=t?new Vn(t,e.maxRetries,document):new qn(e.dialogId,e.maxRetries,document,this._logger)}this._currentReconnectionProcess||(this._currentReconnectionProcess=new Xn(e,this._logger,this._reconnectCallback,this._reconnectionDisplay))}onConnectionUp(){this._currentReconnectionProcess&&(this._currentReconnectionProcess.dispose(),this._currentReconnectionProcess=null)}}class Xn{constructor(e,t,n,r){this.logger=t,this.reconnectCallback=n,this.isDisposed=!1,this.reconnectDisplay=r,this.reconnectDisplay.show(),this.attemptPeriodicReconnection(e)}dispose(){this.isDisposed=!0,this.reconnectDisplay.hide()}async attemptPeriodicReconnection(e){for(let t=0;t<e.maxRetries;t++){this.reconnectDisplay.update(t+1);const n=0===t&&e.retryIntervalMilliseconds>Xn.MaximumFirstRetryInterval?Xn.MaximumFirstRetryInterval:e.retryIntervalMilliseconds;if(await this.delay(n),this.isDisposed)break;try{return await this.reconnectCallback()?void 0:void this.reconnectDisplay.rejected()}catch(e){this.logger.log(Fn.Error,e)}}this.reconnectDisplay.failed()}delay(e){return new Promise((t=>setTimeout(t,e)))}}Xn.MaximumFirstRetryInterval=3e3;const Yn=/^\s*Blazor-Component-State:(?<state>[a-zA-Z0-9+/=]+)$/;function Gn(e){var t;if(e.nodeType===Node.COMMENT_NODE){const n=e.textContent||"",r=Yn.exec(n),o=r&&r.groups&&r.groups.state;return o&&(null===(t=e.parentNode)||void 0===t||t.removeChild(e)),o}if(!e.hasChildNodes())return;const n=e.childNodes;for(let e=0;e<n.length;e++){const t=Gn(n[e]);if(t)return t}}function Qn(e,t){if(!e.hasChildNodes())return[];const n=[],r=new rr(e.childNodes);for(;r.next()&&r.currentElement;){const e=er(r,t);if(e)n.push(e);else{const e=Qn(r.currentElement,t);for(let t=0;t<e.length;t++){const r=e[t];n.push(r)}}}return n}const Zn=new RegExp(/^\s*Blazor:[^{]*(?<descriptor>.*)$/);function er(e,t){const n=e.currentElement;if(n&&n.nodeType===Node.COMMENT_NODE&&n.textContent){const r=Zn.exec(n.textContent),o=r&&r.groups&&r.groups.descriptor;if(!o)return;try{const r=function(e){const t=JSON.parse(e),{type:n}=t;if("server"!==n&&"webassembly"!==n)throw new Error(`Invalid component type '${n}'.`);return t}(o);switch(t){case"webassembly":return function(e,t,n){const{type:r,assembly:o,typeName:i,parameterDefinitions:s,parameterValues:a,prerenderId:c}=e;if("webassembly"===r){if(!o)throw new Error("assembly must be defined when using a descriptor.");if(!i)throw new Error("typeName must be defined when using a descriptor.");if(c){const e=tr(c,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,assembly:o,typeName:i,parameterDefinitions:s&&atob(s),parameterValues:a&&atob(a),start:t,prerenderId:c,end:e}}return{type:r,assembly:o,typeName:i,parameterDefinitions:s&&atob(s),parameterValues:a&&atob(a),start:t}}}(r,n,e);case"server":return function(e,t,n){const{type:r,descriptor:o,sequence:i,prerenderId:s}=e;if("server"===r){if(!o)throw new Error("descriptor must be defined when using a descriptor.");if(void 0===i)throw new Error("sequence must be defined when using a descriptor.");if(!Number.isInteger(i))throw new Error(`Error parsing the sequence '${i}' for component '${JSON.stringify(e)}'`);if(s){const e=tr(s,n);if(!e)throw new Error(`Could not find an end component comment for '${t}'`);return{type:r,sequence:i,descriptor:o,start:t,prerenderId:s,end:e}}return{type:r,sequence:i,descriptor:o,start:t}}}(r,n,e)}}catch(e){throw new Error(`Found malformed component comment at ${n.textContent}`)}}}function tr(e,t){for(;t.next()&&t.currentElement;){const n=t.currentElement;if(n.nodeType!==Node.COMMENT_NODE)continue;if(!n.textContent)continue;const r=Zn.exec(n.textContent),o=r&&r[1];if(o)return nr(o,e),n}}function nr(e,t){const n=JSON.parse(e);if(1!==Object.keys(n).length)throw new Error(`Invalid end of component comment: '${e}'`);const r=n.prerenderId;if(!r)throw new Error(`End of component comment must have a value for the prerendered property: '${e}'`);if(r!==t)throw new Error(`End of component comment prerendered property must match the start comment prerender id: '${t}', '${r}'`)}class rr{constructor(e){this.childNodes=e,this.currentIndex=-1,this.length=e.length}next(){return this.currentIndex++,this.currentIndex<this.length?(this.currentElement=this.childNodes[this.currentIndex],!0):(this.currentElement=void 0,!1)}}class or{constructor(e,t,n,r,o){this.type=e,this.start=t,this.end=n,this.sequence=r,this.descriptor=o}toRecord(){return{type:this.type,sequence:this.sequence,descriptor:this.descriptor}}}class ir{constructor(e,t,n,r,o,i,s){this.id=ir.globalId++,this.type=e,this.assembly=r,this.typeName=o,this.parameterDefinitions=i,this.parameterValues=s,this.start=t,this.end=n}}ir.globalId=1;class sr{constructor(){this.afterStartedCallbacks=[]}async importInitializersAsync(e,t){await Promise.all(e.map((e=>async function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:i,afterStarted:s}=o;return s&&e.afterStartedCallbacks.push(s),i?i(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await C,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let ar,cr=!1,lr=!1;async function hr(e){if(lr)throw new Error("Blazor has already started.");lr=!0;const t=function(e){const t={...Jn,...e};return e&&e.reconnectionOptions&&(t.reconnectionOptions={...Jn.reconnectionOptions,...e.reconnectionOptions}),t}(e),n=await async function(e){const t=await fetch("_blazor/initializers",{method:"GET",credentials:"include",cache:"no-cache"}),n=await t.json(),r=new sr;return await r.importInitializersAsync(n,[e]),r}(t),r=new Wn(t.logLevel);Ve.reconnect=async e=>{if(cr)return!1;const n=e||await ur(t,r,s);return await s.reconnect(n)?(t.reconnectionHandler.onConnectionUp(),!0):(r.log(Fn.Information,"Reconnection attempt to the circuit was rejected by the server. This may indicate that the associated state is no longer available on the server."),!1)},Ve.defaultReconnectionHandler=new Kn(r),t.reconnectionHandler=t.reconnectionHandler||Ve.defaultReconnectionHandler,r.log(Fn.Information,"Starting up Blazor server-side application.");const o=function(e,t){return function(e){const t=Qn(e,"server"),n=[];for(let e=0;e<t.length;e++){const r=t[e],o=new or(r.type,r.start,r.end,r.sequence,r.descriptor);n.push(o)}return n.sort(((e,t)=>e.sequence-t.sequence))}(e)}(document),i=Gn(document),s=new zn(o,i||"");Ve._internal.navigationManager.listenForNavigationEvents(((e,t,n)=>ar.send("OnLocationChanged",e,t,n)),((e,t,n,r)=>ar.send("OnLocationChanging",e,t,n,r))),Ve._internal.forceCloseConnection=()=>ar.stop(),Ve._internal.sendJSDataStream=(e,t,n)=>function(e,t,n,r){setTimeout((async()=>{let o=5,i=(new Date).valueOf();try{const s=t instanceof Blob?t.size:t.byteLength;let a=0,c=0;for(;a<s;){const l=Math.min(r,s-a),h=await Je(t,a,l);if(o--,o>1)await e.send("ReceiveJSDataChunk",n,c,h,null);else{if(!await e.invoke("ReceiveJSDataChunk",n,c,h,null))break;const t=(new Date).valueOf(),r=t-i;i=t,o=Math.max(1,Math.round(500/Math.max(1,r)))}a+=l,c++}}catch(t){await e.send("ReceiveJSDataChunk",n,-1,null,t.toString())}}),0)}(ar,e,t,n);const a=await ur(t,r,s);if(!await s.startCircuit(a))return void r.log(Fn.Error,"Failed to start the circuit.");let c=!1;const l=()=>{if(!c){const e=new FormData,t=s.circuitId;e.append("circuitId",t),c=navigator.sendBeacon("_blazor/disconnect",e)}};Ve.disconnect=l,window.addEventListener("unload",l,{capture:!1,once:!0}),r.log(Fn.Information,"Blazor server-side application started."),n.invokeAfterStartedCallbacks(Ve)}async function ur(t,n,r){var o,i;const s=new Sn;s.name="blazorpack";const a=(new Ht).withUrl("_blazor").withHubProtocol(s);t.configureSignalR(a);const c=a.build();c.on("JS.AttachComponent",((e,t)=>function(e,t,n,r){let o=de[0];o||(o=new se(0),de[0]=o),o.attachRootComponentToLogicalElement(n,t,!1)}(0,r.resolveElement(t),e))),c.on("JS.BeginInvokeJS",e.jsCallDispatcher.beginInvokeJSFromDotNet),c.on("JS.EndInvokeDotNet",e.jsCallDispatcher.endInvokeDotNetFromJS),c.on("JS.ReceiveByteArray",e.jsCallDispatcher.receiveByteArray),c.on("JS.BeginTransmitStream",(t=>{const n=new ReadableStream({start(e){c.stream("SendDotNetStreamToJS",t).subscribe({next:t=>e.enqueue(t),complete:()=>e.close(),error:t=>e.error(t)})}});e.jsCallDispatcher.supplyDotNetStream(t,n)}));const l=jn.getOrCreate(n);c.on("JS.RenderBatch",((e,t)=>{n.log(Fn.Debug,`Received render batch with id ${e} and ${t.byteLength} bytes.`),l.processBatch(e,t,c)})),c.on("JS.EndLocationChanging",Ve._internal.navigationManager.endLocationChanging),c.onclose((e=>!cr&&t.reconnectionHandler.onConnectionDown(t.reconnectionOptions,e))),c.on("JS.Error",(e=>{cr=!0,dr(c,e,n),In()}));try{await c.start(),ar=c}catch(e){if(dr(c,e,n),"FailedToNegotiateWithServerError"===e.errorType)throw e;In(),e.innerErrors&&(e.innerErrors.some((e=>"UnsupportedTransportError"===e.errorType&&e.transport===at.WebSockets))?n.log(Fn.Error,"Unable to connect, please ensure you are using an updated browser that supports WebSockets."):e.innerErrors.some((e=>"FailedToStartTransportError"===e.errorType&&e.transport===at.WebSockets))?n.log(Fn.Error,"Unable to connect, please ensure WebSockets are available. A VPN or proxy may be blocking the connection."):e.innerErrors.some((e=>"DisabledTransportError"===e.errorType&&e.transport===at.LongPolling))&&n.log(Fn.Error,"Unable to initiate a SignalR connection to the server. This might be because the server is not configured to support WebSockets. For additional details, visit https://aka.ms/blazor-server-websockets-error."))}return(null===(i=null===(o=c.connection)||void 0===o?void 0:o.features)||void 0===i?void 0:i.inherentKeepAlive)&&n.log(Fn.Warning,"Failed to connect via WebSockets, using the Long Polling fallback transport. This may be due to a VPN or proxy blocking the connection. To troubleshoot this, visit https://aka.ms/blazor-server-using-fallback-long-polling."),e.attachDispatcher({beginInvokeDotNetFromJS:(e,t,n,r,o)=>{c.send("BeginInvokeDotNetFromJS",e?e.toString():null,t,n,r||0,o)},endInvokeJSFromDotNet:(e,t,n)=>{c.send("EndInvokeJSFromDotNet",e,t,n)},sendByteArray:(e,t)=>{c.send("ReceiveByteArray",e,t)}}),c}function dr(e,t,n){n.log(Fn.Error,t),e&&e.stop()}Ve.start=hr,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&hr()})(); \ No newline at end of file
diff --git a/src/Components/Web.JS/dist/Release/blazor.webview.js b/src/Components/Web.JS/dist/Release/blazor.webview.js
index 3e53da5077..d404e32135 100644
--- a/src/Components/Web.JS/dist/Release/blazor.webview.js
+++ b/src/Components/Web.JS/dist/Release/blazor.webview.js
@@ -1 +1 @@
-(()=>{"use strict";var e,t,n;!function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",a="__byte[]";class s{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const i={},c={0:new s(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,u=1,d=1,f=null;function h(e){t.push(e)}function p(e){if(e&&"object"==typeof e){c[d]=new s(e);const t={[o]:d};return d++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function m(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=p(e);n.__jsObjectId=t.__jsObjectId}catch(t){throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function b(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function y(e,t,n,r){const o=v();if(o.invokeDotNetFromJS){const a=T(r),s=o.invokeDotNetFromJS(e,t,n,a);return s?b(s):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function g(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=u++,a=new Promise(((e,t)=>{i[o]={resolve:e,reject:t}}));try{const a=T(r);v().beginInvokeDotNetFromJS(o,e,t,n,a)}catch(e){w(o,!1,e)}return a}function v(){if(null!==f)return f;throw new Error("No .NET call dispatcher has been set.")}function w(e,t,n){if(!i.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=i[e];delete i[e],t?r.resolve(n):r.reject(n)}function E(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function S(e,t){const n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function I(e){delete c[e]}e.attachDispatcher=function(e){f=e},e.attachReviver=h,e.invokeMethod=function(e,t,...n){return y(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return g(e,t,null,n)},e.createJSObjectReference=p,e.createJSStreamReference=m,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&I(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:S,disposeJSObjectReferenceById:I,invokeJSFromDotNet:(e,t,n,r)=>{const o=k(S(e,r).apply(null,b(t)),n);return null==o?null:T(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const a=new Promise((e=>{e(S(t,o).apply(null,b(n)))}));e&&a.then((t=>v().endInvokeJSFromDotNet(e,!0,T([e,!0,k(t,r)]))),(t=>v().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,E(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?b(n):new Error(n);w(parseInt(e,10),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new A;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return y(null,e,this._id,t)}invokeMethodAsync(e,...t){return g(null,e,this._id,t)}dispose(){g(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,h((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(a)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new D(t.__dotNetStream)}return t}));class D{constructor(e){if(r.has(e))this._streamPromise=r.get(e).streamPromise,r.delete(e);else{const t=new A;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class A{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function k(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return p(e);case l.JSStreamReference:return m(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let R=0;function T(e){return R=0,JSON.stringify(e,N)}function N(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){f.sendByteArray(R,t);const e={[a]:R};return R++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class r{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new r(e,t.value)}return null}}const o=new Map,a=new Map,s=[];function i(e){return o.get(e)}function c(e){const t=o.get(e);return(null==t?void 0:t.browserEventName)||e}function l(e,t){e.forEach((e=>o.set(e,t)))}function u(e){const t=[];for(let n=0;n<e.length;n++){const r=e[n];t.push({identifier:r.identifier,clientX:r.clientX,clientY:r.clientY,screenX:r.screenX,screenY:r.screenY,pageX:r.pageX,pageY:r.pageY})}return t}function d(e){return{detail:e.detail,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,offsetX:e.offsetX,offsetY:e.offsetY,pageX:e.pageX,pageY:e.pageY,button:e.button,buttons:e.buttons,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,type:e.type}}l(["input","change"],{createEventArgs:function(e){const t=e.target;if(function(e){return-1!==f.indexOf(e.getAttribute("type"))}(t)){const e=function(e){const t=e.value,n=e.type;switch(n){case"date":case"month":case"week":return t;case"datetime-local":return 16===t.length?t+":00":t;case"time":return 5===t.length?t+":00":t}throw new Error(`Invalid element type '${n}'.`)}(t);return{value:e}}if(function(e){return e instanceof HTMLSelectElement&&"select-multiple"===e.type}(t)){const e=t;return{value:Array.from(e.options).filter((e=>e.selected)).map((e=>e.value))}}{const e=function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t);return{value:e?!!t.checked:t.value}}}}),l(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),l(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),l(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),l(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","mouseleave","mouseenter","dblclick"],{createEventArgs:e=>d(e)}),l(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),l(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),l(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),l(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),l(["toggle"],{createEventArgs:()=>({})});const f=["date","datetime-local","month","time","week"],h=new Map;let p,m,b=0;const y={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++b).toString();h.set(r,e);const o=await w().invokeMethodAsync("AddRootComponent",t,r),a=new v(o,m[t]);return await a.setParameters(n),a}};class g{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class v{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new g)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return w().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await w().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function w(){if(!p)throw new Error("Dynamic root components have not been enabled in this application.");return p}const E=new Map;let S;const I=new Promise((e=>{S=e}));function C(e,t,n){return A(e,t.eventHandlerId,(()=>D(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function D(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let A=(e,t,n)=>n();const k=F(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),R={submit:!0},T=F(["click","dblclick","mousedown","mousemove","mouseup"]);class N{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++N.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new _(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),a=o.getHandler(t);if(a)this.eventInfoStore.update(a.eventHandlerId,n);else{const a={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(a),o.setHandler(t,a)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,a.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let o=n.shift(),a=null,s=!1;const c=Object.prototype.hasOwnProperty.call(k,e);let l=!1;for(;o;){const f=o,h=this.getEventHandlerInfosForElement(f,!1);if(h){const n=h.getHandler(e);if(n&&(u=f,d=t.type,!((u instanceof HTMLButtonElement||u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement)&&Object.prototype.hasOwnProperty.call(T,d)&&u.disabled))){if(!s){const n=i(e);a=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},s=!0}Object.prototype.hasOwnProperty.call(R,t.type)&&t.preventDefault(),C(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:r.fromEvent(n.renderingComponentId,t)},a)}h.stopPropagation(e)&&(l=!0),h.preventDefault(e)&&t.preventDefault()}o=c||l?void 0:n.shift()}var u,d}getEventHandlerInfosForElement(e,t){return Object.prototype.hasOwnProperty.call(e,this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new O:null}}N.nextEventDelegatorId=0;class _{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},s.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=c(e),Object.prototype.hasOwnProperty.call(this.countByEventName,e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=Object.prototype.hasOwnProperty.call(k,e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(Object.prototype.hasOwnProperty.call(this.infosByEventHandlerId,t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=c(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(Object.prototype.hasOwnProperty.call(this.countByEventName,e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class O{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return Object.prototype.hasOwnProperty.call(this.handlers,e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function F(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const j=G("_blazorLogicalChildren"),x=G("_blazorLogicalParent"),L=G("_blazorLogicalEnd");function P(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return j in e||(e[j]=[]),e}function M(e,t){const n=document.createComment("!");return H(n,e,t),n}function H(e,t,n){const r=e;if(e instanceof Comment&&z(r)&&z(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(U(r))throw new Error("Not implemented: moving existing logical children");const o=z(t);if(n<o.length){const t=o[n];t.parentNode.insertBefore(e,t),o.splice(n,0,r)}else X(e,t),o.push(r);r[x]=t,j in r||(r[j]=[])}function B(e,t){const n=z(e).splice(t,1)[0];if(n instanceof Comment){const e=z(n);if(e)for(;e.length>0;)B(n,0)}const r=n;r.parentNode.removeChild(r)}function U(e){return e[x]||null}function J(e,t){return z(e)[t]}function $(e){const t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function z(e){return e[j]}function K(e,t){const n=z(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=Y(e.moveRangeStart)})),t.forEach((t=>{const r=document.createComment("marker");t.moveToBeforeMarker=r;const o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):X(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let a=r;for(;a;){const e=a.nextSibling;if(n.insertBefore(a,t),a===o)break;a=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function W(e){const t=z(U(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function X(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=W(t);n?n.parentNode.insertBefore(e,n):X(e,U(t))}}}function Y(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=W(e);if(t)return t.previousSibling;{const t=U(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:Y(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",Q=document.createElement("template"),ee=document.createElementNS("http://www.w3.org/2000/svg","g"),te={},ne="__internal_",re="preventDefault_",oe="stopPropagation_";class ae{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new N(e),this.eventDelegator.notifyAfterClick((e=>{if(!he)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;e<t.length;e++){const n=t[e];if(n instanceof Element&&"A"===n.tagName)return n}return null}return Se(e.target,"A")}(e);if(t&&function(e){const t=e.getAttribute("target");return(!t||"_self"===t)&&e.hasAttribute("href")&&!e.hasAttribute("download")}(t)){const n=Ee(t.getAttribute("href"));Ie(n)&&(e.preventDefault(),ge(n,!0,!1))}}))}attachRootComponentToLogicalElement(e,t,n){this.attachComponentToElement(e,t),this.rootComponentIds.add(e),n||(te[e]=t)}updateComponent(e,t,n,r){var o;const a=this.childComponentLocations[t];if(!a)throw new Error(`No element is currently associated with component ${t}`);const s=te[t];if(s){const e=function(e){return e[L]||null}(s);delete te[t],e?function(e,t){const n=U(e);if(!n)throw new Error("Can't clear between nodes. The start node does not have a logical parent.");const r=z(n),o=r.indexOf(e)+1,a=r.indexOf(t);for(let e=o;e<=a;e++)B(n,o);e.textContent="!"}(s,e):function(e){let t;for(;t=e.firstChild;)e.removeChild(t)}(s)}const i=null===(o=V(a))||void 0===o?void 0:o.getRootNode(),c=i&&i.activeElement;this.applyEdits(e,t,a,0,n,r),c instanceof HTMLElement&&i&&i.activeElement!==c&&c.focus()}disposeComponent(e){this.rootComponentIds.delete(e)&&function(e){const t=z(e);for(;t.length;)B(e,0)}(this.childComponentLocations[e]),delete this.childComponentLocations[e]}disposeEventHandler(e){this.eventDelegator.removeListener(e)}attachComponentToElement(e,t){this.childComponentLocations[e]=t}applyEdits(e,n,r,o,a,s){let i,c=0,l=o;const u=e.arrayBuilderSegmentReader,d=e.editReader,f=e.frameReader,h=u.values(a),p=u.offset(a),m=p+u.count(a);for(let a=p;a<m;a++){const u=e.diffReader.editsEntry(h,a),p=d.editType(u);switch(p){case t.prependFrame:{const t=d.newTreeIndex(u),o=e.referenceFramesEntry(s,t),a=d.siblingIndex(u);this.insertFrame(e,n,r,l+a,s,o,t);break}case t.removeFrame:B(r,l+d.siblingIndex(u));break;case t.setAttribute:{const t=d.newTreeIndex(u),o=e.referenceFramesEntry(s,t),a=J(r,l+d.siblingIndex(u));if(!(a instanceof Element))throw new Error("Cannot set attribute on non-element child");this.applyAttribute(e,n,a,o);break}case t.removeAttribute:{const t=J(r,l+d.siblingIndex(u));if(!(t instanceof HTMLElement))throw new Error("Cannot remove attribute from non-element child");{const n=d.removedAttributeName(u);this.tryApplySpecialProperty(e,t,n,null)||t.removeAttribute(n)}break}case t.updateText:{const t=d.newTreeIndex(u),n=e.referenceFramesEntry(s,t),o=J(r,l+d.siblingIndex(u));if(!(o instanceof Text))throw new Error("Cannot set text content on non-text child");o.textContent=f.textContent(n);break}case t.updateMarkup:{const t=d.newTreeIndex(u),n=e.referenceFramesEntry(s,t),o=d.siblingIndex(u);B(r,l+o),this.insertMarkup(e,r,l+o,n);break}case t.stepIn:r=J(r,l+d.siblingIndex(u)),c++,l=0;break;case t.stepOut:r=U(r),c--,l=0===c?o:0;break;case t.permutationListEntry:i=i||[],i.push({fromSiblingIndex:l+d.siblingIndex(u),toSiblingIndex:l+d.moveToSiblingIndex(u)});break;case t.permutationListEnd:K(r,i),i=void 0;break;default:throw new Error(`Unknown edit type: ${p}`)}}}insertFrame(e,t,r,o,a,s,i){const c=e.frameReader,l=c.frameType(s);switch(l){case n.element:return this.insertElement(e,t,r,o,a,s,i),1;case n.text:return this.insertText(e,r,o,s),1;case n.attribute:throw new Error("Attribute frames should only be present as leading children of element frames.");case n.component:return this.insertComponent(e,r,o,s),1;case n.region:return this.insertFrameRange(e,t,r,o,a,i+1,i+c.subtreeLength(s));case n.elementReferenceCapture:if(r instanceof Element)return u=r,d=c.elementReferenceCaptureId(s),u.setAttribute(q(d),""),0;throw new Error("Reference capture frames can only be children of element frames.");case n.markup:return this.insertMarkup(e,r,o,s),1;default:throw new Error(`Unknown frame type: ${l}`)}var u,d}insertElement(e,t,r,o,a,s,i){const c=e.frameReader,l=c.elementName(s),u="svg"===l||$(r)?document.createElementNS("http://www.w3.org/2000/svg",l):document.createElement(l),d=P(u);let f=!1;const h=i+c.subtreeLength(s);for(let s=i+1;s<h;s++){const i=e.referenceFramesEntry(a,s);if(c.frameType(i)!==n.attribute){H(u,r,o),f=!0,this.insertFrameRange(e,t,d,0,a,s,h);break}this.applyAttribute(e,t,u,i)}f||H(u,r,o),u instanceof HTMLOptionElement?this.trySetSelectValueFromOptionElement(u):Z in u&&ue(u,u._blazorDeferredValue)}trySetSelectValueFromOptionElement(e){const t=this.findClosestAncestorSelectElement(e);if(!function(e){return!!e&&Z in e}(t))return!1;if(ce(t))e.selected=-1!==t._blazorDeferredValue.indexOf(e.value);else{if(t._blazorDeferredValue!==e.value)return!1;le(t,e.value),delete t._blazorDeferredValue}return!0}insertComponent(e,t,n,r){const o=M(t,n),a=e.frameReader.componentId(r);this.attachComponentToElement(a,o)}insertText(e,t,n,r){const o=e.frameReader.textContent(r);H(document.createTextNode(o),t,n)}insertMarkup(e,t,n,r){const o=M(t,n),a=(s=e.frameReader.markupContent(r),$(t)?(ee.innerHTML=s||" ",ee):(Q.innerHTML=s||" ",Q.content));var s;let i=0;for(;a.firstChild;)H(a.firstChild,o,i++)}applyAttribute(e,t,n,r){const o=e.frameReader,a=o.attributeName(r),s=o.attributeEventHandlerId(r);if(s){const e=ie(a);this.eventDelegator.setListener(n,e,s,t)}else this.tryApplySpecialProperty(e,n,a,r)||n.setAttribute(a,o.attributeValue(r))}tryApplySpecialProperty(e,t,n,r){switch(n){case"value":return this.tryApplyValueProperty(e,t,r);case"checked":return this.tryApplyCheckedProperty(e,t,r);default:return!!n.startsWith(ne)&&(this.applyInternalAttribute(e,t,n.substring(ne.length),r),!0)}}applyInternalAttribute(e,t,n,r){const o=r?e.frameReader.attributeValue(r):null;if(n.startsWith(oe)){const e=ie(n.substring(oe.length));this.eventDelegator.setStopPropagation(t,e,null!==o)}else{if(!n.startsWith(re))throw new Error(`Unsupported internal attribute '${n}'`);{const e=ie(n.substring(re.length));this.eventDelegator.setPreventDefault(t,e,null!==o)}}}tryApplyValueProperty(e,t,n){const r=e.frameReader;let o=n?r.attributeValue(n):null;switch(o&&"INPUT"===t.tagName&&(o=function(e,t){switch(t){case"time":return 8===e.length&&e.endsWith("00")?e.substring(0,5):e;case"datetime-local":return 19===e.length&&e.endsWith("00")?e.substring(0,16):e;default:return e}}(o,t.getAttribute("type"))),t.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return o&&t instanceof HTMLSelectElement&&ce(t)&&(o=JSON.parse(o)),ue(t,o),t._blazorDeferredValue=o,!0;case"OPTION":return o||""===o?t.setAttribute("value",o):t.removeAttribute("value"),this.trySetSelectValueFromOptionElement(t),!0;default:return!1}}tryApplyCheckedProperty(e,t,n){if("INPUT"===t.tagName){const r=n?e.frameReader.attributeValue(n):null;return t.checked=null!==r,!0}return!1}findClosestAncestorSelectElement(e){for(;e;){if(e instanceof HTMLSelectElement)return e;e=e.parentElement}return null}insertFrameRange(e,t,n,r,o,a,s){const i=r;for(let i=a;i<s;i++){const a=e.referenceFramesEntry(o,i);r+=this.insertFrame(e,t,n,r,o,a,i),i+=se(e,a)}return r-i}}function se(e,t){const r=e.frameReader;switch(r.frameType(t)){case n.component:case n.element:case n.region:return r.subtreeLength(t)-1;default:return 0}}function ie(e){if(e.startsWith("on"))return e.substring(2);throw new Error(`Attribute should be an event name, but doesn't start with 'on'. Value: '${e}'`)}function ce(e){return"select-multiple"===e.type}function le(e,t){e.value=t||""}function ue(e,t){e instanceof HTMLSelectElement?ce(e)?function(e,t){t||(t=[]);for(let n=0;n<e.options.length;n++)e.options[n].selected=-1!==t.indexOf(e.options[n].value)}(e,t):le(e,t):e.value=t}const de={};let fe=!1,he=!1,pe=!1,me=null;const be={listenForNavigationEvents:function(e){me=e,pe||(pe=!0,window.addEventListener("popstate",(()=>ve(!1))))},enableNavigationInterception:function(){he=!0},navigateTo:ye,getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function ye(e,t,n=!1){const r=Ee(e),o=t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n};!o.forceLoad&&Ie(r)?ge(r,!1,o.replaceHistoryEntry):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,o.replaceHistoryEntry)}function ge(e,t,n){fe=!0,n?history.replaceState(null,"",e):history.pushState(null,"",e),ve(t)}async function ve(e){me&&await me(location.href,e)}let we;function Ee(e){return we=we||document.createElement("a"),we.href=e,we.href}function Se(e,t){return e?e.tagName===t?e:Se(e.parentElement,t):null}function Ie(e){const t=(n=document.baseURI).substr(0,n.lastIndexOf("/")+1);var n;return e.startsWith(t)}const Ce={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},De={init:function(e,t,n,r=50){const o=ke(t);(o||document.documentElement).style.overflowAnchor="none";const a=document.createRange();u(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const s=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;a.setStartAfter(t),a.setEndBefore(n);const s=a.getBoundingClientRect().height,i=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,s,i):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,s,i)}))}),{root:o,rootMargin:`${r}px`});s.observe(t),s.observe(n);const i=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{u(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),s.unobserve(e),s.observe(e)}));return n.observe(e,t),n}function u(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}Ae[e._id]={intersectionObserver:s,mutationObserverBefore:i,mutationObserverAfter:c}},dispose:function(e){const t=Ae[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete Ae[e._id])}},Ae={};function ke(e){return e?"visible"!==getComputedStyle(e).overflowY?e:ke(e.parentElement):null}const Re={getAndRemoveExistingTitle:function(){var e;const t=document.head?document.head.getElementsByTagName("title"):[];if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],a=o.previousSibling;a instanceof Comment&&null!==U(a)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Te={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const a=Ne(e,t),s=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(a.blob)})),i=await new Promise((function(e){var t;const a=Math.min(1,r/s.width),i=Math.min(1,o/s.height),c=Math.min(a,i),l=document.createElement("canvas");l.width=Math.round(s.width*c),l.height=Math.round(s.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(s,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:a.lastModified,name:a.name,size:(null==i?void 0:i.size)||0,contentType:n,blob:i||a.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Ne(e,t).blob}};function Ne(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed.`);return n}const _e=new Map,Oe={navigateTo:ye,registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(o.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=a.get(t.browserEventName);n?n.push(e):a.set(t.browserEventName,[e]),s.forEach((n=>n(e,t.browserEventName)))}o.set(e,t)},rootComponents:y,_internal:{navigationManager:be,domWrapper:Ce,Virtualize:De,PageTitle:Re,InputFile:Te,getJSDataStreamChunk:async function(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)},receiveDotNetDataStream:function(t,n,r,o){let a=_e.get(t);if(!a){const n=new ReadableStream({start(e){_e.set(t,e),a=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(a.error(o),_e.delete(t)):0===r?(a.close(),_e.delete(t)):a.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(p)throw new Error("Dynamic root components have already been enabled.");p=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(D(t),r,o),S()}}};window.Blazor=Oe;let Fe=!1;const je="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,xe=je?je.decode.bind(je):function(e){let t=0;const n=e.length,r=[],o=[];for(;t<n;){const n=e[t++];if(0===n)break;if(0==(128&n))r.push(n);else if(192==(224&n)){const o=63&e[t++];r.push((31&n)<<6|o)}else if(224==(240&n)){const o=63&e[t++],a=63&e[t++];r.push((31&n)<<12|o<<6|a)}else if(240==(248&n)){let o=(7&n)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++];o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},Le=Math.pow(2,32),Pe=Math.pow(2,21)-1;function Me(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function He(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function Be(e,t){const n=He(e,t+4);if(n>Pe)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*Le+He(e,t)}class Ue{constructor(e){this.batchData=e;const t=new Ke(e);this.arrayRangeReader=new Ve(e),this.arrayBuilderSegmentReader=new We(e),this.diffReader=new Je(e),this.editReader=new $e(e,t),this.frameReader=new ze(e,t)}updatedComponents(){return Me(this.batchData,this.batchData.length-20)}referenceFrames(){return Me(this.batchData,this.batchData.length-16)}disposedComponentIds(){return Me(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return Me(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return Me(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return Me(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return Be(this.batchData,n)}}class Je{constructor(e){this.batchDataUint8=e}componentId(e){return Me(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class $e{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return Me(this.batchDataUint8,e)}siblingIndex(e){return Me(this.batchDataUint8,e+4)}newTreeIndex(e){return Me(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return Me(this.batchDataUint8,e+8)}removedAttributeName(e){const t=Me(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class ze{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return Me(this.batchDataUint8,e)}subtreeLength(e){return Me(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return Me(this.batchDataUint8,e+8)}elementName(e){const t=Me(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=Me(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=Me(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return Be(this.batchDataUint8,e+12)}}class Ke{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=Me(e,e.length-4)}readString(e){if(-1===e)return null;{const n=Me(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const a=e[t+o];if(n|=(127&a)<<r,a<128)break;r+=7}return n}(this.batchDataUint8,n),o=n+((t=r)<128?1:t<16384?2:t<2097152?3:4),a=new Uint8Array(this.batchDataUint8.buffer,this.batchDataUint8.byteOffset+o,r);return xe(a)}var t}}class Ve{constructor(e){this.batchDataUint8=e}count(e){return Me(this.batchDataUint8,e)}values(e){return e+4}}class We{constructor(e){this.batchDataUint8=e}offset(e){return 0}count(e){return Me(this.batchDataUint8,e)}values(e){return e+4}}const Xe="__bwv:";let Ye=!1;function Ge(e,t){tt("OnRenderCompleted",e,t)}function qe(e,t,n,r,o){tt("BeginInvokeDotNet",e?e.toString():null,t,n,r||0,o)}function Ze(e,t,n){tt("EndInvokeJS",e,t,n)}function Qe(e,t){const n=function(e){const t=new Array(e.length);for(let n=0;n<e.length;n++)t[n]=String.fromCharCode(e[n]);return btoa(t.join(""))}(t);tt("ReceiveByteArrayFromJS",e,n)}function et(e,t){return tt("OnLocationChanged",e,t),Promise.resolve()}function tt(e,...t){const n=function(e,t){return Ye?null:`__bwv:${JSON.stringify([e,...t])}`}(e,t);n&&window.external.sendMessage(n)}function nt(t,n){const r=rt(n);e.jsCallDispatcher.receiveByteArray(t,r)}function rt(e){const t=atob(e),n=t.length,r=new Uint8Array(n);for(let e=0;e<n;e++)r[e]=t.charCodeAt(e);return r}class ot{constructor(){this.afterStartedCallbacks=[]}async importInitializersAsync(e,t){await Promise.all(e.map((e=>async function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:a,afterStarted:s}=o;return s&&e.afterStartedCallbacks.push(s),a?a(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await I,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let at=!1;async function st(){if(at)throw new Error("Blazor has already started.");at=!0;const t=await async function(){const e=await fetch("_framework/blazor.modules.json",{method:"GET",credentials:"include",cache:"no-cache"}),t=await e.json(),n=new ot;return await n.importInitializersAsync(t,[]),n}();(function(){const t={AttachToDocument:(e,t)=>{!function(e,t,n){const r="::after";let o=!1;if(e.endsWith(r))e=e.slice(0,-r.length),o=!0;else if(e.endsWith("::before"))throw new Error("The '::before' selector is not supported.");const a=function(e){const t=h.get(e);if(t)return h.delete(e),t}(e)||document.querySelector(e);if(!a)throw new Error(`Could not find any element matching selector '${e}'.`);!function(e,t,n,r){let o=de[0];o||(o=new ae(0),de[0]=o),o.attachRootComponentToLogicalElement(n,t,r)}(0,P(a,!0),t,o)}(t,e)},RenderBatch:(e,t)=>{try{const n=rt(t);(function(e,t){const n=de[0];if(!n)throw new Error("There is no browser renderer with ID 0.");const r=t.arrayRangeReader,o=t.updatedComponents(),a=r.values(o),s=r.count(o),i=t.referenceFrames(),c=r.values(i),l=t.diffReader;for(let e=0;e<s;e++){const r=t.updatedComponentsEntry(a,e),o=l.componentId(r),s=l.edits(r);n.updateComponent(t,o,s,c)}const u=t.disposedComponentIds(),d=r.values(u),f=r.count(u);for(let e=0;e<f;e++){const r=t.disposedComponentIdsEntry(d,e);n.disposeComponent(r)}const h=t.disposedEventHandlerIds(),p=r.values(h),m=r.count(h);for(let e=0;e<m;e++){const r=t.disposedEventHandlerIdsEntry(p,e);n.disposeEventHandler(r)}fe&&(fe=!1,window.scrollTo&&window.scrollTo(0,0))})(0,new Ue(n)),Ge(e,null)}catch(t){Ge(e,t.toString())}},NotifyUnhandledException:(e,t)=>{Ye=!0,console.error(`${e}\n${t}`),function(){const e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),Fe||(Fe=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}()},BeginInvokeJS:e.jsCallDispatcher.beginInvokeJSFromDotNet,EndInvokeDotNet:e.jsCallDispatcher.endInvokeDotNetFromJS,SendByteArrayToJS:nt,Navigate:be.navigateTo};window.external.receiveMessage((e=>{const n=function(e){if(Ye||!e||!e.startsWith(Xe))return null;const t=e.substring(Xe.length),[n,...r]=JSON.parse(t);return{messageType:n,args:r}}(e);if(n){if(!Object.prototype.hasOwnProperty.call(t,n.messageType))throw new Error(`Unsupported IPC message type '${n.messageType}'`);t[n.messageType].apply(null,n.args)}}))})(),e.attachDispatcher({beginInvokeDotNetFromJS:qe,endInvokeJSFromDotNet:Ze,sendByteArray:Qe}),be.enableNavigationInterception(),be.listenForNavigationEvents(et),tt("AttachPage",be.getBaseURI(),be.getLocationHref()),await t.invokeAfterStartedCallbacks(Oe)}Oe.start=st,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&st()})(); \ No newline at end of file
+(()=>{"use strict";var e,t,n;!function(e){window.DotNet=e;const t=[],n=new Map,r=new Map,o="__jsObjectId",a="__byte[]";class s{constructor(e){this._jsObject=e,this._cachedFunctions=new Map}findFunction(e){const t=this._cachedFunctions.get(e);if(t)return t;let n,r=this._jsObject;if(e.split(".").forEach((t=>{if(!(t in r))throw new Error(`Could not find '${e}' ('${t}' was undefined).`);n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error(`The value '${e}' is not a function.`)}getWrappedObject(){return this._jsObject}}const i={},c={0:new s(window)};c[0]._cachedFunctions.set("import",(e=>("string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e))));let l,u=1,d=1,f=null;function h(e){t.push(e)}function p(e){if(e&&"object"==typeof e){c[d]=new s(e);const t={[o]:d};return d++,t}throw new Error(`Cannot create a JSObjectReference from the value '${e}'.`)}function m(e){let t=-1;if(e instanceof ArrayBuffer&&(e=new Uint8Array(e)),e instanceof Blob)t=e.size;else{if(!(e.buffer instanceof ArrayBuffer))throw new Error("Supplied value is not a typed array or blob.");if(void 0===e.byteLength)throw new Error(`Cannot create a JSStreamReference from the value '${e}' as it doesn't have a byteLength.`);t=e.byteLength}const n={__jsStreamReferenceLength:t};try{const t=p(e);n.__jsObjectId=t.__jsObjectId}catch(t){throw new Error(`Cannot create a JSStreamReference from the value '${e}'.`)}return n}function b(e){return e?JSON.parse(e,((e,n)=>t.reduce(((t,n)=>n(e,t)),n))):null}function v(e,t,n,r){const o=y();if(o.invokeDotNetFromJS){const a=T(r),s=o.invokeDotNetFromJS(e,t,n,a);return s?b(s):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function g(e,t,n,r){if(e&&n)throw new Error(`For instance method calls, assemblyName should be null. Received '${e}'.`);const o=u++,a=new Promise(((e,t)=>{i[o]={resolve:e,reject:t}}));try{const a=T(r);y().beginInvokeDotNetFromJS(o,e,t,n,a)}catch(e){w(o,!1,e)}return a}function y(){if(null!==f)return f;throw new Error("No .NET call dispatcher has been set.")}function w(e,t,n){if(!i.hasOwnProperty(e))throw new Error(`There is no pending async call with ID ${e}.`);const r=i[e];delete i[e],t?r.resolve(n):r.reject(n)}function E(e){return e instanceof Error?`${e.message}\n${e.stack}`:e?e.toString():"null"}function S(e,t){const n=c[t];if(n)return n.findFunction(e);throw new Error(`JS object instance with ID ${t} does not exist (has it been disposed?).`)}function I(e){delete c[e]}e.attachDispatcher=function(e){f=e},e.attachReviver=h,e.invokeMethod=function(e,t,...n){return v(e,t,null,n)},e.invokeMethodAsync=function(e,t,...n){return g(e,t,null,n)},e.createJSObjectReference=p,e.createJSStreamReference=m,e.disposeJSObjectReference=function(e){const t=e&&e.__jsObjectId;"number"==typeof t&&I(t)},function(e){e[e.Default=0]="Default",e[e.JSObjectReference=1]="JSObjectReference",e[e.JSStreamReference=2]="JSStreamReference",e[e.JSVoidResult=3]="JSVoidResult"}(l=e.JSCallResultType||(e.JSCallResultType={})),e.jsCallDispatcher={findJSFunction:S,disposeJSObjectReferenceById:I,invokeJSFromDotNet:(e,t,n,r)=>{const o=k(S(e,r).apply(null,b(t)),n);return null==o?null:T(o)},beginInvokeJSFromDotNet:(e,t,n,r,o)=>{const a=new Promise((e=>{e(S(t,o).apply(null,b(n)))}));e&&a.then((t=>T([e,!0,k(t,r)]))).then((t=>y().endInvokeJSFromDotNet(e,!0,t)),(t=>y().endInvokeJSFromDotNet(e,!1,JSON.stringify([e,!1,E(t)]))))},endInvokeDotNetFromJS:(e,t,n)=>{const r=t?b(n):new Error(n);w(parseInt(e,10),t,r)},receiveByteArray:(e,t)=>{n.set(e,t)},supplyDotNetStream:(e,t)=>{if(r.has(e)){const n=r.get(e);r.delete(e),n.resolve(t)}else{const n=new D;n.resolve(t),r.set(e,n)}}};class C{constructor(e){this._id=e}invokeMethod(e,...t){return v(null,e,this._id,t)}invokeMethodAsync(e,...t){return g(null,e,this._id,t)}dispose(){g(null,"__Dispose",this._id,null).catch((e=>console.error(e)))}serializeAsArg(){return{__dotNetObject:this._id}}}e.DotNetObject=C,h((function(e,t){if(t&&"object"==typeof t){if(t.hasOwnProperty("__dotNetObject"))return new C(t.__dotNetObject);if(t.hasOwnProperty(o)){const e=t.__jsObjectId,n=c[e];if(n)return n.getWrappedObject();throw new Error(`JS object instance with Id '${e}' does not exist. It may have been disposed.`)}if(t.hasOwnProperty(a)){const e=t["__byte[]"],r=n.get(e);if(void 0===r)throw new Error(`Byte array index '${e}' does not exist.`);return n.delete(e),r}if(t.hasOwnProperty("__dotNetStream"))return new A(t.__dotNetStream)}return t}));class A{constructor(e){if(r.has(e))this._streamPromise=r.get(e).streamPromise,r.delete(e);else{const t=new D;r.set(e,t),this._streamPromise=t.streamPromise}}stream(){return this._streamPromise}async arrayBuffer(){return new Response(await this.stream()).arrayBuffer()}}class D{constructor(){this.streamPromise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}function k(e,t){switch(t){case l.Default:return e;case l.JSObjectReference:return p(e);case l.JSStreamReference:return m(e);case l.JSVoidResult:return null;default:throw new Error(`Invalid JS call result type '${t}'.`)}}let R=0;function T(e){return R=0,JSON.stringify(e,N)}function N(e,t){if(t instanceof C)return t.serializeAsArg();if(t instanceof Uint8Array){f.sendByteArray(R,t);const e={[a]:R};return R++,e}return t}}(e||(e={})),function(e){e[e.prependFrame=1]="prependFrame",e[e.removeFrame=2]="removeFrame",e[e.setAttribute=3]="setAttribute",e[e.removeAttribute=4]="removeAttribute",e[e.updateText=5]="updateText",e[e.stepIn=6]="stepIn",e[e.stepOut=7]="stepOut",e[e.updateMarkup=8]="updateMarkup",e[e.permutationListEntry=9]="permutationListEntry",e[e.permutationListEnd=10]="permutationListEnd"}(t||(t={})),function(e){e[e.element=1]="element",e[e.text=2]="text",e[e.attribute=3]="attribute",e[e.component=4]="component",e[e.region=5]="region",e[e.elementReferenceCapture=6]="elementReferenceCapture",e[e.markup=8]="markup"}(n||(n={}));class r{constructor(e,t){this.componentId=e,this.fieldValue=t}static fromEvent(e,t){const n=t.target;if(n instanceof Element){const t=function(e){return e instanceof HTMLInputElement?e.type&&"checkbox"===e.type.toLowerCase()?{value:e.checked}:{value:e.value}:e instanceof HTMLSelectElement||e instanceof HTMLTextAreaElement?{value:e.value}:null}(n);if(t)return new r(e,t.value)}return null}}const o=new Map,a=new Map,s=[];function i(e){return o.get(e)}function c(e){const t=o.get(e);return(null==t?void 0:t.browserEventName)||e}function l(e,t){e.forEach((e=>o.set(e,t)))}function u(e){const t=[];for(let n=0;n<e.length;n++){const r=e[n];t.push({identifier:r.identifier,clientX:r.clientX,clientY:r.clientY,screenX:r.screenX,screenY:r.screenY,pageX:r.pageX,pageY:r.pageY})}return t}function d(e){return{detail:e.detail,screenX:e.screenX,screenY:e.screenY,clientX:e.clientX,clientY:e.clientY,offsetX:e.offsetX,offsetY:e.offsetY,pageX:e.pageX,pageY:e.pageY,movementX:e.movementX,movementY:e.movementY,button:e.button,buttons:e.buttons,ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,altKey:e.altKey,metaKey:e.metaKey,type:e.type}}l(["input","change"],{createEventArgs:function(e){const t=e.target;if(function(e){return-1!==f.indexOf(e.getAttribute("type"))}(t)){const e=function(e){const t=e.value,n=e.type;switch(n){case"date":case"month":case"week":return t;case"datetime-local":return 16===t.length?t+":00":t;case"time":return 5===t.length?t+":00":t}throw new Error(`Invalid element type '${n}'.`)}(t);return{value:e}}if(function(e){return e instanceof HTMLSelectElement&&"select-multiple"===e.type}(t)){const e=t;return{value:Array.from(e.options).filter((e=>e.selected)).map((e=>e.value))}}{const e=function(e){return!!e&&"INPUT"===e.tagName&&"checkbox"===e.getAttribute("type")}(t);return{value:e?!!t.checked:t.value}}}}),l(["copy","cut","paste"],{createEventArgs:e=>({type:e.type})}),l(["drag","dragend","dragenter","dragleave","dragover","dragstart","drop"],{createEventArgs:e=>{return{...d(t=e),dataTransfer:t.dataTransfer?{dropEffect:t.dataTransfer.dropEffect,effectAllowed:t.dataTransfer.effectAllowed,files:Array.from(t.dataTransfer.files).map((e=>e.name)),items:Array.from(t.dataTransfer.items).map((e=>({kind:e.kind,type:e.type}))),types:t.dataTransfer.types}:null};var t}}),l(["focus","blur","focusin","focusout"],{createEventArgs:e=>({type:e.type})}),l(["keydown","keyup","keypress"],{createEventArgs:e=>{return{key:(t=e).key,code:t.code,location:t.location,repeat:t.repeat,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["contextmenu","click","mouseover","mouseout","mousemove","mousedown","mouseup","mouseleave","mouseenter","dblclick"],{createEventArgs:e=>d(e)}),l(["error"],{createEventArgs:e=>{return{message:(t=e).message,filename:t.filename,lineno:t.lineno,colno:t.colno,type:t.type};var t}}),l(["loadstart","timeout","abort","load","loadend","progress"],{createEventArgs:e=>{return{lengthComputable:(t=e).lengthComputable,loaded:t.loaded,total:t.total,type:t.type};var t}}),l(["touchcancel","touchend","touchmove","touchenter","touchleave","touchstart"],{createEventArgs:e=>{return{detail:(t=e).detail,touches:u(t.touches),targetTouches:u(t.targetTouches),changedTouches:u(t.changedTouches),ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,type:t.type};var t}}),l(["gotpointercapture","lostpointercapture","pointercancel","pointerdown","pointerenter","pointerleave","pointermove","pointerout","pointerover","pointerup"],{createEventArgs:e=>{return{...d(t=e),pointerId:t.pointerId,width:t.width,height:t.height,pressure:t.pressure,tiltX:t.tiltX,tiltY:t.tiltY,pointerType:t.pointerType,isPrimary:t.isPrimary};var t}}),l(["wheel","mousewheel"],{createEventArgs:e=>{return{...d(t=e),deltaX:t.deltaX,deltaY:t.deltaY,deltaZ:t.deltaZ,deltaMode:t.deltaMode};var t}}),l(["toggle"],{createEventArgs:()=>({})});const f=["date","datetime-local","month","time","week"],h=new Map;let p,m,b=0;const v={async add(e,t,n){if(!n)throw new Error("initialParameters must be an object, even if empty.");const r="__bl-dynamic-root:"+(++b).toString();h.set(r,e);const o=await w().invokeMethodAsync("AddRootComponent",t,r),a=new y(o,m[t]);return await a.setParameters(n),a}};class g{invoke(e){return this._callback(e)}setCallback(t){this._selfJSObjectReference||(this._selfJSObjectReference=e.createJSObjectReference(this)),this._callback=t}getJSObjectReference(){return this._selfJSObjectReference}dispose(){this._selfJSObjectReference&&e.disposeJSObjectReference(this._selfJSObjectReference)}}class y{constructor(e,t){this._jsEventCallbackWrappers=new Map,this._componentId=e;for(const e of t)"eventcallback"===e.type&&this._jsEventCallbackWrappers.set(e.name.toLowerCase(),new g)}setParameters(e){const t={},n=Object.entries(e||{}),r=n.length;for(const[e,r]of n){const n=this._jsEventCallbackWrappers.get(e.toLowerCase());n&&r?(n.setCallback(r),t[e]=n.getJSObjectReference()):t[e]=r}return w().invokeMethodAsync("SetRootComponentParameters",this._componentId,r,t)}async dispose(){if(null!==this._componentId){await w().invokeMethodAsync("RemoveRootComponent",this._componentId),this._componentId=null;for(const e of this._jsEventCallbackWrappers.values())e.dispose()}}}function w(){if(!p)throw new Error("Dynamic root components have not been enabled in this application.");return p}const E=new Map;let S;const I=new Promise((e=>{S=e}));function C(e,t,n){return D(e,t.eventHandlerId,(()=>A(e).invokeMethodAsync("DispatchEventAsync",t,n)))}function A(e){const t=E.get(e);if(!t)throw new Error(`No interop methods are registered for renderer ${e}`);return t}let D=(e,t,n)=>n();const k=L(["abort","blur","canplay","canplaythrough","change","cuechange","durationchange","emptied","ended","error","focus","load","loadeddata","loadedmetadata","loadend","loadstart","mouseenter","mouseleave","pause","play","playing","progress","ratechange","reset","scroll","seeked","seeking","stalled","submit","suspend","timeupdate","toggle","unload","volumechange","waiting","DOMNodeInsertedIntoDocument","DOMNodeRemovedFromDocument"]),R={submit:!0},T=L(["click","dblclick","mousedown","mousemove","mouseup"]);class N{constructor(e){this.browserRendererId=e,this.afterClickCallbacks=[];const t=++N.nextEventDelegatorId;this.eventsCollectionKey=`_blazorEvents_${t}`,this.eventInfoStore=new _(this.onGlobalEvent.bind(this))}setListener(e,t,n,r){const o=this.getEventHandlerInfosForElement(e,!0),a=o.getHandler(t);if(a)this.eventInfoStore.update(a.eventHandlerId,n);else{const a={element:e,eventName:t,eventHandlerId:n,renderingComponentId:r};this.eventInfoStore.add(a),o.setHandler(t,a)}}getHandler(e){return this.eventInfoStore.get(e)}removeListener(e){const t=this.eventInfoStore.remove(e);if(t){const e=t.element,n=this.getEventHandlerInfosForElement(e,!1);n&&n.removeHandler(t.eventName)}}notifyAfterClick(e){this.afterClickCallbacks.push(e),this.eventInfoStore.addGlobalListener("click")}setStopPropagation(e,t,n){this.getEventHandlerInfosForElement(e,!0).stopPropagation(t,n)}setPreventDefault(e,t,n){this.getEventHandlerInfosForElement(e,!0).preventDefault(t,n)}onGlobalEvent(e){if(!(e.target instanceof Element))return;this.dispatchGlobalEventToAllElements(e.type,e);const t=(n=e.type,a.get(n));var n;t&&t.forEach((t=>this.dispatchGlobalEventToAllElements(t,e))),"click"===e.type&&this.afterClickCallbacks.forEach((t=>t(e)))}dispatchGlobalEventToAllElements(e,t){const n=t.composedPath();let o=n.shift(),a=null,s=!1;const c=Object.prototype.hasOwnProperty.call(k,e);let l=!1;for(;o;){const f=o,h=this.getEventHandlerInfosForElement(f,!1);if(h){const n=h.getHandler(e);if(n&&(u=f,d=t.type,!((u instanceof HTMLButtonElement||u instanceof HTMLInputElement||u instanceof HTMLTextAreaElement||u instanceof HTMLSelectElement)&&Object.prototype.hasOwnProperty.call(T,d)&&u.disabled))){if(!s){const n=i(e);a=(null==n?void 0:n.createEventArgs)?n.createEventArgs(t):{},s=!0}Object.prototype.hasOwnProperty.call(R,t.type)&&t.preventDefault(),C(this.browserRendererId,{eventHandlerId:n.eventHandlerId,eventName:e,eventFieldInfo:r.fromEvent(n.renderingComponentId,t)},a)}h.stopPropagation(e)&&(l=!0),h.preventDefault(e)&&t.preventDefault()}o=c||l?void 0:n.shift()}var u,d}getEventHandlerInfosForElement(e,t){return Object.prototype.hasOwnProperty.call(e,this.eventsCollectionKey)?e[this.eventsCollectionKey]:t?e[this.eventsCollectionKey]=new O:null}}N.nextEventDelegatorId=0;class _{constructor(e){this.globalListener=e,this.infosByEventHandlerId={},this.countByEventName={},s.push(this.handleEventNameAliasAdded.bind(this))}add(e){if(this.infosByEventHandlerId[e.eventHandlerId])throw new Error(`Event ${e.eventHandlerId} is already tracked`);this.infosByEventHandlerId[e.eventHandlerId]=e,this.addGlobalListener(e.eventName)}get(e){return this.infosByEventHandlerId[e]}addGlobalListener(e){if(e=c(e),Object.prototype.hasOwnProperty.call(this.countByEventName,e))this.countByEventName[e]++;else{this.countByEventName[e]=1;const t=Object.prototype.hasOwnProperty.call(k,e);document.addEventListener(e,this.globalListener,t)}}update(e,t){if(Object.prototype.hasOwnProperty.call(this.infosByEventHandlerId,t))throw new Error(`Event ${t} is already tracked`);const n=this.infosByEventHandlerId[e];delete this.infosByEventHandlerId[e],n.eventHandlerId=t,this.infosByEventHandlerId[t]=n}remove(e){const t=this.infosByEventHandlerId[e];if(t){delete this.infosByEventHandlerId[e];const n=c(t.eventName);0==--this.countByEventName[n]&&(delete this.countByEventName[n],document.removeEventListener(n,this.globalListener))}return t}handleEventNameAliasAdded(e,t){if(Object.prototype.hasOwnProperty.call(this.countByEventName,e)){const n=this.countByEventName[e];delete this.countByEventName[e],document.removeEventListener(e,this.globalListener),this.addGlobalListener(t),this.countByEventName[t]+=n-1}}}class O{constructor(){this.handlers={},this.preventDefaultFlags=null,this.stopPropagationFlags=null}getHandler(e){return Object.prototype.hasOwnProperty.call(this.handlers,e)?this.handlers[e]:null}setHandler(e,t){this.handlers[e]=t}removeHandler(e){delete this.handlers[e]}preventDefault(e,t){return void 0!==t&&(this.preventDefaultFlags=this.preventDefaultFlags||{},this.preventDefaultFlags[e]=t),!!this.preventDefaultFlags&&this.preventDefaultFlags[e]}stopPropagation(e,t){return void 0!==t&&(this.stopPropagationFlags=this.stopPropagationFlags||{},this.stopPropagationFlags[e]=t),!!this.stopPropagationFlags&&this.stopPropagationFlags[e]}}function L(e){const t={};return e.forEach((e=>{t[e]=!0})),t}const F=G("_blazorLogicalChildren"),x=G("_blazorLogicalParent"),j=G("_blazorLogicalEnd");function P(e,t){if(e.childNodes.length>0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return F in e||(e[F]=[]),e}function H(e,t){const n=document.createComment("!");return M(n,e,t),n}function M(e,t,n){const r=e;if(e instanceof Comment&&z(r)&&z(r).length>0)throw new Error("Not implemented: inserting non-empty logical container");if(U(r))throw new Error("Not implemented: moving existing logical children");const o=z(t);if(n<o.length){const t=o[n];t.parentNode.insertBefore(e,t),o.splice(n,0,r)}else Y(e,t),o.push(r);r[x]=t,F in r||(r[F]=[])}function B(e,t){const n=z(e).splice(t,1)[0];if(n instanceof Comment){const e=z(n);if(e)for(;e.length>0;)B(n,0)}const r=n;r.parentNode.removeChild(r)}function U(e){return e[x]||null}function J(e,t){return z(e)[t]}function $(e){const t=V(e);return"http://www.w3.org/2000/svg"===t.namespaceURI&&"foreignObject"!==t.tagName}function z(e){return e[F]}function K(e,t){const n=z(e);t.forEach((e=>{e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=W(e.moveRangeStart)})),t.forEach((t=>{const r=document.createComment("marker");t.moveToBeforeMarker=r;const o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):Y(r,e)})),t.forEach((e=>{const t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd;let a=r;for(;a;){const e=a.nextSibling;if(n.insertBefore(a,t),a===o)break;a=e}n.removeChild(t)})),t.forEach((e=>{n[e.toSiblingIndex]=e.moveRangeStart}))}function V(e){if(e instanceof Element||e instanceof DocumentFragment)return e;if(e instanceof Comment)return e.parentNode;throw new Error("Not a valid logical element")}function X(e){const t=z(U(e));return t[Array.prototype.indexOf.call(t,e)+1]||null}function Y(e,t){if(t instanceof Element||t instanceof DocumentFragment)t.appendChild(e);else{if(!(t instanceof Comment))throw new Error(`Cannot append node because the parent is not a valid logical element. Parent: ${t}`);{const n=X(t);n?n.parentNode.insertBefore(e,n):Y(e,U(t))}}}function W(e){if(e instanceof Element||e instanceof DocumentFragment)return e;const t=X(e);if(t)return t.previousSibling;{const t=U(e);return t instanceof Element||t instanceof DocumentFragment?t.lastChild:W(t)}}function G(e){return"function"==typeof Symbol?Symbol():e}function q(e){return`_bl_${e}`}e.attachReviver(((e,t)=>t&&"object"==typeof t&&Object.prototype.hasOwnProperty.call(t,"__internalId")&&"string"==typeof t.__internalId?function(e){const t=`[${q(e)}]`;return document.querySelector(t)}(t.__internalId):t));const Z="_blazorDeferredValue",Q=document.createElement("template"),ee=document.createElementNS("http://www.w3.org/2000/svg","g"),te={},ne="__internal_",re="preventDefault_",oe="stopPropagation_";class ae{constructor(e){this.rootComponentIds=new Set,this.childComponentLocations={},this.eventDelegator=new N(e),this.eventDelegator.notifyAfterClick((e=>{if(!he)return;if(0!==e.button||function(e){return e.ctrlKey||e.shiftKey||e.altKey||e.metaKey}(e))return;if(e.defaultPrevented)return;const t=function(e){const t=!window._blazorDisableComposedPath&&e.composedPath&&e.composedPath();if(t){for(let e=0;e<t.length;e++){const n=t[e];if(n instanceof Element&&"A"===n.tagName)return n}return null}return Oe(e.target,"A")}(e);if(t&&function(e){const t=e.getAttribute("target");return(!t||"_self"===t)&&e.hasAttribute("href")&&!e.hasAttribute("download")}(t)){const n=_e(t.getAttribute("href"));Le(n)&&(e.preventDefault(),Ce(n,!0,!1))}}))}attachRootComponentToLogicalElement(e,t,n){this.attachComponentToElement(e,t),this.rootComponentIds.add(e),n||(te[e]=t)}updateComponent(e,t,n,r){var o;const a=this.childComponentLocations[t];if(!a)throw new Error(`No element is currently associated with component ${t}`);const s=te[t];if(s){const e=function(e){return e[j]||null}(s);delete te[t],e?function(e,t){const n=U(e);if(!n)throw new Error("Can't clear between nodes. The start node does not have a logical parent.");const r=z(n),o=r.indexOf(e)+1,a=r.indexOf(t);for(let e=o;e<=a;e++)B(n,o);e.textContent="!"}(s,e):function(e){let t;for(;t=e.firstChild;)e.removeChild(t)}(s)}const i=null===(o=V(a))||void 0===o?void 0:o.getRootNode(),c=i&&i.activeElement;this.applyEdits(e,t,a,0,n,r),c instanceof HTMLElement&&i&&i.activeElement!==c&&c.focus()}disposeComponent(e){this.rootComponentIds.delete(e)&&function(e){const t=z(e);for(;t.length;)B(e,0)}(this.childComponentLocations[e]),delete this.childComponentLocations[e]}disposeEventHandler(e){this.eventDelegator.removeListener(e)}attachComponentToElement(e,t){this.childComponentLocations[e]=t}applyEdits(e,n,r,o,a,s){let i,c=0,l=o;const u=e.arrayBuilderSegmentReader,d=e.editReader,f=e.frameReader,h=u.values(a),p=u.offset(a),m=p+u.count(a);for(let a=p;a<m;a++){const u=e.diffReader.editsEntry(h,a),p=d.editType(u);switch(p){case t.prependFrame:{const t=d.newTreeIndex(u),o=e.referenceFramesEntry(s,t),a=d.siblingIndex(u);this.insertFrame(e,n,r,l+a,s,o,t);break}case t.removeFrame:B(r,l+d.siblingIndex(u));break;case t.setAttribute:{const t=d.newTreeIndex(u),o=e.referenceFramesEntry(s,t),a=J(r,l+d.siblingIndex(u));if(!(a instanceof Element))throw new Error("Cannot set attribute on non-element child");this.applyAttribute(e,n,a,o);break}case t.removeAttribute:{const t=J(r,l+d.siblingIndex(u));if(!(t instanceof HTMLElement))throw new Error("Cannot remove attribute from non-element child");{const n=d.removedAttributeName(u);this.tryApplySpecialProperty(e,t,n,null)||t.removeAttribute(n)}break}case t.updateText:{const t=d.newTreeIndex(u),n=e.referenceFramesEntry(s,t),o=J(r,l+d.siblingIndex(u));if(!(o instanceof Text))throw new Error("Cannot set text content on non-text child");o.textContent=f.textContent(n);break}case t.updateMarkup:{const t=d.newTreeIndex(u),n=e.referenceFramesEntry(s,t),o=d.siblingIndex(u);B(r,l+o),this.insertMarkup(e,r,l+o,n);break}case t.stepIn:r=J(r,l+d.siblingIndex(u)),c++,l=0;break;case t.stepOut:r=U(r),c--,l=0===c?o:0;break;case t.permutationListEntry:i=i||[],i.push({fromSiblingIndex:l+d.siblingIndex(u),toSiblingIndex:l+d.moveToSiblingIndex(u)});break;case t.permutationListEnd:K(r,i),i=void 0;break;default:throw new Error(`Unknown edit type: ${p}`)}}}insertFrame(e,t,r,o,a,s,i){const c=e.frameReader,l=c.frameType(s);switch(l){case n.element:return this.insertElement(e,t,r,o,a,s,i),1;case n.text:return this.insertText(e,r,o,s),1;case n.attribute:throw new Error("Attribute frames should only be present as leading children of element frames.");case n.component:return this.insertComponent(e,r,o,s),1;case n.region:return this.insertFrameRange(e,t,r,o,a,i+1,i+c.subtreeLength(s));case n.elementReferenceCapture:if(r instanceof Element)return u=r,d=c.elementReferenceCaptureId(s),u.setAttribute(q(d),""),0;throw new Error("Reference capture frames can only be children of element frames.");case n.markup:return this.insertMarkup(e,r,o,s),1;default:throw new Error(`Unknown frame type: ${l}`)}var u,d}insertElement(e,t,r,o,a,s,i){const c=e.frameReader,l=c.elementName(s),u="svg"===l||$(r)?document.createElementNS("http://www.w3.org/2000/svg",l):document.createElement(l),d=P(u);let f=!1;const h=i+c.subtreeLength(s);for(let s=i+1;s<h;s++){const i=e.referenceFramesEntry(a,s);if(c.frameType(i)!==n.attribute){M(u,r,o),f=!0,this.insertFrameRange(e,t,d,0,a,s,h);break}this.applyAttribute(e,t,u,i)}f||M(u,r,o),u instanceof HTMLOptionElement?this.trySetSelectValueFromOptionElement(u):Z in u&&ue(u,u._blazorDeferredValue)}trySetSelectValueFromOptionElement(e){const t=this.findClosestAncestorSelectElement(e);if(!function(e){return!!e&&Z in e}(t))return!1;if(ce(t))e.selected=-1!==t._blazorDeferredValue.indexOf(e.value);else{if(t._blazorDeferredValue!==e.value)return!1;le(t,e.value),delete t._blazorDeferredValue}return!0}insertComponent(e,t,n,r){const o=H(t,n),a=e.frameReader.componentId(r);this.attachComponentToElement(a,o)}insertText(e,t,n,r){const o=e.frameReader.textContent(r);M(document.createTextNode(o),t,n)}insertMarkup(e,t,n,r){const o=H(t,n),a=(s=e.frameReader.markupContent(r),$(t)?(ee.innerHTML=s||" ",ee):(Q.innerHTML=s||" ",Q.content));var s;let i=0;for(;a.firstChild;)M(a.firstChild,o,i++)}applyAttribute(e,t,n,r){const o=e.frameReader,a=o.attributeName(r),s=o.attributeEventHandlerId(r);if(s){const e=ie(a);this.eventDelegator.setListener(n,e,s,t)}else this.tryApplySpecialProperty(e,n,a,r)||n.setAttribute(a,o.attributeValue(r))}tryApplySpecialProperty(e,t,n,r){switch(n){case"value":return this.tryApplyValueProperty(e,t,r);case"checked":return this.tryApplyCheckedProperty(e,t,r);default:return!!n.startsWith(ne)&&(this.applyInternalAttribute(e,t,n.substring(ne.length),r),!0)}}applyInternalAttribute(e,t,n,r){const o=r?e.frameReader.attributeValue(r):null;if(n.startsWith(oe)){const e=ie(n.substring(oe.length));this.eventDelegator.setStopPropagation(t,e,null!==o)}else{if(!n.startsWith(re))throw new Error(`Unsupported internal attribute '${n}'`);{const e=ie(n.substring(re.length));this.eventDelegator.setPreventDefault(t,e,null!==o)}}}tryApplyValueProperty(e,t,n){const r=e.frameReader;let o=n?r.attributeValue(n):null;switch(o&&"INPUT"===t.tagName&&(o=function(e,t){switch(t.getAttribute("type")){case"time":return 8!==e.length||!e.endsWith("00")&&t.hasAttribute("step")?e:e.substring(0,5);case"datetime-local":return 19!==e.length||!e.endsWith("00")&&t.hasAttribute("step")?e:e.substring(0,16);default:return e}}(o,t)),t.tagName){case"INPUT":case"SELECT":case"TEXTAREA":return o&&t instanceof HTMLSelectElement&&ce(t)&&(o=JSON.parse(o)),ue(t,o),t._blazorDeferredValue=o,!0;case"OPTION":return o||""===o?t.setAttribute("value",o):t.removeAttribute("value"),this.trySetSelectValueFromOptionElement(t),!0;default:return!1}}tryApplyCheckedProperty(e,t,n){if("INPUT"===t.tagName){const r=n?e.frameReader.attributeValue(n):null;return t.checked=null!==r,!0}return!1}findClosestAncestorSelectElement(e){for(;e;){if(e instanceof HTMLSelectElement)return e;e=e.parentElement}return null}insertFrameRange(e,t,n,r,o,a,s){const i=r;for(let i=a;i<s;i++){const a=e.referenceFramesEntry(o,i);r+=this.insertFrame(e,t,n,r,o,a,i),i+=se(e,a)}return r-i}}function se(e,t){const r=e.frameReader;switch(r.frameType(t)){case n.component:case n.element:case n.region:return r.subtreeLength(t)-1;default:return 0}}function ie(e){if(e.startsWith("on"))return e.substring(2);throw new Error(`Attribute should be an event name, but doesn't start with 'on'. Value: '${e}'`)}function ce(e){return"select-multiple"===e.type}function le(e,t){e.value=t||""}function ue(e,t){e instanceof HTMLSelectElement?ce(e)?function(e,t){t||(t=[]);for(let n=0;n<e.options.length;n++)e.options[n].selected=-1!==t.indexOf(e.options[n].value)}(e,t):le(e,t):e.value=t}const de={};let fe=!1,he=!1,pe=!1,me=!1,be=0,ve=0,ge=null,ye=null,we=async function(e){var t,n,r;if(De(),me){const o=null!==(n=null===(t=e.state)||void 0===t?void 0:t._index)&&void 0!==n?n:0,a=null===(r=e.state)||void 0===r?void 0:r.userState,s=o-be,i=location.href;if(await Ae(-s),!await ke(i,a,!1))return;await Ae(s)}await Re(!1)},Ee=null;const Se={listenForNavigationEvents:function(e,t){var n,r;ge=e,ye=t,pe||(pe=!0,window.addEventListener("popstate",Te),be=null!==(r=null===(n=history.state)||void 0===n?void 0:n._index)&&void 0!==r?r:0)},enableNavigationInterception:function(){he=!0},setHasLocationChangingListeners:function(e){me=e},endLocationChanging:function(e,t){Ee&&e===ve&&(Ee(t),Ee=null)},navigateTo:function(e,t){Ie(e,t,!0)},getBaseURI:()=>document.baseURI,getLocationHref:()=>location.href};function Ie(e,t,n=!1){const r=_e(e);!t.forceLoad&&Le(r)?Ce(r,!1,t.replaceHistoryEntry,t.historyEntryState,n):function(e,t){if(location.href===e){const t=e+"?";history.replaceState(null,"",t),location.replace(e)}else t?location.replace(e):location.href=e}(e,t.replaceHistoryEntry)}async function Ce(e,t,n,r,o=!1){De(),(o||!me||await ke(e,r,t))&&(fe=!0,n?history.replaceState({userState:r,_index:be},"",e):(be++,history.pushState({userState:r,_index:be},"",e)),await Re(t))}function Ae(e){return new Promise((t=>{const n=we;we=()=>{we=n,t()},history.go(e)}))}function De(){Ee&&(Ee(!1),Ee=null)}function ke(e,t,n){return new Promise((r=>{De(),ye?(ve++,Ee=r,ye(ve,e,t,n)):r(!1)}))}async function Re(e){var t;ge&&await ge(location.href,null===(t=history.state)||void 0===t?void 0:t.userState,e)}async function Te(e){var t,n;we&&await we(e),be=null!==(n=null===(t=history.state)||void 0===t?void 0:t._index)&&void 0!==n?n:0}let Ne;function _e(e){return Ne=Ne||document.createElement("a"),Ne.href=e,Ne.href}function Oe(e,t){return e?e.tagName===t?e:Oe(e.parentElement,t):null}function Le(e){const t=(n=document.baseURI).substring(0,n.lastIndexOf("/"));var n;const r=e.charAt(t.length);return e.startsWith(t)&&(""===r||"/"===r||"?"===r||"#"===r)}const Fe={focus:function(e,t){if(e instanceof HTMLElement)e.focus({preventScroll:t});else{if(!(e instanceof SVGElement))throw new Error("Unable to focus an invalid element.");if(!e.hasAttribute("tabindex"))throw new Error("Unable to focus an SVG element that does not have a tabindex.");e.focus({preventScroll:t})}},focusBySelector:function(e){const t=document.querySelector(e);t&&(t.hasAttribute("tabindex")||(t.tabIndex=-1),t.focus())}},xe={init:function(e,t,n,r=50){const o=Pe(t);(o||document.documentElement).style.overflowAnchor="none";const a=document.createRange();u(n.parentElement)&&(t.style.display="table-row",n.style.display="table-row");const s=new IntersectionObserver((function(r){r.forEach((r=>{var o;if(!r.isIntersecting)return;a.setStartAfter(t),a.setEndBefore(n);const s=a.getBoundingClientRect().height,i=null===(o=r.rootBounds)||void 0===o?void 0:o.height;r.target===t?e.invokeMethodAsync("OnSpacerBeforeVisible",r.intersectionRect.top-r.boundingClientRect.top,s,i):r.target===n&&n.offsetHeight>0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,s,i)}))}),{root:o,rootMargin:`${r}px`});s.observe(t),s.observe(n);const i=l(t),c=l(n);function l(e){const t={attributes:!0},n=new MutationObserver(((n,r)=>{u(e.parentElement)&&(r.disconnect(),e.style.display="table-row",r.observe(e,t)),s.unobserve(e),s.observe(e)}));return n.observe(e,t),n}function u(e){return null!==e&&(e instanceof HTMLTableElement&&""===e.style.display||"table"===e.style.display||e instanceof HTMLTableSectionElement&&""===e.style.display||"table-row-group"===e.style.display)}je[e._id]={intersectionObserver:s,mutationObserverBefore:i,mutationObserverAfter:c}},dispose:function(e){const t=je[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete je[e._id])}},je={};function Pe(e){return e&&e!==document.body&&e!==document.documentElement?"visible"!==getComputedStyle(e).overflowY?e:Pe(e.parentElement):null}const He={getAndRemoveExistingTitle:function(){var e;const t=document.head?document.head.getElementsByTagName("title"):[];if(0===t.length)return null;let n=null;for(let r=t.length-1;r>=0;r--){const o=t[r],a=o.previousSibling;a instanceof Comment&&null!==U(a)||(null===n&&(n=o.textContent),null===(e=o.parentNode)||void 0===e||e.removeChild(o))}return n}},Me={init:function(e,t){t._blazorInputFileNextFileId=0,t.addEventListener("click",(function(){t.value=""})),t.addEventListener("change",(function(){t._blazorFilesById={};const n=Array.prototype.map.call(t.files,(function(e){const n={id:++t._blazorInputFileNextFileId,lastModified:new Date(e.lastModified).toISOString(),name:e.name,size:e.size,contentType:e.type,readPromise:void 0,arrayBuffer:void 0,blob:e};return t._blazorFilesById[n.id]=n,n}));e.invokeMethodAsync("NotifyChange",n)}))},toImageFile:async function(e,t,n,r,o){const a=Be(e,t),s=await new Promise((function(e){const t=new Image;t.onload=function(){URL.revokeObjectURL(t.src),e(t)},t.onerror=function(){t.onerror=null,URL.revokeObjectURL(t.src)},t.src=URL.createObjectURL(a.blob)})),i=await new Promise((function(e){var t;const a=Math.min(1,r/s.width),i=Math.min(1,o/s.height),c=Math.min(a,i),l=document.createElement("canvas");l.width=Math.round(s.width*c),l.height=Math.round(s.height*c),null===(t=l.getContext("2d"))||void 0===t||t.drawImage(s,0,0,l.width,l.height),l.toBlob(e,n)})),c={id:++e._blazorInputFileNextFileId,lastModified:a.lastModified,name:a.name,size:(null==i?void 0:i.size)||0,contentType:n,blob:i||a.blob};return e._blazorFilesById[c.id]=c,c},readFileData:async function(e,t){return Be(e,t).blob}};function Be(e,t){const n=e._blazorFilesById[t];if(!n)throw new Error(`There is no file with ID ${t}. The file list may have changed. See https://aka.ms/aspnet/blazor-input-file-multiple-selections.`);return n}const Ue=new Set,Je={enableNavigationPrompt:function(e){0===Ue.size&&window.addEventListener("beforeunload",$e),Ue.add(e)},disableNavigationPrompt:function(e){Ue.delete(e),0===Ue.size&&window.removeEventListener("beforeunload",$e)}};function $e(e){e.preventDefault(),e.returnValue=!0}const ze=new Map,Ke={navigateTo:function(e,t,n=!1){Ie(e,t instanceof Object?t:{forceLoad:t,replaceHistoryEntry:n})},registerCustomEventType:function(e,t){if(!t)throw new Error("The options parameter is required.");if(o.has(e))throw new Error(`The event '${e}' is already registered.`);if(t.browserEventName){const n=a.get(t.browserEventName);n?n.push(e):a.set(t.browserEventName,[e]),s.forEach((n=>n(e,t.browserEventName)))}o.set(e,t)},rootComponents:v,_internal:{navigationManager:Se,domWrapper:Fe,Virtualize:xe,PageTitle:He,InputFile:Me,NavigationLock:Je,getJSDataStreamChunk:async function(e,t,n){return e instanceof Blob?await async function(e,t,n){const r=e.slice(t,t+n),o=await r.arrayBuffer();return new Uint8Array(o)}(e,t,n):function(e,t,n){return new Uint8Array(e.buffer,e.byteOffset+t,n)}(e,t,n)},receiveDotNetDataStream:function(t,n,r,o){let a=ze.get(t);if(!a){const n=new ReadableStream({start(e){ze.set(t,e),a=e}});e.jsCallDispatcher.supplyDotNetStream(t,n)}o?(a.error(o),ze.delete(t)):0===r?(a.close(),ze.delete(t)):a.enqueue(n.length===r?n:n.subarray(0,r))},attachWebRendererInterop:function(t,n,r,o){if(E.has(t))throw new Error(`Interop methods are already registered for renderer ${t}`);E.set(t,n),Object.keys(r).length>0&&function(t,n,r){if(p)throw new Error("Dynamic root components have already been enabled.");p=t,m=n;for(const[t,o]of Object.entries(r)){const r=e.jsCallDispatcher.findJSFunction(t,0);for(const e of o)r(e,n[e])}}(A(t),r,o),S()}}};window.Blazor=Ke;let Ve=!1;const Xe="function"==typeof TextDecoder?new TextDecoder("utf-8"):null,Ye=Xe?Xe.decode.bind(Xe):function(e){let t=0;const n=e.length,r=[],o=[];for(;t<n;){const n=e[t++];if(0===n)break;if(0==(128&n))r.push(n);else if(192==(224&n)){const o=63&e[t++];r.push((31&n)<<6|o)}else if(224==(240&n)){const o=63&e[t++],a=63&e[t++];r.push((31&n)<<12|o<<6|a)}else if(240==(248&n)){let o=(7&n)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++];o>65535&&(o-=65536,r.push(o>>>10&1023|55296),o=56320|1023&o),r.push(o)}r.length>1024&&(o.push(String.fromCharCode.apply(null,r)),r.length=0)}return o.push(String.fromCharCode.apply(null,r)),o.join("")},We=Math.pow(2,32),Ge=Math.pow(2,21)-1;function qe(e,t){return e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24}function Ze(e,t){return e[t]+(e[t+1]<<8)+(e[t+2]<<16)+(e[t+3]<<24>>>0)}function Qe(e,t){const n=Ze(e,t+4);if(n>Ge)throw new Error(`Cannot read uint64 with high order part ${n}, because the result would exceed Number.MAX_SAFE_INTEGER.`);return n*We+Ze(e,t)}class et{constructor(e){this.batchData=e;const t=new ot(e);this.arrayRangeReader=new at(e),this.arrayBuilderSegmentReader=new st(e),this.diffReader=new tt(e),this.editReader=new nt(e,t),this.frameReader=new rt(e,t)}updatedComponents(){return qe(this.batchData,this.batchData.length-20)}referenceFrames(){return qe(this.batchData,this.batchData.length-16)}disposedComponentIds(){return qe(this.batchData,this.batchData.length-12)}disposedEventHandlerIds(){return qe(this.batchData,this.batchData.length-8)}updatedComponentsEntry(e,t){const n=e+4*t;return qe(this.batchData,n)}referenceFramesEntry(e,t){return e+20*t}disposedComponentIdsEntry(e,t){const n=e+4*t;return qe(this.batchData,n)}disposedEventHandlerIdsEntry(e,t){const n=e+8*t;return Qe(this.batchData,n)}}class tt{constructor(e){this.batchDataUint8=e}componentId(e){return qe(this.batchDataUint8,e)}edits(e){return e+4}editsEntry(e,t){return e+16*t}}class nt{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}editType(e){return qe(this.batchDataUint8,e)}siblingIndex(e){return qe(this.batchDataUint8,e+4)}newTreeIndex(e){return qe(this.batchDataUint8,e+8)}moveToSiblingIndex(e){return qe(this.batchDataUint8,e+8)}removedAttributeName(e){const t=qe(this.batchDataUint8,e+12);return this.stringReader.readString(t)}}class rt{constructor(e,t){this.batchDataUint8=e,this.stringReader=t}frameType(e){return qe(this.batchDataUint8,e)}subtreeLength(e){return qe(this.batchDataUint8,e+4)}elementReferenceCaptureId(e){const t=qe(this.batchDataUint8,e+4);return this.stringReader.readString(t)}componentId(e){return qe(this.batchDataUint8,e+8)}elementName(e){const t=qe(this.batchDataUint8,e+8);return this.stringReader.readString(t)}textContent(e){const t=qe(this.batchDataUint8,e+4);return this.stringReader.readString(t)}markupContent(e){const t=qe(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeName(e){const t=qe(this.batchDataUint8,e+4);return this.stringReader.readString(t)}attributeValue(e){const t=qe(this.batchDataUint8,e+8);return this.stringReader.readString(t)}attributeEventHandlerId(e){return Qe(this.batchDataUint8,e+12)}}class ot{constructor(e){this.batchDataUint8=e,this.stringTableStartIndex=qe(e,e.length-4)}readString(e){if(-1===e)return null;{const n=qe(this.batchDataUint8,this.stringTableStartIndex+4*e),r=function(e,t){let n=0,r=0;for(let o=0;o<4;o++){const a=e[t+o];if(n|=(127&a)<<r,a<128)break;r+=7}return n}(this.batchDataUint8,n),o=n+((t=r)<128?1:t<16384?2:t<2097152?3:4),a=new Uint8Array(this.batchDataUint8.buffer,this.batchDataUint8.byteOffset+o,r);return Ye(a)}var t}}class at{constructor(e){this.batchDataUint8=e}count(e){return qe(this.batchDataUint8,e)}values(e){return e+4}}class st{constructor(e){this.batchDataUint8=e}offset(e){return 0}count(e){return qe(this.batchDataUint8,e)}values(e){return e+4}}const it="__bwv:";let ct=!1;function lt(e,t){mt("OnRenderCompleted",e,t)}function ut(e,t,n,r,o){mt("BeginInvokeDotNet",e?e.toString():null,t,n,r||0,o)}function dt(e,t,n){mt("EndInvokeJS",e,t,n)}function ft(e,t){const n=function(e){const t=new Array(e.length);for(let n=0;n<e.length;n++)t[n]=String.fromCharCode(e[n]);return btoa(t.join(""))}(t);mt("ReceiveByteArrayFromJS",e,n)}function ht(e,t,n){return mt("OnLocationChanged",e,t,n),Promise.resolve()}function pt(e,t,n,r){return mt("OnLocationChanging",e,t,n,r),Promise.resolve()}function mt(e,...t){const n=function(e,t){return ct?null:`__bwv:${JSON.stringify([e,...t])}`}(e,t);n&&window.external.sendMessage(n)}function bt(t,n){const r=vt(n);e.jsCallDispatcher.receiveByteArray(t,r)}function vt(e){const t=atob(e),n=t.length,r=new Uint8Array(n);for(let e=0;e<n;e++)r[e]=t.charCodeAt(e);return r}class gt{constructor(){this.afterStartedCallbacks=[]}async importInitializersAsync(e,t){await Promise.all(e.map((e=>async function(e,n){const r=function(e){const t=document.baseURI;return t.endsWith("/")?`${t}${e}`:`${t}/${e}`}(n),o=await import(r);if(void 0===o)return;const{beforeStart:a,afterStarted:s}=o;return s&&e.afterStartedCallbacks.push(s),a?a(...t):void 0}(this,e))))}async invokeAfterStartedCallbacks(e){await I,await Promise.all(this.afterStartedCallbacks.map((t=>t(e))))}}let yt=!1;async function wt(){if(yt)throw new Error("Blazor has already started.");yt=!0;const t=await async function(){const e=await fetch("_framework/blazor.modules.json",{method:"GET",credentials:"include",cache:"no-cache"}),t=await e.json(),n=new gt;return await n.importInitializersAsync(t,[]),n}();(function(){const t={AttachToDocument:(e,t)=>{!function(e,t,n){const r="::after";let o=!1;if(e.endsWith(r))e=e.slice(0,-r.length),o=!0;else if(e.endsWith("::before"))throw new Error("The '::before' selector is not supported.");const a=function(e){const t=h.get(e);if(t)return h.delete(e),t}(e)||document.querySelector(e);if(!a)throw new Error(`Could not find any element matching selector '${e}'.`);!function(e,t,n,r){let o=de[0];o||(o=new ae(0),de[0]=o),o.attachRootComponentToLogicalElement(n,t,r)}(0,P(a,!0),t,o)}(t,e)},RenderBatch:(e,t)=>{try{const n=vt(t);(function(e,t){const n=de[0];if(!n)throw new Error("There is no browser renderer with ID 0.");const r=t.arrayRangeReader,o=t.updatedComponents(),a=r.values(o),s=r.count(o),i=t.referenceFrames(),c=r.values(i),l=t.diffReader;for(let e=0;e<s;e++){const r=t.updatedComponentsEntry(a,e),o=l.componentId(r),s=l.edits(r);n.updateComponent(t,o,s,c)}const u=t.disposedComponentIds(),d=r.values(u),f=r.count(u);for(let e=0;e<f;e++){const r=t.disposedComponentIdsEntry(d,e);n.disposeComponent(r)}const h=t.disposedEventHandlerIds(),p=r.values(h),m=r.count(h);for(let e=0;e<m;e++){const r=t.disposedEventHandlerIdsEntry(p,e);n.disposeEventHandler(r)}fe&&(fe=!1,window.scrollTo&&window.scrollTo(0,0))})(0,new et(n)),lt(e,null)}catch(t){lt(e,t.toString())}},NotifyUnhandledException:(e,t)=>{ct=!0,console.error(`${e}\n${t}`),function(){const e=document.querySelector("#blazor-error-ui");e&&(e.style.display="block"),Ve||(Ve=!0,document.querySelectorAll("#blazor-error-ui .reload").forEach((e=>{e.onclick=function(e){location.reload(),e.preventDefault()}})),document.querySelectorAll("#blazor-error-ui .dismiss").forEach((e=>{e.onclick=function(e){const t=document.querySelector("#blazor-error-ui");t&&(t.style.display="none"),e.preventDefault()}})))}()},BeginInvokeJS:e.jsCallDispatcher.beginInvokeJSFromDotNet,EndInvokeDotNet:e.jsCallDispatcher.endInvokeDotNetFromJS,SendByteArrayToJS:bt,Navigate:Se.navigateTo,SetHasLocationChangingListeners:Se.setHasLocationChangingListeners,EndLocationChanging:Se.endLocationChanging};window.external.receiveMessage((e=>{const n=function(e){if(ct||!e||!e.startsWith(it))return null;const t=e.substring(it.length),[n,...r]=JSON.parse(t);return{messageType:n,args:r}}(e);if(n){if(!Object.prototype.hasOwnProperty.call(t,n.messageType))throw new Error(`Unsupported IPC message type '${n.messageType}'`);t[n.messageType].apply(null,n.args)}}))})(),e.attachDispatcher({beginInvokeDotNetFromJS:ut,endInvokeJSFromDotNet:dt,sendByteArray:ft}),Se.enableNavigationInterception(),Se.listenForNavigationEvents(ht,pt),mt("AttachPage",Se.getBaseURI(),Se.getLocationHref()),await t.invokeAfterStartedCallbacks(Ke)}Ke.start=wt,document&&document.currentScript&&"false"!==document.currentScript.getAttribute("autostart")&&wt()})(); \ No newline at end of file
diff --git a/src/Components/Web.JS/package.json b/src/Components/Web.JS/package.json
index 4c2992f50b..8f074f8362 100644
--- a/src/Components/Web.JS/package.json
+++ b/src/Components/Web.JS/package.json
@@ -25,19 +25,16 @@
"@microsoft/signalr-protocol-msgpack": "link:../../SignalR/clients/ts/signalr-protocol-msgpack",
"@types/dotnet": "./@types/dotnet",
"@types/jsdom": "^16.2.14",
- "@typescript-eslint/eslint-plugin": "^5.9.1",
- "@typescript-eslint/parser": "^5.9.1",
- "eslint": "^8.6.0",
+ "@typescript-eslint/eslint-plugin": "^5.26.0",
+ "@typescript-eslint/parser": "^5.26.0",
+ "eslint": "^8.16.0",
"eslint-plugin-header": "^3.1.1",
"inspectpack": "^4.7.1",
"rimraf": "^3.0.2",
- "terser": "^5.10.0",
+ "terser": "^5.14.2",
"ts-loader": "^9.2.6",
"typescript": "^4.5.4",
- "webpack": "^5.66.0",
- "webpack-cli": "^4.9.1"
- },
- "resolutions": {
- "url-parse": ">=1.5.6"
+ "webpack": "^5.72.1",
+ "webpack-cli": "^4.9.2"
}
}
diff --git a/src/Components/Web.JS/src/Boot.Server.ts b/src/Components/Web.JS/src/Boot.Server.ts
index d5972aed6d..2c1993aa52 100644
--- a/src/Components/Web.JS/src/Boot.Server.ts
+++ b/src/Components/Web.JS/src/Boot.Server.ts
@@ -60,8 +60,10 @@ async function boot(userOptions?: Partial<CircuitStartOptions>): Promise<void> {
const circuit = new CircuitDescriptor(components, appState || '');
// Configure navigation via SignalR
- Blazor._internal.navigationManager.listenForNavigationEvents((uri: string, intercepted: boolean): Promise<void> => {
- return connection.send('OnLocationChanged', uri, intercepted);
+ Blazor._internal.navigationManager.listenForNavigationEvents((uri: string, state: string | undefined, intercepted: boolean): Promise<void> => {
+ return connection.send('OnLocationChanged', uri, state, intercepted);
+ }, (callId: number, uri: string, state: string | undefined, intercepted: boolean): Promise<void> => {
+ return connection.send('OnLocationChanging', callId, uri, state, intercepted);
});
Blazor._internal.forceCloseConnection = () => connection.stop();
@@ -130,6 +132,8 @@ async function initializeConnection(options: CircuitStartOptions, logger: Logger
renderQueue.processBatch(batchId, batchData, newConnection);
});
+ newConnection.on('JS.EndLocationChanging', Blazor._internal.navigationManager.endLocationChanging);
+
newConnection.onclose(error => !renderingFailed && options.reconnectionHandler!.onConnectionDown(options.reconnectionOptions, error));
newConnection.on('JS.Error', error => {
renderingFailed = true;
diff --git a/src/Components/Web.JS/src/Boot.WebAssembly.ts b/src/Components/Web.JS/src/Boot.WebAssembly.ts
index 46ca685aec..e46702cc4d 100644
--- a/src/Components/Web.JS/src/Boot.WebAssembly.ts
+++ b/src/Components/Web.JS/src/Boot.WebAssembly.ts
@@ -79,13 +79,24 @@ async function boot(options?: Partial<WebAssemblyStartOptions>): Promise<void> {
Blazor._internal.navigationManager.getUnmarshalledBaseURI = () => BINDING.js_string_to_mono_string(getBaseUri());
Blazor._internal.navigationManager.getUnmarshalledLocationHref = () => BINDING.js_string_to_mono_string(getLocationHref());
- Blazor._internal.navigationManager.listenForNavigationEvents(async (uri: string, intercepted: boolean): Promise<void> => {
+ Blazor._internal.navigationManager.listenForNavigationEvents(async (uri: string, state: string | undefined, intercepted: boolean): Promise<void> => {
await DotNet.invokeMethodAsync(
'Microsoft.AspNetCore.Components.WebAssembly',
'NotifyLocationChanged',
uri,
+ state,
intercepted
);
+ }, async (callId: number, uri: string, state: string | undefined, intercepted: boolean): Promise<void> => {
+ const shouldContinueNavigation = await DotNet.invokeMethodAsync<boolean>(
+ 'Microsoft.AspNetCore.Components.WebAssembly',
+ 'NotifyLocationChangingAsync',
+ uri,
+ state,
+ intercepted
+ );
+
+ Blazor._internal.navigationManager.endLocationChanging(callId, shouldContinueNavigation);
});
const candidateOptions = options ?? {};
@@ -141,6 +152,7 @@ async function boot(options?: Partial<WebAssemblyStartOptions>): Promise<void> {
jsInitializer.invokeAfterStartedCallbacks(Blazor);
}
+// obsolete, legacy, don't use for new code!
function invokeJSFromDotNet(callInfo: Pointer, arg0: any, arg1: any, arg2: any): any {
const functionIdentifier = monoPlatform.readStringField(callInfo, 0)!;
const resultType = monoPlatform.readInt32Field(callInfo, 4);
diff --git a/src/Components/Web.JS/src/Boot.WebView.ts b/src/Components/Web.JS/src/Boot.WebView.ts
index 8f7d91565b..8aca3b1090 100644
--- a/src/Components/Web.JS/src/Boot.WebView.ts
+++ b/src/Components/Web.JS/src/Boot.WebView.ts
@@ -6,7 +6,7 @@ import { Blazor } from './GlobalExports';
import { shouldAutoStart } from './BootCommon';
import { internalFunctions as navigationManagerFunctions } from './Services/NavigationManager';
import { startIpcReceiver } from './Platform/WebView/WebViewIpcReceiver';
-import { sendAttachPage, sendBeginInvokeDotNetFromJS, sendEndInvokeJSFromDotNet, sendByteArray, sendLocationChanged } from './Platform/WebView/WebViewIpcSender';
+import { sendAttachPage, sendBeginInvokeDotNetFromJS, sendEndInvokeJSFromDotNet, sendByteArray, sendLocationChanged, sendLocationChanging } from './Platform/WebView/WebViewIpcSender';
import { fetchAndInvokeInitializers } from './JSInitializers/JSInitializers.WebView';
let started = false;
@@ -28,7 +28,7 @@ async function boot(): Promise<void> {
});
navigationManagerFunctions.enableNavigationInterception();
- navigationManagerFunctions.listenForNavigationEvents(sendLocationChanged);
+ navigationManagerFunctions.listenForNavigationEvents(sendLocationChanged, sendLocationChanging);
sendAttachPage(navigationManagerFunctions.getBaseURI(), navigationManagerFunctions.getLocationHref());
await jsInitializer.invokeAfterStartedCallbacks(Blazor);
diff --git a/src/Components/Web.JS/src/GlobalExports.ts b/src/Components/Web.JS/src/GlobalExports.ts
index 4612146b46..4fca849b69 100644
--- a/src/Components/Web.JS/src/GlobalExports.ts
+++ b/src/Components/Web.JS/src/GlobalExports.ts
@@ -8,6 +8,7 @@ import { PageTitle } from './PageTitle';
import { registerCustomEventType, EventTypeOptions } from './Rendering/Events/EventTypes';
import { HubConnection } from '@microsoft/signalr';
import { InputFile } from './InputFile';
+import { NavigationLock } from './NavigationLock';
import { DefaultReconnectionHandler } from './Platform/Circuits/DefaultReconnectionHandler';
import { CircuitStartOptions } from './Platform/Circuits/CircuitStartOptions';
import { WebAssemblyStartOptions } from './Platform/WebAssemblyStartOptions';
@@ -34,6 +35,7 @@ interface IBlazor {
PageTitle: typeof PageTitle,
forceCloseConnection?: () => Promise<void>;
InputFile?: typeof InputFile,
+ NavigationLock: typeof NavigationLock,
invokeJSFromDotNet?: (callInfo: Pointer, arg0: any, arg1: any, arg2: any) => any;
endInvokeDotNetFromJS?: (callId: System_String, success: System_Boolean, resultJsonOrErrorMessage: System_String) => void;
receiveByteArray?: (id: System_Int, data: System_Array<System_Byte>) => void;
@@ -79,6 +81,7 @@ export const Blazor: IBlazor = {
Virtualize,
PageTitle,
InputFile,
+ NavigationLock,
getJSDataStreamChunk: getNextChunk,
receiveDotNetDataStream: receiveDotNetDataStream,
attachWebRendererInterop,
diff --git a/src/Components/Web.JS/src/NavigationLock.ts b/src/Components/Web.JS/src/NavigationLock.ts
new file mode 100644
index 0000000000..e2c2a9f0da
--- /dev/null
+++ b/src/Components/Web.JS/src/NavigationLock.ts
@@ -0,0 +1,33 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+const registeredLocks = new Set<string>();
+
+export const NavigationLock = {
+ enableNavigationPrompt,
+ disableNavigationPrompt,
+};
+
+function onBeforeUnload(event: BeforeUnloadEvent) {
+ event.preventDefault();
+ // Modern browsers display a confirmation prompt when returnValue is some value other than
+ // null or undefined.
+ // See: https://developer.mozilla.org/en-US/docs/Web/API/Window/beforeunload_event#compatibility_notes
+ event.returnValue = true;
+}
+
+function enableNavigationPrompt(id: string) {
+ if (registeredLocks.size === 0) {
+ window.addEventListener('beforeunload', onBeforeUnload);
+ }
+
+ registeredLocks.add(id);
+}
+
+function disableNavigationPrompt(id: string) {
+ registeredLocks.delete(id);
+
+ if (registeredLocks.size === 0) {
+ window.removeEventListener('beforeunload', onBeforeUnload);
+ }
+}
diff --git a/src/Components/Web.JS/src/Platform/BootConfig.ts b/src/Components/Web.JS/src/Platform/BootConfig.ts
index 26f5755c00..4f14e8fe39 100644
--- a/src/Components/Web.JS/src/Platform/BootConfig.ts
+++ b/src/Components/Web.JS/src/Platform/BootConfig.ts
@@ -14,9 +14,15 @@ export class BootConfigResult {
loadBootResource('manifest', 'blazor.boot.json', '_framework/blazor.boot.json', '') :
defaultLoadBlazorBootJson('_framework/blazor.boot.json');
- const bootConfigResponse = loaderResponse instanceof Promise ?
- await loaderResponse :
- await defaultLoadBlazorBootJson(loaderResponse ?? '_framework/blazor.boot.json');
+ let bootConfigResponse: Response;
+
+ if (!loaderResponse) {
+ bootConfigResponse = await defaultLoadBlazorBootJson('_framework/blazor.boot.json');
+ } else if (typeof loaderResponse === 'string') {
+ bootConfigResponse = await defaultLoadBlazorBootJson(loaderResponse);
+ } else {
+ bootConfigResponse = await loaderResponse;
+ }
// While we can expect an ASP.NET Core hosted application to include the environment, other
// hosts may not. Assume 'Production' in the absence of any specified value.
diff --git a/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts b/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts
index 10ef23df3b..a74946db49 100644
--- a/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts
+++ b/src/Components/Web.JS/src/Platform/Mono/MonoDebugger.ts
@@ -9,7 +9,7 @@ const brands = navigatorUA.userAgentData && navigatorUA.userAgentData.brands;
const currentBrowserIsChromeOrEdge = brands
? brands.some(b => b.brand === 'Google Chrome' || b.brand === 'Microsoft Edge')
: (window as any).chrome;
-const platform = navigatorUA.userAgentData ? navigatorUA.userAgentData.platform : navigator.platform;
+const platform = navigatorUA.userAgentData?.platform ?? navigator.platform;
let hasReferencedPdbs = false;
let debugBuild = false;
diff --git a/src/Components/Web.JS/src/Platform/Mono/MonoPlatform.ts b/src/Components/Web.JS/src/Platform/Mono/MonoPlatform.ts
index 0aa9efa09d..03c2a5d90f 100644
--- a/src/Components/Web.JS/src/Platform/Mono/MonoPlatform.ts
+++ b/src/Components/Web.JS/src/Platform/Mono/MonoPlatform.ts
@@ -18,6 +18,7 @@ import { DotnetPublicAPI, BINDINGType, CreateDotnetRuntimeType, DotnetModuleConf
export let BINDING: BINDINGType = undefined as any;
export let MONO: MONOType = undefined as any;
export let Module: DotnetModuleConfig & EmscriptenModule = undefined as any;
+export let IMPORTS: any = undefined as any;
const appBinDirName = 'appBinDir';
const uint64HighOrderShift = Math.pow(2, 32);
@@ -249,6 +250,14 @@ async function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourc
const existingPostRun = moduleConfig.postRun || [];
(moduleConfig as any).preloadPlugins = [];
+ let resourcesLoaded = 0;
+ function setProgress(){
+ resourcesLoaded++;
+ const percentage = resourcesLoaded / totalResources.length * 100;
+ document.documentElement.style.setProperty('--blazor-load-percentage', `${percentage}%`);
+ document.documentElement.style.setProperty('--blazor-load-percentage-text', `"${Math.floor(percentage)}%"`);
+ }
+
// Begin loading the .dll/.pdb/.wasm files, but don't block here. Let other loading processes run in parallel.
const dotnetWasmResourceName = 'dotnet.wasm';
const assembliesBeingLoaded = resourceLoader.loadResources(resources.assembly, filename => `_framework/${filename}`, 'assembly');
@@ -259,6 +268,8 @@ async function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourc
/* hash */ resourceLoader.bootConfig.resources.runtime[dotnetWasmResourceName],
/* type */ 'dotnetwasm'
);
+ const totalResources = assembliesBeingLoaded.concat(pdbsBeingLoaded, wasmBeingLoaded);
+ totalResources.forEach(loadingResource => loadingResource.response.then(_ => setProgress()));
const dotnetTimeZoneResourceName = 'dotnet.timezones.blat';
let timeZoneResource: LoadingResource | undefined;
@@ -269,6 +280,8 @@ async function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourc
resourceLoader.bootConfig.resources.runtime[dotnetTimeZoneResourceName],
'globalization'
);
+ totalResources.push(timeZoneResource);
+ timeZoneResource.response.then(_ => setProgress());
}
let icuDataResource: LoadingResource | undefined;
@@ -281,23 +294,26 @@ async function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourc
resourceLoader.bootConfig.resources.runtime[icuDataResourceName],
'globalization'
);
+ totalResources.push(icuDataResource);
+ icuDataResource.response.then(_ => setProgress());
}
const createDotnetRuntime = await dotnetJsBeingLoaded;
await createDotnetRuntime((api) => {
- const { MONO: mono, BINDING: binding, Module: module } = api;
+ const { MONO: mono, BINDING: binding, Module: module, IMPORTS: imports } = api;
Module = module;
BINDING = binding;
MONO = mono;
+ IMPORTS = imports;
// Override the mechanism for fetching the main wasm file so we can connect it to our cache
- const instantiateWasm = (imports, successCallback) => {
+ const instantiateWasm = (wasmImports, successCallback) => {
(async () => {
let compiledInstance: WebAssembly.Instance;
try {
const dotnetWasmResource = await wasmBeingLoaded;
- compiledInstance = await compileWasmModule(dotnetWasmResource, imports);
+ compiledInstance = await compileWasmModule(dotnetWasmResource, wasmImports);
} catch (ex) {
printErr((ex as Error).toString());
throw ex;
@@ -329,9 +345,7 @@ async function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourc
assembliesBeingLoaded.forEach(r => addResourceAsAssembly(r, changeExtension(r.name, '.dll')));
pdbsBeingLoaded.forEach(r => addResourceAsAssembly(r, r.name));
- Blazor._internal.dotNetCriticalError = (message) => {
- printErr(BINDING.conv_string(message) || '(null)');
- };
+ Blazor._internal.dotNetCriticalError = (message) => printErr(message || '(null)');
// Wire-up callbacks for satellite assemblies. Blazor will call these as part of the application
// startup sequence to load satellite assemblies for the application's culture.
@@ -467,6 +481,16 @@ async function createEmscriptenModuleInstance(resourceLoader: WebAssemblyResourc
// -1 enables debugging with logging disabled. 0 disables debugging entirely.
MONO.mono_wasm_load_runtime(appBinDirName, hasDebuggingEnabled() ? -1 : 0);
MONO.mono_wasm_runtime_ready();
+ try {
+ BINDING.bind_static_method('invalid-fqn', '');
+ } catch (e) {
+ // HOTFIX: until https://github.com/dotnet/runtime/pull/72275
+ // this would always throw, but it will initialize runtime interop as side-effect
+ }
+
+ // makes Blazor._internal visible to [JSImport]
+ IMPORTS.Blazor = { _internal: Blazor._internal };
+
attachInteropInvoker();
runtimeReadyResolve(api);
};
@@ -628,24 +652,28 @@ async function loadICUData(icuDataResource: LoadingResource): Promise<void> {
}
async function compileWasmModule(wasmResource: LoadingResource, imports: any): Promise<WebAssembly.Instance> {
- // This is the same logic as used in emscripten's generated js. We can't use emscripten's js because
- // it doesn't provide any method for supplying a custom response provider, and we want to integrate
- // with our resource loader cache.
+ const wasmResourceResponse = await wasmResource.response;
- if (typeof WebAssembly['instantiateStreaming'] === 'function') {
- try {
- const streamingResult = await WebAssembly['instantiateStreaming'](wasmResource.response, imports);
- return streamingResult.instance;
- } catch (ex) {
- console.info('Streaming compilation failed. Falling back to ArrayBuffer instantiation. ', ex);
+ // The instantiateStreaming spec explicitly requires the following exact MIME type (with no trailing parameters, etc.)
+ // https://webassembly.github.io/spec/web-api/#dom-webassembly-instantiatestreaming
+ const hasWasmContentType = wasmResourceResponse.headers?.get('content-type') === 'application/wasm';
+
+ if (hasWasmContentType && typeof WebAssembly.instantiateStreaming === 'function') {
+ // We can use streaming compilation. We know this shouldn't fail due to the content-type header being wrong,
+ // as we already just checked that. So if this fails for some other reason we'll treat it as fatal.
+ const streamingResult = await WebAssembly.instantiateStreaming(wasmResourceResponse, imports);
+ return streamingResult.instance;
+ } else {
+ if (!hasWasmContentType) {
+ // In most cases the developer should fix this. It's unusual enough that we don't mind logging a warning each time.
+ console.warn('WebAssembly resource does not have the expected content type "application/wasm", so falling back to slower ArrayBuffer instantiation.');
}
- }
- // If that's not available or fails (e.g., due to incorrect content-type header),
- // fall back to ArrayBuffer instantiation
- const arrayBuffer = await wasmResource.response.then(r => r.arrayBuffer());
- const arrayBufferResult = await WebAssembly.instantiate(arrayBuffer, imports);
- return arrayBufferResult.instance;
+ // Fall back on ArrayBuffer instantiation.
+ const arrayBuffer = await wasmResourceResponse.arrayBuffer();
+ const arrayBufferResult = await WebAssembly.instantiate(arrayBuffer, imports);
+ return arrayBufferResult.instance;
+ }
}
function changeExtension(filename: string, newExtensionWithLeadingDot: string) {
diff --git a/src/Components/Web.JS/src/Platform/WebView/WebViewIpcReceiver.ts b/src/Components/Web.JS/src/Platform/WebView/WebViewIpcReceiver.ts
index d01ed605d7..1f1c0bbd46 100644
--- a/src/Components/Web.JS/src/Platform/WebView/WebViewIpcReceiver.ts
+++ b/src/Components/Web.JS/src/Platform/WebView/WebViewIpcReceiver.ts
@@ -39,6 +39,10 @@ export function startIpcReceiver(): void {
'SendByteArrayToJS': receiveBase64ByteArray,
'Navigate': navigationManagerFunctions.navigateTo,
+
+ 'SetHasLocationChangingListeners': navigationManagerFunctions.setHasLocationChangingListeners,
+
+ 'EndLocationChanging': navigationManagerFunctions.endLocationChanging,
};
// eslint-disable-next-line @typescript-eslint/no-explicit-any
diff --git a/src/Components/Web.JS/src/Platform/WebView/WebViewIpcSender.ts b/src/Components/Web.JS/src/Platform/WebView/WebViewIpcSender.ts
index eb1cf7c747..9f0fe41899 100644
--- a/src/Components/Web.JS/src/Platform/WebView/WebViewIpcSender.ts
+++ b/src/Components/Web.JS/src/Platform/WebView/WebViewIpcSender.ts
@@ -36,8 +36,13 @@ function base64EncodeByteArray(data: Uint8Array) {
return dataBase64Encoded;
}
-export function sendLocationChanged(uri: string, intercepted: boolean): Promise<void> {
- send('OnLocationChanged', uri, intercepted);
+export function sendLocationChanged(uri: string, state: string | undefined, intercepted: boolean): Promise<void> {
+ send('OnLocationChanged', uri, state, intercepted);
+ return Promise.resolve(); // Like in Blazor Server, we only issue the notification here - there's no need to wait for a response
+}
+
+export function sendLocationChanging(callId: number, uri: string, state: string | undefined, intercepted: boolean): Promise<void> {
+ send('OnLocationChanging', callId, uri, state, intercepted);
return Promise.resolve(); // Like in Blazor Server, we only issue the notification here - there's no need to wait for a response
}
diff --git a/src/Components/Web.JS/src/Rendering/BrowserRenderer.ts b/src/Components/Web.JS/src/Rendering/BrowserRenderer.ts
index 279547996a..8b517d632e 100644
--- a/src/Components/Web.JS/src/Rendering/BrowserRenderer.ts
+++ b/src/Components/Web.JS/src/Rendering/BrowserRenderer.ts
@@ -402,7 +402,7 @@ export class BrowserRenderer {
let value = attributeFrame ? frameReader.attributeValue(attributeFrame) : null;
if (value && element.tagName === 'INPUT') {
- value = normalizeInputValue(value, element.getAttribute('type'));
+ value = normalizeInputValue(value, element);
}
switch (element.tagName) {
@@ -499,20 +499,23 @@ function parseMarkup(markup: string, isSvg: boolean) {
}
}
-function normalizeInputValue(value: string, type: string | null): string {
+function normalizeInputValue(value: string, element: Element): string {
// Time inputs (e.g. 'time' and 'datetime-local') misbehave on chromium-based
// browsers when a time is set that includes a seconds value of '00', most notably
// when entered from keyboard input. This behavior is not limited to specific
// 'step' attribute values, so we always remove the trailing seconds value if the
// time ends in '00'.
+ // Similarly, if a time-related element doesn't have any 'step' attribute, browsers
+ // treat this as "round to whole number of minutes" making it invalid to pass any
+ // 'seconds' value, so in that case we strip off the 'seconds' part of the value.
- switch (type) {
+ switch (element.getAttribute('type')) {
case 'time':
- return value.length === 8 && value.endsWith('00')
+ return value.length === 8 && (value.endsWith('00') || !element.hasAttribute('step'))
? value.substring(0, 5)
: value;
case 'datetime-local':
- return value.length === 19 && value.endsWith('00')
+ return value.length === 19 && (value.endsWith('00') || !element.hasAttribute('step'))
? value.substring(0, 16)
: value;
default:
diff --git a/src/Components/Web.JS/src/Rendering/Events/EventTypes.ts b/src/Components/Web.JS/src/Rendering/Events/EventTypes.ts
index f5c2200e8f..0350cd2548 100644
--- a/src/Components/Web.JS/src/Rendering/Events/EventTypes.ts
+++ b/src/Components/Web.JS/src/Rendering/Events/EventTypes.ts
@@ -305,6 +305,8 @@ function parseMouseEvent(event: MouseEvent): MouseEventArgs {
offsetY: event.offsetY,
pageX: event.pageX,
pageY: event.pageY,
+ movementX: event.movementX,
+ movementY: event.movementY,
button: event.button,
buttons: event.buttons,
ctrlKey: event.ctrlKey,
@@ -421,6 +423,8 @@ interface MouseEventArgs {
offsetY: number;
pageX: number;
pageY: number;
+ movementX: number;
+ movementY: number;
button: number;
buttons: number;
ctrlKey: boolean;
diff --git a/src/Components/Web.JS/src/Services/NavigationManager.ts b/src/Components/Web.JS/src/Services/NavigationManager.ts
index cf79ea98ef..c3321da6d9 100644
--- a/src/Components/Web.JS/src/Services/NavigationManager.ts
+++ b/src/Components/Web.JS/src/Services/NavigationManager.ts
@@ -7,34 +7,52 @@ import { EventDelegator } from '../Rendering/Events/EventDelegator';
let hasEnabledNavigationInterception = false;
let hasRegisteredNavigationEventListeners = false;
+let hasLocationChangingEventListeners = false;
+let currentHistoryIndex = 0;
+let currentLocationChangingCallId = 0;
// Will be initialized once someone registers
-let notifyLocationChangedCallback: ((uri: string, intercepted: boolean) => Promise<void>) | null = null;
+let notifyLocationChangedCallback: ((uri: string, state: string | undefined, intercepted: boolean) => Promise<void>) | null = null;
+let notifyLocationChangingCallback: ((callId: number, uri: string, state: string | undefined, intercepted: boolean) => Promise<void>) | null = null;
+
+let popStateCallback: ((state: PopStateEvent) => Promise<void> | void) = onBrowserInitiatedPopState;
+let resolveCurrentNavigation: ((shouldContinueNavigation: boolean) => void) | null = null;
// These are the functions we're making available for invocation from .NET
export const internalFunctions = {
listenForNavigationEvents,
enableNavigationInterception,
- navigateTo,
+ setHasLocationChangingListeners,
+ endLocationChanging,
+ navigateTo: navigateToFromDotNet,
getBaseURI: (): string => document.baseURI,
getLocationHref: (): string => location.href,
};
-function listenForNavigationEvents(callback: (uri: string, intercepted: boolean) => Promise<void>): void {
- notifyLocationChangedCallback = callback;
+function listenForNavigationEvents(
+ locationChangedCallback: (uri: string, state: string | undefined, intercepted: boolean) => Promise<void>,
+ locationChangingCallback: (callId: number, uri: string, state: string | undefined, intercepted: boolean) => Promise<void>
+): void {
+ notifyLocationChangedCallback = locationChangedCallback;
+ notifyLocationChangingCallback = locationChangingCallback;
if (hasRegisteredNavigationEventListeners) {
return;
}
hasRegisteredNavigationEventListeners = true;
- window.addEventListener('popstate', () => notifyLocationChanged(false));
+ window.addEventListener('popstate', onPopState);
+ currentHistoryIndex = history.state?._index ?? 0;
}
function enableNavigationInterception(): void {
hasEnabledNavigationInterception = true;
}
+function setHasLocationChangingListeners(hasListeners: boolean) {
+ hasLocationChangingEventListeners = hasListeners;
+}
+
export function attachToEventDelegator(eventDelegator: EventDelegator): void {
// We need to respond to clicks on <a> elements *after* the EventDelegator has finished
// running its simulated bubbling process so that we can respect any preventDefault requests.
@@ -74,15 +92,25 @@ export function navigateTo(uri: string, options: NavigationOptions): void;
export function navigateTo(uri: string, forceLoad: boolean): void;
export function navigateTo(uri: string, forceLoad: boolean, replace: boolean): void;
export function navigateTo(uri: string, forceLoadOrOptions: NavigationOptions | boolean, replaceIfUsingOldOverload = false): void {
- const absoluteUri = toAbsoluteUri(uri);
-
// Normalize the parameters to the newer overload (i.e., using NavigationOptions)
const options: NavigationOptions = forceLoadOrOptions instanceof Object
? forceLoadOrOptions
: { forceLoad: forceLoadOrOptions, replaceHistoryEntry: replaceIfUsingOldOverload };
+ navigateToCore(uri, options);
+}
+
+function navigateToFromDotNet(uri: string, options: NavigationOptions): void {
+ // The location changing callback is called from .NET for programmatic navigations originating from .NET.
+ // In this case, we shouldn't invoke the callback again from the JS side.
+ navigateToCore(uri, options, /* skipLocationChangingCallback */ true);
+}
+
+function navigateToCore(uri: string, options: NavigationOptions, skipLocationChangingCallback = false): void {
+ const absoluteUri = toAbsoluteUri(uri);
+
if (!options.forceLoad && isWithinBaseUriSpace(absoluteUri)) {
- performInternalNavigation(absoluteUri, false, options.replaceHistoryEntry);
+ performInternalNavigation(absoluteUri, false, options.replaceHistoryEntry, options.historyEntryState, skipLocationChangingCallback);
} else {
// For external navigation, we work in terms of the originally-supplied uri string,
// not the computed absoluteUri. This is in case there are some special URI formats
@@ -107,7 +135,16 @@ function performExternalNavigation(uri: string, replace: boolean) {
}
}
-function performInternalNavigation(absoluteInternalHref: string, interceptedLink: boolean, replace: boolean) {
+async function performInternalNavigation(absoluteInternalHref: string, interceptedLink: boolean, replace: boolean, state: string | undefined = undefined, skipLocationChangingCallback = false) {
+ ignorePendingNavigation();
+
+ if (!skipLocationChangingCallback && hasLocationChangingEventListeners) {
+ const shouldContinueNavigation = await notifyLocationChanging(absoluteInternalHref, state, interceptedLink);
+ if (!shouldContinueNavigation) {
+ return;
+ }
+ }
+
// Since this was *not* triggered by a back/forward gesture (that goes through a different
// code path starting with a popstate event), we don't want to preserve the current scroll
// position, so reset it.
@@ -116,18 +153,98 @@ function performInternalNavigation(absoluteInternalHref: string, interceptedLink
resetScrollAfterNextBatch();
if (!replace) {
- history.pushState(null, /* ignored title */ '', absoluteInternalHref);
+ currentHistoryIndex++;
+ history.pushState({
+ userState: state,
+ _index: currentHistoryIndex,
+ }, /* ignored title */ '', absoluteInternalHref);
} else {
- history.replaceState(null, /* ignored title */ '', absoluteInternalHref);
+ history.replaceState({
+ userState: state,
+ _index: currentHistoryIndex,
+ }, /* ignored title */ '', absoluteInternalHref);
}
- notifyLocationChanged(interceptedLink);
+ await notifyLocationChanged(interceptedLink);
+}
+
+function navigateHistoryWithoutPopStateCallback(delta: number): Promise<void> {
+ return new Promise(resolve => {
+ const oldPopStateCallback = popStateCallback;
+
+ popStateCallback = () => {
+ popStateCallback = oldPopStateCallback;
+ resolve();
+ };
+
+ history.go(delta);
+ });
+}
+
+function ignorePendingNavigation() {
+ if (resolveCurrentNavigation) {
+ resolveCurrentNavigation(false);
+ resolveCurrentNavigation = null;
+ }
+}
+
+function notifyLocationChanging(uri: string, state: string | undefined, intercepted: boolean): Promise<boolean> {
+ return new Promise<boolean>(resolve => {
+ ignorePendingNavigation();
+
+ if (!notifyLocationChangingCallback) {
+ resolve(false);
+ return;
+ }
+
+ currentLocationChangingCallId++;
+ resolveCurrentNavigation = resolve;
+ notifyLocationChangingCallback(currentLocationChangingCallId, uri, state, intercepted);
+ });
+}
+
+function endLocationChanging(callId: number, shouldContinueNavigation: boolean) {
+ if (resolveCurrentNavigation && callId === currentLocationChangingCallId) {
+ resolveCurrentNavigation(shouldContinueNavigation);
+ resolveCurrentNavigation = null;
+ }
+}
+
+async function onBrowserInitiatedPopState(state: PopStateEvent) {
+ ignorePendingNavigation();
+
+ if (hasLocationChangingEventListeners) {
+ const index = state.state?._index ?? 0;
+ const userState = state.state?.userState;
+ const delta = index - currentHistoryIndex;
+ const uri = location.href;
+
+ // Temporarily revert the navigation until we confirm if the navigation should continue.
+ await navigateHistoryWithoutPopStateCallback(-delta);
+
+ const shouldContinueNavigation = await notifyLocationChanging(uri, userState, false);
+ if (!shouldContinueNavigation) {
+ return;
+ }
+
+ await navigateHistoryWithoutPopStateCallback(delta);
+ }
+
+ await notifyLocationChanged(false);
}
async function notifyLocationChanged(interceptedLink: boolean) {
if (notifyLocationChangedCallback) {
- await notifyLocationChangedCallback(location.href, interceptedLink);
+ await notifyLocationChangedCallback(location.href, history.state?.userState, interceptedLink);
+ }
+}
+
+async function onPopState(state: PopStateEvent) {
+ if (popStateCallback) {
+ await popStateCallback(state);
}
+
+ currentHistoryIndex = history.state?._index ?? 0;
}
let testAnchor: HTMLAnchorElement;
@@ -170,12 +287,15 @@ function findClosestAnchorAncestorLegacy(element: Element | null, tagName: strin
}
function isWithinBaseUriSpace(href: string) {
- const baseUriWithTrailingSlash = toBaseUriWithTrailingSlash(document.baseURI!); // TODO: Might baseURI really be null?
- return href.startsWith(baseUriWithTrailingSlash);
+ const baseUriWithoutTrailingSlash = toBaseUriWithoutTrailingSlash(document.baseURI!);
+ const nextChar = href.charAt(baseUriWithoutTrailingSlash.length);
+
+ return href.startsWith(baseUriWithoutTrailingSlash)
+ && (nextChar === '' || nextChar === '/' || nextChar === '?' || nextChar === '#');
}
-function toBaseUriWithTrailingSlash(baseUri: string) {
- return baseUri.substr(0, baseUri.lastIndexOf('/') + 1);
+function toBaseUriWithoutTrailingSlash(baseUri: string) {
+ return baseUri.substring(0, baseUri.lastIndexOf('/'));
}
function eventHasSpecialKey(event: MouseEvent) {
@@ -192,4 +312,5 @@ function canProcessAnchor(anchorTarget: HTMLAnchorElement) {
export interface NavigationOptions {
forceLoad: boolean;
replaceHistoryEntry: boolean;
+ historyEntryState?: string;
}
diff --git a/src/Components/Web.JS/src/Virtualize.ts b/src/Components/Web.JS/src/Virtualize.ts
index a6603f25fd..2fcd0f1d1c 100644
--- a/src/Components/Web.JS/src/Virtualize.ts
+++ b/src/Components/Web.JS/src/Virtualize.ts
@@ -9,7 +9,11 @@ export const Virtualize = {
const observersByDotNetId = {};
function findClosestScrollContainer(element: HTMLElement | null): HTMLElement | null {
- if (!element) {
+ // If we recurse up as far as body or the document root, return null so that the
+ // IntersectionObserver observes intersection with the top-level scroll viewport
+ // instead of the with body/documentElement which can be arbitrarily tall.
+ // See https://github.com/dotnet/aspnetcore/issues/37659 for more about what this fixes.
+ if (!element || element === document.body || element === document.documentElement) {
return null;
}
diff --git a/src/Components/Web.JS/yarn.lock b/src/Components/Web.JS/yarn.lock
index 62887a3fe6..38028405d9 100644
--- a/src/Components/Web.JS/yarn.lock
+++ b/src/Components/Web.JS/yarn.lock
@@ -3,99 +3,100 @@
"@ampproject/remapping@^2.1.0":
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.2.tgz#4edca94973ded9630d20101cd8559cedb8d8bd34"
- integrity sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d"
+ integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
dependencies:
- "@jridgewell/trace-mapping" "^0.3.0"
+ "@jridgewell/gen-mapping" "^0.1.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
-"@babel/code-frame@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789"
- integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==
+"@babel/code-frame@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a"
+ integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
dependencies:
- "@babel/highlight" "^7.16.7"
+ "@babel/highlight" "^7.18.6"
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8", "@babel/compat-data@^7.17.0":
- version "7.17.0"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34"
- integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.6.tgz#8b37d24e88e8e21c499d4328db80577d8882fa53"
+ integrity sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==
"@babel/core@^7.16.7":
- version "7.17.5"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.5.tgz#6cd2e836058c28f06a4ca8ee7ed955bbf37c8225"
- integrity sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.6.tgz#54a107a3c298aee3fe5e1947a6464b9b6faca03d"
+ integrity sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==
dependencies:
"@ampproject/remapping" "^2.1.0"
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.17.3"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helpers" "^7.17.2"
- "@babel/parser" "^7.17.3"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.17.3"
- "@babel/types" "^7.17.0"
+ "@babel/code-frame" "^7.18.6"
+ "@babel/generator" "^7.18.6"
+ "@babel/helper-compilation-targets" "^7.18.6"
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helpers" "^7.18.6"
+ "@babel/parser" "^7.18.6"
+ "@babel/template" "^7.18.6"
+ "@babel/traverse" "^7.18.6"
+ "@babel/types" "^7.18.6"
convert-source-map "^1.7.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
- json5 "^2.1.2"
+ json5 "^2.2.1"
semver "^6.3.0"
-"@babel/generator@^7.17.3":
- version "7.17.3"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.3.tgz#a2c30b0c4f89858cb87050c3ffdfd36bdf443200"
- integrity sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==
+"@babel/generator@^7.18.6":
+ version "7.18.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.7.tgz#2aa78da3c05aadfc82dbac16c99552fc802284bd"
+ integrity sha512-shck+7VLlY72a2w9c3zYWuE1pwOKEiQHV7GTUbSnhyl5eu3i04t30tBY82ZRWrDfo3gkakCFtevExnxbkf2a3A==
dependencies:
- "@babel/types" "^7.17.0"
+ "@babel/types" "^7.18.7"
+ "@jridgewell/gen-mapping" "^0.3.2"
jsesc "^2.5.1"
- source-map "^0.5.0"
-"@babel/helper-annotate-as-pure@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862"
- integrity sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==
+"@babel/helper-annotate-as-pure@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb"
+ integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==
dependencies:
- "@babel/types" "^7.16.7"
+ "@babel/types" "^7.18.6"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz#38d138561ea207f0f69eb1626a418e4f7e6a580b"
- integrity sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz#f14d640ed1ee9246fb33b8255f08353acfe70e6a"
+ integrity sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==
dependencies:
- "@babel/helper-explode-assignable-expression" "^7.16.7"
- "@babel/types" "^7.16.7"
+ "@babel/helper-explode-assignable-expression" "^7.18.6"
+ "@babel/types" "^7.18.6"
-"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b"
- integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==
+"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz#18d35bfb9f83b1293c22c55b3d576c1315b6ed96"
+ integrity sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==
dependencies:
- "@babel/compat-data" "^7.16.4"
- "@babel/helper-validator-option" "^7.16.7"
- browserslist "^4.17.5"
+ "@babel/compat-data" "^7.18.6"
+ "@babel/helper-validator-option" "^7.18.6"
+ browserslist "^4.20.2"
semver "^6.3.0"
-"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7", "@babel/helper-create-class-features-plugin@^7.17.6":
- version "7.17.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz#3778c1ed09a7f3e65e6d6e0f6fbfcc53809d92c9"
- integrity sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==
+"@babel/helper-create-class-features-plugin@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz#6f15f8459f3b523b39e00a99982e2c040871ed72"
+ integrity sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-member-expression-to-functions" "^7.16.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-function-name" "^7.18.6"
+ "@babel/helper-member-expression-to-functions" "^7.18.6"
+ "@babel/helper-optimise-call-expression" "^7.18.6"
+ "@babel/helper-replace-supers" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
-"@babel/helper-create-regexp-features-plugin@^7.16.7":
- version "7.17.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1"
- integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==
+"@babel/helper-create-regexp-features-plugin@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz#3e35f4e04acbbf25f1b3534a657610a000543d3c"
+ integrity sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- regexpu-core "^5.0.1"
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ regexpu-core "^5.1.0"
"@babel/helper-define-polyfill-provider@^0.3.1":
version "0.3.1"
@@ -111,310 +112,302 @@
resolve "^1.14.2"
semver "^6.1.2"
-"@babel/helper-environment-visitor@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7"
- integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-explode-assignable-expression@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz#12a6d8522fdd834f194e868af6354e8650242b7a"
- integrity sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-function-name@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f"
- integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==
- dependencies:
- "@babel/helper-get-function-arity" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-get-function-arity@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419"
- integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==
+"@babel/helper-environment-visitor@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.6.tgz#b7eee2b5b9d70602e59d1a6cad7dd24de7ca6cd7"
+ integrity sha512-8n6gSfn2baOY+qlp+VSzsosjCVGFqWKmDF0cCWOybh52Dw3SEyoWR1KrhMJASjLwIEkkAufZ0xvr+SxLHSpy2Q==
+
+"@babel/helper-explode-assignable-expression@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096"
+ integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==
dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-hoist-variables@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246"
- integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-member-expression-to-functions@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz#42b9ca4b2b200123c3b7e726b0ae5153924905b0"
- integrity sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437"
- integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-module-transforms@^7.16.7":
- version "7.17.6"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.17.6.tgz#3c3b03cc6617e33d68ef5a27a67419ac5199ccd0"
- integrity sha512-2ULmRdqoOMpdvkbT8jONrZML/XALfzxlb052bldftkicAUy8AxSCkD5trDPQcwHNmolcl7wP6ehNqMlyUw6AaA==
- dependencies:
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-simple-access" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/helper-validator-identifier" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.17.3"
- "@babel/types" "^7.17.0"
-
-"@babel/helper-optimise-call-expression@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz#a34e3560605abbd31a18546bd2aad3e6d9a174f2"
- integrity sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
- integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
-
-"@babel/helper-remap-async-to-generator@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3"
- integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==
- dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-wrap-function" "^7.16.8"
- "@babel/types" "^7.16.8"
-
-"@babel/helper-replace-supers@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz#e9f5f5f32ac90429c1a4bdec0f231ef0c2838ab1"
- integrity sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==
- dependencies:
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-member-expression-to-functions" "^7.16.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/traverse" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/helper-simple-access@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7"
- integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-skip-transparent-expression-wrappers@^7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz#0ee3388070147c3ae051e487eca3ebb0e2e8bb09"
- integrity sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==
- dependencies:
- "@babel/types" "^7.16.0"
-
-"@babel/helper-split-export-declaration@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b"
- integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==
- dependencies:
- "@babel/types" "^7.16.7"
-
-"@babel/helper-validator-identifier@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad"
- integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==
-
-"@babel/helper-validator-option@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
- integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
-
-"@babel/helper-wrap-function@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200"
- integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==
- dependencies:
- "@babel/helper-function-name" "^7.16.7"
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.16.8"
- "@babel/types" "^7.16.8"
-
-"@babel/helpers@^7.17.2":
- version "7.17.2"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417"
- integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==
- dependencies:
- "@babel/template" "^7.16.7"
- "@babel/traverse" "^7.17.0"
- "@babel/types" "^7.17.0"
-
-"@babel/highlight@^7.16.7":
- version "7.16.10"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88"
- integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-function-name@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.6.tgz#8334fecb0afba66e6d87a7e8c6bb7fed79926b83"
+ integrity sha512-0mWMxV1aC97dhjCah5U5Ua7668r5ZmSC2DLfH2EZnf9c3/dHZKiFa5pRLMH5tjSl471tY6496ZWk/kjNONBxhw==
+ dependencies:
+ "@babel/template" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-hoist-variables@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678"
+ integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-member-expression-to-functions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz#44802d7d602c285e1692db0bad9396d007be2afc"
+ integrity sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e"
+ integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-module-transforms@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz#57e3ca669e273d55c3cda55e6ebf552f37f483c8"
+ integrity sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-module-imports" "^7.18.6"
+ "@babel/helper-simple-access" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/helper-validator-identifier" "^7.18.6"
+ "@babel/template" "^7.18.6"
+ "@babel/traverse" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-optimise-call-expression@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe"
+ integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz#9448974dd4fb1d80fefe72e8a0af37809cd30d6d"
+ integrity sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==
+
+"@babel/helper-remap-async-to-generator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz#fa1f81acd19daee9d73de297c0308783cd3cfc23"
+ integrity sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-wrap-function" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-replace-supers@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz#efedf51cfccea7b7b8c0f00002ab317e7abfe420"
+ integrity sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-member-expression-to-functions" "^7.18.6"
+ "@babel/helper-optimise-call-expression" "^7.18.6"
+ "@babel/traverse" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-simple-access@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea"
+ integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz#7dff00a5320ca4cf63270e5a0eca4b268b7380d9"
+ integrity sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-split-export-declaration@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075"
+ integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-validator-identifier@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076"
+ integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==
+
+"@babel/helper-validator-option@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
+ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
+
+"@babel/helper-wrap-function@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz#ec44ea4ad9d8988b90c3e465ba2382f4de81a073"
+ integrity sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==
+ dependencies:
+ "@babel/helper-function-name" "^7.18.6"
+ "@babel/template" "^7.18.6"
+ "@babel/traverse" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/helpers@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.6.tgz#4c966140eaa1fcaa3d5a8c09d7db61077d4debfd"
+ integrity sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==
+ dependencies:
+ "@babel/template" "^7.18.6"
+ "@babel/traverse" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/highlight@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf"
+ integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.18.6"
chalk "^2.0.0"
js-tokens "^4.0.0"
-"@babel/parser@^7.16.7", "@babel/parser@^7.17.3":
- version "7.17.3"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.3.tgz#b07702b982990bf6fdc1da5049a23fece4c5c3d0"
- integrity sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==
+"@babel/parser@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.6.tgz#845338edecad65ebffef058d3be851f1d28a63bc"
+ integrity sha512-uQVSa9jJUe/G/304lXspfWVpKpK4euFLgGiMQFOCpM/bgcAdeoHwi/OQz23O9GK2osz26ZiXRRV9aV+Yl1O8tw==
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050"
- integrity sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2"
+ integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz#cc001234dfc139ac45f6bcf801866198c8c72ff9"
- integrity sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz#b4e4dbc2cd1acd0133479918f7c6412961c9adb8"
+ integrity sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
- "@babel/plugin-proposal-optional-chaining" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6"
+ "@babel/plugin-proposal-optional-chaining" "^7.18.6"
-"@babel/plugin-proposal-async-generator-functions@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8"
- integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==
+"@babel/plugin-proposal-async-generator-functions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz#aedac81e6fc12bb643374656dd5f2605bf743d17"
+ integrity sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-remap-async-to-generator" "^7.16.8"
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-remap-async-to-generator" "^7.18.6"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-proposal-class-properties@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz#925cad7b3b1a2fcea7e59ecc8eb5954f961f91b0"
- integrity sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==
+"@babel/plugin-proposal-class-properties@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
+ integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-class-static-block@^7.16.7":
- version "7.17.6"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz#164e8fd25f0d80fa48c5a4d1438a6629325ad83c"
- integrity sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==
+"@babel/plugin-proposal-class-static-block@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020"
+ integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.17.6"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
-"@babel/plugin-proposal-dynamic-import@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz#c19c897eaa46b27634a00fee9fb7d829158704b2"
- integrity sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==
+"@babel/plugin-proposal-dynamic-import@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94"
+ integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
-"@babel/plugin-proposal-export-namespace-from@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz#09de09df18445a5786a305681423ae63507a6163"
- integrity sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==
+"@babel/plugin-proposal-export-namespace-from@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz#1016f0aa5ab383bbf8b3a85a2dcaedf6c8ee7491"
+ integrity sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-"@babel/plugin-proposal-json-strings@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz#9732cb1d17d9a2626a08c5be25186c195b6fa6e8"
- integrity sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==
+"@babel/plugin-proposal-json-strings@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b"
+ integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-json-strings" "^7.8.3"
-"@babel/plugin-proposal-logical-assignment-operators@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz#be23c0ba74deec1922e639832904be0bea73cdea"
- integrity sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==
+"@babel/plugin-proposal-logical-assignment-operators@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz#3b9cac6f1ffc2aa459d111df80c12020dfc6b665"
+ integrity sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz#141fc20b6857e59459d430c850a0011e36561d99"
- integrity sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
+ integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-proposal-numeric-separator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz#d6b69f4af63fb38b6ca2558442a7fb191236eba9"
- integrity sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==
+"@babel/plugin-proposal-numeric-separator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75"
+ integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-proposal-object-rest-spread@^7.16.7":
- version "7.17.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz#d9eb649a54628a51701aef7e0ea3d17e2b9dd390"
- integrity sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==
+"@babel/plugin-proposal-object-rest-spread@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz#ec93bba06bfb3e15ebd7da73e953d84b094d5daf"
+ integrity sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==
dependencies:
- "@babel/compat-data" "^7.17.0"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/compat-data" "^7.18.6"
+ "@babel/helper-compilation-targets" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.16.7"
+ "@babel/plugin-transform-parameters" "^7.18.6"
-"@babel/plugin-proposal-optional-catch-binding@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz#c623a430674ffc4ab732fd0a0ae7722b67cb74cf"
- integrity sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==
+"@babel/plugin-proposal-optional-catch-binding@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb"
+ integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-proposal-optional-chaining@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz#7cd629564724816c0e8a969535551f943c64c39a"
- integrity sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==
+"@babel/plugin-proposal-optional-chaining@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz#46d4f2ffc20e87fad1d98bc4fa5d466366f6aa0b"
+ integrity sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-proposal-private-methods@^7.16.11":
- version "7.16.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50"
- integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==
+"@babel/plugin-proposal-private-methods@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
+ integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.16.10"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-private-property-in-object@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz#b0b8cef543c2c3d57e59e2c611994861d46a3fce"
- integrity sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==
+"@babel/plugin-proposal-private-property-in-object@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz#a64137b232f0aca3733a67eb1a144c192389c503"
+ integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-create-class-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-proposal-unicode-property-regex@^7.16.7", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz#635d18eb10c6214210ffc5ff4932552de08188a2"
- integrity sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==
+"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e"
+ integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-syntax-async-generators@^7.8.4":
version "7.8.4"
@@ -451,6 +444,13 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
+"@babel/plugin-syntax-import-assertions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz#cd6190500a4fa2fe31990a963ffab4b63e4505e4"
+ integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
"@babel/plugin-syntax-json-strings@^7.8.3":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
@@ -514,287 +514,290 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-transform-arrow-functions@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz#44125e653d94b98db76369de9c396dc14bef4154"
- integrity sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==
+"@babel/plugin-transform-arrow-functions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe"
+ integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-async-to-generator@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808"
- integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==
+"@babel/plugin-transform-async-to-generator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615"
+ integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==
dependencies:
- "@babel/helper-module-imports" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-remap-async-to-generator" "^7.16.8"
+ "@babel/helper-module-imports" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-remap-async-to-generator" "^7.18.6"
-"@babel/plugin-transform-block-scoped-functions@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz#4d0d57d9632ef6062cdf354bb717102ee042a620"
- integrity sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==
+"@babel/plugin-transform-block-scoped-functions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8"
+ integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-block-scoping@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz#f50664ab99ddeaee5bc681b8f3a6ea9d72ab4f87"
- integrity sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==
+"@babel/plugin-transform-block-scoping@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz#b5f78318914615397d86a731ef2cc668796a726c"
+ integrity sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-classes@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz#8f4b9562850cd973de3b498f1218796eb181ce00"
- integrity sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==
+"@babel/plugin-transform-classes@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz#3501a8f3f4c7d5697c27a3eedbee71d68312669f"
+ integrity sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.16.7"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-optimise-call-expression" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-function-name" "^7.18.6"
+ "@babel/helper-optimise-call-expression" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-replace-supers" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz#66dee12e46f61d2aae7a73710f591eb3df616470"
- integrity sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==
+"@babel/plugin-transform-computed-properties@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz#5d15eb90e22e69604f3348344c91165c5395d032"
+ integrity sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-destructuring@^7.16.7":
- version "7.17.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.3.tgz#c445f75819641788a27a0a3a759d9df911df6abc"
- integrity sha512-dDFzegDYKlPqa72xIlbmSkly5MluLoaC1JswABGktyt6NTXSBcUuse/kWE/wvKFWJHPETpi158qJZFS3JmykJg==
+"@babel/plugin-transform-destructuring@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz#a98b0e42c7ffbf5eefcbcf33280430f230895c6f"
+ integrity sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-dotall-regex@^7.16.7", "@babel/plugin-transform-dotall-regex@^7.4.4":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz#6b2d67686fab15fb6a7fd4bd895d5982cfc81241"
- integrity sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==
+"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8"
+ integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-duplicate-keys@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz#2207e9ca8f82a0d36a5a67b6536e7ef8b08823c9"
- integrity sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==
+"@babel/plugin-transform-duplicate-keys@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz#e6c94e8cd3c9dd8a88144f7b78ae22975a7ff473"
+ integrity sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-exponentiation-operator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz#efa9862ef97e9e9e5f653f6ddc7b665e8536fe9b"
- integrity sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==
+"@babel/plugin-transform-exponentiation-operator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd"
+ integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-for-of@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz#649d639d4617dff502a9a158c479b3b556728d8c"
- integrity sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==
+"@babel/plugin-transform-for-of@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz#e0fdb813be908e91ccc9ec87b30cc2eabf046f7c"
+ integrity sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-function-name@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz#5ab34375c64d61d083d7d2f05c38d90b97ec65cf"
- integrity sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==
+"@babel/plugin-transform-function-name@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz#6a7e4ae2893d336fd1b8f64c9f92276391d0f1b4"
+ integrity sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==
dependencies:
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-compilation-targets" "^7.18.6"
+ "@babel/helper-function-name" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz#254c9618c5ff749e87cb0c0cef1a0a050c0bdab1"
- integrity sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==
+"@babel/plugin-transform-literals@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz#9d6af353b5209df72960baf4492722d56f39a205"
+ integrity sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-member-expression-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz#6e5dcf906ef8a098e630149d14c867dd28f92384"
- integrity sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==
+"@babel/plugin-transform-member-expression-literals@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e"
+ integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-modules-amd@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz#b28d323016a7daaae8609781d1f8c9da42b13186"
- integrity sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==
+"@babel/plugin-transform-modules-amd@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz#8c91f8c5115d2202f277549848874027d7172d21"
+ integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
dependencies:
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-commonjs@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe"
- integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==
+"@babel/plugin-transform-modules-commonjs@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz#afd243afba166cca69892e24a8fd8c9f2ca87883"
+ integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
dependencies:
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-simple-access" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-simple-access" "^7.18.6"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-systemjs@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz#887cefaef88e684d29558c2b13ee0563e287c2d7"
- integrity sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==
+"@babel/plugin-transform-modules-systemjs@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz#026511b7657d63bf5d4cf2fd4aeb963139914a54"
+ integrity sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==
dependencies:
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/helper-hoist-variables" "^7.18.6"
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-validator-identifier" "^7.18.6"
babel-plugin-dynamic-import-node "^2.3.3"
-"@babel/plugin-transform-modules-umd@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz#23dad479fa585283dbd22215bff12719171e7618"
- integrity sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==
+"@babel/plugin-transform-modules-umd@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9"
+ integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==
dependencies:
- "@babel/helper-module-transforms" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8":
- version "7.16.8"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252"
- integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz#c89bfbc7cc6805d692f3a49bc5fc1b630007246d"
+ integrity sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-new-target@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz#9967d89a5c243818e0800fdad89db22c5f514244"
- integrity sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==
+"@babel/plugin-transform-new-target@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8"
+ integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-object-super@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz#ac359cf8d32cf4354d27a46867999490b6c32a94"
- integrity sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==
+"@babel/plugin-transform-object-super@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c"
+ integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-replace-supers" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-replace-supers" "^7.18.6"
-"@babel/plugin-transform-parameters@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz#a1721f55b99b736511cb7e0152f61f17688f331f"
- integrity sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==
+"@babel/plugin-transform-parameters@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz#cbe03d5a4c6385dd756034ac1baa63c04beab8dc"
+ integrity sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-property-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz#2dadac85155436f22c696c4827730e0fe1057a55"
- integrity sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==
+"@babel/plugin-transform-property-literals@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3"
+ integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-regenerator@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz#9e7576dc476cb89ccc5096fff7af659243b4adeb"
- integrity sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==
+"@babel/plugin-transform-regenerator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz#585c66cb84d4b4bf72519a34cfce761b8676ca73"
+ integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==
dependencies:
- regenerator-transform "^0.14.2"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ regenerator-transform "^0.15.0"
-"@babel/plugin-transform-reserved-words@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz#1d798e078f7c5958eec952059c460b220a63f586"
- integrity sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==
+"@babel/plugin-transform-reserved-words@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a"
+ integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-shorthand-properties@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz#e8549ae4afcf8382f711794c0c7b6b934c5fbd2a"
- integrity sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==
+"@babel/plugin-transform-shorthand-properties@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9"
+ integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-spread@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz#a303e2122f9f12e0105daeedd0f30fb197d8ff44"
- integrity sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==
+"@babel/plugin-transform-spread@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz#82b080241965f1689f0a60ecc6f1f6575dbdb9d6"
+ integrity sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.6"
-"@babel/plugin-transform-sticky-regex@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz#c84741d4f4a38072b9a1e2e3fd56d359552e8660"
- integrity sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==
+"@babel/plugin-transform-sticky-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc"
+ integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-template-literals@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz#f3d1c45d28967c8e80f53666fc9c3e50618217ab"
- integrity sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==
+"@babel/plugin-transform-template-literals@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz#b763f4dc9d11a7cce58cf9a490d82e80547db9c2"
+ integrity sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-typeof-symbol@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz#9cdbe622582c21368bd482b660ba87d5545d4f7e"
- integrity sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==
+"@babel/plugin-transform-typeof-symbol@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz#486bb39d5a18047358e0d04dc0d2f322f0b92e92"
+ integrity sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-unicode-escapes@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz#da8717de7b3287a2c6d659750c964f302b31ece3"
- integrity sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==
+"@babel/plugin-transform-unicode-escapes@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz#0d01fb7fb2243ae1c033f65f6e3b4be78db75f27"
+ integrity sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==
dependencies:
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-unicode-regex@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz#0f7aa4a501198976e25e82702574c34cfebe9ef2"
- integrity sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==
+"@babel/plugin-transform-unicode-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca"
+ integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
"@babel/preset-env@^7.16.8":
- version "7.16.11"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982"
- integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==
- dependencies:
- "@babel/compat-data" "^7.16.8"
- "@babel/helper-compilation-targets" "^7.16.7"
- "@babel/helper-plugin-utils" "^7.16.7"
- "@babel/helper-validator-option" "^7.16.7"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7"
- "@babel/plugin-proposal-async-generator-functions" "^7.16.8"
- "@babel/plugin-proposal-class-properties" "^7.16.7"
- "@babel/plugin-proposal-class-static-block" "^7.16.7"
- "@babel/plugin-proposal-dynamic-import" "^7.16.7"
- "@babel/plugin-proposal-export-namespace-from" "^7.16.7"
- "@babel/plugin-proposal-json-strings" "^7.16.7"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.16.7"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.7"
- "@babel/plugin-proposal-numeric-separator" "^7.16.7"
- "@babel/plugin-proposal-object-rest-spread" "^7.16.7"
- "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
- "@babel/plugin-proposal-optional-chaining" "^7.16.7"
- "@babel/plugin-proposal-private-methods" "^7.16.11"
- "@babel/plugin-proposal-private-property-in-object" "^7.16.7"
- "@babel/plugin-proposal-unicode-property-regex" "^7.16.7"
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.18.6.tgz#953422e98a5f66bc56cd0b9074eaea127ec86ace"
+ integrity sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==
+ dependencies:
+ "@babel/compat-data" "^7.18.6"
+ "@babel/helper-compilation-targets" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-validator-option" "^7.18.6"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.6"
+ "@babel/plugin-proposal-async-generator-functions" "^7.18.6"
+ "@babel/plugin-proposal-class-properties" "^7.18.6"
+ "@babel/plugin-proposal-class-static-block" "^7.18.6"
+ "@babel/plugin-proposal-dynamic-import" "^7.18.6"
+ "@babel/plugin-proposal-export-namespace-from" "^7.18.6"
+ "@babel/plugin-proposal-json-strings" "^7.18.6"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.6"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
+ "@babel/plugin-proposal-numeric-separator" "^7.18.6"
+ "@babel/plugin-proposal-object-rest-spread" "^7.18.6"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
+ "@babel/plugin-proposal-optional-chaining" "^7.18.6"
+ "@babel/plugin-proposal-private-methods" "^7.18.6"
+ "@babel/plugin-proposal-private-property-in-object" "^7.18.6"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.18.6"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
@@ -804,44 +807,44 @@
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-top-level-await" "^7.14.5"
- "@babel/plugin-transform-arrow-functions" "^7.16.7"
- "@babel/plugin-transform-async-to-generator" "^7.16.8"
- "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
- "@babel/plugin-transform-block-scoping" "^7.16.7"
- "@babel/plugin-transform-classes" "^7.16.7"
- "@babel/plugin-transform-computed-properties" "^7.16.7"
- "@babel/plugin-transform-destructuring" "^7.16.7"
- "@babel/plugin-transform-dotall-regex" "^7.16.7"
- "@babel/plugin-transform-duplicate-keys" "^7.16.7"
- "@babel/plugin-transform-exponentiation-operator" "^7.16.7"
- "@babel/plugin-transform-for-of" "^7.16.7"
- "@babel/plugin-transform-function-name" "^7.16.7"
- "@babel/plugin-transform-literals" "^7.16.7"
- "@babel/plugin-transform-member-expression-literals" "^7.16.7"
- "@babel/plugin-transform-modules-amd" "^7.16.7"
- "@babel/plugin-transform-modules-commonjs" "^7.16.8"
- "@babel/plugin-transform-modules-systemjs" "^7.16.7"
- "@babel/plugin-transform-modules-umd" "^7.16.7"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8"
- "@babel/plugin-transform-new-target" "^7.16.7"
- "@babel/plugin-transform-object-super" "^7.16.7"
- "@babel/plugin-transform-parameters" "^7.16.7"
- "@babel/plugin-transform-property-literals" "^7.16.7"
- "@babel/plugin-transform-regenerator" "^7.16.7"
- "@babel/plugin-transform-reserved-words" "^7.16.7"
- "@babel/plugin-transform-shorthand-properties" "^7.16.7"
- "@babel/plugin-transform-spread" "^7.16.7"
- "@babel/plugin-transform-sticky-regex" "^7.16.7"
- "@babel/plugin-transform-template-literals" "^7.16.7"
- "@babel/plugin-transform-typeof-symbol" "^7.16.7"
- "@babel/plugin-transform-unicode-escapes" "^7.16.7"
- "@babel/plugin-transform-unicode-regex" "^7.16.7"
+ "@babel/plugin-transform-arrow-functions" "^7.18.6"
+ "@babel/plugin-transform-async-to-generator" "^7.18.6"
+ "@babel/plugin-transform-block-scoped-functions" "^7.18.6"
+ "@babel/plugin-transform-block-scoping" "^7.18.6"
+ "@babel/plugin-transform-classes" "^7.18.6"
+ "@babel/plugin-transform-computed-properties" "^7.18.6"
+ "@babel/plugin-transform-destructuring" "^7.18.6"
+ "@babel/plugin-transform-dotall-regex" "^7.18.6"
+ "@babel/plugin-transform-duplicate-keys" "^7.18.6"
+ "@babel/plugin-transform-exponentiation-operator" "^7.18.6"
+ "@babel/plugin-transform-for-of" "^7.18.6"
+ "@babel/plugin-transform-function-name" "^7.18.6"
+ "@babel/plugin-transform-literals" "^7.18.6"
+ "@babel/plugin-transform-member-expression-literals" "^7.18.6"
+ "@babel/plugin-transform-modules-amd" "^7.18.6"
+ "@babel/plugin-transform-modules-commonjs" "^7.18.6"
+ "@babel/plugin-transform-modules-systemjs" "^7.18.6"
+ "@babel/plugin-transform-modules-umd" "^7.18.6"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.18.6"
+ "@babel/plugin-transform-new-target" "^7.18.6"
+ "@babel/plugin-transform-object-super" "^7.18.6"
+ "@babel/plugin-transform-parameters" "^7.18.6"
+ "@babel/plugin-transform-property-literals" "^7.18.6"
+ "@babel/plugin-transform-regenerator" "^7.18.6"
+ "@babel/plugin-transform-reserved-words" "^7.18.6"
+ "@babel/plugin-transform-shorthand-properties" "^7.18.6"
+ "@babel/plugin-transform-spread" "^7.18.6"
+ "@babel/plugin-transform-sticky-regex" "^7.18.6"
+ "@babel/plugin-transform-template-literals" "^7.18.6"
+ "@babel/plugin-transform-typeof-symbol" "^7.18.6"
+ "@babel/plugin-transform-unicode-escapes" "^7.18.6"
+ "@babel/plugin-transform-unicode-regex" "^7.18.6"
"@babel/preset-modules" "^0.1.5"
- "@babel/types" "^7.16.8"
- babel-plugin-polyfill-corejs2 "^0.3.0"
- babel-plugin-polyfill-corejs3 "^0.5.0"
- babel-plugin-polyfill-regenerator "^0.3.0"
- core-js-compat "^3.20.2"
+ "@babel/types" "^7.18.6"
+ babel-plugin-polyfill-corejs2 "^0.3.1"
+ babel-plugin-polyfill-corejs3 "^0.5.2"
+ babel-plugin-polyfill-regenerator "^0.3.1"
+ core-js-compat "^3.22.1"
semver "^6.3.0"
"@babel/preset-modules@^0.1.5":
@@ -856,43 +859,43 @@
esutils "^2.0.2"
"@babel/runtime@^7.8.4":
- version "7.17.2"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
- integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.18.6.tgz#6a1ef59f838debd670421f8c7f2cbb8da9751580"
+ integrity sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==
dependencies:
regenerator-runtime "^0.13.4"
-"@babel/template@^7.16.7":
- version "7.16.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155"
- integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/parser" "^7.16.7"
- "@babel/types" "^7.16.7"
-
-"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.17.3":
- version "7.17.3"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.3.tgz#0ae0f15b27d9a92ba1f2263358ea7c4e7db47b57"
- integrity sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==
- dependencies:
- "@babel/code-frame" "^7.16.7"
- "@babel/generator" "^7.17.3"
- "@babel/helper-environment-visitor" "^7.16.7"
- "@babel/helper-function-name" "^7.16.7"
- "@babel/helper-hoist-variables" "^7.16.7"
- "@babel/helper-split-export-declaration" "^7.16.7"
- "@babel/parser" "^7.17.3"
- "@babel/types" "^7.17.0"
+"@babel/template@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31"
+ integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/parser" "^7.18.6"
+ "@babel/types" "^7.18.6"
+
+"@babel/traverse@^7.13.0", "@babel/traverse@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.6.tgz#a228562d2f46e89258efa4ddd0416942e2fd671d"
+ integrity sha512-zS/OKyqmD7lslOtFqbscH6gMLFYOfG1YPqCKfAW5KrTeolKqvB8UelR49Fpr6y93kYkW2Ik00mT1LOGiAGvizw==
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/generator" "^7.18.6"
+ "@babel/helper-environment-visitor" "^7.18.6"
+ "@babel/helper-function-name" "^7.18.6"
+ "@babel/helper-hoist-variables" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/parser" "^7.18.6"
+ "@babel/types" "^7.18.6"
debug "^4.1.0"
globals "^11.1.0"
-"@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.4.4":
- version "7.17.0"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
- integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
+"@babel/types@^7.18.6", "@babel/types@^7.18.7", "@babel/types@^7.4.4":
+ version "7.18.7"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.7.tgz#a4a2c910c15040ea52cdd1ddb1614a65c8041726"
+ integrity sha512-QG3yxTcTIBoAcQmkCs+wAPYZhu7Dk9rXKacINfNbdJDNERTbLQbHGyVG8q/YGMPeCJRIhSY0+fTc5+xuh6WPSQ==
dependencies:
- "@babel/helper-validator-identifier" "^7.16.7"
+ "@babel/helper-validator-identifier" "^7.18.6"
to-fast-properties "^2.0.0"
"@discoveryjs/json-ext@^0.5.0":
@@ -900,19 +903,19 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
-"@eslint/eslintrc@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.0.tgz#7ce1547a5c46dfe56e1e45c3c9ed18038c721c6a"
- integrity sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.3.1"
- globals "^13.9.0"
- ignore "^4.0.6"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@humanwhocodes/config-array@^0.9.2":
@@ -929,20 +932,50 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+"@jridgewell/gen-mapping@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996"
+ integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
"@jridgewell/resolve-uri@^3.0.3":
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
- integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz#687cc2bbf243f4e9a868ecf2262318e2658873a1"
+ integrity sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==
+
+"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
"@jridgewell/sourcemap-codec@^1.4.10":
- version "1.4.11"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
- integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
-"@jridgewell/trace-mapping@^0.3.0":
- version "0.3.4"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
- integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
+"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
dependencies:
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
@@ -989,22 +1022,27 @@
version "1.0.0"
"@types/eslint-scope@^3.7.3":
- version "3.7.3"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
- integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
+ version "3.7.4"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
+ integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
dependencies:
"@types/eslint" "*"
"@types/estree" "*"
"@types/eslint@*":
- version "8.4.1"
- resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.1.tgz#c48251553e8759db9e656de3efc846954ac32304"
- integrity sha512-GE44+DNEyxxh2Kc6ro/VkIj+9ma0pO0bwv9+uHSyBrikYOHr8zYcdPvnBOp1aw8s+CjRvuSx7CyWqRrNFQ59mA==
+ version "8.4.5"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.5.tgz#acdfb7dd36b91cc5d812d7c093811a8f3d9b31e4"
+ integrity sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==
dependencies:
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^0.0.51":
+"@types/estree@*":
+ version "0.0.52"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.52.tgz#7f1f57ad5b741f3d5b210d3b1f145640d89bf8fe"
+ integrity sha512-BZWrtCU0bMVAIliIV+HJO1f1PR41M7NKjfxrFJwwhKI1KwhwOxYw1SXg9ao+CIMt774nFuGiG6eU+udtbEI9oQ==
+
+"@types/estree@^0.0.51":
version "0.0.51"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
@@ -1019,14 +1057,14 @@
"@types/tough-cookie" "*"
"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
- version "7.0.9"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
- integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
"@types/node@*":
- version "17.0.21"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
- integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
+ integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
"@types/parse5@*":
version "6.0.3"
@@ -1034,89 +1072,89 @@
integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
"@types/tough-cookie@*":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.1.tgz#8f80dd965ad81f3e1bc26d6f5c727e132721ff40"
- integrity sha512-Y0K95ThC3esLEYD6ZuqNek29lNX2EM1qxV8y2FTLUB0ff5wWrk7az+mLrnNFUnaXcgKye22+sFBRXOgpPILZNg==
-
-"@typescript-eslint/eslint-plugin@^5.9.1":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz#5119b67152356231a0e24b998035288a9cd21335"
- integrity sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==
- dependencies:
- "@typescript-eslint/scope-manager" "5.14.0"
- "@typescript-eslint/type-utils" "5.14.0"
- "@typescript-eslint/utils" "5.14.0"
- debug "^4.3.2"
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397"
+ integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==
+
+"@typescript-eslint/eslint-plugin@^5.26.0":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.3.tgz#2f293e56b73c4f281e48d253af4a17f21a55d54c"
+ integrity sha512-QEgE1uahnDbWEkZlidq7uKB630ny1NN8KbLPmznX+8hYsYpoV1/quG1Nzvs141FVuumuS7O0EpqYw3RB4AVzRg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.30.3"
+ "@typescript-eslint/type-utils" "5.30.3"
+ "@typescript-eslint/utils" "5.30.3"
+ debug "^4.3.4"
functional-red-black-tree "^1.0.1"
- ignore "^5.1.8"
+ ignore "^5.2.0"
regexpp "^3.2.0"
- semver "^7.3.5"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/parser@^5.9.1":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.14.0.tgz#7c79f898aa3cff0ceee6f1d34eeed0f034fb9ef3"
- integrity sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==
+"@typescript-eslint/parser@^5.26.0":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.3.tgz#d288c7dbeadf22403112c773dd53e0700f6dd6d5"
+ integrity sha512-ddwGEPC3E49DduAUC8UThQafHRE5uc1NE8jdOgl+w8/NrYF50MJQNeD3u4JZrqAXdY9rJz0CdQ9HpNME20CzkA==
dependencies:
- "@typescript-eslint/scope-manager" "5.14.0"
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/typescript-estree" "5.14.0"
- debug "^4.3.2"
+ "@typescript-eslint/scope-manager" "5.30.3"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/typescript-estree" "5.30.3"
+ debug "^4.3.4"
-"@typescript-eslint/scope-manager@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz#ea518962b42db8ed0a55152ea959c218cb53ca7b"
- integrity sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==
+"@typescript-eslint/scope-manager@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.3.tgz#de7edb0b59efd71975a82cbf3f1b97c5c90769f0"
+ integrity sha512-yVJIIUXeo/vv6Alj6lKBvsqnRs5hcxUpN3Dg3aD9Zv6r7p6Nn106jJcr5rnpRHAReEb/aMI2RWrt3JmL17eCVA==
dependencies:
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/visitor-keys" "5.14.0"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/visitor-keys" "5.30.3"
-"@typescript-eslint/type-utils@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz#711f08105860b12988454e91df433567205a8f0b"
- integrity sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==
+"@typescript-eslint/type-utils@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.3.tgz#1bb4efcfc8de38086d50096709b2cccf72684515"
+ integrity sha512-IIzakE7OXOqdwPaXhRiPnaZ8OuJJYBLufOffd9fqzkI4IMFIYq8KC7bghdnF7QUJTirURRErQFrJ/w5UpwIqaw==
dependencies:
- "@typescript-eslint/utils" "5.14.0"
- debug "^4.3.2"
+ "@typescript-eslint/utils" "5.30.3"
+ debug "^4.3.4"
tsutils "^3.21.0"
-"@typescript-eslint/types@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.14.0.tgz#96317cf116cea4befabc0defef371a1013f8ab11"
- integrity sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==
+"@typescript-eslint/types@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.3.tgz#8ef6313dcec2e297b167dd25ef363e36857c49ff"
+ integrity sha512-vshU3pjSTgBPNgfd55JLYngHkXuwQP68fxYFUAg1Uq+JrR3xG/XjvL9Dmv28CpOERtqwkaR4QQ3mD0NLZcE2Xw==
-"@typescript-eslint/typescript-estree@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz#78b7f7385d5b6f2748aacea5c9b7f6ae62058314"
- integrity sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==
+"@typescript-eslint/typescript-estree@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.3.tgz#d5ff918499dd56039864c157a898b1322d7bff8c"
+ integrity sha512-jqVh5N9AJx6+7yRgoA+ZelAFrHezgI9pzI9giv7s84DDOmtpFwTgURcpICDHyz9x6vAeOu91iACZ4dBTVfzIyA==
dependencies:
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/visitor-keys" "5.14.0"
- debug "^4.3.2"
- globby "^11.0.4"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/visitor-keys" "5.30.3"
+ debug "^4.3.4"
+ globby "^11.1.0"
is-glob "^4.0.3"
- semver "^7.3.5"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.14.0.tgz#6c8bc4f384298cbbb32b3629ba7415f9f80dc8c4"
- integrity sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==
+"@typescript-eslint/utils@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.3.tgz#be2ebaef73e5610c866c4f29ed33669acc89e3fc"
+ integrity sha512-OEaBXGxxdIy35H+jyXfYAMQ66KMJczK9hEhL3gR6IRbWe5PyK+bPDC9zbQNVII6rNFTfF/Mse0z21NlEU+vOMw==
dependencies:
"@types/json-schema" "^7.0.9"
- "@typescript-eslint/scope-manager" "5.14.0"
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/typescript-estree" "5.14.0"
+ "@typescript-eslint/scope-manager" "5.30.3"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/typescript-estree" "5.30.3"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
-"@typescript-eslint/visitor-keys@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz#1927005b3434ccd0d3ae1b2ecf60e65943c36986"
- integrity sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==
+"@typescript-eslint/visitor-keys@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.3.tgz#2c5f7a16c36748d1c51ea5a9c29bfb64780ce466"
+ integrity sha512-ep2xtHOhnSRt6fDP9DSSxrA/FqZhdMF7/Y9fYsxrKss2uWJMbzJyBJ/We1fKc786BJ10pHwrzUlhvpz8i7XzBg==
dependencies:
- "@typescript-eslint/types" "5.14.0"
- eslint-visitor-keys "^3.0.0"
+ "@typescript-eslint/types" "5.30.3"
+ eslint-visitor-keys "^3.3.0"
"@webassemblyjs/ast@1.11.1":
version "1.11.1"
@@ -1239,22 +1277,22 @@
"@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^1.1.1":
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356"
- integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==
+"@webpack-cli/configtest@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
+ integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
-"@webpack-cli/info@^1.4.1":
- version "1.4.1"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea"
- integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==
+"@webpack-cli/info@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
+ integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
dependencies:
envinfo "^7.7.3"
-"@webpack-cli/serve@^1.6.1":
- version "1.6.1"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
- integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
+"@webpack-cli/serve@^1.7.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
+ integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -1278,15 +1316,15 @@ acorn-import-assertions@^1.7.6:
resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
-acorn-jsx@^5.3.1:
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
- version "8.7.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
- integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
ajv-keywords@^3.5.2:
version "3.5.2"
@@ -1339,7 +1377,7 @@ babel-plugin-dynamic-import-node@^2.3.3:
dependencies:
object.assign "^4.1.0"
-babel-plugin-polyfill-corejs2@^0.3.0:
+babel-plugin-polyfill-corejs2@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
@@ -1348,7 +1386,7 @@ babel-plugin-polyfill-corejs2@^0.3.0:
"@babel/helper-define-polyfill-provider" "^0.3.1"
semver "^6.1.1"
-babel-plugin-polyfill-corejs3@^0.5.0:
+babel-plugin-polyfill-corejs3@^0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
@@ -1356,7 +1394,7 @@ babel-plugin-polyfill-corejs3@^0.5.0:
"@babel/helper-define-polyfill-provider" "^0.3.1"
core-js-compat "^3.21.0"
-babel-plugin-polyfill-regenerator@^0.3.0:
+babel-plugin-polyfill-regenerator@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
@@ -1376,23 +1414,22 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
-braces@^3.0.1:
+braces@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
-browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.19.1:
- version "4.20.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9"
- integrity sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ==
+browserslist@^4.14.5, browserslist@^4.20.2, browserslist@^4.21.0:
+ version "4.21.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00"
+ integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ==
dependencies:
- caniuse-lite "^1.0.30001313"
- electron-to-chromium "^1.4.76"
- escalade "^3.1.1"
- node-releases "^2.0.2"
- picocolors "^1.0.0"
+ caniuse-lite "^1.0.30001359"
+ electron-to-chromium "^1.4.172"
+ node-releases "^2.0.5"
+ update-browserslist-db "^1.0.4"
buffer-from@^1.0.0:
version "1.1.2"
@@ -1412,10 +1449,10 @@ callsites@^3.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-caniuse-lite@^1.0.30001313:
- version "1.0.30001314"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001314.tgz#65c7f9fb7e4594fca0a333bec1d8939662377596"
- integrity sha512-0zaSO+TnCHtHJIbpLroX7nsD+vYuOVjl3uzFbJO1wMVbuveJA0RK2WcQA9ZUIOiO0/ArMiMgHJLxfEZhQiC0kw==
+caniuse-lite@^1.0.30001359:
+ version "1.0.30001361"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001361.tgz#ba2adb2527566fb96f3ac7c67698ae7fc495a28d"
+ integrity sha512-ybhCrjNtkFji1/Wto6SSJKkWk6kZgVQsDq5QI83SafsF6FXv2JB4df9eEdH6g8sdGgqTXrFLjAxqBGgYoU3azQ==
chalk@^2.0.0:
version "2.4.2"
@@ -1474,7 +1511,7 @@ color-convert@^2.0.1:
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
color-name@~1.1.4:
version "1.1.4"
@@ -1482,9 +1519,9 @@ color-name@~1.1.4:
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
colorette@^2.0.14:
- version "2.0.16"
- resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
- integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
commander@^2.20.0:
version "2.20.3"
@@ -1499,7 +1536,7 @@ commander@^7.0.0:
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
convert-source-map@^1.7.0:
version "1.8.0"
@@ -1508,12 +1545,12 @@ convert-source-map@^1.7.0:
dependencies:
safe-buffer "~5.1.1"
-core-js-compat@^3.20.2, core-js-compat@^3.21.0:
- version "3.21.1"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.1.tgz#cac369f67c8d134ff8f9bd1623e3bc2c42068c82"
- integrity sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==
+core-js-compat@^3.21.0, core-js-compat@^3.22.1:
+ version "3.23.3"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.23.3.tgz#7d8503185be76bb6d8d592c291a4457a8e440aa9"
+ integrity sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==
dependencies:
- browserslist "^4.19.1"
+ browserslist "^4.21.0"
semver "7.0.0"
cross-spawn@^7.0.2, cross-spawn@^7.0.3:
@@ -1525,10 +1562,10 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
-debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
- integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
@@ -1538,11 +1575,12 @@ deep-is@^0.1.3:
integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
define-properties@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
- integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
dependencies:
- object-keys "^1.0.12"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
dir-glob@^3.0.1:
version "3.0.1"
@@ -1558,20 +1596,20 @@ doctrine@^3.0.0:
dependencies:
esutils "^2.0.2"
-electron-to-chromium@^1.4.76:
- version "1.4.80"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.80.tgz#299a1ea3e32810934b4e3c2e4d4cb53136fdab3f"
- integrity sha512-COsbJCGVYCc/aAY4cd94x1Js3q0r406YKGbdL8LXHg0O9dEjuFEFU/vZneRxBxKo/f1lLHi0YyAR7sbFM+i8Bg==
+electron-to-chromium@^1.4.172:
+ version "1.4.176"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.176.tgz#61ab2a1de3b5072ee31881a937c08ac6780d1cfa"
+ integrity sha512-92JdgyRlcNDwuy75MjuFSb3clt6DGJ2IXSpg0MCjKd3JV9eSmuUAIyWiGAp/EtT0z2D4rqbYqThQLV90maH3Zw==
emoji-regex@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.2:
- version "5.9.2"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz#0224dcd6a43389ebfb2d55efee517e5466772dd9"
- integrity sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==
+enhanced-resolve@^5.0.0, enhanced-resolve@^5.9.3:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6"
+ integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -1594,7 +1632,7 @@ escalade@^3.1.1:
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
escape-string-regexp@^4.0.0:
version "4.0.0"
@@ -1634,17 +1672,17 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0:
+eslint-visitor-keys@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-eslint@^8.6.0:
- version "8.10.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.10.0.tgz#931be395eb60f900c01658b278e05b6dae47199d"
- integrity sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==
+eslint@^8.16.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.18.0.tgz#78d565d16c993d0b73968c523c0446b13da784fd"
+ integrity sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==
dependencies:
- "@eslint/eslintrc" "^1.2.0"
+ "@eslint/eslintrc" "^1.3.0"
"@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
@@ -1655,14 +1693,14 @@ eslint@^8.6.0:
eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
eslint-visitor-keys "^3.3.0"
- espree "^9.3.1"
+ espree "^9.3.2"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^6.0.1"
- globals "^13.6.0"
+ globals "^13.15.0"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
@@ -1671,7 +1709,7 @@ eslint@^8.6.0:
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
regexpp "^3.2.0"
@@ -1680,13 +1718,13 @@ eslint@^8.6.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^9.3.1:
- version "9.3.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
- integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
dependencies:
- acorn "^8.7.0"
- acorn-jsx "^5.3.1"
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.3.0"
esquery@^1.4.0:
@@ -1728,27 +1766,10 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-eventsource@^1.0.7:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf"
- integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==
- dependencies:
- original "^1.0.0"
-
-execa@^5.0.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
- integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
- dependencies:
- cross-spawn "^7.0.3"
- get-stream "^6.0.0"
- human-signals "^2.1.0"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.1"
- onetime "^5.1.2"
- signal-exit "^3.0.3"
- strip-final-newline "^2.0.0"
+eventsource@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
+ integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
@@ -1774,7 +1795,7 @@ fast-json-stable-stringify@^2.0.0:
fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fastest-levenshtein@^1.0.12:
version "1.0.12"
@@ -1788,12 +1809,13 @@ fastq@^1.6.0:
dependencies:
reusify "^1.0.4"
-fetch-cookie@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407"
- integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==
+fetch-cookie@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.0.5.tgz#d49b0886f79c71ce927245d928b9c230a2ddc69e"
+ integrity sha512-zsX/vrrLLCrLUKS/45u/NqZDwRSyopUscM/0huSH5clYe8dmkxIiDs3g4po+f5baWiXiTAOqPMtflP80CtR5rA==
dependencies:
- tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+ set-cookie-parser "^2.4.8"
+ tough-cookie "^4.0.0"
file-entry-cache@^6.0.1:
version "6.0.1"
@@ -1826,19 +1848,19 @@ flat-cache@^3.0.4:
rimraf "^3.0.2"
flatted@^3.1.0:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
- integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
+ integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
fp-ts@^2.6.1:
- version "2.11.8"
- resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.11.8.tgz#411cde116c446d568f5597b03352d8b3f98e8f82"
- integrity sha512-WQT6rP6Jt3TxMdQB3IKzvfZKLuldumntgumLhIUhvPrukTHdWNI4JgEHY04Bd0LIOR9IQRpB+7RuxgUU0Vhmcg==
+ version "2.12.1"
+ resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.12.1.tgz#e389488bfd1507af06bd5965e97367edcd4fabad"
+ integrity sha512-oxvgqUYR6O9VkKXrxkJ0NOyU0FrE705MeqgBUMEPWyTu6Pwn768cJbHChw2XOBlgFLKfIHxjr2OOBFpv2mUGZw==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
function-bind@^1.1.1:
version "1.1.1"
@@ -1848,7 +1870,7 @@ function-bind@^1.1.1:
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
@@ -1860,19 +1882,14 @@ get-caller-file@^2.0.5:
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-get-intrinsic@^1.0.2:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
- integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598"
+ integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==
dependencies:
function-bind "^1.1.1"
has "^1.0.3"
- has-symbols "^1.0.1"
-
-get-stream@^6.0.0:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
- integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+ has-symbols "^1.0.3"
glob-parent@^5.1.2:
version "5.1.2"
@@ -1894,14 +1911,14 @@ glob-to-regexp@^0.4.1:
integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
glob@^7.1.3:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
- minimatch "^3.0.4"
+ minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
@@ -1910,14 +1927,14 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^13.6.0, globals@^13.9.0:
- version "13.12.1"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb"
- integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
dependencies:
type-fest "^0.20.2"
-globby@^11.0.4:
+globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -1930,21 +1947,28 @@ globby@^11.0.4:
slash "^3.0.0"
graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
- version "4.2.9"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
- integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-has-symbols@^1.0.1:
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.1, has-symbols@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
@@ -1956,17 +1980,7 @@ has@^1.0.3:
dependencies:
function-bind "^1.1.1"
-human-signals@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
- integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.8, ignore@^5.2.0:
+ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
@@ -1990,12 +2004,12 @@ import-local@^3.0.2:
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
@@ -2033,17 +2047,17 @@ io-ts@^2.2.13:
resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-2.2.16.tgz#597dffa03db1913fc318c9c6df6931cb4ed808b2"
integrity sha512-y5TTSa6VP6le0hhmIyN0dqEXkrZeJLeC5KApJq6VLci3UEKF80lZ+KuoUs02RhBxNWlrqSNxzfI7otLX1Euv8Q==
-is-core-module@^2.8.1:
- version "2.8.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
- integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
+is-core-module@^2.9.0:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69"
+ integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==
dependencies:
has "^1.0.3"
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-fullwidth-code-point@^3.0.0:
version "3.0.0"
@@ -2069,20 +2083,15 @@ is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-is-stream@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
- integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
isobject@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
- integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
jest-worker@^27.4.5:
version "27.5.1"
@@ -2113,12 +2122,12 @@ jsesc@^2.5.1:
jsesc@~0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
-json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^0.4.1:
version "0.4.1"
@@ -2128,14 +2137,12 @@ json-schema-traverse@^0.4.1:
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
-json5@^2.1.2:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
- integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
- dependencies:
- minimist "^1.2.5"
+json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
kind-of@^6.0.2:
version "6.0.3"
@@ -2151,9 +2158,9 @@ levn@^0.4.1:
type-check "~0.4.0"
loader-runner@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384"
- integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
locate-path@^5.0.0:
version "5.0.0"
@@ -2165,7 +2172,7 @@ locate-path@^5.0.0:
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
- integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
lodash.merge@^4.6.2:
version "4.6.2"
@@ -2190,42 +2197,32 @@ merge2@^1.3.0, merge2@^1.4.1:
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.0, micromatch@^4.0.4:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
- integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
dependencies:
- braces "^3.0.1"
- picomatch "^2.2.3"
+ braces "^3.0.2"
+ picomatch "^2.3.1"
-mime-db@1.51.0:
- version "1.51.0"
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
- integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
mime-types@^2.1.27:
- version "2.1.34"
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
- integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
- mime-db "1.51.0"
+ mime-db "1.52.0"
-mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
-minimatch@^3.0.4:
+minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.5:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
- integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-
ms@2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -2234,7 +2231,7 @@ ms@2.1.2:
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
neo-async@^2.6.2:
version "2.6.2"
@@ -2248,19 +2245,12 @@ node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
-node-releases@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
- integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
-
-npm-run-path@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
+node-releases@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666"
+ integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==
-object-keys@^1.0.12, object-keys@^1.1.1:
+object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
@@ -2278,17 +2268,10 @@ object.assign@^4.1.0:
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
-onetime@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
- integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
- dependencies:
- mimic-fn "^2.1.0"
-
optionator@^0.9.1:
version "0.9.1"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499"
@@ -2301,13 +2284,6 @@ optionator@^0.9.1:
type-check "^0.4.0"
word-wrap "^1.2.3"
-original@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
- integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
- dependencies:
- url-parse "^1.4.3"
-
p-limit@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
@@ -2342,9 +2318,9 @@ path-exists@^4.0.0:
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
-path-key@^3.0.0, path-key@^3.1.0:
+path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
@@ -2364,7 +2340,7 @@ picocolors@^1.0.0:
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-picomatch@^2.2.3:
+picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -2396,11 +2372,6 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-querystringify@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
- integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
-
queue-microtask@^1.2.2:
version "1.2.3"
resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243"
@@ -2437,10 +2408,10 @@ regenerator-runtime@^0.13.4:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
-regenerator-transform@^0.14.2:
- version "0.14.5"
- resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4"
- integrity sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==
+regenerator-transform@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.0.tgz#cbd9ead5d77fae1a48d957cf889ad0586adb6537"
+ integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
dependencies:
"@babel/runtime" "^7.8.4"
@@ -2449,10 +2420,10 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
-regexpu-core@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3"
- integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==
+regexpu-core@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.1.0.tgz#2f8504c3fd0ebe11215783a41541e21c79942c6d"
+ integrity sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==
dependencies:
regenerate "^1.4.2"
regenerate-unicode-properties "^10.0.1"
@@ -2476,12 +2447,7 @@ regjsparser@^0.8.2:
require-directory@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-
-requires-port@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
- integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
resolve-cwd@^3.0.0:
version "3.0.0"
@@ -2501,11 +2467,11 @@ resolve-from@^5.0.0:
integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
resolve@^1.14.2, resolve@^1.9.0:
- version "1.22.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
- integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
dependencies:
- is-core-module "^2.8.1"
+ is-core-module "^2.9.0"
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
@@ -2550,7 +2516,7 @@ schema-utils@^3.1.0, schema-utils@^3.1.1:
semver-compare@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
- integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w=
+ integrity sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==
semver@7.0.0:
version "7.0.0"
@@ -2562,10 +2528,10 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.3.4, semver@^7.3.5:
- version "7.3.5"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
- integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+semver@^7.3.4, semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
@@ -2576,6 +2542,11 @@ serialize-javascript@^6.0.0:
dependencies:
randombytes "^2.1.0"
+set-cookie-parser@^2.4.8:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.0.tgz#96b59525e1362c94335c3c761100bb6e8f2da4b0"
+ integrity sha512-cHMAtSXilfyBePduZEBVPTCftTQWz6ehWJD5YNUg4mqvRosrrjKbo4WS8JkB0/RxonMoohHm7cOGH60mDkRQ9w==
+
shallow-clone@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
@@ -2595,11 +2566,6 @@ shebang-regex@^3.0.0:
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-signal-exit@^3.0.3:
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
- integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-
slash@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
@@ -2613,21 +2579,11 @@ source-map-support@~0.5.20:
buffer-from "^1.0.0"
source-map "^0.6.0"
-source-map@^0.5.0:
- version "0.5.7"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
- integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-
-source-map@^0.6.0, source-map@^0.6.1:
+source-map@^0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@~0.7.2:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
@@ -2644,11 +2600,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
-strip-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
strip-json-comments@^3.1.0, strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
@@ -2686,35 +2637,35 @@ tapable@^2.1.1, tapable@^2.2.0:
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
terser-webpack-plugin@^5.1.3:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
- integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90"
+ integrity sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==
dependencies:
+ "@jridgewell/trace-mapping" "^0.3.7"
jest-worker "^27.4.5"
schema-utils "^3.1.1"
serialize-javascript "^6.0.0"
- source-map "^0.6.1"
terser "^5.7.2"
-terser@^5.10.0, terser@^5.7.2:
- version "5.12.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.12.0.tgz#728c6bff05f7d1dcb687d8eace0644802a9dae8a"
- integrity sha512-R3AUhNBGWiFc77HXag+1fXpAxTAFRQTJemlJKjAgD9r8xXTpjNKqIXwHM/o7Rh+O0kUJtS3WQVdBeMKFk5sw9A==
+terser@^5.14.2, terser@^5.7.2:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
dependencies:
+ "@jridgewell/source-map" "^0.3.2"
acorn "^8.5.0"
commander "^2.20.0"
- source-map "~0.7.2"
source-map-support "~0.5.20"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
to-regex-range@^5.0.1:
version "5.0.1"
@@ -2723,7 +2674,7 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
-"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+tough-cookie@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
@@ -2735,12 +2686,12 @@ to-regex-range@^5.0.1:
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
- integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
ts-loader@^9.2.6:
- version "9.2.7"
- resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.7.tgz#948654099ca96992b62ec47bd9cee5632006e101"
- integrity sha512-Fxh44mKli9QezgbdCXkEJWxnedQ0ead7DXTH+lfXEPedu+Y9EtMJ2aQ9G3Dj1j7Q612E8931rww8NDZha4Tibg==
+ version "9.3.1"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.3.1.tgz#fe25cca56e3e71c1087fe48dc67f4df8c59b22d4"
+ integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw==
dependencies:
chalk "^4.1.0"
enhanced-resolve "^5.0.0"
@@ -2772,9 +2723,9 @@ type-fest@^0.20.2:
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
typescript@^4.5.4:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4"
- integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==
+ version "4.7.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
+ integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0"
@@ -2804,6 +2755,14 @@ universalify@^0.1.2:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+update-browserslist-db@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824"
+ integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
uri-js@^4.2.2:
version "4.4.1"
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
@@ -2811,23 +2770,15 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-url-parse@>=1.5.6, url-parse@^1.4.3:
- version "1.5.10"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
- integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
- dependencies:
- querystringify "^2.1.1"
- requires-port "^1.0.0"
-
v8-compile-cache@^2.0.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
watchpack@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
- integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
+ integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
@@ -2835,20 +2786,20 @@ watchpack@^2.3.1:
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
- integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
-webpack-cli@^4.9.1:
- version "4.9.2"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
- integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
+webpack-cli@^4.9.2:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31"
+ integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.1.1"
- "@webpack-cli/info" "^1.4.1"
- "@webpack-cli/serve" "^1.6.1"
+ "@webpack-cli/configtest" "^1.2.0"
+ "@webpack-cli/info" "^1.5.0"
+ "@webpack-cli/serve" "^1.7.0"
colorette "^2.0.14"
commander "^7.0.0"
- execa "^5.0.0"
+ cross-spawn "^7.0.3"
fastest-levenshtein "^1.0.12"
import-local "^3.0.2"
interpret "^2.2.0"
@@ -2868,10 +2819,10 @@ webpack-sources@^3.2.3:
resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-webpack@^5.66.0:
- version "5.70.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.70.0.tgz#3461e6287a72b5e6e2f4872700bc8de0d7500e6d"
- integrity sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==
+webpack@^5.72.1:
+ version "5.73.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38"
+ integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==
dependencies:
"@types/eslint-scope" "^3.7.3"
"@types/estree" "^0.0.51"
@@ -2882,13 +2833,13 @@ webpack@^5.66.0:
acorn-import-assertions "^1.7.6"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.9.2"
+ enhanced-resolve "^5.9.3"
es-module-lexer "^0.9.0"
eslint-scope "5.1.1"
events "^3.2.0"
glob-to-regexp "^0.4.1"
graceful-fs "^4.2.9"
- json-parse-better-errors "^1.0.2"
+ json-parse-even-better-errors "^2.3.1"
loader-runner "^4.2.0"
mime-types "^2.1.27"
neo-async "^2.6.2"
@@ -2901,7 +2852,7 @@ webpack@^5.66.0:
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
- integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
@@ -2935,12 +2886,12 @@ wrap-ansi@^7.0.0:
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
ws@^7.4.5:
- version "7.5.7"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
- integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
+ version "7.5.8"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a"
+ integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==
y18n@^5.0.5:
version "5.0.8"
diff --git a/src/Components/Web/src/Forms/InputFile/InputFileJsCallbacksRelay.cs b/src/Components/Web/src/Forms/InputFile/InputFileJsCallbacksRelay.cs
index 1d0b902afe..d426eff5ab 100644
--- a/src/Components/Web/src/Forms/InputFile/InputFileJsCallbacksRelay.cs
+++ b/src/Components/Web/src/Forms/InputFile/InputFileJsCallbacksRelay.cs
@@ -6,7 +6,7 @@ using Microsoft.JSInterop;
namespace Microsoft.AspNetCore.Components.Forms;
-internal class InputFileJsCallbacksRelay : IDisposable
+internal sealed class InputFileJsCallbacksRelay : IDisposable
{
private readonly IInputFileJsCallbacks _callbacks;
diff --git a/src/Components/Web/src/JSComponents/JSComponentConfigurationStore.cs b/src/Components/Web/src/JSComponents/JSComponentConfigurationStore.cs
index 38496b6f04..b286b071e1 100644
--- a/src/Components/Web/src/JSComponents/JSComponentConfigurationStore.cs
+++ b/src/Components/Web/src/JSComponents/JSComponentConfigurationStore.cs
@@ -4,6 +4,7 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.AspNetCore.Components.Web.Infrastructure;
+using Microsoft.AspNetCore.Internal;
namespace Microsoft.AspNetCore.Components.Web;
@@ -20,11 +21,11 @@ public sealed class JSComponentConfigurationStore
// without needing any changes on the downstream code that implements IJSComponentConfiguration,
// and without exposing any of the configuration storage across layers.
- internal Dictionary<string, Type> JSComponentTypesByIdentifier { get; } = new(StringComparer.Ordinal);
+ private readonly Dictionary<string, Type> _jsComponentTypesByIdentifier = new(StringComparer.Ordinal);
internal Dictionary<string, JSComponentParameter[]> JSComponentParametersByIdentifier { get; } = new(StringComparer.Ordinal);
internal Dictionary<string, List<string>> JSComponentIdentifiersByInitializer { get; } = new(StringComparer.Ordinal);
- internal void Add(Type componentType, string identifier)
+ internal void Add([DynamicallyAccessedMembers(LinkerFlags.Component)] Type componentType, string identifier)
{
var parameterTypes = JSComponentInterop.GetComponentParameters(componentType).ParameterInfoByName;
var parameters = new JSComponentParameter[parameterTypes.Count];
@@ -34,15 +35,24 @@ public sealed class JSComponentConfigurationStore
parameters[index++] = new JSComponentParameter(name, type.Type);
}
- JSComponentTypesByIdentifier.Add(identifier, componentType);
+ _jsComponentTypesByIdentifier.Add(identifier, componentType);
JSComponentParametersByIdentifier.Add(identifier, parameters);
}
+ [UnconditionalSuppressMessage("Trimming", "IL2067",
+ Justification = "Types added to dictionary are always correctly annotated.")]
+ internal bool TryGetComponentType(
+ string identifier,
+ [NotNullWhen(true)][DynamicallyAccessedMembers(LinkerFlags.Component)] out Type? componentType)
+ {
+ return _jsComponentTypesByIdentifier.TryGetValue(identifier, out componentType);
+ }
+
[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(JSComponentParameter))]
[DynamicDependency(nameof(WebRenderer.WebRendererInteropMethods.AddRootComponent), typeof(WebRenderer.WebRendererInteropMethods))]
[DynamicDependency(nameof(WebRenderer.WebRendererInteropMethods.SetRootComponentParameters), typeof(WebRenderer.WebRendererInteropMethods))]
[DynamicDependency(nameof(WebRenderer.WebRendererInteropMethods.RemoveRootComponent), typeof(WebRenderer.WebRendererInteropMethods))]
- internal void Add(Type componentType, string identifier, string javaScriptInitializer)
+ internal void Add([DynamicallyAccessedMembers(LinkerFlags.Component)] Type componentType, string identifier, string javaScriptInitializer)
{
Add(componentType, identifier);
diff --git a/src/Components/Web/src/JSComponents/JSComponentInterop.cs b/src/Components/Web/src/JSComponents/JSComponentInterop.cs
index 42f002ff1e..43132bd1e7 100644
--- a/src/Components/Web/src/JSComponents/JSComponentInterop.cs
+++ b/src/Components/Web/src/JSComponents/JSComponentInterop.cs
@@ -65,7 +65,7 @@ public class JSComponentInterop
/// </summary>
protected internal virtual int AddRootComponent(string identifier, string domElementSelector)
{
- if (!Configuration.JSComponentTypesByIdentifier.TryGetValue(identifier, out var componentType))
+ if (!Configuration.TryGetComponentType(identifier, out var componentType))
{
throw new ArgumentException($"There is no registered JS component with identifier '{identifier}'.");
}
@@ -178,6 +178,7 @@ public class JSComponentInterop
return new(null, callback);
}
+ [UnconditionalSuppressMessage("Trimming", "IL2067", Justification = "EventCallback and EventCallback<TValue> constructors are referenced statically and will be preserved.")]
private static object CreateEventCallbackWithSingleParameter(Type eventCallbackType, IJSObjectReference? jsObjectReference)
{
var callback = jsObjectReference is null ? null : new Func<object, Task>(
@@ -195,6 +196,7 @@ public class JSComponentInterop
{
public readonly Dictionary<string, ParameterInfo> ParameterInfoByName;
+ [UnconditionalSuppressMessage("Trimming", "IL2067", Justification = "OpenComponent already has the right set of attributes")]
public ParameterTypeCache(Type componentType)
{
ParameterInfoByName = new(StringComparer.OrdinalIgnoreCase);
diff --git a/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.WarningSuppressions.xml b/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.WarningSuppressions.xml
index db0f1efbb1..750434411f 100644
--- a/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.WarningSuppressions.xml
+++ b/src/Components/Web/src/Microsoft.AspNetCore.Components.Web.WarningSuppressions.xml
@@ -1,18 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<linker>
- <assembly fullname="Microsoft.AspNetCore.Components.Web, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
- <attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
- <argument>ILLink</argument>
- <argument>IL2026</argument>
- <property name="Scope">member</property>
- <property name="Target">M:Microsoft.AspNetCore.Components.Web.Infrastructure.JSComponentInterop.SetRootComponentParameters(System.Int32,System.Int32,System.Text.Json.JsonElement,System.Text.Json.JsonSerializerOptions)</property>
- </attribute>
- <attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
- <argument>ILLink</argument>
- <argument>IL2026</argument>
- <property name="Scope">member</property>
- <property name="Target">M:Microsoft.AspNetCore.Components.Web.WebEventData.ParseEventArgsJson(Microsoft.AspNetCore.Components.RenderTree.Renderer,System.Text.Json.JsonSerializerOptions,System.UInt64,System.String,System.Text.Json.JsonElement)</property>
- </attribute>
+ <assembly fullname="Microsoft.AspNetCore.Components.Web, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
<attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
<argument>ILLink</argument>
<argument>IL2062</argument>
diff --git a/src/Components/Web/src/PublicAPI.Shipped.txt b/src/Components/Web/src/PublicAPI.Shipped.txt
index 094e7d8997..d26a754842 100644
--- a/src/Components/Web/src/PublicAPI.Shipped.txt
+++ b/src/Components/Web/src/PublicAPI.Shipped.txt
@@ -362,15 +362,18 @@ Microsoft.AspNetCore.Components.Web.TouchPoint.ScreenY.set -> void
Microsoft.AspNetCore.Components.Web.TouchPoint.TouchPoint() -> void
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderDelegate<TItem>
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderRequest
+Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderRequest.ItemsProviderRequest() -> void
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderRequest.CancellationToken.get -> System.Threading.CancellationToken
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderRequest.Count.get -> int
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderRequest.ItemsProviderRequest(int startIndex, int count, System.Threading.CancellationToken cancellationToken) -> void
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderRequest.StartIndex.get -> int
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderResult<TItem>
+Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderResult<TItem>.ItemsProviderResult() -> void
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderResult<TItem>.Items.get -> System.Collections.Generic.IEnumerable<TItem>!
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderResult<TItem>.ItemsProviderResult(System.Collections.Generic.IEnumerable<TItem>! items, int totalItemCount) -> void
Microsoft.AspNetCore.Components.Web.Virtualization.ItemsProviderResult<TItem>.TotalItemCount.get -> int
Microsoft.AspNetCore.Components.Web.Virtualization.PlaceholderContext
+Microsoft.AspNetCore.Components.Web.Virtualization.PlaceholderContext.PlaceholderContext() -> void
Microsoft.AspNetCore.Components.Web.Virtualization.PlaceholderContext.Index.get -> int
Microsoft.AspNetCore.Components.Web.Virtualization.PlaceholderContext.PlaceholderContext(int index, float size = 0) -> void
Microsoft.AspNetCore.Components.Web.Virtualization.PlaceholderContext.Size.get -> float
diff --git a/src/Components/Web/src/PublicAPI.Unshipped.txt b/src/Components/Web/src/PublicAPI.Unshipped.txt
index 34c8afc7fb..3afbb4d7c9 100644
--- a/src/Components/Web/src/PublicAPI.Unshipped.txt
+++ b/src/Components/Web/src/PublicAPI.Unshipped.txt
@@ -1,3 +1,15 @@
#nullable enable
Microsoft.AspNetCore.Components.Forms.InputRadio<TValue>.Element.get -> Microsoft.AspNetCore.Components.ElementReference?
Microsoft.AspNetCore.Components.Forms.InputRadio<TValue>.Element.set -> void
+Microsoft.AspNetCore.Components.Routing.NavigationLock
+Microsoft.AspNetCore.Components.Routing.NavigationLock.ConfirmExternalNavigation.get -> bool
+Microsoft.AspNetCore.Components.Routing.NavigationLock.ConfirmExternalNavigation.set -> void
+Microsoft.AspNetCore.Components.Routing.NavigationLock.NavigationLock() -> void
+Microsoft.AspNetCore.Components.Routing.NavigationLock.OnBeforeInternalNavigation.get -> Microsoft.AspNetCore.Components.EventCallback<Microsoft.AspNetCore.Components.Routing.LocationChangingContext!>
+Microsoft.AspNetCore.Components.Routing.NavigationLock.OnBeforeInternalNavigation.set -> void
+Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize<TItem>.SpacerElement.get -> string!
+Microsoft.AspNetCore.Components.Web.Virtualization.Virtualize<TItem>.SpacerElement.set -> void
+Microsoft.AspNetCore.Components.Web.MouseEventArgs.MovementX.get -> double
+Microsoft.AspNetCore.Components.Web.MouseEventArgs.MovementX.set -> void
+Microsoft.AspNetCore.Components.Web.MouseEventArgs.MovementY.get -> double
+Microsoft.AspNetCore.Components.Web.MouseEventArgs.MovementY.set -> void
diff --git a/src/Components/Web/src/Routing/FocusOnNavigate.cs b/src/Components/Web/src/Routing/FocusOnNavigate.cs
index 9edc0f08cd..468e15c860 100644
--- a/src/Components/Web/src/Routing/FocusOnNavigate.cs
+++ b/src/Components/Web/src/Routing/FocusOnNavigate.cs
@@ -62,5 +62,5 @@ public class FocusOnNavigate : ComponentBase
// On the first render, we always want to consider the page type changed, even if it's null.
// So we need some other non-null type to compare with it.
- private class NonMatchingType { }
+ private sealed class NonMatchingType { }
}
diff --git a/src/Components/Web/src/Routing/NavigationLock.cs b/src/Components/Web/src/Routing/NavigationLock.cs
new file mode 100644
index 0000000000..2dd9aac504
--- /dev/null
+++ b/src/Components/Web/src/Routing/NavigationLock.cs
@@ -0,0 +1,83 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using Microsoft.JSInterop;
+
+namespace Microsoft.AspNetCore.Components.Routing;
+
+/// <summary>
+/// A component that can be used to intercept navigation events.
+/// </summary>
+public sealed class NavigationLock : IComponent, IAsyncDisposable
+{
+ private readonly string _id = Guid.NewGuid().ToString("D", CultureInfo.InvariantCulture);
+
+ private IDisposable? _locationChangingRegistration;
+
+ private bool HasOnBeforeInternalNavigationCallback => OnBeforeInternalNavigation.HasDelegate;
+
+ [Inject]
+ private IJSRuntime JSRuntime { get; set; } = default!;
+
+ [Inject]
+ private NavigationManager NavigationManager { get; set; } = default!;
+
+ /// <summary>
+ /// Gets or sets a callback to be invoked when an internal navigation event occurs.
+ /// </summary>
+ [Parameter]
+ public EventCallback<LocationChangingContext> OnBeforeInternalNavigation { get; set; }
+
+ /// <summary>
+ /// Gets or sets whether a browser dialog should prompt the user to either confirm or cancel
+ /// external navigations.
+ /// </summary>
+ [Parameter]
+ public bool ConfirmExternalNavigation { get; set; }
+
+ void IComponent.Attach(RenderHandle renderHandle)
+ {
+ }
+
+ async Task IComponent.SetParametersAsync(ParameterView parameters)
+ {
+ var lastHasOnBeforeInternalNavigationCallback = HasOnBeforeInternalNavigationCallback;
+ var lastConfirmExternalNavigation = ConfirmExternalNavigation;
+
+ parameters.SetParameterProperties(this);
+
+ var hasOnBeforeInternalNavigationCallback = HasOnBeforeInternalNavigationCallback;
+ if (hasOnBeforeInternalNavigationCallback != lastHasOnBeforeInternalNavigationCallback)
+ {
+ _locationChangingRegistration?.Dispose();
+ _locationChangingRegistration = hasOnBeforeInternalNavigationCallback
+ ? NavigationManager.RegisterLocationChangingHandler(OnLocationChanging)
+ : null;
+ }
+
+ var confirmExternalNavigation = ConfirmExternalNavigation;
+ if (confirmExternalNavigation != lastConfirmExternalNavigation)
+ {
+ if (confirmExternalNavigation)
+ {
+ await JSRuntime.InvokeVoidAsync(NavigationLockInterop.EnableNavigationPrompt, _id);
+ }
+ else
+ {
+ await JSRuntime.InvokeVoidAsync(NavigationLockInterop.DisableNavigationPrompt, _id);
+ }
+ }
+ }
+
+ async ValueTask OnLocationChanging(LocationChangingContext context)
+ {
+ await OnBeforeInternalNavigation.InvokeAsync(context);
+ }
+
+ async ValueTask IAsyncDisposable.DisposeAsync()
+ {
+ _locationChangingRegistration?.Dispose();
+ await JSRuntime.InvokeVoidAsync(NavigationLockInterop.DisableNavigationPrompt, _id);
+ }
+}
diff --git a/src/Components/Web/src/Routing/NavigationLockInterop.cs b/src/Components/Web/src/Routing/NavigationLockInterop.cs
new file mode 100644
index 0000000000..98ee97f569
--- /dev/null
+++ b/src/Components/Web/src/Routing/NavigationLockInterop.cs
@@ -0,0 +1,13 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Components.Routing;
+
+internal class NavigationLockInterop
+{
+ private const string Prefix = "Blazor._internal.NavigationLock.";
+
+ public const string EnableNavigationPrompt = Prefix + "enableNavigationPrompt";
+
+ public const string DisableNavigationPrompt = Prefix + "disableNavigationPrompt";
+}
diff --git a/src/Components/Web/src/Virtualization/Virtualize.cs b/src/Components/Web/src/Virtualization/Virtualize.cs
index 2e9779ad9a..b2418c29d6 100644
--- a/src/Components/Web/src/Virtualization/Virtualize.cs
+++ b/src/Components/Web/src/Virtualization/Virtualize.cs
@@ -96,6 +96,18 @@ public sealed class Virtualize<TItem> : ComponentBase, IVirtualizeJsCallbacks, I
public int OverscanCount { get; set; } = 3;
/// <summary>
+ /// Gets or sets the tag name of the HTML element that will be used as the virtualization spacer.
+ /// One such element will be rendered before the visible items, and one more after them, using
+ /// an explicit "height" style to control the scroll range.
+ ///
+ /// The default value is "div". If you are placing the <see cref="Virtualize{TItem}"/> instance inside
+ /// an element that requires a specific child tag name, consider setting that here. For example when
+ /// rendering inside a "tbody", consider setting <see cref="SpacerElement"/> to the value "tr".
+ /// </summary>
+ [Parameter]
+ public string SpacerElement { get; set; } = "div";
+
+ /// <summary>
/// Instructs the component to re-request data from its <see cref="ItemsProvider"/>.
/// This is useful if external data may have changed. There is no need to call this
/// when using <see cref="Items"/>.
@@ -178,7 +190,7 @@ public sealed class Virtualize<TItem> : ComponentBase, IVirtualizeJsCallbacks, I
throw oldRefreshException;
}
- builder.OpenElement(0, "div");
+ builder.OpenElement(0, SpacerElement);
builder.AddAttribute(1, "style", GetSpacerStyle(_itemsBefore));
builder.AddElementReferenceCapture(2, elementReference => _spacerBefore = elementReference);
builder.CloseElement();
@@ -235,7 +247,7 @@ public sealed class Virtualize<TItem> : ComponentBase, IVirtualizeJsCallbacks, I
var itemsAfter = Math.Max(0, _itemCount - _visibleItemCapacity - _itemsBefore);
- builder.OpenElement(6, "div");
+ builder.OpenElement(6, SpacerElement);
builder.AddAttribute(7, "style", GetSpacerStyle(itemsAfter));
builder.AddElementReferenceCapture(8, elementReference => _spacerAfter = elementReference);
diff --git a/src/Components/Web/src/Virtualization/VirtualizeJsInterop.cs b/src/Components/Web/src/Virtualization/VirtualizeJsInterop.cs
index 03b4dd7895..0d1ed705ec 100644
--- a/src/Components/Web/src/Virtualization/VirtualizeJsInterop.cs
+++ b/src/Components/Web/src/Virtualization/VirtualizeJsInterop.cs
@@ -6,7 +6,7 @@ using Microsoft.JSInterop;
namespace Microsoft.AspNetCore.Components.Web.Virtualization;
-internal class VirtualizeJsInterop : IAsyncDisposable
+internal sealed class VirtualizeJsInterop : IAsyncDisposable
{
private const string JsFunctionsPrefix = "Blazor._internal.Virtualize";
diff --git a/src/Components/Web/src/Web/MouseEventArgs.cs b/src/Components/Web/src/Web/MouseEventArgs.cs
index 4e025e2e11..7a404e1920 100644
--- a/src/Components/Web/src/Web/MouseEventArgs.cs
+++ b/src/Components/Web/src/Web/MouseEventArgs.cs
@@ -54,6 +54,16 @@ public class MouseEventArgs : EventArgs
public double PageY { get; set; }
/// <summary>
+ /// The X coordinate of the mouse pointer relative to the position of the last mousemove event.
+ /// </summary>
+ public double MovementX { get; set; }
+
+ /// <summary>
+ /// The Y coordinate of the mouse pointer relative to the position of the last mousemove event.
+ /// </summary>
+ public double MovementY { get; set; }
+
+ /// <summary>
/// The button number that was pressed when the mouse event was fired:
/// Left button=0,
/// middle button=1 (if present),
diff --git a/src/Components/Web/src/WebEventData/MouseEventArgsReader.cs b/src/Components/Web/src/WebEventData/MouseEventArgsReader.cs
index a42800ee98..30b3df22b8 100644
--- a/src/Components/Web/src/WebEventData/MouseEventArgsReader.cs
+++ b/src/Components/Web/src/WebEventData/MouseEventArgsReader.cs
@@ -18,6 +18,8 @@ internal static class MouseEventArgsReader
private static readonly JsonEncodedText OffsetY = JsonEncodedText.Encode("offsetY");
private static readonly JsonEncodedText PageX = JsonEncodedText.Encode("pageX");
private static readonly JsonEncodedText PageY = JsonEncodedText.Encode("pageY");
+ private static readonly JsonEncodedText MovementX = JsonEncodedText.Encode("movementX");
+ private static readonly JsonEncodedText MovementY = JsonEncodedText.Encode("movementY");
private static readonly JsonEncodedText Button = JsonEncodedText.Encode("button");
private static readonly JsonEncodedText Buttons = JsonEncodedText.Encode("buttons");
private static readonly JsonEncodedText CtrlKey = JsonEncodedText.Encode("ctrlKey");
@@ -74,6 +76,14 @@ internal static class MouseEventArgsReader
{
eventArgs.PageY = property.Value.GetDouble();
}
+ else if (property.NameEquals(MovementX.EncodedUtf8Bytes))
+ {
+ eventArgs.MovementX = property.Value.GetDouble();
+ }
+ else if (property.NameEquals(MovementY.EncodedUtf8Bytes))
+ {
+ eventArgs.MovementY = property.Value.GetDouble();
+ }
else if (property.NameEquals(Button.EncodedUtf8Bytes))
{
eventArgs.Button = property.Value.GetInt64();
diff --git a/src/Components/Web/src/WebEventData/WebEventData.cs b/src/Components/Web/src/WebEventData/WebEventData.cs
index 24c5c4899f..0b832f597e 100644
--- a/src/Components/Web/src/WebEventData/WebEventData.cs
+++ b/src/Components/Web/src/WebEventData/WebEventData.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Components.RenderTree;
namespace Microsoft.AspNetCore.Components.Web;
-internal class WebEventData
+internal sealed class WebEventData
{
// This class represents the second half of parsing incoming event data,
// once the event ID (and possibly the type of the eventArgs) becomes known.
diff --git a/src/Components/Web/test/WebEventData/MouseEventArgsReaderTest.cs b/src/Components/Web/test/WebEventData/MouseEventArgsReaderTest.cs
index 80d66671e1..d0e72b8414 100644
--- a/src/Components/Web/test/WebEventData/MouseEventArgsReaderTest.cs
+++ b/src/Components/Web/test/WebEventData/MouseEventArgsReaderTest.cs
@@ -27,6 +27,8 @@ public class MouseEventArgsReaderTest
PageY = 7.8,
ScreenX = 0.1,
ScreenY = 4.4,
+ MovementX = 0.1,
+ MovementY = 4.4,
ShiftKey = false,
Type = "type",
};
@@ -55,6 +57,8 @@ public class MouseEventArgsReaderTest
Assert.Equal(expected.PageY, actual.PageY);
Assert.Equal(expected.ScreenX, actual.ScreenX);
Assert.Equal(expected.ScreenY, actual.ScreenY);
+ Assert.Equal(expected.MovementX, actual.MovementX);
+ Assert.Equal(expected.MovementY, actual.MovementY);
Assert.Equal(expected.ShiftKey, actual.ShiftKey);
Assert.Equal(expected.Type, actual.Type);
}
diff --git a/src/Components/WebAssembly/Authentication.Msal/src/Interop/.npmrc b/src/Components/WebAssembly/Authentication.Msal/src/Interop/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Components/WebAssembly/Authentication.Msal/src/Interop/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Components/WebAssembly/Authentication.Msal/src/Interop/package.json b/src/Components/WebAssembly/Authentication.Msal/src/Interop/package.json
index 43862a4806..5f79713c30 100644
--- a/src/Components/WebAssembly/Authentication.Msal/src/Interop/package.json
+++ b/src/Components/WebAssembly/Authentication.Msal/src/Interop/package.json
@@ -14,16 +14,16 @@
"devDependencies": {
"@babel/core": "^7.15.0",
"@babel/preset-env": "^7.15.0",
- "@typescript-eslint/eslint-plugin": "^4.29.3",
- "@typescript-eslint/parser": "^4.29.3",
- "eslint": "^7.32.0",
+ "@typescript-eslint/eslint-plugin": "^5.26.0",
+ "@typescript-eslint/parser": "^5.26.0",
+ "eslint": "^8.16.0",
"inspectpack": "^4.7.1",
"rimraf": "^3.0.2",
- "terser": "^5.7.2",
+ "terser": "^5.14.2",
"ts-loader": "^9.2.5",
"typescript": "^4.4.2",
- "webpack": "^5.51.1",
- "webpack-cli": "^4.8.0"
+ "webpack": "^5.72.1",
+ "webpack-cli": "^4.9.2"
},
"dependencies": {
"@azure/msal-browser": "^2.16.1"
diff --git a/src/Components/WebAssembly/Authentication.Msal/src/Interop/yarn.lock b/src/Components/WebAssembly/Authentication.Msal/src/Interop/yarn.lock
index 97ffee2210..a181b8dd76 100644
--- a/src/Components/WebAssembly/Authentication.Msal/src/Interop/yarn.lock
+++ b/src/Components/WebAssembly/Authentication.Msal/src/Interop/yarn.lock
@@ -16,13 +16,6 @@
dependencies:
debug "^4.1.1"
-"@babel/code-frame@7.12.11":
- version "7.12.11"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
- integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
- dependencies:
- "@babel/highlight" "^7.10.4"
-
"@babel/code-frame@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
@@ -263,7 +256,7 @@
"@babel/traverse" "^7.15.0"
"@babel/types" "^7.15.0"
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
+"@babel/highlight@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
@@ -894,34 +887,74 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d"
integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==
-"@eslint/eslintrc@^0.4.3":
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
- integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
dependencies:
ajv "^6.12.4"
- debug "^4.1.1"
- espree "^7.3.0"
- globals "^13.9.0"
- ignore "^4.0.6"
+ debug "^4.3.2"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.2.1"
- js-yaml "^3.13.1"
- minimatch "^3.0.4"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@humanwhocodes/config-array@^0.5.0":
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
- integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+"@humanwhocodes/config-array@^0.9.2":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
+ integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
dependencies:
- "@humanwhocodes/object-schema" "^1.2.0"
+ "@humanwhocodes/object-schema" "^1.2.1"
debug "^4.1.1"
minimatch "^3.0.4"
-"@humanwhocodes/object-schema@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
- integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -944,10 +977,10 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@types/eslint-scope@^3.7.0":
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e"
- integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
dependencies:
"@types/eslint" "*"
"@types/estree" "*"
@@ -960,89 +993,110 @@
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^0.0.50":
+"@types/estree@*":
version "0.0.50"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
-"@types/json-schema@*", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8":
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/json-schema@*", "@types/json-schema@^7.0.8":
version "7.0.9"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+"@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
"@types/node@*":
version "16.7.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.6.tgz#8666478db8095aa66e25b7e469f3e7b53ea2855e"
integrity sha512-VESVNFoa/ahYA62xnLBjo5ur6gPsgEE5cNRy8SrdnkZ2nwJSW0kJ4ufbFr2zuU9ALtHM8juY53VcRoTA7htXSg==
-"@typescript-eslint/eslint-plugin@^4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.3.tgz#95cb8029a8bd8bd9c7f4ab95074a7cb2115adefa"
- integrity sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==
+"@typescript-eslint/eslint-plugin@^5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz#c1f98ccba9d345e38992975d3ca56ed6260643c2"
+ integrity sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==
dependencies:
- "@typescript-eslint/experimental-utils" "4.29.3"
- "@typescript-eslint/scope-manager" "4.29.3"
- debug "^4.3.1"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/type-utils" "5.26.0"
+ "@typescript-eslint/utils" "5.26.0"
+ debug "^4.3.4"
functional-red-black-tree "^1.0.1"
- regexpp "^3.1.0"
- semver "^7.3.5"
+ ignore "^5.2.0"
+ regexpp "^3.2.0"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/experimental-utils@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.3.tgz#52e437a689ccdef73e83c5106b34240a706f15e1"
- integrity sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==
+"@typescript-eslint/parser@^5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.26.0.tgz#a61b14205fe2ab7533deb4d35e604add9a4ceee2"
+ integrity sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==
dependencies:
- "@types/json-schema" "^7.0.7"
- "@typescript-eslint/scope-manager" "4.29.3"
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/typescript-estree" "4.29.3"
- eslint-scope "^5.1.1"
- eslint-utils "^3.0.0"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/typescript-estree" "5.26.0"
+ debug "^4.3.4"
-"@typescript-eslint/parser@^4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.3.tgz#2ac25535f34c0e98f50c0e6b28c679c2357d45f2"
- integrity sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==
- dependencies:
- "@typescript-eslint/scope-manager" "4.29.3"
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/typescript-estree" "4.29.3"
- debug "^4.3.1"
-
-"@typescript-eslint/scope-manager@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.3.tgz#497dec66f3a22e459f6e306cf14021e40ec86e19"
- integrity sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==
- dependencies:
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/visitor-keys" "4.29.3"
-
-"@typescript-eslint/types@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.3.tgz#d7980c49aef643d0af8954c9f14f656b7fd16017"
- integrity sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==
-
-"@typescript-eslint/typescript-estree@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.3.tgz#1bafad610015c4ded35c85a70b6222faad598b40"
- integrity sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==
- dependencies:
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/visitor-keys" "4.29.3"
- debug "^4.3.1"
- globby "^11.0.3"
- is-glob "^4.0.1"
- semver "^7.3.5"
+"@typescript-eslint/scope-manager@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz#44209c7f649d1a120f0717e0e82da856e9871339"
+ integrity sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/visitor-keys" "5.26.0"
+
+"@typescript-eslint/type-utils@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz#937dee97702361744a3815c58991acf078230013"
+ integrity sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==
+ dependencies:
+ "@typescript-eslint/utils" "5.26.0"
+ debug "^4.3.4"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.26.0.tgz#cb204bb154d3c103d9cc4d225f311b08219469f3"
+ integrity sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==
+
+"@typescript-eslint/typescript-estree@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz#16cbceedb0011c2ed4f607255f3ee1e6e43b88c3"
+ integrity sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/visitor-keys" "5.26.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/visitor-keys@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.3.tgz#c691760a00bd86bf8320d2a90a93d86d322f1abf"
- integrity sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==
+"@typescript-eslint/utils@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.26.0.tgz#896b8480eb124096e99c8b240460bb4298afcfb4"
+ integrity sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==
dependencies:
- "@typescript-eslint/types" "4.29.3"
- eslint-visitor-keys "^2.0.0"
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/typescript-estree" "5.26.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz#7195f756e367f789c0e83035297c45b417b57f57"
+ integrity sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ eslint-visitor-keys "^3.3.0"
"@webassemblyjs/ast@1.11.1":
version "1.11.1"
@@ -1165,22 +1219,22 @@
"@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa"
- integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==
+"@webpack-cli/configtest@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356"
+ integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==
-"@webpack-cli/info@^1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b"
- integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==
+"@webpack-cli/info@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea"
+ integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==
dependencies:
envinfo "^7.7.3"
-"@webpack-cli/serve@^1.5.2":
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec"
- integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==
+"@webpack-cli/serve@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
+ integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -1197,20 +1251,15 @@ acorn-import-assertions@^1.7.6:
resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78"
integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==
-acorn-jsx@^5.3.1:
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^7.4.0:
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
- integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-
-acorn@^8.4.1:
- version "8.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
- integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
+acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
ajv-keywords@^3.5.2:
version "3.5.2"
@@ -1227,22 +1276,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1:
- version "8.6.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571"
- integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
-ansi-regex@5.0.1, ansi-regex@^5.0.0:
+ansi-regex@5.0.1, ansi-regex@^5.0.0, ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
@@ -1261,23 +1295,16 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-astral-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
- integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
babel-plugin-dynamic-import-node@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
@@ -1427,11 +1454,16 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-colorette@^1.2.1, colorette@^1.3.0:
+colorette@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
+colorette@^2.0.14:
+ version "2.0.16"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
+ integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
+
commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -1471,13 +1503,20 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3:
shebang-command "^2.0.0"
which "^2.0.1"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+debug@^4.1.0, debug@^4.1.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
+debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
deep-is@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -1514,7 +1553,7 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0:
+enhanced-resolve@^5.0.0:
version "5.8.2"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b"
integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==
@@ -1522,22 +1561,23 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-enquirer@^2.3.5:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+enhanced-resolve@^5.9.3:
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
+ integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==
dependencies:
- ansi-colors "^4.1.1"
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
envinfo@^7.7.3:
version "7.8.1"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
-es-module-lexer@^0.7.1:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d"
- integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
escalade@^3.1.1:
version "3.1.1"
@@ -1562,12 +1602,13 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
- integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
- eslint-visitor-keys "^1.1.0"
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
@@ -1576,75 +1617,65 @@ eslint-utils@^3.0.0:
dependencies:
eslint-visitor-keys "^2.0.0"
-eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
- integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint@^7.32.0:
- version "7.32.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
- integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.16.0:
+ version "8.16.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.16.0.tgz#6d936e2d524599f2a86c708483b4c372c5d3bbae"
+ integrity sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==
dependencies:
- "@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.3"
- "@humanwhocodes/config-array" "^0.5.0"
+ "@eslint/eslintrc" "^1.3.0"
+ "@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
- debug "^4.0.1"
+ debug "^4.3.2"
doctrine "^3.0.0"
- enquirer "^2.3.5"
escape-string-regexp "^4.0.0"
- eslint-scope "^5.1.1"
- eslint-utils "^2.1.0"
- eslint-visitor-keys "^2.0.0"
- espree "^7.3.1"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.2"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
- glob-parent "^5.1.2"
- globals "^13.6.0"
- ignore "^4.0.6"
+ glob-parent "^6.0.1"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
- progress "^2.0.0"
- regexpp "^3.1.0"
- semver "^7.2.1"
- strip-ansi "^6.0.0"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
- table "^6.0.9"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^7.3.0, espree@^7.3.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
- integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
dependencies:
- acorn "^7.4.0"
- acorn-jsx "^5.3.1"
- eslint-visitor-keys "^1.3.0"
-
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
esquery@^1.4.0:
version "1.4.0"
@@ -1700,10 +1731,10 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.1.1:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
- integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -1819,6 +1850,13 @@ glob-parent@^5.1.2:
dependencies:
is-glob "^4.0.1"
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -1841,23 +1879,23 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^13.6.0, globals@^13.9.0:
- version "13.11.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7"
- integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
dependencies:
type-fest "^0.20.2"
-globby@^11.0.3:
- version "11.0.4"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
- integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
slash "^3.0.0"
graceful-fs@^4.1.2, graceful-fs@^4.2.4:
@@ -1865,6 +1903,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.4:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -1892,15 +1935,10 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.4:
- version "5.1.8"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
- integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
@@ -1988,6 +2026,13 @@ is-glob@^4.0.0, is-glob@^4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -2029,13 +2074,12 @@ js-tokens@^4.0.0:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
+ argparse "^2.0.1"
jsesc@^2.5.1:
version "2.5.2"
@@ -2047,21 +2091,16 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -2099,11 +2138,6 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
-lodash.clonedeep@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -2114,11 +2148,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.truncate@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
- integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
-
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -2131,7 +2160,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.3.0:
+merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -2168,6 +2197,13 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
minimist@>=1.2.6, minimist@^1.2.5:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
@@ -2321,11 +2357,6 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
punycode@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -2374,7 +2405,7 @@ regenerator-transform@^0.14.2:
dependencies:
"@babel/runtime" "^7.8.4"
-regexpp@^3.1.0:
+regexpp@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
@@ -2408,11 +2439,6 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
resolve-cwd@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
@@ -2491,13 +2517,20 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.2.1, semver@^7.3.4, semver@^7.3.5:
+semver@^7.3.4:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
lru-cache "^6.0.0"
+semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
serialize-javascript@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
@@ -2534,19 +2567,10 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
- integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
-source-map-support@~0.5.19:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -2561,16 +2585,6 @@ source-map@^0.6.0, source-map@^0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@~0.7.2:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
@@ -2587,6 +2601,13 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
@@ -2618,18 +2639,6 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
-table@^6.0.9:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
- integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
- dependencies:
- ajv "^8.0.1"
- lodash.clonedeep "^4.5.0"
- lodash.truncate "^4.4.2"
- slice-ansi "^4.0.0"
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
-
tapable@^2.1.1, tapable@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
@@ -2647,14 +2656,15 @@ terser-webpack-plugin@^5.1.3:
source-map "^0.6.1"
terser "^5.7.0"
-terser@^5.7.0, terser@^5.7.2:
- version "5.7.2"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.2.tgz#d4d95ed4f8bf735cb933e802f2a1829abf545e3f"
- integrity sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==
+terser@^5.14.2, terser@^5.7.0:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
commander "^2.20.0"
- source-map "~0.7.2"
- source-map-support "~0.5.19"
+ source-map-support "~0.5.20"
text-table@^0.2.0:
version "0.2.0"
@@ -2742,36 +2752,35 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
+v8-compile-cache@^2.0.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-watchpack@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce"
- integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-webpack-cli@^4.8.0:
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1"
- integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==
+webpack-cli@^4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
+ integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.0.4"
- "@webpack-cli/info" "^1.3.0"
- "@webpack-cli/serve" "^1.5.2"
- colorette "^1.2.1"
+ "@webpack-cli/configtest" "^1.1.1"
+ "@webpack-cli/info" "^1.4.1"
+ "@webpack-cli/serve" "^1.6.1"
+ colorette "^2.0.14"
commander "^7.0.0"
execa "^5.0.0"
fastest-levenshtein "^1.0.12"
import-local "^3.0.2"
interpret "^2.2.0"
rechoir "^0.7.0"
- v8-compile-cache "^2.2.0"
webpack-merge "^5.7.3"
webpack-merge@^5.7.3:
@@ -2782,18 +2791,18 @@ webpack-merge@^5.7.3:
clone-deep "^4.0.1"
wildcard "^2.0.0"
-webpack-sources@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d"
- integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-webpack@^5.51.1:
- version "5.51.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.51.1.tgz#41bebf38dccab9a89487b16dbe95c22e147aac57"
- integrity sha512-xsn3lwqEKoFvqn4JQggPSRxE4dhsRcysWTqYABAZlmavcoTmwlOb9b1N36Inbt/eIispSkuHa80/FJkDTPos1A==
+webpack@^5.72.1:
+ version "5.72.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13"
+ integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==
dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.50"
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
"@webassemblyjs/ast" "1.11.1"
"@webassemblyjs/wasm-edit" "1.11.1"
"@webassemblyjs/wasm-parser" "1.11.1"
@@ -2801,21 +2810,21 @@ webpack@^5.51.1:
acorn-import-assertions "^1.7.6"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.8.0"
- es-module-lexer "^0.7.1"
+ enhanced-resolve "^5.9.3"
+ es-module-lexer "^0.9.0"
eslint-scope "5.1.1"
events "^3.2.0"
glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.4"
- json-parse-better-errors "^1.0.2"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
loader-runner "^4.2.0"
mime-types "^2.1.27"
neo-async "^2.6.2"
schema-utils "^3.1.0"
tapable "^2.1.1"
terser-webpack-plugin "^5.1.3"
- watchpack "^2.2.0"
- webpack-sources "^3.2.0"
+ watchpack "^2.3.1"
+ webpack-sources "^3.2.3"
which@^2.0.1:
version "2.0.2"
diff --git a/src/Components/WebAssembly/Authentication.Msal/src/MsalWebAssemblyServiceCollectionExtensions.cs b/src/Components/WebAssembly/Authentication.Msal/src/MsalWebAssemblyServiceCollectionExtensions.cs
index 65b449be2b..f6693c0a6c 100644
--- a/src/Components/WebAssembly/Authentication.Msal/src/MsalWebAssemblyServiceCollectionExtensions.cs
+++ b/src/Components/WebAssembly/Authentication.Msal/src/MsalWebAssemblyServiceCollectionExtensions.cs
@@ -64,7 +64,7 @@ public static class MsalWebAssemblyServiceCollectionExtensions
}
}
-internal class MsalRemoteAuthenticationBuilder<TRemoteAuthenticationState, TRemoteUserAccount> : IRemoteAuthenticationBuilder<TRemoteAuthenticationState, TRemoteUserAccount>
+internal sealed class MsalRemoteAuthenticationBuilder<TRemoteAuthenticationState, TRemoteUserAccount> : IRemoteAuthenticationBuilder<TRemoteAuthenticationState, TRemoteUserAccount>
where TRemoteAuthenticationState : RemoteAuthenticationState, new()
where TRemoteUserAccount : RemoteUserAccount
{
diff --git a/src/Components/WebAssembly/Authentication.Msal/src/PublicAPI.Shipped.txt b/src/Components/WebAssembly/Authentication.Msal/src/PublicAPI.Shipped.txt
index 29d31abb55..d11583c28d 100644
--- a/src/Components/WebAssembly/Authentication.Msal/src/PublicAPI.Shipped.txt
+++ b/src/Components/WebAssembly/Authentication.Msal/src/PublicAPI.Shipped.txt
@@ -21,9 +21,9 @@ Microsoft.Authentication.WebAssembly.Msal.MsalAuthenticationOptions.PostLogoutRe
Microsoft.Authentication.WebAssembly.Msal.MsalAuthenticationOptions.PostLogoutRedirectUri.set -> void
Microsoft.Authentication.WebAssembly.Msal.MsalAuthenticationOptions.RedirectUri.get -> string?
Microsoft.Authentication.WebAssembly.Msal.MsalAuthenticationOptions.RedirectUri.set -> void
-~static Microsoft.Extensions.DependencyInjection.MsalWebAssemblyServiceCollectionExtensions.AddMsalAuthentication(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<Microsoft.Authentication.WebAssembly.Msal.Models.MsalProviderOptions!>!>! configure) -> Microsoft.Extensions.DependencyInjection.IRemoteAuthenticationBuilder<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationState!, Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteUserAccount!>!
-~static Microsoft.Extensions.DependencyInjection.MsalWebAssemblyServiceCollectionExtensions.AddMsalAuthentication<TRemoteAuthenticationState, TAccount>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<Microsoft.Authentication.WebAssembly.Msal.Models.MsalProviderOptions!>!>! configure) -> Microsoft.Extensions.DependencyInjection.IRemoteAuthenticationBuilder<TRemoteAuthenticationState!, TAccount!>!
-~static Microsoft.Extensions.DependencyInjection.MsalWebAssemblyServiceCollectionExtensions.AddMsalAuthentication<TRemoteAuthenticationState>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<Microsoft.Authentication.WebAssembly.Msal.Models.MsalProviderOptions!>!>! configure) -> Microsoft.Extensions.DependencyInjection.IRemoteAuthenticationBuilder<TRemoteAuthenticationState!, Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteUserAccount!>!
+static Microsoft.Extensions.DependencyInjection.MsalWebAssemblyServiceCollectionExtensions.AddMsalAuthentication(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<Microsoft.Authentication.WebAssembly.Msal.Models.MsalProviderOptions!>!>! configure) -> Microsoft.Extensions.DependencyInjection.IRemoteAuthenticationBuilder<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationState!, Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteUserAccount!>!
+static Microsoft.Extensions.DependencyInjection.MsalWebAssemblyServiceCollectionExtensions.AddMsalAuthentication<TRemoteAuthenticationState, TAccount>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<Microsoft.Authentication.WebAssembly.Msal.Models.MsalProviderOptions!>!>! configure) -> Microsoft.Extensions.DependencyInjection.IRemoteAuthenticationBuilder<TRemoteAuthenticationState!, TAccount!>!
+static Microsoft.Extensions.DependencyInjection.MsalWebAssemblyServiceCollectionExtensions.AddMsalAuthentication<TRemoteAuthenticationState>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<Microsoft.Authentication.WebAssembly.Msal.Models.MsalProviderOptions!>!>! configure) -> Microsoft.Extensions.DependencyInjection.IRemoteAuthenticationBuilder<TRemoteAuthenticationState!, Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteUserAccount!>!
Microsoft.Authentication.WebAssembly.Msal.Models.MsalCacheOptions
Microsoft.Authentication.WebAssembly.Msal.Models.MsalCacheOptions.MsalCacheOptions() -> void
Microsoft.Authentication.WebAssembly.Msal.Models.MsalCacheOptions.StoreAuthStateInCookie.get -> bool
diff --git a/src/Components/WebAssembly/DevServer/src/Program.cs b/src/Components/WebAssembly/DevServer/src/Program.cs
index ea2049f0c6..0a52b2bfb1 100644
--- a/src/Components/WebAssembly/DevServer/src/Program.cs
+++ b/src/Components/WebAssembly/DevServer/src/Program.cs
@@ -7,7 +7,7 @@ using DevServerProgram = Microsoft.AspNetCore.Components.WebAssembly.DevServer.S
namespace Microsoft.AspNetCore.Components.WebAssembly.DevServer;
-internal class Program
+internal sealed class Program
{
static int Main(string[] args)
{
diff --git a/src/Components/WebAssembly/DevServer/src/Server/Startup.cs b/src/Components/WebAssembly/DevServer/src/Server/Startup.cs
index d9be28431d..7ce4af4f5a 100644
--- a/src/Components/WebAssembly/DevServer/src/Server/Startup.cs
+++ b/src/Components/WebAssembly/DevServer/src/Server/Startup.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Components.WebAssembly.DevServer.Server;
-internal class Startup
+internal sealed class Startup
{
public Startup(IConfiguration configuration)
{
diff --git a/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSObjectReference.cs b/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSObjectReference.cs
index 2afbbabe1d..1535be93b9 100644
--- a/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSObjectReference.cs
+++ b/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSObjectReference.cs
@@ -5,7 +5,7 @@ using Microsoft.JSInterop.Implementation;
namespace Microsoft.JSInterop.WebAssembly;
-internal class WebAssemblyJSObjectReference : JSInProcessObjectReference, IJSUnmarshalledObjectReference
+internal sealed class WebAssemblyJSObjectReference : JSInProcessObjectReference, IJSUnmarshalledObjectReference
{
private readonly WebAssemblyJSRuntime _jsRuntime;
@@ -15,6 +15,8 @@ internal class WebAssemblyJSObjectReference : JSInProcessObjectReference, IJSUnm
_jsRuntime = jsRuntime;
}
+#pragma warning disable CS0612 // Type or member is obsolete
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<TResult>(string identifier)
{
ThrowIfDisposed();
@@ -22,6 +24,7 @@ internal class WebAssemblyJSObjectReference : JSInProcessObjectReference, IJSUnm
return _jsRuntime.InvokeUnmarshalled<object?, object?, object?, TResult>(identifier, null, null, null, Id);
}
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<T0, TResult>(string identifier, T0 arg0)
{
ThrowIfDisposed();
@@ -29,6 +32,7 @@ internal class WebAssemblyJSObjectReference : JSInProcessObjectReference, IJSUnm
return _jsRuntime.InvokeUnmarshalled<T0, object?, object?, TResult>(identifier, arg0, null, null, Id);
}
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<T0, T1, TResult>(string identifier, T0 arg0, T1 arg1)
{
ThrowIfDisposed();
@@ -36,10 +40,12 @@ internal class WebAssemblyJSObjectReference : JSInProcessObjectReference, IJSUnm
return _jsRuntime.InvokeUnmarshalled<T0, T1, object?, TResult>(identifier, arg0, arg1, null, Id);
}
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<T0, T1, T2, TResult>(string identifier, T0 arg0, T1 arg1, T2 arg2)
{
ThrowIfDisposed();
return _jsRuntime.InvokeUnmarshalled<T0, T1, T2, TResult>(identifier, arg0, arg1, arg2, Id);
}
+#pragma warning restore CS0612 // Type or member is obsolete
}
diff --git a/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSRuntime.cs b/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSRuntime.cs
index 5dba3de28f..e65fb3e9c2 100644
--- a/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSRuntime.cs
+++ b/src/Components/WebAssembly/JSInterop/src/WebAssemblyJSRuntime.cs
@@ -63,16 +63,21 @@ public abstract class WebAssemblyJSRuntime : JSInProcessRuntime, IJSUnmarshalled
var resultJsonOrErrorMessage = dispatchResult.Success
? dispatchResult.ResultJson!
: dispatchResult.Exception!.ToString();
+#pragma warning disable CS0618 // Type or member is obsolete
InvokeUnmarshalled<string?, bool, string, object>("Blazor._internal.endInvokeDotNetFromJS",
callInfo.CallId, dispatchResult.Success, resultJsonOrErrorMessage);
+#pragma warning restore CS0618 // Type or member is obsolete
}
/// <inheritdoc />
protected override void SendByteArray(int id, byte[] data)
{
+#pragma warning disable CS0618 // Type or member is obsolete
InvokeUnmarshalled<int, byte[], object>("Blazor._internal.receiveByteArray", id, data);
+#pragma warning restore CS0618 // Type or member is obsolete
}
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
internal TResult InvokeUnmarshalled<T0, T1, T2, TResult>(string identifier, T0 arg0, T1 arg1, T2 arg2, long targetInstanceId)
{
var resultType = JSCallResultTypeHelper.FromGeneric<TResult>();
@@ -122,18 +127,22 @@ public abstract class WebAssemblyJSRuntime : JSInProcessRuntime, IJSUnmarshalled
}
/// <inheritdoc />
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<TResult>(string identifier)
=> InvokeUnmarshalled<object?, object?, object?, TResult>(identifier, null, null, null, 0);
/// <inheritdoc />
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<T0, TResult>(string identifier, T0 arg0)
=> InvokeUnmarshalled<T0, object?, object?, TResult>(identifier, arg0, null, null, 0);
/// <inheritdoc />
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<T0, T1, TResult>(string identifier, T0 arg0, T1 arg1)
=> InvokeUnmarshalled<T0, T1, object?, TResult>(identifier, arg0, arg1, null, 0);
/// <inheritdoc />
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
public TResult InvokeUnmarshalled<T0, T1, T2, TResult>(string identifier, T0 arg0, T1 arg1, T2 arg2)
=> InvokeUnmarshalled<T0, T1, T2, TResult>(identifier, arg0, arg1, arg2, 0);
}
diff --git a/src/Components/WebAssembly/Server/src/ContentEncodingNegotiator.cs b/src/Components/WebAssembly/Server/src/ContentEncodingNegotiator.cs
index f73bb9507e..06c0d08a32 100644
--- a/src/Components/WebAssembly/Server/src/ContentEncodingNegotiator.cs
+++ b/src/Components/WebAssembly/Server/src/ContentEncodingNegotiator.cs
@@ -9,7 +9,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Components.WebAssembly.Server;
-internal class ContentEncodingNegotiator
+internal sealed class ContentEncodingNegotiator
{
// List of encodings by preference order with their associated extension so that we can easily handle "*".
private static readonly StringSegment[] _preferredEncodings =
diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs
index af3d01e28f..f36f79e90c 100644
--- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs
+++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs
@@ -206,7 +206,7 @@ public class TargetPickerUi
return JsonSerializer.Deserialize<BrowserTab[]>(jsonResponse, JsonOptions)!;
}
- record BrowserTab
+ private sealed record BrowserTab
(
string Id,
string Type,
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/.npmrc b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/AuthenticationService.ts b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/AuthenticationService.ts
index 67b9bf6b6f..f41563fda6 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/AuthenticationService.ts
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/AuthenticationService.ts
@@ -35,15 +35,15 @@ export interface AccessToken {
}
export enum AccessTokenResultStatus {
- Success = 'success',
- RequiresRedirect = 'requiresRedirect'
+ Success = 'Success',
+ RequiresRedirect = 'RequiresRedirect'
}
export enum AuthenticationResultStatus {
- Redirect = 'redirect',
- Success = 'success',
- Failure = 'failure',
- OperationCompleted = 'operationCompleted'
+ Redirect = 'Redirect',
+ Success = 'Success',
+ Failure = 'Failure',
+ OperationCompleted = 'OperationCompleted'
};
export interface AuthenticationResult {
@@ -52,28 +52,82 @@ export interface AuthenticationResult {
message?: string;
}
+export interface AuthenticationContext {
+ state?: unknown;
+ interactiveRequest: InteractiveAuthenticationRequest;
+}
+
+export interface InteractiveAuthenticationRequest {
+ scopes?: string[];
+ additionalRequestParameters?: { [key: string]: any };
+};
+
export interface AuthorizeService {
getUser(): Promise<unknown>;
getAccessToken(request?: AccessTokenRequestOptions): Promise<AccessTokenResult>;
- signIn(state: unknown): Promise<AuthenticationResult>;
+ signIn(context: AuthenticationContext): Promise<AuthenticationResult>;
completeSignIn(state: unknown): Promise<AuthenticationResult>;
- signOut(state: unknown): Promise<AuthenticationResult>;
+ signOut(context: AuthenticationContext): Promise<AuthenticationResult>;
completeSignOut(url: string): Promise<AuthenticationResult>;
}
+interface JavaScriptLoggingOptions {
+ debugEnabled: boolean;
+ traceEnabled: boolean;
+}
+
+export class ManagedLogger {
+ public debug: boolean;
+ public trace: boolean;
+ public constructor(options: JavaScriptLoggingOptions) {
+ this.debug = options.debugEnabled;
+ this.trace = options.traceEnabled;
+ }
+
+ log(level: LogLevel, message: string): void {
+ if ((level == LogLevel.Trace && this.trace) ||
+ (level == LogLevel.Debug && this.debug)) {
+ const levelString = level == LogLevel.Trace ? 'trce' : 'dbug';
+ console.debug(
+// Logs in the following format to keep consistency with the way ASP.NET Core logs to the console while avoiding the
+// additional overhead of passing the logger as a JSObjectReference
+// dbug: Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationService[0]
+// <<message>>
+// trce: Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationService[0]
+// <<message>>
+`${levelString}: Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationService[0]
+ ${message}`);
+ }
+ }
+}
+
+// These are the values for the .NET logger LogLevel.
+// We only use debug and trace
+export enum LogLevel {
+ Trace = 0,
+ Debug = 1
+}
+
class OidcAuthorizeService implements AuthorizeService {
private _userManager: UserManager;
+ private _logger: ManagedLogger | undefined;
private _intialSilentSignIn: Promise<void> | undefined;
- constructor(userManager: UserManager) {
+ constructor(userManager: UserManager, logger?: ManagedLogger) {
this._userManager = userManager;
+ this._logger = logger;
}
async trySilentSignIn() {
if (!this._intialSilentSignIn) {
this._intialSilentSignIn = (async () => {
try {
+ this.debug('Beginning initial silent sign in.');
await this._userManager.signinSilent();
+ this.debug('Initial silent sign in succeeded.');
} catch (e) {
+ if (e instanceof Error) {
+ this.debug(`Initial silent sign in failed '${e.message}'`);
+ }
// It is ok to swallow the exception here.
// The user might not be logged in and in that case it
// is expected for signinSilent to fail and throw
@@ -88,7 +142,7 @@ class OidcAuthorizeService implements AuthorizeService {
if (window.parent === window && !window.opener && !window.frameElement && this._userManager.settings.redirect_uri &&
!location.href.startsWith(this._userManager.settings.redirect_uri)) {
// If we are not inside a hidden iframe, try authenticating silently.
- await AuthenticationService.instance.trySilentSignIn();
+ await this.trySilentSignIn();
}
const user = await this._userManager.getUser();
@@ -96,8 +150,10 @@ class OidcAuthorizeService implements AuthorizeService {
}
async getAccessToken(request?: AccessTokenRequestOptions): Promise<AccessTokenResult> {
+ this.trace('getAccessToken', request);
const user = await this._userManager.getUser();
if (hasValidAccessToken(user) && hasAllScopes(request, user.scopes)) {
+ this.debug(`Valid access token present expiring at '${getExpiration(user.expires_in).toISOString()}'`)
return {
status: AccessTokenResultStatus.Success,
token: {
@@ -111,9 +167,13 @@ class OidcAuthorizeService implements AuthorizeService {
const parameters = request && request.scopes ?
{ scope: request.scopes.join(' ') } : undefined;
+ this.debug(`Provisioning a token silently for scopes '${parameters?.scope}'`)
+ this.trace('userManager.signinSilent', parameters);
const newUser = await this._userManager.signinSilent(parameters);
- return {
+ this.debug(`Provisioned an access token expiring at '${getExpiration(newUser.expires_in).toISOString()}'`)
+
+ const result = {
status: AccessTokenResultStatus.Success,
token: {
grantedScopes: newUser.scopes,
@@ -122,7 +182,14 @@ class OidcAuthorizeService implements AuthorizeService {
}
};
+ this.trace('getAccessToken-result', result);
+ return result;
+
} catch (e) {
+ if (e instanceof Error) {
+ this.debug(`Failed to provision a token silently '${e.message}'`)
+ }
+
return {
status: AccessTokenResultStatus.RequiresRedirect
};
@@ -153,23 +220,41 @@ class OidcAuthorizeService implements AuthorizeService {
}
}
- async signIn(state: unknown) {
- try {
- await this._userManager.clearStaleState();
- await this._userManager.signinSilent(this.createArguments());
- return this.success(state);
- } catch (silentError) {
+ async signIn(context: AuthenticationContext) {
+ this.trace('signIn', context);
+ if (!context.interactiveRequest) {
try {
+ this.debug('Silent sign in starting');
await this._userManager.clearStaleState();
- await this._userManager.signinRedirect(this.createArguments(state));
- return this.redirect();
- } catch (redirectError) {
- return this.error(this.getExceptionMessage(redirectError));
+ await this._userManager.signinSilent(this.createArguments(undefined, context.interactiveRequest));
+ this.debug('Silent sign in succeeded');
+ return this.success(context.state);
+ } catch (silentError) {
+ if (silentError instanceof Error) {
+ this.debug(`Silent sign in failed, redirecting to the identity provider '${silentError.message}'.`);
+ }
+ return await this.signInInteractive(context);
}
+ } else {
+ this.debug('Interactive sign in starting.');
+ return this.signInInteractive(context);
+ }
+ }
+
+ async signInInteractive(context: AuthenticationContext) {
+ try {
+ await this._userManager.clearStaleState();
+ await this._userManager.signinRedirect(this.createArguments(context.state, context.interactiveRequest));
+ return this.redirect();
+ } catch (redirectError) {
+ const message = this.getExceptionMessage(redirectError);
+ this.debug(`Redirect sign in failed '${message}'.`);
+ return this.error(message);
}
}
async completeSignIn(url: string) {
+ this.trace('completeSignIn', url);
const requiresLogin = await this.loginRequired(url);
const stateExists = await this.stateExists(url);
try {
@@ -177,6 +262,7 @@ class OidcAuthorizeService implements AuthorizeService {
if (window.self !== window.top) {
return this.operationCompleted();
} else {
+ this.trace('completeSignIn-result', user);
return this.success(user && user.state);
}
} catch (error) {
@@ -188,13 +274,13 @@ class OidcAuthorizeService implements AuthorizeService {
}
}
- async signOut(state: unknown) {
+ async signOut(context: AuthenticationContext) {
try {
if (!(await this._userManager.metadataService.getEndSessionEndpoint())) {
await this._userManager.removeUser();
- return this.success(state);
+ return this.success(context.state);
}
- await this._userManager.signoutRedirect(this.createArguments(state));
+ await this._userManager.signoutRedirect(this.createArguments(context.state, context.interactiveRequest));
return this.redirect();
} catch (redirectSignOutError) {
return this.error(this.getExceptionMessage(redirectSignOutError));
@@ -251,8 +337,13 @@ class OidcAuthorizeService implements AuthorizeService {
}
}
- private createArguments(state?: unknown) {
- return { useReplaceToNavigate: true, data: state };
+ private createArguments(state: unknown, interactiveRequest: InteractiveAuthenticationRequest | undefined) {
+ return {
+ useReplaceToNavigate: true,
+ data: state,
+ scope: interactiveRequest?.scopes ? interactiveRequest.scopes.join(' ') : undefined,
+ ...interactiveRequest?.additionalRequestParameters
+ };
}
private error(message: string) {
@@ -270,6 +361,14 @@ class OidcAuthorizeService implements AuthorizeService {
private operationCompleted() {
return { status: AuthenticationResultStatus.OperationCompleted };
}
+
+ private debug(message: string) {
+ this._logger?.log(LogLevel.Debug, message);
+ }
+
+ private trace(message: string, data: any) {
+ this._logger?.log(LogLevel.Trace, `${message}: ${JSON.stringify(data)}`);
+ }
}
export class AuthenticationService {
@@ -279,12 +378,12 @@ export class AuthenticationService {
static instance: OidcAuthorizeService;
static _pendingOperations: { [key: string]: Promise<AuthenticationResult> | undefined } = {}
- public static init(settings: UserManagerSettings & AuthorizeServiceSettings) {
+ public static init(settings: UserManagerSettings & AuthorizeServiceSettings, logger: any) {
// Multiple initializations can start concurrently and we want to avoid that.
// In order to do so, we create an initialization promise and the first call to init
// tries to initialize the app and sets up a promise other calls can await on.
if (!AuthenticationService._initialized) {
- AuthenticationService._initialized = AuthenticationService.initializeCore(settings);
+ AuthenticationService._initialized = AuthenticationService.initializeCore(settings, new ManagedLogger(logger));
}
return AuthenticationService._initialized;
@@ -294,9 +393,11 @@ export class AuthenticationService {
return AuthenticationService.initializeCore();
}
- private static async initializeCore(settings?: UserManagerSettings & AuthorizeServiceSettings) {
+ private static async initializeCore(settings?: UserManagerSettings & AuthorizeServiceSettings, logger?: ManagedLogger) {
const finalSettings = settings || AuthenticationService.resolveCachedSettings();
- if (!settings && finalSettings) {
+ const cachedLoggerOptions = AuthenticationService.resolveCachedLoggerOptions();
+ const finalLogger = logger || (cachedLoggerOptions && new ManagedLogger(cachedLoggerOptions))
+ if (!settings && finalSettings && !logger && finalLogger) {
const userManager = AuthenticationService.createUserManagerCore(finalSettings);
if (window.parent !== window && !window.opener && (window.frameElement && userManager.settings.redirect_uri &&
@@ -304,7 +405,7 @@ export class AuthenticationService {
// If we are inside a hidden iframe, try completing the sign in early.
// This prevents loading the blazor app inside a hidden iframe, which speeds up the authentication operations
// and avoids wasting resources (CPU and memory from bootstrapping the Blazor app)
- AuthenticationService.instance = new OidcAuthorizeService(userManager);
+ AuthenticationService.instance = new OidcAuthorizeService(userManager, finalLogger);
// This makes sure that if the blazor app has time to load inside the hidden iframe,
// it is not able to perform another auth operation until this operation has completed.
@@ -313,9 +414,12 @@ export class AuthenticationService {
return;
})();
}
- } else if (settings) {
+ } else if (settings && logger) {
const userManager = await AuthenticationService.createUserManager(settings);
- AuthenticationService.instance = new OidcAuthorizeService(userManager);
+ AuthenticationService.instance = new OidcAuthorizeService(userManager, logger);
+ window.sessionStorage.setItem(
+ `${AuthenticationService._infrastructureKey}.CachedJSLoggingOptions`,
+ JSON.stringify({debugEnabled: logger.debug, traceEnabled: logger.trace}));
} else {
// HandleCallback gets called unconditionally, so we do nothing for normal paths.
// Cached settings are only used on handling the redirect_uri path and if the settings are not there
@@ -328,6 +432,11 @@ export class AuthenticationService {
return cachedSettings ? JSON.parse(cachedSettings) : undefined;
}
+ private static resolveCachedLoggerOptions(): JavaScriptLoggingOptions | undefined {
+ const cachedSettings = window.sessionStorage.getItem(`${AuthenticationService._infrastructureKey}.CachedJSLoggingOptions`);
+ return cachedSettings ? JSON.parse(cachedSettings) : undefined;
+ }
+
public static getUser() {
return AuthenticationService.instance.getUser();
}
@@ -336,8 +445,8 @@ export class AuthenticationService {
return AuthenticationService.instance.getAccessToken(options);
}
- public static signIn(state: unknown) {
- return AuthenticationService.instance.signIn(state);
+ public static signIn(context: AuthenticationContext) {
+ return AuthenticationService.instance.signIn(context);
}
public static async completeSignIn(url: string) {
@@ -351,8 +460,8 @@ export class AuthenticationService {
return operation;
}
- public static signOut(state: unknown) {
- return AuthenticationService.instance.signOut(state);
+ public static signOut(context: AuthenticationContext) {
+ return AuthenticationService.instance.signOut(context);
}
public static async completeSignOut(url: string) {
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/package.json b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/package.json
index c93a4112fb..3a3fc785a3 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/package.json
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/package.json
@@ -14,16 +14,16 @@
"devDependencies": {
"@babel/core": "^7.15.0",
"@babel/preset-env": "^7.15.0",
- "@typescript-eslint/eslint-plugin": "^4.29.3",
- "@typescript-eslint/parser": "^4.29.3",
- "eslint": "^7.32.0",
+ "@typescript-eslint/eslint-plugin": "^5.26.0",
+ "@typescript-eslint/parser": "^5.26.0",
+ "eslint": "^8.16.0",
"inspectpack": "^4.7.1",
"rimraf": "^3.0.2",
- "terser": "^5.7.2",
+ "terser": "^5.14.2",
"ts-loader": "^9.2.5",
"typescript": "^4.4.2",
- "webpack": "^5.51.1",
- "webpack-cli": "^4.8.0"
+ "webpack": "^5.72.1",
+ "webpack-cli": "^4.9.2"
},
"dependencies": {
"oidc-client": "^1.11.5"
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/yarn.lock b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/yarn.lock
index 5b524eaca4..40ea667657 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/yarn.lock
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Interop/yarn.lock
@@ -2,13 +2,6 @@
# yarn lockfile v1
-"@babel/code-frame@7.12.11":
- version "7.12.11"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
- integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
- dependencies:
- "@babel/highlight" "^7.10.4"
-
"@babel/code-frame@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb"
@@ -249,7 +242,7 @@
"@babel/traverse" "^7.15.0"
"@babel/types" "^7.15.0"
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5":
+"@babel/highlight@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9"
integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==
@@ -880,34 +873,74 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz#90420f9f9c6d3987f176a19a7d8e764271a2f55d"
integrity sha512-Fxt+AfXgjMoin2maPIYzFZnQjAXjAL0PHscM5pRTtatFqB+vZxAM9tLp2Optnuw3QOQC40jTNeGYFOMvyf7v9g==
-"@eslint/eslintrc@^0.4.3":
- version "0.4.3"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
- integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
dependencies:
ajv "^6.12.4"
- debug "^4.1.1"
- espree "^7.3.0"
- globals "^13.9.0"
- ignore "^4.0.6"
+ debug "^4.3.2"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.2.1"
- js-yaml "^3.13.1"
- minimatch "^3.0.4"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@humanwhocodes/config-array@^0.5.0":
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9"
- integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==
+"@humanwhocodes/config-array@^0.9.2":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
+ integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
dependencies:
- "@humanwhocodes/object-schema" "^1.2.0"
+ "@humanwhocodes/object-schema" "^1.2.1"
debug "^4.1.1"
minimatch "^3.0.4"
-"@humanwhocodes/object-schema@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf"
- integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
@@ -930,10 +963,10 @@
"@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0"
-"@types/eslint-scope@^3.7.0":
- version "3.7.1"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.1.tgz#8dc390a7b4f9dd9f1284629efce982e41612116e"
- integrity sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
dependencies:
"@types/eslint" "*"
"@types/estree" "*"
@@ -946,89 +979,110 @@
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^0.0.50":
+"@types/estree@*":
version "0.0.50"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83"
integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==
-"@types/json-schema@*", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8":
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/json-schema@*", "@types/json-schema@^7.0.8":
version "7.0.9"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
+"@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
"@types/node@*":
version "16.7.6"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.7.6.tgz#8666478db8095aa66e25b7e469f3e7b53ea2855e"
integrity sha512-VESVNFoa/ahYA62xnLBjo5ur6gPsgEE5cNRy8SrdnkZ2nwJSW0kJ4ufbFr2zuU9ALtHM8juY53VcRoTA7htXSg==
-"@typescript-eslint/eslint-plugin@^4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.29.3.tgz#95cb8029a8bd8bd9c7f4ab95074a7cb2115adefa"
- integrity sha512-tBgfA3K/3TsZY46ROGvoRxQr1wBkclbVqRQep97MjVHJzcRBURRY3sNFqLk0/Xr//BY5hM9H2p/kp+6qim85SA==
+"@typescript-eslint/eslint-plugin@^5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz#c1f98ccba9d345e38992975d3ca56ed6260643c2"
+ integrity sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==
dependencies:
- "@typescript-eslint/experimental-utils" "4.29.3"
- "@typescript-eslint/scope-manager" "4.29.3"
- debug "^4.3.1"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/type-utils" "5.26.0"
+ "@typescript-eslint/utils" "5.26.0"
+ debug "^4.3.4"
functional-red-black-tree "^1.0.1"
- regexpp "^3.1.0"
- semver "^7.3.5"
+ ignore "^5.2.0"
+ regexpp "^3.2.0"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/experimental-utils@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.29.3.tgz#52e437a689ccdef73e83c5106b34240a706f15e1"
- integrity sha512-ffIvbytTVWz+3keg+Sy94FG1QeOvmV9dP2YSdLFHw/ieLXWCa3U1TYu8IRCOpMv2/SPS8XqhM1+ou1YHsdzKrg==
+"@typescript-eslint/parser@^5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.26.0.tgz#a61b14205fe2ab7533deb4d35e604add9a4ceee2"
+ integrity sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==
dependencies:
- "@types/json-schema" "^7.0.7"
- "@typescript-eslint/scope-manager" "4.29.3"
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/typescript-estree" "4.29.3"
- eslint-scope "^5.1.1"
- eslint-utils "^3.0.0"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/typescript-estree" "5.26.0"
+ debug "^4.3.4"
-"@typescript-eslint/parser@^4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.29.3.tgz#2ac25535f34c0e98f50c0e6b28c679c2357d45f2"
- integrity sha512-jrHOV5g2u8ROghmspKoW7pN8T/qUzk0+DITun0MELptvngtMrwUJ1tv5zMI04CYVEUsSrN4jV7AKSv+I0y0EfQ==
- dependencies:
- "@typescript-eslint/scope-manager" "4.29.3"
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/typescript-estree" "4.29.3"
- debug "^4.3.1"
-
-"@typescript-eslint/scope-manager@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.29.3.tgz#497dec66f3a22e459f6e306cf14021e40ec86e19"
- integrity sha512-x+w8BLXO7iWPkG5mEy9bA1iFRnk36p/goVlYobVWHyDw69YmaH9q6eA+Fgl7kYHmFvWlebUTUfhtIg4zbbl8PA==
- dependencies:
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/visitor-keys" "4.29.3"
-
-"@typescript-eslint/types@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.29.3.tgz#d7980c49aef643d0af8954c9f14f656b7fd16017"
- integrity sha512-s1eV1lKNgoIYLAl1JUba8NhULmf+jOmmeFO1G5MN/RBCyyzg4TIOfIOICVNC06lor+Xmy4FypIIhFiJXOknhIg==
-
-"@typescript-eslint/typescript-estree@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.29.3.tgz#1bafad610015c4ded35c85a70b6222faad598b40"
- integrity sha512-45oQJA0bxna4O5TMwz55/TpgjX1YrAPOI/rb6kPgmdnemRZx/dB0rsx+Ku8jpDvqTxcE1C/qEbVHbS3h0hflag==
- dependencies:
- "@typescript-eslint/types" "4.29.3"
- "@typescript-eslint/visitor-keys" "4.29.3"
- debug "^4.3.1"
- globby "^11.0.3"
- is-glob "^4.0.1"
- semver "^7.3.5"
+"@typescript-eslint/scope-manager@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz#44209c7f649d1a120f0717e0e82da856e9871339"
+ integrity sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/visitor-keys" "5.26.0"
+
+"@typescript-eslint/type-utils@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz#937dee97702361744a3815c58991acf078230013"
+ integrity sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==
+ dependencies:
+ "@typescript-eslint/utils" "5.26.0"
+ debug "^4.3.4"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.26.0.tgz#cb204bb154d3c103d9cc4d225f311b08219469f3"
+ integrity sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==
+
+"@typescript-eslint/typescript-estree@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz#16cbceedb0011c2ed4f607255f3ee1e6e43b88c3"
+ integrity sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/visitor-keys" "5.26.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/visitor-keys@4.29.3":
- version "4.29.3"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.29.3.tgz#c691760a00bd86bf8320d2a90a93d86d322f1abf"
- integrity sha512-MGGfJvXT4asUTeVs0Q2m+sY63UsfnA+C/FDgBKV3itLBmM9H0u+URcneePtkd0at1YELmZK6HSolCqM4Fzs6yA==
+"@typescript-eslint/utils@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.26.0.tgz#896b8480eb124096e99c8b240460bb4298afcfb4"
+ integrity sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==
dependencies:
- "@typescript-eslint/types" "4.29.3"
- eslint-visitor-keys "^2.0.0"
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/typescript-estree" "5.26.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz#7195f756e367f789c0e83035297c45b417b57f57"
+ integrity sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ eslint-visitor-keys "^3.3.0"
"@webassemblyjs/ast@1.11.1":
version "1.11.1"
@@ -1151,22 +1205,22 @@
"@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.4.tgz#f03ce6311c0883a83d04569e2c03c6238316d2aa"
- integrity sha512-cs3XLy+UcxiP6bj0A6u7MLLuwdXJ1c3Dtc0RkKg+wiI1g/Ti1om8+/2hc2A2B60NbBNAbMgyBMHvyymWm/j4wQ==
+"@webpack-cli/configtest@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356"
+ integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==
-"@webpack-cli/info@^1.3.0":
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.3.0.tgz#9d78a31101a960997a4acd41ffd9b9300627fe2b"
- integrity sha512-ASiVB3t9LOKHs5DyVUcxpraBXDOKubYu/ihHhU+t1UPpxsivg6Od2E2qU4gJCekfEddzRBzHhzA/Acyw/mlK/w==
+"@webpack-cli/info@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea"
+ integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==
dependencies:
envinfo "^7.7.3"
-"@webpack-cli/serve@^1.5.2":
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec"
- integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw==
+"@webpack-cli/serve@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
+ integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -1183,20 +1237,20 @@ acorn-import-assertions@^1.7.6:
resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78"
integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA==
-acorn-jsx@^5.3.1:
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^7.4.0, acorn@^7.4.1:
+acorn@^7.4.1:
version "7.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.4.1:
- version "8.4.1"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.4.1.tgz#56c36251fc7cabc7096adc18f05afe814321a28c"
- integrity sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==
+acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
ajv-keywords@^3.5.2:
version "3.5.2"
@@ -1213,22 +1267,7 @@ ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1:
- version "8.6.2"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571"
- integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
-ansi-regex@5.0.1, ansi-regex@^5.0.0:
+ansi-regex@5.0.1, ansi-regex@^5.0.0, ansi-regex@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
@@ -1247,23 +1286,16 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies:
color-convert "^2.0.1"
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
-astral-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
- integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
babel-plugin-dynamic-import-node@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
@@ -1418,11 +1450,16 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-colorette@^1.2.1, colorette@^1.3.0:
+colorette@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.3.0.tgz#ff45d2f0edb244069d3b772adeb04fed38d0a0af"
integrity sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==
+colorette@^2.0.14:
+ version "2.0.16"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
+ integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
+
commander@^2.20.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -1472,13 +1509,20 @@ crypto-js@^4.0.0:
resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+debug@^4.1.0, debug@^4.1.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==
dependencies:
ms "2.1.2"
+debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
deep-is@^0.1.3:
version "0.1.3"
resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
@@ -1515,7 +1559,7 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0:
+enhanced-resolve@^5.0.0:
version "5.8.2"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b"
integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==
@@ -1523,22 +1567,23 @@ enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.0:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-enquirer@^2.3.5:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
+enhanced-resolve@^5.9.3:
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
+ integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==
dependencies:
- ansi-colors "^4.1.1"
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
envinfo@^7.7.3:
version "7.8.1"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
-es-module-lexer@^0.7.1:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.7.1.tgz#c2c8e0f46f2df06274cdaf0dd3f3b33e0a0b267d"
- integrity sha512-MgtWFl5No+4S3TmhDmCz2ObFGm6lEpTnzbQi+Dd+pw4mlTIZTmM2iAs5gRlmx5zS9luzobCSBSI90JM/1/JgOw==
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
escalade@^3.1.1:
version "3.1.1"
@@ -1563,12 +1608,13 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
- integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
- eslint-visitor-keys "^1.1.0"
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
eslint-utils@^3.0.0:
version "3.0.0"
@@ -1577,75 +1623,65 @@ eslint-utils@^3.0.0:
dependencies:
eslint-visitor-keys "^2.0.0"
-eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
- integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
-
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint@^7.32.0:
- version "7.32.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d"
- integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.16.0:
+ version "8.16.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.16.0.tgz#6d936e2d524599f2a86c708483b4c372c5d3bbae"
+ integrity sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==
dependencies:
- "@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.3"
- "@humanwhocodes/config-array" "^0.5.0"
+ "@eslint/eslintrc" "^1.3.0"
+ "@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
- debug "^4.0.1"
+ debug "^4.3.2"
doctrine "^3.0.0"
- enquirer "^2.3.5"
escape-string-regexp "^4.0.0"
- eslint-scope "^5.1.1"
- eslint-utils "^2.1.0"
- eslint-visitor-keys "^2.0.0"
- espree "^7.3.1"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.2"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
- glob-parent "^5.1.2"
- globals "^13.6.0"
- ignore "^4.0.6"
+ glob-parent "^6.0.1"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
- progress "^2.0.0"
- regexpp "^3.1.0"
- semver "^7.2.1"
- strip-ansi "^6.0.0"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
- table "^6.0.9"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^7.3.0, espree@^7.3.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
- integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
dependencies:
- acorn "^7.4.0"
- acorn-jsx "^5.3.1"
- eslint-visitor-keys "^1.3.0"
-
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
esquery@^1.4.0:
version "1.4.0"
@@ -1701,10 +1737,10 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.1.1:
- version "3.2.7"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1"
- integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
@@ -1820,6 +1856,13 @@ glob-parent@^5.1.2:
dependencies:
is-glob "^4.0.1"
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -1842,23 +1885,23 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^13.6.0, globals@^13.9.0:
- version "13.11.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7"
- integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
dependencies:
type-fest "^0.20.2"
-globby@^11.0.3:
- version "11.0.4"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5"
- integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
slash "^3.0.0"
graceful-fs@^4.1.2, graceful-fs@^4.2.4:
@@ -1866,6 +1909,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.4:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -1893,15 +1941,10 @@ human-signals@^2.1.0:
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.4:
- version "5.1.8"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
- integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
@@ -1989,6 +2032,13 @@ is-glob@^4.0.0, is-glob@^4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -2030,13 +2080,12 @@ js-tokens@^4.0.0:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
+ argparse "^2.0.1"
jsesc@^2.5.1:
version "2.5.2"
@@ -2048,21 +2097,16 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
-json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
@@ -2100,11 +2144,6 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
-lodash.clonedeep@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
lodash.debounce@^4.0.8:
version "4.0.8"
resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -2115,11 +2154,6 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash.truncate@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
- integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
-
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -2132,7 +2166,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.3.0:
+merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -2169,6 +2203,13 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
minimist@>=1.2.6, minimist@^1.2.5:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
@@ -2333,11 +2374,6 @@ prelude-ls@^1.2.1:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
punycode@^2.1.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
@@ -2386,7 +2422,7 @@ regenerator-transform@^0.14.2:
dependencies:
"@babel/runtime" "^7.8.4"
-regexpp@^3.1.0:
+regexpp@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
@@ -2420,11 +2456,6 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
resolve-cwd@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
@@ -2503,13 +2534,20 @@ semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-semver@^7.2.1, semver@^7.3.4, semver@^7.3.5:
+semver@^7.3.4:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
dependencies:
lru-cache "^6.0.0"
+semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
serialize-javascript@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa"
@@ -2553,19 +2591,10 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
- integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
-source-map-support@~0.5.19:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -2580,16 +2609,6 @@ source-map@^0.6.0, source-map@^0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@~0.7.2:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
-
string-width@^4.1.0, string-width@^4.2.0:
version "4.2.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
@@ -2606,6 +2625,13 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-final-newline@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
@@ -2637,18 +2663,6 @@ supports-color@^8.0.0:
dependencies:
has-flag "^4.0.0"
-table@^6.0.9:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
- integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
- dependencies:
- ajv "^8.0.1"
- lodash.clonedeep "^4.5.0"
- lodash.truncate "^4.4.2"
- slice-ansi "^4.0.0"
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
-
tapable@^2.1.1, tapable@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
@@ -2666,14 +2680,15 @@ terser-webpack-plugin@^5.1.3:
source-map "^0.6.1"
terser "^5.7.0"
-terser@^5.7.0, terser@^5.7.2:
- version "5.7.2"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.2.tgz#d4d95ed4f8bf735cb933e802f2a1829abf545e3f"
- integrity sha512-0Omye+RD4X7X69O0eql3lC4Heh/5iLj3ggxR/B5ketZLOtLiOqukUgjw3q4PDnNQbsrkKr3UMypqStQG3XKRvw==
+terser@^5.14.2, terser@^5.7.0:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
commander "^2.20.0"
- source-map "~0.7.2"
- source-map-support "~0.5.19"
+ source-map-support "~0.5.20"
text-table@^0.2.0:
version "0.2.0"
@@ -2761,36 +2776,35 @@ uri-js@^4.2.2:
dependencies:
punycode "^2.1.0"
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
+v8-compile-cache@^2.0.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
-watchpack@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.2.0.tgz#47d78f5415fe550ecd740f99fe2882323a58b1ce"
- integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
-webpack-cli@^4.8.0:
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1"
- integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw==
+webpack-cli@^4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
+ integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.0.4"
- "@webpack-cli/info" "^1.3.0"
- "@webpack-cli/serve" "^1.5.2"
- colorette "^1.2.1"
+ "@webpack-cli/configtest" "^1.1.1"
+ "@webpack-cli/info" "^1.4.1"
+ "@webpack-cli/serve" "^1.6.1"
+ colorette "^2.0.14"
commander "^7.0.0"
execa "^5.0.0"
fastest-levenshtein "^1.0.12"
import-local "^3.0.2"
interpret "^2.2.0"
rechoir "^0.7.0"
- v8-compile-cache "^2.2.0"
webpack-merge "^5.7.3"
webpack-merge@^5.7.3:
@@ -2801,18 +2815,18 @@ webpack-merge@^5.7.3:
clone-deep "^4.0.1"
wildcard "^2.0.0"
-webpack-sources@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.0.tgz#b16973bcf844ebcdb3afde32eda1c04d0b90f89d"
- integrity sha512-fahN08Et7P9trej8xz/Z7eRu8ltyiygEo/hnRi9KqBUs80KeDcnf96ZJo++ewWd84fEf3xSX9bp4ZS9hbw0OBw==
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
-webpack@^5.51.1:
- version "5.51.1"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.51.1.tgz#41bebf38dccab9a89487b16dbe95c22e147aac57"
- integrity sha512-xsn3lwqEKoFvqn4JQggPSRxE4dhsRcysWTqYABAZlmavcoTmwlOb9b1N36Inbt/eIispSkuHa80/FJkDTPos1A==
+webpack@^5.72.1:
+ version "5.72.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13"
+ integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==
dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.50"
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
"@webassemblyjs/ast" "1.11.1"
"@webassemblyjs/wasm-edit" "1.11.1"
"@webassemblyjs/wasm-parser" "1.11.1"
@@ -2820,21 +2834,21 @@ webpack@^5.51.1:
acorn-import-assertions "^1.7.6"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.8.0"
- es-module-lexer "^0.7.1"
+ enhanced-resolve "^5.9.3"
+ es-module-lexer "^0.9.0"
eslint-scope "5.1.1"
events "^3.2.0"
glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.4"
- json-parse-better-errors "^1.0.2"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
loader-runner "^4.2.0"
mime-types "^2.1.27"
neo-async "^2.6.2"
schema-utils "^3.1.0"
tapable "^2.1.1"
terser-webpack-plugin "^5.1.3"
- watchpack "^2.2.0"
- webpack-sources "^3.2.0"
+ watchpack "^2.3.1"
+ webpack-sources "^3.2.3"
which@^2.0.1:
version "2.0.2"
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.WarningSuppressions.xml b/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.WarningSuppressions.xml
index 358d7fae2d..76c8bc9d8c 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.WarningSuppressions.xml
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.WarningSuppressions.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<linker>
<assembly fullname="Microsoft.AspNetCore.Components.WebAssembly.Authentication, Version=42.42.42.42, Culture=neutral, PublicKeyToken=adb9793829ddae60">
<attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
@@ -7,11 +7,5 @@
<property name="Scope">member</property>
<property name="Target">F:Microsoft.Extensions.DependencyInjection.WebAssemblyAuthenticationServiceCollectionExtensions.&lt;&gt;c__1`1.&lt;&gt;9__1_0</property>
</attribute>
- <attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
- <argument>ILLink</argument>
- <argument>IL2091</argument>
- <property name="Scope">member</property>
- <property name="Target">M:Microsoft.Extensions.DependencyInjection.WebAssemblyAuthenticationServiceCollectionExtensions.&lt;&gt;c__1`1.&lt;AddAuthenticationStateProvider&gt;b__1_0(System.IServiceProvider)</property>
- </attribute>
</assembly>
-</linker>
+</linker> \ No newline at end of file
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.csproj b/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.csproj
index 6d176db053..345236f694 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.csproj
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Microsoft.AspNetCore.Components.WebAssembly.Authentication.csproj
@@ -9,6 +9,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IsTrimmable>true</IsTrimmable>
<Nullable>disable</Nullable>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
@@ -76,14 +77,7 @@
<_InteropBuildOutput Include="$(YarnWorkingDir)dist\$(Configuration)\**" Exclude="$(YarnWorkingDir)dist\.gitignore" />
</ItemGroup>
- <DefineStaticWebAssets Condition="'@(_InteropBuildOutput)' != ''"
- SourceType="Computed"
- SourceId="$(PackageId)"
- ContentRoot="$(YarnWorkingDir)dist\$(Configuration)\"
- BasePath="_content/$(PackageId)"
- CandidateAssets="@(_InteropBuildOutput)"
- RelativePathFilter="**.js"
- >
+ <DefineStaticWebAssets Condition="'@(_InteropBuildOutput)' != ''" SourceType="Computed" SourceId="$(PackageId)" ContentRoot="$(YarnWorkingDir)dist\$(Configuration)\" BasePath="_content/$(PackageId)" CandidateAssets="@(_InteropBuildOutput)" RelativePathFilter="**.js">
<Output TaskParameter="Assets" ItemName="StaticWebAsset" />
</DefineStaticWebAssets>
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractionType.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractionType.cs
new file mode 100644
index 0000000000..6a2a3170a9
--- /dev/null
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractionType.cs
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Json.Serialization;
+
+namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
+
+/// <summary>
+/// The type of authentication request.
+/// </summary>
+[JsonConverter(typeof(JsonStringEnumConverter))]
+public enum InteractionType
+{
+ /// <summary>
+ /// Authenticating or reauthenticating the user and provisioning the default access token.
+ /// </summary>
+ SignIn,
+
+ /// <summary>
+ /// Provisioning a token interactively because silent provisioning failed, either because the end user
+ /// has not consented or because the existing credentials have expired.
+ /// </summary>
+ GetToken,
+
+ /// <summary>
+ /// Logging the user out.
+ /// </summary>
+ SignOut,
+}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractiveRequestOptions.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractiveRequestOptions.cs
new file mode 100644
index 0000000000..870b42e3db
--- /dev/null
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/InteractiveRequestOptions.cs
@@ -0,0 +1,132 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
+
+namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
+
+/// <summary>
+/// Represents the request to the identity provider for logging in or provisioning a token.
+/// </summary>
+[JsonConverter(typeof(Converter))]
+public sealed class InteractiveRequestOptions
+{
+ /// <summary>
+ /// Gets the request type.
+ /// </summary>
+ public required InteractionType Interaction { get; init; }
+
+ /// <summary>
+ /// Gets the redirect URL this request must return to upon successful completion.
+ /// </summary>
+ public required string ReturnUrl { get; init; }
+
+ /// <summary>
+ /// Gets the scopes this request must use in the operation.
+ /// </summary>
+ public IEnumerable<string> Scopes { get; init; }
+
+ private Dictionary<string, object> AdditionalRequestParameters { get; set; }
+
+ /// <summary>
+ /// Tries to add an additional parameter to pass in to the underlying provider.
+ /// </summary>
+ /// <remarks>
+ /// The underlying provider is free to apply these parameters as it sees fit or ignore them completely. In the default
+ /// implementations the parameters will be JSON serialized using System.Text.Json and passed as a parameter to the
+ /// underlying JavaScript implementation that handles the operation details.
+ /// </remarks>
+ public bool TryAddAdditionalParameter<[DynamicallyAccessedMembers(JsonSerialized)] TValue>(string name, TValue value)
+ {
+ ArgumentNullException.ThrowIfNull(name, nameof(name));
+ AdditionalRequestParameters ??= new();
+ return AdditionalRequestParameters.TryAdd(name, value);
+ }
+
+ /// <summary>
+ /// Tries to remove an existing additional parameter.
+ /// </summary>
+ public bool TryRemoveAdditionalParameter(string name)
+ {
+ ArgumentNullException.ThrowIfNull(name, nameof(name));
+ return AdditionalRequestParameters != null && AdditionalRequestParameters.Remove(name);
+ }
+
+ /// <summary>
+ /// Tries to retrieve an existing additional parameter.
+ /// </summary>
+ public bool TryGetAdditionalParameter<[DynamicallyAccessedMembers(JsonSerialized)] TValue>(string name, out TValue value)
+ {
+ ArgumentNullException.ThrowIfNull(name);
+
+ value = default;
+ if (AdditionalRequestParameters == null || !AdditionalRequestParameters.TryGetValue(name, out var rawValue))
+ {
+ return false;
+ }
+ if (rawValue is JsonElement json)
+ {
+ value = Deserialize(json);
+ AdditionalRequestParameters[name] = value;
+ return true;
+ }
+ else
+ {
+ value = (TValue)rawValue;
+ return true;
+ }
+
+ [UnconditionalSuppressMessage(
+ "Trimming",
+ "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code",
+ Justification = "The types this method deserializes are anotated with 'DynamicallyAccessedMembers' to prevent them from being linked out as part of 'TryAddAdditionalParameter'.")]
+ static TValue Deserialize(JsonElement element) => element.Deserialize<TValue>();
+ }
+
+ internal string ToState() => JsonSerializer.Serialize(this, InteractiveRequestOptionsSerializerContext.Default.InteractiveRequestOptions);
+
+ internal static InteractiveRequestOptions FromState(string state) => JsonSerializer.Deserialize(
+ state,
+ InteractiveRequestOptionsSerializerContext.Default.InteractiveRequestOptions);
+
+ internal class Converter : JsonConverter<InteractiveRequestOptions>
+ {
+ public override InteractiveRequestOptions Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ {
+ var requestOptions = JsonSerializer.Deserialize(ref reader, InteractiveRequestOptionsSerializerContext.Default.OptionsRecord);
+
+ return new InteractiveRequestOptions
+ {
+ AdditionalRequestParameters = requestOptions.AdditionalRequestParameters,
+ Interaction = requestOptions.Interaction,
+ ReturnUrl = requestOptions.ReturnUrl,
+ Scopes = requestOptions.Scopes,
+ };
+ }
+
+ public override void Write(Utf8JsonWriter writer, InteractiveRequestOptions value, JsonSerializerOptions options)
+ {
+ JsonSerializer.Serialize(
+ writer,
+ new OptionsRecord(value.ReturnUrl, value.Scopes, value.Interaction, value.AdditionalRequestParameters),
+ InteractiveRequestOptionsSerializerContext.Default.OptionsRecord);
+ }
+
+ internal record struct OptionsRecord(
+ [property: JsonInclude] string ReturnUrl,
+ [property: JsonInclude] IEnumerable<string> Scopes,
+ [property: JsonInclude] InteractionType Interaction,
+ [property: JsonInclude] Dictionary<string, object> AdditionalRequestParameters);
+ }
+}
+
+[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, WriteIndented = false)]
+[JsonSerializable(typeof(InteractiveRequestOptions))]
+[JsonSerializable(typeof(InteractiveRequestOptions.Converter.OptionsRecord))]
+[JsonSerializable(typeof(JsonElement))]
+internal partial class InteractiveRequestOptionsSerializerContext : JsonSerializerContext
+{
+}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationContext.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationContext.cs
index 5ac882e42d..3ad157595c 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationContext.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationContext.cs
@@ -21,4 +21,9 @@ public class RemoteAuthenticationContext<[DynamicallyAccessedMembers(JsonSeriali
/// Gets or sets the state instance for the current authentication operation.
/// </summary>
public TRemoteAuthenticationState State { get; set; }
+
+ /// <summary>
+ /// Gets or sets the interaction request for the current authentication operation.
+ /// </summary>
+ public InteractiveRequestOptions InteractiveRequest { get; set; }
}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationStatus.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationStatus.cs
index 00039b2b70..9aaf64a98d 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationStatus.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Models/RemoteAuthenticationStatus.cs
@@ -1,11 +1,14 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Text.Json.Serialization;
+
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
/// <summary>
/// Represents the status of an authentication operation.
/// </summary>
+[JsonConverter(typeof(JsonStringEnumConverter))]
public enum RemoteAuthenticationStatus
{
/// <summary>
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/NavigationManagerExtensions.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/NavigationManagerExtensions.cs
new file mode 100644
index 0000000000..cb879097d5
--- /dev/null
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/NavigationManagerExtensions.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
+
+/// <summary>
+/// Extensions for <see cref="NavigationManager"/>.
+/// </summary>
+public static class NavigationManagerExtensions
+{
+ /// <summary>
+ /// Initiates a logout operation by navigating to the log out endpoint.
+ /// </summary>
+ /// <remarks>
+ /// The navigation includes state that is added to the browser history entry to
+ /// prevent logout operations performed from different contexts.
+ /// </remarks>
+ /// <param name="manager">The <see cref="NavigationManager"/>.</param>
+ /// <param name="logoutPath">The path to navigate to.</param>
+ public static void NavigateToLogout(this NavigationManager manager, string logoutPath) =>
+ manager.NavigateToLogout(logoutPath, null);
+
+ /// <summary>
+ /// Initiates a logout operation by navigating to the log out endpoint.
+ /// </summary>
+ /// <remarks>
+ /// The navigation includes stated that is added to the browser history entry to
+ /// prevent logout operations performed from different contexts.
+ /// </remarks>
+ /// <param name="manager">The <see cref="NavigationManager"/>.</param>
+ /// <param name="logoutPath">The path to navigate too.</param>
+ /// <param name="returnUrl">The url to redirect the user to after logging out.</param>
+ public static void NavigateToLogout(this NavigationManager manager, string logoutPath, string returnUrl)
+ {
+ manager.NavigateTo(logoutPath, new NavigationOptions
+ {
+ HistoryEntryState = new InteractiveRequestOptions
+ {
+ Interaction = InteractionType.SignOut,
+ ReturnUrl = returnUrl
+ }.ToState()
+ });
+ }
+
+ /// <summary>
+ /// Initiates a logout operation by navigating to the log out endpoint.
+ /// </summary>
+ /// <remarks>
+ /// The navigation includes stated that is added to the browser history entry to
+ /// prevent logout operations performed from different contexts.
+ /// </remarks>
+ /// <param name="manager">The <see cref="NavigationManager"/>.</param>
+ /// <param name="loginPath">The path to the login url.</param>
+ /// <param name="request">The <see cref="InteractiveRequestOptions"/> containing the authorization details.</param>
+ public static void NavigateToLogin(this NavigationManager manager, string loginPath, InteractiveRequestOptions request)
+ {
+ manager.NavigateTo(loginPath, new NavigationOptions
+ {
+ HistoryEntryState = request.ToState(),
+ });
+ }
+
+ /// <summary>
+ /// Initiates a logout operation by navigating to the log out endpoint.
+ /// </summary>
+ /// <remarks>
+ /// The navigation includes stated that is added to the browser history entry to
+ /// prevent logout operations performed from different contexts.
+ /// </remarks>
+ /// <param name="manager">The <see cref="NavigationManager"/>.</param>
+ /// <param name="loginPath">The path to the login url.</param>
+ public static void NavigateToLogin(this NavigationManager manager, string loginPath)
+ {
+ manager.NavigateToLogin(
+ loginPath,
+ new InteractiveRequestOptions
+ {
+ Interaction = InteractionType.SignIn,
+ ReturnUrl = manager.Uri
+ });
+ }
+}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultApiAuthorizationOptionsConfiguration.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultApiAuthorizationOptionsConfiguration.cs
index 435daf4563..b9daa91f19 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultApiAuthorizationOptionsConfiguration.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultApiAuthorizationOptionsConfiguration.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
-internal class DefaultApiAuthorizationOptionsConfiguration : IPostConfigureOptions<RemoteAuthenticationOptions<ApiAuthorizationProviderOptions>>
+internal sealed class DefaultApiAuthorizationOptionsConfiguration : IPostConfigureOptions<RemoteAuthenticationOptions<ApiAuthorizationProviderOptions>>
{
private readonly string _applicationName;
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultOidcProviderOptionsConfiguration.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultOidcProviderOptionsConfiguration.cs
index aaadc76eb6..fef52dc11c 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultOidcProviderOptionsConfiguration.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Options/DefaultOidcProviderOptionsConfiguration.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
-internal class DefaultOidcOptionsConfiguration : IPostConfigureOptions<RemoteAuthenticationOptions<OidcProviderOptions>>
+internal sealed class DefaultOidcOptionsConfiguration : IPostConfigureOptions<RemoteAuthenticationOptions<OidcProviderOptions>>
{
private readonly NavigationManager _navigationManager;
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/PublicAPI.Unshipped.txt b/src/Components/WebAssembly/WebAssembly.Authentication/src/PublicAPI.Unshipped.txt
index 7dc5c58110..3ac471b5b2 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/PublicAPI.Unshipped.txt
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/PublicAPI.Unshipped.txt
@@ -1 +1,28 @@
#nullable enable
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType.GetToken = 1 -> Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType.SignIn = 0 -> Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType.SignOut = 2 -> Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.Interaction.get -> Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractionType
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.Interaction.init -> void
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.InteractiveRequestOptions() -> void
+Microsoft.AspNetCore.Components.WebAssembly.Authentication.NavigationManagerExtensions
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenNotAvailableException.Redirect(System.Action<Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions> configureInteractionOptions) -> void
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenResult.AccessTokenResult(Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenResultStatus status, Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessToken token, string interactiveRequestUrl, Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions interactiveRequest) -> void
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenResult.InteractionOptions.get -> Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccessTokenResult.InteractiveRequestUrl.get -> string
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.ReturnUrl.get -> string
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.ReturnUrl.init -> void
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.Scopes.get -> System.Collections.Generic.IEnumerable<string>
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.Scopes.init -> void
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.TryAddAdditionalParameter<TValue>(string name, TValue value) -> bool
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.TryGetAdditionalParameter<TValue>(string name, out TValue value) -> bool
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions.TryRemoveAdditionalParameter(string name) -> bool
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationContext<TRemoteAuthenticationState>.InteractiveRequest.get -> Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationContext<TRemoteAuthenticationState>.InteractiveRequest.set -> void
+~Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationService<TRemoteAuthenticationState, TAccount, TProviderOptions>.RemoteAuthenticationService(Microsoft.JSInterop.IJSRuntime jsRuntime, Microsoft.Extensions.Options.IOptionsSnapshot<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationOptions<TProviderOptions>> options, Microsoft.AspNetCore.Components.NavigationManager navigation, Microsoft.AspNetCore.Components.WebAssembly.Authentication.AccountClaimsPrincipalFactory<TAccount> accountClaimsPrincipalFactory, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Components.WebAssembly.Authentication.RemoteAuthenticationService<TRemoteAuthenticationState, TAccount, TProviderOptions>> logger) -> void
+~static Microsoft.AspNetCore.Components.WebAssembly.Authentication.NavigationManagerExtensions.NavigateToLogin(this Microsoft.AspNetCore.Components.NavigationManager manager, string loginPath) -> void
+~static Microsoft.AspNetCore.Components.WebAssembly.Authentication.NavigationManagerExtensions.NavigateToLogin(this Microsoft.AspNetCore.Components.NavigationManager manager, string loginPath, Microsoft.AspNetCore.Components.WebAssembly.Authentication.InteractiveRequestOptions request) -> void
+~static Microsoft.AspNetCore.Components.WebAssembly.Authentication.NavigationManagerExtensions.NavigateToLogout(this Microsoft.AspNetCore.Components.NavigationManager manager, string logoutPath) -> void
+~static Microsoft.AspNetCore.Components.WebAssembly.Authentication.NavigationManagerExtensions.NavigateToLogout(this Microsoft.AspNetCore.Components.NavigationManager manager, string logoutPath, string returnUrl) -> void
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/QueryStringHelper.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/QueryStringHelper.cs
deleted file mode 100644
index 2aca187baa..0000000000
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/QueryStringHelper.cs
+++ /dev/null
@@ -1,73 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
-
-internal static class QueryStringHelper
-{
- public static string GetParameter(string queryString, string key)
- {
- if (string.IsNullOrEmpty(queryString) || queryString == "?")
- {
- return null;
- }
-
- var scanIndex = 0;
- if (queryString[0] == '?')
- {
- scanIndex = 1;
- }
-
- var textLength = queryString.Length;
- var equalIndex = queryString.IndexOf('=');
- if (equalIndex == -1)
- {
- equalIndex = textLength;
- }
-
- while (scanIndex < textLength)
- {
- var ampersandIndex = queryString.IndexOf('&', scanIndex);
- if (ampersandIndex == -1)
- {
- ampersandIndex = textLength;
- }
-
- if (equalIndex < ampersandIndex)
- {
- while (scanIndex != equalIndex && char.IsWhiteSpace(queryString[scanIndex]))
- {
- ++scanIndex;
- }
- var name = queryString[scanIndex..equalIndex];
- var value = queryString.Substring(equalIndex + 1, ampersandIndex - equalIndex - 1);
- var processedName = Uri.UnescapeDataString(name.Replace('+', ' '));
- if (string.Equals(processedName, key, StringComparison.OrdinalIgnoreCase))
- {
- return Uri.UnescapeDataString(value.Replace('+', ' '));
- }
-
- equalIndex = queryString.IndexOf('=', ampersandIndex);
- if (equalIndex == -1)
- {
- equalIndex = textLength;
- }
- }
- else
- {
- if (ampersandIndex > scanIndex)
- {
- var value = queryString[scanIndex..ampersandIndex];
- if (string.Equals(value, key, StringComparison.OrdinalIgnoreCase))
- {
- return string.Empty;
- }
- }
- }
-
- scanIndex = ampersandIndex + 1;
- }
-
- return null;
- }
-}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticationBuilder.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticationBuilder.cs
index 8464bc43da..34cf564f93 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticationBuilder.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticationBuilder.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
-internal class RemoteAuthenticationBuilder<TRemoteAuthenticationState, TAccount>
+internal sealed class RemoteAuthenticationBuilder<TRemoteAuthenticationState, TAccount>
: IRemoteAuthenticationBuilder<TRemoteAuthenticationState, TAccount>
where TRemoteAuthenticationState : RemoteAuthenticationState
where TAccount : RemoteUserAccount
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.Log.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.Log.cs
new file mode 100644
index 0000000000..2ff49351c5
--- /dev/null
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.Log.cs
@@ -0,0 +1,57 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
+
+public partial class RemoteAuthenticatorViewCore<TAuthenticationState> where TAuthenticationState : RemoteAuthenticationState
+{
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Debug, "Processing action {Action}.", EventName = nameof(ProcessingAuthenticatorAction))]
+ public static partial void ProcessingAuthenticatorAction(ILogger logger, string action);
+
+ [LoggerMessage(2, LogLevel.Debug, "Login completed successfully.", EventName = nameof(LoginCompletedSuccessfully))]
+ public static partial void LoginCompletedSuccessfully(ILogger logger);
+
+ [LoggerMessage(3, LogLevel.Debug, "Login requires redirect to the identity provider.", EventName = nameof(LoginRequiresRedirect))]
+ public static partial void LoginRequiresRedirect(ILogger logger);
+
+ [LoggerMessage(4, LogLevel.Debug, "Navigating to {Url}.", EventName = nameof(NavigatingToUrl))]
+ public static partial void NavigatingToUrl(ILogger logger, string url);
+
+ [LoggerMessage(5, LogLevel.Debug, "Raising LoginCompleted event.", EventName = nameof(InvokingLoginCompletedCallback))]
+ public static partial void InvokingLoginCompletedCallback(ILogger logger);
+
+ [LoggerMessage(6, LogLevel.Debug, "Login operation failed with error '{ErrorMessage}'.", EventName = nameof(LoginFailed))]
+ public static partial void LoginFailed(ILogger logger, string errorMessage);
+
+ [LoggerMessage(7, LogLevel.Debug, "Login callback failed with error '{ErrorMessage}'.", EventName = nameof(LoginCallbackFailed))]
+ public static partial void LoginCallbackFailed(ILogger logger, string errorMessage);
+
+ [LoggerMessage(8, LogLevel.Debug, "Login redirect completed successfully.", EventName = nameof(LoginRedirectCompletedSuccessfully))]
+ public static partial void LoginRedirectCompletedSuccessfully(ILogger logger);
+
+ [LoggerMessage(9, LogLevel.Debug, "The logout was not initiated from within the page.", EventName = nameof(LogoutOperationInitiatedExternally))]
+ public static partial void LogoutOperationInitiatedExternally(ILogger logger);
+
+ [LoggerMessage(10, LogLevel.Debug, "Login completed successfully.", EventName = nameof(LoginCompletedSuccessfully))]
+ public static partial void LogoutCompletedSuccessfully(ILogger logger);
+
+ [LoggerMessage(11, LogLevel.Debug, "Logout requires redirect to the identity provider.", EventName = nameof(LogoutRequiresRedirect))]
+ public static partial void LogoutRequiresRedirect(ILogger logger);
+
+ [LoggerMessage(12, LogLevel.Debug, "Raising LogoutCompleted event.", EventName = nameof(InvokingLogoutCompletedCallback))]
+ public static partial void InvokingLogoutCompletedCallback(ILogger logger);
+
+ [LoggerMessage(13, LogLevel.Debug, "Logout operation failed with error '{ErrorMessage}'.", EventName = nameof(LogoutFailed))]
+ public static partial void LogoutFailed(ILogger logger, string errorMessage);
+
+ [LoggerMessage(14, LogLevel.Debug, "Logout callback failed with error '{ErrorMessage}'.", EventName = nameof(LogoutCallbackFailed))]
+ public static partial void LogoutCallbackFailed(ILogger logger, string errorMessage);
+
+ [LoggerMessage(15, LogLevel.Debug, "Logout redirect completed successfully.", EventName = nameof(LogoutRedirectCompletedSuccessfully))]
+ public static partial void LogoutRedirectCompletedSuccessfully(ILogger logger);
+ }
+}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.cs
index da65fb0fd1..95c178a456 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/RemoteAuthenticatorViewCore.cs
@@ -4,7 +4,7 @@
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.Rendering;
-using Microsoft.JSInterop;
+using Microsoft.Extensions.Logging;
using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
@@ -13,11 +13,14 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
/// A component that handles remote authentication operations in an application.
/// </summary>
/// <typeparam name="TAuthenticationState">The user state type persisted while the operation is in progress. It must be serializable.</typeparam>
-public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSerialized)] TAuthenticationState> : ComponentBase where TAuthenticationState : RemoteAuthenticationState
+public partial class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSerialized)] TAuthenticationState> : ComponentBase where TAuthenticationState : RemoteAuthenticationState
{
- private string _message;
private RemoteAuthenticationApplicationPathsOptions _applicationPaths;
private string _action;
+ private InteractiveRequestOptions _cachedRequest;
+
+ private static readonly NavigationOptions AuthenticationNavigationOptions =
+ new() { ReplaceHistoryEntry = true, ForceLoad = false };
/// <summary>
/// Gets or sets the <see cref="RemoteAuthenticationActions"/> action the component needs to handle.
@@ -85,44 +88,28 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
[Parameter] public EventCallback<TAuthenticationState> OnLogOutSucceeded { get; set; }
/// <summary>
- /// Gets or sets the <see cref="IJSRuntime"/> to use for performing JavaScript interop.
+ /// Gets or sets the <see cref="RemoteAuthenticationApplicationPathsOptions"/> with the paths to different authentication pages.
/// </summary>
- [Inject] internal IJSRuntime JS { get; set; }
+ [Parameter]
+ public RemoteAuthenticationApplicationPathsOptions ApplicationPaths
+ {
+ get => _applicationPaths ?? RemoteApplicationPathsProvider.ApplicationPaths;
+ set => _applicationPaths = value;
+ }
- /// <summary>
- /// Gets or sets the <see cref="NavigationManager"/> to use for redirecting the browser.
- /// </summary>
[Inject] internal NavigationManager Navigation { get; set; }
- /// <summary>
- /// Gets or sets the <see cref="IRemoteAuthenticationService{TRemoteAuthenticationState}"/> to use for handling the underlying authentication protocol.
- /// </summary>
[Inject] internal IRemoteAuthenticationService<TAuthenticationState> AuthenticationService { get; set; }
- /// <summary>
- /// Gets or sets a default <see cref="IRemoteAuthenticationPathsProvider"/> to use as fallback if an <see cref="ApplicationPaths"/> has not been explicitly specified.
- /// </summary>
[Inject] internal IRemoteAuthenticationPathsProvider RemoteApplicationPathsProvider { get; set; }
- /// <summary>
- /// Gets or sets a default <see cref="AuthenticationStateProvider"/> with the current user.
- /// </summary>
[Inject] internal AuthenticationStateProvider AuthenticationProvider { get; set; }
- /// <summary>
- /// Gets or sets a default <see cref="AuthenticationStateProvider"/> with the current user.
- /// </summary>
+#pragma warning disable CS0618 // Type or member is obsolete, we keep it for now for backwards compatibility
[Inject] internal SignOutSessionStateManager SignOutManager { get; set; }
+#pragma warning restore CS0618 // Type or member is obsolete, we keep it for now for backwards compatibility
- /// <summary>
- /// Gets or sets the <see cref="RemoteAuthenticationApplicationPathsOptions"/> with the paths to different authentication pages.
- /// </summary>
- [Parameter]
- public RemoteAuthenticationApplicationPathsOptions ApplicationPaths
- {
- get => _applicationPaths ?? RemoteApplicationPathsProvider.ApplicationPaths;
- set => _applicationPaths = value;
- }
+ [Inject] internal ILogger<RemoteAuthenticatorViewCore<TAuthenticationState>> Logger { get; set; }
/// <inheritdoc />
protected override void BuildRenderTree(RenderTreeBuilder builder)
@@ -143,7 +130,7 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
builder.AddContent(0, CompletingLoggingIn);
break;
case RemoteAuthenticationActions.LogInFailed:
- builder.AddContent(0, LogInFailed(_message));
+ builder.AddContent(0, LogInFailed(Navigation.HistoryEntryState));
break;
case RemoteAuthenticationActions.LogOut:
builder.AddContent(0, LogOut);
@@ -152,7 +139,7 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
builder.AddContent(0, CompletingLogOut);
break;
case RemoteAuthenticationActions.LogOutFailed:
- builder.AddContent(0, LogOutFailed(_message));
+ builder.AddContent(0, LogOutFailed(Navigation.HistoryEntryState));
break;
case RemoteAuthenticationActions.LogOutSucceeded:
builder.AddContent(0, LogOutSucceeded);
@@ -165,6 +152,7 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
/// <inheritdoc />
protected override async Task OnParametersSetAsync()
{
+ Log.ProcessingAuthenticatorAction(Logger, Action);
switch (Action)
{
case RemoteAuthenticationActions.LogIn:
@@ -183,7 +171,7 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
else
{
UserProfile ??= LoggingIn;
- await RedirectToProfile();
+ RedirectToProfile();
}
break;
case RemoteAuthenticationActions.Register:
@@ -194,11 +182,11 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
else
{
Registering ??= LoggingIn;
- await RedirectToRegister();
+ RedirectToRegister();
}
break;
case RemoteAuthenticationActions.LogOut:
- await ProcessLogOut(GetReturnUrl(state: null, Navigation.ToAbsoluteUri(ApplicationPaths.LogOutSucceededPath).AbsoluteUri));
+ await ProcessLogOut(GetReturnUrl(state: null, ApplicationPaths.LogOutSucceededPath));
break;
case RemoteAuthenticationActions.LogOutCallback:
await ProcessLogOutCallback();
@@ -215,22 +203,33 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
private async Task ProcessLogIn(string returnUrl)
{
AuthenticationState.ReturnUrl = returnUrl;
+ var interactiveRequest = GetCachedNavigationState();
var result = await AuthenticationService.SignInAsync(new RemoteAuthenticationContext<TAuthenticationState>
{
- State = AuthenticationState
+ State = AuthenticationState,
+ InteractiveRequest = interactiveRequest
});
switch (result.Status)
{
case RemoteAuthenticationStatus.Redirect:
+ Log.LoginRequiresRedirect(Logger);
break;
case RemoteAuthenticationStatus.Success:
- await OnLogInSucceeded.InvokeAsync(result.State);
- await NavigateToReturnUrl(GetReturnUrl(result.State, returnUrl));
+ Log.LoginCompletedSuccessfully(Logger);
+ if (OnLogInSucceeded.HasDelegate)
+ {
+ Log.InvokingLoginCompletedCallback(Logger);
+ await OnLogInSucceeded.InvokeAsync(result.State);
+ }
+ var redirectUrl = GetReturnUrl(result.State, returnUrl);
+ Log.NavigatingToUrl(Logger, redirectUrl);
+ Navigation.NavigateTo(redirectUrl, AuthenticationNavigationOptions);
break;
case RemoteAuthenticationStatus.Failure:
- _message = result.ErrorMessage;
- Navigation.NavigateTo(ApplicationPaths.LogInFailedPath);
+ Log.LoginFailed(Logger, result.ErrorMessage);
+ Log.NavigatingToUrl(Logger, ApplicationPaths.LogInFailedPath);
+ Navigation.NavigateTo(ApplicationPaths.LogInFailedPath, AuthenticationNavigationOptions with { HistoryEntryState = result.ErrorMessage });
break;
case RemoteAuthenticationStatus.OperationCompleted:
default:
@@ -240,8 +239,8 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
private async Task ProcessLogInCallback()
{
- var url = Navigation.Uri;
- var result = await AuthenticationService.CompleteSignInAsync(new RemoteAuthenticationContext<TAuthenticationState> { Url = url });
+ var result = await AuthenticationService.CompleteSignInAsync(
+ new RemoteAuthenticationContext<TAuthenticationState> { Url = Navigation.Uri });
switch (result.Status)
{
case RemoteAuthenticationStatus.Redirect:
@@ -249,14 +248,24 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
// is when we are doing a redirect sign in flow.
throw new InvalidOperationException("Should not redirect.");
case RemoteAuthenticationStatus.Success:
- await OnLogInSucceeded.InvokeAsync(result.State);
- await NavigateToReturnUrl(GetReturnUrl(result.State));
+ Log.LoginRedirectCompletedSuccessfully(Logger);
+ if (OnLogInSucceeded.HasDelegate)
+ {
+ Log.InvokingLoginCompletedCallback(Logger);
+ await OnLogInSucceeded.InvokeAsync(result.State);
+ }
+ var redirectUrl = GetReturnUrl(result.State);
+ Log.NavigatingToUrl(Logger, redirectUrl);
+ Navigation.NavigateTo(redirectUrl, AuthenticationNavigationOptions);
break;
case RemoteAuthenticationStatus.OperationCompleted:
break;
case RemoteAuthenticationStatus.Failure:
- var uri = Navigation.ToAbsoluteUri($"{ApplicationPaths.LogInFailedPath}?message={Uri.EscapeDataString(result.ErrorMessage)}").ToString();
- await NavigateToReturnUrl(uri);
+ Log.LoginCallbackFailed(Logger, result.ErrorMessage);
+ Log.NavigatingToUrl(Logger, ApplicationPaths.LogInFailedPath);
+ Navigation.NavigateTo(
+ ApplicationPaths.LogInFailedPath,
+ AuthenticationNavigationOptions with { HistoryEntryState = result.ErrorMessage });
break;
default:
throw new InvalidOperationException($"Invalid authentication result status '{result.Status}'.");
@@ -265,11 +274,12 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
private async Task ProcessLogOut(string returnUrl)
{
- if (!await SignOutManager.ValidateSignOutState())
+ if ((Navigation.HistoryEntryState != null && !ValidateSignOutRequestState()) ||
+ // For backcompat purposes, keep SignOutManager working, even though we now use the history.state for this.
+ (Navigation.HistoryEntryState == null && !await SignOutManager.ValidateSignOutState()))
{
- var uri = $"{Navigation.ToAbsoluteUri(ApplicationPaths.LogOutFailedPath)}?message={Uri.EscapeDataString("The logout was not initiated from within the page.")}";
- Navigation.NavigateTo(uri);
-
+ Log.LogoutOperationInitiatedExternally(Logger);
+ Navigation.NavigateTo(ApplicationPaths.LogOutFailedPath, AuthenticationNavigationOptions with { HistoryEntryState = "The logout was not initiated from within the page." });
return;
}
@@ -279,20 +289,33 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
var isauthenticated = state.User.Identity.IsAuthenticated;
if (isauthenticated)
{
- var result = await AuthenticationService.SignOutAsync(new RemoteAuthenticationContext<TAuthenticationState> { State = AuthenticationState });
+ var interactiveRequest = GetCachedNavigationState();
+ var result = await AuthenticationService.SignOutAsync(new RemoteAuthenticationContext<TAuthenticationState>
+ {
+ State = AuthenticationState,
+ InteractiveRequest = interactiveRequest
+ });
switch (result.Status)
{
case RemoteAuthenticationStatus.Redirect:
+ Log.LogoutRequiresRedirect(Logger);
break;
case RemoteAuthenticationStatus.Success:
- await OnLogOutSucceeded.InvokeAsync(result.State);
- await NavigateToReturnUrl(returnUrl);
+ Log.LogoutCompletedSuccessfully(Logger);
+ if (OnLogOutSucceeded.HasDelegate)
+ {
+ Log.InvokingLogoutCompletedCallback(Logger);
+ await OnLogOutSucceeded.InvokeAsync(result.State);
+ }
+ Log.NavigatingToUrl(Logger, returnUrl);
+ Navigation.NavigateTo(returnUrl, AuthenticationNavigationOptions);
break;
case RemoteAuthenticationStatus.OperationCompleted:
break;
case RemoteAuthenticationStatus.Failure:
- _message = result.ErrorMessage;
- Navigation.NavigateTo(ApplicationPaths.LogOutFailedPath);
+ Log.LogoutFailed(Logger, result.ErrorMessage);
+ Log.NavigatingToUrl(Logger, ApplicationPaths.LogOutFailedPath);
+ Navigation.NavigateTo(ApplicationPaths.LogOutFailedPath, AuthenticationNavigationOptions with { HistoryEntryState = result.ErrorMessage });
break;
default:
throw new InvalidOperationException($"Invalid authentication result status.");
@@ -300,7 +323,8 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
}
else
{
- await NavigateToReturnUrl(returnUrl);
+ Log.NavigatingToUrl(Logger, returnUrl);
+ Navigation.NavigateTo(returnUrl, AuthenticationNavigationOptions);
}
}
@@ -314,14 +338,21 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
// is when we are doing a redirect sign in flow.
throw new InvalidOperationException("Should not redirect.");
case RemoteAuthenticationStatus.Success:
- await OnLogOutSucceeded.InvokeAsync(result.State);
- await NavigateToReturnUrl(GetReturnUrl(result.State, Navigation.ToAbsoluteUri(ApplicationPaths.LogOutSucceededPath).ToString()));
+ Log.LogoutRedirectCompletedSuccessfully(Logger);
+ if (OnLogOutSucceeded.HasDelegate)
+ {
+ Log.InvokingLogoutCompletedCallback(Logger);
+ await OnLogOutSucceeded.InvokeAsync(result.State);
+ }
+ var redirectUrl = GetReturnUrl(result.State, ApplicationPaths.LogOutSucceededPath);
+ Log.NavigatingToUrl(Logger, redirectUrl);
+ Navigation.NavigateTo(redirectUrl, AuthenticationNavigationOptions);
break;
case RemoteAuthenticationStatus.OperationCompleted:
break;
case RemoteAuthenticationStatus.Failure:
- var uri = Navigation.ToAbsoluteUri($"{ApplicationPaths.LogOutFailedPath}?message={Uri.EscapeDataString(result.ErrorMessage)}").ToString();
- await NavigateToReturnUrl(uri);
+ Log.LogoutCallbackFailed(Logger, result.ErrorMessage);
+ Navigation.NavigateTo(ApplicationPaths.LogOutFailedPath, AuthenticationNavigationOptions with { HistoryEntryState = result.ErrorMessage });
break;
default:
throw new InvalidOperationException($"Invalid authentication result status.");
@@ -335,27 +366,49 @@ public class RemoteAuthenticatorViewCore<[DynamicallyAccessedMembers(JsonSeriali
return state.ReturnUrl;
}
- var fromQuery = QueryStringHelper.GetParameter(new Uri(Navigation.Uri).Query, "returnUrl");
- if (!string.IsNullOrWhiteSpace(fromQuery) && !fromQuery.StartsWith(Navigation.BaseUri, StringComparison.Ordinal))
+ var fromNavigationState = GetCachedNavigationState()?.ReturnUrl;
+
+ return fromNavigationState ?? defaultReturnUrl ?? Navigation.BaseUri;
+
+ }
+
+ private bool ValidateSignOutRequestState()
+ {
+ return GetCachedNavigationState()?.Interaction == InteractionType.SignOut;
+ }
+
+ private InteractiveRequestOptions GetCachedNavigationState()
+ {
+ if (_cachedRequest != null)
{
- // This is an extra check to prevent open redirects.
- throw new InvalidOperationException("Invalid return url. The return url needs to have the same origin as the current page.");
+ return _cachedRequest;
}
- return fromQuery ?? defaultReturnUrl ?? Navigation.BaseUri;
- }
+ if (string.IsNullOrEmpty(Navigation.HistoryEntryState))
+ {
+ return null;
+ }
- private async Task NavigateToReturnUrl(string returnUrl) => await JS.InvokeVoidAsync("Blazor.navigateTo", returnUrl, false, true);
+ _cachedRequest = InteractiveRequestOptions.FromState(Navigation.HistoryEntryState);
+ return _cachedRequest;
+ }
- private ValueTask RedirectToRegister()
+ private void RedirectToRegister()
{
var loginUrl = Navigation.ToAbsoluteUri(ApplicationPaths.LogInPath).PathAndQuery;
- var registerUrl = Navigation.ToAbsoluteUri($"{ApplicationPaths.RemoteRegisterPath}?returnUrl={Uri.EscapeDataString(loginUrl)}").PathAndQuery;
+ var registerUrl = Navigation.ToAbsoluteUri(ApplicationPaths.RemoteRegisterPath).AbsoluteUri;
+ var navigationUrl = Navigation.GetUriWithQueryParameters(
+ registerUrl,
+ new Dictionary<string, object> { ["returnUrl"] = loginUrl });
- return JS.InvokeVoidAsync("location.replace", registerUrl);
+ Navigation.NavigateTo(navigationUrl, AuthenticationNavigationOptions with
+ {
+ ForceLoad = true,
+ });
}
- private ValueTask RedirectToProfile() => JS.InvokeVoidAsync("location.replace", Navigation.ToAbsoluteUri(ApplicationPaths.RemoteProfilePath).PathAndQuery);
+ private void RedirectToProfile() =>
+ Navigation.NavigateTo(Navigation.ToAbsoluteUri(ApplicationPaths.RemoteProfilePath).AbsoluteUri, new NavigationOptions { ReplaceHistoryEntry = true, ForceLoad = true });
private static void DefaultLogInFragment(RenderTreeBuilder builder)
{
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenProviderAccessor.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenProviderAccessor.cs
index 523ec8afff..a7ef00df6c 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenProviderAccessor.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenProviderAccessor.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
-internal class AccessTokenProviderAccessor : IAccessTokenProviderAccessor
+internal sealed class AccessTokenProviderAccessor : IAccessTokenProviderAccessor
{
private readonly IServiceProvider _provider;
private IAccessTokenProvider _tokenProvider;
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenResult.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenResult.cs
index 5063e4d8cd..b56c315f33 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenResult.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/AccessTokenResult.cs
@@ -16,6 +16,7 @@ public class AccessTokenResult
/// <param name="status">The status of the result.</param>
/// <param name="token">The <see cref="AccessToken"/> in case it was successful.</param>
/// <param name="redirectUrl">The redirect uri to go to for provisioning the token.</param>
+ [Obsolete("Use the AccessTokenResult(AccessTokenResultStatus, AccessToken, string, InteractiveRequestOptions)")]
public AccessTokenResult(AccessTokenResultStatus status, AccessToken token, string redirectUrl)
{
Status = status;
@@ -24,16 +25,43 @@ public class AccessTokenResult
}
/// <summary>
- /// Gets or sets the status of the current operation. See <see cref="AccessTokenResultStatus"/> for a list of statuses.
+ /// Initializes a new instance of <see cref="AccessTokenResult"/>.
+ /// </summary>
+ /// <param name="status">The status of the result.</param>
+ /// <param name="token">The <see cref="AccessToken"/> in case it was successful.</param>
+ /// <param name="interactiveRequestUrl">The redirect uri to go to for provisioning the token with <see cref="NavigationManagerExtensions.NavigateToLogin(NavigationManager, string, InteractiveRequestOptions)"/>.</param>
+ /// <param name="interactiveRequest">The <see cref="InteractiveRequestOptions"/> containing the parameters for the interactive authentication.</param>
+ public AccessTokenResult(AccessTokenResultStatus status, AccessToken token, string interactiveRequestUrl, InteractiveRequestOptions interactiveRequest)
+ {
+ Status = status;
+ _token = token;
+ InteractiveRequestUrl = interactiveRequestUrl;
+ InteractionOptions = interactiveRequest;
+ }
+
+ /// <summary>
+ /// Gets the status of the current operation. See <see cref="AccessTokenResultStatus"/> for a list of statuses.
/// </summary>
public AccessTokenResultStatus Status { get; }
/// <summary>
- /// Gets or sets the URL to redirect to if <see cref="Status"/> is <see cref="AccessTokenResultStatus.RequiresRedirect"/>.
+ /// Gets the URL to redirect to if <see cref="Status"/> is <see cref="AccessTokenResultStatus.RequiresRedirect"/>.
/// </summary>
+ [Obsolete("Use 'InteractiveRequestUrl' and 'InteractiveRequest' instead.")]
public string RedirectUrl { get; }
/// <summary>
+ /// Gets the URL to call <see cref="NavigationManagerExtensions.NavigateToLogin(NavigationManager, string, InteractiveRequestOptions)"/> if <see cref="Status"/> is
+ /// <see cref="AccessTokenResultStatus.RequiresRedirect"/>.
+ /// </summary>
+ public string InteractiveRequestUrl { get; }
+
+ /// <summary>
+ /// Gets the <see cref="InteractiveRequestOptions"/> to use if <see cref="Status"/> is <see cref="AccessTokenResultStatus.RequiresRedirect"/>.
+ /// </summary>
+ public InteractiveRequestOptions InteractionOptions { get; }
+
+ /// <summary>
/// Determines whether the token request was successful and makes the <see cref="AccessToken"/> available for use when it is.
/// </summary>
/// <param name="accessToken">The <see cref="AccessToken"/> if the request was successful.</param>
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/DefaultRemoteApplicationPathsProvider.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/DefaultRemoteApplicationPathsProvider.cs
index b8f7f440d9..a1982cdafc 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/DefaultRemoteApplicationPathsProvider.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/DefaultRemoteApplicationPathsProvider.cs
@@ -7,7 +7,7 @@ using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
-internal class DefaultRemoteApplicationPathsProvider<[DynamicallyAccessedMembers(JsonSerialized)] TProviderOptions> : IRemoteAuthenticationPathsProvider where TProviderOptions : class, new()
+internal sealed class DefaultRemoteApplicationPathsProvider<[DynamicallyAccessedMembers(JsonSerialized)] TProviderOptions> : IRemoteAuthenticationPathsProvider where TProviderOptions : class, new()
{
private readonly IOptions<RemoteAuthenticationOptions<TProviderOptions>> _options;
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/ExpiredTokenException.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/ExpiredTokenException.cs
index 52917cc9b6..32cc594a8c 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/ExpiredTokenException.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/ExpiredTokenException.cs
@@ -30,7 +30,32 @@ public class AccessTokenNotAvailableException : Exception
}
/// <summary>
- /// Navigates to <see cref="AccessTokenResult.RedirectUrl"/> to allow refreshing the access token.
+ /// Navigates to <see cref="AccessTokenResult.InteractiveRequestUrl"/> using the given <see cref="AccessTokenResult.InteractionOptions"/>
+ /// to allow refreshing the access token.
/// </summary>
- public void Redirect() => _navigation.NavigateTo(_tokenResult.RedirectUrl);
+ public void Redirect()
+ {
+ if (_tokenResult.InteractionOptions != null && _tokenResult.InteractiveRequestUrl != null)
+ {
+ _navigation.NavigateToLogin(_tokenResult.InteractiveRequestUrl, _tokenResult.InteractionOptions);
+ }
+ else
+ {
+#pragma warning disable CS0618 // Type or member is obsolete
+ _navigation.NavigateTo(_tokenResult.RedirectUrl);
+#pragma warning restore CS0618 // Type or member is obsolete
+ }
+ }
+
+ /// <summary>
+ /// Navigates to <see cref="AccessTokenResult.InteractiveRequestUrl"/> using the given <see cref="AccessTokenResult.InteractionOptions"/>
+ /// to allow refreshing the access token.
+ /// </summary>
+ /// <param name="configureInteractionOptions">A callback to further configure the initial set of options to be passed during the interactive token adquisition flow.</param>
+ public void Redirect(Action<InteractiveRequestOptions> configureInteractionOptions)
+ {
+ ArgumentNullException.ThrowIfNull(configureInteractionOptions);
+ configureInteractionOptions(_tokenResult.InteractionOptions);
+ _navigation.NavigateToLogin(_tokenResult.InteractiveRequestUrl, _tokenResult.InteractionOptions);
+ }
}
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/RemoteAuthenticationService.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/RemoteAuthenticationService.cs
index 4ffe310768..cfc4f993ea 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/RemoteAuthenticationService.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/RemoteAuthenticationService.cs
@@ -3,7 +3,9 @@
using System.Diagnostics.CodeAnalysis;
using System.Security.Claims;
+using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Components.Authorization;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using static Microsoft.AspNetCore.Internal.LinkerFlags;
@@ -29,6 +31,7 @@ public class RemoteAuthenticationService<
{
private static readonly TimeSpan _userCacheRefreshInterval = TimeSpan.FromSeconds(60);
private bool _initialized;
+ private readonly JavaScriptLoggingOptions _loggingOptions;
// This defaults to 1/1/1970
private DateTimeOffset _userLastCheck = DateTimeOffset.FromUnixTimeSeconds(0);
@@ -61,16 +64,36 @@ public class RemoteAuthenticationService<
/// <param name="options">The options to be passed down to the underlying JavaScript library handling the authentication operations.</param>
/// <param name="navigation">The <see cref="NavigationManager"/> used to generate URLs.</param>
/// <param name="accountClaimsPrincipalFactory">The <see cref="AccountClaimsPrincipalFactory{TAccount}"/> used to generate the <see cref="ClaimsPrincipal"/> for the user.</param>
+ [Obsolete("Use the constructor RemoteAuthenticationService(IJSRuntime,IOptionsSnapshot<RemoteAuthenticationOptions<TProviderOptions>>,NavigationManager,AccountClaimsPrincipalFactory<TAccount>,ILogger<RemoteAuthenticationService<TRemoteAuthenticationState, TAccount, TProviderOptions>>) instead.")]
public RemoteAuthenticationService(
IJSRuntime jsRuntime,
IOptionsSnapshot<RemoteAuthenticationOptions<TProviderOptions>> options,
NavigationManager navigation,
AccountClaimsPrincipalFactory<TAccount> accountClaimsPrincipalFactory)
+ : this(jsRuntime, options, navigation, accountClaimsPrincipalFactory, null)
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance.
+ /// </summary>
+ /// <param name="jsRuntime">The <see cref="IJSRuntime"/> to use for performing JavaScript interop operations.</param>
+ /// <param name="options">The options to be passed down to the underlying JavaScript library handling the authentication operations.</param>
+ /// <param name="navigation">The <see cref="NavigationManager"/> used to generate URLs.</param>
+ /// <param name="accountClaimsPrincipalFactory">The <see cref="AccountClaimsPrincipalFactory{TAccount}"/> used to generate the <see cref="ClaimsPrincipal"/> for the user.</param>
+ /// <param name="logger">The logger to use for login authentication operations.</param>
+ public RemoteAuthenticationService(
+ IJSRuntime jsRuntime,
+ IOptionsSnapshot<RemoteAuthenticationOptions<TProviderOptions>> options,
+ NavigationManager navigation,
+ AccountClaimsPrincipalFactory<TAccount> accountClaimsPrincipalFactory,
+ ILogger<RemoteAuthenticationService<TRemoteAuthenticationState, TAccount, TProviderOptions>> logger)
{
JsRuntime = jsRuntime;
Navigation = navigation;
AccountClaimsPrincipalFactory = accountClaimsPrincipalFactory;
Options = options.Value;
+ _loggingOptions = new JavaScriptLoggingOptions(logger?.IsEnabled(LogLevel.Debug) ?? false, logger?.IsEnabled(LogLevel.Trace) ?? false);
}
/// <inheritdoc />
@@ -81,14 +104,8 @@ public class RemoteAuthenticationService<
RemoteAuthenticationContext<TRemoteAuthenticationState> context)
{
await EnsureAuthService();
- var internalResult = await JsRuntime.InvokeAsync<InternalRemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.signIn", context.State);
- var result = internalResult.Convert();
- if (result.Status == RemoteAuthenticationStatus.Success)
- {
- var getUserTask = GetUser();
- await getUserTask;
- UpdateUser(getUserTask);
- }
+ var result = await JsRuntime.InvokeAsync<RemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.signIn", context);
+ await UpdateUserOnSuccess(result);
return result;
}
@@ -98,14 +115,8 @@ public class RemoteAuthenticationService<
RemoteAuthenticationContext<TRemoteAuthenticationState> context)
{
await EnsureAuthService();
- var internalResult = await JsRuntime.InvokeAsync<InternalRemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.completeSignIn", context.Url);
- var result = internalResult.Convert();
- if (result.Status == RemoteAuthenticationStatus.Success)
- {
- var getUserTask = GetUser();
- await getUserTask;
- UpdateUser(getUserTask);
- }
+ var result = await JsRuntime.InvokeAsync<RemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.completeSignIn", context.Url);
+ await UpdateUserOnSuccess(result);
return result;
}
@@ -115,14 +126,8 @@ public class RemoteAuthenticationService<
RemoteAuthenticationContext<TRemoteAuthenticationState> context)
{
await EnsureAuthService();
- var internalResult = await JsRuntime.InvokeAsync<InternalRemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.signOut", context.State);
- var result = internalResult.Convert();
- if (result.Status == RemoteAuthenticationStatus.Success)
- {
- var getUserTask = GetUser();
- await getUserTask;
- UpdateUser(getUserTask);
- }
+ var result = await JsRuntime.InvokeAsync<RemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.signOut", context);
+ await UpdateUserOnSuccess(result);
return result;
}
@@ -132,14 +137,8 @@ public class RemoteAuthenticationService<
RemoteAuthenticationContext<TRemoteAuthenticationState> context)
{
await EnsureAuthService();
- var internalResult = await JsRuntime.InvokeAsync<InternalRemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.completeSignOut", context.Url);
- var result = internalResult.Convert();
- if (result.Status == RemoteAuthenticationStatus.Success)
- {
- var getUserTask = GetUser();
- await getUserTask;
- UpdateUser(getUserTask);
- }
+ var result = await JsRuntime.InvokeAsync<RemoteAuthenticationResult<TRemoteAuthenticationState>>("AuthenticationService.completeSignOut", context.Url);
+ await UpdateUserOnSuccess(result);
return result;
}
@@ -150,18 +149,15 @@ public class RemoteAuthenticationService<
await EnsureAuthService();
var result = await JsRuntime.InvokeAsync<InternalAccessTokenResult>("AuthenticationService.getAccessToken");
- if (!Enum.TryParse<AccessTokenResultStatus>(result.Status, ignoreCase: true, out var parsedStatus))
- {
- throw new InvalidOperationException($"Invalid access token result status '{result.Status ?? "(null)"}'");
- }
-
- if (parsedStatus == AccessTokenResultStatus.RequiresRedirect)
- {
- var redirectUrl = GetRedirectUrl(null);
- result.RedirectUrl = redirectUrl.ToString();
- }
-
- return new AccessTokenResult(parsedStatus, result.Token, result.RedirectUrl);
+ return new AccessTokenResult(
+ result.Status,
+ result.Token,
+ result.Status == AccessTokenResultStatus.RequiresRedirect ? Options.AuthenticationPaths.LogInPath : null,
+ result.Status == AccessTokenResultStatus.RequiresRedirect ? new InteractiveRequestOptions
+ {
+ Interaction = InteractionType.GetToken,
+ ReturnUrl = GetReturnUrl(null)
+ } : null);
}
/// <inheritdoc />
@@ -177,27 +173,20 @@ public class RemoteAuthenticationService<
await EnsureAuthService();
var result = await JsRuntime.InvokeAsync<InternalAccessTokenResult>("AuthenticationService.getAccessToken", options);
- if (!Enum.TryParse<AccessTokenResultStatus>(result.Status, ignoreCase: true, out var parsedStatus))
- {
- throw new InvalidOperationException($"Invalid access token result status '{result.Status ?? "(null)"}'");
- }
-
- if (parsedStatus == AccessTokenResultStatus.RequiresRedirect)
- {
- var redirectUrl = GetRedirectUrl(options.ReturnUrl);
- result.RedirectUrl = redirectUrl.ToString();
- }
-
- return new AccessTokenResult(parsedStatus, result.Token, result.RedirectUrl);
+ return new AccessTokenResult(
+ result.Status,
+ result.Token,
+ result.Status == AccessTokenResultStatus.RequiresRedirect ? Options.AuthenticationPaths.LogInPath : null,
+ result.Status == AccessTokenResultStatus.RequiresRedirect ? new InteractiveRequestOptions
+ {
+ Interaction = InteractionType.GetToken,
+ ReturnUrl = GetReturnUrl(options.ReturnUrl),
+ Scopes = options.Scopes ?? Array.Empty<string>(),
+ } : null);
}
- private Uri GetRedirectUrl(string customReturnUrl)
- {
- var returnUrl = customReturnUrl != null ? Navigation.ToAbsoluteUri(customReturnUrl).ToString() : null;
- var encodedReturnUrl = Uri.EscapeDataString(returnUrl ?? Navigation.Uri);
- var redirectUrl = Navigation.ToAbsoluteUri($"{Options.AuthenticationPaths.LogInPath}?returnUrl={encodedReturnUrl}");
- return redirectUrl;
- }
+ private string GetReturnUrl(string customReturnUrl) =>
+ customReturnUrl != null ? Navigation.ToAbsoluteUri(customReturnUrl).AbsoluteUri : Navigation.Uri;
private async Task<ClaimsPrincipal> GetUser(bool useCache = false)
{
@@ -230,10 +219,19 @@ public class RemoteAuthenticationService<
{
if (!_initialized)
{
- await JsRuntime.InvokeVoidAsync("AuthenticationService.init", Options.ProviderOptions);
+ await JsRuntime.InvokeVoidAsync("AuthenticationService.init", Options.ProviderOptions, _loggingOptions);
_initialized = true;
}
}
+ private async Task UpdateUserOnSuccess(RemoteAuthenticationResult<TRemoteAuthenticationState> result)
+ {
+ if (result.Status == RemoteAuthenticationStatus.Success)
+ {
+ var getUserTask = GetUser();
+ await getUserTask;
+ UpdateUser(getUserTask);
+ }
+ }
private void UpdateUser(Task<ClaimsPrincipal> task)
{
@@ -241,40 +239,9 @@ public class RemoteAuthenticationService<
static async Task<AuthenticationState> UpdateAuthenticationState(Task<ClaimsPrincipal> futureUser) => new AuthenticationState(await futureUser);
}
-}
-// Internal for testing purposes
-internal struct InternalAccessTokenResult
-{
- public string Status { get; set; }
- public AccessToken Token { get; set; }
- public string RedirectUrl { get; set; }
+ private record JavaScriptLoggingOptions(bool DebugEnabled, bool TraceEnabled);
}
// Internal for testing purposes
-internal struct InternalRemoteAuthenticationResult<TRemoteAuthenticationState> where TRemoteAuthenticationState : RemoteAuthenticationState
-{
- public string Status { get; set; }
-
- public string ErrorMessage { get; set; }
-
- public TRemoteAuthenticationState State { get; set; }
-
- public RemoteAuthenticationResult<TRemoteAuthenticationState> Convert()
- {
- var result = new RemoteAuthenticationResult<TRemoteAuthenticationState>();
- result.ErrorMessage = ErrorMessage;
- result.State = State;
-
- if (Status != null && Enum.TryParse<RemoteAuthenticationStatus>(Status, ignoreCase: true, out var status))
- {
- result.Status = status;
- }
- else
- {
- throw new InvalidOperationException($"Can't convert status '${Status ?? "(null)"}'.");
- }
-
- return result;
- }
-}
+internal record struct InternalAccessTokenResult([property: JsonConverter(typeof(JsonStringEnumConverter))] AccessTokenResultStatus Status, AccessToken Token);
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/SignOutSessionStateManager.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/SignOutSessionStateManager.cs
index 41929ee098..c0fe3cab73 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/SignOutSessionStateManager.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/Services/SignOutSessionStateManager.cs
@@ -11,6 +11,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Authentication;
/// <summary>
/// Handles CSRF protection for the logout endpoint.
/// </summary>
+[Obsolete("Use 'Microsoft.AspNetCore.Components.Webassembly.Authentication.NavigationManagerExtensions.NavigateToLogout' instead.")]
public class SignOutSessionStateManager
{
private readonly IJSRuntime _jsRuntime;
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/src/WebAssemblyAuthenticationServiceCollectionExtensions.cs b/src/Components/WebAssembly/WebAssembly.Authentication/src/WebAssemblyAuthenticationServiceCollectionExtensions.cs
index cdadd3ca01..b657c2c0ef 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/src/WebAssemblyAuthenticationServiceCollectionExtensions.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/src/WebAssemblyAuthenticationServiceCollectionExtensions.cs
@@ -50,7 +50,9 @@ public static class WebAssemblyAuthenticationServiceCollectionExtensions
services.TryAddScoped<IRemoteAuthenticationPathsProvider, DefaultRemoteApplicationPathsProvider<TProviderOptions>>();
services.TryAddScoped<IAccessTokenProviderAccessor, AccessTokenProviderAccessor>();
+#pragma warning disable CS0618 // Type or member is obsolete, we keep it for now for backwards compatibility
services.TryAddScoped<SignOutSessionStateManager>();
+#pragma warning restore CS0618 // Type or member is obsolete, we keep it for now for backwards compatibility
services.TryAddScoped<AccountClaimsPrincipalFactory<TAccount>>();
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/test/AuthorizationMessageHandlerTests.cs b/src/Components/WebAssembly/WebAssembly.Authentication/test/AuthorizationMessageHandlerTests.cs
index 3c1587c090..db724a7296 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/test/AuthorizationMessageHandlerTests.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/test/AuthorizationMessageHandlerTests.cs
@@ -59,7 +59,8 @@ public class AuthorizationMessageHandlerTests
GrantedScopes = new string[] { "All" },
Value = "asdf"
},
- "https://www.example.com")));
+ null,
+ null)));
var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of<NavigationManager>());
handler.ConfigureHandler(new[] { "https://localhost:5001" });
@@ -87,7 +88,8 @@ public class AuthorizationMessageHandlerTests
GrantedScopes = new string[] { "All" },
Value = "asdf"
},
- "https://www.example.com")));
+ null,
+ null)));
var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of<NavigationManager>());
handler.ConfigureHandler(new[] { "https://localhost:5001" });
@@ -119,7 +121,8 @@ public class AuthorizationMessageHandlerTests
GrantedScopes = new string[] { "All" },
Value = "asdf"
},
- "https://www.example.com")));
+ null,
+ null)));
var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of<NavigationManager>());
handler.ConfigureHandler(new[] { "https://localhost:5001" });
@@ -145,7 +148,8 @@ public class AuthorizationMessageHandlerTests
tokenProvider.Setup(tp => tp.RequestAccessToken())
.Returns(new ValueTask<AccessTokenResult>(new AccessTokenResult(AccessTokenResultStatus.RequiresRedirect,
null,
- "https://www.example.com")));
+ "authentication/login",
+ new InteractiveRequestOptions { Interaction = InteractionType.GetToken, ReturnUrl = "https://www.example.com" })));
var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of<NavigationManager>());
handler.ConfigureHandler(new[] { "https://localhost:5001" });
@@ -170,7 +174,8 @@ public class AuthorizationMessageHandlerTests
GrantedScopes = new string[] { "All" },
Value = "asdf"
},
- "https://www.example.com/return")));
+ null,
+ null)));
var handler = new AuthorizationMessageHandler(tokenProvider.Object, Mock.Of<NavigationManager>());
handler.ConfigureHandler(
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticationServiceTests.cs b/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticationServiceTests.cs
index 595310ff1d..79f3bb98b6 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticationServiceTests.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticationServiceTests.cs
@@ -22,13 +22,14 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.SignInResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.SignInResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
State = state,
- Status = RemoteAuthenticationStatus.Success.ToString()
+ Status = RemoteAuthenticationStatus.Success
};
// Act
@@ -53,12 +54,13 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.SignInResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.SignInResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
- Status = value.ToString()
+ Status = value
};
// Act
@@ -80,13 +82,14 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.CompleteSignInResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.CompleteSignInResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
State = state,
- Status = RemoteAuthenticationStatus.Success.ToString()
+ Status = RemoteAuthenticationStatus.Success
};
// Act
@@ -111,12 +114,13 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.CompleteSignInResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.CompleteSignInResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
- Status = value.ToString().ToString()
+ Status = value
};
// Act
@@ -138,13 +142,14 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.SignOutResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.SignOutResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
State = state,
- Status = RemoteAuthenticationStatus.Success.ToString()
+ Status = RemoteAuthenticationStatus.Success
};
// Act
@@ -169,12 +174,13 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.SignOutResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.SignOutResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
- Status = value.ToString()
+ Status = value
};
// Act
@@ -196,13 +202,14 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.CompleteSignOutResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.CompleteSignOutResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
State = state,
- Status = RemoteAuthenticationStatus.Success.ToString()
+ Status = RemoteAuthenticationStatus.Success
};
// Act
@@ -227,12 +234,13 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.CompleteSignOutResult = new InternalRemoteAuthenticationResult<RemoteAuthenticationState>
+ testJsRuntime.CompleteSignOutResult = new RemoteAuthenticationResult<RemoteAuthenticationState>
{
- Status = value.ToString()
+ Status = value
};
// Act
@@ -254,12 +262,13 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
testJsRuntime.GetAccessTokenResult = new InternalAccessTokenResult
{
- Status = "success",
+ Status = AccessTokenResultStatus.Success,
Token = new AccessToken
{
Value = "1234",
@@ -277,8 +286,7 @@ public class RemoteAuthenticationServiceTests
testJsRuntime.PastInvocations.Select(i => i.identifier).ToArray());
Assert.True(result.TryGetToken(out var token));
- Assert.Equal(result.Status, Enum.Parse<AccessTokenResultStatus>(testJsRuntime.GetAccessTokenResult.Status, ignoreCase: true));
- Assert.Equal(result.RedirectUrl, testJsRuntime.GetAccessTokenResult.RedirectUrl);
+ Assert.Equal(result.Status, testJsRuntime.GetAccessTokenResult.Status);
Assert.Equal(token, testJsRuntime.GetAccessTokenResult.Token);
}
@@ -292,21 +300,17 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
- testJsRuntime.GetAccessTokenResult = new InternalAccessTokenResult
- {
- Status = "requiresRedirect",
- };
+ testJsRuntime.GetAccessTokenResult = new InternalAccessTokenResult(AccessTokenResultStatus.RequiresRedirect, null);
var tokenOptions = new AccessTokenRequestOptions
{
Scopes = new[] { "something" }
};
- var expectedRedirectUrl = "https://www.example.com/base/login?returnUrl=https%3A%2F%2Fwww.example.com%2Fbase%2Fadd-product";
-
// Act
var result = await runtime.RequestAccessToken(tokenOptions);
@@ -317,8 +321,10 @@ public class RemoteAuthenticationServiceTests
Assert.False(result.TryGetToken(out var token));
Assert.Null(token);
- Assert.Equal(result.Status, Enum.Parse<AccessTokenResultStatus>(testJsRuntime.GetAccessTokenResult.Status, ignoreCase: true));
- Assert.Equal(expectedRedirectUrl, result.RedirectUrl);
+ Assert.Equal(result.Status, testJsRuntime.GetAccessTokenResult.Status);
+ Assert.Equal("login", result.InteractiveRequestUrl);
+ Assert.Equal("https://www.example.com/base/add-product", result.InteractionOptions.ReturnUrl);
+ Assert.Equal(new[] { "something" }, result.InteractionOptions.Scopes);
Assert.Equal(tokenOptions, (AccessTokenRequestOptions)testJsRuntime.PastInvocations[^1].args[0]);
}
@@ -332,12 +338,13 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var state = new RemoteAuthenticationState();
testJsRuntime.GetAccessTokenResult = new InternalAccessTokenResult
{
- Status = "requiresRedirect",
+ Status = AccessTokenResultStatus.RequiresRedirect,
};
var tokenOptions = new AccessTokenRequestOptions
@@ -346,8 +353,6 @@ public class RemoteAuthenticationServiceTests
ReturnUrl = "https://www.example.com/base/add-saved-product/123413241234"
};
- var expectedRedirectUrl = "https://www.example.com/base/login?returnUrl=https%3A%2F%2Fwww.example.com%2Fbase%2Fadd-saved-product%2F123413241234";
-
// Act
var result = await runtime.RequestAccessToken(tokenOptions);
@@ -358,8 +363,10 @@ public class RemoteAuthenticationServiceTests
Assert.False(result.TryGetToken(out var token));
Assert.Null(token);
- Assert.Equal(result.Status, Enum.Parse<AccessTokenResultStatus>(testJsRuntime.GetAccessTokenResult.Status, ignoreCase: true));
- Assert.Equal(expectedRedirectUrl, result.RedirectUrl);
+ Assert.Equal(result.Status, testJsRuntime.GetAccessTokenResult.Status);
+ Assert.Equal("login", result.InteractiveRequestUrl);
+ Assert.Equal("https://www.example.com/base/add-saved-product/123413241234", result.InteractionOptions.ReturnUrl);
+ Assert.Equal(new[] { "something" }, result.InteractionOptions.Scopes);
Assert.Equal(tokenOptions, (AccessTokenRequestOptions)testJsRuntime.PastInvocations[^1].args[0]);
}
@@ -373,7 +380,8 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()));
+ new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
testJsRuntime.GetUserResult = default;
@@ -400,7 +408,8 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new TestAccountClaimsPrincipalFactory(Mock.Of<IAccessTokenProviderAccessor>()));
+ new TestAccountClaimsPrincipalFactory(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var account = new CoolRoleAccount
{
@@ -436,7 +445,8 @@ public class RemoteAuthenticationServiceTests
testJsRuntime,
options,
new TestNavigationManager(),
- new TestAccountClaimsPrincipalFactory(Mock.Of<IAccessTokenProviderAccessor>()));
+ new TestAccountClaimsPrincipalFactory(Mock.Of<IAccessTokenProviderAccessor>()),
+ null);
var account = new CoolRoleAccount
{
@@ -450,7 +460,7 @@ public class RemoteAuthenticationServiceTests
testJsRuntime.GetUserResult = account;
testJsRuntime.GetAccessTokenResult = new InternalAccessTokenResult
{
- Status = "success",
+ Status = AccessTokenResultStatus.Success,
Token = new AccessToken
{
Value = "1234",
@@ -509,13 +519,13 @@ public class RemoteAuthenticationServiceTests
{
public IList<(string identifier, object[] args)> PastInvocations { get; set; } = new List<(string, object[])>();
- public InternalRemoteAuthenticationResult<RemoteAuthenticationState> SignInResult { get; set; }
+ public RemoteAuthenticationResult<RemoteAuthenticationState> SignInResult { get; set; }
- public InternalRemoteAuthenticationResult<RemoteAuthenticationState> CompleteSignInResult { get; set; }
+ public RemoteAuthenticationResult<RemoteAuthenticationState> CompleteSignInResult { get; set; }
- public InternalRemoteAuthenticationResult<RemoteAuthenticationState> SignOutResult { get; set; }
+ public RemoteAuthenticationResult<RemoteAuthenticationState> SignOutResult { get; set; }
- public InternalRemoteAuthenticationResult<RemoteAuthenticationState> CompleteSignOutResult { get; set; }
+ public RemoteAuthenticationResult<RemoteAuthenticationState> CompleteSignOutResult { get; set; }
public InternalAccessTokenResult GetAccessTokenResult { get; set; }
diff --git a/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticatorCoreTests.cs b/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticatorCoreTests.cs
index 46fa7e2106..e6a7e7a296 100644
--- a/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticatorCoreTests.cs
+++ b/src/Components/WebAssembly/WebAssembly.Authentication/test/RemoteAuthenticatorCoreTests.cs
@@ -7,7 +7,9 @@ using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Components.RenderTree;
using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.Options;
using Microsoft.JSInterop;
using Moq;
@@ -39,8 +41,9 @@ public class RemoteAuthenticatorCoreTests
public async Task AuthenticationManager_Login_NavigatesToReturnUrlOnSuccess()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/login?returnUrl=https://www.example.com/base/fetchData");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/login",
+ new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
authServiceMock.SignInCallback = _ => Task.FromResult(new RemoteAuthenticationResult<RemoteAuthenticationState>()
{
@@ -57,15 +60,17 @@ public class RemoteAuthenticatorCoreTests
await renderer.Dispatcher.InvokeAsync<object>(() => remoteAuthenticator.SetParametersAsync(parameters));
// Assert
- Assert.Equal("https://www.example.com/base/fetchData", jsRuntime.LastInvocation.args[0]);
+ Assert.Equal("https://www.example.com/base/fetchData", remoteAuthenticator.Navigation.Uri);
}
[Fact]
public async Task AuthenticationManager_Login_DoesNothingOnRedirect()
{
// Arrange
- var originalUrl = "https://www.example.com/base/authentication/login?returnUrl=https://www.example.com/base/fetchData";
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(originalUrl);
+ var originalUrl = "https://www.example.com/base/authentication/login";
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ originalUrl,
+ new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
authServiceMock.SignInCallback = s => Task.FromResult(new RemoteAuthenticationResult<RemoteAuthenticationState>()
{
@@ -90,13 +95,14 @@ public class RemoteAuthenticatorCoreTests
public async Task AuthenticationManager_Login_NavigatesToLoginFailureOnError()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/login?returnUrl=https://www.example.com/base/fetchData");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/login",
+ new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
authServiceMock.SignInCallback = s => Task.FromResult(new RemoteAuthenticationResult<RemoteAuthenticationState>()
{
Status = RemoteAuthenticationStatus.Failure,
- ErrorMessage = "There was an error trying to log in"
+ ErrorMessage = "There was an error trying to log in."
});
var parameters = ParameterView.FromDictionary(new Dictionary<string, object>
@@ -109,14 +115,15 @@ public class RemoteAuthenticatorCoreTests
// Assert
Assert.Equal("https://www.example.com/base/authentication/login-failed", remoteAuthenticator.Navigation.Uri.ToString());
+ Assert.Equal("There was an error trying to log in.", remoteAuthenticator.Navigation.HistoryEntryState);
}
[Fact]
public async Task AuthenticationManager_LoginCallback_ThrowsOnRedirectResult()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/login?returnUrl=https://www.example.com/base/fetchData");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/");
authServiceMock.CompleteSignInCallback = s => Task.FromResult(new RemoteAuthenticationResult<RemoteAuthenticationState>()
{
@@ -141,7 +148,7 @@ public class RemoteAuthenticatorCoreTests
{
// Arrange
var originalUrl = "https://www.example.com/base/authentication/login-callback?code=1234";
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
originalUrl);
authServiceMock.CompleteSignInCallback = s => Task.FromResult(new RemoteAuthenticationResult<RemoteAuthenticationState>()
@@ -159,14 +166,13 @@ public class RemoteAuthenticatorCoreTests
// Assert
Assert.Equal(originalUrl, remoteAuthenticator.Navigation.Uri);
-
}
[Fact]
public async Task AuthenticationManager_LoginCallback_NavigatesToReturnUrlFromStateOnSuccess()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
"https://www.example.com/base/authentication/login-callback?code=1234");
var fetchDataUrl = "https://www.example.com/base/fetchData";
@@ -192,16 +198,15 @@ public class RemoteAuthenticatorCoreTests
await renderer.Dispatcher.InvokeAsync<object>(() => remoteAuthenticator.SetParametersAsync(parameters));
// Assert
- Assert.Equal(fetchDataUrl, jsRuntime.LastInvocation.args[0]);
+ Assert.Equal(fetchDataUrl, remoteAuthenticator.Navigation.Uri);
Assert.True(loggingSucceededCalled);
-
}
[Fact]
public async Task AuthenticationManager_LoginCallback_NavigatesToLoginFailureOnError()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
"https://www.example.com/base/authentication/login-callback?code=1234");
var fetchDataUrl = "https://www.example.com/base/fetchData";
@@ -223,17 +228,21 @@ public class RemoteAuthenticatorCoreTests
// Assert
Assert.Equal(
- "https://www.example.com/base/authentication/login-failed?message=There was an error trying to log in",
- jsRuntime.LastInvocation.args[0]);
+ "https://www.example.com/base/authentication/login-failed",
+ remoteAuthenticator.Navigation.Uri);
+ Assert.Equal(
+ "There was an error trying to log in",
+ ((TestNavigationManager)remoteAuthenticator.Navigation).HistoryEntryState);
}
[Fact]
public async Task AuthenticationManager_Logout_NavigatesToReturnUrlOnSuccess()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/logout?returnUrl=https://www.example.com/base/");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/logout",
+ new InteractiveRequestOptions { Interaction = InteractionType.SignOut, ReturnUrl = "https://www.example.com/base/" }.ToState());
authServiceMock.GetAuthenticatedUserCallback = () => new ValueTask<ClaimsPrincipal>(new ClaimsPrincipal(new ClaimsIdentity("Test")));
@@ -252,14 +261,14 @@ public class RemoteAuthenticatorCoreTests
await renderer.Dispatcher.InvokeAsync<object>(() => remoteAuthenticator.SetParametersAsync(parameters));
// Assert
- Assert.Equal("https://www.example.com/base/", jsRuntime.LastInvocation.args[0]);
+ Assert.Equal("https://www.example.com/base/", remoteAuthenticator.Navigation.Uri);
}
[Fact]
public async Task AuthenticationManager_Logout_NavigatesToDefaultReturnUrlWhenNoReturnUrlIsPresent()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
"https://www.example.com/base/authentication/logout");
authServiceMock.GetAuthenticatedUserCallback = () => new ValueTask<ClaimsPrincipal>(new ClaimsPrincipal(new ClaimsIdentity("Test")));
@@ -279,15 +288,17 @@ public class RemoteAuthenticatorCoreTests
await renderer.Dispatcher.InvokeAsync<object>(() => remoteAuthenticator.SetParametersAsync(parameters));
// Assert
- Assert.Equal("https://www.example.com/base/authentication/logged-out", jsRuntime.LastInvocation.args[0]);
+ Assert.Equal("https://www.example.com/base/authentication/logged-out", remoteAuthenticator.Navigation.Uri);
}
[Fact]
public async Task AuthenticationManager_Logout_DoesNothingOnRedirect()
{
// Arrange
- var originalUrl = "https://www.example.com/base/authentication/login?returnUrl=https://www.example.com/base/fetchData";
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(originalUrl);
+ var originalUrl = "https://www.example.com/base/authentication/login";
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ originalUrl,
+ new InteractiveRequestOptions { Interaction = InteractionType.SignOut, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
authServiceMock.GetAuthenticatedUserCallback = () => new ValueTask<ClaimsPrincipal>(new ClaimsPrincipal(new ClaimsIdentity("Test")));
@@ -314,8 +325,9 @@ public class RemoteAuthenticatorCoreTests
public async Task AuthenticationManager_Logout_RedirectsToFailureOnInvalidSignOutState()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/logout?returnUrl=https://www.example.com/base/fetchData");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/logout",
+ new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
if (remoteAuthenticator.SignOutManager is TestSignOutSessionStateManager testManager)
{
@@ -332,16 +344,21 @@ public class RemoteAuthenticatorCoreTests
// Assert
Assert.Equal(
- "https://www.example.com/base/authentication/logout-failed?message=The%20logout%20was%20not%20initiated%20from%20within%20the%20page.",
+ "https://www.example.com/base/authentication/logout-failed",
remoteAuthenticator.Navigation.Uri);
+
+ Assert.Equal(
+ "The logout was not initiated from within the page.",
+ ((TestNavigationManager)remoteAuthenticator.Navigation).HistoryEntryState);
}
[Fact]
public async Task AuthenticationManager_Logout_NavigatesToLogoutFailureOnError()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/logout?returnUrl=https://www.example.com/base/fetchData");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/logout",
+ new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
authServiceMock.GetAuthenticatedUserCallback = () => new ValueTask<ClaimsPrincipal>(new ClaimsPrincipal(new ClaimsIdentity("Test")));
@@ -367,8 +384,9 @@ public class RemoteAuthenticatorCoreTests
public async Task AuthenticationManager_LogoutCallback_ThrowsOnRedirectResult()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
- "https://www.example.com/base/authentication/logout-callback?returnUrl=https://www.example.com/base/fetchData");
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
+ "https://www.example.com/base/authentication/logout-callback",
+ new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = "https://www.example.com/base/fetchData" }.ToState());
var parameters = ParameterView.FromDictionary(new Dictionary<string, object>
{
@@ -393,7 +411,7 @@ public class RemoteAuthenticatorCoreTests
{
// Arrange
var originalUrl = "https://www.example.com/base/authentication/logout-callback?code=1234";
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
originalUrl);
authServiceMock.CompleteSignOutCallback = s => Task.FromResult(new RemoteAuthenticationResult<RemoteAuthenticationState>()
@@ -417,7 +435,7 @@ public class RemoteAuthenticatorCoreTests
public async Task AuthenticationManager_LogoutCallback_NavigatesToReturnUrlFromStateOnSuccess()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
"https://www.example.com/base/authentication/logout-callback-callback?code=1234");
var fetchDataUrl = "https://www.example.com/base/fetchData";
@@ -443,7 +461,7 @@ public class RemoteAuthenticatorCoreTests
await renderer.Dispatcher.InvokeAsync<object>(() => remoteAuthenticator.SetParametersAsync(parameters));
// Assert
- Assert.Equal(fetchDataUrl, jsRuntime.LastInvocation.args[0]);
+ Assert.Equal(fetchDataUrl, remoteAuthenticator.Navigation.Uri);
Assert.True(loggingOutSucceededCalled);
}
@@ -452,7 +470,7 @@ public class RemoteAuthenticatorCoreTests
public async Task AuthenticationManager_LogoutCallback_NavigatesToLoginFailureOnError()
{
// Arrange
- var (remoteAuthenticator, renderer, authServiceMock, jsRuntime) = CreateAuthenticationManager(
+ var (remoteAuthenticator, renderer, authServiceMock) = CreateAuthenticationManager(
"https://www.example.com/base/authentication/logout-callback?code=1234");
var fetchDataUrl = "https://www.example.com/base/fetchData";
@@ -474,9 +492,12 @@ public class RemoteAuthenticatorCoreTests
// Assert
Assert.Equal(
- "https://www.example.com/base/authentication/logout-failed?message=There was an error trying to log out",
- jsRuntime.LastInvocation.args[0]);
+ "https://www.example.com/base/authentication/logout-failed",
+ remoteAuthenticator.Navigation.Uri);
+ Assert.Equal(
+ "There was an error trying to log out",
+ ((TestNavigationManager)remoteAuthenticator.Navigation).HistoryEntryState);
}
public static TheoryData<UIValidator> DisplaysRightUIData { get; } = new TheoryData<UIValidator>
@@ -524,7 +545,10 @@ public class RemoteAuthenticatorCoreTests
{
// Arrange
var renderer = new TestRenderer(new ServiceCollection().BuildServiceProvider());
- var authenticator = new TestRemoteAuthenticatorView();
+ var testNavigationManager = new TestNavigationManager("https://www.example.com/", "Some error message.", "https://www.example.com/");
+ var logger = new TestLoggerFactory(new TestSink(), false).CreateLogger<RemoteAuthenticatorViewCore<RemoteAuthenticationState>>();
+ var authenticator = new TestRemoteAuthenticatorView(testNavigationManager);
+ authenticator.Logger = logger;
renderer.Attach(authenticator);
validator.SetupFakeRender(authenticator);
@@ -546,7 +570,10 @@ public class RemoteAuthenticatorCoreTests
{
// Arrange
var renderer = new TestRenderer(new ServiceCollection().BuildServiceProvider());
- var authenticator = new TestRemoteAuthenticatorView(new RemoteAuthenticationApplicationPathsOptions());
+ var testNavigationManager = new TestNavigationManager("https://www.example.com/", "Some error message.", "https://www.example.com/");
+ var logger = new TestLoggerFactory(new TestSink(), false).CreateLogger<RemoteAuthenticatorViewCore<RemoteAuthenticationState>>();
+ var authenticator = new TestRemoteAuthenticatorView(new RemoteAuthenticationApplicationPathsOptions(), testNavigationManager);
+ authenticator.Logger = logger;
renderer.Attach(authenticator);
validator.SetupFakeRender(authenticator);
@@ -587,8 +614,10 @@ public class RemoteAuthenticatorCoreTests
{
// Arrange
var renderer = new TestRenderer(new ServiceCollection().BuildServiceProvider());
- var jsRuntime = new TestJsRuntime();
- var authenticator = new TestRemoteAuthenticatorView(new RemoteAuthenticationApplicationPathsOptions(), jsRuntime);
+ var testNavigationManager = new TestNavigationManager("https://www.example.com/", "Some error message.", "https://www.example.com/");
+ var logger = new TestLoggerFactory(new TestSink(), false).CreateLogger<RemoteAuthenticatorViewCore<RemoteAuthenticationState>>();
+ var authenticator = new TestRemoteAuthenticatorView(new RemoteAuthenticationApplicationPathsOptions(), testNavigationManager);
+ authenticator.Logger = logger;
renderer.Attach(authenticator);
var parameters = ParameterView.FromDictionary(new Dictionary<string, object>
@@ -605,7 +634,6 @@ public class RemoteAuthenticatorCoreTests
// Assert
Assert.True(validator.WasCalled);
Assert.Equal(methodName, validator.OriginalRender.Method.Name);
- Assert.Equal(default, jsRuntime.LastInvocation);
}
public class UIValidator
@@ -626,19 +654,22 @@ public class RemoteAuthenticatorCoreTests
private static
(RemoteAuthenticatorViewCore<RemoteAuthenticationState> manager,
TestRenderer renderer,
- TestRemoteAuthenticationService authenticationServiceMock,
- TestJsRuntime js)
+ TestRemoteAuthenticationService authenticationServiceMock)
CreateAuthenticationManager(
string currentUri,
+ string currentState = null,
string baseUri = "https://www.example.com/base/")
{
var renderer = new TestRenderer(new ServiceCollection().BuildServiceProvider());
+ var logger = new TestLoggerFactory(new TestSink(), false).CreateLogger<RemoteAuthenticatorViewCore<RemoteAuthenticationState>>();
var remoteAuthenticator = new RemoteAuthenticatorViewCore<RemoteAuthenticationState>();
+ remoteAuthenticator.Logger = logger;
renderer.Attach(remoteAuthenticator);
var navigationManager = new TestNavigationManager(
baseUri,
+ currentState,
currentUri);
remoteAuthenticator.Navigation = navigationManager;
@@ -655,24 +686,34 @@ public class RemoteAuthenticatorCoreTests
remoteAuthenticator.AuthenticationService = authenticationServiceMock;
remoteAuthenticator.AuthenticationProvider = authenticationServiceMock;
- remoteAuthenticator.JS = jsRuntime;
- return (remoteAuthenticator, renderer, authenticationServiceMock, jsRuntime);
+ return (remoteAuthenticator, renderer, authenticationServiceMock);
}
private class TestNavigationManager : NavigationManager
{
- public TestNavigationManager(string baseUrl, string currentUrl) => Initialize(baseUrl, currentUrl);
+ public TestNavigationManager(string baseUrl, string currentState, string currentUrl)
+ {
+ Initialize(baseUrl, currentUrl);
+ HistoryEntryState = currentState;
+ }
protected override void NavigateToCore(string uri, bool forceLoad)
=> Uri = System.Uri.IsWellFormedUriString(uri, UriKind.Absolute) ? uri : new Uri(new Uri(BaseUri), uri).ToString();
+
+ protected override void NavigateToCore(string uri, NavigationOptions options)
+ {
+ Uri = System.Uri.IsWellFormedUriString(uri, UriKind.Absolute) ? uri : new Uri(new Uri(BaseUri), uri).ToString();
+ HistoryEntryState = options.HistoryEntryState;
+ }
}
+#pragma warning disable CS0618 // Type or member is obsolete, we keep it for now for backwards compatibility
private class TestSignOutSessionStateManager : SignOutSessionStateManager
+#pragma warning restore CS0618 // Type or member is obsolete, we keep it for now for backwards compatibility
{
public TestSignOutSessionStateManager() : base(null)
{
}
-
public bool SignOutState { get; set; } = true;
public override ValueTask SetSignOutState()
@@ -703,18 +744,27 @@ public class RemoteAuthenticatorCoreTests
public class TestRemoteAuthenticatorView : RemoteAuthenticatorViewCore<RemoteAuthenticationState>
{
public TestRemoteAuthenticatorView()
+ : this(new RemoteAuthenticationApplicationPathsOptions()
+ {
+ RemoteProfilePath = "Identity/Account/Manage",
+ RemoteRegisterPath = "Identity/Account/Register",
+ }, null)
{
- ApplicationPaths = new RemoteAuthenticationApplicationPathsOptions()
+ }
+
+ public TestRemoteAuthenticatorView(NavigationManager manager)
+ : this(new RemoteAuthenticationApplicationPathsOptions()
{
RemoteProfilePath = "Identity/Account/Manage",
RemoteRegisterPath = "Identity/Account/Register",
- };
+ }, manager)
+ {
}
- public TestRemoteAuthenticatorView(RemoteAuthenticationApplicationPathsOptions applicationPaths, IJSRuntime jsRuntime = default)
+ public TestRemoteAuthenticatorView(RemoteAuthenticationApplicationPathsOptions applicationPaths, NavigationManager testNavigationManager)
{
ApplicationPaths = applicationPaths;
- JS = jsRuntime;
+ Navigation = testNavigationManager;
}
protected override Task OnParametersSetAsync()
@@ -734,7 +784,7 @@ public class RemoteAuthenticatorCoreTests
IJSRuntime jsRuntime,
IOptionsSnapshot<RemoteAuthenticationOptions<OidcProviderOptions>> options,
TestNavigationManager navigationManager) :
- base(jsRuntime, options, navigationManager, new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()))
+ base(jsRuntime, options, navigationManager, new AccountClaimsPrincipalFactory<RemoteUserAccount>(Mock.Of<IAccessTokenProviderAccessor>()), null)
{
}
diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/LoggingBuilder.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/LoggingBuilder.cs
index 9dea10d7eb..38fbb95ce7 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Hosting/LoggingBuilder.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/LoggingBuilder.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting;
-internal class LoggingBuilder : ILoggingBuilder
+internal sealed class LoggingBuilder : ILoggingBuilder
{
public LoggingBuilder(IServiceCollection services)
{
diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/RegisteredComponentsInterop.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/RegisteredComponentsInterop.cs
index 3ce64e50d7..72434e7e4d 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Hosting/RegisteredComponentsInterop.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/RegisteredComponentsInterop.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting;
-internal class RegisteredComponentsInterop
+internal sealed class RegisteredComponentsInterop
{
private const string Prefix = "Blazor._internal.registeredComponents.";
diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs
index 13f8edca31..331cbb8e7a 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyCultureProvider.cs
@@ -10,7 +10,9 @@ using Microsoft.JSInterop;
namespace Microsoft.AspNetCore.Components.WebAssembly.Hosting;
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "This type loads resx files. We don't expect it's dependencies to be trimmed in the ordinary case.")]
+#pragma warning disable CA1852 // Seal internal types
internal class WebAssemblyCultureProvider
+#pragma warning restore CA1852 // Seal internal types
{
internal const string GetSatelliteAssemblies = "window.Blazor._internal.getSatelliteAssemblies";
internal const string ReadSatelliteAssemblies = "window.Blazor._internal.readSatelliteAssemblies";
@@ -72,6 +74,7 @@ internal class WebAssemblyCultureProvider
// assemblies. We effectively want to resovle a Task<byte[][]> but there is no way to express this
// using interop. We'll instead do this in two parts:
// getSatelliteAssemblies resolves when all satellite assemblies to be loaded in .NET are fetched and available in memory.
+#pragma warning disable CS0618 // Type or member is obsolete
var count = (int)await _invoker.InvokeUnmarshalled<string[], object?, object?, Task<object>>(
GetSatelliteAssemblies,
culturesToLoad.ToArray(),
@@ -89,6 +92,7 @@ internal class WebAssemblyCultureProvider
null,
null,
null);
+#pragma warning restore CS0618 // Type or member is obsolete
for (var i = 0; i < assemblies.Length; i++)
{
diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHost.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHost.cs
index be4bb94015..fdc1ffbf56 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHost.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHost.cs
@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Components.Web.Infrastructure;
using Microsoft.AspNetCore.Components.WebAssembly.HotReload;
using Microsoft.AspNetCore.Components.WebAssembly.Infrastructure;
using Microsoft.AspNetCore.Components.WebAssembly.Rendering;
+using Microsoft.AspNetCore.Components.WebAssembly.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
@@ -148,6 +149,8 @@ public sealed class WebAssemblyHost : IAsyncDisposable
var jsComponentInterop = new JSComponentInterop(_rootComponents.JSComponents);
_renderer = new WebAssemblyRenderer(Services, loggerFactory, jsComponentInterop);
+ WebAssemblyNavigationManager.Instance.CreateLogger(loggerFactory);
+
var initializationTcs = new TaskCompletionSource();
WebAssemblyCallQueue.Schedule((_rootComponents, _renderer, initializationTcs), static async state =>
{
diff --git a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs
index ab0e444230..8b03d2d2da 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Hosting/WebAssemblyHostBuilder.cs
@@ -36,6 +36,7 @@ public sealed class WebAssemblyHostBuilder
/// <param name="args">The argument passed to the application's main method.</param>
/// <returns>A <see cref="WebAssemblyHostBuilder"/>.</returns>
[DynamicDependency(nameof(JSInteropMethods.NotifyLocationChanged), typeof(JSInteropMethods))]
+ [DynamicDependency(nameof(JSInteropMethods.NotifyLocationChangingAsync), typeof(JSInteropMethods))]
[DynamicDependency(JsonSerialized, typeof(WebEventDescriptor))]
// The following dependency prevents HeadOutlet from getting trimmed away in
// WebAssembly prerendered apps.
@@ -87,8 +88,10 @@ public sealed class WebAssemblyHostBuilder
};
}
+ [UnconditionalSuppressMessage("Trimming", "IL2072", Justification = "Root components are expected to be defined in assemblies that do not get trimmed.")]
private void InitializeRegisteredRootComponents(IJSUnmarshalledRuntime jsRuntime)
{
+#pragma warning disable CS0618 // Type or member is obsolete
var componentsCount = jsRuntime.InvokeUnmarshalled<int>(RegisteredComponentsInterop.GetRegisteredComponentsCount);
if (componentsCount == 0)
{
@@ -105,6 +108,7 @@ public sealed class WebAssemblyHostBuilder
var serializedParameterValues = jsRuntime.InvokeUnmarshalled<int, object?, object?, string>(RegisteredComponentsInterop.GetParameterValues, id, null, null);
registeredComponents[i] = new WebAssemblyComponentMarker(WebAssemblyComponentMarker.ClientMarkerType, assembly, typeName, serializedParameterDefinitions, serializedParameterValues, id.ToString(CultureInfo.InvariantCulture));
}
+#pragma warning restore CS0618 // Type or member is obsolete
var componentDeserializer = WebAssemblyComponentParameterDeserializer.Instance;
foreach (var registeredComponent in registeredComponents)
@@ -128,20 +132,26 @@ public sealed class WebAssemblyHostBuilder
private void InitializePersistedState(IJSUnmarshalledRuntime jsRuntime)
{
+#pragma warning disable CS0618 // Type or member is obsolete
_persistedState = jsRuntime.InvokeUnmarshalled<string>("Blazor._internal.getPersistedState");
+#pragma warning restore CS0618 // Type or member is obsolete
}
private static void InitializeNavigationManager(IJSUnmarshalledRuntime jsRuntime)
{
+#pragma warning disable CS0618 // Type or member is obsolete
var baseUri = jsRuntime.InvokeUnmarshalled<string>(BrowserNavigationManagerInterop.GetBaseUri);
var uri = jsRuntime.InvokeUnmarshalled<string>(BrowserNavigationManagerInterop.GetLocationHref);
+#pragma warning restore CS0618 // Type or member is obsolete
WebAssemblyNavigationManager.Instance = new WebAssemblyNavigationManager(baseUri, uri);
}
private WebAssemblyHostEnvironment InitializeEnvironment(IJSUnmarshalledRuntime jsRuntime)
{
+#pragma warning disable CS0618 // Type or member is obsolete
var applicationEnvironment = jsRuntime.InvokeUnmarshalled<string>("Blazor._internal.getApplicationEnvironment");
+#pragma warning restore CS0618 // Type or member is obsolete
var hostEnvironment = new WebAssemblyHostEnvironment(applicationEnvironment, WebAssemblyNavigationManager.Instance.BaseUri);
Services.AddSingleton<IWebAssemblyHostEnvironment>(hostEnvironment);
@@ -154,8 +164,10 @@ public sealed class WebAssemblyHostBuilder
foreach (var configFile in configFiles)
{
+#pragma warning disable CS0618 // Type or member is obsolete
var appSettingsJson = jsRuntime.InvokeUnmarshalled<string, byte[]>(
"Blazor._internal.getConfig", configFile);
+#pragma warning restore CS0618 // Type or member is obsolete
if (appSettingsJson != null)
{
diff --git a/src/Components/WebAssembly/WebAssembly/src/HotReload/HotReloadAgent.cs b/src/Components/WebAssembly/WebAssembly/src/HotReload/HotReloadAgent.cs
index 23fadd7d01..76606a3264 100644
--- a/src/Components/WebAssembly/WebAssembly/src/HotReload/HotReloadAgent.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/HotReload/HotReloadAgent.cs
@@ -4,6 +4,7 @@
// Based on the implementation in https://raw.githubusercontent.com/dotnet/sdk/aad0424c0bfaa60c8bd136a92fd131e53d14561a/src/BuiltInTools/DotNetDeltaApplier/HotReloadAgent.cs
using System.Collections.Concurrent;
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
@@ -12,6 +13,9 @@ namespace Microsoft.Extensions.HotReload;
internal sealed class HotReloadAgent : IDisposable
{
+ /// Flags for hot reload handler Types like MVC's HotReloadService.
+ private const DynamicallyAccessedMemberTypes HotReloadHandlerLinkerFlags = DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods;
+
private readonly Action<string> _log;
private readonly AssemblyLoadEventHandler _assemblyLoad;
private readonly ConcurrentDictionary<Guid, List<UpdateDelta>> _deltas = new();
@@ -48,6 +52,8 @@ internal sealed class HotReloadAgent : IDisposable
public List<Action<Type[]?>> UpdateApplication { get; } = new();
}
+ [UnconditionalSuppressMessage("Trimmer", "IL2072",
+ Justification = "The handlerType passed to GetHandlerActions is preserved by MetadataUpdateHandlerAttribute with DynamicallyAccessedMemberTypes.All.")]
private UpdateHandlerActions GetMetadataUpdateHandlerActions()
{
// We need to execute MetadataUpdateHandlers in a well-defined order. For v1, the strategy that is used is to topologically
@@ -83,7 +89,9 @@ internal sealed class HotReloadAgent : IDisposable
return handlerActions;
}
- internal void GetHandlerActions(UpdateHandlerActions handlerActions, Type handlerType)
+ internal void GetHandlerActions(
+ UpdateHandlerActions handlerActions,
+ [DynamicallyAccessedMembers(HotReloadHandlerLinkerFlags)] Type handlerType)
{
bool methodFound = false;
@@ -121,7 +129,7 @@ internal sealed class HotReloadAgent : IDisposable
};
}
- MethodInfo? GetUpdateMethod(Type handlerType, string name)
+ MethodInfo? GetUpdateMethod([DynamicallyAccessedMembers(HotReloadHandlerLinkerFlags)] Type handlerType, string name)
{
if (handlerType.GetMethod(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static, new[] { typeof(Type[]) }) is MethodInfo updateMethod &&
updateMethod.ReturnType == typeof(void))
@@ -153,6 +161,7 @@ internal sealed class HotReloadAgent : IDisposable
Visit(assemblies, assembly, sortedAssemblies, visited);
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Hot reload is only expected to work when trimming is disabled.")]
static void Visit(Assembly[] assemblies, Assembly assembly, List<Assembly> sortedAssemblies, HashSet<string> visited)
{
var assemblyIdentifier = assembly.GetName().Name!;
@@ -214,6 +223,7 @@ internal sealed class HotReloadAgent : IDisposable
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Hot reload is only expected to work when trimming is disabled.")]
private static Type[] GetMetadataUpdateTypes(IReadOnlyList<UpdateDelta> deltas)
{
List<Type>? types = null;
diff --git a/src/Components/WebAssembly/WebAssembly/src/HotReload/WebAssemblyHotReload.cs b/src/Components/WebAssembly/WebAssembly/src/HotReload/WebAssemblyHotReload.cs
index 7b8a0ba03b..3ea5c30f69 100644
--- a/src/Components/WebAssembly/WebAssembly/src/HotReload/WebAssemblyHotReload.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/HotReload/WebAssemblyHotReload.cs
@@ -35,7 +35,9 @@ public static class WebAssemblyHotReload
// See https://github.com/dotnet/aspnetcore/issues/37357#issuecomment-941237000
var jsObjectReference = (IJSUnmarshalledObjectReference)(await DefaultWebAssemblyJSRuntime.Instance.InvokeAsync<IJSObjectReference>("import", "/_framework/blazor-hotreload.js"));
+#pragma warning disable CS0618 // Type or member is obsolete
await jsObjectReference.InvokeUnmarshalled<Task<int>>("receiveHotReload");
+#pragma warning restore CS0618 // Type or member is obsolete
}
}
diff --git a/src/Components/WebAssembly/WebAssembly/src/Infrastructure/JSInteropMethods.cs b/src/Components/WebAssembly/WebAssembly/src/Infrastructure/JSInteropMethods.cs
index bd139229ac..12849698a8 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Infrastructure/JSInteropMethods.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Infrastructure/JSInteropMethods.cs
@@ -17,9 +17,25 @@ public static class JSInteropMethods
/// <summary>
/// For framework use only.
/// </summary>
- [JSInvokable(nameof(NotifyLocationChanged))]
+ [Obsolete("This API is for framework use only and is no longer used in the current version")]
public static void NotifyLocationChanged(string uri, bool isInterceptedLink)
+ => WebAssemblyNavigationManager.Instance.SetLocation(uri, null, isInterceptedLink);
+
+ /// <summary>
+ /// For framework use only.
+ /// </summary>
+ [JSInvokable(nameof(NotifyLocationChanged))]
+ public static void NotifyLocationChanged(string uri, string? state, bool isInterceptedLink)
+ {
+ WebAssemblyNavigationManager.Instance.SetLocation(uri, state, isInterceptedLink);
+ }
+
+ /// <summary>
+ /// For framework use only.
+ /// </summary>
+ [JSInvokable(nameof(NotifyLocationChangingAsync))]
+ public static async ValueTask<bool> NotifyLocationChangingAsync(string uri, string? state, bool isInterceptedLink)
{
- WebAssemblyNavigationManager.Instance.SetLocation(uri, isInterceptedLink);
+ return await WebAssemblyNavigationManager.Instance.HandleLocationChangingAsync(uri, state, isInterceptedLink);
}
}
diff --git a/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj b/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj
index f0652aab58..411872891e 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj
+++ b/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj
@@ -9,6 +9,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<Nullable>enable</Nullable>
<IsTrimmable>true</IsTrimmable>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Components/WebAssembly/WebAssembly/src/Prerendering/ClientComponentParameterDeserializer.cs b/src/Components/WebAssembly/WebAssembly/src/Prerendering/ClientComponentParameterDeserializer.cs
index 3406ae7de0..c4b0f4aa9e 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Prerendering/ClientComponentParameterDeserializer.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Prerendering/ClientComponentParameterDeserializer.cs
@@ -7,7 +7,7 @@ using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.AspNetCore.Components;
-internal class WebAssemblyComponentParameterDeserializer
+internal sealed class WebAssemblyComponentParameterDeserializer
{
private readonly ComponentParametersTypeCache _parametersCache;
@@ -19,6 +19,7 @@ internal class WebAssemblyComponentParameterDeserializer
public static WebAssemblyComponentParameterDeserializer Instance { get; } = new WebAssemblyComponentParameterDeserializer(new ComponentParametersTypeCache());
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to preserve component parameter types.")]
public ParameterView DeserializeParameters(IList<ComponentParameter> parametersDefinitions, IList<object> parameterValues)
{
var parametersDictionary = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase);
@@ -80,7 +81,7 @@ internal class WebAssemblyComponentParameterDeserializer
return JsonSerializer.Deserialize<ComponentParameter[]>(parametersDefinitions, WebAssemblyComponentSerializationSettings.JsonSerializationOptions)!;
}
- [RequiresUnreferencedCode("This API attempts to JSON deserialize types which might be trimmed.")]
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to preserve component parameter types.")]
public static IList<object> GetParameterValues(string parameterValues)
{
return JsonSerializer.Deserialize<IList<object>>(parameterValues, WebAssemblyComponentSerializationSettings.JsonSerializationOptions)!;
diff --git a/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Shipped.txt b/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Shipped.txt
index 6192c59390..cf4364e311 100644
--- a/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Shipped.txt
+++ b/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Shipped.txt
@@ -43,6 +43,7 @@ Microsoft.AspNetCore.Components.WebAssembly.Hosting.IWebAssemblyHostEnvironment
Microsoft.AspNetCore.Components.WebAssembly.Hosting.IWebAssemblyHostEnvironment.BaseAddress.get -> string!
Microsoft.AspNetCore.Components.WebAssembly.Hosting.IWebAssemblyHostEnvironment.Environment.get -> string!
Microsoft.AspNetCore.Components.WebAssembly.Hosting.RootComponentMapping
+Microsoft.AspNetCore.Components.WebAssembly.Hosting.RootComponentMapping.RootComponentMapping() -> void
Microsoft.AspNetCore.Components.WebAssembly.Hosting.RootComponentMapping.ComponentType.get -> System.Type!
Microsoft.AspNetCore.Components.WebAssembly.Hosting.RootComponentMapping.Parameters.get -> Microsoft.AspNetCore.Components.ParameterView
Microsoft.AspNetCore.Components.WebAssembly.Hosting.RootComponentMapping.RootComponentMapping(System.Type! componentType, string! selector) -> void
diff --git a/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Unshipped.txt b/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Unshipped.txt
index dddf59496a..764fbde31d 100644
--- a/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Unshipped.txt
+++ b/src/Components/WebAssembly/WebAssembly/src/PublicAPI.Unshipped.txt
@@ -1,3 +1,5 @@
#nullable enable
*REMOVED*static Microsoft.AspNetCore.Components.WebAssembly.HotReload.WebAssemblyHotReload.ApplyHotReloadDelta(string! moduleIdString, byte[]! metadataDelta, byte[]! ilDeta) -> void
static Microsoft.AspNetCore.Components.WebAssembly.HotReload.WebAssemblyHotReload.ApplyHotReloadDelta(string! moduleIdString, byte[]! metadataDelta, byte[]! ilDelta, byte[]! pdbBytes) -> void
+static Microsoft.AspNetCore.Components.WebAssembly.Infrastructure.JSInteropMethods.NotifyLocationChanged(string! uri, string? state, bool isInterceptedLink) -> void
+static Microsoft.AspNetCore.Components.WebAssembly.Infrastructure.JSInteropMethods.NotifyLocationChangingAsync(string! uri, string? state, bool isInterceptedLink) -> System.Threading.Tasks.ValueTask<bool>
diff --git a/src/Components/WebAssembly/WebAssembly/src/Rendering/NullDispatcher.cs b/src/Components/WebAssembly/WebAssembly/src/Rendering/NullDispatcher.cs
index ac79e04bf2..ecf4d98245 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Rendering/NullDispatcher.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Rendering/NullDispatcher.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Components.WebAssembly.Rendering;
-internal class NullDispatcher : Dispatcher
+internal sealed class NullDispatcher : Dispatcher
{
public static readonly Dispatcher Instance = new NullDispatcher();
diff --git a/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs b/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs
index 0f13779e57..0481c89aad 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Rendering/WebAssemblyRenderer.cs
@@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Rendering;
/// Provides mechanisms for rendering <see cref="IComponent"/> instances in a
/// web browser, dispatching events to them, and refreshing the UI as required.
/// </summary>
-internal partial class WebAssemblyRenderer : WebRenderer
+internal sealed partial class WebAssemblyRenderer : WebRenderer
{
private readonly ILogger _logger;
@@ -83,10 +83,12 @@ internal partial class WebAssemblyRenderer : WebRenderer
/// <inheritdoc />
protected override Task UpdateDisplayAsync(in RenderBatch batch)
{
+#pragma warning disable CS0618 // Type or member is obsolete
DefaultWebAssemblyJSRuntime.Instance.InvokeUnmarshalled<int, RenderBatch, object>(
"Blazor._internal.renderBatch",
RendererId,
batch);
+#pragma warning restore CS0618 // Type or member is obsolete
if (WebAssemblyCallQueue.HasUnstartedWork)
{
diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs b/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs
index f544f4a856..16ec802fbc 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Services/DefaultWebAssemblyJSRuntime.cs
@@ -86,7 +86,9 @@ internal sealed class DefaultWebAssemblyJSRuntime : WebAssemblyJSRuntime
/// <param name="id">Id of the byte array</param>
public static void NotifyByteArrayAvailable(int id)
{
+#pragma warning disable CS0618 // Type or member is obsolete
var data = Instance.InvokeUnmarshalled<byte[]>("Blazor._internal.retrieveByteArray");
+#pragma warning restore CS0618 // Type or member is obsolete
DotNetDispatcher.ReceiveByteArray(Instance, id, data);
}
diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/LazyAssemblyLoader.cs b/src/Components/WebAssembly/WebAssembly/src/Services/LazyAssemblyLoader.cs
index 69ea6388bb..e739793b9e 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Services/LazyAssemblyLoader.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Services/LazyAssemblyLoader.cs
@@ -105,9 +105,11 @@ public sealed class LazyAssemblyLoader
}
var jsRuntime = (IJSUnmarshalledRuntime)_jsRuntime;
+#pragma warning disable CS0618 // Type or member is obsolete
var count = (int)await jsRuntime.InvokeUnmarshalled<string[], Task<object>>(
GetLazyAssemblies,
newAssembliesToLoad.ToArray());
+#pragma warning restore CS0618 // Type or member is obsolete
if (count == 0)
{
@@ -115,8 +117,10 @@ public sealed class LazyAssemblyLoader
}
var loadedAssemblies = new List<Assembly>();
+#pragma warning disable CS0618 // Type or member is obsolete
var assemblies = jsRuntime.InvokeUnmarshalled<byte[][]>(ReadLazyAssemblies);
var pdbs = jsRuntime.InvokeUnmarshalled<byte[][]>(ReadLazyPDBs);
+#pragma warning restore CS0618 // Type or member is obsolete
for (int i = 0; i < assemblies.Length; i++)
{
diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLogger.cs b/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLogger.cs
index 39721ea8d5..c5a658be60 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLogger.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLogger.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Runtime.InteropServices.JavaScript;
using System.Text;
using Microsoft.Extensions.Logging;
using Microsoft.JSInterop;
@@ -9,7 +10,7 @@ using Microsoft.JSInterop.WebAssembly;
namespace Microsoft.AspNetCore.Components.WebAssembly.Services;
-internal class WebAssemblyConsoleLogger<T> : ILogger<T>, ILogger
+internal sealed class WebAssemblyConsoleLogger<T> : ILogger<T>, ILogger
{
private const string _loglevelPadding = ": ";
private static readonly string _messagePadding = new(' ', GetLogLevelString(LogLevel.Information).Length + _loglevelPadding.Length);
@@ -79,19 +80,19 @@ internal class WebAssemblyConsoleLogger<T> : ILogger<T>, ILogger
// messages if you enable "Verbose" in the filter dropdown (which is off
// by default). As such "console.debug" is the best choice for messages
// with a lower severity level than "Information".
- _jsRuntime.InvokeVoid("console.debug", formattedMessage);
+ ConsoleLoggerInterop.ConsoleDebug(formattedMessage);
break;
case LogLevel.Information:
- _jsRuntime.InvokeVoid("console.info", formattedMessage);
+ ConsoleLoggerInterop.ConsoleInfo(formattedMessage);
break;
case LogLevel.Warning:
- _jsRuntime.InvokeVoid("console.warn", formattedMessage);
+ ConsoleLoggerInterop.ConsoleWarn(formattedMessage);
break;
case LogLevel.Error:
- _jsRuntime.InvokeVoid("console.error", formattedMessage);
+ ConsoleLoggerInterop.ConsoleError(formattedMessage);
break;
case LogLevel.Critical:
- _jsRuntime.InvokeUnmarshalled<string, object>("Blazor._internal.dotNetCriticalError", formattedMessage);
+ ConsoleLoggerInterop.DotNetCriticalError(formattedMessage);
break;
default: // invalid enum values
Debug.Assert(logLevel != LogLevel.None, "This method is never called with LogLevel.None.");
@@ -158,10 +159,24 @@ internal class WebAssemblyConsoleLogger<T> : ILogger<T>, ILogger
}
}
- private class NoOpDisposable : IDisposable
+ private sealed class NoOpDisposable : IDisposable
{
public static NoOpDisposable Instance = new NoOpDisposable();
public void Dispose() { }
}
}
+
+internal static partial class ConsoleLoggerInterop
+{
+ [JSImport("globalThis.console.debug")]
+ public static partial void ConsoleDebug(string message);
+ [JSImport("globalThis.console.info")]
+ public static partial void ConsoleInfo(string message);
+ [JSImport("globalThis.console.warn")]
+ public static partial void ConsoleWarn(string message);
+ [JSImport("globalThis.console.error")]
+ public static partial void ConsoleError(string message);
+ [JSImport("Blazor._internal.dotNetCriticalError")]
+ public static partial void DotNetCriticalError(string message);
+}
diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLoggerProvider.cs b/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLoggerProvider.cs
index 476f9fb7a4..6d4c62213a 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLoggerProvider.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyConsoleLoggerProvider.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Services;
/// <summary>
/// A provider of <see cref="WebAssemblyConsoleLogger{T}"/> instances.
/// </summary>
-internal class WebAssemblyConsoleLoggerProvider : ILoggerProvider
+internal sealed class WebAssemblyConsoleLoggerProvider : ILoggerProvider
{
private readonly ConcurrentDictionary<string, WebAssemblyConsoleLogger<object>> _loggers;
private readonly WebAssemblyJSRuntime _jsRuntime;
diff --git a/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyNavigationManager.cs b/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyNavigationManager.cs
index 645624680e..c79c8a41e4 100644
--- a/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyNavigationManager.cs
+++ b/src/Components/WebAssembly/WebAssembly/src/Services/WebAssemblyNavigationManager.cs
@@ -2,6 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics.CodeAnalysis;
+using Microsoft.AspNetCore.Components.Routing;
+using Microsoft.Extensions.Logging;
using Microsoft.JSInterop;
using Interop = Microsoft.AspNetCore.Components.Web.BrowserNavigationManagerInterop;
@@ -10,8 +12,10 @@ namespace Microsoft.AspNetCore.Components.WebAssembly.Services;
/// <summary>
/// Default client-side implementation of <see cref="NavigationManager"/>.
/// </summary>
-internal class WebAssemblyNavigationManager : NavigationManager
+internal sealed partial class WebAssemblyNavigationManager : NavigationManager
{
+ private ILogger<WebAssemblyNavigationManager> _logger = default!;
+
/// <summary>
/// Gets the instance of <see cref="WebAssemblyNavigationManager"/>.
/// </summary>
@@ -22,12 +26,28 @@ internal class WebAssemblyNavigationManager : NavigationManager
Initialize(baseUri, uri);
}
- public void SetLocation(string uri, bool isInterceptedLink)
+ public void CreateLogger(ILoggerFactory loggerFactory)
+ {
+ if (_logger is not null)
+ {
+ throw new InvalidOperationException($"The {nameof(WebAssemblyNavigationManager)} has already created a logger.");
+ }
+
+ _logger = loggerFactory.CreateLogger<WebAssemblyNavigationManager>();
+ }
+
+ public void SetLocation(string uri, string? state, bool isInterceptedLink)
{
Uri = uri;
+ HistoryEntryState = state;
NotifyLocationChanged(isInterceptedLink);
}
+ public async ValueTask<bool> HandleLocationChangingAsync(string uri, string? state, bool intercepted)
+ {
+ return await NotifyLocationChangingAsync(uri, state, intercepted);
+ }
+
/// <inheritdoc />
[DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(NavigationOptions))]
protected override void NavigateToCore(string uri, NavigationOptions options)
@@ -37,6 +57,45 @@ internal class WebAssemblyNavigationManager : NavigationManager
throw new ArgumentNullException(nameof(uri));
}
- DefaultWebAssemblyJSRuntime.Instance.InvokeVoid(Interop.NavigateTo, uri, options);
+ _ = PerformNavigationAsync();
+
+ async Task PerformNavigationAsync()
+ {
+ try
+ {
+ var shouldContinueNavigation = await NotifyLocationChangingAsync(uri, options.HistoryEntryState, false);
+
+ if (!shouldContinueNavigation)
+ {
+ Log.NavigationCanceled(_logger, uri);
+ return;
+ }
+
+ DefaultWebAssemblyJSRuntime.Instance.InvokeVoid(Interop.NavigateTo, uri, options);
+ }
+ catch (Exception ex)
+ {
+ // We shouldn't ever reach this since exceptions thrown from handlers are handled in HandleLocationChangingHandlerException.
+ // But if some other exception gets thrown, we still want to know about it.
+ Log.NavigationFailed(_logger, uri, ex);
+ }
+ }
+ }
+
+ protected override void HandleLocationChangingHandlerException(Exception ex, LocationChangingContext context)
+ {
+ Log.NavigationFailed(_logger, context.TargetLocation, ex);
+ }
+
+ protected override void SetNavigationLockState(bool value)
+ => DefaultWebAssemblyJSRuntime.Instance.InvokeVoid(Interop.SetHasLocationChangingListeners, value);
+
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Debug, "Navigation canceled when changing the location to {Uri}", EventName = "NavigationCanceled")]
+ public static partial void NavigationCanceled(ILogger logger, string uri);
+
+ [LoggerMessage(2, LogLevel.Error, "Navigation failed when changing the location to {Uri}", EventName = "NavigationFailed")]
+ public static partial void NavigationFailed(ILogger logger, string uri, Exception exception);
}
}
diff --git a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs
index 4239f3ad59..9f182ef17a 100644
--- a/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs
+++ b/src/Components/WebAssembly/WebAssembly/test/Hosting/WebAssemblyCultureProviderTest.cs
@@ -33,6 +33,7 @@ public class WebAssemblyCultureProviderTest
// Arrange
using var cultureReplacer = new CultureReplacer("en-GB");
var invoker = new Mock<IJSUnmarshalledRuntime>();
+#pragma warning disable CS0618 // Type or member is obsolete
invoker.Setup(i => i.InvokeUnmarshalled<string[], object, object, Task<object>>(GetSatelliteAssemblies, new[] { "en-GB", "en" }, null, null))
.Returns(Task.FromResult<object>(1))
.Verifiable();
@@ -40,6 +41,7 @@ public class WebAssemblyCultureProviderTest
invoker.Setup(i => i.InvokeUnmarshalled<object, object, object, object[]>(ReadSatelliteAssemblies, null, null, null))
.Returns(new object[] { File.ReadAllBytes(GetType().Assembly.Location) })
.Verifiable();
+#pragma warning restore CS0618 // Type or member is obsolete
var loader = new WebAssemblyCultureProvider(invoker.Object, CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture);
@@ -56,17 +58,21 @@ public class WebAssemblyCultureProviderTest
// Arrange
using var cultureReplacer = new CultureReplacer("en-GB");
var invoker = new Mock<IJSUnmarshalledRuntime>();
+#pragma warning disable CS0618 // Type or member is obsolete
invoker.Setup(i => i.InvokeUnmarshalled<string[], object, object, Task<object>>(GetSatelliteAssemblies, new[] { "en-GB", "en" }, null, null))
.Returns(Task.FromResult<object>(0))
.Verifiable();
+#pragma warning restore CS0618 // Type or member is obsolete
var loader = new WebAssemblyCultureProvider(invoker.Object, CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture);
// Act
await loader.LoadCurrentCultureResourcesAsync();
+#pragma warning disable CS0618 // Type or member is obsolete
// Assert
invoker.Verify(i => i.InvokeUnmarshalled<object, object, object, object[]>(ReadSatelliteAssemblies, null, null, null), Times.Never());
+#pragma warning restore CS0618 // Type or member is obsolete
}
[Fact]
diff --git a/src/Components/WebAssembly/WebAssembly/test/JSObjectReferenceJsonConverterTest.cs b/src/Components/WebAssembly/WebAssembly/test/JSObjectReferenceJsonConverterTest.cs
index 7e94558d44..ca2e50bd96 100644
--- a/src/Components/WebAssembly/WebAssembly/test/JSObjectReferenceJsonConverterTest.cs
+++ b/src/Components/WebAssembly/WebAssembly/test/JSObjectReferenceJsonConverterTest.cs
@@ -18,6 +18,20 @@ public class JSObjectReferenceJsonConverterTest
}
[Fact]
+ public void Read_ReadsJson_IJSObjectReference()
+ {
+ // Arrange
+ var expectedId = 3;
+ var json = $"{{\"__jsObjectId\":{expectedId}}}";
+
+ // Act
+ var deserialized = (JSObjectReference)JsonSerializer.Deserialize<IJSObjectReference>(json, JsonSerializerOptions)!;
+
+ // Assert
+ Assert.Equal(expectedId, deserialized?.Id);
+ }
+
+ [Fact]
public void Read_ReadsJson_IJSInProcessObjectReference()
{
// Arrange
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/Token.razor b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/Token.razor
new file mode 100644
index 0000000000..8c68a55273
--- /dev/null
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/Token.razor
@@ -0,0 +1,77 @@
+@page "/Token"
+@using System.Text.Json
+@using System.Security.Claims
+@using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
+
+@inject IAccessTokenProvider AuthorizationService
+@inject NavigationManager Navigation
+
+@if (!_loading)
+{
+ <h2>Access token for the user</h2>
+ <p id="access-token">@AccessToken?.Value</p>
+
+ <h2>Access token claims</h2>
+ @foreach (var claim in GetAccessTokenClaims())
+ {
+ <p>@(claim.Key): @claim.Value.ToString()</p>
+ }
+
+ @if (AccessToken != null)
+ {
+ <h2>Access token expires</h2>
+ <p>Current time: <span id="current-time">@DateTimeOffset.Now</span></p>
+ <p id="access-token-expires">@AccessToken.Expires</p>
+
+ <h2>Access token granted scopes (as reported by the API)</h2>
+ @foreach (var scope in AccessToken.GrantedScopes)
+ {
+ <p>Scope: @scope</p>
+ }
+ }
+}
+else
+{
+ <div>Loading user data...</div>
+}
+
+@code {
+ private bool _loading = true;
+ [CascadingParameter] private Task<AuthenticationState> AuthenticationState { get; set; }
+
+ public ClaimsPrincipal AuthenticatedUser { get; set; }
+ public AccessToken AccessToken { get; set; }
+
+ protected override async Task OnInitializedAsync()
+ {
+ var state = await AuthenticationState;
+ var accessTokenResult = await AuthorizationService.RequestAccessToken(new AccessTokenRequestOptions
+ {
+ Scopes = new[] { "SecondAPI" }
+ });
+
+ if (!accessTokenResult.TryGetToken(out var token))
+ {
+ Navigation.NavigateToLogin(accessTokenResult.InteractiveRequestUrl, accessTokenResult.InteractionOptions);
+ return;
+ }
+
+ AccessToken = token;
+
+ AuthenticatedUser = state.User;
+ _loading = false;
+ }
+
+ protected IDictionary<string, object> GetAccessTokenClaims()
+ {
+ if (AccessToken == null)
+ {
+ return new Dictionary<string, object>();
+ }
+
+ // header.payload.signature
+ var payload = AccessToken.Value.Split(".")[1];
+ var base64Payload = payload.Replace('-', '+').Replace('_', '/').PadRight(payload.Length + (4 - payload.Length % 4) % 4, '=');
+ return JsonSerializer.Deserialize<IDictionary<string, object>>(Convert.FromBase64String(base64Payload));
+ }
+}
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/UserPreferences.razor b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/UserPreferences.razor
index 2a368cebc7..9240273b12 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/UserPreferences.razor
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Pages/UserPreferences.razor
@@ -15,6 +15,8 @@
@code {
public string Color { get; set; }
+ [Parameter][SupplyParameterFromQuery] public string ReturnUrl { get; set; }
+
public async Task SendPreferences()
{
var content = new StringContent(JsonSerializer.Serialize(new UserPreferences { Color = Color }), Encoding.UTF8, "application/json");
@@ -30,13 +32,7 @@
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
- var query = new Uri(Navigation.Uri).Query;
- var hasReturnUrl = System.Text.RegularExpressions.Regex.Match(query, ".*?returnUrl=([^&]+).*");
- if (hasReturnUrl.Success)
- {
- var returnUrl = hasReturnUrl.Groups[1];
- Navigation.NavigateTo(Uri.UnescapeDataString(returnUrl.Value));
- }
+ Navigation.NavigateTo(ReturnUrl);
}
else
{
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Program.cs b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Program.cs
index 54a50565d3..14f9f140be 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Program.cs
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Program.cs
@@ -12,6 +12,8 @@ public class Program
{
var builder = WebAssemblyHostBuilder.CreateDefault(args);
+ builder.Logging.SetMinimumLevel(LogLevel.Trace);
+
builder.Services.AddApiAuthorization<RemoteAppState, OidcAccount>()
.AddAccountClaimsPrincipalFactory<RemoteAppState, OidcAccount, PreferencesUserFactory>();
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/LoginDisplay.razor b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/LoginDisplay.razor
index d1f683dd19..05f7c24336 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/LoginDisplay.razor
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/LoginDisplay.razor
@@ -1,11 +1,11 @@
@using Microsoft.AspNetCore.Components.Authorization
@inject NavigationManager Navigation
-@inject SignOutSessionStateManager SignOutManager
<AuthorizeView Context="authenticationState">
<Authorized>
<a href="authentication/profile">Hello, @authenticationState.User.Identity.Name!</a>
- <button class="nav-link btn btn-link" @onclick="BeginSignOut">Log out</button>
+ <a href="authentication/login" @onclick="LoginWithOtherUser">Log in with another user</a>
+ <button class="nav-link btn btn-link" @onclick="SignOut">Log out</button>
</Authorized>
<NotAuthorized>
<a href="authentication/register">Register</a>
@@ -13,10 +13,17 @@
</NotAuthorized>
</AuthorizeView>
-@code{
- public async Task BeginSignOut()
+@code {
+ public void LoginWithOtherUser()
{
- await SignOutManager.SetSignOutState();
- Navigation.NavigateTo("authentication/logout");
+ var request = new InteractiveRequestOptions { Interaction = InteractionType.SignIn, ReturnUrl = Navigation.Uri };
+ request.TryAddAdditionalParameter("prompt", "login");
+
+ Navigation.NavigateToLogin("authentication/login", request);
+ }
+
+ public void SignOut()
+ {
+ Navigation.NavigateToLogout("authentication/logout");
}
}
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/NavMenu.razor b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/NavMenu.razor
index 15ec3a160f..6226997b54 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/NavMenu.razor
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/NavMenu.razor
@@ -28,6 +28,11 @@
</NavLink>
</li>
<li class="nav-item px-3">
+ <NavLink class="nav-link" href="token">
+ <span class="oi oi-list-rich" aria-hidden="true"></span> Token
+ </NavLink>
+ </li>
+ <li class="nav-item px-3">
<NavLink class="nav-link" href="new-admin">
<span class="oi oi-list-rich" aria-hidden="true"></span> Make admin
</NavLink>
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/RedirectToLogin.razor b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/RedirectToLogin.razor
index 50e12977d1..315ffd5e59 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/RedirectToLogin.razor
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/Shared/RedirectToLogin.razor
@@ -1,10 +1,12 @@
@inject NavigationManager Navigation
+@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using Microsoft.Extensions.Options
+
@inject IOptionsSnapshot<RemoteAuthenticationOptions<ApiAuthorizationProviderOptions>> Options
@code {
protected override void OnInitialized()
{
- Navigation.NavigateTo($"{Options.Get(Microsoft.Extensions.Options.Options.DefaultName).AuthenticationPaths.LogInPath}?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
+ Navigation.NavigateToLogin(Options.Get(Microsoft.Extensions.Options.Options.DefaultName).AuthenticationPaths.LogInPath);
}
}
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/wwwroot/appsettings.json b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/wwwroot/appsettings.json
new file mode 100644
index 0000000000..66f1dabf4f
--- /dev/null
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Client/wwwroot/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning",
+ "Microsoft.AspNetCore.Components.WebAssembly.Authentication": "Trace"
+ }
+ }
+}
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Controllers/OidcConfigurationController.cs b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Controllers/OidcConfigurationController.cs
index ad228fa284..8196e58837 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Controllers/OidcConfigurationController.cs
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Controllers/OidcConfigurationController.cs
@@ -19,6 +19,7 @@ public class OidcConfigurationController : Controller
public IActionResult GetClientRequestParameters([FromRoute] string clientId)
{
var parameters = ClientRequestParametersProvider.GetClientParameters(HttpContext, clientId);
+ parameters["scope"] = parameters["scope"]["SecondAPI ".Length..];
return Ok(parameters);
}
}
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Startup.cs b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Startup.cs
index 4cf967bf65..72c7cb28a1 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Startup.cs
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Startup.cs
@@ -35,6 +35,13 @@ public class Startup
{
options.IdentityResources["openid"].UserClaims.Add("role");
options.ApiResources.Single().UserClaims.Add("role");
+ options.ApiResources.Add(new Duende.IdentityServer.Models.ApiResource
+ {
+ Name = "SecondAPI",
+ Scopes = new string[] { "SecondAPI" }
+ });
+ var client = options.Clients.Single();
+ client.AllowedScopes.Add("SecondAPI");
});
// Need to do this as it maps "role" to ClaimTypes.Role and causes issues
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Wasm.Authentication.Server.csproj b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Wasm.Authentication.Server.csproj
index 21d7dbd1f9..995a6d1630 100644
--- a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Wasm.Authentication.Server.csproj
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/Wasm.Authentication.Server.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -7,6 +7,7 @@
<NoWarn>CS8002</NoWarn>
<!-- This project references the shared framework transitively. Prevent restore errors by setting this flag. -->
<GenerateErrorForMissingTargetingPacks>false</GenerateErrorForMissingTargetingPacks>
+ <IdentityDefaultUIFramework>Bootstrap5</IdentityDefaultUIFramework>
</PropertyGroup>
<ItemGroup>
@@ -24,6 +25,24 @@
<Reference Include="Microsoft.EntityFrameworkCore.Tools" />
</ItemGroup>
+ <!-- Update the target files to support selecting Bootstrap5 on Identity UI when consumed as a project reference.
+ Identity ships Bootstrap4 and Bootstrap5 on the same package and allows the user to pick a version using an
+ MSBuild property, which decides wich assets are used as part of the build.
+ That only works when it is consumed as a package, since it is overriding the static web assets targets to so.
+ In this case we are consuming it as a project, so what we are doing here is pass in an additional property to
+ the project when we retrieve the assets.
+ -->
+ <Target Name="UpdateIdentityUIStaticWebAssetsConfiguration" AfterTargets="ResolveReferencedProjectsStaticWebAssetsConfiguration">
+ <ItemGroup>
+ <_IdentityUI Include="@(StaticWebAssetProjectConfiguration)" Condition="'%(FileName)' == 'Microsoft.AspNetCore.Identity.UI'" />
+ <_IdentityUI Condition="'%(Identity)' != ''">
+ <AdditionalBuildProperties>@(_IdentityUI->'%(AdditionalBuildProperties)');IdentityDefaultUIFramework=$(IdentityDefaultUIFramework)</AdditionalBuildProperties>
+ </_IdentityUI>
+ <StaticWebAssetProjectConfiguration Remove="@(_IdentityUI)" />
+ <StaticWebAssetProjectConfiguration Include="@(_IdentityUI)" />
+ </ItemGroup>
+ </Target>
+
<ItemGroup>
<ProjectReference Include="..\Wasm.Authentication.Client\Wasm.Authentication.Client.csproj" />
<ProjectReference Include="..\Wasm.Authentication.Shared\Wasm.Authentication.Shared.csproj" />
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.cmd b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.cmd
new file mode 100644
index 0000000000..b80992a0f0
--- /dev/null
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.cmd
@@ -0,0 +1 @@
+dotnet ef database update --msbuildprojectextensionspath ..\..\..\..\..\artifacts\obj\Wasm.Authentication.Server\ --no-build
diff --git a/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.sh b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.sh
new file mode 100644
index 0000000000..b80992a0f0
--- /dev/null
+++ b/src/Components/WebAssembly/testassets/Wasm.Authentication.Server/create-db.sh
@@ -0,0 +1 @@
+dotnet ef database update --msbuildprojectextensionspath ..\..\..\..\..\artifacts\obj\Wasm.Authentication.Server\ --no-build
diff --git a/src/Components/WebView/WebView/src/FileExtensionContentTypeProvider.cs b/src/Components/WebView/WebView/src/FileExtensionContentTypeProvider.cs
index 5b75162675..ecc808df0a 100644
--- a/src/Components/WebView/WebView/src/FileExtensionContentTypeProvider.cs
+++ b/src/Components/WebView/WebView/src/FileExtensionContentTypeProvider.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Components.WebView;
/// <summary>
/// Provides a mapping between file extensions and MIME types.
/// </summary>
-internal class FileExtensionContentTypeProvider : IContentTypeProvider
+internal sealed class FileExtensionContentTypeProvider : IContentTypeProvider
{
// Notes:
// - This table was initially copied from IIS and has many legacy entries we will maintain for backwards compatibility.
diff --git a/src/Components/WebView/WebView/src/IpcCommon.cs b/src/Components/WebView/WebView/src/IpcCommon.cs
index 77f2715a5b..bb63603266 100644
--- a/src/Components/WebView/WebView/src/IpcCommon.cs
+++ b/src/Components/WebView/WebView/src/IpcCommon.cs
@@ -6,7 +6,7 @@ using System.Text.Json;
namespace Microsoft.AspNetCore.Components.WebView;
-internal class IpcCommon
+internal sealed class IpcCommon
{
private const string _ipcMessagePrefix = "__bwv:";
@@ -62,6 +62,7 @@ internal class IpcCommon
OnRenderCompleted,
OnLocationChanged,
ReceiveByteArrayFromJS,
+ OnLocationChanging,
}
public enum OutgoingMessageType
@@ -73,5 +74,7 @@ internal class IpcCommon
NotifyUnhandledException,
BeginInvokeJS,
SendByteArrayToJS,
+ SetHasLocationChangingListeners,
+ EndLocationChanging,
}
}
diff --git a/src/Components/WebView/WebView/src/IpcReceiver.cs b/src/Components/WebView/WebView/src/IpcReceiver.cs
index f166292242..a1cb04e089 100644
--- a/src/Components/WebView/WebView/src/IpcReceiver.cs
+++ b/src/Components/WebView/WebView/src/IpcReceiver.cs
@@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Components.WebView;
// This class is a "Proxy" or "front-controller" for the incoming messages from the Browser via the transport channel.
// It receives messages on OnMessageReceived, interprets the payload and dispatches them to the appropriate method
-internal class IpcReceiver
+internal sealed class IpcReceiver
{
private readonly Func<string, string, Task> _onAttachMessage;
@@ -61,7 +61,10 @@ internal class IpcReceiver
OnRenderCompleted(pageContext, args[0].GetInt64(), args[1].GetString());
break;
case IpcCommon.IncomingMessageType.OnLocationChanged:
- OnLocationChanged(pageContext, args[0].GetString(), args[1].GetBoolean());
+ OnLocationChanged(pageContext, args[0].GetString(), args[1].GetString(), args[2].GetBoolean());
+ break;
+ case IpcCommon.IncomingMessageType.OnLocationChanging:
+ OnLocationChanging(pageContext, args[0].GetInt32(), args[1].GetString(), args[2].GetString(), args[3].GetBoolean());
break;
default:
throw new InvalidOperationException($"Unknown message type '{messageType}'.");
@@ -97,8 +100,13 @@ internal class IpcReceiver
pageContext.Renderer.NotifyRenderCompleted(batchId);
}
- private static void OnLocationChanged(PageContext pageContext, string uri, bool intercepted)
+ private static void OnLocationChanged(PageContext pageContext, string uri, string? state, bool intercepted)
+ {
+ pageContext.NavigationManager.LocationUpdated(uri, state, intercepted);
+ }
+
+ private static void OnLocationChanging(PageContext pageContext, int callId, string uri, string? state, bool intercepted)
{
- pageContext.NavigationManager.LocationUpdated(uri, intercepted);
+ pageContext.NavigationManager.HandleLocationChanging(callId, uri, state, intercepted);
}
}
diff --git a/src/Components/WebView/WebView/src/IpcSender.cs b/src/Components/WebView/WebView/src/IpcSender.cs
index 25568a6247..11206dfdea 100644
--- a/src/Components/WebView/WebView/src/IpcSender.cs
+++ b/src/Components/WebView/WebView/src/IpcSender.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Components.WebView;
// Handles comunication between the component abstractions (Renderer, NavigationManager, JSInterop, etc.)
// and the underlying transport channel
-internal class IpcSender
+internal sealed class IpcSender
{
private readonly Dispatcher _dispatcher;
private readonly Action<string> _messageDispatcher;
@@ -59,6 +59,16 @@ internal class IpcSender
DispatchMessageWithErrorHandling(IpcCommon.Serialize(IpcCommon.OutgoingMessageType.SendByteArrayToJS, id, data));
}
+ public void SetHasLocationChangingListeners(bool hasListeners)
+ {
+ DispatchMessageWithErrorHandling(IpcCommon.Serialize(IpcCommon.OutgoingMessageType.SetHasLocationChangingListeners, hasListeners));
+ }
+
+ public void EndLocationChanging(int callId, bool shouldContinueNavigation)
+ {
+ DispatchMessageWithErrorHandling(IpcCommon.Serialize(IpcCommon.OutgoingMessageType.EndLocationChanging, callId, shouldContinueNavigation));
+ }
+
public void NotifyUnhandledException(Exception exception)
{
// Send the serialized exception to the WebView for display
diff --git a/src/Components/WebView/WebView/src/PageContext.cs b/src/Components/WebView/WebView/src/PageContext.cs
index 68e0a71a54..e9c0728d5f 100644
--- a/src/Components/WebView/WebView/src/PageContext.cs
+++ b/src/Components/WebView/WebView/src/PageContext.cs
@@ -18,7 +18,7 @@ namespace Microsoft.AspNetCore.Components.WebView;
/// for web views, the IPC channel is outside the page context, whereas in Blazor Server,
/// the IPC channel is within the circuit.
/// </summary>
-internal class PageContext : IAsyncDisposable
+internal sealed class PageContext : IAsyncDisposable
{
private readonly AsyncServiceScope _serviceScope;
diff --git a/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs b/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs
index b56b590b55..001df34af9 100644
--- a/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs
+++ b/src/Components/WebView/WebView/src/Services/WebViewJSRuntime.cs
@@ -7,7 +7,7 @@ using Microsoft.JSInterop.Infrastructure;
namespace Microsoft.AspNetCore.Components.WebView.Services;
-internal class WebViewJSRuntime : JSRuntime
+internal sealed class WebViewJSRuntime : JSRuntime
{
private IpcSender _ipcSender;
diff --git a/src/Components/WebView/WebView/src/Services/WebViewNavigationInterception.cs b/src/Components/WebView/WebView/src/Services/WebViewNavigationInterception.cs
index 84ce149be1..662822f232 100644
--- a/src/Components/WebView/WebView/src/Services/WebViewNavigationInterception.cs
+++ b/src/Components/WebView/WebView/src/Services/WebViewNavigationInterception.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Components.Routing;
namespace Microsoft.AspNetCore.Components.WebView.Services;
-internal class WebViewNavigationInterception : INavigationInterception
+internal sealed class WebViewNavigationInterception : INavigationInterception
{
// On this platform, it's sufficient for the JS-side code to enable it unconditionally,
// so there's no need to send a notification.
diff --git a/src/Components/WebView/WebView/src/Services/WebViewNavigationManager.cs b/src/Components/WebView/WebView/src/Services/WebViewNavigationManager.cs
index 7098740dfb..a2065689ab 100644
--- a/src/Components/WebView/WebView/src/Services/WebViewNavigationManager.cs
+++ b/src/Components/WebView/WebView/src/Services/WebViewNavigationManager.cs
@@ -1,26 +1,106 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Components.Routing;
+using Microsoft.Extensions.Logging;
+
namespace Microsoft.AspNetCore.Components.WebView.Services;
-internal class WebViewNavigationManager : NavigationManager
+internal sealed partial class WebViewNavigationManager : NavigationManager
{
+ private readonly ILogger _logger;
private IpcSender _ipcSender;
+ public WebViewNavigationManager(ILogger<WebViewNavigationManager> logger)
+ {
+ _logger = logger;
+ }
+
public void AttachToWebView(IpcSender ipcSender, string baseUrl, string initialUrl)
{
_ipcSender = ipcSender;
Initialize(baseUrl, initialUrl);
}
- public void LocationUpdated(string newUrl, bool intercepted)
+ public void LocationUpdated(string newUrl, string? state, bool intercepted)
{
Uri = newUrl;
+ HistoryEntryState = state;
NotifyLocationChanged(intercepted);
}
+ public void HandleLocationChanging(int callId, string uri, string? state, bool intercepted)
+ {
+ _ = HandleLocationChangingAsync();
+
+ async Task HandleLocationChangingAsync()
+ {
+ try
+ {
+ var shouldContinueNavigation = await NotifyLocationChangingAsync(uri, state, intercepted);
+
+ if (!shouldContinueNavigation)
+ {
+ Log.NavigationCanceled(_logger, uri);
+ }
+
+ _ipcSender.EndLocationChanging(callId, shouldContinueNavigation);
+ }
+ catch (Exception ex)
+ {
+ // We shouldn't ever reach this since exceptions thrown from handlers are caught in InvokeLocationChangingHandlerAsync.
+ // But if some other exception gets thrown, we still want to know about it.
+ Log.NavigationFailed(_logger, uri, ex);
+ _ipcSender.NotifyUnhandledException(ex);
+ }
+ }
+ }
+
protected override void NavigateToCore(string uri, NavigationOptions options)
{
- _ipcSender.Navigate(uri, options);
+ _ = PerformNavigationAsync();
+
+ async Task PerformNavigationAsync()
+ {
+ try
+ {
+ var shouldContinueNavigation = await NotifyLocationChangingAsync(uri, options.HistoryEntryState, false);
+
+ if (!shouldContinueNavigation)
+ {
+ Log.NavigationCanceled(_logger, uri);
+ return;
+ }
+
+ _ipcSender.Navigate(uri, options);
+ }
+ catch (Exception ex)
+ {
+ // We shouldn't ever reach this since exceptions thrown from handlers are handled in HandleLocationChangingHandlerException.
+ // But if some other exception gets thrown, we still want to know about it.
+ Log.NavigationFailed(_logger, uri, ex);
+ _ipcSender.NotifyUnhandledException(ex);
+ }
+ }
+ }
+
+ protected override void HandleLocationChangingHandlerException(Exception ex, LocationChangingContext context)
+ {
+ Log.NavigationFailed(_logger, context.TargetLocation, ex);
+ _ipcSender.NotifyUnhandledException(ex);
+ }
+
+ protected override void SetNavigationLockState(bool value)
+ {
+ _ipcSender.SetHasLocationChangingListeners(value);
+ }
+
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Debug, "Navigation canceled when changing the location to {Uri}", EventName = "NavigationCanceled")]
+ public static partial void NavigationCanceled(ILogger logger, string uri);
+
+ [LoggerMessage(2, LogLevel.Error, "Navigation failed when changing the location to {Uri}", EventName = "NavigationFailed")]
+ public static partial void NavigationFailed(ILogger logger, string uri, Exception exception);
}
}
diff --git a/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs b/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs
index 34f2ef7f0e..dfe3f8ba6f 100644
--- a/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs
+++ b/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Components.WebView.Services;
-internal class WebViewRenderer : WebRenderer
+internal sealed class WebViewRenderer : WebRenderer
{
private readonly Queue<UnacknowledgedRenderBatch> _unacknowledgedRenderBatches = new();
private readonly Dispatcher _dispatcher;
@@ -76,7 +76,7 @@ internal class WebViewRenderer : WebRenderer
nextUnacknowledgedBatch.CompletionSource.SetResult();
}
- record UnacknowledgedRenderBatch
+ private sealed record UnacknowledgedRenderBatch
{
public long BatchId { get; init; }
public TaskCompletionSource CompletionSource { get; init; }
diff --git a/src/Components/WebView/WebView/src/StaticContentProvider.cs b/src/Components/WebView/WebView/src/StaticContentProvider.cs
index 52036bfc9e..a2283943a1 100644
--- a/src/Components/WebView/WebView/src/StaticContentProvider.cs
+++ b/src/Components/WebView/WebView/src/StaticContentProvider.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.FileProviders;
namespace Microsoft.AspNetCore.Components.WebView;
-internal class StaticContentProvider
+internal sealed class StaticContentProvider
{
private readonly IFileProvider _fileProvider;
private readonly Uri _appBaseUri;
diff --git a/src/Components/WebView/WebView/src/WebViewManager.cs b/src/Components/WebView/WebView/src/WebViewManager.cs
index c4097c2597..95348e0430 100644
--- a/src/Components/WebView/WebView/src/WebViewManager.cs
+++ b/src/Components/WebView/WebView/src/WebViewManager.cs
@@ -210,7 +210,7 @@ public abstract class WebViewManager : IAsyncDisposable
private static Uri EnsureTrailingSlash(Uri uri)
=> uri.AbsoluteUri.EndsWith('/') ? uri : new Uri(uri.AbsoluteUri + '/');
- private class RootComponent
+ private sealed class RootComponent
{
public Type ComponentType { get; init; }
public ParameterView Parameters { get; init; }
@@ -241,7 +241,7 @@ public abstract class WebViewManager : IAsyncDisposable
await DisposeAsyncCore();
}
- private class StaticWebAssetsLoader
+ private sealed class StaticWebAssetsLoader
{
internal static IFileProvider UseStaticWebAssets(IFileProvider fileProvider)
{
diff --git a/src/Components/benchmarkapps/BlazingPizza.Server/NuGet.config b/src/Components/benchmarkapps/BlazingPizza.Server/NuGet.config
index 25afec6f1b..2739120bf2 100644
--- a/src/Components/benchmarkapps/BlazingPizza.Server/NuGet.config
+++ b/src/Components/benchmarkapps/BlazingPizza.Server/NuGet.config
@@ -2,6 +2,6 @@
<configuration>
<packageSources>
<clear />
- <add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
+ <add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" />
</packageSources>
</configuration>
diff --git a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/ConsoleHostRenderer.cs b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/ConsoleHostRenderer.cs
index 765f21cb2d..b4b3e67980 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/ConsoleHostRenderer.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/ConsoleHostRenderer.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Logging;
namespace Wasm.Performance.ConsoleHost;
-internal class ConsoleHostRenderer : Renderer
+internal sealed class ConsoleHostRenderer : Renderer
{
public ConsoleHostRenderer(IServiceProvider serviceProvider, ILoggerFactory loggerFactory)
: base(serviceProvider, loggerFactory)
diff --git a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/NullDispatcher.cs b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/NullDispatcher.cs
index e8c31999e8..6dbadad147 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/NullDispatcher.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/NullDispatcher.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Components;
namespace Wasm.Performance.ConsoleHost;
-internal class NullDispatcher : Dispatcher
+internal sealed class NullDispatcher : Dispatcher
{
public override bool CheckAccess()
=> true;
diff --git a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Program.cs b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Program.cs
index 380d9596ee..8ce3acf6a8 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Program.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Program.cs
@@ -6,7 +6,7 @@ using Wasm.Performance.ConsoleHost.Scenarios;
namespace Wasm.Performance.ConsoleHost;
-internal class Program : CommandLineApplication
+internal sealed class Program : CommandLineApplication
{
static void Main(string[] args)
{
diff --git a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Scenarios/GridScenario.cs b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Scenarios/GridScenario.cs
index d2480c2ca8..b1c7567d22 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Scenarios/GridScenario.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/ConsoleHost/Scenarios/GridScenario.cs
@@ -8,7 +8,7 @@ using Wasm.Performance.TestApp.Pages;
namespace Wasm.Performance.ConsoleHost.Scenarios;
-internal class GridScenario : ComponentRenderingScenarioBase
+internal sealed class GridScenario : ComponentRenderingScenarioBase
{
readonly CommandOption _gridTypeOption = new CommandOption("--gridtype", CommandOptionType.SingleValue);
diff --git a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMeasurement.cs b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMeasurement.cs
index 7ec3de079d..67c9f14beb 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMeasurement.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMeasurement.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Wasm.Performance.Driver;
-internal class BenchmarkMeasurement
+internal sealed class BenchmarkMeasurement
{
public DateTime Timestamp { get; internal set; }
public string Name { get; internal set; }
diff --git a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMetadata.cs b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMetadata.cs
index 16ef74e975..a3422a7092 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMetadata.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkMetadata.cs
@@ -3,7 +3,7 @@
namespace Wasm.Performance.Driver;
-internal class BenchmarkMetadata
+internal sealed class BenchmarkMetadata
{
public string Source { get; set; }
public string Name { get; set; }
diff --git a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkOutput.cs b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkOutput.cs
index 9e490cd343..7a1e1c8168 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkOutput.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkOutput.cs
@@ -3,7 +3,7 @@
namespace Wasm.Performance.Driver;
-internal class BenchmarkOutput
+internal sealed class BenchmarkOutput
{
public List<BenchmarkMetadata> Metadata { get; } = new List<BenchmarkMetadata>();
diff --git a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkResult.cs b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkResult.cs
index aff1b66289..e96591a067 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkResult.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkResult.cs
@@ -3,7 +3,7 @@
namespace Wasm.Performance.Driver;
-class BenchmarkResult
+sealed class BenchmarkResult
{
/// <summary>The result of executing scenario benchmarks</summary>
public List<BenchmarkScenarioResult> ScenarioResults { get; set; }
diff --git a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkScenarioResult.cs b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkScenarioResult.cs
index 5512ce511e..8feefef068 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkScenarioResult.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/Driver/BenchmarkScenarioResult.cs
@@ -3,7 +3,7 @@
namespace Wasm.Performance.Driver;
-class BenchmarkScenarioResult
+sealed class BenchmarkScenarioResult
{
public string Name { get; set; }
@@ -17,7 +17,7 @@ class BenchmarkScenarioResult
public double Duration { get; set; }
- public class BenchmarkDescriptor
+ public sealed class BenchmarkDescriptor
{
public string Name { get; set; }
diff --git a/src/Components/benchmarkapps/Wasm.Performance/Driver/Selenium.cs b/src/Components/benchmarkapps/Wasm.Performance/Driver/Selenium.cs
index fff572cc3f..2a3a5a0719 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/Driver/Selenium.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/Driver/Selenium.cs
@@ -8,7 +8,7 @@ using OpenQA.Selenium.Remote;
namespace Wasm.Performance.Driver;
-class Selenium
+internal sealed class Selenium
{
const int SeleniumPort = 4444;
const bool RunHeadlessBrowser = true;
diff --git a/src/Components/benchmarkapps/Wasm.Performance/TestApp/PersonJsonContext.cs b/src/Components/benchmarkapps/Wasm.Performance/TestApp/PersonJsonContext.cs
index 4c014dea5d..4215174631 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/TestApp/PersonJsonContext.cs
+++ b/src/Components/benchmarkapps/Wasm.Performance/TestApp/PersonJsonContext.cs
@@ -6,6 +6,6 @@ using System.Text.Json.Serialization;
namespace Wasm.Performance.TestApp;
[JsonSerializable(typeof(Person))]
-internal partial class PersonJsonContext : JsonSerializerContext
+internal sealed partial class PersonJsonContext : JsonSerializerContext
{
}
diff --git a/src/Components/benchmarkapps/Wasm.Performance/dockerfile b/src/Components/benchmarkapps/Wasm.Performance/dockerfile
index 1b8a900f89..9d0b02bd86 100644
--- a/src/Components/benchmarkapps/Wasm.Performance/dockerfile
+++ b/src/Components/benchmarkapps/Wasm.Performance/dockerfile
@@ -28,7 +28,7 @@ RUN .dotnet/dotnet publish -c Release --no-restore -o /app ./src/Components/benc
RUN chmod +x /app/Wasm.Performance.Driver
WORKDIR /app
-FROM selenium/standalone-chrome:latest as final
+FROM selenium/standalone-chrome:103.0 as final
COPY --from=build ./app ./
COPY ./exec.sh ./
diff --git a/src/Components/test/E2ETest/.npmrc b/src/Components/test/E2ETest/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Components/test/E2ETest/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Components/test/E2ETest/Tests/BindTest.cs b/src/Components/test/E2ETest/Tests/BindTest.cs
index fd0e007756..79c0fae459 100644
--- a/src/Components/test/E2ETest/Tests/BindTest.cs
+++ b/src/Components/test/E2ETest/Tests/BindTest.cs
@@ -6,6 +6,7 @@ using BasicTestApp;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.E2ETesting;
+using Microsoft.AspNetCore.Testing;
using OpenQA.Selenium;
using OpenQA.Selenium.Support.UI;
using Xunit.Abstractions;
@@ -2005,6 +2006,78 @@ public class BindTest : ServerTestBase<ToggleExecutionModeServerFixture<Program>
Assert.Equal(string.Empty, mirrorValue.GetAttribute("value"));
}
+ [Fact]
+ public void CanBindDateTimeLocalDefaultStepTextboxDateTime()
+ {
+ // This test differs from the other "step"-related test in that the DOM element has no "step" attribute
+ // and hence defaults to step=60, and for this the framework has explicit logic to strip off the "seconds"
+ // part of the bound value (otherwise the browser reports it as invalid - issue #41731)
+
+ var target = Browser.Exists(By.Id("datetime-local-default-step-textbox-datetime"));
+ var boundValue = Browser.Exists(By.Id("datetime-local-default-step-textbox-datetime-value"));
+ var expected = DateTime.Now.Date.Add(new TimeSpan(8, 5, 0)); // Notice the "seconds" part is zero here, even though the original data has seconds=30
+ Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
+
+ // Clear textbox; value updates to 00:00 because that's the default
+ target.Clear();
+ expected = default;
+ Browser.Equal(default, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
+ Assert.Equal(default, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
+
+ // We have to do it this way because the browser gets in the way when sending keys to the input element directly.
+ ApplyInputValue("#datetime-local-default-step-textbox-datetime", "2000-01-02T04:05");
+ expected = new DateTime(2000, 1, 2, 04, 05, 0);
+ Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public void CanBindTimeDefaultStepTextboxDateTime()
+ {
+ // This test differs from the other "step"-related test in that the DOM element has no "step" attribute
+ // and hence defaults to step=60, and for this the framework has explicit logic to strip off the "seconds"
+ // part of the bound value (otherwise the browser reports it as invalid - issue #41731)
+
+ var target = Browser.Exists(By.Id("time-default-step-textbox-datetime"));
+ var boundValue = Browser.Exists(By.Id("time-default-step-textbox-datetime-value"));
+ var expected = DateTime.Now.Date.Add(new TimeSpan(8, 5, 0)); // Notice the "seconds" part is zero here, even though the original data has seconds=30
+ Assert.Equal(expected, DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
+
+ // Clear textbox; value updates to 00:00 because that's the default
+ target.Clear();
+ expected = default;
+ Browser.Equal(DateTime.Now.Date, () => DateTime.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
+ Assert.Equal(default, DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
+
+ // We have to do it this way because the browser gets in the way when sending keys to the input element directly.
+ ApplyInputValue("#time-default-step-textbox-datetime", "04:05");
+ expected = DateTime.Now.Date.Add(new TimeSpan(4, 5, 0));
+ Browser.Equal(expected, () => DateTime.Parse(boundValue.Text, CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public void CanBindTimeDefaultStepTextboxTimeOnly()
+ {
+ // This test differs from the other "step"-related test in that the DOM element has no "step" attribute
+ // and hence defaults to step=60, and for this the framework has explicit logic to strip off the "seconds"
+ // part of the bound value (otherwise the browser reports it as invalid - issue #41731)
+
+ var target = Browser.Exists(By.Id("time-default-step-textbox-timeonly"));
+ var boundValue = Browser.Exists(By.Id("time-default-step-textbox-timeonly-value"));
+ var expected = new TimeOnly(8, 5, 0); // Notice the "seconds" part is zero here, even though the original data has seconds=30
+ Assert.Equal(expected, TimeOnly.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
+
+ // Clear textbox; value updates to 00:00 because that's the default
+ target.Clear();
+ expected = default;
+ Browser.Equal(default, () => TimeOnly.Parse(target.GetAttribute("value"), CultureInfo.InvariantCulture));
+ Assert.Equal(default, TimeOnly.Parse(boundValue.Text, CultureInfo.InvariantCulture));
+
+ // We have to do it this way because the browser gets in the way when sending keys to the input element directly.
+ ApplyInputValue("#time-default-step-textbox-timeonly", "04:05");
+ expected = new TimeOnly(4, 5, 0);
+ Browser.Equal(expected, () => TimeOnly.Parse(boundValue.Text, CultureInfo.InvariantCulture));
+ }
+
// Applies an input through javascript to datetime-local/month/time controls.
private void ApplyInputValue(string cssSelector, string value)
{
diff --git a/src/Components/test/E2ETest/Tests/CustomElementsTest.cs b/src/Components/test/E2ETest/Tests/CustomElementsTest.cs
new file mode 100644
index 0000000000..5dcdaf2a5a
--- /dev/null
+++ b/src/Components/test/E2ETest/Tests/CustomElementsTest.cs
@@ -0,0 +1,128 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using BasicTestApp;
+using Microsoft.AspNetCore.Components.E2ETest;
+using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
+using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
+using Microsoft.AspNetCore.E2ETesting;
+using OpenQA.Selenium;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Components.E2ETest.Tests;
+
+public class CustomElementsTest : ServerTestBase<ToggleExecutionModeServerFixture<Program>>
+{
+ protected IWebElement app;
+
+ public CustomElementsTest(
+ BrowserFixture browserFixture,
+ ToggleExecutionModeServerFixture<Program> serverFixture,
+ ITestOutputHelper output)
+ : base(browserFixture, serverFixture, output)
+ {
+ }
+
+ protected override void InitializeAsyncCore()
+ {
+ Navigate(ServerPathBase, noReload: false);
+ app = Browser.MountTestComponent<CustomElementsComponent>();
+ }
+
+ [Fact]
+ public void CanAddAndRemoveCustomElements()
+ {
+ // Custom elements can be added.
+ app.FindElement(By.Id("add-custom-element")).Click();
+ Browser.Exists(By.Id("custom-element-0"));
+
+ app.FindElement(By.Id("add-custom-element")).Click();
+ Browser.Exists(By.Id("custom-element-1"));
+
+ // Custom elements are correctly removed.
+ app.FindElement(By.Id("remove-custom-element")).Click();
+ Browser.DoesNotExist(By.Id("custom-element-1"));
+
+ app.FindElement(By.Id("remove-custom-element")).Click();
+ Browser.DoesNotExist(By.Id("custom-element-0"));
+ }
+
+ [Fact]
+ public void CanUpdateSimpleParameters()
+ {
+ app.FindElement(By.Id("add-custom-element")).Click();
+ Browser.Exists(By.Id("custom-element-0"));
+
+ // Initial parameter values are correct.
+ ValidateSimpleParameterValues(id: 0, clickCount: 0);
+
+ app.FindElement(By.Id("increment-0")).Click();
+
+ // Parameter values have been updated.
+ ValidateSimpleParameterValues(id: 0, clickCount: 1);
+
+ void ValidateSimpleParameterValues(int id, int clickCount)
+ {
+ // Nullable parameters will be "null" every other click.
+ var doNullableParamsHaveValues = clickCount % 2 == 0;
+
+ var customElement = app.FindElement(By.Id($"custom-element-{id}"));
+
+ var expectedStringValue = $"Custom element {id} (Clicked {clickCount} times)";
+ Browser.Equal(expectedStringValue, () => customElement.FindElement(By.ClassName("string-param")).Text);
+
+ var expectedBoolValue = clickCount % 2 == 0 ? bool.TrueString : bool.FalseString;
+ Browser.Equal(expectedBoolValue, () => customElement.FindElement(By.ClassName("bool-param")).Text);
+
+ var expectedNullableBoolValue = doNullableParamsHaveValues ? expectedBoolValue : "null";
+ Browser.Equal(expectedNullableBoolValue, () => customElement.FindElement(By.ClassName("nullable-bool-param")).Text);
+
+ var expectedIntegerValue = clickCount.ToString(CultureInfo.InvariantCulture);
+ Browser.Equal(expectedIntegerValue, () => customElement.FindElement(By.ClassName("int-param")).Text);
+ Browser.Equal(expectedIntegerValue, () => customElement.FindElement(By.ClassName("long-param")).Text);
+
+ var expectedNullableIntegerValue = doNullableParamsHaveValues ? expectedIntegerValue : "null";
+ Browser.Equal(expectedNullableIntegerValue, () => customElement.FindElement(By.ClassName("nullable-int-param")).Text);
+ Browser.Equal(expectedNullableIntegerValue, () => customElement.FindElement(By.ClassName("nullable-long-param")).Text);
+
+ var expectedFloatValue = expectedIntegerValue + ".5";
+ Browser.Equal(expectedFloatValue, () => customElement.FindElement(By.ClassName("float-param")).Text);
+ Browser.Equal(expectedFloatValue, () => customElement.FindElement(By.ClassName("double-param")).Text);
+ Browser.Equal(expectedFloatValue, () => customElement.FindElement(By.ClassName("decimal-param")).Text);
+
+ var expectedNullableFloatValue = doNullableParamsHaveValues ? expectedFloatValue : "null";
+ Browser.Equal(expectedNullableFloatValue, () => customElement.FindElement(By.ClassName("nullable-float-param")).Text);
+ Browser.Equal(expectedNullableFloatValue, () => customElement.FindElement(By.ClassName("nullable-double-param")).Text);
+ Browser.Equal(expectedNullableFloatValue, () => customElement.FindElement(By.ClassName("nullable-decimal-param")).Text);
+ }
+ }
+
+ [Fact]
+ public void CanUpdateComplexParameters()
+ {
+ app.FindElement(By.Id("add-custom-element")).Click();
+ Browser.Exists(By.Id("custom-element-0"));
+
+ var incrementButton = app.FindElement(By.Id("increment-0"));
+ incrementButton.Click();
+ incrementButton.Click();
+
+ app.FindElement(By.Id("update-complex-parameters-0")).Click();
+
+ // The complex object parameter was updated.
+ var expectedComplexObjectValue = @"{ Property = ""Clicked 2 times"" }";
+ Browser.Equal(expectedComplexObjectValue, () => app.FindElement(By.Id("custom-element-0")).FindElement(By.ClassName("complex-type-param")).Text);
+
+ app.FindElement(By.Id("custom-element-0")).FindElement(By.ClassName("invoke-callback")).Click();
+
+ // The callback parameter was invoked.
+ var expectedMessage = "Callback with count = 2";
+ Browser.Equal(expectedMessage, () => app.FindElement(By.Id("message")).Text);
+ }
+}
diff --git a/src/Components/test/E2ETest/Tests/FormsInputDateTest.cs b/src/Components/test/E2ETest/Tests/FormsInputDateTest.cs
index 04b9cda60c..460eb5b87a 100644
--- a/src/Components/test/E2ETest/Tests/FormsInputDateTest.cs
+++ b/src/Components/test/E2ETest/Tests/FormsInputDateTest.cs
@@ -6,6 +6,7 @@ using BasicTestApp.FormsTest;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.E2ETesting;
+using Microsoft.AspNetCore.Testing;
using OpenQA.Selenium;
using Xunit.Abstractions;
diff --git a/src/Components/test/E2ETest/Tests/GlobalizationTest.cs b/src/Components/test/E2ETest/Tests/GlobalizationTest.cs
index 9db74538de..1aa3ff04e5 100644
--- a/src/Components/test/E2ETest/Tests/GlobalizationTest.cs
+++ b/src/Components/test/E2ETest/Tests/GlobalizationTest.cs
@@ -6,6 +6,7 @@ using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.E2ETesting;
+using Microsoft.AspNetCore.Testing;
using OpenQA.Selenium;
using Xunit.Abstractions;
diff --git a/src/Components/test/E2ETest/Tests/InteropTest.cs b/src/Components/test/E2ETest/Tests/InteropTest.cs
index f2f8711ab3..66363c1e54 100644
--- a/src/Components/test/E2ETest/Tests/InteropTest.cs
+++ b/src/Components/test/E2ETest/Tests/InteropTest.cs
@@ -88,6 +88,9 @@ public class InteropTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
["requestDotNetStreamWrapperReferenceAsync"] = @"""Success""",
["invokeVoidAsyncReturnsWithoutSerializing"] = "Success",
["invokeVoidAsyncReturnsWithoutSerializingInJSObjectReference"] = "Success",
+ ["invokeAsyncThrowsSerializingCircularStructure"] = "Success",
+ ["invokeAsyncThrowsUndefinedJSObjectReference"] = "Success",
+ ["invokeAsyncThrowsNullJSObjectReference"] = "Success",
};
var expectedSyncValues = new Dictionary<string, string>
@@ -126,6 +129,9 @@ public class InteropTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
["jsInProcessObjectReference.identity"] = "Invoked from JSInProcessObjectReference",
["invokeVoidReturnsWithoutSerializingIJSInProcessRuntime"] = "Success",
["invokeVoidReturnsWithoutSerializingInIJSInProcessObjectReference"] = "Success",
+ ["invokeThrowsSerializingCircularStructure"] = "Success",
+ ["invokeThrowsUndefinedJSObjectReference"] = "Success",
+ ["invokeThrowsNullJSObjectReference"] = "Success",
["jsUnmarshalledObjectReference.unmarshalledFunction"] = "True",
["jsToDotNetStreamReturnValueUnmarshalled"] = "Success",
["jsCastedUnmarshalledObjectReference.unmarshalledFunction"] = "False",
diff --git a/src/Components/test/E2ETest/Tests/RoutingTest.cs b/src/Components/test/E2ETest/Tests/RoutingTest.cs
index 778ecd1551..1ac1946385 100644
--- a/src/Components/test/E2ETest/Tests/RoutingTest.cs
+++ b/src/Components/test/E2ETest/Tests/RoutingTest.cs
@@ -3,11 +3,13 @@
using System.Globalization;
using System.Runtime.InteropServices;
+using System.Text;
using BasicTestApp;
using BasicTestApp.RouterTest;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure;
using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures;
using Microsoft.AspNetCore.E2ETesting;
+using Microsoft.AspNetCore.Testing;
using OpenQA.Selenium;
using OpenQA.Selenium.Interactions;
using Xunit.Abstractions;
@@ -51,7 +53,7 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
var app = Browser.MountTestComponent<TestRouter>();
Assert.Equal("This is the default page.", app.FindElement(By.Id("test-info")).Text);
- AssertHighlightedLinks("Default (matches all)", "Default with base-relative URL (matches all)");
+ AssertHighlightedLinks("Default (matches all)", "Default with base-relative URL (matches all)", "Default, no trailing slash (matches all)");
}
[Fact]
@@ -276,6 +278,17 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
}
[Fact]
+ public void CanFollowLinkToDefaultPage_NoTrailingSlash()
+ {
+ SetUrlViaPushState("/Other");
+
+ var app = Browser.MountTestComponent<TestRouter>();
+ app.FindElement(By.LinkText("Default, no trailing slash (matches all)")).Click();
+ Browser.Equal("This is the default page.", () => app.FindElement(By.Id("test-info")).Text);
+ AssertHighlightedLinks("Default (matches all)", "Default with base-relative URL (matches all)", "Default, no trailing slash (matches all)");
+ }
+
+ [Fact]
public void CanFollowLinkToOtherPageWithQueryString()
{
SetUrlViaPushState("/");
@@ -298,6 +311,17 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
}
[Fact]
+ public void CanFollowLinkToDefaultPageWithQueryString_NoTrailingSlash()
+ {
+ SetUrlViaPushState("/Other");
+
+ var app = Browser.MountTestComponent<TestRouter>();
+ app.FindElement(By.LinkText("Default with query, no trailing slash")).Click();
+ Browser.Equal("This is the default page.", () => app.FindElement(By.Id("test-info")).Text);
+ AssertHighlightedLinks("Default with query, no trailing slash");
+ }
+
+ [Fact]
public void CanFollowLinkToOtherPageWithHash()
{
SetUrlViaPushState("/");
@@ -320,6 +344,17 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
}
[Fact]
+ public void CanFollowLinkToDefaultPageWithHash_NoTrailingSlash()
+ {
+ SetUrlViaPushState("/Other");
+
+ var app = Browser.MountTestComponent<TestRouter>();
+ app.FindElement(By.LinkText("Default with hash, no trailing slash")).Click();
+ Browser.Equal("This is the default page.", () => app.FindElement(By.Id("test-info")).Text);
+ AssertHighlightedLinks("Default with hash, no trailing slash");
+ }
+
+ [Fact]
public void CanFollowLinkToNotAComponent()
{
SetUrlViaPushState("/");
@@ -405,6 +440,74 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
}
[Fact]
+ public void CanNavigateProgrammaticallyWithStateValidateNoReplaceHistoryEntry()
+ {
+ // This test checks if default navigation does not replace Browser history entries
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<TestRouter>();
+ var testSelector = Browser.WaitUntilTestSelectorReady();
+
+ app.FindElement(By.LinkText("Programmatic navigation cases")).Click();
+ Browser.True(() => Browser.Url.EndsWith("/ProgrammaticNavigationCases", StringComparison.Ordinal));
+ Browser.Contains("programmatic navigation", () => app.FindElement(By.Id("test-info")).Text);
+
+ // We navigate to the /Other page
+ app.FindElement(By.Id("do-other-navigation-state")).Click();
+ Browser.True(() => Browser.Url.EndsWith("/Other", StringComparison.Ordinal));
+ Browser.Contains("state", () => app.FindElement(By.Id("test-state")).Text);
+ AssertHighlightedLinks("Other", "Other with base-relative URL (matches all)");
+
+ // After we press back, we should end up at the "/ProgrammaticNavigationCases" page so we know browser history has not been replaced
+ // If history had been replaced we would have ended up at the "/" page
+ Browser.Navigate().Back();
+ Browser.True(() => Browser.Url.EndsWith("/ProgrammaticNavigationCases", StringComparison.Ordinal));
+ AssertHighlightedLinks("Programmatic navigation cases");
+
+ // When the navigation is forced, the state is ignored (we could choose to throw here).
+ app.FindElement(By.Id("do-other-navigation-forced-state")).Click();
+ Browser.True(() => Browser.Url.EndsWith("/Other", StringComparison.Ordinal));
+ Browser.DoesNotExist(By.Id("test-state"));
+
+ // We check if we had a force load
+ Assert.Throws<StaleElementReferenceException>(() =>
+ testSelector.SelectedOption.GetAttribute("value"));
+
+ // But still we should be able to navigate back, and end up at the "/ProgrammaticNavigationCases" page
+ Browser.Navigate().Back();
+ Browser.True(() => Browser.Url.EndsWith("/ProgrammaticNavigationCases", StringComparison.Ordinal));
+ Browser.WaitUntilTestSelectorReady();
+ }
+
+ [Fact]
+ public void CanNavigateProgrammaticallyWithStateReplaceHistoryEntry()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<TestRouter>();
+ var testSelector = Browser.WaitUntilTestSelectorReady();
+
+ app.FindElement(By.LinkText("Programmatic navigation cases")).Click();
+ Browser.True(() => Browser.Url.EndsWith("/ProgrammaticNavigationCases", StringComparison.Ordinal));
+ Browser.Contains("programmatic navigation", () => app.FindElement(By.Id("test-info")).Text);
+
+ // We navigate to the /Other page, with "replace" enabled
+ app.FindElement(By.Id("do-other-navigation-state-replacehistoryentry")).Click();
+ Browser.True(() => Browser.Url.EndsWith("/Other", StringComparison.Ordinal));
+ Browser.Contains("state", () => app.FindElement(By.Id("test-state")).Text);
+ AssertHighlightedLinks("Other", "Other with base-relative URL (matches all)");
+
+ // After we press back, we should end up at the "/" page so we know browser history has been replaced
+ // If history would not have been replaced we would have ended up at the "/ProgrammaticNavigationCases" page
+ Browser.Navigate().Back();
+ Browser.True(() => Browser.Url.EndsWith("/", StringComparison.Ordinal));
+ AssertHighlightedLinks("Default (matches all)", "Default with base-relative URL (matches all)");
+
+ // Because this was all with client-side navigation, we didn't lose the state in the test selector
+ Assert.Equal(typeof(TestRouter).FullName, testSelector.SelectedOption.GetAttribute("value"));
+ }
+
+ [Fact]
public void CanNavigateProgrammaticallyValidateNoReplaceHistoryEntry()
{
// This test checks if default navigation does not replace Browser history entries
@@ -418,7 +521,7 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
Browser.Contains("programmatic navigation", () => app.FindElement(By.Id("test-info")).Text);
// We navigate to the /Other page
- // This will also test our new NavigatTo(string uri) overload (it should not replace the browser history)
+ // This will also test our new NavigateTo(string uri) overload (it should not replace the browser history)
app.FindElement(By.Id("do-other-navigation")).Click();
Browser.True(() => Browser.Url.EndsWith("/Other", StringComparison.Ordinal));
AssertHighlightedLinks("Other", "Other with base-relative URL (matches all)");
@@ -551,6 +654,569 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
}
[Fact]
+ public void NavigationLock_CanBlockNavigation_ThenContinue()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add two navigation locks that block internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-1 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+ var relativeUriPostNavigation = "/mytestpath";
+ var expectedAbsoluteUriPostNavigation = $"{_serverFixture.RootUri}subdir{relativeUriPostNavigation}";
+
+ SetUrlViaPushState(relativeUriPostNavigation);
+
+ // The navigation was blocked and the navigation controls are displaying
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+ Browser.Exists(By.CssSelector("#navigation-lock-1 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ // Unblock the first navigation lock
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // Wait until the navigation controls have disappeared before continuing
+ Browser.DoesNotExist(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The second navigation lock is still blocking navigation
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Unblock the second navigation lock
+ Browser.FindElement(By.CssSelector("#navigation-lock-1 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // The navigation finally continues
+ Browser.Equal(expectedAbsoluteUriPostNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_CanBlockNavigation_ThenCancel()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add two navigation locks that block internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-1 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+
+ SetUrlViaPushState("/mytestpath");
+
+ // Both navigation locks have initiated their "location changing" handlers and are displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+ Browser.Exists(By.CssSelector("#navigation-lock-1 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ // Cancel the navigation using the first navigation lock
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-cancel")).Click();
+
+ // The second navigation lock callback has completed and has thus removed its navigation controls
+ Browser.DoesNotExist(By.CssSelector("#navigation-lock-1 > div.blocking-controls"));
+
+ // The navigation was canceled and the URI has not changed
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was still not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_CanAddAndRemoveLocationChangingCallback()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+ var relativeUriPostNavigation = "/mytestpath";
+ var expectedAbsoluteUriPostNavigation = $"{_serverFixture.RootUri}subdir{relativeUriPostNavigation}";
+
+ SetUrlViaPushState(relativeUriPostNavigation);
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Cancel the navigation using the first navigation lock
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-cancel")).Click();
+
+ // The navigation lock callback has completed and so the navigation controls have been removed
+ Browser.DoesNotExist(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ // The navigation was canceled and the URI has not changed
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Remove the location changing callback
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ SetUrlViaPushState(relativeUriPostNavigation);
+
+ // The navigation was not blocked because the location changed callback parameter was removed
+ Browser.Equal(expectedAbsoluteUriPostNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_RemovesLock_WhenDisposed()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+ var relativeUriPostNavigation = "/mytestpath";
+ var expectedAbsoluteUriPostNavigation = $"{_serverFixture.RootUri}subdir{relativeUriPostNavigation}";
+
+ SetUrlViaPushState(relativeUriPostNavigation);
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The navigation was blocked
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ // Cancel the navigation using the first navigation lock
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-cancel")).Click();
+
+ // The navigation lock callback has completed and so the navigation controls have been removed
+ Browser.DoesNotExist(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The navigation was canceled and the URI has not changed
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Remove the navigation lock component
+ Browser.FindElement(By.Id("remove-navigation-lock")).Click();
+
+ SetUrlViaPushState(relativeUriPostNavigation);
+
+ // The navigation was not blocked because the lock was removed when the navigation lock component was disposed
+ Browser.Equal(expectedAbsoluteUriPostNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_OverlappingNavigationsCancelExistingNavigations_PushState()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+ var relativeCanceledUri = "/mycanceledtestpath";
+ var expectedCanceledAbsoluteUri = $"{_serverFixture.RootUri}subdir{relativeCanceledUri}";
+
+ SetUrlViaPushState(relativeCanceledUri);
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ var relativeUriPostNavigation = "/mytestpath";
+ var expectedAbsoluteUriPostNavigation = $"{_serverFixture.RootUri}subdir{relativeUriPostNavigation}";
+
+ SetUrlViaPushState(relativeUriPostNavigation);
+
+ // The navigation was canceled and logged
+ Browser.Equal($"Canceling '{expectedCanceledAbsoluteUri}'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > p.navigation-log > span.navigation-log-entry-0"))?.Text);
+
+ // The location was reverted again
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Unblock the new navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // We navigated to the updated URL
+ Browser.Equal(expectedAbsoluteUriPostNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_OverlappingNavigationsCancelExistingNavigations_HistoryNavigation()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ SetUrlViaPushState("/mytestpath0");
+ SetUrlViaPushState("/mytestpath1");
+
+ // The "LocationChanged" event was called twice
+ Browser.Equal("2", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ // We have the expected initial URI
+ var expectedStartingAbsoluteUri = $"{_serverFixture.RootUri}subdir/mytestpath1";
+ Browser.Equal(expectedStartingAbsoluteUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ Browser.Navigate().Back();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(expectedStartingAbsoluteUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called after the two initial navigations
+ Browser.Equal("2", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ Browser.Navigate().Back();
+
+ // The first navigation was canceled and logged
+ var expectedCanceledAbsoluteUri = $"{_serverFixture.RootUri}subdir/mytestpath0";
+ Browser.Equal($"Canceling '{expectedCanceledAbsoluteUri}'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > p.navigation-log > span.navigation-log-entry-0"))?.Text);
+
+ // Unblock the new navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // We navigated to the updated URL
+ var expectedPostNavigationAbsoluteUri = $"{_serverFixture.RootUri}subdir/mytestpath0";
+ Browser.Equal(expectedPostNavigationAbsoluteUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("3", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_OverlappingNavigationsCancelExistingNavigations_ProgrammaticNavigation()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+ var expectedCanceledRelativeUri = $"/subdir/some-path-0";
+
+ Browser.FindElement(By.Id("programmatic-navigation")).Click();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ var expectedAbsoluteUriPostNavigation = $"{_serverFixture.RootUri}subdir/some-path-1";
+
+ Browser.FindElement(By.Id("programmatic-navigation")).Click();
+
+ // The navigation was canceled and logged
+ Browser.Equal($"Canceling '{expectedCanceledRelativeUri}'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > p.navigation-log > span.navigation-log-entry-0"))?.Text);
+
+ // The location was reverted again
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Unblock the new navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // We navigated to the updated URL
+ Browser.Equal(expectedAbsoluteUriPostNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_OverlappingNavigationsCancelExistingNavigations_InternalLinkNavigation()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+
+ var expectedCanceledAbsoluteUri = $"{_serverFixture.RootUri}subdir/some-path-0";
+
+ Browser.FindElement(By.Id("internal-link-navigation")).Click();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ var expectedAbsoluteUriPostNavigation = $"{_serverFixture.RootUri}subdir/some-path-1";
+
+ Browser.FindElement(By.Id("increment-link-navigation-index")).Click();
+ Browser.FindElement(By.Id("internal-link-navigation")).Click();
+
+ // The navigation was canceled and logged
+ Browser.Equal($"Canceling '{expectedCanceledAbsoluteUri}'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > p.navigation-log > span.navigation-log-entry-0"))?.Text);
+
+ // The location was reverted again
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Unblock the new navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // We navigated to the updated URL
+ Browser.Equal(expectedAbsoluteUriPostNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_HistoryNavigationWorks_AfterRefresh()
+ {
+ SetUrlViaPushState("/");
+ SetUrlViaPushState("/mytestpath0");
+ SetUrlViaPushState("/mytestpath1");
+
+ Browser.Navigate().Refresh();
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ // We have the expected initial URI
+ var expectedStartingAbsoluteUri = $"{_serverFixture.RootUri}subdir/mytestpath1";
+ Browser.Equal(expectedStartingAbsoluteUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ Browser.Navigate().Back();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(expectedStartingAbsoluteUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The "LocationChanged" event was not called
+ Browser.Equal("0", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+
+ // Unblock the navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // The navigation was continued
+ var expectedFinalAbsoluteUri = $"{_serverFixture.RootUri}subdir/mytestpath0";
+ Browser.Equal(expectedFinalAbsoluteUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // The navigation was logged
+ Browser.Equal($"Continuing '{expectedFinalAbsoluteUri}'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > p.navigation-log > span.navigation-log-entry-0"))?.Text);
+
+ // The "LocationChanged" event was called
+ Browser.Equal("1", () => app.FindElement(By.Id("location-changed-count"))?.Text);
+ }
+
+ [Fact]
+ public void NavigationLock_CanBlockExternalNavigation()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add two navigation locks that block external navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.confirm-external-navigation")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-1 > input.confirm-external-navigation")).Click();
+
+ SetAbsluteUrlViaPushState($"{_serverFixture.RootUri}/myexternalpath");
+
+ // Dismiss the confirmation prompt that pops up
+ Browser.SwitchTo().Alert().Dismiss();
+
+ // The navigation was canceled and we're on the sarting URI
+ var expectedStartingUri = $"{_serverFixture.RootUri}subdir/";
+ Browser.Equal(expectedStartingUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Disable external navigation confirmation on one of the navigation locks
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.confirm-external-navigation")).Click();
+
+ SetAbsluteUrlViaPushState($"{_serverFixture.RootUri}/myexternalpath2");
+
+ // Dismiss the confirmation prompt that pops up
+ Browser.SwitchTo().Alert().Dismiss();
+
+ // The navigation was canceled again and we're on the sarting URI
+ Browser.Equal(expectedStartingUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Disable external navigation confirmation on the other navigation lock
+ Browser.FindElement(By.CssSelector("#navigation-lock-1 > input.confirm-external-navigation")).Click();
+
+ var expectedFinalUri = $"{_serverFixture.RootUri}/myexternalpath3";
+ SetAbsluteUrlViaPushState(expectedFinalUri);
+
+ // The external navigation was not blocked
+ Browser.Equal(expectedFinalUri, () => Browser.Url);
+ }
+
+ [Fact]
+ public void NavigationLock_CanReadHistoryStateEntry_InLocationChangingHandler()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+
+ // Add a history entry
+ Browser.FindElement(By.Id("programmatic-navigation")).Click();
+
+ //var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+ var expectedInitialUri = $"{_serverFixture.RootUri}subdir/some-path-0";
+ Browser.Equal(expectedInitialUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Block internal navigations
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ // Add another history entry
+ Browser.FindElement(By.Id("programmatic-navigation")).Click();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The state was captured in the programmatically-initiated navigation.
+ Browser.Equal("State = 'Navigation index 1'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > span.history-state"))?.Text);
+
+ // Unblock the navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // The location reflects what it should be after the navigation completes
+ var expectedFinalUri = $"{_serverFixture.RootUri}subdir/some-path-1";
+ Browser.Equal(expectedFinalUri, () => app.FindElement(By.Id("test-info")).Text);
+
+ Browser.Navigate().Back();
+
+ // The state was captured in the browser-initiated navigation.
+ Browser.Equal("State = 'Navigation index 0'", () => app.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > span.history-state"))?.Text);
+
+ // Unblock the navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-continue")).Click();
+
+ // The location reflects what it should be after the navigation completes
+ Browser.Equal(expectedInitialUri, () => app.FindElement(By.Id("test-info")).Text);
+ }
+
+ [Fact]
+ public void NavigationLock_CanRenderUIForExceptions_ProgrammaticNavigation()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+
+ Browser.FindElement(By.Id("programmatic-navigation")).Click();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Throw an exception for the current navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-throw-exception")).Click();
+
+ // The exception shows up in the UI
+ var errorUiElem = Browser.Exists(By.Id("blazor-error-ui"), TimeSpan.FromSeconds(10));
+ Assert.NotNull(errorUiElem);
+ }
+
+ [Fact]
+ public void NavigationLock_CanRenderUIForExceptions_InternalLinkNavigation()
+ {
+ SetUrlViaPushState("/");
+
+ var app = Browser.MountTestComponent<NavigationManagerComponent>();
+
+ // Add a navigation lock that blocks internal navigations
+ Browser.FindElement(By.Id("add-navigation-lock")).Click();
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > input.block-internal-navigation")).Click();
+
+ var uriBeforeBlockedNavigation = Browser.FindElement(By.Id("test-info")).Text;
+
+ Browser.FindElement(By.Id("internal-link-navigation")).Click();
+
+ // The navigation lock has initiated its "location changing" handler and is displaying navigation controls
+ Browser.Exists(By.CssSelector("#navigation-lock-0 > div.blocking-controls"));
+
+ // The location was reverted to what it was before the navigation started
+ Browser.Equal(uriBeforeBlockedNavigation, () => app.FindElement(By.Id("test-info")).Text);
+
+ // Throw an exception for the current navigation
+ Browser.FindElement(By.CssSelector("#navigation-lock-0 > div.blocking-controls > button.navigation-throw-exception")).Click();
+
+ // The exception shows up in the UI
+ var errorUiElem = Browser.Exists(By.Id("blazor-error-ui"), TimeSpan.FromSeconds(10));
+ Assert.NotNull(errorUiElem);
+ }
+
+ [Fact]
public void CanArriveAtRouteWithExtension()
{
// This is an odd test, but it's primarily here to verify routing for routeablecomponentfrompackage isn't available due to
@@ -889,13 +1555,18 @@ public class RoutingTest : ServerTestBase<ToggleExecutionModeServerFixture<Progr
private string SetUrlViaPushState(string relativeUri, bool forceLoad = false)
{
var pathBaseWithoutHash = ServerPathBase.Split('#')[0];
- var jsExecutor = (IJavaScriptExecutor)Browser;
var absoluteUri = new Uri(_serverFixture.RootUri, $"{pathBaseWithoutHash}{relativeUri}");
- jsExecutor.ExecuteScript($"Blazor.navigateTo('{absoluteUri.ToString().Replace("'", "\\'")}', {(forceLoad ? "true" : "false")})");
+ SetAbsluteUrlViaPushState(absoluteUri.ToString(), forceLoad);
return absoluteUri.AbsoluteUri;
}
+ private void SetAbsluteUrlViaPushState(string absoluteUri, bool forceLoad = false)
+ {
+ var jsExecutor = (IJavaScriptExecutor)Browser;
+ jsExecutor.ExecuteScript($"Blazor.navigateTo('{absoluteUri.Replace("'", "\\'")}', {(forceLoad ? "true" : "false")})");
+ }
+
private void AssertDidNotLog(params string[] messages)
{
var log = Browser.Manage().Logs.GetLog(LogType.Browser);
diff --git a/src/Components/test/E2ETest/Tests/VirtualizationTest.cs b/src/Components/test/E2ETest/Tests/VirtualizationTest.cs
index 1ba1c0174d..b954498b48 100644
--- a/src/Components/test/E2ETest/Tests/VirtualizationTest.cs
+++ b/src/Components/test/E2ETest/Tests/VirtualizationTest.cs
@@ -239,6 +239,30 @@ public class VirtualizationTest : ServerTestBase<ToggleExecutionModeServerFixtur
}
[Fact]
+ public void CanRenderHtmlTable()
+ {
+ Browser.MountTestComponent<VirtualizationTable>();
+ var expectedInitialSpacerStyle = "height: 0px; flex-shrink: 0;";
+ var topSpacer = Browser.Exists(By.CssSelector("#virtualized-table > tbody > :first-child"));
+ var bottomSpacer = Browser.Exists(By.CssSelector("#virtualized-table > tbody > :last-child"));
+
+ // We can override the tag name of the spacer
+ Assert.Equal("tr", topSpacer.TagName.ToLowerInvariant());
+ Assert.Equal("tr", bottomSpacer.TagName.ToLowerInvariant());
+ Assert.Contains(expectedInitialSpacerStyle, topSpacer.GetAttribute("style"));
+
+ // Check scrolling document element works
+ Browser.DoesNotExist(By.Id("row-999"));
+ Browser.ExecuteJavaScript("window.scrollTo(0, document.body.scrollHeight);");
+ var lastElement = Browser.Exists(By.Id("row-999"));
+ Browser.True(() => lastElement.Displayed);
+
+ // Validate that the top spacer has expanded, and bottom one has collapsed
+ Browser.False(() => topSpacer.GetAttribute("style").Contains(expectedInitialSpacerStyle));
+ Assert.Contains(expectedInitialSpacerStyle, bottomSpacer.GetAttribute("style"));
+ }
+
+ [Fact]
public void CanMutateDataInPlace_Sync()
{
Browser.MountTestComponent<VirtualizationDataChanges>();
diff --git a/src/Components/test/E2ETest/Tests/WebAssemblyAuthenticationTests.cs b/src/Components/test/E2ETest/Tests/WebAssemblyAuthenticationTests.cs
index 32cea07cfc..da8bea6c95 100644
--- a/src/Components/test/E2ETest/Tests/WebAssemblyAuthenticationTests.cs
+++ b/src/Components/test/E2ETest/Tests/WebAssemblyAuthenticationTests.cs
@@ -222,6 +222,88 @@ public class WebAssemblyAuthenticationTests : ServerTestBase<AspNetSiteServerFix
}
[Fact]
+ public void CanPassAdditionalParameters_DuringSignIn()
+ {
+ // Register first user
+ ClickAndNavigate(By.PartialLinkText("Register"), "/Identity/Account/Register");
+
+ var userName1 = $"{Guid.NewGuid()}@example.com";
+ var password1 = $"[PLACEHOLDER]-1a";
+ RegisterCore(userName1, password1);
+ CompleteProfileDetails();
+
+ ValidateLogout();
+
+ Browser.Navigate().GoToUrl("data:");
+ Navigate("/");
+ WaitUntilLoaded();
+
+ // Register second user
+ ClickAndNavigate(By.PartialLinkText("Register"), "/Identity/Account/Register");
+
+ var userName2 = $"{Guid.NewGuid()}@example.com";
+ var password2 = $"[PLACEHOLDER]-1a";
+ RegisterCore(userName2, password2);
+ CompleteProfileDetails();
+
+ ValidateLogout();
+
+ Browser.Navigate().GoToUrl("data:");
+ Navigate("/");
+ WaitUntilLoaded();
+
+ // Log in with the first user
+ ClickAndNavigate(By.PartialLinkText("Log in"), "/Identity/Account/Login");
+ LoginCore(userName1, password1);
+ ValidateLoggedIn(userName1);
+
+ // Log in with the second user
+ ClickAndNavigate(By.PartialLinkText("Log in with another user"), "/Identity/Account/Login");
+ LoginCore(userName2, password2);
+ ValidateLoggedIn(userName2);
+
+ ValidateLogout();
+ }
+
+ [Fact]
+ public void CanRequestAnAdditionalAccessToken_Interactively()
+ {
+ ClickAndNavigate(By.PartialLinkText("Token"), "/Identity/Account/Login");
+
+ var userName = $"{Guid.NewGuid()}@example.com";
+ var password = $"[PLACEHOLDER]-1a";
+ FirstTimeRegister(userName, password, completeProfileDetails: false);
+
+ Browser.Contains("token", () => Browser.Url);
+
+ var claims = Browser.FindElements(By.CssSelector("p.claim"))
+ .Select(e =>
+ {
+ var pair = e.Text.Split(":");
+ return (pair[0].Trim(), pair[1].Trim());
+ })
+ .Where(c => !new[] { "s_hash", "auth_time", "sid", "sub" }.Contains(c.Item1))
+ .OrderBy(o => o.Item1)
+ .ToArray();
+
+ var token = Browser.Exists(By.Id("access-token")).Text;
+ Assert.NotNull(token);
+ var payload = JsonSerializer.Deserialize<JwtPayload>(Base64UrlTextEncoder.Decode(token.Split(".")[1]));
+
+ Assert.StartsWith("http://127.0.0.1", payload.Issuer);
+ Assert.StartsWith("SecondAPI", payload.Audience);
+ Assert.StartsWith("Wasm.Authentication.Client", payload.ClientId);
+ Assert.Equal(new[] { "SecondAPI" }, payload.Scopes.OrderBy(id => id));
+
+ // The browser formats the text using the current language, so the following parsing relies on
+ // the server being set to an equivalent culture. This should be true in our test scenarios.
+ var currentTime = DateTimeOffset.Parse(Browser.Exists(By.Id("current-time")).Text, CultureInfo.CurrentCulture);
+ var tokenExpiration = DateTimeOffset.Parse(Browser.Exists(By.Id("access-token-expires")).Text, CultureInfo.CurrentCulture);
+ Assert.True(currentTime.AddMinutes(50) < tokenExpiration);
+ Assert.True(currentTime.AddMinutes(60) >= tokenExpiration);
+ }
+
+ [Fact]
public void RegisterAndBack_DoesNotCause_RedirectLoop()
{
Browser.Exists(By.PartialLinkText("Register")).Click();
@@ -305,15 +387,6 @@ public class WebAssemblyAuthenticationTests : ServerTestBase<AspNetSiteServerFix
}
[Fact]
- public void CanNotRedirect_To_External_ReturnUrl()
- {
- Browser.Navigate().GoToUrl(new Uri(new Uri(Browser.Url), "/authentication/login?returnUrl=https%3A%2F%2Fwww.bing.com").AbsoluteUri);
- WaitUntilLoaded(skipHeader: true);
- Browser.Exists(By.CssSelector("[style=\"display: block;\"]"));
- Assert.NotEmpty(Browser.GetBrowserLogs(LogLevel.Severe));
- }
-
- [Fact]
public async Task CanNotTrigger_Logout_WithNavigation()
{
Browser.Navigate().GoToUrl(new Uri(new Uri(Browser.Url), "/authentication/logout").AbsoluteUri);
@@ -331,7 +404,7 @@ public class WebAssemblyAuthenticationTests : ServerTestBase<AspNetSiteServerFix
private void LoginCore(string userName, string password)
{
- Browser.Exists(By.PartialLinkText("Login")).Click();
+ Browser.Exists(By.Id("login-submit")).Click();
Browser.Exists(By.Name("Input.Email"));
Browser.Exists(By.Name("Input.Email")).SendKeys(userName);
Browser.Exists(By.Name("Input.Password")).SendKeys(password);
@@ -360,11 +433,14 @@ public class WebAssemblyAuthenticationTests : ServerTestBase<AspNetSiteServerFix
Browser.Equal(5, () => Browser.FindElements(By.CssSelector("p+table>tbody>tr")).Count);
}
- private void FirstTimeRegister(string userName, string password)
+ private void FirstTimeRegister(string userName, string password, bool completeProfileDetails = true)
{
Browser.Exists(By.PartialLinkText("Register as a new user")).Click();
RegisterCore(userName, password);
- CompleteProfileDetails();
+ if (completeProfileDetails)
+ {
+ CompleteProfileDetails();
+ }
}
private void CompleteProfileDetails()
diff --git a/src/Components/test/E2ETest/Tests/WebAssemblyICUShardingTest.cs b/src/Components/test/E2ETest/Tests/WebAssemblyICUShardingTest.cs
index 56e5be6db5..77bab1c31d 100644
--- a/src/Components/test/E2ETest/Tests/WebAssemblyICUShardingTest.cs
+++ b/src/Components/test/E2ETest/Tests/WebAssemblyICUShardingTest.cs
@@ -53,7 +53,7 @@ public class WebAssemblyICUShardingTest : ServerTestBase<ToggleExecutionModeServ
Assert.Equal(culture.ToString(), cultureDisplay.Text);
var dateDisplay = Browser.Exists(By.Id("dateTime"));
- Assert.Equal("2020. 9. 2. 오전 12:00:00", dateDisplay.Text);
+ Assert.Equal("2020. 9. 2. 00:00:00", dateDisplay.Text);
var localizedDisplay = Browser.Exists(By.Id("localizedString"));
// The app has a "ko" resx file. This test verifies that we can walk up the culture hierarchy correctly.
diff --git a/src/Components/test/E2ETest/yarn.lock b/src/Components/test/E2ETest/yarn.lock
index 4a9484f277..0313c2e992 100644
--- a/src/Components/test/E2ETest/yarn.lock
+++ b/src/Components/test/E2ETest/yarn.lock
@@ -3,21 +3,21 @@
"@sindresorhus/is@^4.0.0":
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
- integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
+ "integrity" "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="
+ "resolved" "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz"
+ "version" "4.6.0"
"@szmarczak/http-timer@^4.0.5":
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
- integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
+ "integrity" "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="
+ "resolved" "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz"
+ "version" "4.0.6"
dependencies:
- defer-to-connect "^2.0.0"
+ "defer-to-connect" "^2.0.0"
"@types/cacheable-request@^6.0.1":
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9"
- integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA==
+ "integrity" "sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA=="
+ "resolved" "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.2.tgz"
+ "version" "6.0.2"
dependencies:
"@types/http-cache-semantics" "*"
"@types/keyv" "*"
@@ -25,576 +25,598 @@
"@types/responselike" "*"
"@types/http-cache-semantics@*":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
- integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
+ "integrity" "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ=="
+ "resolved" "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz"
+ "version" "4.0.1"
+
+"@types/json-buffer@~3.0.0":
+ "integrity" "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ=="
+ "resolved" "https://registry.npmjs.org/@types/json-buffer/-/json-buffer-3.0.0.tgz"
+ "version" "3.0.0"
"@types/keyv@*":
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41"
- integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==
+ "integrity" "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="
+ "resolved" "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz"
+ "version" "3.1.4"
dependencies:
"@types/node" "*"
"@types/node@*":
- version "17.0.21"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
- integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+ "integrity" "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA=="
+ "resolved" "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz"
+ "version" "18.0.0"
"@types/node@^13.1.7":
- version "13.13.52"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-13.13.52.tgz#03c13be70b9031baaed79481c0c0cfb0045e53f7"
- integrity sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==
+ "integrity" "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ=="
+ "resolved" "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz"
+ "version" "13.13.52"
"@types/responselike@*", "@types/responselike@^1.0.0":
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
- integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==
+ "integrity" "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA=="
+ "resolved" "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz"
+ "version" "1.0.0"
dependencies:
"@types/node" "*"
-adm-zip@~0.4.3:
- version "0.4.16"
- resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365"
- integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==
-
-agent-base@6:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
- integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
- dependencies:
- debug "4"
-
-arg@^4.1.0:
- version "4.1.3"
- resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
- integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
-
-async@^2.1.2:
- version "2.6.4"
- resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221"
- integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==
- dependencies:
- lodash "^4.17.14"
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-base64-js@^1.3.1:
- version "1.5.1"
- resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
- integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
-
-bl@^4.0.3:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
- integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
- dependencies:
- buffer "^5.5.0"
- inherits "^2.0.4"
- readable-stream "^3.4.0"
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-buffer-crc32@~0.2.3:
- version "0.2.13"
- resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
- integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=
-
-buffer-from@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
- integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-
-buffer@^5.5.0:
- version "5.7.1"
- resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
- integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
- dependencies:
- base64-js "^1.3.1"
- ieee754 "^1.1.13"
-
-cacheable-lookup@^5.0.3:
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
- integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
-
-cacheable-request@^7.0.2:
- version "7.0.2"
- resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27"
- integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==
- dependencies:
- clone-response "^1.0.2"
- get-stream "^5.1.0"
- http-cache-semantics "^4.0.0"
- keyv "^4.0.0"
- lowercase-keys "^2.0.0"
- normalize-url "^6.0.1"
- responselike "^2.0.0"
-
-clone-response@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
- dependencies:
- mimic-response "^1.0.0"
-
-commander@^7.2.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
- integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
-
-cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-debug@4, debug@^4.3.1:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
- integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
- dependencies:
- ms "2.1.2"
-
-decompress-response@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
- integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
- dependencies:
- mimic-response "^3.1.0"
-
-defer-to-connect@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
- integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
-
-diff@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
- integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
-
-end-of-stream@^1.1.0, end-of-stream@^1.4.1:
- version "1.4.4"
- resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
- integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
- dependencies:
- once "^1.4.0"
-
-fd-slicer@~1.1.0:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
- integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=
- dependencies:
- pend "~1.2.0"
-
-fs-constants@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
- integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
-
-fs-extra@^10.0.0:
- version "10.0.1"
- resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8"
- integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==
- dependencies:
- graceful-fs "^4.2.0"
- jsonfile "^6.0.1"
- universalify "^2.0.0"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
-
-get-stream@^5.1.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
- integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
- dependencies:
- pump "^3.0.0"
-
-glob@^7.1.3:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.0.4"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-got@^11.8.2:
- version "11.8.3"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770"
- integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==
+"adm-zip@~0.4.3":
+ "integrity" "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg=="
+ "resolved" "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz"
+ "version" "0.4.16"
+
+"agent-base@6":
+ "integrity" "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="
+ "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz"
+ "version" "6.0.2"
+ dependencies:
+ "debug" "4"
+
+"arg@^4.1.0":
+ "integrity" "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="
+ "resolved" "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz"
+ "version" "4.1.3"
+
+"async@^2.1.2":
+ "integrity" "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA=="
+ "resolved" "https://registry.npmjs.org/async/-/async-2.6.4.tgz"
+ "version" "2.6.4"
+ dependencies:
+ "lodash" "^4.17.14"
+
+"balanced-match@^1.0.0":
+ "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ "version" "1.0.2"
+
+"base64-js@^1.3.1":
+ "integrity" "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+ "resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
+ "version" "1.5.1"
+
+"bl@^4.0.3":
+ "integrity" "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="
+ "resolved" "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "buffer" "^5.5.0"
+ "inherits" "^2.0.4"
+ "readable-stream" "^3.4.0"
+
+"brace-expansion@^1.1.7":
+ "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
+ "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ "version" "1.1.11"
+ dependencies:
+ "balanced-match" "^1.0.0"
+ "concat-map" "0.0.1"
+
+"buffer-crc32@~0.2.3":
+ "integrity" "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI="
+ "resolved" "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz"
+ "version" "0.2.13"
+
+"buffer-from@^1.0.0":
+ "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
+ "version" "1.1.2"
+
+"buffer@^5.5.0":
+ "integrity" "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="
+ "resolved" "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz"
+ "version" "5.7.1"
+ dependencies:
+ "base64-js" "^1.3.1"
+ "ieee754" "^1.1.13"
+
+"cacheable-lookup@^5.0.3":
+ "integrity" "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="
+ "resolved" "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz"
+ "version" "5.0.4"
+
+"cacheable-request@^7.0.2":
+ "integrity" "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew=="
+ "resolved" "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz"
+ "version" "7.0.2"
+ dependencies:
+ "clone-response" "^1.0.2"
+ "get-stream" "^5.1.0"
+ "http-cache-semantics" "^4.0.0"
+ "keyv" "^4.0.0"
+ "lowercase-keys" "^2.0.0"
+ "normalize-url" "^6.0.1"
+ "responselike" "^2.0.0"
+
+"clone-response@^1.0.2":
+ "integrity" "sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q=="
+ "resolved" "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz"
+ "version" "1.0.2"
+ dependencies:
+ "mimic-response" "^1.0.0"
+
+"commander@^7.2.0":
+ "integrity" "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="
+ "resolved" "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz"
+ "version" "7.2.0"
+
+"compress-brotli@^1.3.8":
+ "integrity" "sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ=="
+ "resolved" "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz"
+ "version" "1.3.8"
+ dependencies:
+ "@types/json-buffer" "~3.0.0"
+ "json-buffer" "~3.0.1"
+
+"concat-map@0.0.1":
+ "integrity" "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ "version" "0.0.1"
+
+"cross-spawn@^7.0.3":
+ "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ "version" "7.0.3"
+ dependencies:
+ "path-key" "^3.1.0"
+ "shebang-command" "^2.0.0"
+ "which" "^2.0.1"
+
+"debug@^4.3.1", "debug@4":
+ "integrity" "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="
+ "resolved" "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz"
+ "version" "4.3.3"
+ dependencies:
+ "ms" "2.1.2"
+
+"decompress-response@^6.0.0":
+ "integrity" "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="
+ "resolved" "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "mimic-response" "^3.1.0"
+
+"defer-to-connect@^2.0.0":
+ "integrity" "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="
+ "resolved" "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz"
+ "version" "2.0.1"
+
+"diff@^4.0.1":
+ "integrity" "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A=="
+ "resolved" "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
+ "version" "4.0.2"
+
+"end-of-stream@^1.1.0", "end-of-stream@^1.4.1":
+ "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q=="
+ "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz"
+ "version" "1.4.4"
+ dependencies:
+ "once" "^1.4.0"
+
+"fd-slicer@~1.1.0":
+ "integrity" "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4="
+ "resolved" "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz"
+ "version" "1.1.0"
+ dependencies:
+ "pend" "~1.2.0"
+
+"fs-constants@^1.0.0":
+ "integrity" "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+ "resolved" "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz"
+ "version" "1.0.0"
+
+"fs-extra@^10.0.0":
+ "integrity" "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag=="
+ "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz"
+ "version" "10.0.1"
+ dependencies:
+ "graceful-fs" "^4.2.0"
+ "jsonfile" "^6.0.1"
+ "universalify" "^2.0.0"
+
+"fs.realpath@^1.0.0":
+ "integrity" "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ "version" "1.0.0"
+
+"get-stream@^5.1.0":
+ "integrity" "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="
+ "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz"
+ "version" "5.2.0"
+ dependencies:
+ "pump" "^3.0.0"
+
+"glob@^7.1.3":
+ "integrity" "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q=="
+ "resolved" "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz"
+ "version" "7.2.0"
+ dependencies:
+ "fs.realpath" "^1.0.0"
+ "inflight" "^1.0.4"
+ "inherits" "2"
+ "minimatch" "^3.0.4"
+ "once" "^1.3.0"
+ "path-is-absolute" "^1.0.0"
+
+"got@^11.8.2":
+ "integrity" "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ=="
+ "resolved" "https://registry.npmjs.org/got/-/got-11.8.5.tgz"
+ "version" "11.8.5"
dependencies:
"@sindresorhus/is" "^4.0.0"
"@szmarczak/http-timer" "^4.0.5"
"@types/cacheable-request" "^6.0.1"
"@types/responselike" "^1.0.0"
- cacheable-lookup "^5.0.3"
- cacheable-request "^7.0.2"
- decompress-response "^6.0.0"
- http2-wrapper "^1.0.0-beta.5.2"
- lowercase-keys "^2.0.0"
- p-cancelable "^2.0.0"
- responselike "^2.0.0"
-
-graceful-fs@^4.1.6, graceful-fs@^4.2.0:
- version "4.2.9"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
- integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
-
-http-cache-semantics@^4.0.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
- integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
-
-http2-wrapper@^1.0.0-beta.5.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
- integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
- dependencies:
- quick-lru "^5.1.1"
- resolve-alpn "^1.0.0"
-
-https-proxy-agent@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
- integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==
- dependencies:
- agent-base "6"
- debug "4"
-
-ieee754@^1.1.13:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
- integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2, inherits@^2.0.3, inherits@^2.0.4:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-is-port-reachable@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/is-port-reachable/-/is-port-reachable-3.1.0.tgz#f6668d3bca9c36b07f737c48a8f875ab0653cd2b"
- integrity sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A==
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-
-json-buffer@3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
- integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
-
-jsonfile@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
- integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
- dependencies:
- universalify "^2.0.0"
+ "cacheable-lookup" "^5.0.3"
+ "cacheable-request" "^7.0.2"
+ "decompress-response" "^6.0.0"
+ "http2-wrapper" "^1.0.0-beta.5.2"
+ "lowercase-keys" "^2.0.0"
+ "p-cancelable" "^2.0.0"
+ "responselike" "^2.0.0"
+
+"graceful-fs@^4.1.6", "graceful-fs@^4.2.0":
+ "integrity" "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ=="
+ "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz"
+ "version" "4.2.9"
+
+"http-cache-semantics@^4.0.0":
+ "integrity" "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
+ "resolved" "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz"
+ "version" "4.1.0"
+
+"http2-wrapper@^1.0.0-beta.5.2":
+ "integrity" "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="
+ "resolved" "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz"
+ "version" "1.0.3"
+ dependencies:
+ "quick-lru" "^5.1.1"
+ "resolve-alpn" "^1.0.0"
+
+"https-proxy-agent@^5.0.0":
+ "integrity" "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA=="
+ "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "agent-base" "6"
+ "debug" "4"
+
+"ieee754@^1.1.13":
+ "integrity" "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+ "resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
+ "version" "1.2.1"
+
+"inflight@^1.0.4":
+ "integrity" "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk="
+ "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ "version" "1.0.6"
+ dependencies:
+ "once" "^1.3.0"
+ "wrappy" "1"
+
+"inherits@^2.0.3", "inherits@^2.0.4", "inherits@2":
+ "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ "version" "2.0.4"
+
+"is-port-reachable@^3.0.0":
+ "integrity" "sha512-vjc0SSRNZ32s9SbZBzGaiP6YVB+xglLShhgZD/FHMZUXBvQWaV9CtzgeVhjccFJrI6RAMV+LX7NYxueW/A8W5A=="
+ "resolved" "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-3.1.0.tgz"
+ "version" "3.1.0"
+
+"isexe@^2.0.0":
+ "integrity" "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
+ "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ "version" "2.0.0"
+
+"json-buffer@~3.0.1", "json-buffer@3.0.1":
+ "integrity" "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+ "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ "version" "3.0.1"
+
+"jsonfile@^6.0.1":
+ "integrity" "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ=="
+ "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz"
+ "version" "6.1.0"
+ dependencies:
+ "universalify" "^2.0.0"
optionalDependencies:
- graceful-fs "^4.1.6"
-
-keyv@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.1.1.tgz#02c538bfdbd2a9308cc932d4096f05ae42bfa06a"
- integrity sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==
- dependencies:
- json-buffer "3.0.1"
-
-lodash.mapvalues@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c"
- integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=
-
-lodash.merge@^4.6.2:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
- integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-
-lodash@>=4.17.21, lodash@^4.16.6, lodash@^4.17.14:
- version "4.17.21"
- resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
- integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-
-lowercase-keys@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
- integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
-
-make-error@^1.1.1:
- version "1.3.6"
- resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
- integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
-
-mimic-response@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
- integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
-
-mimic-response@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
- integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
-
-minimatch@^3.0.4:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
- integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
- dependencies:
- brace-expansion "^1.1.7"
-
-minimist@^1.2.5:
- version "1.2.6"
- resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
- integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
-
-mkdirp@^1.0.4:
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
- integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-normalize-url@^6.0.1:
- version "6.1.0"
- resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
- integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
-
-once@^1.3.0, once@^1.3.1, once@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
- dependencies:
- wrappy "1"
-
-p-cancelable@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
- integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
-
-path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-pend@~1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
- integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA=
-
-progress@2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
-pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
- dependencies:
- end-of-stream "^1.1.0"
- once "^1.3.1"
-
-quick-lru@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
- integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
-
-readable-stream@^3.1.1, readable-stream@^3.4.0:
- version "3.6.0"
- resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
- integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
- dependencies:
- inherits "^2.0.3"
- string_decoder "^1.1.1"
- util-deprecate "^1.0.1"
-
-resolve-alpn@^1.0.0:
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
- integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
-
-responselike@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
- integrity sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==
- dependencies:
- lowercase-keys "^2.0.0"
-
-rimraf@^2.5.4:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
- integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
- dependencies:
- glob "^7.1.3"
-
-safe-buffer@~5.2.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
- integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-
-sauce-connect-launcher@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.3.2.tgz#dfc675a258550809a8eaf457eb9162b943ddbaf0"
- integrity sha512-wf0coUlidJ7rmeClgVVBh6Kw55/yalZCY/Un5RgjSnTXRAeGqagnTsTYpZaqC4dCtrY4myuYpOAZXCdbO7lHfQ==
- dependencies:
- adm-zip "~0.4.3"
- async "^2.1.2"
- https-proxy-agent "^5.0.0"
- lodash "^4.16.6"
- rimraf "^2.5.4"
-
-selenium-standalone@^7.1.0:
- version "7.1.0"
- resolved "https://registry.yarnpkg.com/selenium-standalone/-/selenium-standalone-7.1.0.tgz#1192a4ad84f114137dd5deadcb81b0f56afe054a"
- integrity sha512-Pc7U48qwB4LVy/XczBrPPXwUhEPl3XQSik8SjLfj2qzBEtZqrjyzOlnnXq4aVCdr5wH9FiFJm8LwheJbK2+/oQ==
- dependencies:
- commander "^7.2.0"
- cross-spawn "^7.0.3"
- debug "^4.3.1"
- fs-extra "^10.0.0"
- got "^11.8.2"
- is-port-reachable "^3.0.0"
- lodash.mapvalues "^4.6.0"
- lodash.merge "^4.6.2"
- minimist "^1.2.5"
- mkdirp "^1.0.4"
- progress "2.0.3"
- tar-stream "2.2.0"
- which "^2.0.2"
- yauzl "^2.10.0"
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-source-map-support@^0.5.17:
- version "0.5.21"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
- integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map@^0.6.0:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-string_decoder@^1.1.1:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
- integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
- dependencies:
- safe-buffer "~5.2.0"
-
-tar-stream@2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
- integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
- dependencies:
- bl "^4.0.3"
- end-of-stream "^1.4.1"
- fs-constants "^1.0.0"
- inherits "^2.0.3"
- readable-stream "^3.1.1"
-
-ts-node@^8.6.2:
- version "8.10.2"
- resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.10.2.tgz#eee03764633b1234ddd37f8db9ec10b75ec7fb8d"
- integrity sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA==
- dependencies:
- arg "^4.1.0"
- diff "^4.0.1"
- make-error "^1.1.1"
- source-map-support "^0.5.17"
- yn "3.1.1"
-
-typescript@^3.7.5:
- version "3.9.10"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8"
- integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==
-
-universalify@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
- integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
-
-util-deprecate@^1.0.1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
- integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
-
-which@^2.0.1, which@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-
-yauzl@^2.10.0:
- version "2.10.0"
- resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
- integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=
- dependencies:
- buffer-crc32 "~0.2.3"
- fd-slicer "~1.1.0"
-
-yn@3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
- integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
+ "graceful-fs" "^4.1.6"
+
+"keyv@^4.0.0":
+ "integrity" "sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw=="
+ "resolved" "https://registry.npmjs.org/keyv/-/keyv-4.3.2.tgz"
+ "version" "4.3.2"
+ dependencies:
+ "compress-brotli" "^1.3.8"
+ "json-buffer" "3.0.1"
+
+"lodash.mapvalues@^4.6.0":
+ "integrity" "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw="
+ "resolved" "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz"
+ "version" "4.6.0"
+
+"lodash.merge@^4.6.2":
+ "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ "version" "4.6.2"
+
+"lodash@^4.16.6", "lodash@^4.17.14":
+ "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ "version" "4.17.21"
+
+"lowercase-keys@^2.0.0":
+ "integrity" "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="
+ "resolved" "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz"
+ "version" "2.0.0"
+
+"make-error@^1.1.1":
+ "integrity" "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="
+ "resolved" "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz"
+ "version" "1.3.6"
+
+"microsoft.aspnetcore.components.e2etest@file:":
+ "resolved" "file:"
+ "version" "0.0.1"
+ dependencies:
+ "microsoft.aspnetcore.components.e2etest" "file:"
+ "sauce-connect-launcher" "^1.3.1"
+ "selenium-standalone" "^7.1.0"
+
+"mimic-response@^1.0.0":
+ "integrity" "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+ "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz"
+ "version" "1.0.1"
+
+"mimic-response@^3.1.0":
+ "integrity" "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
+ "resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"
+ "version" "3.1.0"
+
+"minimatch@^3.0.4":
+ "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="
+ "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ "version" "3.1.2"
+ dependencies:
+ "brace-expansion" "^1.1.7"
+
+"minimist@^1.2.5":
+ "integrity" "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
+ "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz"
+ "version" "1.2.6"
+
+"mkdirp@^1.0.4":
+ "integrity" "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
+ "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz"
+ "version" "1.0.4"
+
+"ms@2.1.2":
+ "integrity" "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ "version" "2.1.2"
+
+"normalize-url@^6.0.1":
+ "integrity" "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="
+ "resolved" "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz"
+ "version" "6.1.0"
+
+"once@^1.3.0", "once@^1.3.1", "once@^1.4.0":
+ "integrity" "sha1-WDsap3WWHUsROsF9nFC6753Xa9E="
+ "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ "version" "1.4.0"
+ dependencies:
+ "wrappy" "1"
+
+"p-cancelable@^2.0.0":
+ "integrity" "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="
+ "resolved" "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz"
+ "version" "2.1.1"
+
+"path-is-absolute@^1.0.0":
+ "integrity" "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ "version" "1.0.1"
+
+"path-key@^3.1.0":
+ "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ "version" "3.1.1"
+
+"pend@~1.2.0":
+ "integrity" "sha1-elfrVQpng/kRUzH89GY9XI4AelA="
+ "resolved" "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz"
+ "version" "1.2.0"
+
+"progress@2.0.3":
+ "integrity" "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="
+ "resolved" "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
+ "version" "2.0.3"
+
+"pump@^3.0.0":
+ "integrity" "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww=="
+ "resolved" "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "end-of-stream" "^1.1.0"
+ "once" "^1.3.1"
+
+"quick-lru@^5.1.1":
+ "integrity" "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="
+ "resolved" "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz"
+ "version" "5.1.1"
+
+"readable-stream@^3.1.1", "readable-stream@^3.4.0":
+ "integrity" "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA=="
+ "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ "version" "3.6.0"
+ dependencies:
+ "inherits" "^2.0.3"
+ "string_decoder" "^1.1.1"
+ "util-deprecate" "^1.0.1"
+
+"resolve-alpn@^1.0.0":
+ "integrity" "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+ "resolved" "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz"
+ "version" "1.2.1"
+
+"responselike@^2.0.0":
+ "integrity" "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw=="
+ "resolved" "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "lowercase-keys" "^2.0.0"
+
+"rimraf@^2.5.4":
+ "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+ "version" "2.7.1"
+ dependencies:
+ "glob" "^7.1.3"
+
+"safe-buffer@~5.2.0":
+ "integrity" "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
+ "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ "version" "5.2.1"
+
+"sauce-connect-launcher@^1.3.1":
+ "integrity" "sha512-wf0coUlidJ7rmeClgVVBh6Kw55/yalZCY/Un5RgjSnTXRAeGqagnTsTYpZaqC4dCtrY4myuYpOAZXCdbO7lHfQ=="
+ "resolved" "https://registry.npmjs.org/sauce-connect-launcher/-/sauce-connect-launcher-1.3.2.tgz"
+ "version" "1.3.2"
+ dependencies:
+ "adm-zip" "~0.4.3"
+ "async" "^2.1.2"
+ "https-proxy-agent" "^5.0.0"
+ "lodash" "^4.16.6"
+ "rimraf" "^2.5.4"
+
+"selenium-standalone@^7.1.0":
+ "integrity" "sha512-Pc7U48qwB4LVy/XczBrPPXwUhEPl3XQSik8SjLfj2qzBEtZqrjyzOlnnXq4aVCdr5wH9FiFJm8LwheJbK2+/oQ=="
+ "resolved" "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-7.1.0.tgz"
+ "version" "7.1.0"
+ dependencies:
+ "commander" "^7.2.0"
+ "cross-spawn" "^7.0.3"
+ "debug" "^4.3.1"
+ "fs-extra" "^10.0.0"
+ "got" "^11.8.2"
+ "is-port-reachable" "^3.0.0"
+ "lodash.mapvalues" "^4.6.0"
+ "lodash.merge" "^4.6.2"
+ "minimist" "^1.2.5"
+ "mkdirp" "^1.0.4"
+ "progress" "2.0.3"
+ "tar-stream" "2.2.0"
+ "which" "^2.0.2"
+ "yauzl" "^2.10.0"
+
+"shebang-command@^2.0.0":
+ "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
+ "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "shebang-regex" "^3.0.0"
+
+"shebang-regex@^3.0.0":
+ "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ "version" "3.0.0"
+
+"source-map-support@^0.5.17":
+ "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="
+ "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz"
+ "version" "0.5.21"
+ dependencies:
+ "buffer-from" "^1.0.0"
+ "source-map" "^0.6.0"
+
+"source-map@^0.6.0":
+ "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ "version" "0.6.1"
+
+"string_decoder@^1.1.1":
+ "integrity" "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="
+ "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz"
+ "version" "1.3.0"
+ dependencies:
+ "safe-buffer" "~5.2.0"
+
+"tar-stream@2.2.0":
+ "integrity" "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="
+ "resolved" "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "bl" "^4.0.3"
+ "end-of-stream" "^1.4.1"
+ "fs-constants" "^1.0.0"
+ "inherits" "^2.0.3"
+ "readable-stream" "^3.1.1"
+
+"ts-node@^8.6.2":
+ "integrity" "sha512-ISJJGgkIpDdBhWVu3jufsWpK3Rzo7bdiIXJjQc0ynKxVOVcg2oIrf2H2cejminGrptVc6q6/uynAHNCuWGbpVA=="
+ "resolved" "https://registry.npmjs.org/ts-node/-/ts-node-8.10.2.tgz"
+ "version" "8.10.2"
+ dependencies:
+ "arg" "^4.1.0"
+ "diff" "^4.0.1"
+ "make-error" "^1.1.1"
+ "source-map-support" "^0.5.17"
+ "yn" "3.1.1"
+
+"typescript@^3.7.5", "typescript@>=2.7":
+ "integrity" "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q=="
+ "resolved" "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz"
+ "version" "3.9.10"
+
+"universalify@^2.0.0":
+ "integrity" "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ "resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
+ "version" "2.0.0"
+
+"util-deprecate@^1.0.1":
+ "integrity" "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ "version" "1.0.2"
+
+"which@^2.0.1", "which@^2.0.2":
+ "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+ "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "isexe" "^2.0.0"
+
+"wrappy@1":
+ "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ "version" "1.0.2"
+
+"yauzl@^2.10.0":
+ "integrity" "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk="
+ "resolved" "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz"
+ "version" "2.10.0"
+ dependencies:
+ "buffer-crc32" "~0.2.3"
+ "fd-slicer" "~1.1.0"
+
+"yn@3.1.1":
+ "integrity" "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="
+ "resolved" "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"
+ "version" "3.1.1"
diff --git a/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj b/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj
index 476107e414..bc6052a3bc 100644
--- a/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj
+++ b/src/Components/test/testassets/BasicTestApp/BasicTestApp.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
+<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -22,10 +22,12 @@
<Reference Include="System.ComponentModel" />
<Reference Include="System.Net.Http.Json" />
<Reference Include="Microsoft.AspNetCore.Components.WebAssembly" />
+ <Reference Include="Microsoft.AspNetCore.Components.CustomElements" />
<Reference Include="Microsoft.AspNetCore.Components.Authorization" />
<Reference Include="Microsoft.AspNetCore.SignalR.Client" />
<Reference Include="Microsoft.Extensions.Logging.Configuration" />
<Reference Include="Newtonsoft.Json" />
+ <Reference Include="System.Private.Uri" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor b/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor
index 2b04292aee..56bc049ebc 100644
--- a/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor
+++ b/src/Components/test/testassets/BasicTestApp/BindCasesComponent.razor
@@ -453,6 +453,25 @@
<input id="time-step-textbox-nullable-timeonly-mirror" @bind="timeStepTextboxNullableTimeOnlyValue" @bind:format="HH:mm:ss" readonly />
</p>
+<h3>datetime-local with no step attribute bound to a value with seconds</h3>
+<p>
+ DateTime:
+ <input id="datetime-local-default-step-textbox-datetime" @bind="timeStepTextboxDateTimeValue" type="datetime-local" />
+ <span id="datetime-local-default-step-textbox-datetime-value">@timeStepTextboxDateTimeValue</span>
+</p>
+
+<h3>time with no step attribute bound to a value with seconds</h3>
+<p>
+ DateTime:
+ <input id="time-default-step-textbox-datetime" @bind="timeStepTextboxDateTimeValue" type="time" />
+ <span id="time-default-step-textbox-datetime-value">@timeStepTextboxDateTimeValue</span>
+</p>
+<p>
+ TimeOnly:
+ <input id="time-default-step-textbox-timeonly" @bind="timeStepTextboxTimeOnlyValue" type="time" />
+ <span id="time-default-step-textbox-timeonly-value">@timeStepTextboxTimeOnlyValue.ToLongTimeString()</span>
+</p>
+
@code {
string textboxInitiallyBlankValue = null;
string textboxInitiallyPopulatedValue = "Hello";
diff --git a/src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor b/src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor
new file mode 100644
index 0000000000..c5905a8051
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/CustomElementParameterTypes.razor
@@ -0,0 +1,48 @@
+@using Microsoft.JSInterop
+
+<button class="invoke-callback" @onclick="InvokeCallbackAsync">Invoke callback</button><br />
+<strong>@nameof(StringParam)</strong>: <span class="string-param">@StringParam</span><br />
+<strong>@nameof(BoolParam)</strong>: <span class="bool-param">@BoolParam</span><br />
+<strong>@nameof(IntParam)</strong>: <span class="int-param">@IntParam</span><br />
+<strong>@nameof(LongParam)</strong>: <span class="long-param">@LongParam</span><br />
+<strong>@nameof(FloatParam)</strong>: <span class="float-param">@FloatParam</span><br />
+<strong>@nameof(DoubleParam)</strong>: <span class="double-param">@DoubleParam</span><br />
+<strong>@nameof(DecimalParam)</strong>: <span class="decimal-param">@DecimalParam</span><br />
+<strong>@nameof(NullableBoolParam)</strong>: <span class="nullable-bool-param">@(NullableBoolParam?.ToString() ?? "null")</span><br />
+<strong>@nameof(NullableIntParam)</strong>: <span class="nullable-int-param">@(NullableIntParam?.ToString() ?? "null")</span><br />
+<strong>@nameof(NullableLongParam)</strong>: <span class="nullable-long-param">@(NullableLongParam?.ToString() ?? "null")</span><br />
+<strong>@nameof(NullableFloatParam)</strong>: <span class="nullable-float-param">@(NullableFloatParam?.ToString() ?? "null")</span><br />
+<strong>@nameof(NullableDoubleParam)</strong>: <span class="nullable-double-param">@(NullableDoubleParam?.ToString() ?? "null")</span><br />
+<strong>@nameof(NullableDecimalParam)</strong>: <span class="nullable-decimal-param">@(NullableDecimalParam?.ToString() ?? "null")</span><br />
+<strong>@nameof(ComplexTypeParam)</strong>: <span class="complex-type-param">@ComplexTypeParam</span><br />
+
+@code {
+ [Parameter] public string StringParam { get; set; }
+ [Parameter] public bool BoolParam { get; set; }
+ [Parameter] public int IntParam { get; set; }
+ [Parameter] public long LongParam { get; set; }
+ [Parameter] public float FloatParam { get; set; }
+ [Parameter] public double DoubleParam { get; set; }
+ [Parameter] public decimal DecimalParam { get; set; }
+ [Parameter] public bool? NullableBoolParam { get; set; }
+ [Parameter] public int? NullableIntParam { get; set; }
+ [Parameter] public long? NullableLongParam { get; set; }
+ [Parameter] public float? NullableFloatParam { get; set; }
+ [Parameter] public double? NullableDoubleParam { get; set; }
+ [Parameter] public decimal? NullableDecimalParam { get; set; }
+ [Parameter] public MyComplexType ComplexTypeParam { get; set; }
+ [Parameter] public EventCallback CallbackParam { get; set; }
+
+ private async Task InvokeCallbackAsync()
+ {
+ await CallbackParam.InvokeAsync();
+ }
+
+ public class MyComplexType
+ {
+ public string Property { get; set; }
+
+ public override string ToString()
+ => $@"{{ {nameof(Property)} = ""{Property}"" }}";
+ }
+}
diff --git a/src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor b/src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor
new file mode 100644
index 0000000000..f88ab8d3f0
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/CustomElementsComponent.razor
@@ -0,0 +1,75 @@
+@using Microsoft.JSInterop
+@inject IJSRuntime JSRuntime
+
+<h3>CustomElementsComponent</h3>
+
+<p id="message"></p>
+
+<button id="add-custom-element" @onclick="AddCustomElement">Add custom element</button>
+<button id="remove-custom-element" @onclick="RemoveCustomElement">Remove custom element</button>
+
+@for (var i = 0; i < _customElements.Count; i++)
+{
+ var customElement = _customElements[i];
+ var clickCount = customElement.ClickCount;
+ <p>
+ <button id="increment-@i" @onclick="customElement.IncrementCount">Increment</button><br />
+ <button id="update-complex-parameters-@i" @onclick="customElement.UpdateComplexParameters">Update complex parameters</button><br />
+ <my-custom-element
+ @ref="@customElement.Reference"
+ id="custom-element-@i"
+ string-param="Custom element @i (Clicked @clickCount times)"
+ bool-param="@((clickCount % 2 == 0).ToString())"
+ int-param="@clickCount"
+ long-param="@clickCount"
+ float-param="@(clickCount + 0.5)"
+ double-param="@(clickCount + 0.5)"
+ decimal-param="@(clickCount + 0.5)"
+ nullable-bool-param="@(clickCount % 2 == 0 ? bool.TrueString : null)"
+ nullable-int-param="@(clickCount % 2 == 0 ? clickCount : null)"
+ nullable-long-param="@(clickCount % 2 == 0 ? clickCount : null)"
+ nullable-float-param="@(clickCount % 2 == 0 ? clickCount + 0.5 : null)"
+ nullable-double-param="@(clickCount % 2 == 0 ? clickCount + 0.5 : null)"
+ nullable-decimal-param="@(clickCount % 2 == 0 ? clickCount + 0.5 : null)" />
+ </p>
+}
+
+@code {
+ private List<CustomElementWrapper> _customElements = new();
+
+ private void AddCustomElement()
+ {
+ _customElements.Add(new(JSRuntime));
+ }
+
+ private void RemoveCustomElement()
+ {
+ if (_customElements.Count != 0)
+ {
+ _customElements.RemoveAt(_customElements.Count - 1);
+ }
+ }
+
+ private class CustomElementWrapper
+ {
+ private readonly IJSRuntime _jsRuntime;
+
+ public ElementReference Reference { get; set; }
+ public int ClickCount { get; private set; }
+
+ public CustomElementWrapper(IJSRuntime jsRuntime)
+ {
+ _jsRuntime = jsRuntime;
+ }
+
+ public void IncrementCount()
+ {
+ ClickCount++;
+ }
+
+ public async Task UpdateComplexParameters()
+ {
+ await _jsRuntime.InvokeVoidAsync("customElementFunctions.updateComplexProperties", Reference, ClickCount);
+ }
+ }
+}
diff --git a/src/Components/test/testassets/BasicTestApp/HttpClientTest/HttpRequestsComponent.razor b/src/Components/test/testassets/BasicTestApp/HttpClientTest/HttpRequestsComponent.razor
index ab4e21583f..9a1bc45c1d 100644
--- a/src/Components/test/testassets/BasicTestApp/HttpClientTest/HttpRequestsComponent.razor
+++ b/src/Components/test/testassets/BasicTestApp/HttpClientTest/HttpRequestsComponent.razor
@@ -55,7 +55,7 @@
</style>
@code {
- string uri = "http://api.icndb.com/jokes/random";
+ string uri = "https://api.icndb.com/jokes/random";
string method = "GET";
string requestBody = "";
List<RequestHeader> requestHeaders = new List<RequestHeader>();
diff --git a/src/Components/test/testassets/BasicTestApp/Index.razor b/src/Components/test/testassets/BasicTestApp/Index.razor
index 87da2d67e4..5cd0688202 100644
--- a/src/Components/test/testassets/BasicTestApp/Index.razor
+++ b/src/Components/test/testassets/BasicTestApp/Index.razor
@@ -18,6 +18,7 @@
<option value="BasicTestApp.CounterComponentUsingChild">Counter using child component</option>
<option value="BasicTestApp.CounterComponentWrapper">Counter wrapped in parent</option>
<option value="BasicTestApp.CulturePicker">Culture Picker</option>
+ <option value="BasicTestApp.CustomElementsComponent">Custom elements</option>
<option value="BasicTestApp.DataDashComponent">data-* attribute rendering</option>
<option value="BasicTestApp.DispatchingComponent">Dispatching to sync context</option>
<option value="BasicTestApp.DuplicateAttributesComponent">Duplicate attributes</option>
@@ -100,6 +101,7 @@
<option value="BasicTestApp.TouchEventComponent">Touch events</option>
<option value="BasicTestApp.VirtualizationComponent">Virtualization</option>
<option value="BasicTestApp.VirtualizationDataChanges">Virtualization data changes</option>
+ <option value="BasicTestApp.VirtualizationTable">Virtualization HTML table</option>
<option value="BasicTestApp.HotReload.RenderOnHotReload">Render on hot reload</option>
</select>
diff --git a/src/Components/test/testassets/BasicTestApp/InteropComponent.razor b/src/Components/test/testassets/BasicTestApp/InteropComponent.razor
index 73075616cc..fd496a8cd1 100644
--- a/src/Components/test/testassets/BasicTestApp/InteropComponent.razor
+++ b/src/Components/test/testassets/BasicTestApp/InteropComponent.razor
@@ -138,11 +138,11 @@
ReturnValues["returnPrimitive"] = ((IJSInProcessRuntime)JSRuntime).Invoke<int>("returnPrimitive").ToString();
ReturnValues["returnArray"] = string.Join(",", ((IJSInProcessRuntime)JSRuntime).Invoke<Segment[]>("returnArray").Select(x => x.Source).ToArray());
}
-
+
try
{
- // Triger a non-serializable WindowProxy (https://developer.mozilla.org/en-US/docs/Web/API/Window)
- // InvokeVoidAsync shouldn't serialize return values, and thus there shouldn't be any exception thrown.
+ // Trigger a non-serializable WindowProxy (https://developer.mozilla.org/en-US/docs/Web/API/Window)
+ // InvokeVoidAsync shouldn't serialize return values, and thus there shouldn't be any exception thrown.
await JSRuntime.InvokeVoidAsync("eval", "window");
ReturnValues["invokeVoidAsyncReturnsWithoutSerializing"] = "Success";
}
@@ -151,6 +151,50 @@
ReturnValues["invokeVoidAsyncReturnsWithoutSerializing"] = $"Failure: {ex.Message}";
}
+ try
+ {
+ // Trigger a non-serializable WindowProxy (https://developer.mozilla.org/en-US/docs/Web/API/Window)
+ // InvokeAsync should serialize return values, and thus there should be an exception thrown.
+ var circularStructure = await JSRuntime.InvokeAsync<object>("eval", "window");
+ ReturnValues["invokeAsyncThrowsSerializingCircularStructure"] = circularStructure is null ? "Failure: null" : "Failure: not null";
+ }
+ catch (JSException)
+ {
+ ReturnValues["invokeAsyncThrowsSerializingCircularStructure"] = "Success";
+ }
+ catch (Exception ex)
+ {
+ ReturnValues["invokeAsyncThrowsSerializingCircularStructure"] = $"Failure: {ex.Message}";
+ }
+
+ try
+ {
+ var undefinedJsObjectReference = await JSRuntime.InvokeAsync<IJSObjectReference>("returnUndefined");
+ ReturnValues["invokeAsyncThrowsUndefinedJSObjectReference"] = undefinedJsObjectReference is null ? "Failure: null" : "Failure: not null";
+ }
+ catch (JSException)
+ {
+ ReturnValues["invokeAsyncThrowsUndefinedJSObjectReference"] = "Success";
+ }
+ catch (Exception ex)
+ {
+ ReturnValues["invokeAsyncThrowsUndefinedJSObjectReference"] = $"Failure: {ex.Message}";
+ }
+
+ try
+ {
+ var nullJsObjectReference = await JSRuntime.InvokeAsync<IJSObjectReference>("returnNull");
+ ReturnValues["invokeAsyncThrowsNullJSObjectReference"] = nullJsObjectReference is null ? "Failure: null" : "Failure: not null";
+ }
+ catch (JSException)
+ {
+ ReturnValues["invokeAsyncThrowsNullJSObjectReference"] = "Success";
+ }
+ catch (Exception ex)
+ {
+ ReturnValues["invokeAsyncThrowsNullJSObjectReference"] = $"Failure: {ex.Message}";
+ }
+
var jsObjectReference = await JSRuntime.InvokeAsync<IJSObjectReference>("returnJSObjectReference");
ReturnValues["jsObjectReference.identity"] = await jsObjectReference.InvokeAsync<string>("identity", "Invoked from JSObjectReference");
ReturnValues["jsObjectReference.nested.add"] = (await jsObjectReference.InvokeAsync<int>("nested.add", 2, 3)).ToString();
@@ -159,7 +203,7 @@
try
{
// Fetch a non-serializable Window (https://developer.mozilla.org/en-US/docs/Web/API/Window)
- // InvokeVoidAsync shouldn't serialize return values, and thus there shouldn't be any exception thrown.
+ // InvokeVoidAsync shouldn't serialize return values, and thus there shouldn't be any exception thrown.
await jsObjectReference.InvokeVoidAsync("getWindow");
ReturnValues["invokeVoidAsyncReturnsWithoutSerializingInJSObjectReference"] = "Success";
}
@@ -225,7 +269,7 @@
var dotNetStreamReferenceWrapper = DotNetStreamReferenceInterop.GetDotNetStreamWrapperReference();
ReturnValues["dotNetToJSReceiveDotNetStreamWrapperReferenceAsync"] = await JSRuntime.InvokeAsync<string>("jsInteropTests.receiveDotNetStreamWrapperReference", dotNetStreamReferenceWrapper);
-
+
Invocations = invocations;
DoneWithInterop = true;
}
@@ -284,7 +328,7 @@
{
var inProcRuntime = ((IJSInProcessRuntime)JSRuntime);
- try
+ try
{
// Fetch a non-serializable Window (https://developer.mozilla.org/en-US/docs/Web/API/Window)
// InvokeVoid shouldn't serialize return values, and thus there shouldn't be any exception thrown.
@@ -296,6 +340,50 @@
ReturnValues["invokeVoidReturnsWithoutSerializingIJSInProcessRuntime"] = $"Failure: {ex.Message}";
}
+ try
+ {
+ // Trigger a non-serializable WindowProxy (https://developer.mozilla.org/en-US/docs/Web/API/Window)
+ // Invoke should serialize return values, and thus there should be an exception thrown.
+ var circularStructure = inProcRuntime.Invoke<object>("eval", "window");
+ ReturnValues["invokeThrowsSerializingCircularStructure"] = circularStructure is null ? "Failure: null" : "Failure: not null";
+ }
+ catch (JSException)
+ {
+ ReturnValues["invokeThrowsSerializingCircularStructure"] = "Success";
+ }
+ catch (Exception ex)
+ {
+ ReturnValues["invokeThrowsSerializingCircularStructure"] = $"Failure: {ex.Message}";
+ }
+
+ try
+ {
+ var undefinedJsObjectReference = inProcRuntime.Invoke<IJSObjectReference>("returnUndefined");
+ ReturnValues["invokeThrowsUndefinedJSObjectReference"] = undefinedJsObjectReference is null ? "Failure: null" : "Failure: not null";
+ }
+ catch (JSException)
+ {
+ ReturnValues["invokeThrowsUndefinedJSObjectReference"] = "Success";
+ }
+ catch (Exception ex)
+ {
+ ReturnValues["invokeThrowsUndefinedJSObjectReference"] = $"Failure: {ex.Message}";
+ }
+
+ try
+ {
+ var nullJsObjectReference = inProcRuntime.Invoke<IJSObjectReference>("returnNull");
+ ReturnValues["invokeThrowsNullJSObjectReference"] = nullJsObjectReference is null ? "Failure: null" : "Failure: not null";
+ }
+ catch (JSException)
+ {
+ ReturnValues["invokeThrowsNullJSObjectReference"] = "Success";
+ }
+ catch (Exception ex)
+ {
+ ReturnValues["invokeThrowsNullJSObjectReference"] = $"Failure: {ex.Message}";
+ }
+
var jsInProcObjectReference = inProcRuntime.Invoke<IJSInProcessObjectReference>("returnJSObjectReference");
ReturnValues["jsInProcessObjectReference.identity"] = jsInProcObjectReference.Invoke<string>("identity", "Invoked from JSInProcessObjectReference");
@@ -313,6 +401,7 @@
// we should be able to downcast a IJSInProcessObjectReference as a IJSUnmarshalledObjectReference
var unmarshalledCast = (IJSUnmarshalledObjectReference)jsInProcObjectReference;
+#pragma warning disable CS0618 // Type or member is obsolete
ReturnValues["jsCastedUnmarshalledObjectReference.unmarshalledFunction"] = unmarshalledCast.InvokeUnmarshalled<InteropStruct, bool>("unmarshalledFunction", new InteropStruct
{
Message = "Sent from .NET",
@@ -330,6 +419,7 @@
var dataReference = unmarshalledRuntime.InvokeUnmarshalled<IJSStreamReference>("jsToDotNetStreamReturnValue");
+#pragma warning restore CS0618 // Type or member is obsolete
using var dataReferenceStream = await dataReference.OpenReadStreamAsync();
await ValidateStreamValuesAsync("jsToDotNetStreamReturnValueUnmarshalled", dataReferenceStream);
}
diff --git a/src/Components/test/testassets/BasicTestApp/NavigateOnSubmit.razor b/src/Components/test/testassets/BasicTestApp/NavigateOnSubmit.razor
index a66244d992..215052cfc4 100644
--- a/src/Components/test/testassets/BasicTestApp/NavigateOnSubmit.razor
+++ b/src/Components/test/testassets/BasicTestApp/NavigateOnSubmit.razor
@@ -13,7 +13,11 @@
public void NavigateToPage()
{
- NavigationManager.NavigateTo("/subdir");
+ // The purpose of this test case is to show that the @onblur handler doesn't interfere with
+ // navigating to another page (https://github.com/dotnet/aspnetcore/issues/21241). We're doing
+ // a force-load here because the E2E test script wants to verify that the server-side navigation
+ // doesn't get blocked by the presence of the @onblur handler.
+ NavigationManager.NavigateTo("/subdir", true);
}
public void HandleBlur()
diff --git a/src/Components/test/testassets/BasicTestApp/Program.cs b/src/Components/test/testassets/BasicTestApp/Program.cs
index b669190d7d..0cef496473 100644
--- a/src/Components/test/testassets/BasicTestApp/Program.cs
+++ b/src/Components/test/testassets/BasicTestApp/Program.cs
@@ -28,6 +28,7 @@ public class Program
builder.RootComponents.RegisterForJavaScript<JavaScriptRootComponentParameterTypes>(
"component-with-many-parameters",
javaScriptInitializer: "myJsRootComponentInitializers.testInitializer");
+ builder.RootComponents.RegisterCustomElement<CustomElementParameterTypes>("my-custom-element");
builder.Services.AddSingleton(new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddSingleton<AuthenticationStateProvider, ServerAuthenticationStateProvider>();
diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/ConfigurableNavigationLock.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/ConfigurableNavigationLock.razor
new file mode 100644
index 0000000000..8cc31ef793
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/RouterTest/ConfigurableNavigationLock.razor
@@ -0,0 +1,99 @@
+@using Microsoft.AspNetCore.Components.Routing
+
+<input class="block-internal-navigation" type="checkbox" @bind-value="_blockInternalNavigation" />Block internal navigation<br />
+<input class="confirm-external-navigation" type="checkbox" @bind-value="_confirmExternalNavigation" />Confirm external navigation<br />
+
+<p class="navigation-log">
+ @for (var i = 0; i < _log.Count; i++)
+ {
+ var entryIndex = i;
+ <span class="navigation-log-entry-@entryIndex">@_log[entryIndex]</span><br />
+ }
+</p>
+
+@if (_context?.TargetLocation is { } targetLocation)
+{
+ <div class="blocking-controls">
+ <span style="color: red;">Blocking '@targetLocation'</span><br />
+ @if (_context?.HistoryEntryState is { } state)
+ {
+ <span class="history-state">State = '@state'</span><br />
+ }
+ <button class="navigation-continue" @onclick="Continue">Continue</button>
+ <button class="navigation-cancel" @onclick="Cancel">Cancel</button>
+ <button class="navigation-throw-exception" @onclick="ThrowException">Throw exception</button>
+ </div>
+}
+
+@{
+ var onBeforeInternalNavigation = _blockInternalNavigation
+ ? BlockNavigationAsync
+ : default(Func<LocationChangingContext, Task>);
+}
+
+<NavigationLock OnBeforeInternalNavigation="onBeforeInternalNavigation" ConfirmExternalNavigation="_confirmExternalNavigation" />
+
+@code {
+ private readonly List<string> _log = new();
+
+ private TaskCompletionSource<bool> _tcs;
+ private LocationChangingContext _context;
+
+ private bool _blockInternalNavigation;
+ private bool _confirmExternalNavigation;
+
+ public async Task BlockNavigationAsync(LocationChangingContext context)
+ {
+ if (_tcs is not null)
+ {
+ throw new InvalidOperationException();
+ }
+
+ _tcs = new();
+ _context = context;
+
+ try
+ {
+ var shouldContinueNavigation = await _tcs.Task.WaitAsync(context.CancellationToken);
+
+ if (!shouldContinueNavigation)
+ {
+ _context.PreventNavigation();
+ Log($"Canceling '{context.TargetLocation}'");
+ return;
+ }
+
+ Log($"Continuing '{context.TargetLocation}'");
+ }
+ catch (TaskCanceledException)
+ {
+ Log($"Canceling '{context.TargetLocation}'");
+ throw;
+ }
+ catch
+ {
+ Log($"Exception thrown for '{context.TargetLocation}'");
+ throw;
+ }
+ finally
+ {
+ _tcs = null;
+ _context = null;
+ }
+ }
+
+ public void Continue()
+ => _tcs?.TrySetResult(true);
+
+ public void Cancel()
+ => _tcs?.TrySetResult(false);
+
+ public void ThrowException()
+ => _tcs?.SetException(new InvalidOperationException("A test exception was thrown during navigation"));
+
+ private void Log(string message)
+ {
+ _log.Add(message);
+ StateHasChanged();
+ }
+}
diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/Links.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/Links.razor
index 67d6bb8a24..c473154908 100644
--- a/src/Components/test/testassets/BasicTestApp/RouterTest/Links.razor
+++ b/src/Components/test/testassets/BasicTestApp/RouterTest/Links.razor
@@ -9,8 +9,11 @@
<ul>
<li><NavLink href="/subdir/" Match=NavLinkMatch.All>Default (matches all)</NavLink></li>
<li><NavLink href="" Match=NavLinkMatch.All>Default with base-relative URL (matches all)</NavLink></li>
+ <li><NavLink href="/subdir" Match=NavLinkMatch.All>Default, no trailing slash (matches all)</NavLink></li>
<li><NavLink href="/subdir/?abc=123">Default with query</NavLink></li>
+ <li><NavLink href="/subdir?abc=123">Default with query, no trailing slash</NavLink></li>
<li><NavLink href="/subdir/#blah">Default with hash</NavLink></li>
+ <li><NavLink href="/subdir#blah">Default with hash, no trailing slash</NavLink></li>
<li><NavLink href="/subdir/Default.html">With extension</NavLink></li>
<li><NavLink href="/subdir/Other">Other</NavLink></li>
<li><NavLink href="Other" Match=NavLinkMatch.All>Other with base-relative URL (matches all)</NavLink></li>
diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/NavigationManagerComponent.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/NavigationManagerComponent.razor
index 172ab87b13..efd29a386f 100644
--- a/src/Components/test/testassets/BasicTestApp/RouterTest/NavigationManagerComponent.razor
+++ b/src/Components/test/testassets/BasicTestApp/RouterTest/NavigationManagerComponent.razor
@@ -2,22 +2,62 @@
@using Microsoft.AspNetCore.Components.Routing
@inject IJSRuntime JSRuntime
+@inject INavigationInterception NavigationInterception
@inject NavigationManager NavigationManager
@implements IDisposable
-<button @onclick="Navigate">Navigate</button>
+<p>
+ <button @onclick="Navigate">Navigate</button>
+</p>
-<span id="test-info">@UrlLocation</span>
+<p>
+ <button id="programmatic-navigation" @onclick="ProgrammaticNavigation">Programmatic navigation</button><br />
+</p>
+
+<p>
+ <a id="internal-link-navigation" href="some-path-@nextLinkNavigationIndex">/some-path-@nextLinkNavigationIndex</a>
+ <button id="increment-link-navigation-index" @onclick="IncrementLinkNavigationIndex">Increment path index</button><br />
+</p>
+
+<p>
+ <span id="test-info">@UrlLocation</span><br />
+ Location changed <span id="location-changed-count">@locationChangedCount</span> times
+</p>
+
+<p>
+ <button id="add-navigation-lock" @onclick="AddNavigationLock">Add navigation lock</button><br />
+ <button id="remove-navigation-lock" @onclick="RemoveNavigationLock">Remove navigation lock</button>
+</p>
+
+@for (var i = 0; i < navigationLockCount; i++)
+{
+ var lockIndex = i;
+
+ <div id="navigation-lock-@lockIndex" style="outline: 2px solid black">
+ Navigation lock @lockIndex<br />
+ <ConfigurableNavigationLock />
+ </div>
+}
@code{
string UrlLocation;
+ int navigationLockCount;
+ int locationChangedCount;
+ int nextProgrammaticNavigationIndex;
+ int nextLinkNavigationIndex;
+
protected override void OnInitialized()
{
UrlLocation = NavigationManager.Uri;
NavigationManager.LocationChanged += OnLocationChanged;
}
+ protected override async Task OnInitializedAsync()
+ {
+ await NavigationInterception.EnableNavigationInterceptionAsync();
+ }
+
void IDisposable.Dispose()
{
NavigationManager.LocationChanged -= OnLocationChanged;
@@ -26,11 +66,38 @@
void OnLocationChanged(object sender, LocationChangedEventArgs e)
{
UrlLocation = NavigationManager.Uri;
+ locationChangedCount++;
StateHasChanged();
}
+ void AddNavigationLock()
+ => navigationLockCount++;
+
+ void RemoveNavigationLock()
+ {
+ if (navigationLockCount > 0)
+ {
+ navigationLockCount--;
+ }
+ }
+
async Task Navigate()
{
await JSRuntime.InvokeVoidAsync("navigationManagerNavigate");
}
+
+ void IncrementLinkNavigationIndex()
+ {
+ nextLinkNavigationIndex++;
+ }
+
+ void ProgrammaticNavigation()
+ {
+ NavigationManager.NavigateTo($"/subdir/some-path-{nextProgrammaticNavigationIndex}", new NavigationOptions
+ {
+ HistoryEntryState = $"Navigation index {nextProgrammaticNavigationIndex}",
+ });
+
+ nextProgrammaticNavigationIndex++;
+ }
}
diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/Other.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/Other.razor
index d7a01e9bf3..07e29781d4 100644
--- a/src/Components/test/testassets/BasicTestApp/RouterTest/Other.razor
+++ b/src/Components/test/testassets/BasicTestApp/RouterTest/Other.razor
@@ -1,2 +1,4 @@
@page "/Other"
+@inject NavigationManager Navigation
<div id="test-info">This is another page.</div>
+<div id="test-state">@Navigation.HistoryEntryState</div>
diff --git a/src/Components/test/testassets/BasicTestApp/RouterTest/ProgrammaticNavigationCases.razor b/src/Components/test/testassets/BasicTestApp/RouterTest/ProgrammaticNavigationCases.razor
index 09fcb51c0a..3c86f3d339 100644
--- a/src/Components/test/testassets/BasicTestApp/RouterTest/ProgrammaticNavigationCases.razor
+++ b/src/Components/test/testassets/BasicTestApp/RouterTest/ProgrammaticNavigationCases.razor
@@ -15,6 +15,10 @@
Programmatic navigation with force-load
</button>
+<button id="do-other-navigation-forced-state" @onclick="@(() => NavigationManager.NavigateTo("Other", new NavigationOptions{ HistoryEntryState = "state", ForceLoad = true }))">
+ Programmatic navigation (NavigationOptions overload) with force-load and state
+</button>
+
<button id="do-other-navigation-replacehistoryentry" @onclick="@(() => NavigationManager.NavigateTo("Other", replace: true))">
Programmatic navigation with replace
</button>
@@ -22,3 +26,11 @@
<button id="do-other-navigation-forced-replacehistoryentry" @onclick="@(() => NavigationManager.NavigateTo("Other", forceLoad: true, replace: true))">
Programmatic navigation with force-load and replace
</button>
+
+<button id="do-other-navigation-state" @onclick="@(() => NavigationManager.NavigateTo("Other", new NavigationOptions { HistoryEntryState = "state" }))">
+ Programmatic navigation (NavigationOptions overload) with state
+</button>
+
+<button id="do-other-navigation-state-replacehistoryentry" @onclick="@(() => NavigationManager.NavigateTo("Other", new NavigationOptions { HistoryEntryState = "state", ReplaceHistoryEntry = true }))">
+ Programmatic navigation (NavigationOptions overload) with replace and state
+</button>
diff --git a/src/Components/test/testassets/BasicTestApp/VirtualizationTable.razor b/src/Components/test/testassets/BasicTestApp/VirtualizationTable.razor
new file mode 100644
index 0000000000..a928ec8089
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/VirtualizationTable.razor
@@ -0,0 +1,28 @@
+<p>This is to show we can use an HTML table with Virtualize, despite it having particular rules about the element hierarchy.</p>
+<p>We're also using the document root as the scroll container. Other tests cover having a different scroll container, such as a div with overflow:scroll.</p>
+
+<table id="virtualized-table">
+ <thead style="position: sticky; top: 0; background-color: silver">
+ <tr>
+ <th>Item</th>
+ <th>Another col</th>
+ </tr>
+ </thead>
+ <tbody>
+ <Virtualize Items="@fixedItems" ItemSize="30" SpacerElement="tr">
+ <tr @key="context" style="height: 30px;" id="row-@context">
+ <td>Item @context</td>
+ <td>Another value</td>
+ </tr>
+ </Virtualize>
+ </tbody>
+</table>
+
+<style>
+ /* Represents https://github.com/dotnet/aspnetcore/issues/37659 */
+ html, body { overflow-y: scroll }
+</style>
+
+@code {
+ List<int> fixedItems = Enumerable.Range(0, 1000).ToList();
+}
diff --git a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
index 02bdad9151..9048aa6427 100644
--- a/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
+++ b/src/Components/test/testassets/BasicTestApp/wwwroot/index.html
@@ -31,6 +31,7 @@
<script src="js/webComponentPerformingJsInterop.js"></script>
<script src="js/customLinkElement.js"></script>
<script src="js/jsRootComponentInitializers.js"></script>
+ <script src="js/customElementTests.js"></script>
<script>
// Used by ElementRefComponent
@@ -51,6 +52,9 @@
<!-- Used by ExternalContentPackage -->
<script src="_content/TestContentPackage/prompt.js"></script>
+
+ <!-- Used by CustomElementsComponent -->
+ <script src="_content/Microsoft.AspNetCore.Components.CustomElements/BlazorCustomElements.js"></script>
</body>
</html>
diff --git a/src/Components/test/testassets/BasicTestApp/wwwroot/js/customElementTests.js b/src/Components/test/testassets/BasicTestApp/wwwroot/js/customElementTests.js
new file mode 100644
index 0000000000..1eafa26512
--- /dev/null
+++ b/src/Components/test/testassets/BasicTestApp/wwwroot/js/customElementTests.js
@@ -0,0 +1,10 @@
+window.customElementFunctions = {
+ updateComplexProperties: function (element, count) {
+ element.complexTypeParam = {
+ property: `Clicked ${count} times`,
+ };
+ element.callbackParam = () => {
+ document.getElementById('message').innerText = `Callback with count = ${count}`;
+ };
+ }
+};
diff --git a/src/Components/test/testassets/BasicTestApp/wwwroot/js/jsinteroptests.js b/src/Components/test/testassets/BasicTestApp/wwwroot/js/jsinteroptests.js
index 4bdc147ee0..8e344b4141 100644
--- a/src/Components/test/testassets/BasicTestApp/wwwroot/js/jsinteroptests.js
+++ b/src/Components/test/testassets/BasicTestApp/wwwroot/js/jsinteroptests.js
@@ -223,6 +223,8 @@ window.jsInteropTests = {
functionThrowsException: functionThrowsException,
asyncFunctionThrowsSyncException: asyncFunctionThrowsSyncException,
asyncFunctionThrowsAsyncException: asyncFunctionThrowsAsyncException,
+ returnUndefined: returnUndefined,
+ returnNull: returnNull,
returnPrimitive: returnPrimitive,
returnPrimitiveAsync: returnPrimitiveAsync,
returnJSObjectReference: returnJSObjectReference,
@@ -233,6 +235,14 @@ window.jsInteropTests = {
receiveDotNetStreamWrapperReference: receiveDotNetStreamWrapperReference,
};
+function returnUndefined() {
+ return undefined;
+}
+
+function returnNull() {
+ return null;
+}
+
function returnPrimitive() {
return 123;
}
diff --git a/src/DataProtection/Abstractions/src/DataProtectionCommonExtensions.cs b/src/DataProtection/Abstractions/src/DataProtectionCommonExtensions.cs
index 53bc26e9bd..54d0133aed 100644
--- a/src/DataProtection/Abstractions/src/DataProtectionCommonExtensions.cs
+++ b/src/DataProtection/Abstractions/src/DataProtectionCommonExtensions.cs
@@ -183,7 +183,6 @@ public static class DataProtectionCommonExtensions
/// <param name="protector">The data protector to use for this operation.</param>
/// <param name="plaintext">The plaintext data to protect.</param>
/// <returns>The protected form of the plaintext data.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static string Protect(this IDataProtector protector, string plaintext)
{
if (protector == null)
@@ -218,7 +217,6 @@ public static class DataProtectionCommonExtensions
/// <exception cref="System.Security.Cryptography.CryptographicException">
/// Thrown if <paramref name="protectedData"/> is invalid or malformed.
/// </exception>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static string Unprotect(this IDataProtector protector, string protectedData)
{
if (protector == null)
diff --git a/src/DataProtection/Abstractions/src/IDataProtector.cs b/src/DataProtection/Abstractions/src/IDataProtector.cs
index 166535756f..af02695d85 100644
--- a/src/DataProtection/Abstractions/src/IDataProtector.cs
+++ b/src/DataProtection/Abstractions/src/IDataProtector.cs
@@ -15,7 +15,6 @@ public interface IDataProtector : IDataProtectionProvider
/// </summary>
/// <param name="plaintext">The plaintext data to protect.</param>
/// <returns>The protected form of the plaintext data.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] Protect(byte[] plaintext);
/// <summary>
@@ -26,6 +25,5 @@ public interface IDataProtector : IDataProtectionProvider
/// <exception cref="System.Security.Cryptography.CryptographicException">
/// Thrown if the protected data is invalid or malformed.
/// </exception>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] Unprotect(byte[] protectedData);
}
diff --git a/src/DataProtection/Cryptography.Internal/src/Cng/OSVersionUtil.cs b/src/DataProtection/Cryptography.Internal/src/Cng/OSVersionUtil.cs
index f9e966b4f2..8b706c6347 100644
--- a/src/DataProtection/Cryptography.Internal/src/Cng/OSVersionUtil.cs
+++ b/src/DataProtection/Cryptography.Internal/src/Cng/OSVersionUtil.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
using Microsoft.AspNetCore.Cryptography.SafeHandles;
namespace Microsoft.AspNetCore.Cryptography.Cng;
@@ -11,34 +12,29 @@ internal static class OSVersionUtil
private static OSVersion GetOSVersion()
{
- const string BCRYPT_LIB = "bcrypt.dll";
- SafeLibraryHandle? bcryptLibHandle = null;
- try
- {
- bcryptLibHandle = SafeLibraryHandle.Open(BCRYPT_LIB);
- }
- catch
+ if (Environment.OSVersion.Platform is not PlatformID.Win32NT)
{
- // we'll handle the exceptional case later
+ // Not running on Win7+.
+ return OSVersion.NotWindows;
}
- if (bcryptLibHandle != null)
+ try
{
- using (bcryptLibHandle)
+ // REVIEW: Should we just use the lazy handle instead of disposing?
+ using var bcryptLibHandle = SafeLibraryHandle.Open(UnsafeNativeMethods.BCRYPT_LIB);
+
+ if (bcryptLibHandle.DoesProcExist("BCryptKeyDerivation"))
{
- if (bcryptLibHandle.DoesProcExist("BCryptKeyDerivation"))
- {
- // We're running on Win8+.
- return OSVersion.Win8OrLater;
- }
- else
- {
- // We're running on Win7+.
- return OSVersion.Win7OrLater;
- }
+ // We're running on Win8+.
+ return OSVersion.Win8OrLater;
+ }
+ else
+ {
+ // We're running on Win7+.
+ return OSVersion.Win7OrLater;
}
}
- else
+ catch
{
// Not running on Win7+.
return OSVersion.NotWindows;
diff --git a/src/DataProtection/Cryptography.Internal/src/SafeHandles/SafeLibraryHandle.cs b/src/DataProtection/Cryptography.Internal/src/SafeHandles/SafeLibraryHandle.cs
index 09c9438786..98e70e084c 100644
--- a/src/DataProtection/Cryptography.Internal/src/SafeHandles/SafeLibraryHandle.cs
+++ b/src/DataProtection/Cryptography.Internal/src/SafeHandles/SafeLibraryHandle.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Cryptography.SafeHandles;
/// <summary>
/// Represents a handle to a Windows module (DLL).
/// </summary>
-internal sealed unsafe class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInvalid
+internal sealed unsafe partial class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInvalid
{
// Called by P/Invoke when returning SafeHandles
private SafeLibraryHandle()
@@ -125,18 +125,23 @@ internal sealed unsafe class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInval
}
[SuppressUnmanagedCodeSecurity]
- private static class UnsafeNativeMethods
+ private static partial class UnsafeNativeMethods
{
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms679351(v=vs.85).aspx
- [DllImport("kernel32.dll", EntryPoint = "FormatMessageW", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode, SetLastError = true)]
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll", EntryPoint = "FormatMessageW", SetLastError = true)]
+ public static partial int FormatMessage(
+#else
+ [DllImport("kernel32.dll", EntryPoint = "FormatMessageW", SetLastError = true)]
public static extern int FormatMessage(
- [In] uint dwFlags,
- [In] SafeLibraryHandle lpSource,
- [In] uint dwMessageId,
- [In] uint dwLanguageId,
- [Out] out LocalAllocHandle lpBuffer,
- [In] uint nSize,
- [In] IntPtr Arguments
+#endif
+ uint dwFlags,
+ SafeLibraryHandle lpSource,
+ uint dwMessageId,
+ uint dwLanguageId,
+ out LocalAllocHandle lpBuffer,
+ uint nSize,
+ IntPtr Arguments
);
// http://msdn.microsoft.com/en-us/library/ms683152(v=vs.85).aspx
@@ -144,29 +149,50 @@ internal sealed unsafe class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInval
#if NETSTANDARD2_0
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
#endif
- [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
- internal static extern bool FreeLibrary(IntPtr hModule);
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll")]
+ internal static partial bool FreeLibrary(
+#else
+ [DllImport("kernel32.dll")]
+ internal static extern bool FreeLibrary(
+#endif
+ IntPtr hModule);
// http://msdn.microsoft.com/en-us/library/ms683200(v=vs.85).aspx
[return: MarshalAs(UnmanagedType.Bool)]
- [DllImport("kernel32.dll", EntryPoint = "GetModuleHandleExW", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll", EntryPoint = "GetModuleHandleExW", SetLastError = true)]
+ internal static partial bool GetModuleHandleEx(
+#else
+ [DllImport("kernel32.dll", EntryPoint = "GetModuleHandleExW", SetLastError = true)]
internal static extern bool GetModuleHandleEx(
- [In] uint dwFlags,
- [In] SafeLibraryHandle lpModuleName, // can point to a location within the module if GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS is set
- [Out] out IntPtr phModule);
+#endif
+ uint dwFlags,
+ SafeLibraryHandle lpModuleName, // can point to a location within the module if GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS is set
+ out IntPtr phModule);
// http://msdn.microsoft.com/en-us/library/ms683212(v=vs.85).aspx
- [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll", SetLastError = true)]
+ internal static partial IntPtr GetProcAddress(
+#else
+ [DllImport("kernel32.dll", SetLastError = true)]
internal static extern IntPtr GetProcAddress(
- [In] SafeLibraryHandle hModule,
- [In, MarshalAs(UnmanagedType.LPStr)] string lpProcName);
+#endif
+ SafeLibraryHandle hModule,
+ [MarshalAs(UnmanagedType.LPStr)] string lpProcName);
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
- [DllImport("kernel32.dll", EntryPoint = "LoadLibraryExW", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+#if NET7_0_OR_GREATER
+ [LibraryImport("kernel32.dll", EntryPoint = "LoadLibraryExW", SetLastError = true)]
+ internal static partial SafeLibraryHandle LoadLibraryEx(
+#else
+ [DllImport("kernel32.dll", EntryPoint = "LoadLibraryExW", SetLastError = true)]
internal static extern SafeLibraryHandle LoadLibraryEx(
- [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
- [In] IntPtr hFile,
- [In] uint dwFlags);
+#endif
+ [MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
+ IntPtr hFile,
+ uint dwFlags);
#pragma warning disable CS8763 // A method marked [DoesNotReturn] should not return.
[DoesNotReturn]
diff --git a/src/DataProtection/Cryptography.Internal/src/UnsafeNativeMethods.cs b/src/DataProtection/Cryptography.Internal/src/UnsafeNativeMethods.cs
index 94436cfc28..f943d67068 100644
--- a/src/DataProtection/Cryptography.Internal/src/UnsafeNativeMethods.cs
+++ b/src/DataProtection/Cryptography.Internal/src/UnsafeNativeMethods.cs
@@ -15,295 +15,446 @@ using Microsoft.AspNetCore.Cryptography.SafeHandles;
namespace Microsoft.AspNetCore.Cryptography;
[SuppressUnmanagedCodeSecurity]
-internal static unsafe class UnsafeNativeMethods
+internal static unsafe partial class UnsafeNativeMethods
{
- private const string BCRYPT_LIB = "bcrypt.dll";
- private static readonly Lazy<SafeLibraryHandle> _lazyBCryptLibHandle = GetLazyLibraryHandle(BCRYPT_LIB);
+ internal const string BCRYPT_LIB = "bcrypt.dll";
+ private static SafeLibraryHandle? _lazyBCryptLibHandle;
private const string CRYPT32_LIB = "crypt32.dll";
- private static readonly Lazy<SafeLibraryHandle> _lazyCrypt32LibHandle = GetLazyLibraryHandle(CRYPT32_LIB);
+ private static SafeLibraryHandle? _lazyCrypt32LibHandle;
private const string NCRYPT_LIB = "ncrypt.dll";
- private static readonly Lazy<SafeLibraryHandle> _lazyNCryptLibHandle = GetLazyLibraryHandle(NCRYPT_LIB);
-
- private static Lazy<SafeLibraryHandle> GetLazyLibraryHandle(string libraryName)
- {
- // We don't need to worry about race conditions: SafeLibraryHandle will clean up after itself
- return new Lazy<SafeLibraryHandle>(() => SafeLibraryHandle.Open(libraryName), LazyThreadSafetyMode.PublicationOnly);
- }
+ private static SafeLibraryHandle? _lazyNCryptLibHandle;
/*
* BCRYPT.DLL
*/
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375377(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptCloseAlgorithmProvider(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptCloseAlgorithmProvider(
- [In] IntPtr hAlgorithm,
- [In] uint dwFlags);
+#endif
+ IntPtr hAlgorithm,
+ uint dwFlags);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375383(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptCreateHash(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptCreateHash(
- [In] BCryptAlgorithmHandle hAlgorithm,
- [Out] out BCryptHashHandle phHash,
- [In] IntPtr pbHashObject,
- [In] uint cbHashObject,
- [In] byte* pbSecret,
- [In] uint cbSecret,
- [In] uint dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptAlgorithmHandle hAlgorithm,
+ out BCryptHashHandle phHash,
+ IntPtr pbHashObject,
+ uint cbHashObject,
+ byte* pbSecret,
+ uint cbSecret,
+ uint dwFlags);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375391(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptDecrypt(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptDecrypt(
- [In] BCryptKeyHandle hKey,
- [In] byte* pbInput,
- [In] uint cbInput,
- [In] void* pPaddingInfo,
- [In] byte* pbIV,
- [In] uint cbIV,
- [In] byte* pbOutput,
- [In] uint cbOutput,
- [Out] out uint pcbResult,
- [In] BCryptEncryptFlags dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptKeyHandle hKey,
+ byte* pbInput,
+ uint cbInput,
+ void* pPaddingInfo,
+ byte* pbIV,
+ uint cbIV,
+ byte* pbOutput,
+ uint cbOutput,
+ out uint pcbResult,
+ BCryptEncryptFlags dwFlags);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd433795(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptDeriveKeyPBKDF2(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptDeriveKeyPBKDF2(
- [In] BCryptAlgorithmHandle hPrf,
- [In] byte* pbPassword,
- [In] uint cbPassword,
- [In] byte* pbSalt,
- [In] uint cbSalt,
- [In] ulong cIterations,
- [In] byte* pbDerivedKey,
- [In] uint cbDerivedKey,
- [In] uint dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptAlgorithmHandle hPrf,
+ byte* pbPassword,
+ uint cbPassword,
+ byte* pbSalt,
+ uint cbSalt,
+ ulong cIterations,
+ byte* pbDerivedKey,
+ uint cbDerivedKey,
+ uint dwFlags);
+
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/aa375399(v=vs.85).aspx
#if NETSTANDARD2_0
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
#endif
- // http://msdn.microsoft.com/en-us/library/windows/desktop/aa375399(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptDestroyHash(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptDestroyHash(
- [In] IntPtr hHash);
+#endif
+ IntPtr hHash);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/aa375404(v=vs.85).aspx
#if NETSTANDARD2_0
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
#endif
- // http://msdn.microsoft.com/en-us/library/windows/desktop/aa375404(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptDestroyKey(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptDestroyKey(
- [In] IntPtr hKey);
+#endif
+ IntPtr hKey);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375413(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptDuplicateHash(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptDuplicateHash(
- [In] BCryptHashHandle hHash,
- [Out] out BCryptHashHandle phNewHash,
- [In] IntPtr pbHashObject,
- [In] uint cbHashObject,
- [In] uint dwFlags);
+#endif
+ BCryptHashHandle hHash,
+ out BCryptHashHandle phNewHash,
+ IntPtr pbHashObject,
+ uint cbHashObject,
+ uint dwFlags);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375421(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptEncrypt(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptEncrypt(
- [In] BCryptKeyHandle hKey,
- [In] byte* pbInput,
- [In] uint cbInput,
- [In] void* pPaddingInfo,
- [In] byte* pbIV,
- [In] uint cbIV,
- [In] byte* pbOutput,
- [In] uint cbOutput,
- [Out] out uint pcbResult,
- [In] BCryptEncryptFlags dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptKeyHandle hKey,
+ byte* pbInput,
+ uint cbInput,
+ void* pPaddingInfo,
+ byte* pbIV,
+ uint cbIV,
+ byte* pbOutput,
+ uint cbOutput,
+ out uint pcbResult,
+ BCryptEncryptFlags dwFlags);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375443(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptFinishHash(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptFinishHash(
- [In] BCryptHashHandle hHash,
- [In] byte* pbOutput,
- [In] uint cbOutput,
- [In] uint dwFlags);
+#endif
+ BCryptHashHandle hHash,
+ byte* pbOutput,
+ uint cbOutput,
+ uint dwFlags);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375453(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptGenerateSymmetricKey(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptGenerateSymmetricKey(
- [In] BCryptAlgorithmHandle hAlgorithm,
- [Out] out BCryptKeyHandle phKey,
- [In] IntPtr pbKeyObject,
- [In] uint cbKeyObject,
- [In] byte* pbSecret,
- [In] uint cbSecret,
- [In] uint dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptAlgorithmHandle hAlgorithm,
+ out BCryptKeyHandle phKey,
+ IntPtr pbKeyObject,
+ uint cbKeyObject,
+ byte* pbSecret,
+ uint cbSecret,
+ uint dwFlags);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375458(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptGenRandom(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptGenRandom(
- [In] IntPtr hAlgorithm,
- [In] byte* pbBuffer,
- [In] uint cbBuffer,
- [In] BCryptGenRandomFlags dwFlags);
+#endif
+ IntPtr hAlgorithm,
+ byte* pbBuffer,
+ uint cbBuffer,
+ BCryptGenRandomFlags dwFlags);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375464(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptGetProperty(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptGetProperty(
- [In] BCryptHandle hObject,
- [In, MarshalAs(UnmanagedType.LPWStr)] string pszProperty,
- [In] void* pbOutput,
- [In] uint cbOutput,
- [Out] out uint pcbResult,
- [In] uint dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptHandle hObject,
+ [MarshalAs(UnmanagedType.LPWStr)] string pszProperty,
+ void* pbOutput,
+ uint cbOutput,
+ out uint pcbResult,
+ uint dwFlags);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375468(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptHashData(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptHashData(
- [In] BCryptHashHandle hHash,
- [In] byte* pbInput,
- [In] uint cbInput,
- [In] uint dwFlags);
+#endif
+ BCryptHashHandle hHash,
+ byte* pbInput,
+ uint cbInput,
+ uint dwFlags);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/hh448506(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptKeyDerivation(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptKeyDerivation(
- [In] BCryptKeyHandle hKey,
- [In] BCryptBufferDesc* pParameterList,
- [In] byte* pbDerivedKey,
- [In] uint cbDerivedKey,
- [Out] out uint pcbResult,
- [In] uint dwFlags);
-
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ BCryptKeyHandle hKey,
+ BCryptBufferDesc* pParameterList,
+ byte* pbDerivedKey,
+ uint cbDerivedKey,
+ out uint pcbResult,
+ uint dwFlags);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375479(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptOpenAlgorithmProvider(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptOpenAlgorithmProvider(
- [Out] out BCryptAlgorithmHandle phAlgorithm,
- [In, MarshalAs(UnmanagedType.LPWStr)] string pszAlgId,
- [In, MarshalAs(UnmanagedType.LPWStr)] string? pszImplementation,
- [In] uint dwFlags);
+#endif
+ out BCryptAlgorithmHandle phAlgorithm,
+ [MarshalAs(UnmanagedType.LPWStr)] string pszAlgId,
+ [MarshalAs(UnmanagedType.LPWStr)] string? pszImplementation,
+ uint dwFlags);
- [DllImport(BCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa375504(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(BCRYPT_LIB)]
+ internal static partial int BCryptSetProperty(
+#else
+ [DllImport(BCRYPT_LIB)]
internal static extern int BCryptSetProperty(
- [In] BCryptHandle hObject,
- [In, MarshalAs(UnmanagedType.LPWStr)] string pszProperty,
- [In] void* pbInput,
- [In] uint cbInput,
- [In] uint dwFlags);
+#endif
+ BCryptHandle hObject,
+ [MarshalAs(UnmanagedType.LPWStr)] string pszProperty,
+ void* pbInput,
+ uint cbInput,
+ uint dwFlags);
/*
* CRYPT32.DLL
*/
- [DllImport(CRYPT32_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(CRYPT32_LIB, SetLastError = true)]
+ internal static partial bool CryptProtectData(
+#else
+ [DllImport(CRYPT32_LIB, SetLastError = true)]
internal static extern bool CryptProtectData(
- [In] DATA_BLOB* pDataIn,
- [In] IntPtr szDataDescr,
- [In] DATA_BLOB* pOptionalEntropy,
- [In] IntPtr pvReserved,
- [In] IntPtr pPromptStruct,
- [In] uint dwFlags,
- [Out] out DATA_BLOB pDataOut);
+#endif
+ DATA_BLOB* pDataIn,
+ IntPtr szDataDescr,
+ DATA_BLOB* pOptionalEntropy,
+ IntPtr pvReserved,
+ IntPtr pPromptStruct,
+ uint dwFlags,
+ DATA_BLOB* pDataOut);
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380262(v=vs.85).aspx
- [DllImport(CRYPT32_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+#if NET7_0_OR_GREATER
+ [LibraryImport(CRYPT32_LIB, SetLastError = true)]
+ public static partial bool CryptProtectMemory(
+#else
+ [DllImport(CRYPT32_LIB, SetLastError = true)]
public static extern bool CryptProtectMemory(
- [In] SafeHandle pData,
- [In] uint cbData,
- [In] uint dwFlags);
+#endif
+ SafeHandle pData,
+ uint cbData,
+ uint dwFlags);
- [DllImport(CRYPT32_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380882(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(CRYPT32_LIB, SetLastError = true)]
+ internal static partial bool CryptUnprotectData(
+#else
+ [DllImport(CRYPT32_LIB, SetLastError = true)]
internal static extern bool CryptUnprotectData(
- [In] DATA_BLOB* pDataIn,
- [In] IntPtr ppszDataDescr,
- [In] DATA_BLOB* pOptionalEntropy,
- [In] IntPtr pvReserved,
- [In] IntPtr pPromptStruct,
- [In] uint dwFlags,
- [Out] out DATA_BLOB pDataOut);
+#endif
+ DATA_BLOB* pDataIn,
+ IntPtr ppszDataDescr,
+ DATA_BLOB* pOptionalEntropy,
+ IntPtr pvReserved,
+ IntPtr pPromptStruct,
+ uint dwFlags,
+ DATA_BLOB* pDataOut);
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380890(v=vs.85).aspx
- [DllImport(CRYPT32_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+#if NET7_0_OR_GREATER
+ [LibraryImport(CRYPT32_LIB, SetLastError = true)]
+ public static partial bool CryptUnprotectMemory(
+#else
+ [DllImport(CRYPT32_LIB, SetLastError = true)]
public static extern bool CryptUnprotectMemory(
- [In] byte* pData,
- [In] uint cbData,
- [In] uint dwFlags);
+#endif
+ byte* pData,
+ uint cbData,
+ uint dwFlags);
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa380890(v=vs.85).aspx
- [DllImport(CRYPT32_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+#if NET7_0_OR_GREATER
+ [LibraryImport(CRYPT32_LIB, SetLastError = true)]
+ public static partial bool CryptUnprotectMemory(
+#else
+ [DllImport(CRYPT32_LIB, SetLastError = true)]
public static extern bool CryptUnprotectMemory(
- [In] SafeHandle pData,
- [In] uint cbData,
- [In] uint dwFlags);
+#endif
+ SafeHandle pData,
+ uint cbData,
+ uint dwFlags);
/*
* NCRYPT.DLL
*/
- [DllImport(NCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/hh706799(v=vs.85).aspx
#if NETSTANDARD2_0
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
#endif
- // http://msdn.microsoft.com/en-us/library/windows/desktop/hh706799(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(NCRYPT_LIB)]
+ internal static partial int NCryptCloseProtectionDescriptor(
+#else
+ [DllImport(NCRYPT_LIB)]
internal static extern int NCryptCloseProtectionDescriptor(
- [In] IntPtr hDescriptor);
+#endif
+ IntPtr hDescriptor);
- [DllImport(NCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/hh706800(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(NCRYPT_LIB)]
+ internal static partial int NCryptCreateProtectionDescriptor(
+#else
+ [DllImport(NCRYPT_LIB)]
internal static extern int NCryptCreateProtectionDescriptor(
- [In, MarshalAs(UnmanagedType.LPWStr)] string pwszDescriptorString,
- [In] uint dwFlags,
- [Out] out NCryptDescriptorHandle phDescriptor);
+#endif
+ [MarshalAs(UnmanagedType.LPWStr)] string pwszDescriptorString,
+ uint dwFlags,
+ out NCryptDescriptorHandle phDescriptor);
- [DllImport(NCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// https://msdn.microsoft.com/en-us/library/windows/desktop/hh706801(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(NCRYPT_LIB)]
+ internal static partial int NCryptGetProtectionDescriptorInfo(
+#else
+ [DllImport(NCRYPT_LIB)]
internal static extern int NCryptGetProtectionDescriptorInfo(
- [In] NCryptDescriptorHandle hDescriptor,
- [In] IntPtr pMemPara,
- [In] uint dwInfoType,
- [Out] out LocalAllocHandle ppvInfo);
+#endif
+ NCryptDescriptorHandle hDescriptor,
+ IntPtr pMemPara,
+ uint dwInfoType,
+ out LocalAllocHandle ppvInfo);
- [DllImport(NCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
// http://msdn.microsoft.com/en-us/library/windows/desktop/hh706802(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(NCRYPT_LIB)]
+ internal static partial int NCryptProtectSecret(
+#else
+ [DllImport(NCRYPT_LIB)]
internal static extern int NCryptProtectSecret(
- [In] NCryptDescriptorHandle hDescriptor,
- [In] uint dwFlags,
- [In] byte* pbData,
- [In] uint cbData,
- [In] IntPtr pMemPara,
- [In] IntPtr hWnd,
- [Out] out LocalAllocHandle ppbProtectedBlob,
- [Out] out uint pcbProtectedBlob);
-
- [DllImport(NCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ NCryptDescriptorHandle hDescriptor,
+ uint dwFlags,
+ byte* pbData,
+ uint cbData,
+ IntPtr pMemPara,
+ IntPtr hWnd,
+ out LocalAllocHandle ppbProtectedBlob,
+ out uint pcbProtectedBlob);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/hh706811(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(NCRYPT_LIB)]
+ internal static partial int NCryptUnprotectSecret(
+#else
+ [DllImport(NCRYPT_LIB)]
internal static extern int NCryptUnprotectSecret(
- [In] IntPtr phDescriptor,
- [In] uint dwFlags,
- [In] byte* pbProtectedBlob,
- [In] uint cbProtectedBlob,
- [In] IntPtr pMemPara,
- [In] IntPtr hWnd,
- [Out] out LocalAllocHandle ppbData,
- [Out] out uint pcbData);
-
- [DllImport(NCRYPT_LIB, CallingConvention = CallingConvention.Winapi)]
+#endif
+ IntPtr phDescriptor,
+ uint dwFlags,
+ byte* pbProtectedBlob,
+ uint cbProtectedBlob,
+ IntPtr pMemPara,
+ IntPtr hWnd,
+ out LocalAllocHandle ppbData,
+ out uint pcbData);
+
// http://msdn.microsoft.com/en-us/library/windows/desktop/hh706811(v=vs.85).aspx
+#if NET7_0_OR_GREATER
+ [LibraryImport(NCRYPT_LIB)]
+ internal static partial int NCryptUnprotectSecret(
+#else
+ [DllImport(NCRYPT_LIB)]
internal static extern int NCryptUnprotectSecret(
- [Out] out NCryptDescriptorHandle phDescriptor,
- [In] uint dwFlags,
- [In] byte* pbProtectedBlob,
- [In] uint cbProtectedBlob,
- [In] IntPtr pMemPara,
- [In] IntPtr hWnd,
- [Out] out LocalAllocHandle ppbData,
- [Out] out uint pcbData);
+#endif
+ out NCryptDescriptorHandle phDescriptor,
+ uint dwFlags,
+ byte* pbProtectedBlob,
+ uint cbProtectedBlob,
+ IntPtr pMemPara,
+ IntPtr hWnd,
+ out LocalAllocHandle ppbData,
+ out uint pcbData);
/*
* HELPER FUNCTIONS
*/
+ private static SafeLibraryHandle GetLibHandle(string libraryName, ref SafeLibraryHandle? safeLibraryHandle)
+ {
+ if (safeLibraryHandle is null)
+ {
+ var newHandle = SafeLibraryHandle.Open(libraryName);
+ if (Interlocked.CompareExchange(ref safeLibraryHandle, newHandle, null) is not null)
+ {
+ newHandle.Dispose();
+ }
+ }
+
+ return safeLibraryHandle;
+ }
+
+ // We use methods instead of properties to access lazy handles in order to prevent debuggers from automatically attempting to load libraries on unsupported platforms.
+ private static SafeLibraryHandle GetBCryptLibHandle() => GetLibHandle(BCRYPT_LIB, ref _lazyBCryptLibHandle);
+ private static SafeLibraryHandle GetCrypt32LibHandle() => GetLibHandle(CRYPT32_LIB, ref _lazyCrypt32LibHandle);
+ private static SafeLibraryHandle GetNCryptLibHandle() => GetLibHandle(NCRYPT_LIB, ref _lazyNCryptLibHandle);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal static void ThrowExceptionForBCryptStatus(int ntstatus)
@@ -318,7 +469,7 @@ internal static unsafe class UnsafeNativeMethods
[MethodImpl(MethodImplOptions.NoInlining)]
private static void ThrowExceptionForBCryptStatusImpl(int ntstatus)
{
- var message = _lazyBCryptLibHandle.Value.FormatMessage(ntstatus);
+ var message = GetBCryptLibHandle().FormatMessage(ntstatus);
throw new CryptographicException(message);
}
@@ -327,7 +478,7 @@ internal static unsafe class UnsafeNativeMethods
var lastError = Marshal.GetLastWin32Error();
Debug.Assert(lastError != 0, "This method should only be called if there was an error.");
- var message = _lazyCrypt32LibHandle.Value.FormatMessage(lastError);
+ var message = GetCrypt32LibHandle().FormatMessage(lastError);
throw new CryptographicException(message);
}
@@ -344,7 +495,7 @@ internal static unsafe class UnsafeNativeMethods
[MethodImpl(MethodImplOptions.NoInlining)]
private static void ThrowExceptionForNCryptStatusImpl(int ntstatus)
{
- var message = _lazyNCryptLibHandle.Value.FormatMessage(ntstatus);
+ var message = GetNCryptLibHandle().FormatMessage(ntstatus);
throw new CryptographicException(message);
}
}
diff --git a/src/DataProtection/DataProtection/src/ActivatorExtensions.cs b/src/DataProtection/DataProtection/src/ActivatorExtensions.cs
index d1136db9ba..e8f47ffd6e 100644
--- a/src/DataProtection/DataProtection/src/ActivatorExtensions.cs
+++ b/src/DataProtection/DataProtection/src/ActivatorExtensions.cs
@@ -18,8 +18,7 @@ internal static class ActivatorExtensions
/// Creates an instance of <paramref name="implementationTypeName"/> and ensures
/// that it is assignable to <typeparamref name="T"/>.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
- public static T CreateInstance<T>(this IActivator activator, string implementationTypeName)
+ public static T CreateInstance<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(this IActivator activator, string implementationTypeName)
where T : class
{
if (implementationTypeName == null)
diff --git a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/AuthenticatedEncryptorDescriptorDeserializer.cs b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/AuthenticatedEncryptorDescriptorDeserializer.cs
index dc103ed5b9..f62c357932 100644
--- a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/AuthenticatedEncryptorDescriptorDeserializer.cs
+++ b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/AuthenticatedEncryptorDescriptorDeserializer.cs
@@ -17,7 +17,6 @@ public sealed class AuthenticatedEncryptorDescriptorDeserializer : IAuthenticate
/// <summary>
/// Imports the <see cref="AuthenticatedEncryptorDescriptor"/> from serialized XML.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
{
if (element == null)
diff --git a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngCbcAuthenticatedEncryptorDescriptorDeserializer.cs b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngCbcAuthenticatedEncryptorDescriptorDeserializer.cs
index 09efbf55ea..0e17be823a 100644
--- a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngCbcAuthenticatedEncryptorDescriptorDeserializer.cs
+++ b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngCbcAuthenticatedEncryptorDescriptorDeserializer.cs
@@ -18,7 +18,6 @@ public sealed class CngCbcAuthenticatedEncryptorDescriptorDeserializer : IAuthen
/// <summary>
/// Imports the <see cref="CngCbcAuthenticatedEncryptorDescriptor"/> from serialized XML.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
{
if (element == null)
diff --git a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngGcmAuthenticatedEncryptorDescriptorDeserializer.cs b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngGcmAuthenticatedEncryptorDescriptorDeserializer.cs
index 1222ea1897..31887d5c37 100644
--- a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngGcmAuthenticatedEncryptorDescriptorDeserializer.cs
+++ b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/CngGcmAuthenticatedEncryptorDescriptorDeserializer.cs
@@ -18,7 +18,6 @@ public sealed class CngGcmAuthenticatedEncryptorDescriptorDeserializer : IAuthen
/// <summary>
/// Imports the <see cref="CngCbcAuthenticatedEncryptorDescriptor"/> from serialized XML.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
{
if (element == null)
diff --git a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/IAuthenticatedEncryptorDescriptorDeserializer.cs b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/IAuthenticatedEncryptorDescriptorDeserializer.cs
index c0e4c7e379..edb1838d62 100644
--- a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/IAuthenticatedEncryptorDescriptorDeserializer.cs
+++ b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/IAuthenticatedEncryptorDescriptorDeserializer.cs
@@ -16,6 +16,5 @@ public interface IAuthenticatedEncryptorDescriptorDeserializer
/// </summary>
/// <param name="element">The element to deserialize.</param>
/// <returns>The <see cref="IAuthenticatedEncryptorDescriptor"/> represented by <paramref name="element"/>.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element);
}
diff --git a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/ManagedAuthenticatedEncryptorDescriptorDeserializer.cs b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/ManagedAuthenticatedEncryptorDescriptorDeserializer.cs
index 67de02c836..09fdc3aafc 100644
--- a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/ManagedAuthenticatedEncryptorDescriptorDeserializer.cs
+++ b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ConfigurationModel/ManagedAuthenticatedEncryptorDescriptorDeserializer.cs
@@ -17,7 +17,6 @@ public sealed class ManagedAuthenticatedEncryptorDescriptorDeserializer : IAuthe
/// <summary>
/// Imports the <see cref="ManagedAuthenticatedEncryptorDescriptor"/> from serialized XML.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IAuthenticatedEncryptorDescriptor ImportFromXml(XElement element)
{
if (element == null)
@@ -48,7 +47,6 @@ public sealed class ManagedAuthenticatedEncryptorDescriptorDeserializer : IAuthe
// Any changes to this method should also be be reflected
// in ManagedAuthenticatedEncryptorDescriptor.TypeToFriendlyName.
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private static Type FriendlyNameToType(string typeName)
{
if (typeName == nameof(Aes))
@@ -73,7 +71,7 @@ public sealed class ManagedAuthenticatedEncryptorDescriptorDeserializer : IAuthe
}
else
{
- return Type.GetType(typeName, throwOnError: true)!;
+ return TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(typeName);
}
}
}
diff --git a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ManagedAuthenticatedEncryptorFactory.cs b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ManagedAuthenticatedEncryptorFactory.cs
index be9744d9d0..42b08734cc 100644
--- a/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ManagedAuthenticatedEncryptorFactory.cs
+++ b/src/DataProtection/DataProtection/src/AuthenticatedEncryption/ManagedAuthenticatedEncryptorFactory.cs
@@ -121,7 +121,7 @@ public sealed class ManagedAuthenticatedEncryptorFactory : IAuthenticatedEncrypt
Func<T> Creator { get; }
}
- private class AlgorithmActivatorCore<T> : IActivator<T> where T : new()
+ private sealed class AlgorithmActivatorCore<T> : IActivator<T> where T : new()
{
public Func<T> Creator { get; } = Activator.CreateInstance<T>;
}
diff --git a/src/DataProtection/DataProtection/src/Cng/DpapiSecretSerializerHelper.cs b/src/DataProtection/DataProtection/src/Cng/DpapiSecretSerializerHelper.cs
index 1cd3b5f9ca..ae213a62ca 100644
--- a/src/DataProtection/DataProtection/src/Cng/DpapiSecretSerializerHelper.cs
+++ b/src/DataProtection/DataProtection/src/Cng/DpapiSecretSerializerHelper.cs
@@ -91,7 +91,7 @@ internal static unsafe class DpapiSecretSerializerHelper
pvReserved: IntPtr.Zero,
pPromptStruct: IntPtr.Zero,
dwFlags: CRYPTPROTECT_UI_FORBIDDEN | ((fLocalMachine) ? CRYPTPROTECT_LOCAL_MACHINE : 0),
- pDataOut: out dataOut);
+ pDataOut: &dataOut);
if (!success)
{
var errorCode = Marshal.GetLastWin32Error();
@@ -234,7 +234,7 @@ internal static unsafe class DpapiSecretSerializerHelper
pvReserved: IntPtr.Zero,
pPromptStruct: IntPtr.Zero,
dwFlags: CRYPTPROTECT_UI_FORBIDDEN,
- pDataOut: out dataOut);
+ pDataOut: &dataOut);
if (!success)
{
var errorCode = Marshal.GetLastWin32Error();
diff --git a/src/DataProtection/DataProtection/src/EphemeralDataProtectionProvider.cs b/src/DataProtection/DataProtection/src/EphemeralDataProtectionProvider.cs
index 57e4dba965..05d8ce815a 100644
--- a/src/DataProtection/DataProtection/src/EphemeralDataProtectionProvider.cs
+++ b/src/DataProtection/DataProtection/src/EphemeralDataProtectionProvider.cs
@@ -95,7 +95,6 @@ public sealed class EphemeralDataProtectionProvider : IDataProtectionProvider
return (keyId == default(Guid)) ? DefaultAuthenticatedEncryptor : null;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IKeyRing GetCurrentKeyRing()
{
return this;
diff --git a/src/DataProtection/DataProtection/src/IPersistedDataProtector.cs b/src/DataProtection/DataProtection/src/IPersistedDataProtector.cs
index 4690b92c6f..09ccbbe97d 100644
--- a/src/DataProtection/DataProtection/src/IPersistedDataProtector.cs
+++ b/src/DataProtection/DataProtection/src/IPersistedDataProtector.cs
@@ -31,6 +31,5 @@ public interface IPersistedDataProtector : IDataProtector
/// Implementations should throw CryptographicException if the protected data is
/// invalid or malformed.
/// </remarks>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] DangerousUnprotect(byte[] protectedData, bool ignoreRevocationErrors, out bool requiresMigration, out bool wasRevoked);
}
diff --git a/src/DataProtection/DataProtection/src/IRegistryPolicyResolver.cs b/src/DataProtection/DataProtection/src/IRegistryPolicyResolver.cs
index e8d4bbf326..fe823faf90 100644
--- a/src/DataProtection/DataProtection/src/IRegistryPolicyResolver.cs
+++ b/src/DataProtection/DataProtection/src/IRegistryPolicyResolver.cs
@@ -10,6 +10,5 @@ namespace Microsoft.AspNetCore.DataProtection;
// even if it was not registered causing problems crossplat
internal interface IRegistryPolicyResolver
{
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
RegistryPolicy? ResolvePolicy();
}
diff --git a/src/DataProtection/DataProtection/src/Internal/DataProtectionBuilder.cs b/src/DataProtection/DataProtection/src/Internal/DataProtectionBuilder.cs
index 6c49dd2fff..baa3bd6cbb 100644
--- a/src/DataProtection/DataProtection/src/Internal/DataProtectionBuilder.cs
+++ b/src/DataProtection/DataProtection/src/Internal/DataProtectionBuilder.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.DataProtection.Internal;
/// <summary>
/// Default implementation of <see cref="IDataProtectionBuilder"/>.
/// </summary>
-internal class DataProtectionBuilder : IDataProtectionBuilder
+internal sealed class DataProtectionBuilder : IDataProtectionBuilder
{
/// <summary>
/// Creates a new configuration object linked to a <see cref="IServiceCollection"/>.
diff --git a/src/DataProtection/DataProtection/src/Internal/DataProtectionHostedService.cs b/src/DataProtection/DataProtection/src/Internal/DataProtectionHostedService.cs
index 9a27676e15..3cbf0c72ed 100644
--- a/src/DataProtection/DataProtection/src/Internal/DataProtectionHostedService.cs
+++ b/src/DataProtection/DataProtection/src/Internal/DataProtectionHostedService.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.DataProtection.Internal;
-internal class DataProtectionHostedService : IHostedService
+internal sealed class DataProtectionHostedService : IHostedService
{
private readonly IKeyRingProvider _keyRingProvider;
private readonly ILogger<DataProtectionHostedService> _logger;
diff --git a/src/DataProtection/DataProtection/src/Internal/DataProtectionOptionsSetup.cs b/src/DataProtection/DataProtection/src/Internal/DataProtectionOptionsSetup.cs
index ee29aa5af6..d67b8f0155 100644
--- a/src/DataProtection/DataProtection/src/Internal/DataProtectionOptionsSetup.cs
+++ b/src/DataProtection/DataProtection/src/Internal/DataProtectionOptionsSetup.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.DataProtection.Internal;
-internal class DataProtectionOptionsSetup : IConfigureOptions<DataProtectionOptions>
+internal sealed class DataProtectionOptionsSetup : IConfigureOptions<DataProtectionOptions>
{
private readonly IServiceProvider _services;
diff --git a/src/DataProtection/DataProtection/src/Internal/HostingApplicationDiscriminator.cs b/src/DataProtection/DataProtection/src/Internal/HostingApplicationDiscriminator.cs
index 5e8ddbac3b..6b6944f1f3 100644
--- a/src/DataProtection/DataProtection/src/Internal/HostingApplicationDiscriminator.cs
+++ b/src/DataProtection/DataProtection/src/Internal/HostingApplicationDiscriminator.cs
@@ -1,14 +1,18 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System;
+using System.IO;
using Microsoft.AspNetCore.DataProtection.Infrastructure;
using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.DataProtection.Internal;
-internal class HostingApplicationDiscriminator : IApplicationDiscriminator
+internal sealed class HostingApplicationDiscriminator : IApplicationDiscriminator
{
private readonly IHostEnvironment? _hosting;
+ private readonly string DirectorySeparator = Path.DirectorySeparatorChar.ToString();
+ private readonly string AltDirectorySeparator = Path.AltDirectorySeparatorChar.ToString();
// the optional constructor for when IHostingEnvironment is not available from DI
public HostingApplicationDiscriminator()
@@ -20,5 +24,21 @@ internal class HostingApplicationDiscriminator : IApplicationDiscriminator
_hosting = hosting;
}
- public string? Discriminator => _hosting?.ContentRootPath;
+ // Note: ContentRootPath behavior depends on the version, sometimes it does not have a trailing slash,
+ // we normalize by adding a trailing slash for non whitespace content root paths so data protection
+ // works across versions
+ public string? Discriminator
+ {
+ get
+ {
+ var contentRoot = _hosting?.ContentRootPath?.Trim();
+ if (string.IsNullOrEmpty(contentRoot) ||
+ contentRoot.EndsWith(DirectorySeparator, StringComparison.OrdinalIgnoreCase) ||
+ contentRoot.EndsWith(AltDirectorySeparator, StringComparison.OrdinalIgnoreCase))
+ {
+ return contentRoot;
+ }
+ return contentRoot + DirectorySeparator;
+ }
+ }
}
diff --git a/src/DataProtection/DataProtection/src/Internal/IActivator.cs b/src/DataProtection/DataProtection/src/Internal/IActivator.cs
index 058e85978b..179fc9562d 100644
--- a/src/DataProtection/DataProtection/src/Internal/IActivator.cs
+++ b/src/DataProtection/DataProtection/src/Internal/IActivator.cs
@@ -16,6 +16,5 @@ public interface IActivator
/// Creates an instance of <paramref name="implementationTypeName"/> and ensures
/// that it is assignable to <paramref name="expectedBaseType"/>.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
- object CreateInstance(Type expectedBaseType, string implementationTypeName);
+ object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type expectedBaseType, string implementationTypeName);
}
diff --git a/src/DataProtection/DataProtection/src/Internal/KeyManagementOptionsSetup.cs b/src/DataProtection/DataProtection/src/Internal/KeyManagementOptionsSetup.cs
index b37d779e65..03bfdbb08b 100644
--- a/src/DataProtection/DataProtection/src/Internal/KeyManagementOptionsSetup.cs
+++ b/src/DataProtection/DataProtection/src/Internal/KeyManagementOptionsSetup.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.DataProtection.Internal;
-internal class KeyManagementOptionsSetup : IConfigureOptions<KeyManagementOptions>
+internal sealed class KeyManagementOptionsSetup : IConfigureOptions<KeyManagementOptions>
{
private readonly IRegistryPolicyResolver? _registryPolicyResolver;
private readonly ILoggerFactory _loggerFactory;
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/DeferredKey.cs b/src/DataProtection/DataProtection/src/KeyManagement/DeferredKey.cs
index 748c7da775..6e69ef5891 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/DeferredKey.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/DeferredKey.cs
@@ -18,7 +18,6 @@ namespace Microsoft.AspNetCore.DataProtection.KeyManagement;
/// </summary>
internal sealed class DeferredKey : KeyBase
{
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public DeferredKey(
Guid keyId,
DateTimeOffset creationDate,
@@ -36,7 +35,6 @@ internal sealed class DeferredKey : KeyBase
{
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private static Func<IAuthenticatedEncryptorDescriptor> GetLazyDescriptorDelegate(IInternalXmlKeyManager keyManager, XElement keyElement)
{
// The <key> element will be held around in memory for a potentially lengthy period
@@ -54,7 +52,6 @@ internal sealed class DeferredKey : KeyBase
keyElement = null!;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
IAuthenticatedEncryptorDescriptor GetLazyDescriptorDelegate()
{
return keyManager.DeserializeDescriptorFromKeyElement(encryptedKeyElement.ToXElement());
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/IKeyManager.cs b/src/DataProtection/DataProtection/src/KeyManagement/IKeyManager.cs
index ab413fe106..df7a1b09e1 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/IKeyManager.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/IKeyManager.cs
@@ -29,7 +29,6 @@ public interface IKeyManager
/// Fetches all keys from the underlying repository.
/// </summary>
/// <returns>The collection of all keys.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
IReadOnlyCollection<IKey> GetAllKeys();
/// <summary>
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/Internal/ICacheableKeyRingProvider.cs b/src/DataProtection/DataProtection/src/KeyManagement/Internal/ICacheableKeyRingProvider.cs
index c3af365d04..5953240458 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/Internal/ICacheableKeyRingProvider.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/Internal/ICacheableKeyRingProvider.cs
@@ -16,6 +16,5 @@ public interface ICacheableKeyRingProvider
/// This API supports infrastructure and is not intended to be used
/// directly from your code. This API may change or be removed in future releases.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
CacheableKeyRing GetCacheableKeyRing(DateTimeOffset now);
}
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/Internal/IInternalXmlKeyManager.cs b/src/DataProtection/DataProtection/src/KeyManagement/Internal/IInternalXmlKeyManager.cs
index 94ff1a3135..77cffb1642 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/Internal/IInternalXmlKeyManager.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/Internal/IInternalXmlKeyManager.cs
@@ -24,7 +24,6 @@ public interface IInternalXmlKeyManager
/// This API supports infrastructure and is not intended to be used
/// directly from your code. This API may change or be removed in future releases.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
IAuthenticatedEncryptorDescriptor DeserializeDescriptorFromKeyElement(XElement keyElement);
/// <summary>
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/Internal/IKeyRingProvider.cs b/src/DataProtection/DataProtection/src/KeyManagement/Internal/IKeyRingProvider.cs
index ffcd3ac8a5..d8d242745a 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/Internal/IKeyRingProvider.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/Internal/IKeyRingProvider.cs
@@ -15,6 +15,5 @@ public interface IKeyRingProvider
/// This API supports infrastructure and is not intended to be used
/// directly from your code. This API may change or be removed in future releases.
/// </summary>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
IKeyRing GetCurrentKeyRing();
}
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/KeyRingBasedDataProtector.cs b/src/DataProtection/DataProtection/src/KeyManagement/KeyRingBasedDataProtector.cs
index 7816b61b74..55d0bae2d7 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/KeyRingBasedDataProtector.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/KeyRingBasedDataProtector.cs
@@ -76,7 +76,6 @@ internal sealed unsafe class KeyRingBasedDataProtector : IDataProtector, IPersis
}
// allows decrypting payloads whose keys have been revoked
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] DangerousUnprotect(byte[] protectedData, bool ignoreRevocationErrors, out bool requiresMigration, out bool wasRevoked)
{
// argument & state checking
@@ -92,7 +91,6 @@ internal sealed unsafe class KeyRingBasedDataProtector : IDataProtector, IPersis
return retVal;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] Protect(byte[] plaintext)
{
if (plaintext == null)
@@ -182,7 +180,6 @@ internal sealed unsafe class KeyRingBasedDataProtector : IDataProtector, IPersis
}
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] Unprotect(byte[] protectedData)
{
if (protectedData == null)
@@ -197,7 +194,6 @@ internal sealed unsafe class KeyRingBasedDataProtector : IDataProtector, IPersis
wasRevoked: out _);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private byte[] UnprotectCore(byte[] protectedData, bool allowOperationsOnRevokedKeys, out UnprotectStatus status)
{
Debug.Assert(protectedData != null);
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/KeyRingProvider.cs b/src/DataProtection/DataProtection/src/KeyManagement/KeyRingProvider.cs
index 917257425d..0cd7c66883 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/KeyRingProvider.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/KeyRingProvider.cs
@@ -58,7 +58,6 @@ internal sealed class KeyRingProvider : ICacheableKeyRingProvider, IKeyRingProvi
internal bool InAutoRefreshWindow() => DateTime.UtcNow < AutoRefreshWindowEnd;
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private CacheableKeyRing CreateCacheableKeyRingCore(DateTimeOffset now, IKey? keyJustAdded)
{
// Refresh the list of all keys
@@ -146,19 +145,16 @@ internal sealed class KeyRingProvider : ICacheableKeyRingProvider, IKeyRingProvi
allKeys: allKeys);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IKeyRing GetCurrentKeyRing()
{
return GetCurrentKeyRingCore(DateTime.UtcNow);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
internal IKeyRing RefreshCurrentKeyRing()
{
return GetCurrentKeyRingCore(DateTime.UtcNow, forceRefresh: true);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
internal IKeyRing GetCurrentKeyRingCore(DateTime utcNow, bool forceRefresh = false)
{
Debug.Assert(utcNow.Kind == DateTimeKind.Utc);
@@ -277,7 +273,6 @@ internal sealed class KeyRingProvider : ICacheableKeyRingProvider, IKeyRingProvi
return (a < b) ? a : b;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
CacheableKeyRing ICacheableKeyRingProvider.GetCacheableKeyRing(DateTimeOffset now)
{
// the entry point allows one recursive call
diff --git a/src/DataProtection/DataProtection/src/KeyManagement/XmlKeyManager.cs b/src/DataProtection/DataProtection/src/KeyManagement/XmlKeyManager.cs
index edb3ab131f..e08803fdda 100644
--- a/src/DataProtection/DataProtection/src/KeyManagement/XmlKeyManager.cs
+++ b/src/DataProtection/DataProtection/src/KeyManagement/XmlKeyManager.cs
@@ -154,7 +154,6 @@ public sealed class XmlKeyManager : IKeyManager, IInternalXmlKeyManager
}
/// <inheritdoc/>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public IReadOnlyCollection<IKey> GetAllKeys()
{
var allElements = KeyRepository.GetAllElements();
@@ -257,7 +256,6 @@ public sealed class XmlKeyManager : IKeyManager, IInternalXmlKeyManager
return Interlocked.CompareExchange<CancellationTokenSource?>(ref _cacheExpirationTokenSource, null, null).Token;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private KeyBase? ProcessKeyElement(XElement keyElement)
{
Debug.Assert(keyElement.Name == KeyElementName);
@@ -444,7 +442,6 @@ public sealed class XmlKeyManager : IKeyManager, IInternalXmlKeyManager
encryptorFactories: _encryptorFactories);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
IAuthenticatedEncryptorDescriptor IInternalXmlKeyManager.DeserializeDescriptorFromKeyElement(XElement keyElement)
{
try
@@ -455,7 +452,8 @@ public sealed class XmlKeyManager : IKeyManager, IInternalXmlKeyManager
// Decrypt the descriptor element and pass it to the descriptor for consumption
var unencryptedInputToDeserializer = descriptorElement.Elements().Single().DecryptElement(_activator);
- var deserializerInstance = _activator.CreateInstance<IAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
+
+ var deserializerInstance = CreateDeserializer(descriptorDeserializerTypeName);
var descriptorInstance = deserializerInstance.ImportFromXml(unencryptedInputToDeserializer);
return descriptorInstance ?? CryptoUtil.Fail<IAuthenticatedEncryptorDescriptor>("ImportFromXml returned null.");
@@ -467,6 +465,34 @@ public sealed class XmlKeyManager : IKeyManager, IInternalXmlKeyManager
}
}
+ [UnconditionalSuppressMessage("Trimmer", "IL2057", Justification = "Type.GetType result is only useful with types that are referenced by DataProtection assembly.")]
+ private IAuthenticatedEncryptorDescriptorDeserializer CreateDeserializer(string descriptorDeserializerTypeName)
+ {
+ var resolvedTypeName = TypeForwardingActivator.TryForwardTypeName(descriptorDeserializerTypeName, out var forwardedTypeName)
+ ? forwardedTypeName
+ : descriptorDeserializerTypeName;
+ var type = Type.GetType(resolvedTypeName, throwOnError: false);
+
+ if (type == typeof(AuthenticatedEncryptorDescriptorDeserializer))
+ {
+ return _activator.CreateInstance<AuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
+ }
+ else if (type == typeof(CngCbcAuthenticatedEncryptorDescriptorDeserializer) && RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return _activator.CreateInstance<CngCbcAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
+ }
+ else if (type == typeof(CngGcmAuthenticatedEncryptorDescriptorDeserializer) && RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ return _activator.CreateInstance<CngGcmAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
+ }
+ else if (type == typeof(ManagedAuthenticatedEncryptorDescriptorDeserializer))
+ {
+ return _activator.CreateInstance<ManagedAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
+ }
+
+ return _activator.CreateInstance<IAuthenticatedEncryptorDescriptorDeserializer>(descriptorDeserializerTypeName);
+ }
+
void IInternalXmlKeyManager.RevokeSingleKey(Guid keyId, DateTimeOffset revocationDate, string? reason)
{
// <revocation version="1">
diff --git a/src/DataProtection/DataProtection/src/PublicAPI.Shipped.txt b/src/DataProtection/DataProtection/src/PublicAPI.Shipped.txt
index 26601a3548..cec494af3a 100644
--- a/src/DataProtection/DataProtection/src/PublicAPI.Shipped.txt
+++ b/src/DataProtection/DataProtection/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator) -> void
-~Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator) -> void
+Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
abstract Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AlgorithmConfiguration.CreateNewDescriptor() -> Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.IAuthenticatedEncryptorDescriptor!
Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.AuthenticatedEncryptorFactory
Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.AuthenticatedEncryptorFactory.AuthenticatedEncryptorFactory(Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/DataProtection/DataProtection/src/PublicAPI.Unshipped.txt b/src/DataProtection/DataProtection/src/PublicAPI.Unshipped.txt
index 5c7081170a..7dc5c58110 100644
--- a/src/DataProtection/DataProtection/src/PublicAPI.Unshipped.txt
+++ b/src/DataProtection/DataProtection/src/PublicAPI.Unshipped.txt
@@ -1,5 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator) -> void
-*REMOVED*~Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator) -> void
-Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager.XmlKeyManager(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.DataProtection.KeyManagement.KeyManagementOptions!>! keyManagementOptions, Microsoft.AspNetCore.DataProtection.Internal.IActivator! activator, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/DataProtection/DataProtection/src/RegistryPolicy.cs b/src/DataProtection/DataProtection/src/RegistryPolicy.cs
index 25dddec8cd..7cce10c6bb 100644
--- a/src/DataProtection/DataProtection/src/RegistryPolicy.cs
+++ b/src/DataProtection/DataProtection/src/RegistryPolicy.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.DataProtection.KeyManagement;
namespace Microsoft.AspNetCore.DataProtection;
-internal class RegistryPolicy
+internal sealed class RegistryPolicy
{
public RegistryPolicy(
AlgorithmConfiguration? configuration,
diff --git a/src/DataProtection/DataProtection/src/RegistryPolicyResolver.cs b/src/DataProtection/DataProtection/src/RegistryPolicyResolver.cs
index a9aee3189a..62e81417c5 100644
--- a/src/DataProtection/DataProtection/src/RegistryPolicyResolver.cs
+++ b/src/DataProtection/DataProtection/src/RegistryPolicyResolver.cs
@@ -37,7 +37,6 @@ internal sealed class RegistryPolicyResolver : IRegistryPolicyResolver
_activator = activator;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private static List<string> ReadKeyEscrowSinks(RegistryKey key)
{
var sinks = new List<string>();
@@ -52,7 +51,7 @@ internal sealed class RegistryPolicyResolver : IRegistryPolicyResolver
var candidate = sinkFromRegistry.Trim();
if (!string.IsNullOrEmpty(candidate))
{
- typeof(IKeyEscrowSink).AssertIsAssignableFrom(Type.GetType(candidate, throwOnError: true)!);
+ typeof(IKeyEscrowSink).AssertIsAssignableFrom(TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(candidate));
sinks.Add(candidate);
}
}
@@ -61,7 +60,6 @@ internal sealed class RegistryPolicyResolver : IRegistryPolicyResolver
return sinks;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public RegistryPolicy? ResolvePolicy()
{
using (var registryKey = _getPolicyRegKey())
@@ -70,7 +68,6 @@ internal sealed class RegistryPolicyResolver : IRegistryPolicyResolver
}
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private RegistryPolicy? ResolvePolicyCore(RegistryKey? policyRegKey)
{
if (policyRegKey == null)
@@ -174,14 +171,13 @@ internal sealed class RegistryPolicyResolver : IRegistryPolicyResolver
return options;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
private static ManagedAuthenticatedEncryptorConfiguration GetManagedAuthenticatedEncryptorConfiguration(RegistryKey key)
{
var options = new ManagedAuthenticatedEncryptorConfiguration();
var valueFromRegistry = key.GetValue(nameof(ManagedAuthenticatedEncryptorConfiguration.EncryptionAlgorithmType));
if (valueFromRegistry != null)
{
- options.EncryptionAlgorithmType = Type.GetType(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!, throwOnError: true)!;
+ options.EncryptionAlgorithmType = TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!);
}
valueFromRegistry = key.GetValue(nameof(ManagedAuthenticatedEncryptorConfiguration.EncryptionAlgorithmKeySize));
@@ -193,7 +189,7 @@ internal sealed class RegistryPolicyResolver : IRegistryPolicyResolver
valueFromRegistry = key.GetValue(nameof(ManagedAuthenticatedEncryptorConfiguration.ValidationAlgorithmType));
if (valueFromRegistry != null)
{
- options.ValidationAlgorithmType = Type.GetType(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!, throwOnError: true)!;
+ options.ValidationAlgorithmType = TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(Convert.ToString(valueFromRegistry, CultureInfo.InvariantCulture)!);
}
return options;
diff --git a/src/DataProtection/DataProtection/src/Repositories/DefaultKeyStorageDirectories.cs b/src/DataProtection/DataProtection/src/Repositories/DefaultKeyStorageDirectories.cs
index 4e2f901bea..d68854df3a 100644
--- a/src/DataProtection/DataProtection/src/Repositories/DefaultKeyStorageDirectories.cs
+++ b/src/DataProtection/DataProtection/src/Repositories/DefaultKeyStorageDirectories.cs
@@ -36,8 +36,7 @@ internal sealed class DefaultKeyStorageDirectories : IDefaultKeyStorageDirectori
// Environment.GetFolderPath returns null if the user profile isn't loaded.
var localAppDataFromSystemPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var localAppDataFromEnvPath = Environment.GetEnvironmentVariable("LOCALAPPDATA");
- var userProfilePath = Environment.GetEnvironmentVariable("USERPROFILE");
- var homePath = Environment.GetEnvironmentVariable("HOME");
+ var homePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && !string.IsNullOrEmpty(localAppDataFromSystemPath))
{
@@ -49,15 +48,17 @@ internal sealed class DefaultKeyStorageDirectories : IDefaultKeyStorageDirectori
{
retVal = GetKeyStorageDirectoryFromBaseAppDataPath(localAppDataFromEnvPath);
}
- else if (userProfilePath != null)
- {
- retVal = GetKeyStorageDirectoryFromBaseAppDataPath(Path.Combine(userProfilePath, "AppData", "Local"));
- }
else if (homePath != null)
{
- // If LOCALAPPDATA and USERPROFILE are not present but HOME is,
- // it's a good guess that this is a *NIX machine. Use *NIX conventions for a folder name.
- retVal = new DirectoryInfo(Path.Combine(homePath, ".aspnet", DataProtectionKeysFolderName));
+ if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
+ {
+ retVal = GetKeyStorageDirectoryFromBaseAppDataPath(Path.Combine(homePath, "AppData", "Local"));
+ }
+ else
+ {
+ // Use*NIX conventions for a folder name.
+ retVal = new DirectoryInfo(Path.Combine(homePath, ".aspnet", DataProtectionKeysFolderName));
+ }
}
else if (!string.IsNullOrEmpty(localAppDataFromSystemPath))
{
@@ -92,7 +93,7 @@ internal sealed class DefaultKeyStorageDirectories : IDefaultKeyStorageDirectori
if (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID")))
{
var homeEnvVar = Environment.GetEnvironmentVariable("HOME");
- if (!String.IsNullOrEmpty(homeEnvVar))
+ if (!string.IsNullOrEmpty(homeEnvVar))
{
return GetKeyStorageDirectoryFromBaseAppDataPath(homeEnvVar);
}
diff --git a/src/DataProtection/DataProtection/src/Repositories/EphemeralXmlRepository.cs b/src/DataProtection/DataProtection/src/Repositories/EphemeralXmlRepository.cs
index 65e0ea1f85..13bd29230c 100644
--- a/src/DataProtection/DataProtection/src/Repositories/EphemeralXmlRepository.cs
+++ b/src/DataProtection/DataProtection/src/Repositories/EphemeralXmlRepository.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.DataProtection.Repositories;
/// An ephemeral XML repository backed by process memory. This class must not be used for
/// anything other than dev scenarios as the keys will not be persisted to storage.
/// </summary>
-internal class EphemeralXmlRepository : IXmlRepository
+internal sealed class EphemeralXmlRepository : IXmlRepository
{
private readonly List<XElement> _storedElements = new List<XElement>();
@@ -23,7 +23,7 @@ internal class EphemeralXmlRepository : IXmlRepository
logger.UsingInmemoryRepository();
}
- public virtual IReadOnlyCollection<XElement> GetAllElements()
+ public IReadOnlyCollection<XElement> GetAllElements()
{
// force complete enumeration under lock for thread safety
lock (_storedElements)
@@ -41,7 +41,7 @@ internal class EphemeralXmlRepository : IXmlRepository
}
}
- public virtual void StoreElement(XElement element, string friendlyName)
+ public void StoreElement(XElement element, string friendlyName)
{
if (element == null)
{
diff --git a/src/DataProtection/DataProtection/src/SimpleActivator.cs b/src/DataProtection/DataProtection/src/SimpleActivator.cs
index f51c757c57..79696e378c 100644
--- a/src/DataProtection/DataProtection/src/SimpleActivator.cs
+++ b/src/DataProtection/DataProtection/src/SimpleActivator.cs
@@ -27,11 +27,12 @@ internal class SimpleActivator : IActivator
_services = services;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
- public virtual object CreateInstance(Type expectedBaseType, string implementationTypeName)
+ [UnconditionalSuppressMessage("Trimmer", "IL2072", Justification = "Unknown type names are rarely used by apps. Handle trimmed types by providing a useful error message.")]
+ [UnconditionalSuppressMessage("Trimmer", "IL2075", Justification = "Unknown type names are rarely used by apps. Handle trimmed types by providing a useful error message.")]
+ public virtual object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type expectedBaseType, string implementationTypeName)
{
// Would the assignment even work?
- var implementationType = Type.GetType(implementationTypeName, throwOnError: true)!;
+ var implementationType = TypeExtensions.GetTypeWithTrimFriendlyErrorMessage(implementationTypeName);
expectedBaseType.AssertIsAssignableFrom(implementationType);
// If no IServiceProvider was specified, prefer .ctor() [if it exists]
diff --git a/src/DataProtection/DataProtection/src/TypeExtensions.cs b/src/DataProtection/DataProtection/src/TypeExtensions.cs
index 8da7fc7804..89b69d0b70 100644
--- a/src/DataProtection/DataProtection/src/TypeExtensions.cs
+++ b/src/DataProtection/DataProtection/src/TypeExtensions.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.DataProtection;
@@ -25,4 +26,17 @@ internal static class TypeExtensions
expectedBaseType.AssemblyQualifiedName, implementationType.AssemblyQualifiedName));
}
}
+
+ [UnconditionalSuppressMessage("Trimmer", "IL2057", Justification = "Unknown type names are rarely used by apps. Handle trimmed types by providing a useful error message.")]
+ public static Type GetTypeWithTrimFriendlyErrorMessage(string typeName)
+ {
+ try
+ {
+ return Type.GetType(typeName, throwOnError: true)!;
+ }
+ catch (TypeLoadException ex)
+ {
+ throw new InvalidOperationException($"Unable to load type '{typeName}'. If the app is published with trimming then this type may have been trimmed. Ensure the type's assembly is excluded from trimming.", ex);
+ }
+ }
}
diff --git a/src/DataProtection/DataProtection/src/TypeForwardingActivator.cs b/src/DataProtection/DataProtection/src/TypeForwardingActivator.cs
index bfa537187d..4a1d32c4df 100644
--- a/src/DataProtection/DataProtection/src/TypeForwardingActivator.cs
+++ b/src/DataProtection/DataProtection/src/TypeForwardingActivator.cs
@@ -8,7 +8,9 @@ using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.DataProtection;
+#pragma warning disable CA1852 // Seal internal types
internal class TypeForwardingActivator : SimpleActivator
+#pragma warning restore CA1852 // Seal internal types
{
private const string OldNamespace = "Microsoft.AspNet.DataProtection";
private const string CurrentNamespace = "Microsoft.AspNetCore.DataProtection";
@@ -25,29 +27,14 @@ internal class TypeForwardingActivator : SimpleActivator
_logger = loggerFactory.CreateLogger(typeof(TypeForwardingActivator));
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
- public override object CreateInstance(Type expectedBaseType, string originalTypeName)
+ public override object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type expectedBaseType, string originalTypeName)
=> CreateInstance(expectedBaseType, originalTypeName, out var _);
// for testing
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
- internal object CreateInstance(Type expectedBaseType, string originalTypeName, out bool forwarded)
+ [UnconditionalSuppressMessage("Trimmer", "IL2057", Justification = "Type.GetType is only used with forwarded types that are referenced by DataProtection assembly.")]
+ internal object CreateInstance([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type expectedBaseType, string originalTypeName, out bool forwarded)
{
- var forwardedTypeName = originalTypeName;
- var candidate = false;
- if (originalTypeName.Contains(OldNamespace))
- {
- candidate = true;
- forwardedTypeName = originalTypeName.Replace(OldNamespace, CurrentNamespace);
- }
-
- if (candidate || forwardedTypeName.StartsWith(CurrentNamespace + ".", StringComparison.Ordinal))
- {
- candidate = true;
- forwardedTypeName = RemoveVersionFromAssemblyName(forwardedTypeName);
- }
-
- if (candidate)
+ if (TryForwardTypeName(originalTypeName, out var forwardedTypeName))
{
var type = Type.GetType(forwardedTypeName, false);
if (type != null)
@@ -64,6 +51,26 @@ internal class TypeForwardingActivator : SimpleActivator
return base.CreateInstance(expectedBaseType, originalTypeName);
}
+ internal static bool TryForwardTypeName(string originalTypeName, out string forwardedTypeName)
+ {
+ forwardedTypeName = originalTypeName;
+
+ var candidate = false;
+ if (originalTypeName.Contains(OldNamespace))
+ {
+ candidate = true;
+ forwardedTypeName = originalTypeName.Replace(OldNamespace, CurrentNamespace);
+ }
+
+ if (candidate || forwardedTypeName.StartsWith(CurrentNamespace + ".", StringComparison.Ordinal))
+ {
+ candidate = true;
+ forwardedTypeName = RemoveVersionFromAssemblyName(forwardedTypeName);
+ }
+
+ return candidate;
+ }
+
protected static string RemoveVersionFromAssemblyName(string forwardedTypeName)
{
// Type, Assembly, Version={Version}, Culture={Culture}, PublicKeyToken={Token}
diff --git a/src/DataProtection/DataProtection/src/XmlEncryption/EncryptedXmlDecryptor.cs b/src/DataProtection/DataProtection/src/XmlEncryption/EncryptedXmlDecryptor.cs
index 934d1938ff..7265905efa 100644
--- a/src/DataProtection/DataProtection/src/XmlEncryption/EncryptedXmlDecryptor.cs
+++ b/src/DataProtection/DataProtection/src/XmlEncryption/EncryptedXmlDecryptor.cs
@@ -77,7 +77,7 @@ public sealed class EncryptedXmlDecryptor : IInternalEncryptedXmlDecryptor, IXml
/// <summary>
/// Can decrypt the XML key data from an <see cref="X509Certificate2"/> that is not in stored in <see cref="X509Store"/>.
/// </summary>
- private class EncryptedXmlWithCertificateKeys : EncryptedXml
+ private sealed class EncryptedXmlWithCertificateKeys : EncryptedXml
{
private readonly XmlKeyDecryptionOptions? _options;
diff --git a/src/DataProtection/DataProtection/src/XmlEncryption/XmlEncryptionExtensions.cs b/src/DataProtection/DataProtection/src/XmlEncryption/XmlEncryptionExtensions.cs
index 1cf4c264a5..1b99664b48 100644
--- a/src/DataProtection/DataProtection/src/XmlEncryption/XmlEncryptionExtensions.cs
+++ b/src/DataProtection/DataProtection/src/XmlEncryption/XmlEncryptionExtensions.cs
@@ -16,7 +16,6 @@ namespace Microsoft.AspNetCore.DataProtection.XmlEncryption;
internal static unsafe class XmlEncryptionExtensions
{
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static XElement DecryptElement(this XElement element, IActivator activator)
{
// If no decryption necessary, return original element.
@@ -49,7 +48,7 @@ internal static unsafe class XmlEncryptionExtensions
// the decryptor should be the child of the 'encryptedSecret' element.
var clonedElementWhichRequiresDecryption = new XElement(elementWhichRequiresDecryption);
string decryptorTypeName = (string)clonedElementWhichRequiresDecryption.Attribute(XmlConstants.DecryptorTypeAttributeName)!;
- var decryptorInstance = activator.CreateInstance<IXmlDecryptor>(decryptorTypeName);
+ var decryptorInstance = CreateDecryptor(activator, decryptorTypeName);
var decryptedElement = decryptorInstance.Decrypt(clonedElementWhichRequiresDecryption.Elements().Single());
// Put a placeholder into the original document so that we can continue our
@@ -68,6 +67,34 @@ internal static unsafe class XmlEncryptionExtensions
return doc.Root!;
}
+ [UnconditionalSuppressMessage("Trimmer", "IL2057", Justification = "Type.GetType result is only useful with types that are referenced by DataProtection assembly.")]
+ private static IXmlDecryptor CreateDecryptor(IActivator activator, string decryptorTypeName)
+ {
+ var resolvedTypeName = TypeForwardingActivator.TryForwardTypeName(decryptorTypeName, out var forwardedTypeName)
+ ? forwardedTypeName
+ : decryptorTypeName;
+ var type = Type.GetType(resolvedTypeName, throwOnError: false);
+
+ if (type == typeof(DpapiNGXmlDecryptor))
+ {
+ return activator.CreateInstance<DpapiNGXmlDecryptor>(decryptorTypeName);
+ }
+ else if (type == typeof(DpapiXmlDecryptor))
+ {
+ return activator.CreateInstance<DpapiXmlDecryptor>(decryptorTypeName);
+ }
+ else if (type == typeof(EncryptedXmlDecryptor))
+ {
+ return activator.CreateInstance<EncryptedXmlDecryptor>(decryptorTypeName);
+ }
+ else if (type == typeof(NullXmlDecryptor))
+ {
+ return activator.CreateInstance<NullXmlDecryptor>(decryptorTypeName);
+ }
+
+ return activator.CreateInstance<IXmlDecryptor>(decryptorTypeName);
+ }
+
public static XElement? EncryptIfNecessary(this IXmlEncryptor encryptor, XElement element)
{
// If no encryption is necessary, return null.
diff --git a/src/DataProtection/DataProtection/src/XmlEncryption/XmlKeyDecryptionOptions.cs b/src/DataProtection/DataProtection/src/XmlEncryption/XmlKeyDecryptionOptions.cs
index e5cd68e3ce..f87ecc9a88 100644
--- a/src/DataProtection/DataProtection/src/XmlEncryption/XmlKeyDecryptionOptions.cs
+++ b/src/DataProtection/DataProtection/src/XmlEncryption/XmlKeyDecryptionOptions.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.DataProtection.XmlEncryption;
/// <summary>
/// Specifies settings for how to decrypt XML keys.
/// </summary>
-internal class XmlKeyDecryptionOptions
+internal sealed class XmlKeyDecryptionOptions
{
private readonly Dictionary<string, List<X509Certificate2>> _certs = new Dictionary<string, List<X509Certificate2>>(StringComparer.Ordinal);
diff --git a/src/DataProtection/DataProtection/test/DataProtectionUtilityExtensionsTests.cs b/src/DataProtection/DataProtection/test/DataProtectionUtilityExtensionsTests.cs
index 7165949594..611cd5cbfd 100644
--- a/src/DataProtection/DataProtection/test/DataProtectionUtilityExtensionsTests.cs
+++ b/src/DataProtection/DataProtection/test/DataProtectionUtilityExtensionsTests.cs
@@ -4,18 +4,58 @@
using Microsoft.AspNetCore.DataProtection.Infrastructure;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using Microsoft.AspNetCore.Testing;
using Moq;
namespace Microsoft.AspNetCore.DataProtection;
public class DataProtectionUtilityExtensionsTests
{
- [Theory]
- [InlineData("app-path", "app-path")]
- [InlineData("app-path ", "app-path")] // normalized trim
+ [ConditionalTheory]
+ [InlineData("app-path", "app-path\\")]
+ [InlineData("app-path ", "app-path\\")] // normalized trim
+ [InlineData("app-path\\", "app-path\\")]
+ [InlineData("app-path \\", "app-path \\")]
+ [InlineData("app-path/", "app-path/")]
+ [InlineData("app-path /", "app-path /")]
+ [InlineData(" /", "/")]
+ [InlineData(" \\ ", "\\")]
+ [InlineData(" ", null)] // normalized whitespace -> null
+ [InlineData(null, null)] // nothing provided at all
+ [OSSkipCondition(OperatingSystems.Linux)]
+ [OSSkipCondition(OperatingSystems.MacOSX)]
+ public void GetApplicationUniqueIdentifierFromHostingWindows(string contentRootPath, string expected)
+ {
+ // Arrange
+ var mockEnvironment = new Mock<IHostEnvironment>();
+ mockEnvironment.Setup(o => o.ContentRootPath).Returns(contentRootPath);
+
+ var services = new ServiceCollection()
+ .AddSingleton(mockEnvironment.Object)
+ .AddDataProtection()
+ .Services
+ .BuildServiceProvider();
+
+ // Act
+ var actual = services.GetApplicationUniqueIdentifier();
+
+ // Assert
+ Assert.Equal(expected, actual);
+ }
+
+ [ConditionalTheory]
+ [InlineData("app-path", "app-path/")]
+ [InlineData("app-path ", "app-path/")] // normalized trim
+ [InlineData("app-path\\", "app-path\\/")]
+ [InlineData("app-path \\", "app-path \\/")]
+ [InlineData("app-path/", "app-path/")]
+ [InlineData("app-path /", "app-path /")]
+ [InlineData(" /", "/")]
+ [InlineData(" \\ ", "\\/")]
[InlineData(" ", null)] // normalized whitespace -> null
[InlineData(null, null)] // nothing provided at all
- public void GetApplicationUniqueIdentifierFromHosting(string contentRootPath, string expected)
+ [OSSkipCondition(OperatingSystems.Windows)]
+ public void GetApplicationUniqueIdentifierFromHostingNonWindows(string contentRootPath, string expected)
{
// Arrange
var mockEnvironment = new Mock<IHostEnvironment>();
diff --git a/src/DataProtection/DataProtection/test/RegistryPolicyResolverTests.cs b/src/DataProtection/DataProtection/test/RegistryPolicyResolverTests.cs
index ca61d9309e..170e3b5a54 100644
--- a/src/DataProtection/DataProtection/test/RegistryPolicyResolverTests.cs
+++ b/src/DataProtection/DataProtection/test/RegistryPolicyResolverTests.cs
@@ -51,6 +51,24 @@ public class RegistryPolicyResolverTests
[ConditionalFact]
[ConditionalRunTestOnlyIfHkcuRegistryAvailable]
+ public void ResolvePolicy_MissingKeyEscrowSinks()
+ {
+ // Arrange
+ var typeName = typeof(MyKeyEscrowSink1).AssemblyQualifiedName.Replace("MyKeyEscrowSink1", "MyKeyEscrowSinkDontExist");
+ var registryEntries = new Dictionary<string, object>()
+ {
+ ["KeyEscrowSinks"] = typeName
+ };
+
+ // Act
+ var ex = ExceptionAssert.Throws<InvalidOperationException>(() => RunTestWithRegValues(registryEntries));
+
+ // Assert
+ Assert.Equal($"Unable to load type '{typeName}'. If the app is published with trimming then this type may have been trimmed. Ensure the type's assembly is excluded from trimming.", ex.Message);
+ }
+
+ [ConditionalFact]
+ [ConditionalRunTestOnlyIfHkcuRegistryAvailable]
public void ResolvePolicy_DefaultKeyLifetime()
{
// Arrange
diff --git a/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs b/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs
index 386cccf896..8646adf440 100644
--- a/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs
+++ b/src/DataProtection/EntityFrameworkCore/src/EntityFrameworkCoreXmlRepository.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Xml.Linq;
using Microsoft.AspNetCore.DataProtection.Repositories;
@@ -24,6 +25,10 @@ public class EntityFrameworkCoreXmlRepository<TContext> : IXmlRepository
/// </summary>
/// <param name="services"></param>
/// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
+ // DataProtectionKey.Id is not used anywhere. Add DynamicDependency to prevent it from being trimmed.
+ // Note that in the future EF may annotate itself to include properties automatically, and the annotation here could be removed.
+ // Fixes https://github.com/dotnet/aspnetcore/issues/43187
+ [DynamicDependency(DynamicallyAccessedMemberTypes.PublicProperties, typeof(DataProtectionKey))]
public EntityFrameworkCoreXmlRepository(IServiceProvider services, ILoggerFactory loggerFactory)
{
if (loggerFactory == null)
diff --git a/src/DataProtection/EntityFrameworkCore/src/PublicAPI.Shipped.txt b/src/DataProtection/EntityFrameworkCore/src/PublicAPI.Shipped.txt
index 17a102c33f..dd36f68796 100644
--- a/src/DataProtection/EntityFrameworkCore/src/PublicAPI.Shipped.txt
+++ b/src/DataProtection/EntityFrameworkCore/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.EntityFrameworkCoreXmlRepository<TContext>
+Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.EntityFrameworkCoreXmlRepository<TContext>
Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey
Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey.DataProtectionKey() -> void
Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey.FriendlyName.get -> string?
diff --git a/src/DataProtection/Extensions/src/DataProtectionAdvancedExtensions.cs b/src/DataProtection/Extensions/src/DataProtectionAdvancedExtensions.cs
index 520b0901fd..28bd26c82f 100644
--- a/src/DataProtection/Extensions/src/DataProtectionAdvancedExtensions.cs
+++ b/src/DataProtection/Extensions/src/DataProtectionAdvancedExtensions.cs
@@ -19,7 +19,6 @@ public static class DataProtectionAdvancedExtensions
/// <param name="plaintext">The plaintext data to protect.</param>
/// <param name="lifetime">The amount of time after which the payload should no longer be unprotectable.</param>
/// <returns>The protected form of the plaintext data.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static byte[] Protect(this ITimeLimitedDataProtector protector, byte[] plaintext, TimeSpan lifetime)
{
if (protector == null)
@@ -43,7 +42,6 @@ public static class DataProtectionAdvancedExtensions
/// <param name="plaintext">The plaintext data to protect.</param>
/// <param name="expiration">The time when this payload should expire.</param>
/// <returns>The protected form of the plaintext data.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static string Protect(this ITimeLimitedDataProtector protector, string plaintext, DateTimeOffset expiration)
{
if (protector == null)
@@ -68,7 +66,6 @@ public static class DataProtectionAdvancedExtensions
/// <param name="plaintext">The plaintext data to protect.</param>
/// <param name="lifetime">The amount of time after which the payload should no longer be unprotectable.</param>
/// <returns>The protected form of the plaintext data.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static string Protect(this ITimeLimitedDataProtector protector, string plaintext, TimeSpan lifetime)
{
if (protector == null)
@@ -111,7 +108,6 @@ public static class DataProtectionAdvancedExtensions
/// <exception cref="System.Security.Cryptography.CryptographicException">
/// Thrown if <paramref name="protectedData"/> is invalid, malformed, or expired.
/// </exception>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public static string Unprotect(this ITimeLimitedDataProtector protector, string protectedData, out DateTimeOffset expiration)
{
if (protector == null)
@@ -150,7 +146,6 @@ public static class DataProtectionAdvancedExtensions
throw new NotImplementedException();
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] Protect(byte[] plaintext)
{
if (plaintext == null)
@@ -161,7 +156,6 @@ public static class DataProtectionAdvancedExtensions
return _innerProtector.Protect(plaintext, Expiration);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] Unprotect(byte[] protectedData)
{
if (protectedData == null)
diff --git a/src/DataProtection/Extensions/src/ITimeLimitedDataProtector.cs b/src/DataProtection/Extensions/src/ITimeLimitedDataProtector.cs
index 04aa0b2736..560bffbf0e 100644
--- a/src/DataProtection/Extensions/src/ITimeLimitedDataProtector.cs
+++ b/src/DataProtection/Extensions/src/ITimeLimitedDataProtector.cs
@@ -39,7 +39,6 @@ public interface ITimeLimitedDataProtector : IDataProtector
/// <param name="plaintext">The plaintext data to protect.</param>
/// <param name="expiration">The time when this payload should expire.</param>
/// <returns>The protected form of the plaintext data.</returns>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] Protect(byte[] plaintext, DateTimeOffset expiration);
/// <summary>
@@ -52,6 +51,5 @@ public interface ITimeLimitedDataProtector : IDataProtector
/// <exception cref="System.Security.Cryptography.CryptographicException">
/// Thrown if <paramref name="protectedData"/> is invalid, malformed, or expired.
/// </exception>
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] Unprotect(byte[] protectedData, out DateTimeOffset expiration);
}
diff --git a/src/DataProtection/Extensions/src/TimeLimitedDataProtector.cs b/src/DataProtection/Extensions/src/TimeLimitedDataProtector.cs
index d3514d3eea..94c1d2cb35 100644
--- a/src/DataProtection/Extensions/src/TimeLimitedDataProtector.cs
+++ b/src/DataProtection/Extensions/src/TimeLimitedDataProtector.cs
@@ -47,7 +47,6 @@ internal sealed class TimeLimitedDataProtector : ITimeLimitedDataProtector
return retVal;
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] Protect(byte[] plaintext, DateTimeOffset expiration)
{
if (plaintext == null)
@@ -63,7 +62,6 @@ internal sealed class TimeLimitedDataProtector : ITimeLimitedDataProtector
return GetInnerProtectorWithTimeLimitedPurpose().Protect(plaintextWithHeader);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
public byte[] Unprotect(byte[] protectedData, out DateTimeOffset expiration)
{
if (protectedData == null)
@@ -74,7 +72,6 @@ internal sealed class TimeLimitedDataProtector : ITimeLimitedDataProtector
return UnprotectCore(protectedData, DateTimeOffset.UtcNow, out expiration);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
internal byte[] UnprotectCore(byte[] protectedData, DateTimeOffset now, out DateTimeOffset expiration)
{
if (protectedData == null)
@@ -128,7 +125,6 @@ internal sealed class TimeLimitedDataProtector : ITimeLimitedDataProtector
return CreateProtector(purpose);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] IDataProtector.Protect(byte[] plaintext)
{
if (plaintext == null)
@@ -140,7 +136,6 @@ internal sealed class TimeLimitedDataProtector : ITimeLimitedDataProtector
return Protect(plaintext, DateTimeOffset.MaxValue);
}
- [RequiresUnreferencedCode(TrimmerWarning.Message)]
byte[] IDataProtector.Unprotect(byte[] protectedData)
{
if (protectedData == null)
diff --git a/src/DataProtection/Extensions/test/DataProtectionProviderTests.cs b/src/DataProtection/Extensions/test/DataProtectionProviderTests.cs
index ab0e6877ce..3e6a60f2e5 100644
--- a/src/DataProtection/Extensions/test/DataProtectionProviderTests.cs
+++ b/src/DataProtection/Extensions/test/DataProtectionProviderTests.cs
@@ -226,7 +226,8 @@ public class DataProtectionProviderTests
// Step 2: instantiate the system and round-trip a payload
var protector = DataProtectionProvider.Create(directory, certificate).CreateProtector("purpose");
- Assert.Equal("payload", protector.Unprotect(protector.Protect("payload")));
+ Assert.Equal("payload",
+ protector.Unprotect(protector.Protect("payload")));
// Step 3: validate that there's now a single key in the directory and that it's is protected using the certificate
var allFiles = directory.GetFiles();
diff --git a/src/DataProtection/shared/src/TrimmerWarning.cs b/src/DataProtection/shared/src/TrimmerWarning.cs
deleted file mode 100644
index b047e4d8b2..0000000000
--- a/src/DataProtection/shared/src/TrimmerWarning.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.DataProtection;
-
-internal static class TrimmerWarning
-{
- public const string Message = "Data Protection may attempt to load types in a way that cannot be statically analyzed. Ensure all required types are preserved.";
-}
diff --git a/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs b/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs
index 733f48b2a1..bd99297c8e 100644
--- a/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs
+++ b/src/DefaultBuilder/src/ConfigureWebHostBuilder.cs
@@ -173,7 +173,7 @@ public sealed class ConfigureWebHostBuilder : IWebHostBuilder, ISupportsStartup
throw new NotSupportedException("Configure() is not supported by WebApplicationBuilder.WebHost. Use the WebApplication returned by WebApplicationBuilder.Build() instead.");
}
- IWebHostBuilder ISupportsStartup.UseStartup(Type startupType)
+ IWebHostBuilder ISupportsStartup.UseStartup([DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] Type startupType)
{
throw new NotSupportedException("UseStartup() is not supported by WebApplicationBuilder.WebHost. Use the WebApplication returned by WebApplicationBuilder.Build() instead.");
}
diff --git a/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj b/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj
index 2c66a8407d..45952ee088 100644
--- a/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj
+++ b/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj
@@ -7,10 +7,12 @@
<Description>Microsoft.AspNetCore</Description>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Authentication" />
+ <Reference Include="Microsoft.AspNetCore.Authorization.Policy" />
<Reference Include="Microsoft.AspNetCore.Diagnostics" />
<Reference Include="Microsoft.AspNetCore.HostFiltering" />
<Reference Include="Microsoft.AspNetCore.Hosting" />
@@ -32,4 +34,9 @@
<Reference Include="Microsoft.Extensions.Logging.EventSource" />
</ItemGroup>
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.Authentication.Test" />
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.Authorization.Test" />
+ </ItemGroup>
+
</Project>
diff --git a/src/DefaultBuilder/src/StartupLinkerOptions.cs b/src/DefaultBuilder/src/StartupLinkerOptions.cs
new file mode 100644
index 0000000000..05310f1252
--- /dev/null
+++ b/src/DefaultBuilder/src/StartupLinkerOptions.cs
@@ -0,0 +1,12 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+
+namespace Microsoft.AspNetCore;
+
+internal static class StartupLinkerOptions
+{
+ // We're going to keep all public constructors and public methods on Startup classes
+ public const DynamicallyAccessedMemberTypes Accessibility = DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.PublicMethods;
+}
diff --git a/src/DefaultBuilder/src/WebApplicationBuilder.cs b/src/DefaultBuilder/src/WebApplicationBuilder.cs
index c5eabba681..3da1ac4e83 100644
--- a/src/DefaultBuilder/src/WebApplicationBuilder.cs
+++ b/src/DefaultBuilder/src/WebApplicationBuilder.cs
@@ -2,6 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -16,6 +18,9 @@ namespace Microsoft.AspNetCore.Builder;
public sealed class WebApplicationBuilder
{
private const string EndpointRouteBuilderKey = "__EndpointRouteBuilder";
+ private const string AuthenticationMiddlewareSetKey = "__AuthenticationMiddlewareSet";
+ private const string AuthorizationMiddlewareSetKey = "__AuthorizationMiddlewareSet";
+ private const string UseRoutingKey = "__UseRouting";
private readonly HostApplicationBuilder _hostApplicationBuilder;
private readonly ServiceDescriptor _genericWebHostServiceDescriptor;
@@ -158,6 +163,8 @@ public sealed class WebApplicationBuilder
if (!_builtApplication.Properties.TryGetValue(EndpointRouteBuilderKey, out var localRouteBuilder))
{
app.UseRouting();
+ // Middleware the needs to re-route will use this property to call UseRouting()
+ _builtApplication.Properties[UseRoutingKey] = app.Properties[UseRoutingKey];
}
else
{
@@ -166,6 +173,30 @@ public sealed class WebApplicationBuilder
}
}
+ // Process authorization and authentication middlewares independently to avoid
+ // registering middlewares for services that do not exist
+ var serviceProviderIsService = _builtApplication.Services.GetService<IServiceProviderIsService>();
+ if (serviceProviderIsService?.IsService(typeof(IAuthenticationSchemeProvider)) is true)
+ {
+ // Don't add more than one instance of the middleware
+ if (!_builtApplication.Properties.ContainsKey(AuthenticationMiddlewareSetKey))
+ {
+ // The Use invocations will set the property on the outer pipeline,
+ // but we want to set it on the inner pipeline as well.
+ _builtApplication.Properties[AuthenticationMiddlewareSetKey] = true;
+ app.UseAuthentication();
+ }
+ }
+
+ if (serviceProviderIsService?.IsService(typeof(IAuthorizationHandlerProvider)) is true)
+ {
+ if (!_builtApplication.Properties.ContainsKey(AuthorizationMiddlewareSetKey))
+ {
+ _builtApplication.Properties[AuthorizationMiddlewareSetKey] = true;
+ app.UseAuthorization();
+ }
+ }
+
// Wire the source pipeline to run in the destination pipeline
app.Use(next =>
{
diff --git a/src/DefaultBuilder/src/WebHost.cs b/src/DefaultBuilder/src/WebHost.cs
index dcbca157bb..6dfa2eac63 100644
--- a/src/DefaultBuilder/src/WebHost.cs
+++ b/src/DefaultBuilder/src/WebHost.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.HostFiltering;
@@ -269,6 +270,6 @@ public static class WebHost
/// <typeparam name ="TStartup">The type containing the startup methods for the application.</typeparam>
/// <param name="args">The command line args.</param>
/// <returns>The initialized <see cref="IWebHostBuilder"/>.</returns>
- public static IWebHostBuilder CreateDefaultBuilder<TStartup>(string[] args) where TStartup : class =>
+ public static IWebHostBuilder CreateDefaultBuilder<[DynamicallyAccessedMembers(StartupLinkerOptions.Accessibility)] TStartup>(string[] args) where TStartup : class =>
CreateDefaultBuilder(args).UseStartup<TStartup>();
}
diff --git a/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs
index c902bb1d59..be105ab922 100644
--- a/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs
+++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Net.Http;
@@ -126,7 +126,7 @@ public class WebHostFunctionalTests : LoggedTest
logger.Log(LogLevel.Information, 0, "Message", null, (s, e) =>
{
- Assert.True(false);
+ Assert.True(false, "Information log when log level set to warning in config");
return string.Empty;
});
diff --git a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj
index c2d039d347..2bb59ab8be 100644
--- a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj
+++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj
@@ -7,6 +7,7 @@
<ItemGroup>
<Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.AspNetCore.TestHost" />
+ <Reference Include="Microsoft.AspNetCore.Authorization.Policy" />
<Content Include="Microsoft.AspNetCore.TestHost.StaticWebAssets.xml" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
diff --git a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs
index 52c757f10f..fd4bda6dca 100644
--- a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs
+++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebApplicationTests.cs
@@ -5,8 +5,13 @@ using System.Collections.Concurrent;
using System.Diagnostics;
using System.Diagnostics.Tracing;
using System.Net;
+using System.Net.Http;
using System.Reflection;
+using System.Security.Claims;
using System.Text;
+using System.Text.Encodings.Web;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.HostFiltering;
using Microsoft.AspNetCore.Hosting;
@@ -1572,12 +1577,13 @@ public class WebApplicationTests
app.Start();
var ds = app.Services.GetRequiredService<EndpointDataSource>();
- Assert.Equal(5, ds.Endpoints.Count);
- Assert.Equal("One", ds.Endpoints[0].DisplayName);
- Assert.Equal("Two", ds.Endpoints[1].DisplayName);
- Assert.Equal("Three", ds.Endpoints[2].DisplayName);
- Assert.Equal("Four", ds.Endpoints[3].DisplayName);
- Assert.Equal("Five", ds.Endpoints[4].DisplayName);
+ var displayNames = ds.Endpoints.Select(e => e.DisplayName).ToArray();
+ Assert.Equal(5, displayNames.Length);
+ Assert.Contains("One", displayNames);
+ Assert.Contains("Two", displayNames);
+ Assert.Contains("Three", displayNames);
+ Assert.Contains("Four", displayNames);
+ Assert.Contains("Five", displayNames);
var client = app.GetTestClient();
@@ -1976,6 +1982,108 @@ public class WebApplicationTests
Assert.Contains(builder.Services, service => service.ServiceType == typeof(ILogger<>));
}
+ [Fact]
+ public async Task RegisterAuthMiddlewaresCorrectly()
+ {
+ var helloEndpointCalled = false;
+ var customMiddlewareExecuted = false;
+ var username = "foobar";
+
+ var builder = WebApplication.CreateBuilder();
+ builder.Services.AddAuthorization();
+ builder.Services.AddAuthentication("testSchemeName")
+ .AddScheme<AuthenticationSchemeOptions, UberHandler>("testSchemeName", "testDisplayName", _ => { });
+ builder.WebHost.UseTestServer();
+ await using var app = builder.Build();
+
+ app.Use(next =>
+ {
+ return async context =>
+ {
+ // IAuthenticationFeature is added by the authentication middleware
+ // during invocation. This middleware should run after authentication
+ // and be able to access the feature.
+ var authFeature = context.Features.Get<IAuthenticationFeature>();
+ Assert.NotNull(authFeature);
+ customMiddlewareExecuted = true;
+ Assert.Equal(username, context.User.Identity.Name);
+ await next(context);
+ };
+ });
+
+ app.MapGet("/hello", (ClaimsPrincipal user) =>
+ {
+ helloEndpointCalled = true;
+ Assert.Equal(username, user.Identity.Name);
+ }).AllowAnonymous();
+
+ await app.StartAsync();
+ var client = app.GetTestClient();
+ await client.GetStringAsync($"/hello?username={username}");
+
+ Assert.True(helloEndpointCalled);
+ Assert.True(customMiddlewareExecuted);
+ }
+
+ [Fact]
+ public async Task SupportsDisablingMiddlewareAutoRegistration()
+ {
+ var builder = WebApplication.CreateBuilder();
+ builder.Services.AddAuthorization();
+ builder.Services.AddAuthentication("testSchemeName")
+ .AddScheme<AuthenticationSchemeOptions, UberHandler>("testSchemeName", "testDisplayName", _ => { });
+ builder.WebHost.UseTestServer();
+ await using var app = builder.Build();
+
+ app.Use(next =>
+ {
+ return async context =>
+ {
+ // IAuthenticationFeature is added by the authentication middleware
+ // during invocation. This middleware should run after authentication
+ // and be able to access the feature.
+ var authFeature = context.Features.Get<IAuthenticationFeature>();
+ Assert.Null(authFeature);
+ Assert.Null(context.User.Identity.Name);
+ await next(context);
+ };
+ });
+
+ app.Properties["__AuthenticationMiddlewareSet"] = true;
+
+ app.MapGet("/hello", (ClaimsPrincipal user) => {}).AllowAnonymous();
+
+ Assert.True(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.False(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+
+ await app.StartAsync();
+
+ Assert.True(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.True(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+ }
+
+ private class UberHandler : AuthenticationHandler<AuthenticationSchemeOptions>
+ {
+ public UberHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) { }
+
+ protected override Task HandleChallengeAsync(AuthenticationProperties properties) => Task.CompletedTask;
+
+ protected override Task HandleForbiddenAsync(AuthenticationProperties properties) => Task.CompletedTask;
+
+ public Task<bool> HandleRequestAsync() => Task.FromResult(false);
+
+ protected override Task<AuthenticateResult> HandleAuthenticateAsync()
+ {
+ var username = Request.Query["username"];
+ var principal = new ClaimsPrincipal();
+ var id = new ClaimsIdentity();
+ id.AddClaim(new Claim(ClaimsIdentity.DefaultNameClaimType, username));
+ principal.AddIdentity(id);
+ return Task.FromResult(AuthenticateResult.Success(
+ new AuthenticationTicket(principal, "custom")));
+ }
+ }
+
public class RandomConfigurationSource : IConfigurationSource
{
public int ProvidersBuilt { get; set; }
diff --git a/src/Extensions/Features/src/FeatureCollection.cs b/src/Extensions/Features/src/FeatureCollection.cs
index 30db5af2bc..29dc500eb4 100644
--- a/src/Extensions/Features/src/FeatureCollection.cs
+++ b/src/Extensions/Features/src/FeatureCollection.cs
@@ -134,7 +134,7 @@ public class FeatureCollection : IFeatureCollection
this[typeof(TFeature)] = instance;
}
- private class KeyComparer : IEqualityComparer<KeyValuePair<Type, object>>
+ private sealed class KeyComparer : IEqualityComparer<KeyValuePair<Type, object>>
{
public bool Equals(KeyValuePair<Type, object> x, KeyValuePair<Type, object> y)
{
diff --git a/src/Extensions/Features/src/PublicAPI.Shipped.txt b/src/Extensions/Features/src/PublicAPI.Shipped.txt
index 33b3f89f6e..ff9e2975dd 100644
--- a/src/Extensions/Features/src/PublicAPI.Shipped.txt
+++ b/src/Extensions/Features/src/PublicAPI.Shipped.txt
@@ -11,9 +11,11 @@ Microsoft.AspNetCore.Http.Features.FeatureCollection.Set<TFeature>(TFeature? ins
Microsoft.AspNetCore.Http.Features.FeatureCollection.this[System.Type! key].get -> object?
Microsoft.AspNetCore.Http.Features.FeatureCollection.this[System.Type! key].set -> void
Microsoft.AspNetCore.Http.Features.FeatureReference<T>
+Microsoft.AspNetCore.Http.Features.FeatureReference<T>.FeatureReference() -> void
Microsoft.AspNetCore.Http.Features.FeatureReference<T>.Fetch(Microsoft.AspNetCore.Http.Features.IFeatureCollection! features) -> T?
Microsoft.AspNetCore.Http.Features.FeatureReference<T>.Update(Microsoft.AspNetCore.Http.Features.IFeatureCollection! features, T feature) -> T
Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.FeatureReferences() -> void
Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Cache -> TCache?
Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Collection.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.FeatureReferences(Microsoft.AspNetCore.Http.Features.IFeatureCollection! collection) -> void
diff --git a/src/Features/JsonPatch/src/PublicAPI.Shipped.txt b/src/Features/JsonPatch/src/PublicAPI.Shipped.txt
index e0795ed825..d55a7e9741 100644
--- a/src/Features/JsonPatch/src/PublicAPI.Shipped.txt
+++ b/src/Features/JsonPatch/src/PublicAPI.Shipped.txt
@@ -194,6 +194,7 @@ Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.OperationType.Get = 2 -> Mic
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.OperationType.Remove = 1 -> Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.OperationType
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.OperationType.Replace = 3 -> Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.OperationType
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionInfo
+Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionInfo.PositionInfo() -> void
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionInfo.Index.get -> int
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionInfo.PositionInfo(Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionType type, int index) -> void
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionInfo.Type.get -> Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionType
@@ -204,6 +205,7 @@ Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionType.Invalid = 2 ->
Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionType.OutOfBounds = 3 -> Microsoft.AspNetCore.JsonPatch.Internal.ListAdapter.PositionType
Microsoft.AspNetCore.JsonPatch.Internal.ObjectVisitor
Microsoft.AspNetCore.JsonPatch.Internal.ParsedPath
+Microsoft.AspNetCore.JsonPatch.Internal.ParsedPath.ParsedPath() -> void
Microsoft.AspNetCore.JsonPatch.Internal.PocoAdapter
Microsoft.AspNetCore.JsonPatch.Internal.PocoAdapter.PocoAdapter() -> void
Microsoft.AspNetCore.JsonPatch.JsonPatchDocument
diff --git a/src/FileProviders/Embedded/src/EnumerableDirectoryContents.cs b/src/FileProviders/Embedded/src/EnumerableDirectoryContents.cs
index f188887abb..d189a6100f 100644
--- a/src/FileProviders/Embedded/src/EnumerableDirectoryContents.cs
+++ b/src/FileProviders/Embedded/src/EnumerableDirectoryContents.cs
@@ -7,7 +7,7 @@ using System.Collections.Generic;
namespace Microsoft.Extensions.FileProviders.Embedded;
-internal class EnumerableDirectoryContents : IDirectoryContents
+internal sealed class EnumerableDirectoryContents : IDirectoryContents
{
private readonly IEnumerable<IFileInfo> _entries;
diff --git a/src/FileProviders/Embedded/src/Manifest/EmbeddedFilesManifest.cs b/src/FileProviders/Embedded/src/Manifest/EmbeddedFilesManifest.cs
index 13a5d01495..8db0baa108 100644
--- a/src/FileProviders/Embedded/src/Manifest/EmbeddedFilesManifest.cs
+++ b/src/FileProviders/Embedded/src/Manifest/EmbeddedFilesManifest.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class EmbeddedFilesManifest
+internal sealed class EmbeddedFilesManifest
{
private static readonly char[] _invalidFileNameChars = Path.GetInvalidFileNameChars()
.Where(c => c != Path.DirectorySeparatorChar && c != Path.AltDirectorySeparatorChar).ToArray();
diff --git a/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryContents.cs b/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryContents.cs
index 19f4b3108d..29d22cd1c2 100644
--- a/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryContents.cs
+++ b/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryContents.cs
@@ -9,7 +9,7 @@ using System.Reflection;
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class ManifestDirectoryContents : IDirectoryContents
+internal sealed class ManifestDirectoryContents : IDirectoryContents
{
private readonly DateTimeOffset _lastModified;
private IFileInfo[]? _entries;
diff --git a/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryInfo.cs b/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryInfo.cs
index 68ea93dacf..edda279fe1 100644
--- a/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryInfo.cs
+++ b/src/FileProviders/Embedded/src/Manifest/ManifestDirectoryInfo.cs
@@ -6,7 +6,7 @@ using System.IO;
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class ManifestDirectoryInfo : IFileInfo
+internal sealed class ManifestDirectoryInfo : IFileInfo
{
public ManifestDirectoryInfo(ManifestDirectory directory, DateTimeOffset lastModified)
{
diff --git a/src/FileProviders/Embedded/src/Manifest/ManifestFile.cs b/src/FileProviders/Embedded/src/Manifest/ManifestFile.cs
index 694d71423c..59dc3587a3 100644
--- a/src/FileProviders/Embedded/src/Manifest/ManifestFile.cs
+++ b/src/FileProviders/Embedded/src/Manifest/ManifestFile.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System;
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class ManifestFile : ManifestEntry
+internal sealed class ManifestFile : ManifestEntry
{
public ManifestFile(string name, string resourcePath)
: base(name)
diff --git a/src/FileProviders/Embedded/src/Manifest/ManifestFileInfo.cs b/src/FileProviders/Embedded/src/Manifest/ManifestFileInfo.cs
index c909d5b21d..a3c97a0985 100644
--- a/src/FileProviders/Embedded/src/Manifest/ManifestFileInfo.cs
+++ b/src/FileProviders/Embedded/src/Manifest/ManifestFileInfo.cs
@@ -7,7 +7,7 @@ using System.Reflection;
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class ManifestFileInfo : IFileInfo
+internal sealed class ManifestFileInfo : IFileInfo
{
private long? _length;
diff --git a/src/FileProviders/Embedded/src/Manifest/ManifestRootDirectory.cs b/src/FileProviders/Embedded/src/Manifest/ManifestRootDirectory.cs
index 3c5ec9bd61..1fa195e71e 100644
--- a/src/FileProviders/Embedded/src/Manifest/ManifestRootDirectory.cs
+++ b/src/FileProviders/Embedded/src/Manifest/ManifestRootDirectory.cs
@@ -3,7 +3,7 @@
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class ManifestRootDirectory : ManifestDirectory
+internal sealed class ManifestRootDirectory : ManifestDirectory
{
public ManifestRootDirectory(ManifestEntry[] children)
: base(name: string.Empty, children: children)
diff --git a/src/FileProviders/Embedded/src/Manifest/ManifestSinkDirectory.cs b/src/FileProviders/Embedded/src/Manifest/ManifestSinkDirectory.cs
index 89594fead3..7cf07a9a86 100644
--- a/src/FileProviders/Embedded/src/Manifest/ManifestSinkDirectory.cs
+++ b/src/FileProviders/Embedded/src/Manifest/ManifestSinkDirectory.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.Extensions.FileProviders.Embedded.Manifest;
-internal class ManifestSinkDirectory : ManifestDirectory
+internal sealed class ManifestSinkDirectory : ManifestDirectory
{
private ManifestSinkDirectory()
: base(name: string.Empty, children: Array.Empty<ManifestEntry>())
diff --git a/src/FileProviders/Manifest.MSBuildTask/src/Entry.cs b/src/FileProviders/Manifest.MSBuildTask/src/Entry.cs
index c0ba836937..f5a9029cb9 100644
--- a/src/FileProviders/Manifest.MSBuildTask/src/Entry.cs
+++ b/src/FileProviders/Manifest.MSBuildTask/src/Entry.cs
@@ -110,7 +110,7 @@ public class Entry : IEquatable<Entry>
return true;
}
- private class NameComparer : IComparer<Entry>
+ private sealed class NameComparer : IComparer<Entry>
{
public static NameComparer Instance { get; } = new NameComparer();
diff --git a/src/FileProviders/Manifest.MSBuildTask/src/Manifest.cs b/src/FileProviders/Manifest.MSBuildTask/src/Manifest.cs
index 5fd37ded92..1a71e041b2 100644
--- a/src/FileProviders/Manifest.MSBuildTask/src/Manifest.cs
+++ b/src/FileProviders/Manifest.MSBuildTask/src/Manifest.cs
@@ -69,7 +69,7 @@ public class Manifest
}
}
- private class ElementNames
+ private sealed class ElementNames
{
public const string Directory = "Directory";
public const string Name = "Name";
diff --git a/src/Framework/App.Ref/src/Microsoft.AspNetCore.App.Ref.csproj b/src/Framework/App.Ref/src/Microsoft.AspNetCore.App.Ref.csproj
index 358c7b7409..9c1fc5cd35 100644
--- a/src/Framework/App.Ref/src/Microsoft.AspNetCore.App.Ref.csproj
+++ b/src/Framework/App.Ref/src/Microsoft.AspNetCore.App.Ref.csproj
@@ -158,7 +158,8 @@ This package is an internal implementation of the .NET Core SDK and is not meant
@(ReferencePathWithRefAssemblies->WithMetadataValue('Filename', 'System.Diagnostics.EventLog'));
@(ReferencePathWithRefAssemblies->WithMetadataValue('Filename', 'System.IO.Pipelines'));
@(ReferencePathWithRefAssemblies->WithMetadataValue('Filename', 'System.Security.Cryptography.Pkcs'));
- @(ReferencePathWithRefAssemblies->WithMetadataValue('Filename', 'System.Security.Cryptography.Xml'))" />
+ @(ReferencePathWithRefAssemblies->WithMetadataValue('Filename', 'System.Security.Cryptography.Xml'));
+ @(ReferencePathWithRefAssemblies->WithMetadataValue('Filename', 'System.Threading.RateLimiting'))"/>
<AspNetCoreReferenceAssemblyPath
Include="@(_ReferencedRuntimeRefAssemblies->'$(RuntimeTransportReferenceDirectory)%(FileName)%(Extension)')" />
diff --git a/src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj b/src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj
index 5d7e9f89a0..c062788037 100644
--- a/src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj
+++ b/src/Framework/App.Runtime/src/Microsoft.AspNetCore.App.Runtime.csproj
@@ -179,6 +179,8 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<InternalArchiveOutputPath>$(InstallersOutputPath)$(InternalArchiveOutputFileName)</InternalArchiveOutputPath>
<RedistArchiveOutputFileName>$(RuntimeInstallerBaseName)-$(PackageVersion)-$(TargetRuntimeIdentifier)$(ArchiveExtension)</RedistArchiveOutputFileName>
<RedistArchiveOutputPath>$(InstallersOutputPath)$(RedistArchiveOutputFileName)</RedistArchiveOutputPath>
+ <CompositeArchiveOutputFileName>$(RuntimeInstallerBaseName)-$(PackageVersion)-$(TargetRuntimeIdentifier)-composite$(ArchiveExtension)</CompositeArchiveOutputFileName>
+ <CompositeArchiveOutputPath>$(InstallersOutputPath)$(CompositeArchiveOutputFileName)</CompositeArchiveOutputPath>
</PropertyGroup>
<!-- Target chain -->
@@ -204,8 +206,10 @@ This package is an internal implementation of the .NET Core SDK and is not meant
_DownloadAndExtractDotNetRuntime;
_BatchCopyToSharedFrameworkLayout;
_BatchCopyToRedistLayout;
+ _BatchCopyToCompositeLayout;
_CreateInternalSharedFxArchive;
_CreateRedistSharedFxArchive;
+ _CreateRedistCompositeArchive;
</CoreBuildDependsOn>
<!-- If Build won't run in the GenerateNuspec context, need to update Content, None and _PackageFiles. -->
<GenerateNuspecDependsOn Condition=" '$(NoBuild)' == 'true' AND '$(GeneratePackageOnBuild)' != 'true' ">
@@ -222,6 +226,7 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<CrossGenDependsOn Condition=" '$(CrossgenOutput)' == 'true' ">
$(CrossGenDependsOn);
_BatchCrossGenAssemblies;
+ _GenerateComposites;
</CrossGenDependsOn>
<!-- _GetBuildOutputFilesWithTfm executes in a separate context from Build, GenerateNuspec, and so on. -->
<TargetsForTfmSpecificBuildOutput>
@@ -461,6 +466,36 @@ This package is an internal implementation of the .NET Core SDK and is not meant
StandardOutputImportance="High" />
</Target>
+ <Target Name="_GenerateComposites"
+ Condition="'$(TargetOsName)' == 'linux'"
+ DependsOnTargets="_ExpandRuntimePackageRoot">
+
+ <PropertyGroup>
+ <CompositeTargetDir>$([MSBuild]::NormalizeDirectory('$(ArtifactsObjDir)', 'Composite', '$(Configuration)'))</CompositeTargetDir>
+ <ManagedAssetsFullPath>$(RuntimePackageRoot)$(ManagedAssetsPackagePath)</ManagedAssetsFullPath>
+ <NativeAssetsFullPath>$(RuntimePackageRoot)$(NativeAssetsPackagePath)</NativeAssetsFullPath>
+
+ <BaseAssemblies>$(ManagedAssetsFullPath)\*.dll</BaseAssemblies>
+
+ <CompositeArgs>--composite</CompositeArgs>
+ <CompositeArgs>$(CompositeArgs) --targetarch:$(TargetArchitecture)</CompositeArgs>
+ <CompositeArgs>$(CompositeArgs) --targetos:$(Crossgen2TargetOs)</CompositeArgs>
+ <CompositeArgs>$(CompositeArgs) $(BaseAssemblies)</CompositeArgs>
+ <CompositeArgs>$(CompositeArgs) $(TargetDir)*.dll</CompositeArgs>
+ <CompositeArgs>$(CompositeArgs) --out:&quot;$(CompositeTargetDir)full-composite.r2r.dll&quot;</CompositeArgs>
+ </PropertyGroup>
+
+ <RemoveDir Directories="$(CompositeTargetDir)" />
+ <MakeDir Directories="$(CompositeTargetDir)" />
+
+ <ItemGroup>
+ <NativeSharedObjects Include="$(NativeAssetsFullPath)\*.so" />
+ </ItemGroup>
+
+ <Exec Command="&quot;$(CrossgenToolPath)&quot; $(CompositeArgs)" />
+ <Copy SourceFiles="@(NativeSharedObjects)" DestinationFolder="$(CompositeTargetDir)" />
+ </Target>
+
<!--
#########################################
Targets related to creating .zip/.tar.gz
@@ -526,6 +561,7 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<Target Name="_BatchCopyToSharedFrameworkLayout"
Inputs="@(SharedFxContent)"
Outputs="@(SharedFxContent->'$(SharedFxLayoutTargetDir)%(FileName)%(Extension)')">
+
<Copy SourceFiles="@(SharedFxContent)"
DestinationFiles="@(SharedFxContent->'$(SharedFxLayoutTargetDir)%(FileName)%(Extension)')"
UseHardlinksIfPossible="true" />
@@ -543,12 +579,44 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<Target Name="_BatchCopyToRedistLayout"
Inputs="@(SharedFxContent)"
Outputs="@(SharedFxContent->'$(RedistLayoutTargetDir)%(FileName)%(Extension)')">
+
<Copy SourceFiles="@(SharedFxContent)"
DestinationFiles="@(SharedFxContent->'$(RedistLayoutTargetDir)%(FileName)%(Extension)')"
UseHardlinksIfPossible="true" />
<Message Importance="High" Text="$(MSbuildProjectFile) -> $(RedistLayoutTargetDir)" />
</Target>
+ <Target Name="_BatchCopyToCompositeLayout"
+ Condition="'$(TargetOsName)' == 'linux'">
+ <PropertyGroup>
+ <CompositeFrameworkLayoutRoot>$([MSBuild]::NormalizeDirectory('$(ArtifactsObjDir)', CompositeFx.Layout, '$(Configuration)', '$(TargetRuntimeIdentifier)'))</CompositeFrameworkLayoutRoot>
+ <LayoutAspnetPath>$(CompositeFrameworkLayoutRoot)\shared\$(SharedFxName)\$(SharedFxVersion)\</LayoutAspnetPath>
+ <LayoutNetcorePath>$(CompositeFrameworkLayoutRoot)\shared\Microsoft.NETCore.App\$(MicrosoftNETCoreAppRuntimeVersion)\</LayoutNetcorePath>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <RedistLayoutFiles Include="$(RedistSharedFrameworkLayoutRoot)**\*.*" />
+ <CompositeFiles Include="$(CompositeTargetDir)**\*.*" />
+ </ItemGroup>
+
+ <RemoveDir Directories="$(CompositeFrameworkLayoutRoot)" />
+ <Copy SourceFiles="@(RedistLayoutFiles)" DestinationFolder="$(CompositeFrameworkLayoutRoot)%(RecursiveDir)" />
+
+ <ItemGroup>
+ <AspnetFiles Include="$(LayoutAspnetPath)**\*.*" />
+ <AspnetFilesByName Include="@(AspnetFiles->'%(Filename)%(Extension)')" />
+ <CompositeFilesByName Include="@(CompositeFiles->'%(Filename)%(Extension)')" />
+ <FrameworkCompositesByName Include="@(CompositeFilesByName)" Exclude="@(AspnetFilesByName)" />
+ <AspnetCompositesByName Include="@(CompositeFilesByName)" Exclude="@(FrameworkCompositesByName)" />
+ </ItemGroup>
+
+ <Copy SourceFiles="@(FrameworkCompositesByName->'$(CompositeTargetDir)%(Filename)%(Extension)')"
+ DestinationFolder="$(LayoutNetcorePath)" />
+
+ <Copy SourceFiles="@(AspnetCompositesByName->'$(CompositeTargetDir)%(Filename)%(Extension)')"
+ DestinationFolder="$(LayoutAspnetPath)" />
+ </Target>
+
<Target Name="_CleanLocalDotNet" BeforeTargets="_InstallFrameworkIntoLocalDotNet">
<ItemGroup>
<_ExtraDotNetFiles Include="$(LocalInstallationOutputPath)**\*.*"
@@ -566,6 +634,7 @@ This package is an internal implementation of the .NET Core SDK and is not meant
Condition="'$(DotNetBuildFromSource)' != 'true'"
Inputs="@(SharedFxContent)"
Outputs="@(SharedFxContent->'$(LocalInstallationOutputPath)%(FileName)%(Extension)')">
+
<Copy SourceFiles="@(SharedFxContent)"
DestinationFiles="@(SharedFxContent->'$(LocalInstallationOutputPath)%(FileName)%(Extension)')"
UseHardlinksIfPossible="true" />
@@ -587,12 +656,23 @@ This package is an internal implementation of the .NET Core SDK and is not meant
<Message Importance="High" Text="$(MSbuildProjectFile) -> $(InternalArchiveOutputPath)" />
</Target>
+ <Target Name="_CreateRedistCompositeArchive"
+ Condition="'$(TargetOsName)' == 'linux'"
+ Inputs="$(CompositeTargetDir)"
+ Outputs="$(CompositeArchiveOutputPath)">
+ <Message Importance="High" Text="$(MSbuildProjectFile) -> $(CompositeArchiveOutputPath)" />
+ <Exec
+ Command="tar -czf $(CompositeArchiveOutputPath) ."
+ WorkingDirectory="$(CompositeFrameworkLayoutRoot)" />
+ </Target>
+
<!-- Redist tarball including the dotnet-runtime is not needed in source build -->
<Target Name="_CreateRedistSharedFxArchive"
Condition="'$(DotNetBuildFromSource)' != 'true'"
Inputs="@(SharedFxContent)"
Outputs="$(RedistArchiveOutputPath)">
<Message Importance="High" Text="$(MSbuildProjectFile) -> $(RedistArchiveOutputPath)" />
+
<ZipDirectory
SourceDirectory="$(RedistSharedFrameworkLayoutRoot)"
DestinationFile="$(RedistArchiveOutputPath)"
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs
index c01db137de..1433381a99 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/DiagnosticDescriptors.cs
@@ -79,4 +79,40 @@ internal static class DiagnosticDescriptors
DiagnosticSeverity.Error,
isEnabledByDefault: true,
helpLinkUri: "https://aka.ms/aspnet/analyzers");
+
+ internal static readonly DiagnosticDescriptor DoNotUseHostConfigureLogging = new(
+ "ASP0011",
+ "Suggest using builder.Logging over Host.ConfigureLogging or WebHost.ConfigureLogging",
+ "Suggest using builder.Logging instead of {0}",
+ "Usage",
+ DiagnosticSeverity.Warning,
+ isEnabledByDefault: true,
+ helpLinkUri: "https://aka.ms/aspnet/analyzers");
+
+ internal static readonly DiagnosticDescriptor DoNotUseHostConfigureServices = new(
+ "ASP0012",
+ "Suggest using builder.Services over Host.ConfigureServices or WebHost.ConfigureServices",
+ "Suggest using builder.Services instead of {0}",
+ "Usage",
+ DiagnosticSeverity.Warning,
+ isEnabledByDefault: true,
+ helpLinkUri: "https://aka.ms/aspnet/analyzers");
+
+ internal static readonly DiagnosticDescriptor DisallowConfigureAppConfigureHostBuilder = new(
+ "ASP0013",
+ "Suggest switching from using Configure methods to WebApplicationBuilder.Configuration",
+ "Suggest using WebApplicationBuilder.Configuration instead of {0}",
+ "Usage",
+ DiagnosticSeverity.Warning,
+ isEnabledByDefault: true,
+ helpLinkUri: "https://aka.ms/aspnet/analyzers");
+
+ internal static readonly DiagnosticDescriptor UseTopLevelRouteRegistrationsInsteadOfUseEndpoints = new(
+ "ASP0014",
+ "Suggest using top level route registrations",
+ "Suggest using top level route registrations instead of {0}",
+ "Usage",
+ DiagnosticSeverity.Warning,
+ isEnabledByDefault: true,
+ helpLinkUri: "https://aka.ms/aspnet/analyzers");
}
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RenderTreeBuilder/RenderTreeBuilderAnalyzer.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RenderTreeBuilder/RenderTreeBuilderAnalyzer.cs
index 444477ae6e..7ab4003406 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RenderTreeBuilder/RenderTreeBuilderAnalyzer.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RenderTreeBuilder/RenderTreeBuilderAnalyzer.cs
@@ -12,48 +12,53 @@ namespace Microsoft.AspNetCore.Analyzers.RenderTreeBuilder;
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public partial class RenderTreeBuilderAnalyzer : DiagnosticAnalyzer
{
- public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(new[]
- {
- DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers,
- });
+ private const int SequenceParameterOrdinal = 0;
+ public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics => ImmutableArray.Create(DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers);
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
- context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
+ context.RegisterCompilationStartAction(context =>
{
- var compilation = compilationStartAnalysisContext.Compilation;
+ var compilation = context.Compilation;
if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
{
return;
}
- compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext =>
+ context.RegisterOperationAction(context =>
{
- var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
+ var invocation = (IInvocationOperation)context.Operation;
if (!IsRenderTreeBuilderMethodWithSequenceParameter(wellKnownTypes, invocation.TargetMethod))
{
return;
}
- var sequenceArgument = invocation.Arguments[0];
-
- if (!sequenceArgument.Value.Syntax.IsKind(SyntaxKind.NumericLiteralExpression))
+ foreach (var argument in invocation.Arguments)
{
- operationAnalysisContext.ReportDiagnostic(Diagnostic.Create(
- DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers,
- sequenceArgument.Syntax.GetLocation(),
- sequenceArgument.Syntax.ToString()));
+ if (argument.Parameter.Ordinal == SequenceParameterOrdinal)
+ {
+ if (!argument.Value.Syntax.IsKind(SyntaxKind.NumericLiteralExpression))
+ {
+ context.ReportDiagnostic(Diagnostic.Create(
+ DiagnosticDescriptors.DoNotUseNonLiteralSequenceNumbers,
+ argument.Syntax.GetLocation(),
+ argument.Syntax.ToString()));
+ }
+
+ break;
+ }
}
+
}, OperationKind.Invocation);
});
}
private static bool IsRenderTreeBuilderMethodWithSequenceParameter(WellKnownTypes wellKnownTypes, IMethodSymbol targetMethod)
=> SymbolEqualityComparer.Default.Equals(wellKnownTypes.RenderTreeBuilder, targetMethod.ContainingType)
- && targetMethod.Parameters.Length != 0
- && targetMethod.Parameters[0].Name == "sequence";
+ && targetMethod.Parameters.Length > SequenceParameterOrdinal
+ && targetMethod.Parameters[SequenceParameterOrdinal].Name == "sequence";
}
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMismatchedParameterOptionality.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMismatchedParameterOptionality.cs
index 7cbaa3b97e..64fea3319d 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMismatchedParameterOptionality.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMismatchedParameterOptionality.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Diagnostics;
using System.Linq;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Diagnostics;
@@ -21,7 +22,16 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
return;
}
- var value = invocation.Arguments[1].Value;
+ IOperation? value = null;
+ foreach (var argument in invocation.Arguments)
+ {
+ if (argument.Parameter.Ordinal == 1)
+ {
+ value = argument.Value;
+ }
+ }
+
+ Debug.Assert(value is not null);
if (value.ConstantValue is not { HasValue: true } constant ||
constant.Value is not string routeTemplate)
{
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMisplacedLambdaAttribute.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMisplacedLambdaAttribute.cs
index 6363fc9292..126f0a9c25 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMisplacedLambdaAttribute.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DetectMisplacedLambdaAttribute.cs
@@ -13,7 +13,6 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
{
private static void DetectMisplacedLambdaAttribute(
in OperationAnalysisContext context,
- IInvocationOperation invocation,
IAnonymousFunctionOperation lambda)
{
// This analyzer will only process invocations that are immediate children of the
@@ -23,29 +22,21 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
// Hello();
// return "foo";
// }
- InvocationExpressionSyntax? targetInvocation = null;
+ IMethodSymbol? methodSymbol = null;
// () => Hello() has a single child which is a BlockOperation so we check to see if
// expression associated with that operation is an invocation expression
if (lambda.ChildOperations.FirstOrDefault().Syntax is InvocationExpressionSyntax innerInvocation)
{
- targetInvocation = innerInvocation;
+ methodSymbol = lambda.Symbol;
}
if (lambda.ChildOperations.FirstOrDefault().ChildOperations.FirstOrDefault() is IReturnOperation returnOperation
&& returnOperation.ReturnedValue is IInvocationOperation returnedInvocation)
{
- targetInvocation = (InvocationExpressionSyntax)returnedInvocation.Syntax;
+ methodSymbol = returnedInvocation.TargetMethod;
}
- if (targetInvocation is null)
- {
- return;
- }
-
- var methodOperation = invocation.SemanticModel.GetSymbolInfo(targetInvocation);
- var methodSymbol = methodOperation.Symbol ?? methodOperation.CandidateSymbols.FirstOrDefault();
-
// If no method definition was found for the lambda, then abort.
if (methodSymbol is null)
{
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowReturningActionResultFromMapMethods.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowReturningActionResultFromMapMethods.cs
index 12e208ea18..9d3fb65a7e 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowReturningActionResultFromMapMethods.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/DisallowReturningActionResultFromMapMethods.cs
@@ -14,9 +14,10 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
in OperationAnalysisContext context,
WellKnownTypes wellKnownTypes,
IInvocationOperation invocationOperation,
- IAnonymousFunctionOperation anonymousFunction)
+ IAnonymousFunctionOperation anonymousFunction,
+ SyntaxNode nodeForError)
{
- DisallowReturningActionResultFromMapMethods(in context, wellKnownTypes, invocationOperation, anonymousFunction.Symbol, anonymousFunction.Body);
+ DisallowReturningActionResultFromMapMethods(in context, wellKnownTypes, invocationOperation, anonymousFunction.Symbol, anonymousFunction.Body, nodeForError);
}
private static void DisallowReturningActionResultFromMapMethods(
@@ -24,7 +25,8 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
WellKnownTypes wellKnownTypes,
IInvocationOperation invocationOperation,
IMethodSymbol methodSymbol,
- IBlockOperation? methodBody)
+ IBlockOperation? methodBody,
+ SyntaxNode nodeForError)
{
var returnType = UnwrapPossibleAsyncReturnType(methodSymbol.ReturnType);
@@ -41,7 +43,7 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
// if we don't have a method body, and the action is IResult or ActionResult<T> returning, produce diagnostics for the entire method.
context.ReportDiagnostic(Diagnostic.Create(
DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
- invocationOperation.Arguments[2].Syntax.GetLocation(),
+ nodeForError.GetLocation(),
invocationOperation.TargetMethod.Name));
return;
}
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/RouteHandlerAnalyzer.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/RouteHandlerAnalyzer.cs
index 350dcab2f8..67bf1c8315 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/RouteHandlerAnalyzer.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/RouteHandlers/RouteHandlerAnalyzer.cs
@@ -14,38 +14,47 @@ namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
{
- public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(new[]
- {
+ private const int DelegateParameterOrdinal = 2;
+ public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(
DiagnosticDescriptors.DoNotUseModelBindingAttributesOnRouteHandlerParameters,
DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers,
DiagnosticDescriptors.DetectMisplacedLambdaAttribute,
DiagnosticDescriptors.DetectMismatchedParameterOptionality
- });
+ );
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
- context.RegisterCompilationStartAction(static compilationStartAnalysisContext =>
+ context.RegisterCompilationStartAction(static context =>
{
- var compilation = compilationStartAnalysisContext.Compilation;
+ var compilation = context.Compilation;
if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
{
Debug.Fail("One or more types could not be found. This usually means you are bad at spelling C# type names.");
return;
}
- compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext =>
+ context.RegisterOperationAction(context =>
{
- var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
+ var invocation = (IInvocationOperation)context.Operation;
var targetMethod = invocation.TargetMethod;
if (!IsRouteHandlerInvocation(wellKnownTypes, invocation, targetMethod))
{
return;
}
- var delegateCreation = invocation.Arguments[2].Descendants().OfType<IDelegateCreationOperation>().FirstOrDefault();
+ IDelegateCreationOperation? delegateCreation = null;
+ foreach (var argument in invocation.Arguments)
+ {
+ if (argument.Parameter.Ordinal == DelegateParameterOrdinal)
+ {
+ delegateCreation = argument.Descendants().OfType<IDelegateCreationOperation>().FirstOrDefault();
+ break;
+ }
+ }
+
if (delegateCreation is null)
{
return;
@@ -53,42 +62,47 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
if (delegateCreation.Target.Kind == OperationKind.AnonymousFunction)
{
- var lambda = ((IAnonymousFunctionOperation)delegateCreation.Target);
- DisallowMvcBindArgumentsOnParameters(in operationAnalysisContext, wellKnownTypes, invocation, lambda.Symbol);
- DisallowReturningActionResultFromMapMethods(in operationAnalysisContext, wellKnownTypes, invocation, lambda);
- DetectMisplacedLambdaAttribute(operationAnalysisContext, invocation, lambda);
- DetectMismatchedParameterOptionality(in operationAnalysisContext, invocation, lambda.Symbol);
+ var lambda = (IAnonymousFunctionOperation)delegateCreation.Target;
+ DisallowMvcBindArgumentsOnParameters(in context, wellKnownTypes, invocation, lambda.Symbol);
+ DisallowReturningActionResultFromMapMethods(in context, wellKnownTypes, invocation, lambda, delegateCreation.Syntax);
+ DetectMisplacedLambdaAttribute(context, lambda);
+ DetectMismatchedParameterOptionality(in context, invocation, lambda.Symbol);
}
else if (delegateCreation.Target.Kind == OperationKind.MethodReference)
{
var methodReference = (IMethodReferenceOperation)delegateCreation.Target;
- DisallowMvcBindArgumentsOnParameters(in operationAnalysisContext, wellKnownTypes, invocation, methodReference.Method);
- DetectMismatchedParameterOptionality(in operationAnalysisContext, invocation, methodReference.Method);
+ DisallowMvcBindArgumentsOnParameters(in context, wellKnownTypes, invocation, methodReference.Method);
+ DetectMismatchedParameterOptionality(in context, invocation, methodReference.Method);
var foundMethodReferenceBody = false;
if (!methodReference.Method.DeclaringSyntaxReferences.IsEmpty)
{
- var syntaxReference = methodReference.Method.DeclaringSyntaxReferences[0];
- var methodOperation = invocation.SemanticModel.GetOperation(syntaxReference.GetSyntax(operationAnalysisContext.CancellationToken));
+ var syntaxReference = methodReference.Method.DeclaringSyntaxReferences.Single();
+ var syntaxNode = syntaxReference.GetSyntax(context.CancellationToken);
+ var methodOperation = syntaxNode.SyntaxTree == invocation.SemanticModel.SyntaxTree
+ ? invocation.SemanticModel.GetOperation(syntaxNode, context.CancellationToken)
+ : null;
if (methodOperation is ILocalFunctionOperation { Body: not null } localFunction)
{
foundMethodReferenceBody = true;
DisallowReturningActionResultFromMapMethods(
- in operationAnalysisContext,
+ in context,
wellKnownTypes,
invocation,
methodReference.Method,
- localFunction.Body);
+ localFunction.Body,
+ delegateCreation.Syntax);
}
else if (methodOperation is IMethodBodyOperation methodBody)
{
foundMethodReferenceBody = true;
DisallowReturningActionResultFromMapMethods(
- in operationAnalysisContext,
+ in context,
wellKnownTypes,
invocation,
methodReference.Method,
- methodBody.BlockBody ?? methodBody.ExpressionBody);
+ methodBody.BlockBody ?? methodBody.ExpressionBody,
+ delegateCreation.Syntax);
}
}
@@ -97,11 +111,12 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
// it's possible we couldn't find the operation for the method reference. In this case,
// try and provide less detailed diagnostics to the extent we can
DisallowReturningActionResultFromMapMethods(
- in operationAnalysisContext,
+ in context,
wellKnownTypes,
invocation,
methodReference.Method,
- methodBody: null);
+ methodBody: null,
+ delegateCreation.Syntax);
}
}
@@ -118,6 +133,6 @@ public partial class RouteHandlerAnalyzer : DiagnosticAnalyzer
SymbolEqualityComparer.Default.Equals(wellKnownTypes.EndpointRouteBuilderExtensions, targetMethod.ContainingType) &&
invocation.Arguments.Length == 3 &&
targetMethod.Parameters.Length == 3 &&
- SymbolEqualityComparer.Default.Equals(wellKnownTypes.Delegate, targetMethod.Parameters[2].Type);
+ SymbolEqualityComparer.Default.Equals(wellKnownTypes.Delegate, targetMethod.Parameters[DelegateParameterOrdinal].Type);
}
}
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs
index 01cfdc829a..fd6d71d62b 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WebApplicationBuilderAnalyzer.cs
@@ -14,23 +14,26 @@ using Microsoft.CodeAnalysis.Text;
namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
[DiagnosticAnalyzer(LanguageNames.CSharp)]
-public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
+public sealed class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
{
- public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(new[]
- {
+ public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(
DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder,
DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder,
DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder,
- });
+ DiagnosticDescriptors.DoNotUseHostConfigureLogging,
+ DiagnosticDescriptors.DoNotUseHostConfigureServices,
+ DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
+ DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints
+ );
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
- context.RegisterCompilationStartAction(compilationStartAnalysisContext =>
+ context.RegisterCompilationStartAction(context =>
{
- var compilation = compilationStartAnalysisContext.Compilation;
+ var compilation = context.Compilation;
if (!WellKnownTypes.TryCreate(compilation, out var wellKnownTypes))
{
Debug.Fail("One or more types could not be found. This usually means you are bad at spelling C# type names.");
@@ -44,23 +47,46 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
wellKnownTypes.HostingAbstractionsWebHostBuilderExtensions,
wellKnownTypes.WebHostBuilderExtensions,
};
+ INamedTypeSymbol[] configureLoggingTypes =
+ {
+ wellKnownTypes.HostingHostBuilderExtensions,
+ wellKnownTypes.WebHostBuilderExtensions
+ };
+ INamedTypeSymbol[] configureServicesTypes =
+ {
+ wellKnownTypes.HostingHostBuilderExtensions,
+ wellKnownTypes.ConfigureWebHostBuilder
+ };
+ INamedTypeSymbol[] configureAppTypes =
+ {
+ wellKnownTypes.ConfigureHostBuilder,
+ wellKnownTypes.ConfigureWebHostBuilder,
+ wellKnownTypes.WebHostBuilderExtensions,
+ wellKnownTypes.HostingHostBuilderExtensions,
+ };
+ INamedTypeSymbol[] configureHostTypes = { wellKnownTypes.ConfigureHostBuilder };
+ INamedTypeSymbol[] useEndpointTypes =
+ {
+ wellKnownTypes.EndpointRoutingApplicationBuilderExtensions,
+ wellKnownTypes.WebApplicationBuilder
+ };
- compilationStartAnalysisContext.RegisterOperationAction(operationAnalysisContext =>
+ context.RegisterOperationAction(context =>
{
- var invocation = (IInvocationOperation)operationAnalysisContext.Operation;
+ var invocation = (IInvocationOperation)context.Operation;
var targetMethod = invocation.TargetMethod;
// var builder = WebApplication.CreateBuilder();
// builder.Host.ConfigureWebHost(x => {});
if (IsDisallowedMethod(
- operationAnalysisContext,
+ context,
invocation,
targetMethod,
wellKnownTypes.ConfigureHostBuilder,
"ConfigureWebHost",
configureWebHostTypes))
{
- operationAnalysisContext.ReportDiagnostic(
+ context.ReportDiagnostic(
CreateDiagnostic(
DiagnosticDescriptors.DoNotUseConfigureWebHostWithConfigureHostBuilder,
invocation));
@@ -69,14 +95,14 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
// var builder = WebApplication.CreateBuilder();
// builder.WebHost.Configure(x => {});
if (IsDisallowedMethod(
- operationAnalysisContext,
+ context,
invocation,
targetMethod,
wellKnownTypes.ConfigureWebHostBuilder,
"Configure",
configureTypes))
{
- operationAnalysisContext.ReportDiagnostic(
+ context.ReportDiagnostic(
CreateDiagnostic(
DiagnosticDescriptors.DoNotUseConfigureWithConfigureWebHostBuilder,
invocation));
@@ -85,19 +111,149 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
// var builder = WebApplication.CreateBuilder();
// builder.WebHost.UseStartup<Startup>();
if (IsDisallowedMethod(
- operationAnalysisContext,
+ context,
invocation,
targetMethod,
wellKnownTypes.ConfigureWebHostBuilder,
"UseStartup",
userStartupTypes))
{
- operationAnalysisContext.ReportDiagnostic(
+ context.ReportDiagnostic(
CreateDiagnostic(
DiagnosticDescriptors.DoNotUseUseStartupWithConfigureWebHostBuilder,
invocation));
}
+ //var builder = WebApplication.CreateBuilder(args);
+ //builder.Host.ConfigureLogging(x => {})
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureHostBuilder,
+ "ConfigureLogging",
+ configureLoggingTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DoNotUseHostConfigureLogging,
+ invocation));
+ }
+
+ //var builder = WebApplication.CreateBuilder(args);
+ //builder.WebHost.ConfigureLogging(x => {})
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureWebHostBuilder,
+ "ConfigureLogging",
+ configureLoggingTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DoNotUseHostConfigureLogging,
+ invocation));
+ }
+
+ // var builder = WebApplication.CreateBuilder(args);
+ // builder.Host.ConfigureServices(x => {});
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureHostBuilder,
+ "ConfigureServices",
+ configureServicesTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DoNotUseHostConfigureServices,
+ invocation));
+ }
+
+ // var builder = WebApplication.CreateBuilder(args);
+ // builder.WebHost.ConfigureServices(x => {});
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureWebHostBuilder,
+ "ConfigureServices",
+ configureServicesTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DoNotUseHostConfigureServices,
+ invocation));
+ }
+
+ // var builder = WebApplication.CreateBuilder();
+ // builder.WebHost.ConfigureAppConfiguration(builder => {});
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureWebHostBuilder,
+ "ConfigureAppConfiguration",
+ configureAppTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
+ invocation));
+ }
+
+ // var builder = WebApplication.CreateBuilder();
+ // builder.Host.ConfigureAppConfiguration(builder => {});
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureHostBuilder,
+ "ConfigureAppConfiguration",
+ configureAppTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
+ invocation));
+ }
+
+ // var builder = WebApplication.CreateBuilder();
+ // builder.Host.ConfigureHostConfiguration(builder => {});
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.ConfigureHostBuilder,
+ "ConfigureHostConfiguration",
+ configureHostTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder,
+ invocation));
+ }
+
+ //var builder = WebApplication.CreateBuilder(args);
+ //var app= builder.Build();
+ //app.UseRouting();
+ //app.UseEndpoints(x => {})
+ if (IsDisallowedMethod(
+ context,
+ invocation,
+ targetMethod,
+ wellKnownTypes.WebApplicationBuilder,
+ "UseEndpoints",
+ useEndpointTypes))
+ {
+ context.ReportDiagnostic(
+ CreateDiagnostic(
+ DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints,
+ invocation));
+ }
+
static Diagnostic CreateDiagnostic(DiagnosticDescriptor descriptor, IInvocationOperation operation)
{
// Take the location for the whole invocation operation as a starting point.
@@ -147,7 +303,7 @@ public class WebApplicationBuilderAnalyzer : DiagnosticAnalyzer
location = Location.Create(operation.Syntax.SyntaxTree, targetSpan);
}
- return Diagnostic.Create(descriptor, location);
+ return Diagnostic.Create(descriptor, location, methodName);
}
}, OperationKind.Invocation);
diff --git a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs
index d4c43aa2a8..5521223349 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/Analyzers/WebApplicationBuilder/WellKnownTypes.cs
@@ -42,6 +42,24 @@ internal sealed class WellKnownTypes
return false;
}
+ const string HostingHostBuilderExtensions = "Microsoft.Extensions.Hosting.HostingHostBuilderExtensions";
+ if (compilation.GetTypeByMetadataName(HostingHostBuilderExtensions) is not { } hostingHostBuilderExtensions)
+ {
+ return false;
+ }
+
+ const string EndpointRoutingApplicationBuilderExtensions = "Microsoft.AspNetCore.Builder.EndpointRoutingApplicationBuilderExtensions";
+ if (compilation.GetTypeByMetadataName(EndpointRoutingApplicationBuilderExtensions) is not { } endpointRoutingApplicationBuilderExtensions)
+ {
+ return false;
+ }
+
+ const string WebApplicationBuilder = "Microsoft.AspNetCore.Builder.WebApplication";
+ if (compilation.GetTypeByMetadataName(WebApplicationBuilder) is not { } webApplicationBuilder)
+ {
+ return false;
+ }
+
wellKnownTypes = new WellKnownTypes
{
ConfigureHostBuilder = configureHostBuilder,
@@ -49,6 +67,9 @@ internal sealed class WellKnownTypes
GenericHostWebHostBuilderExtensions = genericHostWebHostBuilderExtensions,
HostingAbstractionsWebHostBuilderExtensions = hostingAbstractionsWebHostBuilderExtensions,
WebHostBuilderExtensions = webHostBuilderExtensions,
+ HostingHostBuilderExtensions = hostingHostBuilderExtensions,
+ EndpointRoutingApplicationBuilderExtensions = endpointRoutingApplicationBuilderExtensions,
+ WebApplicationBuilder = webApplicationBuilder
};
return true;
@@ -59,4 +80,7 @@ internal sealed class WellKnownTypes
public INamedTypeSymbol GenericHostWebHostBuilderExtensions { get; private init; }
public INamedTypeSymbol HostingAbstractionsWebHostBuilderExtensions { get; private init; }
public INamedTypeSymbol WebHostBuilderExtensions { get; private init; }
+ public INamedTypeSymbol HostingHostBuilderExtensions { get; private init; }
+ public INamedTypeSymbol EndpointRoutingApplicationBuilderExtensions { get; private init; }
+ public INamedTypeSymbol WebApplicationBuilder { get; private init; }
}
diff --git a/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs b/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs
index f4aeb9eadd..9dcfac1408 100644
--- a/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs
+++ b/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/DetectMismatchedParameterOptionalityFixer.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Immutable;
+using System.Composition;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
@@ -13,6 +14,7 @@ using Microsoft.CodeAnalysis.Editing;
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers.Fixers;
+[ExportCodeFixProvider(LanguageNames.CSharp), Shared]
public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
{
public override ImmutableArray<string> FixableDiagnosticIds { get; } = ImmutableArray.Create(DiagnosticDescriptors.DetectMismatchedParameterOptionality.Id);
@@ -35,7 +37,6 @@ public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
private static async Task<Document> FixMismatchedParameterOptionality(Diagnostic diagnostic, Document document, CancellationToken cancellationToken)
{
- DocumentEditor editor = await DocumentEditor.CreateAsync(document, cancellationToken);
var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
if (root == null)
@@ -47,9 +48,9 @@ public class DetectMismatchedParameterOptionalityFixer : CodeFixProvider
if (param is ParameterSyntax { Type: { } parameterType } parameterSyntax)
{
var newParam = parameterSyntax.WithType(SyntaxFactory.NullableType(parameterType));
- editor.ReplaceNode(parameterSyntax, newParam);
+ return document.WithSyntaxRoot(root.ReplaceNode(parameterSyntax, newParam));
}
- return editor.GetChangedDocument();
+ return document;
}
}
diff --git a/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/WebApplicationBuilderFixer.cs b/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/WebApplicationBuilderFixer.cs
new file mode 100644
index 0000000000..2f4f150ea7
--- /dev/null
+++ b/src/Framework/AspNetCoreAnalyzers/src/CodeFixes/WebApplicationBuilderFixer.cs
@@ -0,0 +1,169 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Immutable;
+using System.Threading;
+using System.Threading.Tasks;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CodeActions;
+using Microsoft.CodeAnalysis.CodeFixes;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+using Microsoft.CodeAnalysis.CSharp;
+using System.Linq;
+using System.Composition;
+
+namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.Fixers;
+
+[ExportCodeFixProvider(LanguageNames.CSharp, Name = nameof(WebApplicationBuilderFixer)), Shared]
+public sealed class WebApplicationBuilderFixer : CodeFixProvider
+{
+ public override ImmutableArray<string> FixableDiagnosticIds { get; } = ImmutableArray.Create(
+ // Add other diagnostic descriptor id's
+ DiagnosticDescriptors.DoNotUseHostConfigureLogging.Id,
+ DiagnosticDescriptors.DoNotUseHostConfigureServices.Id,
+ DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder.Id
+ );
+
+ public sealed override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer;
+
+ public sealed override Task RegisterCodeFixesAsync(CodeFixContext context)
+ {
+ foreach (var diagnostic in context.Diagnostics)
+ {
+ string id = diagnostic.Id;
+
+ string message = string.Empty;
+ string identifierMethod = string.Empty;
+
+ switch (id)
+ {
+ case string when id == DiagnosticDescriptors.DoNotUseHostConfigureLogging.Id:
+ message = "Fix references to Logging properties on WebApplicationBuilder";
+ identifierMethod = "Logging";
+ break;
+
+ case string when id == DiagnosticDescriptors.DoNotUseHostConfigureServices.Id:
+ message = "Fix references to Services properties on WebApplicationBuilder";
+ identifierMethod = "Services";
+ break;
+
+ case string when id == DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder.Id:
+ message = "Fix references to Configuration properties on WebApplicationBuilder";
+ identifierMethod = "Configuration";
+ break;
+ }
+
+ context.Document.TryGetSyntaxRoot(out var root);
+
+ if (!CanFixWebApplicationBuilder(diagnostic, SyntaxFactory.IdentifierName(identifierMethod), root, out var invocation))
+ {
+ continue;
+ }
+
+ context.RegisterCodeFix(
+ CodeAction.Create(
+ message,
+ cancellationToken => FixWebApplicationBuilder(diagnostic, context.Document, invocation, cancellationToken),
+ equivalenceKey:
+ id),
+ diagnostic);
+ }
+
+ return Task.CompletedTask;
+ }
+
+ private static async Task<Document> FixWebApplicationBuilder(Diagnostic diagnostic, Document document, InvocationExpressionSyntax invocation, CancellationToken cancellationToken)
+ {
+ var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
+
+ var diagnosticTarget = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true);
+
+ return document.WithSyntaxRoot(root.ReplaceNode(diagnosticTarget, invocation));
+ }
+
+ private static bool CanFixWebApplicationBuilder(Diagnostic diagnostic, IdentifierNameSyntax identifierMethod, SyntaxNode root, out InvocationExpressionSyntax invocationName)
+ {
+ invocationName = null;
+
+ if (root == null)
+ {
+ return false;
+ }
+
+ // builder.Host.ConfigureLogging(builder => builder.AddJsonConsole());
+ var diagnosticTarget = root.FindNode(diagnostic.Location.SourceSpan, getInnermostNodeForTie: true);
+
+ if (diagnosticTarget is InvocationExpressionSyntax invocation)
+ {
+ // No modification are made if the invocation isn't accessing a method on `builder.Host` or `builder.WebHost`.
+ if (invocation.Expression is not MemberAccessExpressionSyntax hostBasedInvocationMethodExpr
+ || hostBasedInvocationMethodExpr.Expression is not MemberAccessExpressionSyntax configureMethodOnHostAccessExpr)
+ {
+ return false;
+ }
+
+ configureMethodOnHostAccessExpr = configureMethodOnHostAccessExpr.WithName(identifierMethod);
+ var indentation = hostBasedInvocationMethodExpr.GetLeadingTrivia();
+
+ // builder.Host.ConfigureLogging => builder.Logging
+ // builder.WebHost.ConfigureServices => builder.Services
+ hostBasedInvocationMethodExpr = hostBasedInvocationMethodExpr.WithExpression(configureMethodOnHostAccessExpr)
+ .NormalizeWhitespace().WithLeadingTrivia(indentation);
+
+ if (invocation.ArgumentList.Arguments.SingleOrDefault() is not { } initArgument
+ || initArgument.Expression is not LambdaExpressionSyntax lambdaExpr)
+ {
+ return false;
+ }
+
+ if (lambdaExpr.Block != null)
+ {
+ var lambdaStatements = lambdaExpr.Block.Statements;
+ foreach (var statement in lambdaStatements)
+ {
+ if (statement is not ExpressionStatementSyntax currentStatement
+ || currentStatement.Expression is not InvocationExpressionSyntax expr)
+ {
+ return false;
+ }
+
+ // arguments of builder.{method_name}({arguments})
+ var argument = expr.ArgumentList;
+
+ if (expr.Expression is not MemberAccessExpressionSyntax bodyExpression) //builder.{method_name}
+ {
+ return false;
+ }
+
+ var method = bodyExpression.Name; // method_name
+
+ hostBasedInvocationMethodExpr = hostBasedInvocationMethodExpr.WithName(method);
+ invocation = invocation.Update(hostBasedInvocationMethodExpr, argument);
+ hostBasedInvocationMethodExpr = hostBasedInvocationMethodExpr.WithExpression(invocation);
+ }
+ }
+ else
+ {
+ if (lambdaExpr.ExpressionBody is not InvocationExpressionSyntax body)
+ {
+ return false;
+ }
+
+ var arguments = body.ArgumentList;
+
+ if (body.Expression is not MemberAccessExpressionSyntax bodyExpression)
+ {
+ return false;
+ }
+
+ var method = bodyExpression.Name;
+
+ hostBasedInvocationMethodExpr = hostBasedInvocationMethodExpr.WithName(method);
+ invocation = invocation.WithExpression(hostBasedInvocationMethodExpr).WithArgumentList(arguments);
+ }
+ invocationName = invocation;
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowReturningActionResultsFromMapMethodsTest.cs b/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowReturningActionResultsFromMapMethodsTest.cs
index 82571b70a1..3425f69086 100644
--- a/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowReturningActionResultsFromMapMethodsTest.cs
+++ b/src/Framework/AspNetCoreAnalyzers/test/RouteHandlers/DisallowReturningActionResultsFromMapMethodsTest.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Globalization;
using Microsoft.AspNetCore.Analyzer.Testing;
namespace Microsoft.AspNetCore.Analyzers.RouteHandlers;
@@ -128,7 +129,7 @@ webApp.MapGet(""/"", () => /*MM*/new OkObjectResult(""cool story""));
var diagnostic = Assert.Single(diagnostics);
Assert.Same(DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers, diagnostic.Descriptor);
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
- Assert.Equal("IActionResult instances should not be returned from a MapGet Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage());
+ Assert.Equal("IActionResult instances should not be returned from a MapGet Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage(CultureInfo.InvariantCulture));
}
[Fact]
@@ -151,7 +152,7 @@ webApp.MapGet(""/"", (int id) => /*MM*/id == 0 ? (ActionResult)new NotFoundResul
var diagnostic = Assert.Single(diagnostics);
Assert.Same(DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers, diagnostic.Descriptor);
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
- Assert.Equal("IActionResult instances should not be returned from a MapGet Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage());
+ Assert.Equal("IActionResult instances should not be returned from a MapGet Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage(CultureInfo.InvariantCulture));
}
[Fact]
@@ -179,7 +180,7 @@ static object OkObjectResultReturningMethod()
var diagnostic = Assert.Single(diagnostics);
Assert.Same(DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers, diagnostic.Descriptor);
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
- Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage());
+ Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage(CultureInfo.InvariantCulture));
}
[Fact]
@@ -211,7 +212,7 @@ public record Person(string Name);
var diagnostic = Assert.Single(diagnostics);
Assert.Same(DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers, diagnostic.Descriptor);
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
- Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage());
+ Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage(CultureInfo.InvariantCulture));
}
[Fact]
@@ -249,7 +250,45 @@ public class MyController
var diagnostic = Assert.Single(diagnostics);
Assert.Same(DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers, diagnostic.Descriptor);
AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
- Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage());
+ Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task MinimalAction_ReturningActionResultOfTDeclarationInDifferentFile_ProducesDiagnostics()
+ {
+ // Arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+
+var webApp = WebApplication.Create();
+webApp.MapPost(""/"", /*MM*/MyController.ActionResultMethod);
+");
+ var controllerSource = @"
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc;
+
+public static class MyController
+{
+ public static async Task<ActionResult<Person>> ActionResultMethod(int id)
+ {
+ await Task.Yield();
+ if (id == 0) return new NotFoundResult();
+ return new Person(""test"");
+ }
+
+ public record Person(string Name);
+}
+";
+
+ // Act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source, controllerSource);
+
+ // Assert
+ var diagnostic = Assert.Single(diagnostics);
+ Assert.Same(DiagnosticDescriptors.DoNotReturnActionResultsFromRouteHandlers, diagnostic.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
+ Assert.Equal("IActionResult instances should not be returned from a MapPost Delegate parameter. Consider returning an equivalent result from Microsoft.AspNetCore.Http.Results.", diagnostic.GetMessage(CultureInfo.InvariantCulture));
}
}
diff --git a/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs b/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs
index dd81e98068..00f98f0d75 100644
--- a/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs
+++ b/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpRouteHandlerCodeFixVerifier.cs
@@ -64,8 +64,8 @@ public static class CSharpRouteHandlerCodeFixVerifier<TAnalyzer, TCodeFix>
{
// We populate the ReferenceAssemblies used in the tests with the locally-built AspNetCore
// assemblies that are referenced in a minimal app to ensure that there are no reference
- // errors during the build.
- ReferenceAssemblies = ReferenceAssemblies.Net.Net60.AddAssemblies(ImmutableArray.Create(
+ // errors during the build. The value used here should be updated on each TFM change.
+ ReferenceAssemblies = ReferenceAssemblies.Net.Net70.AddAssemblies(ImmutableArray.Create(
TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Builder.WebApplication).Assembly.Location),
TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions).Assembly.Location),
TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Builder.IApplicationBuilder).Assembly.Location),
diff --git a/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpWebApplicationBuilderCodeFixVerifier.cs b/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpWebApplicationBuilderCodeFixVerifier.cs
new file mode 100644
index 0000000000..aa8841c83b
--- /dev/null
+++ b/src/Framework/AspNetCoreAnalyzers/test/Verifiers/CSharpWebApplicationBuilderCodeFixVerifier.cs
@@ -0,0 +1,86 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Immutable;
+using Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
+using Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.Fixers;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp.Testing;
+using Microsoft.CodeAnalysis.Testing;
+using Microsoft.CodeAnalysis.Testing.Verifiers;
+
+namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
+
+public static class CSharpWebApplicationBuilderCodeFixVerifier
+{
+ public static DiagnosticResult Diagnostic(string diagnosticId = null)
+ => CSharpCodeFixVerifier<WebApplicationBuilderAnalyzer, WebApplicationBuilderFixer, XUnitVerifier>.Diagnostic(diagnosticId);
+
+ public static DiagnosticResult Diagnostic(DiagnosticDescriptor descriptor)
+ => new DiagnosticResult(descriptor);
+
+ public static Task VerifyAnalyzerAsync(string source, params DiagnosticResult[] expected)
+ {
+ return VerifyCodeFixAsync(source, expected, source);
+ }
+
+ public static Task VerifyCodeFixAsync(string source, string fixedSource)
+ => VerifyCodeFixAsync(source, DiagnosticResult.EmptyDiagnosticResults, fixedSource);
+
+ public static Task VerifyCodeFixAsync(string source, DiagnosticResult expected, string fixedSource)
+ => VerifyCodeFixAsync(source, new[] { expected }, fixedSource);
+
+ public static Task VerifyCodeFixAsync(string source, DiagnosticResult[] expected, string fixedSource)
+ => VerifyCodeFixAsync(source, expected, fixedSource, string.Empty);
+
+ public static Task VerifyCodeFixAsync(string sources, DiagnosticResult[] expected, string fixedSources, string usageSource = "")
+ {
+ var test = new WebApplicationBuilderAnalyzerTest
+ {
+ TestState =
+ {
+ Sources = { sources, usageSource },
+ // We need to set the output type to an exe to properly
+ // support top-level programs in the tests. Otherwise,
+ // the test infra will assume we are trying to build a library.
+ OutputKind = OutputKind.ConsoleApplication
+ },
+ FixedState =
+ {
+ Sources = { fixedSources, usageSource }
+ }
+ };
+
+ test.TestState.ExpectedDiagnostics.AddRange(expected);
+ return test.RunAsync();
+ }
+
+ public class WebApplicationBuilderAnalyzerTest : CSharpCodeFixTest<WebApplicationBuilderAnalyzer, WebApplicationBuilderFixer, XUnitVerifier>
+ {
+ public WebApplicationBuilderAnalyzerTest()
+ {
+ // We populate the ReferenceAssemblies used in the tests with the locally-built AspNetCore
+ // assemblies that are referenced in a minimal app to ensure that there are no reference
+ // errors during the build. The value used here should be updated on each TFM change.
+ ReferenceAssemblies = ReferenceAssemblies.Net.Net70.AddAssemblies(ImmutableArray.Create(
+ TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Hosting.WebHostBuilderExtensions).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Hosting.IHostBuilder).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Hosting.HostingHostBuilderExtensions).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Builder.ConfigureHostBuilder).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Builder.ConfigureWebHostBuilder).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.AspNetCore.Hosting.HostingAbstractionsWebHostBuilderExtensions).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Logging.ILoggingBuilder).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Logging.ConsoleLoggerExtensions).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.DependencyInjection.IServiceCollection).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.DependencyInjection.AntiforgeryServiceCollectionExtensions).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.FileProviders.IFileProvider).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Configuration.ConfigurationManager).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Configuration.JsonConfigurationExtensions).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Configuration.IConfigurationBuilder).Assembly.Location),
+ TrimAssemblyExtension(typeof(Microsoft.Extensions.Configuration.EnvironmentVariablesExtensions).Assembly.Location)));
+
+ string TrimAssemblyExtension(string fullPath) => fullPath.Replace(".dll", string.Empty);
+ }
+ }
+
+}
diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs
new file mode 100644
index 0000000000..dd3329778d
--- /dev/null
+++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureAppConfigureHostBuilderTest.cs
@@ -0,0 +1,233 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using Microsoft.AspNetCore.Analyzer.Testing;
+using Microsoft.CodeAnalysis.Testing;
+using VerifyCS = Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.CSharpWebApplicationBuilderCodeFixVerifier;
+
+namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
+public partial class DisallowConfigureAppConfigureHostBuilderTest
+{
+ [Fact]
+ public async Task ConfigurationBuilderRunsWithoutDiagnostic()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+";
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, source);
+ }
+
+ [Fact]
+ public async Task ConfigureAppHostBuilderProducesDiagnostic()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureAppConfiguration(builder => builder.AddJsonFile(""foo.json"", optional: true))|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+";
+
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task ConfigureHostHostBuilderProducesDiagnostic()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureHostConfiguration(builder => builder.AddJsonFile(""foo.json"", optional: true))|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+";
+
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureHostConfiguration").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task ConfigureAppWebHostBuilderProducesDiagnostic()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.{|#0:ConfigureAppConfiguration(builder => builder.AddJsonFile(""foo.json"", optional: true))|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+";
+
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task ConfigureAppWebHostBuilderProducesDiagnosticInMain()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+public static class Test
+{
+ public static void Main(string[]args) {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.WebHost.{|#0:ConfigureAppConfiguration(builder => builder.AddJsonFile(""foo.json"", optional: true))|};
+ }
+}
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+public static class Test
+{
+ public static void Main(string[]args) {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+ }
+}
+";
+
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task TwoInvocationsProduceTwoDiagnostic()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureHostConfiguration(builder => builder.AddJsonFile(""foo.json"", optional: true))|};
+builder.WebHost.{|#1:ConfigureAppConfiguration(builder => builder.AddJsonFile(""foo.json"", optional: true))|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true);
+";
+
+ var expectedDiagnostic = new[] {
+ new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureHostConfiguration").WithLocation(0),
+ new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(1)
+ };
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task TwoMethodsInArgumentsProducesTwoProperties()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureAppConfiguration((context, builder) => { builder.AddJsonFile(""foo.json"", optional: true); builder.AddEnvironmentVariables();})|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+builder.Configuration.AddJsonFile(""foo.json"", optional: true).AddEnvironmentVariables();
+";
+
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenConfigureAppConfigurationIsCalledWhenChainedWithCreateBuilder()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+WebApplication.CreateBuilder(args).Host.{|#0:ConfigureAppConfiguration((context, builder) => builder.AddJsonFile(""foo.json"", optional: true))|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+WebApplication.CreateBuilder(args).Configuration.AddJsonFile(""foo.json"", optional: true);
+";
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(0);
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenConfigureAppConfigurationIsCalledAsAnArgument()
+ {
+ //arrange
+ var source = @"
+using System;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+Console.WriteLine(builder.Host.{|#0:ConfigureAppConfiguration((context, builder) => builder.AddJsonFile(""foo.json"", optional: true))|});
+";
+ var fixedSource = @"
+using System;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.Extensions.Configuration;
+var builder = WebApplication.CreateBuilder(args);
+Console.WriteLine(builder.Configuration.AddJsonFile(""foo.json"", optional: true));
+";
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DisallowConfigureAppConfigureHostBuilder).WithArguments("ConfigureAppConfiguration").WithLocation(0);
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+}
diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostBuilderConfigureWebHostTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostBuilderConfigureWebHostTest.cs
index 569960684c..12c60328d6 100644
--- a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostBuilderConfigureWebHostTest.cs
+++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostBuilderConfigureWebHostTest.cs
@@ -18,7 +18,7 @@ public partial class DisallowConfigureHostBuilderConfigureWebHostTest
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder();
-builder.Host.ConfigureServices(services => { });
+builder.Host.ConfigureHostOptions(hostBuilder => { });
";
// Act
var diagnostics = await Runner.GetDiagnosticsAsync(source);
@@ -99,7 +99,7 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
var builder = WebApplication.CreateBuilder();
builder.Host
- .ConfigureServices(services => { }) // Because ConfigureServices() returns IHostBuilder, the type gets erased
+ .ConfigureHostOptions(hostBuilder => { }) // Because ConfigureHostOptions() returns IHostBuilder, the type gets erased
.ConfigureWebHost(webHostBuilder => { });
");
// Act
diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostLoggingTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostLoggingTest.cs
new file mode 100644
index 0000000000..04c59d4067
--- /dev/null
+++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureHostLoggingTest.cs
@@ -0,0 +1,354 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+using System.Globalization;
+using Microsoft.AspNetCore.Analyzer.Testing;
+using Microsoft.CodeAnalysis.Testing;
+using VerifyCS = Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.CSharpWebApplicationBuilderCodeFixVerifier;
+
+namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
+public partial class DisallowConfigureHostLoggingTest
+{
+ private TestDiagnosticAnalyzerRunner Runner { get; } = new(new WebApplicationBuilderAnalyzer());
+
+ [Fact]
+ public async Task DoesNotWarnWhenBuilderLoggingIsUsed()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Logging.AddJsonConsole();
+";
+ //Assert
+ await VerifyCS.VerifyCodeFixAsync(source, source);
+ }
+
+ [Fact]
+ public async Task DoesNotWarnWhenBuilderLoggingIsUsed_InMain()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Logging.AddJsonConsole();
+ }
+}
+public class Startup { }
+";
+
+ //assert
+ await VerifyCS.VerifyCodeFixAsync(source, source);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_Host()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Logging.AddJsonConsole();
+";
+
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_WebHost()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Logging.AddJsonConsole();
+";
+
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_OnDifferentLine_Host()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.
+ {|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Logging.AddJsonConsole();
+";
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_OnDifferentLine_WebHost()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.
+ {|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Logging.AddJsonConsole();
+";
+
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_InMain_Host()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Host.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+ }
+}
+public class Startup { }
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Logging.AddJsonConsole();
+ }
+}
+public class Startup { }
+";
+
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_InMain_WebHost()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.WebHost.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+ }
+}
+public class Startup { }
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Logging.AddJsonConsole();
+ }
+}
+public class Startup { }
+";
+
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderLoggingIsNotUsed_WhenChained_WebHost()
+ {
+ //arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.AspNetCore.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.
+ /*MM*/ConfigureLogging(logging => { })
+ .ConfigureServices(services => { });
+");
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+ //assert
+ var diagnostic = Assert.Single(diagnostics);
+ Assert.Same(DiagnosticDescriptors.DoNotUseHostConfigureLogging, diagnostic.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
+ Assert.Equal("Suggest using builder.Logging instead of ConfigureLogging", diagnostic.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task WarnsTwiceWhenBuilderLoggingIsNotUsed_Host()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+builder.Host.{|#1:ConfigureLogging(logging => logging.AddJsonConsole())|};
+";
+
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+builder.Logging.AddJsonConsole();
+builder.Logging.AddJsonConsole();
+";
+ var expectedDiagnostic = new[]
+ {
+ new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0),
+ new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(1)
+ };
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenConfigureLoggingIsCalledWhenChainedWithCreateBuilder()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+WebApplication.CreateBuilder(args).Host.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|};
+";
+ var fixedSource = @"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+WebApplication.CreateBuilder(args).Logging.AddJsonConsole();
+";
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenConfigureLoggingIsCalledAsAnArgument()
+ {
+ //arrange
+ var source = @"
+using System;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+Console.WriteLine(builder.Host.{|#0:ConfigureLogging(logging => logging.AddJsonConsole())|});
+";
+ var fixedSource = @"
+using System;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+var builder = WebApplication.CreateBuilder(args);
+Console.WriteLine(builder.Logging.AddJsonConsole());
+";
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureLogging).WithArguments("ConfigureLogging").WithLocation(0);
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+}
+
diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureServicesTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureServicesTest.cs
new file mode 100644
index 0000000000..5350f1a657
--- /dev/null
+++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/DisallowConfigureServicesTest.cs
@@ -0,0 +1,321 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Analyzer.Testing;
+using Microsoft.CodeAnalysis.Testing;
+using VerifyCS = Microsoft.AspNetCore.Analyzers.WebApplicationBuilder.CSharpWebApplicationBuilderCodeFixVerifier;
+
+namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
+public partial class DisallowConfigureServicesTest
+{
+ private TestDiagnosticAnalyzerRunner Runner { get; } = new(new WebApplicationBuilderAnalyzer());
+
+ [Fact]
+ public async Task DoesNotWarnWhenBuilderConfigureServicesIsNotUsed()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddAntiforgery();
+";
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, source);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderHostConfigureServicesIsUsed()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureServices(services => services.AddAntiforgery())|};
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddAntiforgery();
+";
+
+ // Act
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderWebHostConfigureServicesIsUsed()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.{|#0:ConfigureServices(services => services.AddAntiforgery())|};
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddAntiforgery();
+";
+
+ // Act
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderHostConfigureServicesIsUsed_OnDifferentLine()
+ {
+ //Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.
+ {|#0:ConfigureServices(services => services.AddAntiforgery())|};
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddAntiforgery();
+";
+
+ // Act
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderWebHostConfigureServicesIsUsed_OnDifferentLine()
+ {
+ //Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.
+ {|#0:ConfigureServices(services => services.AddAntiforgery())|};
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddAntiforgery();
+";
+
+ // Act
+ var expectedDiagnosis = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnosis, fixedSource);
+ }
+
+ [Fact]
+ public async Task DoesNotWarnWhenBuilderConfigureServicesIsNotUsed_InProgramMain()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+public static class Program
+{
+ public static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Services.AddAntiforgery();
+ }
+}
+public class Startup { }
+";
+
+ // Act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, source);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderHostConfigureServicesIsUsedOnProperty_In_Program_Main()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+public static class Program
+{
+ public static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Host.{|#0:ConfigureServices(services => services.AddAntiforgery())|};
+ }
+}
+public class Startup { }
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+public static class Program
+{
+ public static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Services.AddAntiforgery();
+ }
+}
+public class Startup { }
+";
+
+ // Act
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderWebHostConfigureServicesIsUsedOnProperty_In_Program_Main()
+ {
+ // Arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+public static class Program
+{
+ public static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.WebHost.{|#0:ConfigureServices(services => services.AddAntiforgery())|};
+ }
+}
+public class Startup { }
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+public static class Program
+{
+ public static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Services.AddAntiforgery();
+ }
+}
+public class Startup { }
+";
+
+ // Act
+ var expectedDiagnostic = new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0);
+
+ // Assert
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+ [Fact]
+ public async Task WarnsWhenBuilderHostConfigureServicesIsUsed_Inside_Another_Method()
+ {
+ // Arrange
+ var source = TestSource.Read(@"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+public static class Program
+{
+ public static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ ConfigureHost(builder.Host);
+ }
+
+ private static void ConfigureHost(ConfigureHostBuilder hostBuilder)
+ {
+ hostBuilder
+ ./*MM*/ConfigureServices(services =>
+ {
+ services.AddAntiforgery();
+ });
+ }
+}
+public class Startup { }
+");
+
+ // Act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+
+ // Assert
+ var diagnostic = Assert.Single(diagnostics);
+ Assert.Same(DiagnosticDescriptors.DoNotUseHostConfigureServices, diagnostic.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
+ Assert.Equal("Suggest using builder.Services instead of ConfigureServices", diagnostic.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task WarnsTwiceWhenBuilderLoggingIsNotUsed_Host()
+ {
+ //arrange
+ var source = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Host.{|#0:ConfigureServices(services => services.AddAntiforgery())|};
+builder.Host.{|#1:ConfigureServices(services => services.AddAntiforgery())|};
+";
+
+ var fixedSource = @"
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.Hosting;
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddAntiforgery();
+builder.Services.AddAntiforgery();
+";
+ var expectedDiagnostic = new[]
+{
+ new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(0),
+ new DiagnosticResult(DiagnosticDescriptors.DoNotUseHostConfigureServices).WithArguments("ConfigureServices").WithLocation(1)
+ };
+
+ await VerifyCS.VerifyCodeFixAsync(source, expectedDiagnostic, fixedSource);
+ }
+
+}
diff --git a/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/UseTopLevelRouteRegistrationInsteadOfUseEndpointsTest.cs b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/UseTopLevelRouteRegistrationInsteadOfUseEndpointsTest.cs
new file mode 100644
index 0000000000..791cfc9b37
--- /dev/null
+++ b/src/Framework/AspNetCoreAnalyzers/test/WebApplicationBuilder/UseTopLevelRouteRegistrationInsteadOfUseEndpointsTest.cs
@@ -0,0 +1,229 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Analyzer.Testing;
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp.Syntax;
+
+namespace Microsoft.AspNetCore.Analyzers.WebApplicationBuilder;
+public partial class UseTopLevelRouteRegistrationsInsteadOfUseEndpointsTest
+{
+ private TestDiagnosticAnalyzerRunner Runner { get; } = new(new WebApplicationBuilderAnalyzer());
+
+ [Fact]
+ public async Task DoesNotWarnWhenEndpointRegistrationIsTopLevel()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+app.UseRouting();
+app.MapGet(""/"", () => ""Hello World!"");
+";
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source);
+
+ //assert
+ Assert.Empty(diagnostics);
+ }
+
+ [Fact]
+ public async Task DoesNotWarnWhenEnpointRegistrationIsTopLevel_InMain()
+ {
+ //arrange
+ var source = @"
+using Microsoft.AspNetCore.Builder;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ var app = builder.Build();
+ app.UseRouting();
+ app.MapGet(""/"", () => ""Hello World!"");
+ }
+}
+";
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source);
+
+ //assert
+ Assert.Empty(diagnostics);
+ }
+
+ [Fact]
+ public async Task WarnsWhenEndpointRegistrationIsNotTopLevel()
+ {
+ //arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+app.UseRouting();
+app./*MM*/UseEndpoints(endpoints =>
+{
+ endpoints.MapGet(""/"", () => ""Hello World!"");
+});
+");
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+
+ //assert
+ var diagnostic = Assert.Single(diagnostics);
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task WarnsWhenEndpointRegistrationIsNotTopLevel_OtherMapMethods()
+ {
+ //arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+app.UseRouting();
+app./*MM1*/UseEndpoints(endpoints =>
+{
+ endpoints.MapGet(""/"", () => ""This is a GET"");
+});
+app./*MM2*/UseEndpoints(endpoints =>
+{
+ endpoints.MapPost(""/"", () => ""This is a POST"");
+});
+app./*MM3*/UseEndpoints(endpoints =>
+{
+ endpoints.MapPut(""/"", () => ""This is a PUT"");
+});
+app./*MM4*/UseEndpoints(endpoints =>
+{
+ endpoints.MapDelete(""/"", () => ""This is a DELETE"");
+});
+");
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+
+ //assert
+ Assert.Equal(4, diagnostics.Length);
+ var diagnostic1 = diagnostics[0];
+ var diagnostic2 = diagnostics[1];
+ var diagnostic3 = diagnostics[2];
+ var diagnostic4 = diagnostics[3];
+
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic1.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM1"], diagnostic1.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic1.GetMessage(CultureInfo.InvariantCulture));
+
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic2.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM2"], diagnostic2.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic2.GetMessage(CultureInfo.InvariantCulture));
+
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic3.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM3"], diagnostic3.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic3.GetMessage(CultureInfo.InvariantCulture));
+
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic2.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM4"], diagnostic4.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic2.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task WarnsWhenEndpointRegistrationIsNotTopLevel_InMain_MapControllers()
+ {
+ //arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+using Microsoft.Extensions.DependencyInjection;
+public static class Program
+{
+ public static void Main (string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+ builder.Services.AddControllers();
+ var app = builder.Build();
+ app.UseRouting();
+ app./*MM*/UseEndpoints(endpoints =>
+ {
+ endpoints.MapControllers();
+ });
+ }
+}
+");
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+
+ //assert
+ var diagnostic = Assert.Single(diagnostics);
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task WarnsWhenEndpointRegistrationIsNotTopLevel_OnDifferentLine_WithRouteParameters()
+ {
+ //arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+app.UseRouting();
+app.
+ /*MM*/UseEndpoints(endpoints =>
+{
+ endpoints.MapGet(""/users/{userId}/books/{bookId}"",
+ (int userId, int bookId) => $""The user id is {userId} and book id is {bookId}"");
+});
+");
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+
+ //assert
+ var diagnostic = Assert.Single(diagnostics);
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.DefaultMarkerLocation, diagnostic.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic.GetMessage(CultureInfo.InvariantCulture));
+ }
+
+ [Fact]
+ public async Task WarnsTwiceWhenEndpointRegistrationIsNotTopLevel_OnDifferentLine()
+ {
+ //arrange
+ var source = TestSource.Read(@"
+using Microsoft.AspNetCore.Builder;
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+app.UseRouting();
+app./*MM1*/UseEndpoints(endpoints =>
+{
+ endpoints.MapGet(""/"", () => ""Hello World!"");
+});
+app./*MM2*/UseEndpoints(endpoints =>
+{
+ endpoints.MapGet(""/"", () => ""Hello World!"");
+});
+");
+ //act
+ var diagnostics = await Runner.GetDiagnosticsAsync(source.Source);
+ //assert
+ Assert.Equal(2, diagnostics.Length);
+ var diagnostic1 = diagnostics[0];
+ var diagnostic2 = diagnostics[1];
+
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic1.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM1"], diagnostic1.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic1.GetMessage(CultureInfo.InvariantCulture));
+
+ Assert.Same(DiagnosticDescriptors.UseTopLevelRouteRegistrationsInsteadOfUseEndpoints, diagnostic2.Descriptor);
+ AnalyzerAssert.DiagnosticLocation(source.MarkerLocations["MM2"], diagnostic2.Location);
+ Assert.Equal("Suggest using top level route registrations instead of UseEndpoints", diagnostic2.GetMessage(CultureInfo.InvariantCulture));
+ }
+}
diff --git a/src/Framework/Framework.slnf b/src/Framework/Framework.slnf
index e242406826..d3f3abdc9f 100644
--- a/src/Framework/Framework.slnf
+++ b/src/Framework/Framework.slnf
@@ -56,6 +56,7 @@
"src\\Middleware\\HttpsPolicy\\src\\Microsoft.AspNetCore.HttpsPolicy.csproj",
"src\\Middleware\\Localization.Routing\\src\\Microsoft.AspNetCore.Localization.Routing.csproj",
"src\\Middleware\\Localization\\src\\Microsoft.AspNetCore.Localization.csproj",
+ "src\\Middleware\\OutputCaching\\src\\Microsoft.AspNetCore.OutputCaching.csproj",
"src\\Middleware\\ResponseCaching.Abstractions\\src\\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj",
"src\\Middleware\\ResponseCaching\\src\\Microsoft.AspNetCore.ResponseCaching.csproj",
"src\\Middleware\\ResponseCompression\\src\\Microsoft.AspNetCore.ResponseCompression.csproj",
diff --git a/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj b/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj
index c5525130a9..c3ddd536e9 100644
--- a/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj
+++ b/src/Framework/test/Microsoft.AspNetCore.App.UnitTests.csproj
@@ -3,8 +3,11 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<RootNamespace>Microsoft.AspNetCore</RootNamespace>
<VerifyAncmBinary Condition="'$(TargetOsName)' == 'win' AND '$(TargetArchitecture)' != 'arm'">true</VerifyAncmBinary>
+ <!-- Only verify assembly versions in non-dev builds. Dev builds always produce assembly version `42.42.42.42` -->
+ <VerifyPackageAssemblyVersions Condition="'$(OfficialBuild)' == 'true' or '$(DotNetUseShippingVersions)' == 'true'">true</VerifyPackageAssemblyVersions>
<TestDependsOnAspNetAppPackages>true</TestDependsOnAspNetAppPackages>
<SkipHelixArm>true</SkipHelixArm>
+ <PackagesLayoutRoot>$([MSBuild]::NormalizeDirectory('$(ArtifactsObjDir)', 'Packages.Layout', '$(Configuration)'))</PackagesLayoutRoot>
</PropertyGroup>
<ItemGroup>
@@ -51,10 +54,18 @@
<_Parameter2>@(_ExpectedSharedFrameworkBinaries)</_Parameter2>
</AssemblyAttribute>
<AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
+ <_Parameter1>PackageLayoutRoot</_Parameter1>
+ <_Parameter2>$(PackagesLayoutRoot)</_Parameter2>
+ </AssemblyAttribute>
+ <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
<_Parameter1>VerifyAncmBinary</_Parameter1>
<_Parameter2>$(VerifyAncmBinary)</_Parameter2>
</AssemblyAttribute>
<AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
+ <_Parameter1>VerifyPackageAssemblyVersions</_Parameter1>
+ <_Parameter2>$(VerifyPackageAssemblyVersions)</_Parameter2>
+ </AssemblyAttribute>
+ <AssemblyAttribute Include="Microsoft.AspNetCore.TestData">
<_Parameter1>PackagesFolder</_Parameter1>
<_Parameter2>$(ArtifactsShippingPackagesDir)</_Parameter2>
</AssemblyAttribute>
diff --git a/src/Framework/test/PackageTests.cs b/src/Framework/test/PackageTests.cs
new file mode 100644
index 0000000000..fb8a67e47b
--- /dev/null
+++ b/src/Framework/test/PackageTests.cs
@@ -0,0 +1,145 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO.Compression;
+using System.Linq;
+using System.Reflection.Metadata;
+using System.Reflection.PortableExecutable;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore;
+
+public class PackageTests
+{
+ private readonly string _packageLayoutRoot;
+ private readonly ITestOutputHelper _output;
+
+ public PackageTests(ITestOutputHelper output)
+ {
+ // In official builds, only run this test on Helix. The test will work locally so long as you're building w/
+ // shipping versions (i.e., include `/p:DotNetUseShippingVersions=true` on a full build command), and you do not
+ // have binaries built locally from another major version.
+ if (!TestData.VerifyPackageAssemblyVersions() && !SkipOnCIAttribute.OnCI())
+ {
+ return;
+ }
+
+ _output = output;
+ _packageLayoutRoot = SkipOnHelixAttribute.OnHelix() ?
+ Path.Combine(
+ Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT"),
+ "Packages.Layout") :
+ TestData.GetPackageLayoutRoot();
+ var packageRoot = SkipOnHelixAttribute.OnHelix() ?
+ Environment.GetEnvironmentVariable("HELIX_WORKITEM_ROOT") :
+ TestData.GetPackagesFolder();
+ var packages = Directory
+ .GetFiles(packageRoot, "*.nupkg", SearchOption.AllDirectories)
+ .Where(file => !file.EndsWith(".symbols.nupkg", StringComparison.OrdinalIgnoreCase));
+
+ if (Directory.Exists(_packageLayoutRoot))
+ {
+ Directory.Delete(_packageLayoutRoot, true);
+ }
+
+ foreach (var package in packages)
+ {
+ var outputPath = Path.Combine(_packageLayoutRoot, Path.GetFileNameWithoutExtension(package));
+ ZipFile.ExtractToDirectory(package, outputPath);
+ }
+ }
+
+ [Fact]
+ public void PackageAssembliesHaveExpectedAssemblyVersions()
+ {
+ // In official builds, only run this test on Helix. The test will work locally so long as we're building w/ shipping versions.
+ if (!TestData.VerifyPackageAssemblyVersions() && !SkipOnCIAttribute.OnCI())
+ {
+ return;
+ }
+
+ var versionStringWithoutPrereleaseTag = TestData.GetSharedFxVersion().Split('-', 2)[0];
+ var expectedVersion = Version.Parse(versionStringWithoutPrereleaseTag);
+
+ string[] helixTestRunnerToolPackages = { "dotnet-serve", "dotnet-ef", "dotnet-dump" };
+ string[] toolAssembliesToSkip = { "System.", "Microsoft.", "Azure.", "Newtonsoft.", "aspnetcorev2" };
+
+ foreach (var packageDir in Directory.GetDirectories(_packageLayoutRoot))
+ {
+ // Don't test the Shared Framework or Ref pack; assembly versions in those packages are checked elsewhere.
+ if (packageDir.Contains("Microsoft.AspNetCore.App", StringComparison.OrdinalIgnoreCase))
+ {
+ continue;
+ }
+
+ // Don't test helix test runner tool packages
+ if (helixTestRunnerToolPackages.Any(s => packageDir.Contains(s, StringComparison.OrdinalIgnoreCase)))
+ {
+ continue;
+ }
+
+ // Test lib assemblies
+ var packageAssembliesDir = Path.Combine(packageDir, "lib");
+ if (Directory.Exists(packageAssembliesDir))
+ {
+ foreach (var tfmDir in Directory.GetDirectories(packageAssembliesDir))
+ {
+ var isNetFx = IsNetFx(new DirectoryInfo(tfmDir).Name);
+ foreach (var assembly in Directory.GetFiles(tfmDir, "*.dll"))
+ {
+ using var fileStream = File.OpenRead(assembly);
+ using var peReader = new PEReader(fileStream, PEStreamOptions.Default);
+ var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
+ var assemblyVersion = reader.GetAssemblyDefinition().Version;
+
+ // net & netstandard assembly versions should all match Major.Minor.0.0
+ // netfx assembly versions should match Major.Minor.Patch.0
+ Assert.Equal(expectedVersion.Major, assemblyVersion.Major);
+ Assert.Equal(expectedVersion.Minor, assemblyVersion.Minor);
+ if (isNetFx)
+ {
+ Assert.Equal(expectedVersion.Build, assemblyVersion.Build);
+ }
+ else
+ {
+ Assert.Equal(0, assemblyVersion.Build);
+ }
+ Assert.Equal(0, assemblyVersion.Revision);
+ }
+ }
+ }
+
+ // Test tool assemblies
+ var packageToolsDir = Path.Combine(packageDir, "tools");
+ if (Directory.Exists(packageToolsDir))
+ {
+ var assemblies = Directory.GetFiles(packageToolsDir, "*.dll", SearchOption.AllDirectories)
+ .Where(f => !toolAssembliesToSkip.Any(s => Path.GetFileNameWithoutExtension(f).Contains(s, StringComparison.OrdinalIgnoreCase)));
+ foreach (var assembly in assemblies)
+ {
+ using var fileStream = File.OpenRead(assembly);
+ using var peReader = new PEReader(fileStream, PEStreamOptions.Default);
+ var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
+ var assemblyVersion = reader.GetAssemblyDefinition().Version;
+
+ Assert.Equal(expectedVersion.Major, assemblyVersion.Major);
+ Assert.Equal(expectedVersion.Minor, assemblyVersion.Minor);
+ Assert.Equal(0, assemblyVersion.Build);
+ Assert.Equal(0, assemblyVersion.Revision);
+ }
+ }
+ }
+ }
+
+ private bool IsNetFx(string tfm)
+ {
+ return tfm.StartsWith("net4", StringComparison.OrdinalIgnoreCase);
+ }
+}
+
diff --git a/src/Framework/test/SharedFxTests.cs b/src/Framework/test/SharedFxTests.cs
index d3f1e4b6e5..302df8a51e 100644
--- a/src/Framework/test/SharedFxTests.cs
+++ b/src/Framework/test/SharedFxTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.IO.Compression;
+using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.PortableExecutable;
using System.Xml.Linq;
@@ -159,32 +160,51 @@ public class SharedFxTests
[Fact]
public void SharedFrameworkAssembliesHaveExpectedAssemblyVersions()
{
- // Only test managed assemblies from dotnet/aspnetcore.
+ // Assemblies from this repo and dotnet/runtime don't always have identical assembly versions.
var repoAssemblies = TestData.GetSharedFrameworkBinariesFromRepo()
.Split(';', StringSplitOptions.RemoveEmptyEntries)
.ToHashSet();
var versionStringWithoutPrereleaseTag = TestData.GetMicrosoftNETCoreAppPackageVersion().Split('-', 2)[0];
var version = Version.Parse(versionStringWithoutPrereleaseTag);
+ var aspnetcoreVersionString = TestData.GetSharedFxVersion().Split('-', 2)[0];
+ var aspnetcoreVersion = Version.Parse(aspnetcoreVersionString);
+
var dlls = Directory.GetFiles(_sharedFxRoot, "*.dll", SearchOption.AllDirectories);
Assert.NotEmpty(dlls);
Assert.All(dlls, path =>
{
- // Unlike dotnet/aspnetcore, dotnet/runtime varies the assembly version while in servicing.
- if (!repoAssemblies.Contains(Path.GetFileNameWithoutExtension(path)))
+ var name = Path.GetFileNameWithoutExtension(path);
+ if (string.Equals(name, "aspnetcorev2_inprocess", StringComparison.Ordinal))
{
+ // Skip our native assembly.
return;
}
+ var expectedVersion = repoAssemblies.Contains(name) ? aspnetcoreVersion : version;
+
using var fileStream = File.OpenRead(path);
using var peReader = new PEReader(fileStream, PEStreamOptions.Default);
var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
var assemblyDefinition = reader.GetAssemblyDefinition();
// Assembly versions should all match Major.Minor.0.0
- Assert.Equal(version.Major, assemblyDefinition.Version.Major);
- Assert.Equal(version.Minor, assemblyDefinition.Version.Minor);
+ if (repoAssemblies.Contains(name))
+ {
+ // We always align major.minor in assemblies and packages.
+ Assert.Equal(expectedVersion.Major, assemblyDefinition.Version.Major);
+ }
+ else
+ {
+ // ... but dotnet/runtime has a window between package version and (then) assembly version updates.
+ Assert.True(expectedVersion.Major == assemblyDefinition.Version.Major ||
+ expectedVersion.Major - 1 == assemblyDefinition.Version.Major,
+ $"Unexpected Major assembly version '{assemblyDefinition.Version.Major}' is neither " +
+ $"{expectedVersion.Major - 1}' nor '{expectedVersion.Major}'.");
+ }
+
+ Assert.Equal(expectedVersion.Minor, assemblyDefinition.Version.Minor);
Assert.Equal(0, assemblyDefinition.Version.Build);
Assert.Equal(0, assemblyDefinition.Version.Revision);
});
diff --git a/src/Framework/test/TargetingPackTests.cs b/src/Framework/test/TargetingPackTests.cs
index 3fccd1febc..f531743716 100644
--- a/src/Framework/test/TargetingPackTests.cs
+++ b/src/Framework/test/TargetingPackTests.cs
@@ -38,7 +38,7 @@ public class TargetingPackTests
var actualAssemblies = Directory.GetFiles(Path.Combine(_targetingPackRoot, "ref", _targetingPackTfm), "*.dll")
.Select(Path.GetFileNameWithoutExtension)
.ToHashSet();
- var listedTargetingPackAssemblies = TestData.ListedTargetingPackAssemblies.Keys.ToHashSet();
+ var listedTargetingPackAssemblies = TestData.ListedTargetingPackAssemblies.ToHashSet();
_output.WriteLine("==== actual assemblies ====");
_output.WriteLine(string.Join('\n', actualAssemblies.OrderBy(i => i)));
@@ -60,11 +60,25 @@ public class TargetingPackTests
[Fact]
public void RefAssembliesHaveExpectedAssemblyVersions()
{
+ // Assemblies from this repo and dotnet/runtime don't always have identical assembly versions.
+ var repoAssemblies = TestData.GetAspNetCoreTargetingPackDependencies()
+ .Split(';', StringSplitOptions.RemoveEmptyEntries)
+ .ToHashSet();
+
+ var versionStringWithoutPrereleaseTag = TestData.GetMicrosoftNETCoreAppPackageVersion().Split('-', 2)[0];
+ var version = Version.Parse(versionStringWithoutPrereleaseTag);
+ var aspnetcoreVersionString = TestData.GetSharedFxVersion().Split('-', 2)[0];
+ var aspnetcoreVersion = Version.Parse(aspnetcoreVersionString);
+
IEnumerable<string> dlls = Directory.GetFiles(Path.Combine(_targetingPackRoot, "ref", _targetingPackTfm), "*.dll", SearchOption.AllDirectories);
Assert.NotEmpty(dlls);
Assert.All(dlls, path =>
{
+ var expectedVersion = repoAssemblies.Contains(Path.GetFileNameWithoutExtension(path)) ?
+ aspnetcoreVersion :
+ version;
+
var fileName = Path.GetFileNameWithoutExtension(path);
var assemblyName = AssemblyName.GetAssemblyName(path);
using var fileStream = File.OpenRead(path);
@@ -72,8 +86,24 @@ public class TargetingPackTests
var reader = peReader.GetMetadataReader(MetadataReaderOptions.Default);
var assemblyDefinition = reader.GetAssemblyDefinition();
- TestData.ListedTargetingPackAssemblies.TryGetValue(fileName, out var expectedVersion);
- Assert.Equal(expectedVersion, assemblyDefinition.Version.ToString());
+ // Assembly versions should all match Major.Minor.0.0
+ if (repoAssemblies.Contains(Path.GetFileNameWithoutExtension(path)))
+ {
+ // We always align major.minor in assemblies and packages.
+ Assert.Equal(expectedVersion.Major, assemblyDefinition.Version.Major);
+ }
+ else
+ {
+ // ... but dotnet/runtime has a window between package version and (then) assembly version updates.
+ Assert.True(expectedVersion.Major == assemblyDefinition.Version.Major ||
+ expectedVersion.Major - 1 == assemblyDefinition.Version.Major,
+ $"Unexpected Major assembly version '{assemblyDefinition.Version.Major}' is neither " +
+ $"{expectedVersion.Major - 1}' nor '{expectedVersion.Major}'.");
+ }
+
+ Assert.Equal(expectedVersion.Minor, assemblyDefinition.Version.Minor);
+ Assert.Equal(0, assemblyDefinition.Version.Build);
+ Assert.Equal(0, assemblyDefinition.Version.Revision);
});
}
diff --git a/src/Framework/test/TestData.cs b/src/Framework/test/TestData.cs
index 6b3978eb4f..2763c05a50 100644
--- a/src/Framework/test/TestData.cs
+++ b/src/Framework/test/TestData.cs
@@ -9,7 +9,7 @@ public static class TestData
{
public static List<string> ListedSharedFxAssemblies;
- public static SortedDictionary<string, string> ListedTargetingPackAssemblies;
+ public static List<string> ListedTargetingPackAssemblies;
static TestData()
{
@@ -73,8 +73,11 @@ public static class TestData
"Microsoft.AspNetCore.Mvc.RazorPages",
"Microsoft.AspNetCore.Mvc.TagHelpers",
"Microsoft.AspNetCore.Mvc.ViewFeatures",
+ "Microsoft.AspNetCore.OutputCaching",
+ "Microsoft.AspNetCore.RateLimiting",
"Microsoft.AspNetCore.Razor",
"Microsoft.AspNetCore.Razor.Runtime",
+ "Microsoft.AspNetCore.RequestDecompression",
"Microsoft.AspNetCore.ResponseCaching",
"Microsoft.AspNetCore.ResponseCaching.Abstractions",
"Microsoft.AspNetCore.ResponseCompression",
@@ -147,139 +150,144 @@ public static class TestData
"System.IO.Pipelines",
"System.Security.Cryptography.Pkcs",
"System.Security.Cryptography.Xml",
+ "System.Threading.RateLimiting",
};
- ListedTargetingPackAssemblies = new SortedDictionary<string, string>
+ ListedTargetingPackAssemblies = new List<string>
{
- { "Microsoft.AspNetCore", "7.0.0.0" },
- { "Microsoft.AspNetCore.Antiforgery", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authentication", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authentication.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authentication.Cookies", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authentication.Core", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authentication.OAuth", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authorization", "7.0.0.0" },
- { "Microsoft.AspNetCore.Authorization.Policy", "7.0.0.0" },
- { "Microsoft.AspNetCore.Components", "7.0.0.0" },
- { "Microsoft.AspNetCore.Components.Authorization", "7.0.0.0" },
- { "Microsoft.AspNetCore.Components.Forms", "7.0.0.0" },
- { "Microsoft.AspNetCore.Components.Server", "7.0.0.0" },
- { "Microsoft.AspNetCore.Components.Web", "7.0.0.0" },
- { "Microsoft.AspNetCore.Connections.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.CookiePolicy", "7.0.0.0" },
- { "Microsoft.AspNetCore.Cors", "7.0.0.0" },
- { "Microsoft.AspNetCore.Cryptography.Internal", "7.0.0.0" },
- { "Microsoft.AspNetCore.Cryptography.KeyDerivation", "7.0.0.0" },
- { "Microsoft.AspNetCore.DataProtection", "7.0.0.0" },
- { "Microsoft.AspNetCore.DataProtection.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.DataProtection.Extensions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Diagnostics", "7.0.0.0" },
- { "Microsoft.AspNetCore.Diagnostics.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Diagnostics.HealthChecks", "7.0.0.0" },
- { "Microsoft.AspNetCore.HostFiltering", "7.0.0.0" },
- { "Microsoft.AspNetCore.Hosting", "7.0.0.0" },
- { "Microsoft.AspNetCore.Hosting.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Hosting.Server.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Html.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http.Connections", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http.Connections.Common", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http.Extensions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http.Features", "7.0.0.0" },
- { "Microsoft.AspNetCore.Http.Results", "7.0.0.0" },
- { "Microsoft.AspNetCore.HttpLogging", "7.0.0.0" },
- { "Microsoft.AspNetCore.HttpOverrides", "7.0.0.0" },
- { "Microsoft.AspNetCore.HttpsPolicy", "7.0.0.0" },
- { "Microsoft.AspNetCore.Identity", "7.0.0.0" },
- { "Microsoft.AspNetCore.Localization", "7.0.0.0" },
- { "Microsoft.AspNetCore.Localization.Routing", "7.0.0.0" },
- { "Microsoft.AspNetCore.Metadata", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.ApiExplorer", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Core", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Cors", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.DataAnnotations", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Formatters.Json", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Formatters.Xml", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Localization", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.Razor", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.RazorPages", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.TagHelpers", "7.0.0.0" },
- { "Microsoft.AspNetCore.Mvc.ViewFeatures", "7.0.0.0" },
- { "Microsoft.AspNetCore.Razor", "7.0.0.0" },
- { "Microsoft.AspNetCore.Razor.Runtime", "7.0.0.0" },
- { "Microsoft.AspNetCore.ResponseCaching", "7.0.0.0" },
- { "Microsoft.AspNetCore.ResponseCaching.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.ResponseCompression", "7.0.0.0" },
- { "Microsoft.AspNetCore.Rewrite", "7.0.0.0" },
- { "Microsoft.AspNetCore.Routing", "7.0.0.0" },
- { "Microsoft.AspNetCore.Routing.Abstractions", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.HttpSys", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.IIS", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.IISIntegration", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.Kestrel", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.Kestrel.Core", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic", "7.0.0.0" },
- { "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets", "7.0.0.0" },
- { "Microsoft.AspNetCore.Session", "7.0.0.0" },
- { "Microsoft.AspNetCore.SignalR", "7.0.0.0" },
- { "Microsoft.AspNetCore.SignalR.Common", "7.0.0.0" },
- { "Microsoft.AspNetCore.SignalR.Core", "7.0.0.0" },
- { "Microsoft.AspNetCore.SignalR.Protocols.Json", "7.0.0.0" },
- { "Microsoft.AspNetCore.StaticFiles", "7.0.0.0" },
- { "Microsoft.AspNetCore.WebSockets", "7.0.0.0" },
- { "Microsoft.AspNetCore.WebUtilities", "7.0.0.0" },
- { "Microsoft.Extensions.Caching.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.Caching.Memory", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.Binder", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.CommandLine", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.EnvironmentVariables", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.FileExtensions", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.Ini", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.Json", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.KeyPerFile", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.UserSecrets", "7.0.0.0" },
- { "Microsoft.Extensions.Configuration.Xml", "7.0.0.0" },
- { "Microsoft.Extensions.DependencyInjection", "7.0.0.0" },
- { "Microsoft.Extensions.DependencyInjection.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.Diagnostics.HealthChecks", "7.0.0.0" },
- { "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.FileProviders.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.FileProviders.Composite", "7.0.0.0" },
- { "Microsoft.Extensions.FileProviders.Embedded", "7.0.0.0" },
- { "Microsoft.Extensions.FileProviders.Physical", "7.0.0.0" },
- { "Microsoft.Extensions.FileSystemGlobbing", "7.0.0.0" },
- { "Microsoft.Extensions.Features", "7.0.0.0" },
- { "Microsoft.Extensions.Hosting", "7.0.0.0" },
- { "Microsoft.Extensions.Hosting.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.Http", "7.0.0.0" },
- { "Microsoft.Extensions.Identity.Core", "7.0.0.0" },
- { "Microsoft.Extensions.Identity.Stores", "7.0.0.0" },
- { "Microsoft.Extensions.Localization", "7.0.0.0" },
- { "Microsoft.Extensions.Localization.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.Logging", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.Abstractions", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.Configuration", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.Console", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.Debug", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.EventLog", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.EventSource", "7.0.0.0" },
- { "Microsoft.Extensions.Logging.TraceSource", "7.0.0.0" },
- { "Microsoft.Extensions.ObjectPool", "7.0.0.0" },
- { "Microsoft.Extensions.Options", "7.0.0.0" },
- { "Microsoft.Extensions.Options.ConfigurationExtensions", "7.0.0.0" },
- { "Microsoft.Extensions.Options.DataAnnotations", "7.0.0.0" },
- { "Microsoft.Extensions.Primitives", "7.0.0.0" },
- { "Microsoft.Extensions.WebEncoders", "7.0.0.0" },
- { "Microsoft.JSInterop", "7.0.0.0" },
- { "Microsoft.Net.Http.Headers", "7.0.0.0" },
- { "System.Diagnostics.EventLog", "7.0.0.0" },
- { "System.IO.Pipelines", "7.0.0.0" },
- { "System.Security.Cryptography.Xml", "7.0.0.0" },
+ { "Microsoft.AspNetCore.Antiforgery" },
+ { "Microsoft.AspNetCore.Authentication.Abstractions" },
+ { "Microsoft.AspNetCore.Authentication.Cookies" },
+ { "Microsoft.AspNetCore.Authentication.Core" },
+ { "Microsoft.AspNetCore.Authentication.OAuth" },
+ { "Microsoft.AspNetCore.Authentication" },
+ { "Microsoft.AspNetCore.Authorization.Policy" },
+ { "Microsoft.AspNetCore.Authorization" },
+ { "Microsoft.AspNetCore.Components.Authorization" },
+ { "Microsoft.AspNetCore.Components.Forms" },
+ { "Microsoft.AspNetCore.Components.Server" },
+ { "Microsoft.AspNetCore.Components.Web" },
+ { "Microsoft.AspNetCore.Components" },
+ { "Microsoft.AspNetCore.Connections.Abstractions" },
+ { "Microsoft.AspNetCore.CookiePolicy" },
+ { "Microsoft.AspNetCore.Cors" },
+ { "Microsoft.AspNetCore.Cryptography.Internal" },
+ { "Microsoft.AspNetCore.Cryptography.KeyDerivation" },
+ { "Microsoft.AspNetCore.DataProtection.Abstractions" },
+ { "Microsoft.AspNetCore.DataProtection.Extensions" },
+ { "Microsoft.AspNetCore.DataProtection" },
+ { "Microsoft.AspNetCore.Diagnostics.Abstractions" },
+ { "Microsoft.AspNetCore.Diagnostics.HealthChecks" },
+ { "Microsoft.AspNetCore.Diagnostics" },
+ { "Microsoft.AspNetCore.HostFiltering" },
+ { "Microsoft.AspNetCore.Hosting.Abstractions" },
+ { "Microsoft.AspNetCore.Hosting.Server.Abstractions" },
+ { "Microsoft.AspNetCore.Hosting" },
+ { "Microsoft.AspNetCore.Html.Abstractions" },
+ { "Microsoft.AspNetCore.Http.Abstractions" },
+ { "Microsoft.AspNetCore.Http.Connections.Common" },
+ { "Microsoft.AspNetCore.Http.Connections" },
+ { "Microsoft.AspNetCore.Http.Extensions" },
+ { "Microsoft.AspNetCore.Http.Features" },
+ { "Microsoft.AspNetCore.Http.Results" },
+ { "Microsoft.AspNetCore.Http" },
+ { "Microsoft.AspNetCore.HttpLogging" },
+ { "Microsoft.AspNetCore.HttpOverrides" },
+ { "Microsoft.AspNetCore.HttpsPolicy" },
+ { "Microsoft.AspNetCore.Identity" },
+ { "Microsoft.AspNetCore.Localization.Routing" },
+ { "Microsoft.AspNetCore.Localization" },
+ { "Microsoft.AspNetCore.Metadata" },
+ { "Microsoft.AspNetCore.Mvc.Abstractions" },
+ { "Microsoft.AspNetCore.Mvc.ApiExplorer" },
+ { "Microsoft.AspNetCore.Mvc.Core" },
+ { "Microsoft.AspNetCore.Mvc.Cors" },
+ { "Microsoft.AspNetCore.Mvc.DataAnnotations" },
+ { "Microsoft.AspNetCore.Mvc.Formatters.Json" },
+ { "Microsoft.AspNetCore.Mvc.Formatters.Xml" },
+ { "Microsoft.AspNetCore.Mvc.Localization" },
+ { "Microsoft.AspNetCore.Mvc.Razor" },
+ { "Microsoft.AspNetCore.Mvc.RazorPages" },
+ { "Microsoft.AspNetCore.Mvc.TagHelpers" },
+ { "Microsoft.AspNetCore.Mvc.ViewFeatures" },
+ { "Microsoft.AspNetCore.Mvc" },
+ { "Microsoft.AspNetCore.OutputCaching" },
+ { "Microsoft.AspNetCore.RateLimiting" },
+ { "Microsoft.AspNetCore.Razor.Runtime" },
+ { "Microsoft.AspNetCore.Razor" },
+ { "Microsoft.AspNetCore.RequestDecompression" },
+ { "Microsoft.AspNetCore.ResponseCaching.Abstractions" },
+ { "Microsoft.AspNetCore.ResponseCaching" },
+ { "Microsoft.AspNetCore.ResponseCompression" },
+ { "Microsoft.AspNetCore.Rewrite" },
+ { "Microsoft.AspNetCore.Routing.Abstractions" },
+ { "Microsoft.AspNetCore.Routing" },
+ { "Microsoft.AspNetCore.Server.HttpSys" },
+ { "Microsoft.AspNetCore.Server.IIS" },
+ { "Microsoft.AspNetCore.Server.IISIntegration" },
+ { "Microsoft.AspNetCore.Server.Kestrel.Core" },
+ { "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" },
+ { "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" },
+ { "Microsoft.AspNetCore.Server.Kestrel" },
+ { "Microsoft.AspNetCore.Session" },
+ { "Microsoft.AspNetCore.SignalR.Common" },
+ { "Microsoft.AspNetCore.SignalR.Core" },
+ { "Microsoft.AspNetCore.SignalR.Protocols.Json" },
+ { "Microsoft.AspNetCore.SignalR" },
+ { "Microsoft.AspNetCore.StaticFiles" },
+ { "Microsoft.AspNetCore.WebSockets" },
+ { "Microsoft.AspNetCore.WebUtilities" },
+ { "Microsoft.AspNetCore" },
+ { "Microsoft.Extensions.Caching.Abstractions" },
+ { "Microsoft.Extensions.Caching.Memory" },
+ { "Microsoft.Extensions.Configuration.Abstractions" },
+ { "Microsoft.Extensions.Configuration.Binder" },
+ { "Microsoft.Extensions.Configuration.CommandLine" },
+ { "Microsoft.Extensions.Configuration.EnvironmentVariables" },
+ { "Microsoft.Extensions.Configuration.FileExtensions" },
+ { "Microsoft.Extensions.Configuration.Ini" },
+ { "Microsoft.Extensions.Configuration.Json" },
+ { "Microsoft.Extensions.Configuration.KeyPerFile" },
+ { "Microsoft.Extensions.Configuration.UserSecrets" },
+ { "Microsoft.Extensions.Configuration.Xml" },
+ { "Microsoft.Extensions.Configuration" },
+ { "Microsoft.Extensions.DependencyInjection.Abstractions" },
+ { "Microsoft.Extensions.DependencyInjection" },
+ { "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions" },
+ { "Microsoft.Extensions.Diagnostics.HealthChecks" },
+ { "Microsoft.Extensions.Features" },
+ { "Microsoft.Extensions.FileProviders.Abstractions" },
+ { "Microsoft.Extensions.FileProviders.Composite" },
+ { "Microsoft.Extensions.FileProviders.Embedded" },
+ { "Microsoft.Extensions.FileProviders.Physical" },
+ { "Microsoft.Extensions.FileSystemGlobbing" },
+ { "Microsoft.Extensions.Hosting.Abstractions" },
+ { "Microsoft.Extensions.Hosting" },
+ { "Microsoft.Extensions.Http" },
+ { "Microsoft.Extensions.Identity.Core" },
+ { "Microsoft.Extensions.Identity.Stores" },
+ { "Microsoft.Extensions.Localization.Abstractions" },
+ { "Microsoft.Extensions.Localization" },
+ { "Microsoft.Extensions.Logging.Abstractions" },
+ { "Microsoft.Extensions.Logging.Configuration" },
+ { "Microsoft.Extensions.Logging.Console" },
+ { "Microsoft.Extensions.Logging.Debug" },
+ { "Microsoft.Extensions.Logging.EventLog" },
+ { "Microsoft.Extensions.Logging.EventSource" },
+ { "Microsoft.Extensions.Logging.TraceSource" },
+ { "Microsoft.Extensions.Logging" },
+ { "Microsoft.Extensions.ObjectPool" },
+ { "Microsoft.Extensions.Options.ConfigurationExtensions" },
+ { "Microsoft.Extensions.Options.DataAnnotations" },
+ { "Microsoft.Extensions.Options" },
+ { "Microsoft.Extensions.Primitives" },
+ { "Microsoft.Extensions.WebEncoders" },
+ { "Microsoft.JSInterop" },
+ { "Microsoft.Net.Http.Headers" },
+ { "System.Diagnostics.EventLog" },
+ { "System.IO.Pipelines" },
+ { "System.Security.Cryptography.Xml" },
+ { "System.Threading.RateLimiting" },
};
if (!VerifyAncmBinary())
@@ -312,8 +320,12 @@ public static class TestData
public static string GetPackagesFolder() => GetTestDataValue("PackagesFolder");
+ public static string GetPackageLayoutRoot() => GetTestDataValue("PackageLayoutRoot");
+
public static bool VerifyAncmBinary() => string.Equals(GetTestDataValue("VerifyAncmBinary"), "true", StringComparison.OrdinalIgnoreCase);
+ public static bool VerifyPackageAssemblyVersions() => string.Equals(GetTestDataValue("VerifyPackageAssemblyVersions"), "true", StringComparison.OrdinalIgnoreCase);
+
private static string GetTestDataValue(string key)
=> typeof(TestData).Assembly.GetCustomAttributes<TestDataAttribute>().Single(d => d.Key == key).Value;
}
diff --git a/src/Grpc/Grpc.slnf b/src/Grpc/Grpc.slnf
index 7bf99f650b..dc2d96a23d 100644
--- a/src/Grpc/Grpc.slnf
+++ b/src/Grpc/Grpc.slnf
@@ -3,6 +3,9 @@
"path": "..\\..\\AspNetCore.sln",
"projects": [
"src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
+ "src\\Grpc\\Interop\\test\\InteropTests\\InteropTests.csproj",
+ "src\\Grpc\\Interop\\test\\testassets\\InteropClient\\InteropClient.csproj",
+ "src\\Grpc\\Interop\\test\\testassets\\InteropWebsite\\InteropWebsite.csproj",
"src\\Grpc\\JsonTranscoding\\perf\\Microsoft.AspNetCore.Grpc.Microbenchmarks\\Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj",
"src\\Grpc\\JsonTranscoding\\src\\Microsoft.AspNetCore.Grpc.JsonTranscoding\\Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj",
"src\\Grpc\\JsonTranscoding\\src\\Microsoft.AspNetCore.Grpc.Swagger\\Microsoft.AspNetCore.Grpc.Swagger.csproj",
@@ -11,9 +14,6 @@
"src\\Grpc\\JsonTranscoding\\test\\Microsoft.AspNetCore.Grpc.Swagger.Tests\\Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj",
"src\\Grpc\\JsonTranscoding\\test\\testassets\\IntegrationTestsWebsite\\IntegrationTestsWebsite.csproj",
"src\\Grpc\\JsonTranscoding\\test\\testassets\\Sandbox\\Sandbox.csproj",
- "src\\Grpc\\Interop\\test\\InteropTests\\InteropTests.csproj",
- "src\\Grpc\\Interop\\test\\testassets\\InteropClient\\InteropClient.csproj",
- "src\\Grpc\\Interop\\test\\testassets\\InteropWebsite\\InteropWebsite.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
"src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj",
"src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj",
diff --git a/src/Grpc/Interop/test/testassets/InteropClient/InteropClient.csproj b/src/Grpc/Interop/test/testassets/InteropClient/InteropClient.csproj
index 8273bb1ad0..651586bbc1 100644
--- a/src/Grpc/Interop/test/testassets/InteropClient/InteropClient.csproj
+++ b/src/Grpc/Interop/test/testassets/InteropClient/InteropClient.csproj
@@ -4,6 +4,8 @@
<OutputType>Exe</OutputType>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<Nullable>enable</Nullable>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Grpc/Interop/test/testassets/InteropWebsite/InteropWebsite.csproj b/src/Grpc/Interop/test/testassets/InteropWebsite/InteropWebsite.csproj
index a9e9cf4f13..7b8de3df73 100644
--- a/src/Grpc/Interop/test/testassets/InteropWebsite/InteropWebsite.csproj
+++ b/src/Grpc/Interop/test/testassets/InteropWebsite/InteropWebsite.csproj
@@ -6,6 +6,8 @@
<Nullable>enable</Nullable>
<RestoreAdditionalProjectSources>$(RestoreAdditionalProjectSources);$(ArtifactsShippingPackagesDir)</RestoreAdditionalProjectSources>
<UseAspNetCoreSharedRuntime>true</UseAspNetCoreSharedRuntime>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Grpc/Interop/test/testassets/InteropWebsite/TestServiceImpl.cs b/src/Grpc/Interop/test/testassets/InteropWebsite/TestServiceImpl.cs
index 2eb69657d5..022ad8bb4d 100644
--- a/src/Grpc/Interop/test/testassets/InteropWebsite/TestServiceImpl.cs
+++ b/src/Grpc/Interop/test/testassets/InteropWebsite/TestServiceImpl.cs
@@ -47,10 +47,9 @@ public class TestServiceImpl : TestService.TestServiceBase
foreach (var responseParam in request.ResponseParameters)
{
- // TODO(JamesNK): Remove nullable override after Grpc.Core.Api update
responseStream.WriteOptions = !(responseParam.Compressed?.Value ?? false)
? new WriteOptions(WriteFlags.NoCompress)
- : null!;
+ : null;
var response = new StreamingOutputCallResponse { Payload = CreateZerosPayload(responseParam.Size) };
await responseStream.WriteAsync(response);
diff --git a/src/Grpc/JsonTranscoding/perf/Microsoft.AspNetCore.Grpc.Microbenchmarks/Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj b/src/Grpc/JsonTranscoding/perf/Microsoft.AspNetCore.Grpc.Microbenchmarks/Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj
index 4c8e02e25b..1974500074 100644
--- a/src/Grpc/JsonTranscoding/perf/Microsoft.AspNetCore.Grpc.Microbenchmarks/Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj
+++ b/src/Grpc/JsonTranscoding/perf/Microsoft.AspNetCore.Grpc.Microbenchmarks/Microsoft.AspNetCore.Grpc.Microbenchmarks.csproj
@@ -6,6 +6,8 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<TieredCompilation>false</TieredCompilation>
<DefineConstants>$(DefineConstants);IS_BENCHMARKS</DefineConstants>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/GrpcJsonTranscodingServiceExtensions.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/GrpcJsonTranscodingServiceExtensions.cs
index 98934e6355..817bd9aeda 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/GrpcJsonTranscodingServiceExtensions.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/GrpcJsonTranscodingServiceExtensions.cs
@@ -17,34 +17,34 @@ public static class GrpcJsonTranscodingServiceExtensions
/// <summary>
/// Adds gRPC JSON transcoding services to the specified <see cref="IGrpcServerBuilder" />.
/// </summary>
- /// <param name="grpcBuilder">The <see cref="IGrpcServerBuilder"/>.</param>
+ /// <param name="builder">The <see cref="IGrpcServerBuilder"/>.</param>
/// <returns>The same instance of the <see cref="IGrpcServerBuilder"/> for chaining.</returns>
- public static IGrpcServerBuilder AddJsonTranscoding(this IGrpcServerBuilder grpcBuilder)
+ public static IGrpcServerBuilder AddJsonTranscoding(this IGrpcServerBuilder builder)
{
- if (grpcBuilder == null)
+ if (builder == null)
{
- throw new ArgumentNullException(nameof(grpcBuilder));
+ throw new ArgumentNullException(nameof(builder));
}
- grpcBuilder.Services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IServiceMethodProvider<>), typeof(JsonTranscodingServiceMethodProvider<>)));
+ builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IServiceMethodProvider<>), typeof(JsonTranscodingServiceMethodProvider<>)));
- return grpcBuilder;
+ return builder;
}
/// <summary>
/// Adds gRPC JSON transcoding services to the specified <see cref="IGrpcServerBuilder" />.
/// </summary>
- /// <param name="grpcBuilder">The <see cref="IGrpcServerBuilder"/>.</param>
+ /// <param name="builder">The <see cref="IGrpcServerBuilder"/>.</param>
/// <param name="configureOptions">An <see cref="Action{GrpcJsonTranscodingOptions}"/> to configure the provided <see cref="GrpcJsonTranscodingOptions"/>.</param>
/// <returns>The same instance of the <see cref="IGrpcServerBuilder"/> for chaining.</returns>
- public static IGrpcServerBuilder AddJsonTranscoding(this IGrpcServerBuilder grpcBuilder, Action<GrpcJsonTranscodingOptions> configureOptions)
+ public static IGrpcServerBuilder AddJsonTranscoding(this IGrpcServerBuilder builder, Action<GrpcJsonTranscodingOptions> configureOptions)
{
- if (grpcBuilder == null)
+ if (builder == null)
{
- throw new ArgumentNullException(nameof(grpcBuilder));
+ throw new ArgumentNullException(nameof(builder));
}
- grpcBuilder.Services.Configure(configureOptions);
- return grpcBuilder.AddJsonTranscoding();
+ builder.Services.Configure(configureOptions);
+ return builder.AddJsonTranscoding();
}
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/HttpApiProviderSeviceBinder.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/JsonTranscodingProviderServiceBinder.cs
index 3941ea7b5e..4ea56f445d 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/HttpApiProviderSeviceBinder.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/JsonTranscodingProviderServiceBinder.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics.CodeAnalysis;
+using System.Linq;
using Google.Api;
using Google.Protobuf.Reflection;
using Grpc.AspNetCore.Server;
@@ -228,20 +229,15 @@ internal sealed partial class JsonTranscodingProviderServiceBinder<TService> : S
private static (RoutePattern routePattern, CallHandlerDescriptorInfo descriptorInfo) ParseRoute(string pattern, string body, string responseBody, MethodDescriptor methodDescriptor)
{
- if (!pattern.StartsWith('/'))
- {
- // This validation is consistent with grpc-gateway code generation.
- // We should match their validation to be a good member of the eco-system.
- throw new InvalidOperationException($"Path template '{pattern}' must start with a '/'.");
- }
+ var httpRoutePattern = HttpRoutePattern.Parse(pattern);
+ var adapter = JsonTranscodingRouteAdapter.Parse(httpRoutePattern);
- var routePattern = RoutePatternFactory.Parse(pattern);
- return (RoutePatternFactory.Parse(pattern), CreateDescriptorInfo(body, responseBody, methodDescriptor, routePattern));
+ return (RoutePatternFactory.Parse(adapter.ResolvedRouteTemplate), CreateDescriptorInfo(body, responseBody, methodDescriptor, adapter));
}
- private static CallHandlerDescriptorInfo CreateDescriptorInfo(string body, string responseBody, MethodDescriptor methodDescriptor, RoutePattern routePattern)
+ private static CallHandlerDescriptorInfo CreateDescriptorInfo(string body, string responseBody, MethodDescriptor methodDescriptor, JsonTranscodingRouteAdapter routeAdapter)
{
- var routeParameterDescriptors = ServiceDescriptorHelpers.ResolveRouteParameterDescriptors(routePattern, methodDescriptor.InputType);
+ var routeParameterDescriptors = ServiceDescriptorHelpers.ResolveRouteParameterDescriptors(routeAdapter.HttpRoutePattern.Variables.Select(v => v.FieldPath).ToList(), methodDescriptor.InputType);
var bodyDescriptor = ServiceDescriptorHelpers.ResolveBodyDescriptor(body, typeof(TService), methodDescriptor);
@@ -260,7 +256,8 @@ internal sealed partial class JsonTranscodingProviderServiceBinder<TService> : S
bodyDescriptor?.Descriptor,
bodyDescriptor?.IsDescriptorRepeated ?? false,
bodyDescriptor?.FieldDescriptors,
- routeParameterDescriptors);
+ routeParameterDescriptors,
+ routeAdapter);
return descriptorInfo;
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/HttpApiServiceMethodProvider.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/JsonTranscodingServiceMethodProvider.cs
index 6b68726952..6b68726952 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/HttpApiServiceMethodProvider.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Binding/JsonTranscodingServiceMethodProvider.cs
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/CallHandlerDescriptorInfo.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/CallHandlerDescriptorInfo.cs
index fc31a28f01..022ff483fd 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/CallHandlerDescriptorInfo.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/CallHandlerDescriptorInfo.cs
@@ -15,13 +15,15 @@ internal sealed class CallHandlerDescriptorInfo
MessageDescriptor? bodyDescriptor,
bool bodyDescriptorRepeated,
List<FieldDescriptor>? bodyFieldDescriptors,
- Dictionary<string, List<FieldDescriptor>> routeParameterDescriptors)
+ Dictionary<string, List<FieldDescriptor>> routeParameterDescriptors,
+ JsonTranscodingRouteAdapter routeAdapter)
{
ResponseBodyDescriptor = responseBodyDescriptor;
BodyDescriptor = bodyDescriptor;
BodyDescriptorRepeated = bodyDescriptorRepeated;
BodyFieldDescriptors = bodyFieldDescriptors;
RouteParameterDescriptors = routeParameterDescriptors;
+ RouteAdapter = routeAdapter;
if (BodyFieldDescriptors != null)
{
BodyFieldDescriptorsPath = string.Join('.', BodyFieldDescriptors.Select(d => d.Name));
@@ -35,6 +37,7 @@ internal sealed class CallHandlerDescriptorInfo
public bool BodyDescriptorRepeated { get; }
public List<FieldDescriptor>? BodyFieldDescriptors { get; }
public Dictionary<string, List<FieldDescriptor>> RouteParameterDescriptors { get; }
+ public JsonTranscodingRouteAdapter RouteAdapter { get; }
public ConcurrentDictionary<string, List<FieldDescriptor>?> PathDescriptorsCache { get; }
public string? BodyFieldDescriptorsPath { get; }
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/ServerCallHandlerBase.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/ServerCallHandlerBase.cs
index aeb030dd77..5cfe984ac1 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/ServerCallHandlerBase.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/ServerCallHandlerBase.cs
@@ -36,6 +36,11 @@ internal abstract class ServerCallHandlerBase<TService, TRequest, TResponse>
public Task HandleCallAsync(HttpContext httpContext)
{
+ foreach (var rewriteAction in DescriptorInfo.RouteAdapter.RewriteVariableActions)
+ {
+ rewriteAction(httpContext);
+ }
+
var serverCallContext = new JsonTranscodingServerCallContext(httpContext, MethodInvoker.Options, MethodInvoker.Method, DescriptorInfo, Logger);
httpContext.Features.Set<IServerCallContextFeature>(serverCallContext);
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/UnaryServerCallHandler.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/UnaryServerCallHandler.cs
index b8c390ca34..b36ba05aa1 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/UnaryServerCallHandler.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/CallHandlers/UnaryServerCallHandler.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text.Json;
+using Google.Api;
using Grpc.Core;
using Grpc.Shared.Server;
using Microsoft.AspNetCore.Http;
@@ -42,8 +43,15 @@ internal sealed class UnaryServerCallHandler<TService, TRequest, TResponse> : Se
throw new RpcException(new Status(StatusCode.Cancelled, "No message returned from method."));
}
- serverCallContext.EnsureResponseHeaders();
-
- await JsonRequestHelpers.SendMessage(serverCallContext, SerializerOptions, response);
+ if (response is HttpBody httpBody)
+ {
+ serverCallContext.EnsureResponseHeaders(httpBody.ContentType);
+ await serverCallContext.HttpContext.Response.Body.WriteAsync(httpBody.Data.Memory);
+ }
+ else
+ {
+ serverCallContext.EnsureResponseHeaders();
+ await JsonRequestHelpers.SendMessage(serverCallContext, SerializerOptions, response, CancellationToken.None);
+ }
}
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpContextStreamWriter.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpContextStreamWriter.cs
index 893ab9dfd5..baa30ad7a6 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpContextStreamWriter.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpContextStreamWriter.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text.Json;
+using Google.Api;
using Grpc.Core;
namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
@@ -22,43 +23,81 @@ internal sealed class HttpContextStreamWriter<TResponse> : IServerStreamWriter<T
_writeLock = new object();
}
- public WriteOptions WriteOptions
+ public WriteOptions? WriteOptions
{
get => _context.WriteOptions;
set => _context.WriteOptions = value;
}
+ Task IAsyncStreamWriter<TResponse>.WriteAsync(TResponse message, CancellationToken cancellationToken)
+ {
+ return WriteAsyncCore(message, cancellationToken);
+ }
+
public Task WriteAsync(TResponse message)
{
+ return WriteAsyncCore(message, CancellationToken.None);
+ }
+
+ private async Task WriteAsyncCore(TResponse message, CancellationToken cancellationToken)
+ {
if (message == null)
{
- return Task.FromException(new ArgumentNullException(nameof(message)));
+ throw new ArgumentNullException(nameof(message));
}
- if (_completed || _context.CancellationToken.IsCancellationRequested)
+ // Register cancellation token early to ensure request is canceled if cancellation is requested.
+ CancellationTokenRegistration? registration = null;
+ if (cancellationToken.CanBeCanceled)
{
- return Task.FromException(new InvalidOperationException("Can't write the message because the request is complete."));
+ registration = cancellationToken.Register(
+ static (state) => ((JsonTranscodingServerCallContext)state!).HttpContext.Abort(),
+ _context);
}
- lock (_writeLock)
+ try
{
- // Pending writes need to be awaited first
- if (IsWriteInProgressUnsynchronized)
+ cancellationToken.ThrowIfCancellationRequested();
+
+ if (_completed || _context.CancellationToken.IsCancellationRequested)
{
- return Task.FromException(new InvalidOperationException("Can't write the message because the previous write is in progress."));
+ throw new InvalidOperationException("Can't write the message because the request is complete.");
}
- // Save write task to track whether it is complete. Must be set inside lock.
- _writeTask = WriteMessageAndDelimiter(message);
- }
+ lock (_writeLock)
+ {
+ // Pending writes need to be awaited first
+ if (IsWriteInProgressUnsynchronized)
+ {
+ throw new InvalidOperationException("Can't write the message because the previous write is in progress.");
+ }
- return _writeTask;
+ // Save write task to track whether it is complete. Must be set inside lock.
+ _writeTask = WriteMessageAndDelimiter(message, cancellationToken);
+ }
+
+ await _writeTask;
+ }
+ finally
+ {
+ registration?.Dispose();
+ }
}
- private async Task WriteMessageAndDelimiter(TResponse message)
+ private async Task WriteMessageAndDelimiter(TResponse message, CancellationToken cancellationToken)
{
- await JsonRequestHelpers.SendMessage(_context, _serializerOptions, message);
- await _context.HttpContext.Response.Body.WriteAsync(GrpcProtocolConstants.StreamingDelimiter);
+ if (message is HttpBody httpBody)
+ {
+ _context.EnsureResponseHeaders(httpBody.ContentType);
+ await _context.HttpContext.Response.Body.WriteAsync(httpBody.Data.Memory, cancellationToken);
+ }
+ else
+ {
+ _context.EnsureResponseHeaders();
+ await JsonRequestHelpers.SendMessage(_context, _serializerOptions, message, cancellationToken);
+ }
+
+ await _context.HttpContext.Response.Body.WriteAsync(GrpcProtocolConstants.StreamingDelimiter, cancellationToken);
}
public void Complete()
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/AnyConverter.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/AnyConverter.cs
index 3c870e8fc0..abc487ffae 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/AnyConverter.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/AnyConverter.cs
@@ -86,9 +86,27 @@ internal sealed class AnyConverter<TMessage> : SettingsConverterBase<TMessage> w
}
else
{
- MessageConverter<Any>.WriteMessageFields(writer, valueMessage, Context.Settings, options);
+ WriteMessageFields(writer, valueMessage, Context.Settings, options);
}
writer.WriteEndObject();
}
+
+ internal static void WriteMessageFields(Utf8JsonWriter writer, IMessage message, GrpcJsonSettings settings, JsonSerializerOptions options)
+ {
+ var fields = message.Descriptor.Fields;
+
+ foreach (var field in fields.InFieldNumberOrder())
+ {
+ var accessor = field.Accessor;
+ var value = accessor.GetValue(message);
+ if (!JsonConverterHelper.ShouldFormatFieldValue(message, field, value, !settings.IgnoreDefaultValues))
+ {
+ continue;
+ }
+
+ writer.WritePropertyName(accessor.Descriptor.JsonName);
+ JsonSerializer.Serialize(writer, value, value.GetType(), options);
+ }
+ }
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForEnum.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForEnum.cs
index 1148628bdc..30e5cc8f22 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForEnum.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForEnum.cs
@@ -8,7 +8,7 @@ using Type = System.Type;
namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
-internal class JsonConverterFactoryForEnum : JsonConverterFactory
+internal sealed class JsonConverterFactoryForEnum : JsonConverterFactory
{
private readonly JsonContext _context;
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForMessage.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForMessage.cs
deleted file mode 100644
index 226e0e7ff4..0000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForMessage.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Reflection;
-using System.Text.Json;
-using System.Text.Json.Serialization;
-using Google.Protobuf;
-using Type = System.Type;
-
-namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
-
-internal class JsonConverterFactoryForMessage : JsonConverterFactory
-{
- private readonly JsonContext _context;
-
- public JsonConverterFactoryForMessage(JsonContext context)
- {
- _context = context;
- }
-
- public override bool CanConvert(Type typeToConvert)
- {
- return typeof(IMessage).IsAssignableFrom(typeToConvert);
- }
-
- public override JsonConverter CreateConverter(
- Type typeToConvert, JsonSerializerOptions options)
- {
- JsonConverter converter = (JsonConverter)Activator.CreateInstance(
- typeof(MessageConverter<>).MakeGenericType(new Type[] { typeToConvert }),
- BindingFlags.Instance | BindingFlags.Public,
- binder: null,
- args: new object[] { _context },
- culture: null)!;
-
- return converter;
- }
-}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWellKnownTypes.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWellKnownTypes.cs
index c86dfb75d7..adf96c9cdd 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWellKnownTypes.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWellKnownTypes.cs
@@ -5,12 +5,11 @@ using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
using Google.Protobuf;
-using Google.Protobuf.WellKnownTypes;
using Type = System.Type;
namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
-internal class JsonConverterFactoryForWellKnownTypes : JsonConverterFactory
+internal sealed class JsonConverterFactoryForWellKnownTypes : JsonConverterFactory
{
private readonly JsonContext _context;
@@ -32,14 +31,14 @@ internal class JsonConverterFactoryForWellKnownTypes : JsonConverterFactory
return false;
}
- return WellKnownTypeNames.ContainsKey(descriptor.FullName);
+ return JsonConverterHelper.WellKnownTypeNames.ContainsKey(descriptor.FullName);
}
public override JsonConverter CreateConverter(
Type typeToConvert, JsonSerializerOptions options)
{
var descriptor = JsonConverterHelper.GetMessageDescriptor(typeToConvert)!;
- var converterType = WellKnownTypeNames[descriptor.FullName];
+ var converterType = JsonConverterHelper.WellKnownTypeNames[descriptor.FullName];
var converter = (JsonConverter)Activator.CreateInstance(
converterType.MakeGenericType(new Type[] { typeToConvert }),
@@ -50,15 +49,4 @@ internal class JsonConverterFactoryForWellKnownTypes : JsonConverterFactory
return converter;
}
-
- private static readonly Dictionary<string, Type> WellKnownTypeNames = new Dictionary<string, Type>
- {
- [Any.Descriptor.FullName] = typeof(AnyConverter<>),
- [Duration.Descriptor.FullName] = typeof(DurationConverter<>),
- [Timestamp.Descriptor.FullName] = typeof(TimestampConverter<>),
- [FieldMask.Descriptor.FullName] = typeof(FieldMaskConverter<>),
- [Struct.Descriptor.FullName] = typeof(StructConverter<>),
- [ListValue.Descriptor.FullName] = typeof(ListValueConverter<>),
- [Value.Descriptor.FullName] = typeof(ValueConverter<>),
- };
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWrappers.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWrappers.cs
index 0147d4c272..b25894be30 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWrappers.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterFactoryForWrappers.cs
@@ -10,7 +10,7 @@ using Type = System.Type;
namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
-internal class JsonConverterFactoryForWrappers : JsonConverterFactory
+internal sealed class JsonConverterFactoryForWrappers : JsonConverterFactory
{
private readonly JsonContext _context;
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterHelper.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterHelper.cs
index 385dd24880..9a8bac352a 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterHelper.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterHelper.cs
@@ -6,7 +6,9 @@ using System.Reflection;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
+using System.Text.Json.Serialization.Metadata;
using Google.Protobuf;
+using Google.Protobuf.Collections;
using Google.Protobuf.Reflection;
using Google.Protobuf.WellKnownTypes;
using Grpc.Shared;
@@ -18,17 +20,33 @@ internal static class JsonConverterHelper
{
internal const int WrapperValueFieldNumber = Int32Value.ValueFieldNumber;
+ internal static readonly Dictionary<string, Type> WellKnownTypeNames = new Dictionary<string, Type>
+ {
+ [Any.Descriptor.FullName] = typeof(AnyConverter<>),
+ [Duration.Descriptor.FullName] = typeof(DurationConverter<>),
+ [Timestamp.Descriptor.FullName] = typeof(TimestampConverter<>),
+ [FieldMask.Descriptor.FullName] = typeof(FieldMaskConverter<>),
+ [Struct.Descriptor.FullName] = typeof(StructConverter<>),
+ [ListValue.Descriptor.FullName] = typeof(ListValueConverter<>),
+ [Value.Descriptor.FullName] = typeof(ValueConverter<>),
+ };
+
internal static JsonSerializerOptions CreateSerializerOptions(JsonContext context, bool isStreamingOptions = false)
{
// Streaming is line delimited between messages. That means JSON can't be indented as it adds new lines.
// For streaming to work, indenting must be disabled when streaming.
var writeIndented = !isStreamingOptions ? context.Settings.WriteIndented : false;
+ var typeInfoResolver = JsonTypeInfoResolver.Combine(
+ new MessageTypeInfoResolver(context),
+ new DefaultJsonTypeInfoResolver());
+
var options = new JsonSerializerOptions
{
WriteIndented = writeIndented,
NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals,
- Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
+ Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
+ TypeInfoResolver = typeInfoResolver
};
options.Converters.Add(new NullValueConverter());
options.Converters.Add(new ByteStringConverter());
@@ -38,13 +56,34 @@ internal static class JsonConverterHelper
options.Converters.Add(new JsonConverterFactoryForEnum(context));
options.Converters.Add(new JsonConverterFactoryForWrappers(context));
options.Converters.Add(new JsonConverterFactoryForWellKnownTypes(context));
- options.Converters.Add(new JsonConverterFactoryForMessage(context));
return options;
}
internal static Type GetFieldType(FieldDescriptor descriptor)
{
+ if (descriptor.IsMap)
+ {
+ var mapFields = descriptor.MessageType.Fields.InFieldNumberOrder();
+ var keyField = mapFields[0];
+ var valueField = mapFields[1];
+
+ return typeof(MapField<,>).MakeGenericType(GetFieldTypeCore(keyField), GetFieldTypeCore(valueField));
+ }
+ else if (descriptor.IsRepeated)
+ {
+ var itemType = GetFieldTypeCore(descriptor);
+
+ return typeof(RepeatedField<>).MakeGenericType(itemType);
+ }
+ else
+ {
+ return GetFieldTypeCore(descriptor);
+ }
+ }
+
+ private static Type GetFieldTypeCore(FieldDescriptor descriptor)
+ {
switch (descriptor.FieldType)
{
case FieldType.Bool:
@@ -85,6 +124,7 @@ internal static class JsonConverterHelper
return t;
}
+
return descriptor.MessageType.ClrType;
default:
throw new ArgumentException("Invalid field type");
@@ -124,7 +164,8 @@ internal static class JsonConverterHelper
public static void PopulateList(ref Utf8JsonReader reader, JsonSerializerOptions options, IMessage message, FieldDescriptor fieldDescriptor)
{
var fieldType = GetFieldType(fieldDescriptor);
- var repeatedFieldType = typeof(List<>).MakeGenericType(fieldType);
+ var itemType = fieldType.GetGenericArguments()[0];
+ var repeatedFieldType = typeof(List<>).MakeGenericType(itemType);
var newValues = (IList)JsonSerializer.Deserialize(ref reader, repeatedFieldType, options)!;
var existingValue = (IList)fieldDescriptor.Accessor.GetValue(message);
@@ -133,4 +174,67 @@ internal static class JsonConverterHelper
existingValue.Add(item);
}
}
+
+ /// <summary>
+ /// Determines whether or not a field value should be serialized according to the field,
+ /// its value in the message, and the settings of this formatter.
+ /// </summary>
+ public static bool ShouldFormatFieldValue(IMessage message, FieldDescriptor field, object? value, bool formatDefaultValues) =>
+ field.HasPresence
+ // Fields that support presence *just* use that
+ ? field.Accessor.HasValue(message)
+ // Otherwise, format if either we've been asked to format default values, or if it's
+ // not a default value anyway.
+ : formatDefaultValues || !IsDefaultValue(field, value);
+
+ private static bool IsDefaultValue(FieldDescriptor descriptor, object? value)
+ {
+ if (value == null)
+ {
+ return true;
+ }
+ if (descriptor.IsMap)
+ {
+ var dictionary = (IDictionary)value;
+ return dictionary.Count == 0;
+ }
+ if (descriptor.IsRepeated)
+ {
+ var list = (IList)value;
+ return list.Count == 0;
+ }
+ switch (descriptor.FieldType)
+ {
+ case FieldType.Bool:
+ return (bool)value == false;
+ case FieldType.Bytes:
+ return (ByteString)value == ByteString.Empty;
+ case FieldType.String:
+ return (string)value == string.Empty;
+ case FieldType.Double:
+ return (double)value == 0.0;
+ case FieldType.SInt32:
+ case FieldType.Int32:
+ case FieldType.SFixed32:
+ case FieldType.Enum:
+ return (int)value == 0;
+ case FieldType.Fixed32:
+ case FieldType.UInt32:
+ return (uint)value == 0;
+ case FieldType.Fixed64:
+ case FieldType.UInt64:
+ return (ulong)value == 0;
+ case FieldType.SFixed64:
+ case FieldType.Int64:
+ case FieldType.SInt64:
+ return (long)value == 0;
+ case FieldType.Float:
+ return (float)value == 0f;
+ case FieldType.Message:
+ case FieldType.Group: // Never expect to get this, but...
+ return value == null;
+ default:
+ throw new ArgumentException("Invalid field type");
+ }
+ }
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageConverter.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageConverter.cs
deleted file mode 100644
index ec51deb662..0000000000
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageConverter.cs
+++ /dev/null
@@ -1,187 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Collections;
-using System.Text.Json;
-using Google.Protobuf;
-using Google.Protobuf.Reflection;
-using Type = System.Type;
-
-namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
-
-// This converter should be temporary until System.Text.Json supports overriding contacts.
-// We want to eliminate this converter because System.Text.Json has to buffer content in converters.
-internal sealed class MessageConverter<TMessage> : SettingsConverterBase<TMessage> where TMessage : IMessage, new()
-{
- private readonly Dictionary<string, FieldDescriptor> _jsonFieldMap;
-
- public MessageConverter(JsonContext context) : base(context)
- {
- _jsonFieldMap = CreateJsonFieldMap((new TMessage()).Descriptor.Fields.InFieldNumberOrder());
- }
-
- public override TMessage Read(
- ref Utf8JsonReader reader,
- Type typeToConvert,
- JsonSerializerOptions options)
- {
- var message = new TMessage();
-
- if (reader.TokenType != JsonTokenType.StartObject)
- {
- throw new InvalidOperationException($"Unexpected JSON token: {reader.TokenType}");
- }
-
- while (reader.Read())
- {
- switch (reader.TokenType)
- {
- case JsonTokenType.EndObject:
- return message;
- case JsonTokenType.PropertyName:
- if (_jsonFieldMap.TryGetValue(reader.GetString()!, out var fieldDescriptor))
- {
- if (fieldDescriptor.ContainingOneof != null)
- {
- if (fieldDescriptor.ContainingOneof.Accessor.GetCaseFieldDescriptor(message) != null)
- {
- throw new InvalidOperationException($"Multiple values specified for oneof {fieldDescriptor.ContainingOneof.Name}.");
- }
- }
-
- if (fieldDescriptor.IsMap)
- {
- JsonConverterHelper.PopulateMap(ref reader, options, message, fieldDescriptor);
- }
- else if (fieldDescriptor.IsRepeated)
- {
- JsonConverterHelper.PopulateList(ref reader, options, message, fieldDescriptor);
- }
- else
- {
- var fieldType = JsonConverterHelper.GetFieldType(fieldDescriptor);
- var propertyValue = JsonSerializer.Deserialize(ref reader, fieldType, options);
- fieldDescriptor.Accessor.SetValue(message, propertyValue);
- }
- }
- else
- {
- reader.Skip();
- }
- break;
- case JsonTokenType.Comment:
- // Ignore
- break;
- default:
- throw new InvalidOperationException($"Unexpected JSON token: {reader.TokenType}");
- }
- }
-
- throw new Exception();
- }
-
- public override void Write(
- Utf8JsonWriter writer,
- TMessage value,
- JsonSerializerOptions options)
- {
- WriteMessage(writer, value, options);
- }
-
- private void WriteMessage(Utf8JsonWriter writer, IMessage message, JsonSerializerOptions options)
- {
- writer.WriteStartObject();
-
- WriteMessageFields(writer, message, Context.Settings, options);
-
- writer.WriteEndObject();
- }
-
- internal static void WriteMessageFields(Utf8JsonWriter writer, IMessage message, GrpcJsonSettings settings, JsonSerializerOptions options)
- {
- var fields = message.Descriptor.Fields;
-
- foreach (var field in fields.InFieldNumberOrder())
- {
- var accessor = field.Accessor;
- var value = accessor.GetValue(message);
- if (!ShouldFormatFieldValue(message, field, value, !settings.IgnoreDefaultValues))
- {
- continue;
- }
-
- writer.WritePropertyName(accessor.Descriptor.JsonName);
- JsonSerializer.Serialize(writer, value, value.GetType(), options);
- }
- }
-
- private static Dictionary<string, FieldDescriptor> CreateJsonFieldMap(IList<FieldDescriptor> fields)
- {
- var map = new Dictionary<string, FieldDescriptor>();
- foreach (var field in fields)
- {
- map[field.Name] = field;
- map[field.JsonName] = field;
- }
- return new Dictionary<string, FieldDescriptor>(map);
- }
-
- /// <summary>
- /// Determines whether or not a field value should be serialized according to the field,
- /// its value in the message, and the settings of this formatter.
- /// </summary>
- private static bool ShouldFormatFieldValue(IMessage message, FieldDescriptor field, object value, bool formatDefaultValues) =>
- field.HasPresence
- // Fields that support presence *just* use that
- ? field.Accessor.HasValue(message)
- // Otherwise, format if either we've been asked to format default values, or if it's
- // not a default value anyway.
- : formatDefaultValues || !IsDefaultValue(field, value);
-
- private static bool IsDefaultValue(FieldDescriptor descriptor, object value)
- {
- if (descriptor.IsMap)
- {
- IDictionary dictionary = (IDictionary)value;
- return dictionary.Count == 0;
- }
- if (descriptor.IsRepeated)
- {
- IList list = (IList)value;
- return list.Count == 0;
- }
- switch (descriptor.FieldType)
- {
- case FieldType.Bool:
- return (bool)value == false;
- case FieldType.Bytes:
- return (ByteString)value == ByteString.Empty;
- case FieldType.String:
- return (string)value == "";
- case FieldType.Double:
- return (double)value == 0.0;
- case FieldType.SInt32:
- case FieldType.Int32:
- case FieldType.SFixed32:
- case FieldType.Enum:
- return (int)value == 0;
- case FieldType.Fixed32:
- case FieldType.UInt32:
- return (uint)value == 0;
- case FieldType.Fixed64:
- case FieldType.UInt64:
- return (ulong)value == 0;
- case FieldType.SFixed64:
- case FieldType.Int64:
- case FieldType.SInt64:
- return (long)value == 0;
- case FieldType.Float:
- return (float)value == 0f;
- case FieldType.Message:
- case FieldType.Group: // Never expect to get this, but...
- return value == null;
- default:
- throw new ArgumentException("Invalid field type");
- }
- }
-}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageTypeInfoResolver.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageTypeInfoResolver.cs
new file mode 100644
index 0000000000..212924a3b1
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/MessageTypeInfoResolver.cs
@@ -0,0 +1,177 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections;
+using System.Diagnostics.CodeAnalysis;
+using System.Text.Json;
+using System.Text.Json.Serialization.Metadata;
+using Google.Protobuf;
+using Google.Protobuf.Reflection;
+using Grpc.Shared;
+using Type = System.Type;
+
+namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
+
+internal sealed class MessageTypeInfoResolver : IJsonTypeInfoResolver
+{
+ private readonly JsonContext _context;
+
+ public MessageTypeInfoResolver(JsonContext context)
+ {
+ _context = context;
+ }
+
+ public JsonTypeInfo? GetTypeInfo(Type type, JsonSerializerOptions options)
+ {
+ if (!IsStandardMessage(type, out var messageDescriptor))
+ {
+ return null;
+ }
+
+ var typeInfo = JsonTypeInfo.CreateJsonTypeInfo(type, options);
+ typeInfo.CreateObject = () => Activator.CreateInstance(type)!;
+
+ var fields = messageDescriptor.Fields.InFieldNumberOrder();
+
+ // The field map can have multiple entries for a property:
+ // 1. The JSON field name, e.g. firstName. This is used to serialize and deserialize JSON.
+ // 2. The original field name, e.g. first_name. This might be different. It is only used to deserialize JSON.
+ var mappings = CreateJsonFieldMap(fields);
+
+ foreach (var field in fields)
+ {
+ var propertyInfo = CreatePropertyInfo(typeInfo, field.JsonName, field, isSerializable: true);
+ typeInfo.Properties.Add(propertyInfo);
+
+ // We have a property for reading and writing the JSON name so remove from mappings.
+ mappings.Remove(field.JsonName);
+ }
+
+ // Fields have two mappings: the original field name and the camelcased JSON name.
+ // The JSON name can also be customized in proto with json_name option.
+ // Remaining mappings are for extra setter only properties.
+ foreach (var mapping in mappings)
+ {
+ var propertyInfo = CreatePropertyInfo(typeInfo, mapping.Key, mapping.Value, isSerializable: false);
+ typeInfo.Properties.Add(propertyInfo);
+ }
+
+ return typeInfo;
+ }
+
+ private static bool IsStandardMessage(Type type, [NotNullWhen(true)] out MessageDescriptor? messageDescriptor)
+ {
+ if (!typeof(IMessage).IsAssignableFrom(type))
+ {
+ messageDescriptor = null;
+ return false;
+ }
+
+ messageDescriptor = JsonConverterHelper.GetMessageDescriptor(type);
+ if (messageDescriptor == null)
+ {
+ return false;
+ }
+
+ // Wrappers and well known types are handled by converters.
+ if (ServiceDescriptorHelpers.IsWrapperType(messageDescriptor))
+ {
+ return false;
+ }
+ if (JsonConverterHelper.WellKnownTypeNames.ContainsKey(messageDescriptor.FullName))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ private JsonPropertyInfo CreatePropertyInfo(JsonTypeInfo typeInfo, string name, FieldDescriptor field, bool isSerializable)
+ {
+ var propertyInfo = typeInfo.CreateJsonPropertyInfo(
+ JsonConverterHelper.GetFieldType(field),
+ name);
+
+ // Properties that don't have this flag set are only used to deserialize incoming JSON.
+ if (isSerializable)
+ {
+ propertyInfo.ShouldSerialize = (o, v) =>
+ {
+ return JsonConverterHelper.ShouldFormatFieldValue((IMessage)o, field, v, !_context.Settings.IgnoreDefaultValues);
+ };
+ propertyInfo.Get = (o) =>
+ {
+ return field.Accessor.GetValue((IMessage)o);
+ };
+ }
+
+ propertyInfo.Set = GetSetMethod(field);
+
+ return propertyInfo;
+ }
+
+ private static Action<object, object?> GetSetMethod(FieldDescriptor field)
+ {
+ if (field.IsMap)
+ {
+ return (o, v) =>
+ {
+ // The serializer creates a collection. Copy contents to collection on read-only property.
+ // An extra collection is being created here that's then thrown away.
+ // This will be removed once S.T.J supports deserializing onto a read-only property.
+ // https://github.com/dotnet/runtime/issues/30258
+ var existingValue = (IDictionary)field.Accessor.GetValue((IMessage)o);
+ foreach (DictionaryEntry item in (IDictionary)v!)
+ {
+ existingValue[item.Key] = item.Value;
+ }
+ };
+ }
+
+ if (field.IsRepeated)
+ {
+ return (o, v) =>
+ {
+ // The serializer creates a collection. Copy contents to collection on read-only property.
+ // An extra collection is being created here that's then thrown away.
+ // This will be removed once S.T.J supports deserializing onto a read-only property.
+ // https://github.com/dotnet/runtime/issues/30258
+ var existingValue = (IList)field.Accessor.GetValue((IMessage)o);
+ foreach (var item in (IList)v!)
+ {
+ existingValue.Add(item);
+ }
+ };
+ }
+
+ if (field.RealContainingOneof != null)
+ {
+ return (o, v) =>
+ {
+ var caseField = field.RealContainingOneof.Accessor.GetCaseFieldDescriptor((IMessage)o);
+ if (caseField != null)
+ {
+ throw new InvalidOperationException($"Multiple values specified for oneof {field.RealContainingOneof.Name}.");
+ }
+
+ field.Accessor.SetValue((IMessage)o, v);
+ };
+ }
+
+ return (o, v) =>
+ {
+ field.Accessor.SetValue((IMessage)o, v);
+ };
+ }
+
+ private static Dictionary<string, FieldDescriptor> CreateJsonFieldMap(IList<FieldDescriptor> fields)
+ {
+ var map = new Dictionary<string, FieldDescriptor>();
+ foreach (var field in fields)
+ {
+ map[field.Name] = field;
+ map[field.JsonName] = field;
+ }
+ return map;
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonRequestHelpers.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonRequestHelpers.cs
index 5666a856a3..3e0c3d4b61 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonRequestHelpers.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonRequestHelpers.cs
@@ -2,9 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections;
+using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.Json;
+using Google.Api;
using Google.Protobuf;
using Google.Protobuf.Reflection;
using Grpc.Core;
@@ -13,6 +15,7 @@ using Grpc.Shared;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
@@ -85,7 +88,7 @@ internal static class JsonRequestHelpers
}
}
- public static async Task SendErrorResponse(HttpResponse response, Encoding encoding, Status status, JsonSerializerOptions options)
+ public static async ValueTask SendErrorResponse(HttpResponse response, Encoding encoding, Status status, JsonSerializerOptions options)
{
if (!response.HasStarted)
{
@@ -100,7 +103,7 @@ internal static class JsonRequestHelpers
Code = (int)status.StatusCode
};
- await WriteResponseMessage(response, encoding, e, options);
+ await WriteResponseMessage(response, encoding, e, options, CancellationToken.None);
}
public static int MapStatusCodeToHttpStatus(StatusCode statusCode)
@@ -147,13 +150,13 @@ internal static class JsonRequestHelpers
return StatusCodes.Status500InternalServerError;
}
- public static async Task WriteResponseMessage(HttpResponse response, Encoding encoding, object responseBody, JsonSerializerOptions options)
+ public static async ValueTask WriteResponseMessage(HttpResponse response, Encoding encoding, object responseBody, JsonSerializerOptions options, CancellationToken cancellationToken)
{
var (stream, usesTranscodingStream) = GetStream(response.Body, encoding);
try
{
- await JsonSerializer.SerializeAsync(stream, responseBody, options);
+ await JsonSerializer.SerializeAsync(stream, responseBody, options, cancellationToken);
}
finally
{
@@ -164,7 +167,7 @@ internal static class JsonRequestHelpers
}
}
- public static async Task<TRequest> ReadMessage<TRequest>(JsonTranscodingServerCallContext serverCallContext, JsonSerializerOptions serializerOptions) where TRequest : class
+ public static async ValueTask<TRequest> ReadMessage<TRequest>(JsonTranscodingServerCallContext serverCallContext, JsonSerializerOptions serializerOptions) where TRequest : class
{
try
{
@@ -173,65 +176,76 @@ internal static class JsonRequestHelpers
IMessage requestMessage;
if (serverCallContext.DescriptorInfo.BodyDescriptor != null)
{
- if (!serverCallContext.IsJsonRequestContent)
+ Type type;
+ object bodyContent;
+
+ if (serverCallContext.DescriptorInfo.BodyDescriptor.FullName == HttpBody.Descriptor.FullName)
{
- GrpcServerLog.UnsupportedRequestContentType(serverCallContext.Logger, serverCallContext.HttpContext.Request.ContentType);
- throw new RpcException(new Status(StatusCode.InvalidArgument, "Request content-type of application/json is required."));
+ type = typeof(HttpBody);
+
+ bodyContent = await ReadHttpBodyAsync(serverCallContext);
}
+ else
+ {
+ if (!serverCallContext.IsJsonRequestContent)
+ {
+ GrpcServerLog.UnsupportedRequestContentType(serverCallContext.Logger, serverCallContext.HttpContext.Request.ContentType);
+ throw new InvalidOperationException($"Unable to read the request as JSON because the request content type '{serverCallContext.HttpContext.Request.ContentType}' is not a known JSON content type.");
+ }
- var (stream, usesTranscodingStream) = GetStream(serverCallContext.HttpContext.Request.Body, serverCallContext.RequestEncoding);
+ var (stream, usesTranscodingStream) = GetStream(serverCallContext.HttpContext.Request.Body, serverCallContext.RequestEncoding);
- try
- {
- if (serverCallContext.DescriptorInfo.BodyDescriptorRepeated)
+ try
{
- requestMessage = (IMessage)Activator.CreateInstance<TRequest>();
+ if (serverCallContext.DescriptorInfo.BodyDescriptorRepeated)
+ {
+ requestMessage = (IMessage)Activator.CreateInstance<TRequest>();
- // TODO: JsonSerializer currently doesn't support deserializing values onto an existing object or collection.
- // Either update this to use new functionality in JsonSerializer or improve work-around perf.
- var type = JsonConverterHelper.GetFieldType(serverCallContext.DescriptorInfo.BodyFieldDescriptors.Last());
- var listType = typeof(List<>).MakeGenericType(type);
+ // TODO: JsonSerializer currently doesn't support deserializing values onto an existing object or collection.
+ // Either update this to use new functionality in JsonSerializer or improve work-around perf.
+ type = JsonConverterHelper.GetFieldType(serverCallContext.DescriptorInfo.BodyFieldDescriptors.Last());
+ type = type.GetGenericArguments()[0];
+ type = typeof(List<>).MakeGenericType(type);
- GrpcServerLog.DeserializingMessage(serverCallContext.Logger, listType);
- var repeatedContent = (IList)(await JsonSerializer.DeserializeAsync(stream, listType, serializerOptions))!;
+ GrpcServerLog.DeserializingMessage(serverCallContext.Logger, type);
- ServiceDescriptorHelpers.RecursiveSetValue(requestMessage, serverCallContext.DescriptorInfo.BodyFieldDescriptors, repeatedContent);
- }
- else
- {
- IMessage bodyContent;
+ bodyContent = (await JsonSerializer.DeserializeAsync(stream, type, serializerOptions))!;
- try
- {
- GrpcServerLog.DeserializingMessage(serverCallContext.Logger, serverCallContext.DescriptorInfo.BodyDescriptor.ClrType);
- bodyContent = (IMessage)(await JsonSerializer.DeserializeAsync(stream, serverCallContext.DescriptorInfo.BodyDescriptor.ClrType, serializerOptions))!;
+ if (bodyContent == null)
+ {
+ throw new InvalidOperationException($"Unable to deserialize null to {type.Name}.");
+ }
}
- catch (JsonException)
- {
- throw new RpcException(new Status(StatusCode.InvalidArgument, "Request JSON payload is not correctly formatted."));
- }
- catch (Exception exception)
+ else
{
- throw new RpcException(new Status(StatusCode.InvalidArgument, exception.Message));
- }
+ type = serverCallContext.DescriptorInfo.BodyDescriptor.ClrType;
- if (serverCallContext.DescriptorInfo.BodyFieldDescriptors != null)
- {
- requestMessage = (IMessage)Activator.CreateInstance<TRequest>();
- ServiceDescriptorHelpers.RecursiveSetValue(requestMessage, serverCallContext.DescriptorInfo.BodyFieldDescriptors, bodyContent!); // TODO - check nullability
+ GrpcServerLog.DeserializingMessage(serverCallContext.Logger, type);
+ bodyContent = (IMessage)(await JsonSerializer.DeserializeAsync(stream, serverCallContext.DescriptorInfo.BodyDescriptor.ClrType, serializerOptions))!;
}
- else
+ }
+ finally
+ {
+ if (usesTranscodingStream)
{
- requestMessage = bodyContent;
+ await stream.DisposeAsync();
}
}
}
- finally
+
+ if (serverCallContext.DescriptorInfo.BodyFieldDescriptors != null)
+ {
+ requestMessage = (IMessage)Activator.CreateInstance<TRequest>();
+ ServiceDescriptorHelpers.RecursiveSetValue(requestMessage, serverCallContext.DescriptorInfo.BodyFieldDescriptors, bodyContent); // TODO - check nullability
+ }
+ else
{
- if (usesTranscodingStream)
+ if (bodyContent == null)
{
- await stream.DisposeAsync();
+ throw new InvalidOperationException($"Unable to deserialize null to {type.Name}.");
}
+
+ requestMessage = (IMessage)bodyContent;
}
}
else
@@ -265,23 +279,72 @@ internal static class JsonRequestHelpers
GrpcServerLog.ReceivedMessage(serverCallContext.Logger);
return (TRequest)requestMessage;
}
+ catch (JsonException ex)
+ {
+ GrpcServerLog.ErrorReadingMessage(serverCallContext.Logger, ex);
+ throw new RpcException(new Status(StatusCode.InvalidArgument, "Request JSON payload is not correctly formatted.", ex));
+ }
catch (Exception ex)
{
GrpcServerLog.ErrorReadingMessage(serverCallContext.Logger, ex);
- throw;
+ throw new RpcException(new Status(StatusCode.InvalidArgument, ex.Message, ex));
+ }
+ }
+
+ private static async ValueTask<IMessage> ReadHttpBodyAsync(JsonTranscodingServerCallContext serverCallContext)
+ {
+ var httpBody = (IMessage)Activator.CreateInstance(serverCallContext.DescriptorInfo.BodyDescriptor!.ClrType)!;
+
+ var contentType = serverCallContext.HttpContext.Request.ContentType;
+ if (contentType != null)
+ {
+ httpBody.Descriptor.Fields[HttpBody.ContentTypeFieldNumber].Accessor.SetValue(httpBody, contentType);
}
+
+ var data = await ReadDataAsync(serverCallContext);
+ httpBody.Descriptor.Fields[HttpBody.DataFieldNumber].Accessor.SetValue(httpBody, UnsafeByteOperations.UnsafeWrap(data));
+
+ return httpBody;
+ }
+
+ private static async ValueTask<byte[]> ReadDataAsync(JsonTranscodingServerCallContext serverCallContext)
+ {
+ // Buffer to disk if content is larger than 30Kb.
+ // Based on value in XmlSerializer and NewtonsoftJson input formatters.
+ const int DefaultMemoryThreshold = 1024 * 30;
+
+ var memoryThreshold = DefaultMemoryThreshold;
+ var contentLength = serverCallContext.HttpContext.Request.ContentLength.GetValueOrDefault();
+ if (contentLength > 0 && contentLength < memoryThreshold)
+ {
+ // If the Content-Length is known and is smaller than the default buffer size, use it.
+ memoryThreshold = (int)contentLength;
+ }
+
+ using var fs = new FileBufferingReadStream(serverCallContext.HttpContext.Request.Body, memoryThreshold);
+
+ // Read the request body into buffer.
+ // No explicit cancellation token. Request body uses underlying request aborted token.
+ await fs.DrainAsync(CancellationToken.None);
+ fs.Seek(0, SeekOrigin.Begin);
+
+ var data = new byte[fs.Length];
+ var read = fs.Read(data);
+ Debug.Assert(read == data.Length);
+
+ return data;
}
private static List<FieldDescriptor>? GetPathDescriptors(JsonTranscodingServerCallContext serverCallContext, IMessage requestMessage, string path)
{
return serverCallContext.DescriptorInfo.PathDescriptorsCache.GetOrAdd(path, p =>
{
- ServiceDescriptorHelpers.TryResolveDescriptors(requestMessage.Descriptor, p, out var pathDescriptors);
+ ServiceDescriptorHelpers.TryResolveDescriptors(requestMessage.Descriptor, p.Split('.'), out var pathDescriptors);
return pathDescriptors;
});
}
- public static async Task SendMessage<TResponse>(JsonTranscodingServerCallContext serverCallContext, JsonSerializerOptions serializerOptions, TResponse message) where TResponse : class
+ public static async ValueTask SendMessage<TResponse>(JsonTranscodingServerCallContext serverCallContext, JsonSerializerOptions serializerOptions, TResponse message, CancellationToken cancellationToken) where TResponse : class
{
var response = serverCallContext.HttpContext.Response;
@@ -304,7 +367,7 @@ internal static class JsonRequestHelpers
responseType = message.GetType();
}
- await JsonRequestHelpers.WriteResponseMessage(response, serverCallContext.RequestEncoding, responseBody, serializerOptions);
+ await JsonRequestHelpers.WriteResponseMessage(response, serverCallContext.RequestEncoding, responseBody, serializerOptions, cancellationToken);
GrpcServerLog.SerializedMessage(serverCallContext.Logger, responseType);
GrpcServerLog.MessageSent(serverCallContext.Logger);
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingRouteAdapter.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingRouteAdapter.cs
new file mode 100644
index 0000000000..af9d3b8dbd
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingRouteAdapter.cs
@@ -0,0 +1,210 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.Linq;
+using Grpc.Shared;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
+
+/// <summary>
+/// Routes on HTTP rule are similar to ASP.NET Core routes but add and remove some features.
+/// - Constraints aren't supported.
+/// - Optional parameters aren't supported.
+/// - Parameters spanning multiple segments are supported.
+///
+/// The purpose of this type is to add support for parameters spanning multiple segments and
+/// anonymous any or catch-all segments. This type transforms an HTTP route into an ASP.NET Core
+/// route by rewritting it to a compatible format and providing actions to reconstruct parameters
+/// that span multiple segments.
+///
+/// For example, consider a multi-segment parameter route:
+/// - Before: /v1/{book.name=shelves/*/books/*}
+/// - After: /v1/shelves/{__Complex_book.name_2}/books/{__Complex_book.name_4}
+///
+/// It is rewritten so that any * or ** segments become ASP.NET Core route parameters. These parameter
+/// names are never used by the user, and instead they're reconstructed into the final value by the
+/// adapter and then added to the HttpRequest.RouteValues collection.
+/// - Request URL: /v1/shelves/example-shelf/books/example-book
+/// - Route parameter: book.name = shelves/example-self/books/example-book
+/// </summary>
+internal sealed class JsonTranscodingRouteAdapter
+{
+ public HttpRoutePattern HttpRoutePattern { get; }
+ public string ResolvedRouteTemplate { get; }
+ public List<Action<HttpContext>> RewriteVariableActions { get; }
+
+ private JsonTranscodingRouteAdapter(HttpRoutePattern httpRoutePattern, string resolvedRoutePattern, List<Action<HttpContext>> rewriteVariableActions)
+ {
+ HttpRoutePattern = httpRoutePattern;
+ ResolvedRouteTemplate = resolvedRoutePattern;
+ RewriteVariableActions = rewriteVariableActions;
+ }
+
+ public static JsonTranscodingRouteAdapter Parse(HttpRoutePattern pattern)
+ {
+ var rewriteActions = new List<Action<HttpContext>>();
+
+ var tempSegments = pattern.Segments.ToList();
+ var i = 0;
+ while (i < tempSegments.Count)
+ {
+ var segmentVariable = GetVariable(pattern, i);
+ if (segmentVariable != null)
+ {
+ var fullPath = string.Join(".", segmentVariable.FieldPath);
+
+ var segmentCount = segmentVariable.EndSegment - segmentVariable.StartSegment;
+ if (segmentCount == 1)
+ {
+ // Single segment parameter. Include in route with its default name.
+ tempSegments[i] = segmentVariable.HasCatchAllPath
+ ? $"{{**{fullPath}}}"
+ : $"{{{fullPath}}}";
+ i++;
+ }
+ else
+ {
+ var routeParameterParts = new List<string>();
+ var routeValueFormatTemplateParts = new List<string>();
+ var variableParts = new List<string>();
+ var haveCatchAll = false;
+ var catchAllSuffix = string.Empty;
+
+ while (i < segmentVariable.EndSegment && !haveCatchAll)
+ {
+ var segment = tempSegments[i];
+ var segmentType = GetSegmentType(segment);
+ switch (segmentType)
+ {
+ case SegmentType.Literal:
+ routeValueFormatTemplateParts.Add(segment);
+ break;
+ case SegmentType.Any:
+ {
+ var parameterName = $"__Complex_{fullPath}_{i}";
+ tempSegments[i] = $"{{{parameterName}}}";
+
+ routeValueFormatTemplateParts.Add($"{{{variableParts.Count}}}");
+ variableParts.Add(parameterName);
+ break;
+ }
+ case SegmentType.CatchAll:
+ {
+ var parameterName = $"__Complex_{fullPath}_{i}";
+ var suffix = string.Join("/", tempSegments.Skip(i + 1));
+ catchAllSuffix = string.Join("/", tempSegments.Skip(i + segmentCount - 1));
+
+ // It's possible to have multiple routes with catch-all parameters that have different suffixes.
+ // For example:
+ // - /{name=v1/**/b}/one
+ // - /{name=v1/**/b}/two
+ // The suffix is added as a route constraint to avoid matching multiple routes to a request.
+ var constraint = suffix.Length > 0 ? $":regex({suffix}$)" : string.Empty;
+ tempSegments[i] = $"{{**{parameterName}{constraint}}}";
+
+ routeValueFormatTemplateParts.Add($"{{{variableParts.Count}}}");
+ variableParts.Add(parameterName);
+ haveCatchAll = true;
+
+ // Remove remaining segments. They have been added in the route constraint.
+ while (i < tempSegments.Count - 1)
+ {
+ tempSegments.RemoveAt(tempSegments.Count - 1);
+ }
+ break;
+ }
+ }
+ i++;
+ }
+
+ var routeValueFormatTemplate = string.Join("/", routeValueFormatTemplateParts);
+
+ // Add an action to reconstruct the multiple segment parameter from ASP.NET Core
+ // request route values. This should be called when the request is received.
+ rewriteActions.Add(context =>
+ {
+ var values = new object?[variableParts.Count];
+ for (var i = 0; i < values.Length; i++)
+ {
+ values[i] = context.Request.RouteValues[variableParts[i]];
+ }
+ var finalValue = string.Format(CultureInfo.InvariantCulture, routeValueFormatTemplate, values);
+
+ // Catch-all route parameter is always the last parameter. The original HTTP pattern could specify a
+ // literal suffix after the catch-all, e.g. /{param=**}/suffix. Because ASP.NET Core routing provides
+ // the entire remainder of the URL in the route value, we must trim the suffix from that route value.
+ if (!string.IsNullOrEmpty(catchAllSuffix))
+ {
+ finalValue = finalValue.Substring(0, finalValue.Length - catchAllSuffix.Length - 1);
+ }
+ context.Request.RouteValues[fullPath] = finalValue;
+ });
+ }
+ }
+ else
+ {
+ // HTTP route can match any value in a segment without a parameter.
+ // For example, v1/*/books. Add a parameter to match this behavior logic.
+ // Parameter value is never used.
+
+ var segmentType = GetSegmentType(tempSegments[i]);
+ switch (segmentType)
+ {
+ case SegmentType.Literal:
+ // Literal is unchanged.
+ break;
+ case SegmentType.Any:
+ // Ignore any segment value.
+ tempSegments[i] = $"{{__Discard_{i}}}";
+ break;
+ case SegmentType.CatchAll:
+ // Ignore remaining segment values.
+ tempSegments[i] = $"{{**__Discard_{i}}}";
+ break;
+ }
+
+ i++;
+ }
+ }
+
+ return new JsonTranscodingRouteAdapter(pattern, "/" + string.Join("/", tempSegments), rewriteActions);
+ }
+
+ private static SegmentType GetSegmentType(string segment)
+ {
+ if (segment.StartsWith("**", StringComparison.Ordinal))
+ {
+ return SegmentType.CatchAll;
+ }
+ else if (segment.StartsWith("*", StringComparison.Ordinal))
+ {
+ return SegmentType.Any;
+ }
+ else
+ {
+ return SegmentType.Literal;
+ }
+ }
+
+ private enum SegmentType
+ {
+ Literal,
+ Any,
+ CatchAll
+ }
+
+ private static HttpRouteVariable? GetVariable(HttpRoutePattern pattern, int i)
+ {
+ foreach (var variable in pattern.Variables)
+ {
+ if (i >= variable.StartSegment && i < variable.EndSegment)
+ {
+ return variable;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpApiServerCallContext.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingServerCallContext.cs
index 69185591e9..c99f446354 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/HttpApiServerCallContext.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/JsonTranscodingServerCallContext.cs
@@ -18,8 +18,7 @@ namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
internal sealed class JsonTranscodingServerCallContext : ServerCallContext, IServerCallContextFeature
{
- // TODO(JamesNK): Remove nullable override after Grpc.Core.Api update
- private static readonly AuthContext UnauthenticatedContext = new AuthContext(null!, new Dictionary<string, List<AuthProperty>>());
+ private static readonly AuthContext UnauthenticatedContext = new AuthContext(null, new Dictionary<string, List<AuthProperty>>());
private readonly IMethod _method;
@@ -168,7 +167,7 @@ internal sealed class JsonTranscodingServerCallContext : ServerCallContext, ISer
protected override Status StatusCore { get; set; }
- protected override WriteOptions WriteOptionsCore
+ protected override WriteOptions? WriteOptionsCore
{
get => throw new NotImplementedException();
set => throw new NotImplementedException();
@@ -191,7 +190,6 @@ internal sealed class JsonTranscodingServerCallContext : ServerCallContext, ISer
}
}
- // TODO(JamesNK): Remove nullable override after Grpc.Core.Api update
protected override IDictionary<object, object> UserStateCore => HttpContext.Items!;
protected override ContextPropagationToken CreatePropagationTokenCore(ContextPropagationOptions? options)
@@ -227,12 +225,12 @@ internal sealed class JsonTranscodingServerCallContext : ServerCallContext, ISer
return HttpContext.Response.BodyWriter.FlushAsync().GetAsTask();
}
- internal void EnsureResponseHeaders()
+ internal void EnsureResponseHeaders(string? contentType = null)
{
if (!HttpContext.Response.HasStarted)
{
HttpContext.Response.StatusCode = StatusCodes.Status200OK;
- HttpContext.Response.ContentType = MediaType.ReplaceEncoding("application/json", RequestEncoding);
+ HttpContext.Response.ContentType = contentType ?? MediaType.ReplaceEncoding("application/json", RequestEncoding);
}
}
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj
index 59e0491a3c..260bb02b3b 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Microsoft.AspNetCore.Grpc.JsonTranscoding.csproj
@@ -3,6 +3,8 @@
<Description>HTTP API for gRPC ASP.NET Core</Description>
<PackageTags>gRPC RPC HTTP/2 REST</PackageTags>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
@@ -21,6 +23,8 @@
<Compile Include="..\Shared\AuthContextHelpers.cs" Link="Internal\Shared\AuthContextHelpers.cs" />
<Compile Include="..\Shared\ServiceDescriptorHelpers.cs" Link="Internal\Shared\ServiceDescriptorHelpers.cs" />
<Compile Include="..\Shared\X509CertificateHelpers.cs" Link="Internal\Shared\X509CertificateHelpers.cs" />
+ <Compile Include="..\Shared\HttpRoutePattern.cs" Link="Internal\Shared\HttpRoutePattern.cs" />
+ <Compile Include="..\Shared\HttpRoutePatternParser.cs" Link="Internal\Shared\HttpRoutePatternParser.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Internal\Shared" />
<Protobuf Include="Internal\Protos\errors.proto" Access="Internal" />
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/PublicAPI.Unshipped.txt b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/PublicAPI.Unshipped.txt
index 6ec9d5a61a..d448a37e8e 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/PublicAPI.Unshipped.txt
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/PublicAPI.Unshipped.txt
@@ -20,5 +20,5 @@ Microsoft.AspNetCore.Grpc.JsonTranscoding.GrpcJsonTranscodingOptions.JsonSetting
Microsoft.AspNetCore.Grpc.JsonTranscoding.GrpcJsonTranscodingOptions.TypeRegistry.get -> Google.Protobuf.Reflection.TypeRegistry!
Microsoft.AspNetCore.Grpc.JsonTranscoding.GrpcJsonTranscodingOptions.TypeRegistry.set -> void
Microsoft.Extensions.DependencyInjection.GrpcJsonTranscodingServiceExtensions
-static Microsoft.Extensions.DependencyInjection.GrpcJsonTranscodingServiceExtensions.AddJsonTranscoding(this Grpc.AspNetCore.Server.IGrpcServerBuilder! grpcBuilder) -> Grpc.AspNetCore.Server.IGrpcServerBuilder!
-static Microsoft.Extensions.DependencyInjection.GrpcJsonTranscodingServiceExtensions.AddJsonTranscoding(this Grpc.AspNetCore.Server.IGrpcServerBuilder! grpcBuilder, System.Action<Microsoft.AspNetCore.Grpc.JsonTranscoding.GrpcJsonTranscodingOptions!>! configureOptions) -> Grpc.AspNetCore.Server.IGrpcServerBuilder!
+static Microsoft.Extensions.DependencyInjection.GrpcJsonTranscodingServiceExtensions.AddJsonTranscoding(this Grpc.AspNetCore.Server.IGrpcServerBuilder! builder) -> Grpc.AspNetCore.Server.IGrpcServerBuilder!
+static Microsoft.Extensions.DependencyInjection.GrpcJsonTranscodingServiceExtensions.AddJsonTranscoding(this Grpc.AspNetCore.Server.IGrpcServerBuilder! builder, System.Action<Microsoft.AspNetCore.Grpc.JsonTranscoding.GrpcJsonTranscodingOptions!>! configureOptions) -> Grpc.AspNetCore.Server.IGrpcServerBuilder!
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs
index 44f24666b7..71eeb18548 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/GrpcSwaggerServiceExtensions.cs
@@ -57,7 +57,7 @@ public static class GrpcSwaggerServiceExtensions
}
// Dummy type that is only used if MVC is not registered in the app
- private class EmptyActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
+ private sealed class EmptyActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
{
public ActionDescriptorCollection ActionDescriptors { get; } = new ActionDescriptorCollection(new List<ActionDescriptor>(), 1);
}
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs
index ced27c48f2..5a279db2ae 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcDataContractResolver.cs
@@ -12,7 +12,7 @@ using Type = System.Type;
namespace Microsoft.AspNetCore.Grpc.Swagger.Internal;
-internal class GrpcDataContractResolver : ISerializerDataContractResolver
+internal sealed class GrpcDataContractResolver : ISerializerDataContractResolver
{
private readonly ISerializerDataContractResolver _innerContractResolver;
private readonly Dictionary<Type, MessageDescriptor> _messageTypeMapping;
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcHttpApiDescriptionProvider.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs
index 1cc787de88..cff40e9d68 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcHttpApiDescriptionProvider.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs
@@ -84,7 +84,8 @@ internal sealed class GrpcJsonTranscodingDescriptionProvider : IApiDescriptionPr
}
var methodMetadata = routeEndpoint.Metadata.GetMetadata<GrpcMethodMetadata>()!;
- var routeParameters = ServiceDescriptorHelpers.ResolveRouteParameterDescriptors(routeEndpoint.RoutePattern, methodDescriptor.InputType);
+ var httpRoutePattern = HttpRoutePattern.Parse(pattern);
+ var routeParameters = ServiceDescriptorHelpers.ResolveRouteParameterDescriptors(httpRoutePattern.Variables.Select(v => v.FieldPath).ToList(), methodDescriptor.InputType);
foreach (var routeParameter in routeParameters)
{
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs
index 75d260fca4..243d39fbde 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcModelMetadata.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
namespace Microsoft.AspNetCore.Grpc.Swagger.Internal;
-internal class GrpcModelMetadata : ModelMetadata
+internal sealed class GrpcModelMetadata : ModelMetadata
{
public GrpcModelMetadata(ModelMetadataIdentity identity) : base(identity)
{
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsDocumentFilter.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsDocumentFilter.cs
index 4e14029e6f..c374ed0be3 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsDocumentFilter.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsDocumentFilter.cs
@@ -11,7 +11,7 @@ using Swashbuckle.AspNetCore.SwaggerGen;
namespace Microsoft.AspNetCore.Grpc.Swagger.Internal.XmlComments;
-internal class GrpcXmlCommentsDocumentFilter : IDocumentFilter
+internal sealed class GrpcXmlCommentsDocumentFilter : IDocumentFilter
{
private const string MemberXPath = "/doc/members/member[@name='{0}']";
private const string SummaryTag = "summary";
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsOperationFilter.cs b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsOperationFilter.cs
index ea6a8c1f47..e120533e70 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsOperationFilter.cs
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/XmlComments/GrpcXmlCommentsOperationFilter.cs
@@ -10,7 +10,7 @@ using Swashbuckle.AspNetCore.SwaggerGen;
namespace Microsoft.AspNetCore.Grpc.Swagger.Internal.XmlComments;
-internal class GrpcXmlCommentsOperationFilter : IOperationFilter
+internal sealed class GrpcXmlCommentsOperationFilter : IOperationFilter
{
private readonly XPathNavigator _xmlNavigator;
diff --git a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Microsoft.AspNetCore.Grpc.Swagger.csproj b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Microsoft.AspNetCore.Grpc.Swagger.csproj
index 4ad6d024b9..f102223658 100644
--- a/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Microsoft.AspNetCore.Grpc.Swagger.csproj
+++ b/src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Microsoft.AspNetCore.Grpc.Swagger.csproj
@@ -11,6 +11,8 @@
<InternalsVisibleTo Include="Microsoft.AspNetCore.Grpc.Swagger.Tests" />
<Compile Include="..\Shared\ServiceDescriptorHelpers.cs" Link="Internal\Shared\ServiceDescriptorHelpers.cs" />
+ <Compile Include="..\Shared\HttpRoutePattern.cs" Link="Internal\Shared\HttpRoutePattern.cs" />
+ <Compile Include="..\Shared\HttpRoutePatternParser.cs" Link="Internal\Shared\HttpRoutePatternParser.cs" />
<Reference Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" />
<Reference Include="Swashbuckle.AspNetCore" />
diff --git a/src/Grpc/JsonTranscoding/src/Shared/AuthContextHelpers.cs b/src/Grpc/JsonTranscoding/src/Shared/AuthContextHelpers.cs
index fd266688ea..1f3caa1e4d 100644
--- a/src/Grpc/JsonTranscoding/src/Shared/AuthContextHelpers.cs
+++ b/src/Grpc/JsonTranscoding/src/Shared/AuthContextHelpers.cs
@@ -54,8 +54,7 @@ internal static class AuthContextHelpers
}
}
- // TODO(JamesNK): Remove nullable override after Grpc.Core.Api update
- return new AuthContext(peerIdentityPropertyName!, properties);
+ return new AuthContext(peerIdentityPropertyName, properties);
static void AddProperty(Dictionary<string, List<AuthProperty>> properties, string name, string value)
{
diff --git a/src/Grpc/JsonTranscoding/src/Shared/HttpRoutePattern.cs b/src/Grpc/JsonTranscoding/src/Shared/HttpRoutePattern.cs
new file mode 100644
index 0000000000..0110856608
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/src/Shared/HttpRoutePattern.cs
@@ -0,0 +1,35 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Grpc.Shared;
+
+internal sealed class HttpRoutePattern
+{
+ public List<string> Segments { get; }
+ public string? Verb { get; }
+ public List<HttpRouteVariable> Variables { get; }
+
+ private HttpRoutePattern(List<string> segments, string? verb, List<HttpRouteVariable> variables)
+ {
+ Segments = segments;
+ Verb = verb;
+ Variables = variables;
+ }
+
+ public static HttpRoutePattern Parse(string pattern)
+ {
+ var p = new HttpRoutePatternParser(pattern);
+ p.Parse();
+
+ return new HttpRoutePattern(p.Segments, p.Verb, p.Variables);
+ }
+}
+
+internal sealed class HttpRouteVariable
+{
+ public int Index { get; set; }
+ public int StartSegment { get; set; }
+ public int EndSegment { get; set; }
+ public List<string> FieldPath { get; } = new List<string>();
+ public bool HasCatchAllPath { get; set; }
+}
diff --git a/src/Grpc/JsonTranscoding/src/Shared/HttpRoutePatternParser.cs b/src/Grpc/JsonTranscoding/src/Shared/HttpRoutePatternParser.cs
new file mode 100644
index 0000000000..d32e4d863e
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/src/Shared/HttpRoutePatternParser.cs
@@ -0,0 +1,349 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+
+namespace Grpc.Shared;
+
+// HTTP Template Grammar:
+//
+// Template = "/" | "/" Segments [ Verb ] ;
+// Segments = Segment { "/" Segment } ;
+// Segment = "*" | "**" | LITERAL | Variable ;
+// Variable = "{" FieldPath [ "=" Segments ] "}" ;
+// FieldPath = IDENT { "." IDENT } ;
+// Verb = ":" LITERAL ;
+internal class HttpRoutePatternParser
+{
+ private readonly string _input;
+
+ // Token delimiter indexes
+ private int _tokenStart;
+ private int _tokenEnd;
+
+ private bool _inVariable;
+
+ private readonly List<string> _segments;
+ private string? _verb;
+ private readonly List<HttpRouteVariable> _variables;
+ private bool _hasCatchAllSegment;
+
+ public List<string> Segments => _segments;
+ public string? Verb => _verb;
+ public List<HttpRouteVariable> Variables => _variables;
+
+ public HttpRoutePatternParser(string input)
+ {
+ _input = input;
+ _segments = new List<string>();
+ _variables = new List<HttpRouteVariable>();
+ }
+
+ public void Parse()
+ {
+ try
+ {
+ ParseTemplate();
+
+ if (_tokenStart < _input.Length)
+ {
+ throw new InvalidOperationException("Path template wasn't parsed to the end.");
+ }
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidOperationException($"Error parsing path template '{_input}'.", ex);
+ }
+ }
+
+ // Template = "/" Segments [ Verb ] ;
+ private void ParseTemplate()
+ {
+ if (!Consume('/'))
+ {
+ throw new InvalidOperationException("Path template must start with a '/'.");
+ }
+ ParseSegments();
+
+ if (EnsureCurrent())
+ {
+ if (CurrentChar != ':')
+ {
+ throw new InvalidOperationException("Path segment must end with a '/'.");
+ }
+ ParseVerb();
+ }
+ }
+
+ // Segments = Segment { "/" Segment } ;
+ private void ParseSegments()
+ {
+ while (true)
+ {
+ if (!ParseSegment())
+ {
+ // Support '/' template.
+ if (_segments.Count > 0)
+ {
+ throw new InvalidOperationException("Route template shouldn't end with a '/'.");
+ }
+ }
+ if (!Consume('/'))
+ {
+ break;
+ }
+ }
+ }
+
+ // Segment = "*" | "**" | LITERAL | Variable ;
+ private bool ParseSegment()
+ {
+ if (!EnsureCurrent())
+ {
+ return false;
+ }
+ switch (CurrentChar)
+ {
+ case '*':
+ {
+ if (_hasCatchAllSegment)
+ {
+ throw new InvalidOperationException("Only literal segments can follow a catch-all segment.");
+ }
+
+ ConsumeAndAssert('*');
+
+ // Check for '**'
+ if (Consume('*'))
+ {
+ _segments.Add("**");
+ _hasCatchAllSegment = true;
+ if (_inVariable)
+ {
+ CurrentVariable.HasCatchAllPath = true;
+ }
+ return true;
+ }
+ else
+ {
+ _segments.Add("*");
+ return true;
+ }
+ }
+
+ case '{':
+ if (_hasCatchAllSegment)
+ {
+ throw new InvalidOperationException("Only literal segments can follow a catch-all segment.");
+ }
+
+ ParseVariable();
+ return true;
+ default:
+ ParseLiteralSegment();
+ return true;
+ }
+ }
+
+ // Variable = "{" FieldPath [ "=" Segments ] "}" ;
+ private void ParseVariable()
+ {
+ ConsumeAndAssert('{');
+ StartVariable();
+ ParseFieldPath();
+ if (Consume('='))
+ {
+ ParseSegments();
+ }
+ else
+ {
+ _segments.Add("*");
+ }
+ EndVariable();
+ ConsumeAndAssert('}');
+ }
+
+ private void ParseLiteralSegment()
+ {
+ if (!TryParseLiteral(out var literal))
+ {
+ throw new InvalidOperationException("Empty literal segment.");
+ }
+ _segments.Add(literal);
+ }
+
+ // FieldPath = IDENT { "." IDENT } ;
+ private void ParseFieldPath()
+ {
+ do
+ {
+ if (!ParseIdentifier())
+ {
+ throw new InvalidOperationException("Incomplete or empty field path.");
+ }
+ }
+ while (Consume('.'));
+ }
+
+ // Verb = ":" LITERAL ;
+ private void ParseVerb()
+ {
+ ConsumeAndAssert(':');
+ if (!TryParseLiteral(out _verb))
+ {
+ throw new InvalidOperationException("Empty verb.");
+ }
+ }
+
+ private bool ParseIdentifier()
+ {
+ var identifier = string.Empty;
+ var hasEndChar = false;
+
+ while (!hasEndChar && NextChar())
+ {
+ var c = CurrentChar;
+ switch (c)
+ {
+ case '.':
+ case '}':
+ case '=':
+ hasEndChar = true;
+ break;
+ default:
+ Consume(c);
+ identifier += c;
+ break;
+ }
+ }
+
+ if (string.IsNullOrEmpty(identifier))
+ {
+ return false;
+ }
+
+ CurrentVariable.FieldPath.Add(identifier);
+ return true;
+ }
+
+ private bool TryParseLiteral([NotNullWhen(true)] out string? literal)
+ {
+ literal = null;
+
+ if (!EnsureCurrent())
+ {
+ return false;
+ }
+
+ // Initialize to false in case we encounter an empty literal.
+ var result = false;
+
+ while (true)
+ {
+ var c = CurrentChar;
+ switch (c)
+ {
+ case '/':
+ case ':':
+ case '}':
+ if (!result)
+ {
+ throw new InvalidOperationException("Path template has an empty segment.");
+ }
+ return result;
+ default:
+ Consume(c);
+ literal += c;
+ break;
+ }
+
+ result = true;
+
+ if (!NextChar())
+ {
+ break;
+ }
+ }
+
+ return result;
+ }
+
+ private void ConsumeAndAssert(char? c)
+ {
+ if (!Consume(c))
+ {
+ throw new InvalidOperationException($"Expected '{c}' when parsing path template.");
+ }
+ }
+
+ private bool Consume(char? c)
+ {
+ if (!EnsureCurrent())
+ {
+ return false;
+ }
+ if (CurrentChar != c)
+ {
+ return false;
+ }
+ _tokenStart++;
+ return true;
+ }
+
+ private bool EnsureCurrent() => _tokenStart < _tokenEnd || NextChar();
+
+ private bool NextChar()
+ {
+ if (_tokenEnd < _input.Length)
+ {
+ _tokenEnd++;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ private char? CurrentChar => _tokenStart < _tokenEnd && _tokenEnd <= _input.Length ? _input[_tokenEnd - 1] : null;
+
+ private HttpRouteVariable CurrentVariable
+ {
+ get
+ {
+ if (!_inVariable || _variables.LastOrDefault() is not HttpRouteVariable variable)
+ {
+ throw new InvalidOperationException("Unexpected error when updating variable.");
+ }
+
+ return variable;
+ }
+
+ }
+
+ private void StartVariable()
+ {
+ if (_inVariable)
+ {
+ throw new InvalidOperationException("Variable can't be nested.");
+ }
+
+ _variables.Add(new HttpRouteVariable());
+ _inVariable = true;
+ CurrentVariable.StartSegment = _segments.Count;
+ CurrentVariable.HasCatchAllPath = false;
+ }
+
+ private void EndVariable()
+ {
+ CurrentVariable.EndSegment = _segments.Count;
+
+ Debug.Assert(CurrentVariable.FieldPath.Any());
+ Debug.Assert(CurrentVariable.StartSegment < CurrentVariable.EndSegment);
+ Debug.Assert(CurrentVariable.EndSegment <= _segments.Count);
+
+ _inVariable = false;
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/src/Shared/Server/InterceptorPipelineBuilder.cs b/src/Grpc/JsonTranscoding/src/Shared/Server/InterceptorPipelineBuilder.cs
index 180ca91943..ccea9f1ea5 100644
--- a/src/Grpc/JsonTranscoding/src/Shared/Server/InterceptorPipelineBuilder.cs
+++ b/src/Grpc/JsonTranscoding/src/Shared/Server/InterceptorPipelineBuilder.cs
@@ -24,7 +24,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Grpc.Shared.Server;
-internal class InterceptorPipelineBuilder<TRequest, TResponse>
+internal sealed class InterceptorPipelineBuilder<TRequest, TResponse>
where TRequest : class
where TResponse : class
{
@@ -160,7 +160,7 @@ internal class InterceptorPipelineBuilder<TRequest, TResponse>
return interceptorHandle;
}
- private class InterceptorActivatorHandle
+ private sealed class InterceptorActivatorHandle
{
public InterceptorRegistration Registration { get; }
diff --git a/src/Grpc/JsonTranscoding/src/Shared/ServiceDescriptorHelpers.cs b/src/Grpc/JsonTranscoding/src/Shared/ServiceDescriptorHelpers.cs
index 41b4afbe28..07b68b74d6 100644
--- a/src/Grpc/JsonTranscoding/src/Shared/ServiceDescriptorHelpers.cs
+++ b/src/Grpc/JsonTranscoding/src/Shared/ServiceDescriptorHelpers.cs
@@ -24,8 +24,12 @@ using System.Reflection;
using Google.Api;
using Google.Protobuf;
using Google.Protobuf.Reflection;
+using Google.Protobuf.WellKnownTypes;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.Extensions.Primitives;
+using Type = System.Type;
namespace Grpc.Shared;
@@ -62,28 +66,13 @@ internal static class ServiceDescriptorHelpers
throw new InvalidOperationException($"Get not find Descriptor property on {serviceReflectionType.Name}.");
}
- public static bool TryResolveDescriptors(MessageDescriptor messageDescriptor, string variable, [NotNullWhen(true)]out List<FieldDescriptor>? fieldDescriptors)
+ public static bool TryResolveDescriptors(MessageDescriptor messageDescriptor, IList<string> path, [NotNullWhen(true)]out List<FieldDescriptor>? fieldDescriptors)
{
fieldDescriptors = null;
- var path = variable.AsSpan();
MessageDescriptor? currentDescriptor = messageDescriptor;
- while (path.Length > 0)
+ foreach (var fieldName in path)
{
- var separator = path.IndexOf('.');
-
- string fieldName;
- if (separator != -1)
- {
- fieldName = path.Slice(0, separator).ToString();
- path = path.Slice(separator + 1);
- }
- else
- {
- fieldName = path.ToString();
- path = ReadOnlySpan<char>.Empty;
- }
-
var field = currentDescriptor?.FindFieldByName(fieldName);
if (field == null)
{
@@ -105,7 +94,6 @@ internal static class ServiceDescriptorHelpers
{
currentDescriptor = null;
}
-
}
return fieldDescriptors != null;
@@ -165,6 +153,11 @@ internal static class ServiceDescriptorHelpers
case FieldType.Message:
if (IsWrapperType(descriptor.MessageType))
{
+ if (value == null)
+ {
+ return null;
+ }
+
return ConvertValue(value, descriptor.MessageType.FindFieldByName("value"));
}
break;
@@ -219,7 +212,17 @@ internal static class ServiceDescriptorHelpers
}
else if (values is IMessage message)
{
- field.Accessor.SetValue(currentValue, message);
+ if (IsWrapperType(message.Descriptor))
+ {
+ const int WrapperValueFieldNumber = Int32Value.ValueFieldNumber;
+
+ var wrappedValue = message.Descriptor.Fields[WrapperValueFieldNumber].Accessor.GetValue(message);
+ field.Accessor.SetValue(currentValue, wrappedValue);
+ }
+ else
+ {
+ field.Accessor.SetValue(currentValue, message);
+ }
}
else
{
@@ -285,17 +288,18 @@ internal static class ServiceDescriptorHelpers
}
}
- public static Dictionary<string, List<FieldDescriptor>> ResolveRouteParameterDescriptors(RoutePattern pattern, MessageDescriptor messageDescriptor)
+ public static Dictionary<string, List<FieldDescriptor>> ResolveRouteParameterDescriptors(List<List<string>> parameters, MessageDescriptor messageDescriptor)
{
var routeParameterDescriptors = new Dictionary<string, List<FieldDescriptor>>(StringComparer.Ordinal);
- foreach (var routeParameter in pattern.Parameters)
+ foreach (var routeParameter in parameters)
{
- if (!TryResolveDescriptors(messageDescriptor, routeParameter.Name, out var fieldDescriptors))
+ var completeFieldPath = string.Join(".", routeParameter);
+ if (!TryResolveDescriptors(messageDescriptor, routeParameter, out var fieldDescriptors))
{
- throw new InvalidOperationException($"Couldn't find matching field for route parameter '{routeParameter.Name}' on {messageDescriptor.Name}.");
+ throw new InvalidOperationException($"Couldn't find matching field for route parameter '{completeFieldPath}' on {messageDescriptor.Name}.");
}
- routeParameterDescriptors.Add(routeParameter.Name, fieldDescriptors);
+ routeParameterDescriptors.Add(completeFieldPath, fieldDescriptors);
}
return routeParameterDescriptors;
@@ -307,7 +311,8 @@ internal static class ServiceDescriptorHelpers
{
if (!string.Equals(body, "*", StringComparison.Ordinal))
{
- if (!TryResolveDescriptors(methodDescriptor.InputType, body, out var bodyFieldDescriptors))
+ var bodyFieldPath = body.Split('.');
+ if (!TryResolveDescriptors(methodDescriptor.InputType, bodyFieldPath, out var bodyFieldDescriptors))
{
throw new InvalidOperationException($"Couldn't find matching field for body '{body}' on {methodDescriptor.InputType.Name}.");
}
@@ -342,7 +347,7 @@ internal static class ServiceDescriptorHelpers
return null;
}
- public record BodyDescriptorInfo(
+ public sealed record BodyDescriptorInfo(
MessageDescriptor Descriptor,
List<FieldDescriptor>? FieldDescriptors,
bool IsDescriptorRepeated,
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TaskExtensions.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TaskExtensions.cs
deleted file mode 100644
index 82c154488c..0000000000
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TaskExtensions.cs
+++ /dev/null
@@ -1,158 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics;
-using System.Runtime.CompilerServices;
-
-namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.Infrastructure;
-
-internal static class TaskExtensions
-{
-#if NET472
- // Allow AsTask in tests where the Task/ValueTask is already a task.
- public static Task<T> AsTask<T>(this Task<T> task)
- {
- return task;
- }
-
- public static Task AsTask(this Task task)
- {
- return task;
- }
-#endif
-
- public static Task<T> DefaultTimeout<T>(this Task<T> task,
- [CallerFilePath] string? filePath = null,
- [CallerLineNumber] int lineNumber = default)
- {
- return task.TimeoutAfter(TimeSpan.FromSeconds(5), filePath, lineNumber);
- }
-
- public static Task DefaultTimeout(this Task task,
- [CallerFilePath] string? filePath = null,
- [CallerLineNumber] int lineNumber = default)
- {
- return task.TimeoutAfter(TimeSpan.FromSeconds(5), filePath, lineNumber);
- }
-
- public static async Task<T> TimeoutAfter<T>(this Task<T> task, TimeSpan timeout,
- [CallerFilePath] string? filePath = null,
- [CallerLineNumber] int lineNumber = default)
- {
- // Don't create a timer if the task is already completed
- // or the debugger is attached
- if (task.IsCompleted || Debugger.IsAttached)
- {
- return await task;
- }
-
- var cts = new CancellationTokenSource();
- if (task == await Task.WhenAny(task, Task.Delay(timeout, cts.Token)))
- {
- cts.Cancel();
- return await task;
- }
- else
- {
- throw new TimeoutException(CreateMessage(timeout, filePath, lineNumber));
- }
- }
-
- public static async Task TimeoutAfter(this Task task, TimeSpan timeout,
- [CallerFilePath] string? filePath = null,
- [CallerLineNumber] int lineNumber = default)
- {
- // Don't create a timer if the task is already completed
- // or the debugger is attached
- if (task.IsCompleted || Debugger.IsAttached)
- {
- await task;
- return;
- }
-
- var cts = new CancellationTokenSource();
- if (task == await Task.WhenAny(task, Task.Delay(timeout, cts.Token)))
- {
- cts.Cancel();
- await task;
- }
- else
- {
- throw new TimeoutException(CreateMessage(timeout, filePath, lineNumber));
- }
- }
-
- private static string CreateMessage(TimeSpan timeout, string? filePath, int lineNumber)
- => string.IsNullOrEmpty(filePath)
- ? $"The operation timed out after reaching the limit of {timeout.TotalMilliseconds}ms."
- : $"The operation at {filePath}:{lineNumber} timed out after reaching the limit of {timeout.TotalMilliseconds}ms.";
-
-#if !NET472
- public static IAsyncEnumerable<T> DefaultTimeout<T>(this IAsyncEnumerable<T> enumerable,
- [CallerFilePath] string? filePath = null,
- [CallerLineNumber] int lineNumber = default)
- {
- return enumerable.TimeoutAfter(TimeSpan.FromSeconds(5), filePath, lineNumber);
- }
-
- public static IAsyncEnumerable<T> TimeoutAfter<T>(this IAsyncEnumerable<T> enumerable, TimeSpan timeout,
- [CallerFilePath] string? filePath = null,
- [CallerLineNumber] int lineNumber = default)
- {
- return new TimeoutAsyncEnumerable<T>(enumerable, timeout, filePath, lineNumber);
- }
-
- private class TimeoutAsyncEnumerable<T> : IAsyncEnumerable<T>
- {
- private readonly IAsyncEnumerable<T> _inner;
- private readonly TimeSpan _timeout;
- private readonly string? _filePath;
- private readonly int _lineNumber;
-
- public TimeoutAsyncEnumerable(IAsyncEnumerable<T> inner, TimeSpan timeout, string? filePath, int lineNumber)
- {
- _inner = inner;
- _timeout = timeout;
- _filePath = filePath;
- _lineNumber = lineNumber;
- }
-
- public IAsyncEnumerator<T> GetAsyncEnumerator(CancellationToken cancellationToken = default)
- {
- return new TimeoutAsyncEnumerator<T>(
- _inner.GetAsyncEnumerator(cancellationToken),
- _timeout,
- _filePath,
- _lineNumber);
- }
- }
-
- private class TimeoutAsyncEnumerator<T> : IAsyncEnumerator<T>
- {
- private readonly IAsyncEnumerator<T> _enumerator;
- private readonly TimeSpan _timeout;
- private readonly string? _filePath;
- private readonly int _lineNumber;
-
- public TimeoutAsyncEnumerator(IAsyncEnumerator<T> enumerator, TimeSpan timeout, string? filePath, int lineNumber)
- {
- _enumerator = enumerator;
- _timeout = timeout;
- _filePath = filePath;
- _lineNumber = lineNumber;
- }
-
- public T Current => _enumerator.Current;
-
- public ValueTask DisposeAsync()
- {
- return _enumerator.DisposeAsync();
- }
-
- public ValueTask<bool> MoveNextAsync()
- {
- return new ValueTask<bool>(_enumerator.MoveNextAsync().AsTask().TimeoutAfter(_timeout, _filePath, _lineNumber));
- }
- }
-#endif
-}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TestHelpers.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TestHelpers.cs
index c2319e38bf..adc3c9e111 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TestHelpers.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/Infrastructure/TestHelpers.cs
@@ -5,6 +5,8 @@ using System.Net;
using Google.Protobuf.Reflection;
using Grpc.AspNetCore.Server;
using Grpc.Core.Interceptors;
+using Grpc.Shared;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.CallHandlers;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
@@ -67,6 +69,7 @@ internal static class TestHelpers
bodyDescriptor,
bodyDescriptorRepeated ?? false,
bodyFieldDescriptors,
- routeParameterDescriptors ?? new Dictionary<string, List<FieldDescriptor>>());
+ routeParameterDescriptors ?? new Dictionary<string, List<FieldDescriptor>>(),
+ JsonTranscodingRouteAdapter.Parse(HttpRoutePattern.Parse("/")));
}
}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/RouteTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/RouteTests.cs
new file mode 100644
index 0000000000..6ccaeffd65
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/RouteTests.cs
@@ -0,0 +1,108 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using System.Net.Http.Headers;
+using System.Text;
+using System.Text.Json;
+using Grpc.Core;
+using IntegrationTestsWebsite;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests.Infrastructure;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.Infrastructure;
+using Microsoft.AspNetCore.Testing;
+using Xunit.Abstractions;
+
+namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests;
+
+public class RouteTests : IntegrationTestBase
+{
+ public RouteTests(GrpcTestFixture<Startup> fixture, ITestOutputHelper outputHelper)
+ : base(fixture, outputHelper)
+ {
+ }
+
+ [Fact]
+ public async Task ComplexParameter_MatchUrl_SuccessResult()
+ {
+ // Arrange
+ Task<HelloReply> UnaryMethod(HelloRequest request, ServerCallContext context)
+ {
+ return Task.FromResult(new HelloReply { Message = $"Hello {request.Name}!" });
+ }
+ var method = Fixture.DynamicGrpc.AddUnaryMethod<HelloRequest, HelloReply>(
+ UnaryMethod,
+ Greeter.Descriptor.FindMethodByName("SayHelloComplex"));
+
+ var client = new HttpClient(Fixture.Handler) { BaseAddress = new Uri("http://localhost") };
+
+ // Act
+ var response = await client.GetAsync("/v1/greeter/from/test").DefaultTimeout();
+ var responseStream = await response.Content.ReadAsStreamAsync();
+ using var result = await JsonDocument.ParseAsync(responseStream);
+
+ // Assert
+ Assert.Equal("Hello from/test!", result.RootElement.GetProperty("message").GetString());
+ }
+
+ [Fact]
+ public async Task MultipleComplexCatchAll_MatchUrl_SuccessResult()
+ {
+ // Arrange
+ Task<HelloReply> UnaryMethod1(HelloRequest request, ServerCallContext context)
+ {
+ return Task.FromResult(new HelloReply { Message = $"One - Hello {request.Name}!" });
+ }
+ Task<HelloReply> UnaryMethod2(HelloRequest request, ServerCallContext context)
+ {
+ return Task.FromResult(new HelloReply { Message = $"Two - Hello {request.Name}!" });
+ }
+ var method1 = Fixture.DynamicGrpc.AddUnaryMethod<HelloRequest, HelloReply>(
+ UnaryMethod1,
+ Greeter.Descriptor.FindMethodByName("SayHelloComplexCatchAll1"));
+ var method2 = Fixture.DynamicGrpc.AddUnaryMethod<HelloRequest, HelloReply>(
+ UnaryMethod2,
+ Greeter.Descriptor.FindMethodByName("SayHelloComplexCatchAll2"));
+
+ var client = new HttpClient(Fixture.Handler) { BaseAddress = new Uri("http://localhost") };
+
+ // Act 1
+ var response1 = await client.GetAsync("/v1/greeter/test1/b/c/d/one").DefaultTimeout();
+ var responseStream1 = await response1.Content.ReadAsStreamAsync();
+ using var result1 = await JsonDocument.ParseAsync(responseStream1);
+
+ // Assert 1
+ Assert.Equal("One - Hello v1/greeter/test1/b/c!", result1.RootElement.GetProperty("message").GetString());
+
+ // Act 2
+ var response2 = await client.GetAsync("/v1/greeter/test2/b/c/d/two").DefaultTimeout();
+ var responseStream2 = await response2.Content.ReadAsStreamAsync();
+ using var result2 = await JsonDocument.ParseAsync(responseStream2);
+
+ // Assert 2
+ Assert.Equal("Two - Hello v1/greeter/test2/b/c!", result2.RootElement.GetProperty("message").GetString());
+ }
+
+ [Fact]
+ public async Task ComplexCatchAllParameter_NestedField_MatchUrl_SuccessResult()
+ {
+ // Arrange
+ Task<HelloReply> UnaryMethod(ComplextHelloRequest request, ServerCallContext context)
+ {
+ return Task.FromResult(new HelloReply { Message = $"Hello {request.Name.FirstName} {request.Name.LastName}!" });
+ }
+ var method = Fixture.DynamicGrpc.AddUnaryMethod<ComplextHelloRequest, HelloReply>(
+ UnaryMethod,
+ Greeter.Descriptor.FindMethodByName("SayHelloComplexCatchAll3"));
+
+ var client = new HttpClient(Fixture.Handler) { BaseAddress = new Uri("http://localhost") };
+
+ // Act
+ var response = await client.GetAsync("/v1/last_name/complex_greeter/test2/b/c/d/two").DefaultTimeout();
+ var responseStream = await response.Content.ReadAsStreamAsync();
+ using var result = await JsonDocument.ParseAsync(responseStream);
+
+ // Assert
+ Assert.Equal("Hello complex_greeter/test2/b last_name!", result.RootElement.GetProperty("message").GetString());
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/ServerStreamingTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/ServerStreamingTests.cs
index d58d49fd79..b557b3d56f 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/ServerStreamingTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/ServerStreamingTests.cs
@@ -7,6 +7,7 @@ using Grpc.Core;
using IntegrationTestsWebsite;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests.Infrastructure;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.Infrastructure;
+using Microsoft.AspNetCore.Testing;
using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests;
@@ -77,4 +78,37 @@ public class ServerStreamingTests : IntegrationTestBase
// Assert 2
Assert.Equal("Hello test 2!", result2.RootElement.GetProperty("message").GetString());
}
+
+ [Fact]
+ public async Task GetWithRouteParameter_WriteMultiple_CancellationBefore_CallCanceled()
+ {
+ // Arrange
+ var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ async Task ServerStreamingMethod(HelloRequest request, IServerStreamWriter<HelloReply> writer, ServerCallContext context)
+ {
+ await writer.WriteAsync(new HelloReply { Message = $"Hello {request.Name} 1!" });
+ await tcs.Task;
+ await writer.WriteAsync(new HelloReply { Message = $"Hello {request.Name} 2!" }, new CancellationToken(canceled: true));
+ }
+ var method = Fixture.DynamicGrpc.AddServerStreamingMethod<HelloRequest, HelloReply>(
+ ServerStreamingMethod,
+ Greeter.Descriptor.FindMethodByName("SayHello"));
+
+ var client = new HttpClient(Fixture.Handler) { BaseAddress = new Uri("http://localhost") };
+
+ // Act 1
+ var response = await client.GetAsync("/v1/greeter/test", HttpCompletionOption.ResponseHeadersRead).DefaultTimeout();
+ var responseStream = await response.Content.ReadAsStreamAsync();
+ var streamReader = new StreamReader(responseStream);
+
+ var line1 = await streamReader.ReadLineAsync();
+ using var result1 = JsonDocument.Parse(line1!);
+
+ // Assert 1
+ Assert.Equal("Hello test 1!", result1.RootElement.GetProperty("message").GetString());
+
+ // Act & Assert 2
+ tcs.SetResult();
+ await Assert.ThrowsAsync<IOException>(() => streamReader.ReadLineAsync());
+ }
}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/UnaryTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/UnaryTests.cs
index 4873ecc131..95f182bd05 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/UnaryTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests/UnaryTests.cs
@@ -10,6 +10,7 @@ using IntegrationTestsWebsite;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests.Infrastructure;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.Infrastructure;
+using Microsoft.AspNetCore.Testing;
using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.IntegrationTests;
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterReadTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterReadTests.cs
index 6275a52f8d..2f4c5b9db5 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterReadTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterReadTests.cs
@@ -21,6 +21,28 @@ public class JsonConverterReadTests
}
[Fact]
+ public void NonJsonName()
+ {
+ var json = @"{
+ ""field_name"": ""A field name""
+}";
+
+ var m = AssertReadJson<HelloRequest>(json);
+ Assert.Equal("A field name", m.FieldName);
+ }
+
+ [Fact]
+ public void JsonCustomizedName()
+ {
+ var json = @"{
+ ""json_customized_name"": ""A field name""
+}";
+
+ var m = AssertReadJson<HelloRequest>(json);
+ Assert.Equal("A field name", m.FieldName);
+ }
+
+ [Fact]
public void ReadObjectProperties()
{
var json = @"{
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterWriteTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterWriteTests.cs
index bfec7a9793..17ed25b22a 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterWriteTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterWriteTests.cs
@@ -22,6 +22,18 @@ public class JsonConverterWriteTests
}
[Fact]
+ public void CustomizedName()
+ {
+ var helloRequest = new HelloRequest
+ {
+ FieldName = "A field name"
+ };
+
+ AssertWrittenJson(helloRequest,
+ new GrpcJsonSettings { IgnoreDefaultValues = true });
+ }
+
+ [Fact]
public void NonAsciiString()
{
var helloRequest = new HelloRequest
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/GrpcHttpApiServiceExtensionsTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/GrpcJsonTranscodingServiceExtensionsTests.cs
index f0b8ddab58..f0b8ddab58 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/GrpcHttpApiServiceExtensionsTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/GrpcJsonTranscodingServiceExtensionsTests.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpRoutePatternParserTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpRoutePatternParserTests.cs
new file mode 100644
index 0000000000..3fb4a80d1f
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpRoutePatternParserTests.cs
@@ -0,0 +1,325 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Grpc.Shared;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
+
+namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests;
+
+public class HttpRoutePatternParserTests
+{
+ [Fact]
+ public void ParseMultipleVariables()
+ {
+ var pattern = HttpRoutePattern.Parse("/shelves/{shelf}/books/{book}");
+ Assert.Null(pattern.Verb);
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("shelves", s),
+ s => Assert.Equal("*", s),
+ s => Assert.Equal("books", s),
+ s => Assert.Equal("*", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(2, v.EndSegment);
+ Assert.Equal("shelf", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ },
+ v =>
+ {
+ Assert.Equal(3, v.StartSegment);
+ Assert.Equal(4, v.EndSegment);
+ Assert.Equal("book", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexVariable()
+ {
+ var pattern = HttpRoutePattern.Parse("/v1/{book.name=shelves/*/books/*}");
+ Assert.Null(pattern.Verb);
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("v1", s),
+ s => Assert.Equal("shelves", s),
+ s => Assert.Equal("*", s),
+ s => Assert.Equal("books", s),
+ s => Assert.Equal("*", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(5, v.EndSegment);
+ Assert.Equal("book.name", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseCatchAllSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/shelves/**");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("shelves", s),
+ s => Assert.Equal("**", s));
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseCatchAllSegment2()
+ {
+ var pattern = HttpRoutePattern.Parse("/**");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("**", s));
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseAnySegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/*");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("*", s));
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseSlash()
+ {
+ var pattern = HttpRoutePattern.Parse("/");
+ Assert.Empty(pattern.Segments);
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseVerb()
+ {
+ var pattern = HttpRoutePattern.Parse("/a:foo");
+ Assert.Equal("foo", pattern.Verb);
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s));
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseAnyAndCatchAllSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/*/**");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("*", s),
+ s => Assert.Equal("**", s));
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseAnyAndCatchAllSegment2()
+ {
+ var pattern = HttpRoutePattern.Parse("/*/a/**");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("*", s),
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("**", s));
+ Assert.Empty(pattern.Variables);
+ }
+
+ [Fact]
+ public void ParseNestedFieldPath()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{a.b.c}");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("*", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(2, v.EndSegment);
+ Assert.Equal("a.b.c", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexNestedFieldPath()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{a.b.c=*}");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("*", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(2, v.EndSegment);
+ Assert.Equal("a.b.c", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexCatchAll()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=**}");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("**", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(2, v.EndSegment);
+ Assert.Equal("b", string.Join(".", v.FieldPath));
+ Assert.True(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexPrefixSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=c/*}");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("c", s),
+ s => Assert.Equal("*", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(3, v.EndSegment);
+ Assert.Equal("b", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexPrefixSuffixSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=c/*/d}");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("c", s),
+ s => Assert.Equal("*", s),
+ s => Assert.Equal("d", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(4, v.EndSegment);
+ Assert.Equal("b", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexPathCatchAll()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=c/**}");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("c", s),
+ s => Assert.Equal("**", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(3, v.EndSegment);
+ Assert.Equal("b", string.Join(".", v.FieldPath));
+ Assert.True(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseComplexPrefixSuffixCatchAll()
+ {
+ var pattern = HttpRoutePattern.Parse("/{x.y.z=a/**/b}/c/d");
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("**", s),
+ s => Assert.Equal("b", s),
+ s => Assert.Equal("c", s),
+ s => Assert.Equal("d", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(0, v.StartSegment);
+ Assert.Equal(3, v.EndSegment);
+ Assert.Equal("x.y.z", string.Join(".", v.FieldPath));
+ Assert.True(v.HasCatchAllPath);
+ });
+ }
+
+ [Fact]
+ public void ParseCatchAllVerb()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=*}/**:verb");
+ Assert.Equal("verb", pattern.Verb);
+ Assert.Collection(
+ pattern.Segments,
+ s => Assert.Equal("a", s),
+ s => Assert.Equal("*", s),
+ s => Assert.Equal("**", s));
+ Assert.Collection(
+ pattern.Variables,
+ v =>
+ {
+ Assert.Equal(1, v.StartSegment);
+ Assert.Equal(2, v.EndSegment);
+ Assert.Equal("b", string.Join(".", v.FieldPath));
+ Assert.False(v.HasCatchAllPath);
+ });
+ }
+
+ [Theory]
+ [InlineData("", "Path template must start with a '/'.")]
+ [InlineData("//", "Path template has an empty segment.")]
+ [InlineData("/{}", "Incomplete or empty field path.")]
+ [InlineData("/a/", "Route template shouldn't end with a '/'.")]
+ [InlineData(":verb", "Path template must start with a '/'.")]
+ [InlineData(":", "Path template must start with a '/'.")]
+ [InlineData("/:", "Path template has an empty segment.")]
+ [InlineData("/{var}:", "Empty verb.")]
+ [InlineData("/{", "Incomplete or empty field path.")]
+ [InlineData("/a{x}", "Path segment must end with a '/'.")]
+ [InlineData("/{x}a", "Path segment must end with a '/'.")]
+ [InlineData("/{x}{y}", "Path segment must end with a '/'.")]
+ [InlineData("/{var=a/{nested=b}}", "Variable can't be nested.")]
+ [InlineData("/{x=**}/*", "Only literal segments can follow a catch-all segment.")]
+ [InlineData("/{x=}", "Path template has an empty segment.")]
+ [InlineData("/**/*", "Only literal segments can follow a catch-all segment.")]
+ [InlineData("/{x", "Expected '}' when parsing path template.")]
+ public void Error(string pattern, string errorMessage)
+ {
+ var ex = Assert.Throws<InvalidOperationException>(() => HttpRoutePattern.Parse(pattern));
+ Assert.Equal(errorMessage, ex.InnerException!.Message);
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/HttpApiGreeterService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/JsonTranscodingGreeterService.cs
index e0e3e9195b..e0e3e9195b 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/HttpApiGreeterService.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/JsonTranscodingGreeterService.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/TestHelpers.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/TestHelpers.cs
index 03a26331d6..85550a7a82 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/TestHelpers.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Infrastructure/TestHelpers.cs
@@ -5,6 +5,8 @@ using System.Net;
using Google.Protobuf.Reflection;
using Grpc.AspNetCore.Server;
using Grpc.Core.Interceptors;
+using Grpc.Shared;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.CallHandlers;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
@@ -68,6 +70,7 @@ internal static class TestHelpers
bodyDescriptor,
bodyDescriptorRepeated ?? false,
bodyFieldDescriptors,
- routeParameterDescriptors ?? new Dictionary<string, List<FieldDescriptor>>());
+ routeParameterDescriptors ?? new Dictionary<string, List<FieldDescriptor>>(),
+ JsonTranscodingRouteAdapter.Parse(HttpRoutePattern.Parse("/")));
}
}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingRouteAdapterTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingRouteAdapterTests.cs
new file mode 100644
index 0000000000..c27ffe47e6
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingRouteAdapterTests.cs
@@ -0,0 +1,223 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Grpc.Shared;
+using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.FileSystemGlobbing.Internal;
+
+namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests;
+
+public class JsonTranscodingRouteAdapterTests
+{
+ [Fact]
+ public void ParseMultipleVariables()
+ {
+ var pattern = HttpRoutePattern.Parse("/shelves/{shelf}/books/{book}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/shelves/{shelf}/books/{book}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseComplexVariable()
+ {
+ var route = HttpRoutePattern.Parse("/v1/{book.name=shelves/*/books/*}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(route);
+
+ Assert.Equal("/v1/shelves/{__Complex_book.name_2}/books/{__Complex_book.name_4}", adapter.ResolvedRouteTemplate);
+ Assert.Single(adapter.RewriteVariableActions);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues = new RouteValueDictionary
+ {
+ { "__Complex_book.name_2", "first" },
+ { "__Complex_book.name_4", "second" }
+ };
+
+ adapter.RewriteVariableActions[0](httpContext);
+
+ Assert.Equal("shelves/first/books/second", httpContext.Request.RouteValues["book.name"]);
+ }
+
+ [Fact]
+ public void ParseCatchAllSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/shelves/**");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/shelves/{**__Discard_1}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseAnySegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/*")!;
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/{__Discard_0}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseVerb()
+ {
+ var pattern = HttpRoutePattern.Parse("/a:foo");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseAnyAndCatchAllSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/*/**");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/{__Discard_0}/{**__Discard_1}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseAnyAndCatchAllSegment2()
+ {
+ var pattern = HttpRoutePattern.Parse("/*/a/**");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/{__Discard_0}/a/{**__Discard_2}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseNestedFieldPath()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{a.b.c}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/{a.b.c}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseComplexNestedFieldPath()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{a.b.c=*}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/{a.b.c}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseComplexCatchAll()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=**}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/{**b}", adapter.ResolvedRouteTemplate);
+ Assert.Empty(adapter.RewriteVariableActions);
+ }
+
+ [Fact]
+ public void ParseComplexPrefixSuffixCatchAll()
+ {
+ var pattern = HttpRoutePattern.Parse("/{x.y.z=a/**/b}/c/d");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/{**__Complex_x.y.z_1:regex(b/c/d$)}", adapter.ResolvedRouteTemplate);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues = new RouteValueDictionary
+ {
+ { "__Complex_x.y.z_1", "my/value/b/c/d" }
+ };
+
+ adapter.RewriteVariableActions[0](httpContext);
+
+ Assert.Equal("a/my/value/b", httpContext.Request.RouteValues["x.y.z"]);
+ }
+
+ [Fact]
+ public void ParseComplexPrefixSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=c/*}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/c/{__Complex_b_2}", adapter.ResolvedRouteTemplate);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues = new RouteValueDictionary
+ {
+ { "__Complex_b_2", "value" }
+ };
+
+ adapter.RewriteVariableActions[0](httpContext);
+
+ Assert.Equal("c/value", httpContext.Request.RouteValues["b"]);
+ }
+
+ [Fact]
+ public void ParseComplexPrefixSuffixSegment()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=c/*/d}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/c/{__Complex_b_2}/d", adapter.ResolvedRouteTemplate);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues = new RouteValueDictionary
+ {
+ { "__Complex_b_2", "value" }
+ };
+
+ adapter.RewriteVariableActions[0](httpContext);
+
+ Assert.Equal("c/value/d", httpContext.Request.RouteValues["b"]);
+ }
+
+ [Fact]
+ public void ParseComplexPathCatchAll()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=c/**}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/c/{**__Complex_b_2}", adapter.ResolvedRouteTemplate);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues = new RouteValueDictionary
+ {
+ { "__Complex_b_2", "value" }
+ };
+
+ adapter.RewriteVariableActions[0](httpContext);
+
+ Assert.Equal("c/value", httpContext.Request.RouteValues["b"]);
+ }
+
+ [Fact]
+ public void ParseManyVariables()
+ {
+ var pattern = HttpRoutePattern.Parse("/{a}/{b}/{c}");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/{a}/{b}/{c}", adapter.ResolvedRouteTemplate);
+ }
+
+ [Fact]
+ public void ParseCatchAllVerb()
+ {
+ var pattern = HttpRoutePattern.Parse("/a/{b=*}/**:verb");
+ var adapter = JsonTranscodingRouteAdapter.Parse(pattern);
+
+ Assert.Equal("/a/{b}/{**__Discard_2}", adapter.ResolvedRouteTemplate);
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpApiServerCallContextTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingServerCallContextTests.cs
index 2e3d6def02..9365412e9d 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpApiServerCallContextTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingServerCallContextTests.cs
@@ -5,6 +5,7 @@ using System.Net;
using Google.Protobuf.Reflection;
using Grpc.AspNetCore.Server;
using Grpc.Core;
+using Grpc.Shared;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal;
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.CallHandlers;
using Microsoft.AspNetCore.Http;
@@ -99,7 +100,8 @@ public class JsonTranscodingServerCallContextTests
null,
false,
null,
- new Dictionary<string, List<FieldDescriptor>>()),
+ new Dictionary<string, List<FieldDescriptor>>(),
+ JsonTranscodingRouteAdapter.Parse(HttpRoutePattern.Parse("/")!)),
NullLogger.Instance);
}
}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpApiServiceMethodProviderTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingServiceMethodProviderTests.cs
index 470db8b06d..4c1e3c65e9 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/HttpApiServiceMethodProviderTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/JsonTranscodingServiceMethodProviderTests.cs
@@ -173,7 +173,8 @@ public class JsonTranscodingServiceMethodProviderTests
// Assert
Assert.Equal("Error binding gRPC service 'JsonTranscodingInvalidPatternGreeterService'.", ex.Message);
Assert.Equal("Error binding BadPattern on JsonTranscodingInvalidPatternGreeterService to HTTP API.", ex.InnerException!.InnerException!.Message);
- Assert.Equal("Path template 'v1/greeter/{name}' must start with a '/'.", ex.InnerException!.InnerException!.InnerException!.Message);
+ Assert.Equal("Error parsing path template 'v1/greeter/{name}'.", ex.InnerException!.InnerException!.InnerException!.Message);
+ Assert.Equal("Path template must start with a '/'.", ex.InnerException!.InnerException!.InnerException!.InnerException!.Message);
}
private static RouteEndpoint FindGrpcEndpoint(IReadOnlyList<Endpoint> endpoints, string methodName)
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj
index 3f6170a9b4..acb9f27aff 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.csproj
@@ -2,10 +2,14 @@
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<Nullable>enable</Nullable>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
+ <Protobuf Include="Proto\httpbody.proto" GrpcServices="Both" />
<Protobuf Include="Proto\transcoding.proto" GrpcServices="Both" />
+
<Compile Include="..\Shared\TestGrpcServiceActivator.cs" Link="Infrastructure\TestGrpcServiceActivator.cs" />
<Reference Include="Microsoft.AspNetCore.Grpc.JsonTranscoding" />
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/httpbody.proto b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/httpbody.proto
new file mode 100644
index 0000000000..cfef5f7b08
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/httpbody.proto
@@ -0,0 +1,31 @@
+// Copyright (c) .NET Foundation. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+syntax = "proto3";
+
+import "google/api/annotations.proto";
+import "google/api/httpbody.proto";
+
+package transcoding;
+
+service HttpBodyService {
+ rpc HelloWorld(HelloWorldRequest) returns (google.api.HttpBody) {
+ option (google.api.http) = {
+ get: "/helloworld"
+ };
+ }
+}
+
+message HttpBodySubField {
+ string name = 1;
+ google.api.HttpBody sub = 2;
+}
+
+message NestedHttpBodySubField {
+ string name = 1;
+ HttpBodySubField sub = 2;
+}
+
+message HelloWorldRequest {
+ string name = 1;
+}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/transcoding.proto b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/transcoding.proto
index bdab9232df..b28c079cc2 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/transcoding.proto
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/Proto/transcoding.proto
@@ -180,6 +180,7 @@ message HelloRequest {
google.protobuf.ListValue list_value = 19;
google.protobuf.NullValue null_value = 20;
google.protobuf.FieldMask field_mask_value = 21;
+ string field_name = 22 [json_name="json_customized_name"];
}
message HelloReply {
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ServerStreamingServerCallHandlerTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ServerStreamingServerCallHandlerTests.cs
index 9e0ed1a9b5..a6dc6c43c6 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ServerStreamingServerCallHandlerTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ServerStreamingServerCallHandlerTests.cs
@@ -5,6 +5,8 @@ using System.Buffers;
using System.IO.Pipelines;
using System.Text;
using System.Text.Json;
+using System.Xml.Linq;
+using Google.Api;
using Google.Protobuf;
using Google.Protobuf.Reflection;
using Grpc.AspNetCore.Server;
@@ -55,6 +57,9 @@ public class ServerStreamingServerCallHandlerTests : LoggedTest
var callTask = callHandler.HandleCallAsync(httpContext);
// Assert
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.Equal("application/json; charset=utf-8", httpContext.Response.ContentType);
+
var line1 = await ReadLineAsync(pipe.Reader).DefaultTimeout();
using var responseJson1 = JsonDocument.Parse(line1!);
Assert.Equal("Hello TestName! 1", responseJson1.RootElement.GetProperty("message").GetString());
@@ -141,6 +146,62 @@ public class ServerStreamingServerCallHandlerTests : LoggedTest
await callTask.DefaultTimeout();
}
+ [Fact]
+ public async Task HandleCallAsync_HttpBody_WriteMultipleMessages_Returned()
+ {
+ // Arrange
+ var syncPoint = new SyncPoint();
+
+ ServerStreamingServerMethod<JsonTranscodingGreeterService, HelloRequest, HttpBody> invoker = async (s, r, w, c) =>
+ {
+ await w.WriteAsync(new HttpBody
+ {
+ ContentType = "application/xml",
+ Data = ByteString.CopyFrom(Encoding.UTF8.GetBytes($"<message>Hello {r.Name} 1</message>"))
+ });
+ await syncPoint.WaitToContinue();
+ await w.WriteAsync(new HttpBody
+ {
+ ContentType = "application/xml",
+ Data = ByteString.CopyFrom(Encoding.UTF8.GetBytes($"<message>Hello {r.Name} 2</message>"))
+ });
+ };
+
+ var pipe = new Pipe();
+
+ var routeParameterDescriptors = new Dictionary<string, List<FieldDescriptor>>
+ {
+ ["name"] = new List<FieldDescriptor>(new[] { HelloRequest.Descriptor.FindFieldByNumber(HelloRequest.NameFieldNumber) })
+ };
+ var descriptorInfo = TestHelpers.CreateDescriptorInfo(routeParameterDescriptors: routeParameterDescriptors);
+ var callHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpResponseBody", HelloRequest.Parser, HttpBody.Parser),
+ descriptorInfo: descriptorInfo);
+ var httpContext = TestHelpers.CreateHttpContext(bodyStream: pipe.Writer.AsStream());
+ httpContext.Request.RouteValues["name"] = "TestName!";
+
+ // Act
+ var callTask = callHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.Equal("application/xml", httpContext.Response.ContentType);
+
+ var line1 = await ReadLineAsync(pipe.Reader).DefaultTimeout();
+ var responseXml1 = XDocument.Parse(line1!);
+ Assert.Equal("Hello TestName! 1", (string)responseXml1.Element("message")!);
+
+ await syncPoint.WaitForSyncPoint().DefaultTimeout();
+ syncPoint.Continue();
+
+ var line2 = await ReadLineAsync(pipe.Reader).DefaultTimeout();
+ var responseXml2 = XDocument.Parse(line2!);
+ Assert.Equal("Hello TestName! 2", (string)responseXml2.Element("message")!);
+
+ await callTask.DefaultTimeout();
+ }
+
public async Task<string?> ReadLineAsync(PipeReader pipeReader)
{
string? str;
@@ -187,8 +248,27 @@ public class ServerStreamingServerCallHandlerTests : LoggedTest
ServerStreamingServerMethod<JsonTranscodingGreeterService, HelloRequest, HelloReply> invoker,
CallHandlerDescriptorInfo? descriptorInfo = null,
List<(Type Type, object[] Args)>? interceptors = null,
- GrpcJsonTranscodingOptions? JsonTranscodingOptions = null,
+ GrpcJsonTranscodingOptions? jsonTranscodingOptions = null,
+ GrpcServiceOptions? serviceOptions = null)
+ {
+ return CreateCallHandler(
+ invoker,
+ CreateServiceMethod("TestMethodName", HelloRequest.Parser, HelloReply.Parser),
+ descriptorInfo,
+ interceptors,
+ jsonTranscodingOptions,
+ serviceOptions);
+ }
+
+ private ServerStreamingServerCallHandler<JsonTranscodingGreeterService, TRequest, TResponse> CreateCallHandler<TRequest, TResponse>(
+ ServerStreamingServerMethod<JsonTranscodingGreeterService, TRequest, TResponse> invoker,
+ Method<TRequest, TResponse> method,
+ CallHandlerDescriptorInfo? descriptorInfo = null,
+ List<(Type Type, object[] Args)>? interceptors = null,
+ GrpcJsonTranscodingOptions? jsonTranscodingOptions = null,
GrpcServiceOptions? serviceOptions = null)
+ where TRequest : class, IMessage<TRequest>
+ where TResponse : class, IMessage<TResponse>
{
serviceOptions ??= new GrpcServiceOptions();
if (interceptors != null)
@@ -199,16 +279,16 @@ public class ServerStreamingServerCallHandlerTests : LoggedTest
}
}
- var callInvoker = new ServerStreamingServerMethodInvoker<JsonTranscodingGreeterService, HelloRequest, HelloReply>(
+ var callInvoker = new ServerStreamingServerMethodInvoker<JsonTranscodingGreeterService, TRequest, TResponse>(
invoker,
- CreateServiceMethod<HelloRequest, HelloReply>("TestMethodName", HelloRequest.Parser, HelloReply.Parser),
+ method,
MethodOptions.Create(new[] { serviceOptions }),
new TestGrpcServiceActivator<JsonTranscodingGreeterService>());
- var jsonSettings = JsonTranscodingOptions?.JsonSettings ?? new GrpcJsonSettings() { WriteIndented = false };
- var jsonContext = new JsonContext(jsonSettings, JsonTranscodingOptions?.TypeRegistry ?? TypeRegistry.Empty);
+ var jsonSettings = jsonTranscodingOptions?.JsonSettings ?? new GrpcJsonSettings() { WriteIndented = false };
+ var jsonContext = new JsonContext(jsonSettings, jsonTranscodingOptions?.TypeRegistry ?? TypeRegistry.Empty);
- return new ServerStreamingServerCallHandler<JsonTranscodingGreeterService, HelloRequest, HelloReply>(
+ return new ServerStreamingServerCallHandler<JsonTranscodingGreeterService, TRequest, TResponse>(
callInvoker,
LoggerFactory,
descriptorInfo ?? TestHelpers.CreateDescriptorInfo(),
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpBodyService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpBodyService.cs
new file mode 100644
index 0000000000..db732a97d3
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpBodyService.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text;
+using Google.Api;
+using Google.Protobuf;
+using Grpc.Core;
+using Transcoding;
+
+namespace Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests.TestObjects;
+
+public class HttpBodyService : Transcoding.HttpBodyService.HttpBodyServiceBase
+{
+ public override Task<HttpBody> HelloWorld(HelloWorldRequest request, ServerCallContext context)
+ {
+ return Task.FromResult(new HttpBody
+ {
+ ContentType = "application/xml",
+ Data = ByteString.CopyFrom(Encoding.UTF8.GetBytes(@"<message>Hello world</message>"))
+ });
+ }
+}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiGreeterService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingGreeterService.cs
index 203246b77e..203246b77e 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiGreeterService.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingGreeterService.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidBodyGreeterService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidBodyGreeterService.cs
index 29ce019b5f..29ce019b5f 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidBodyGreeterService.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidBodyGreeterService.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidPatternGreeterService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidPatternGreeterService.cs
index a081b8fe9e..a081b8fe9e 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidPatternGreeterService.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidPatternGreeterService.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidResponseBodyGreeterService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidResponseBodyGreeterService.cs
index 6cbe3d728d..6cbe3d728d 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiInvalidResponseBodyGreeterService.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingInvalidResponseBodyGreeterService.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiStreamingService.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingStreamingService.cs
index e32b19e8a2..e32b19e8a2 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/HttpApiStreamingService.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/TestObjects/Services/JsonTranscodingStreamingService.cs
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/UnaryServerCallHandlerTests.cs b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/UnaryServerCallHandlerTests.cs
index eeaccf4429..722a9410eb 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/UnaryServerCallHandlerTests.cs
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/UnaryServerCallHandlerTests.cs
@@ -3,6 +3,8 @@
using System.Text;
using System.Text.Json;
+using System.Xml.Linq;
+using Google.Api;
using Google.Protobuf;
using Google.Protobuf.Collections;
using Google.Protobuf.Reflection;
@@ -61,6 +63,9 @@ public class UnaryServerCallHandlerTests : LoggedTest
await unaryServerCallHandler.HandleCallAsync(httpContext);
// Assert
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.Equal("application/json; charset=utf-8", httpContext.Response.ContentType);
+
Assert.NotNull(request);
Assert.Equal("TestName!", request!.Name);
Assert.Equal("Subfield!", request!.Sub.Subfield);
@@ -217,7 +222,7 @@ public class UnaryServerCallHandlerTests : LoggedTest
return Task.FromResult(new HelloReply { Message = $"Hello {r.Name}" });
};
- ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, "sub", out var bodyFieldDescriptors);
+ ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, new[] { "sub" }, out var bodyFieldDescriptors);
var descriptorInfo = TestHelpers.CreateDescriptorInfo(
bodyDescriptor: HelloRequest.Types.SubMessage.Descriptor,
@@ -259,7 +264,7 @@ public class UnaryServerCallHandlerTests : LoggedTest
return Task.FromResult(new HelloReply { Message = $"Hello {r.Name}" });
};
- ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, "repeated_strings", out var bodyFieldDescriptors);
+ ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, new[] { "repeated_strings" }, out var bodyFieldDescriptors);
var descriptorInfo = TestHelpers.CreateDescriptorInfo(
bodyDescriptor: HelloRequest.Types.SubMessage.Descriptor,
@@ -313,7 +318,7 @@ public class UnaryServerCallHandlerTests : LoggedTest
return Task.FromResult(new HelloReply { Message = $"Hello {r.Name}" });
};
- ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, "sub.subfields", out var bodyFieldDescriptors);
+ ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, new[] { "sub", "subfields" }, out var bodyFieldDescriptors);
var descriptorInfo = TestHelpers.CreateDescriptorInfo(
bodyDescriptor: HelloRequest.Types.SubMessage.Descriptor,
@@ -412,8 +417,11 @@ public class UnaryServerCallHandlerTests : LoggedTest
[Theory]
[InlineData("{malformed_json}", "Request JSON payload is not correctly formatted.")]
+ [InlineData("[malformed_json]", "Request JSON payload is not correctly formatted.")]
+ [InlineData("[1]", "Request JSON payload is not correctly formatted.")]
+ [InlineData("1", "Request JSON payload is not correctly formatted.")]
+ [InlineData("null", "Unable to deserialize null to HelloRequest.")]
[InlineData("{\"name\": 1234}", "Request JSON payload is not correctly formatted.")]
- //[InlineData("{\"abcd\": 1234}", "Unknown field: abcd")]
public async Task HandleCallAsync_MalformedRequestBody_BadRequestReturned(string json, string expectedError)
{
// Arrange
@@ -442,6 +450,45 @@ public class UnaryServerCallHandlerTests : LoggedTest
}
[Theory]
+ [InlineData("{malformed_json}", "Request JSON payload is not correctly formatted.")]
+ [InlineData("[malformed_json]", "Request JSON payload is not correctly formatted.")]
+ [InlineData("1", "Request JSON payload is not correctly formatted.")]
+ [InlineData("null", "Unable to deserialize null to List`1.")]
+ [InlineData("{\"name\": 1234}", "Request JSON payload is not correctly formatted.")]
+ public async Task HandleCallAsync_MalformedRequestBody_RepeatedBody_BadRequestReturned(string json, string expectedError)
+ {
+ // Arrange
+ UnaryServerMethod<JsonTranscodingGreeterService, HelloRequest, HelloReply> invoker = (s, r, c) =>
+ {
+ return Task.FromResult(new HelloReply());
+ };
+
+ ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, new[] { "repeated_strings" }, out var bodyFieldDescriptors);
+
+ var descriptorInfo = TestHelpers.CreateDescriptorInfo(
+ bodyDescriptor: HelloRequest.Types.SubMessage.Descriptor,
+ bodyDescriptorRepeated: true,
+ bodyFieldDescriptors: bodyFieldDescriptors);
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ descriptorInfo);
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(json));
+ httpContext.Request.ContentType = "application/json";
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.Equal(400, httpContext.Response.StatusCode);
+
+ httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
+ using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
+ Assert.Equal(expectedError, responseJson.RootElement.GetProperty("message").GetString());
+ Assert.Equal(expectedError, responseJson.RootElement.GetProperty("error").GetString());
+ Assert.Equal((int)StatusCode.InvalidArgument, responseJson.RootElement.GetProperty("code").GetInt32());
+ }
+
+ [Theory]
[InlineData(null)]
[InlineData("text/html")]
public async Task HandleCallAsync_BadContentType_BadRequestReturned(string contentType)
@@ -456,7 +503,7 @@ public class UnaryServerCallHandlerTests : LoggedTest
invoker,
descriptorInfo: TestHelpers.CreateDescriptorInfo(bodyDescriptor: HelloRequest.Descriptor));
var httpContext = TestHelpers.CreateHttpContext();
- httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes("{}"));
+ httpContext.Request.Body = new MemoryStream("{}"u8.ToArray());
httpContext.Request.ContentType = contentType;
// Act
await unaryServerCallHandler.HandleCallAsync(httpContext);
@@ -464,7 +511,7 @@ public class UnaryServerCallHandlerTests : LoggedTest
// Assert
Assert.Equal(400, httpContext.Response.StatusCode);
- var expectedError = "Request content-type of application/json is required.";
+ var expectedError = $"Unable to read the request as JSON because the request content type '{contentType}' is not a known JSON content type.";
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
Assert.Equal(expectedError, responseJson.RootElement.GetProperty("message").GetString());
@@ -549,6 +596,306 @@ public class UnaryServerCallHandlerTests : LoggedTest
}
[Fact]
+ public async Task HandleCallAsync_HttpBodyRequest_RawRequestAvailable()
+ {
+ // Arrange
+ string? requestContentType = null;
+ byte[]? requestData = null;
+ UnaryServerMethod<JsonTranscodingGreeterService, HttpBody, HelloReply> invoker = (s, r, c) =>
+ {
+ requestContentType = r.ContentType;
+ requestData = r.Data.ToByteArray();
+
+ var responseXml = XDocument.Load(new MemoryStream(requestData));
+ var name = (string)responseXml.Element("name")!;
+
+ return Task.FromResult(new HelloReply { Message = $"Hello {name}!" });
+ };
+
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpRequestBody", HttpBody.Parser, HelloReply.Parser),
+ descriptorInfo: TestHelpers.CreateDescriptorInfo(bodyDescriptor: HttpBody.Descriptor));
+ var requestContent = new XDocument(new XElement("name", "World")).ToString();
+
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.ContentType = "application/xml";
+ httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(requestContent));
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.Equal("application/xml", requestContentType);
+ Assert.Equal(requestContent, Encoding.UTF8.GetString(requestData!));
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.Equal("application/json; charset=utf-8", httpContext.Response.ContentType);
+
+ httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
+ using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
+ Assert.Equal(@"Hello World!", responseJson.RootElement.GetProperty("message").GetString());
+ }
+
+ [Theory]
+ [InlineData(1, false)]
+ [InlineData(1, true)]
+ [InlineData(16 * 1024, false)]
+ [InlineData(16 * 1024, true)]
+ [InlineData(1024 * 1024, false)]
+ [InlineData(1024 * 1024, true)]
+ public async Task HandleCallAsync_HttpBodyRequestLarge_RawRequestAvailable(int requestSize, bool sendContentLength)
+ {
+ // Arrange
+ string? requestContentType = null;
+ byte[]? requestData = null;
+ UnaryServerMethod<JsonTranscodingGreeterService, HttpBody, HelloReply> invoker = (s, r, c) =>
+ {
+ requestContentType = r.ContentType;
+ requestData = r.Data.ToByteArray();
+
+ return Task.FromResult(new HelloReply { Message = $"Hello {requestData.Length}!" });
+ };
+
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpRequestBody", HttpBody.Parser, HelloReply.Parser),
+ descriptorInfo: TestHelpers.CreateDescriptorInfo(bodyDescriptor: HttpBody.Descriptor));
+
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.ContentType = "application/octet-stream";
+
+ var requestContent = new byte[requestSize];
+ for (var i = 0; i < requestContent.Length; i++)
+ {
+ requestContent[i] = (byte)(i % 10);
+ }
+ httpContext.Request.Body = new MemoryStream(requestContent);
+ if (sendContentLength)
+ {
+ httpContext.Request.ContentLength = requestSize;
+ }
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.Equal("application/octet-stream", requestContentType);
+ Assert.Equal(requestContent, requestData);
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.Equal("application/json; charset=utf-8", httpContext.Response.ContentType);
+
+ httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
+ using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
+ Assert.Equal($"Hello {requestContent.Length}!", responseJson.RootElement.GetProperty("message").GetString());
+ }
+
+ [Fact]
+ public async Task HandleCallAsync_NullBody_WrapperType_Error()
+ {
+ // Arrange
+ UnaryServerMethod<JsonTranscodingGreeterService, Int32Value, HelloReply> invoker = (s, r, c) =>
+ {
+ return Task.FromResult(new HelloReply());
+ };
+
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("Int32ValueBody", Int32Value.Parser, HelloReply.Parser),
+ descriptorInfo: TestHelpers.CreateDescriptorInfo(bodyDescriptor: Int32Value.Descriptor));
+
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.ContentType = "application/json";
+ httpContext.Request.Body = new MemoryStream("null"u8.ToArray());
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
+ using var responseJson = JsonDocument.Parse(httpContext.Response.Body);
+ Assert.Equal("Unable to deserialize null to Int32Value.", responseJson.RootElement.GetProperty("message").GetString());
+ }
+
+ [Theory]
+ [InlineData("null", null)]
+ [InlineData("1", 1.0f)]
+ [InlineData("1.1", 1.1f)]
+ [InlineData(@"""NaN""", float.NaN)]
+ public async Task HandleCallAsync_NestedWrapperType_Success(string requestJson, float? expectedValue)
+ {
+ // Arrange
+ var tcs = new TaskCompletionSource<float?>(TaskCreationOptions.RunContinuationsAsynchronously);
+ UnaryServerMethod<JsonTranscodingGreeterService, HelloRequest, HelloReply> invoker = (s, r, c) =>
+ {
+ tcs.SetResult(r.Wrappers.FloatValue);
+ return Task.FromResult(new HelloReply());
+ };
+
+ Assert.True(ServiceDescriptorHelpers.TryResolveDescriptors(HelloRequest.Descriptor, new[] { "wrappers", "float_value" }, out var bodyFieldDescriptors));
+
+ var descriptorInfo = TestHelpers.CreateDescriptorInfo(
+ bodyDescriptor: FloatValue.Descriptor,
+ bodyFieldDescriptors: bodyFieldDescriptors);
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ descriptorInfo);
+
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.ContentType = "application/json";
+ httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(requestJson));
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ var value = await tcs.Task.DefaultTimeout();
+ Assert.Equal(expectedValue, value);
+ }
+
+ [Fact]
+ public async Task HandleCallAsync_HttpBodyRequest_NoBody_RawRequestAvailable()
+ {
+ // Arrange
+ string? requestContentType = null;
+ byte[]? requestData = null;
+ UnaryServerMethod<JsonTranscodingGreeterService, HttpBody, HelloReply> invoker = (s, r, c) =>
+ {
+ requestContentType = r.ContentType;
+ requestData = r.Data.ToByteArray();
+
+ return Task.FromResult(new HelloReply());
+ };
+
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpRequestBody", HttpBody.Parser, HelloReply.Parser),
+ descriptorInfo: TestHelpers.CreateDescriptorInfo(bodyDescriptor: HttpBody.Descriptor));
+ var requestContent = new XDocument(new XElement("name", "World")).ToString();
+
+ var httpContext = TestHelpers.CreateHttpContext();
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.Equal("", requestContentType);
+ Assert.Empty(requestData!);
+ }
+
+ [Fact]
+ public async Task HandleCallAsync_SubHttpBodyRequest_RawRequestAvailable()
+ {
+ // Arrange
+ HttpBodySubField? request = null;
+ UnaryServerMethod<JsonTranscodingGreeterService, HttpBodySubField, HelloReply> invoker = (s, r, c) =>
+ {
+ request = r;
+ return Task.FromResult(new HelloReply { Message = $"Hello {r.Name}" });
+ };
+
+ ServiceDescriptorHelpers.TryResolveDescriptors(HttpBodySubField.Descriptor, new[] { "sub" }, out var bodyFieldDescriptors);
+
+ var descriptorInfo = TestHelpers.CreateDescriptorInfo(
+ bodyDescriptor: HttpBody.Descriptor,
+ bodyFieldDescriptors: bodyFieldDescriptors);
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpRequestBody", HttpBodySubField.Parser, HelloReply.Parser),
+ descriptorInfo);
+ var requestContent = new XDocument(new XElement("name", "World")).ToString();
+
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(requestContent));
+ httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>
+ {
+ ["name"] = "QueryStringTestName!"
+ });
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.NotNull(request);
+ Assert.Equal("QueryStringTestName!", request!.Name);
+ Assert.Equal("", request!.Sub.ContentType);
+ Assert.Equal(requestContent, Encoding.UTF8.GetString(request!.Sub.Data.ToByteArray()));
+ }
+
+ [Fact]
+ public async Task HandleCallAsync_NestedSubHttpBodyRequest_RawRequestAvailable()
+ {
+ // Arrange
+ NestedHttpBodySubField? request = null;
+ UnaryServerMethod<JsonTranscodingGreeterService, NestedHttpBodySubField, HelloReply> invoker = (s, r, c) =>
+ {
+ request = r;
+ return Task.FromResult(new HelloReply { Message = $"Hello {r.Name}" });
+ };
+
+ ServiceDescriptorHelpers.TryResolveDescriptors(NestedHttpBodySubField.Descriptor, new[] { "sub", "sub" }, out var bodyFieldDescriptors);
+
+ var descriptorInfo = TestHelpers.CreateDescriptorInfo(
+ bodyDescriptor: HttpBody.Descriptor,
+ bodyFieldDescriptors: bodyFieldDescriptors);
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpRequestBody", NestedHttpBodySubField.Parser, HelloReply.Parser),
+ descriptorInfo);
+ var requestContent = new XDocument(new XElement("name", "World")).ToString();
+
+ var httpContext = TestHelpers.CreateHttpContext();
+ httpContext.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(requestContent));
+ httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>
+ {
+ ["name"] = "QueryStringTestName!",
+ ["sub.name"] = "SubQueryStringTestName!"
+ });
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.NotNull(request);
+ Assert.Equal("QueryStringTestName!", request!.Name);
+ Assert.Equal("SubQueryStringTestName!", request!.Sub.Name);
+ Assert.Equal("", request!.Sub.Sub.ContentType);
+ Assert.Equal(requestContent, Encoding.UTF8.GetString(request!.Sub.Sub.Data.ToByteArray()));
+ }
+
+ [Fact]
+ public async Task HandleCallAsync_HttpBodyResponse_BodyReturned()
+ {
+ // Arrange
+ UnaryServerMethod<JsonTranscodingGreeterService, HelloRequest, HttpBody> invoker = (s, r, c) =>
+ {
+ return Task.FromResult(new HttpBody
+ {
+ ContentType = "application/xml",
+ Data = ByteString.CopyFrom("<message>Hello world</message>"u8)
+ });
+ };
+
+ var unaryServerCallHandler = CreateCallHandler(
+ invoker,
+ CreateServiceMethod("HttpResponseBody", HelloRequest.Parser, HttpBody.Parser));
+
+ var httpContext = TestHelpers.CreateHttpContext();
+
+ // Act
+ await unaryServerCallHandler.HandleCallAsync(httpContext);
+
+ // Assert
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.Equal("application/xml", httpContext.Response.ContentType);
+
+ httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
+ var responseXml = XDocument.Load(httpContext.Response.Body);
+ Assert.Equal(@"Hello world", (string)responseXml.Element("message")!);
+ }
+
+ [Fact]
public async Task HandleCallAsync_UserState_HttpContextInUserState()
{
object? requestHttpContext = null;
@@ -804,8 +1151,8 @@ public class UnaryServerCallHandlerTests : LoggedTest
});
});
- var exceptionWrite = TestSink.Writes.Single(w => w.EventId.Name == "ErrorExecutingServiceMethod");
- Assert.Equal($"Invalid value '{value}' for enum type NestedEnum.", exceptionWrite.Exception.Message);
+ var exceptionWrite = TestSink.Writes.Single(w => w.EventId.Name == "RpcConnectionError");
+ Assert.Equal($"Error status code 'InvalidArgument' with detail 'Invalid value '{value}' for enum type NestedEnum.' raised.", exceptionWrite.Message);
}
private async Task<HelloRequest> ExecuteUnaryHandler(
@@ -891,7 +1238,7 @@ public class UnaryServerCallHandlerTests : LoggedTest
var unaryServerCallHandler = CreateCallHandler(
invoker,
descriptorInfo: TestHelpers.CreateDescriptorInfo(bodyDescriptor: HelloRequest.Descriptor),
- JsonTranscodingOptions: new GrpcJsonTranscodingOptions
+ jsonTranscodingOptions: new GrpcJsonTranscodingOptions
{
TypeRegistry = typeRegistry
});
@@ -924,7 +1271,24 @@ public class UnaryServerCallHandlerTests : LoggedTest
UnaryServerMethod<JsonTranscodingGreeterService, HelloRequest, HelloReply> invoker,
CallHandlerDescriptorInfo? descriptorInfo = null,
List<(Type Type, object[] Args)>? interceptors = null,
- GrpcJsonTranscodingOptions? JsonTranscodingOptions = null)
+ GrpcJsonTranscodingOptions? jsonTranscodingOptions = null)
+ {
+ return CreateCallHandler(
+ invoker,
+ CreateServiceMethod("TestMethodName", HelloRequest.Parser, HelloReply.Parser),
+ descriptorInfo,
+ interceptors,
+ jsonTranscodingOptions);
+ }
+
+ private UnaryServerCallHandler<JsonTranscodingGreeterService, TRequest, TResponse> CreateCallHandler<TRequest, TResponse>(
+ UnaryServerMethod<JsonTranscodingGreeterService, TRequest, TResponse> invoker,
+ Method<TRequest, TResponse> method,
+ CallHandlerDescriptorInfo? descriptorInfo = null,
+ List<(Type Type, object[] Args)>? interceptors = null,
+ GrpcJsonTranscodingOptions? jsonTranscodingOptions = null)
+ where TRequest : class, IMessage<TRequest>
+ where TResponse : class, IMessage<TResponse>
{
var serviceOptions = new GrpcServiceOptions();
if (interceptors != null)
@@ -935,17 +1299,17 @@ public class UnaryServerCallHandlerTests : LoggedTest
}
}
- var unaryServerCallInvoker = new UnaryServerMethodInvoker<JsonTranscodingGreeterService, HelloRequest, HelloReply>(
+ var unaryServerCallInvoker = new UnaryServerMethodInvoker<JsonTranscodingGreeterService, TRequest, TResponse>(
invoker,
- CreateServiceMethod<HelloRequest, HelloReply>("TestMethodName", HelloRequest.Parser, HelloReply.Parser),
+ method,
MethodOptions.Create(new[] { serviceOptions }),
new TestGrpcServiceActivator<JsonTranscodingGreeterService>());
var jsonContext = new JsonContext(
- JsonTranscodingOptions?.JsonSettings ?? new GrpcJsonSettings(),
- JsonTranscodingOptions?.TypeRegistry ?? TypeRegistry.Empty);
+ jsonTranscodingOptions?.JsonSettings ?? new GrpcJsonSettings(),
+ jsonTranscodingOptions?.TypeRegistry ?? TypeRegistry.Empty);
- return new UnaryServerCallHandler<JsonTranscodingGreeterService, HelloRequest, HelloReply>(
+ return new UnaryServerCallHandler<JsonTranscodingGreeterService, TRequest, TResponse>(
unaryServerCallInvoker,
LoggerFactory,
descriptorInfo ?? TestHelpers.CreateDescriptorInfo(),
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/google/api/httpbody.proto b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/google/api/httpbody.proto
new file mode 100644
index 0000000000..00c80aba9d
--- /dev/null
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/google/api/httpbody.proto
@@ -0,0 +1,81 @@
+// Copyright 2015 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package google.api;
+
+import "google/protobuf/any.proto";
+
+option cc_enable_arenas = true;
+option go_package = "google.golang.org/genproto/googleapis/api/httpbody;httpbody";
+option java_multiple_files = true;
+option java_outer_classname = "HttpBodyProto";
+option java_package = "com.google.api";
+option objc_class_prefix = "GAPI";
+
+// Message that represents an arbitrary HTTP body. It should only be used for
+// payload formats that can't be represented as JSON, such as raw binary or
+// an HTML page.
+//
+//
+// This message can be used both in streaming and non-streaming API methods in
+// the request as well as the response.
+//
+// It can be used as a top-level request field, which is convenient if one
+// wants to extract parameters from either the URL or HTTP template into the
+// request fields and also want access to the raw HTTP body.
+//
+// Example:
+//
+// message GetResourceRequest {
+// // A unique request id.
+// string request_id = 1;
+//
+// // The raw HTTP body is bound to this field.
+// google.api.HttpBody http_body = 2;
+//
+// }
+//
+// service ResourceService {
+// rpc GetResource(GetResourceRequest)
+// returns (google.api.HttpBody);
+// rpc UpdateResource(google.api.HttpBody)
+// returns (google.protobuf.Empty);
+//
+// }
+//
+// Example with streaming methods:
+//
+// service CaldavService {
+// rpc GetCalendar(stream google.api.HttpBody)
+// returns (stream google.api.HttpBody);
+// rpc UpdateCalendar(stream google.api.HttpBody)
+// returns (stream google.api.HttpBody);
+//
+// }
+//
+// Use of this type only changes how the request and response bodies are
+// handled, all other features will continue to work unchanged.
+message HttpBody {
+ // The HTTP Content-Type header value specifying the content type of the body.
+ string content_type = 1;
+
+ // The HTTP request/response body as raw binary.
+ bytes data = 2;
+
+ // Application specific response metadata. Must be set in the first response
+ // for streaming APIs.
+ repeated google.protobuf.Any extensions = 3;
+}
diff --git a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj
index a77de42bd5..0db5d3d067 100644
--- a/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj
+++ b/src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/Microsoft.AspNetCore.Grpc.Swagger.Tests.csproj
@@ -2,7 +2,7 @@
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
- <NoWarn>$(NoWarn);CS1591</NoWarn>
+ <NoWarn>$(NoWarn);CS1591;CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/IntegrationTestsWebsite.csproj b/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/IntegrationTestsWebsite.csproj
index bdbc150f5a..c005493428 100644
--- a/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/IntegrationTestsWebsite.csproj
+++ b/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/IntegrationTestsWebsite.csproj
@@ -2,6 +2,8 @@
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<Nullable>enable</Nullable>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/Protos/greet.proto b/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/Protos/greet.proto
index 97f8543145..3038d68f95 100644
--- a/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/Protos/greet.proto
+++ b/src/Grpc/JsonTranscoding/test/testassets/IntegrationTestsWebsite/Protos/greet.proto
@@ -20,6 +20,26 @@ service Greeter {
body: "*"
};
}
+ rpc SayHelloComplex (HelloRequest) returns (HelloReply) {
+ option (google.api.http) = {
+ get: "/v1/greeter/{name=from/*}"
+ };
+ }
+ rpc SayHelloComplexCatchAll1 (HelloRequest) returns (HelloReply) {
+ option (google.api.http) = {
+ get: "/{name=v1/greeter/**/b}/c/d/one"
+ };
+ }
+ rpc SayHelloComplexCatchAll2 (HelloRequest) returns (HelloReply) {
+ option (google.api.http) = {
+ get: "/{name=v1/greeter/**/b}/c/d/two"
+ };
+ }
+ rpc SayHelloComplexCatchAll3 (ComplextHelloRequest) returns (HelloReply) {
+ option (google.api.http) = {
+ get: "/v1/{name.last_name}/{name.first_name=complex_greeter/**/b}/c/d/two"
+ };
+ }
}
// The request message containing the user's name.
@@ -27,6 +47,14 @@ message HelloRequest {
string name = 1;
}
+message ComplextHelloRequest {
+ NameDetail name = 1;
+ message NameDetail {
+ string first_name = 1;
+ string last_name = 2;
+ }
+}
+
// The response message containing the greetings.
message HelloReply {
string message = 1;
diff --git a/src/Grpc/JsonTranscoding/test/testassets/Sandbox/Sandbox.csproj b/src/Grpc/JsonTranscoding/test/testassets/Sandbox/Sandbox.csproj
index fa3e2095d4..0d064da825 100644
--- a/src/Grpc/JsonTranscoding/test/testassets/Sandbox/Sandbox.csproj
+++ b/src/Grpc/JsonTranscoding/test/testassets/Sandbox/Sandbox.csproj
@@ -1,6 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj b/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj
index 378bdfe837..bcd1333e1e 100644
--- a/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj
+++ b/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>Abstractions for defining health checks in .NET applications
@@ -12,7 +12,7 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthCheck
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>diagnostics;healthchecks</PackageTags>
<IsAspNetCoreApp>true</IsAspNetCoreApp>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
</Project>
diff --git a/src/HealthChecks/Abstractions/src/PublicAPI.Shipped.txt b/src/HealthChecks/Abstractions/src/PublicAPI.Shipped.txt
index 03e65dd8f7..6d8294f838 100644
--- a/src/HealthChecks/Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/HealthChecks/Abstractions/src/PublicAPI.Shipped.txt
@@ -18,6 +18,7 @@ Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckRegistration.Tags.get -
Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckRegistration.Timeout.get -> System.TimeSpan
Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckRegistration.Timeout.set -> void
Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckResult
+Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckResult.HealthCheckResult() -> void
Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckResult.Data.get -> System.Collections.Generic.IReadOnlyDictionary<string!, object!>!
Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckResult.Description.get -> string?
Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckResult.Exception.get -> System.Exception?
@@ -30,6 +31,7 @@ Microsoft.Extensions.Diagnostics.HealthChecks.HealthReport.HealthReport(System.C
Microsoft.Extensions.Diagnostics.HealthChecks.HealthReport.Status.get -> Microsoft.Extensions.Diagnostics.HealthChecks.HealthStatus
Microsoft.Extensions.Diagnostics.HealthChecks.HealthReport.TotalDuration.get -> System.TimeSpan
Microsoft.Extensions.Diagnostics.HealthChecks.HealthReportEntry
+Microsoft.Extensions.Diagnostics.HealthChecks.HealthReportEntry.HealthReportEntry() -> void
Microsoft.Extensions.Diagnostics.HealthChecks.HealthReportEntry.Data.get -> System.Collections.Generic.IReadOnlyDictionary<string!, object!>!
Microsoft.Extensions.Diagnostics.HealthChecks.HealthReportEntry.Description.get -> string?
Microsoft.Extensions.Diagnostics.HealthChecks.HealthReportEntry.Duration.get -> System.TimeSpan
diff --git a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs
index 2536b703bd..45e8a8963d 100644
--- a/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs
+++ b/src/HealthChecks/HealthChecks/src/DefaultHealthCheckService.cs
@@ -15,7 +15,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.Diagnostics.HealthChecks;
-internal partial class DefaultHealthCheckService : HealthCheckService
+internal sealed partial class DefaultHealthCheckService : HealthCheckService
{
private readonly IServiceScopeFactory _scopeFactory;
private readonly IOptions<HealthCheckServiceOptions> _options;
@@ -266,7 +266,7 @@ internal partial class DefaultHealthCheckService : HealthCheckService
}
}
- internal class HealthCheckDataLogValue : IReadOnlyList<KeyValuePair<string, object>>
+ internal sealed class HealthCheckDataLogValue : IReadOnlyList<KeyValuePair<string, object>>
{
private readonly string _name;
private readonly List<KeyValuePair<string, object>> _values;
diff --git a/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilder.cs b/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilder.cs
index da244be847..b0e0b78257 100644
--- a/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilder.cs
+++ b/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilder.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Diagnostics.HealthChecks;
namespace Microsoft.Extensions.DependencyInjection;
-internal class HealthChecksBuilder : IHealthChecksBuilder
+internal sealed class HealthChecksBuilder : IHealthChecksBuilder
{
public HealthChecksBuilder(IServiceCollection services)
{
diff --git a/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilderAddCheckExtensions.cs b/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilderAddCheckExtensions.cs
index 1305ba2387..44f2436f1d 100644
--- a/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilderAddCheckExtensions.cs
+++ b/src/HealthChecks/HealthChecks/src/DependencyInjection/HealthChecksBuilderAddCheckExtensions.cs
@@ -95,7 +95,7 @@ public static class HealthChecksBuilderAddCheckExtensions
/// access to services from the dependency injection container.
/// </remarks>
// 2.0 BACKCOMPAT OVERLOAD -- DO NOT TOUCH
- public static IHealthChecksBuilder AddCheck<T>(
+ public static IHealthChecksBuilder AddCheck<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
this IHealthChecksBuilder builder,
string name,
HealthStatus? failureStatus,
@@ -123,8 +123,7 @@ public static class HealthChecksBuilderAddCheckExtensions
/// with any lifetime it will be used. Otherwise an instance of type <typeparamref name="T"/> will be constructed with
/// access to services from the dependency injection container.
/// </remarks>
- [SuppressMessage("ApiDesign", "RS0027:Public API with optional parameter(s) should have the most parameters amongst its public overloads.", Justification = "Required to maintain compatibility")]
- public static IHealthChecksBuilder AddCheck<T>(
+ public static IHealthChecksBuilder AddCheck<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
this IHealthChecksBuilder builder,
string name,
HealthStatus? failureStatus = null,
@@ -141,7 +140,12 @@ public static class HealthChecksBuilderAddCheckExtensions
throw new ArgumentNullException(nameof(name));
}
- return builder.Add(new HealthCheckRegistration(name, s => ActivatorUtilities.GetServiceOrCreateInstance<T>(s), failureStatus, tags, timeout));
+ return builder.Add(new HealthCheckRegistration(name, GetServiceOrCreateInstance, failureStatus, tags, timeout));
+
+ [UnconditionalSuppressMessage("Trimming", "IL2091",
+ Justification = "DynamicallyAccessedMemberTypes.PublicConstructors is enforced by calling method.")]
+ static T GetServiceOrCreateInstance(IServiceProvider serviceProvider) =>
+ ActivatorUtilities.GetServiceOrCreateInstance<T>(serviceProvider);
}
// NOTE: AddTypeActivatedCheck has overloads rather than default parameters values, because default parameter values don't
@@ -159,7 +163,9 @@ public static class HealthChecksBuilderAddCheckExtensions
/// This method will use <see cref="ActivatorUtilities.CreateInstance{T}(IServiceProvider, object[])"/> to create the health check
/// instance when needed. Additional arguments can be provided to the constructor via <paramref name="args"/>.
/// </remarks>
- public static IHealthChecksBuilder AddTypeActivatedCheck<T>(this IHealthChecksBuilder builder, string name, params object[] args) where T : class, IHealthCheck
+ public static IHealthChecksBuilder AddTypeActivatedCheck<
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
+ this IHealthChecksBuilder builder, string name, params object[] args) where T : class, IHealthCheck
{
if (builder == null)
{
@@ -190,7 +196,8 @@ public static class HealthChecksBuilderAddCheckExtensions
/// This method will use <see cref="ActivatorUtilities.CreateInstance{T}(IServiceProvider, object[])"/> to create the health check
/// instance when needed. Additional arguments can be provided to the constructor via <paramref name="args"/>.
/// </remarks>
- public static IHealthChecksBuilder AddTypeActivatedCheck<T>(
+ public static IHealthChecksBuilder AddTypeActivatedCheck<
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
this IHealthChecksBuilder builder,
string name,
HealthStatus? failureStatus,
@@ -226,7 +233,8 @@ public static class HealthChecksBuilderAddCheckExtensions
/// This method will use <see cref="ActivatorUtilities.CreateInstance{T}(IServiceProvider, object[])"/> to create the health check
/// instance when needed. Additional arguments can be provided to the constructor via <paramref name="args"/>.
/// </remarks>
- public static IHealthChecksBuilder AddTypeActivatedCheck<T>(
+ public static IHealthChecksBuilder AddTypeActivatedCheck<
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
this IHealthChecksBuilder builder,
string name,
HealthStatus? failureStatus,
@@ -243,7 +251,12 @@ public static class HealthChecksBuilderAddCheckExtensions
throw new ArgumentNullException(nameof(name));
}
- return builder.Add(new HealthCheckRegistration(name, s => ActivatorUtilities.CreateInstance<T>(s, args), failureStatus, tags));
+ return builder.Add(new HealthCheckRegistration(name, CreateInstance, failureStatus, tags));
+
+ [UnconditionalSuppressMessage("Trimming", "IL2091",
+ Justification = "DynamicallyAccessedMemberTypes.PublicConstructors is enforced by calling method.")]
+ T CreateInstance(IServiceProvider serviceProvider) =>
+ ActivatorUtilities.CreateInstance<T>(serviceProvider, args);
}
/// <summary>
@@ -264,7 +277,8 @@ public static class HealthChecksBuilderAddCheckExtensions
/// This method will use <see cref="ActivatorUtilities.CreateInstance{T}(IServiceProvider, object[])"/> to create the health check
/// instance when needed. Additional arguments can be provided to the constructor via <paramref name="args"/>.
/// </remarks>
- public static IHealthChecksBuilder AddTypeActivatedCheck<T>(
+ public static IHealthChecksBuilder AddTypeActivatedCheck<
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] T>(
this IHealthChecksBuilder builder,
string name,
HealthStatus? failureStatus,
@@ -282,6 +296,10 @@ public static class HealthChecksBuilderAddCheckExtensions
throw new ArgumentNullException(nameof(name));
}
- return builder.Add(new HealthCheckRegistration(name, s => ActivatorUtilities.CreateInstance<T>(s, args), failureStatus, tags, timeout));
+ return builder.Add(new HealthCheckRegistration(name, CreateInstance, failureStatus, tags, timeout));
+
+ [UnconditionalSuppressMessage("Trimming", "IL2091",
+ Justification = "DynamicallyAccessedMemberTypes.PublicConstructors is enforced by calling method.")]
+ T CreateInstance(IServiceProvider serviceProvider) => ActivatorUtilities.CreateInstance<T>(serviceProvider, args);
}
}
diff --git a/src/HealthChecks/HealthChecks/src/HealthCheckLogScope.cs b/src/HealthChecks/HealthChecks/src/HealthCheckLogScope.cs
index 8b86cf793f..382a696437 100644
--- a/src/HealthChecks/HealthChecks/src/HealthCheckLogScope.cs
+++ b/src/HealthChecks/HealthChecks/src/HealthCheckLogScope.cs
@@ -7,7 +7,7 @@ using System.Collections.Generic;
namespace Microsoft.Extensions.Diagnostics.HealthChecks;
-internal class HealthCheckLogScope : IReadOnlyList<KeyValuePair<string, object>>
+internal sealed class HealthCheckLogScope : IReadOnlyList<KeyValuePair<string, object>>
{
public string HealthCheckName { get; }
diff --git a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj
index 8cb2a979d8..0bd7265565 100644
--- a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj
+++ b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj
@@ -11,9 +11,7 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>diagnostics;healthchecks</PackageTags>
<IsAspNetCoreApp>true</IsAspNetCoreApp>
- <Nullable>enable</Nullable>
- <!-- workaround https://github.com/dotnet/roslyn/issues/52527 -->
- <NoWarn>$(NoWarn);SYSLIB1006</NoWarn>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
@@ -23,6 +21,9 @@ Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder
<ItemGroup>
<Compile Include="$(SharedSourceRoot)NonCapturingTimer\*.cs" />
<Compile Include="$(SharedSourceRoot)ValueStopwatch\*.cs" />
+
+ <Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
+ Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostApplicationLifetime.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostApplicationLifetime.cs
index 532cc120ff..b1f64e784c 100644
--- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostApplicationLifetime.cs
+++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostApplicationLifetime.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.Hosting;
#pragma warning disable CS0618 // Type or member is obsolete
-internal class GenericWebHostApplicationLifetime : IApplicationLifetime
+internal sealed class GenericWebHostApplicationLifetime : IApplicationLifetime
#pragma warning restore CS0618 // Type or member is obsolete
{
private readonly IHostApplicationLifetime _applicationLifetime;
diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs
index df03b1c775..f8e2a050bd 100644
--- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs
+++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostBuilder.cs
@@ -433,7 +433,7 @@ internal sealed class GenericWebHostBuilder : IWebHostBuilder, ISupportsStartup,
}
// This exists just so that we can use ActivatorUtilities.CreateInstance on the Startup class
- private class HostServiceProvider : IServiceProvider
+ private sealed class HostServiceProvider : IServiceProvider
{
private readonly WebHostBuilderContext _context;
diff --git a/src/Hosting/Hosting/src/GenericHost/GenericWebHostServiceOptions.cs b/src/Hosting/Hosting/src/GenericHost/GenericWebHostServiceOptions.cs
index c4ca5d237d..ec00cbde46 100644
--- a/src/Hosting/Hosting/src/GenericHost/GenericWebHostServiceOptions.cs
+++ b/src/Hosting/Hosting/src/GenericHost/GenericWebHostServiceOptions.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Builder;
namespace Microsoft.AspNetCore.Hosting;
-internal class GenericWebHostServiceOptions
+internal sealed class GenericWebHostServiceOptions
{
public Action<IApplicationBuilder>? ConfigureApplication { get; set; }
diff --git a/src/Hosting/Hosting/src/Http/DefaultHttpContextFactory.cs b/src/Hosting/Hosting/src/Http/DefaultHttpContextFactory.cs
index ceb7bcb364..7460645339 100644
--- a/src/Hosting/Hosting/src/Http/DefaultHttpContextFactory.cs
+++ b/src/Hosting/Hosting/src/Http/DefaultHttpContextFactory.cs
@@ -49,7 +49,7 @@ public class DefaultHttpContextFactory : IHttpContextFactory
}
var httpContext = new DefaultHttpContext(featureCollection);
- Initialize(httpContext);
+ Initialize(httpContext, featureCollection);
return httpContext;
}
@@ -61,12 +61,6 @@ public class DefaultHttpContextFactory : IHttpContextFactory
httpContext.Initialize(featureCollection);
- Initialize(httpContext);
- }
-
- [MethodImpl(MethodImplOptions.AggressiveInlining)]
- private DefaultHttpContext Initialize(DefaultHttpContext httpContext)
- {
if (_httpContextAccessor != null)
{
_httpContextAccessor.HttpContext = httpContext;
@@ -74,8 +68,6 @@ public class DefaultHttpContextFactory : IHttpContextFactory
httpContext.FormOptions = _formOptions;
httpContext.ServiceScopeFactory = _serviceScopeFactory;
-
- return httpContext;
}
/// <summary>
diff --git a/src/Hosting/Hosting/src/Internal/ApplicationLifetime.cs b/src/Hosting/Hosting/src/Internal/ApplicationLifetime.cs
index 4f7063414a..ed95c128ab 100644
--- a/src/Hosting/Hosting/src/Internal/ApplicationLifetime.cs
+++ b/src/Hosting/Hosting/src/Internal/ApplicationLifetime.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Hosting;
/// Allows consumers to perform cleanup during a graceful shutdown.
/// </summary>
#pragma warning disable CS0618 // Type or member is obsolete
-internal class ApplicationLifetime : IApplicationLifetime, Extensions.Hosting.IApplicationLifetime, IHostApplicationLifetime
+internal sealed class ApplicationLifetime : IApplicationLifetime, Extensions.Hosting.IApplicationLifetime, IHostApplicationLifetime
#pragma warning restore CS0618 // Type or member is obsolete
{
private readonly CancellationTokenSource _startedSource = new CancellationTokenSource();
diff --git a/src/Hosting/Hosting/src/Internal/ConfigureBuilder.cs b/src/Hosting/Hosting/src/Internal/ConfigureBuilder.cs
index 228080b7a1..4d887c71ee 100644
--- a/src/Hosting/Hosting/src/Internal/ConfigureBuilder.cs
+++ b/src/Hosting/Hosting/src/Internal/ConfigureBuilder.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Hosting;
-internal class ConfigureBuilder
+internal sealed class ConfigureBuilder
{
public ConfigureBuilder(MethodInfo configure)
{
diff --git a/src/Hosting/Hosting/src/Internal/ConfigureContainerBuilder.cs b/src/Hosting/Hosting/src/Internal/ConfigureContainerBuilder.cs
index 0e640c7154..5056344d21 100644
--- a/src/Hosting/Hosting/src/Internal/ConfigureContainerBuilder.cs
+++ b/src/Hosting/Hosting/src/Internal/ConfigureContainerBuilder.cs
@@ -6,7 +6,7 @@ using System.Reflection;
namespace Microsoft.AspNetCore.Hosting;
-internal class ConfigureContainerBuilder
+internal sealed class ConfigureContainerBuilder
{
public ConfigureContainerBuilder(MethodInfo? configureContainerMethod)
{
diff --git a/src/Hosting/Hosting/src/Internal/ConfigureServicesBuilder.cs b/src/Hosting/Hosting/src/Internal/ConfigureServicesBuilder.cs
index e05deb2dd5..f8ecff743c 100644
--- a/src/Hosting/Hosting/src/Internal/ConfigureServicesBuilder.cs
+++ b/src/Hosting/Hosting/src/Internal/ConfigureServicesBuilder.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Hosting;
-internal class ConfigureServicesBuilder
+internal sealed class ConfigureServicesBuilder
{
public ConfigureServicesBuilder(MethodInfo? configureServices)
{
diff --git a/src/Hosting/Hosting/src/Internal/HostedServiceExecutor.cs b/src/Hosting/Hosting/src/Internal/HostedServiceExecutor.cs
index 0a5b3c64d2..9e76c737c3 100644
--- a/src/Hosting/Hosting/src/Internal/HostedServiceExecutor.cs
+++ b/src/Hosting/Hosting/src/Internal/HostedServiceExecutor.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Hosting;
-internal class HostedServiceExecutor
+internal sealed class HostedServiceExecutor
{
private readonly IEnumerable<IHostedService> _services;
private readonly ILogger<HostedServiceExecutor> _logger;
diff --git a/src/Hosting/Hosting/src/Internal/HostingApplication.cs b/src/Hosting/Hosting/src/Internal/HostingApplication.cs
index 7e8a348dc4..a011cf6ab6 100644
--- a/src/Hosting/Hosting/src/Internal/HostingApplication.cs
+++ b/src/Hosting/Hosting/src/Internal/HostingApplication.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Hosting;
-internal class HostingApplication : IHttpApplication<HostingApplication.Context>
+internal sealed class HostingApplication : IHttpApplication<HostingApplication.Context>
{
private readonly RequestDelegate _application;
private readonly IHttpContextFactory? _httpContextFactory;
@@ -116,7 +116,7 @@ internal class HostingApplication : IHttpApplication<HostingApplication.Context>
context.Reset();
}
- internal class Context
+ internal sealed class Context
{
public HttpContext? HttpContext { get; set; }
public IDisposable? Scope { get; set; }
diff --git a/src/Hosting/Hosting/src/Internal/HostingApplicationDiagnostics.cs b/src/Hosting/Hosting/src/Internal/HostingApplicationDiagnostics.cs
index 87e9beb245..381a63847b 100644
--- a/src/Hosting/Hosting/src/Internal/HostingApplicationDiagnostics.cs
+++ b/src/Hosting/Hosting/src/Internal/HostingApplicationDiagnostics.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Hosting;
-internal class HostingApplicationDiagnostics
+internal sealed class HostingApplicationDiagnostics
{
private static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency;
@@ -224,7 +224,7 @@ internal class HostingApplicationDiagnostics
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026",
Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")]
- private static void WriteDiagnosticEvent<TValue>(
+ private static void WriteDiagnosticEvent<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] TValue>(
DiagnosticSource diagnosticSource, string name, TValue value)
{
diagnosticSource.Write(name, value);
@@ -310,17 +310,8 @@ internal class HostingApplicationDiagnostics
[MethodImpl(MethodImplOptions.NoInlining)]
private Activity? StartActivity(HttpContext httpContext, bool loggingEnabled, bool diagnosticListenerActivityCreationEnabled, out bool hasDiagnosticListener)
{
- var activity = _activitySource.CreateActivity(ActivityName, ActivityKind.Server);
- if (activity is null && (loggingEnabled || diagnosticListenerActivityCreationEnabled))
- {
- activity = new Activity(ActivityName);
- }
hasDiagnosticListener = false;
- if (activity is null)
- {
- return null;
- }
var headers = httpContext.Request.Headers;
_propagator.ExtractTraceIdAndState(headers,
static (object? carrier, string fieldName, out string? fieldValue, out IEnumerable<string>? fieldValues) =>
@@ -332,9 +323,44 @@ internal class HostingApplicationDiagnostics
out var requestId,
out var traceState);
+ Activity? activity = null;
+ if (_activitySource.HasListeners())
+ {
+ if (ActivityContext.TryParse(requestId, traceState, isRemote: true, out ActivityContext context))
+ {
+ // The requestId used the W3C ID format. Unfortunately, the ActivitySource.CreateActivity overload that
+ // takes a string parentId never sets HasRemoteParent to true. We work around that by calling the
+ // ActivityContext overload instead which sets HasRemoteParent to parentContext.IsRemote.
+ // https://github.com/dotnet/aspnetcore/pull/41568#discussion_r868733305
+ activity = _activitySource.CreateActivity(ActivityName, ActivityKind.Server, context);
+ }
+ else
+ {
+ // Pass in the ID we got from the headers if there was one.
+ activity = _activitySource.CreateActivity(ActivityName, ActivityKind.Server, string.IsNullOrEmpty(requestId) ? null! : requestId);
+ }
+ }
+
+ if (activity is null)
+ {
+ // CreateActivity didn't create an Activity (this is an optimization for the
+ // case when there are no listeners). Let's create it here if needed.
+ if (loggingEnabled || diagnosticListenerActivityCreationEnabled)
+ {
+ activity = new Activity(ActivityName);
+ if (!string.IsNullOrEmpty(requestId))
+ {
+ activity.SetParentId(requestId);
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
if (!string.IsNullOrEmpty(requestId))
{
- activity.SetParentId(requestId);
if (!string.IsNullOrEmpty(traceState))
{
activity.TraceStateString = traceState;
@@ -387,6 +413,21 @@ internal class HostingApplicationDiagnostics
}
// These are versions of DiagnosticSource.Start/StopActivity that don't allocate strings per call (see https://github.com/dotnet/corefx/issues/37055)
+ // DynamicDependency matches the properties selected in:
+ // https://github.com/dotnet/diagnostics/blob/7cc6fbef613cdfe5ff64393120d59d7a15e98bd6/src/Microsoft.Diagnostics.Monitoring.EventPipe/Configuration/HttpRequestSourceConfiguration.cs#L20-L33
+ [DynamicDependency(nameof(HttpContext.Request), typeof(HttpContext))]
+ [DynamicDependency(nameof(HttpRequest.Scheme), typeof(HttpRequest))]
+ [DynamicDependency(nameof(HttpRequest.Host), typeof(HttpRequest))]
+ [DynamicDependency(nameof(HttpRequest.PathBase), typeof(HttpRequest))]
+ [DynamicDependency(nameof(HttpRequest.QueryString), typeof(HttpRequest))]
+ [DynamicDependency(nameof(HttpRequest.Path), typeof(HttpRequest))]
+ [DynamicDependency(nameof(HttpRequest.Method), typeof(HttpRequest))]
+ [DynamicDependency(nameof(HttpRequest.Headers), typeof(HttpRequest))]
+ [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(QueryString))]
+ [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(HostString))]
+ [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(PathString))]
+ // OpenTelemetry gets the context from the context using the DefaultHttpContext.HttpContext property.
+ [DynamicDependency(nameof(DefaultHttpContext.HttpContext), typeof(DefaultHttpContext))]
private Activity StartActivity(Activity activity, HttpContext httpContext)
{
activity.Start();
@@ -394,6 +435,13 @@ internal class HostingApplicationDiagnostics
return activity;
}
+ // DynamicDependency matches the properties selected in:
+ // https://github.com/dotnet/diagnostics/blob/7cc6fbef613cdfe5ff64393120d59d7a15e98bd6/src/Microsoft.Diagnostics.Monitoring.EventPipe/Configuration/HttpRequestSourceConfiguration.cs#L35-L38
+ [DynamicDependency(nameof(HttpContext.Response), typeof(HttpContext))]
+ [DynamicDependency(nameof(HttpResponse.StatusCode), typeof(HttpResponse))]
+ [DynamicDependency(nameof(HttpResponse.Headers), typeof(HttpResponse))]
+ // OpenTelemetry gets the context from the context using the DefaultHttpContext.HttpContext property.
+ [DynamicDependency(nameof(DefaultHttpContext.HttpContext), typeof(DefaultHttpContext))]
private void StopActivity(Activity activity, HttpContext httpContext)
{
// Stop sets the end time if it was unset, but we want it set before we issue the write
diff --git a/src/Hosting/Hosting/src/Internal/HostingEnvironment.cs b/src/Hosting/Hosting/src/Internal/HostingEnvironment.cs
index e2ce2b5781..abd222e8dc 100644
--- a/src/Hosting/Hosting/src/Internal/HostingEnvironment.cs
+++ b/src/Hosting/Hosting/src/Internal/HostingEnvironment.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.FileProviders;
namespace Microsoft.AspNetCore.Hosting;
#pragma warning disable CS0618 // Type or member is obsolete
-internal class HostingEnvironment : IHostingEnvironment, Extensions.Hosting.IHostingEnvironment, IWebHostEnvironment
+internal sealed class HostingEnvironment : IHostingEnvironment, Extensions.Hosting.IHostingEnvironment, IWebHostEnvironment
#pragma warning restore CS0618 // Type or member is obsolete
{
public string EnvironmentName { get; set; } = Extensions.Hosting.Environments.Production;
diff --git a/src/Hosting/Hosting/src/Internal/HostingEnvironmentExtensions.cs b/src/Hosting/Hosting/src/Internal/HostingEnvironmentExtensions.cs
index 5091569448..851774be85 100644
--- a/src/Hosting/Hosting/src/Internal/HostingEnvironmentExtensions.cs
+++ b/src/Hosting/Hosting/src/Internal/HostingEnvironmentExtensions.cs
@@ -116,7 +116,7 @@ internal static class HostingEnvironmentExtensions
}
hostingEnvironment.EnvironmentName =
- baseEnvironment?.EnvironmentName ??
+ baseEnvironment?.EnvironmentName ??
options.Environment ??
hostingEnvironment.EnvironmentName;
}
diff --git a/src/Hosting/Hosting/src/Internal/HostingRequestFinishedLog.cs b/src/Hosting/Hosting/src/Internal/HostingRequestFinishedLog.cs
index 23b8172345..f22edd59cf 100644
--- a/src/Hosting/Hosting/src/Internal/HostingRequestFinishedLog.cs
+++ b/src/Hosting/Hosting/src/Internal/HostingRequestFinishedLog.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Hosting;
using static HostingRequestStartingLog;
-internal class HostingRequestFinishedLog : IReadOnlyList<KeyValuePair<string, object?>>
+internal sealed class HostingRequestFinishedLog : IReadOnlyList<KeyValuePair<string, object?>>
{
internal static readonly Func<object, Exception?, string> Callback = (state, exception) => ((HostingRequestFinishedLog)state).ToString();
diff --git a/src/Hosting/Hosting/src/Internal/HostingRequestStartingLog.cs b/src/Hosting/Hosting/src/Internal/HostingRequestStartingLog.cs
index 54e4d3b86e..abae05c865 100644
--- a/src/Hosting/Hosting/src/Internal/HostingRequestStartingLog.cs
+++ b/src/Hosting/Hosting/src/Internal/HostingRequestStartingLog.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Hosting;
-internal class HostingRequestStartingLog : IReadOnlyList<KeyValuePair<string, object?>>
+internal sealed class HostingRequestStartingLog : IReadOnlyList<KeyValuePair<string, object?>>
{
private const string LogPreamble = "Request starting ";
private const string EmptyEntry = "-";
diff --git a/src/Hosting/Hosting/src/Internal/StartupLoader.cs b/src/Hosting/Hosting/src/Internal/StartupLoader.cs
index 4a00bd0593..ee23eda69c 100644
--- a/src/Hosting/Hosting/src/Internal/StartupLoader.cs
+++ b/src/Hosting/Hosting/src/Internal/StartupLoader.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Hosting;
-internal class StartupLoader
+internal sealed class StartupLoader
{
// Creates an <see cref="StartupMethods"/> instance with the actions to run for configuring the application services and the
// request pipeline of the application.
@@ -68,7 +68,7 @@ internal class StartupLoader
public abstract Func<IServiceCollection, IServiceProvider> Build();
}
- private class ConfigureServicesDelegateBuilder<TContainerBuilder> : ConfigureServicesDelegateBuilder where TContainerBuilder : notnull
+ private sealed class ConfigureServicesDelegateBuilder<TContainerBuilder> : ConfigureServicesDelegateBuilder where TContainerBuilder : notnull
{
public ConfigureServicesDelegateBuilder(
IServiceProvider hostingServiceProvider,
diff --git a/src/Hosting/Hosting/src/Internal/StartupMethods.cs b/src/Hosting/Hosting/src/Internal/StartupMethods.cs
index c07a8a98b5..5722048af5 100644
--- a/src/Hosting/Hosting/src/Internal/StartupMethods.cs
+++ b/src/Hosting/Hosting/src/Internal/StartupMethods.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Hosting;
-internal class StartupMethods
+internal sealed class StartupMethods
{
public StartupMethods(object? instance, Action<IApplicationBuilder> configure, Func<IServiceCollection, IServiceProvider> configureServices)
{
diff --git a/src/Hosting/Hosting/src/Internal/WebHost.cs b/src/Hosting/Hosting/src/Internal/WebHost.cs
index 44fbc1bacb..b2350b6ad0 100644
--- a/src/Hosting/Hosting/src/Internal/WebHost.cs
+++ b/src/Hosting/Hosting/src/Internal/WebHost.cs
@@ -371,7 +371,7 @@ internal sealed partial class WebHost : IWebHost, IAsyncDisposable
[LoggerMessage(4, LogLevel.Debug, "Hosting started", EventName = "Started")]
public static partial void Started(ILogger logger);
- [LoggerMessage(5, LogLevel.Debug, "Hosting shutdown", EventName = "Started")]
+ [LoggerMessage(5, LogLevel.Debug, "Hosting shutdown", EventName = "Shutdown")]
public static partial void Shutdown(ILogger logger);
[LoggerMessage(12, LogLevel.Debug, "Server shutdown exception", EventName = "ServerShutdownException")]
diff --git a/src/Hosting/Hosting/src/Internal/WebHostLifetime.cs b/src/Hosting/Hosting/src/Internal/WebHostLifetime.cs
index f66c286bc8..00481689ce 100644
--- a/src/Hosting/Hosting/src/Internal/WebHostLifetime.cs
+++ b/src/Hosting/Hosting/src/Internal/WebHostLifetime.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Hosting;
-internal class WebHostLifetime : IDisposable
+internal sealed class WebHostLifetime : IDisposable
{
private readonly CancellationTokenSource _cts;
private readonly ManualResetEventSlim _resetEvent;
diff --git a/src/Hosting/Hosting/src/Internal/WebHostOptions.cs b/src/Hosting/Hosting/src/Internal/WebHostOptions.cs
index 60874be56a..d34cc0f8db 100644
--- a/src/Hosting/Hosting/src/Internal/WebHostOptions.cs
+++ b/src/Hosting/Hosting/src/Internal/WebHostOptions.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.Hosting;
-internal class WebHostOptions
+internal sealed class WebHostOptions
{
public WebHostOptions(IConfiguration primaryConfiguration, IConfiguration? fallbackConfiguration = null, IHostEnvironment? environment = null)
{
diff --git a/src/Hosting/Hosting/src/Internal/WebHostUtilities.cs b/src/Hosting/Hosting/src/Internal/WebHostUtilities.cs
index 52cafc45d4..cb3c0e189f 100644
--- a/src/Hosting/Hosting/src/Internal/WebHostUtilities.cs
+++ b/src/Hosting/Hosting/src/Internal/WebHostUtilities.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Hosting;
-internal class WebHostUtilities
+internal sealed class WebHostUtilities
{
public static bool ParseBool(string? value)
{
diff --git a/src/Hosting/Hosting/src/Startup/ConventionBasedStartup.cs b/src/Hosting/Hosting/src/Startup/ConventionBasedStartup.cs
index ffdf20a0d6..dd325f5783 100644
--- a/src/Hosting/Hosting/src/Startup/ConventionBasedStartup.cs
+++ b/src/Hosting/Hosting/src/Startup/ConventionBasedStartup.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Hosting;
-internal class ConventionBasedStartup : IStartup
+internal sealed class ConventionBasedStartup : IStartup
{
private readonly StartupMethods _methods;
diff --git a/src/Hosting/Hosting/src/WebHostBuilder.cs b/src/Hosting/Hosting/src/WebHostBuilder.cs
index 2598ae6f08..c0db8b8734 100644
--- a/src/Hosting/Hosting/src/WebHostBuilder.cs
+++ b/src/Hosting/Hosting/src/WebHostBuilder.cs
@@ -310,6 +310,7 @@ public class WebHostBuilder : IWebHostBuilder
}
[UnconditionalSuppressMessage("Trimmer", "IL2077", Justification = "Finding startup type in assembly requires unreferenced code. Surfaced to user in UseStartup(startupAssemblyName).")]
+ [UnconditionalSuppressMessage("Trimmer", "IL2072", Justification = "Finding startup type in assembly requires unreferenced code. Surfaced to user in UseStartup(startupAssemblyName).")]
private void ScanAssemblyAndRegisterStartup(ServiceCollection services, string startupAssemblyName)
{
try
diff --git a/src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs b/src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs
index aa3ea8b441..56da9f6d59 100644
--- a/src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs
+++ b/src/Hosting/Hosting/test/HostingApplicationDiagnosticsTests.cs
@@ -459,6 +459,50 @@ public class HostingApplicationDiagnosticsTests
}
[Fact]
+ public void SamplersReceiveCorrectParentAndTraceIds()
+ {
+ var testSource = new ActivitySource(Path.GetRandomFileName());
+ var hostingApplication = CreateApplication(out var features, activitySource: testSource);
+ var parentId = "";
+ var parentSpanId = "";
+ var traceId = "";
+ using var listener = new ActivityListener
+ {
+ ShouldListenTo = activitySource => ReferenceEquals(activitySource, testSource),
+ Sample = (ref ActivityCreationOptions<ActivityContext> options) => ComputeActivitySamplingResult(ref options),
+ ActivityStarted = activity =>
+ {
+ parentId = activity.ParentId;
+ parentSpanId = activity.ParentSpanId.ToHexString();
+ traceId = activity.TraceId.ToHexString();
+ }
+ };
+
+ ActivitySource.AddActivityListener(listener);
+
+ features.Set<IHttpRequestFeature>(new HttpRequestFeature()
+ {
+ Headers = new HeaderDictionary()
+ {
+ {"traceparent", "00-35aae61e3e99044eb5ea5007f2cd159b-40a8bd87c078cb4c-00"},
+ }
+ });
+
+ hostingApplication.CreateContext(features);
+ Assert.Equal("00-35aae61e3e99044eb5ea5007f2cd159b-40a8bd87c078cb4c-00", parentId);
+ Assert.Equal("40a8bd87c078cb4c", parentSpanId);
+ Assert.Equal("35aae61e3e99044eb5ea5007f2cd159b", traceId);
+
+ static ActivitySamplingResult ComputeActivitySamplingResult(ref ActivityCreationOptions<ActivityContext> options)
+ {
+ Assert.Equal("35aae61e3e99044eb5ea5007f2cd159b", options.TraceId.ToHexString());
+ Assert.Equal("40a8bd87c078cb4c", options.Parent.SpanId.ToHexString());
+
+ return ActivitySamplingResult.AllDataAndRecorded;
+ }
+ }
+
+ [Fact]
public void ActivityOnImportHookIsCalled()
{
var diagnosticListener = new DiagnosticListener("DummySource");
diff --git a/src/Hosting/Hosting/test/HostingApplicationTests.cs b/src/Hosting/Hosting/test/HostingApplicationTests.cs
index 94761ed5ee..3d263e0948 100644
--- a/src/Hosting/Hosting/test/HostingApplicationTests.cs
+++ b/src/Hosting/Hosting/test/HostingApplicationTests.cs
@@ -115,6 +115,8 @@ public class HostingApplicationTests
using var _ = dummySource.StartActivity("DummyActivity");
Assert.Same(initialActivity, activityFeature.Activity);
+ Assert.Null(activityFeature.Activity.ParentId);
+ Assert.Equal(activityFeature.Activity.Id, Activity.Current.ParentId);
Assert.NotEqual(Activity.Current, activityFeature.Activity);
// Act/Assert
@@ -156,6 +158,8 @@ public class HostingApplicationTests
using var _ = dummySource.StartActivity("DummyActivity");
Assert.Same(initialActivity, activityFeature.Activity);
+ Assert.Null(activityFeature.Activity.ParentId);
+ Assert.Equal(activityFeature.Activity.Id, Activity.Current.ParentId);
Assert.NotEqual(Activity.Current, activityFeature.Activity);
// Act/Assert
diff --git a/src/Hosting/Hosting/test/Http/DefaultHttpContextFactoryTests.cs b/src/Hosting/Hosting/test/Http/DefaultHttpContextFactoryTests.cs
index d8a97f3b85..e8999f555c 100644
--- a/src/Hosting/Hosting/test/Http/DefaultHttpContextFactoryTests.cs
+++ b/src/Hosting/Hosting/test/Http/DefaultHttpContextFactoryTests.cs
@@ -79,4 +79,41 @@ public class DefaultHttpContextFactoryTests
Assert.Same(services.GetRequiredService<IServiceScopeFactory>(), context.ServiceScopeFactory);
}
+
+ [Fact]
+ public void CreateHttpContextSetsActiveField()
+ {
+ // Arrange
+ var services = new ServiceCollection()
+ .AddOptions()
+ .BuildServiceProvider();
+ var contextFactory = new DefaultHttpContextFactory(services);
+
+ // Act & Assert
+ var context = contextFactory.Create(new FeatureCollection()) as DefaultHttpContext;
+ Assert.True(context._active);
+
+ context.Uninitialize();
+
+ Assert.False(context._active);
+ }
+
+ [Fact]
+ public void InitializeHttpContextSetsActiveField()
+ {
+ // Arrange
+ var services = new ServiceCollection()
+ .AddOptions()
+ .BuildServiceProvider();
+ var contextFactory = new DefaultHttpContextFactory(services);
+
+ // Act & Assert
+ var context = new DefaultHttpContext();
+ contextFactory.Initialize(context, new FeatureCollection());
+ Assert.True(context._active);
+
+ context.Uninitialize();
+
+ Assert.False(context._active);
+ }
}
diff --git a/src/Hosting/Server.IntegrationTesting/src/Common/LoggingHandler.cs b/src/Hosting/Server.IntegrationTesting/src/Common/LoggingHandler.cs
index 3670d09af4..d16f351178 100644
--- a/src/Hosting/Server.IntegrationTesting/src/Common/LoggingHandler.cs
+++ b/src/Hosting/Server.IntegrationTesting/src/Common/LoggingHandler.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Net.Http;
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.IntegrationTesting;
-internal class LoggingHandler : DelegatingHandler
+internal sealed class LoggingHandler : DelegatingHandler
{
private readonly ILogger _logger;
diff --git a/src/Hosting/Server.IntegrationTesting/src/Deployers/RemoteWindowsDeployer/RemoteWindowsDeployer.cs b/src/Hosting/Server.IntegrationTesting/src/Deployers/RemoteWindowsDeployer/RemoteWindowsDeployer.cs
index b7b8289375..c82011801f 100644
--- a/src/Hosting/Server.IntegrationTesting/src/Deployers/RemoteWindowsDeployer/RemoteWindowsDeployer.cs
+++ b/src/Hosting/Server.IntegrationTesting/src/Deployers/RemoteWindowsDeployer/RemoteWindowsDeployer.cs
@@ -337,7 +337,7 @@ public class RemoteWindowsDeployer : ApplicationDeployer
return scripts;
}
- private class Scripts
+ private sealed class Scripts
{
public Scripts(string remotePSSessionHelper, string startServer, string stopServer)
{
diff --git a/src/Hosting/Server.IntegrationTesting/src/ProcessHelpers.cs b/src/Hosting/Server.IntegrationTesting/src/ProcessHelpers.cs
index 2a1c0e1553..86caa682cd 100644
--- a/src/Hosting/Server.IntegrationTesting/src/ProcessHelpers.cs
+++ b/src/Hosting/Server.IntegrationTesting/src/ProcessHelpers.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.IntegrationTesting;
-internal class ProcessHelpers
+internal sealed class ProcessHelpers
{
public static void AddEnvironmentVariablesToProcess(ProcessStartInfo startInfo, IDictionary<string, string> environmentVariables, ILogger logger)
{
diff --git a/src/Hosting/TestHost/src/ApplicationWrapper.cs b/src/Hosting/TestHost/src/ApplicationWrapper.cs
index bc7ac2b08e..71b08bf039 100644
--- a/src/Hosting/TestHost/src/ApplicationWrapper.cs
+++ b/src/Hosting/TestHost/src/ApplicationWrapper.cs
@@ -15,7 +15,7 @@ internal abstract class ApplicationWrapper
internal abstract void DisposeContext(object context, Exception? exception);
}
-internal class ApplicationWrapper<TContext> : ApplicationWrapper, IHttpApplication<TContext> where TContext : notnull
+internal sealed class ApplicationWrapper<TContext> : ApplicationWrapper, IHttpApplication<TContext> where TContext : notnull
{
private readonly IHttpApplication<TContext> _application;
private readonly Action _preProcessRequestAsync;
diff --git a/src/Hosting/TestHost/src/AsyncStreamWrapper.cs b/src/Hosting/TestHost/src/AsyncStreamWrapper.cs
index 38734191d1..7754c45d1c 100644
--- a/src/Hosting/TestHost/src/AsyncStreamWrapper.cs
+++ b/src/Hosting/TestHost/src/AsyncStreamWrapper.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.TestHost;
-internal class AsyncStreamWrapper : Stream
+internal sealed class AsyncStreamWrapper : Stream
{
private readonly Stream _inner;
private readonly Func<bool> _allowSynchronousIO;
diff --git a/src/Hosting/TestHost/src/ClientHandler.cs b/src/Hosting/TestHost/src/ClientHandler.cs
index 7ce77c8eea..c95b14a941 100644
--- a/src/Hosting/TestHost/src/ClientHandler.cs
+++ b/src/Hosting/TestHost/src/ClientHandler.cs
@@ -20,6 +20,7 @@ namespace Microsoft.AspNetCore.TestHost;
public class ClientHandler : HttpMessageHandler
{
private readonly ApplicationWrapper _application;
+ private readonly Action<HttpContext> _additionalContextConfiguration;
private readonly PathString _pathBase;
/// <summary>
@@ -27,9 +28,11 @@ public class ClientHandler : HttpMessageHandler
/// </summary>
/// <param name="pathBase">The base path.</param>
/// <param name="application">The <see cref="IHttpApplication{TContext}"/>.</param>
- internal ClientHandler(PathString pathBase, ApplicationWrapper application)
+ /// <param name="additionalContextConfiguration">The action to additionally configure <see cref="HttpContext"/>.</param>
+ internal ClientHandler(PathString pathBase, ApplicationWrapper application, Action<HttpContext>? additionalContextConfiguration = null)
{
_application = application ?? throw new ArgumentNullException(nameof(application));
+ _additionalContextConfiguration = additionalContextConfiguration ?? NoExtraConfiguration;
// PathString.StartsWithSegments that we use below requires the base path to not end in a slash.
if (pathBase.HasValue && pathBase.Value.EndsWith('/'))
@@ -65,8 +68,6 @@ public class ClientHandler : HttpMessageHandler
if (requestContent != null)
{
- // Read content from the request HttpContent into a pipe in a background task. This will allow the request
- // delegate to start before the request HttpContent is complete. A background task allows duplex streaming scenarios.
contextBuilder.SendRequestStream(async writer =>
{
if (requestContent is StreamContent)
@@ -165,6 +166,8 @@ public class ClientHandler : HttpMessageHandler
req.QueryString = QueryString.FromUriComponent(request.RequestUri);
});
+ contextBuilder.Configure((context, _) => _additionalContextConfiguration(context));
+
var response = new HttpResponseMessage();
// Copy trailers to the response message when the response stream is complete
@@ -202,4 +205,9 @@ public class ClientHandler : HttpMessageHandler
}
return response;
}
+
+ private static void NoExtraConfiguration(HttpContext context)
+ {
+ // Intentional no op
+ }
}
diff --git a/src/Hosting/TestHost/src/HttpContextBuilder.cs b/src/Hosting/TestHost/src/HttpContextBuilder.cs
index 661dc0b14c..87f9d889c5 100644
--- a/src/Hosting/TestHost/src/HttpContextBuilder.cs
+++ b/src/Hosting/TestHost/src/HttpContextBuilder.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost;
-internal class HttpContextBuilder : IHttpBodyControlFeature, IHttpResetFeature
+internal sealed class HttpContextBuilder : IHttpBodyControlFeature, IHttpResetFeature
{
private readonly ApplicationWrapper _application;
private readonly bool _preserveExecutionContext;
@@ -25,7 +25,7 @@ internal class HttpContextBuilder : IHttpBodyControlFeature, IHttpResetFeature
private readonly Pipe _requestPipe;
private Action<HttpContext>? _responseReadCompleteCallback;
- private Task? _sendRequestStreamTask;
+ private Func<PipeWriter, Task>? _sendRequestStream;
internal HttpContextBuilder(ApplicationWrapper application, bool allowSynchronousIO, bool preserveExecutionContext)
{
@@ -75,7 +75,7 @@ internal class HttpContextBuilder : IHttpBodyControlFeature, IHttpResetFeature
throw new ArgumentNullException(nameof(sendRequestStream));
}
- _sendRequestStreamTask = sendRequestStream(_requestPipe.Writer);
+ _sendRequestStream = sendRequestStream;
}
internal void RegisterResponseReadCompleteCallback(Action<HttpContext> responseReadCompleteCallback)
@@ -107,6 +107,18 @@ internal class HttpContextBuilder : IHttpBodyControlFeature, IHttpResetFeature
_testContext = _application.CreateContext(_httpContext.Features);
try
{
+ if (_sendRequestStream != null)
+ {
+ // Read content into a pipe in a background task.
+ // A background task allows duplex streaming scenarios.
+ var requestTask = _sendRequestStream(_requestPipe.Writer);
+ // Observe synchronous exceptions immediately.
+ if (requestTask.IsCompleted)
+ {
+ await requestTask;
+ }
+ }
+
await _application.ProcessRequestAsync(_testContext);
// Determine whether request body was complete when the delegate exited.
diff --git a/src/Hosting/TestHost/src/NoopHostLifetime.cs b/src/Hosting/TestHost/src/NoopHostLifetime.cs
index 49bace2946..084622a11c 100644
--- a/src/Hosting/TestHost/src/NoopHostLifetime.cs
+++ b/src/Hosting/TestHost/src/NoopHostLifetime.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.TestHost;
-internal class NoopHostLifetime : IHostLifetime
+internal sealed class NoopHostLifetime : IHostLifetime
{
public Task StopAsync(CancellationToken cancellationToken)
{
diff --git a/src/Hosting/TestHost/src/PublicAPI.Shipped.txt b/src/Hosting/TestHost/src/PublicAPI.Shipped.txt
index 556d9f14fb..40ca32be2f 100644
--- a/src/Hosting/TestHost/src/PublicAPI.Shipped.txt
+++ b/src/Hosting/TestHost/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.AspNetCore.Http.Features.IFeatureCollection! featureCollection, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
-~Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
+Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.AspNetCore.Http.Features.IFeatureCollection! featureCollection, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
+Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
Microsoft.AspNetCore.TestHost.ClientHandler
Microsoft.AspNetCore.TestHost.HostBuilderTestServerExtensions
Microsoft.AspNetCore.TestHost.HttpResetTestException
diff --git a/src/Hosting/TestHost/src/PublicAPI.Unshipped.txt b/src/Hosting/TestHost/src/PublicAPI.Unshipped.txt
index 188507faa6..245ee831ed 100644
--- a/src/Hosting/TestHost/src/PublicAPI.Unshipped.txt
+++ b/src/Hosting/TestHost/src/PublicAPI.Unshipped.txt
@@ -1,5 +1,2 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.AspNetCore.Http.Features.IFeatureCollection! featureCollection, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
-Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.AspNetCore.Http.Features.IFeatureCollection! featureCollection, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
-Microsoft.AspNetCore.TestHost.TestServer.TestServer(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.TestHost.TestServerOptions!>! optionsAccessor) -> void
+Microsoft.AspNetCore.TestHost.TestServer.CreateHandler(System.Action<Microsoft.AspNetCore.Http.HttpContext!>! additionalContextConfiguration) -> System.Net.Http.HttpMessageHandler!
diff --git a/src/Hosting/TestHost/src/RequestBodyDetectionFeature.cs b/src/Hosting/TestHost/src/RequestBodyDetectionFeature.cs
index f9f98bcea9..35099c06c7 100644
--- a/src/Hosting/TestHost/src/RequestBodyDetectionFeature.cs
+++ b/src/Hosting/TestHost/src/RequestBodyDetectionFeature.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost;
-internal class RequestBodyDetectionFeature : IHttpRequestBodyDetectionFeature
+internal sealed class RequestBodyDetectionFeature : IHttpRequestBodyDetectionFeature
{
public RequestBodyDetectionFeature(bool canHaveBody)
{
diff --git a/src/Hosting/TestHost/src/RequestFeature.cs b/src/Hosting/TestHost/src/RequestFeature.cs
deleted file mode 100644
index aaa7048a90..0000000000
--- a/src/Hosting/TestHost/src/RequestFeature.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Http.Features;
-
-namespace Microsoft.AspNetCore.TestHost;
-
-internal class RequestFeature : IHttpRequestFeature
-{
- public RequestFeature()
- {
- Body = Stream.Null;
- Headers = new HeaderDictionary();
- Method = "GET";
- Path = "";
- PathBase = "";
- Protocol = HttpProtocol.Http11;
- QueryString = "";
- Scheme = "http";
- RawTarget = "";
- }
-
- public Stream Body { get; set; }
-
- public IHeaderDictionary Headers { get; set; }
-
- public string Method { get; set; }
-
- public string Path { get; set; }
-
- public string PathBase { get; set; }
-
- public string Protocol { get; set; }
-
- public string QueryString { get; set; }
-
- public string Scheme { get; set; }
-
- public string RawTarget { get; set; }
-}
diff --git a/src/Hosting/TestHost/src/RequestLifetimeFeature.cs b/src/Hosting/TestHost/src/RequestLifetimeFeature.cs
index fdec828e60..c615bd8c3c 100644
--- a/src/Hosting/TestHost/src/RequestLifetimeFeature.cs
+++ b/src/Hosting/TestHost/src/RequestLifetimeFeature.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost;
-internal class RequestLifetimeFeature : IHttpRequestLifetimeFeature
+internal sealed class RequestLifetimeFeature : IHttpRequestLifetimeFeature
{
private readonly CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
private readonly Action<Exception> _abort;
diff --git a/src/Hosting/TestHost/src/ResponseBodyPipeWriter.cs b/src/Hosting/TestHost/src/ResponseBodyPipeWriter.cs
index 3d466707a1..ed23b050ed 100644
--- a/src/Hosting/TestHost/src/ResponseBodyPipeWriter.cs
+++ b/src/Hosting/TestHost/src/ResponseBodyPipeWriter.cs
@@ -6,7 +6,7 @@ using System.IO.Pipelines;
namespace Microsoft.AspNetCore.TestHost;
-internal class ResponseBodyPipeWriter : PipeWriter
+internal sealed class ResponseBodyPipeWriter : PipeWriter
{
private readonly Func<Task> _onFirstWriteAsync;
private readonly Pipe _pipe;
diff --git a/src/Hosting/TestHost/src/ResponseBodyReaderStream.cs b/src/Hosting/TestHost/src/ResponseBodyReaderStream.cs
index 6e8826d3a2..ace0d7654d 100644
--- a/src/Hosting/TestHost/src/ResponseBodyReaderStream.cs
+++ b/src/Hosting/TestHost/src/ResponseBodyReaderStream.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.TestHost;
/// <summary>
/// The client's view of the response body.
/// </summary>
-internal class ResponseBodyReaderStream : Stream
+internal sealed class ResponseBodyReaderStream : Stream
{
private bool _readerComplete;
private bool _aborted;
diff --git a/src/Hosting/TestHost/src/ResponseBodyWriterStream.cs b/src/Hosting/TestHost/src/ResponseBodyWriterStream.cs
index 5b49bd20fc..4dc26c3964 100644
--- a/src/Hosting/TestHost/src/ResponseBodyWriterStream.cs
+++ b/src/Hosting/TestHost/src/ResponseBodyWriterStream.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.TestHost;
-internal class ResponseBodyWriterStream : Stream
+internal sealed class ResponseBodyWriterStream : Stream
{
private readonly ResponseBodyPipeWriter _responseWriter;
private readonly Func<bool> _allowSynchronousIO;
diff --git a/src/Hosting/TestHost/src/ResponseFeature.cs b/src/Hosting/TestHost/src/ResponseFeature.cs
index 2ea15874a8..3ba1ce8309 100644
--- a/src/Hosting/TestHost/src/ResponseFeature.cs
+++ b/src/Hosting/TestHost/src/ResponseFeature.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost;
-internal class ResponseFeature : IHttpResponseFeature, IHttpResponseBodyFeature
+internal sealed class ResponseFeature : IHttpResponseFeature, IHttpResponseBodyFeature
{
private readonly HeaderDictionary _headers = new HeaderDictionary();
private readonly Action<Exception> _abort;
diff --git a/src/Hosting/TestHost/src/ResponseTrailersFeature.cs b/src/Hosting/TestHost/src/ResponseTrailersFeature.cs
index 5d1b315d32..fbf94651c9 100644
--- a/src/Hosting/TestHost/src/ResponseTrailersFeature.cs
+++ b/src/Hosting/TestHost/src/ResponseTrailersFeature.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost;
-internal class ResponseTrailersFeature : IHttpResponseTrailersFeature
+internal sealed class ResponseTrailersFeature : IHttpResponseTrailersFeature
{
public IHeaderDictionary Trailers { get; set; } = new HeaderDictionary();
}
diff --git a/src/Hosting/TestHost/src/TestServer.cs b/src/Hosting/TestHost/src/TestServer.cs
index ed6ab6eb69..6c3c14bb1d 100644
--- a/src/Hosting/TestHost/src/TestServer.cs
+++ b/src/Hosting/TestHost/src/TestServer.cs
@@ -4,6 +4,7 @@
using System.Net.Http;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
+using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Options;
@@ -19,13 +20,20 @@ public class TestServer : IServer
private bool _disposed;
private ApplicationWrapper? _application;
+ private static FeatureCollection CreateTestFeatureCollection()
+ {
+ var features = new FeatureCollection();
+ features.Set<IServerAddressesFeature>(new ServerAddressesFeature());
+ return features;
+ }
+
/// <summary>
/// For use with IHostBuilder.
/// </summary>
/// <param name="services"></param>
/// <param name="optionsAccessor"></param>
public TestServer(IServiceProvider services, IOptions<TestServerOptions> optionsAccessor)
- : this(services, new FeatureCollection(), optionsAccessor)
+ : this(services, CreateTestFeatureCollection(), optionsAccessor)
{
}
@@ -50,7 +58,7 @@ public class TestServer : IServer
/// </summary>
/// <param name="services"></param>
public TestServer(IServiceProvider services)
- : this(services, new FeatureCollection())
+ : this(services, CreateTestFeatureCollection())
{
}
@@ -71,7 +79,7 @@ public class TestServer : IServer
/// </summary>
/// <param name="builder"></param>
public TestServer(IWebHostBuilder builder)
- : this(builder, new FeatureCollection())
+ : this(builder, CreateTestFeatureCollection())
{
}
@@ -138,13 +146,30 @@ public class TestServer : IServer
get => _application ?? throw new InvalidOperationException("The server has not been started or no web application was configured.");
}
+ private PathString PathBase => BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress);
+
/// <summary>
/// Creates a custom <see cref="HttpMessageHandler" /> for processing HTTP requests/responses with the test server.
/// </summary>
public HttpMessageHandler CreateHandler()
{
- var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress);
- return new ClientHandler(pathBase, Application) { AllowSynchronousIO = AllowSynchronousIO, PreserveExecutionContext = PreserveExecutionContext };
+ return new ClientHandler(PathBase, Application)
+ {
+ AllowSynchronousIO = AllowSynchronousIO,
+ PreserveExecutionContext = PreserveExecutionContext
+ };
+ }
+
+ /// <summary>
+ /// Creates a custom <see cref="HttpMessageHandler" /> for processing HTTP requests/responses with custom configuration with the test server.
+ /// </summary>
+ public HttpMessageHandler CreateHandler(Action<HttpContext> additionalContextConfiguration)
+ {
+ return new ClientHandler(PathBase, Application, additionalContextConfiguration)
+ {
+ AllowSynchronousIO = AllowSynchronousIO,
+ PreserveExecutionContext = PreserveExecutionContext
+ };
}
/// <summary>
@@ -227,10 +252,7 @@ public class TestServer : IServer
{
_application = new ApplicationWrapper<TContext>(application, () =>
{
- if (_disposed)
- {
- throw new ObjectDisposedException(GetType().FullName);
- }
+ ObjectDisposedException.ThrowIf(_disposed, this);
});
return Task.CompletedTask;
diff --git a/src/Hosting/TestHost/src/TestWebSocket.cs b/src/Hosting/TestHost/src/TestWebSocket.cs
index 1fb86e8373..bb6824049e 100644
--- a/src/Hosting/TestHost/src/TestWebSocket.cs
+++ b/src/Hosting/TestHost/src/TestWebSocket.cs
@@ -5,7 +5,7 @@ using System.Net.WebSockets;
namespace Microsoft.AspNetCore.TestHost;
-internal class TestWebSocket : WebSocket
+internal sealed class TestWebSocket : WebSocket
{
private readonly ReceiverSenderBuffer _receiveBuffer;
private readonly ReceiverSenderBuffer _sendBuffer;
@@ -72,7 +72,7 @@ internal class TestWebSocket : WebSocket
ThrowIfOutputClosed();
var message = new Message(closeStatus, statusDescription);
- await _sendBuffer.SendAsync(message, cancellationToken);
+ await _sendBuffer.SendAsync(message);
if (State == WebSocketState.Open)
{
@@ -161,7 +161,7 @@ internal class TestWebSocket : WebSocket
}
var message = new Message(buffer, messageType, endOfMessage);
- return _sendBuffer.SendAsync(message, cancellationToken);
+ return _sendBuffer.SendAsync(message);
}
private void Close()
@@ -172,10 +172,7 @@ internal class TestWebSocket : WebSocket
private void ThrowIfDisposed()
{
- if (_state >= WebSocketState.Closed) // or Aborted
- {
- throw new ObjectDisposedException(typeof(TestWebSocket).FullName);
- }
+ ObjectDisposedException.ThrowIf(_state >= WebSocketState.Closed, typeof(TestWebSocket)); // or Aborted
}
private void ThrowIfOutputClosed()
@@ -218,7 +215,7 @@ internal class TestWebSocket : WebSocket
_sendBuffer = writeBuffer;
}
- private class Message
+ private sealed class Message
{
public Message(ArraySegment<byte> buffer, WebSocketMessageType messageType, bool endOfMessage)
{
@@ -245,7 +242,7 @@ internal class TestWebSocket : WebSocket
public WebSocketMessageType MessageType { get; set; }
}
- private class ReceiverSenderBuffer
+ private sealed class ReceiverSenderBuffer
{
private bool _receiverClosed;
private bool _senderClosed;
@@ -259,7 +256,7 @@ internal class TestWebSocket : WebSocket
_messageQueue = new Queue<Message>();
}
- public virtual async Task<Message> ReceiveAsync(CancellationToken cancellationToken)
+ public async Task<Message> ReceiveAsync(CancellationToken cancellationToken)
{
if (_disposed)
{
@@ -278,14 +275,12 @@ internal class TestWebSocket : WebSocket
}
}
- public virtual Task SendAsync(Message message, CancellationToken cancellationToken)
+ public Task SendAsync(Message message)
{
lock (_messageQueue)
{
- if (_senderClosed)
- {
- throw new ObjectDisposedException(typeof(TestWebSocket).FullName);
- }
+ ObjectDisposedException.ThrowIf(_senderClosed, typeof(TestWebSocket));
+
if (_receiverClosed)
{
throw new IOException("The remote end closed the connection.", new ObjectDisposedException(typeof(TestWebSocket).FullName));
@@ -335,14 +330,10 @@ internal class TestWebSocket : WebSocket
private void ThrowNoReceive()
{
- if (_receiverClosed)
- {
- throw new ObjectDisposedException(typeof(TestWebSocket).FullName);
- }
- else // _senderClosed
- {
- throw new IOException("The remote end closed the connection.", new ObjectDisposedException(typeof(TestWebSocket).FullName));
- }
+ ObjectDisposedException.ThrowIf(_receiverClosed, typeof(TestWebSocket));
+
+ // _senderClosed must be true.
+ throw new IOException("The remote end closed the connection.", new ObjectDisposedException(typeof(TestWebSocket).FullName));
}
}
}
diff --git a/src/Hosting/TestHost/src/UpgradeFeature.cs b/src/Hosting/TestHost/src/UpgradeFeature.cs
index 7b3c824209..2d96df3248 100644
--- a/src/Hosting/TestHost/src/UpgradeFeature.cs
+++ b/src/Hosting/TestHost/src/UpgradeFeature.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.TestHost;
-internal class UpgradeFeature : IHttpUpgradeFeature
+internal sealed class UpgradeFeature : IHttpUpgradeFeature
{
public bool IsUpgradableRequest => false;
diff --git a/src/Hosting/TestHost/src/WebHostBuilderExtensions.cs b/src/Hosting/TestHost/src/WebHostBuilderExtensions.cs
index 89c50979a3..e2a9ba0d6d 100644
--- a/src/Hosting/TestHost/src/WebHostBuilderExtensions.cs
+++ b/src/Hosting/TestHost/src/WebHostBuilderExtensions.cs
@@ -188,7 +188,7 @@ public static class WebHostBuilderExtensions
}
#pragma warning disable CS0612 // Type or member is obsolete
- private class ConfigureTestServicesStartupConfigureServicesFilter : IStartupConfigureServicesFilter
+ private sealed class ConfigureTestServicesStartupConfigureServicesFilter : IStartupConfigureServicesFilter
#pragma warning restore CS0612 // Type or member is obsolete
{
private readonly Action<IServiceCollection> _servicesConfiguration;
@@ -212,7 +212,7 @@ public static class WebHostBuilderExtensions
}
#pragma warning disable CS0612 // Type or member is obsolete
- private class ConfigureTestServicesStartupConfigureContainerFilter<TContainer> : IStartupConfigureContainerFilter<TContainer>
+ private sealed class ConfigureTestServicesStartupConfigureContainerFilter<TContainer> : IStartupConfigureContainerFilter<TContainer>
#pragma warning restore CS0612 // Type or member is obsolete
{
private readonly Action<TContainer> _servicesConfiguration;
diff --git a/src/Hosting/TestHost/src/WebSocketClient.cs b/src/Hosting/TestHost/src/WebSocketClient.cs
index 92ca3de554..e603be17e6 100644
--- a/src/Hosting/TestHost/src/WebSocketClient.cs
+++ b/src/Hosting/TestHost/src/WebSocketClient.cs
@@ -117,7 +117,7 @@ public class WebSocketClient
return Convert.ToBase64String(data);
}
- private class WebSocketFeature : IHttpWebSocketFeature
+ private sealed class WebSocketFeature : IHttpWebSocketFeature
{
private readonly HttpContext _httpContext;
diff --git a/src/Hosting/TestHost/test/ClientHandlerTests.cs b/src/Hosting/TestHost/test/ClientHandlerTests.cs
index 33c8c2cf67..28266e8aa8 100644
--- a/src/Hosting/TestHost/test/ClientHandlerTests.cs
+++ b/src/Hosting/TestHost/test/ClientHandlerTests.cs
@@ -260,6 +260,36 @@ public class ClientHandlerTests
}
[Fact]
+ public Task AdditionalConfigurationAllowsSettingConnectionInfo()
+ {
+ var handler = new ClientHandler(PathString.Empty, new InspectingApplication(features =>
+ {
+ Assert.Equal(IPAddress.Parse("1.1.1.1"), features.Get<IHttpConnectionFeature>().RemoteIpAddress);
+ }), context =>
+ {
+ context.Connection.RemoteIpAddress = IPAddress.Parse("1.1.1.1");
+ });
+
+ var httpClient = new HttpClient(handler);
+ return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query");
+ }
+
+ [Fact]
+ public Task AdditionalConfigurationAllowsOverridingDefaultBehavior()
+ {
+ var handler = new ClientHandler(PathString.Empty, new InspectingApplication(features =>
+ {
+ Assert.Equal("?and=something", features.Get<IHttpRequestFeature>().QueryString);
+ }), context =>
+ {
+ context.Request.QueryString = new QueryString("?and=something");
+ });
+
+ var httpClient = new HttpClient(handler);
+ return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query");
+ }
+
+ [Fact]
public async Task ResponseStartAsync()
{
var hasStartedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
@@ -438,6 +468,29 @@ public class ClientHandlerTests
}
[Fact]
+ public async Task ExceptionFromDisposedRequestContent()
+ {
+ var requestCount = 0;
+ var handler = new ClientHandler(PathString.Empty, new DummyApplication(context =>
+ {
+ requestCount++;
+ return Task.CompletedTask;
+ }));
+
+ var invoker = new HttpMessageInvoker(handler);
+ Task<HttpResponseMessage> responseTask;
+ using (var message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/"))
+ {
+ message.Content = new StringContent("Hello World");
+ message.Content.Dispose();
+
+ responseTask = invoker.SendAsync(message, CancellationToken.None);
+ }
+ await Assert.ThrowsAsync<ObjectDisposedException>(() => responseTask);
+ Assert.Equal(0, requestCount);
+ }
+
+ [Fact]
public Task ExceptionBeforeFirstWriteIsReported()
{
var handler = new ClientHandler(PathString.Empty, new DummyApplication(context =>
diff --git a/src/Hosting/TestHost/test/TestClientTests.cs b/src/Hosting/TestHost/test/TestClientTests.cs
index f7f5ec40d2..54fea9881c 100644
--- a/src/Hosting/TestHost/test/TestClientTests.cs
+++ b/src/Hosting/TestHost/test/TestClientTests.cs
@@ -237,6 +237,28 @@ public class TestClientTests
}
[Fact]
+ public async Task ClientStreaming_HttpContentException()
+ {
+ var requestCount = 0;
+ RequestDelegate appDelegate = ctx =>
+ {
+ requestCount++;
+ return Task.CompletedTask;
+ };
+
+ var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate));
+ var server = new TestServer(builder);
+ var client = server.CreateClient();
+
+ var message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/");
+ message.Content = new PushContent(stream => throw new InvalidOperationException("HttpContent exception"));
+
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => client.SendAsync(message, CancellationToken.None));
+ Assert.Equal("HttpContent exception", ex.Message);
+ Assert.Equal(0, requestCount);
+ }
+
+ [Fact]
public async Task ClientStreaming_Cancellation()
{
// Arrange
diff --git a/src/Hosting/TestHost/test/TestServerTests.cs b/src/Hosting/TestHost/test/TestServerTests.cs
index 16c9a8582a..8437d11065 100644
--- a/src/Hosting/TestHost/test/TestServerTests.cs
+++ b/src/Hosting/TestHost/test/TestServerTests.cs
@@ -280,6 +280,24 @@ public class TestServerTests
}
[Fact]
+ public void TestServerConstructedWithoutFeatureCollectionHasServerAddressesFeature()
+ {
+ // Arrange
+ var builder = new WebHostBuilder()
+ .Configure(applicationBuilder =>
+ {
+ var serverAddressesFeature = applicationBuilder.ServerFeatures.Get<IServerAddressesFeature>();
+ Assert.NotNull(serverAddressesFeature);
+ });
+
+ // Act
+ new TestServer(builder);
+
+ // Assert
+ // Is inside configure callback
+ }
+
+ [Fact]
public void TestServerConstructorWithNullFeatureCollectionThrows()
{
var builder = new WebHostBuilder()
diff --git a/src/Hosting/test/FunctionalTests/LinkedApplicationTests.cs b/src/Hosting/test/FunctionalTests/LinkedApplicationTests.cs
index cb853ec24b..d9f48a1ee8 100644
--- a/src/Hosting/test/FunctionalTests/LinkedApplicationTests.cs
+++ b/src/Hosting/test/FunctionalTests/LinkedApplicationTests.cs
@@ -8,6 +8,7 @@ namespace Microsoft.AspNetCore.Hosting.FunctionalTests;
public class LinkedApplicationTests : LoggedTest
{
+ [Fact]
[QuarantinedTest("https://github.com/dotnet/aspnetcore-internal/issues/4030")]
public async Task LinkedApplicationWorks()
{
diff --git a/src/Html.Abstractions/Html.Abstractions.slnf b/src/Html.Abstractions/Html.Abstractions.slnf
new file mode 100644
index 0000000000..7e118199ef
--- /dev/null
+++ b/src/Html.Abstractions/Html.Abstractions.slnf
@@ -0,0 +1,11 @@
+{
+ "solution": {
+ "path": "..\\..\\AspNetCore.sln",
+ "projects": [
+ "src\\Html.Abstractions\\src\\Microsoft.AspNetCore.Html.Abstractions.csproj",
+ "src\\Html.Abstractions\\test\\Microsoft.AspNetCore.Html.Abstractions.Tests.csproj",
+ "src\\Testing\\src\\Microsoft.AspNetCore.Testing.csproj",
+ "src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj"
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/Html.Abstractions/src/Microsoft.AspNetCore.Html.Abstractions.csproj b/src/Html.Abstractions/src/Microsoft.AspNetCore.Html.Abstractions.csproj
index 9f3710febf..4b87bfed84 100644
--- a/src/Html.Abstractions/src/Microsoft.AspNetCore.Html.Abstractions.csproj
+++ b/src/Html.Abstractions/src/Microsoft.AspNetCore.Html.Abstractions.csproj
@@ -11,7 +11,7 @@ Microsoft.AspNetCore.Html.IHtmlContent</Description>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
</Project>
diff --git a/src/Html.Abstractions/startvs.cmd b/src/Html.Abstractions/startvs.cmd
new file mode 100644
index 0000000000..313013b349
--- /dev/null
+++ b/src/Html.Abstractions/startvs.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+
+%~dp0..\..\startvs.cmd %~dp0Html.Abstractions.slnf
diff --git a/src/Html.Abstractions/startvscode.cmd b/src/Html.Abstractions/startvscode.cmd
new file mode 100644
index 0000000000..d403f30282
--- /dev/null
+++ b/src/Html.Abstractions/startvscode.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+
+%~dp0..\..\startvscode.cmd %~dp0
diff --git a/src/Html.Abstractions/startvscode.sh b/src/Html.Abstractions/startvscode.sh
new file mode 100644
index 0000000000..19f357cf70
--- /dev/null
+++ b/src/Html.Abstractions/startvscode.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+repo_root="$DIR/../.."
+"$repo_root/startvscode.sh" $DIR \ No newline at end of file
diff --git a/src/Html.Abstractions/test/HtmlContentBuilderExtensionsTest.cs b/src/Html.Abstractions/test/HtmlContentBuilderExtensionsTest.cs
index 9b02583507..fca9fbca0f 100644
--- a/src/Html.Abstractions/test/HtmlContentBuilderExtensionsTest.cs
+++ b/src/Html.Abstractions/test/HtmlContentBuilderExtensionsTest.cs
@@ -1,463 +1,456 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
using System.Globalization;
-using System.IO;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.WebEncoders.Testing;
-using Xunit;
-namespace Microsoft.AspNetCore.Html.Test
+namespace Microsoft.AspNetCore.Html.Test;
+
+public class HtmlContentBuilderExtensionsTest
{
- public class HtmlContentBuilderExtensionsTest
+ [Fact]
+ public void Builder_AppendLine_Empty()
{
- [Fact]
- public void Builder_AppendLine_Empty()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendLine();
+ // Act
+ builder.AppendLine();
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
- }
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
+ }
- [Fact]
- public void Builder_AppendLine_String()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendLine_String()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendLine("Hi");
+ // Act
+ builder.AppendLine("Hi");
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Equal("Hi", Assert.IsType<UnencodedString>(entry).Value),
- entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
- }
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Equal("Hi", Assert.IsType<UnencodedString>(entry).Value),
+ entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
+ }
- [Fact]
- public void Builder_AppendLine_IHtmlContent()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
- var content = new OtherHtmlContent("Hi");
-
- // Act
- builder.AppendLine(content);
-
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Same(content, entry),
- entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
- }
+ [Fact]
+ public void Builder_AppendLine_IHtmlContent()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+ var content = new OtherHtmlContent("Hi");
+
+ // Act
+ builder.AppendLine(content);
+
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Same(content, entry),
+ entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
+ }
- [Fact]
- public void Builder_AppendHtmlLine_String()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendHtmlLine_String()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendHtmlLine("Hi");
+ // Act
+ builder.AppendHtmlLine("Hi");
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Equal("Hi", Assert.IsType<EncodedString>(entry).Value),
- entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
- }
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Equal("Hi", Assert.IsType<EncodedString>(entry).Value),
+ entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry)));
+ }
- [Fact]
- public void Builder_SetContent_String()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
- builder.Append("Existing Content. Will be Cleared.");
+ [Fact]
+ public void Builder_SetContent_String()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+ builder.Append("Existing Content. Will be Cleared.");
- // Act
- builder.SetContent("Hi");
+ // Act
+ builder.SetContent("Hi");
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Equal("Hi", Assert.IsType<UnencodedString>(entry).Value));
- }
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Equal("Hi", Assert.IsType<UnencodedString>(entry).Value));
+ }
- [Fact]
- public void Builder_SetContent_IHtmlContent()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
- builder.Append("Existing Content. Will be Cleared.");
+ [Fact]
+ public void Builder_SetContent_IHtmlContent()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+ builder.Append("Existing Content. Will be Cleared.");
- var content = new OtherHtmlContent("Hi");
+ var content = new OtherHtmlContent("Hi");
- // Act
- builder.SetHtmlContent(content);
+ // Act
+ builder.SetHtmlContent(content);
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Same(content, entry));
- }
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Same(content, entry));
+ }
- [Fact]
- public void Builder_SetHtmlContent_String()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
- builder.Append("Existing Content. Will be Cleared.");
+ [Fact]
+ public void Builder_SetHtmlContent_String()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+ builder.Append("Existing Content. Will be Cleared.");
- // Act
- builder.SetHtmlContent("Hi");
+ // Act
+ builder.SetHtmlContent("Hi");
- // Assert
- Assert.Collection(
- builder.Entries,
- entry => Assert.Equal("Hi", Assert.IsType<EncodedString>(entry).Value));
- }
+ // Assert
+ Assert.Collection(
+ builder.Entries,
+ entry => Assert.Equal("Hi", Assert.IsType<EncodedString>(entry).Value));
+ }
- [Fact]
- public void Builder_AppendFormat()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormat()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth");
+ // Act
+ builder.AppendFormat("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth");
- // Assert
- Assert.Equal(
- "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_HtmlContent()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormat_HtmlContent()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("{0}!", new EncodedString("First"));
+ // Act
+ builder.AppendFormat("{0}!", new EncodedString("First"));
- // Assert
- Assert.Equal(
- "First!",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "First!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_HtmlString()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormat_HtmlString()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("{0}!", new HtmlString("First"));
+ // Act
+ builder.AppendFormat("{0}!", new HtmlString("First"));
- // Assert
- Assert.Equal("First!", HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal("First!", HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormatContent_With1Argument()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormatContent_With1Argument()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("0x{0:X} - hex equivalent for 50.", 50);
+ // Act
+ builder.AppendFormat("0x{0:X} - hex equivalent for 50.", 50);
- // Assert
- Assert.Equal(
- "0xHtmlEncode[[32]] - hex equivalent for 50.",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "0xHtmlEncode[[32]] - hex equivalent for 50.",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormatContent_With2Arguments()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormatContent_With2Arguments()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("0x{0:X} - hex equivalent for {1}.", 50, 50);
+ // Act
+ builder.AppendFormat("0x{0:X} - hex equivalent for {1}.", 50, 50);
- // Assert
- Assert.Equal(
- "0xHtmlEncode[[32]] - hex equivalent for HtmlEncode[[50]].",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "0xHtmlEncode[[32]] - hex equivalent for HtmlEncode[[50]].",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormatContent_With3Arguments()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormatContent_With3Arguments()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50);
+ // Act
+ builder.AppendFormat("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50);
- // Assert
- Assert.Equal(
- "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithAlignmentComponent()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormat_WithAlignmentComponent()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("{0, -25} World!", "Hello");
+ // Act
+ builder.AppendFormat("{0, -25} World!", "Hello");
- // Assert
- Assert.Equal(
- "HtmlEncode[[Hello]] World!",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "HtmlEncode[[Hello]] World!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithFormatStringComponent()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ public void Builder_AppendFormat_WithFormatStringComponent()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat("0x{0:X}", 50);
+ // Act
+ builder.AppendFormat("0x{0:X}", 50);
- // Assert
- Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithCulture()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
-
- // Act
- builder.AppendFormat(
- CultureInfo.InvariantCulture,
- "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!",
- 1.1,
- 2.98,
- 145.82,
- 32.86);
-
- // Assert
- Assert.Equal(
- "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " +
- "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!",
- HtmlContentToString(builder));
- }
+ [Fact]
+ public void Builder_AppendFormat_WithCulture()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+
+ // Act
+ builder.AppendFormat(
+ CultureInfo.InvariantCulture,
+ "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!",
+ 1.1,
+ 2.98,
+ 145.82,
+ 32.86);
+
+ // Assert
+ Assert.Equal(
+ "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " +
+ "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithCulture_1Argument()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
-
- // Act
- builder.AppendFormat(
- CultureInfo.InvariantCulture,
- "Numbers in InvariantCulture - {0:N}!",
- 1.1);
-
- // Assert
- Assert.Equal(
- "Numbers in InvariantCulture - HtmlEncode[[1.10]]!",
- HtmlContentToString(builder));
- }
+ [Fact]
+ public void Builder_AppendFormat_WithCulture_1Argument()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+
+ // Act
+ builder.AppendFormat(
+ CultureInfo.InvariantCulture,
+ "Numbers in InvariantCulture - {0:N}!",
+ 1.1);
+
+ // Assert
+ Assert.Equal(
+ "Numbers in InvariantCulture - HtmlEncode[[1.10]]!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithCulture_2Arguments()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
-
- // Act
- builder.AppendFormat(
- CultureInfo.InvariantCulture,
- "Numbers in InvariantCulture - {0:N} {1}!",
- 1.1,
- 2.98);
-
- // Assert
- Assert.Equal(
- "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]]!",
- HtmlContentToString(builder));
- }
+ [Fact]
+ public void Builder_AppendFormat_WithCulture_2Arguments()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+
+ // Act
+ builder.AppendFormat(
+ CultureInfo.InvariantCulture,
+ "Numbers in InvariantCulture - {0:N} {1}!",
+ 1.1,
+ 2.98);
+
+ // Assert
+ Assert.Equal(
+ "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]]!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithCulture_3Arguments()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
-
- // Act
- builder.AppendFormat(
- CultureInfo.InvariantCulture,
- "Numbers in InvariantCulture - {0:N} {1} {2}!",
- 1.1,
- 2.98,
- 3.12);
-
- // Assert
- Assert.Equal(
- "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] HtmlEncode[[3.12]]!",
- HtmlContentToString(builder));
- }
+ [Fact]
+ public void Builder_AppendFormat_WithCulture_3Arguments()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+
+ // Act
+ builder.AppendFormat(
+ CultureInfo.InvariantCulture,
+ "Numbers in InvariantCulture - {0:N} {1} {2}!",
+ 1.1,
+ 2.98,
+ 3.12);
+
+ // Assert
+ Assert.Equal(
+ "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] HtmlEncode[[3.12]]!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- public void Builder_AppendFormat_WithDifferentCulture()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
- var culture = new CultureInfo("fr-FR");
+ [Fact]
+ public void Builder_AppendFormat_WithDifferentCulture()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
+ var culture = new CultureInfo("fr-FR");
- // Act
- builder.AppendFormat(culture, "{0} in french!", 1.21);
+ // Act
+ builder.AppendFormat(culture, "{0} in french!", 1.21);
- // Assert
- Assert.Equal(
- "HtmlEncode[[1,21]] in french!",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "HtmlEncode[[1,21]] in french!",
+ HtmlContentToString(builder));
+ }
- [Fact]
- [ReplaceCulture("de-DE", "de-DE")]
- public void Builder_AppendFormat_WithDifferentCurrentCulture()
- {
- // Arrange
- var builder = new TestHtmlContentBuilder();
+ [Fact]
+ [ReplaceCulture("de-DE", "de-DE")]
+ public void Builder_AppendFormat_WithDifferentCurrentCulture()
+ {
+ // Arrange
+ var builder = new TestHtmlContentBuilder();
- // Act
- builder.AppendFormat(CultureInfo.CurrentCulture, "{0:D}", new DateTime(2015, 02, 01));
+ // Act
+ builder.AppendFormat(CultureInfo.CurrentCulture, "{0:D}", new DateTime(2015, 02, 01));
- // Assert
- Assert.Equal(
- "HtmlEncode[[Sonntag, 1. Februar 2015]]",
- HtmlContentToString(builder));
- }
+ // Assert
+ Assert.Equal(
+ "HtmlEncode[[Sonntag, 1. Februar 2015]]",
+ HtmlContentToString(builder));
+ }
+
+ private static string HtmlContentToString(IHtmlContent content)
+ {
+ using var writer = new StringWriter();
+ content.WriteTo(writer, new HtmlTestEncoder());
+ return writer.ToString();
+ }
+
+ private class TestHtmlContentBuilder : IHtmlContentBuilder
+ {
+ public List<IHtmlContent> Entries { get; } = new List<IHtmlContent>();
- private static string HtmlContentToString(IHtmlContent content)
+ public IHtmlContentBuilder Append(string unencoded)
{
- using (var writer = new StringWriter())
- {
- content.WriteTo(writer, new HtmlTestEncoder());
- return writer.ToString();
- }
+ Entries.Add(new UnencodedString(unencoded));
+ return this;
}
- private class TestHtmlContentBuilder : IHtmlContentBuilder
+ public IHtmlContentBuilder AppendHtml(IHtmlContent content)
{
- public List<IHtmlContent> Entries { get; } = new List<IHtmlContent>();
-
- public IHtmlContentBuilder Append(string unencoded)
- {
- Entries.Add(new UnencodedString(unencoded));
- return this;
- }
-
- public IHtmlContentBuilder AppendHtml(IHtmlContent content)
- {
- Entries.Add(content);
- return this;
- }
+ Entries.Add(content);
+ return this;
+ }
- public IHtmlContentBuilder AppendHtml(string encoded)
- {
- Entries.Add(new EncodedString(encoded));
- return this;
- }
+ public IHtmlContentBuilder AppendHtml(string encoded)
+ {
+ Entries.Add(new EncodedString(encoded));
+ return this;
+ }
- public IHtmlContentBuilder Clear()
- {
- Entries.Clear();
- return this;
- }
+ public IHtmlContentBuilder Clear()
+ {
+ Entries.Clear();
+ return this;
+ }
- public void CopyTo(IHtmlContentBuilder destination)
+ public void CopyTo(IHtmlContentBuilder destination)
+ {
+ foreach (var entry in Entries)
{
- foreach (var entry in Entries)
- {
- destination.AppendHtml(entry);
- }
+ destination.AppendHtml(entry);
}
+ }
- public void MoveTo(IHtmlContentBuilder destination)
- {
- CopyTo(destination);
- Clear();
- }
+ public void MoveTo(IHtmlContentBuilder destination)
+ {
+ CopyTo(destination);
+ Clear();
+ }
- public void WriteTo(TextWriter writer, HtmlEncoder encoder)
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
+ {
+ foreach (var entry in Entries)
{
- foreach (var entry in Entries)
- {
- entry.WriteTo(writer, encoder);
- }
+ entry.WriteTo(writer, encoder);
}
}
+ }
- private class EncodedString : IHtmlContent
+ private class EncodedString : IHtmlContent
+ {
+ public EncodedString(string value)
{
- public EncodedString(string value)
- {
- Value = value;
- }
+ Value = value;
+ }
- public string Value { get; }
+ public string Value { get; }
- public void WriteTo(TextWriter writer, HtmlEncoder encoder)
- {
- writer.Write(Value);
- }
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
+ {
+ writer.Write(Value);
}
+ }
- private class UnencodedString : IHtmlContent
+ private class UnencodedString : IHtmlContent
+ {
+ public UnencodedString(string value)
{
- public UnencodedString(string value)
- {
- Value = value;
- }
+ Value = value;
+ }
- public string Value { get; }
+ public string Value { get; }
- public void WriteTo(TextWriter writer, HtmlEncoder encoder)
- {
- encoder.Encode(writer, Value);
- }
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
+ {
+ encoder.Encode(writer, Value);
}
+ }
- private class OtherHtmlContent : IHtmlContent
+ private class OtherHtmlContent : IHtmlContent
+ {
+ public OtherHtmlContent(string value)
{
- public OtherHtmlContent(string value)
- {
- Value = value;
- }
+ Value = value;
+ }
- public string Value { get; }
+ public string Value { get; }
- public void WriteTo(TextWriter writer, HtmlEncoder encoder)
- {
- throw new NotImplementedException();
- }
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
+ {
+ throw new NotImplementedException();
}
}
}
diff --git a/src/Html.Abstractions/test/HtmlContentBuilderTest.cs b/src/Html.Abstractions/test/HtmlContentBuilderTest.cs
index 986daa2aa1..98ce8bdfb0 100644
--- a/src/Html.Abstractions/test/HtmlContentBuilderTest.cs
+++ b/src/Html.Abstractions/test/HtmlContentBuilderTest.cs
@@ -1,276 +1,272 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.IO;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Html;
using Microsoft.Extensions.WebEncoders.Testing;
-using Xunit;
-namespace Microsoft.Extensions.Internal
+namespace Microsoft.Extensions.Internal;
+
+public class HtmlContentBuilderTest
{
- public class HtmlContentBuilderTest
+ [Fact]
+ public void AppendString_AppendsAString()
{
- [Fact]
- public void AppendString_AppendsAString()
- {
- // Arrange
- var content = new HtmlContentBuilder();
+ // Arrange
+ var content = new HtmlContentBuilder();
- // Act
- content.Append("Hello");
+ // Act
+ content.Append("Hello");
- // Assert
- Assert.Equal(1, content.Count);
- var result = Assert.Single(content.Entries);
- Assert.IsType<string>(result);
- }
+ // Assert
+ Assert.Equal(1, content.Count);
+ var result = Assert.Single(content.Entries);
+ Assert.IsType<string>(result);
+ }
- [Fact]
- public void AppendString_WrittenAsEncoded()
- {
- // Arrange
- var content = new HtmlContentBuilder();
- content.Append("Hello");
+ [Fact]
+ public void AppendString_WrittenAsEncoded()
+ {
+ // Arrange
+ var content = new HtmlContentBuilder();
+ content.Append("Hello");
- var writer = new StringWriter();
+ var writer = new StringWriter();
- // Act
- content.WriteTo(writer, new HtmlTestEncoder());
+ // Act
+ content.WriteTo(writer, new HtmlTestEncoder());
- // Assert
- Assert.Equal("HtmlEncode[[Hello]]", writer.ToString());
- }
+ // Assert
+ Assert.Equal("HtmlEncode[[Hello]]", writer.ToString());
+ }
- [Fact]
- public void AppendHtml_DoesNotGetWrittenAsEncoded()
- {
- // Arrange
- var content = new HtmlContentBuilder();
- content.AppendHtml("Hello");
+ [Fact]
+ public void AppendHtml_DoesNotGetWrittenAsEncoded()
+ {
+ // Arrange
+ var content = new HtmlContentBuilder();
+ content.AppendHtml("Hello");
- var writer = new StringWriter();
+ var writer = new StringWriter();
- // Act
- content.WriteTo(writer, new HtmlTestEncoder());
+ // Act
+ content.WriteTo(writer, new HtmlTestEncoder());
- // Assert
- Assert.Equal("Hello", writer.ToString());
- }
+ // Assert
+ Assert.Equal("Hello", writer.ToString());
+ }
- [Fact]
- public void AppendIHtmlContent_AppendsAsIs()
- {
- // Arrange
- var content = new HtmlContentBuilder();
- var writer = new StringWriter();
-
- // Act
- content.AppendHtml(new TestHtmlContent("Hello"));
-
- // Assert
- Assert.Equal(1, content.Count);
- var result = Assert.Single(content.Entries);
- var testHtmlContent = Assert.IsType<TestHtmlContent>(result);
- testHtmlContent.WriteTo(writer, new HtmlTestEncoder());
- Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString());
- }
+ [Fact]
+ public void AppendIHtmlContent_AppendsAsIs()
+ {
+ // Arrange
+ var content = new HtmlContentBuilder();
+ var writer = new StringWriter();
+
+ // Act
+ content.AppendHtml(new TestHtmlContent("Hello"));
+
+ // Assert
+ Assert.Equal(1, content.Count);
+ var result = Assert.Single(content.Entries);
+ var testHtmlContent = Assert.IsType<TestHtmlContent>(result);
+ testHtmlContent.WriteTo(writer, new HtmlTestEncoder());
+ Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString());
+ }
- [Fact]
- public void CanAppendMultipleItems()
- {
- // Arrange
- var content = new HtmlContentBuilder();
-
- // Act
- content.AppendHtml(new TestHtmlContent("hello"));
- content.Append("Test");
-
- // Assert
- Assert.Equal(2, content.Count);
- Assert.Collection(
- content.Entries,
- entry => Assert.Equal("Written from TestHtmlContent: hello", entry.ToString()),
- entry => Assert.Equal("Test", entry));
- }
+ [Fact]
+ public void CanAppendMultipleItems()
+ {
+ // Arrange
+ var content = new HtmlContentBuilder();
+
+ // Act
+ content.AppendHtml(new TestHtmlContent("hello"));
+ content.Append("Test");
+
+ // Assert
+ Assert.Equal(2, content.Count);
+ Assert.Collection(
+ content.Entries,
+ entry => Assert.Equal("Written from TestHtmlContent: hello", entry.ToString()),
+ entry => Assert.Equal("Test", entry));
+ }
- [Fact]
- public void Clear_DeletesAllItems()
- {
- // Arrange
- var content = new HtmlContentBuilder();
- content.AppendHtml(new TestHtmlContent("hello"));
- content.Append("Test");
+ [Fact]
+ public void Clear_DeletesAllItems()
+ {
+ // Arrange
+ var content = new HtmlContentBuilder();
+ content.AppendHtml(new TestHtmlContent("hello"));
+ content.Append("Test");
- // Act
- content.Clear();
+ // Act
+ content.Clear();
- // Assert
- Assert.Equal(0, content.Count);
- Assert.Empty(content.Entries);
- }
+ // Assert
+ Assert.Equal(0, content.Count);
+ Assert.Empty(content.Entries);
+ }
- [Fact]
- public void CopyTo_CopiesAllItems()
- {
- // Arrange
- var source = new HtmlContentBuilder();
- source.AppendHtml(new TestHtmlContent("hello"));
- source.Append("Test");
-
- var destination = new HtmlContentBuilder();
- destination.Append("some-content");
-
- // Act
- source.CopyTo(destination);
-
- // Assert
- Assert.Equal(2, source.Count);
- Assert.Equal(3, destination.Count);
- Assert.Collection(
- destination.Entries,
- entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
- entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
- entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
- }
+ [Fact]
+ public void CopyTo_CopiesAllItems()
+ {
+ // Arrange
+ var source = new HtmlContentBuilder();
+ source.AppendHtml(new TestHtmlContent("hello"));
+ source.Append("Test");
+
+ var destination = new HtmlContentBuilder();
+ destination.Append("some-content");
+
+ // Act
+ source.CopyTo(destination);
+
+ // Assert
+ Assert.Equal(2, source.Count);
+ Assert.Equal(3, destination.Count);
+ Assert.Collection(
+ destination.Entries,
+ entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
+ entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
+ entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ }
- [Fact]
- public void CopyTo_DoesDeepCopy()
+ [Fact]
+ public void CopyTo_DoesDeepCopy()
+ {
+ // Arrange
+ var source = new HtmlContentBuilder();
+
+ var nested = new HtmlContentBuilder();
+ source.AppendHtml(nested);
+ nested.AppendHtml(new TestHtmlContent("hello"));
+ source.Append("Test");
+
+ var destination = new HtmlContentBuilder();
+ destination.Append("some-content");
+
+ // Act
+ source.CopyTo(destination);
+
+ // Assert
+ Assert.Equal(2, source.Count);
+ Assert.Equal(1, nested.Count);
+ Assert.Equal(3, destination.Count);
+ Assert.Collection(
+ destination.Entries,
+ entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
+ entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
+ entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ }
+
+ [Fact]
+ public void MoveTo_CopiesAllItems_AndClears()
+ {
+ // Arrange
+ var source = new HtmlContentBuilder();
+ source.AppendHtml(new TestHtmlContent("hello"));
+ source.Append("Test");
+
+ var destination = new HtmlContentBuilder();
+ destination.Append("some-content");
+
+ // Act
+ source.MoveTo(destination);
+
+ // Assert
+ Assert.Equal(0, source.Count);
+ Assert.Equal(3, destination.Count);
+ Assert.Collection(
+ destination.Entries,
+ entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
+ entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
+ entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ }
+
+ [Fact]
+ public void MoveTo_DoesDeepMove()
+ {
+ // Arrange
+ var source = new HtmlContentBuilder();
+
+ var nested = new HtmlContentBuilder();
+ source.AppendHtml(nested);
+ nested.AppendHtml(new TestHtmlContent("hello"));
+ source.Append("Test");
+
+ var destination = new HtmlContentBuilder();
+ destination.Append("some-content");
+
+ // Act
+ source.MoveTo(destination);
+
+ // Assert
+ Assert.Equal(0, source.Count);
+ Assert.Equal(0, nested.Count);
+ Assert.Equal(3, destination.Count);
+ Assert.Collection(
+ destination.Entries,
+ entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
+ entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
+ entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ }
+
+ [Fact]
+ public void WriteTo_WritesAllItems()
+ {
+ // Arrange
+ var content = new HtmlContentBuilder();
+ var writer = new StringWriter();
+ content.AppendHtml(new TestHtmlContent("Hello"));
+ content.Append("Test");
+
+ // Act
+ content.WriteTo(writer, new HtmlTestEncoder());
+
+ // Assert
+ Assert.Equal(2, content.Count);
+ Assert.Equal("Written from TestHtmlContent: HelloHtmlEncode[[Test]]", writer.ToString());
+ }
+
+ private class TestHtmlContent : IHtmlContent, IEquatable<TestHtmlContent>
+ {
+ private string _content;
+
+ public TestHtmlContent(string content)
{
- // Arrange
- var source = new HtmlContentBuilder();
-
- var nested = new HtmlContentBuilder();
- source.AppendHtml(nested);
- nested.AppendHtml(new TestHtmlContent("hello"));
- source.Append("Test");
-
- var destination = new HtmlContentBuilder();
- destination.Append("some-content");
-
- // Act
- source.CopyTo(destination);
-
- // Assert
- Assert.Equal(2, source.Count);
- Assert.Equal(1, nested.Count);
- Assert.Equal(3, destination.Count);
- Assert.Collection(
- destination.Entries,
- entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
- entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
- entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ _content = content;
}
- [Fact]
- public void MoveTo_CopiesAllItems_AndClears()
+ public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
- // Arrange
- var source = new HtmlContentBuilder();
- source.AppendHtml(new TestHtmlContent("hello"));
- source.Append("Test");
-
- var destination = new HtmlContentBuilder();
- destination.Append("some-content");
-
- // Act
- source.MoveTo(destination);
-
- // Assert
- Assert.Equal(0, source.Count);
- Assert.Equal(3, destination.Count);
- Assert.Collection(
- destination.Entries,
- entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
- entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
- entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ writer.Write(ToString());
}
- [Fact]
- public void MoveTo_DoesDeepMove()
+ public override string ToString()
{
- // Arrange
- var source = new HtmlContentBuilder();
-
- var nested = new HtmlContentBuilder();
- source.AppendHtml(nested);
- nested.AppendHtml(new TestHtmlContent("hello"));
- source.Append("Test");
-
- var destination = new HtmlContentBuilder();
- destination.Append("some-content");
-
- // Act
- source.MoveTo(destination);
-
- // Assert
- Assert.Equal(0, source.Count);
- Assert.Equal(0, nested.Count);
- Assert.Equal(3, destination.Count);
- Assert.Collection(
- destination.Entries,
- entry => Assert.Equal("some-content", Assert.IsType<string>(entry)),
- entry => Assert.Equal(new TestHtmlContent("hello"), Assert.IsType<TestHtmlContent>(entry)),
- entry => Assert.Equal("Test", Assert.IsType<string>(entry)));
+ return "Written from TestHtmlContent: " + _content;
}
- [Fact]
- public void WriteTo_WritesAllItems()
+ public override int GetHashCode()
{
- // Arrange
- var content = new HtmlContentBuilder();
- var writer = new StringWriter();
- content.AppendHtml(new TestHtmlContent("Hello"));
- content.Append("Test");
-
- // Act
- content.WriteTo(writer, new HtmlTestEncoder());
-
- // Assert
- Assert.Equal(2, content.Count);
- Assert.Equal("Written from TestHtmlContent: HelloHtmlEncode[[Test]]", writer.ToString());
+ return _content.GetHashCode();
}
- private class TestHtmlContent : IHtmlContent, IEquatable<TestHtmlContent>
+ public override bool Equals(object? obj)
{
- private string _content;
-
- public TestHtmlContent(string content)
+ var other = obj as TestHtmlContent;
+ if (other != null)
{
- _content = content;
+ return Equals(other);
}
- public void WriteTo(TextWriter writer, HtmlEncoder encoder)
- {
- writer.Write(ToString());
- }
-
- public override string ToString()
- {
- return "Written from TestHtmlContent: " + _content;
- }
-
- public override int GetHashCode()
- {
- return _content.GetHashCode();
- }
-
- public override bool Equals(object? obj)
- {
- var other = obj as TestHtmlContent;
- if (other != null)
- {
- return Equals(other);
- }
-
- return base.Equals(obj);
- }
+ return base.Equals(obj);
+ }
- public bool Equals(TestHtmlContent? other)
- {
- return other != null && string.Equals(_content, other._content);
- }
+ public bool Equals(TestHtmlContent? other)
+ {
+ return other != null && string.Equals(_content, other._content);
}
}
}
diff --git a/src/Html.Abstractions/test/HtmlFormattableStringTest.cs b/src/Html.Abstractions/test/HtmlFormattableStringTest.cs
index 27034d365a..c2d04be1bd 100644
--- a/src/Html.Abstractions/test/HtmlFormattableStringTest.cs
+++ b/src/Html.Abstractions/test/HtmlFormattableStringTest.cs
@@ -1,217 +1,213 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Globalization;
-using System.IO;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.WebEncoders.Testing;
-using Xunit;
-namespace Microsoft.AspNetCore.Html
+namespace Microsoft.AspNetCore.Html;
+
+public class HtmlFormattableStringTest
{
- public class HtmlFormattableStringTest
+ [Fact]
+ public void HtmlFormattableString_EmptyArgs()
{
- [Fact]
- public void HtmlFormattableString_EmptyArgs()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("Hello, World!");
+ // Arrange
+ var formattableString = new HtmlFormattableString("Hello, World!");
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("Hello, World!", result);
- }
+ // Assert
+ Assert.Equal("Hello, World!", result);
+ }
- [Fact]
- public void HtmlFormattableString_EmptyArgsAndCulture()
- {
- // Arrange
- var formattableString = new HtmlFormattableString(CultureInfo.CurrentCulture, "Hello, World!");
+ [Fact]
+ public void HtmlFormattableString_EmptyArgsAndCulture()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString(CultureInfo.CurrentCulture, "Hello, World!");
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("Hello, World!", result);
- }
+ // Assert
+ Assert.Equal("Hello, World!", result);
+ }
- [Fact]
- public void HtmlFormattableString_MultipleArguments()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth");
+ [Fact]
+ public void HtmlFormattableString_MultipleArguments()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth");
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal(
- "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!",
- result);
- }
+ // Assert
+ Assert.Equal(
+ "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!",
+ result);
+ }
- [Fact]
- public void HtmlFormattableString_WithHtmlString()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("{0}!", new HtmlString("First"));
+ [Fact]
+ public void HtmlFormattableString_WithHtmlString()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("{0}!", new HtmlString("First"));
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("First!", result);
- }
+ // Assert
+ Assert.Equal("First!", result);
+ }
- [Fact]
- public void HtmlFormattableString_WithOtherIHtmlContent()
- {
- // Arrange
- var builder = new HtmlContentBuilder();
- builder.Append("First");
+ [Fact]
+ public void HtmlFormattableString_WithOtherIHtmlContent()
+ {
+ // Arrange
+ var builder = new HtmlContentBuilder();
+ builder.Append("First");
- var formattableString = new HtmlFormattableString("{0}!", builder);
+ var formattableString = new HtmlFormattableString("{0}!", builder);
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("HtmlEncode[[First]]!", result);
- }
+ // Assert
+ Assert.Equal("HtmlEncode[[First]]!", result);
+ }
- // This test is needed to ensure the shared StringWriter gets cleared.
- [Fact]
- public void HtmlFormattableString_WithMultipleHtmlContentArguments()
- {
- // Arrange
- var formattableString = new HtmlFormattableString(
- "Happy {0}, {1}!",
- new HtmlString("Birthday"),
- new HtmlContentBuilder().Append("Billy"));
+ // This test is needed to ensure the shared StringWriter gets cleared.
+ [Fact]
+ public void HtmlFormattableString_WithMultipleHtmlContentArguments()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString(
+ "Happy {0}, {1}!",
+ new HtmlString("Birthday"),
+ new HtmlContentBuilder().Append("Billy"));
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("Happy Birthday, HtmlEncode[[Billy]]!", result);
- }
+ // Assert
+ Assert.Equal("Happy Birthday, HtmlEncode[[Billy]]!", result);
+ }
- [Fact]
- public void HtmlFormattableString_WithHtmlString_AndOffset()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("{0, 20}!", new HtmlString("First"));
+ [Fact]
+ public void HtmlFormattableString_WithHtmlString_AndOffset()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("{0, 20}!", new HtmlString("First"));
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal(" First!", result);
- }
+ // Assert
+ Assert.Equal(" First!", result);
+ }
- [Fact]
- public void HtmlFormattableString_With3Arguments()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50);
+ [Fact]
+ public void HtmlFormattableString_With3Arguments()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50);
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal(
- "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].",
- result);
- }
+ // Assert
+ Assert.Equal(
+ "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].",
+ result);
+ }
- [Fact]
- public void HtmlFormattableString_WithAlignmentComponent()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("{0, -25} World!", "Hello");
+ [Fact]
+ public void HtmlFormattableString_WithAlignmentComponent()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("{0, -25} World!", "Hello");
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal(
- "HtmlEncode[[Hello]] World!", result);
- }
+ // Assert
+ Assert.Equal(
+ "HtmlEncode[[Hello]] World!", result);
+ }
- [Fact]
- public void HtmlFormattableString_WithFormatStringComponent()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("0x{0:X}", 50);
+ [Fact]
+ public void HtmlFormattableString_WithFormatStringComponent()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("0x{0:X}", 50);
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("0xHtmlEncode[[32]]", result);
- }
+ // Assert
+ Assert.Equal("0xHtmlEncode[[32]]", result);
+ }
- [Fact]
- public void HtmlFormattableString_WithCulture()
- {
- // Arrange
- var formattableString = new HtmlFormattableString(
- CultureInfo.InvariantCulture,
- "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!",
- 1.1,
- 2.98,
- 145.82,
- 32.86);
-
- // Act
- var result = HtmlContentToString(formattableString);
-
- // Assert
- Assert.Equal(
- "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " +
- "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!",
- result);
- }
+ [Fact]
+ public void HtmlFormattableString_WithCulture()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString(
+ CultureInfo.InvariantCulture,
+ "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!",
+ 1.1,
+ 2.98,
+ 145.82,
+ 32.86);
+
+ // Act
+ var result = HtmlContentToString(formattableString);
+
+ // Assert
+ Assert.Equal(
+ "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " +
+ "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!",
+ result);
+ }
- [Fact]
- [ReplaceCulture("en-US", "en-US")]
- public void HtmlFormattableString_UsesPassedInCulture()
- {
- // Arrange
- var culture = new CultureInfo("fr-FR");
- var formattableString = new HtmlFormattableString(culture, "{0} in french!", 1.21);
+ [Fact]
+ [ReplaceCulture("en-US", "en-US")]
+ public void HtmlFormattableString_UsesPassedInCulture()
+ {
+ // Arrange
+ var culture = new CultureInfo("fr-FR");
+ var formattableString = new HtmlFormattableString(culture, "{0} in french!", 1.21);
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("HtmlEncode[[1,21]] in french!", result);
- }
+ // Assert
+ Assert.Equal("HtmlEncode[[1,21]] in french!", result);
+ }
- [Fact]
- [ReplaceCulture("de-DE", "de-DE")]
- public void HtmlFormattableString_UsesCurrentCulture()
- {
- // Arrange
- var formattableString = new HtmlFormattableString("{0:D}", new DateTime(2015, 02, 01));
+ [Fact]
+ [ReplaceCulture("de-DE", "de-DE")]
+ public void HtmlFormattableString_UsesCurrentCulture()
+ {
+ // Arrange
+ var formattableString = new HtmlFormattableString("{0:D}", new DateTime(2015, 02, 01));
- // Act
- var result = HtmlContentToString(formattableString);
+ // Act
+ var result = HtmlContentToString(formattableString);
- // Assert
- Assert.Equal("HtmlEncode[[Sonntag, 1. Februar 2015]]", result);
- }
+ // Assert
+ Assert.Equal("HtmlEncode[[Sonntag, 1. Februar 2015]]", result);
+ }
- private static string HtmlContentToString(IHtmlContent content)
+ private static string HtmlContentToString(IHtmlContent content)
+ {
+ using (var writer = new StringWriter())
{
- using (var writer = new StringWriter())
- {
- content.WriteTo(writer, new HtmlTestEncoder());
- return writer.ToString();
- }
+ content.WriteTo(writer, new HtmlTestEncoder());
+ return writer.ToString();
}
}
}
diff --git a/src/Http/Authentication.Abstractions/src/AuthenticateResult.cs b/src/Http/Authentication.Abstractions/src/AuthenticateResult.cs
index 52226c0cd3..298a18ecea 100644
--- a/src/Http/Authentication.Abstractions/src/AuthenticateResult.cs
+++ b/src/Http/Authentication.Abstractions/src/AuthenticateResult.cs
@@ -11,6 +11,8 @@ namespace Microsoft.AspNetCore.Authentication;
/// </summary>
public class AuthenticateResult
{
+ private static readonly AuthenticateResult _noResult = new() { None = true };
+
/// <summary>
/// Creates a new <see cref="AuthenticateResult"/> instance.
/// </summary>
@@ -89,7 +91,7 @@ public class AuthenticateResult
/// <returns>The result.</returns>
public static AuthenticateResult NoResult()
{
- return new AuthenticateResult() { None = true };
+ return _noResult;
}
/// <summary>
diff --git a/src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs b/src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs
index b6e543ac78..391a3ac42d 100644
--- a/src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs
+++ b/src/Http/Authentication.Abstractions/src/AuthenticationOptions.cs
@@ -113,4 +113,22 @@ public class AuthenticationOptions
/// A user is considered authenticated if <see cref="ClaimsIdentity.IsAuthenticated"/> returns <see langword="true" /> for the <see cref="ClaimsPrincipal"/> associated with the HTTP request.
/// </summary>
public bool RequireAuthenticatedSignIn { get; set; } = true;
+
+ /// <summary>
+ /// If true, DefaultScheme will not automatically use a single registered scheme.
+ /// </summary>
+ private bool? _disableAutoDefaultScheme;
+ internal bool DisableAutoDefaultScheme
+ {
+ get
+ {
+ if (!_disableAutoDefaultScheme.HasValue)
+ {
+ _disableAutoDefaultScheme = AppContext.TryGetSwitch("Microsoft.AspNetCore.Authentication.SuppressAutoDefaultScheme", out var enabled) && enabled;
+ }
+
+ return _disableAutoDefaultScheme.Value;
+ }
+ set => _disableAutoDefaultScheme = value;
+ }
}
diff --git a/src/Http/Authentication.Abstractions/src/IAuthenticationConfigurationProvider.cs b/src/Http/Authentication.Abstractions/src/IAuthenticationConfigurationProvider.cs
new file mode 100644
index 0000000000..a9e1284be6
--- /dev/null
+++ b/src/Http/Authentication.Abstractions/src/IAuthenticationConfigurationProvider.cs
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Configuration;
+
+namespace Microsoft.AspNetCore.Authentication;
+
+/// <summary>
+/// Provides an interface for implmenting a construct that provides
+/// access to authentication-related configuration sections.
+/// </summary>
+public interface IAuthenticationConfigurationProvider
+{
+ /// <summary>
+ /// Gets the <see cref="ConfigurationSection"/> where authentication
+ /// options are stored.
+ /// </summary>
+ IConfiguration AuthenticationConfiguration { get; }
+}
diff --git a/src/Http/Authentication.Abstractions/src/Properties/AssemblyInfo.cs b/src/Http/Authentication.Abstractions/src/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000000..a4b0b28430
--- /dev/null
+++ b/src/Http/Authentication.Abstractions/src/Properties/AssemblyInfo.cs
@@ -0,0 +1,8 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Authentication.Core, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Authentication.Core.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Authentication.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Http/Authentication.Abstractions/src/PublicAPI.Unshipped.txt b/src/Http/Authentication.Abstractions/src/PublicAPI.Unshipped.txt
index 7dc5c58110..f79cddf646 100644
--- a/src/Http/Authentication.Abstractions/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Authentication.Abstractions/src/PublicAPI.Unshipped.txt
@@ -1 +1,4 @@
#nullable enable
+Microsoft.AspNetCore.Authentication.IAuthenticationConfigurationProvider
+Microsoft.AspNetCore.Authentication.IAuthenticationConfigurationProvider.AuthenticationConfiguration.get -> Microsoft.Extensions.Configuration.IConfiguration!
+
diff --git a/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs b/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs
index 52b35a02aa..bab572a374 100644
--- a/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs
+++ b/src/Http/Authentication.Core/src/AuthenticationSchemeProvider.cs
@@ -47,6 +47,9 @@ public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider
private readonly IDictionary<string, AuthenticationScheme> _schemes;
private readonly List<AuthenticationScheme> _requestHandlers;
+ private static readonly Task<AuthenticationScheme?> _nullScheme = Task.FromResult<AuthenticationScheme?>(null);
+ private Task<AuthenticationScheme?> _autoDefaultScheme = _nullScheme;
+
// Used as a safe return value for enumeration apis
private IEnumerable<AuthenticationScheme> _schemesCopy = Array.Empty<AuthenticationScheme>();
private IEnumerable<AuthenticationScheme> _requestHandlersCopy = Array.Empty<AuthenticationScheme>();
@@ -54,7 +57,7 @@ public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider
private Task<AuthenticationScheme?> GetDefaultSchemeAsync()
=> _options.DefaultScheme != null
? GetSchemeAsync(_options.DefaultScheme)
- : Task.FromResult<AuthenticationScheme?>(null);
+ : _autoDefaultScheme;
/// <summary>
/// Returns the scheme that will be used by default for <see cref="IAuthenticationService.AuthenticateAsync(HttpContext, string)"/>.
@@ -150,6 +153,8 @@ public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider
}
_schemes[scheme.Name] = scheme;
_schemesCopy = _schemes.Values.ToArray();
+ CheckAutoDefaultScheme();
+
return true;
}
}
@@ -194,6 +199,7 @@ public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider
}
_schemes.Remove(name);
_schemesCopy = _schemes.Values.ToArray();
+ CheckAutoDefaultScheme();
}
}
}
@@ -201,4 +207,19 @@ public class AuthenticationSchemeProvider : IAuthenticationSchemeProvider
/// <inheritdoc />
public virtual Task<IEnumerable<AuthenticationScheme>> GetAllSchemesAsync()
=> Task.FromResult(_schemesCopy);
+
+ private void CheckAutoDefaultScheme()
+ {
+ if (!_options.DisableAutoDefaultScheme)
+ {
+ if (_schemes.Count == 1)
+ {
+ _autoDefaultScheme = Task.FromResult<AuthenticationScheme?>(_schemesCopy.First());
+ }
+ else
+ {
+ _autoDefaultScheme = _nullScheme;
+ }
+ }
+ }
}
diff --git a/src/Http/Authentication.Core/src/PublicAPI.Shipped.txt b/src/Http/Authentication.Core/src/PublicAPI.Shipped.txt
index 0f0f90ee90..a2f8c8991b 100644
--- a/src/Http/Authentication.Core/src/PublicAPI.Shipped.txt
+++ b/src/Http/Authentication.Core/src/PublicAPI.Shipped.txt
@@ -1,7 +1,7 @@
#nullable enable
-~Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
-~Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options, System.Collections.Generic.IDictionary<string!, Microsoft.AspNetCore.Authentication.AuthenticationScheme!>! schemes) -> void
-~Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticationService(Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider! handlers, Microsoft.AspNetCore.Authentication.IClaimsTransformation! transform, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
+Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
+Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options, System.Collections.Generic.IDictionary<string!, Microsoft.AspNetCore.Authentication.AuthenticationScheme!>! schemes) -> void
+Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticationService(Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider! handlers, Microsoft.AspNetCore.Authentication.IClaimsTransformation! transform, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
Microsoft.AspNetCore.Authentication.AuthenticationFeature
Microsoft.AspNetCore.Authentication.AuthenticationFeature.AuthenticationFeature() -> void
Microsoft.AspNetCore.Authentication.AuthenticationFeature.OriginalPath.get -> Microsoft.AspNetCore.Http.PathString
diff --git a/src/Http/Authentication.Core/src/PublicAPI.Unshipped.txt b/src/Http/Authentication.Core/src/PublicAPI.Unshipped.txt
index 06c2f800c4..7dc5c58110 100644
--- a/src/Http/Authentication.Core/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Authentication.Core/src/PublicAPI.Unshipped.txt
@@ -1,7 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options, System.Collections.Generic.IDictionary<string!, Microsoft.AspNetCore.Authentication.AuthenticationScheme!>! schemes) -> void
-*REMOVED*~Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticationService(Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider! handlers, Microsoft.AspNetCore.Authentication.IClaimsTransformation! transform, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
-Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
-Microsoft.AspNetCore.Authentication.AuthenticationSchemeProvider.AuthenticationSchemeProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options, System.Collections.Generic.IDictionary<string!, Microsoft.AspNetCore.Authentication.AuthenticationScheme!>! schemes) -> void
-Microsoft.AspNetCore.Authentication.AuthenticationService.AuthenticationService(Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Authentication.IAuthenticationHandlerProvider! handlers, Microsoft.AspNetCore.Authentication.IClaimsTransformation! transform, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.AuthenticationOptions!>! options) -> void
diff --git a/src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs b/src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs
index c51e29201a..69f2727e7d 100644
--- a/src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs
+++ b/src/Http/Authentication.Core/test/AuthenticationSchemeProviderTests.cs
@@ -12,19 +12,45 @@ namespace Microsoft.AspNetCore.Authentication.Core.Test;
public class AuthenticationSchemeProviderTests
{
[Fact]
- public async Task NoDefaultsByDefault()
+ public async Task NoDefaultsWithoutAutoDefaultScheme()
{
var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
{
+ o.DisableAutoDefaultScheme = true;
o.AddScheme<SignInHandler>("B", "whatever");
}).BuildServiceProvider();
var provider = services.GetRequiredService<IAuthenticationSchemeProvider>();
- Assert.Null(await provider.GetDefaultForbidSchemeAsync());
- Assert.Null(await provider.GetDefaultAuthenticateSchemeAsync());
- Assert.Null(await provider.GetDefaultChallengeSchemeAsync());
- Assert.Null(await provider.GetDefaultSignInSchemeAsync());
- Assert.Null(await provider.GetDefaultSignOutSchemeAsync());
+ await VerifyAllDefaults(provider, null);
+ }
+
+ [Fact]
+ public async Task NoDefaultsWithMoreSchemes()
+ {
+ var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
+ {
+ o.AddScheme<SignInHandler>("A", "whatever");
+ o.AddScheme<SignInHandler>("B", "whatever");
+ }).BuildServiceProvider();
+
+ var provider = services.GetRequiredService<IAuthenticationSchemeProvider>();
+ await VerifyAllDefaults(provider, null);
+ }
+
+ [Fact]
+ public async Task DefaultSchemesUsesSingleScheme()
+ {
+ var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
+ {
+ o.AddScheme<SignInHandler>("B", "whatever");
+ }).BuildServiceProvider();
+
+ var provider = services.GetRequiredService<IAuthenticationSchemeProvider>();
+ Assert.Equal("B", (await provider.GetDefaultForbidSchemeAsync())!.Name);
+ Assert.Equal("B", (await provider.GetDefaultAuthenticateSchemeAsync())!.Name);
+ Assert.Equal("B", (await provider.GetDefaultChallengeSchemeAsync())!.Name);
+ Assert.Equal("B", (await provider.GetDefaultSignInSchemeAsync())!.Name);
+ Assert.Equal("B", (await provider.GetDefaultSignOutSchemeAsync())!.Name);
}
[Fact]
@@ -33,6 +59,7 @@ public class AuthenticationSchemeProviderTests
var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
{
o.DefaultScheme = "B";
+ o.AddScheme<SignInHandler>("A", "whatever");
o.AddScheme<SignInHandler>("B", "whatever");
}).BuildServiceProvider();
@@ -164,6 +191,68 @@ public class AuthenticationSchemeProviderTests
Assert.Same(b, c);
}
+ [Fact]
+ public async Task AutoDefaultSchemeAddRemoveWorks()
+ {
+ var services = new ServiceCollection().AddOptions().AddAuthenticationCore(o =>
+ {
+ }).BuildServiceProvider();
+
+ var provider = services.GetRequiredService<IAuthenticationSchemeProvider>();
+
+ var scheme1 = new AuthenticationScheme("signin1", "whatever", typeof(Handler));
+ var scheme2 = new AuthenticationScheme("signin2", "whatever", typeof(Handler));
+ var scheme3 = new AuthenticationScheme("signin3", "whatever", typeof(Handler));
+
+ // No schemes, so null default
+ await VerifyAllDefaults(provider, null);
+
+ // One scheme, should be default
+ Assert.True(provider.TryAddScheme(scheme1));
+ await VerifyAllDefaults(provider, scheme1);
+
+ // Still one scheme, should be default
+ Assert.False(provider.TryAddScheme(scheme1));
+ await VerifyAllDefaults(provider, scheme1);
+
+ // Two schemes, should be null
+ Assert.True(provider.TryAddScheme(scheme2));
+ await VerifyAllDefaults(provider, null);
+
+ // Three schemes, should be null
+ Assert.True(provider.TryAddScheme(scheme3));
+ await VerifyAllDefaults(provider, null);
+
+ // Remove one scheme, still two schemes, should be null
+ provider.RemoveScheme(scheme2.Name);
+ await VerifyAllDefaults(provider, null);
+
+ // Remove same scheme, still two schemes, should be null
+ provider.RemoveScheme(scheme2.Name);
+ await VerifyAllDefaults(provider, null);
+
+ // Remove a scheme, now should have a default single
+ provider.RemoveScheme(scheme1.Name);
+ await VerifyAllDefaults(provider, scheme3);
+
+ // Remove last scheme, should be no default
+ provider.RemoveScheme(scheme3.Name);
+ await VerifyAllDefaults(provider, null);
+
+ // Add a scheme again, should be default
+ Assert.True(provider.TryAddScheme(scheme2));
+ await VerifyAllDefaults(provider, scheme2);
+ }
+
+ private async Task VerifyAllDefaults(IAuthenticationSchemeProvider provider, AuthenticationScheme? expected)
+ {
+ Assert.Equal(await provider.GetDefaultForbidSchemeAsync(), expected);
+ Assert.Equal(await provider.GetDefaultAuthenticateSchemeAsync(), expected);
+ Assert.Equal(await provider.GetDefaultChallengeSchemeAsync(), expected);
+ Assert.Equal(await provider.GetDefaultSignInSchemeAsync(), expected);
+ Assert.Equal(await provider.GetDefaultSignOutSchemeAsync(), expected);
+ }
+
private class Handler : IAuthenticationHandler
{
public Task<AuthenticateResult> AuthenticateAsync()
diff --git a/src/Http/Headers/src/CacheControlHeaderValue.cs b/src/Http/Headers/src/CacheControlHeaderValue.cs
index e807a82b32..3aedf5c176 100644
--- a/src/Http/Headers/src/CacheControlHeaderValue.cs
+++ b/src/Http/Headers/src/CacheControlHeaderValue.cs
@@ -502,7 +502,7 @@ public class CacheControlHeaderValue
/// </summary>
/// <param name="input">The value to parse.</param>
/// <param name="parsedValue">The parsed value.</param>
- /// <returns><see langword="true"/> if input is a valid <see cref="SetCookieHeaderValue"/>, otherwise <see langword="false"/>.</returns>
+ /// <returns><see langword="true"/> if input is a valid <see cref="CacheControlHeaderValue"/>, otherwise <see langword="false"/>.</returns>
public static bool TryParse(StringSegment input, [NotNullWhen(true)] out CacheControlHeaderValue? parsedValue)
{
var index = 0;
diff --git a/src/Http/Headers/src/ContentDispositionHeaderValue.cs b/src/Http/Headers/src/ContentDispositionHeaderValue.cs
index e0f0f99064..0a7882c8d1 100644
--- a/src/Http/Headers/src/ContentDispositionHeaderValue.cs
+++ b/src/Http/Headers/src/ContentDispositionHeaderValue.cs
@@ -32,8 +32,8 @@ public class ContentDispositionHeaderValue
private static readonly char[] QuestionMark = new char[] { '?' };
private static readonly char[] SingleQuote = new char[] { '\'' };
private static readonly char[] EscapeChars = new char[] { '\\', '"' };
- private static ReadOnlySpan<byte> MimePrefix => new byte[] { (byte)'"', (byte)'=', (byte)'?', (byte)'u', (byte)'t', (byte)'f', (byte)'-', (byte)'8', (byte)'?', (byte)'B', (byte)'?' };
- private static ReadOnlySpan<byte> MimeSuffix => new byte[] { (byte)'?', (byte)'=', (byte)'"' };
+ private static ReadOnlySpan<byte> MimePrefix => "\"=?utf-8?B?"u8;
+ private static ReadOnlySpan<byte> MimeSuffix => "?=\""u8;
private static readonly HttpHeaderParser<ContentDispositionHeaderValue> Parser
= new GenericHeaderParser<ContentDispositionHeaderValue>(false, GetDispositionTypeLength);
diff --git a/src/Http/Headers/src/HeaderNames.cs b/src/Http/Headers/src/HeaderNames.cs
index 1d7611d519..d5933802da 100644
--- a/src/Http/Headers/src/HeaderNames.cs
+++ b/src/Http/Headers/src/HeaderNames.cs
@@ -10,6 +10,8 @@ namespace Microsoft.Net.Http.Headers;
// Please do not open PRs without first opening an issue to discuss a specific item.
public static class HeaderNames
{
+ private const string PseudoHeaderNamesObsoletionMessage = "This is obsolete and will be removed in a future version. Header dictionaries do not contain this key.";
+
// Use readonly statics rather than constants so ReferenceEquals works
/// <summary>Gets the <c>Accept</c> HTTP header name.</summary>
@@ -61,6 +63,7 @@ public static class HeaderNames
public static readonly string AltSvc = "Alt-Svc";
/// <summary>Gets the <c>:authority</c> HTTP header name.</summary>
+ [Obsolete(PseudoHeaderNamesObsoletionMessage, false)]
public static readonly string Authority = ":authority";
/// <summary>Gets the <c>Authorization</c> HTTP header name.</summary>
@@ -178,12 +181,14 @@ public static class HeaderNames
public static readonly string MaxForwards = "Max-Forwards";
/// <summary>Gets the <c>:method</c> HTTP header name.</summary>
+ [Obsolete(PseudoHeaderNamesObsoletionMessage, false)]
public static readonly string Method = ":method";
/// <summary>Gets the <c>Origin</c> HTTP header name.</summary>
public static readonly string Origin = "Origin";
/// <summary>Gets the <c>:path</c> HTTP header name.</summary>
+ [Obsolete(PseudoHeaderNamesObsoletionMessage, false)]
public static readonly string Path = ":path";
/// <summary>Gets the <c>Pragma</c> HTTP header name.</summary>
@@ -211,6 +216,7 @@ public static class HeaderNames
public static readonly string RequestId = "Request-Id";
/// <summary>Gets the <c>:scheme</c> HTTP header name.</summary>
+ [Obsolete(PseudoHeaderNamesObsoletionMessage, false)]
public static readonly string Scheme = ":scheme";
/// <summary>Gets the <c>Sec-WebSocket-Accept</c> HTTP header name.</summary>
@@ -235,6 +241,7 @@ public static class HeaderNames
public static readonly string SetCookie = "Set-Cookie";
/// <summary>Gets the <c>:status</c> HTTP header name.</summary>
+ [Obsolete(PseudoHeaderNamesObsoletionMessage, false)]
public static readonly string Status = ":status";
/// <summary>Gets the <c>Strict-Transport-Security</c> HTTP header name.</summary>
diff --git a/src/Http/Headers/src/HeaderUtilities.cs b/src/Http/Headers/src/HeaderUtilities.cs
index 1be3d47bc3..59e62d1b56 100644
--- a/src/Http/Headers/src/HeaderUtilities.cs
+++ b/src/Http/Headers/src/HeaderUtilities.cs
@@ -553,7 +553,7 @@ public static class HeaderUtilities
return string.Create(31, dateTime, (span, dt) =>
{
span[0] = span[30] = '"';
- dt.TryFormat(span.Slice(1), out _, "r");
+ dt.TryFormat(span.Slice(1), out _, "r", CultureInfo.InvariantCulture);
});
}
diff --git a/src/Http/Headers/src/SetCookieHeaderValue.cs b/src/Http/Headers/src/SetCookieHeaderValue.cs
index 34460aa805..d20dd90591 100644
--- a/src/Http/Headers/src/SetCookieHeaderValue.cs
+++ b/src/Http/Headers/src/SetCookieHeaderValue.cs
@@ -4,6 +4,7 @@
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
+using System.Globalization;
using System.Text;
using Microsoft.Extensions.Primitives;
@@ -41,6 +42,7 @@ public class SetCookieHeaderValue
private StringSegment _name;
private StringSegment _value;
+ private List<StringSegment>? _extensions;
private SetCookieHeaderValue()
{
@@ -177,7 +179,10 @@ public class SetCookieHeaderValue
/// <summary>
/// Gets a collection of additional values to append to the cookie.
/// </summary>
- public IList<StringSegment> Extensions { get; } = new List<StringSegment>();
+ public IList<StringSegment> Extensions
+ {
+ get => _extensions ??= new List<StringSegment>();
+ }
// name="value"; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; samesite={strict|lax|none}; httponly
/// <inheritdoc />
@@ -236,9 +241,12 @@ public class SetCookieHeaderValue
length += SeparatorToken.Length + HttpOnlyToken.Length;
}
- foreach (var extension in Extensions)
+ if (_extensions?.Count > 0)
{
- length += SeparatorToken.Length + extension.Length;
+ foreach (var extension in _extensions)
+ {
+ length += SeparatorToken.Length + extension.Length;
+ }
}
return string.Create(length, (this, maxAge, sameSite), (span, tuple) =>
@@ -255,7 +263,7 @@ public class SetCookieHeaderValue
Append(ref span, ExpiresToken);
Append(ref span, EqualsToken);
- var formatted = expiresValue.TryFormat(span, out var charsWritten, ExpiresDateFormat);
+ var formatted = expiresValue.TryFormat(span, out var charsWritten, ExpiresDateFormat, CultureInfo.InvariantCulture);
span = span.Slice(charsWritten);
Debug.Assert(formatted);
@@ -291,9 +299,12 @@ public class SetCookieHeaderValue
AppendSegment(ref span, HttpOnlyToken, null);
}
- foreach (var extension in Extensions)
+ if (_extensions?.Count > 0)
{
- AppendSegment(ref span, extension, null);
+ foreach (var extension in _extensions)
+ {
+ AppendSegment(ref span, extension, null);
+ }
}
});
}
@@ -373,9 +384,12 @@ public class SetCookieHeaderValue
AppendSegment(builder, HttpOnlyToken, null);
}
- foreach (var extension in Extensions)
+ if (_extensions?.Count > 0)
{
- AppendSegment(builder, extension, null);
+ foreach (var extension in _extensions)
+ {
+ AppendSegment(builder, extension, null);
+ }
}
}
@@ -701,7 +715,7 @@ public class SetCookieHeaderValue
&& Secure == other.Secure
&& SameSite == other.SameSite
&& HttpOnly == other.HttpOnly
- && HeaderUtilities.AreEqualCollections(Extensions, other.Extensions, StringSegmentComparer.OrdinalIgnoreCase);
+ && HeaderUtilities.AreEqualCollections(_extensions, other._extensions, StringSegmentComparer.OrdinalIgnoreCase);
}
/// <inheritdoc />
@@ -717,9 +731,12 @@ public class SetCookieHeaderValue
^ SameSite.GetHashCode()
^ HttpOnly.GetHashCode();
- foreach (var extension in Extensions)
+ if (_extensions?.Count > 0)
{
- hash ^= extension.GetHashCode();
+ foreach (var extension in _extensions)
+ {
+ hash ^= extension.GetHashCode();
+ }
}
return hash;
diff --git a/src/Http/Http.Abstractions/src/AsParametersAttribute.cs b/src/Http/Http.Abstractions/src/AsParametersAttribute.cs
new file mode 100644
index 0000000000..5ed7ac1b1a
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/AsParametersAttribute.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+using System;
+
+/// <summary>
+/// Specifies that a route handler delegate's parameter represents a structured parameter list.
+/// </summary>
+[AttributeUsage(
+ AttributeTargets.Parameter,
+ Inherited = false,
+ AllowMultiple = false)]
+public sealed class AsParametersAttribute : Attribute
+{
+}
diff --git a/src/Http/Http.Abstractions/src/CookieBuilder.cs b/src/Http/Http.Abstractions/src/CookieBuilder.cs
index e4c1584852..21ce68649c 100644
--- a/src/Http/Http.Abstractions/src/CookieBuilder.cs
+++ b/src/Http/Http.Abstractions/src/CookieBuilder.cs
@@ -11,6 +11,7 @@ namespace Microsoft.AspNetCore.Http;
public class CookieBuilder
{
private string? _name;
+ private List<string>? _extensions;
/// <summary>
/// The name of the cookie.
@@ -78,6 +79,14 @@ public class CookieBuilder
public virtual bool IsEssential { get; set; }
/// <summary>
+ /// Gets a collection of additional values to append to the cookie.
+ /// </summary>
+ public IList<string> Extensions
+ {
+ get => _extensions ??= new List<string>();
+ }
+
+ /// <summary>
/// Creates the cookie options from the given <paramref name="context"/>.
/// </summary>
/// <param name="context">The <see cref="HttpContext"/>.</param>
@@ -97,7 +106,7 @@ public class CookieBuilder
throw new ArgumentNullException(nameof(context));
}
- return new CookieOptions
+ var options = new CookieOptions
{
Path = Path ?? "/",
SameSite = SameSite,
@@ -108,5 +117,14 @@ public class CookieBuilder
Secure = SecurePolicy == CookieSecurePolicy.Always || (SecurePolicy == CookieSecurePolicy.SameAsRequest && context.Request.IsHttps),
Expires = Expiration.HasValue ? expiresFrom.Add(Expiration.GetValueOrDefault()) : default(DateTimeOffset?)
};
+
+ if (_extensions?.Count > 0)
+ {
+ foreach (var extension in _extensions)
+ {
+ options.Extensions.Add(extension);
+ }
+ }
+ return options;
}
}
diff --git a/src/Http/Http.Abstractions/src/DefaultEndpointFilterInvocationContext.cs b/src/Http/Http.Abstractions/src/DefaultEndpointFilterInvocationContext.cs
new file mode 100644
index 0000000000..bc26cc1e02
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/DefaultEndpointFilterInvocationContext.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Provides a default implementation for wrapping the <see cref="HttpContext"/> and parameters
+/// provided to a route handler.
+/// </summary>
+public sealed class DefaultEndpointFilterInvocationContext : EndpointFilterInvocationContext
+{
+ /// <summary>
+ /// Creates a new instance of the <see cref="DefaultEndpointFilterInvocationContext"/> for a given request.
+ /// </summary>
+ /// <param name="httpContext">The <see cref="HttpContext"/> associated with the current request.</param>
+ /// <param name="arguments">A list of parameters provided in the current request.</param>
+ public DefaultEndpointFilterInvocationContext(HttpContext httpContext, params object[] arguments)
+ {
+ HttpContext = httpContext;
+ Arguments = arguments;
+ }
+
+ /// <inheritdoc />
+ public override HttpContext HttpContext { get; }
+
+ /// <inheritdoc />
+ public override IList<object?> Arguments { get; }
+
+ /// <inheritdoc />
+ public override T GetArgument<T>(int index)
+ {
+ return (T)Arguments[index]!;
+ }
+}
diff --git a/src/Http/Http.Abstractions/src/RouteHandlerFilterDelegate.cs b/src/Http/Http.Abstractions/src/EndpointFilterDelegate.cs
index afc443a33a..d473cd52e7 100644
--- a/src/Http/Http.Abstractions/src/RouteHandlerFilterDelegate.cs
+++ b/src/Http/Http.Abstractions/src/EndpointFilterDelegate.cs
@@ -6,8 +6,8 @@ namespace Microsoft.AspNetCore.Http;
/// <summary>
/// A delegate that is applied as a filter on a route handler.
/// </summary>
-/// <param name="context">The <see cref="RouteHandlerInvocationContext"/> associated with the current request.</param>
+/// <param name="context">The <see cref="EndpointFilterInvocationContext"/> associated with the current request.</param>
/// <returns>
/// A <see cref="ValueTask"/> result of calling the handler and applying any modifications made by filters in the pipeline.
/// </returns>
-public delegate ValueTask<object?> RouteHandlerFilterDelegate(RouteHandlerInvocationContext context);
+public delegate ValueTask<object?> EndpointFilterDelegate(EndpointFilterInvocationContext context);
diff --git a/src/Http/Http.Abstractions/src/EndpointFilterFactoryContext.cs b/src/Http/Http.Abstractions/src/EndpointFilterFactoryContext.cs
new file mode 100644
index 0000000000..86ab546835
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/EndpointFilterFactoryContext.cs
@@ -0,0 +1,46 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+using Microsoft.AspNetCore.Builder;
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Represents the information accessible via the route handler filter
+/// API when the user is constructing a new route handler.
+/// </summary>
+public sealed class EndpointFilterFactoryContext
+{
+ /// <summary>
+ /// Creates a new instance of the <see cref="EndpointFilterFactoryContext"/>.
+ /// </summary>
+ /// <param name="methodInfo">The <see cref="MethodInfo"/> associated with the route handler of the current request.</param>
+ /// <param name="endpointMetadata">The <see cref="EndpointBuilder.Metadata"/> associated with the endpoint the filter is targeting.</param>
+ /// <param name="applicationServices">The <see cref="IServiceProvider"/> instance used to access the application services.</param>
+ public EndpointFilterFactoryContext(MethodInfo methodInfo, IList<object> endpointMetadata, IServiceProvider applicationServices)
+ {
+ ArgumentNullException.ThrowIfNull(methodInfo);
+ ArgumentNullException.ThrowIfNull(endpointMetadata);
+ ArgumentNullException.ThrowIfNull(applicationServices);
+
+ MethodInfo = methodInfo;
+ EndpointMetadata = endpointMetadata;
+ ApplicationServices = applicationServices;
+ }
+
+ /// <summary>
+ /// The <see cref="MethodInfo"/> associated with the current route handler.
+ /// </summary>
+ public MethodInfo MethodInfo { get; }
+
+ /// <summary>
+ /// The <see cref="EndpointMetadataCollection"/> associated with the current endpoint.
+ /// </summary>
+ public IList<object> EndpointMetadata { get; }
+
+ /// <summary>
+ /// Gets the <see cref="IServiceProvider"/> instance used to access application services.
+ /// </summary>
+ public IServiceProvider ApplicationServices { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/EndpointFilterInvocationContext.cs b/src/Http/Http.Abstractions/src/EndpointFilterInvocationContext.cs
new file mode 100644
index 0000000000..f372b08b1d
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/EndpointFilterInvocationContext.cs
@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Provides an abstraction for wrapping the <see cref="HttpContext"/> and arguments
+/// provided to a route handler.
+/// </summary>
+public abstract class EndpointFilterInvocationContext
+{
+ /// <summary>
+ /// The <see cref="HttpContext"/> associated with the current request being processed by the filter.
+ /// </summary>
+ public abstract HttpContext HttpContext { get; }
+
+ /// <summary>
+ /// A list of arguments provided in the current request to the filter.
+ /// <remarks>
+ /// This list is not read-only to permit modifying of existing arguments by filters.
+ /// </remarks>
+ /// </summary>
+ public abstract IList<object?> Arguments { get; }
+
+ /// <summary>
+ /// Retrieve the argument given its position in the argument list.
+ /// </summary>
+ /// <typeparam name="T">The <see cref="Type"/> of the resolved argument.</typeparam>
+ /// <param name="index">An integer representing the position of the argument in the argument list.</param>
+ /// <returns>The argument at a given <paramref name="index"/>.</returns>
+ public abstract T GetArgument<T>(int index);
+}
diff --git a/src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.cs b/src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.cs
new file mode 100644
index 0000000000..b269cd9893
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.cs
@@ -0,0 +1,1385 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// <auto-generated />
+#nullable enable
+
+using System.Collections;
+using System.CodeDom.Compiler;
+
+namespace Microsoft.AspNetCore.Http;
+
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+
+ public int Count => 1;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+
+ public int Count => 2;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+
+ public int Count => 3;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+
+ public int Count => 4;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3, T4> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ Arg4 = arg4;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ 4 => Arg4,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ case 4:
+ Arg4 = (T4)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+ public T4 Arg4 { get; set; }
+
+ public int Count => 5;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ 4 => (T)(object)Arg4!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3, T4, T5> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ Arg4 = arg4;
+ Arg5 = arg5;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ 4 => Arg4,
+ 5 => Arg5,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ case 4:
+ Arg4 = (T4)(object?)value!;
+ break;
+ case 5:
+ Arg5 = (T5)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+ public T4 Arg4 { get; set; }
+ public T5 Arg5 { get; set; }
+
+ public int Count => 6;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ 4 => (T)(object)Arg4!,
+ 5 => (T)(object)Arg5!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3, T4, T5, T6> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ Arg4 = arg4;
+ Arg5 = arg5;
+ Arg6 = arg6;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ 4 => Arg4,
+ 5 => Arg5,
+ 6 => Arg6,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ case 4:
+ Arg4 = (T4)(object?)value!;
+ break;
+ case 5:
+ Arg5 = (T5)(object?)value!;
+ break;
+ case 6:
+ Arg6 = (T6)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+ public T4 Arg4 { get; set; }
+ public T5 Arg5 { get; set; }
+ public T6 Arg6 { get; set; }
+
+ public int Count => 7;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ 4 => (T)(object)Arg4!,
+ 5 => (T)(object)Arg5!,
+ 6 => (T)(object)Arg6!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3, T4, T5, T6, T7> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ Arg4 = arg4;
+ Arg5 = arg5;
+ Arg6 = arg6;
+ Arg7 = arg7;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ 4 => Arg4,
+ 5 => Arg5,
+ 6 => Arg6,
+ 7 => Arg7,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ case 4:
+ Arg4 = (T4)(object?)value!;
+ break;
+ case 5:
+ Arg5 = (T5)(object?)value!;
+ break;
+ case 6:
+ Arg6 = (T6)(object?)value!;
+ break;
+ case 7:
+ Arg7 = (T7)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+ public T4 Arg4 { get; set; }
+ public T5 Arg5 { get; set; }
+ public T6 Arg6 { get; set; }
+ public T7 Arg7 { get; set; }
+
+ public int Count => 8;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ 4 => (T)(object)Arg4!,
+ 5 => (T)(object)Arg5!,
+ 6 => (T)(object)Arg6!,
+ 7 => (T)(object)Arg7!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3, T4, T5, T6, T7, T8> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ Arg4 = arg4;
+ Arg5 = arg5;
+ Arg6 = arg6;
+ Arg7 = arg7;
+ Arg8 = arg8;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ 4 => Arg4,
+ 5 => Arg5,
+ 6 => Arg6,
+ 7 => Arg7,
+ 8 => Arg8,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ case 4:
+ Arg4 = (T4)(object?)value!;
+ break;
+ case 5:
+ Arg5 = (T5)(object?)value!;
+ break;
+ case 6:
+ Arg6 = (T6)(object?)value!;
+ break;
+ case 7:
+ Arg7 = (T7)(object?)value!;
+ break;
+ case 8:
+ Arg8 = (T8)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+ public T4 Arg4 { get; set; }
+ public T5 Arg5 { get; set; }
+ public T6 Arg6 { get; set; }
+ public T7 Arg7 { get; set; }
+ public T8 Arg8 { get; set; }
+
+ public int Count => 9;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ 4 => (T)(object)Arg4!,
+ 5 => (T)(object)Arg5!,
+ 6 => (T)(object)Arg6!,
+ 7 => (T)(object)Arg7!,
+ 8 => (T)(object)Arg8!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6, T7 arg7, T8 arg8, T9 arg9)
+ {
+ HttpContext = httpContext;
+ Arg0 = arg0;
+ Arg1 = arg1;
+ Arg2 = arg2;
+ Arg3 = arg3;
+ Arg4 = arg4;
+ Arg5 = arg5;
+ Arg6 = arg6;
+ Arg7 = arg7;
+ Arg8 = arg8;
+ Arg9 = arg9;
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+ 0 => Arg0,
+ 1 => Arg1,
+ 2 => Arg2,
+ 3 => Arg3,
+ 4 => Arg4,
+ 5 => Arg5,
+ 6 => Arg6,
+ 7 => Arg7,
+ 8 => Arg8,
+ 9 => Arg9,
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+ case 0:
+ Arg0 = (T0)(object?)value!;
+ break;
+ case 1:
+ Arg1 = (T1)(object?)value!;
+ break;
+ case 2:
+ Arg2 = (T2)(object?)value!;
+ break;
+ case 3:
+ Arg3 = (T3)(object?)value!;
+ break;
+ case 4:
+ Arg4 = (T4)(object?)value!;
+ break;
+ case 5:
+ Arg5 = (T5)(object?)value!;
+ break;
+ case 6:
+ Arg6 = (T6)(object?)value!;
+ break;
+ case 7:
+ Arg7 = (T7)(object?)value!;
+ break;
+ case 8:
+ Arg8 = (T8)(object?)value!;
+ break;
+ case 9:
+ Arg9 = (T9)(object?)value!;
+ break;
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ public T0 Arg0 { get; set; }
+ public T1 Arg1 { get; set; }
+ public T2 Arg2 { get; set; }
+ public T3 Arg3 { get; set; }
+ public T4 Arg4 { get; set; }
+ public T5 Arg5 { get; set; }
+ public T6 Arg6 { get; set; }
+ public T7 Arg7 { get; set; }
+ public T8 Arg8 { get; set; }
+ public T9 Arg9 { get; set; }
+
+ public int Count => 10;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+ 0 => (T)(object)Arg0!,
+ 1 => (T)(object)Arg1!,
+ 2 => (T)(object)Arg2!,
+ 3 => (T)(object)Arg3!,
+ 4 => (T)(object)Arg4!,
+ 5 => (T)(object)Arg5!,
+ 6 => (T)(object)Arg6!,
+ 7 => (T)(object)Arg7!,
+ 8 => (T)(object)Arg8!,
+ 9 => (T)(object)Arg9!,
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
diff --git a/src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.tt b/src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.tt
new file mode 100644
index 0000000000..098d639731
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/EndpointFilterInvocationContextOfT.Generated.tt
@@ -0,0 +1,130 @@
+<#@ template language="C#" #>
+<#@ output extension=".cs" #>
+<#@ assembly name="System.Core.dll" #>
+<#@ import namespace="System.Linq" #>
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// <auto-generated />
+<#
+int[] arities = Enumerable.Range(1, 10).ToArray();
+#>
+#nullable enable
+
+using System.Collections;
+using System.CodeDom.Compiler;
+
+namespace Microsoft.AspNetCore.Http;
+
+<# foreach (var arity in arities) { #>
+[GeneratedCode("TextTemplatingFileGenerator", "")]
+internal sealed class EndpointFilterInvocationContext<<# foreach (var argumentCount in Enumerable.Range(0, arity)) { #>T<#=argumentCount#><# if (argumentCount < arity - 1) { #>, <# } #><# } #>> : EndpointFilterInvocationContext, IList<object?>
+{
+ internal EndpointFilterInvocationContext(HttpContext httpContext, <# foreach (var argumentCount in Enumerable.Range(0, arity)) { #>T<#=argumentCount#> arg<#=argumentCount#><# if (argumentCount < arity - 1) { #>, <# } #><# } #>)
+ {
+ HttpContext = httpContext;
+<# foreach (var argumentCount in Enumerable.Range(0, arity)) { #> Arg<#=argumentCount#> = arg<#=argumentCount#>;
+<# } #>
+ }
+
+ public object? this[int index]
+ {
+ get => index switch
+ {
+<# foreach (var argumentCount in Enumerable.Range(0, arity)) { #> <#=argumentCount#> => Arg<#=argumentCount#>,
+<# } #>
+ _ => new IndexOutOfRangeException()
+ };
+ set
+ {
+ switch (index)
+ {
+<# foreach (var argumentCount in Enumerable.Range(0, arity)) { #> case <#=argumentCount#>:
+ Arg<#=argumentCount#> = (T<#=argumentCount#>)(object?)value!;
+ break;
+<# } #>
+ default:
+ break;
+ }
+ }
+ }
+
+ public override HttpContext HttpContext { get; }
+
+ public override IList<object?> Arguments => this;
+
+ <# foreach (var argumentCount in Enumerable.Range(0, arity)) { #>public T<#=argumentCount#> Arg<#=argumentCount#> { get; set; }
+ <# } #>
+
+ public int Count => <#=arity#>;
+
+ public bool IsReadOnly => false;
+
+ public bool IsFixedSize => true;
+
+ public void Add(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void Clear()
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Contains(object? item)
+ {
+ return IndexOf(item) >= 0;
+ }
+
+ public void CopyTo(object?[] array, int arrayIndex)
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ array[arrayIndex++] = Arguments[i];
+ }
+ }
+
+ public IEnumerator<object?> GetEnumerator()
+ {
+ for (int i = 0; i < Arguments.Count; i++)
+ {
+ yield return Arguments[i];
+ }
+ }
+
+ public override T GetArgument<T>(int index)
+ {
+ return index switch
+ {
+<# foreach (var argumentCount in Enumerable.Range(0, arity)) { #> <#=argumentCount#> => (T)(object)Arg<#=argumentCount#>!,
+<# } #>
+ _ => throw new IndexOutOfRangeException()
+ };
+ }
+
+ public int IndexOf(object? item)
+ {
+ return Arguments.IndexOf(item);
+ }
+
+ public void Insert(int index, object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public bool Remove(object? item)
+ {
+ throw new NotSupportedException();
+ }
+
+ public void RemoveAt(int index)
+ {
+ throw new NotSupportedException();
+ }
+
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+}
+<# } #>
diff --git a/src/Http/Http.Abstractions/src/Extensions/EndpointBuilder.cs b/src/Http/Http.Abstractions/src/Extensions/EndpointBuilder.cs
index 873a1dbe8b..3afd75bb40 100644
--- a/src/Http/Http.Abstractions/src/Extensions/EndpointBuilder.cs
+++ b/src/Http/Http.Abstractions/src/Extensions/EndpointBuilder.cs
@@ -11,6 +11,11 @@ namespace Microsoft.AspNetCore.Builder;
public abstract class EndpointBuilder
{
/// <summary>
+ /// Gets the list of filters that apply to this endpoint.
+ /// </summary>
+ public IList<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>> FilterFactories { get; } = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>();
+
+ /// <summary>
/// Gets or sets the delegate used to process requests for the endpoint.
/// </summary>
public RequestDelegate? RequestDelegate { get; set; }
@@ -28,11 +33,17 @@ public abstract class EndpointBuilder
/// <summary>
/// Gets the <see cref="IServiceProvider"/> associated with the endpoint.
/// </summary>
- public IServiceProvider? ServiceProvider { get; set; }
+ public IServiceProvider ApplicationServices { get; set; } = EmptyServiceProvider.Instance;
/// <summary>
/// Creates an instance of <see cref="Endpoint"/> from the <see cref="EndpointBuilder"/>.
/// </summary>
/// <returns>The created <see cref="Endpoint"/>.</returns>
public abstract Endpoint Build();
+
+ private sealed class EmptyServiceProvider : IServiceProvider
+ {
+ public static EmptyServiceProvider Instance { get; } = new EmptyServiceProvider();
+ public object? GetService(Type serviceType) => null;
+ }
}
diff --git a/src/Http/Http.Abstractions/src/Extensions/IEndpointConventionBuilder.cs b/src/Http/Http.Abstractions/src/Extensions/IEndpointConventionBuilder.cs
index 50a0357216..288151402c 100644
--- a/src/Http/Http.Abstractions/src/Extensions/IEndpointConventionBuilder.cs
+++ b/src/Http/Http.Abstractions/src/Extensions/IEndpointConventionBuilder.cs
@@ -16,4 +16,11 @@ public interface IEndpointConventionBuilder
/// </summary>
/// <param name="convention">The convention to add to the builder.</param>
void Add(Action<EndpointBuilder> convention);
+
+ /// <summary>
+ /// Registers the specified convention for execution after conventions registered
+ /// via <see cref="Add(Action{EndpointBuilder})"/>
+ /// </summary>
+ /// <param name="finallyConvention">The convention to add to the builder.</param>
+ void Finally(Action<EndpointBuilder> finallyConvention) => throw new NotImplementedException();
}
diff --git a/src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs b/src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs
index b4e908854c..254f88211c 100644
--- a/src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs
+++ b/src/Http/Http.Abstractions/src/Extensions/UsePathBaseExtensions.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Builder.Extensions;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Builder;
@@ -31,6 +32,16 @@ public static class UsePathBaseExtensions
return app;
}
+ // Only use this path if there's a global router (in the 'WebApplication' case).
+ if (app.Properties.TryGetValue(RerouteHelper.GlobalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
+ {
+ return app.Use(next =>
+ {
+ var newNext = RerouteHelper.Reroute(app, routeBuilder, next);
+ return new UsePathBaseMiddleware(newNext, pathBase).Invoke;
+ });
+ }
+
return app.UseMiddleware<UsePathBaseMiddleware>(pathBase);
}
}
diff --git a/src/Http/Http.Abstractions/src/HttpResults/IContentTypeHttpResult.cs b/src/Http/Http.Abstractions/src/HttpResults/IContentTypeHttpResult.cs
new file mode 100644
index 0000000000..3f115fc280
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/HttpResults/IContentTypeHttpResult.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a contract that represents the result of an HTTP endpoint
+/// that contains a <see cref="ContentType"/>.
+/// </summary>
+public interface IContentTypeHttpResult
+{
+ /// <summary>
+ /// Gets the Content-Type header for the response.
+ /// </summary>
+ string? ContentType { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/HttpResults/IFileHttpResult.cs b/src/Http/Http.Abstractions/src/HttpResults/IFileHttpResult.cs
new file mode 100644
index 0000000000..e5df0a5b70
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/HttpResults/IFileHttpResult.cs
@@ -0,0 +1,20 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a contract that represents the file result of an HTTP endpoint.
+/// </summary>
+public interface IFileHttpResult
+{
+ /// <summary>
+ /// Gets the Content-Type header for the response.
+ /// </summary>
+ string? ContentType { get; }
+
+ /// <summary>
+ /// Gets the file name that will be used in the Content-Disposition header of the response.
+ /// </summary>
+ string? FileDownloadName { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/HttpResults/INestedHttpResult.cs b/src/Http/Http.Abstractions/src/HttpResults/INestedHttpResult.cs
new file mode 100644
index 0000000000..abc47c5d75
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/HttpResults/INestedHttpResult.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a contract that represents the result of an HTTP endpoint
+/// that contains a nested <see cref="IResult"/> type.
+/// </summary>
+/// <remarks>For example, <c>Results&lt;TResult1, TResult2&gt;</c> is an <see cref="INestedHttpResult"/> and will contain the returned <see cref="IResult"/>.</remarks>
+public interface INestedHttpResult
+{
+ /// <summary>
+ /// Gets the actual <see cref="IResult"/> returned by the <see cref="Endpoint"/> route handler delegate.
+ /// </summary>
+ IResult Result { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/IResult.cs b/src/Http/Http.Abstractions/src/HttpResults/IResult.cs
index 7ecc2ee139..7ecc2ee139 100644
--- a/src/Http/Http.Abstractions/src/IResult.cs
+++ b/src/Http/Http.Abstractions/src/HttpResults/IResult.cs
diff --git a/src/Http/Http.Abstractions/src/HttpResults/IStatusCodeHttpResult.cs b/src/Http/Http.Abstractions/src/HttpResults/IStatusCodeHttpResult.cs
new file mode 100644
index 0000000000..dbac1475d1
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/HttpResults/IStatusCodeHttpResult.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a contract that represents the result of an HTTP endpoint
+/// that contains a <see cref="StatusCode"/>.
+/// </summary>
+public interface IStatusCodeHttpResult
+{
+ /// <summary>
+ /// Gets the HTTP status code.
+ /// </summary>
+ int? StatusCode { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/HttpResults/IValueHttpResult.cs b/src/Http/Http.Abstractions/src/HttpResults/IValueHttpResult.cs
new file mode 100644
index 0000000000..ba86622248
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/HttpResults/IValueHttpResult.cs
@@ -0,0 +1,28 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a contract that represents the result of an HTTP endpoint
+/// that contains an object <see cref="Value"/>.
+/// </summary>
+public interface IValueHttpResult
+{
+ /// <summary>
+ /// Gets the object result.
+ /// </summary>
+ object? Value { get; }
+}
+
+/// <summary>
+/// Defines a contract that represents the result of an HTTP endpoint
+/// that contains a <see cref="Value"/>.
+/// </summary>
+public interface IValueHttpResult<out TValue>
+{
+ /// <summary>
+ /// Gets the object result.
+ /// </summary>
+ TValue? Value { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/IApplicationBuilder.cs b/src/Http/Http.Abstractions/src/IApplicationBuilder.cs
index 3122180529..4d35df40f4 100644
--- a/src/Http/Http.Abstractions/src/IApplicationBuilder.cs
+++ b/src/Http/Http.Abstractions/src/IApplicationBuilder.cs
@@ -19,6 +19,9 @@ public interface IApplicationBuilder
/// <summary>
/// Gets the set of HTTP features the application's server provides.
/// </summary>
+ /// <remarks>
+ /// An empty collection is returned if a server wasn't specified for the application builder.
+ /// </remarks>
IFeatureCollection ServerFeatures { get; }
/// <summary>
diff --git a/src/Http/Http.Abstractions/src/IBindableFromHttpContextOfT.cs b/src/Http/Http.Abstractions/src/IBindableFromHttpContextOfT.cs
new file mode 100644
index 0000000000..0f414b849e
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/IBindableFromHttpContextOfT.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a mechanism for creating an instance of a type from an <see cref="HttpContext"/> when binding parameters for an endpoint
+/// route handler delegate.
+/// </summary>
+/// <typeparam name="TSelf">The type that implements this interface.</typeparam>
+public interface IBindableFromHttpContext<TSelf> where TSelf : class, IBindableFromHttpContext<TSelf>
+{
+ /// <summary>
+ /// Creates an instance of <typeparamref name="TSelf"/> from the <see cref="HttpContext"/>.
+ /// </summary>
+ /// <param name="context">The <see cref="HttpContext"/> for the current request.</param>
+ /// <param name="parameter">The <see cref="ParameterInfo"/> for the parameter of the route handler delegate the returned instance will populate.</param>
+ /// <returns>The instance of <typeparamref name="TSelf"/>.</returns>
+ static abstract ValueTask<TSelf?> BindAsync(HttpContext context, ParameterInfo parameter);
+}
diff --git a/src/Http/Http.Abstractions/src/IRouteHandlerFilter.cs b/src/Http/Http.Abstractions/src/IEndpointFilter.cs
index 854947c4b3..7cd316ab00 100644
--- a/src/Http/Http.Abstractions/src/IRouteHandlerFilter.cs
+++ b/src/Http/Http.Abstractions/src/IEndpointFilter.cs
@@ -6,15 +6,15 @@ namespace Microsoft.AspNetCore.Http;
/// <summary>
/// Provides an interface for implementing a filter targetting a route handler.
/// </summary>
-public interface IRouteHandlerFilter
+public interface IEndpointFilter
{
/// <summary>
- /// Implements the core logic associated with the filter given a <see cref="RouteHandlerInvocationContext"/>
+ /// Implements the core logic associated with the filter given a <see cref="EndpointFilterInvocationContext"/>
/// and the next filter to call in the pipeline.
/// </summary>
- /// <param name="context">The <see cref="RouteHandlerInvocationContext"/> associated with the current request/response.</param>
+ /// <param name="context">The <see cref="EndpointFilterInvocationContext"/> associated with the current request/response.</param>
/// <param name="next">The next filter in the pipeline.</param>
/// <returns>An awaitable result of calling the handler and apply
/// any modifications made by filters in the pipeline.</returns>
- ValueTask<object?> InvokeAsync(RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next);
+ ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next);
}
diff --git a/src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs b/src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs
index 4148b939db..e7a2fdcdb2 100644
--- a/src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs
+++ b/src/Http/Http.Abstractions/src/Internal/HostStringHelper.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Http;
-internal class HostStringHelper
+internal sealed class HostStringHelper
{
// Allowed Characters:
// A-Z, a-z, 0-9, .,
diff --git a/src/Http/Http.Abstractions/src/Metadata/IRequestSizeLimitMetadata.cs b/src/Http/Http.Abstractions/src/Metadata/IRequestSizeLimitMetadata.cs
new file mode 100644
index 0000000000..b90750ee63
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/Metadata/IRequestSizeLimitMetadata.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http.Metadata;
+
+/// <summary>
+/// Interface marking attributes that specify the maximum allowed size of the request body.
+/// </summary>
+public interface IRequestSizeLimitMetadata
+{
+ /// <summary>
+ /// The maximum allowed size of the current request body in bytes.
+ /// </summary>
+ long? MaxRequestBodySize { get; }
+}
diff --git a/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj
index b8b80cd3f4..167bc9455f 100644
--- a/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj
+++ b/src/Http/Http.Abstractions/src/Microsoft.AspNetCore.Http.Abstractions.csproj
@@ -26,10 +26,33 @@ Microsoft.AspNetCore.Http.HttpResponse</Description>
<Compile Include="$(SharedSourceRoot)PropertyHelper\**\*.cs" />
<Compile Include="$(SharedSourceRoot)\UrlDecoder\UrlDecoder.cs" Link="UrlDecoder.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)ProblemDetails\HttpValidationProblemDetailsJsonConverter.cs" LinkBase="ProblemDetails\Converters" />
+ <Compile Include="$(SharedSourceRoot)ProblemDetails\ProblemDetailsJsonConverter.cs" LinkBase="ProblemDetails\Converters" />
+ <Compile Include="$(SharedSourceRoot)Reroute.cs" />
</ItemGroup>
<ItemGroup>
<InternalsVisibleTo Include="Microsoft.AspNetCore.Http.Abstractions.Microbenchmarks" />
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.Http.Extensions" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <None Update="EndpointFilterInvocationContextOfT.Generated.tt">
+ <Generator>TextTemplatingFileGenerator</Generator>
+ <LastGenOutput>EndpointFilterInvocationContextOfT.Generated.cs</LastGenOutput>
+ </None>
+ </ItemGroup>
+
+ <ItemGroup>
+ <Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Compile Update="EndpointFilterInvocationContextOfT.Generated.cs">
+ <DesignTime>True</DesignTime>
+ <AutoGen>True</AutoGen>
+ <DependentUpon>EndpointFilterInvocationContextOfT.Generated.tt</DependentUpon>
+ </Compile>
</ItemGroup>
</Project>
diff --git a/src/Http/Http.Extensions/src/HttpValidationProblemDetails.cs b/src/Http/Http.Abstractions/src/ProblemDetails/HttpValidationProblemDetails.cs
index 5bab6886c7..12ccd028ba 100644
--- a/src/Http/Http.Extensions/src/HttpValidationProblemDetails.cs
+++ b/src/Http/Http.Abstractions/src/ProblemDetails/HttpValidationProblemDetails.cs
@@ -25,7 +25,7 @@ public class HttpValidationProblemDetails : ProblemDetails
/// </summary>
/// <param name="errors">The validation errors.</param>
public HttpValidationProblemDetails(IDictionary<string, string[]> errors)
- : this(new Dictionary<string, string[]>(errors, StringComparer.Ordinal))
+ : this(new Dictionary<string, string[]>(errors ?? throw new ArgumentNullException(nameof(errors)), StringComparer.Ordinal))
{
}
diff --git a/src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsService.cs b/src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsService.cs
new file mode 100644
index 0000000000..564ee29403
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsService.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a type that provide functionality to
+/// create a <see cref="Mvc.ProblemDetails"/> response.
+/// </summary>
+public interface IProblemDetailsService
+{
+ /// <summary>
+ /// Try to write a <see cref="Mvc.ProblemDetails"/> response to the current context,
+ /// using the registered <see cref="IProblemDetailsWriter"/> services.
+ /// </summary>
+ /// <param name="context">The <see cref="ProblemDetailsContext"/> associated with the current request/response.</param>
+ /// <remarks>The <see cref="IProblemDetailsWriter"/> registered services
+ /// are processed in sequence and the processing is completed when:
+ /// <list type="bullet">One of them reports that the response was written successfully, or.</list>
+ /// <list type="bullet">All <see cref="IProblemDetailsWriter"/> were executed and none of them was able to write the response successfully.</list>
+ /// </remarks>
+ ValueTask WriteAsync(ProblemDetailsContext context);
+}
diff --git a/src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsWriter.cs b/src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsWriter.cs
new file mode 100644
index 0000000000..852e6b2e57
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/ProblemDetails/IProblemDetailsWriter.cs
@@ -0,0 +1,24 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Defines a type that write a <see cref="Mvc.ProblemDetails"/>
+/// payload to the current <see cref="HttpContext.Response"/>.
+/// </summary>
+public interface IProblemDetailsWriter
+{
+ /// <summary>
+ /// Write a <see cref="Mvc.ProblemDetails"/> response to the current context
+ /// </summary>
+ /// <param name="context">The <see cref="ProblemDetailsContext"/> associated with the current request/response.</param>
+ ValueTask WriteAsync(ProblemDetailsContext context);
+
+ /// <summary>
+ /// Determines whether this instance can write a <see cref="Mvc.ProblemDetails"/> to the current context.
+ /// </summary>
+ /// <param name="context">The <see cref="ProblemDetailsContext"/> associated with the current request/response.</param>
+ /// <returns>Flag that indicates if that the writer can write to the current <see cref="ProblemDetailsContext"/>.</returns>
+ bool CanWrite(ProblemDetailsContext context);
+}
diff --git a/src/Http/Http.Extensions/src/ProblemDetails.cs b/src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetails.cs
index 2d01289cdf..2d01289cdf 100644
--- a/src/Http/Http.Extensions/src/ProblemDetails.cs
+++ b/src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetails.cs
diff --git a/src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetailsContext.cs b/src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetailsContext.cs
new file mode 100644
index 0000000000..62058cf8ec
--- /dev/null
+++ b/src/Http/Http.Abstractions/src/ProblemDetails/ProblemDetailsContext.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc;
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Represent the current problem details context for the request.
+/// </summary>
+public sealed class ProblemDetailsContext
+{
+ private ProblemDetails? _problemDetails;
+
+ /// <summary>
+ /// The <see cref="HttpContext"/> associated with the current request being processed by the filter.
+ /// </summary>
+ public required HttpContext HttpContext { get; init; }
+
+ /// <summary>
+ /// A collection of additional arbitrary metadata associated with the current request endpoint.
+ /// </summary>
+ public EndpointMetadataCollection? AdditionalMetadata { get; init; }
+
+ /// <summary>
+ /// An instance of <see cref="ProblemDetails"/> that will be
+ /// used during the response payload generation.
+ /// </summary>
+ public ProblemDetails ProblemDetails
+ {
+ get => _problemDetails ??= new ProblemDetails();
+ init => _problemDetails = value;
+ }
+}
diff --git a/src/Http/Http.Abstractions/src/PublicAPI.Shipped.txt b/src/Http/Http.Abstractions/src/PublicAPI.Shipped.txt
index d2832c2e5c..de48ab3534 100644
--- a/src/Http/Http.Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/Http/Http.Abstractions/src/PublicAPI.Shipped.txt
@@ -220,6 +220,7 @@ Microsoft.AspNetCore.Http.EndpointMetadataCollection.Count.get -> int
Microsoft.AspNetCore.Http.EndpointMetadataCollection.EndpointMetadataCollection(params object![]! items) -> void
Microsoft.AspNetCore.Http.EndpointMetadataCollection.EndpointMetadataCollection(System.Collections.Generic.IEnumerable<object!>! items) -> void
Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator
+Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Current.get -> object?
Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Dispose() -> void
Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.MoveNext() -> bool
@@ -235,6 +236,7 @@ Microsoft.AspNetCore.Http.Features.IRouteValuesFeature
Microsoft.AspNetCore.Http.Features.IRouteValuesFeature.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary!
Microsoft.AspNetCore.Http.Features.IRouteValuesFeature.RouteValues.set -> void
Microsoft.AspNetCore.Http.FragmentString
+Microsoft.AspNetCore.Http.FragmentString.FragmentString() -> void
Microsoft.AspNetCore.Http.FragmentString.Equals(Microsoft.AspNetCore.Http.FragmentString other) -> bool
Microsoft.AspNetCore.Http.FragmentString.FragmentString(string! value) -> void
Microsoft.AspNetCore.Http.FragmentString.HasValue.get -> bool
@@ -242,6 +244,7 @@ Microsoft.AspNetCore.Http.FragmentString.ToUriComponent() -> string!
Microsoft.AspNetCore.Http.FragmentString.Value.get -> string!
Microsoft.AspNetCore.Http.HeaderDictionaryExtensions
Microsoft.AspNetCore.Http.HostString
+Microsoft.AspNetCore.Http.HostString.HostString() -> void
Microsoft.AspNetCore.Http.HostString.Equals(Microsoft.AspNetCore.Http.HostString other) -> bool
Microsoft.AspNetCore.Http.HostString.HasValue.get -> bool
Microsoft.AspNetCore.Http.HostString.Host.get -> string!
@@ -292,6 +295,7 @@ Microsoft.AspNetCore.Http.Metadata.IProducesResponseTypeMetadata.Type.get -> Sys
Microsoft.AspNetCore.Http.Metadata.ITagsMetadata
Microsoft.AspNetCore.Http.Metadata.ITagsMetadata.Tags.get -> System.Collections.Generic.IReadOnlyList<string!>!
Microsoft.AspNetCore.Http.PathString
+Microsoft.AspNetCore.Http.PathString.PathString() -> void
Microsoft.AspNetCore.Http.PathString.Add(Microsoft.AspNetCore.Http.PathString other) -> Microsoft.AspNetCore.Http.PathString
Microsoft.AspNetCore.Http.PathString.Add(Microsoft.AspNetCore.Http.QueryString other) -> string!
Microsoft.AspNetCore.Http.PathString.Equals(Microsoft.AspNetCore.Http.PathString other) -> bool
@@ -307,6 +311,7 @@ Microsoft.AspNetCore.Http.PathString.StartsWithSegments(Microsoft.AspNetCore.Htt
Microsoft.AspNetCore.Http.PathString.ToUriComponent() -> string!
Microsoft.AspNetCore.Http.PathString.Value.get -> string?
Microsoft.AspNetCore.Http.QueryString
+Microsoft.AspNetCore.Http.QueryString.QueryString() -> void
Microsoft.AspNetCore.Http.QueryString.Add(Microsoft.AspNetCore.Http.QueryString other) -> Microsoft.AspNetCore.Http.QueryString
Microsoft.AspNetCore.Http.QueryString.Add(string! name, string! value) -> Microsoft.AspNetCore.Http.QueryString
Microsoft.AspNetCore.Http.QueryString.Equals(Microsoft.AspNetCore.Http.QueryString other) -> bool
@@ -331,6 +336,7 @@ Microsoft.AspNetCore.Routing.RouteValueDictionary.Comparer.get -> System.Collect
Microsoft.AspNetCore.Routing.RouteValueDictionary.ContainsKey(string! key) -> bool
Microsoft.AspNetCore.Routing.RouteValueDictionary.Count.get -> int
Microsoft.AspNetCore.Routing.RouteValueDictionary.Enumerator
+Microsoft.AspNetCore.Routing.RouteValueDictionary.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Routing.RouteValueDictionary.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, object?>
Microsoft.AspNetCore.Routing.RouteValueDictionary.Enumerator.Dispose() -> void
Microsoft.AspNetCore.Routing.RouteValueDictionary.Enumerator.Enumerator(Microsoft.AspNetCore.Routing.RouteValueDictionary! dictionary) -> void
diff --git a/src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt b/src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt
index 4532909a61..c441d489f7 100644
--- a/src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Http.Abstractions/src/PublicAPI.Unshipped.txt
@@ -1,27 +1,88 @@
#nullable enable
*REMOVED*abstract Microsoft.AspNetCore.Http.HttpResponse.ContentType.get -> string!
-Microsoft.AspNetCore.Builder.EndpointBuilder.ServiceProvider.get -> System.IServiceProvider?
-Microsoft.AspNetCore.Builder.EndpointBuilder.ServiceProvider.set -> void
+*REMOVED*Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Current.get -> object?
+abstract Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.Arguments.get -> System.Collections.Generic.IList<object?>!
+abstract Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.GetArgument<T>(int index) -> T
+abstract Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.HttpContext.get -> Microsoft.AspNetCore.Http.HttpContext!
+Microsoft.AspNetCore.Builder.EndpointBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Builder.EndpointBuilder.ApplicationServices.set -> void
+Microsoft.AspNetCore.Builder.EndpointBuilder.FilterFactories.get -> System.Collections.Generic.IList<System.Func<Microsoft.AspNetCore.Http.EndpointFilterFactoryContext!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!>!>!
+Microsoft.AspNetCore.Builder.IEndpointConventionBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finallyConvention) -> void
+Microsoft.AspNetCore.Http.AsParametersAttribute
+Microsoft.AspNetCore.Http.AsParametersAttribute.AsParametersAttribute() -> void
+Microsoft.AspNetCore.Http.CookieBuilder.Extensions.get -> System.Collections.Generic.IList<string!>!
+Microsoft.AspNetCore.Http.DefaultEndpointFilterInvocationContext
+Microsoft.AspNetCore.Http.DefaultEndpointFilterInvocationContext.DefaultEndpointFilterInvocationContext(Microsoft.AspNetCore.Http.HttpContext! httpContext, params object![]! arguments) -> void
+Microsoft.AspNetCore.Http.EndpointFilterDelegate
+Microsoft.AspNetCore.Http.EndpointFilterFactoryContext
+Microsoft.AspNetCore.Http.EndpointFilterFactoryContext.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Http.EndpointFilterFactoryContext.EndpointFilterFactoryContext(System.Reflection.MethodInfo! methodInfo, System.Collections.Generic.IList<object!>! endpointMetadata, System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Http.EndpointFilterFactoryContext.EndpointMetadata.get -> System.Collections.Generic.IList<object!>!
+Microsoft.AspNetCore.Http.EndpointFilterFactoryContext.MethodInfo.get -> System.Reflection.MethodInfo!
+Microsoft.AspNetCore.Http.EndpointFilterInvocationContext
+Microsoft.AspNetCore.Http.EndpointFilterInvocationContext.EndpointFilterInvocationContext() -> void
+Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Current.get -> object!
Microsoft.AspNetCore.Http.EndpointMetadataCollection.GetRequiredMetadata<T>() -> T!
-Microsoft.AspNetCore.Http.IRouteHandlerFilter.InvokeAsync(Microsoft.AspNetCore.Http.RouteHandlerInvocationContext! context, Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate! next) -> System.Threading.Tasks.ValueTask<object?>
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails.Errors.get -> System.Collections.Generic.IDictionary<string!, string![]!>!
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails.HttpValidationProblemDetails() -> void
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails.HttpValidationProblemDetails(System.Collections.Generic.IDictionary<string!, string![]!>! errors) -> void
+Microsoft.AspNetCore.Http.IBindableFromHttpContext<TSelf>
+Microsoft.AspNetCore.Http.IBindableFromHttpContext<TSelf>.BindAsync(Microsoft.AspNetCore.Http.HttpContext! context, System.Reflection.ParameterInfo! parameter) -> System.Threading.Tasks.ValueTask<TSelf?>
+Microsoft.AspNetCore.Http.IContentTypeHttpResult
+Microsoft.AspNetCore.Http.IContentTypeHttpResult.ContentType.get -> string?
+Microsoft.AspNetCore.Http.IEndpointFilter
+Microsoft.AspNetCore.Http.IEndpointFilter.InvokeAsync(Microsoft.AspNetCore.Http.EndpointFilterInvocationContext! context, Microsoft.AspNetCore.Http.EndpointFilterDelegate! next) -> System.Threading.Tasks.ValueTask<object?>
+Microsoft.AspNetCore.Http.IFileHttpResult
+Microsoft.AspNetCore.Http.IFileHttpResult.ContentType.get -> string?
+Microsoft.AspNetCore.Http.IFileHttpResult.FileDownloadName.get -> string?
+Microsoft.AspNetCore.Http.IProblemDetailsService
+Microsoft.AspNetCore.Http.IProblemDetailsService.WriteAsync(Microsoft.AspNetCore.Http.ProblemDetailsContext! context) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Http.IProblemDetailsWriter
+Microsoft.AspNetCore.Http.INestedHttpResult
+Microsoft.AspNetCore.Http.INestedHttpResult.Result.get -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.IProblemDetailsWriter.CanWrite(Microsoft.AspNetCore.Http.ProblemDetailsContext! context) -> bool
+Microsoft.AspNetCore.Http.IProblemDetailsWriter.WriteAsync(Microsoft.AspNetCore.Http.ProblemDetailsContext! context) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Http.IStatusCodeHttpResult
+Microsoft.AspNetCore.Http.IStatusCodeHttpResult.StatusCode.get -> int?
+Microsoft.AspNetCore.Http.IValueHttpResult
+Microsoft.AspNetCore.Http.IValueHttpResult.Value.get -> object?
+Microsoft.AspNetCore.Http.IValueHttpResult<TValue>
+Microsoft.AspNetCore.Http.IValueHttpResult<TValue>.Value.get -> TValue?
Microsoft.AspNetCore.Http.Metadata.IFromFormMetadata
Microsoft.AspNetCore.Http.Metadata.IFromFormMetadata.Name.get -> string?
-Microsoft.AspNetCore.Http.RouteHandlerContext
-Microsoft.AspNetCore.Http.RouteHandlerContext.EndpointMetadata.get -> Microsoft.AspNetCore.Http.EndpointMetadataCollection!
-Microsoft.AspNetCore.Http.RouteHandlerContext.MethodInfo.get -> System.Reflection.MethodInfo!
-Microsoft.AspNetCore.Http.RouteHandlerContext.RouteHandlerContext(System.Reflection.MethodInfo! methodInfo, Microsoft.AspNetCore.Http.EndpointMetadataCollection! endpointMetadata) -> void
-Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate
-Microsoft.AspNetCore.Http.RouteHandlerInvocationContext
-Microsoft.AspNetCore.Http.RouteHandlerInvocationContext.HttpContext.get -> Microsoft.AspNetCore.Http.HttpContext!
-Microsoft.AspNetCore.Http.RouteHandlerInvocationContext.Parameters.get -> System.Collections.Generic.IList<object?>!
-Microsoft.AspNetCore.Http.RouteHandlerInvocationContext.RouteHandlerInvocationContext(Microsoft.AspNetCore.Http.HttpContext! httpContext, params object![]! parameters) -> void
+Microsoft.AspNetCore.Http.Metadata.IRequestSizeLimitMetadata
+Microsoft.AspNetCore.Http.Metadata.IRequestSizeLimitMetadata.MaxRequestBodySize.get -> long?
+Microsoft.AspNetCore.Http.ProblemDetailsContext
+Microsoft.AspNetCore.Http.ProblemDetailsContext.AdditionalMetadata.get -> Microsoft.AspNetCore.Http.EndpointMetadataCollection?
+Microsoft.AspNetCore.Http.ProblemDetailsContext.AdditionalMetadata.init -> void
+Microsoft.AspNetCore.Http.ProblemDetailsContext.HttpContext.get -> Microsoft.AspNetCore.Http.HttpContext!
+Microsoft.AspNetCore.Http.ProblemDetailsContext.HttpContext.init -> void
+Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetails.get -> Microsoft.AspNetCore.Mvc.ProblemDetails!
+Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetails.init -> void
+Microsoft.AspNetCore.Http.ProblemDetailsContext.ProblemDetailsContext() -> void
Microsoft.AspNetCore.Routing.RouteValueDictionary.RouteValueDictionary(Microsoft.AspNetCore.Routing.RouteValueDictionary? dictionary) -> void
Microsoft.AspNetCore.Routing.RouteValueDictionary.RouteValueDictionary(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string!, object?>>? values) -> void
Microsoft.AspNetCore.Routing.RouteValueDictionary.RouteValueDictionary(System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<string!, string?>>? values) -> void
abstract Microsoft.AspNetCore.Http.HttpResponse.ContentType.get -> string?
Microsoft.AspNetCore.Http.Metadata.ISkipStatusCodePagesMetadata
-Microsoft.AspNetCore.Http.IRouteHandlerFilter
Microsoft.AspNetCore.Http.Metadata.IEndpointDescriptionMetadata
Microsoft.AspNetCore.Http.Metadata.IEndpointDescriptionMetadata.Description.get -> string!
Microsoft.AspNetCore.Http.Metadata.IEndpointSummaryMetadata
Microsoft.AspNetCore.Http.Metadata.IEndpointSummaryMetadata.Summary.get -> string!
+Microsoft.AspNetCore.Mvc.ProblemDetails
+Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.get -> string?
+Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.set -> void
+Microsoft.AspNetCore.Mvc.ProblemDetails.Extensions.get -> System.Collections.Generic.IDictionary<string!, object?>!
+Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.get -> string?
+Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.set -> void
+Microsoft.AspNetCore.Mvc.ProblemDetails.ProblemDetails() -> void
+Microsoft.AspNetCore.Mvc.ProblemDetails.Status.get -> int?
+Microsoft.AspNetCore.Mvc.ProblemDetails.Status.set -> void
+Microsoft.AspNetCore.Mvc.ProblemDetails.Title.get -> string?
+Microsoft.AspNetCore.Mvc.ProblemDetails.Title.set -> void
+Microsoft.AspNetCore.Mvc.ProblemDetails.Type.get -> string?
+Microsoft.AspNetCore.Mvc.ProblemDetails.Type.set -> void
+override Microsoft.AspNetCore.Http.DefaultEndpointFilterInvocationContext.Arguments.get -> System.Collections.Generic.IList<object?>!
+override Microsoft.AspNetCore.Http.DefaultEndpointFilterInvocationContext.GetArgument<T>(int index) -> T
+override Microsoft.AspNetCore.Http.DefaultEndpointFilterInvocationContext.HttpContext.get -> Microsoft.AspNetCore.Http.HttpContext!
diff --git a/src/Http/Http.Abstractions/src/RequestDelegateResult.cs b/src/Http/Http.Abstractions/src/RequestDelegateResult.cs
index 55f033fb8c..cadfb30efe 100644
--- a/src/Http/Http.Abstractions/src/RequestDelegateResult.cs
+++ b/src/Http/Http.Abstractions/src/RequestDelegateResult.cs
@@ -23,7 +23,8 @@ public sealed class RequestDelegateResult
public RequestDelegate RequestDelegate { get; }
/// <summary>
- /// Gets endpoint metadata inferred from creating the <see cref="RequestDelegate" />
+ /// Gets endpoint metadata inferred from creating the <see cref="RequestDelegate" />. If a non-null
+ /// RequestDelegateFactoryOptions.EndpointMetadata list was passed in, this will be the same instance.
/// </summary>
public IReadOnlyList<object> EndpointMetadata { get; }
}
diff --git a/src/Http/Http.Abstractions/src/RouteHandlerContext.cs b/src/Http/Http.Abstractions/src/RouteHandlerContext.cs
deleted file mode 100644
index fdf54a3b9b..0000000000
--- a/src/Http/Http.Abstractions/src/RouteHandlerContext.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Reflection;
-
-namespace Microsoft.AspNetCore.Http;
-
-/// <summary>
-/// Represents the information accessible via the route handler filter
-/// API when the user is constructing a new route handler.
-/// </summary>
-public sealed class RouteHandlerContext
-{
- /// <summary>
- /// Creates a new instance of the <see cref="RouteHandlerContext"/>.
- /// </summary>
- /// <param name="methodInfo">The <see cref="MethodInfo"/> associated with the route handler of the current request.</param>
- /// <param name="endpointMetadata">The <see cref="EndpointMetadataCollection"/> associated with the endpoint the filter is targeting.</param>
- public RouteHandlerContext(MethodInfo methodInfo, EndpointMetadataCollection endpointMetadata)
- {
- MethodInfo = methodInfo;
- EndpointMetadata = endpointMetadata;
- }
-
- /// <summary>
- /// The <see cref="MethodInfo"/> associated with the current route handler.
- /// </summary>
- public MethodInfo MethodInfo { get; }
-
- /// <summary>
- /// The <see cref="EndpointMetadataCollection"/> associated with the current endpoint.
- /// </summary>
- public EndpointMetadataCollection EndpointMetadata { get; }
-}
diff --git a/src/Http/Http.Abstractions/src/RouteHandlerInvocationContext.cs b/src/Http/Http.Abstractions/src/RouteHandlerInvocationContext.cs
deleted file mode 100644
index d7cfe600a7..0000000000
--- a/src/Http/Http.Abstractions/src/RouteHandlerInvocationContext.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Http;
-
-/// <summary>
-/// Provides an abstraction for wrapping the <see cref="HttpContext"/> and parameters
-/// provided to a route handler.
-/// </summary>
-public sealed class RouteHandlerInvocationContext
-{
- /// <summary>
- /// Creates a new instance of the <see cref="RouteHandlerInvocationContext"/> for a given request.
- /// </summary>
- /// <param name="httpContext">The <see cref="HttpContext"/> associated with the current request.</param>
- /// <param name="parameters">A list of parameters provided in the current request.</param>
- public RouteHandlerInvocationContext(HttpContext httpContext, params object[] parameters)
- {
- HttpContext = httpContext;
- Parameters = parameters;
- }
-
- /// <summary>
- /// The <see cref="HttpContext"/> associated with the current request being processed by the filter.
- /// </summary>
- public HttpContext HttpContext { get; }
-
- /// <summary>
- /// A list of parameters provided in the current request to the filter.
- /// <remarks>
- /// This list is not read-only to permit modifying of existing parameters by filters.
- /// </remarks>
- /// </summary>
- public IList<object?> Parameters { get; }
-}
diff --git a/src/Http/Http.Abstractions/src/Routing/EndpointHttpContextExtensions.cs b/src/Http/Http.Abstractions/src/Routing/EndpointHttpContextExtensions.cs
index debfb8342b..8af9ed0b0e 100644
--- a/src/Http/Http.Abstractions/src/Routing/EndpointHttpContextExtensions.cs
+++ b/src/Http/Http.Abstractions/src/Routing/EndpointHttpContextExtensions.cs
@@ -61,7 +61,7 @@ public static class EndpointHttpContextExtensions
}
}
- private class EndpointFeature : IEndpointFeature
+ private sealed class EndpointFeature : IEndpointFeature
{
public Endpoint? Endpoint { get; set; }
}
diff --git a/src/Http/Http.Abstractions/src/Routing/EndpointMetadataCollection.cs b/src/Http/Http.Abstractions/src/Routing/EndpointMetadataCollection.cs
index f057c79b4f..5e3dc1b77d 100644
--- a/src/Http/Http.Abstractions/src/Routing/EndpointMetadataCollection.cs
+++ b/src/Http/Http.Abstractions/src/Routing/EndpointMetadataCollection.cs
@@ -162,25 +162,26 @@ public sealed class EndpointMetadataCollection : IReadOnlyList<object>
/// <summary>
/// Enumerates the elements of an <see cref="EndpointMetadataCollection"/>.
/// </summary>
- public struct Enumerator : IEnumerator<object?>
+ public struct Enumerator : IEnumerator<object>
{
#pragma warning disable IDE0044
// Intentionally not readonly to prevent defensive struct copies
private object[] _items;
#pragma warning restore IDE0044
private int _index;
+ private object? _current;
internal Enumerator(EndpointMetadataCollection collection)
{
_items = collection._items;
_index = 0;
- Current = null;
+ _current = null;
}
/// <summary>
/// Gets the element at the current position of the enumerator
/// </summary>
- public object? Current { get; private set; }
+ public object Current => _current!;
/// <summary>
/// Releases all resources used by the <see cref="Enumerator"/>.
@@ -200,11 +201,11 @@ public sealed class EndpointMetadataCollection : IReadOnlyList<object>
{
if (_index < _items.Length)
{
- Current = _items[_index++];
+ _current = _items[_index++];
return true;
}
- Current = null;
+ _current = null;
return false;
}
@@ -214,7 +215,7 @@ public sealed class EndpointMetadataCollection : IReadOnlyList<object>
public void Reset()
{
_index = 0;
- Current = null;
+ _current = null;
}
}
}
diff --git a/src/Http/Http.Abstractions/test/CookieBuilderTests.cs b/src/Http/Http.Abstractions/test/CookieBuilderTests.cs
index 536830e71e..ce171a6ec5 100644
--- a/src/Http/Http.Abstractions/test/CookieBuilderTests.cs
+++ b/src/Http/Http.Abstractions/test/CookieBuilderTests.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Http.Abstractions.Tests;
@@ -50,4 +50,26 @@ public class CookieBuilderTests
{
Assert.Equal(new CookieOptions().Path, new CookieBuilder().Build(new DefaultHttpContext()).Path);
}
+
+ [Fact]
+ public void CookieBuilder_Extensions_Added()
+ {
+ var builder = new CookieBuilder();
+ builder.Extensions.Add("simple");
+ builder.Extensions.Add("key=value");
+
+ var options = builder.Build(new DefaultHttpContext());
+ Assert.Equal(2, options.Extensions.Count);
+ Assert.Contains("simple", options.Extensions);
+ Assert.Contains("key=value", options.Extensions);
+
+ var cookie = options.CreateCookieHeader("name", "value");
+ Assert.Equal("name", cookie.Name);
+ Assert.Equal("value", cookie.Value);
+ Assert.Equal(2, cookie.Extensions.Count);
+ Assert.Contains("simple", cookie.Extensions);
+ Assert.Contains("key=value", cookie.Extensions);
+
+ Assert.Equal("name=value; path=/; simple; key=value", cookie.ToString());
+ }
}
diff --git a/src/Http/Http.Abstractions/test/EndpointFilterInvocationContextOfTTests.cs b/src/Http/Http.Abstractions/test/EndpointFilterInvocationContextOfTTests.cs
new file mode 100644
index 0000000000..592a8cc0fc
--- /dev/null
+++ b/src/Http/Http.Abstractions/test/EndpointFilterInvocationContextOfTTests.cs
@@ -0,0 +1,89 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+using Mono.TextTemplating;
+
+namespace Microsoft.AspNetCore.Http.Abstractions.Tests;
+
+public class EndpointFilterInvocationContextOfTTests
+{
+ [Fact]
+ public void ProhibitsActionsThatModifyListSize()
+ {
+ var context = new EndpointFilterInvocationContext<string, int, bool>(new DefaultHttpContext(), "This is a test", 42, false);
+ Assert.Throws<NotSupportedException>(() => context.Add("string"));
+ Assert.Throws<NotSupportedException>(() => context.Insert(0, "string"));
+ Assert.Throws<NotSupportedException>(() => context.RemoveAt(0));
+ Assert.Throws<NotSupportedException>(() => context.Remove("string"));
+ Assert.Throws<NotSupportedException>(() => context.Clear());
+ }
+
+ [Fact]
+ public void ThrowsExceptionForInvalidCastOnGetArgument()
+ {
+ var context = new EndpointFilterInvocationContext<string, int, bool, Todo>(new DefaultHttpContext(), "This is a test", 42, false, new Todo());
+ Assert.Throws<InvalidCastException>(() => context.GetArgument<string>(1));
+ Assert.Throws<InvalidCastException>(() => context.GetArgument<int>(0));
+ Assert.Throws<InvalidCastException>(() => context.GetArgument<string>(3));
+ var todo = context.GetArgument<ITodo>(3);
+ Assert.IsType<Todo>(todo);
+ }
+
+ [Fact]
+ public void SetterAllowsInPlaceModificationOfParameters()
+ {
+ var context = new EndpointFilterInvocationContext<string, int, bool, Todo>(new DefaultHttpContext(), "This is a test", 42, false, new Todo());
+ context[0] = "Foo";
+ Assert.Equal("Foo", context.GetArgument<string>(0));
+ }
+
+ [Fact]
+ public void SetterDoesNotAllowModificationOfParameterType()
+ {
+ var context = new EndpointFilterInvocationContext<string, int, bool, Todo>(new DefaultHttpContext(), "This is a test", 42, false, new Todo());
+ Assert.Throws<InvalidCastException>(() => context[0] = 4);
+ }
+
+ [Fact]
+ public void AllowsEnumerationOfParameters()
+ {
+ var context = new EndpointFilterInvocationContext<string, int, bool, Todo>(new DefaultHttpContext(), "This is a test", 42, false, new Todo());
+ var enumeratedCount = 0;
+ foreach (var parameter in context)
+ {
+ Assert.NotNull(parameter);
+ enumeratedCount++;
+ }
+ Assert.Equal(4, enumeratedCount);
+ }
+
+ // Test for https://github.com/dotnet/aspnetcore/issues/41489
+ [Fact]
+ public void HandlesMismatchedNullabilityOnTypeParams()
+ {
+ var context = new EndpointFilterInvocationContext<string?, int?, bool?, Todo?>(new DefaultHttpContext(), null, null, null, null);
+ // Mismatched reference types will resolve as null
+ Assert.Null(context.GetArgument<string>(0));
+ Assert.Null(context.GetArgument<Todo>(3));
+ // Mismatched value types will throw
+ Assert.Throws<NullReferenceException>(() => context.GetArgument<int>(1));
+ Assert.Throws<NullReferenceException>(() => context.GetArgument<bool>(2));
+ }
+
+ [Fact]
+ public void GeneratedCodeIsUpToDate()
+ {
+ var currentContentPath = Path.Combine(AppContext.BaseDirectory, "Shared", "GeneratedContent", "EndpointFilterInvocationContextOfT.Generated.cs");
+ var templatePath = Path.Combine(AppContext.BaseDirectory, "Shared", "GeneratedContent", "EndpointFilterInvocationContextOfT.Generated.tt");
+
+ var generator = new TemplateGenerator();
+ var compiledTemplate = generator.CompileTemplate(File.ReadAllText(templatePath));
+
+ var generatedContent = compiledTemplate.Process();
+ var currentContent = File.ReadAllText(currentContentPath);
+
+ Assert.Equal(currentContent, generatedContent);
+ }
+
+ interface ITodo { }
+ class Todo : ITodo { }
+}
diff --git a/src/Http/Http.Extensions/test/HttpValidationProblemDetailsJsonConverterTest.cs b/src/Http/Http.Abstractions/test/HttpValidationProblemDetailsJsonConverterTest.cs
index ea8073ce68..ab4408dd75 100644
--- a/src/Http/Http.Extensions/test/HttpValidationProblemDetailsJsonConverterTest.cs
+++ b/src/Http/Http.Abstractions/test/HttpValidationProblemDetailsJsonConverterTest.cs
@@ -5,7 +5,7 @@ using System.Text;
using System.Text.Json;
using Microsoft.AspNetCore.Http.Json;
-namespace Microsoft.AspNetCore.Http.Extensions;
+namespace Microsoft.AspNetCore.Http.Abstractions.Tests;
public class HttpValidationProblemDetailsJsonConverterTest
{
@@ -40,7 +40,7 @@ public class HttpValidationProblemDetailsJsonConverterTest
kvp =>
{
Assert.Equal("traceId", kvp.Key);
- Assert.Equal(traceId, kvp.Value.ToString());
+ Assert.Equal(traceId, kvp.Value?.ToString());
});
Assert.Collection(
problemDetails.Errors.OrderBy(kvp => kvp.Key),
@@ -81,7 +81,7 @@ public class HttpValidationProblemDetailsJsonConverterTest
kvp =>
{
Assert.Equal("traceId", kvp.Key);
- Assert.Equal(traceId, kvp.Value.ToString());
+ Assert.Equal(traceId, kvp.Value?.ToString());
});
Assert.Collection(
problemDetails.Errors.OrderBy(kvp => kvp.Key),
@@ -111,7 +111,8 @@ public class HttpValidationProblemDetailsJsonConverterTest
// Act
var problemDetails = JsonSerializer.Deserialize<HttpValidationProblemDetails>(json, JsonSerializerOptions);
- Assert.Equal(type, problemDetails.Type);
+ Assert.NotNull(problemDetails);
+ Assert.Equal(type, problemDetails!.Type);
Assert.Equal(title, problemDetails.Title);
Assert.Equal(status, problemDetails.Status);
Assert.Collection(
@@ -119,7 +120,7 @@ public class HttpValidationProblemDetailsJsonConverterTest
kvp =>
{
Assert.Equal("traceId", kvp.Key);
- Assert.Equal(traceId, kvp.Value.ToString());
+ Assert.Equal(traceId, kvp.Value?.ToString());
});
Assert.Collection(
problemDetails.Errors.OrderBy(kvp => kvp.Key),
diff --git a/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj b/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj
index b4bbecb268..36c3a0c54c 100644
--- a/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj
+++ b/src/Http/Http.Abstractions/test/Microsoft.AspNetCore.Http.Abstractions.Tests.csproj
@@ -10,8 +10,17 @@
</ItemGroup>
<ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.AspNetCore.Http" />
<Reference Include="Microsoft.AspNetCore.Routing" />
+ <Reference Include="Microsoft.AspNetCore.TestHost" />
+ <Reference Include="Mono.TextTemplating" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Content Include="$(MSBuildThisFileDirectory)\..\src\EndpointFilterInvocationContextOfT.Generated.tt" LinkBase="Shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
+ <Content Include="$(MSBuildThisFileDirectory)\..\src\EndpointFilterInvocationContextOfT.Generated.cs" LinkBase="Shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
+ <Compile Update="EndpointFilterInvocationContextOfT.Generated.cs" Link="Shared\GeneratedContent\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
</Project>
diff --git a/src/Http/Http.Extensions/test/ProblemDetailsJsonConverterTest.cs b/src/Http/Http.Abstractions/test/ProblemDetailsJsonConverterTest.cs
index 6250ea43d7..995655ba29 100644
--- a/src/Http/Http.Extensions/test/ProblemDetailsJsonConverterTest.cs
+++ b/src/Http/Http.Abstractions/test/ProblemDetailsJsonConverterTest.cs
@@ -6,7 +6,7 @@ using System.Text.Json;
using Microsoft.AspNetCore.Http.Json;
using Microsoft.AspNetCore.Mvc;
-namespace Microsoft.AspNetCore.Http.Extensions;
+namespace Microsoft.AspNetCore.Http.Abstractions.Tests;
public class ProblemDetailsJsonConverterTest
{
@@ -46,6 +46,7 @@ public class ProblemDetailsJsonConverterTest
// Act
var problemDetails = converter.Read(ref reader, typeof(ProblemDetails), JsonSerializerOptions);
+ //Assert
Assert.Equal(type, problemDetails.Type);
Assert.Equal(title, problemDetails.Title);
Assert.Equal(status, problemDetails.Status);
@@ -56,7 +57,7 @@ public class ProblemDetailsJsonConverterTest
kvp =>
{
Assert.Equal("traceId", kvp.Key);
- Assert.Equal(traceId, kvp.Value.ToString());
+ Assert.Equal(traceId, kvp.Value?.ToString());
});
}
@@ -75,7 +76,9 @@ public class ProblemDetailsJsonConverterTest
// Act
var problemDetails = JsonSerializer.Deserialize<ProblemDetails>(json, JsonSerializerOptions);
- Assert.Equal(type, problemDetails.Type);
+ // Assert
+ Assert.NotNull(problemDetails);
+ Assert.Equal(type, problemDetails!.Type);
Assert.Equal(title, problemDetails.Title);
Assert.Equal(status, problemDetails.Status);
Assert.Equal(instance, problemDetails.Instance);
@@ -85,7 +88,7 @@ public class ProblemDetailsJsonConverterTest
kvp =>
{
Assert.Equal("traceId", kvp.Key);
- Assert.Equal(traceId, kvp.Value.ToString());
+ Assert.Equal(traceId, kvp.Value?.ToString());
});
}
@@ -105,6 +108,7 @@ public class ProblemDetailsJsonConverterTest
// Act
var problemDetails = converter.Read(ref reader, typeof(ProblemDetails), JsonSerializerOptions);
+ // Assert
Assert.Equal(type, problemDetails.Type);
Assert.Equal(title, problemDetails.Title);
Assert.Equal(status, problemDetails.Status);
@@ -113,7 +117,7 @@ public class ProblemDetailsJsonConverterTest
kvp =>
{
Assert.Equal("traceId", kvp.Key);
- Assert.Equal(traceId, kvp.Value.ToString());
+ Assert.Equal(traceId, kvp.Value?.ToString());
});
}
diff --git a/src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs b/src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs
index c01b6a7356..448dfdf230 100644
--- a/src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs
+++ b/src/Http/Http.Abstractions/test/UsePathBaseExtensionsTests.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.TestHost;
namespace Microsoft.AspNetCore.Builder.Extensions;
@@ -138,6 +139,73 @@ public class UsePathBaseExtensionsTests
return TestPathBase(registeredPathBase, pathBase, requestPath, expectedPathBase, expectedPath);
}
+ [Fact]
+ public async Task PathBaseWorksAfterUseRoutingIfGlobalRouteBuilderUsed()
+ {
+ var builder = WebApplication.CreateBuilder();
+ builder.WebHost.UseTestServer();
+ await using var app = builder.Build();
+
+ app.UseRouting();
+
+ app.UsePathBase("/base");
+
+ app.UseEndpoints(endpoints =>
+ {
+ endpoints.Map("/path", context => context.Response.WriteAsync("Response"));
+ });
+
+ await app.StartAsync();
+
+ using var server = app.GetTestServer();
+
+ var response = await server.CreateClient().GetStringAsync("/base/path");
+
+ Assert.Equal("Response", response);
+ }
+
+ [Fact]
+ public async Task PathBaseWorksBeforeUseRoutingIfGlobalRouteBuilderUsed()
+ {
+ var builder = WebApplication.CreateBuilder();
+ builder.WebHost.UseTestServer();
+ await using var app = builder.Build();
+
+ app.UsePathBase("/base");
+
+ app.UseRouting();
+
+ app.MapGet("/path", context => context.Response.WriteAsync("Response"));
+
+ await app.StartAsync();
+
+ using var server = app.GetTestServer();
+
+ var response = await server.CreateClient().GetStringAsync("/base/path");
+
+ Assert.Equal("Response", response);
+ }
+
+ [Fact]
+ public async Task PathBaseWorksWithoutUseRoutingWithWebApplication()
+ {
+ var builder = WebApplication.CreateBuilder();
+ builder.WebHost.UseTestServer();
+ await using var app = builder.Build();
+
+ app.UsePathBase("/base");
+
+ app.MapGet("/path", context => context.Response.WriteAsync("Response"));
+
+ await app.StartAsync();
+
+ using var server = app.GetTestServer();
+
+ var response = await server.CreateClient().GetStringAsync("/base/path");
+
+ Assert.Equal("Response", response);
+ }
+
private static async Task TestPathBase(string registeredPathBase, string pathBase, string requestPath, string expectedPathBase, string expectedPath)
{
HttpContext requestContext = CreateRequest(pathBase, requestPath);
diff --git a/src/Http/Http.Extensions/src/DefaultProblemDetailsWriter.cs b/src/Http/Http.Extensions/src/DefaultProblemDetailsWriter.cs
new file mode 100644
index 0000000000..8949dc7d81
--- /dev/null
+++ b/src/Http/Http.Extensions/src/DefaultProblemDetailsWriter.cs
@@ -0,0 +1,72 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Text.Json.Serialization;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.Http;
+
+internal sealed partial class DefaultProblemDetailsWriter : IProblemDetailsWriter
+{
+ private static readonly MediaTypeHeaderValue _jsonMediaType = new("application/json");
+ private static readonly MediaTypeHeaderValue _problemDetailsJsonMediaType = new("application/problem+json");
+ private readonly ProblemDetailsOptions _options;
+
+ public DefaultProblemDetailsWriter(IOptions<ProblemDetailsOptions> options)
+ {
+ _options = options.Value;
+ }
+
+ public bool CanWrite(ProblemDetailsContext context)
+ {
+ var httpContext = context.HttpContext;
+ var acceptHeader = httpContext.Request.Headers.Accept.GetList<MediaTypeHeaderValue>();
+
+ if (acceptHeader is { Count: > 0 })
+ {
+ for (var i = 0; i < acceptHeader.Count; i++)
+ {
+ var acceptHeaderValue = acceptHeader[i];
+
+ if (_jsonMediaType.IsSubsetOf(acceptHeaderValue) ||
+ _problemDetailsJsonMediaType.IsSubsetOf(acceptHeaderValue))
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ [UnconditionalSuppressMessage("Trimming", "IL2026",
+ Justification = "JSON serialization of ProblemDetails.Extensions might require types that cannot be statically analyzed and we need to fallback" +
+ "to reflection-based. The ProblemDetailsConverter is marked as RequiresUnreferencedCode already.")]
+ public ValueTask WriteAsync(ProblemDetailsContext context)
+ {
+ var httpContext = context.HttpContext;
+ ProblemDetailsDefaults.Apply(context.ProblemDetails, httpContext.Response.StatusCode);
+ _options.CustomizeProblemDetails?.Invoke(context);
+
+ if (context.ProblemDetails.Extensions is { Count: 0 })
+ {
+ // We can use the source generation in this case
+ return new ValueTask(httpContext.Response.WriteAsJsonAsync(
+ context.ProblemDetails,
+ ProblemDetailsJsonContext.Default.ProblemDetails,
+ contentType: "application/problem+json"));
+ }
+
+ return new ValueTask(httpContext.Response.WriteAsJsonAsync(
+ context.ProblemDetails,
+ options: null,
+ contentType: "application/problem+json"));
+ }
+
+ [JsonSerializable(typeof(ProblemDetails))]
+ internal sealed partial class ProblemDetailsJsonContext : JsonSerializerContext
+ { }
+}
diff --git a/src/Http/Http.Extensions/src/EndpointMetadataContext.cs b/src/Http/Http.Extensions/src/EndpointMetadataContext.cs
index 7f8d2c20b6..caf9645568 100644
--- a/src/Http/Http.Extensions/src/EndpointMetadataContext.cs
+++ b/src/Http/Http.Extensions/src/EndpointMetadataContext.cs
@@ -15,15 +15,16 @@ public sealed class EndpointMetadataContext
/// </summary>
/// <param name="method">The <see cref="MethodInfo"/> of the route handler delegate of the endpoint being created.</param>
/// <param name="endpointMetadata">The list of objects that will be added to the metadata of the endpoint.</param>
- /// <param name="services">The <see cref="IServiceProvider"/> instance used to access application services.</param>
- public EndpointMetadataContext(MethodInfo method, IList<object> endpointMetadata, IServiceProvider? services)
+ /// <param name="applicationServices">The <see cref="IServiceProvider"/> instance used to access application services.</param>
+ public EndpointMetadataContext(MethodInfo method, IList<object> endpointMetadata, IServiceProvider applicationServices)
{
- ArgumentNullException.ThrowIfNull(method, nameof(method));
- ArgumentNullException.ThrowIfNull(endpointMetadata, nameof(endpointMetadata));
+ ArgumentNullException.ThrowIfNull(method);
+ ArgumentNullException.ThrowIfNull(endpointMetadata);
+ ArgumentNullException.ThrowIfNull(applicationServices);
Method = method;
EndpointMetadata = endpointMetadata;
- Services = services;
+ ApplicationServices = applicationServices;
}
/// <summary>
@@ -39,5 +40,5 @@ public sealed class EndpointMetadataContext
/// <summary>
/// Gets the <see cref="IServiceProvider"/> instance used to access application services.
/// </summary>
- public IServiceProvider? Services { get; }
+ public IServiceProvider ApplicationServices { get; }
}
diff --git a/src/Http/Http.Extensions/src/EndpointParameterMetadataContext.cs b/src/Http/Http.Extensions/src/EndpointParameterMetadataContext.cs
index e307ae2d14..202839cc80 100644
--- a/src/Http/Http.Extensions/src/EndpointParameterMetadataContext.cs
+++ b/src/Http/Http.Extensions/src/EndpointParameterMetadataContext.cs
@@ -15,15 +15,16 @@ public sealed class EndpointParameterMetadataContext
/// </summary>
/// <param name="parameter">The parameter of the route handler delegate of the endpoint being created.</param>
/// <param name="endpointMetadata">The list of objects that will be added to the metadata of the endpoint.</param>
- /// <param name="services">The <see cref="IServiceProvider"/> instance used to access application services.</param>
- public EndpointParameterMetadataContext(ParameterInfo parameter, IList<object> endpointMetadata, IServiceProvider? services)
+ /// <param name="applicationServices">The <see cref="IServiceProvider"/> instance used to access application services.</param>
+ public EndpointParameterMetadataContext(ParameterInfo parameter, IList<object> endpointMetadata, IServiceProvider applicationServices)
{
- ArgumentNullException.ThrowIfNull(parameter, nameof(parameter));
- ArgumentNullException.ThrowIfNull(endpointMetadata, nameof(endpointMetadata));
+ ArgumentNullException.ThrowIfNull(parameter);
+ ArgumentNullException.ThrowIfNull(endpointMetadata);
+ ArgumentNullException.ThrowIfNull(applicationServices);
Parameter = parameter;
EndpointMetadata = endpointMetadata;
- Services = services;
+ ApplicationServices = applicationServices;
}
/// <summary>
@@ -39,5 +40,5 @@ public sealed class EndpointParameterMetadataContext
/// <summary>
/// Gets the <see cref="IServiceProvider"/> instance used to access application services.
/// </summary>
- public IServiceProvider? Services { get; }
+ public IServiceProvider ApplicationServices { get; }
}
diff --git a/src/Http/Http.Extensions/src/HttpJsonServiceExtensions.cs b/src/Http/Http.Extensions/src/HttpJsonServiceExtensions.cs
index 75ceafdb0a..6a099c8307 100644
--- a/src/Http/Http.Extensions/src/HttpJsonServiceExtensions.cs
+++ b/src/Http/Http.Extensions/src/HttpJsonServiceExtensions.cs
@@ -8,21 +8,18 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Extension methods to configure JSON serialization behavior.
/// </summary>
-public static class RouteHandlerJsonServiceExtensions
+public static class HttpJsonServiceExtensions
{
/// <summary>
- /// Configures options used for reading and writing JSON by route handlers.
- /// </summary>
- /// <remarks>
- /// The options configured here will only affect JSON returned and processed
- /// from route handlers, not controllers, when using <see cref="O:Microsoft.AspNetCore.Http.HttpRequestJsonExtensions.ReadFromJsonAsync" />
+ /// Configures options used for reading and writing JSON when using
+ /// <see cref="O:Microsoft.AspNetCore.Http.HttpRequestJsonExtensions.ReadFromJsonAsync" />
/// and <see cref="O:Microsoft.AspNetCore.Http.HttpResponseJsonExtensions.WriteAsJsonAsync" />.
- /// </remarks>
+ /// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to configure options on.</param>
/// <param name="configureOptions">The <see cref="Action{JsonOptions}"/> to configure the
/// <see cref="JsonOptions"/>.</param>
/// <returns>The modified <see cref="IServiceCollection"/>.</returns>
- public static IServiceCollection ConfigureRouteHandlerJsonOptions(this IServiceCollection services, Action<JsonOptions> configureOptions)
+ public static IServiceCollection ConfigureHttpJsonOptions(this IServiceCollection services, Action<JsonOptions> configureOptions)
{
services.Configure<JsonOptions>(configureOptions);
return services;
diff --git a/src/Http/Http.Extensions/src/HttpResponseJsonExtensions.cs b/src/Http/Http.Extensions/src/HttpResponseJsonExtensions.cs
index cba3ae0acf..300b836a7d 100644
--- a/src/Http/Http.Extensions/src/HttpResponseJsonExtensions.cs
+++ b/src/Http/Http.Extensions/src/HttpResponseJsonExtensions.cs
@@ -105,7 +105,6 @@ public static partial class HttpResponseJsonExtensions
/// <param name="contentType">The content-type to set on the response.</param>
/// <param name="cancellationToken">A <see cref="CancellationToken"/> used to cancel the operation.</param>
/// <returns>The task object representing the asynchronous operation.</returns>
- [RequiresUnreferencedCode(RequiresUnreferencedCodeMessage)]
#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
public static Task WriteAsJsonAsync<TValue>(
#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
diff --git a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj
index 718f747582..ed2fbb631a 100644
--- a/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj
+++ b/src/Http/Http.Extensions/src/Microsoft.AspNetCore.Http.Extensions.csproj
@@ -1,9 +1,10 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>ASP.NET Core common extension methods for HTTP abstractions, HTTP headers, HTTP request/response, and session state.</Description>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<IsAspNetCoreApp>true</IsAspNetCoreApp>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>false</IsPackable>
@@ -13,11 +14,12 @@
<ItemGroup>
<Compile Include="$(SharedSourceRoot)ObjectMethodExecutor\**\*.cs" LinkBase="Shared"/>
<Compile Include="$(SharedSourceRoot)ParameterBindingMethodCache.cs" LinkBase="Shared"/>
+ <Compile Include="$(SharedSourceRoot)PropertyAsParameterInfo.cs" LinkBase="Shared"/>
<Compile Include="..\..\Shared\StreamCopyOperationInternal.cs" LinkBase="Shared" />
- <Compile Include="$(SharedSourceRoot)ProblemDetailsJsonConverter.cs" LinkBase="Shared"/>
- <Compile Include="$(SharedSourceRoot)HttpValidationProblemDetailsJsonConverter.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)RoutingMetadata\AcceptsMetadata.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)TypeNameHelper\TypeNameHelper.cs" LinkBase="Shared"/>
+ <Compile Include="$(SharedSourceRoot)ProblemDetails\ProblemDetailsDefaults.cs" LinkBase="Shared" />
+ <Compile Include="$(SharedSourceRoot)ValueStringBuilder\**\*.cs" LingBase="Shared"/>
</ItemGroup>
<ItemGroup>
diff --git a/src/Http/Http.Extensions/src/ProblemDetailsOptions.cs b/src/Http/Http.Extensions/src/ProblemDetailsOptions.cs
new file mode 100644
index 0000000000..13fd59d82d
--- /dev/null
+++ b/src/Http/Http.Extensions/src/ProblemDetailsOptions.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Options for controlling the behavior of <see cref="IProblemDetailsService.WriteAsync(ProblemDetailsContext)"/>
+/// and similar methods.
+/// </summary>
+public class ProblemDetailsOptions
+{
+ /// <summary>
+ /// The operation that customizes the current <see cref="Mvc.ProblemDetails"/> instance.
+ /// </summary>
+ public Action<ProblemDetailsContext>? CustomizeProblemDetails { get; set; }
+}
diff --git a/src/Http/Http.Extensions/src/ProblemDetailsService.cs b/src/Http/Http.Extensions/src/ProblemDetailsService.cs
new file mode 100644
index 0000000000..68002af77b
--- /dev/null
+++ b/src/Http/Http.Extensions/src/ProblemDetailsService.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http;
+
+using System.Linq;
+
+internal sealed class ProblemDetailsService : IProblemDetailsService
+{
+ private readonly IProblemDetailsWriter[] _writers;
+
+ public ProblemDetailsService(
+ IEnumerable<IProblemDetailsWriter> writers)
+ {
+ _writers = writers.ToArray();
+ }
+
+ public ValueTask WriteAsync(ProblemDetailsContext context)
+ {
+ ArgumentNullException.ThrowIfNull(context);
+ ArgumentNullException.ThrowIfNull(context.ProblemDetails);
+ ArgumentNullException.ThrowIfNull(context.HttpContext);
+
+ if (context.HttpContext.Response.HasStarted ||
+ context.HttpContext.Response.StatusCode < 400 ||
+ _writers.Length == 0)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ IProblemDetailsWriter? selectedWriter = null;
+
+ if (_writers.Length == 1)
+ {
+ selectedWriter = _writers[0];
+
+ return selectedWriter.CanWrite(context) ?
+ selectedWriter.WriteAsync(context) :
+ ValueTask.CompletedTask;
+ }
+
+ for (var i = 0; i < _writers.Length; i++)
+ {
+ if (_writers[i].CanWrite(context))
+ {
+ selectedWriter = _writers[i];
+ break;
+ }
+ }
+
+ if (selectedWriter != null)
+ {
+ return selectedWriter.WriteAsync(context);
+ }
+
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Http/Http.Extensions/src/ProblemDetailsServiceCollectionExtensions.cs b/src/Http/Http.Extensions/src/ProblemDetailsServiceCollectionExtensions.cs
new file mode 100644
index 0000000000..c8508a3fa6
--- /dev/null
+++ b/src/Http/Http.Extensions/src/ProblemDetailsServiceCollectionExtensions.cs
@@ -0,0 +1,49 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+/// <summary>
+/// Contains extension methods to <see cref="IServiceCollection"/>.
+/// </summary>
+public static class ProblemDetailsServiceCollectionExtensions
+{
+ /// <summary>
+ /// Adds services required for creation of <see cref="ProblemDetails"/> for failed requests.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
+ /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
+ public static IServiceCollection AddProblemDetails(this IServiceCollection services)
+ {
+ ArgumentNullException.ThrowIfNull(services);
+ return services.AddProblemDetails(configure: null);
+ }
+
+ /// <summary>
+ /// Adds services required for creation of <see cref="ProblemDetails"/> for failed requests.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> to add the services to.</param>
+ /// <param name="configure">The <see cref="ProblemDetailsOptions"/> to configure the services with.</param>
+ /// <returns>The <see cref="IServiceCollection"/> so that additional calls can be chained.</returns>
+ public static IServiceCollection AddProblemDetails(
+ this IServiceCollection services,
+ Action<ProblemDetailsOptions>? configure)
+ {
+ ArgumentNullException.ThrowIfNull(services);
+
+ // Adding default services;
+ services.TryAddSingleton<IProblemDetailsService, ProblemDetailsService>();
+ services.TryAddEnumerable(ServiceDescriptor.Singleton<IProblemDetailsWriter, DefaultProblemDetailsWriter>());
+
+ if (configure != null)
+ {
+ services.Configure(configure);
+ }
+
+ return services;
+ }
+}
diff --git a/src/Http/Http.Extensions/src/Properties/AssemblyInfo.cs b/src/Http/Http.Extensions/src/Properties/AssemblyInfo.cs
index f7cd6ab89f..2122b7773a 100644
--- a/src/Http/Http.Extensions/src/Properties/AssemblyInfo.cs
+++ b/src/Http/Http.Extensions/src/Properties/AssemblyInfo.cs
@@ -3,4 +3,7 @@
using System.Runtime.CompilerServices;
+[assembly: TypeForwardedTo(typeof(Microsoft.AspNetCore.Mvc.ProblemDetails))]
+[assembly: TypeForwardedTo(typeof(Microsoft.AspNetCore.Http.HttpValidationProblemDetails))]
+
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Extensions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Http/Http.Extensions/src/PublicAPI.Unshipped.txt b/src/Http/Http.Extensions/src/PublicAPI.Unshipped.txt
index 93e10e87b5..4b8eccfa6a 100644
--- a/src/Http/Http.Extensions/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Http.Extensions/src/PublicAPI.Unshipped.txt
@@ -1,28 +1,69 @@
#nullable enable
+*REMOVED*Microsoft.AspNetCore.Http.HttpValidationProblemDetails
+*REMOVED*Microsoft.AspNetCore.Http.HttpValidationProblemDetails.Errors.get -> System.Collections.Generic.IDictionary<string!, string![]!>!
+*REMOVED*Microsoft.AspNetCore.Http.HttpValidationProblemDetails.HttpValidationProblemDetails() -> void
+*REMOVED*Microsoft.AspNetCore.Http.HttpValidationProblemDetails.HttpValidationProblemDetails(System.Collections.Generic.IDictionary<string!, string![]!>! errors) -> void
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails.Errors.get -> System.Collections.Generic.IDictionary<string!, string![]!>! (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails.HttpValidationProblemDetails() -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Http.HttpValidationProblemDetails.HttpValidationProblemDetails(System.Collections.Generic.IDictionary<string!, string![]!>! errors) -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext
-Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext.EndpointMetadataContext(System.Reflection.MethodInfo! method, System.Collections.Generic.IList<object!>! endpointMetadata, System.IServiceProvider? services) -> void
+Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext.EndpointMetadataContext(System.Reflection.MethodInfo! method, System.Collections.Generic.IList<object!>! endpointMetadata, System.IServiceProvider! applicationServices) -> void
Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext.EndpointMetadata.get -> System.Collections.Generic.IList<object!>!
Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext.Method.get -> System.Reflection.MethodInfo!
-Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext.Services.get -> System.IServiceProvider?
Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext
-Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext.EndpointParameterMetadataContext(System.Reflection.ParameterInfo! parameter, System.Collections.Generic.IList<object!>! endpointMetadata, System.IServiceProvider? services) -> void
+Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext.EndpointParameterMetadataContext(System.Reflection.ParameterInfo! parameter, System.Collections.Generic.IList<object!>! endpointMetadata, System.IServiceProvider! applicationServices) -> void
Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext.EndpointMetadata.get -> System.Collections.Generic.IList<object!>!
Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext.Parameter.get -> System.Reflection.ParameterInfo!
-Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext.Services.get -> System.IServiceProvider?
Microsoft.AspNetCore.Http.Metadata.IEndpointMetadataProvider
Microsoft.AspNetCore.Http.Metadata.IEndpointMetadataProvider.PopulateMetadata(Microsoft.AspNetCore.Http.Metadata.EndpointMetadataContext! context) -> void
Microsoft.AspNetCore.Http.Metadata.IEndpointParameterMetadataProvider
Microsoft.AspNetCore.Http.Metadata.IEndpointParameterMetadataProvider.PopulateMetadata(Microsoft.AspNetCore.Http.Metadata.EndpointParameterMetadataContext! parameterContext) -> void
-Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.InitialEndpointMetadata.get -> System.Collections.Generic.IEnumerable<object!>?
-Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.InitialEndpointMetadata.init -> void
-Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.RouteHandlerFilterFactories.get -> System.Collections.Generic.IReadOnlyList<System.Func<Microsoft.AspNetCore.Http.RouteHandlerContext!, Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate!, Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate!>!>?
-Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.RouteHandlerFilterFactories.init -> void
-Microsoft.Extensions.DependencyInjection.RouteHandlerJsonServiceExtensions
+Microsoft.AspNetCore.Http.ProblemDetailsOptions
+Microsoft.AspNetCore.Http.ProblemDetailsOptions.CustomizeProblemDetails.get -> System.Action<Microsoft.AspNetCore.Http.ProblemDetailsContext!>?
+Microsoft.AspNetCore.Http.ProblemDetailsOptions.CustomizeProblemDetails.set -> void
+Microsoft.AspNetCore.Http.ProblemDetailsOptions.ProblemDetailsOptions() -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.get -> string?
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.set -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Extensions.get -> System.Collections.Generic.IDictionary<string!, object?>!
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.get -> string?
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.set -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.ProblemDetails() -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Status.get -> int?
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Status.set -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Title.get -> string?
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Title.set -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Type.get -> string?
+*REMOVED*Microsoft.AspNetCore.Mvc.ProblemDetails.Type.set -> void
+Microsoft.AspNetCore.Mvc.ProblemDetails (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Extensions.get -> System.Collections.Generic.IDictionary<string!, object?>! (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.ProblemDetails() -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Status.get -> int? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Status.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Title.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Title.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Type.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Type.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.Extensions.DependencyInjection.ProblemDetailsServiceCollectionExtensions
+Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.EndpointFilterFactories.get -> System.Collections.Generic.IReadOnlyList<System.Func<Microsoft.AspNetCore.Http.EndpointFilterFactoryContext!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!>!>?
+Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.EndpointFilterFactories.init -> void
+Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.EndpointMetadata.get -> System.Collections.Generic.IList<object!>?
+Microsoft.AspNetCore.Http.RequestDelegateFactoryOptions.EndpointMetadata.init -> void
+Microsoft.Extensions.DependencyInjection.HttpJsonServiceExtensions
static Microsoft.AspNetCore.Http.HttpRequestJsonExtensions.ReadFromJsonAsync(this Microsoft.AspNetCore.Http.HttpRequest! request, System.Type! type, System.Text.Json.Serialization.JsonSerializerContext! context, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<object?>
static Microsoft.AspNetCore.Http.HttpRequestJsonExtensions.ReadFromJsonAsync<TValue>(this Microsoft.AspNetCore.Http.HttpRequest! request, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue>! jsonTypeInfo, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<TValue?>
static Microsoft.AspNetCore.Http.HttpResponseJsonExtensions.WriteAsJsonAsync(this Microsoft.AspNetCore.Http.HttpResponse! response, object? value, System.Type! type, System.Text.Json.Serialization.JsonSerializerContext! context, string? contentType = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
static Microsoft.AspNetCore.Http.HttpResponseJsonExtensions.WriteAsJsonAsync<TValue>(this Microsoft.AspNetCore.Http.HttpResponse! response, TValue value, System.Text.Json.Serialization.Metadata.JsonTypeInfo<TValue>! jsonTypeInfo, string? contentType = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-static Microsoft.Extensions.DependencyInjection.RouteHandlerJsonServiceExtensions.ConfigureRouteHandlerJsonOptions(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Http.Json.JsonOptions!>! configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.ProblemDetailsServiceCollectionExtensions.AddProblemDetails(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.ProblemDetailsServiceCollectionExtensions.AddProblemDetails(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Http.ProblemDetailsOptions!>? configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.HttpJsonServiceExtensions.ConfigureHttpJsonOptions(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Http.Json.JsonOptions!>! configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
Microsoft.AspNetCore.Http.EndpointDescriptionAttribute
Microsoft.AspNetCore.Http.EndpointDescriptionAttribute.EndpointDescriptionAttribute(string! description) -> void
Microsoft.AspNetCore.Http.EndpointDescriptionAttribute.Description.get -> string!
diff --git a/src/Http/Http.Extensions/src/QueryBuilder.cs b/src/Http/Http.Extensions/src/QueryBuilder.cs
index 16b748fcb0..b7eff02a95 100644
--- a/src/Http/Http.Extensions/src/QueryBuilder.cs
+++ b/src/Http/Http.Extensions/src/QueryBuilder.cs
@@ -69,7 +69,7 @@ public class QueryBuilder : IEnumerable<KeyValuePair<string, string>>
/// <inheritdoc/>
public override string ToString()
{
- var builder = new StringBuilder();
+ var builder = new ValueStringBuilder();
bool first = true;
for (var i = 0; i < _params.Count; i++)
{
diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs
index edd832b148..810d902964 100644
--- a/src/Http/Http.Extensions/src/RequestDelegateFactory.cs
+++ b/src/Http/Http.Extensions/src/RequestDelegateFactory.cs
@@ -9,11 +9,13 @@ using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
using System.Security.Claims;
using System.Text;
using System.Text.Json;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Logging;
@@ -33,22 +35,34 @@ public static partial class RequestDelegateFactory
{
private static readonly ParameterBindingMethodCache ParameterBindingMethodCache = new();
- private static readonly MethodInfo ExecuteTaskOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTask), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteTaskWithEmptyResultMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskWithEmptyResult), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteValueTaskWithEmptyResultMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskWithEmptyResult), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteTaskOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskOfT), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteTaskOfObjectMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskOfObject), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteValueTaskOfObjectMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskOfObject), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteTaskOfStringMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskOfString), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteValueTaskOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskOfT), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteValueTaskMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTask), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteValueTaskOfStringMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskOfString), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteTaskResultOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteTaskResult), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ExecuteValueResultTaskOfTMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteValueTaskResult), BindingFlags.NonPublic | BindingFlags.Static)!;
- private static readonly MethodInfo ExecuteObjectReturnMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteObjectReturn), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ExecuteAwaitedReturnMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteAwaitedReturn), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo GetRequiredServiceMethod = typeof(ServiceProviderServiceExtensions).GetMethod(nameof(ServiceProviderServiceExtensions.GetRequiredService), BindingFlags.Public | BindingFlags.Static, new Type[] { typeof(IServiceProvider) })!;
private static readonly MethodInfo GetServiceMethod = typeof(ServiceProviderServiceExtensions).GetMethod(nameof(ServiceProviderServiceExtensions.GetService), BindingFlags.Public | BindingFlags.Static, new Type[] { typeof(IServiceProvider) })!;
private static readonly MethodInfo ResultWriteResponseAsyncMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteResultWriteResponse), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo StringResultWriteResponseAsyncMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ExecuteWriteStringResponseAsync), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo StringIsNullOrEmptyMethod = typeof(string).GetMethod(nameof(string.IsNullOrEmpty), BindingFlags.Static | BindingFlags.Public)!;
private static readonly MethodInfo WrapObjectAsValueTaskMethod = typeof(RequestDelegateFactory).GetMethod(nameof(WrapObjectAsValueTask), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo TaskOfTToValueTaskOfObjectMethod = typeof(RequestDelegateFactory).GetMethod(nameof(TaskOfTToValueTaskOfObject), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ValueTaskOfTToValueTaskOfObjectMethod = typeof(RequestDelegateFactory).GetMethod(nameof(ValueTaskOfTToValueTaskOfObject), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo PopulateMetadataForParameterMethod = typeof(RequestDelegateFactory).GetMethod(nameof(PopulateMetadataForParameter), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo PopulateMetadataForEndpointMethod = typeof(RequestDelegateFactory).GetMethod(nameof(PopulateMetadataForEndpoint), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo ArrayEmptyOfObjectMethod = typeof(Array).GetMethod(nameof(Array.Empty), BindingFlags.Public | BindingFlags.Static)!.MakeGenericMethod(new Type[] { typeof(object) });
+
+ private static readonly PropertyInfo QueryIndexerProperty = typeof(IQueryCollection).GetProperty("Item")!;
+ private static readonly PropertyInfo RouteValuesIndexerProperty = typeof(RouteValueDictionary).GetProperty("Item")!;
+ private static readonly PropertyInfo HeaderIndexerProperty = typeof(IHeaderDictionary).GetProperty("Item")!;
+ private static readonly PropertyInfo FormFilesIndexerProperty = typeof(IFormFileCollection).GetProperty("Item")!;
// Call WriteAsJsonAsync<object?>() to serialize the runtime return type rather than the declared return type.
// https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-polymorphism
@@ -88,13 +102,15 @@ public static partial class RequestDelegateFactory
private static readonly BinaryExpression TempSourceStringNullExpr = Expression.Equal(TempSourceStringExpr, Expression.Constant(null));
private static readonly UnaryExpression TempSourceStringIsNotNullOrEmptyExpr = Expression.Not(Expression.Call(StringIsNullOrEmptyMethod, TempSourceStringExpr));
- private static readonly ConstructorInfo RouteHandlerInvocationContextConstructor = typeof(RouteHandlerInvocationContext).GetConstructor(new[] { typeof(HttpContext), typeof(object[]) })!;
- private static readonly ParameterExpression FilterContextExpr = Expression.Parameter(typeof(RouteHandlerInvocationContext), "context");
- private static readonly MemberExpression FilterContextParametersExpr = Expression.Property(FilterContextExpr, typeof(RouteHandlerInvocationContext).GetProperty(nameof(RouteHandlerInvocationContext.Parameters))!);
- private static readonly MemberExpression FilterContextHttpContextExpr = Expression.Property(FilterContextExpr, typeof(RouteHandlerInvocationContext).GetProperty(nameof(RouteHandlerInvocationContext.HttpContext))!);
+ private static readonly ConstructorInfo DefaultEndpointFilterInvocationContextConstructor = typeof(DefaultEndpointFilterInvocationContext).GetConstructor(new[] { typeof(HttpContext), typeof(object[]) })!;
+ private static readonly MethodInfo EndpointFilterInvocationContextGetArgument = typeof(EndpointFilterInvocationContext).GetMethod(nameof(EndpointFilterInvocationContext.GetArgument))!;
+ private static readonly PropertyInfo ListIndexer = typeof(IList<object>).GetProperty("Item")!;
+ private static readonly ParameterExpression FilterContextExpr = Expression.Parameter(typeof(EndpointFilterInvocationContext), "context");
+ private static readonly MemberExpression FilterContextHttpContextExpr = Expression.Property(FilterContextExpr, typeof(EndpointFilterInvocationContext).GetProperty(nameof(EndpointFilterInvocationContext.HttpContext))!);
+ private static readonly MemberExpression FilterContextArgumentsExpr = Expression.Property(FilterContextExpr, typeof(EndpointFilterInvocationContext).GetProperty(nameof(EndpointFilterInvocationContext.Arguments))!);
private static readonly MemberExpression FilterContextHttpContextResponseExpr = Expression.Property(FilterContextHttpContextExpr, typeof(HttpContext).GetProperty(nameof(HttpContext.Response))!);
private static readonly MemberExpression FilterContextHttpContextStatusCodeExpr = Expression.Property(FilterContextHttpContextResponseExpr, typeof(HttpResponse).GetProperty(nameof(HttpResponse.StatusCode))!);
- private static readonly ParameterExpression InvokedFilterContextExpr = Expression.Parameter(typeof(RouteHandlerInvocationContext), "filterContext");
+ private static readonly ParameterExpression InvokedFilterContextExpr = Expression.Parameter(typeof(EndpointFilterInvocationContext), "filterContext");
private static readonly string[] DefaultAcceptsContentType = new[] { "application/json" };
private static readonly string[] FormFileContentType = new[] { "multipart/form-data" };
@@ -119,13 +135,20 @@ public static partial class RequestDelegateFactory
null => null,
};
- var factoryContext = CreateFactoryContext(options);
+ var factoryContext = CreateFactoryContext(options, handler);
Expression<Func<HttpContext, object?>> targetFactory = (httpContext) => handler.Target;
var targetableRequestDelegate = CreateTargetableRequestDelegate(handler.Method, targetExpression, factoryContext, targetFactory);
- return new RequestDelegateResult(httpContext => targetableRequestDelegate(handler.Target, httpContext), factoryContext.Metadata);
+ if (targetableRequestDelegate is null)
+ {
+ // handler is a RequestDelegate that has not been modified by a filter. Short-circuit and return the original RequestDelegate back.
+ // It's possible a filter factory has still modified the endpoint metadata though.
+ return new RequestDelegateResult((RequestDelegate)handler, AsReadOnlyList(factoryContext.Metadata));
+ }
+
+ return new RequestDelegateResult(httpContext => targetableRequestDelegate(handler.Target, httpContext), AsReadOnlyList(factoryContext.Metadata));
}
/// <summary>
@@ -157,7 +180,10 @@ public static partial class RequestDelegateFactory
{
var untargetableRequestDelegate = CreateTargetableRequestDelegate(methodInfo, targetExpression: null, factoryContext);
- return new RequestDelegateResult(httpContext => untargetableRequestDelegate(null, httpContext), factoryContext.Metadata);
+ // CreateTargetableRequestDelegate can only return null given a RequestDelegate passed into the other RDF.Create() overload.
+ Debug.Assert(untargetableRequestDelegate is not null);
+
+ return new RequestDelegateResult(httpContext => untargetableRequestDelegate(null, httpContext), AsReadOnlyList(factoryContext.Metadata));
}
targetFactory = context => Activator.CreateInstance(methodInfo.DeclaringType)!;
@@ -166,30 +192,38 @@ public static partial class RequestDelegateFactory
var targetExpression = Expression.Convert(TargetExpr, methodInfo.DeclaringType);
var targetableRequestDelegate = CreateTargetableRequestDelegate(methodInfo, targetExpression, factoryContext, context => targetFactory(context));
- return new RequestDelegateResult(httpContext => targetableRequestDelegate(targetFactory(httpContext), httpContext), factoryContext.Metadata);
+ // CreateTargetableRequestDelegate can only return null given a RequestDelegate passed into the other RDF.Create() overload.
+ Debug.Assert(targetableRequestDelegate is not null);
+
+ return new RequestDelegateResult(httpContext => targetableRequestDelegate(targetFactory(httpContext), httpContext), AsReadOnlyList(factoryContext.Metadata));
}
- private static FactoryContext CreateFactoryContext(RequestDelegateFactoryOptions? options)
+ private static FactoryContext CreateFactoryContext(RequestDelegateFactoryOptions? options, Delegate? handler = null)
{
- var context = new FactoryContext
+ return new FactoryContext
{
+ Handler = handler,
ServiceProvider = options?.ServiceProvider,
ServiceProviderIsService = options?.ServiceProvider?.GetService<IServiceProviderIsService>(),
RouteParameters = options?.RouteParameterNames?.ToList(),
ThrowOnBadRequest = options?.ThrowOnBadRequest ?? false,
DisableInferredFromBody = options?.DisableInferBodyFromParameters ?? false,
- Filters = options?.RouteHandlerFilterFactories?.ToList()
+ FilterFactories = options?.EndpointFilterFactories?.ToList(),
+ Metadata = options?.EndpointMetadata ?? new List<object>(),
};
+ }
- if (options?.InitialEndpointMetadata is not null)
+ private static IReadOnlyList<object> AsReadOnlyList(IList<object> metadata)
+ {
+ if (metadata is IReadOnlyList<object> readOnlyList)
{
- context.Metadata.AddRange(options.InitialEndpointMetadata);
+ return readOnlyList;
}
- return context;
+ return new List<object>(metadata);
}
- private static Func<object?, HttpContext, Task> CreateTargetableRequestDelegate(MethodInfo methodInfo, Expression? targetExpression, FactoryContext factoryContext, Expression<Func<HttpContext, object?>>? targetFactory = null)
+ private static Func<object?, HttpContext, Task>? CreateTargetableRequestDelegate(MethodInfo methodInfo, Expression? targetExpression, FactoryContext factoryContext, Expression<Func<HttpContext, object?>>? targetFactory = null)
{
// Non void return type
@@ -207,37 +241,49 @@ public static partial class RequestDelegateFactory
// return default;
// }
- // Add MethodInfo as first metadata item
- factoryContext.Metadata.Insert(0, methodInfo);
-
// CreateArguments will add metadata inferred from parameter details
var arguments = CreateArguments(methodInfo.GetParameters(), factoryContext);
var returnType = methodInfo.ReturnType;
factoryContext.MethodCall = CreateMethodCall(methodInfo, targetExpression, arguments);
// Add metadata provided by the delegate return type and parameter types next, this will be more specific than inferred metadata from above
- AddTypeProvidedMetadata(methodInfo, factoryContext.Metadata, factoryContext.ServiceProvider);
+ AddTypeProvidedMetadata(methodInfo,
+ factoryContext.Metadata,
+ factoryContext.ServiceProvider,
+ CollectionsMarshal.AsSpan(factoryContext.Parameters));
- // Add method attributes as metadata *after* any inferred metadata so that the attributes hava a higher specificity
- AddMethodAttributesAsMetadata(methodInfo, factoryContext.Metadata);
+ EndpointFilterDelegate? filterPipeline = null;
// If there are filters registered on the route handler, then we update the method call and
// return type associated with the request to allow for the filter invocation pipeline.
- if (factoryContext.Filters is { Count: > 0 })
- {
- var filterPipeline = CreateFilterPipeline(methodInfo, targetExpression, factoryContext, targetFactory);
- Expression<Func<RouteHandlerInvocationContext, ValueTask<object?>>> invokePipeline = (context) => filterPipeline(context);
- returnType = typeof(ValueTask<object?>);
- // var filterContext = new RouteHandlerInvocationContext(httpContext, new[] { (object)name_local, (object)int_local });
- // invokePipeline.Invoke(filterContext);
- factoryContext.MethodCall = Expression.Block(
- new[] { InvokedFilterContextExpr },
- Expression.Assign(
- InvokedFilterContextExpr,
- Expression.New(RouteHandlerInvocationContextConstructor,
- new Expression[] { HttpContextExpr, Expression.NewArrayInit(typeof(object), factoryContext.BoxedArgs) })),
- Expression.Invoke(invokePipeline, InvokedFilterContextExpr)
- );
+ if (factoryContext.FilterFactories is { Count: > 0 })
+ {
+ filterPipeline = CreateFilterPipeline(methodInfo, targetExpression, factoryContext, targetFactory);
+
+ if (filterPipeline is not null)
+ {
+ Expression<Func<EndpointFilterInvocationContext, ValueTask<object?>>> invokePipeline = (context) => filterPipeline(context);
+ returnType = typeof(ValueTask<object?>);
+ // var filterContext = new EndpointFilterInvocationContext<string, int>(httpContext, name_local, int_local);
+ // invokePipeline.Invoke(filterContext);
+ factoryContext.MethodCall = Expression.Block(
+ new[] { InvokedFilterContextExpr },
+ Expression.Assign(
+ InvokedFilterContextExpr,
+ CreateEndpointFilterInvocationContextBase(factoryContext)),
+ Expression.Invoke(invokePipeline, InvokedFilterContextExpr)
+ );
+ }
+ }
+
+ // return null for plain RequestDelegates that have not been modified by filters so we can just pass back the original RequestDelegate.
+ if (filterPipeline is null && factoryContext.Handler is RequestDelegate)
+ {
+ // Make sure we're still not handling a return value.
+ if (!returnType.IsGenericType || returnType.GetGenericTypeDefinition() != typeof(Task<>))
+ {
+ return null;
+ }
}
var responseWritingMethodCall = factoryContext.ParamCheckExpressions.Count > 0 ?
@@ -252,58 +298,202 @@ public static partial class RequestDelegateFactory
return HandleRequestBodyAndCompileRequestDelegate(responseWritingMethodCall, factoryContext);
}
- private static RouteHandlerFilterDelegate CreateFilterPipeline(MethodInfo methodInfo, Expression? targetExpression, FactoryContext factoryContext, Expression<Func<HttpContext, object?>>? targetFactory)
+ private static EndpointFilterDelegate? CreateFilterPipeline(MethodInfo methodInfo, Expression? targetExpression, FactoryContext factoryContext, Expression<Func<HttpContext, object?>>? targetFactory)
{
- Debug.Assert(factoryContext.Filters is not null);
+ Debug.Assert(factoryContext.FilterFactories is not null);
// httpContext.Response.StatusCode >= 400
// ? Task.CompletedTask
// : {
- // target = targetFactory(httpContext);
- // handler is ((Type)target).MethodName(parameters);
- // handler((string)context.Parameters[0], (int)context.Parameters[1]);
+ // handlerInvocation
// }
- var filteredInvocation = Expression.Lambda<RouteHandlerFilterDelegate>(
- Expression.Condition(
- Expression.GreaterThanOrEqual(FilterContextHttpContextStatusCodeExpr, Expression.Constant(400)),
- CompletedValueTaskExpr,
- Expression.Block(
+ // To generate the handler invocation, we first create the
+ // target of the handler provided to the route.
+ // target = targetFactory(httpContext);
+ // This target is then used to generate the handler invocation like so;
+ // ((Type)target).MethodName(parameters);
+ // When `handler` returns an object, we generate the following wrapper
+ // to convert it to `ValueTask<object?>` as expected in the filter
+ // pipeline.
+ // ValueTask<object?>.FromResult(handler(EndpointFilterInvocationContext.GetArgument<string>(0), EndpointFilterInvocationContext.GetArgument<int>(1)));
+ // When the `handler` is a generic Task or ValueTask we await the task and
+ // create a `ValueTask<object?> from the resulting value.
+ // new ValueTask<object?>(await handler(EndpointFilterInvocationContext.GetArgument<string>(0), EndpointFilterInvocationContext.GetArgument<int>(1)));
+ // When the `handler` returns a void or a void-returning Task, then we return an EmptyHttpResult
+ // to as a ValueTask<object?>
+ // }
+ var handlerReturnMapping = MapHandlerReturnTypeToValueTask(
+ targetExpression is null
+ ? Expression.Call(methodInfo, factoryContext.ContextArgAccess)
+ : Expression.Call(targetExpression, methodInfo, factoryContext.ContextArgAccess),
+ methodInfo.ReturnType);
+ var handlerInvocation = Expression.Block(
new[] { TargetExpr },
targetFactory == null
? Expression.Empty()
: Expression.Assign(TargetExpr, Expression.Invoke(targetFactory, FilterContextHttpContextExpr)),
- Expression.Call(WrapObjectAsValueTaskMethod,
- targetExpression is null
- ? Expression.Call(methodInfo, factoryContext.ContextArgAccess)
- : Expression.Call(targetExpression, methodInfo, factoryContext.ContextArgAccess))
- )),
+ handlerReturnMapping
+ );
+ var filteredInvocation = Expression.Lambda<EndpointFilterDelegate>(
+ Expression.Condition(
+ Expression.GreaterThanOrEqual(FilterContextHttpContextStatusCodeExpr, Expression.Constant(400)),
+ CompletedValueTaskExpr,
+ handlerInvocation),
FilterContextExpr).Compile();
- var routeHandlerContext = new RouteHandlerContext(
+ var routeHandlerContext = new EndpointFilterFactoryContext(
methodInfo,
- new EndpointMetadataCollection(factoryContext.Metadata));
+ factoryContext.Metadata,
+ factoryContext.ServiceProvider ?? EmptyServiceProvider.Instance);
- for (var i = factoryContext.Filters.Count - 1; i >= 0; i--)
+ var initialFilteredInvocation = filteredInvocation;
+
+ for (var i = factoryContext.FilterFactories.Count - 1; i >= 0; i--)
{
- var currentFilterFactory = factoryContext.Filters[i];
- var nextFilter = filteredInvocation;
- var currentFilter = currentFilterFactory(routeHandlerContext, nextFilter);
- filteredInvocation = (RouteHandlerInvocationContext context) => currentFilter(context);
+ var currentFilterFactory = factoryContext.FilterFactories[i];
+ filteredInvocation = currentFilterFactory(routeHandlerContext, filteredInvocation);
+ }
+ // The filter factories have run without modifying per-request behavior, we can skip running the pipeline.
+ // If a plain old RequestDelegate was passed in (with no generic parameter), we can just return it back directly now.
+ if (ReferenceEquals(initialFilteredInvocation, filteredInvocation))
+ {
+ return null;
}
+
return filteredInvocation;
}
- private static void AddTypeProvidedMetadata(MethodInfo methodInfo, List<object> metadata, IServiceProvider? services)
+ private static Expression MapHandlerReturnTypeToValueTask(Expression methodCall, Type returnType)
+ {
+ if (returnType == typeof(void))
+ {
+ return Expression.Block(methodCall, Expression.Constant(new ValueTask<object?>(EmptyHttpResult.Instance)));
+ }
+ else if (returnType == typeof(Task))
+ {
+ return Expression.Call(ExecuteTaskWithEmptyResultMethod, methodCall);
+ }
+ else if (returnType == typeof(ValueTask))
+ {
+ return Expression.Call(ExecuteValueTaskWithEmptyResultMethod, methodCall);
+ }
+ else if (returnType == typeof(ValueTask<object?>))
+ {
+ return methodCall;
+ }
+ else if (returnType.IsGenericType &&
+ returnType.GetGenericTypeDefinition() == typeof(ValueTask<>))
+ {
+ var typeArg = returnType.GetGenericArguments()[0];
+ return Expression.Call(ValueTaskOfTToValueTaskOfObjectMethod.MakeGenericMethod(typeArg), methodCall);
+ }
+ else if (returnType.IsGenericType &&
+ returnType.GetGenericTypeDefinition() == typeof(Task<>))
+ {
+ var typeArg = returnType.GetGenericArguments()[0];
+ return Expression.Call(TaskOfTToValueTaskOfObjectMethod.MakeGenericMethod(typeArg), methodCall);
+ }
+ else
+ {
+ return Expression.Call(WrapObjectAsValueTaskMethod, methodCall);
+ }
+ }
+
+ private static ValueTask<object?> ValueTaskOfTToValueTaskOfObject<T>(ValueTask<T> valueTask)
+ {
+ static async ValueTask<object?> ExecuteAwaited(ValueTask<T> valueTask)
+ {
+ return await valueTask;
+ }
+
+ if (valueTask.IsCompletedSuccessfully)
+ {
+ return new ValueTask<object?>(valueTask.Result);
+ }
+
+ return ExecuteAwaited(valueTask);
+ }
+
+ private static ValueTask<object?> TaskOfTToValueTaskOfObject<T>(Task<T> task)
+ {
+ static async ValueTask<object?> ExecuteAwaited(Task<T> task)
+ {
+ return await task;
+ }
+
+ if (task.IsCompletedSuccessfully)
+ {
+ return new ValueTask<object?>(task.Result);
+ }
+
+ return ExecuteAwaited(task);
+ }
+
+ private static Expression CreateEndpointFilterInvocationContextBase(FactoryContext factoryContext)
+ {
+ // In the event that a constructor matching the arity of the
+ // provided parameters is not found, we fall back to using the
+ // non-generic implementation of EndpointFilterInvocationContext.
+ Expression paramArray = factoryContext.BoxedArgs.Length > 0
+ ? Expression.NewArrayInit(typeof(object), factoryContext.BoxedArgs)
+ : Expression.Call(ArrayEmptyOfObjectMethod);
+ var fallbackConstruction = Expression.New(
+ DefaultEndpointFilterInvocationContextConstructor,
+ new Expression[] { HttpContextExpr, paramArray });
+
+ if (!RuntimeFeature.IsDynamicCodeCompiled)
+ {
+ // For AOT platforms it's not possible to support the closed generic arguments that are based on the
+ // parameter arguments dynamically (for value types). In that case, fallback to boxing the argument list.
+ return fallbackConstruction;
+ }
+
+ var arguments = new Expression[factoryContext.ArgumentExpressions.Length + 1];
+ arguments[0] = HttpContextExpr;
+ factoryContext.ArgumentExpressions.CopyTo(arguments, 1);
+
+ var constructorType = factoryContext.ArgumentTypes?.Length switch
+ {
+ 1 => typeof(EndpointFilterInvocationContext<>),
+ 2 => typeof(EndpointFilterInvocationContext<,>),
+ 3 => typeof(EndpointFilterInvocationContext<,,>),
+ 4 => typeof(EndpointFilterInvocationContext<,,,>),
+ 5 => typeof(EndpointFilterInvocationContext<,,,,>),
+ 6 => typeof(EndpointFilterInvocationContext<,,,,,>),
+ 7 => typeof(EndpointFilterInvocationContext<,,,,,,>),
+ 8 => typeof(EndpointFilterInvocationContext<,,,,,,,>),
+ 9 => typeof(EndpointFilterInvocationContext<,,,,,,,,>),
+ 10 => typeof(EndpointFilterInvocationContext<,,,,,,,,,>),
+ _ => typeof(DefaultEndpointFilterInvocationContext)
+ };
+
+ if (constructorType.IsGenericType)
+ {
+ var constructor = constructorType.MakeGenericType(factoryContext.ArgumentTypes!).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).SingleOrDefault();
+ if (constructor == null)
+ {
+ // new EndpointFilterInvocationContext(httpContext, (object)name_local, (object)int_local);
+ return fallbackConstruction;
+ }
+
+ // new EndpointFilterInvocationContext<string, int>(httpContext, name_local, int_local);
+ return Expression.New(constructor, arguments);
+ }
+
+ // new EndpointFilterInvocationContext(httpContext, (object)name_local, (object)int_local);
+ return fallbackConstruction;
+ }
+
+ private static void AddTypeProvidedMetadata(MethodInfo methodInfo, IList<object> metadata, IServiceProvider? services, ReadOnlySpan<ParameterInfo> parameters)
{
object?[]? invokeArgs = null;
// Get metadata from parameter types
- var parameters = methodInfo.GetParameters();
foreach (var parameter in parameters)
{
if (typeof(IEndpointParameterMetadataProvider).IsAssignableFrom(parameter.ParameterType))
{
// Parameter type implements IEndpointParameterMetadataProvider
- var parameterContext = new EndpointParameterMetadataContext(parameter, metadata, services);
+ var parameterContext = new EndpointParameterMetadataContext(parameter, metadata, services ?? EmptyServiceProvider.Instance);
invokeArgs ??= new object[1];
invokeArgs[0] = parameterContext;
PopulateMetadataForParameterMethod.MakeGenericMethod(parameter.ParameterType).Invoke(null, invokeArgs);
@@ -312,7 +502,7 @@ public static partial class RequestDelegateFactory
if (typeof(IEndpointMetadataProvider).IsAssignableFrom(parameter.ParameterType))
{
// Parameter type implements IEndpointMetadataProvider
- var context = new EndpointMetadataContext(methodInfo, metadata, services);
+ var context = new EndpointMetadataContext(methodInfo, metadata, services ?? EmptyServiceProvider.Instance);
invokeArgs ??= new object[1];
invokeArgs[0] = context;
PopulateMetadataForEndpointMethod.MakeGenericMethod(parameter.ParameterType).Invoke(null, invokeArgs);
@@ -320,13 +510,19 @@ public static partial class RequestDelegateFactory
}
// Get metadata from return type
- if (methodInfo.ReturnType is not null && typeof(IEndpointMetadataProvider).IsAssignableFrom(methodInfo.ReturnType))
+ var returnType = methodInfo.ReturnType;
+ if (AwaitableInfo.IsTypeAwaitable(returnType, out var awaitableInfo))
+ {
+ returnType = awaitableInfo.ResultType;
+ }
+
+ if (returnType is not null && typeof(IEndpointMetadataProvider).IsAssignableFrom(returnType))
{
// Return type implements IEndpointMetadataProvider
- var context = new EndpointMetadataContext(methodInfo, metadata, services);
+ var context = new EndpointMetadataContext(methodInfo, metadata, services ?? EmptyServiceProvider.Instance);
invokeArgs ??= new object[1];
invokeArgs[0] = context;
- PopulateMetadataForEndpointMethod.MakeGenericMethod(methodInfo.ReturnType).Invoke(null, invokeArgs);
+ PopulateMetadataForEndpointMethod.MakeGenericMethod(returnType).Invoke(null, invokeArgs);
}
}
@@ -342,17 +538,6 @@ public static partial class RequestDelegateFactory
T.PopulateMetadata(context);
}
- private static void AddMethodAttributesAsMetadata(MethodInfo methodInfo, List<object> metadata)
- {
- var attributes = methodInfo.GetCustomAttributes();
-
- // This can be null if the delegate is a dynamic method or compiled from an expression tree
- if (attributes is not null)
- {
- metadata.AddRange(attributes);
- }
- }
-
private static Expression[] CreateArguments(ParameterInfo[]? parameters, FactoryContext factoryContext)
{
if (parameters is null || parameters.Length == 0)
@@ -362,19 +547,41 @@ public static partial class RequestDelegateFactory
var args = new Expression[parameters.Length];
+ factoryContext.ArgumentTypes = new Type[parameters.Length];
+ factoryContext.ArgumentExpressions = new Expression[parameters.Length];
+ factoryContext.BoxedArgs = new Expression[parameters.Length];
+ factoryContext.Parameters = new List<ParameterInfo>(parameters);
+
+ var hasFilters = factoryContext.FilterFactories is { Count: > 0 };
+
for (var i = 0; i < parameters.Length; i++)
{
args[i] = CreateArgument(parameters[i], factoryContext);
- // Register expressions containing the boxed and unboxed variants
- // of the route handler's arguments for use in RouteHandlerInvocationContext
- // construction and route handler invocation.
- // (string)context.Parameters[0];
- factoryContext.ContextArgAccess.Add(
- Expression.Convert(
- Expression.Property(FilterContextParametersExpr, "Item", Expression.Constant(i)),
- parameters[i].ParameterType));
- // (object)name_local
- factoryContext.BoxedArgs.Add(Expression.Convert(args[i], typeof(object)));
+
+ // Only populate the context args if there are filters for this handler
+ if (hasFilters)
+ {
+ if (RuntimeFeature.IsDynamicCodeSupported)
+ {
+ // Register expressions containing the boxed and unboxed variants
+ // of the route handler's arguments for use in EndpointFilterInvocationContext
+ // construction and route handler invocation.
+ // context.GetArgument<string>(0)
+ // (string, name_local), (int, int_local)
+ factoryContext.ContextArgAccess.Add(Expression.Call(FilterContextExpr, EndpointFilterInvocationContextGetArgument.MakeGenericMethod(parameters[i].ParameterType), Expression.Constant(i)));
+ }
+ else
+ {
+ // We box if dynamic code isn't supported
+ factoryContext.ContextArgAccess.Add(Expression.Convert(
+ Expression.Property(FilterContextArgumentsExpr, ListIndexer, Expression.Constant(i)),
+ parameters[i].ParameterType));
+ }
+ }
+
+ factoryContext.ArgumentTypes[i] = parameters[i].ParameterType;
+ factoryContext.ArgumentExpressions[i] = args[i];
+ factoryContext.BoxedArgs[i] = Expression.Convert(args[i], typeof(object));
}
if (factoryContext.HasInferredBody && factoryContext.DisableInferredFromBody)
@@ -416,21 +623,31 @@ public static partial class RequestDelegateFactory
throw new InvalidOperationException($"'{routeName}' is not a route parameter.");
}
- return BindParameterFromProperty(parameter, RouteValuesExpr, routeName, factoryContext, "route");
+ return BindParameterFromProperty(parameter, RouteValuesExpr, RouteValuesIndexerProperty, routeName, factoryContext, "route");
}
else if (parameterCustomAttributes.OfType<IFromQueryMetadata>().FirstOrDefault() is { } queryAttribute)
{
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.QueryAttribute);
- return BindParameterFromProperty(parameter, QueryExpr, queryAttribute.Name ?? parameter.Name, factoryContext, "query string");
+ return BindParameterFromProperty(parameter, QueryExpr, QueryIndexerProperty, queryAttribute.Name ?? parameter.Name, factoryContext, "query string");
}
else if (parameterCustomAttributes.OfType<IFromHeaderMetadata>().FirstOrDefault() is { } headerAttribute)
{
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.HeaderAttribute);
- return BindParameterFromProperty(parameter, HeadersExpr, headerAttribute.Name ?? parameter.Name, factoryContext, "header");
+ return BindParameterFromProperty(parameter, HeadersExpr, HeaderIndexerProperty, headerAttribute.Name ?? parameter.Name, factoryContext, "header");
}
else if (parameterCustomAttributes.OfType<IFromBodyMetadata>().FirstOrDefault() is { } bodyAttribute)
{
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.BodyAttribute);
+
+ if (parameter.ParameterType == typeof(Stream))
+ {
+ return RequestStreamExpr;
+ }
+ else if (parameter.ParameterType == typeof(PipeReader))
+ {
+ return RequestPipeReaderExpr;
+ }
+
return BindParameterFromBody(parameter, bodyAttribute.AllowEmpty, factoryContext);
}
else if (parameterCustomAttributes.OfType<IFromFormMetadata>().FirstOrDefault() is { } formAttribute)
@@ -458,6 +675,16 @@ public static partial class RequestDelegateFactory
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.ServiceAttribute);
return BindParameterFromService(parameter, factoryContext);
}
+ else if (parameterCustomAttributes.OfType<AsParametersAttribute>().Any())
+ {
+ if (parameter is PropertyAsParameterInfo)
+ {
+ throw new NotSupportedException(
+ $"Nested {nameof(AsParametersAttribute)} is not supported and should be used only for handler parameters.");
+ }
+
+ return BindParameterFromProperties(parameter, factoryContext);
+ }
else if (parameter.ParameterType == typeof(HttpContext))
{
return HttpContextExpr;
@@ -511,12 +738,12 @@ public static partial class RequestDelegateFactory
// We're in the fallback case and we have a parameter and route parameter match so don't fallback
// to query string in this case
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.RouteParameter);
- return BindParameterFromProperty(parameter, RouteValuesExpr, parameter.Name, factoryContext, "route");
+ return BindParameterFromProperty(parameter, RouteValuesExpr, RouteValuesIndexerProperty, parameter.Name, factoryContext, "route");
}
else
{
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.QueryStringParameter);
- return BindParameterFromProperty(parameter, QueryExpr, parameter.Name, factoryContext, "query string");
+ return BindParameterFromProperty(parameter, QueryExpr, QueryIndexerProperty, parameter.Name, factoryContext, "query string");
}
}
@@ -526,12 +753,13 @@ public static partial class RequestDelegateFactory
else if (factoryContext.DisableInferredFromBody && (
(parameter.ParameterType.IsArray && ParameterBindingMethodCache.HasTryParseMethod(parameter.ParameterType.GetElementType()!)) ||
parameter.ParameterType == typeof(string[]) ||
- parameter.ParameterType == typeof(StringValues)))
+ parameter.ParameterType == typeof(StringValues) ||
+ parameter.ParameterType == typeof(StringValues?)))
{
- // We only infer parameter types if you have an array of TryParsables/string[]/StringValues, and DisableInferredFromBody is true
+ // We only infer parameter types if you have an array of TryParsables/string[]/StringValues/StringValues?, and DisableInferredFromBody is true
factoryContext.TrackedParameters.Add(parameter.Name, RequestDelegateFactoryConstants.QueryStringParameter);
- return BindParameterFromProperty(parameter, QueryExpr, parameter.Name, factoryContext, "query string");
+ return BindParameterFromProperty(parameter, QueryExpr, QueryIndexerProperty, parameter.Name, factoryContext, "query string");
}
else
{
@@ -614,7 +842,7 @@ public static partial class RequestDelegateFactory
// If filters have been registered, we set the `wasParamCheckFailure` property
// but do not return from the invocation to allow the filters to run.
- if (factoryContext.Filters is { Count: > 0 })
+ if (factoryContext.FilterFactories is { Count: > 0 })
{
// if (wasParamCheckFailure)
// {
@@ -659,18 +887,19 @@ public static partial class RequestDelegateFactory
}
else if (returnType == typeof(object))
{
- return Expression.Call(ExecuteObjectReturnMethod, methodCall, HttpContextExpr);
+ return Expression.Call(ExecuteAwaitedReturnMethod, methodCall, HttpContextExpr);
}
else if (returnType == typeof(ValueTask<object>))
{
- // REVIEW: We can avoid this box if it becomes a performance issue
- var box = Expression.TypeAs(methodCall, typeof(object));
- return Expression.Call(ExecuteObjectReturnMethod, box, HttpContextExpr);
+ return Expression.Call(ExecuteValueTaskOfObjectMethod,
+ methodCall,
+ HttpContextExpr);
}
else if (returnType == typeof(Task<object>))
{
- var convert = Expression.Convert(methodCall, typeof(object));
- return Expression.Call(ExecuteObjectReturnMethod, convert, HttpContextExpr);
+ return Expression.Call(ExecuteTaskOfObjectMethod,
+ methodCall,
+ HttpContextExpr);
}
else if (AwaitableInfo.IsTypeAwaitable(returnType, out _))
{
@@ -1021,8 +1250,6 @@ public static partial class RequestDelegateFactory
return (null, false);
}
- ThrowIfRequestIsAuthenticated(httpContext);
-
try
{
formValue = await httpContext.Request.ReadFormAsync();
@@ -1042,41 +1269,83 @@ public static partial class RequestDelegateFactory
return (formValue, true);
}
+ }
- static void ThrowIfRequestIsAuthenticated(HttpContext httpContext)
+ private static Expression GetValueFromProperty(MemberExpression sourceExpression, PropertyInfo itemProperty, string key, Type? returnType = null)
+ {
+ var indexArguments = new[] { Expression.Constant(key) };
+ var indexExpression = Expression.MakeIndex(sourceExpression, itemProperty, indexArguments);
+ return Expression.Convert(indexExpression, returnType ?? typeof(string));
+ }
+
+ private static Expression BindParameterFromProperties(ParameterInfo parameter, FactoryContext factoryContext)
+ {
+ var parameterType = parameter.ParameterType;
+ var isNullable = Nullable.GetUnderlyingType(parameterType) != null ||
+ factoryContext.NullabilityContext.Create(parameter)?.ReadState == NullabilityState.Nullable;
+
+ if (isNullable)
{
- if (httpContext.Connection.ClientCertificate is not null)
- {
- throw new BadHttpRequestException(
- "Support for binding parameters from an HTTP request's form is not currently supported " +
- "if the request is associated with a client certificate. Use of an HTTP request form is " +
- "not currently secure for HTTP requests in scenarios which require authentication.");
- }
+ throw new InvalidOperationException($"The nullable type '{TypeNameHelper.GetTypeDisplayName(parameter.ParameterType, fullName: false)}' is not supported, mark the parameter as non-nullable.");
+ }
+
+ var argumentExpression = Expression.Variable(parameter.ParameterType, $"{parameter.Name}_local");
+ var (constructor, parameters) = ParameterBindingMethodCache.FindConstructor(parameterType);
- if (!StringValues.IsNullOrEmpty(httpContext.Request.Headers.Authorization))
+ Expression initExpression;
+
+ if (constructor is not null && parameters is { Length: > 0 })
+ {
+ // arg_local = new T(....)
+
+ var constructorArguments = new Expression[parameters.Length];
+
+ for (var i = 0; i < parameters.Length; i++)
{
- throw new BadHttpRequestException(
- "Support for binding parameters from an HTTP request's form is not currently supported " +
- "if the request contains an \"Authorization\" HTTP request header. Use of an HTTP request form is " +
- "not currently secure for HTTP requests in scenarios which require authentication.");
+ var parameterInfo =
+ new PropertyAsParameterInfo(parameters[i].PropertyInfo, parameters[i].ParameterInfo, factoryContext.NullabilityContext);
+ constructorArguments[i] = CreateArgument(parameterInfo, factoryContext);
+ factoryContext.Parameters.Add(parameterInfo);
}
- if (!StringValues.IsNullOrEmpty(httpContext.Request.Headers.Cookie))
+ initExpression = Expression.New(constructor, constructorArguments);
+ }
+ else
+ {
+ // arg_local = new T()
+ // {
+ // arg_local.Property[0] = expression[0],
+ // arg_local.Property[n] = expression[n],
+ // }
+
+ var properties = parameterType.GetProperties();
+ var bindings = new List<MemberBinding>(properties.Length);
+
+ for (var i = 0; i < properties.Length; i++)
{
- throw new BadHttpRequestException(
- "Support for binding parameters from an HTTP request's form is not currently supported " +
- "if the request contains a \"Cookie\" HTTP request header. Use of an HTTP request form is " +
- "not currently secure for HTTP requests in scenarios which require authentication.");
+ // For parameterless ctor we will init only writable properties.
+ if (properties[i].CanWrite)
+ {
+ var parameterInfo = new PropertyAsParameterInfo(properties[i], factoryContext.NullabilityContext);
+ bindings.Add(Expression.Bind(properties[i], CreateArgument(parameterInfo, factoryContext)));
+ factoryContext.Parameters.Add(parameterInfo);
+ }
}
+
+ var newExpression = constructor is null ?
+ Expression.New(parameterType) :
+ Expression.New(constructor);
+
+ initExpression = Expression.MemberInit(newExpression, bindings);
}
- }
- private static Expression GetValueFromProperty(Expression sourceExpression, string key, Type? returnType = null)
- {
- var itemProperty = sourceExpression.Type.GetProperty("Item");
- var indexArguments = new[] { Expression.Constant(key) };
- var indexExpression = Expression.MakeIndex(sourceExpression, itemProperty, indexArguments);
- return Expression.Convert(indexExpression, returnType ?? typeof(string));
+ factoryContext.ParamCheckExpressions.Add(
+ Expression.Assign(argumentExpression, initExpression));
+
+ factoryContext.TrackedParameters.Add(parameter.Name!, RequestDelegateFactoryConstants.PropertyAsParameter);
+ factoryContext.ExtraLocals.Add(argumentExpression);
+
+ return argumentExpression;
}
private static Expression BindParameterFromService(ParameterInfo parameter, FactoryContext factoryContext)
@@ -1092,19 +1361,19 @@ public static partial class RequestDelegateFactory
private static Expression BindParameterFromValue(ParameterInfo parameter, Expression valueExpression, FactoryContext factoryContext, string source)
{
- var isOptional = IsOptionalParameter(parameter, factoryContext);
+ if (parameter.ParameterType == typeof(string) || parameter.ParameterType == typeof(string[])
+ || parameter.ParameterType == typeof(StringValues) || parameter.ParameterType == typeof(StringValues?))
+ {
+ return BindParameterFromExpression(parameter, valueExpression, factoryContext, source);
+ }
+ var isOptional = IsOptionalParameter(parameter, factoryContext);
var argument = Expression.Variable(parameter.ParameterType, $"{parameter.Name}_local");
var parameterTypeNameConstant = Expression.Constant(TypeNameHelper.GetTypeDisplayName(parameter.ParameterType, fullName: false));
var parameterNameConstant = Expression.Constant(parameter.Name);
var sourceConstant = Expression.Constant(source);
- if (parameter.ParameterType == typeof(string) || parameter.ParameterType == typeof(string[]) || parameter.ParameterType == typeof(StringValues))
- {
- return BindParameterFromExpression(parameter, valueExpression, factoryContext, source);
- }
-
factoryContext.UsingTempSourceString = true;
var targetParseType = parameter.ParameterType.IsArray ? parameter.ParameterType.GetElementType()! : parameter.ParameterType;
@@ -1354,6 +1623,8 @@ public static partial class RequestDelegateFactory
)
);
+ // NOTE: when StringValues is used as a parameter, value["some_unpresent_parameter"] returns StringValue.Empty, and it's equivalent to (string?)null
+
factoryContext.ExtraLocals.Add(argument);
factoryContext.ParamCheckExpressions.Add(checkRequiredStringParameterBlock);
return argument;
@@ -1362,6 +1633,16 @@ public static partial class RequestDelegateFactory
// Allow nullable parameters that don't have a default value
if (nullability.ReadState != NullabilityState.NotNull && !parameter.HasDefaultValue)
{
+ if (parameter.ParameterType == typeof(StringValues?))
+ {
+ // when Nullable<StringValues> is used and the actual value is StringValues.Empty, we should pass in a Nullable<StringValues>
+ return Expression.Block(
+ Expression.Condition(Expression.Equal(valueExpression, Expression.Convert(Expression.Constant(StringValues.Empty), parameter.ParameterType)),
+ Expression.Convert(Expression.Constant(null), parameter.ParameterType),
+ valueExpression
+ )
+ );
+ }
return valueExpression;
}
@@ -1377,18 +1658,19 @@ public static partial class RequestDelegateFactory
Expression.Convert(Expression.Constant(parameter.DefaultValue), parameter.ParameterType)));
}
- private static Expression BindParameterFromProperty(ParameterInfo parameter, MemberExpression property, string key, FactoryContext factoryContext, string source) =>
- BindParameterFromValue(parameter, GetValueFromProperty(property, key, GetExpressionType(parameter.ParameterType)), factoryContext, source);
+ private static Expression BindParameterFromProperty(ParameterInfo parameter, MemberExpression property, PropertyInfo itemProperty, string key, FactoryContext factoryContext, string source) =>
+ BindParameterFromValue(parameter, GetValueFromProperty(property, itemProperty, key, GetExpressionType(parameter.ParameterType)), factoryContext, source);
private static Type? GetExpressionType(Type type) =>
type.IsArray ? typeof(string[]) :
type == typeof(StringValues) ? typeof(StringValues) :
+ type == typeof(StringValues?) ? typeof(StringValues?) :
null;
private static Expression BindParameterFromRouteValueOrQueryString(ParameterInfo parameter, string key, FactoryContext factoryContext)
{
- var routeValue = GetValueFromProperty(RouteValuesExpr, key);
- var queryValue = GetValueFromProperty(QueryExpr, key);
+ var routeValue = GetValueFromProperty(RouteValuesExpr, RouteValuesIndexerProperty, key);
+ var queryValue = GetValueFromProperty(QueryExpr, QueryIndexerProperty, key);
return BindParameterFromValue(parameter, Expression.Coalesce(routeValue, queryValue), factoryContext, "route or query string");
}
@@ -1435,6 +1717,14 @@ public static partial class RequestDelegateFactory
return Expression.Convert(boundValueExpr, parameter.ParameterType);
}
+ private static void InsertInferredAcceptsMetadata(FactoryContext factoryContext, Type type, string[] contentTypes)
+ {
+ // Insert the automatically-inferred AcceptsMetadata at the beginning of the list to give it the lowest precedence.
+ // It really doesn't makes sense for this metadata to be overridden, but we're preserving the old behavior out of an abundance of caution.
+ // I suspect most filters and metadata providers will just add their metadata to the end of the list.
+ factoryContext.Metadata.Insert(0, new AcceptsMetadata(type, factoryContext.AllowEmptyRequestBody, contentTypes));
+ }
+
private static Expression BindParameterFromFormFiles(
ParameterInfo parameter,
FactoryContext factoryContext)
@@ -1449,7 +1739,7 @@ public static partial class RequestDelegateFactory
// Do not duplicate the metadata if there are multiple form parameters
if (!factoryContext.ReadForm)
{
- factoryContext.Metadata.Add(new AcceptsMetadata(parameter.ParameterType, factoryContext.AllowEmptyRequestBody, FormFileContentType));
+ InsertInferredAcceptsMetadata(factoryContext, parameter.ParameterType, FormFileContentType);
}
factoryContext.ReadForm = true;
@@ -1473,12 +1763,12 @@ public static partial class RequestDelegateFactory
// Do not duplicate the metadata if there are multiple form parameters
if (!factoryContext.ReadForm)
{
- factoryContext.Metadata.Add(new AcceptsMetadata(parameter.ParameterType, factoryContext.AllowEmptyRequestBody, FormFileContentType));
+ InsertInferredAcceptsMetadata(factoryContext, parameter.ParameterType, FormFileContentType);
}
factoryContext.ReadForm = true;
- var valueExpression = GetValueFromProperty(FormFilesExpr, key, typeof(IFormFile));
+ var valueExpression = GetValueFromProperty(FormFilesExpr, FormFilesIndexerProperty, key, typeof(IFormFile));
return BindParameterFromExpression(parameter, valueExpression, factoryContext, "form file");
}
@@ -1503,7 +1793,7 @@ public static partial class RequestDelegateFactory
factoryContext.JsonRequestBodyParameter = parameter;
factoryContext.AllowEmptyRequestBody = allowEmpty || isOptional;
- factoryContext.Metadata.Add(new AcceptsMetadata(parameter.ParameterType, factoryContext.AllowEmptyRequestBody, DefaultAcceptsContentType));
+ InsertInferredAcceptsMetadata(factoryContext, parameter.ParameterType, DefaultAcceptsContentType);
if (!factoryContext.AllowEmptyRequestBody)
{
@@ -1569,15 +1859,20 @@ public static partial class RequestDelegateFactory
private static bool IsOptionalParameter(ParameterInfo parameter, FactoryContext factoryContext)
{
+ if (parameter is PropertyAsParameterInfo argument)
+ {
+ return argument.IsOptional;
+ }
+
// - Parameters representing value or reference types with a default value
// under any nullability context are treated as optional.
// - Value type parameters without a default value in an oblivious
// nullability context are required.
// - Reference type parameters without a default value in an oblivious
// nullability context are optional.
- var nullability = factoryContext.NullabilityContext.Create(parameter);
+ var nullabilityInfo = factoryContext.NullabilityContext.Create(parameter);
return parameter.HasDefaultValue
- || nullability.ReadState != NullabilityState.NotNull;
+ || nullabilityInfo.ReadState != NullabilityState.NotNull;
}
private static MethodInfo GetMethodInfo<T>(Expression<T> expr)
@@ -1599,57 +1894,57 @@ public static partial class RequestDelegateFactory
// if necessary and restart the cycle until we've reached a terminal state (unknown type).
// We currently don't handle Task<unknown> or ValueTask<unknown>. We can support this later if this
// ends up being a common scenario.
- private static async Task ExecuteObjectReturn(object? obj, HttpContext httpContext)
+ private static Task ExecuteValueTaskOfObject(ValueTask<object> valueTask, HttpContext httpContext)
{
- // See if we need to unwrap Task<object> or ValueTask<object>
- if (obj is Task<object> taskObj)
- {
- obj = await taskObj;
- }
- else if (obj is ValueTask<object> valueTaskObj)
+ static async Task ExecuteAwaited(ValueTask<object> valueTask, HttpContext httpContext)
{
- obj = await valueTaskObj;
+ await ExecuteAwaitedReturn(await valueTask, httpContext);
}
- else if (obj is Task<IResult?> task)
- {
- await ExecuteTaskResult(task, httpContext);
- return;
- }
- else if (obj is ValueTask<IResult?> valueTask)
+
+ if (valueTask.IsCompletedSuccessfully)
{
- await ExecuteValueTaskResult(valueTask, httpContext);
- return;
+ return ExecuteAwaitedReturn(valueTask.GetAwaiter().GetResult(), httpContext);
}
- else if (obj is Task<string?> taskString)
+
+ return ExecuteAwaited(valueTask, httpContext);
+ }
+
+ private static Task ExecuteTaskOfObject(Task<object> task, HttpContext httpContext)
+ {
+ static async Task ExecuteAwaited(Task<object> task, HttpContext httpContext)
{
- await ExecuteTaskOfString(taskString, httpContext);
- return;
+ await ExecuteAwaitedReturn(await task, httpContext);
}
- else if (obj is ValueTask<string?> valueTaskString)
+
+ if (task.IsCompletedSuccessfully)
{
- await ExecuteValueTaskOfString(valueTaskString, httpContext);
- return;
+ return ExecuteAwaitedReturn(task.GetAwaiter().GetResult(), httpContext);
}
+ return ExecuteAwaited(task, httpContext);
+ }
+
+ private static Task ExecuteAwaitedReturn(object obj, HttpContext httpContext)
+ {
// Terminal built ins
if (obj is IResult result)
{
- await ExecuteResultWriteResponse(result, httpContext);
+ return ExecuteResultWriteResponse(result, httpContext);
}
else if (obj is string stringValue)
{
SetPlaintextContentType(httpContext);
- await httpContext.Response.WriteAsync(stringValue);
+ return httpContext.Response.WriteAsync(stringValue);
}
else
{
// Otherwise, we JSON serialize when we reach the terminal state
// Call WriteAsJsonAsync<object?>() to serialize the runtime return type rather than the declared return type.
- await httpContext.Response.WriteAsJsonAsync<object?>(obj);
+ return httpContext.Response.WriteAsJsonAsync<object?>(obj);
}
}
- private static Task ExecuteTask<T>(Task<T> task, HttpContext httpContext)
+ private static Task ExecuteTaskOfT<T>(Task<T> task, HttpContext httpContext)
{
EnsureRequestTaskNotNull(task);
@@ -1702,11 +1997,45 @@ public static partial class RequestDelegateFactory
if (task.IsCompletedSuccessfully)
{
task.GetAwaiter().GetResult();
+ return Task.CompletedTask;
+ }
+
+ return ExecuteAwaited(task);
+ }
+
+ private static ValueTask<object?> ExecuteTaskWithEmptyResult(Task task)
+ {
+ static async ValueTask<object?> ExecuteAwaited(Task task)
+ {
+ await task;
+ return EmptyHttpResult.Instance;
+ }
+
+ if (task.IsCompletedSuccessfully)
+ {
+ return new ValueTask<object?>(EmptyHttpResult.Instance);
}
return ExecuteAwaited(task);
}
+ private static ValueTask<object?> ExecuteValueTaskWithEmptyResult(ValueTask valueTask)
+ {
+ static async ValueTask<object?> ExecuteAwaited(ValueTask task)
+ {
+ await task;
+ return EmptyHttpResult.Instance;
+ }
+
+ if (valueTask.IsCompletedSuccessfully)
+ {
+ valueTask.GetAwaiter().GetResult();
+ return new ValueTask<object?>(EmptyHttpResult.Instance);
+ }
+
+ return ExecuteAwaited(valueTask);
+ }
+
private static Task ExecuteValueTaskOfT<T>(ValueTask<T> task, HttpContext httpContext)
{
static async Task ExecuteAwaited(ValueTask<T> task, HttpContext httpContext)
@@ -1768,9 +2097,12 @@ public static partial class RequestDelegateFactory
await EnsureRequestResultNotNull(result).ExecuteAsync(httpContext);
}
- private class FactoryContext
+ private sealed class FactoryContext
{
// Options
+ // Handler could be null if the MethodInfo overload of RDF.Create is used, but that doesn't matter because this is
+ // only referenced to optimize certain cases where a RequestDelegate is the handler and filters don't modify it.
+ public Delegate? Handler { get; init; }
public IServiceProvider? ServiceProvider { get; init; }
public IServiceProviderIsService? ServiceProviderIsService { get; init; }
public List<string>? RouteParameters { get; init; }
@@ -1790,7 +2122,7 @@ public static partial class RequestDelegateFactory
public bool HasMultipleBodyParameters { get; set; }
public bool HasInferredBody { get; set; }
- public List<object> Metadata { get; internal set; } = new();
+ public IList<object> Metadata { get; init; } = default!;
public NullabilityInfoContext NullabilityContext { get; } = new();
@@ -1799,8 +2131,13 @@ public static partial class RequestDelegateFactory
// Properties for constructing and managing filters
public List<Expression> ContextArgAccess { get; } = new();
public Expression? MethodCall { get; set; }
- public List<Expression> BoxedArgs { get; } = new();
- public List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>? Filters { get; init; }
+ public Type[] ArgumentTypes { get; set; } = Array.Empty<Type>();
+ public Expression[] ArgumentExpressions { get; set; } = Array.Empty<Expression>();
+ public Expression[] BoxedArgs { get; set; } = Array.Empty<Expression>();
+ public List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>? FilterFactories { get; init; }
+ public bool FilterFactoriesHaveRunWithoutModifyingPerRequestBehavior { get; set; }
+
+ public List<ParameterInfo> Parameters { get; set; } = new();
}
private static class RequestDelegateFactoryConstants
@@ -1817,6 +2154,7 @@ public static partial class RequestDelegateFactory
public const string BodyParameter = "Body (Inferred)";
public const string RouteOrQueryStringParameter = "Route or Query String (Inferred)";
public const string FormFileParameter = "Form File (Inferred)";
+ public const string PropertyAsParameter = "As Parameter (Attribute)";
}
private static partial class Log
@@ -2041,4 +2379,29 @@ public static partial class RequestDelegateFactory
errorMessage.AppendLine(FormattableString.Invariant($"{kv.Key,-19} | {kv.Value,-15}"));
}
}
+
+ // Due to cyclic references between Http.Extensions and
+ // Http.Results, we define our own instance of the `EmptyHttpResult`
+ // type here.
+ private sealed class EmptyHttpResult : IResult
+ {
+ private EmptyHttpResult()
+ {
+ }
+
+ public static EmptyHttpResult Instance { get; } = new();
+
+ /// <inheritdoc/>
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ return Task.CompletedTask;
+ }
+ }
+
+ private sealed class EmptyServiceProvider : IServiceProvider
+ {
+ public static IServiceProvider Instance { get; } = new EmptyServiceProvider();
+
+ public object? GetService(Type serviceType) => null;
+ }
}
diff --git a/src/Http/Http.Extensions/src/RequestDelegateFactoryOptions.cs b/src/Http/Http.Extensions/src/RequestDelegateFactoryOptions.cs
index 9b367dfcfc..a3f05d9db8 100644
--- a/src/Http/Http.Extensions/src/RequestDelegateFactoryOptions.cs
+++ b/src/Http/Http.Extensions/src/RequestDelegateFactoryOptions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.Extensions.Logging;
@@ -35,16 +36,23 @@ public sealed class RequestDelegateFactoryOptions
/// <summary>
/// The list of filters that must run in the pipeline for a given route handler.
/// </summary>
- public IReadOnlyList<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>? RouteHandlerFilterFactories { get; init; }
+ public IReadOnlyList<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>? EndpointFilterFactories { get; init; }
/// <summary>
- /// The initial endpoint metadata to add as part of the creation of the <see cref="RequestDelegateResult.RequestDelegate"/>.
+ /// The mutable initial endpoint metadata to add as part of the creation of the <see cref="RequestDelegateResult.RequestDelegate"/>. In most cases,
+ /// this should come from <see cref="EndpointBuilder.Metadata"/>.
/// </summary>
/// <remarks>
- /// This metadata will be included in <see cref="RequestDelegateResult.EndpointMetadata" /> <b>before</b> any metadata inferred during creation of the
+ /// This metadata will be included in <see cref="RequestDelegateResult.EndpointMetadata" /> <b>before</b> most metadata inferred during creation of the
/// <see cref="RequestDelegateResult.RequestDelegate"/> and <b>before</b> any metadata provided by types in the delegate signature that implement
- /// <see cref="IEndpointMetadataProvider" /> or <see cref="IEndpointParameterMetadataProvider" />, i.e. this metadata will be less specific than any
- /// inferred by the call to <see cref="RequestDelegateFactory.Create(Delegate, RequestDelegateFactoryOptions?)"/>.
+ /// <see cref="IEndpointMetadataProvider" /> or <see cref="IEndpointParameterMetadataProvider" />. The exception to this general rule is the
+ /// <see cref="IAcceptsMetadata"/> that <see cref="RequestDelegateFactory.Create(Delegate, RequestDelegateFactoryOptions?)"/> infers automatically
+ /// without any custom metadata providers which instead is inserted at the start to give it lower precedence. Custom metadata providers can choose to
+ /// insert their metadata at the start to give lower precedence, but this is unusual.
/// </remarks>
- public IEnumerable<object>? InitialEndpointMetadata { get; init; }
+ public IList<object>? EndpointMetadata { get; init; }
+
+ // TODO: Add a RouteEndpointBuilder property and remove the EndpointMetadata property. Then do the same in RouteHandlerContext, EndpointMetadataContext
+ // and EndpointParameterMetadataContext. This will allow seeing the entire route pattern if the caller chooses to allow it.
+ // We'll probably want to add the RouteEndpointBuilder constructor without a RequestDelegate back and make it public too.
}
diff --git a/src/Http/Http.Extensions/test/EndpointMetadataContextTests.cs b/src/Http/Http.Extensions/test/EndpointMetadataContextTests.cs
index c71b931e73..3fa0a9a143 100644
--- a/src/Http/Http.Extensions/test/EndpointMetadataContextTests.cs
+++ b/src/Http/Http.Extensions/test/EndpointMetadataContextTests.cs
@@ -16,7 +16,7 @@ public class EndpointMetadataContextTests
[Fact]
public void EndpointMetadataContext_Ctor_ThrowsArgumentNullException_WhenMethodInfoIsNull()
{
- Assert.Throws<ArgumentNullException>(() => new EndpointMetadataContext(null, new List<object>(), null));
+ Assert.Throws<ArgumentNullException>("method", () => new EndpointMetadataContext(null, new List<object>(), null));
}
[Fact]
@@ -25,13 +25,22 @@ public class EndpointMetadataContextTests
Delegate handler = (int id) => { };
var method = handler.GetMethodInfo();
- Assert.Throws<ArgumentNullException>(() => new EndpointMetadataContext(method, null, null));
+ Assert.Throws<ArgumentNullException>("endpointMetadata", () => new EndpointMetadataContext(method, null, null));
+ }
+
+ [Fact]
+ public void EndpointMetadataContext_Ctor_ThrowsArgumentNullException_WhenApplicationServicesAreNull()
+ {
+ Delegate handler = (int id) => { };
+ var method = handler.GetMethodInfo();
+
+ Assert.Throws<ArgumentNullException>("applicationServices", () => new EndpointMetadataContext(method, new List<object>(), null));
}
[Fact]
public void EndpointParameterMetadataContext_Ctor_ThrowsArgumentNullException_WhenParameterInfoIsNull()
{
- Assert.Throws<ArgumentNullException>(() => new EndpointParameterMetadataContext(null, new List<object>(), null));
+ Assert.Throws<ArgumentNullException>("parameter", () => new EndpointParameterMetadataContext(null, new List<object>(), null));
}
[Fact]
@@ -40,6 +49,15 @@ public class EndpointMetadataContextTests
Delegate handler = (int id) => { };
var parameter = handler.GetMethodInfo().GetParameters()[0];
- Assert.Throws<ArgumentNullException>(() => new EndpointParameterMetadataContext(parameter, null, null));
+ Assert.Throws<ArgumentNullException>("endpointMetadata", () => new EndpointParameterMetadataContext(parameter, null, null));
+ }
+
+ [Fact]
+ public void EndpointParameterMetadataContext_Ctor_ThrowsArgumentNullException_WhenApplicationServicesAreNull()
+ {
+ Delegate handler = (int id) => { };
+ var parameter = handler.GetMethodInfo().GetParameters()[0];
+
+ Assert.Throws<ArgumentNullException>("applicationServices", () => new EndpointParameterMetadataContext(parameter, new List<object>(), null));
}
}
diff --git a/src/Http/Http.Extensions/test/ParameterBindingMethodCacheTests.cs b/src/Http/Http.Extensions/test/ParameterBindingMethodCacheTests.cs
index 6e8043b5c4..7039b3684c 100644
--- a/src/Http/Http.Extensions/test/ParameterBindingMethodCacheTests.cs
+++ b/src/Http/Http.Extensions/test/ParameterBindingMethodCacheTests.cs
@@ -3,6 +3,7 @@
#nullable enable
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq.Expressions;
using System.Reflection;
@@ -41,6 +42,23 @@ public class ParameterBindingMethodCacheTests
Assert.True(parameters[3].IsOut);
}
+ [Fact]
+ public void FindUriTryCreateStringMethod_ReturnsTheExpectedUriTryCreateMethod()
+ {
+ var methodFound = new ParameterBindingMethodCache().FindTryParseMethod(typeof(Uri));
+
+ Assert.NotNull(methodFound);
+
+ var call = methodFound!(Expression.Variable(typeof(Uri), "parsedValue"), Expression.Constant(UriKind.RelativeOrAbsolute)) as MethodCallExpression;
+ Assert.NotNull(call);
+ var parameters = call!.Method.GetParameters();
+
+ Assert.Equal(3, parameters.Length);
+ Assert.Equal(typeof(string), parameters[0].ParameterType);
+ Assert.Equal(typeof(UriKind), parameters[1].ParameterType);
+ Assert.True(parameters[2].IsOut);
+ }
+
[Theory]
[InlineData(typeof(DateTime))]
[InlineData(typeof(DateOnly))]
@@ -302,6 +320,10 @@ public class ParameterBindingMethodCacheTests
{
GetFirstParameter((BindAsyncFromInterfaceWithParameterInfo arg) => BindAsyncFromInterfaceWithParameterInfoMethod(arg))
},
+ new[]
+ {
+ GetFirstParameter((BindAsyncFromStaticAbstractInterfaceAndBindAsync arg) => BindAsyncFromImplicitStaticAbstractInterfaceMethodInsteadOfReflectionMatchedMethod(arg))
+ },
};
}
}
@@ -321,6 +343,27 @@ public class ParameterBindingMethodCacheTests
}
[Fact]
+ public void HasBindAsyncMethod_ReturnsTrueForClassImplicitlyImplementingIBindableFromHttpContext()
+ {
+ var parameterInfo = GetFirstParameter((BindAsyncFromImplicitStaticAbstractInterface arg) => BindAsyncFromImplicitStaticAbstractInterfaceMethod(arg));
+ Assert.True(new ParameterBindingMethodCache().HasBindAsyncMethod(parameterInfo));
+ }
+
+ [Fact]
+ public void HasBindAsyncMethod_ReturnsTrueForClassExplicitlyImplementingIBindableFromHttpContext()
+ {
+ var parameterInfo = GetFirstParameter((BindAsyncFromExplicitStaticAbstractInterface arg) => BindAsyncFromExplicitStaticAbstractInterfaceMethod(arg));
+ Assert.True(new ParameterBindingMethodCache().HasBindAsyncMethod(parameterInfo));
+ }
+
+ [Fact]
+ public void HasBindAsyncMethod_ReturnsTrueForClassImplementingIBindableFromHttpContextAndNonInterfaceBindAsyncMethod()
+ {
+ var parameterInfo = GetFirstParameter((BindAsyncFromStaticAbstractInterfaceAndBindAsync arg) => BindAsyncFromImplicitStaticAbstractInterfaceMethodInsteadOfReflectionMatchedMethod(arg));
+ Assert.True(new ParameterBindingMethodCache().HasBindAsyncMethod(parameterInfo));
+ }
+
+ [Fact]
public void FindBindAsyncMethod_FindsNonNullableReturningBindAsyncMethodGivenNullableType()
{
var parameterInfo = GetFirstParameter((BindAsyncStruct? arg) => BindAsyncNullableStructMethod(arg));
@@ -328,6 +371,42 @@ public class ParameterBindingMethodCacheTests
}
[Fact]
+ public async Task FindBindAsyncMethod_FindsForClassImplicitlyImplementingIBindableFromHttpContext()
+ {
+ var parameterInfo = GetFirstParameter((BindAsyncFromImplicitStaticAbstractInterface arg) => BindAsyncFromImplicitStaticAbstractInterfaceMethod(arg));
+ var cache = new ParameterBindingMethodCache();
+ Assert.True(cache.HasBindAsyncMethod(parameterInfo));
+ var methodFound = cache.FindBindAsyncMethod(parameterInfo);
+
+ var parseHttpContext = Expression.Lambda<Func<HttpContext, ValueTask<object?>>>(methodFound.Expression!,
+ ParameterBindingMethodCache.HttpContextExpr).Compile();
+
+ var httpContext = new DefaultHttpContext();
+
+ var result = await parseHttpContext(httpContext);
+ Assert.NotNull(result);
+ Assert.IsType<BindAsyncFromImplicitStaticAbstractInterface>(result);
+ }
+
+ [Fact]
+ public async Task FindBindAsyncMethod_FindsForClassExplicitlyImplementingIBindableFromHttpContext()
+ {
+ var parameterInfo = GetFirstParameter((BindAsyncFromExplicitStaticAbstractInterface arg) => BindAsyncFromExplicitStaticAbstractInterfaceMethod(arg));
+ var cache = new ParameterBindingMethodCache();
+ Assert.True(cache.HasBindAsyncMethod(parameterInfo));
+ var methodFound = cache.FindBindAsyncMethod(parameterInfo);
+
+ var parseHttpContext = Expression.Lambda<Func<HttpContext, ValueTask<object?>>>(methodFound.Expression!,
+ ParameterBindingMethodCache.HttpContextExpr).Compile();
+
+ var httpContext = new DefaultHttpContext();
+
+ var result = await parseHttpContext(httpContext);
+ Assert.NotNull(result);
+ Assert.IsType<BindAsyncFromExplicitStaticAbstractInterface>(result);
+ }
+
+ [Fact]
public async Task FindBindAsyncMethod_FindsFallbackMethodWhenPreferredMethodsReturnTypeIsWrong()
{
var parameterInfo = GetFirstParameter((BindAsyncFallsBack? arg) => BindAsyncFallbackMethod(arg));
@@ -359,6 +438,89 @@ public class ParameterBindingMethodCacheTests
Assert.Null(await parseHttpContext(httpContext));
}
+ [Fact]
+ public async Task FindBindAsyncMethod_FindsMethodFromStaticAbstractInterfaceWhenValidNonInterfaceMethodAlsoExists()
+ {
+ var parameterInfo = GetFirstParameter((BindAsyncFromStaticAbstractInterfaceAndBindAsync arg) => BindAsyncFromImplicitStaticAbstractInterfaceMethodInsteadOfReflectionMatchedMethod(arg));
+ var cache = new ParameterBindingMethodCache();
+ Assert.True(cache.HasBindAsyncMethod(parameterInfo));
+ var methodFound = cache.FindBindAsyncMethod(parameterInfo);
+
+ var parseHttpContext = Expression.Lambda<Func<HttpContext, ValueTask<object>>>(methodFound.Expression!,
+ ParameterBindingMethodCache.HttpContextExpr).Compile();
+
+ var httpContext = new DefaultHttpContext();
+ var result = await parseHttpContext(httpContext);
+
+ Assert.NotNull(result);
+ Assert.IsType<BindAsyncFromStaticAbstractInterfaceAndBindAsync>(result);
+ Assert.Equal(BindAsyncSource.InterfaceStaticAbstractImplicit, ((BindAsyncFromStaticAbstractInterfaceAndBindAsync)result).BoundFrom);
+ }
+
+ [Theory]
+ [InlineData(typeof(ClassWithParameterlessConstructor))]
+ [InlineData(typeof(RecordClassParameterlessConstructor))]
+ [InlineData(typeof(StructWithParameterlessConstructor))]
+ [InlineData(typeof(RecordStructWithParameterlessConstructor))]
+ public void FindConstructor_FindsParameterlessConstructor_WhenExplicitlyDeclared(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var (constructor, parameters) = cache.FindConstructor(type);
+
+ Assert.NotNull(constructor);
+ Assert.True(parameters.Length == 0);
+ }
+
+ [Theory]
+ [InlineData(typeof(ClassWithDefaultConstructor))]
+ [InlineData(typeof(RecordClassWithDefaultConstructor))]
+ public void FindConstructor_FindsDefaultConstructor_WhenNotExplictlyDeclared(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var (constructor, parameters) = cache.FindConstructor(type);
+
+ Assert.NotNull(constructor);
+ Assert.True(parameters.Length == 0);
+ }
+
+ [Theory]
+ [InlineData(typeof(ClassWithParameterizedConstructor))]
+ [InlineData(typeof(RecordClassParameterizedConstructor))]
+ [InlineData(typeof(StructWithParameterizedConstructor))]
+ [InlineData(typeof(RecordStructParameterizedConstructor))]
+ public void FindConstructor_FindsParameterizedConstructor_WhenExplictlyDeclared(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var (constructor, parameters) = cache.FindConstructor(type);
+
+ Assert.NotNull(constructor);
+ Assert.True(parameters.Length == 1);
+ }
+
+ [Theory]
+ [InlineData(typeof(StructWithDefaultConstructor))]
+ [InlineData(typeof(RecordStructWithDefaultConstructor))]
+ public void FindConstructor_ReturnNullForStruct_WhenNotExplictlyDeclared(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var (constructor, parameters) = cache.FindConstructor(type);
+
+ Assert.Null(constructor);
+ Assert.True(parameters.Length == 0);
+ }
+
+ [Theory]
+ [InlineData(typeof(StructWithMultipleConstructors))]
+ [InlineData(typeof(RecordStructWithMultipleConstructors))]
+ public void FindConstructor_ReturnNullForStruct_WhenMultipleParameterizedConstructorsDeclared(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var (constructor, parameters) = cache.FindConstructor(type);
+
+ Assert.Null(constructor);
+ Assert.True(parameters.Length == 0);
+ }
+
public static TheoryData<Type> InvalidTryParseStringTypesData
{
get
@@ -435,6 +597,7 @@ public class ParameterBindingMethodCacheTests
typeof(BindAsyncWithParameterInfoWrongTypeInherit),
typeof(BindAsyncWrongTypeFromInterface),
typeof(BindAsyncBothBadMethods),
+ typeof(BindAsyncFromStaticAbstractInterfaceWrongType)
};
}
}
@@ -493,6 +656,61 @@ public class ParameterBindingMethodCacheTests
Assert.NotNull(expression);
}
+ private class ClassWithInternalConstructor
+ {
+ internal ClassWithInternalConstructor()
+ { }
+ }
+ private record RecordWithInternalConstructor
+ {
+ internal RecordWithInternalConstructor()
+ { }
+ }
+
+ [Theory]
+ [InlineData(typeof(ClassWithInternalConstructor))]
+ [InlineData(typeof(RecordWithInternalConstructor))]
+ public void FindConstructor_ThrowsIfNoPublicConstructors(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var ex = Assert.Throws<InvalidOperationException>(() => cache.FindConstructor(type));
+ Assert.Equal($"No public parameterless constructor found for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.", ex.Message);
+ }
+
+ [Theory]
+ [InlineData(typeof(AbstractClass))]
+ [InlineData(typeof(AbstractRecord))]
+ public void FindConstructor_ThrowsIfAbstract(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var ex = Assert.Throws<InvalidOperationException>(() => cache.FindConstructor(type));
+ Assert.Equal($"The abstract type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}' is not supported.", ex.Message);
+ }
+
+ [Theory]
+ [InlineData(typeof(ClassWithMultipleConstructors))]
+ [InlineData(typeof(RecordWithMultipleConstructors))]
+ public void FindConstructor_ThrowsIfMultipleParameterizedConstructors(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var ex = Assert.Throws<InvalidOperationException>(() => cache.FindConstructor(type));
+ Assert.Equal($"Only a single public parameterized constructor is allowed for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.", ex.Message);
+ }
+
+ [Theory]
+ [InlineData(typeof(ClassWithInvalidConstructors))]
+ [InlineData(typeof(RecordClassWithInvalidConstructors))]
+ [InlineData(typeof(RecordStructWithInvalidConstructors))]
+ [InlineData(typeof(StructWithInvalidConstructors))]
+ public void FindConstructor_ThrowsIfParameterizedConstructorIncludeNoMatchingArguments(Type type)
+ {
+ var cache = new ParameterBindingMethodCache();
+ var ex = Assert.Throws<InvalidOperationException>(() => cache.FindConstructor(type));
+ Assert.Equal(
+ $"The public parameterized constructor must contain only parameters that match the declared public properties for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.",
+ ex.Message);
+ }
+
enum Choice
{
One,
@@ -508,7 +726,6 @@ public class ParameterBindingMethodCacheTests
private static void BindAsyncStructMethod(BindAsyncStruct arg) { }
private static void BindAsyncNullableStructMethod(BindAsyncStruct? arg) { }
private static void NullableReturningBindAsyncStructMethod(NullableReturningBindAsyncStruct arg) { }
-
private static void BindAsyncSingleArgRecordMethod(BindAsyncSingleArgRecord arg) { }
private static void BindAsyncSingleArgStructMethod(BindAsyncSingleArgStruct arg) { }
private static void InheritBindAsyncMethod(InheritBindAsync arg) { }
@@ -520,6 +737,10 @@ public class ParameterBindingMethodCacheTests
private static void BindAsyncFromInterfaceWithParameterInfoMethod(BindAsyncFromInterfaceWithParameterInfo args) { }
private static void BindAsyncFallbackMethod(BindAsyncFallsBack? arg) { }
private static void BindAsyncBadMethodMethod(BindAsyncBadMethod? arg) { }
+ private static void BindAsyncFromImplicitStaticAbstractInterfaceMethod(BindAsyncFromImplicitStaticAbstractInterface arg) { }
+ private static void BindAsyncFromExplicitStaticAbstractInterfaceMethod(BindAsyncFromExplicitStaticAbstractInterface arg) { }
+ private static void BindAsyncFromImplicitStaticAbstractInterfaceMethodInsteadOfReflectionMatchedMethod(BindAsyncFromStaticAbstractInterfaceAndBindAsync arg) { }
+ private static void BindAsyncFromStaticAbstractInterfaceWrongTypeMethod(BindAsyncFromStaticAbstractInterfaceWrongType arg) { }
private static ParameterInfo GetFirstParameter<T>(Expression<Action<T>> expr)
{
@@ -527,6 +748,12 @@ public class ParameterBindingMethodCacheTests
return mc.Method.GetParameters()[0];
}
+ private static ParameterInfo GetParameterAtIndex<T>(Expression<Action<T>> expr, int paramIndex)
+ {
+ var mc = (MethodCallExpression)expr.Body;
+ return mc.Method.GetParameters()[paramIndex];
+ }
+
private record TryParseStringRecord(int Value)
{
public static bool TryParse(string? value, IFormatProvider formatProvider, out TryParseStringRecord? result)
@@ -1069,6 +1296,218 @@ public class ParameterBindingMethodCacheTests
=> throw new NotImplementedException();
}
+ public class ClassWithParameterizedConstructor
+ {
+ public int Foo { get; set; }
+
+ public ClassWithParameterizedConstructor(int foo)
+ {
+
+ }
+ }
+
+ public record RecordClassParameterizedConstructor(int Foo);
+
+ public record struct RecordStructParameterizedConstructor(int Foo);
+
+ public struct StructWithParameterizedConstructor
+ {
+ public int Foo { get; set; }
+
+ public StructWithParameterizedConstructor(int foo)
+ {
+ Foo = foo;
+ }
+ }
+
+ public class ClassWithParameterlessConstructor
+ {
+ public ClassWithParameterlessConstructor()
+ {
+ }
+
+ public ClassWithParameterlessConstructor(int foo)
+ {
+
+ }
+ }
+
+ public record RecordClassParameterlessConstructor
+ {
+ public RecordClassParameterlessConstructor()
+ {
+ }
+
+ public RecordClassParameterlessConstructor(int foo)
+ {
+
+ }
+ }
+
+ public struct StructWithParameterlessConstructor
+ {
+ public StructWithParameterlessConstructor()
+ {
+ }
+
+ public StructWithParameterlessConstructor(int foo)
+ {
+ }
+ }
+
+ public record struct RecordStructWithParameterlessConstructor
+ {
+ public RecordStructWithParameterlessConstructor()
+ {
+ }
+
+ public RecordStructWithParameterlessConstructor(int foo)
+ {
+
+ }
+ }
+
+ public class ClassWithDefaultConstructor
+ { }
+ public record RecordClassWithDefaultConstructor
+ { }
+
+ public struct StructWithDefaultConstructor
+ { }
+
+ public record struct RecordStructWithDefaultConstructor
+ { }
+
+ public struct StructWithMultipleConstructors
+ {
+ public StructWithMultipleConstructors(int foo)
+ {
+ }
+ public StructWithMultipleConstructors(int foo, int bar)
+ {
+ }
+ }
+
+ public record struct RecordStructWithMultipleConstructors(int Foo)
+ {
+ public RecordStructWithMultipleConstructors(int foo, int bar)
+ : this(foo)
+ {
+
+ }
+ }
+
+ private abstract class AbstractClass { }
+
+ private abstract record AbstractRecord();
+
+ private class ClassWithMultipleConstructors
+ {
+ public ClassWithMultipleConstructors(int foo)
+ { }
+
+ public ClassWithMultipleConstructors(int foo, int bar)
+ { }
+ }
+
+ private record RecordWithMultipleConstructors
+ {
+ public RecordWithMultipleConstructors(int foo)
+ { }
+
+ public RecordWithMultipleConstructors(int foo, int bar)
+ { }
+ }
+
+ private class ClassWithInvalidConstructors
+ {
+ public int Foo { get; set; }
+
+ public ClassWithInvalidConstructors(int foo, int bar)
+ { }
+ }
+
+ private record RecordClassWithInvalidConstructors
+ {
+ public int Foo { get; set; }
+
+ public RecordClassWithInvalidConstructors(int foo, int bar)
+ { }
+ }
+
+ private struct StructWithInvalidConstructors
+ {
+ public int Foo { get; set; }
+
+ public StructWithInvalidConstructors(int foo, int bar)
+ {
+ Foo = foo;
+ }
+ }
+
+ private record struct RecordStructWithInvalidConstructors
+ {
+ public int Foo { get; set; }
+
+ public RecordStructWithInvalidConstructors(int foo, int bar)
+ {
+ Foo = foo;
+ }
+ }
+
+ private class BindAsyncFromImplicitStaticAbstractInterface : IBindableFromHttpContext<BindAsyncFromImplicitStaticAbstractInterface>
+ {
+ public static ValueTask<BindAsyncFromImplicitStaticAbstractInterface?> BindAsync(HttpContext context, ParameterInfo parameter)
+ {
+ return ValueTask.FromResult<BindAsyncFromImplicitStaticAbstractInterface?>(new());
+ }
+ }
+
+ private class BindAsyncFromExplicitStaticAbstractInterface : IBindableFromHttpContext<BindAsyncFromExplicitStaticAbstractInterface>
+ {
+ static ValueTask<BindAsyncFromExplicitStaticAbstractInterface?> IBindableFromHttpContext<BindAsyncFromExplicitStaticAbstractInterface>.BindAsync(HttpContext context, ParameterInfo parameter)
+ {
+ return ValueTask.FromResult<BindAsyncFromExplicitStaticAbstractInterface?>(new());
+ }
+ }
+
+ private class BindAsyncFromStaticAbstractInterfaceAndBindAsync : IBindableFromHttpContext<BindAsyncFromStaticAbstractInterfaceAndBindAsync>
+ {
+ public BindAsyncFromStaticAbstractInterfaceAndBindAsync(BindAsyncSource boundFrom)
+ {
+ BoundFrom = boundFrom;
+ }
+
+ public BindAsyncSource BoundFrom { get; }
+
+ // Implicit interface implementation
+ public static ValueTask<BindAsyncFromStaticAbstractInterfaceAndBindAsync?> BindAsync(HttpContext context, ParameterInfo parameter)
+ {
+ return ValueTask.FromResult<BindAsyncFromStaticAbstractInterfaceAndBindAsync?>(new(BindAsyncSource.InterfaceStaticAbstractImplicit));
+ }
+
+ // Late-bound pattern based match in RequestDelegateFactory
+ public static ValueTask<BindAsyncFromStaticAbstractInterfaceAndBindAsync?> BindAsync(HttpContext context)
+ {
+ return ValueTask.FromResult<BindAsyncFromStaticAbstractInterfaceAndBindAsync?>(new(BindAsyncSource.Reflection));
+ }
+ }
+
+ private class BindAsyncFromStaticAbstractInterfaceWrongType : IBindableFromHttpContext<BindAsyncFromImplicitStaticAbstractInterface>
+ {
+ public static ValueTask<BindAsyncFromImplicitStaticAbstractInterface?> BindAsync(HttpContext context, ParameterInfo parameter)
+ {
+ return ValueTask.FromResult<BindAsyncFromImplicitStaticAbstractInterface?>(new());
+ }
+ }
+
+ private enum BindAsyncSource
+ {
+ Reflection,
+ InterfaceStaticAbstractImplicit,
+ InterfaceStaticAbstractExplicit
+ }
+
private class MockParameterInfo : ParameterInfo
{
public MockParameterInfo(Type type, string name)
diff --git a/src/Http/Http.Extensions/test/ProblemDetailsDefaultWriterTest.cs b/src/Http/Http.Extensions/test/ProblemDetailsDefaultWriterTest.cs
new file mode 100644
index 0000000000..997641d42f
--- /dev/null
+++ b/src/Http/Http.Extensions/test/ProblemDetailsDefaultWriterTest.cs
@@ -0,0 +1,229 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Json;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Http.Extensions.Tests;
+
+public class DefaultProblemDetailsWriterTest
+{
+ [Fact]
+ public async Task WriteAsync_Works()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream);
+ var expectedProblem = new ProblemDetails()
+ {
+ Detail = "Custom Bad Request",
+ Instance = "Custom Bad Request",
+ Status = StatusCodes.Status400BadRequest,
+ Type = "https://tools.ietf.org/html/rfc7231#section-6.5.1-custom",
+ Title = "Custom Bad Request",
+ };
+ var problemDetailsContext = new ProblemDetailsContext()
+ {
+ HttpContext = context,
+ ProblemDetails = expectedProblem
+ };
+
+ //Act
+ await writer.WriteAsync(problemDetailsContext);
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Equal(expectedProblem.Status, problemDetails.Status);
+ Assert.Equal(expectedProblem.Type, problemDetails.Type);
+ Assert.Equal(expectedProblem.Title, problemDetails.Title);
+ Assert.Equal(expectedProblem.Detail, problemDetails.Detail);
+ Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
+ }
+
+ [Fact]
+ public async Task WriteAsync_AddExtensions()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream);
+ var expectedProblem = new ProblemDetails();
+ expectedProblem.Extensions["Extension1"] = "Extension1-Value";
+ expectedProblem.Extensions["Extension2"] = "Extension2-Value";
+
+ var problemDetailsContext = new ProblemDetailsContext()
+ {
+ HttpContext = context,
+ ProblemDetails = expectedProblem
+ };
+
+ //Act
+ await writer.WriteAsync(problemDetailsContext);
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Collection(problemDetails.Extensions,
+ (extension) =>
+ {
+ Assert.Equal("Extension1", extension.Key);
+ Assert.Equal("Extension1-Value", extension.Value.ToString());
+ },
+ (extension) =>
+ {
+ Assert.Equal("Extension2", extension.Key);
+ Assert.Equal("Extension2-Value", extension.Value.ToString());
+ });
+ }
+
+ [Fact]
+ public async Task WriteAsync_Applies_Defaults()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, StatusCodes.Status500InternalServerError);
+
+ //Act
+ await writer.WriteAsync(new ProblemDetailsContext() { HttpContext = context });
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Equal(StatusCodes.Status500InternalServerError, problemDetails.Status);
+ Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.6.1", problemDetails.Type);
+ Assert.Equal("An error occurred while processing your request.", problemDetails.Title);
+ }
+
+ [Fact]
+ public async Task WriteAsync_Applies_CustomConfiguration()
+ {
+ // Arrange
+ var options = new ProblemDetailsOptions()
+ {
+ CustomizeProblemDetails = (context) =>
+ {
+ context.ProblemDetails.Status = StatusCodes.Status406NotAcceptable;
+ context.ProblemDetails.Title = "Custom Title";
+ context.ProblemDetails.Extensions["new-extension"] = new { TraceId = Guid.NewGuid() };
+ }
+ };
+ var writer = GetWriter(options);
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, StatusCodes.Status500InternalServerError);
+
+ //Act
+ await writer.WriteAsync(new ProblemDetailsContext()
+ {
+ HttpContext = context,
+ ProblemDetails = { Status = StatusCodes.Status400BadRequest }
+ });
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Equal(StatusCodes.Status406NotAcceptable, problemDetails.Status);
+ Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.5.1", problemDetails.Type);
+ Assert.Equal("Custom Title", problemDetails.Title);
+ Assert.Contains("new-extension", problemDetails.Extensions);
+ }
+
+ [Fact]
+ public async Task WriteAsync_UsesStatusCode_FromProblemDetails_WhenSpecified()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, StatusCodes.Status500InternalServerError);
+
+ //Act
+ await writer.WriteAsync(new ProblemDetailsContext()
+ {
+ HttpContext = context,
+ ProblemDetails = { Status = StatusCodes.Status400BadRequest }
+ });
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Equal(StatusCodes.Status400BadRequest, problemDetails.Status);
+ Assert.Equal("https://tools.ietf.org/html/rfc7231#section-6.5.1", problemDetails.Type);
+ Assert.Equal("Bad Request", problemDetails.Title);
+ }
+
+ [Theory]
+ [InlineData("*/*")]
+ [InlineData("application/*")]
+ [InlineData("application/json")]
+ [InlineData("application/problem+json")]
+ public void CanWrite_ReturnsTrue_WhenJsonAccepted(string contentType)
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, contentType: contentType);
+
+ //Act
+ var result = writer.CanWrite(new() { HttpContext = context });
+
+ //Assert
+ Assert.True(result);
+ }
+
+ [Theory]
+ [InlineData("application/xml")]
+ [InlineData("application/problem+xml")]
+ public void CanWrite_ReturnsFalse_WhenJsonNotAccepted(string contentType)
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, contentType: contentType);
+
+ //Act
+ var result = writer.CanWrite(new() { HttpContext = context });
+
+ //Assert
+ Assert.False(result);
+ }
+
+ private static HttpContext CreateContext(
+ Stream body,
+ int statusCode = StatusCodes.Status400BadRequest,
+ string contentType = "application/json")
+ {
+ var context = new DefaultHttpContext()
+ {
+ Response = { Body = body, StatusCode = statusCode },
+ RequestServices = CreateServices()
+ };
+ context.Request.Headers.Accept = contentType;
+ return context;
+ }
+
+ private static IServiceProvider CreateServices()
+ {
+ var services = new ServiceCollection();
+ services.AddTransient(typeof(ILogger<>), typeof(NullLogger<>));
+ services.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance);
+
+ return services.BuildServiceProvider();
+ }
+
+ private static DefaultProblemDetailsWriter GetWriter(ProblemDetailsOptions options = null)
+ {
+ options ??= new ProblemDetailsOptions();
+ return new DefaultProblemDetailsWriter(Options.Create(options));
+ }
+}
diff --git a/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs b/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs
new file mode 100644
index 0000000000..0760838e00
--- /dev/null
+++ b/src/Http/Http.Extensions/test/ProblemDetailsServiceCollectionExtensionsTest.cs
@@ -0,0 +1,61 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Moq;
+
+namespace Microsoft.AspNetCore.Http.Extensions.Tests;
+
+public class ProblemDetailsServiceCollectionExtensionsTest
+{
+ [Fact]
+ public void AddProblemDetails_AddsNeededServices()
+ {
+ // Arrange
+ var collection = new ServiceCollection();
+
+ // Act
+ collection.AddProblemDetails();
+
+ // Assert
+ Assert.Single(collection, (sd) => sd.ServiceType == typeof(IProblemDetailsService) && sd.ImplementationType == typeof(ProblemDetailsService));
+ Assert.Single(collection, (sd) => sd.ServiceType == typeof(IProblemDetailsWriter) && sd.ImplementationType == typeof(DefaultProblemDetailsWriter));
+ }
+
+ [Fact]
+ public void AddProblemDetails_AllowMultipleWritersRegistration()
+ {
+ // Arrange
+ var collection = new ServiceCollection();
+ var expectedCount = 2;
+ var mockWriter = Mock.Of<IProblemDetailsWriter>();
+ collection.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IProblemDetailsWriter), mockWriter));
+
+ // Act
+ collection.AddProblemDetails();
+
+ // Assert
+ var serviceDescriptors = collection.Where(serviceDescriptor => serviceDescriptor.ServiceType == typeof(IProblemDetailsWriter));
+ Assert.True(
+ (expectedCount == serviceDescriptors.Count()),
+ $"Expected service type '{typeof(IProblemDetailsWriter)}' to be registered {expectedCount}" +
+ $" time(s) but was actually registered {serviceDescriptors.Count()} time(s).");
+ }
+
+ [Fact]
+ public void AddProblemDetails_KeepCustomRegisteredService()
+ {
+ // Arrange
+ var collection = new ServiceCollection();
+ var customService = Mock.Of<IProblemDetailsService>();
+ collection.AddSingleton(typeof(IProblemDetailsService), customService);
+
+ // Act
+ collection.AddProblemDetails();
+
+ // Assert
+ var service = Assert.Single(collection, (sd) => sd.ServiceType == typeof(IProblemDetailsService));
+ Assert.Same(customService, service.ImplementationInstance);
+ }
+}
diff --git a/src/Http/Http.Extensions/test/ProblemDetailsServiceTest.cs b/src/Http/Http.Extensions/test/ProblemDetailsServiceTest.cs
new file mode 100644
index 0000000000..66abd0de36
--- /dev/null
+++ b/src/Http/Http.Extensions/test/ProblemDetailsServiceTest.cs
@@ -0,0 +1,133 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text;
+
+namespace Microsoft.AspNetCore.Http.Extensions.Tests;
+
+public class ProblemDetailsServiceTest
+{
+ [Fact]
+ public async Task WriteAsync_Skip_NextWriters_WhenResponseAlreadyStarted()
+ {
+ // Arrange
+ var service = CreateService(
+ writers: new List<IProblemDetailsWriter>
+ {
+ new MetadataBasedWriter("FirstWriter", canWrite: false),
+ new MetadataBasedWriter("SecondWriter"),
+ new MetadataBasedWriter("FirstWriter"),
+ });
+
+ var metadata = new EndpointMetadataCollection(new SampleMetadata() { ContentType = "application/problem+json" });
+ var stream = new MemoryStream();
+ var context = new DefaultHttpContext()
+ {
+ Response = { Body = stream, StatusCode = StatusCodes.Status400BadRequest },
+ };
+
+ // Act
+ await service.WriteAsync(new() { HttpContext = context, AdditionalMetadata = metadata });
+
+ // Assert
+ Assert.Equal("\"SecondWriter\"", Encoding.UTF8.GetString(stream.ToArray()));
+ }
+
+ [Fact]
+ public async Task WriteAsync_Skip_WhenNoWriterRegistered()
+ {
+ // Arrange
+ var service = CreateService();
+ var stream = new MemoryStream();
+ var context = new DefaultHttpContext()
+ {
+ Response = { Body = stream, StatusCode = StatusCodes.Status400BadRequest },
+ };
+
+ // Act
+ await service.WriteAsync(new() { HttpContext = context });
+
+ // Assert
+ Assert.Equal(string.Empty, Encoding.UTF8.GetString(stream.ToArray()));
+ }
+
+ [Fact]
+ public async Task WriteAsync_Skip_WhenNoWriterCanWrite()
+ {
+ // Arrange
+ var service = CreateService(
+ writers: new List<IProblemDetailsWriter> { new MetadataBasedWriter() });
+ var stream = new MemoryStream();
+ var context = new DefaultHttpContext()
+ {
+ Response = { Body = stream, StatusCode = StatusCodes.Status400BadRequest },
+ };
+
+ // Act
+ await service.WriteAsync(new() { HttpContext = context });
+
+ // Assert
+ Assert.Equal(string.Empty, Encoding.UTF8.GetString(stream.ToArray()));
+ }
+
+ [Theory]
+ [InlineData(StatusCodes.Status100Continue)]
+ [InlineData(StatusCodes.Status200OK)]
+ [InlineData(StatusCodes.Status300MultipleChoices)]
+ [InlineData(399)]
+ public async Task WriteAsync_Skip_WhenSuccessStatusCode(int statusCode)
+ {
+ // Arrange
+ var service = CreateService(
+ writers: new List<IProblemDetailsWriter> { new MetadataBasedWriter() });
+ var stream = new MemoryStream();
+ var context = new DefaultHttpContext()
+ {
+ Response = { Body = stream, StatusCode = statusCode },
+ };
+ var metadata = new EndpointMetadataCollection(new SampleMetadata() { ContentType = "application/problem+json" });
+ context.SetEndpoint(new Endpoint(context => Task.CompletedTask, metadata, null));
+
+ // Act
+ await service.WriteAsync(new() { HttpContext = context });
+
+ // Assert
+ Assert.Equal(string.Empty, Encoding.UTF8.GetString(stream.ToArray()));
+ }
+
+ private static ProblemDetailsService CreateService(
+ IEnumerable<IProblemDetailsWriter> writers = null)
+ {
+ writers ??= Array.Empty<IProblemDetailsWriter>();
+ return new ProblemDetailsService(writers);
+ }
+
+ private class SampleMetadata
+ {
+ public string ContentType { get; set; }
+ }
+
+ private class MetadataBasedWriter : IProblemDetailsWriter
+ {
+ private readonly string _content;
+ private readonly bool _canWrite;
+
+ public MetadataBasedWriter(string content = "Content", bool canWrite = true)
+ {
+ _content = content;
+ _canWrite = canWrite;
+ }
+
+ public bool CanWrite(ProblemDetailsContext context)
+ {
+ var metadata = context.AdditionalMetadata?.GetMetadata<SampleMetadata>() ??
+ context.HttpContext.GetEndpoint()?.Metadata.GetMetadata<SampleMetadata>();
+
+ return metadata != null && _canWrite;
+
+ }
+
+ public ValueTask WriteAsync(ProblemDetailsContext context)
+ => new(context.HttpContext.Response.WriteAsJsonAsync(_content));
+ }
+}
diff --git a/src/Http/Http.Extensions/test/PropertyAsParameterInfoTests.cs b/src/Http/Http.Extensions/test/PropertyAsParameterInfoTests.cs
new file mode 100644
index 0000000000..a4781dd489
--- /dev/null
+++ b/src/Http/Http.Extensions/test/PropertyAsParameterInfoTests.cs
@@ -0,0 +1,224 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+
+namespace Microsoft.AspNetCore.Http.Extensions.Tests;
+
+public class PropertyAsParameterInfoTests
+{
+ [Fact]
+ public void Initialization_SetsTypeAndNameFromPropertyInfo()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.NoAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo);
+
+ // Assert
+ Assert.Equal(propertyInfo.Name, parameterInfo.Name);
+ Assert.Equal(propertyInfo.PropertyType, parameterInfo.ParameterType);
+ }
+
+ [Fact]
+ public void Initialization_WithConstructorArgument_SetsTypeAndNameFromPropertyInfo()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.NoAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), nameof(ArgumentList.NoAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Assert
+ Assert.Equal(propertyInfo.Name, parameterInfo.Name);
+ Assert.Equal(propertyInfo.PropertyType, parameterInfo.ParameterType);
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_ContainsPropertyCustomAttributes()
+ {
+ // Arrange
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.WithTestAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo);
+
+ // Act & Assert
+ Assert.Single(parameterInfo.GetCustomAttributes(typeof(TestAttribute)));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_WithConstructorArgument_UsesParameterCustomAttributes()
+ {
+ // Arrange
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.NoAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), nameof(ArgumentList.WithTestAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Act & Assert
+ Assert.Single(parameterInfo.GetCustomAttributes(typeof(TestAttribute)));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_WithConstructorArgument_FallbackToPropertyCustomAttributes()
+ {
+ // Arrange
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.WithTestAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), nameof(ArgumentList.NoAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Act & Assert
+ Assert.Single(parameterInfo.GetCustomAttributes(typeof(TestAttribute)));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_ContainsPropertyCustomAttributesData()
+ {
+ // Arrange
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.WithTestAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo);
+
+ // Act
+ var attributes = parameterInfo.GetCustomAttributesData();
+
+ // Assert
+ Assert.Single(
+ attributes,
+ a => typeof(TestAttribute).IsAssignableFrom(a.AttributeType));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_WithConstructorArgument_MergePropertyAndParameterCustomAttributesData()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.WithTestAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), nameof(ArgumentList.WithSampleAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Act
+ var attributes = parameterInfo.GetCustomAttributesData();
+
+ // Assert
+ Assert.Single(
+ parameterInfo.GetCustomAttributesData(),
+ a => typeof(TestAttribute).IsAssignableFrom(a.AttributeType));
+ Assert.Single(
+ parameterInfo.GetCustomAttributesData(),
+ a => typeof(SampleAttribute).IsAssignableFrom(a.AttributeType));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_WithConstructorArgument_MergePropertyAndParameterCustomAttributes()
+ {
+ // Arrange
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.WithTestAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), nameof(ArgumentList.WithSampleAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Act
+ var attributes = parameterInfo.GetCustomAttributes(true);
+
+ // Assert
+ Assert.Single(
+ attributes,
+ a => typeof(TestAttribute).IsAssignableFrom(a.GetType()));
+ Assert.Single(
+ attributes,
+ a => typeof(SampleAttribute).IsAssignableFrom(a.GetType()));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_ContainsPropertyInheritedCustomAttributes()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(DerivedArgumentList), nameof(DerivedArgumentList.WithTestAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo);
+
+ // Assert
+ Assert.Single(parameterInfo.GetCustomAttributes(typeof(TestAttribute), true));
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_DoesNotHaveDefaultValueFromProperty()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.NoAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo);
+
+ // Assert
+ Assert.False(parameterInfo.HasDefaultValue);
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_WithConstructorArgument_HasDefaultValue()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.NoAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), "withDefaultValue");
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Assert
+ Assert.True(parameterInfo.HasDefaultValue);
+ Assert.NotNull(parameterInfo.DefaultValue);
+ Assert.IsType<int>(parameterInfo.DefaultValue);
+ Assert.NotNull(parameterInfo.RawDefaultValue);
+ Assert.IsType<int>(parameterInfo.RawDefaultValue);
+ }
+
+ [Fact]
+ public void PropertyAsParameterInfoTests_WithConstructorArgument_DoesNotHaveDefaultValue()
+ {
+ // Arrange & Act
+ var propertyInfo = GetProperty(typeof(ArgumentList), nameof(ArgumentList.NoAttribute));
+ var parameter = GetParameter(nameof(ArgumentList.DefaultMethod), nameof(ArgumentList.NoAttribute));
+ var parameterInfo = new PropertyAsParameterInfo(propertyInfo, parameter);
+
+ // Assert
+ Assert.False(parameterInfo.HasDefaultValue);
+ }
+
+ private static PropertyInfo GetProperty(Type containerType, string propertyName)
+ => containerType.GetProperty(propertyName);
+
+ private static ParameterInfo GetParameter(string methodName, string parameterName)
+ {
+ var methodInfo = typeof(ArgumentList).GetMethod(methodName);
+ var parameters = methodInfo.GetParameters();
+ return parameters.Single(p => p.Name.Equals(parameterName, StringComparison.OrdinalIgnoreCase));
+ }
+
+ private class ArgumentList
+ {
+ public int NoAttribute { get; set; }
+
+ [Test]
+ public virtual int WithTestAttribute { get; set; }
+
+ [Sample]
+ public int WithSampleAttribute { get; set; }
+
+ public void DefaultMethod(
+ int noAttribute,
+ [Test] int withTestAttribute,
+ [Sample] int withSampleAttribute,
+ int withDefaultValue = 10)
+ { }
+ }
+
+ private class DerivedArgumentList : ArgumentList
+ {
+ [DerivedTest]
+ public override int WithTestAttribute
+ {
+ get => base.WithTestAttribute;
+ set => base.WithTestAttribute = value;
+ }
+ }
+
+ [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = true)]
+ private class SampleAttribute : Attribute
+ { }
+
+ [AttributeUsage(AttributeTargets.Property | AttributeTargets.Parameter, Inherited = true)]
+ private class TestAttribute : Attribute
+ { }
+
+ private class DerivedTestAttribute : TestAttribute
+ { }
+}
diff --git a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs
index 727219b43b..3517fe81b4 100644
--- a/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs
+++ b/src/Http/Http.Extensions/test/RequestDelegateFactoryTests.cs
@@ -24,6 +24,7 @@ using Microsoft.AspNetCore.Http.Json;
using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Primitives;
@@ -216,6 +217,30 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal(originalRouteParam, httpContext.Items["input"]);
}
+ private record ParameterListFromRoute(HttpContext HttpContext, int Value);
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromRouteParameterBased_FromParameterList()
+ {
+ const string paramName = "value";
+ const int originalRouteParam = 42;
+
+ static void TestAction([AsParameters] ParameterListFromRoute args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ var httpContext = CreateHttpContext();
+ httpContext.Request.RouteValues[paramName] = originalRouteParam.ToString(NumberFormatInfo.InvariantInfo);
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(originalRouteParam, httpContext.Items["input"]);
+ }
+
private static void TestOptional(HttpContext httpContext, [FromRoute] int value = 42)
{
httpContext.Items.Add("input", value);
@@ -376,7 +401,7 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal(42, httpContext.Items["input"]);
}
-
+
[Fact]
public async Task RequestDelegatePopulatesFromNullableNullOptionalParameter()
{
@@ -498,6 +523,7 @@ public class RequestDelegateFactoryTests : LoggedTest
new object[] { (Action<HttpContext, float[]>)Store, new[] { "0.5" },new[] { 0.5f } },
new object[] { (Action<HttpContext, Half[]>)Store, new[] { "0.5" }, new[] { (Half)0.5f } },
new object[] { (Action<HttpContext, decimal[]>)Store, new[] { "0.5" },new[] { 0.5m } },
+ new object[] { (Action<HttpContext, Uri[]>)Store, new[] { "https://example.org" }, new[] { new Uri("https://example.org") } },
new object[] { (Action<HttpContext, DateTime[]>)Store, new[] { now.ToString("o") },new[] { now.ToUniversalTime() } },
new object[] { (Action<HttpContext, DateTimeOffset[]>)Store, new[] { "1970-01-01T00:00:00.0000000+00:00" },new[] { DateTimeOffset.UnixEpoch } },
new object[] { (Action<HttpContext, TimeSpan[]>)Store, new[] { "00:00:42" },new[] { TimeSpan.FromSeconds(42) } },
@@ -548,6 +574,7 @@ public class RequestDelegateFactoryTests : LoggedTest
new object[] { (Action<HttpContext, float>)Store, "0.5", 0.5f },
new object[] { (Action<HttpContext, Half>)Store, "0.5", (Half)0.5f },
new object[] { (Action<HttpContext, decimal>)Store, "0.5", 0.5m },
+ new object[] { (Action<HttpContext, Uri>)Store, "https://example.org", new Uri("https://example.org") },
new object[] { (Action<HttpContext, DateTime>)Store, now.ToString("o"), now.ToUniversalTime() },
new object[] { (Action<HttpContext, DateTimeOffset>)Store, "1970-01-01T00:00:00.0000000+00:00", DateTimeOffset.UnixEpoch },
new object[] { (Action<HttpContext, TimeSpan>)Store, "00:00:42", TimeSpan.FromSeconds(42) },
@@ -856,6 +883,31 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public async Task RequestDelegateHandlesOptionalStringValuesFromNullQueryString()
+ {
+ var httpContext = CreateHttpContext();
+ httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>
+ {
+ ["values"] = (string?)null
+ });
+
+ static void StoreNullableStringValues(HttpContext httpContext, StringValues? values)
+ {
+ Assert.False(values.HasValue);
+ httpContext.Items["values"] = values;
+ }
+
+ var factoryResult = RequestDelegateFactory.Create(StoreNullableStringValues, new() { DisableInferBodyFromParameters = true });
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.NotEmpty(httpContext.Items);
+ Assert.Null(httpContext.Items["values"]);
+ }
+
+ [Fact]
public async Task RequestDelegateHandlesArraysFromExplicitQueryStringSource()
{
var httpContext = CreateHttpContext();
@@ -883,6 +935,119 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public async Task RequestDelegateHandlesStringValuesFromExplicitQueryStringSource()
+ {
+ var httpContext = CreateHttpContext();
+ httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>
+ {
+ ["a"] = new(new[] { "1", "2", "3" })
+ });
+
+ httpContext.Request.Headers["Custom"] = new(new[] { "4", "5", "6" });
+
+ var factoryResult = RequestDelegateFactory.Create((HttpContext context,
+ [FromHeader(Name = "Custom")] StringValues headerValues,
+ [FromQuery(Name = "a")] StringValues queryValues) =>
+ {
+ context.Items["headers"] = headerValues;
+ context.Items["query"] = queryValues;
+ });
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(new StringValues(new[] { "1", "2", "3" }), httpContext.Items["query"]);
+ Assert.Equal(new StringValues(new[] { "4", "5", "6" }), httpContext.Items["headers"]);
+ }
+
+ [Fact]
+ public async Task RequestDelegateHandlesNullableStringValuesFromExplicitQueryStringSource()
+ {
+ var httpContext = CreateHttpContext();
+ httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>
+ {
+ ["a"] = new(new[] { "1", "2", "3" })
+ });
+
+ httpContext.Request.Headers["Custom"] = new(new[] { "4", "5", "6" });
+
+ var factoryResult = RequestDelegateFactory.Create((HttpContext context,
+ [FromHeader(Name = "Custom")] StringValues? headerValues,
+ [FromQuery(Name = "a")] StringValues? queryValues) =>
+ {
+ context.Items["headers"] = headerValues;
+ context.Items["query"] = queryValues;
+ });
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(new StringValues(new[] { "1", "2", "3" }), httpContext.Items["query"]);
+ Assert.Equal(new StringValues(new[] { "4", "5", "6" }), httpContext.Items["headers"]);
+ }
+
+ [Fact]
+ public async Task RequestDelegateLogsStringValuesFromExplicitQueryStringSourceForUnpresentedValuesFailuresAsDebugAndSets400Response()
+ {
+ var invoked = false;
+
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create((HttpContext context,
+ [FromHeader(Name = "foo")] StringValues headerValues,
+ [FromQuery(Name = "bar")] StringValues queryValues) =>
+ {
+ invoked = true;
+ });
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.False(invoked);
+ Assert.False(httpContext.RequestAborted.IsCancellationRequested);
+ Assert.Equal(400, httpContext.Response.StatusCode);
+ Assert.False(httpContext.Response.HasStarted);
+
+ var logs = TestSink.Writes.ToArray();
+
+ Assert.Equal(2, logs.Length);
+
+ Assert.Equal(new EventId(4, "RequiredParameterNotProvided"), logs[0].EventId);
+ Assert.Equal(LogLevel.Debug, logs[0].LogLevel);
+ Assert.Equal(@"Required parameter ""StringValues headerValues"" was not provided from header.", logs[0].Message);
+
+ Assert.Equal(new EventId(4, "RequiredParameterNotProvided"), logs[1].EventId);
+ Assert.Equal(LogLevel.Debug, logs[1].LogLevel);
+ Assert.Equal(@"Required parameter ""StringValues queryValues"" was not provided from query string.", logs[1].Message);
+ }
+
+ [Fact]
+ public async Task RequestDelegateHandlesNullableStringValuesFromExplicitQueryStringSourceForUnpresentedValues()
+ {
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create((HttpContext context,
+ [FromHeader(Name = "foo")] StringValues? headerValues,
+ [FromQuery(Name = "bar")] StringValues? queryValues) =>
+ {
+ Assert.False(headerValues.HasValue);
+ Assert.False(queryValues.HasValue);
+ context.Items["headers"] = headerValues;
+ context.Items["query"] = queryValues;
+ });
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Null(httpContext.Items["query"]);
+ Assert.Null(httpContext.Items["headers"]);
+ }
+
+ [Fact]
public async Task RequestDelegatePopulatesUnattributedTryParsableParametersFromRouteValueBeforeQueryString()
{
var httpContext = CreateHttpContext();
@@ -1491,6 +1656,40 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal(originalQueryParam, deserializedRouteParam);
}
+ private record ParameterListFromQuery([FromQuery] int Value);
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromQueryParameter_FromParameterList()
+ {
+ // QueryCollection is case sensitve, since we now getting
+ // the parameter name from the Property/Record constructor
+ // we should match the case here
+ const string paramName = "Value";
+ const int originalQueryParam = 42;
+
+ int? deserializedRouteParam = null;
+
+ void TestAction([AsParameters] ParameterListFromQuery args)
+ {
+ deserializedRouteParam = args.Value;
+ }
+
+ var query = new QueryCollection(new Dictionary<string, StringValues>()
+ {
+ [paramName] = originalQueryParam.ToString(NumberFormatInfo.InvariantInfo)
+ });
+
+ var httpContext = CreateHttpContext();
+ httpContext.Request.Query = query;
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(originalQueryParam, deserializedRouteParam);
+ }
+
[Fact]
public async Task RequestDelegatePopulatesFromHeaderParameterBasedOnParameterName()
{
@@ -1515,6 +1714,36 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal(originalHeaderParam, deserializedRouteParam);
}
+ private record ParameterListFromHeader([FromHeader(Name = "X-Custom-Header")] int Value);
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromHeaderParameter_FromParameterList()
+ {
+ const string customHeaderName = "X-Custom-Header";
+ const int originalHeaderParam = 42;
+
+ int? deserializedRouteParam = null;
+
+ void TestAction([AsParameters] ParameterListFromHeader args)
+ {
+ deserializedRouteParam = args.Value;
+ }
+
+ var httpContext = CreateHttpContext();
+ httpContext.Request.Headers[customHeaderName] = originalHeaderParam.ToString(NumberFormatInfo.InvariantInfo);
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(originalHeaderParam, deserializedRouteParam);
+ }
+
+ private record ParametersListWithImplictFromBody(HttpContext HttpContext, TodoStruct Todo);
+
+ private record ParametersListWithExplictFromBody(HttpContext HttpContext, [FromBody] Todo Todo);
+
public static object[][] ImplicitFromBodyActions
{
get
@@ -1534,11 +1763,17 @@ public class RequestDelegateFactoryTests : LoggedTest
httpContext.Items.Add("body", todo);
}
+ void TestImpliedFromBodyStruct_ParameterList([AsParameters] ParametersListWithImplictFromBody args)
+ {
+ args.HttpContext.Items.Add("body", args.Todo);
+ }
+
return new[]
{
new[] { (Action<HttpContext, Todo>)TestImpliedFromBody },
new[] { (Action<HttpContext, ITodo>)TestImpliedFromBodyInterface },
new object[] { (Action<HttpContext, TodoStruct>)TestImpliedFromBodyStruct },
+ new object[] { (Action<ParametersListWithImplictFromBody>)TestImpliedFromBodyStruct_ParameterList },
};
}
}
@@ -1552,10 +1787,16 @@ public class RequestDelegateFactoryTests : LoggedTest
httpContext.Items.Add("body", todo);
}
+ void TestExplicitFromBody_ParameterList([AsParameters] ParametersListWithExplictFromBody args)
+ {
+ args.HttpContext.Items.Add("body", args.Todo);
+ }
+
return new[]
{
new[] { (Action<HttpContext, Todo>)TestExplicitFromBody },
- };
+ new object[] { (Action<ParametersListWithExplictFromBody>)TestExplicitFromBody_ParameterList },
+ };
}
}
@@ -1610,7 +1851,7 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal(originalTodo.Name, ((ITodo)deserializedRequestBody!).Name);
}
- public static object[][] RawFromBodyActions
+ public static object[][] ImplicitRawFromBodyActions
{
get
{
@@ -1636,9 +1877,81 @@ public class RequestDelegateFactoryTests : LoggedTest
}
}
+ public static object[][] ExplicitRawFromBodyActions
+ {
+ get
+ {
+ void TestStream(HttpContext httpContext, [FromBody] Stream stream)
+ {
+ var ms = new MemoryStream();
+ stream.CopyTo(ms);
+ httpContext.Items.Add("body", ms.ToArray());
+ }
+
+ async Task TestPipeReader(HttpContext httpContext, [FromBody] PipeReader reader)
+ {
+ var ms = new MemoryStream();
+ await reader.CopyToAsync(ms);
+ httpContext.Items.Add("body", ms.ToArray());
+ }
+
+ return new[]
+ {
+ new object[] { (Action<HttpContext, Stream>)TestStream },
+ new object[] { (Func<HttpContext, PipeReader, Task>)TestPipeReader }
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(ImplicitRawFromBodyActions))]
+ public async Task RequestDelegatePopulatesFromImplicitRawBodyParameter(Delegate action)
+ {
+ var httpContext = CreateHttpContext();
+
+ var requestBodyBytes = JsonSerializer.SerializeToUtf8Bytes(new
+ {
+ Name = "Write more tests!"
+ });
+
+ var stream = new MemoryStream(requestBodyBytes);
+ httpContext.Request.Body = stream;
+
+ httpContext.Request.Headers["Content-Length"] = stream.Length.ToString(CultureInfo.InvariantCulture);
+ httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));
+
+ var mock = new Mock<IServiceProvider>();
+ httpContext.RequestServices = mock.Object;
+
+ var factoryResult = RequestDelegateFactory.Create(action);
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Same(httpContext.Request.Body, stream);
+
+ // Assert that we can read the body from both the pipe reader and Stream after executing
+ httpContext.Request.Body.Position = 0;
+ byte[] data = new byte[requestBodyBytes.Length];
+ int read = await httpContext.Request.Body.ReadAsync(data.AsMemory());
+ Assert.Equal(read, data.Length);
+ Assert.Equal(requestBodyBytes, data);
+
+ httpContext.Request.Body.Position = 0;
+ var result = await httpContext.Request.BodyReader.ReadAsync();
+ Assert.Equal(requestBodyBytes.Length, result.Buffer.Length);
+ Assert.Equal(requestBodyBytes, result.Buffer.ToArray());
+ httpContext.Request.BodyReader.AdvanceTo(result.Buffer.End);
+
+ var rawRequestBody = httpContext.Items["body"];
+ Assert.NotNull(rawRequestBody);
+ Assert.Equal(requestBodyBytes, (byte[])rawRequestBody!);
+ }
+
[Theory]
- [MemberData(nameof(RawFromBodyActions))]
- public async Task RequestDelegatePopulatesFromRawBodyParameter(Delegate action)
+ [MemberData(nameof(ExplicitRawFromBodyActions))]
+ public async Task RequestDelegatePopulatesFromExplicitRawBodyParameter(Delegate action)
{
var httpContext = CreateHttpContext();
@@ -1683,8 +1996,53 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Theory]
- [MemberData(nameof(RawFromBodyActions))]
- public async Task RequestDelegatePopulatesFromRawBodyParameterPipeReader(Delegate action)
+ [MemberData(nameof(ImplicitRawFromBodyActions))]
+ public async Task RequestDelegatePopulatesFromImplicitRawBodyParameterPipeReader(Delegate action)
+ {
+ var httpContext = CreateHttpContext();
+
+ var requestBodyBytes = JsonSerializer.SerializeToUtf8Bytes(new
+ {
+ Name = "Write more tests!"
+ });
+
+ var pipeReader = PipeReader.Create(new MemoryStream(requestBodyBytes));
+ var stream = pipeReader.AsStream();
+ httpContext.Features.Set<IRequestBodyPipeFeature>(new PipeRequestBodyFeature(pipeReader));
+ httpContext.Request.Body = stream;
+
+ httpContext.Request.Headers["Content-Length"] = requestBodyBytes.Length.ToString(CultureInfo.InvariantCulture);
+ httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));
+
+ var mock = new Mock<IServiceProvider>();
+ httpContext.RequestServices = mock.Object;
+
+ var factoryResult = RequestDelegateFactory.Create(action);
+
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Same(httpContext.Request.Body, stream);
+ Assert.Same(httpContext.Request.BodyReader, pipeReader);
+
+ // Assert that we can read the body from both the pipe reader and Stream after executing and verify that they are empty (the pipe reader isn't seekable here)
+ int read = await httpContext.Request.Body.ReadAsync(new byte[requestBodyBytes.Length].AsMemory());
+ Assert.Equal(0, read);
+
+ var result = await httpContext.Request.BodyReader.ReadAsync();
+ Assert.Equal(0, result.Buffer.Length);
+ Assert.True(result.IsCompleted);
+ httpContext.Request.BodyReader.AdvanceTo(result.Buffer.End);
+
+ var rawRequestBody = httpContext.Items["body"];
+ Assert.NotNull(rawRequestBody);
+ Assert.Equal(requestBodyBytes, (byte[])rawRequestBody!);
+ }
+
+ [Theory]
+ [MemberData(nameof(ExplicitRawFromBodyActions))]
+ public async Task RequestDelegatePopulatesFromExplicitRawBodyParameterPipeReader(Delegate action)
{
var httpContext = CreateHttpContext();
@@ -2055,6 +2413,122 @@ public class RequestDelegateFactoryTests : LoggedTest
throw new NotImplementedException();
}
+ public static object[][] BadArgumentListActions
+ {
+ get
+ {
+ void TestParameterListRecord([AsParameters] BadArgumentListRecord req) { }
+ void TestParameterListClass([AsParameters] BadArgumentListClass req) { }
+ void TestParameterListClassWithMutipleConstructors([AsParameters] BadArgumentListClassMultipleCtors req) { }
+ void TestParameterListAbstractClass([AsParameters] BadAbstractArgumentListClass req) { }
+ void TestParameterListNoPulicConstructorClass([AsParameters] BadNoPublicConstructorArgumentListClass req) { }
+
+ static string GetMultipleContructorsError(Type type)
+ => $"Only a single public parameterized constructor is allowed for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.";
+
+ static string GetAbstractClassError(Type type)
+ => $"The abstract type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}' is not supported.";
+
+ static string GetNoContructorsError(Type type)
+ => $"No public parameterless constructor found for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.";
+
+ static string GetInvalidConstructorError(Type type)
+ => $"The public parameterized constructor must contain only parameters that match the declared public properties for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.";
+
+ return new object[][]
+ {
+ new object[] { (Action<BadArgumentListRecord>)TestParameterListRecord, GetMultipleContructorsError(typeof(BadArgumentListRecord)) },
+ new object[] { (Action<BadArgumentListClass>)TestParameterListClass, GetInvalidConstructorError(typeof(BadArgumentListClass)) },
+ new object[] { (Action<BadArgumentListClassMultipleCtors>)TestParameterListClassWithMutipleConstructors, GetMultipleContructorsError(typeof(BadArgumentListClassMultipleCtors)) },
+ new object[] { (Action<BadAbstractArgumentListClass>)TestParameterListAbstractClass, GetAbstractClassError(typeof(BadAbstractArgumentListClass)) },
+ new object[] { (Action<BadNoPublicConstructorArgumentListClass>)TestParameterListNoPulicConstructorClass, GetNoContructorsError(typeof(BadNoPublicConstructorArgumentListClass)) },
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(BadArgumentListActions))]
+ public void BuildRequestDelegateThrowsInvalidOperationExceptionForInvalidParameterListConstructor(
+ Delegate @delegate,
+ string errorMessage)
+ {
+ var exception = Assert.Throws<InvalidOperationException>(() => RequestDelegateFactory.Create(@delegate));
+ Assert.Equal(errorMessage, exception.Message);
+ }
+
+ private record BadArgumentListRecord(int Foo)
+ {
+ public BadArgumentListRecord(int foo, int bar)
+ : this(foo)
+ {
+ }
+
+ public int Bar { get; set; }
+ }
+
+ private class BadNoPublicConstructorArgumentListClass
+ {
+ private BadNoPublicConstructorArgumentListClass()
+ { }
+
+ public int Foo { get; set; }
+ }
+
+ private abstract class BadAbstractArgumentListClass
+ {
+ public int Foo { get; set; }
+ }
+
+ private class BadArgumentListClass
+ {
+ public BadArgumentListClass(int foo, string name)
+ {
+ }
+
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ }
+
+ private class BadArgumentListClassMultipleCtors
+ {
+ public BadArgumentListClassMultipleCtors(int foo)
+ {
+ }
+
+ public BadArgumentListClassMultipleCtors(int foo, int bar)
+ {
+ }
+
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ }
+
+ private record NestedArgumentListRecord([AsParameters] object NestedParameterList);
+
+ private class ClassWithParametersConstructor
+ {
+ public ClassWithParametersConstructor([AsParameters] object nestedParameterList)
+ {
+ NestedParameterList = nestedParameterList;
+ }
+
+ public object NestedParameterList { get; set; }
+ }
+
+ [Fact]
+ public void BuildRequestDelegateThrowsNotSupportedExceptionForNestedParametersList()
+ {
+ void TestNestedParameterListRecordOnType([AsParameters] NestedArgumentListRecord req) { }
+ void TestNestedParameterListRecordOnArgument([AsParameters] ClassWithParametersConstructor req) { }
+
+ Assert.Throws<NotSupportedException>(() => RequestDelegateFactory.Create(TestNestedParameterListRecordOnType));
+ Assert.Throws<NotSupportedException>(() => RequestDelegateFactory.Create(TestNestedParameterListRecordOnArgument));
+ }
+
+ private record ParametersListWithImplictFromService(HttpContext HttpContext, IMyService MyService);
+
+ private record ParametersListWithExplictFromService(HttpContext HttpContext, [FromService] MyService MyService);
+
public static object[][] ExplicitFromServiceActions
{
get
@@ -2064,6 +2538,11 @@ public class RequestDelegateFactoryTests : LoggedTest
httpContext.Items.Add("service", myService);
}
+ void TestExplicitFromService_FromParameterList([AsParameters] ParametersListWithExplictFromService args)
+ {
+ args.HttpContext.Items.Add("service", args.MyService);
+ }
+
void TestExplicitFromIEnumerableService(HttpContext httpContext, [FromService] IEnumerable<MyService> myServices)
{
httpContext.Items.Add("service", myServices.Single());
@@ -2077,6 +2556,7 @@ public class RequestDelegateFactoryTests : LoggedTest
return new object[][]
{
new[] { (Action<HttpContext, MyService>)TestExplicitFromService },
+ new object[] { (Action<ParametersListWithExplictFromService>)TestExplicitFromService_FromParameterList },
new[] { (Action<HttpContext, IEnumerable<MyService>>)TestExplicitFromIEnumerableService },
new[] { (Action<HttpContext, MyService, IEnumerable<MyService>>)TestExplicitMultipleFromService },
};
@@ -2092,6 +2572,11 @@ public class RequestDelegateFactoryTests : LoggedTest
httpContext.Items.Add("service", myService);
}
+ void TestImpliedFromService_FromParameterList([AsParameters] ParametersListWithImplictFromService args)
+ {
+ args.HttpContext.Items.Add("service", args.MyService);
+ }
+
void TestImpliedIEnumerableFromService(HttpContext httpContext, IEnumerable<MyService> myServices)
{
httpContext.Items.Add("service", myServices.Single());
@@ -2105,6 +2590,7 @@ public class RequestDelegateFactoryTests : LoggedTest
return new object[][]
{
new[] { (Action<HttpContext, IMyService>)TestImpliedFromService },
+ new object[] { (Action<ParametersListWithImplictFromService>)TestImpliedFromService_FromParameterList },
new[] { (Action<HttpContext, IEnumerable<MyService>>)TestImpliedIEnumerableFromService },
new[] { (Action<HttpContext, MyService>)TestImpliedFromServiceBasedOnContainer },
};
@@ -2198,6 +2684,32 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Same(httpContext, httpContextArgument);
}
+ private record ParametersListWithHttpContext(
+ HttpContext HttpContext,
+ ClaimsPrincipal User,
+ HttpRequest HttpRequest,
+ HttpResponse HttpResponse);
+
+ [Fact]
+ public async Task RequestDelegatePopulatesHttpContextParameterWithoutAttribute_FromParameterList()
+ {
+ HttpContext? httpContextArgument = null;
+
+ void TestAction([AsParameters] ParametersListWithHttpContext args)
+ {
+ httpContextArgument = args.HttpContext;
+ }
+
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Same(httpContext, httpContextArgument);
+ }
+
[Fact]
public async Task RequestDelegatePassHttpContextRequestAbortedAsCancellationToken()
{
@@ -2244,6 +2756,27 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public async Task RequestDelegatePassHttpContextUserAsClaimsPrincipal_FromParameterList()
+ {
+ ClaimsPrincipal? userArgument = null;
+
+ void TestAction([AsParameters] ParametersListWithHttpContext args)
+ {
+ userArgument = args.User;
+ }
+
+ var httpContext = CreateHttpContext();
+ httpContext.User = new ClaimsPrincipal();
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(httpContext.User, userArgument);
+ }
+
+ [Fact]
public async Task RequestDelegatePassHttpContextRequestAsHttpRequest()
{
HttpRequest? httpRequestArgument = null;
@@ -2264,6 +2797,26 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public async Task RequestDelegatePassHttpContextRequestAsHttpRequest_FromParameterList()
+ {
+ HttpRequest? httpRequestArgument = null;
+
+ void TestAction([AsParameters] ParametersListWithHttpContext args)
+ {
+ httpRequestArgument = args.HttpRequest;
+ }
+
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(httpContext.Request, httpRequestArgument);
+ }
+
+ [Fact]
public async Task RequestDelegatePassesHttpContextRresponseAsHttpResponse()
{
HttpResponse? httpResponseArgument = null;
@@ -2283,6 +2836,26 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal(httpContext.Response, httpResponseArgument);
}
+ [Fact]
+ public async Task RequestDelegatePassesHttpContextRresponseAsHttpResponse_FromParameterList()
+ {
+ HttpResponse? httpResponseArgument = null;
+
+ void TestAction([AsParameters] ParametersListWithHttpContext args)
+ {
+ httpResponseArgument = args.HttpResponse;
+ }
+
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(httpContext.Response, httpResponseArgument);
+ }
+
public static IEnumerable<object[]> ComplexResult
{
get
@@ -2410,14 +2983,6 @@ public class RequestDelegateFactoryTests : LoggedTest
// Object return type where the object is IResult
static object StaticResultAsObject() => new CustomResult("Still not enough tests!");
- static object StaticResultAsTaskObject() => Task.FromResult<object>(new CustomResult("Still not enough tests!"));
- static object StaticResultAsValueTaskObject() => ValueTask.FromResult<object>(new CustomResult("Still not enough tests!"));
-
- // Object return type where the object is Task<IResult>
- static object StaticResultAsTaskIResult() => Task.FromResult<IResult>(new CustomResult("Still not enough tests!"));
-
- // Object return type where the object is ValueTask<IResult>
- static object StaticResultAsValueTaskIResult() => ValueTask.FromResult<IResult>(new CustomResult("Still not enough tests!"));
// Task<object> return type
static Task<object> StaticTaskOfIResultAsObject() => Task.FromResult<object>(new CustomResult("Still not enough tests!"));
@@ -2437,11 +3002,6 @@ public class RequestDelegateFactoryTests : LoggedTest
new object[] { (Func<ValueTask<CustomResult>>)StaticValueTaskTestAction},
new object[] { (Func<object>)StaticResultAsObject},
- new object[] { (Func<object>)StaticResultAsTaskObject},
- new object[] { (Func<object>)StaticResultAsValueTaskObject},
-
- new object[] { (Func<object>)StaticResultAsTaskIResult},
- new object[] { (Func<object>)StaticResultAsValueTaskIResult},
new object[] { (Func<Task<object>>)StaticTaskOfIResultAsObject},
new object[] { (Func<ValueTask<object>>)StaticValueTaskOfIResultAsObject},
@@ -2487,8 +3047,6 @@ public class RequestDelegateFactoryTests : LoggedTest
// Dynamic via object
static object StaticStringAsObjectTestAction() => "String Test";
- static object StaticTaskStringAsObjectTestAction() => Task.FromResult("String Test");
- static object StaticValueTaskStringAsObjectTestAction() => ValueTask.FromResult("String Test");
// Dynamic via Task<object>
static Task<object> StaticStringAsTaskObjectTestAction() => Task.FromResult<object>("String Test");
@@ -2506,8 +3064,6 @@ public class RequestDelegateFactoryTests : LoggedTest
new object[] { (Func<ValueTask<string>>)StaticValueTaskTestAction },
new object[] { (Func<object>)StaticStringAsObjectTestAction },
- new object[] { (Func<object>)StaticTaskStringAsObjectTestAction },
- new object[] { (Func<object>)StaticValueTaskStringAsObjectTestAction },
new object[] { (Func<Task<object>>)StaticStringAsTaskObjectTestAction },
new object[] { (Func<ValueTask<object>>)StaticStringAsValueTaskObjectTestAction },
@@ -2778,7 +3334,7 @@ public class RequestDelegateFactoryTests : LoggedTest
var log = Assert.Single(logs);
Assert.Equal(LogLevel.Debug, log.LogLevel);
Assert.Equal(new EventId(4, "RequiredParameterNotProvided"), log.EventId);
- var expectedType = paramName == "age" ? "int age" : "string name";
+ var expectedType = paramName == "age" ? "int age" : $"string name";
Assert.Equal($@"Required parameter ""{expectedType}"" was not provided from route or query string.", log.Message);
}
else
@@ -2850,7 +3406,7 @@ public class RequestDelegateFactoryTests : LoggedTest
var log = Assert.Single(logs);
Assert.Equal(LogLevel.Debug, log.LogLevel);
Assert.Equal(new EventId(4, "RequiredParameterNotProvided"), log.EventId);
- var expectedType = paramName == "age" ? "int age" : "string name";
+ var expectedType = paramName == "age" ? "int age" : $"string name";
Assert.Equal($@"Required parameter ""{expectedType}"" was not provided from query string.", log.Message);
}
else
@@ -3353,6 +3909,46 @@ public class RequestDelegateFactoryTests : LoggedTest
}
}
+ public static IEnumerable<object?[]> UriDelegates
+ {
+ get
+ {
+ string uriParsing(Uri uri) => $"Uri: {uri.OriginalString}";
+
+ return new List<object?[]>
+ {
+ new object?[] { (Func<Uri, string>)uriParsing, "https://example.org", "Uri: https://example.org" },
+ new object?[] { (Func<Uri, string>)uriParsing, "https://example.org/path/to/file?name=value1&name=value2", "Uri: https://example.org/path/to/file?name=value1&name=value2" },
+ new object?[] { (Func<Uri, string>)uriParsing, "/path/to/file?name=value1&name=value2", "Uri: /path/to/file?name=value1&name=value2" },
+ new object?[] { (Func<Uri, string>)uriParsing, "?name=value1&name=value2", "Uri: ?name=value1&name=value2" },
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(UriDelegates))]
+ public async Task RequestDelegateCanProcessUriValues(Delegate @delegate, string uri, string expectedResponse)
+ {
+ var httpContext = CreateHttpContext();
+ var responseBodyStream = new MemoryStream();
+ httpContext.Response.Body = responseBodyStream;
+
+ httpContext.Request.Query = new QueryCollection(new Dictionary<string, StringValues>
+ {
+ ["uri"] = uri
+ });
+
+ var factoryResult = RequestDelegateFactory.Create(@delegate);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ Assert.False(httpContext.RequestAborted.IsCancellationRequested);
+ var decodedResponseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
+ Assert.Equal(expectedResponse, decodedResponseBody);
+ }
+
public static IEnumerable<object?[]> DateTimeDelegates
{
get
@@ -4121,18 +4717,19 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Theory]
- [InlineData("Authorization", "bearer my-token", "Support for binding parameters from an HTTP request's form is not currently supported if the request contains an \"Authorization\" HTTP request header. Use of an HTTP request form is not currently secure for HTTP requests in scenarios which require authentication.")]
- [InlineData("Cookie", ".AspNetCore.Auth=abc123", "Support for binding parameters from an HTTP request's form is not currently supported if the request contains a \"Cookie\" HTTP request header. Use of an HTTP request form is not currently secure for HTTP requests in scenarios which require authentication.")]
- public async Task RequestDelegateThrowsIfRequestUsingFormContainsSecureHeader(
+ [InlineData("Authorization", "bearer my-token")]
+ [InlineData("Cookie", ".AspNetCore.Auth=abc123")]
+ public async Task RequestDelegatePopulatesFromIFormFileParameterIfRequestContainsSecureHeader(
string headerName,
- string headerValue,
- string expectedMessage)
+ string headerValue)
{
- var invoked = false;
+ IFormFile? fileArgument = null;
+ TraceIdentifier traceIdArgument = default;
- void TestAction(IFormFile file)
+ void TestAction(IFormFile? file, TraceIdentifier traceId)
{
- invoked = true;
+ fileArgument = file;
+ traceIdArgument = traceId;
}
var fileContent = new StringContent("hello", Encoding.UTF8, "application/octet-stream");
@@ -4149,34 +4746,30 @@ public class RequestDelegateFactoryTests : LoggedTest
httpContext.Request.Headers[headerName] = headerValue;
httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary";
httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));
+ httpContext.TraceIdentifier = "my-trace-id";
var factoryResult = RequestDelegateFactory.Create(TestAction);
var requestDelegate = factoryResult.RequestDelegate;
- var badHttpRequestException = await Assert.ThrowsAsync<BadHttpRequestException>(() => requestDelegate(httpContext));
-
- Assert.False(invoked);
-
- // The httpContext should be untouched.
- Assert.False(httpContext.RequestAborted.IsCancellationRequested);
- Assert.Equal(200, httpContext.Response.StatusCode);
- Assert.False(httpContext.Response.HasStarted);
+ await requestDelegate(httpContext);
- // We don't log bad requests when we throw.
- Assert.Empty(TestSink.Writes);
+ Assert.Equal(httpContext.Request.Form.Files["file"], fileArgument);
+ Assert.Equal("file.txt", fileArgument!.FileName);
+ Assert.Equal("file", fileArgument.Name);
- Assert.Equal(expectedMessage, badHttpRequestException.Message);
- Assert.Equal(400, badHttpRequestException.StatusCode);
+ Assert.Equal("my-trace-id", traceIdArgument.Id);
}
[Fact]
- public async Task RequestDelegateThrowsIfRequestUsingFormHasClientCertificate()
+ public async Task RequestDelegatePopulatesFromIFormFileParameterIfRequestHasClientCertificate()
{
- var invoked = false;
+ IFormFile? fileArgument = null;
+ TraceIdentifier traceIdArgument = default;
- void TestAction(IFormFile file)
+ void TestAction(IFormFile? file, TraceIdentifier traceId)
{
- invoked = true;
+ fileArgument = file;
+ traceIdArgument = traceId;
}
var fileContent = new StringContent("hello", Encoding.UTF8, "application/octet-stream");
@@ -4192,6 +4785,7 @@ public class RequestDelegateFactoryTests : LoggedTest
httpContext.Request.Body = stream;
httpContext.Request.Headers["Content-Type"] = "multipart/form-data;boundary=some-boundary";
httpContext.Features.Set<IHttpRequestBodyDetectionFeature>(new RequestBodyDetectionFeature(true));
+ httpContext.TraceIdentifier = "my-trace-id";
#pragma warning disable SYSLIB0026 // Type or member is obsolete
var clientCertificate = new X509Certificate2();
@@ -4202,20 +4796,356 @@ public class RequestDelegateFactoryTests : LoggedTest
var factoryResult = RequestDelegateFactory.Create(TestAction);
var requestDelegate = factoryResult.RequestDelegate;
- var badHttpRequestException = await Assert.ThrowsAsync<BadHttpRequestException>(() => requestDelegate(httpContext));
+ await requestDelegate(httpContext);
- Assert.False(invoked);
+ Assert.Equal(httpContext.Request.Form.Files["file"], fileArgument);
+ Assert.Equal("file.txt", fileArgument!.FileName);
+ Assert.Equal("file", fileArgument.Name);
- // The httpContext should be untouched.
- Assert.False(httpContext.RequestAborted.IsCancellationRequested);
- Assert.Equal(200, httpContext.Response.StatusCode);
- Assert.False(httpContext.Response.HasStarted);
+ Assert.Equal("my-trace-id", traceIdArgument.Id);
+ }
- // We don't log bad requests when we throw.
- Assert.Empty(TestSink.Writes);
+ private record struct ParameterListRecordStruct(HttpContext HttpContext, [FromRoute] int Value);
- Assert.Equal("Support for binding parameters from an HTTP request's form is not currently supported if the request is associated with a client certificate. Use of an HTTP request form is not currently secure for HTTP requests in scenarios which require authentication.", badHttpRequestException.Message);
- Assert.Equal(400, badHttpRequestException.StatusCode);
+ private record ParameterListRecordClass(HttpContext HttpContext, [FromRoute] int Value);
+
+ private record ParameterListRecordWithoutPositionalParameters
+ {
+ public HttpContext? HttpContext { get; set; }
+
+ [FromRoute]
+ public int Value { get; set; }
+ }
+
+ private struct ParameterListStruct
+ {
+ public HttpContext HttpContext { get; set; }
+
+ [FromRoute]
+ public int Value { get; set; }
+ }
+
+ private struct ParameterListMutableStruct
+ {
+ public ParameterListMutableStruct()
+ {
+ Value = -1;
+ HttpContext = default!;
+ }
+
+ public HttpContext HttpContext { get; set; }
+
+ [FromRoute]
+ public int Value { get; set; }
+ }
+
+ private class ParameterListStructWithParameterizedContructor
+ {
+ public ParameterListStructWithParameterizedContructor(HttpContext httpContext)
+ {
+ HttpContext = httpContext;
+ Value = 42;
+ }
+
+ public HttpContext HttpContext { get; set; }
+
+ public int Value { get; set; }
+ }
+
+ private struct ParameterListStructWithMultipleParameterizedContructor
+ {
+ public ParameterListStructWithMultipleParameterizedContructor(HttpContext httpContext)
+ {
+ HttpContext = httpContext;
+ Value = 10;
+ }
+
+ public ParameterListStructWithMultipleParameterizedContructor(HttpContext httpContext, [FromHeader(Name ="Value")] int value)
+ {
+ HttpContext = httpContext;
+ Value = value;
+ }
+
+ public HttpContext HttpContext { get; set; }
+
+ [FromRoute]
+ public int Value { get; set; }
+ }
+
+ private class ParameterListClass
+ {
+ public HttpContext? HttpContext { get; set; }
+
+ [FromRoute]
+ public int Value { get; set; }
+ }
+
+ private class ParameterListClassWithParameterizedContructor
+ {
+ public ParameterListClassWithParameterizedContructor(HttpContext httpContext)
+ {
+ HttpContext = httpContext;
+ Value = 42;
+ }
+
+ public HttpContext HttpContext { get; set; }
+
+ public int Value { get; set; }
+ }
+
+ public static object[][] FromParameterListActions
+ {
+ get
+ {
+ void TestParameterListRecordStruct([AsParameters] ParameterListRecordStruct args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListRecordClass([AsParameters] ParameterListRecordClass args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListRecordWithoutPositionalParameters([AsParameters] ParameterListRecordWithoutPositionalParameters args)
+ {
+ args.HttpContext!.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListStruct([AsParameters] ParameterListStruct args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListMutableStruct([AsParameters] ParameterListMutableStruct args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListStructWithParameterizedContructor([AsParameters] ParameterListStructWithParameterizedContructor args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListStructWithMultipleParameterizedContructor([AsParameters] ParameterListStructWithMultipleParameterizedContructor args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListClass([AsParameters] ParameterListClass args)
+ {
+ args.HttpContext!.Items.Add("input", args.Value);
+ }
+
+ void TestParameterListClassWithParameterizedContructor([AsParameters] ParameterListClassWithParameterizedContructor args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ return new[]
+ {
+ new object[] { (Action<ParameterListRecordStruct>)TestParameterListRecordStruct },
+ new object[] { (Action<ParameterListRecordClass>)TestParameterListRecordClass },
+ new object[] { (Action<ParameterListRecordWithoutPositionalParameters>)TestParameterListRecordWithoutPositionalParameters },
+ new object[] { (Action<ParameterListStruct>)TestParameterListStruct },
+ new object[] { (Action<ParameterListMutableStruct>)TestParameterListMutableStruct },
+ new object[] { (Action<ParameterListStructWithParameterizedContructor>)TestParameterListStructWithParameterizedContructor },
+ new object[] { (Action<ParameterListStructWithMultipleParameterizedContructor>)TestParameterListStructWithMultipleParameterizedContructor },
+ new object[] { (Action<ParameterListClass>)TestParameterListClass },
+ new object[] { (Action<ParameterListClassWithParameterizedContructor>)TestParameterListClassWithParameterizedContructor },
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(FromParameterListActions))]
+ public async Task RequestDelegatePopulatesFromParameterList(Delegate action)
+ {
+ const string paramName = "value";
+ const int originalRouteParam = 42;
+
+ var httpContext = CreateHttpContext();
+ httpContext.Request.RouteValues[paramName] = originalRouteParam.ToString(NumberFormatInfo.InvariantInfo);
+
+ var factoryResult = RequestDelegateFactory.Create(action);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(originalRouteParam, httpContext.Items["input"]);
+ }
+
+ public static object[][] NullableFromParameterListActions
+ {
+ get
+ {
+ void TestParameterListRecordStruct([AsParameters] ParameterListRecordStruct? args)
+ { }
+
+ void TestParameterListRecordClass([AsParameters] ParameterListRecordClass? args)
+ { }
+
+ void TestParameterListStruct([AsParameters] ParameterListStruct? args)
+ { }
+
+ void TestParameterListClass([AsParameters] ParameterListClass? args)
+ { }
+
+ return new[]
+ {
+ new object[] { (Action<ParameterListRecordStruct?>)TestParameterListRecordStruct },
+ new object[] { (Action<ParameterListRecordClass?>)TestParameterListRecordClass },
+ new object[] { (Action<ParameterListStruct?>)TestParameterListStruct },
+ new object[] { (Action<ParameterListClass?>)TestParameterListClass },
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(NullableFromParameterListActions))]
+ public void RequestDelegateThrowsWhenNullableParameterList(Delegate action)
+ {
+ var parameter = action.Method.GetParameters()[0];
+ var httpContext = CreateHttpContext();
+
+ var exception = Assert.Throws<InvalidOperationException>(() => RequestDelegateFactory.Create(action));
+ Assert.Contains($"The nullable type '{TypeNameHelper.GetTypeDisplayName(parameter.ParameterType, fullName: false)}' is not supported, mark the parameter as non-nullable.", exception.Message);
+ }
+
+ private record struct SampleParameterList(int Foo);
+ private record struct AdditionalSampleParameterList(int Bar);
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromMultipleParameterLists()
+ {
+ const int foo = 1;
+ const int bar = 2;
+
+ void TestAction(HttpContext context, [AsParameters] SampleParameterList args, [AsParameters] AdditionalSampleParameterList args2)
+ {
+ context.Items.Add("foo", args.Foo);
+ context.Items.Add("bar", args2.Bar);
+ }
+
+ var httpContext = CreateHttpContext();
+ httpContext.Request.RouteValues[nameof(SampleParameterList.Foo)] = foo.ToString(NumberFormatInfo.InvariantInfo);
+ httpContext.Request.RouteValues[nameof(AdditionalSampleParameterList.Bar)] = bar.ToString(NumberFormatInfo.InvariantInfo);
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(foo, httpContext.Items["foo"]);
+ Assert.Equal(bar, httpContext.Items["bar"]);
+ }
+
+ [Fact]
+ public void RequestDelegateThrowsWhenParameterNameConflicts()
+ {
+ void TestAction(HttpContext context, [AsParameters] SampleParameterList args, [AsParameters] SampleParameterList args2)
+ {
+ context.Items.Add("foo", args.Foo);
+ }
+ var httpContext = CreateHttpContext();
+
+ var exception = Assert.Throws<ArgumentException>(() => RequestDelegateFactory.Create(TestAction));
+ Assert.Contains("An item with the same key has already been added. Key: Foo", exception.Message);
+ }
+
+ private class ParameterListWithReadOnlyProperties
+ {
+ public ParameterListWithReadOnlyProperties()
+ {
+ ReadOnlyValue = 1;
+ }
+
+ public int Value { get; set; }
+
+ public int ConstantValue => 1;
+
+ public int ReadOnlyValue { get; }
+ }
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromParameterListAndSkipReadOnlyProperties()
+ {
+ const int routeParamValue = 42;
+ var expectedInput = new ParameterListWithReadOnlyProperties() { Value = routeParamValue };
+
+ void TestAction(HttpContext context, [AsParameters] ParameterListWithReadOnlyProperties args)
+ {
+ context.Items.Add("input", args);
+ }
+
+ var httpContext = CreateHttpContext();
+ httpContext.Request.RouteValues[nameof(ParameterListWithReadOnlyProperties.Value)] = routeParamValue.ToString(NumberFormatInfo.InvariantInfo);
+ httpContext.Request.RouteValues[nameof(ParameterListWithReadOnlyProperties.ConstantValue)] = routeParamValue.ToString(NumberFormatInfo.InvariantInfo);
+ httpContext.Request.RouteValues[nameof(ParameterListWithReadOnlyProperties.ReadOnlyValue)] = routeParamValue.ToString(NumberFormatInfo.InvariantInfo);
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ var input = Assert.IsType<ParameterListWithReadOnlyProperties>(httpContext.Items["input"]);
+ Assert.Equal(expectedInput.Value, input.Value);
+ Assert.Equal(expectedInput.ConstantValue, input.ConstantValue);
+ Assert.Equal(expectedInput.ReadOnlyValue, input.ReadOnlyValue);
+ }
+
+ private record ParameterListRecordWitDefaultValue(HttpContext HttpContext, [FromRoute] int Value = 42);
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromParameterListRecordUsesDefaultValue()
+ {
+ const int expectedValue = 42;
+
+ void TestAction([AsParameters] ParameterListRecordWitDefaultValue args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(expectedValue, httpContext.Items["input"]);
+ }
+
+ private class ParameterListWitDefaultValue
+ {
+ public ParameterListWitDefaultValue(HttpContext httpContext, [FromRoute]int value = 42)
+ {
+ HttpContext = httpContext;
+ Value = value;
+ }
+
+ public HttpContext HttpContext { get; }
+ public int Value { get; }
+ }
+
+ [Fact]
+ public async Task RequestDelegatePopulatesFromParameterListUsesDefaultValue()
+ {
+ const int expectedValue = 42;
+
+ void TestAction([AsParameters] ParameterListWitDefaultValue args)
+ {
+ args.HttpContext.Items.Add("input", args.Value);
+ }
+
+ var httpContext = CreateHttpContext();
+
+ var factoryResult = RequestDelegateFactory.Create(TestAction);
+ var requestDelegate = factoryResult.RequestDelegate;
+
+ await requestDelegate(httpContext);
+
+ Assert.Equal(expectedValue, httpContext.Items["input"]);
}
[Fact]
@@ -4234,11 +5164,11 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
- context.Parameters[0] = context.Parameters[0] != null ? $"{((string)context.Parameters[0]!)}Prefix" : "NULL";
+ context.Arguments[0] = context.Arguments[0] != null ? $"{((string)context.Arguments[0]!)}Prefix" : "NULL";
return await next(context);
}
}
@@ -4266,7 +5196,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create((string name) => $"Hello, {name}!", new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
@@ -4278,7 +5208,7 @@ public class RequestDelegateFactoryTests : LoggedTest
await requestDelegate(httpContext);
// Assert
-
+
Assert.Equal(200, httpContext.Response.StatusCode);
var decodedResponseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
Assert.Equal("Hello, TestName!", decodedResponseBody);
@@ -4308,7 +5238,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(methodInfo!, null, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
@@ -4351,7 +5281,7 @@ public class RequestDelegateFactoryTests : LoggedTest
};
var factoryResult = RequestDelegateFactory.Create(methodInfo!, targetFactory, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
@@ -4388,7 +5318,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>() {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>() {
(routeHandlerContext, next) => async (context) =>
{
if (context.HttpContext.Response.StatusCode == 400)
@@ -4434,16 +5364,16 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
- context.Parameters[1] = ((int)context.Parameters[1]!) + 2;
+ context.Arguments[1] = ((int)context.Arguments[1]!) + 2;
return await next(context);
},
(routeHandlerContext, next) => async (context) =>
{
- foreach (var parameter in context.Parameters)
+ foreach (var parameter in context.Arguments)
{
Log(parameter!.ToString() ?? "no arg");
}
@@ -4482,7 +5412,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) =>
{
@@ -4492,7 +5422,7 @@ public class RequestDelegateFactoryTests : LoggedTest
{
if (isInt)
{
- context.Parameters[1] = ((int)context.Parameters[1]!) + 2;
+ context.Arguments[1] = ((int)context.Arguments[1]!) + 2;
return await next(context);
}
return "Is not an int.";
@@ -4537,7 +5467,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) =>
{
@@ -4588,13 +5518,13 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(PrintTodo, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
- Todo originalTodo = (Todo)context.Parameters[0]!;
+ Todo originalTodo = (Todo)context.Arguments[0]!;
originalTodo!.IsComplete = !originalTodo.IsComplete;
- context.Parameters[0] = originalTodo;
+ context.Arguments[0] = originalTodo;
return await next(context);
}
}
@@ -4629,7 +5559,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
@@ -4672,7 +5602,7 @@ public class RequestDelegateFactoryTests : LoggedTest
// Act
var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
{
- RouteHandlerFilterFactories = new List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>>()
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
{
(routeHandlerContext, next) => async (context) =>
{
@@ -4685,7 +5615,8 @@ public class RequestDelegateFactoryTests : LoggedTest
},
(RouteHandlerContext, next) => async (context) =>
{
- context.Parameters[0] = context.Parameters[0] != null ? $"{((string)context.Parameters[0]!)}Prefix" : "NULL";
+ var newValue = $"{context.GetArgument<string>(0)}Prefix";
+ context.Arguments[0] = newValue;
return await next(context);
}
}
@@ -4698,62 +5629,399 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.Equal("HELLO, TESTNAMEPREFIX!", responseBody);
}
+ public static object[][] TaskOfTMethods
+ {
+ get
+ {
+ Task<string> TaskOfTMethod()
+ {
+ return Task.FromResult("foo");
+ }
+
+ async Task<string> TaskOfTWithYieldMethod()
+ {
+ await Task.Yield();
+ return "foo";
+ }
+
+ async Task<object> TaskOfObjectWithYieldMethod()
+ {
+ await Task.Yield();
+ return "foo";
+ }
+
+ return new object[][]
+ {
+ new object[] { (Func<Task<string>>)TaskOfTMethod },
+ new object[] { (Func<Task<string>>)TaskOfTWithYieldMethod },
+ new object[] { (Func<Task<object>>)TaskOfObjectWithYieldMethod }
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(TaskOfTMethods))]
+ public async Task CanInvokeFilter_OnTaskOfTReturningHandler(Delegate @delegate)
+ {
+ // Arrange
+ var responseBodyStream = new MemoryStream();
+ var httpContext = CreateHttpContext();
+ httpContext.Response.Body = responseBodyStream;
+
+ // Act
+ var factoryResult = RequestDelegateFactory.Create(@delegate, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ return await next(context);
+ }
+ }
+ });
+ var requestDelegate = factoryResult.RequestDelegate;
+ await requestDelegate(httpContext);
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ var decodedResponseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
+ Assert.Equal("foo", decodedResponseBody);
+ }
+
+ public static object[][] ValueTaskOfTMethods
+ {
+ get
+ {
+ ValueTask<string> ValueTaskOfTMethod()
+ {
+ return ValueTask.FromResult("foo");
+ }
+
+ async ValueTask<string> ValueTaskOfTWithYieldMethod()
+ {
+ await Task.Yield();
+ return "foo";
+ }
+
+ async ValueTask<object> ValueTaskOfObjectWithYield()
+ {
+ await Task.Yield();
+ return "foo";
+ }
+
+ return new object[][]
+ {
+ new object[] { (Func<ValueTask<string>>)ValueTaskOfTMethod },
+ new object[] { (Func<ValueTask<string>>)ValueTaskOfTWithYieldMethod },
+ new object[] { (Func<ValueTask<object>>)ValueTaskOfObjectWithYield }
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(ValueTaskOfTMethods))]
+ public async Task CanInvokeFilter_OnValueTaskOfTReturningHandler(Delegate @delegate)
+ {
+ // Arrange
+ var responseBodyStream = new MemoryStream();
+ var httpContext = CreateHttpContext();
+ httpContext.Response.Body = responseBodyStream;
+
+ // Act
+ var factoryResult = RequestDelegateFactory.Create(@delegate, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ return await next(context);
+ }
+ }
+ });
+ var requestDelegate = factoryResult.RequestDelegate;
+ await requestDelegate(httpContext);
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ var decodedResponseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
+ Assert.Equal("foo", decodedResponseBody);
+ }
+
+ public static object[][] VoidReturningMethods
+ {
+ get
+ {
+ void VoidMethod() { }
+
+ ValueTask ValueTaskMethod()
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ Task TaskMethod()
+ {
+ return Task.CompletedTask;
+ }
+
+ async ValueTask ValueTaskWithYieldMethod()
+ {
+ await Task.Yield();
+ }
+
+ async Task TaskWithYieldMethod()
+ {
+ await Task.Yield();
+ }
+
+ return new object[][]
+ {
+ new object[] { (Action)VoidMethod },
+ new object[] { (Func<ValueTask>)ValueTaskMethod },
+ new object[] { (Func<Task>)TaskMethod },
+ new object[] { (Func<ValueTask>)ValueTaskWithYieldMethod },
+ new object[] { (Func<Task>)TaskWithYieldMethod}
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(VoidReturningMethods))]
+ public async Task CanInvokeFilter_OnVoidReturningHandler(Delegate @delegate)
+ {
+ // Arrange
+ var responseBodyStream = new MemoryStream();
+ var httpContext = CreateHttpContext();
+ httpContext.Response.Body = responseBodyStream;
+
+ // Act
+ var factoryResult = RequestDelegateFactory.Create(@delegate, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ return await next(context);
+ }
+ }
+ });
+ var requestDelegate = factoryResult.RequestDelegate;
+ await requestDelegate(httpContext);
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ var decodedResponseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
+ Assert.Equal(String.Empty, decodedResponseBody);
+ }
+
[Fact]
- public void Create_AddsDelegateMethodInfo_AsMetadata()
+ public async Task CanInvokeFilter_OnTaskModifyingHttpContext()
{
// Arrange
- var @delegate = () => "Hello";
+ var tcs = new TaskCompletionSource();
+ async Task HandlerWithTaskAwait(HttpContext c)
+ {
+ await tcs.Task;
+ await Task.Yield();
+ c.Response.StatusCode = 400;
+ };
+ var responseBodyStream = new MemoryStream();
+ var httpContext = CreateHttpContext();
+ httpContext.Response.Body = responseBodyStream;
// Act
- var result = RequestDelegateFactory.Create(@delegate);
+ var factoryResult = RequestDelegateFactory.Create(HandlerWithTaskAwait, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ return await next(context);
+ }
+ }
+ });
- // Assert
- Assert.Contains(result.EndpointMetadata, m => m is MethodInfo);
+ var requestDelegate = factoryResult.RequestDelegate;
+ var request = requestDelegate(httpContext);
+ tcs.TrySetResult();
+ await request;
+
+ Assert.Equal(400, httpContext.Response.StatusCode);
+ var decodedResponseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
+ Assert.Equal(string.Empty, decodedResponseBody);
+ }
+
+ public static object[][] TasksOfTypesMethods
+ {
+ get
+ {
+ ValueTask<TodoStruct> ValueTaskOfStructMethod()
+ {
+ return ValueTask.FromResult(new TodoStruct { Name = "Test todo"});
+ }
+
+ async ValueTask<TodoStruct> ValueTaskOfStructWithYieldMethod()
+ {
+ await Task.Yield();
+ return new TodoStruct { Name = "Test todo" };
+ }
+
+ Task<TodoStruct> TaskOfStructMethod()
+ {
+ return Task.FromResult(new TodoStruct { Name = "Test todo" });
+ }
+
+ async Task<TodoStruct> TaskOfStructWithYieldMethod()
+ {
+ await Task.Yield();
+ return new TodoStruct { Name = "Test todo" };
+ }
+
+ return new object[][]
+ {
+ new object[] { (Func<ValueTask<TodoStruct>>)ValueTaskOfStructMethod },
+ new object[] { (Func<ValueTask<TodoStruct>>)ValueTaskOfStructWithYieldMethod },
+ new object[] { (Func<Task<TodoStruct>>)TaskOfStructMethod },
+ new object[] { (Func<Task<TodoStruct>>)TaskOfStructWithYieldMethod }
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(TasksOfTypesMethods))]
+ public async Task CanInvokeFilter_OnHandlerReturningTasksOfStruct(Delegate @delegate)
+ {
+ // Arrange
+ var responseBodyStream = new MemoryStream();
+ var httpContext = CreateHttpContext();
+ httpContext.Response.Body = responseBodyStream;
+
+ // Act
+ var factoryResult = RequestDelegateFactory.Create(@delegate, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ return await next(context);
+ }
+ }
+ });
+ var requestDelegate = factoryResult.RequestDelegate;
+ await requestDelegate(httpContext);
+
+ Assert.Equal(200, httpContext.Response.StatusCode);
+ var deserializedResponseBody = JsonSerializer.Deserialize<TodoStruct>(responseBodyStream.ToArray(), new JsonSerializerOptions
+ {
+ PropertyNameCaseInsensitive = true
+ });
+ Assert.Equal("Test todo", deserializedResponseBody.Name);
}
[Fact]
- public void Create_AddsDelegateMethodInfo_AsFirstMetadata()
+ public async Task RequestDelegateFactory_CanApplyFiltersOnHandlerWithManyArguments()
{
// Arrange
- var @delegate = (AddsCustomParameterMetadata param1) => "Hello";
- var customMetadata = new CustomEndpointMetadata();
- var options = new RequestDelegateFactoryOptions { InitialEndpointMetadata = new[] { customMetadata } };
+ string HelloName(int? one, string? two, int? three, string? four, int? five, bool? six, string? seven, string? eight, int? nine, string? ten, int? eleven)
+ {
+ return "Too many arguments!";
+ };
+
+ var httpContext = CreateHttpContext();
+
+ var responseBodyStream = new MemoryStream();
+ httpContext.Response.Body = responseBodyStream;
// Act
- var result = RequestDelegateFactory.Create(@delegate, options);
+ var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ Assert.IsType<DefaultEndpointFilterInvocationContext>(context);
+ Assert.Equal(11, context.Arguments.Count);
+ return await next(context);
+ }
+ }
+ });
+ var requestDelegate = factoryResult.RequestDelegate;
+ await requestDelegate(httpContext);
+ }
- // Assert
- var firstMetadata = result.EndpointMetadata[0];
- Assert.IsAssignableFrom<MethodInfo>(firstMetadata);
+ [Fact]
+ public async Task RequestDelegateFactory_CanApplyFiltersOnHandlerWithNoArguments()
+ {
+ // Arrange
+ string HelloName()
+ {
+ return "No arguments!";
+ };
+
+ var httpContext = CreateHttpContext();
+
+ var responseBodyStream = new MemoryStream();
+ httpContext.Response.Body = responseBodyStream;
+
+ // Act
+ var factoryResult = RequestDelegateFactory.Create(HelloName, new RequestDelegateFactoryOptions()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) => async (context) =>
+ {
+ Assert.IsType<DefaultEndpointFilterInvocationContext>(context);
+ Assert.Equal(0, context.Arguments.Count);
+ return await next(context);
+ }
+ }
+ });
+ var requestDelegate = factoryResult.RequestDelegate;
+ await requestDelegate(httpContext);
}
[Fact]
- public void Create_AddsDelegateAttributes_AsMetadata()
+ public void Create_DoesNotAddDelegateMethodInfo_AsMetadata()
{
// Arrange
- var @delegate = [Attribute1, Attribute2] () => { };
+ var @delegate = () => "Hello";
// Act
var result = RequestDelegateFactory.Create(@delegate);
// Assert
- Assert.Contains(result.EndpointMetadata, m => m is Attribute1);
- Assert.Contains(result.EndpointMetadata, m => m is Attribute2);
+ // RouteHandlerEndpointDataSource adds the MethodInfo as the first item in RouteHandlerOptions.EndointMetadata
+ Assert.Empty(result.EndpointMetadata);
}
[Fact]
- public void Create_AddsDelegateAttributes_AsLastMetadata()
+ public void Create_DoesNotAddAnythingBefore_ThePassedInEndpointMetadata()
{
// Arrange
- var @delegate = [Attribute1] (AddsCustomParameterMetadata param1) => { };
- var options = new RequestDelegateFactoryOptions { InitialEndpointMetadata = new[] { new CustomEndpointMetadata() } };
+ var @delegate = (AddsCustomParameterMetadataBindable param1) => { };
+ var customMetadata = new CustomEndpointMetadata();
+ var options = new RequestDelegateFactoryOptions { EndpointMetadata = new List<object> { customMetadata } };
// Act
var result = RequestDelegateFactory.Create(@delegate, options);
// Assert
- var lastMetadata = result.EndpointMetadata.Last();
- Assert.IsAssignableFrom<Attribute1>(lastMetadata);
+ // RouteHandlerEndpointDataSource adds things like the MethodInfo, HttpMethodMetadata and attributes to RouteHandlerOptions.EndointMetadata,
+ // but we just specified our CustomEndpointMetadata in this test.
+ Assert.Collection(result.EndpointMetadata,
+ m => Assert.Same(customMetadata, m),
+ m => Assert.True(m is ParameterNameMetadata { Name: "param1" }),
+ m => Assert.True(m is CustomEndpointMetadata { Source: MetadataSource.Parameter }));
+ }
+
+ [Fact]
+ public void Create_DoesNotAddDelegateAttributes_AsMetadata()
+ {
+ // Arrange
+ var @delegate = [Attribute1, Attribute2] () => { };
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate);
+
+ // Assert
+ // RouteHandlerEndpointDataSource adds the attributes to RouteHandlerOptions.EndointMetadata
+ Assert.Empty(result.EndpointMetadata);
}
[Fact]
@@ -4797,13 +6065,39 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public void Create_DiscoversEndpointMetadata_FromTaskWrappedReturnTypeImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var @delegate = () => Task.FromResult(new AddsCustomEndpointMetadataResult());
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate);
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.ReturnType });
+ }
+
+ [Fact]
+ public void Create_DiscoversEndpointMetadata_FromValueTaskWrappedReturnTypeImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var @delegate = () => ValueTask.FromResult(new AddsCustomEndpointMetadataResult());
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate);
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.ReturnType });
+ }
+
+ [Fact]
public void Create_CombinesDefaultMetadata_AndMetadataFromReturnTypesImplementingIEndpointMetadataProvider()
{
// Arrange
var @delegate = () => new CountsDefaultEndpointMetadataResult();
var options = new RequestDelegateFactoryOptions
{
- InitialEndpointMetadata = new List<object>
+ EndpointMetadata = new List<object>
{
new CustomEndpointMetadata { Source = MetadataSource.Caller }
}
@@ -4814,8 +6108,52 @@ public class RequestDelegateFactoryTests : LoggedTest
// Assert
Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Caller });
- // Expecting '2' as only MethodInfo and initial metadata will be in the metadata list when this metadata item is added
- Assert.Contains(result.EndpointMetadata, m => m is DefaultMetadataCountMetadata { Count: 2 });
+ // Expecting '1' because only initial metadata will be in the metadata list when this metadata item is added
+ Assert.Contains(result.EndpointMetadata, m => m is DefaultMetadataCountMetadata { Count: 1 });
+ }
+
+ [Fact]
+ public void Create_CombinesDefaultMetadata_AndMetadataFromTaskWrappedReturnTypesImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var @delegate = () => Task.FromResult(new CountsDefaultEndpointMetadataResult());
+ var options = new RequestDelegateFactoryOptions
+ {
+ EndpointMetadata = new List<object>
+ {
+ new CustomEndpointMetadata { Source = MetadataSource.Caller }
+ }
+ };
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate, options);
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Caller });
+ // Expecting '1' because only initial metadata will be in the metadata list when this metadata item is added
+ Assert.Contains(result.EndpointMetadata, m => m is DefaultMetadataCountMetadata { Count: 1 });
+ }
+
+ [Fact]
+ public void Create_CombinesDefaultMetadata_AndMetadataFromValueTaskWrappedReturnTypesImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var @delegate = () => ValueTask.FromResult(new CountsDefaultEndpointMetadataResult());
+ var options = new RequestDelegateFactoryOptions
+ {
+ EndpointMetadata = new List<object>
+ {
+ new CustomEndpointMetadata { Source = MetadataSource.Caller }
+ }
+ };
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate, options);
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Caller });
+ // Expecting '1' because only initial metadata will be in the metadata list when this metadata item is added
+ Assert.Contains(result.EndpointMetadata, m => m is DefaultMetadataCountMetadata { Count: 1 });
}
[Fact]
@@ -4825,7 +6163,7 @@ public class RequestDelegateFactoryTests : LoggedTest
var @delegate = (AddsCustomParameterMetadata param1) => "Hello";
var options = new RequestDelegateFactoryOptions
{
- InitialEndpointMetadata = new List<object>
+ EndpointMetadata = new List<object>
{
new CustomEndpointMetadata { Source = MetadataSource.Caller }
}
@@ -4846,7 +6184,7 @@ public class RequestDelegateFactoryTests : LoggedTest
var @delegate = (AddsCustomParameterMetadata param1) => "Hello";
var options = new RequestDelegateFactoryOptions
{
- InitialEndpointMetadata = new List<object>
+ EndpointMetadata = new List<object>
{
new CustomEndpointMetadata { Source = MetadataSource.Caller }
}
@@ -4861,13 +6199,36 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public void Create_CombinesPropertiesAsParameterMetadata_AndTopLevelParameter()
+ {
+ // Arrange
+ var @delegate = ([AsParameters] AddsCustomParameterMetadata param1) => new CountsDefaultEndpointMetadataResult();
+ var options = new RequestDelegateFactoryOptions
+ {
+ EndpointMetadata = new List<object>
+ {
+ new CustomEndpointMetadata { Source = MetadataSource.Caller }
+ }
+ };
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate, options);
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Parameter });
+ Assert.Contains(result.EndpointMetadata, m => m is ParameterNameMetadata { Name: "param1" });
+ Assert.Contains(result.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Property });
+ Assert.Contains(result.EndpointMetadata, m => m is ParameterNameMetadata { Name: nameof(AddsCustomParameterMetadata.Data) });
+ }
+
+ [Fact]
public void Create_CombinesAllMetadata_InCorrectOrder()
{
// Arrange
var @delegate = [Attribute1, Attribute2] (AddsCustomParameterMetadata param1) => new CountsDefaultEndpointMetadataResult();
var options = new RequestDelegateFactoryOptions
{
- InitialEndpointMetadata = new List<object>
+ EndpointMetadata = new List<object>
{
new CustomEndpointMetadata { Source = MetadataSource.Caller }
}
@@ -4878,22 +6239,16 @@ public class RequestDelegateFactoryTests : LoggedTest
// Assert
Assert.Collection(result.EndpointMetadata,
- // MethodInfo
- m => Assert.IsAssignableFrom<MethodInfo>(m),
- // Initial metadata from RequestDelegateFactoryOptions.InitialEndpointMetadata
- m => Assert.True(m is CustomEndpointMetadata { Source: MetadataSource.Caller }),
// Inferred AcceptsMetadata from RDF for complex type
m => Assert.True(m is AcceptsMetadata am && am.RequestType == typeof(AddsCustomParameterMetadata)),
+ // Initial metadata from RequestDelegateFactoryOptions.InitialEndpointMetadata
+ m => Assert.True(m is CustomEndpointMetadata { Source: MetadataSource.Caller }),
// Metadata provided by parameters implementing IEndpointParameterMetadataProvider
m => Assert.True(m is ParameterNameMetadata { Name: "param1" }),
// Metadata provided by parameters implementing IEndpointMetadataProvider
m => Assert.True(m is CustomEndpointMetadata { Source: MetadataSource.Parameter }),
// Metadata provided by return type implementing IEndpointMetadataProvider
- m => Assert.True(m is DefaultMetadataCountMetadata { Count: 5 }),
- // Handler delegate attributes
- m => Assert.IsAssignableFrom<Attribute>(m), // NullableContextAttribute
- m => Assert.IsType<Attribute1>(m),
- m => Assert.IsType<Attribute2>(m));
+ m => Assert.True(m is DefaultMetadataCountMetadata { Count: 4 }));
}
[Fact]
@@ -4910,6 +6265,32 @@ public class RequestDelegateFactoryTests : LoggedTest
}
[Fact]
+ public void Create_AllowsRemovalOfDefaultMetadata_ByTaskWrappedReturnTypesImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var @delegate = (Todo todo) => Task.FromResult(new RemovesAcceptsMetadataResult());
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate);
+
+ // Assert
+ Assert.DoesNotContain(result.EndpointMetadata, m => m is IAcceptsMetadata);
+ }
+
+ [Fact]
+ public void Create_AllowsRemovalOfDefaultMetadata_ByValueTaskWrappedReturnTypesImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var @delegate = (Todo todo) => ValueTask.FromResult(new RemovesAcceptsMetadataResult());
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate);
+
+ // Assert
+ Assert.DoesNotContain(result.EndpointMetadata, m => m is IAcceptsMetadata);
+ }
+
+ [Fact]
public void Create_AllowsRemovalOfDefaultMetadata_ByParameterTypesImplementingIEndpointParameterMetadataProvider()
{
// Arrange
@@ -4936,6 +6317,67 @@ public class RequestDelegateFactoryTests : LoggedTest
Assert.DoesNotContain(result.EndpointMetadata, m => m is IAcceptsMetadata);
}
+ [Fact]
+ public void Create_SetsApplicationServices_OnEndpointMetadataContext()
+ {
+ // Arrange
+ var @delegate = (Todo todo) => new AccessesServicesMetadataResult();
+ var metadataService = new MetadataService();
+ var serviceProvider = new ServiceCollection().AddSingleton(metadataService).BuildServiceProvider();
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate, new() { ServiceProvider = serviceProvider });
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is MetadataService);
+ }
+
+ [Fact]
+ public void Create_SetsApplicationServices_OnEndpointParameterMetadataContext()
+ {
+ // Arrange
+ var @delegate = (AccessesServicesMetadataBinder parameter1) => "Test";
+ var metadataService = new MetadataService();
+ var serviceProvider = new ServiceCollection().AddSingleton(metadataService).BuildServiceProvider();
+
+ // Act
+ var result = RequestDelegateFactory.Create(@delegate, new() { ServiceProvider = serviceProvider });
+
+ // Assert
+ Assert.Contains(result.EndpointMetadata, m => m is MetadataService);
+ }
+
+ [Fact]
+ public void Create_ReturnsSameRequestDelegatePassedIn_IfNotModifiedByFilters()
+ {
+ RequestDelegate initialRequestDelegate = static (context) => Task.CompletedTask;
+ var filter1Tag = new TagsAttribute("filter1");
+ var filter2Tag = new TagsAttribute("filter2");
+
+ RequestDelegateFactoryOptions options = new()
+ {
+ EndpointFilterFactories = new List<Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate>>()
+ {
+ (routeHandlerContext, next) =>
+ {
+ routeHandlerContext.EndpointMetadata.Add(filter1Tag);
+ return next;
+ },
+ (routeHandlerContext, next) =>
+ {
+ routeHandlerContext.EndpointMetadata.Add(filter2Tag);
+ return next;
+ },
+ }
+ };
+
+ var result = RequestDelegateFactory.Create(initialRequestDelegate, options);
+ Assert.Same(initialRequestDelegate, result.RequestDelegate);
+ Assert.Collection(result.EndpointMetadata,
+ m => Assert.Same(filter2Tag, m),
+ m => Assert.Same(filter1Tag, m));
+ }
+
private DefaultHttpContext CreateHttpContext()
{
var responseFeature = new TestHttpResponseFeature();
@@ -4952,6 +6394,35 @@ public class RequestDelegateFactoryTests : LoggedTest
};
}
+ private record MetadataService;
+
+ private class AccessesServicesMetadataResult : IResult, IEndpointMetadataProvider
+ {
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ if (context.ApplicationServices?.GetRequiredService<MetadataService>() is { } metadataService)
+ {
+ context.EndpointMetadata.Add(metadataService);
+ }
+ }
+
+ public Task ExecuteAsync(HttpContext httpContext) => Task.CompletedTask;
+ }
+
+ private class AccessesServicesMetadataBinder : IEndpointMetadataProvider
+ {
+ public static ValueTask<AccessesServicesMetadataBinder> BindAsync(HttpContext context, ParameterInfo parameter) =>
+ new(new AccessesServicesMetadataBinder());
+
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ if (context.ApplicationServices?.GetRequiredService<MetadataService>() is { } metadataService)
+ {
+ context.EndpointMetadata.Add(metadataService);
+ }
+ }
+ }
+
private class Attribute1 : Attribute
{
}
@@ -5047,8 +6518,23 @@ public class RequestDelegateFactoryTests : LoggedTest
public Task ExecuteAsync(HttpContext httpContext) => throw new NotImplementedException();
}
+ private class AddsCustomParameterMetadataAsProperty : IEndpointParameterMetadataProvider, IEndpointMetadataProvider
+ {
+ public static void PopulateMetadata(EndpointParameterMetadataContext parameterContext)
+ {
+ parameterContext.EndpointMetadata?.Add(new ParameterNameMetadata { Name = parameterContext.Parameter?.Name });
+ }
+
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata?.Add(new CustomEndpointMetadata { Source = MetadataSource.Property });
+ }
+ }
+
private class AddsCustomParameterMetadata : IEndpointParameterMetadataProvider, IEndpointMetadataProvider
{
+ public AddsCustomParameterMetadataAsProperty? Data { get; set; }
+
public static void PopulateMetadata(EndpointParameterMetadataContext parameterContext)
{
parameterContext.EndpointMetadata?.Add(new ParameterNameMetadata { Name = parameterContext.Parameter?.Name });
@@ -5096,7 +6582,8 @@ public class RequestDelegateFactoryTests : LoggedTest
{
Caller,
Parameter,
- ReturnType
+ ReturnType,
+ Property
}
private class Todo : ITodo
diff --git a/src/Http/Http.Features/src/CookieOptions.cs b/src/Http/Http.Features/src/CookieOptions.cs
index fb5e80f26d..8314f349ec 100644
--- a/src/Http/Http.Features/src/CookieOptions.cs
+++ b/src/Http/Http.Features/src/CookieOptions.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.Net.Http.Headers;
+
namespace Microsoft.AspNetCore.Http;
/// <summary>
@@ -8,6 +10,8 @@ namespace Microsoft.AspNetCore.Http;
/// </summary>
public class CookieOptions
{
+ private List<string>? _extensions;
+
/// <summary>
/// Creates a default cookie with a path of '/'.
/// </summary>
@@ -17,6 +21,28 @@ public class CookieOptions
}
/// <summary>
+ /// Creates a copy of the given <see cref="CookieOptions"/>.
+ /// </summary>
+ public CookieOptions(CookieOptions options)
+ {
+ ArgumentNullException.ThrowIfNull(options);
+
+ Domain = options.Domain;
+ Path = options.Path;
+ Expires = options.Expires;
+ Secure = options.Secure;
+ SameSite = options.SameSite;
+ HttpOnly = options.HttpOnly;
+ MaxAge = options.MaxAge;
+ IsEssential = options.IsEssential;
+
+ if (options._extensions?.Count > 0)
+ {
+ _extensions = new List<string>(options._extensions);
+ }
+ }
+
+ /// <summary>
/// Gets or sets the domain to associate the cookie with.
/// </summary>
/// <returns>The domain to associate the cookie with.</returns>
@@ -63,4 +89,39 @@ public class CookieOptions
/// consent policy checks may be bypassed. The default value is false.
/// </summary>
public bool IsEssential { get; set; }
+
+ /// <summary>
+ /// Gets a collection of additional values to append to the cookie.
+ /// </summary>
+ public IList<string> Extensions
+ {
+ get => _extensions ??= new List<string>();
+ }
+
+ /// <summary>
+ /// Creates a <see cref="SetCookieHeaderValue"/> using the current options.
+ /// </summary>
+ public SetCookieHeaderValue CreateCookieHeader(string name, string value)
+ {
+ var cookie = new SetCookieHeaderValue(name, value)
+ {
+ Domain = Domain,
+ Path = Path,
+ Expires = Expires,
+ Secure = Secure,
+ HttpOnly = HttpOnly,
+ MaxAge = MaxAge,
+ SameSite = (Net.Http.Headers.SameSiteMode)SameSite,
+ };
+
+ if (_extensions?.Count > 0)
+ {
+ foreach (var extension in _extensions)
+ {
+ cookie.Extensions.Add(extension);
+ }
+ }
+
+ return cookie;
+ }
}
diff --git a/src/Http/Http.Features/src/IHttpExtendedConnectFeature.cs b/src/Http/Http.Features/src/IHttpExtendedConnectFeature.cs
new file mode 100644
index 0000000000..ced105a603
--- /dev/null
+++ b/src/Http/Http.Features/src/IHttpExtendedConnectFeature.cs
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+
+namespace Microsoft.AspNetCore.Http.Features;
+
+/// <summary>
+/// Used with protocols that require the Extended CONNECT handshake such as HTTP/2 WebSockets and WebTransport.
+/// https://www.rfc-editor.org/rfc/rfc8441#section-4
+/// </summary>
+public interface IHttpExtendedConnectFeature
+{
+ /// <summary>
+ /// Indicates if the current request is a Extended CONNECT request that can be transitioned to an opaque connection via AcceptAsync.
+ /// </summary>
+ [MemberNotNullWhen(true, nameof(Protocol))]
+ bool IsExtendedConnect { get; }
+
+ /// <summary>
+ /// The <c>:protocol</c> header included in the request.
+ /// </summary>
+ string? Protocol { get; }
+
+ /// <summary>
+ /// Send the response headers with a 200 status code and transition to opaque streaming.
+ /// </summary>
+ /// <returns>An opaque bidirectional stream.</returns>
+ ValueTask<Stream> AcceptAsync();
+}
diff --git a/src/Http/Http.Features/src/IHttpWebTransportFeature.cs b/src/Http/Http.Features/src/IHttpWebTransportFeature.cs
new file mode 100644
index 0000000000..4dd69ad495
--- /dev/null
+++ b/src/Http/Http.Features/src/IHttpWebTransportFeature.cs
@@ -0,0 +1,25 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Runtime.Versioning;
+
+namespace Microsoft.AspNetCore.Http.Features;
+
+/// <summary>
+/// API for accepting and retrieving WebTransport sessions.
+/// </summary>
+public interface IHttpWebTransportFeature
+{
+ /// <summary>
+ /// Indicates if this request is a WebTransport request.
+ /// </summary>
+ bool IsWebTransportRequest { get; }
+
+ /// <summary>
+ /// Accept the session request and allow streams to start being used.
+ /// </summary>
+ /// <param name="cancellationToken">The cancellation token to cancel waiting for the session.</param>
+ /// <returns>An instance of a WebTransportSession which will be used to control the connection.</returns>
+ [RequiresPreviewFeatures("WebTransport is a preview feature")]
+ ValueTask<IWebTransportSession> AcceptAsync(CancellationToken cancellationToken = default);
+}
diff --git a/src/Http/Http.Features/src/IRequestCookieCollection.cs b/src/Http/Http.Features/src/IRequestCookieCollection.cs
index 1b83caa59b..3a1d8e3a3a 100644
--- a/src/Http/Http.Features/src/IRequestCookieCollection.cs
+++ b/src/Http/Http.Features/src/IRequestCookieCollection.cs
@@ -63,7 +63,7 @@ public interface IRequestCookieCollection : IEnumerable<KeyValuePair<string, str
/// <exception cref="System.ArgumentNullException">
/// key is null.
/// </exception>
- bool TryGetValue(string key, [MaybeNullWhen(false)] out string? value);
+ bool TryGetValue(string key, [NotNullWhen(true)] out string? value);
/// <summary>
/// Gets the value with the specified key.
diff --git a/src/Http/Http.Features/src/IWebTransportSession.cs b/src/Http/Http.Features/src/IWebTransportSession.cs
new file mode 100644
index 0000000000..78cd5b45d6
--- /dev/null
+++ b/src/Http/Http.Features/src/IWebTransportSession.cs
@@ -0,0 +1,39 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Connections;
+
+namespace Microsoft.AspNetCore.Http.Features;
+
+/// <summary>
+/// Controls the session and streams of a WebTransport session.
+/// </summary>
+public interface IWebTransportSession
+{
+ /// <summary>
+ /// The id of the WebTransport session.
+ /// </summary>
+ long SessionId { get; }
+
+ /// <summary>
+ /// Abruptly close the WebTransport session and stop all the streams.
+ /// </summary>
+ /// <param name="errorCode">HTTP error code that corresponds to the reason for causing the abort.</param>
+ /// <remarks>Error codes are described here: https://www.rfc-editor.org/rfc/rfc9114.html#name-http-3-error-codes</remarks>
+ void Abort(int errorCode);
+
+ /// <summary>
+ /// Returns the next incoming stream in the order the server received it. The stream can be either bidirectional or unidirectional.
+ /// </summary>
+ /// <remarks>To use WebTransport, you must first enable the <c>Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams</c> AppContextSwitch</remarks>
+ /// <param name="cancellationToken">The cancellation token used to cancel the operation.</param>
+ /// <returns>The unidirectional or bidirectional stream that is next in the queue, or <c>null</c> if the session has ended.</returns>
+ ValueTask<ConnectionContext?> AcceptStreamAsync(CancellationToken cancellationToken = default);
+
+ /// <summary>
+ /// Opens a new unidirectional output stream.
+ /// </summary>
+ /// <param name="cancellationToken">The cancellation token used to cancel the operation.</param>
+ /// <returns>The unidirectional stream that was opened.</returns>
+ ValueTask<ConnectionContext?> OpenUnidirectionalStreamAsync(CancellationToken cancellationToken = default);
+}
diff --git a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj
index 50fe70a336..53c207c897 100644
--- a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj
+++ b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>ASP.NET Core HTTP feature interface definitions.</Description>
@@ -11,6 +11,7 @@
</PropertyGroup>
<ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Connections.Abstractions" />
<Reference Include="Microsoft.Extensions.Features" />
<Reference Include="Microsoft.Extensions.Primitives" />
<Reference Include="Microsoft.Net.Http.Headers" />
diff --git a/src/Http/Http.Features/src/PublicAPI.Shipped.txt b/src/Http/Http.Features/src/PublicAPI.Shipped.txt
index c0451eda6b..edea6b0a62 100644
--- a/src/Http/Http.Features/src/PublicAPI.Shipped.txt
+++ b/src/Http/Http.Features/src/PublicAPI.Shipped.txt
@@ -1,6 +1,19 @@
#nullable enable
-~Microsoft.AspNetCore.Http.Features.FeatureReference<> (forwarded, contained in Microsoft.Extensions.Features)
-~Microsoft.AspNetCore.Http.Features.FeatureReferences<> (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReference<T> (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReference<T>.Fetch(Microsoft.AspNetCore.Http.Features.IFeatureCollection! features) -> T? (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReference<T>.Update(Microsoft.AspNetCore.Http.Features.IFeatureCollection! features, T feature) -> T (forwarded, contained in Microsoft.Extensions.Features)
+static readonly Microsoft.AspNetCore.Http.Features.FeatureReference<T>.Default -> Microsoft.AspNetCore.Http.Features.FeatureReference<T> (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReference<T>.FeatureReference() -> void (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache> (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Cache -> TCache? (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Collection.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection! (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.FeatureReferences(Microsoft.AspNetCore.Http.Features.IFeatureCollection! collection) -> void (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Fetch<TFeature, TState>(ref TFeature? cached, TState state, System.Func<TState, TFeature?>! factory) -> TFeature? (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Fetch<TFeature>(ref TFeature? cached, System.Func<Microsoft.AspNetCore.Http.Features.IFeatureCollection!, TFeature?>! factory) -> TFeature? (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Initalize(Microsoft.AspNetCore.Http.Features.IFeatureCollection! collection) -> void (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Initalize(Microsoft.AspNetCore.Http.Features.IFeatureCollection! collection, int revision) -> void (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.FeatureReferences() -> void (forwarded, contained in Microsoft.Extensions.Features)
+Microsoft.AspNetCore.Http.Features.FeatureReferences<TCache>.Revision.get -> int (forwarded, contained in Microsoft.Extensions.Features)
Microsoft.AspNetCore.Http.CookieOptions
Microsoft.AspNetCore.Http.CookieOptions.CookieOptions() -> void
Microsoft.AspNetCore.Http.CookieOptions.Domain.get -> string?
diff --git a/src/Http/Http.Features/src/PublicAPI.Unshipped.txt b/src/Http/Http.Features/src/PublicAPI.Unshipped.txt
index 7dc5c58110..fe3881f254 100644
--- a/src/Http/Http.Features/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Http.Features/src/PublicAPI.Unshipped.txt
@@ -1 +1,16 @@
#nullable enable
+Microsoft.AspNetCore.Http.CookieOptions.CookieOptions(Microsoft.AspNetCore.Http.CookieOptions! options) -> void
+Microsoft.AspNetCore.Http.CookieOptions.CreateCookieHeader(string! name, string! value) -> Microsoft.Net.Http.Headers.SetCookieHeaderValue!
+Microsoft.AspNetCore.Http.CookieOptions.Extensions.get -> System.Collections.Generic.IList<string!>!
+Microsoft.AspNetCore.Http.Features.IHttpExtendedConnectFeature
+Microsoft.AspNetCore.Http.Features.IHttpExtendedConnectFeature.AcceptAsync() -> System.Threading.Tasks.ValueTask<System.IO.Stream!>
+Microsoft.AspNetCore.Http.Features.IHttpExtendedConnectFeature.IsExtendedConnect.get -> bool
+Microsoft.AspNetCore.Http.Features.IHttpExtendedConnectFeature.Protocol.get -> string?
+Microsoft.AspNetCore.Http.Features.IHttpWebTransportFeature
+Microsoft.AspNetCore.Http.Features.IHttpWebTransportFeature.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Http.Features.IWebTransportSession!>
+Microsoft.AspNetCore.Http.Features.IHttpWebTransportFeature.IsWebTransportRequest.get -> bool
+Microsoft.AspNetCore.Http.Features.IWebTransportSession
+Microsoft.AspNetCore.Http.Features.IWebTransportSession.Abort(int errorCode) -> void
+Microsoft.AspNetCore.Http.Features.IWebTransportSession.AcceptStreamAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+Microsoft.AspNetCore.Http.Features.IWebTransportSession.OpenUnidirectionalStreamAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+Microsoft.AspNetCore.Http.Features.IWebTransportSession.SessionId.get -> long
diff --git a/src/Http/Http.Results/src/Accepted.cs b/src/Http/Http.Results/src/Accepted.cs
index fed67811d4..42bd0b4ed9 100644
--- a/src/Http/Http.Results/src/Accepted.cs
+++ b/src/Http/Http.Results/src/Accepted.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with status code Accepted (202) and Location header.
/// Targets a registered route.
/// </summary>
-public sealed class Accepted : IResult, IEndpointMetadataProvider
+public sealed class Accepted : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="Accepted"/> class with the values
@@ -31,11 +31,6 @@ public sealed class Accepted : IResult, IEndpointMetadataProvider
/// <param name="locationUri">The location at which the status of requested content can be monitored.</param>
internal Accepted(Uri locationUri)
{
- if (locationUri == null)
- {
- throw new ArgumentNullException(nameof(locationUri));
- }
-
if (locationUri.IsAbsoluteUri)
{
Location = locationUri.AbsoluteUri;
@@ -51,6 +46,8 @@ public sealed class Accepted : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status202Accepted;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <summary>
/// Gets the location at which the status of the requested content can be monitored.
/// </summary>
@@ -59,6 +56,8 @@ public sealed class Accepted : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.AcceptedResult");
@@ -77,6 +76,8 @@ public sealed class Accepted : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status202Accepted));
}
}
diff --git a/src/Http/Http.Results/src/AcceptedAtRoute.cs b/src/Http/Http.Results/src/AcceptedAtRoute.cs
index 96bf99aab6..5698f46374 100644
--- a/src/Http/Http.Results/src/AcceptedAtRoute.cs
+++ b/src/Http/Http.Results/src/AcceptedAtRoute.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with status code Accepted (202) and Location header.
/// Targets a registered route.
/// </summary>
-public sealed class AcceptedAtRoute : IResult, IEndpointMetadataProvider
+public sealed class AcceptedAtRoute : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="AcceptedAtRoute"/> class with the values
@@ -54,9 +54,13 @@ public sealed class AcceptedAtRoute : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status202Accepted;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var linkGenerator = httpContext.RequestServices.GetRequiredService<LinkGenerator>();
var url = linkGenerator.GetUriByAddress(
httpContext,
@@ -84,6 +88,8 @@ public sealed class AcceptedAtRoute : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status202Accepted));
}
}
diff --git a/src/Http/Http.Results/src/AcceptedAtRouteOfT.cs b/src/Http/Http.Results/src/AcceptedAtRouteOfT.cs
index 4855b6e2c8..af9a471cf2 100644
--- a/src/Http/Http.Results/src/AcceptedAtRouteOfT.cs
+++ b/src/Http/Http.Results/src/AcceptedAtRouteOfT.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Targets a registered route.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class AcceptedAtRoute<TValue> : IResult, IEndpointMetadataProvider
+public sealed class AcceptedAtRoute<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="AcceptedAtRoute"/> class with the values
@@ -50,6 +50,8 @@ public sealed class AcceptedAtRoute<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the name of the route to use for generating the URL.
/// </summary>
@@ -65,9 +67,13 @@ public sealed class AcceptedAtRoute<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status202Accepted;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var linkGenerator = httpContext.RequestServices.GetRequiredService<LinkGenerator>();
var url = linkGenerator.GetUriByAddress(
httpContext,
@@ -95,6 +101,8 @@ public sealed class AcceptedAtRoute<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status202Accepted, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/AcceptedOfT.cs b/src/Http/Http.Results/src/AcceptedOfT.cs
index ebe84dbfe6..1911881fc4 100644
--- a/src/Http/Http.Results/src/AcceptedOfT.cs
+++ b/src/Http/Http.Results/src/AcceptedOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with status code Accepted (202) and Location header.
/// Targets a registered route.
/// </summary>
-public sealed class Accepted<TValue> : IResult, IEndpointMetadataProvider
+public sealed class Accepted<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="Accepted"/> class with the values
@@ -58,11 +58,15 @@ public sealed class Accepted<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status202Accepted"/>
/// </summary>
public int StatusCode => StatusCodes.Status202Accepted;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <summary>
/// Gets the location at which the status of the requested content can be monitored.
/// </summary>
@@ -71,6 +75,8 @@ public sealed class Accepted<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
if (!string.IsNullOrEmpty(Location))
{
httpContext.Response.Headers.Location = Location;
@@ -92,6 +98,8 @@ public sealed class Accepted<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status202Accepted, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/BadRequest.cs b/src/Http/Http.Results/src/BadRequest.cs
index 9dd3b161f1..d2bb333542 100644
--- a/src/Http/Http.Results/src/BadRequest.cs
+++ b/src/Http/Http.Results/src/BadRequest.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write an object to the response
/// with Bad Request (400) status code.
/// </summary>
-public sealed class BadRequest : IResult, IEndpointMetadataProvider
+public sealed class BadRequest : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="BadRequest"/> class with the values
@@ -26,9 +26,13 @@ public sealed class BadRequest : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status400BadRequest;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.BadRequestObjectResult");
@@ -42,6 +46,8 @@ public sealed class BadRequest : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status400BadRequest));
}
}
diff --git a/src/Http/Http.Results/src/BadRequestOfT.cs b/src/Http/Http.Results/src/BadRequestOfT.cs
index 097e3c8793..9056667b79 100644
--- a/src/Http/Http.Results/src/BadRequestOfT.cs
+++ b/src/Http/Http.Results/src/BadRequestOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with Bad Request (400) status code.
/// </summary>
/// <typeparam name="TValue">The type of error object that will be JSON serialized to the response body.</typeparam>
-public sealed class BadRequest<TValue> : IResult, IEndpointMetadataProvider
+public sealed class BadRequest<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="BadRequest"/> class with the values
@@ -30,14 +30,20 @@ public sealed class BadRequest<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status400BadRequest"/>
/// </summary>
public int StatusCode => StatusCodes.Status400BadRequest;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.BadRequestObjectResult");
@@ -54,6 +60,8 @@ public sealed class BadRequest<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status400BadRequest, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/ChallengeHttpResult.cs b/src/Http/Http.Results/src/ChallengeHttpResult.cs
index 1772c6f0d3..23714ab133 100644
--- a/src/Http/Http.Results/src/ChallengeHttpResult.cs
+++ b/src/Http/Http.Results/src/ChallengeHttpResult.cs
@@ -23,16 +23,6 @@ public sealed partial class ChallengeHttpResult : IResult
/// <summary>
/// Initializes a new instance of <see cref="ChallengeHttpResult"/> with the
- /// specified authentication scheme.
- /// </summary>
- /// <param name="authenticationScheme">The authentication scheme to challenge.</param>
- internal ChallengeHttpResult(string authenticationScheme)
- : this(new[] { authenticationScheme })
- {
- }
-
- /// <summary>
- /// Initializes a new instance of <see cref="ChallengeHttpResult"/> with the
/// specified authentication schemes.
/// </summary>
/// <param name="authenticationSchemes">The authentication schemes to challenge.</param>
@@ -43,17 +33,6 @@ public sealed partial class ChallengeHttpResult : IResult
/// <summary>
/// Initializes a new instance of <see cref="ChallengeHttpResult"/> with the
- /// specified <paramref name="properties"/>.
- /// </summary>
- /// <param name="properties"><see cref="AuthenticationProperties"/> used to perform the authentication
- /// challenge.</param>
- internal ChallengeHttpResult(AuthenticationProperties? properties)
- : this(Array.Empty<string>(), properties)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of <see cref="ChallengeHttpResult"/> with the
/// specified authentication scheme and <paramref name="properties"/>.
/// </summary>
/// <param name="authenticationScheme">The authentication schemes to challenge.</param>
@@ -90,6 +69,8 @@ public sealed partial class ChallengeHttpResult : IResult
/// <inheritdoc/>
public async Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ChallengeResult");
diff --git a/src/Http/Http.Results/src/Conflict.cs b/src/Http/Http.Results/src/Conflict.cs
index 12a639bba0..086ecd1f9b 100644
--- a/src/Http/Http.Results/src/Conflict.cs
+++ b/src/Http/Http.Results/src/Conflict.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write an object to the response
/// with Conflict (409) status code.
/// </summary>
-public sealed class Conflict : IResult, IEndpointMetadataProvider
+public sealed class Conflict : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="Conflict"/> class with the values
@@ -26,9 +26,13 @@ public sealed class Conflict : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status409Conflict;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ConflictObjectResult");
@@ -42,6 +46,8 @@ public sealed class Conflict : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status409Conflict));
}
}
diff --git a/src/Http/Http.Results/src/ConflictOfT.cs b/src/Http/Http.Results/src/ConflictOfT.cs
index f5fb98e193..baf16f6fc8 100644
--- a/src/Http/Http.Results/src/ConflictOfT.cs
+++ b/src/Http/Http.Results/src/ConflictOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with Conflict (409) status code.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class Conflict<TValue> : IResult, IEndpointMetadataProvider
+public sealed class Conflict<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="Conflict"/> class with the values
@@ -30,14 +30,20 @@ public sealed class Conflict<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status409Conflict"/>
/// </summary>
public int StatusCode => StatusCodes.Status409Conflict;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ConflictObjectResult");
@@ -54,6 +60,8 @@ public sealed class Conflict<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status409Conflict, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/ContentHttpResult.cs b/src/Http/Http.Results/src/ContentHttpResult.cs
index fa765a137e..7d154b0ae8 100644
--- a/src/Http/Http.Results/src/ContentHttpResult.cs
+++ b/src/Http/Http.Results/src/ContentHttpResult.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="ContentHttpResult"/> that when executed
/// will produce a response with content.
/// </summary>
-public sealed partial class ContentHttpResult : IResult
+public sealed partial class ContentHttpResult : IResult, IStatusCodeHttpResult, IContentTypeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="ContentHttpResult"/> class with the values.
@@ -57,6 +57,8 @@ public sealed partial class ContentHttpResult : IResult
/// <returns>A task that represents the asynchronous execute operation.</returns>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ContentResult");
diff --git a/src/Http/Http.Results/src/Created.cs b/src/Http/Http.Results/src/Created.cs
index 0f94c05771..02091f69db 100644
--- a/src/Http/Http.Results/src/Created.cs
+++ b/src/Http/Http.Results/src/Created.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write an object to the response
/// with status code Created (201) and Location header.
/// </summary>
-public sealed class Created : IResult, IEndpointMetadataProvider
+public sealed class Created : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="Created"/> class with the values
@@ -50,12 +50,16 @@ public sealed class Created : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status201Created;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public string? Location { get; }
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.CreatedResult");
@@ -74,6 +78,8 @@ public sealed class Created : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status201Created));
}
}
diff --git a/src/Http/Http.Results/src/CreatedAtRoute.cs b/src/Http/Http.Results/src/CreatedAtRoute.cs
index 7cb9b31f0b..a3e8d34cb4 100644
--- a/src/Http/Http.Results/src/CreatedAtRoute.cs
+++ b/src/Http/Http.Results/src/CreatedAtRoute.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with status code Created (201) and Location header.
/// Targets a registered route.
/// </summary>
-public sealed class CreatedAtRoute : IResult, IEndpointMetadataProvider
+public sealed class CreatedAtRoute : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="CreatedAtRoute"/> class with the values
@@ -54,9 +54,13 @@ public sealed class CreatedAtRoute : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status201Created;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var linkGenerator = httpContext.RequestServices.GetRequiredService<LinkGenerator>();
var url = linkGenerator.GetUriByRouteValues(
httpContext,
@@ -84,6 +88,8 @@ public sealed class CreatedAtRoute : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status201Created));
}
}
diff --git a/src/Http/Http.Results/src/CreatedAtRouteOfT.cs b/src/Http/Http.Results/src/CreatedAtRouteOfT.cs
index c4260b27f0..1a64b3415a 100644
--- a/src/Http/Http.Results/src/CreatedAtRouteOfT.cs
+++ b/src/Http/Http.Results/src/CreatedAtRouteOfT.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Targets a registered route.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class CreatedAtRoute<TValue> : IResult, IEndpointMetadataProvider
+public sealed class CreatedAtRoute<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="CreatedAtRoute"/> class with the values
@@ -50,6 +50,8 @@ public sealed class CreatedAtRoute<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the name of the route to use for generating the URL.
/// </summary>
@@ -65,9 +67,13 @@ public sealed class CreatedAtRoute<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status201Created;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var linkGenerator = httpContext.RequestServices.GetRequiredService<LinkGenerator>();
var url = linkGenerator.GetUriByRouteValues(
httpContext,
@@ -98,6 +104,8 @@ public sealed class CreatedAtRoute<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status201Created, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/CreatedOfT.cs b/src/Http/Http.Results/src/CreatedOfT.cs
index 5523c5f87a..b6104f30c0 100644
--- a/src/Http/Http.Results/src/CreatedOfT.cs
+++ b/src/Http/Http.Results/src/CreatedOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with status code Created (201) and Location header.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class Created<TValue> : IResult, IEndpointMetadataProvider
+public sealed class Created<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="Created"/> class with the values
@@ -58,17 +58,23 @@ public sealed class Created<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status201Created"/>
/// </summary>
public int StatusCode => StatusCodes.Status201Created;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public string? Location { get; }
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
if (!string.IsNullOrEmpty(Location))
{
httpContext.Response.Headers.Location = Location;
@@ -90,6 +96,8 @@ public sealed class Created<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status201Created, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/EmptyHttpResult.cs b/src/Http/Http.Results/src/EmptyHttpResult.cs
index ccdc3bd059..459a17a22c 100644
--- a/src/Http/Http.Results/src/EmptyHttpResult.cs
+++ b/src/Http/Http.Results/src/EmptyHttpResult.cs
@@ -21,6 +21,8 @@ public sealed class EmptyHttpResult : IResult
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
return Task.CompletedTask;
}
}
diff --git a/src/Http/Http.Results/src/FileContentHttpResult.cs b/src/Http/Http.Results/src/FileContentHttpResult.cs
index 960836b994..b8496be075 100644
--- a/src/Http/Http.Results/src/FileContentHttpResult.cs
+++ b/src/Http/Http.Results/src/FileContentHttpResult.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Represents an <see cref="IResult"/> that when executed will
/// write a file from the content to the response.
/// </summary>
-public sealed partial class FileContentHttpResult : IResult
+public sealed partial class FileContentHttpResult : IResult, IFileHttpResult, IContentTypeHttpResult
{
/// <summary>
/// Creates a new <see cref="FileContentHttpResult"/> instance with
@@ -106,6 +106,8 @@ public sealed partial class FileContentHttpResult : IResult
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.FileContentResult");
diff --git a/src/Http/Http.Results/src/FileStreamHttpResult.cs b/src/Http/Http.Results/src/FileStreamHttpResult.cs
index eff283d20d..d798c70d2f 100644
--- a/src/Http/Http.Results/src/FileStreamHttpResult.cs
+++ b/src/Http/Http.Results/src/FileStreamHttpResult.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Represents an <see cref="IResult"/> that when executed will
/// write a file from a stream to the response.
/// </summary>
-public sealed class FileStreamHttpResult : IResult
+public sealed class FileStreamHttpResult : IResult, IFileHttpResult, IContentTypeHttpResult
{
/// <summary>
/// Creates a new <see cref="FileStreamHttpResult"/> instance with
@@ -115,6 +115,8 @@ public sealed class FileStreamHttpResult : IResult
/// <inheritdoc/>
public async Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.FileStreamResult");
diff --git a/src/Http/Http.Results/src/ForbidHttpResult.cs b/src/Http/Http.Results/src/ForbidHttpResult.cs
index 5afdb53b85..2286e29fcb 100644
--- a/src/Http/Http.Results/src/ForbidHttpResult.cs
+++ b/src/Http/Http.Results/src/ForbidHttpResult.cs
@@ -23,16 +23,6 @@ public sealed partial class ForbidHttpResult : IResult
/// <summary>
/// Initializes a new instance of <see cref="ForbidHttpResult"/> with the
- /// specified authentication scheme.
- /// </summary>
- /// <param name="authenticationScheme">The authentication scheme to challenge.</param>
- internal ForbidHttpResult(string authenticationScheme)
- : this(new[] { authenticationScheme })
- {
- }
-
- /// <summary>
- /// Initializes a new instance of <see cref="ForbidHttpResult"/> with the
/// specified authentication schemes.
/// </summary>
/// <param name="authenticationSchemes">The authentication schemes to challenge.</param>
@@ -90,6 +80,8 @@ public sealed partial class ForbidHttpResult : IResult
/// <inheritdoc />
public async Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.ForbidResult");
diff --git a/src/Http/Http.Results/src/HttpResultsHelper.cs b/src/Http/Http.Results/src/HttpResultsHelper.cs
index b899467b1d..c4804353b4 100644
--- a/src/Http/Http.Results/src/HttpResultsHelper.cs
+++ b/src/Http/Http.Results/src/HttpResultsHelper.cs
@@ -3,7 +3,6 @@
using System.Text;
using System.Text.Json;
-using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
@@ -13,7 +12,7 @@ namespace Microsoft.AspNetCore.Http;
internal static partial class HttpResultsHelper
{
- private const string DefaultContentType = "text/plain; charset=utf-8";
+ internal const string DefaultContentType = "text/plain; charset=utf-8";
private static readonly Encoding DefaultEncoding = Encoding.UTF8;
public static Task WriteResultAsJsonAsync<T>(
@@ -28,9 +27,21 @@ internal static partial class HttpResultsHelper
return Task.CompletedTask;
}
- Log.WritingResultAsJson(logger, typeof(T).Name);
+ var declaredType = typeof(T);
- return httpContext.Response.WriteAsJsonAsync(
+ Log.WritingResultAsJson(logger, declaredType.Name);
+
+ if (declaredType.IsValueType)
+ {
+ // In this case the polymorphism is not
+ // relevant and we don't need to box.
+ return httpContext.Response.WriteAsJsonAsync(
+ value,
+ options: jsonSerializerOptions,
+ contentType: contentType);
+ }
+
+ return httpContext.Response.WriteAsJsonAsync<object?>(
value,
options: jsonSerializerOptions,
contentType: contentType);
@@ -119,33 +130,7 @@ internal static partial class HttpResultsHelper
{
if (value is ProblemDetails problemDetails)
{
- ApplyProblemDetailsDefaults(problemDetails, statusCode);
- }
- }
-
- public static void ApplyProblemDetailsDefaults(ProblemDetails problemDetails, int? statusCode)
- {
- // We allow StatusCode to be specified either on ProblemDetails or on the ObjectResult and use it to configure the other.
- // This lets users write <c>return Conflict(new Problem("some description"))</c>
- // or <c>return Problem("some-problem", 422)</c> and have the response have consistent fields.
- if (problemDetails.Status is null)
- {
- if (statusCode is not null)
- {
- problemDetails.Status = statusCode;
- }
- else
- {
- problemDetails.Status = problemDetails is HttpValidationProblemDetails ?
- StatusCodes.Status400BadRequest :
- StatusCodes.Status500InternalServerError;
- }
- }
-
- if (ProblemDetailsDefaults.Defaults.TryGetValue(problemDetails.Status.Value, out var defaults))
- {
- problemDetails.Title ??= defaults.Title;
- problemDetails.Type ??= defaults.Type;
+ ProblemDetailsDefaults.Apply(problemDetails, statusCode);
}
}
diff --git a/src/Http/Http.Results/src/JsonHttpResultOfT.cs b/src/Http/Http.Results/src/JsonHttpResultOfT.cs
index dec845ac20..d743591d54 100644
--- a/src/Http/Http.Results/src/JsonHttpResultOfT.cs
+++ b/src/Http/Http.Results/src/JsonHttpResultOfT.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// <summary>
/// An action result which formats the given object as JSON.
/// </summary>
-public sealed partial class JsonHttpResult<TValue> : IResult
+public sealed partial class JsonHttpResult<TValue> : IResult, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>, IContentTypeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="Json"/> class with the values.
@@ -38,18 +38,6 @@ public sealed partial class JsonHttpResult<TValue> : IResult
/// Initializes a new instance of the <see cref="Json"/> class with the values.
/// </summary>
/// <param name="value">The value to format in the entity body.</param>
- /// <param name="contentType">The value for the <c>Content-Type</c> header</param>
- /// <param name="jsonSerializerOptions">The serializer settings.</param>
- internal JsonHttpResult(TValue? value, string? contentType, JsonSerializerOptions? jsonSerializerOptions)
- : this(value, statusCode: null, contentType: contentType, jsonSerializerOptions: jsonSerializerOptions)
- {
-
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="Json"/> class with the values.
- /// </summary>
- /// <param name="value">The value to format in the entity body.</param>
/// <param name="statusCode">The HTTP status code of the response.</param>
/// <param name="jsonSerializerOptions">The serializer settings.</param>
/// <param name="contentType">The value for the <c>Content-Type</c> header</param>
@@ -61,7 +49,7 @@ public sealed partial class JsonHttpResult<TValue> : IResult
if (value is ProblemDetails problemDetails)
{
- HttpResultsHelper.ApplyProblemDetailsDefaults(problemDetails, statusCode);
+ ProblemDetailsDefaults.Apply(problemDetails, statusCode);
statusCode ??= problemDetails.Status;
}
@@ -78,6 +66,8 @@ public sealed partial class JsonHttpResult<TValue> : IResult
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the value for the <c>Content-Type</c> header.
/// </summary>
@@ -91,6 +81,8 @@ public sealed partial class JsonHttpResult<TValue> : IResult
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.JsonResult");
diff --git a/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj b/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj
index de0934e220..7808c52b5e 100644
--- a/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj
+++ b/src/Http/Http.Results/src/Microsoft.AspNetCore.Http.Results.csproj
@@ -16,7 +16,7 @@
<Compile Include="$(SharedSourceRoot)ResponseContentTypeHelper.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)ResultsHelpers\*.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)RangeHelper\RangeHelper.cs" LinkBase="Shared" />
- <Compile Include="$(SharedSourceRoot)ProblemDetailsDefaults.cs" LinkBase="Shared" />
+ <Compile Include="$(SharedSourceRoot)ProblemDetails\ProblemDetailsDefaults.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)ApiExplorerTypes\*.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)RoutingMetadata\AcceptsMetadata.cs" LinkBase="Shared" />
</ItemGroup>
diff --git a/src/Http/Http.Results/src/NoContent.cs b/src/Http/Http.Results/src/NoContent.cs
index 68920021f3..f52e0ad4bd 100644
--- a/src/Http/Http.Results/src/NoContent.cs
+++ b/src/Http/Http.Results/src/NoContent.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Represents an <see cref="IResult"/> that when executed will
/// produce an HTTP response with the No Content (204) status code.
/// </summary>
-public class NoContent : IResult, IEndpointMetadataProvider
+public class NoContent : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="NoContent"/> class.
@@ -25,9 +25,13 @@ public class NoContent : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status204NoContent;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.NoContentResult");
@@ -42,6 +46,8 @@ public class NoContent : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status204NoContent));
}
}
diff --git a/src/Http/Http.Results/src/NotFound.cs b/src/Http/Http.Results/src/NotFound.cs
index 9b0dbe7848..069c2d7ad6 100644
--- a/src/Http/Http.Results/src/NotFound.cs
+++ b/src/Http/Http.Results/src/NotFound.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write an object to the response
/// with Not Found (404) status code.
/// </summary>
-public sealed class NotFound : IResult, IEndpointMetadataProvider
+public sealed class NotFound : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="NotFound"/> class with the values.
@@ -25,9 +25,13 @@ public sealed class NotFound : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status404NotFound;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.NotFoundObjectResult");
@@ -41,6 +45,8 @@ public sealed class NotFound : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status404NotFound));
}
}
diff --git a/src/Http/Http.Results/src/NotFoundOfT.cs b/src/Http/Http.Results/src/NotFoundOfT.cs
index 8e1bacf533..18a39d02f4 100644
--- a/src/Http/Http.Results/src/NotFoundOfT.cs
+++ b/src/Http/Http.Results/src/NotFoundOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with Not Found (404) status code.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class NotFound<TValue> : IResult, IEndpointMetadataProvider
+public sealed class NotFound<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="NotFound"/> class with the values.
@@ -29,14 +29,20 @@ public sealed class NotFound<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; internal init; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status404NotFound"/>
/// </summary>
public int StatusCode => StatusCodes.Status404NotFound;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.NotFoundObjectResult");
@@ -53,6 +59,8 @@ public sealed class NotFound<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status404NotFound, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/Ok.cs b/src/Http/Http.Results/src/Ok.cs
index 8d2197d0e4..ab13c45659 100644
--- a/src/Http/Http.Results/src/Ok.cs
+++ b/src/Http/Http.Results/src/Ok.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write an object to the response
/// with Ok (200) status code.
/// </summary>
-public sealed class Ok : IResult, IEndpointMetadataProvider
+public sealed class Ok : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="Ok"/> class with the values.
@@ -25,9 +25,13 @@ public sealed class Ok : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status200OK;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.OkObjectResult");
@@ -41,6 +45,8 @@ public sealed class Ok : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status200OK));
}
}
diff --git a/src/Http/Http.Results/src/OkOfT.cs b/src/Http/Http.Results/src/OkOfT.cs
index ccbef8a73b..532837bea1 100644
--- a/src/Http/Http.Results/src/OkOfT.cs
+++ b/src/Http/Http.Results/src/OkOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with Ok (200) status code.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class Ok<TValue> : IResult, IEndpointMetadataProvider
+public sealed class Ok<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="Ok"/> class with the values.
@@ -29,14 +29,20 @@ public sealed class Ok<TValue> : IResult, IEndpointMetadataProvider
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status200OK"/>
/// </summary>
public int StatusCode => StatusCodes.Status200OK;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.OkObjectResult");
@@ -53,6 +59,8 @@ public sealed class Ok<TValue> : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status200OK, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/PhysicalFileHttpResult.cs b/src/Http/Http.Results/src/PhysicalFileHttpResult.cs
index 4e69b71a88..7b44bd6c1b 100644
--- a/src/Http/Http.Results/src/PhysicalFileHttpResult.cs
+++ b/src/Http/Http.Results/src/PhysicalFileHttpResult.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// A <see cref="PhysicalFileHttpResult"/> on execution will write a file from disk to the response
/// using mechanisms provided by the host.
/// </summary>
-public sealed partial class PhysicalFileHttpResult : IResult
+public sealed partial class PhysicalFileHttpResult : IResult, IFileHttpResult, IContentTypeHttpResult
{
/// <summary>
/// Creates a new <see cref="PhysicalFileHttpResult"/> instance with
@@ -107,6 +107,8 @@ public sealed partial class PhysicalFileHttpResult : IResult
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var fileInfo = GetFileInfoWrapper(FileName);
if (!fileInfo.Exists)
{
diff --git a/src/Http/Http.Results/src/ProblemHttpResult.cs b/src/Http/Http.Results/src/ProblemHttpResult.cs
index 45b8017565..b0a42aaa05 100644
--- a/src/Http/Http.Results/src/ProblemHttpResult.cs
+++ b/src/Http/Http.Results/src/ProblemHttpResult.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write Problem Details
/// HTTP API responses based on <see href="https://tools.ietf.org/html/rfc7807"/>
/// </summary>
-public sealed class ProblemHttpResult : IResult
+public sealed class ProblemHttpResult : IResult, IStatusCodeHttpResult, IContentTypeHttpResult, IValueHttpResult, IValueHttpResult<ProblemDetails>
{
/// <summary>
/// Creates a new <see cref="ProblemHttpResult"/> instance with
@@ -21,7 +21,7 @@ public sealed class ProblemHttpResult : IResult
internal ProblemHttpResult(ProblemDetails problemDetails)
{
ProblemDetails = problemDetails;
- HttpResultsHelper.ApplyProblemDetailsDefaults(ProblemDetails, statusCode: null);
+ ProblemDetailsDefaults.Apply(ProblemDetails, statusCode: null);
}
/// <summary>
@@ -29,6 +29,10 @@ public sealed class ProblemHttpResult : IResult
/// </summary>
public ProblemDetails ProblemDetails { get; }
+ object? IValueHttpResult.Value => ProblemDetails;
+
+ ProblemDetails? IValueHttpResult<ProblemDetails>.Value => ProblemDetails;
+
/// <summary>
/// Gets the value for the <c>Content-Type</c> header: <c>application/problem+json</c>
/// </summary>
@@ -37,11 +41,15 @@ public sealed class ProblemHttpResult : IResult
/// <summary>
/// Gets the HTTP status code.
/// </summary>
- public int? StatusCode => ProblemDetails.Status;
+ public int StatusCode => ProblemDetails.Status!.Value;
+
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger(typeof(ProblemHttpResult));
diff --git a/src/Http/Http.Results/src/PublicAPI.Unshipped.txt b/src/Http/Http.Results/src/PublicAPI.Unshipped.txt
index e87a32cfd7..032a07e72e 100644
--- a/src/Http/Http.Results/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Http.Results/src/PublicAPI.Unshipped.txt
@@ -122,7 +122,7 @@ Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult
Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.ContentType.get -> string!
Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.ProblemDetails.get -> Microsoft.AspNetCore.Mvc.ProblemDetails!
-Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.StatusCode.get -> int?
+Microsoft.AspNetCore.Http.HttpResults.ProblemHttpResult.StatusCode.get -> int
Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult
Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.ContentType.get -> string!
Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult.EnableRangeProcessing.get -> bool
@@ -144,21 +144,49 @@ Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.Permanent.get ->
Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.PreserveMethod.get -> bool
Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.RouteName.get -> string?
Microsoft.AspNetCore.Http.HttpResults.RedirectToRouteHttpResult.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary?
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.Result.get -> Microsoft.AspNetCore.Http.IResult!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.Result.get -> Microsoft.AspNetCore.Http.IResult!
+*REMOVED*static Microsoft.AspNetCore.Http.Results.Content(string! content, string? contentType = null, System.Text.Encoding? contentEncoding = null) -> Microsoft.AspNetCore.Http.IResult!
+*REMOVED*static Microsoft.AspNetCore.Http.Results.Content(string! content, Microsoft.Net.Http.Headers.MediaTypeHeaderValue! contentType) -> Microsoft.AspNetCore.Http.IResult!
+Microsoft.AspNetCore.Http.HttpResults.Utf8ContentHttpResult
+Microsoft.AspNetCore.Http.HttpResults.Utf8ContentHttpResult.ContentType.get -> string?
+Microsoft.AspNetCore.Http.HttpResults.Utf8ContentHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Http.HttpResults.Utf8ContentHttpResult.ResponseContent.get -> System.ReadOnlyMemory<byte>
+Microsoft.AspNetCore.Http.HttpResults.Utf8ContentHttpResult.StatusCode.get -> int?
+static Microsoft.AspNetCore.Http.Results.Accepted<TValue>(string? uri = null, TValue? value = default(TValue?)) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.AcceptedAtRoute<TValue>(string? routeName = null, object? routeValues = null, TValue? value = default(TValue?)) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.BadRequest<TValue>(TValue? error) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Conflict<TValue>(TValue? error) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Content(string? content, Microsoft.Net.Http.Headers.MediaTypeHeaderValue! contentType) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Content(string? content, string? contentType = null, System.Text.Encoding? contentEncoding = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Content(string? content, string? contentType, System.Text.Encoding? contentEncoding) -> Microsoft.AspNetCore.Http.IResult!
+*REMOVED*static Microsoft.AspNetCore.Http.Results.Text(string! content, string? contentType = null, System.Text.Encoding? contentEncoding = null) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Created<TValue>(System.Uri! uri, TValue? value) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Created<TValue>(string! uri, TValue? value) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.CreatedAtRoute<TValue>(string? routeName = null, object? routeValues = null, TValue? value = default(TValue?)) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Json<TValue>(TValue? data, System.Text.Json.JsonSerializerOptions? options = null, string? contentType = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.NotFound<TValue>(TValue? value) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Ok<TValue>(TValue? value) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Text(string? content, string? contentType = null, System.Text.Encoding? contentEncoding = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Text(string? content, string? contentType, System.Text.Encoding? contentEncoding) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.Text(System.ReadOnlySpan<byte> utf8Content, string? contentType = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.Results.UnprocessableEntity<TValue>(TValue? error) -> Microsoft.AspNetCore.Http.IResult!
+static Microsoft.AspNetCore.Http.TypedResults.Content(string? content, string? contentType = null, System.Text.Encoding? contentEncoding = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
+static Microsoft.AspNetCore.Http.TypedResults.Content(string? content, string? contentType, System.Text.Encoding? contentEncoding) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
+static Microsoft.AspNetCore.Http.TypedResults.Text(string? content, string? contentType = null, System.Text.Encoding? contentEncoding = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
+static Microsoft.AspNetCore.Http.TypedResults.Text(string? content, string? contentType, System.Text.Encoding? contentEncoding) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
+static Microsoft.AspNetCore.Http.TypedResults.Text(System.ReadOnlySpan<byte> utf8Content, string? contentType = null, int? statusCode = null) -> Microsoft.AspNetCore.Http.HttpResults.Utf8ContentHttpResult!
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.Result.get -> Microsoft.AspNetCore.Http.IResult
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.Result.get -> Microsoft.AspNetCore.Http.IResult
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.Result.get -> Microsoft.AspNetCore.Http.IResult
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.Result.get -> Microsoft.AspNetCore.Http.IResult
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>
Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult
Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult.AuthenticationScheme.get -> string?
Microsoft.AspNetCore.Http.HttpResults.SignInHttpResult.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.Tasks.Task!
@@ -197,26 +225,6 @@ Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.FileName.get -> stri
Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult.LastModified.get -> System.DateTimeOffset?
Microsoft.AspNetCore.Http.TypedResults
static Microsoft.AspNetCore.Http.HttpResults.EmptyHttpResult.Instance.get -> Microsoft.AspNetCore.Http.HttpResults.EmptyHttpResult!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!(TResult5 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!(TResult6 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!(TResult5 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>!(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>!(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>!
-static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>!(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>!
static Microsoft.AspNetCore.Http.Results.Bytes(System.ReadOnlyMemory<byte> contents, string? contentType = null, string? fileDownloadName = null, bool enableRangeProcessing = false, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null) -> Microsoft.AspNetCore.Http.IResult!
static Microsoft.AspNetCore.Http.Results.Empty.get -> Microsoft.AspNetCore.Http.IResult!
static Microsoft.AspNetCore.Http.Results.Stream(System.Func<System.IO.Stream!, System.Threading.Tasks.Task!>! streamWriterCallback, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null) -> Microsoft.AspNetCore.Http.IResult!
@@ -234,8 +242,7 @@ static Microsoft.AspNetCore.Http.TypedResults.Bytes(byte[]! contents, string? co
static Microsoft.AspNetCore.Http.TypedResults.Challenge(Microsoft.AspNetCore.Authentication.AuthenticationProperties? properties = null, System.Collections.Generic.IList<string!>? authenticationSchemes = null) -> Microsoft.AspNetCore.Http.HttpResults.ChallengeHttpResult!
static Microsoft.AspNetCore.Http.TypedResults.Conflict() -> Microsoft.AspNetCore.Http.HttpResults.Conflict!
static Microsoft.AspNetCore.Http.TypedResults.Conflict<TValue>(TValue? error) -> Microsoft.AspNetCore.Http.HttpResults.Conflict<TValue>!
-static Microsoft.AspNetCore.Http.TypedResults.Content(string! content, Microsoft.Net.Http.Headers.MediaTypeHeaderValue! contentType) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
-static Microsoft.AspNetCore.Http.TypedResults.Content(string! content, string? contentType = null, System.Text.Encoding? contentEncoding = null) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
+static Microsoft.AspNetCore.Http.TypedResults.Content(string? content, Microsoft.Net.Http.Headers.MediaTypeHeaderValue! contentType) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
static Microsoft.AspNetCore.Http.TypedResults.Created(System.Uri! uri) -> Microsoft.AspNetCore.Http.HttpResults.Created!
static Microsoft.AspNetCore.Http.TypedResults.Created(string! uri) -> Microsoft.AspNetCore.Http.HttpResults.Created!
static Microsoft.AspNetCore.Http.TypedResults.Created<TValue>(System.Uri! uri, TValue? value) -> Microsoft.AspNetCore.Http.HttpResults.Created<TValue>!
@@ -264,9 +271,30 @@ static Microsoft.AspNetCore.Http.TypedResults.StatusCode(int statusCode) -> Micr
static Microsoft.AspNetCore.Http.TypedResults.Stream(System.Func<System.IO.Stream!, System.Threading.Tasks.Task!>! streamWriterCallback, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null) -> Microsoft.AspNetCore.Http.HttpResults.PushStreamHttpResult!
static Microsoft.AspNetCore.Http.TypedResults.Stream(System.IO.Pipelines.PipeReader! pipeReader, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null, bool enableRangeProcessing = false) -> Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult!
static Microsoft.AspNetCore.Http.TypedResults.Stream(System.IO.Stream! stream, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null, bool enableRangeProcessing = false) -> Microsoft.AspNetCore.Http.HttpResults.FileStreamHttpResult!
-static Microsoft.AspNetCore.Http.TypedResults.Text(string! content, string? contentType = null, System.Text.Encoding? contentEncoding = null) -> Microsoft.AspNetCore.Http.HttpResults.ContentHttpResult!
static Microsoft.AspNetCore.Http.TypedResults.Unauthorized() -> Microsoft.AspNetCore.Http.HttpResults.UnauthorizedHttpResult!
static Microsoft.AspNetCore.Http.TypedResults.UnprocessableEntity() -> Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity!
static Microsoft.AspNetCore.Http.TypedResults.UnprocessableEntity<TValue>(TValue? error) -> Microsoft.AspNetCore.Http.HttpResults.UnprocessableEntity<TValue>!
static Microsoft.AspNetCore.Http.TypedResults.ValidationProblem(System.Collections.Generic.IDictionary<string!, string![]!>! errors, string? detail = null, string? instance = null, string? title = null, string? type = null, System.Collections.Generic.IDictionary<string!, object?>? extensions = null) -> Microsoft.AspNetCore.Http.HttpResults.ValidationProblem!
static Microsoft.AspNetCore.Http.TypedResults.VirtualFile(string! path, string? contentType = null, string? fileDownloadName = null, System.DateTimeOffset? lastModified = null, Microsoft.Net.Http.Headers.EntityTagHeaderValue? entityTag = null, bool enableRangeProcessing = false) -> Microsoft.AspNetCore.Http.HttpResults.VirtualFileHttpResult!
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.ExecuteAsync(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
+~Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.Result.get -> Microsoft.AspNetCore.Http.IResult
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>(TResult5 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>(TResult6 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>(TResult5 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4, TResult5>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>(TResult4 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3, TResult4>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>(TResult3 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2, TResult3>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>(TResult1 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>
+~static Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>.implicit operator Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>(TResult2 result) -> Microsoft.AspNetCore.Http.HttpResults.Results<TResult1, TResult2>
diff --git a/src/Http/Http.Results/src/PushStreamHttpResult.cs b/src/Http/Http.Results/src/PushStreamHttpResult.cs
index e7d3e85278..e9c61785d3 100644
--- a/src/Http/Http.Results/src/PushStreamHttpResult.cs
+++ b/src/Http/Http.Results/src/PushStreamHttpResult.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Represents an <see cref="IResult"/> that when executed will
/// write a file from the writer callback to the response.
/// </summary>
-public sealed class PushStreamHttpResult : IResult
+public sealed class PushStreamHttpResult : IResult, IFileHttpResult, IContentTypeHttpResult
{
private readonly Func<Stream, Task> _streamWriterCallback;
@@ -100,6 +100,8 @@ public sealed class PushStreamHttpResult : IResult
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.PushStreamResult");
diff --git a/src/Http/Http.Results/src/RedirectHttpResult.cs b/src/Http/Http.Results/src/RedirectHttpResult.cs
index e466cef62d..d1ca73d1dd 100644
--- a/src/Http/Http.Results/src/RedirectHttpResult.cs
+++ b/src/Http/Http.Results/src/RedirectHttpResult.cs
@@ -58,16 +58,6 @@ public sealed partial class RedirectHttpResult : IResult
/// and will throw an exception when the supplied URL is not considered local.</param>
internal RedirectHttpResult(string url, bool acceptLocalUrlOnly, bool permanent, bool preserveMethod)
{
- if (url == null)
- {
- throw new ArgumentNullException(nameof(url));
- }
-
- if (string.IsNullOrEmpty(url))
- {
- throw new ArgumentException("Argument cannot be null or empty", nameof(url));
- }
-
Url = url;
Permanent = permanent;
PreserveMethod = preserveMethod;
@@ -97,6 +87,8 @@ public sealed partial class RedirectHttpResult : IResult
/// <inheritdoc />
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.RedirectResult");
diff --git a/src/Http/Http.Results/src/RedirectToRouteHttpResult.cs b/src/Http/Http.Results/src/RedirectToRouteHttpResult.cs
index a846f56dd3..0daa608bc5 100644
--- a/src/Http/Http.Results/src/RedirectToRouteHttpResult.cs
+++ b/src/Http/Http.Results/src/RedirectToRouteHttpResult.cs
@@ -61,40 +61,6 @@ public sealed partial class RedirectToRouteHttpResult : IResult
/// <param name="routeValues">The parameters for the route.</param>
/// <param name="permanent">If set to true, makes the redirect permanent (301).
/// Otherwise a temporary redirect is used (302).</param>
- /// <param name="preserveMethod">If set to true, make the temporary redirect (307)
- /// or permanent redirect (308) preserve the initial request method.</param>
- internal RedirectToRouteHttpResult(
- string? routeName,
- object? routeValues,
- bool permanent,
- bool preserveMethod)
- : this(routeName, routeValues, permanent, preserveMethod, fragment: null)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="RedirectToRouteHttpResult"/> with the values
- /// provided.
- /// </summary>
- /// <param name="routeName">The name of the route.</param>
- /// <param name="routeValues">The parameters for the route.</param>
- /// <param name="fragment">The fragment to add to the URL.</param>
- internal RedirectToRouteHttpResult(
- string? routeName,
- object? routeValues,
- string? fragment)
- : this(routeName, routeValues, permanent: false, fragment: fragment)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of the <see cref="RedirectToRouteHttpResult"/> with the values
- /// provided.
- /// </summary>
- /// <param name="routeName">The name of the route.</param>
- /// <param name="routeValues">The parameters for the route.</param>
- /// <param name="permanent">If set to true, makes the redirect permanent (301).
- /// Otherwise a temporary redirect is used (302).</param>
/// <param name="fragment">The fragment to add to the URL.</param>
internal RedirectToRouteHttpResult(
string? routeName,
@@ -158,6 +124,8 @@ public sealed partial class RedirectToRouteHttpResult : IResult
/// <inheritdoc />
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var linkGenerator = httpContext.RequestServices.GetRequiredService<LinkGenerator>();
var destinationUrl = linkGenerator.GetUriByRouteValues(
diff --git a/src/Http/Http.Results/src/ResultExtensions.cs b/src/Http/Http.Results/src/ResultExtensions.cs
index d10a3bd59a..52e2ee9761 100644
--- a/src/Http/Http.Results/src/ResultExtensions.cs
+++ b/src/Http/Http.Results/src/ResultExtensions.cs
@@ -7,4 +7,4 @@ namespace Microsoft.AspNetCore.Http;
/// Implements an interface for registering external methods that provide
/// custom IResult instances.
/// </summary>
-internal class ResultExtensions : IResultExtensions { }
+internal sealed class ResultExtensions : IResultExtensions { }
diff --git a/src/Http/Http.Results/src/Results.cs b/src/Http/Http.Results/src/Results.cs
index 005ea1385a..66b7e3474e 100644
--- a/src/Http/Http.Results/src/Results.cs
+++ b/src/Http/Http.Results/src/Results.cs
@@ -78,7 +78,7 @@ public static partial class Results
/// <summary>
/// Writes the <paramref name="content"/> string to the HTTP response.
/// <para>
- /// This is an alias for <see cref="Text(string, string?, Encoding?)"/>.
+ /// This is equivalent to <see cref="Text(string?, string?, Encoding?)"/>.
/// </para>
/// </summary>
/// <param name="content">The content to write to the response.</param>
@@ -89,33 +89,83 @@ public static partial class Results
/// If encoding is provided by both the 'charset' and the <paramref name="contentEncoding"/> parameters, then
/// the <paramref name="contentEncoding"/> parameter is chosen as the final encoding.
/// </remarks>
- public static IResult Content(string content, string? contentType = null, Encoding? contentEncoding = null)
- => TypedResults.Content(content, contentType, contentEncoding);
+ public static IResult Content(string? content, string? contentType, Encoding? contentEncoding)
+ => Content(content, contentType, contentEncoding, null);
/// <summary>
/// Writes the <paramref name="content"/> string to the HTTP response.
/// <para>
- /// This is an alias for <see cref="Content(string, string?, Encoding?)"/>.
+ /// This is equivalent to <see cref="Text(string?, string?, Encoding?, int?)"/>.
/// </para>
/// </summary>
/// <param name="content">The content to write to the response.</param>
/// <param name="contentType">The content type (MIME type).</param>
/// <param name="contentEncoding">The content encoding.</param>
+ /// <param name="statusCode">The status code to return.</param>
/// <returns>The created <see cref="IResult"/> object for the response.</returns>
/// <remarks>
/// If encoding is provided by both the 'charset' and the <paramref name="contentEncoding"/> parameters, then
/// the <paramref name="contentEncoding"/> parameter is chosen as the final encoding.
/// </remarks>
- public static IResult Text(string content, string? contentType = null, Encoding? contentEncoding = null)
- => TypedResults.Text(content, contentType, contentEncoding);
+ public static IResult Content(string? content, string? contentType = null, Encoding? contentEncoding = null, int? statusCode = null)
+ => TypedResults.Content(content, contentType, contentEncoding, statusCode);
/// <summary>
/// Writes the <paramref name="content"/> string to the HTTP response.
+ /// <para>
+ /// This is an alias for <see cref="Content(string?, string?, Encoding?)"/>.
+ /// </para>
/// </summary>
/// <param name="content">The content to write to the response.</param>
/// <param name="contentType">The content type (MIME type).</param>
+ /// <param name="contentEncoding">The content encoding.</param>
/// <returns>The created <see cref="IResult"/> object for the response.</returns>
- public static IResult Content(string content, MediaTypeHeaderValue contentType)
+ /// <remarks>
+ /// If encoding is provided by both the 'charset' and the <paramref name="contentEncoding"/> parameters, then
+ /// the <paramref name="contentEncoding"/> parameter is chosen as the final encoding.
+ /// </remarks>
+ public static IResult Text(string? content, string? contentType, Encoding? contentEncoding)
+ => Text(content, contentType, contentEncoding, null);
+
+ /// <summary>
+ /// Writes the <paramref name="content"/> string to the HTTP response.
+ /// <para>
+ /// This is an alias for <see cref="Content(string?, string?, Encoding?, int?)"/>.
+ /// </para>
+ /// </summary>
+ /// <param name="content">The content to write to the response.</param>
+ /// <param name="contentType">The content type (MIME type).</param>
+ /// <param name="contentEncoding">The content encoding.</param>
+ /// <param name="statusCode">The status code to return.</param>
+ /// <returns>The created <see cref="IResult"/> object for the response.</returns>
+ /// <remarks>
+ /// If encoding is provided by both the 'charset' and the <paramref name="contentEncoding"/> parameters, then
+ /// the <paramref name="contentEncoding"/> parameter is chosen as the final encoding.
+ /// </remarks>
+#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
+ public static IResult Text(string? content, string? contentType = null, Encoding? contentEncoding = null, int? statusCode = null)
+#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
+ => TypedResults.Text(content, contentType, contentEncoding, statusCode);
+
+ /// <summary>
+ /// Writes the <paramref name="utf8Content"/> UTF-8 encoded text to the HTTP response.
+ /// </summary>
+ /// <param name="utf8Content">The content to write to the response.</param>
+ /// <param name="contentType">The content type (MIME type).</param>
+ /// <param name="statusCode">The status code to return.</param>
+ /// <returns>The created <see cref="IResult"/> object for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads
+ public static IResult Text(ReadOnlySpan<byte> utf8Content, string? contentType = null, int? statusCode = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads
+ => TypedResults.Text(utf8Content, contentType, statusCode);
+
+ /// <summary>
+ /// Writes the <paramref name="content"/> string to the HTTP response.
+ /// </summary>
+ /// <param name="content">The content to write to the response.</param>
+ /// <param name="contentType">The content type (MIME type).</param>
+ /// <returns>The created <see cref="IResult"/> object for the response.</returns>
+ public static IResult Content(string? content, MediaTypeHeaderValue contentType)
=> TypedResults.Content(content, contentType);
/// <summary>
@@ -130,6 +180,22 @@ public static partial class Results
/// <remarks>Callers should cache an instance of serializer settings to avoid
/// recreating cached data with each call.</remarks>
public static IResult Json(object? data, JsonSerializerOptions? options = null, string? contentType = null, int? statusCode = null)
+ => Json<object>(data, options, contentType, statusCode);
+
+ /// <summary>
+ /// Creates a <see cref="IResult"/> that serializes the specified <paramref name="data"/> object to JSON.
+ /// </summary>
+ /// <param name="data">The object to write as JSON.</param>
+ /// <param name="options">The serializer options to use when serializing the value.</param>
+ /// <param name="contentType">The content-type to set on the response.</param>
+ /// <param name="statusCode">The status code to set on the response.</param>
+ /// <returns>The created <see cref="JsonHttpResult{TValue}"/> that serializes the specified <paramref name="data"/>
+ /// as JSON format for the response.</returns>
+ /// <remarks>Callers should cache an instance of serializer settings to avoid
+ /// recreating cached data with each call.</remarks>
+#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
+ public static IResult Json<TValue>(TValue? data, JsonSerializerOptions? options = null, string? contentType = null, int? statusCode = null)
+#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
=> TypedResults.Json(data, options, contentType, statusCode);
/// <summary>
@@ -418,7 +484,17 @@ public static partial class Results
/// </summary>
/// <param name="value">The value to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
public static IResult NotFound(object? value = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => NotFound<object>(value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status404NotFound"/> response.
+ /// </summary>
+ /// <param name="value">The value to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult NotFound<TValue>(TValue? value)
=> value is null ? TypedResults.NotFound() : TypedResults.NotFound(value);
/// <summary>
@@ -433,7 +509,17 @@ public static partial class Results
/// </summary>
/// <param name="error">An error object to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
public static IResult BadRequest(object? error = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => BadRequest<object>(error);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status400BadRequest"/> response.
+ /// </summary>
+ /// <param name="error">An error object to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult BadRequest<TValue>(TValue? error)
=> error is null ? TypedResults.BadRequest() : TypedResults.BadRequest(error);
/// <summary>
@@ -441,7 +527,17 @@ public static partial class Results
/// </summary>
/// <param name="error">An error object to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
public static IResult Conflict(object? error = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => Conflict<object>(error);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status409Conflict"/> response.
+ /// </summary>
+ /// <param name="error">An error object to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult Conflict<TValue>(TValue? error)
=> error is null ? TypedResults.Conflict() : TypedResults.Conflict(error);
/// <summary>
@@ -456,7 +552,17 @@ public static partial class Results
/// </summary>
/// <param name="value">The value to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
public static IResult Ok(object? value = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => Ok<object>(value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status200OK"/> response.
+ /// </summary>
+ /// <param name="value">The value to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult Ok<TValue>(TValue? value)
=> value is null ? TypedResults.Ok() : TypedResults.Ok(value);
/// <summary>
@@ -464,7 +570,17 @@ public static partial class Results
/// </summary>
/// <param name="error">An error object to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
public static IResult UnprocessableEntity(object? error = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => UnprocessableEntity<object>(error);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status422UnprocessableEntity"/> response.
+ /// </summary>
+ /// <param name="error">An error object to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult UnprocessableEntity<TValue>(TValue? error)
=> error is null ? TypedResults.UnprocessableEntity() : TypedResults.UnprocessableEntity(error);
/// <summary>
@@ -544,6 +660,15 @@ public static partial class Results
/// <param name="value">The value to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
public static IResult Created(string uri, object? value)
+ => Created<object>(uri, value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status201Created"/> response.
+ /// </summary>
+ /// <param name="uri">The URI at which the content has been created.</param>
+ /// <param name="value">The value to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult Created<TValue>(string uri, TValue? value)
=> value is null ? TypedResults.Created(uri) : TypedResults.Created(uri, value);
/// <summary>
@@ -553,6 +678,15 @@ public static partial class Results
/// <param name="value">The value to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
public static IResult Created(Uri uri, object? value)
+ => Created<object>(uri, value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status201Created"/> response.
+ /// </summary>
+ /// <param name="uri">The URI at which the content has been created.</param>
+ /// <param name="value">The value to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+ public static IResult Created<TValue>(Uri uri, TValue? value)
=> value is null ? TypedResults.Created(uri) : TypedResults.Created(uri, value);
/// <summary>
@@ -563,6 +697,18 @@ public static partial class Results
/// <param name="value">The value to be included in the HTTP response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
public static IResult CreatedAtRoute(string? routeName = null, object? routeValues = null, object? value = null)
+ => CreatedAtRoute<object>(routeName, routeValues, value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status201Created"/> response.
+ /// </summary>
+ /// <param name="routeName">The name of the route to use for generating the URL.</param>
+ /// <param name="routeValues">The route data to use for generating the URL.</param>
+ /// <param name="value">The value to be included in the HTTP response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
+ public static IResult CreatedAtRoute<TValue>(string? routeName = null, object? routeValues = null, TValue? value = default)
+#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
=> value is null ? TypedResults.CreatedAtRoute(routeName, routeValues) : TypedResults.CreatedAtRoute(value, routeName, routeValues);
/// <summary>
@@ -572,6 +718,17 @@ public static partial class Results
/// <param name="value">The optional content value to format in the response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
public static IResult Accepted(string? uri = null, object? value = null)
+ => Accepted<object>(uri, value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status202Accepted"/> response.
+ /// </summary>
+ /// <param name="uri">The URI with the location at which the status of requested content can be monitored.</param>
+ /// <param name="value">The optional content value to format in the response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
+ public static IResult Accepted<TValue>(string? uri = null, TValue? value = default)
+#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
=> value is null ? TypedResults.Accepted(uri) : TypedResults.Accepted(uri, value);
/// <summary>
@@ -581,7 +738,21 @@ public static partial class Results
/// <param name="routeValues">The route data to use for generating the URL.</param>
/// <param name="value">The optional content value to format in the response body.</param>
/// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
public static IResult AcceptedAtRoute(string? routeName = null, object? routeValues = null, object? value = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => AcceptedAtRoute<object>(routeName, routeValues, value);
+
+ /// <summary>
+ /// Produces a <see cref="StatusCodes.Status202Accepted"/> response.
+ /// </summary>
+ /// <param name="routeName">The name of the route to use for generating the URL.</param>
+ /// <param name="routeValues">The route data to use for generating the URL.</param>
+ /// <param name="value">The optional content value to format in the response body.</param>
+ /// <returns>The created <see cref="IResult"/> for the response.</returns>
+#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
+ public static IResult AcceptedAtRoute<TValue>(string? routeName = null, object? routeValues = null, TValue? value = default)
+#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
=> value is null ? TypedResults.AcceptedAtRoute(routeName, routeValues) : TypedResults.AcceptedAtRoute(value, routeName, routeValues);
/// <summary>
diff --git a/src/Http/Http.Results/src/ResultsOfT.cs b/src/Http/Http.Results/src/ResultsOfT.Generated.cs
index 33559b6c6e..c468a4e754 100644
--- a/src/Http/Http.Results/src/ResultsOfT.cs
+++ b/src/Http/Http.Results/src/ResultsOfT.Generated.cs
@@ -14,11 +14,11 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// <remarks>
/// An instance of this type cannot be created explicitly. Use the implicit cast operators to create an instance
/// from an instance of one of the declared type arguments, e.g.
-/// <code>Results&lt;OkObjectHttpResult, ProblemHttpResult&gt; result = Results.Ok();</code>
+/// <code>Results&lt;Ok, BadRequest&gt; result = TypedResults.Ok();</code>
/// </remarks>
/// <typeparam name="TResult1">The first result type.</typeparam>
/// <typeparam name="TResult2">The second result type.</typeparam>
-public sealed class Results<TResult1, TResult2> : IResult, IEndpointMetadataProvider
+public sealed class Results<TResult1, TResult2> : IResult, INestedHttpResult, IEndpointMetadataProvider
where TResult1 : IResult
where TResult2 : IResult
{
@@ -36,7 +36,7 @@ public sealed class Results<TResult1, TResult2> : IResult, IEndpointMetadataProv
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
- ArgumentNullException.ThrowIfNull(httpContext, nameof(httpContext));
+ ArgumentNullException.ThrowIfNull(httpContext);
if (Result is null)
{
@@ -61,6 +61,8 @@ public sealed class Results<TResult1, TResult2> : IResult, IEndpointMetadataProv
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult1>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult2>(context);
}
@@ -73,12 +75,12 @@ public sealed class Results<TResult1, TResult2> : IResult, IEndpointMetadataProv
/// <remarks>
/// An instance of this type cannot be created explicitly. Use the implicit cast operators to create an instance
/// from an instance of one of the declared type arguments, e.g.
-/// <code>Results&lt;OkObjectHttpResult, ProblemHttpResult&gt; result = Results.Ok();</code>
+/// <code>Results&lt;Ok, BadRequest&gt; result = TypedResults.Ok();</code>
/// </remarks>
/// <typeparam name="TResult1">The first result type.</typeparam>
/// <typeparam name="TResult2">The second result type.</typeparam>
/// <typeparam name="TResult3">The third result type.</typeparam>
-public sealed class Results<TResult1, TResult2, TResult3> : IResult, IEndpointMetadataProvider
+public sealed class Results<TResult1, TResult2, TResult3> : IResult, INestedHttpResult, IEndpointMetadataProvider
where TResult1 : IResult
where TResult2 : IResult
where TResult3 : IResult
@@ -97,7 +99,7 @@ public sealed class Results<TResult1, TResult2, TResult3> : IResult, IEndpointMe
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
- ArgumentNullException.ThrowIfNull(httpContext, nameof(httpContext));
+ ArgumentNullException.ThrowIfNull(httpContext);
if (Result is null)
{
@@ -128,6 +130,8 @@ public sealed class Results<TResult1, TResult2, TResult3> : IResult, IEndpointMe
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult1>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult2>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult3>(context);
@@ -141,13 +145,13 @@ public sealed class Results<TResult1, TResult2, TResult3> : IResult, IEndpointMe
/// <remarks>
/// An instance of this type cannot be created explicitly. Use the implicit cast operators to create an instance
/// from an instance of one of the declared type arguments, e.g.
-/// <code>Results&lt;OkObjectHttpResult, ProblemHttpResult&gt; result = Results.Ok();</code>
+/// <code>Results&lt;Ok, BadRequest&gt; result = TypedResults.Ok();</code>
/// </remarks>
/// <typeparam name="TResult1">The first result type.</typeparam>
/// <typeparam name="TResult2">The second result type.</typeparam>
/// <typeparam name="TResult3">The third result type.</typeparam>
/// <typeparam name="TResult4">The fourth result type.</typeparam>
-public sealed class Results<TResult1, TResult2, TResult3, TResult4> : IResult, IEndpointMetadataProvider
+public sealed class Results<TResult1, TResult2, TResult3, TResult4> : IResult, INestedHttpResult, IEndpointMetadataProvider
where TResult1 : IResult
where TResult2 : IResult
where TResult3 : IResult
@@ -167,7 +171,7 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4> : IResult, I
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
- ArgumentNullException.ThrowIfNull(httpContext, nameof(httpContext));
+ ArgumentNullException.ThrowIfNull(httpContext);
if (Result is null)
{
@@ -204,6 +208,8 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4> : IResult, I
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult1>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult2>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult3>(context);
@@ -218,14 +224,14 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4> : IResult, I
/// <remarks>
/// An instance of this type cannot be created explicitly. Use the implicit cast operators to create an instance
/// from an instance of one of the declared type arguments, e.g.
-/// <code>Results&lt;OkObjectHttpResult, ProblemHttpResult&gt; result = Results.Ok();</code>
+/// <code>Results&lt;Ok, BadRequest&gt; result = TypedResults.Ok();</code>
/// </remarks>
/// <typeparam name="TResult1">The first result type.</typeparam>
/// <typeparam name="TResult2">The second result type.</typeparam>
/// <typeparam name="TResult3">The third result type.</typeparam>
/// <typeparam name="TResult4">The fourth result type.</typeparam>
/// <typeparam name="TResult5">The fifth result type.</typeparam>
-public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5> : IResult, IEndpointMetadataProvider
+public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5> : IResult, INestedHttpResult, IEndpointMetadataProvider
where TResult1 : IResult
where TResult2 : IResult
where TResult3 : IResult
@@ -246,7 +252,7 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5> :
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
- ArgumentNullException.ThrowIfNull(httpContext, nameof(httpContext));
+ ArgumentNullException.ThrowIfNull(httpContext);
if (Result is null)
{
@@ -289,6 +295,8 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5> :
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult1>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult2>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult3>(context);
@@ -304,7 +312,7 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5> :
/// <remarks>
/// An instance of this type cannot be created explicitly. Use the implicit cast operators to create an instance
/// from an instance of one of the declared type arguments, e.g.
-/// <code>Results&lt;OkObjectHttpResult, ProblemHttpResult&gt; result = Results.Ok();</code>
+/// <code>Results&lt;Ok, BadRequest&gt; result = TypedResults.Ok();</code>
/// </remarks>
/// <typeparam name="TResult1">The first result type.</typeparam>
/// <typeparam name="TResult2">The second result type.</typeparam>
@@ -312,7 +320,7 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5> :
/// <typeparam name="TResult4">The fourth result type.</typeparam>
/// <typeparam name="TResult5">The fifth result type.</typeparam>
/// <typeparam name="TResult6">The sixth result type.</typeparam>
-public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6> : IResult, IEndpointMetadataProvider
+public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5, TResult6> : IResult, INestedHttpResult, IEndpointMetadataProvider
where TResult1 : IResult
where TResult2 : IResult
where TResult3 : IResult
@@ -334,7 +342,7 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5, TR
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
- ArgumentNullException.ThrowIfNull(httpContext, nameof(httpContext));
+ ArgumentNullException.ThrowIfNull(httpContext);
if (Result is null)
{
@@ -383,6 +391,8 @@ public sealed class Results<TResult1, TResult2, TResult3, TResult4, TResult5, TR
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult1>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult2>(context);
ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult3>(context);
diff --git a/src/Http/Http.Results/src/SignInHttpResult.cs b/src/Http/Http.Results/src/SignInHttpResult.cs
index 8ce3b72767..72e5dd44ad 100644
--- a/src/Http/Http.Results/src/SignInHttpResult.cs
+++ b/src/Http/Http.Results/src/SignInHttpResult.cs
@@ -32,7 +32,7 @@ public sealed partial class SignInHttpResult : IResult
/// <param name="properties"><see cref="AuthenticationProperties"/> used to perform the sign-in operation.</param>
internal SignInHttpResult(ClaimsPrincipal principal, string? authenticationScheme, AuthenticationProperties? properties)
{
- Principal = principal ?? throw new ArgumentNullException(nameof(principal));
+ Principal = principal;
AuthenticationScheme = authenticationScheme;
Properties = properties;
}
@@ -55,6 +55,8 @@ public sealed partial class SignInHttpResult : IResult
/// <inheritdoc />
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.SignInResult");
diff --git a/src/Http/Http.Results/src/SignOutHttpResult.cs b/src/Http/Http.Results/src/SignOutHttpResult.cs
index 515fb89e41..74044c003a 100644
--- a/src/Http/Http.Results/src/SignOutHttpResult.cs
+++ b/src/Http/Http.Results/src/SignOutHttpResult.cs
@@ -22,26 +22,6 @@ public sealed partial class SignOutHttpResult : IResult
}
/// <summary>
- /// Initializes a new instance of <see cref="SignOutHttpResult"/> with the default sign out scheme.
- /// specified authentication scheme and <paramref name="properties"/>.
- /// </summary>
- /// <param name="properties"><see cref="AuthenticationProperties"/> used to perform the sign-out operation.</param>
- internal SignOutHttpResult(AuthenticationProperties properties)
- : this(Array.Empty<string>(), properties)
- {
- }
-
- /// <summary>
- /// Initializes a new instance of <see cref="SignOutHttpResult"/> with the
- /// specified authentication scheme.
- /// </summary>
- /// <param name="authenticationScheme">The authentication scheme to use when signing out the user.</param>
- internal SignOutHttpResult(string authenticationScheme)
- : this(new[] { authenticationScheme })
- {
- }
-
- /// <summary>
/// Initializes a new instance of <see cref="SignOutHttpResult"/> with the
/// specified authentication schemes.
/// </summary>
@@ -92,6 +72,8 @@ public sealed partial class SignOutHttpResult : IResult
/// <inheritdoc />
public async Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.SignOutResult");
diff --git a/src/Http/Http.Results/src/StatusCodeHttpResult.cs b/src/Http/Http.Results/src/StatusCodeHttpResult.cs
index ad951df8be..67c1f039cf 100644
--- a/src/Http/Http.Results/src/StatusCodeHttpResult.cs
+++ b/src/Http/Http.Results/src/StatusCodeHttpResult.cs
@@ -1,16 +1,16 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-namespace Microsoft.AspNetCore.Http.HttpResults;
-
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
/// <summary>
/// Represents an <see cref="IResult"/> that when executed will
/// produce an HTTP response with the given response status code.
/// </summary>
-public sealed partial class StatusCodeHttpResult : IResult
+public sealed partial class StatusCodeHttpResult : IResult, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="StatusCodeHttpResult"/> class
@@ -27,6 +27,8 @@ public sealed partial class StatusCodeHttpResult : IResult
/// </summary>
public int StatusCode { get; }
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <summary>
/// Sets the status code on the HTTP response.
/// </summary>
@@ -34,6 +36,8 @@ public sealed partial class StatusCodeHttpResult : IResult
/// <returns>A task that represents the asynchronous execute operation.</returns>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.StatusCodeResult");
diff --git a/src/Http/Http.Results/src/TypedResults.cs b/src/Http/Http.Results/src/TypedResults.cs
index 938400a416..31821d062a 100644
--- a/src/Http/Http.Results/src/TypedResults.cs
+++ b/src/Http/Http.Results/src/TypedResults.cs
@@ -64,7 +64,11 @@ public static class TypedResults
ClaimsPrincipal principal,
AuthenticationProperties? properties = null,
string? authenticationScheme = null)
- => new(principal, authenticationScheme, properties);
+ {
+ ArgumentNullException.ThrowIfNull(principal);
+
+ return new(principal, authenticationScheme, properties);
+ }
/// <summary>
/// Creates a <see cref="SignOutHttpResult"/> that on execution invokes <see cref="AuthenticationHttpContextExtensions.SignOutAsync(HttpContext, string?, AuthenticationProperties?)" />.
@@ -78,7 +82,7 @@ public static class TypedResults
/// <summary>
/// Writes the <paramref name="content"/> string to the HTTP response.
/// <para>
- /// This is an alias for <see cref="Text(string, string?, Encoding?)"/>.
+ /// This is equivalent to <see cref="Text(string?, string?, Encoding?)"/>.
/// </para>
/// </summary>
/// <remarks>
@@ -89,13 +93,13 @@ public static class TypedResults
/// <param name="contentType">The content type (MIME type).</param>
/// <param name="contentEncoding">The content encoding.</param>
/// <returns>The created <see cref="ContentHttpResult"/> object for the response.</returns>
- public static ContentHttpResult Content(string content, string? contentType = null, Encoding? contentEncoding = null)
- => Text(content, contentType, contentEncoding);
+ public static ContentHttpResult Content(string? content, string? contentType, Encoding? contentEncoding)
+ => Content(content, contentType, contentEncoding, null);
/// <summary>
/// Writes the <paramref name="content"/> string to the HTTP response.
/// <para>
- /// This is an alias for <see cref="Content(string, string?, Encoding?)"/>.
+ /// This is equivalent to <see cref="Text(string?, string?, Encoding?, int?)"/>.
/// </para>
/// </summary>
/// <remarks>
@@ -105,8 +109,58 @@ public static class TypedResults
/// <param name="content">The content to write to the response.</param>
/// <param name="contentType">The content type (MIME type).</param>
/// <param name="contentEncoding">The content encoding.</param>
+ /// <param name="statusCode">The status code to return.</param>
/// <returns>The created <see cref="ContentHttpResult"/> object for the response.</returns>
- public static ContentHttpResult Text(string content, string? contentType = null, Encoding? contentEncoding = null)
+ public static ContentHttpResult Content(string? content, string? contentType = null, Encoding? contentEncoding = null, int? statusCode = null)
+ => Text(content, contentType, contentEncoding, statusCode);
+
+ /// <summary>
+ /// Writes the <paramref name="content"/> string to the HTTP response.
+ /// <para>
+ /// This is an alias for <see cref="Content(string?, string?, Encoding?)"/>.
+ /// </para>
+ /// </summary>
+ /// <remarks>
+ /// If encoding is provided by both the 'charset' and the <paramref name="contentEncoding"/> parameters, then
+ /// the <paramref name="contentEncoding"/> parameter is chosen as the final encoding.
+ /// </remarks>
+ /// <param name="content">The content to write to the response.</param>
+ /// <param name="contentType">The content type (MIME type).</param>
+ /// <param name="contentEncoding">The content encoding.</param>
+ /// <returns>The created <see cref="ContentHttpResult"/> object for the response.</returns>
+ public static ContentHttpResult Text(string? content, string? contentType, Encoding? contentEncoding)
+ => Text(content, contentType, contentEncoding, null);
+
+ /// <summary>
+ /// Writes the <paramref name="utf8Content"/> UTF8 text content to the HTTP response.
+ /// </summary>
+ /// <param name="utf8Content">The content to write to the response.</param>
+ /// <param name="contentType">The content type (MIME type).</param>
+ /// <param name="statusCode">The status code to return.</param>
+ /// <returns>The created <see cref="Utf8ContentHttpResult"/> object for the response.</returns>
+#pragma warning disable RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ public static Utf8ContentHttpResult Text(ReadOnlySpan<byte> utf8Content, string? contentType = null, int? statusCode = null)
+#pragma warning restore RS0027 // Public API with optional parameter(s) should have the most parameters amongst its public overloads.
+ => new Utf8ContentHttpResult(utf8Content, contentType, statusCode);
+
+ /// <summary>
+ /// Writes the <paramref name="content"/> string to the HTTP response.
+ /// <para>
+ /// This is an alias for <see cref="Content(string?, string?, Encoding?, int?)"/>.
+ /// </para>
+ /// </summary>
+ /// <remarks>
+ /// If encoding is provided by both the 'charset' and the <paramref name="contentEncoding"/> parameters, then
+ /// the <paramref name="contentEncoding"/> parameter is chosen as the final encoding.
+ /// </remarks>
+ /// <param name="content">The content to write to the response.</param>
+ /// <param name="contentType">The content type (MIME type).</param>
+ /// <param name="contentEncoding">The content encoding.</param>
+ /// <param name="statusCode">The status code to return.</param>
+ /// <returns>The created <see cref="ContentHttpResult"/> object for the response.</returns>
+#pragma warning disable RS0026 // Do not add multiple public overloads with optional parameters
+ public static ContentHttpResult Text(string? content, string? contentType = null, Encoding? contentEncoding = null, int? statusCode = null)
+#pragma warning restore RS0026 // Do not add multiple public overloads with optional parameters
{
MediaTypeHeaderValue? mediaTypeHeaderValue = null;
if (contentType is not null)
@@ -115,7 +169,7 @@ public static class TypedResults
mediaTypeHeaderValue.Encoding = contentEncoding ?? mediaTypeHeaderValue.Encoding;
}
- return new(content, mediaTypeHeaderValue?.ToString());
+ return new(content, mediaTypeHeaderValue?.ToString(), statusCode);
}
/// <summary>
@@ -124,7 +178,7 @@ public static class TypedResults
/// <param name="content">The content to write to the response.</param>
/// <param name="contentType">The content type (MIME type).</param>
/// <returns>The created <see cref="ContentHttpResult"/> object for the response.</returns>
- public static ContentHttpResult Content(string content, MediaTypeHeaderValue contentType)
+ public static ContentHttpResult Content(string? content, MediaTypeHeaderValue contentType)
=> new(content, contentType.ToString());
/// <summary>
@@ -170,13 +224,17 @@ public static class TypedResults
bool enableRangeProcessing = false,
DateTimeOffset? lastModified = null,
EntityTagHeaderValue? entityTag = null)
- => new(fileContents, contentType)
+ {
+ ArgumentNullException.ThrowIfNull(fileContents);
+
+ return new(fileContents, contentType)
{
FileDownloadName = fileDownloadName,
EnableRangeProcessing = enableRangeProcessing,
LastModified = lastModified,
EntityTag = entityTag,
};
+ }
/// <summary>
/// Writes the byte-array content to the response.
@@ -203,13 +261,17 @@ public static class TypedResults
bool enableRangeProcessing = false,
DateTimeOffset? lastModified = null,
EntityTagHeaderValue? entityTag = null)
- => new(contents, contentType)
+ {
+ ArgumentNullException.ThrowIfNull(contents);
+
+ return new(contents, contentType)
{
FileDownloadName = fileDownloadName,
EnableRangeProcessing = enableRangeProcessing,
LastModified = lastModified,
EntityTag = entityTag,
};
+ }
/// <summary>
/// Writes the byte-array content to the response.
@@ -274,6 +336,8 @@ public static class TypedResults
EntityTagHeaderValue? entityTag = null,
bool enableRangeProcessing = false)
{
+ ArgumentNullException.ThrowIfNull(fileStream);
+
return new(fileStream, contentType)
{
LastModified = lastModified,
@@ -315,6 +379,8 @@ public static class TypedResults
EntityTagHeaderValue? entityTag = null,
bool enableRangeProcessing = false)
{
+ ArgumentNullException.ThrowIfNull(stream);
+
return new(stream, contentType)
{
LastModified = lastModified,
@@ -353,6 +419,8 @@ public static class TypedResults
EntityTagHeaderValue? entityTag = null,
bool enableRangeProcessing = false)
{
+ ArgumentNullException.ThrowIfNull(pipeReader);
+
return new(pipeReader.AsStream(), contentType)
{
LastModified = lastModified,
@@ -386,6 +454,8 @@ public static class TypedResults
DateTimeOffset? lastModified = null,
EntityTagHeaderValue? entityTag = null)
{
+ ArgumentNullException.ThrowIfNull(streamWriterCallback);
+
return new(streamWriterCallback, contentType)
{
LastModified = lastModified,
@@ -418,6 +488,11 @@ public static class TypedResults
EntityTagHeaderValue? entityTag = null,
bool enableRangeProcessing = false)
{
+ if (string.IsNullOrEmpty(path))
+ {
+ throw new ArgumentException("Argument cannot be null or empty", nameof(path));
+ }
+
return new(path, contentType)
{
FileDownloadName = fileDownloadName,
@@ -451,6 +526,11 @@ public static class TypedResults
EntityTagHeaderValue? entityTag = null,
bool enableRangeProcessing = false)
{
+ if (string.IsNullOrEmpty(path))
+ {
+ throw new ArgumentException("Argument cannot be null or empty", nameof(path));
+ }
+
return new(path, contentType)
{
FileDownloadName = fileDownloadName,
@@ -474,7 +554,14 @@ public static class TypedResults
/// <param name="preserveMethod">If set to true, make the temporary redirect (307) or permanent redirect (308) preserve the initial request method.</param>
/// <returns>The created <see cref="RedirectHttpResult"/> for the response.</returns>
public static RedirectHttpResult Redirect(string url, bool permanent = false, bool preserveMethod = false)
- => new(url, permanent, preserveMethod);
+ {
+ if (string.IsNullOrEmpty(url))
+ {
+ throw new ArgumentException("Argument cannot be null or empty", nameof(url));
+ }
+
+ return new(url, permanent, preserveMethod);
+ }
/// <summary>
/// Redirects to the specified <paramref name="localUrl"/>.
@@ -490,7 +577,14 @@ public static class TypedResults
/// <param name="preserveMethod">If set to true, make the temporary redirect (307) or permanent redirect (308) preserve the initial request method.</param>
/// <returns>The created <see cref="RedirectHttpResult"/> for the response.</returns>
public static RedirectHttpResult LocalRedirect(string localUrl, bool permanent = false, bool preserveMethod = false)
- => new(localUrl, acceptLocalUrlOnly: true, permanent, preserveMethod);
+ {
+ if (string.IsNullOrEmpty(localUrl))
+ {
+ throw new ArgumentException("Argument cannot be null or empty", nameof(localUrl));
+ }
+
+ return new(localUrl, acceptLocalUrlOnly: true, permanent, preserveMethod);
+ }
/// <summary>
/// Redirects to the specified route.
@@ -650,6 +744,8 @@ public static class TypedResults
/// <returns>The created <see cref="ProblemHttpResult"/> for the response.</returns>
public static ProblemHttpResult Problem(ProblemDetails problemDetails)
{
+ ArgumentNullException.ThrowIfNull(problemDetails);
+
return new(problemDetails);
}
@@ -671,6 +767,8 @@ public static class TypedResults
string? type = null,
IDictionary<string, object?>? extensions = null)
{
+ ArgumentNullException.ThrowIfNull(errors);
+
var problemDetails = new HttpValidationProblemDetails(errors)
{
Detail = detail,
@@ -698,9 +796,9 @@ public static class TypedResults
/// <returns>The created <see cref="HttpResults.Created"/> for the response.</returns>
public static Created Created(string uri)
{
- if (uri == null)
+ if (string.IsNullOrEmpty(uri))
{
- throw new ArgumentNullException(nameof(uri));
+ throw new ArgumentException("Argument cannot be null or empty", nameof(uri));
}
return new(uri);
@@ -715,9 +813,9 @@ public static class TypedResults
/// <returns>The created <see cref="HttpResults.Created{TValue}"/> for the response.</returns>
public static Created<TValue> Created<TValue>(string uri, TValue? value)
{
- if (uri == null)
+ if (string.IsNullOrEmpty(uri))
{
- throw new ArgumentNullException(nameof(uri));
+ throw new ArgumentException("Argument cannot be null or empty", nameof(uri));
}
return new(uri, value);
@@ -730,10 +828,7 @@ public static class TypedResults
/// <returns>The created <see cref="HttpResults.Created"/> for the response.</returns>
public static Created Created(Uri uri)
{
- if (uri == null)
- {
- throw new ArgumentNullException(nameof(uri));
- }
+ ArgumentNullException.ThrowIfNull(uri);
return new(uri);
}
@@ -747,10 +842,7 @@ public static class TypedResults
/// <returns>The created <see cref="HttpResults.Created{TValue}"/> for the response.</returns>
public static Created<TValue> Created<TValue>(Uri uri, TValue? value)
{
- if (uri == null)
- {
- throw new ArgumentNullException(nameof(uri));
- }
+ ArgumentNullException.ThrowIfNull(uri);
return new(uri, value);
}
@@ -804,10 +896,7 @@ public static class TypedResults
/// <returns>The created <see cref="HttpResults.Accepted"/> for the response.</returns>
public static Accepted Accepted(Uri uri)
{
- if (uri == null)
- {
- throw new ArgumentNullException(nameof(uri));
- }
+ ArgumentNullException.ThrowIfNull(uri);
return new(uri);
}
@@ -821,10 +910,7 @@ public static class TypedResults
/// <returns>The created <see cref="HttpResults.Accepted{TValue}"/> for the response.</returns>
public static Accepted<TValue> Accepted<TValue>(Uri uri, TValue? value)
{
- if (uri == null)
- {
- throw new ArgumentNullException(nameof(uri));
- }
+ ArgumentNullException.ThrowIfNull(uri);
return new(uri, value);
}
diff --git a/src/Http/Http.Results/src/UnauthorizedHttpResult.cs b/src/Http/Http.Results/src/UnauthorizedHttpResult.cs
index e6dfaec3d8..a1a1320514 100644
--- a/src/Http/Http.Results/src/UnauthorizedHttpResult.cs
+++ b/src/Http/Http.Results/src/UnauthorizedHttpResult.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// Represents an <see cref="IResult"/> that when executed will
/// produce an HTTP response with the No Unauthorized (401) status code.
/// </summary>
-public sealed class UnauthorizedHttpResult : IResult
+public sealed class UnauthorizedHttpResult : IResult, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="UnauthorizedHttpResult"/> class.
@@ -24,9 +24,13 @@ public sealed class UnauthorizedHttpResult : IResult
/// </summary>
public int StatusCode => StatusCodes.Status401Unauthorized;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc />
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.UnauthorizedResult");
diff --git a/src/Http/Http.Results/src/UnprocessableEntity.cs b/src/Http/Http.Results/src/UnprocessableEntity.cs
index eaa851ae1c..6a56964d17 100644
--- a/src/Http/Http.Results/src/UnprocessableEntity.cs
+++ b/src/Http/Http.Results/src/UnprocessableEntity.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write an object to the response
/// with Unprocessable Entity (422) status code.
/// </summary>
-public sealed class UnprocessableEntity : IResult, IEndpointMetadataProvider
+public sealed class UnprocessableEntity : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult
{
/// <summary>
/// Initializes a new instance of the <see cref="UnprocessableEntity"/> class with the values
@@ -26,9 +26,13 @@ public sealed class UnprocessableEntity : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status422UnprocessableEntity;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc />
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.UnprocessableEntityObjectResult");
@@ -42,6 +46,8 @@ public sealed class UnprocessableEntity : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(StatusCodes.Status422UnprocessableEntity));
}
}
diff --git a/src/Http/Http.Results/src/UnprocessableEntityOfT.cs b/src/Http/Http.Results/src/UnprocessableEntityOfT.cs
index 3232114b56..b1abbf6fae 100644
--- a/src/Http/Http.Results/src/UnprocessableEntityOfT.cs
+++ b/src/Http/Http.Results/src/UnprocessableEntityOfT.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// with Unprocessable Entity (422) status code.
/// </summary>
/// <typeparam name="TValue">The type of object that will be JSON serialized to the response body.</typeparam>
-public sealed class UnprocessableEntity<TValue> : IResult, IEndpointMetadataProvider
+public sealed class UnprocessableEntity<TValue> : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IValueHttpResult, IValueHttpResult<TValue>
{
/// <summary>
/// Initializes a new instance of the <see cref="UnprocessableEntity"/> class with the values
@@ -30,14 +30,20 @@ public sealed class UnprocessableEntity<TValue> : IResult, IEndpointMetadataProv
/// </summary>
public TValue? Value { get; }
+ object? IValueHttpResult.Value => Value;
+
/// <summary>
/// Gets the HTTP status code: <see cref="StatusCodes.Status422UnprocessableEntity"/>
/// </summary>
public int StatusCode => StatusCodes.Status422UnprocessableEntity;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc />
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
// Creating the logger with a string to preserve the category after the refactoring.
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.UnprocessableEntityObjectResult");
@@ -54,6 +60,8 @@ public sealed class UnprocessableEntity<TValue> : IResult, IEndpointMetadataProv
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(TValue), StatusCodes.Status422UnprocessableEntity, "application/json"));
}
}
diff --git a/src/Http/Http.Results/src/Utf8ContentHttpResult.cs b/src/Http/Http.Results/src/Utf8ContentHttpResult.cs
new file mode 100644
index 0000000000..725c2135e2
--- /dev/null
+++ b/src/Http/Http.Results/src/Utf8ContentHttpResult.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+/// <summary>
+/// An <see cref="Utf8ContentHttpResult"/> that when executed
+/// will produce a response with content.
+/// </summary>
+public sealed partial class Utf8ContentHttpResult : IResult, IStatusCodeHttpResult, IContentTypeHttpResult
+{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Utf8ContentHttpResult"/> class with the values
+ /// </summary>
+ /// <param name="utf8Content">The value to format in the entity body.</param>
+ /// <param name="statusCode">The HTTP status code of the response.</param>
+ /// <param name="contentType">The Content-Type header for the response.</param>
+ internal Utf8ContentHttpResult(ReadOnlySpan<byte> utf8Content, string? contentType, int? statusCode)
+ {
+ // We need to make a copy here since we have to stash it on the heap
+ ResponseContent = utf8Content.ToArray();
+ StatusCode = statusCode;
+ ContentType = contentType;
+ }
+
+ /// <summary>
+ /// Gets the content representing the body of the response.
+ /// </summary>
+ public ReadOnlyMemory<byte> ResponseContent { get; internal init; }
+
+ /// <summary>
+ /// Gets the Content-Type header for the response.
+ /// </summary>
+ public string? ContentType { get; internal init; }
+
+ /// <summary>
+ /// Gets the HTTP status code.
+ /// </summary>
+ public int? StatusCode { get; internal init; }
+
+ /// <summary>
+ /// Writes the content to the HTTP response.
+ /// </summary>
+ /// <param name="httpContext">The <see cref="HttpContext"/> for the current request.</param>
+ /// <returns>A task that represents the asynchronous execute operation.</returns>
+ public Task ExecuteAsync(HttpContext httpContext)
+ {
+ ArgumentNullException.ThrowIfNull(httpContext);
+
+ // Creating the logger with a string to preserve the category after the refactoring.
+ var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
+ var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Http.Result.Utf8ContentHttpResult");
+
+ if (StatusCode is { } statusCode)
+ {
+ HttpResultsHelper.Log.WritingResultAsStatusCode(logger, statusCode);
+ httpContext.Response.StatusCode = statusCode;
+ }
+
+ httpContext.Response.ContentType = ContentType ?? HttpResultsHelper.DefaultContentType;
+
+ httpContext.Response.ContentLength = ResponseContent.Length;
+ return httpContext.Response.Body.WriteAsync(ResponseContent).AsTask();
+ }
+}
diff --git a/src/Http/Http.Results/src/ValidationProblem.cs b/src/Http/Http.Results/src/ValidationProblem.cs
index 9812ec9ce0..36631d141e 100644
--- a/src/Http/Http.Results/src/ValidationProblem.cs
+++ b/src/Http/Http.Results/src/ValidationProblem.cs
@@ -11,18 +11,18 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// An <see cref="IResult"/> that on execution will write Problem Details
/// HTTP API responses based on https://tools.ietf.org/html/rfc7807
/// </summary>
-public sealed class ValidationProblem : IResult, IEndpointMetadataProvider
+public sealed class ValidationProblem : IResult, IEndpointMetadataProvider, IStatusCodeHttpResult, IContentTypeHttpResult, IValueHttpResult, IValueHttpResult<HttpValidationProblemDetails>
{
internal ValidationProblem(HttpValidationProblemDetails problemDetails)
{
- ArgumentNullException.ThrowIfNull(problemDetails, nameof(problemDetails));
+ ArgumentNullException.ThrowIfNull(problemDetails);
if (problemDetails is { Status: not null and not StatusCodes.Status400BadRequest })
{
throw new ArgumentException($"{nameof(ValidationProblem)} only supports a 400 Bad Request response status code.", nameof(problemDetails));
}
ProblemDetails = problemDetails;
- HttpResultsHelper.ApplyProblemDetailsDefaults(ProblemDetails, statusCode: StatusCodes.Status400BadRequest);
+ ProblemDetailsDefaults.Apply(ProblemDetails, statusCode: StatusCodes.Status400BadRequest);
}
/// <summary>
@@ -30,6 +30,10 @@ public sealed class ValidationProblem : IResult, IEndpointMetadataProvider
/// </summary>
public HttpValidationProblemDetails ProblemDetails { get; }
+ object? IValueHttpResult.Value => ProblemDetails;
+
+ HttpValidationProblemDetails? IValueHttpResult<HttpValidationProblemDetails>.Value => ProblemDetails;
+
/// <summary>
/// Gets the value for the <c>Content-Type</c> header: <c>application/problem+json</c>.
/// </summary>
@@ -40,9 +44,13 @@ public sealed class ValidationProblem : IResult, IEndpointMetadataProvider
/// </summary>
public int StatusCode => StatusCodes.Status400BadRequest;
+ int? IStatusCodeHttpResult.StatusCode => StatusCode;
+
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var loggerFactory = httpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger(typeof(ValidationProblem));
@@ -59,6 +67,8 @@ public sealed class ValidationProblem : IResult, IEndpointMetadataProvider
/// <inheritdoc/>
static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)
{
+ ArgumentNullException.ThrowIfNull(context);
+
context.EndpointMetadata.Add(new ProducesResponseTypeMetadata(typeof(HttpValidationProblemDetails), StatusCodes.Status400BadRequest, "application/problem+json"));
}
}
diff --git a/src/Http/Http.Results/src/VirtualFileHttpResult.cs b/src/Http/Http.Results/src/VirtualFileHttpResult.cs
index 6739676d97..63f5b83d77 100644
--- a/src/Http/Http.Results/src/VirtualFileHttpResult.cs
+++ b/src/Http/Http.Results/src/VirtualFileHttpResult.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
/// A <see cref="IResult" /> that on execution writes the file specified
/// using a virtual path to the response using mechanisms provided by the host.
/// </summary>
-public sealed class VirtualFileHttpResult : IResult
+public sealed class VirtualFileHttpResult : IResult, IFileHttpResult, IContentTypeHttpResult
{
private string _fileName;
@@ -62,7 +62,7 @@ public sealed class VirtualFileHttpResult : IResult
DateTimeOffset? lastModified = null,
EntityTagHeaderValue? entityTag = null)
{
- FileName = fileName ?? throw new ArgumentNullException(nameof(fileName));
+ FileName = fileName;
ContentType = contentType ?? "application/octet-stream";
FileDownloadName = fileDownloadName;
EnableRangeProcessing = enableRangeProcessing;
@@ -101,6 +101,8 @@ public sealed class VirtualFileHttpResult : IResult
/// <inheritdoc/>
public Task ExecuteAsync(HttpContext httpContext)
{
+ ArgumentNullException.ThrowIfNull(httpContext);
+
var hostingEnvironment = httpContext.RequestServices.GetRequiredService<IWebHostEnvironment>();
var fileInfo = GetFileInformation(hostingEnvironment.WebRootFileProvider);
diff --git a/src/Http/Http.Results/test/AcceptedAtRouteOfTResultTests.cs b/src/Http/Http.Results/test/AcceptedAtRouteOfTResultTests.cs
index 45fb26fd95..40add2624b 100644
--- a/src/Http/Http.Results/test/AcceptedAtRouteOfTResultTests.cs
+++ b/src/Http/Http.Results/test/AcceptedAtRouteOfTResultTests.cs
@@ -122,7 +122,7 @@ public class AcceptedAtRouteOfTResultTests
// Arrange
AcceptedAtRoute<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<AcceptedAtRoute<Todo>>(context);
@@ -134,6 +134,73 @@ public class AcceptedAtRouteOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new AcceptedAtRoute<object>(null, null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<AcceptedAtRoute<object>>(null));
+ }
+
+ [Fact]
+ public void AcceptedAtRouteResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Arrange
+ var routeValues = new RouteValueDictionary(new Dictionary<string, string>()
+ {
+ { "test", "case" },
+ { "sample", "route" }
+ });
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new AcceptedAtRoute<string>(routeValues, null));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
+ [Fact]
+ public void AcceptedAtRouteResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var routeValues = new RouteValueDictionary(new Dictionary<string, string>()
+ {
+ { "test", "case" },
+ { "sample", "route" }
+ });
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new AcceptedAtRoute<string>(routeValues, value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void AcceptedAtRouteResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange & Act
+ var routeValues = new RouteValueDictionary(new Dictionary<string, string>()
+ {
+ { "test", "case" },
+ { "sample", "route" }
+ });
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new AcceptedAtRoute<string>(routeValues, value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/AcceptedAtRouteResultTests.cs b/src/Http/Http.Results/test/AcceptedAtRouteResultTests.cs
index 4c43df6dfb..8f00d120d7 100644
--- a/src/Http/Http.Results/test/AcceptedAtRouteResultTests.cs
+++ b/src/Http/Http.Results/test/AcceptedAtRouteResultTests.cs
@@ -75,7 +75,7 @@ public class AcceptedAtRouteResultTests
// Arrange
AcceptedAtRoute MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<AcceptedAtRoute>(context);
@@ -85,6 +85,32 @@ public class AcceptedAtRouteResultTests
Assert.Equal(StatusCodes.Status202Accepted, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new AcceptedAtRoute(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<AcceptedAtRoute>(null));
+ }
+
+ [Fact]
+ public void AcceptedAtRouteResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new AcceptedAtRoute(null));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/AcceptedOfTResultTests.cs b/src/Http/Http.Results/test/AcceptedOfTResultTests.cs
index 3bc477cffa..9f84c90d3b 100644
--- a/src/Http/Http.Results/test/AcceptedOfTResultTests.cs
+++ b/src/Http/Http.Results/test/AcceptedOfTResultTests.cs
@@ -4,6 +4,7 @@
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Http.HttpResults;
@@ -62,7 +63,7 @@ public class AcceptedOfTResultTests
// Arrange
Accepted<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Accepted<Todo>>(context);
@@ -74,6 +75,56 @@ public class AcceptedOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Accepted<object>("location", null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Accepted<object>>(null));
+ }
+
+ [Fact]
+ public void AcceptedResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Accepted<string>("location", null));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
+ [Fact]
+ public void AcceptedResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new Accepted<string>("location", value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void AcceptedResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new Accepted<string>("location", value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/AcceptedResultTests.cs b/src/Http/Http.Results/test/AcceptedResultTests.cs
index a8fad797f1..d7233b14cf 100644
--- a/src/Http/Http.Results/test/AcceptedResultTests.cs
+++ b/src/Http/Http.Results/test/AcceptedResultTests.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Http.HttpResults;
public class AcceptedResultTests
{
[Fact]
- public async Task ExecuteResultAsync_SetsStatusCodeAndLocationHeader()
+ public async Task ExecuteAsync_SetsStatusCodeAndLocationHeader()
{
// Arrange
var expectedUrl = "testAction";
@@ -32,7 +32,7 @@ public class AcceptedResultTests
// Arrange
Accepted MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Accepted>(context);
@@ -41,6 +41,32 @@ public class AcceptedResultTests
Assert.Contains(context.EndpointMetadata, m => m is ProducesResponseTypeMetadata { StatusCode: StatusCodes.Status202Accepted });
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Accepted("location");
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Accepted>(null));
+ }
+
+ [Fact]
+ public void AcceptedResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Accepted("location"));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/BadRequestOfTResultTests.cs b/src/Http/Http.Results/test/BadRequestOfTResultTests.cs
index 8d223c3b46..da4e22dbd3 100644
--- a/src/Http/Http.Results/test/BadRequestOfTResultTests.cs
+++ b/src/Http/Http.Results/test/BadRequestOfTResultTests.cs
@@ -10,6 +10,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
+using Newtonsoft.Json.Linq;
public class BadRequestOfTResultTests
{
@@ -104,7 +105,7 @@ public class BadRequestOfTResultTests
// Arrange
BadRequest<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<BadRequest<Todo>>(context);
@@ -116,6 +117,56 @@ public class BadRequestOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new BadRequest<object>(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<BadRequest<object>>(null));
+ }
+
+ [Fact]
+ public void BadRequestObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new BadRequest<string>(null));
+ Assert.Equal(StatusCodes.Status400BadRequest, result.StatusCode);
+ }
+
+ [Fact]
+ public void BadRequestObjectResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new BadRequest<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void BadRequestObjectResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+
+ // Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new BadRequest<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/BadRequestResultTests.cs b/src/Http/Http.Results/test/BadRequestResultTests.cs
index 30286b384b..90855243c7 100644
--- a/src/Http/Http.Results/test/BadRequestResultTests.cs
+++ b/src/Http/Http.Results/test/BadRequestResultTests.cs
@@ -45,7 +45,7 @@ public class BadRequestResultTests
// Arrange
BadRequest MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<BadRequest>(context);
@@ -55,6 +55,32 @@ public class BadRequestResultTests
Assert.Equal(StatusCodes.Status400BadRequest, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new BadRequest();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<BadRequest>(null));
+ }
+
+ [Fact]
+ public void BadRequestObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new BadRequest());
+ Assert.Equal(StatusCodes.Status400BadRequest, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/ChallengeResultTests.cs b/src/Http/Http.Results/test/ChallengeResultTests.cs
index a5d02031d5..28ae90c013 100644
--- a/src/Http/Http.Results/test/ChallengeResultTests.cs
+++ b/src/Http/Http.Results/test/ChallengeResultTests.cs
@@ -41,6 +41,17 @@ public class ChallengeResultTests
auth.Verify(c => c.ChallengeAsync(httpContext, null, null), Times.Exactly(1));
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new ChallengeHttpResult();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
private static DefaultHttpContext GetHttpContext(Mock<IAuthenticationService> auth)
{
var httpContext = new DefaultHttpContext();
diff --git a/src/Http/Http.Results/test/ConflictOfTResultTests.cs b/src/Http/Http.Results/test/ConflictOfTResultTests.cs
index 9ecf5b06dc..467460f757 100644
--- a/src/Http/Http.Results/test/ConflictOfTResultTests.cs
+++ b/src/Http/Http.Results/test/ConflictOfTResultTests.cs
@@ -83,7 +83,7 @@ public class ConflictOfTResultTests
// Arrange
Conflict<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Conflict<Todo>>(context);
@@ -95,6 +95,56 @@ public class ConflictOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Conflict<object>(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Conflict<object>>(null));
+ }
+
+ [Fact]
+ public void ConflictObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Conflict<string>(null));
+ Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode);
+ }
+
+ [Fact]
+ public void ConflictObjectResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new Conflict<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void ConflictObjectResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new Conflict<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/ConflictResultTests.cs b/src/Http/Http.Results/test/ConflictResultTests.cs
index 45337e675b..1ee5f5d280 100644
--- a/src/Http/Http.Results/test/ConflictResultTests.cs
+++ b/src/Http/Http.Results/test/ConflictResultTests.cs
@@ -46,7 +46,7 @@ public class ConflictResultTests
// Arrange
Conflict MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Conflict>(context);
@@ -56,6 +56,32 @@ public class ConflictResultTests
Assert.Equal(StatusCodes.Status409Conflict, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Conflict();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Conflict>(null));
+ }
+
+ [Fact]
+ public void ConflictObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Conflict());
+ Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/ContentResultTests.cs b/src/Http/Http.Results/test/ContentResultTests.cs
index 7b316c4109..e380926b48 100644
--- a/src/Http/Http.Results/test/ContentResultTests.cs
+++ b/src/Http/Http.Results/test/ContentResultTests.cs
@@ -123,6 +123,50 @@ public class ContentResultTests
Assert.Equal(expectedContentData.Length, httpContext.Response.ContentLength);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new ContentHttpResult("content", null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void ContentResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new ContentHttpResult("content", contentType));
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void ContentResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new ContentHttpResult("content", contentType, StatusCodes.Status202Accepted));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
+ [Fact]
+ public void ContentResult_Implements_IStatusCodeHttpResult_Correctly_WithNullStatus()
+ {
+ // Arrange
+ var contentType = "application/custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new ContentHttpResult("content", contentType));
+ Assert.Null(result.StatusCode);
+ }
+
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
diff --git a/src/Http/Http.Results/test/CreatedAtRouteOfTResultTests.cs b/src/Http/Http.Results/test/CreatedAtRouteOfTResultTests.cs
index afa6c0cfb4..7135db889f 100644
--- a/src/Http/Http.Results/test/CreatedAtRouteOfTResultTests.cs
+++ b/src/Http/Http.Results/test/CreatedAtRouteOfTResultTests.cs
@@ -89,7 +89,7 @@ public partial class CreatedAtRouteOfTResultTests
// Arrange
CreatedAtRoute<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<CreatedAtRoute<Todo>>(context);
@@ -101,6 +101,70 @@ public partial class CreatedAtRouteOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new CreatedAtRoute<object>(null, null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<CreatedAtRoute<object>>(null));
+ }
+
+ [Fact]
+ public void CreatedAtRouteResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var rawResult = new CreatedAtRoute<object>(
+ routeName: null,
+ routeValues: new Dictionary<string, object>(),
+ value: null);
+
+ // Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(rawResult);
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ }
+
+ [Fact]
+ public void CreatedAtRouteResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+ var rawResult = new CreatedAtRoute<string>(
+ routeName: null,
+ routeValues: new Dictionary<string, object>(),
+ value: value);
+
+ // Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(rawResult);
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void CreatedAtRouteResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+ var rawResult = new CreatedAtRoute<string>(
+ routeName: null,
+ routeValues: new Dictionary<string, object>(),
+ value: value);
+
+ // Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(rawResult);
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/CreatedAtRouteResultTests.cs b/src/Http/Http.Results/test/CreatedAtRouteResultTests.cs
index bd8f0c2a0f..2350aa400b 100644
--- a/src/Http/Http.Results/test/CreatedAtRouteResultTests.cs
+++ b/src/Http/Http.Results/test/CreatedAtRouteResultTests.cs
@@ -71,7 +71,7 @@ public partial class CreatedAtRouteResultTests
// Arrange
CreatedAtRoute MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<CreatedAtRoute>(context);
@@ -81,6 +81,37 @@ public partial class CreatedAtRouteResultTests
Assert.Equal(StatusCodes.Status201Created, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new CreatedAtRoute(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<CreatedAtRoute>(null));
+ }
+
+ [Fact]
+ public void CreatedAtRouteResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var rawResult = new CreatedAtRoute(
+ routeName: null,
+ routeValues: new Dictionary<string, object>());
+
+ // Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(rawResult);
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/CreatedOfTResultTests.cs b/src/Http/Http.Results/test/CreatedOfTResultTests.cs
index f0ac3d838f..007cf5e86c 100644
--- a/src/Http/Http.Results/test/CreatedOfTResultTests.cs
+++ b/src/Http/Http.Results/test/CreatedOfTResultTests.cs
@@ -97,7 +97,7 @@ public class CreatedOfTResultTests
// Arrange
Created<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Created<Todo>>(context);
@@ -109,6 +109,61 @@ public class CreatedOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Created<object>("location", null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Created<object>>(null));
+ }
+
+ [Fact]
+ public void CreatedResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var location = "/test/";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Created<string>(location, null));
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ }
+
+ [Fact]
+ public void AcceptedResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var location = "/test/";
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new Created<string>(location, value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void AcceptedResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange
+ var location = "/test/";
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new Created<string>(location, value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/CreatedResultTests.cs b/src/Http/Http.Results/test/CreatedResultTests.cs
index 0591cd7db0..493c588574 100644
--- a/src/Http/Http.Results/test/CreatedResultTests.cs
+++ b/src/Http/Http.Results/test/CreatedResultTests.cs
@@ -63,7 +63,7 @@ public class CreatedResultTests
// Arrange
Created MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Created>(context);
@@ -73,6 +73,35 @@ public class CreatedResultTests
Assert.Equal(StatusCodes.Status201Created, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Created("location");
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Created>(null));
+ }
+
+ [Fact]
+ public void CreatedResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var location = "/test/";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Created(location));
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/EmptyResultTests.cs b/src/Http/Http.Results/test/EmptyResultTests.cs
index cde7fde649..f974a0211a 100644
--- a/src/Http/Http.Results/test/EmptyResultTests.cs
+++ b/src/Http/Http.Results/test/EmptyResultTests.cs
@@ -23,6 +23,17 @@ public class EmptyResultTests
Assert.Equal(0, memoryStream.Length);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = EmptyHttpResult.Instance;
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
private static HttpContext GetHttpContext()
{
var httpContext = new DefaultHttpContext();
diff --git a/src/Http/Http.Results/test/EmptyServiceProvider.cs b/src/Http/Http.Results/test/EmptyServiceProvider.cs
new file mode 100644
index 0000000000..1960ce9401
--- /dev/null
+++ b/src/Http/Http.Results/test/EmptyServiceProvider.cs
@@ -0,0 +1,11 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+internal sealed class EmptyServiceProvider : IServiceProvider
+{
+ public static IServiceProvider Instance { get; } = new EmptyServiceProvider();
+
+ public object GetService(Type serviceType) => null;
+}
diff --git a/src/Http/Http.Results/test/FileContentResultTests.cs b/src/Http/Http.Results/test/FileContentResultTests.cs
index eba9c1ead3..2c648508ff 100644
--- a/src/Http/Http.Results/test/FileContentResultTests.cs
+++ b/src/Http/Http.Results/test/FileContentResultTests.cs
@@ -33,4 +33,29 @@ public class FileContentResultTests : FileContentResultTestBase
return result.ExecuteAsync(httpContext);
}
+
+ [Fact]
+ public void FileContentResult_Implements_IFileHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IFileHttpResult>(new FileContentHttpResult(Array.Empty<byte>(), contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ Assert.Equal(downloadName, result.FileDownloadName);
+ }
+
+ [Fact]
+ public void FileContentResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new FileContentHttpResult(Array.Empty<byte>(), contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ }
}
diff --git a/src/Http/Http.Results/test/ForbidResultTests.cs b/src/Http/Http.Results/test/ForbidResultTests.cs
index ee58a6539e..a28e203045 100644
--- a/src/Http/Http.Results/test/ForbidResultTests.cs
+++ b/src/Http/Http.Results/test/ForbidResultTests.cs
@@ -108,6 +108,17 @@ public class ForbidResultTests
auth.Verify();
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new ForbidHttpResult();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
private static DefaultHttpContext GetHttpContext(IAuthenticationService auth)
{
var httpContext = new DefaultHttpContext();
diff --git a/src/Http/Http.Results/test/HttpFileStreamResultTests.cs b/src/Http/Http.Results/test/HttpFileStreamResultTests.cs
index 40cbc188ee..8b31dd2662 100644
--- a/src/Http/Http.Results/test/HttpFileStreamResultTests.cs
+++ b/src/Http/Http.Results/test/HttpFileStreamResultTests.cs
@@ -78,4 +78,39 @@ public class HttpFileStreamResultTests : FileStreamResultTestBase
Assert.Equal(expectedMediaType, result.ContentType);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new FileStreamHttpResult(new MemoryStream(), null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void FileStreamHttpResult_Implements_IFileHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IFileHttpResult>(new FileStreamHttpResult(new MemoryStream(), contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ Assert.Equal(downloadName, result.FileDownloadName);
+ }
+
+ [Fact]
+ public void FileStreamHttpResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";;
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new FileStreamHttpResult(new MemoryStream(), contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ }
}
diff --git a/src/Http/Http.Results/test/JsonResultTests.cs b/src/Http/Http.Results/test/JsonResultTests.cs
index d0804b3ab4..af600b795a 100644
--- a/src/Http/Http.Results/test/JsonResultTests.cs
+++ b/src/Http/Http.Results/test/JsonResultTests.cs
@@ -206,6 +206,76 @@ public class JsonResultTests
Assert.Equal(StatusCodes.Status413RequestEntityTooLarge, httpContext.Response.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new JsonHttpResult<object>(null, null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void JsonResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/json+custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new JsonHttpResult<string>(null, StatusCodes.Status200OK, contentType, null));
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void JsonResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/json+custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new JsonHttpResult<string>(null, StatusCodes.Status202Accepted, contentType, null));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
+ [Fact]
+ public void JsonResult_Implements_IStatusCodeHttpResult_Correctly_WithNullStatus()
+ {
+ // Arrange
+ var contentType = "application/json+custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new JsonHttpResult<string>(null, statusCode: null, contentType, null));
+ Assert.Null(result.StatusCode);
+ }
+
+ [Fact]
+ public void JsonResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+ var contentType = "application/json+custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new JsonHttpResult<string>(value, statusCode: null, contentType, null));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void JsonResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+ var contentType = "application/json+custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new JsonHttpResult<string>(value, statusCode: null, contentType, null));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static IServiceProvider CreateServices()
{
var services = new ServiceCollection();
diff --git a/src/Http/Http.Results/test/Microsoft.AspNetCore.Http.Results.Tests.csproj b/src/Http/Http.Results/test/Microsoft.AspNetCore.Http.Results.Tests.csproj
index e89f395279..c9d39f858d 100644
--- a/src/Http/Http.Results/test/Microsoft.AspNetCore.Http.Results.Tests.csproj
+++ b/src/Http/Http.Results/test/Microsoft.AspNetCore.Http.Results.Tests.csproj
@@ -15,7 +15,7 @@
<Compile Include="$(SharedSourceRoot)ResultsTests\*.cs" LinkBase="Shared" />
<Content Include="$(HttpResultsSourceRoot)\ResultsCache.StatusCodes.tt" LinkBase="Shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
<Content Include="$(HttpResultsSourceRoot)\ResultsCache.StatusCodes.cs" LinkBase="Shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
- <Content Include="$(HttpResultsSourceRoot)\ResultsOfT.cs" LinkBase="Shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
+ <Content Include="$(HttpResultsSourceRoot)\ResultsOfT.Generated.cs" LinkBase="Shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
<Compile Update="ResultsOfTTests.Generated.cs" Link="Shared\GeneratedContent\%(RecursiveDir)%(Filename)%(Extension)" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
diff --git a/src/Http/Http.Results/test/NoContentResultTests.cs b/src/Http/Http.Results/test/NoContentResultTests.cs
index de0c82a632..f2fe39be7b 100644
--- a/src/Http/Http.Results/test/NoContentResultTests.cs
+++ b/src/Http/Http.Results/test/NoContentResultTests.cs
@@ -42,7 +42,7 @@ public class NoContentResultTests
// Arrange
NoContent MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<NoContent>(context);
@@ -52,6 +52,32 @@ public class NoContentResultTests
Assert.Equal(StatusCodes.Status204NoContent, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new NoContent();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<NoContent>(null));
+ }
+
+ [Fact]
+ public void NoContentResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new NoContent());
+ Assert.Equal(StatusCodes.Status204NoContent, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/NotFoundOfTResultTests.cs b/src/Http/Http.Results/test/NotFoundOfTResultTests.cs
index 9a15ae0d76..73a970ea1c 100644
--- a/src/Http/Http.Results/test/NotFoundOfTResultTests.cs
+++ b/src/Http/Http.Results/test/NotFoundOfTResultTests.cs
@@ -65,7 +65,7 @@ public class NotFoundOfTResultTests
// Arrange
NotFound<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<NotFound<Todo>>(context);
@@ -77,6 +77,56 @@ public class NotFoundOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new NotFound<object>(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<NotFound<object>>(null));
+ }
+
+ [Fact]
+ public void NotFoundResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new NotFound<object>(null));
+ Assert.Equal(StatusCodes.Status404NotFound, result.StatusCode);
+ }
+
+ [Fact]
+ public void NotFoundResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new NotFound<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void NotFoundResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange & Act
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new NotFound<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/NotFoundResultTests.cs b/src/Http/Http.Results/test/NotFoundResultTests.cs
index 20d69a54e4..7568b5fb9c 100644
--- a/src/Http/Http.Results/test/NotFoundResultTests.cs
+++ b/src/Http/Http.Results/test/NotFoundResultTests.cs
@@ -41,7 +41,7 @@ public class NotFoundResultTests
// Arrange
NotFound MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<NotFound>(context);
@@ -51,6 +51,32 @@ public class NotFoundResultTests
Assert.Equal(StatusCodes.Status404NotFound, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new NotFound();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<NotFound>(null));
+ }
+
+ [Fact]
+ public void NotFoundResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new NotFound());
+ Assert.Equal(StatusCodes.Status404NotFound, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/OkOfTResultTests.cs b/src/Http/Http.Results/test/OkOfTResultTests.cs
index 11e1af79a2..a4274ce241 100644
--- a/src/Http/Http.Results/test/OkOfTResultTests.cs
+++ b/src/Http/Http.Results/test/OkOfTResultTests.cs
@@ -82,7 +82,7 @@ public class OkOfTResultTests
// Arrange
Ok<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Ok<Todo>>(context);
@@ -94,6 +94,56 @@ public class OkOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Ok<object>(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Ok<object>>(null));
+ }
+
+ [Fact]
+ public void OkResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Ok<object>(null));
+ Assert.Equal(StatusCodes.Status200OK, result.StatusCode);
+ }
+
+ [Fact]
+ public void OkResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new Ok<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void OkResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new Ok<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/OkResultTests.cs b/src/Http/Http.Results/test/OkResultTests.cs
index c199a2b086..4d3add27c9 100644
--- a/src/Http/Http.Results/test/OkResultTests.cs
+++ b/src/Http/Http.Results/test/OkResultTests.cs
@@ -45,7 +45,7 @@ public class OkResultTests
// Arrange
Ok MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Ok>(context);
@@ -55,6 +55,32 @@ public class OkResultTests
Assert.Equal(StatusCodes.Status200OK, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new Ok();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Ok>(null));
+ }
+
+ [Fact]
+ public void OkObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Ok());
+ Assert.Equal(StatusCodes.Status200OK, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/PhysicalFileResultTest.cs b/src/Http/Http.Results/test/PhysicalFileResultTest.cs
index e1a4c18b5d..6469ec2057 100644
--- a/src/Http/Http.Results/test/PhysicalFileResultTest.cs
+++ b/src/Http/Http.Results/test/PhysicalFileResultTest.cs
@@ -35,4 +35,29 @@ public class PhysicalFileResultTest : PhysicalFileResultTestBase
return fileResult.ExecuteAsync(httpContext);
}
+
+ [Fact]
+ public void PhysicalFileResult_Implements_IFileHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IFileHttpResult>(new PhysicalFileHttpResult("file.zip", contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ Assert.Equal(downloadName, result.FileDownloadName);
+ }
+
+ [Fact]
+ public void PhysicalFileResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new PhysicalFileHttpResult("file.zip", contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ }
}
diff --git a/src/Http/Http.Results/test/ProblemResultTests.cs b/src/Http/Http.Results/test/ProblemResultTests.cs
index 35bf6ea7ba..d8a262efd1 100644
--- a/src/Http/Http.Results/test/ProblemResultTests.cs
+++ b/src/Http/Http.Results/test/ProblemResultTests.cs
@@ -70,6 +70,38 @@ public class ProblemResultTests
}
[Fact]
+ public async Task ExecuteAsync_IncludeErrors_ForValidationProblemDetails()
+ {
+ // Arrange
+ var details = new HttpValidationProblemDetails(new Dictionary<string, string[]>
+ {
+ { "testError", new string[] { "message" } }
+ });
+
+ var result = new ProblemHttpResult(details);
+ var stream = new MemoryStream();
+ var httpContext = new DefaultHttpContext()
+ {
+ RequestServices = CreateServices(),
+ Response =
+ {
+ Body = stream,
+ },
+ };
+
+ // Act
+ await result.ExecuteAsync(httpContext);
+
+ // Assert
+ Assert.Equal(StatusCodes.Status400BadRequest, httpContext.Response.StatusCode);
+ stream.Position = 0;
+ var responseDetails = JsonSerializer.Deserialize<HttpValidationProblemDetails>(stream);
+ Assert.Equal(StatusCodes.Status400BadRequest, responseDetails.Status);
+ var error = Assert.Single(responseDetails.Errors);
+ Assert.Equal("testError", error.Key);
+ }
+
+ [Fact]
public async Task ExecuteAsync_GetsStatusCodeFromProblemDetails()
{
// Arrange
@@ -91,6 +123,65 @@ public class ProblemResultTests
Assert.Equal(StatusCodes.Status413RequestEntityTooLarge, httpContext.Response.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new ProblemHttpResult(new());
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void ProblemResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new ProblemHttpResult(new() { Status = StatusCodes.Status416RangeNotSatisfiable }));
+ Assert.Equal(StatusCodes.Status416RangeNotSatisfiable, result.StatusCode);
+ }
+
+ [Fact]
+ public void ProblemResult_Implements_IStatusCodeHttpResult_Correctly_WithDefaultStatusCode()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new ProblemHttpResult(new()));
+ Assert.Equal(StatusCodes.Status500InternalServerError, result.StatusCode);
+ }
+
+ [Fact]
+ public void ProblemResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = new ProblemDetails();
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new ProblemHttpResult(value));
+ Assert.IsType<ProblemDetails>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void ProblemResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange
+ var value = new ProblemDetails();
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<ProblemDetails>>(new ProblemHttpResult(value));
+ Assert.IsType<ProblemDetails>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void ProblemResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new ProblemHttpResult(new()));
+ Assert.Equal("application/problem+json", result.ContentType);
+ }
+
private static IServiceProvider CreateServices()
{
var services = new ServiceCollection();
diff --git a/src/Http/Http.Results/test/PushStreamResultTests.cs b/src/Http/Http.Results/test/PushStreamResultTests.cs
index 669720f87f..512d0f3b85 100644
--- a/src/Http/Http.Results/test/PushStreamResultTests.cs
+++ b/src/Http/Http.Results/test/PushStreamResultTests.cs
@@ -66,4 +66,40 @@ public class PushStreamResultTests
Assert.Equal(entityTag, result.EntityTag);
Assert.Equal(expectedMediaType, result.ContentType);
}
+
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new PushStreamHttpResult(s => Task.CompletedTask, "content-type");
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PushStreamResult_Implements_IFileHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IFileHttpResult>(new PushStreamHttpResult(s => Task.CompletedTask, contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ Assert.Equal(downloadName, result.FileDownloadName);
+ }
+
+ [Fact]
+ public void PushStreamResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new PushStreamHttpResult(s => Task.CompletedTask, contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ }
}
diff --git a/src/Http/Http.Results/test/RedirectResultTests.cs b/src/Http/Http.Results/test/RedirectResultTests.cs
index 8690e68a5b..6a41ab6acf 100644
--- a/src/Http/Http.Results/test/RedirectResultTests.cs
+++ b/src/Http/Http.Results/test/RedirectResultTests.cs
@@ -22,6 +22,17 @@ public class RedirectResultTests : RedirectResultTestBase
Assert.Same(url, result.Url);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new RedirectHttpResult("url");
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
protected override Task ExecuteAsync(HttpContext httpContext, string contentPath)
{
var redirectResult = new RedirectHttpResult(contentPath, false, false);
diff --git a/src/Http/Http.Results/test/RedirectToRouteResultTests.cs b/src/Http/Http.Results/test/RedirectToRouteResultTests.cs
index d7f27a5561..6df007652e 100644
--- a/src/Http/Http.Results/test/RedirectToRouteResultTests.cs
+++ b/src/Http/Http.Results/test/RedirectToRouteResultTests.cs
@@ -84,6 +84,17 @@ public class RedirectToRouteResultTests
Assert.Equal(expectedUrl, httpContext.Response.Headers["Location"]);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new RedirectToRouteHttpResult(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
private static HttpContext GetHttpContext(string path)
{
var services = CreateServices(path);
diff --git a/src/Http/Http.Results/test/ResultsOfTTests.Generated.cs b/src/Http/Http.Results/test/ResultsOfTTests.Generated.cs
index a17541fa7c..618fe5fed1 100644
--- a/src/Http/Http.Results/test/ResultsOfTTests.Generated.cs
+++ b/src/Http/Http.Results/test/ResultsOfTTests.Generated.cs
@@ -208,7 +208,7 @@ public partial class ResultsOfTTests
// Arrange
Results<ProvidesMetadataResult1, ProvidesMetadataResult2> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2>>(context);
@@ -218,6 +218,13 @@ public partial class ResultsOfTTests
Assert.Contains(context.EndpointMetadata, m => m is ResultTypeProvidedMetadata { SourceTypeName: nameof(ProvidesMetadataResult2) });
}
+ [Fact]
+ public void ResultsOfTResult1TResult2_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2>>(null));
+ }
+
[Theory]
[InlineData(1, typeof(ChecksumResult1))]
[InlineData(2, typeof(ChecksumResult2))]
@@ -480,7 +487,7 @@ public partial class ResultsOfTTests
// Arrange
Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3>>(context);
@@ -491,6 +498,13 @@ public partial class ResultsOfTTests
Assert.Contains(context.EndpointMetadata, m => m is ResultTypeProvidedMetadata { SourceTypeName: nameof(ProvidesMetadataResult3) });
}
+ [Fact]
+ public void ResultsOfTResult1TResult2TResult3_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3>>(null));
+ }
+
[Theory]
[InlineData(1, typeof(ChecksumResult1))]
[InlineData(2, typeof(ChecksumResult2))]
@@ -829,7 +843,7 @@ public partial class ResultsOfTTests
// Arrange
Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4>>(context);
@@ -841,6 +855,13 @@ public partial class ResultsOfTTests
Assert.Contains(context.EndpointMetadata, m => m is ResultTypeProvidedMetadata { SourceTypeName: nameof(ProvidesMetadataResult4) });
}
+ [Fact]
+ public void ResultsOfTResult1TResult2TResult3TResult4_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4>>(null));
+ }
+
[Theory]
[InlineData(1, typeof(ChecksumResult1))]
[InlineData(2, typeof(ChecksumResult2))]
@@ -1263,7 +1284,7 @@ public partial class ResultsOfTTests
// Arrange
Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4, ProvidesMetadataResult5> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4, ProvidesMetadataResult5>>(context);
@@ -1276,6 +1297,13 @@ public partial class ResultsOfTTests
Assert.Contains(context.EndpointMetadata, m => m is ResultTypeProvidedMetadata { SourceTypeName: nameof(ProvidesMetadataResult5) });
}
+ [Fact]
+ public void ResultsOfTResult1TResult2TResult3TResult4TResult5_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4, ProvidesMetadataResult5>>(null));
+ }
+
[Theory]
[InlineData(1, typeof(ChecksumResult1))]
[InlineData(2, typeof(ChecksumResult2))]
@@ -1790,7 +1818,7 @@ public partial class ResultsOfTTests
// Arrange
Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4, ProvidesMetadataResult5, ProvidesMetadataResult6> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4, ProvidesMetadataResult5, ProvidesMetadataResult6>>(context);
@@ -1804,6 +1832,13 @@ public partial class ResultsOfTTests
Assert.Contains(context.EndpointMetadata, m => m is ResultTypeProvidedMetadata { SourceTypeName: nameof(ProvidesMetadataResult6) });
}
+ [Fact]
+ public void ResultsOfTResult1TResult2TResult3TResult4TResult5TResult6_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2, ProvidesMetadataResult3, ProvidesMetadataResult4, ProvidesMetadataResult5, ProvidesMetadataResult6>>(null));
+ }
+
abstract class ChecksumResult : IResult
{
public ChecksumResult(int checksum = 0)
diff --git a/src/Http/Http.Results/test/ResultsOfTTests.cs b/src/Http/Http.Results/test/ResultsOfTTests.cs
index 4cb810d91b..b68cd6eca9 100644
--- a/src/Http/Http.Results/test/ResultsOfTTests.cs
+++ b/src/Http/Http.Results/test/ResultsOfTTests.cs
@@ -22,7 +22,7 @@ public partial class ResultsOfTTests
public void GeneratedCodeIsUpToDate()
{
// This assumes the output is in the repo artifacts directory
- var resultsOfTGeneratedPath = Path.Combine(AppContext.BaseDirectory, "Shared", "GeneratedContent", "ResultsOfT.cs");
+ var resultsOfTGeneratedPath = Path.Combine(AppContext.BaseDirectory, "Shared", "GeneratedContent", "ResultsOfT.Generated.cs");
var testsGeneratedPath = Path.Combine(AppContext.BaseDirectory, "Shared", "GeneratedContent", "ResultsOfTTests.Generated.cs");
var testResultsOfTGeneratedPath = Path.GetTempFileName();
@@ -38,7 +38,7 @@ public partial class ResultsOfTTests
var testResultsOfTGenerated = File.ReadAllText(testResultsOfTGeneratedPath);
var testTestsGenerated = File.ReadAllText(testTestsGeneratedPath);
- AssertFileContentEqual(currentResultsOfTGenerated, testResultsOfTGenerated, "ResultsOfT.cs");
+ AssertFileContentEqual(currentResultsOfTGenerated, testResultsOfTGenerated, "ResultsOfT.Generated.cs");
AssertFileContentEqual(currentTestsGenerated, testTestsGenerated, "ResultsOfTTests.Generated.cs");
}
finally
@@ -94,4 +94,11 @@ public partial class ResultsOfTTests
{
public string SourceTypeName { get; init; }
}
+
+ private class EmptyServiceProvider : IServiceProvider
+ {
+ public static IServiceProvider Instance { get; } = new EmptyServiceProvider();
+
+ public object GetService(Type serviceType) => null;
+ }
}
diff --git a/src/Http/Http.Results/test/ResultsTests.cs b/src/Http/Http.Results/test/ResultsTests.cs
index 213163608c..7d07c33375 100644
--- a/src/Http/Http.Results/test/ResultsTests.cs
+++ b/src/Http/Http.Results/test/ResultsTests.cs
@@ -22,7 +22,7 @@ public class ResultsTests
{
// Arrange
var uri = "https://example.org";
- var value = new { };
+ object value = new { };
// Act
var result = Results.Accepted(uri, value) as Accepted<object>;
@@ -34,6 +34,22 @@ public class ResultsTests
}
[Fact]
+ public void AcceptedOfT_WithUrlAndValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var uri = "https://example.org";
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.Accepted(uri, value) as Accepted<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ Assert.Equal(uri, result.Location);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void Accepted_WithUrl_ResultHasCorrectValues()
{
// Arrange
@@ -64,7 +80,7 @@ public class ResultsTests
// Arrange
var routeName = "routeName";
var routeValues = new { foo = 123 };
- var value = new { };
+ object value = new { };
// Act
var result = Results.AcceptedAtRoute(routeName, routeValues, value) as AcceptedAtRoute<object>;
@@ -77,6 +93,24 @@ public class ResultsTests
}
[Fact]
+ public void AcceptedAtRouteOfT_WithRouteNameAndRouteValuesAndValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var routeName = "routeName";
+ var routeValues = new { foo = 123 };
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.AcceptedAtRoute(routeName, routeValues, value) as AcceptedAtRoute<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ Assert.Equal(routeName, result.RouteName);
+ Assert.Equal(new RouteValueDictionary(routeValues), result.RouteValues);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void AcceptedAtRoute_WithRouteNameAndRouteValues_ResultHasCorrectValues()
{
// Arrange
@@ -108,7 +142,7 @@ public class ResultsTests
public void BadRequest_WithValue_ResultHasCorrectValues()
{
// Arrange
- var value = new { };
+ object value = new { };
// Act
var result = Results.BadRequest(value) as BadRequest<object>;
@@ -119,6 +153,20 @@ public class ResultsTests
}
[Fact]
+ public void BadRequestOfT_WithValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.BadRequest(value) as BadRequest<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status400BadRequest, result.StatusCode);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void BadRequest_WithNoArgs_ResultHasCorrectValues()
{
// Act
@@ -209,6 +257,42 @@ public class ResultsTests
new object[] { 2, default(string), default(string), default(bool), default(DateTimeOffset?), default(EntityTagHeaderValue) }
};
+ [Fact]
+ public void Bytes_WithNullContents_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("contents", () => Results.Bytes(null));
+ }
+
+ [Fact]
+ public void File_WithNullContents_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("fileContents", () => Results.File(default(byte[])));
+ }
+
+ [Fact]
+ public void File_WithNullStream_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("fileStream", () => Results.File(default(Stream)));
+ }
+
+ [Fact]
+ public void Stream_WithNullStream_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("stream", () => Results.Stream(default(Stream)));
+ }
+
+ [Fact]
+ public void Stream_WithNullPipeReader_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("pipeReader", () => Results.Stream(default(PipeReader)));
+ }
+
+ [Fact]
+ public void Stream_WithNullCallback_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("streamWriterCallback", () => TypedResults.Stream(default(Func<Stream, Task>)));
+ }
+
[Theory]
[MemberData(nameof(ChallengeForbidSignInOut_ResultHasCorrectValues_Data))]
public void Challenge_ResultHasCorrectValues(AuthenticationProperties properties, IList<string> authenticationSchemes)
@@ -279,7 +363,7 @@ public class ResultsTests
public void Conflict_WithValue_ResultHasCorrectValues()
{
// Arrange
- var value = new { };
+ object value = new { };
// Act
var result = Results.Conflict(value) as Conflict<object>;
@@ -290,6 +374,20 @@ public class ResultsTests
}
[Fact]
+ public void ConflictOfT_WithValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.Conflict(value) as Conflict<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status409Conflict, result.StatusCode);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void Conflict_WithNoArgs_ResultHasCorrectValues()
{
// Act
@@ -324,12 +422,30 @@ public class ResultsTests
var encoding = Encoding.UTF8;
// Act
- var result = Results.Content(content, contentType, null) as ContentHttpResult;
+ var result = Results.Content(content, contentType, encoding) as ContentHttpResult;
// Assert
Assert.Null(result.StatusCode);
Assert.Equal(content, result.ResponseContent);
- Assert.Equal(contentType, result.ContentType);
+ Assert.Equal("text/plain; charset=utf-8", result.ContentType);
+ }
+
+ [Fact]
+ public void Content_WithContentAndContentTypeAndEncodingAndStatusCode_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content";
+ var contentType = "text/plain";
+ var encoding = Encoding.UTF8;
+ var statusCode = 201;
+
+ // Act
+ var result = Results.Content(content, contentType, encoding, statusCode) as ContentHttpResult;
+
+ // Assert
+ Assert.Equal(statusCode, result.StatusCode);
+ Assert.Equal(content, result.ResponseContent);
+ Assert.Equal("text/plain; charset=utf-8", result.ContentType);
}
[Fact]
@@ -337,7 +453,7 @@ public class ResultsTests
{
// Arrange
var uri = "https://example.com/entity";
- var value = new { };
+ object value = new { };
// Act
var result = Results.Created(uri, value) as Created<object>;
@@ -349,6 +465,22 @@ public class ResultsTests
}
[Fact]
+ public void CreatedOfT_WithStringUriAndValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var uri = "https://example.com/entity";
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.Created(uri, value) as Created<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ Assert.Equal(uri, result.Location);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void Created_WithStringUri_ResultHasCorrectValues()
{
// Arrange
@@ -367,7 +499,7 @@ public class ResultsTests
{
// Arrange
var uri = new Uri("https://example.com/entity");
- var value = new { };
+ object value = new { };
// Act
var result = Results.Created(uri, value) as Created<object>;
@@ -379,6 +511,22 @@ public class ResultsTests
}
[Fact]
+ public void CreatedOfT_WithUriAndValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var uri = new Uri("https://example.com/entity");
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.Created(uri, value) as Created<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ Assert.Equal(uri.ToString(), result.Location);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void Created_WithUri_ResultHasCorrectValues()
{
// Arrange
@@ -393,9 +541,15 @@ public class ResultsTests
}
[Fact]
- public void Created_WithNullStringUri_ThrowsArgNullException()
+ public void Created_WithNullStringUri_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("uri", () => Results.Created(default(string), null));
+ }
+
+ [Fact]
+ public void Created_WithEmptyStringUri_ThrowsArgException()
{
- Assert.Throws<ArgumentNullException>("uri", () => Results.Created(default(string), null));
+ Assert.Throws<ArgumentException>("uri", () => Results.Created(string.Empty, null));
}
[Fact]
@@ -405,12 +559,30 @@ public class ResultsTests
}
[Fact]
+ public void Created_WithNullStringUriAndValue_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("uri", () => Results.Created(default(string), new { }));
+ }
+
+ [Fact]
+ public void Created_WithEmptyStringUriAndValue_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("uri", () => Results.Created(string.Empty, new { }));
+ }
+
+ [Fact]
+ public void Created_WithNullUriAndValue_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("uri", () => Results.Created(default(Uri), new { }));
+ }
+
+ [Fact]
public void CreatedAtRoute_WithRouteNameAndRouteValuesAndValue_ResultHasCorrectValues()
{
// Arrange
var routeName = "routeName";
var routeValues = new { foo = 123 };
- var value = new { };
+ object value = new { };
// Act
var result = Results.CreatedAtRoute(routeName, routeValues, value) as CreatedAtRoute<object>;
@@ -423,11 +595,29 @@ public class ResultsTests
}
[Fact]
+ public void CreatedAtRouteOfT_WithRouteNameAndRouteValuesAndValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var routeName = "routeName";
+ var routeValues = new { foo = 123 };
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.CreatedAtRoute(routeName, routeValues, value) as CreatedAtRoute<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ Assert.Equal(routeName, result.RouteName);
+ Assert.Equal(new RouteValueDictionary(routeValues), result.RouteValues);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void CreatedAtRoute_WithRouteNameAndValue_ResultHasCorrectValues()
{
// Arrange
var routeName = "routeName";
- var value = new { };
+ object value = new { };
// Act
var result = Results.CreatedAtRoute(routeName, null, value) as CreatedAtRoute<object>;
@@ -440,6 +630,23 @@ public class ResultsTests
}
[Fact]
+ public void CreatedAtRouteOfT_WithRouteNameAndValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var routeName = "routeName";
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.CreatedAtRoute(routeName, null, value) as CreatedAtRoute<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status201Created, result.StatusCode);
+ Assert.Equal(routeName, result.RouteName);
+ Assert.Equal(new RouteValueDictionary(), result.RouteValues);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void CreatedAtRoute_WithRouteName_ResultHasCorrectValues()
{
// Arrange
@@ -480,7 +687,7 @@ public class ResultsTests
public void Json_WithAllArgs_ResultHasCorrectValues()
{
// Arrange
- var data = new { };
+ object data = new { };
var options = new JsonSerializerOptions();
var contentType = "application/custom+json";
var statusCode = StatusCodes.Status208AlreadyReported;
@@ -496,6 +703,25 @@ public class ResultsTests
}
[Fact]
+ public void JsonOfT_WithAllArgs_ResultHasCorrectValues()
+ {
+ // Arrange
+ var data = new Todo(1);
+ var options = new JsonSerializerOptions();
+ var contentType = "application/custom+json";
+ var statusCode = StatusCodes.Status208AlreadyReported;
+
+ // Act
+ var result = Results.Json(data, options, contentType, statusCode) as JsonHttpResult<Todo>;
+
+ // Assert
+ Assert.Equal(data, result.Value);
+ Assert.Equal(options, result.JsonSerializerOptions);
+ Assert.Equal(contentType, result.ContentType);
+ Assert.Equal(statusCode, result.StatusCode);
+ }
+
+ [Fact]
public void Json_WithNoArgs_ResultHasCorrectValues()
{
// Act
@@ -509,6 +735,18 @@ public class ResultsTests
}
[Fact]
+ public void LocalRedirect_WithNullStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("localUrl", () => Results.LocalRedirect(default(string)));
+ }
+
+ [Fact]
+ public void LocalRedirect_WithEmptyStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("localUrl", () => Results.LocalRedirect(string.Empty));
+ }
+
+ [Fact]
public void LocalRedirect_WithUrl_ResultHasCorrectValues()
{
// Arrange
@@ -591,7 +829,7 @@ public class ResultsTests
public void NotFound_WithValue_ResultHasCorrectValues()
{
// Arrange
- var value = new { };
+ object value = new { };
// Act
var result = Results.NotFound(value) as NotFound<object>;
@@ -602,6 +840,20 @@ public class ResultsTests
}
[Fact]
+ public void NotFoundOfT_WithValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.NotFound(value) as NotFound<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status404NotFound, result.StatusCode);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void NotFound_WithNoArgs_ResultHasCorrectValues()
{
// Act
@@ -615,7 +867,7 @@ public class ResultsTests
public void Ok_WithValue_ResultHasCorrectValues()
{
// Arrange
- var value = new { };
+ object value = new { };
// Act
var result = Results.Ok(value) as Ok<object>;
@@ -626,6 +878,20 @@ public class ResultsTests
}
[Fact]
+ public void OkOfT_WithValue_ResultHasCorrectValues()
+ {
+ // Arrange
+ var value = new Todo(1);
+
+ // Act
+ var result = Results.Ok(value) as Ok<Todo>;
+
+ // Assert
+ Assert.Equal(StatusCodes.Status200OK, result.StatusCode);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
public void Ok_WithNoArgs_ResultHasCorrectValues()
{
// Act
@@ -636,6 +902,12 @@ public class ResultsTests
}
[Fact]
+ public void Problem_WithNullProblem_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("problemDetails", () => Results.Problem(default(ProblemDetails)));
+ }
+
+ [Fact]
public void Problem_WithArgs_ResultHasCorrectValues()
{
// Arrange
@@ -708,6 +980,12 @@ public class ResultsTests
}
[Fact]
+ public void ValidationProblem_WithNullErrors_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("errors", () => Results.ValidationProblem(default(IDictionary<string, string[]>)));
+ }
+
+ [Fact]
public void ValidationProblem_WithValidationProblemArg_ResultHasCorrectValues()
{
// Arrange
@@ -739,6 +1017,18 @@ public class ResultsTests
}
[Fact]
+ public void Redirect_WithNullStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("url", () => Results.Redirect(default(string)));
+ }
+
+ [Fact]
+ public void Redirect_WithEmptyStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("url", () => Results.Redirect(string.Empty));
+ }
+
+ [Fact]
public void Redirect_WithDefaults_ResultHasCorrectValues()
{
// Arrange
@@ -830,6 +1120,55 @@ public class ResultsTests
}
[Fact]
+ public void Text_WithContentAndContentType_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content";
+ var contentType = "text/plain";
+
+ // Act
+ var result = Results.Text(content, contentType) as ContentHttpResult;
+
+ // Assert
+ Assert.Null(result.StatusCode);
+ Assert.Equal(content, result.ResponseContent);
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void Text_WithUtf8ContentAndContentType_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content"u8.ToArray();
+ var contentType = "text/plain";
+
+ // Act
+ var result = Results.Text(content, contentType) as Utf8ContentHttpResult;
+
+ // Assert
+ Assert.Null(result.StatusCode);
+ Assert.Equal(content, result.ResponseContent.ToArray());
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void Text_WithUtf8ContentAndContentTypeAndStatusCode_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content"u8.ToArray();
+ var contentType = "text/plain";
+ var statusCode = 201;
+
+ // Act
+ var result = Results.Text(content, contentType, statusCode) as Utf8ContentHttpResult;
+
+ // Assert
+ Assert.Equal(statusCode, result.StatusCode);
+ Assert.Equal(content, result.ResponseContent.ToArray());
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
public void Text_WithContentAndContentTypeAndEncoding_ResultHasCorrectValues()
{
// Arrange
@@ -849,6 +1188,26 @@ public class ResultsTests
}
[Fact]
+ public void Text_WithContentAndContentTypeAndEncodingAndStatusCode_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content";
+ var contentType = "text/plain";
+ var encoding = Encoding.ASCII;
+ var statusCode = 201;
+
+ // Act
+ var result = Results.Text(content, contentType, encoding, statusCode) as ContentHttpResult;
+
+ // Assert
+ Assert.Equal(statusCode, result.StatusCode);
+ Assert.Equal(content, result.ResponseContent);
+ var expectedMediaType = MediaTypeHeaderValue.Parse(contentType);
+ expectedMediaType.Encoding = encoding;
+ Assert.Equal(expectedMediaType.ToString(), result.ContentType);
+ }
+
+ [Fact]
public void Unauthorized_ResultHasCorrectValues()
{
// Act
@@ -911,6 +1270,7 @@ public class ResultsTests
(() => Results.Conflict(null), typeof(Conflict)),
(() => Results.Conflict(new()), typeof(Conflict<object>)),
(() => Results.Content("content", null, null), typeof(ContentHttpResult)),
+ (() => Results.Content("content", null, null, null), typeof(ContentHttpResult)),
(() => Results.Created("/path", null), typeof(Created)),
(() => Results.Created("/path", new()), typeof(Created<object>)),
(() => Results.CreatedAtRoute("routeName", null, null), typeof(CreatedAtRoute)),
@@ -931,6 +1291,7 @@ public class ResultsTests
(() => Results.Stream(new MemoryStream(), null, null, null, null, false), typeof(FileStreamHttpResult)),
(() => Results.Stream(s => Task.CompletedTask, null, null, null, null), typeof(PushStreamHttpResult)),
(() => Results.Text("content", null, null), typeof(ContentHttpResult)),
+ (() => Results.Text("content", null, null, null), typeof(ContentHttpResult)),
(() => Results.Redirect("/path", false, false), typeof(RedirectHttpResult)),
(() => Results.LocalRedirect("/path", false, false), typeof(RedirectHttpResult)),
(() => Results.RedirectToRoute("routeName", null, false, false, null), typeof(RedirectToRouteHttpResult)),
@@ -944,4 +1305,6 @@ public class ResultsTests
};
public static IEnumerable<object[]> FactoryMethodsFromTuples() => FactoryMethodsTuples.Select(t => new object[] { t.Item1, t.Item2 });
+
+ private record Todo(int Id);
}
diff --git a/src/Http/Http.Results/test/SignInResultTests.cs b/src/Http/Http.Results/test/SignInResultTests.cs
index 3d4c413674..9fe069c41b 100644
--- a/src/Http/Http.Results/test/SignInResultTests.cs
+++ b/src/Http/Http.Results/test/SignInResultTests.cs
@@ -74,6 +74,17 @@ public class SignInResultTests
auth.Verify();
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new SignInHttpResult(new());
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
private static DefaultHttpContext GetHttpContext(IAuthenticationService auth)
{
var httpContext = new DefaultHttpContext();
diff --git a/src/Http/Http.Results/test/SignOutResultTests.cs b/src/Http/Http.Results/test/SignOutResultTests.cs
index 386b29e928..1549013182 100644
--- a/src/Http/Http.Results/test/SignOutResultTests.cs
+++ b/src/Http/Http.Results/test/SignOutResultTests.cs
@@ -73,6 +73,17 @@ public class SignOutResultTests
auth.Verify();
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new SignOutHttpResult();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
private static DefaultHttpContext GetHttpContext(IAuthenticationService auth)
{
var httpContext = new DefaultHttpContext();
diff --git a/src/Http/Http.Results/test/StatusCodeResultTests.cs b/src/Http/Http.Results/test/StatusCodeResultTests.cs
index 4e28357b5b..91bafb4072 100644
--- a/src/Http/Http.Results/test/StatusCodeResultTests.cs
+++ b/src/Http/Http.Results/test/StatusCodeResultTests.cs
@@ -24,6 +24,25 @@ public class StatusCodeResultTests
Assert.Equal(StatusCodes.Status404NotFound, httpContext.Response.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new StatusCodeHttpResult(200);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void StatusCodeResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new StatusCodeHttpResult(StatusCodes.Status406NotAcceptable));
+ Assert.Equal(StatusCodes.Status406NotAcceptable, result.StatusCode);
+ }
+
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
diff --git a/src/Http/Http.Results/test/TypedResultsTests.cs b/src/Http/Http.Results/test/TypedResultsTests.cs
index c927bd9423..4b93724d04 100644
--- a/src/Http/Http.Results/test/TypedResultsTests.cs
+++ b/src/Http/Http.Results/test/TypedResultsTests.cs
@@ -98,6 +98,12 @@ public class TypedResultsTests
}
[Fact]
+ public void Accepted_WithNullUriAndValue_ThrowsArgumentNullException()
+ {
+ Assert.Throws<ArgumentNullException>("uri", () => TypedResults.Accepted(default(Uri), default(object)));
+ }
+
+ [Fact]
public void AcceptedAtRoute_WithRouteNameAndRouteValuesAndValue_ResultHasCorrectValues()
{
// Arrange
@@ -199,6 +205,112 @@ public class TypedResultsTests
};
[Theory]
+ [MemberData(nameof(PhysicalOrVirtualFile_ResultHasCorrectValues_Data))]
+ public void PhysicalFile_ResultHasCorrectValues(string contentType, string fileDownloadName, bool enableRangeProcessing, DateTimeOffset lastModified, EntityTagHeaderValue entityTag)
+ {
+ // Arrange
+ var path = "path";
+
+ // Act
+ var result = TypedResults.PhysicalFile(path, contentType, fileDownloadName, lastModified, entityTag, enableRangeProcessing);
+
+ // Assert
+ Assert.Equal(path, result.FileName);
+ Assert.Equal(contentType ?? "application/octet-stream", result.ContentType);
+ Assert.Equal(fileDownloadName, result.FileDownloadName);
+ Assert.Equal(enableRangeProcessing, result.EnableRangeProcessing);
+ Assert.Equal(lastModified, result.LastModified);
+ Assert.Equal(entityTag, result.EntityTag);
+ }
+
+ [Theory]
+ [MemberData(nameof(PhysicalOrVirtualFile_ResultHasCorrectValues_Data))]
+ public void VirtualFile_ResultHasCorrectValues(string contentType, string fileDownloadName, bool enableRangeProcessing, DateTimeOffset lastModified, EntityTagHeaderValue entityTag)
+ {
+ // Arrange
+ var path = "path";
+
+ // Act
+ var result = TypedResults.VirtualFile(path, contentType, fileDownloadName, lastModified, entityTag, enableRangeProcessing);
+
+ // Assert
+ Assert.Equal(path, result.FileName);
+ Assert.Equal(contentType ?? "application/octet-stream", result.ContentType);
+ Assert.Equal(fileDownloadName, result.FileDownloadName);
+ Assert.Equal(enableRangeProcessing, result.EnableRangeProcessing);
+ Assert.Equal(lastModified, result.LastModified);
+ Assert.Equal(entityTag, result.EntityTag);
+ }
+
+ public static IEnumerable<object[]> PhysicalOrVirtualFile_ResultHasCorrectValues_Data => new List<object[]>
+ {
+ new object[] { "text/plain", "testfile", true, new DateTimeOffset(2022, 1, 1, 0, 0, 1, TimeSpan.FromHours(-8)), EntityTagHeaderValue.Any },
+ new object[] { default(string), default(string), default(bool), default(DateTimeOffset?), default(EntityTagHeaderValue) },
+ new object[] { "text/plain", "testfile", true, new DateTimeOffset(2022, 1, 1, 0, 0, 1, TimeSpan.FromHours(-8)), EntityTagHeaderValue.Any },
+ new object[] { default(string), default(string), default(bool), default(DateTimeOffset?), default(EntityTagHeaderValue) }
+ };
+
+ [Fact]
+ public void Bytes_WithNullContents_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("contents", () => TypedResults.Bytes(null));
+ }
+
+ [Fact]
+ public void File_WithNullContents_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("fileContents", () => TypedResults.File(default(byte[])));
+ }
+
+ [Fact]
+ public void File_WithNullStream_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("fileStream", () => TypedResults.File(default(Stream)));
+ }
+
+ [Fact]
+ public void Stream_WithNullStream_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("stream", () => TypedResults.Stream(default(Stream)));
+ }
+
+ [Fact]
+ public void Stream_WithNullPipeReader_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("pipeReader", () => TypedResults.Stream(default(PipeReader)));
+ }
+
+ [Fact]
+ public void Stream_WithNullCallback_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("streamWriterCallback", () => TypedResults.Stream(default(Func<Stream, Task>)));
+ }
+
+ [Fact]
+ public void PhysicalFile_WithNullPath_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("path", () => TypedResults.PhysicalFile(default(string)));
+ }
+
+ [Fact]
+ public void PhysicalFile_WithEmptyPath_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("path", () => TypedResults.PhysicalFile(string.Empty));
+ }
+
+ [Fact]
+ public void VirtualFile_WithNullPath_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("path", () => TypedResults.VirtualFile(default(string)));
+ }
+
+ [Fact]
+ public void VirtualFile_WithEmptyPath_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("path", () => TypedResults.VirtualFile(string.Empty));
+ }
+
+ [Theory]
[MemberData(nameof(Stream_ResultHasCorrectValues_Data))]
public void Stream_ResultHasCorrectValues(int overload, string contentType, string fileDownloadName, bool enableRangeProcessing, DateTimeOffset lastModified, EntityTagHeaderValue entityTag)
{
@@ -363,12 +475,30 @@ public class TypedResultsTests
var encoding = Encoding.UTF8;
// Act
- var result = TypedResults.Content(content, contentType, null);
+ var result = TypedResults.Content(content, contentType, encoding);
// Assert
Assert.Null(result.StatusCode);
Assert.Equal(content, result.ResponseContent);
- Assert.Equal(contentType, result.ContentType);
+ Assert.Equal("text/plain; charset=utf-8", result.ContentType);
+ }
+
+ [Fact]
+ public void Content_WithContentAndContentTypeAndEncodingAndStatusCode_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content";
+ var contentType = "text/plain";
+ var encoding = Encoding.UTF8;
+ var statusCode = 201;
+
+ // Act
+ var result = TypedResults.Content(content, contentType, encoding, statusCode);
+
+ // Assert
+ Assert.Equal(statusCode, result.StatusCode);
+ Assert.Equal(content, result.ResponseContent);
+ Assert.Equal("text/plain; charset=utf-8", result.ContentType);
}
[Fact]
@@ -432,9 +562,15 @@ public class TypedResultsTests
}
[Fact]
- public void Created_WithNullStringUri_ThrowsArgNullException()
+ public void Created_WithNullStringUri_ThrowsArgException()
{
- Assert.Throws<ArgumentNullException>("uri", () => TypedResults.Created(default(string)));
+ Assert.Throws<ArgumentException>("uri", () => TypedResults.Created(default(string)));
+ }
+
+ [Fact]
+ public void Created_WithEmptyStringUri_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("uri", () => TypedResults.Created(string.Empty));
}
[Fact]
@@ -444,6 +580,24 @@ public class TypedResultsTests
}
[Fact]
+ public void CreatedOfT_WithNullStringUri_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("uri", () => TypedResults.Created(default(string), default(object)));
+ }
+
+ [Fact]
+ public void CreatedOfT_WithEmptyStringUri_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("uri", () => TypedResults.Created(string.Empty, default(object)));
+ }
+
+ [Fact]
+ public void CreatedOfT_WithNullUri_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("uri", () => TypedResults.Created(default(Uri), default(object)));
+ }
+
+ [Fact]
public void CreatedAtRoute_WithRouteNameAndRouteValuesAndValue_ResultHasCorrectValues()
{
// Arrange
@@ -551,6 +705,18 @@ public class TypedResultsTests
}
[Fact]
+ public void LocalRedirect_WithNullStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("localUrl", () => TypedResults.LocalRedirect(default(string)));
+ }
+
+ [Fact]
+ public void LocalRedirect_WithEmptyStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("localUrl", () => TypedResults.LocalRedirect(string.Empty));
+ }
+
+ [Fact]
public void LocalRedirect_WithUrl_ResultHasCorrectValues()
{
// Arrange
@@ -678,6 +844,12 @@ public class TypedResultsTests
}
[Fact]
+ public void Problem_WithNullProblem_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("problemDetails", () => TypedResults.Problem(default(ProblemDetails)));
+ }
+
+ [Fact]
public void Problem_WithArgs_ResultHasCorrectValues()
{
// Arrange
@@ -750,6 +922,12 @@ public class TypedResultsTests
}
[Fact]
+ public void ValidationProblem_WithNullErrors_ThrowsArgNullException()
+ {
+ Assert.Throws<ArgumentNullException>("errors", () => TypedResults.ValidationProblem(default(IDictionary<string, string[]>)));
+ }
+
+ [Fact]
public void ValidationProblem_WithValidationProblemArg_ResultHasCorrectValues()
{
// Arrange
@@ -776,6 +954,18 @@ public class TypedResultsTests
}
[Fact]
+ public void Redirect_WithNullStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("url", () => TypedResults.Redirect(default(string)));
+ }
+
+ [Fact]
+ public void Redirect_WithEmptyStringUrl_ThrowsArgException()
+ {
+ Assert.Throws<ArgumentException>("url", () => TypedResults.Redirect(string.Empty));
+ }
+
+ [Fact]
public void Redirect_WithDefaults_ResultHasCorrectValues()
{
// Arrange
@@ -867,6 +1057,55 @@ public class TypedResultsTests
}
[Fact]
+ public void Text_WithContentAndContentType_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content";
+ var contentType = "text/plain";
+
+ // Act
+ var result = TypedResults.Text(content, contentType);
+
+ // Assert
+ Assert.Null(result.StatusCode);
+ Assert.Equal(content, result.ResponseContent);
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void Text_WithUtf8ContentAndContentType_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content"u8.ToArray();
+ var contentType = "text/plain";
+
+ // Act
+ var result = TypedResults.Text(content, contentType);
+
+ // Assert
+ Assert.Null(result.StatusCode);
+ Assert.Equal(content, result.ResponseContent.ToArray());
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void Text_WithUtf8ContentAndContentTypeAndStatusCode_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content"u8.ToArray();
+ var contentType = "text/plain";
+ var statusCode = 201;
+
+ // Act
+ var result = TypedResults.Text(content, contentType, statusCode);
+
+ // Assert
+ Assert.Equal(statusCode, result.StatusCode);
+ Assert.Equal(content, result.ResponseContent.ToArray());
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
public void Text_WithContentAndContentTypeAndEncoding_ResultHasCorrectValues()
{
// Arrange
@@ -886,6 +1125,26 @@ public class TypedResultsTests
}
[Fact]
+ public void Text_WithContentAndContentTypeAndEncodingAndStatusCode_ResultHasCorrectValues()
+ {
+ // Arrange
+ var content = "test content";
+ var contentType = "text/plain";
+ var encoding = Encoding.ASCII;
+ var statusCode = 201;
+
+ // Act
+ var result = TypedResults.Text(content, contentType, encoding, statusCode);
+
+ // Assert
+ Assert.Equal(statusCode, result.StatusCode);
+ Assert.Equal(content, result.ResponseContent);
+ var expectedMediaType = MediaTypeHeaderValue.Parse(contentType);
+ expectedMediaType.Encoding = encoding;
+ Assert.Equal(expectedMediaType.ToString(), result.ContentType);
+ }
+
+ [Fact]
public void Unauthorized_ResultHasCorrectValues()
{
// Act
diff --git a/src/Http/Http.Results/test/UnauthorizedResultTests.cs b/src/Http/Http.Results/test/UnauthorizedResultTests.cs
index 9f25870fea..24cdbb7ee4 100644
--- a/src/Http/Http.Results/test/UnauthorizedResultTests.cs
+++ b/src/Http/Http.Results/test/UnauthorizedResultTests.cs
@@ -34,6 +34,25 @@ public class UnauthorizedResultTests
Assert.Equal(StatusCodes.Status401Unauthorized, httpContext.Response.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new UnauthorizedHttpResult();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void UnauthorizedResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new UnauthorizedHttpResult());
+ Assert.Equal(StatusCodes.Status401Unauthorized, result.StatusCode);
+ }
+
private static IServiceCollection CreateServices()
{
var services = new ServiceCollection();
diff --git a/src/Http/Http.Results/test/UnprocessableEntityOfTResultTests.cs b/src/Http/Http.Results/test/UnprocessableEntityOfTResultTests.cs
index d5d3938d85..4d8190b70b 100644
--- a/src/Http/Http.Results/test/UnprocessableEntityOfTResultTests.cs
+++ b/src/Http/Http.Results/test/UnprocessableEntityOfTResultTests.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging.Abstractions;
public class UnprocessableEntityOfTResultTests
{
[Fact]
- public void NotFoundObjectResult_ProblemDetails_SetsStatusCodeAndValue()
+ public void UnprocessableEntityObjectResult_ProblemDetails_SetsStatusCodeAndValue()
{
// Arrange & Act
var obj = new HttpValidationProblemDetails();
@@ -82,7 +82,7 @@ public class UnprocessableEntityOfTResultTests
// Arrange
UnprocessableEntity<Todo> MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<UnprocessableEntity<Todo>>(context);
@@ -94,6 +94,56 @@ public class UnprocessableEntityOfTResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new UnprocessableEntity<object>(null);
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<UnprocessableEntity<object>>(null));
+ }
+
+ [Fact]
+ public void UnprocessableEntityObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new UnprocessableEntity<object>(null));
+ Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode);
+ }
+
+ [Fact]
+ public void UnprocessableEntityObjectResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new UnprocessableEntity<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void UnprocessableEntityObjectResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange
+ var value = "Foo";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<string>>(new UnprocessableEntity<string>(value));
+ Assert.IsType<string>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/UnprocessableEntityResultTests.cs b/src/Http/Http.Results/test/UnprocessableEntityResultTests.cs
index 049d3bfab5..d5f9765447 100644
--- a/src/Http/Http.Results/test/UnprocessableEntityResultTests.cs
+++ b/src/Http/Http.Results/test/UnprocessableEntityResultTests.cs
@@ -45,7 +45,7 @@ public class UnprocessableEntityResultTests
// Arrange
UnprocessableEntity MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<UnprocessableEntity>(context);
@@ -55,6 +55,32 @@ public class UnprocessableEntityResultTests
Assert.Equal(StatusCodes.Status422UnprocessableEntity, producesResponseTypeMetadata.StatusCode);
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new UnprocessableEntity();
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<UnprocessableEntity>(null));
+ }
+
+ [Fact]
+ public void UnprocessableEntityObjectResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new UnprocessableEntity());
+ Assert.Equal(StatusCodes.Status422UnprocessableEntity, result.StatusCode);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/Utf8ContentResultTests.cs b/src/Http/Http.Results/test/Utf8ContentResultTests.cs
new file mode 100644
index 0000000000..51d68b1887
--- /dev/null
+++ b/src/Http/Http.Results/test/Utf8ContentResultTests.cs
@@ -0,0 +1,105 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Http.HttpResults;
+
+public class Utf8ContentResultTests
+{
+ [Fact]
+ public void Utf8ContentResultSetsProperties()
+ {
+ // Arrange
+ var data = """{ "name" : "Hello" }"""u8.ToArray();
+ var result = new Utf8ContentHttpResult(data, contentType: "application/json charst=utf-8", statusCode: 401);
+
+ // Act
+ Assert.Equal(data, result.ResponseContent.ToArray());
+ Assert.Equal("application/json charst=utf-8", result.ContentType);
+ Assert.Equal(401, result.StatusCode);
+ }
+
+ [Fact]
+ public async Task Utf8ContentExecutionWorks()
+ {
+ // Arrange
+ var data = "Hello"u8.ToArray();
+ var context = GetHttpContext();
+ var ms = new MemoryStream();
+ context.Response.Body = ms;
+ var result = new Utf8ContentHttpResult("Hello"u8, contentType: null, statusCode: null);
+
+ await result.ExecuteAsync(context);
+
+ // Act
+ Assert.Equal(data, ms.ToArray());
+ Assert.Equal(data.Length, context.Response.ContentLength);
+ Assert.Equal("text/plain; charset=utf-8", context.Response.ContentType);
+ }
+
+ [Fact]
+ public async Task Utf8TextResultCopiesData()
+ {
+ // Arrange
+ var data = "Hello"u8.ToArray();
+ var context = GetHttpContext();
+ var ms = new MemoryStream();
+ context.Response.Body = ms;
+ var result = new Utf8ContentHttpResult(stackalloc byte[5] { 72, 101, 108, 108, 111 }, contentType: null, statusCode: null);
+
+ await result.ExecuteAsync(context);
+
+ // Act
+ Assert.Equal(data, ms.ToArray());
+ Assert.Equal(data.Length, context.Response.ContentLength);
+ Assert.Equal("text/plain; charset=utf-8", context.Response.ContentType);
+ }
+
+ [Fact]
+ public void Utf8TextResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new Utf8ContentHttpResult("Hello"u8, contentType, statusCode: null));
+ Assert.Equal(contentType, result.ContentType);
+ }
+
+ [Fact]
+ public void Utf8TextResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/custom";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new Utf8ContentHttpResult("Hello"u8, contentType, statusCode: StatusCodes.Status202Accepted));
+ Assert.Equal(StatusCodes.Status202Accepted, result.StatusCode);
+ }
+
+ private static IServiceCollection CreateServices()
+ {
+ var services = new ServiceCollection();
+ services.AddSingleton(typeof(ILogger<>), typeof(NullLogger<>));
+ services.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance);
+ return services;
+ }
+
+ private static HttpContext GetHttpContext()
+ {
+ var services = CreateServices();
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.RequestServices = services.BuildServiceProvider();
+
+ return httpContext;
+ }
+}
diff --git a/src/Http/Http.Results/test/ValidationProblemResultTests.cs b/src/Http/Http.Results/test/ValidationProblemResultTests.cs
index e6b9455d43..55e672bb31 100644
--- a/src/Http/Http.Results/test/ValidationProblemResultTests.cs
+++ b/src/Http/Http.Results/test/ValidationProblemResultTests.cs
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
+using Newtonsoft.Json.Linq;
namespace Microsoft.AspNetCore.Http.HttpResults;
@@ -62,7 +63,7 @@ public class ValidationProblemResultTests
// Arrange
ValidationProblem MyApi() { throw new NotImplementedException(); }
var metadata = new List<object>();
- var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// Act
PopulateMetadata<ValidationProblem>(context);
@@ -74,6 +75,67 @@ public class ValidationProblemResultTests
Assert.Single(producesResponseTypeMetadata.ContentTypes, "application/problem+json");
}
+ [Fact]
+ public void ExecuteAsync_ThrowsArgumentNullException_WhenHttpContextIsNull()
+ {
+ // Arrange
+ var result = new ValidationProblem(new());
+ HttpContext httpContext = null;
+
+ // Act & Assert
+ Assert.ThrowsAsync<ArgumentNullException>("httpContext", () => result.ExecuteAsync(httpContext));
+ }
+
+ [Fact]
+ public void PopulateMetadata_ThrowsArgumentNullException_WhenContextIsNull()
+ {
+ // Act & Assert
+ Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<ValidationProblem>(null));
+ }
+
+ [Fact]
+ public void ValidationProblemResult_Implements_IStatusCodeHttpResult_Correctly()
+ {
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IStatusCodeHttpResult>(new ValidationProblem(new HttpValidationProblemDetails()));
+ Assert.Equal(StatusCodes.Status400BadRequest, result.StatusCode);
+ }
+
+ [Fact]
+ public void ValidationProblemResult_Implements_IValueHttpResult_Correctly()
+ {
+ // Arrange
+ var value = new HttpValidationProblemDetails();
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult>(new ValidationProblem(value));
+ Assert.IsType<HttpValidationProblemDetails>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void ValidationProblemResult_Implements_IValueHttpResultOfT_Correctly()
+ {
+ // Arrange
+ var value = new HttpValidationProblemDetails();
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IValueHttpResult<HttpValidationProblemDetails>>(new ValidationProblem(value));
+ Assert.IsType<HttpValidationProblemDetails>(result.Value);
+ Assert.Equal(value, result.Value);
+ }
+
+ [Fact]
+ public void ValidationProblemResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/problem+json";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new ValidationProblem(new()));
+ Assert.Equal(contentType, result.ContentType);
+ }
+
private static void PopulateMetadata<TResult>(EndpointMetadataContext context)
where TResult : IEndpointMetadataProvider => TResult.PopulateMetadata(context);
diff --git a/src/Http/Http.Results/test/VirtualFileResultTests.cs b/src/Http/Http.Results/test/VirtualFileResultTests.cs
index 04ad231a47..3e3e91d362 100644
--- a/src/Http/Http.Results/test/VirtualFileResultTests.cs
+++ b/src/Http/Http.Results/test/VirtualFileResultTests.cs
@@ -19,4 +19,29 @@ public class VirtualFileResultTests : VirtualFileResultTestBase
return result.ExecuteAsync(httpContext);
}
+
+ [Fact]
+ public void VirtualFileHttpResult_Implements_IFileHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IFileHttpResult>(new VirtualFileHttpResult("~/file.zip", contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ Assert.Equal(downloadName, result.FileDownloadName);
+ }
+
+ [Fact]
+ public void VirtualFileHttpResult_Implements_IContentTypeHttpResult_Correctly()
+ {
+ // Arrange
+ var contentType = "application/x-zip";
+ var downloadName = "sample.zip";
+
+ // Act & Assert
+ var result = Assert.IsAssignableFrom<IContentTypeHttpResult>(new VirtualFileHttpResult("~/file.zip", contentType) { FileDownloadName = downloadName });
+ Assert.Equal(contentType, result.ContentType);
+ }
}
diff --git a/src/Http/Http.Results/tools/ResultsOfTGenerator/Program.cs b/src/Http/Http.Results/tools/ResultsOfTGenerator/Program.cs
index 033e1f00e4..c23363e06e 100644
--- a/src/Http/Http.Results/tools/ResultsOfTGenerator/Program.cs
+++ b/src/Http/Http.Results/tools/ResultsOfTGenerator/Program.cs
@@ -14,7 +14,7 @@ public class Program
{
// By default we assume we're being run in the context of the <repo>/src/Http/Http.Results/src
var pwd = Directory.GetCurrentDirectory();
- var classTargetFilePath = Path.Combine(pwd, "ResultsOfT.cs");
+ var classTargetFilePath = Path.Combine(pwd, "ResultsOfT.Generated.cs");
var testsTargetFilePath = Path.Combine(pwd, "..", "test", "ResultsOfTTests.Generated.cs");
if (args.Length > 0)
@@ -80,7 +80,7 @@ public class Program
writer.WriteLine("/// <remarks>");
writer.WriteLine("/// An instance of this type cannot be created explicitly. Use the implicit cast operators to create an instance");
writer.WriteLine("/// from an instance of one of the declared type arguments, e.g.");
- writer.WriteLine("/// <code>Results&lt;OkObjectHttpResult, ProblemHttpResult&gt; result = Results.Ok();</code>");
+ writer.WriteLine("/// <code>Results&lt;Ok, BadRequest&gt; result = TypedResults.Ok();</code>");
writer.WriteLine("/// </remarks>");
// Type params docs
@@ -104,7 +104,7 @@ public class Program
writer.Write(">");
// Interfaces
- writer.WriteLine(" : IResult, IEndpointMetadataProvider");
+ writer.WriteLine(" : IResult, INestedHttpResult, IEndpointMetadataProvider");
// Type arg constraints
for (int j = 1; j <= i; j++)
@@ -137,7 +137,7 @@ public class Program
writer.WriteIndentedLine("/// <inheritdoc/>");
writer.WriteIndentedLine("public Task ExecuteAsync(HttpContext httpContext)");
writer.WriteIndentedLine("{");
- writer.WriteIndentedLine(2, "ArgumentNullException.ThrowIfNull(httpContext, nameof(httpContext));");
+ writer.WriteIndentedLine(2, "ArgumentNullException.ThrowIfNull(httpContext);");
writer.WriteLine();
writer.WriteIndentedLine(2, "if (Result is null)");
writer.WriteIndentedLine(2, "{");
@@ -179,6 +179,8 @@ public class Program
writer.WriteIndentedLine("/// <inheritdoc/>");
writer.WriteIndentedLine("static void IEndpointMetadataProvider.PopulateMetadata(EndpointMetadataContext context)");
writer.WriteIndentedLine("{");
+ writer.WriteIndentedLine(2, "ArgumentNullException.ThrowIfNull(context);");
+ writer.WriteLine();
for (int j = 1; j <= i; j++)
{
writer.WriteIndentedLine(2, $"ResultsOfTHelper.PopulateMetadataIfTargetIsIEndpointMetadataProvider<TResult{j}>(context);");
@@ -257,9 +259,10 @@ public class Program
GenerateTest_ExecuteResult_ExecutesAssignedResult(writer, i);
GenerateTest_Throws_ArgumentNullException_WhenHttpContextIsNull(writer, i);
GenerateTest_Throws_InvalidOperationException_WhenResultIsNull(writer, i);
- Generate_AcceptsIResult_AsAnyTypeArg(writer, i);
- Generate_AcceptsNestedResultsOfT_AsAnyTypeArg(writer, i);
- Generate_PopulateMetadata_PopulatesMetadataFromTypeArgsThatImplementIEndpointMetadataProvider(writer, i);
+ GenerateTest_AcceptsIResult_AsAnyTypeArg(writer, i);
+ GenerateTest_AcceptsNestedResultsOfT_AsAnyTypeArg(writer, i);
+ GenerateTest_PopulateMetadata_PopulatesMetadataFromTypeArgsThatImplementIEndpointMetadataProvider(writer, i);
+ GenerateTest_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull(writer, i);
}
Generate_ChecksumResultClass(writer);
@@ -587,15 +590,15 @@ public class Program
writer.WriteLine();
}
- static void Generate_AcceptsIResult_AsAnyTypeArg(StreamWriter writer, int typeArgCount)
+ static void GenerateTest_AcceptsIResult_AsAnyTypeArg(StreamWriter writer, int typeArgCount)
{
for (int i = 1; i <= typeArgCount; i++)
{
- Generate_AcceptsIResult_AsNthTypeArg(writer, typeArgCount, i);
+ GenerateTest_AcceptsIResult_AsNthTypeArg(writer, typeArgCount, i);
}
}
- static void Generate_AcceptsIResult_AsNthTypeArg(StreamWriter writer, int typeArgCount, int typeArgNumber)
+ static void GenerateTest_AcceptsIResult_AsNthTypeArg(StreamWriter writer, int typeArgCount, int typeArgNumber)
{
//[Theory]
//[InlineData(1, typeof(ChecksumResult1))]
@@ -695,15 +698,15 @@ public class Program
writer.WriteLine();
}
- static void Generate_AcceptsNestedResultsOfT_AsAnyTypeArg(StreamWriter writer, int typeArgCount)
+ static void GenerateTest_AcceptsNestedResultsOfT_AsAnyTypeArg(StreamWriter writer, int typeArgCount)
{
for (int i = 1; i <= typeArgCount; i++)
{
- Generate_AcceptsNestedResultsOfT_AsNthTypeArg(writer, typeArgCount, i);
+ GenerateTest_AcceptsNestedResultsOfT_AsNthTypeArg(writer, typeArgCount, i);
}
}
- static void Generate_AcceptsNestedResultsOfT_AsNthTypeArg(StreamWriter writer, int typeArgCount, int typeArgNumber)
+ static void GenerateTest_AcceptsNestedResultsOfT_AsNthTypeArg(StreamWriter writer, int typeArgCount, int typeArgNumber)
{
//[Theory]
//[InlineData(1, typeof(Results<ChecksumResult1, ChecksumResult2>))]
@@ -803,7 +806,7 @@ public class Program
writer.WriteLine();
}
- static void Generate_PopulateMetadata_PopulatesMetadataFromTypeArgsThatImplementIEndpointMetadataProvider(StreamWriter writer, int typeArgNumber)
+ static void GenerateTest_PopulateMetadata_PopulatesMetadataFromTypeArgsThatImplementIEndpointMetadataProvider(StreamWriter writer, int typeArgNumber)
{
//[Fact]
//public void ResultsOfTResult1TResult2_PopulateMetadata_PopulatesMetadataFromTypeArgsThatImplementIEndpointMetadataProvider()
@@ -811,7 +814,7 @@ public class Program
// // Arrange
// Results<ProvidesMetadataResult1, ProvidesMetadataResult2> MyApi() { throw new NotImplementedException(); }
// var metadata = new List<object>();
- // var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);
+ // var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);
// // Act
// PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2>>(context);
@@ -847,7 +850,7 @@ public class Program
}
writer.WriteLine("> MyApi() { throw new NotImplementedException(); }");
writer.WriteIndentedLine(2, "var metadata = new List<object>();");
- writer.WriteIndentedLine(2, "var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, null);");
+ writer.WriteIndentedLine(2, "var context = new EndpointMetadataContext(((Delegate)MyApi).GetMethodInfo(), metadata, EmptyServiceProvider.Instance);");
writer.WriteLine();
// Act
@@ -877,6 +880,46 @@ public class Program
writer.WriteLine();
}
+ static void GenerateTest_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull(StreamWriter writer, int typeArgNumber)
+ {
+ //[Fact]
+ //public void ResultsOfTResult1TResult2_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()
+ //{
+ // // Act & Assert
+ // Assert.Throws<ArgumentNullException>("context", () => PopulateMetadata<Results<ProvidesMetadataResult1, ProvidesMetadataResult2>>(null));
+ //}
+
+ // Attributes
+ writer.WriteIndentedLine("[Fact]");
+
+ // Start method
+ writer.WriteIndent(1, "public void ResultsOf");
+ for (int j = 1; j <= typeArgNumber; j++)
+ {
+ writer.Write($"TResult{j}");
+ }
+ writer.WriteLine("_PopulateMetadata_Throws_ArgumentNullException_WhenContextIsNull()");
+ writer.WriteIndentedLine("{");
+
+ // Act & Assert
+ writer.WriteIndentedLine(2, "// Act & Assert");
+ writer.WriteIndent(2, "Assert.Throws<ArgumentNullException>(\"context\", () => PopulateMetadata<Results<");
+ for (int j = 1; j <= typeArgNumber; j++)
+ {
+ writer.Write($"ProvidesMetadataResult{j}");
+
+ if (j != typeArgNumber)
+ {
+ writer.Write(", ");
+ }
+ }
+ writer.WriteLine(">>(null));");
+
+ // Close method
+ writer.WriteIndentedLine(1, "}");
+ writer.WriteLine();
+ }
+
static void Generate_ChecksumResultClass(StreamWriter writer, int typeArgNumber = -1)
{
if (typeArgNumber <= 0)
@@ -913,7 +956,7 @@ public class Program
static void Generate_ProvidesMetadataResultClass(StreamWriter writer, int typeArgNumber)
{
- //private class ProvidesMetadataResult1 : IResult, IEndpointMetadataProvider
+ //private sealed class ProvidesMetadataResult1 : IResult, IEndpointMetadataProvider
//{
// public Task ExecuteAsync(HttpContext httpContext) => Task.CompletedTask;
diff --git a/src/Http/Http.Results/tools/ResultsOfTGenerator/ResultsOfTGenerator.csproj b/src/Http/Http.Results/tools/ResultsOfTGenerator/ResultsOfTGenerator.csproj
index 7659c27781..96c160f331 100644
--- a/src/Http/Http.Results/tools/ResultsOfTGenerator/ResultsOfTGenerator.csproj
+++ b/src/Http/Http.Results/tools/ResultsOfTGenerator/ResultsOfTGenerator.csproj
@@ -5,6 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<Nullable>enable</Nullable>
<AddPublicApiAnalyzers>false</AddPublicApiAnalyzers>
+ <IsPackable>false</IsPackable>
</PropertyGroup>
</Project>
diff --git a/src/Http/Http/src/Builder/ApplicationBuilder.cs b/src/Http/Http/src/Builder/ApplicationBuilder.cs
index 9e6298af83..5318196964 100644
--- a/src/Http/Http/src/Builder/ApplicationBuilder.cs
+++ b/src/Http/Http/src/Builder/ApplicationBuilder.cs
@@ -21,10 +21,8 @@ public class ApplicationBuilder : IApplicationBuilder
/// Initializes a new instance of <see cref="ApplicationBuilder"/>.
/// </summary>
/// <param name="serviceProvider">The <see cref="IServiceProvider"/> for application services.</param>
- public ApplicationBuilder(IServiceProvider serviceProvider)
+ public ApplicationBuilder(IServiceProvider serviceProvider) : this(serviceProvider, new FeatureCollection())
{
- Properties = new Dictionary<string, object?>(StringComparer.Ordinal);
- ApplicationServices = serviceProvider;
}
/// <summary>
@@ -33,8 +31,10 @@ public class ApplicationBuilder : IApplicationBuilder
/// <param name="serviceProvider">The <see cref="IServiceProvider"/> for application services.</param>
/// <param name="server">The server instance that hosts the application.</param>
public ApplicationBuilder(IServiceProvider serviceProvider, object server)
- : this(serviceProvider)
{
+ Properties = new Dictionary<string, object?>(StringComparer.Ordinal);
+ ApplicationServices = serviceProvider;
+
SetProperty(ServerFeaturesKey, server);
}
@@ -61,6 +61,9 @@ public class ApplicationBuilder : IApplicationBuilder
/// <summary>
/// Gets the <see cref="IFeatureCollection"/> for server features.
/// </summary>
+ /// <remarks>
+ /// An empty collection is returned if a server wasn't specified for the application builder.
+ /// </remarks>
public IFeatureCollection ServerFeatures
{
get
diff --git a/src/Http/Http/src/Features/FormFeature.cs b/src/Http/Http/src/Features/FormFeature.cs
index e00b9b2ead..3be60e7fe1 100644
--- a/src/Http/Http/src/Features/FormFeature.cs
+++ b/src/Http/Http/src/Features/FormFeature.cs
@@ -25,10 +25,7 @@ public class FormFeature : IFormFeature
/// <param name="form">The <see cref="IFormCollection"/> to use as the backing store.</param>
public FormFeature(IFormCollection form)
{
- if (form == null)
- {
- throw new ArgumentNullException(nameof(form));
- }
+ ArgumentNullException.ThrowIfNull(form);
Form = form;
_request = default!;
@@ -51,14 +48,8 @@ public class FormFeature : IFormFeature
/// <param name="options">The <see cref="FormOptions"/>.</param>
public FormFeature(HttpRequest request, FormOptions options)
{
- if (request == null)
- {
- throw new ArgumentNullException(nameof(request));
- }
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
+ ArgumentNullException.ThrowIfNull(request);
+ ArgumentNullException.ThrowIfNull(options);
_request = request;
_options = options;
@@ -68,7 +59,7 @@ public class FormFeature : IFormFeature
{
get
{
- MediaTypeHeaderValue.TryParse(_request.ContentType, out var mt);
+ _ = MediaTypeHeaderValue.TryParse(_request.ContentType, out var mt);
return mt;
}
}
@@ -180,6 +171,7 @@ public class FormFeature : IFormFeature
else if (HasMultipartFormContentType(contentType))
{
var formAccumulator = new KeyValueAccumulator();
+ var sectionCount = 0;
var boundary = GetBoundary(contentType, _options.MultipartBoundaryLengthLimit);
var multipartReader = new MultipartReader(boundary, _request.Body)
@@ -191,6 +183,11 @@ public class FormFeature : IFormFeature
var section = await multipartReader.ReadNextSectionAsync(cancellationToken);
while (section != null)
{
+ sectionCount++;
+ if (sectionCount > _options.ValueCountLimit)
+ {
+ throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded.");
+ }
// Parse the content disposition here and pass it further to avoid reparsings
if (!ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition))
{
@@ -229,10 +226,6 @@ public class FormFeature : IFormFeature
{
files = new FormFileCollection();
}
- if (files.Count >= _options.ValueCountLimit)
- {
- throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded.");
- }
files.Add(file);
}
else if (contentDisposition.IsFormDisposition())
@@ -245,17 +238,13 @@ public class FormFeature : IFormFeature
// Do not limit the key name length here because the multipart headers length limit is already in effect.
var key = formDataSection.Name;
- var value = await formDataSection.GetValueAsync();
+ var value = await formDataSection.GetValueAsync(cancellationToken);
formAccumulator.Append(key, value);
- if (formAccumulator.ValueCount > _options.ValueCountLimit)
- {
- throw new InvalidDataException($"Form value count limit {_options.ValueCountLimit} exceeded.");
- }
}
else
{
- System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + section.ContentDisposition);
+ // Ignore form sections with invalid content disposition
}
section = await multipartReader.ReadNextSectionAsync(cancellationToken);
diff --git a/src/Http/Http/src/Features/RequestBodyPipeFeature.cs b/src/Http/Http/src/Features/RequestBodyPipeFeature.cs
index 4ac6a066b8..cc94dd4f79 100644
--- a/src/Http/Http/src/Features/RequestBodyPipeFeature.cs
+++ b/src/Http/Http/src/Features/RequestBodyPipeFeature.cs
@@ -14,6 +14,9 @@ public class RequestBodyPipeFeature : IRequestBodyPipeFeature
private Stream? _streamInstanceWhenWrapped;
private readonly HttpContext _context;
+ // We want to use zero byte reads for the request body
+ private static readonly StreamPipeReaderOptions _defaultReaderOptions = new(useZeroByteReads: true);
+
/// <summary>
/// Initializes a new instance of <see cref="IRequestBodyPipeFeature"/>.
/// </summary>
@@ -36,7 +39,7 @@ public class RequestBodyPipeFeature : IRequestBodyPipeFeature
!ReferenceEquals(_streamInstanceWhenWrapped, _context.Request.Body))
{
_streamInstanceWhenWrapped = _context.Request.Body;
- _internalPipeReader = PipeReader.Create(_context.Request.Body);
+ _internalPipeReader = PipeReader.Create(_context.Request.Body, _defaultReaderOptions);
_context.Response.OnCompleted((self) =>
{
diff --git a/src/Http/Http/src/HttpContextAccessor.cs b/src/Http/Http/src/HttpContextAccessor.cs
index 99ec1fe9e1..d10f752969 100644
--- a/src/Http/Http/src/HttpContextAccessor.cs
+++ b/src/Http/Http/src/HttpContextAccessor.cs
@@ -35,7 +35,7 @@ public class HttpContextAccessor : IHttpContextAccessor
}
}
- private class HttpContextHolder
+ private sealed class HttpContextHolder
{
public HttpContext? Context;
}
diff --git a/src/Http/Http/src/Internal/ItemsDictionary.cs b/src/Http/Http/src/Internal/ItemsDictionary.cs
index c66871ba99..713573293a 100644
--- a/src/Http/Http/src/Internal/ItemsDictionary.cs
+++ b/src/Http/Http/src/Internal/ItemsDictionary.cs
@@ -6,7 +6,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.Http;
-internal class ItemsDictionary : IDictionary<object, object?>
+internal sealed class ItemsDictionary : IDictionary<object, object?>
{
private IDictionary<object, object?>? _items;
@@ -136,7 +136,7 @@ internal class ItemsDictionary : IDictionary<object, object?>
IEnumerator IEnumerable.GetEnumerator() => _items?.GetEnumerator() ?? EmptyEnumerator.Instance;
- private class EmptyEnumerator : IEnumerator<KeyValuePair<object, object?>>
+ private sealed class EmptyEnumerator : IEnumerator<KeyValuePair<object, object?>>
{
// In own class so only initalized if GetEnumerator is called on an empty ItemsDictionary
public static readonly IEnumerator<KeyValuePair<object, object?>> Instance = new EmptyEnumerator();
diff --git a/src/Http/Http/src/Internal/ReferenceReadStream.cs b/src/Http/Http/src/Internal/ReferenceReadStream.cs
index b2ef1019f6..97f79f6911 100644
--- a/src/Http/Http/src/Internal/ReferenceReadStream.cs
+++ b/src/Http/Http/src/Internal/ReferenceReadStream.cs
@@ -150,9 +150,6 @@ internal sealed class ReferenceReadStream : Stream
private void ThrowIfDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(ReferenceReadStream));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(ReferenceReadStream));
}
}
diff --git a/src/Http/Http/src/Internal/RequestCookieCollection.cs b/src/Http/Http/src/Internal/RequestCookieCollection.cs
index 310eb95b06..56cfe84044 100644
--- a/src/Http/Http/src/Internal/RequestCookieCollection.cs
+++ b/src/Http/Http/src/Internal/RequestCookieCollection.cs
@@ -9,7 +9,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Http;
-internal class RequestCookieCollection : IRequestCookieCollection
+internal sealed class RequestCookieCollection : IRequestCookieCollection
{
public static readonly RequestCookieCollection Empty = new RequestCookieCollection();
private static readonly string[] EmptyKeys = Array.Empty<string>();
@@ -117,7 +117,7 @@ internal class RequestCookieCollection : IRequestCookieCollection
return Store.ContainsKey(key);
}
- public bool TryGetValue(string key, [MaybeNullWhen(false)] out string? value)
+ public bool TryGetValue(string key, [NotNullWhen(true)] out string? value)
{
if (Store == null)
{
diff --git a/src/Http/Http/src/Internal/ResponseCookies.cs b/src/Http/Http/src/Internal/ResponseCookies.cs
index 2f21ff829e..d92d6afdd2 100644
--- a/src/Http/Http/src/Internal/ResponseCookies.cs
+++ b/src/Http/Http/src/Internal/ResponseCookies.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Http;
/// <summary>
/// A wrapper for the response Set-Cookie header.
/// </summary>
-internal partial class ResponseCookies : IResponseCookies
+internal sealed partial class ResponseCookies : IResponseCookies
{
internal const string EnableCookieNameEncoding = "Microsoft.AspNetCore.Http.EnableCookieNameEncoding";
internal bool _enableCookieNameEncoding = AppContext.TryGetSwitch(EnableCookieNameEncoding, out var enabled) && enabled;
@@ -68,22 +68,11 @@ internal partial class ResponseCookies : IResponseCookies
}
}
- var setCookieHeaderValue = new SetCookieHeaderValue(
+ var cookie = options.CreateCookieHeader(
_enableCookieNameEncoding ? Uri.EscapeDataString(key) : key,
- Uri.EscapeDataString(value))
- {
- Domain = options.Domain,
- Path = options.Path,
- Expires = options.Expires,
- MaxAge = options.MaxAge,
- Secure = options.Secure,
- SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite,
- HttpOnly = options.HttpOnly
- };
-
- var cookieValue = setCookieHeaderValue.ToString();
+ Uri.EscapeDataString(value)).ToString();
- Headers.SetCookie = StringValues.Concat(Headers.SetCookie, cookieValue);
+ Headers.SetCookie = StringValues.Concat(Headers.SetCookie, cookie);
}
/// <inheritdoc />
@@ -112,25 +101,14 @@ internal partial class ResponseCookies : IResponseCookies
}
}
- var setCookieHeaderValue = new SetCookieHeaderValue(string.Empty)
- {
- Domain = options.Domain,
- Path = options.Path,
- Expires = options.Expires,
- MaxAge = options.MaxAge,
- Secure = options.Secure,
- SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite,
- HttpOnly = options.HttpOnly
- };
-
- var cookierHeaderValue = setCookieHeaderValue.ToString()[1..];
+ var cookieSuffix = options.CreateCookieHeader(string.Empty, string.Empty).ToString()[1..];
var cookies = new string[keyValuePairs.Length];
var position = 0;
foreach (var keyValuePair in keyValuePairs)
{
var key = _enableCookieNameEncoding ? Uri.EscapeDataString(keyValuePair.Key) : keyValuePair.Key;
- cookies[position] = string.Concat(key, "=", Uri.EscapeDataString(keyValuePair.Value), cookierHeaderValue);
+ cookies[position] = string.Concat(key, "=", Uri.EscapeDataString(keyValuePair.Value), cookieSuffix);
position++;
}
@@ -200,14 +178,9 @@ internal partial class ResponseCookies : IResponseCookies
Headers.SetCookie = new StringValues(newValues.ToArray());
}
- Append(key, string.Empty, new CookieOptions
+ Append(key, string.Empty, new CookieOptions(options)
{
- Path = options.Path,
- Domain = options.Domain,
Expires = DateTimeOffset.UnixEpoch,
- Secure = options.Secure,
- HttpOnly = options.HttpOnly,
- SameSite = options.SameSite
});
}
diff --git a/src/Http/Http/src/Properties/AssemblyInfo.cs b/src/Http/Http/src/Properties/AssemblyInfo.cs
index 986020126a..891d062145 100644
--- a/src/Http/Http/src/Properties/AssemblyInfo.cs
+++ b/src/Http/Http/src/Properties/AssemblyInfo.cs
@@ -4,4 +4,5 @@
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
+[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Hosting.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.MicroBenchmarks, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Http/Http/src/PublicAPI.Shipped.txt b/src/Http/Http/src/PublicAPI.Shipped.txt
index cb60f3ee71..296aaa87ed 100644
--- a/src/Http/Http/src/PublicAPI.Shipped.txt
+++ b/src/Http/Http/src/PublicAPI.Shipped.txt
@@ -166,6 +166,7 @@ Microsoft.AspNetCore.Http.Features.TlsConnectionFeature.ClientCertificate.set ->
Microsoft.AspNetCore.Http.Features.TlsConnectionFeature.GetClientCertificateAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Security.Cryptography.X509Certificates.X509Certificate2?>!
Microsoft.AspNetCore.Http.Features.TlsConnectionFeature.TlsConnectionFeature() -> void
Microsoft.AspNetCore.Http.FormCollection
+Microsoft.AspNetCore.Http.FormCollection.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Http.FormCollection.ContainsKey(string! key) -> bool
Microsoft.AspNetCore.Http.FormCollection.Count.get -> int
Microsoft.AspNetCore.Http.FormCollection.Enumerator
@@ -198,6 +199,7 @@ Microsoft.AspNetCore.Http.FormFileCollection.GetFile(string! name) -> Microsoft.
Microsoft.AspNetCore.Http.FormFileCollection.GetFiles(string! name) -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Http.IFormFile!>!
Microsoft.AspNetCore.Http.FormFileCollection.this[string! name].get -> Microsoft.AspNetCore.Http.IFormFile?
Microsoft.AspNetCore.Http.HeaderDictionary
+Microsoft.AspNetCore.Http.HeaderDictionary.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Http.HeaderDictionary.Add(string! key, Microsoft.Extensions.Primitives.StringValues value) -> void
Microsoft.AspNetCore.Http.HeaderDictionary.Add(System.Collections.Generic.KeyValuePair<string!, Microsoft.Extensions.Primitives.StringValues> item) -> void
Microsoft.AspNetCore.Http.HeaderDictionary.Clear() -> void
@@ -234,6 +236,7 @@ Microsoft.AspNetCore.Http.MiddlewareFactory.Create(System.Type! middlewareType)
Microsoft.AspNetCore.Http.MiddlewareFactory.MiddlewareFactory(System.IServiceProvider! serviceProvider) -> void
Microsoft.AspNetCore.Http.MiddlewareFactory.Release(Microsoft.AspNetCore.Http.IMiddleware! middleware) -> void
Microsoft.AspNetCore.Http.QueryCollection
+Microsoft.AspNetCore.Http.QueryCollection.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Http.QueryCollection.ContainsKey(string! key) -> bool
Microsoft.AspNetCore.Http.QueryCollection.Count.get -> int
Microsoft.AspNetCore.Http.QueryCollection.Enumerator
diff --git a/src/Http/Http/src/QueryCollectionInternal.cs b/src/Http/Http/src/QueryCollectionInternal.cs
index 4666ffd9a3..827da3d6db 100644
--- a/src/Http/Http/src/QueryCollectionInternal.cs
+++ b/src/Http/Http/src/QueryCollectionInternal.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Http;
/// <summary>
/// The HttpRequest query string collection
/// </summary>
-internal class QueryCollectionInternal : IQueryCollection
+internal sealed class QueryCollectionInternal : IQueryCollection
{
private AdaptiveCapacityDictionary<string, StringValues> Store { get; }
diff --git a/src/Http/Http/test/ApplicationBuilderTests.cs b/src/Http/Http/test/ApplicationBuilderTests.cs
index b87a91668f..fa66214499 100644
--- a/src/Http/Http/test/ApplicationBuilderTests.cs
+++ b/src/Http/Http/test/ApplicationBuilderTests.cs
@@ -20,6 +20,14 @@ public class ApplicationBuilderTests
}
[Fact]
+ public void ServerFeaturesEmptyWhenNotSpecified()
+ {
+ var builder = new ApplicationBuilder(null);
+
+ Assert.Empty(builder.ServerFeatures);
+ }
+
+ [Fact]
public async Task BuildImplicitlyThrowsForMatchedEndpointAsLastStep()
{
var builder = new ApplicationBuilder(null);
diff --git a/src/Http/Http/test/CookieOptionsTests.cs b/src/Http/Http/test/CookieOptionsTests.cs
new file mode 100644
index 0000000000..59c9db46fe
--- /dev/null
+++ b/src/Http/Http/test/CookieOptionsTests.cs
@@ -0,0 +1,63 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Microsoft.AspNetCore.Http.Tests;
+
+public class CookieOptionsTests
+{
+ [Fact]
+ public void CopyCtor_AllPropertiesCopied()
+ {
+ var original = new CookieOptions()
+ {
+ Domain = "domain",
+ Expires = DateTime.UtcNow,
+ Extensions = { "ext1", "ext2=v2" },
+ HttpOnly = true,
+ IsEssential = true,
+ MaxAge = TimeSpan.FromSeconds(10),
+ Path = "/foo",
+ Secure = true,
+ SameSite = SameSiteMode.Strict,
+ };
+ var copy = new CookieOptions(original);
+
+ var properties = typeof(CookieOptions).GetProperties(BindingFlags.Public | BindingFlags.Instance);
+
+ foreach (var property in properties)
+ {
+ switch (property.Name)
+ {
+ case "Domain":
+ case "Expires":
+ case "HttpOnly":
+ case "IsEssential":
+ case "MaxAge":
+ case "Path":
+ case "Secure":
+ case "SameSite":
+ Assert.Equal(property.GetValue(original), property.GetValue(copy));
+ break;
+ case "Extensions":
+ Assert.NotSame(property.GetValue(original), property.GetValue(copy));
+ break;
+ default:
+ Assert.True(false, "Not implemented: " + property.Name);
+ break;
+ }
+ }
+
+ Assert.Equal(original.Extensions.Count, copy.Extensions.Count);
+ foreach (var value in original.Extensions)
+ {
+ Assert.Contains(value, copy.Extensions);
+ }
+ }
+}
diff --git a/src/Http/Http/test/Features/FormFeatureTests.cs b/src/Http/Http/test/Features/FormFeatureTests.cs
index f58b47c53d..01bdf1fa18 100644
--- a/src/Http/Http/test/Features/FormFeatureTests.cs
+++ b/src/Http/Http/test/Features/FormFeatureTests.cs
@@ -162,6 +162,12 @@ InvalidContentDispositionValue +
"\r\n" +
"Foo\r\n";
+ private const string MultipartFormFileNonFormOrFileContentDispositionValue = "--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" +
+"Content-Disposition:x" +
+"\r\n" +
+"\r\n" +
+"Foo\r\n";
+
private const string MultipartFormWithField =
MultipartFormField +
MultipartFormEnd;
@@ -442,6 +448,30 @@ InvalidContentDispositionValue +
[Theory]
[InlineData(true)]
[InlineData(false)]
+ public async Task ReadFormAsync_NonFormOrFieldContentDisposition_ValueCountLimitExceeded_Throw(bool bufferRequest)
+ {
+ var formContent = new List<byte>();
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFileNonFormOrFileContentDispositionValue));
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFileNonFormOrFileContentDispositionValue));
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFileNonFormOrFileContentDispositionValue));
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormEnd));
+
+ var context = new DefaultHttpContext();
+ var responseFeature = new FakeResponseFeature();
+ context.Features.Set<IHttpResponseFeature>(responseFeature);
+ context.Request.ContentType = MultipartContentType;
+ context.Request.Body = new NonSeekableReadStream(formContent.ToArray());
+
+ IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest, ValueCountLimit = 2 });
+ context.Features.Set<IFormFeature>(formFeature);
+
+ var exception = await Assert.ThrowsAsync<InvalidDataException>(() => context.Request.ReadFormAsync());
+ Assert.Equal("Form value count limit 2 exceeded.", exception.Message);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
public async Task ReadFormAsync_ValueCountLimitExceeded_Throw(bool bufferRequest)
{
var formContent = new List<byte>();
@@ -488,6 +518,30 @@ InvalidContentDispositionValue +
}
[Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task ReadFormAsync_ValueCountLimitExceededWithMixedDisposition_Throw(bool bufferRequest)
+ {
+ var formContent = new List<byte>();
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormField));
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFile));
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormFileNonFormOrFileContentDispositionValue));
+ formContent.AddRange(Encoding.UTF8.GetBytes(MultipartFormEnd));
+
+ var context = new DefaultHttpContext();
+ var responseFeature = new FakeResponseFeature();
+ context.Features.Set<IHttpResponseFeature>(responseFeature);
+ context.Request.ContentType = MultipartContentType;
+ context.Request.Body = new NonSeekableReadStream(formContent.ToArray());
+
+ IFormFeature formFeature = new FormFeature(context.Request, new FormOptions() { BufferBody = bufferRequest, ValueCountLimit = 2 });
+ context.Features.Set<IFormFeature>(formFeature);
+
+ var exception = await Assert.ThrowsAsync<InvalidDataException>(() => context.Request.ReadFormAsync());
+ Assert.Equal("Form value count limit 2 exceeded.", exception.Message);
+ }
+
+ [Theory]
// FileBufferingReadStream transitions to disk storage after 30kb, and stops pooling buffers at 1mb.
[InlineData(true, 1024)]
[InlineData(false, 1024)]
diff --git a/src/Http/Http/test/Features/RequestBodyPipeFeatureTests.cs b/src/Http/Http/test/Features/RequestBodyPipeFeatureTests.cs
index 25596b773c..c9e9582038 100644
--- a/src/Http/Http/test/Features/RequestBodyPipeFeatureTests.cs
+++ b/src/Http/Http/test/Features/RequestBodyPipeFeatureTests.cs
@@ -4,6 +4,7 @@
using System.Buffers;
using System.IO.Pipelines;
using System.Text;
+using Moq;
namespace Microsoft.AspNetCore.Http.Features;
@@ -37,6 +38,30 @@ public class RequestBodyPipeFeatureTests
Assert.Equal(expectedString, GetStringFromReadResult(data));
}
+ [Fact]
+ public async Task RequestBodyDoesZeroByteRead()
+ {
+ var context = new DefaultHttpContext();
+ var mockStream = new Mock<Stream>();
+
+ var bufferLengths = new List<int>();
+
+ mockStream.Setup(s => s.CanRead).Returns(true);
+ mockStream.Setup(s => s.ReadAsync(It.IsAny<Memory<byte>>(), It.IsAny<CancellationToken>())).Returns<Memory<byte>, CancellationToken>((buffer, token) =>
+ {
+ bufferLengths.Add(buffer.Length);
+ return ValueTask.FromResult(0);
+ });
+
+ context.Request.Body = mockStream.Object;
+ var feature = new RequestBodyPipeFeature(context);
+ var data = await feature.Reader.ReadAsync();
+
+ Assert.Equal(2, bufferLengths.Count);
+ Assert.Equal(0, bufferLengths[0]);
+ Assert.Equal(4096, bufferLengths[1]);
+ }
+
private static string GetStringFromReadResult(ReadResult data)
{
return Encoding.ASCII.GetString(data.Buffer.ToArray());
diff --git a/src/Http/Http/test/ResponseCookiesTest.cs b/src/Http/Http/test/ResponseCookiesTest.cs
index 44a0222d79..6b8d7dddb6 100644
--- a/src/Http/Http/test/ResponseCookiesTest.cs
+++ b/src/Http/Http/test/ResponseCookiesTest.cs
@@ -55,6 +55,49 @@ public class ResponseCookiesTest
}
[Fact]
+ public void AppendWithExtensions()
+ {
+ var headers = (IHeaderDictionary)new HeaderDictionary();
+ var features = MakeFeatures(headers);
+ var cookies = new ResponseCookies(features);
+ var testCookie = "TestCookie";
+
+ cookies.Append(testCookie, "value", new CookieOptions()
+ {
+ Extensions = { "simple", "key=value" }
+ });
+
+ var cookieHeaderValues = headers.SetCookie;
+ Assert.Single(cookieHeaderValues);
+ Assert.StartsWith(testCookie, cookieHeaderValues[0]);
+ Assert.Contains("path=/", cookieHeaderValues[0]);
+ Assert.Contains("simple;", cookieHeaderValues[0]);
+ Assert.EndsWith("key=value", cookieHeaderValues[0]);
+ }
+
+ [Fact]
+ public void DeleteWithExtensions()
+ {
+ var headers = (IHeaderDictionary)new HeaderDictionary();
+ var features = MakeFeatures(headers);
+ var cookies = new ResponseCookies(features);
+ var testCookie = "TestCookie";
+
+ cookies.Delete(testCookie, new CookieOptions()
+ {
+ Extensions = { "simple", "key=value" }
+ });
+
+ var cookieHeaderValues = headers.SetCookie;
+ Assert.Single(cookieHeaderValues);
+ Assert.StartsWith(testCookie, cookieHeaderValues[0]);
+ Assert.Contains("path=/", cookieHeaderValues[0]);
+ Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]);
+ Assert.Contains("simple;", cookieHeaderValues[0]);
+ Assert.EndsWith("key=value", cookieHeaderValues[0]);
+ }
+
+ [Fact]
public void DeleteCookieShouldSetDefaultPath()
{
var headers = (IHeaderDictionary)new HeaderDictionary();
@@ -144,7 +187,8 @@ public class ResponseCookiesTest
Path = "/",
Expires = time,
Domain = "example.com",
- SameSite = SameSiteMode.Lax
+ SameSite = SameSiteMode.Lax,
+ Extensions = { "extension" }
};
cookies.Delete(testCookie, options);
@@ -157,6 +201,7 @@ public class ResponseCookiesTest
Assert.Contains("secure", cookieHeaderValues[0]);
Assert.Contains("httponly", cookieHeaderValues[0]);
Assert.Contains("samesite", cookieHeaderValues[0]);
+ Assert.Contains("extension", cookieHeaderValues[0]);
}
[Fact]
diff --git a/src/Http/HttpAbstractions.slnf b/src/Http/HttpAbstractions.slnf
index 70fc8b56f6..29d4f41c4e 100644
--- a/src/Http/HttpAbstractions.slnf
+++ b/src/Http/HttpAbstractions.slnf
@@ -2,6 +2,10 @@
"solution": {
"path": "..\\..\\AspNetCore.sln",
"projects": [
+ "src\\DataProtection\\Abstractions\\src\\Microsoft.AspNetCore.DataProtection.Abstractions.csproj",
+ "src\\DataProtection\\Cryptography.Internal\\src\\Microsoft.AspNetCore.Cryptography.Internal.csproj",
+ "src\\DataProtection\\DataProtection\\src\\Microsoft.AspNetCore.DataProtection.csproj",
+ "src\\DefaultBuilder\\src\\Microsoft.AspNetCore.csproj",
"src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
"src\\Extensions\\Features\\test\\Microsoft.Extensions.Features.Tests.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
@@ -43,15 +47,25 @@
"src\\Http\\samples\\MinimalSample\\MinimalSample.csproj",
"src\\Http\\samples\\SampleApp\\HttpAbstractions.SampleApp.csproj",
"src\\Middleware\\CORS\\src\\Microsoft.AspNetCore.Cors.csproj",
+ "src\\Middleware\\Diagnostics.Abstractions\\src\\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj",
+ "src\\Middleware\\Diagnostics\\src\\Microsoft.AspNetCore.Diagnostics.csproj",
+ "src\\Middleware\\HostFiltering\\src\\Microsoft.AspNetCore.HostFiltering.csproj",
"src\\Middleware\\HttpOverrides\\src\\Microsoft.AspNetCore.HttpOverrides.csproj",
+ "src\\Middleware\\OutputCaching\\src\\Microsoft.AspNetCore.OutputCaching.csproj",
+ "src\\Middleware\\ResponseCaching.Abstractions\\src\\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj",
"src\\Middleware\\StaticFiles\\src\\Microsoft.AspNetCore.StaticFiles.csproj",
+ "src\\Mvc\\Mvc.Abstractions\\src\\Microsoft.AspNetCore.Mvc.Abstractions.csproj",
+ "src\\Mvc\\Mvc.Core\\src\\Microsoft.AspNetCore.Mvc.Core.csproj",
"src\\ObjectPool\\src\\Microsoft.Extensions.ObjectPool.csproj",
+ "src\\Security\\Authentication\\Core\\src\\Microsoft.AspNetCore.Authentication.csproj",
"src\\Security\\Authorization\\Core\\src\\Microsoft.AspNetCore.Authorization.csproj",
"src\\Security\\Authorization\\Policy\\src\\Microsoft.AspNetCore.Authorization.Policy.csproj",
"src\\Servers\\Connections.Abstractions\\src\\Microsoft.AspNetCore.Connections.Abstractions.csproj",
"src\\Servers\\IIS\\IISIntegration\\src\\Microsoft.AspNetCore.Server.IISIntegration.csproj",
+ "src\\Servers\\IIS\\IIS\\src\\Microsoft.AspNetCore.Server.IIS.csproj",
"src\\Servers\\Kestrel\\Core\\src\\Microsoft.AspNetCore.Server.Kestrel.Core.csproj",
"src\\Servers\\Kestrel\\Kestrel\\src\\Microsoft.AspNetCore.Server.Kestrel.csproj",
+ "src\\Servers\\Kestrel\\Transport.Quic\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj",
"src\\Servers\\Kestrel\\Transport.Sockets\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj",
"src\\Testing\\src\\Microsoft.AspNetCore.Testing.csproj",
"src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj"
diff --git a/src/Http/Owin/src/DictionaryStringArrayWrapper.cs b/src/Http/Owin/src/DictionaryStringArrayWrapper.cs
index a4229ff7dc..00a726a6f6 100644
--- a/src/Http/Owin/src/DictionaryStringArrayWrapper.cs
+++ b/src/Http/Owin/src/DictionaryStringArrayWrapper.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Owin;
-internal class DictionaryStringArrayWrapper : IDictionary<string, string[]>
+internal sealed class DictionaryStringArrayWrapper : IDictionary<string, string[]>
{
public DictionaryStringArrayWrapper(IHeaderDictionary inner)
{
diff --git a/src/Http/Owin/src/DictionaryStringValuesWrapper.cs b/src/Http/Owin/src/DictionaryStringValuesWrapper.cs
index 12f036faf3..50ab189ba5 100644
--- a/src/Http/Owin/src/DictionaryStringValuesWrapper.cs
+++ b/src/Http/Owin/src/DictionaryStringValuesWrapper.cs
@@ -9,7 +9,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Owin;
-internal class DictionaryStringValuesWrapper : IHeaderDictionary
+internal sealed class DictionaryStringValuesWrapper : IHeaderDictionary
{
public DictionaryStringValuesWrapper(IDictionary<string, string[]> inner)
{
diff --git a/src/Http/Owin/src/OwinExtensions.cs b/src/Http/Owin/src/OwinExtensions.cs
index 6e78cd5c81..6df3f0fedb 100644
--- a/src/Http/Owin/src/OwinExtensions.cs
+++ b/src/Http/Owin/src/OwinExtensions.cs
@@ -198,7 +198,7 @@ public static class OwinExtensions
return app;
}
- private class EmptyProvider : IServiceProvider
+ private sealed class EmptyProvider : IServiceProvider
{
public object GetService(Type serviceType)
{
diff --git a/src/Http/Routing.Abstractions/src/PublicAPI.Shipped.txt b/src/Http/Routing.Abstractions/src/PublicAPI.Shipped.txt
index 1c0d32c484..6a1e52ffd1 100644
--- a/src/Http/Routing.Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/Http/Routing.Abstractions/src/PublicAPI.Shipped.txt
@@ -65,6 +65,7 @@ Microsoft.AspNetCore.Routing.RouteData.RouteData() -> void
Microsoft.AspNetCore.Routing.RouteData.RouteData(Microsoft.AspNetCore.Routing.RouteData! other) -> void
Microsoft.AspNetCore.Routing.RouteData.RouteData(Microsoft.AspNetCore.Routing.RouteValueDictionary! values) -> void
Microsoft.AspNetCore.Routing.RouteData.RouteDataSnapshot
+Microsoft.AspNetCore.Routing.RouteData.RouteDataSnapshot.RouteDataSnapshot() -> void
Microsoft.AspNetCore.Routing.RouteData.RouteDataSnapshot.Restore() -> void
Microsoft.AspNetCore.Routing.RouteData.RouteDataSnapshot.RouteDataSnapshot(Microsoft.AspNetCore.Routing.RouteData! routeData, Microsoft.AspNetCore.Routing.RouteValueDictionary? dataTokens, System.Collections.Generic.IList<Microsoft.AspNetCore.Routing.IRouter!>? routers, Microsoft.AspNetCore.Routing.RouteValueDictionary? values) -> void
Microsoft.AspNetCore.Routing.RouteData.Routers.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Routing.IRouter!>!
diff --git a/src/Http/Routing.Abstractions/src/PublicAPI.Unshipped.txt b/src/Http/Routing.Abstractions/src/PublicAPI.Unshipped.txt
index 8ea36345fe..5cad7f7ef8 100644
--- a/src/Http/Routing.Abstractions/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Routing.Abstractions/src/PublicAPI.Unshipped.txt
@@ -1,2 +1,4 @@
#nullable enable
-Microsoft.AspNetCore.Http.EndpointMetadataCollection.GetRequiredMetadata<T>() -> T! (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions) \ No newline at end of file
+*REMOVED*Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Current.get -> object? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Http.EndpointMetadataCollection.Enumerator.Current.get -> object! (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Http.EndpointMetadataCollection.GetRequiredMetadata<T>() -> T! (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
diff --git a/src/Http/Routing/perf/Microbenchmarks/EndpointMetadataCollectionBenchmark.cs b/src/Http/Routing/perf/Microbenchmarks/EndpointMetadataCollectionBenchmark.cs
index 03e3998383..36af6db237 100644
--- a/src/Http/Routing/perf/Microbenchmarks/EndpointMetadataCollectionBenchmark.cs
+++ b/src/Http/Routing/perf/Microbenchmarks/EndpointMetadataCollectionBenchmark.cs
@@ -114,13 +114,13 @@ public class EndpointMetadataCollectionBenchmark
private interface IMetadata3 { }
private interface IMetadata4 { }
private interface IMetadata5 { }
- private class Metadata1 : IMetadata1 { }
- private class Metadata2 : IMetadata2 { }
- private class Metadata3 : IMetadata3 { }
- private class Metadata4 : IMetadata4 { }
- private class Metadata5 : IMetadata5 { }
- private class Metadata6 : IMetadata1, IMetadata2 { }
- private class Metadata7 : IMetadata2, IMetadata3 { }
- private class Metadata8 : IMetadata4, IMetadata5 { }
- private class Metadata9 : IMetadata1, IMetadata2 { }
+ private sealed class Metadata1 : IMetadata1 { }
+ private sealed class Metadata2 : IMetadata2 { }
+ private sealed class Metadata3 : IMetadata3 { }
+ private sealed class Metadata4 : IMetadata4 { }
+ private sealed class Metadata5 : IMetadata5 { }
+ private sealed class Metadata6 : IMetadata1, IMetadata2 { }
+ private sealed class Metadata7 : IMetadata2, IMetadata3 { }
+ private sealed class Metadata8 : IMetadata4, IMetadata5 { }
+ private sealed class Metadata9 : IMetadata1, IMetadata2 { }
}
diff --git a/src/Http/Routing/perf/Microbenchmarks/LinkGeneration/SingleRouteRouteValuesAddressSchemeBenchmark.cs b/src/Http/Routing/perf/Microbenchmarks/LinkGeneration/SingleRouteRouteValuesAddressSchemeBenchmark.cs
index 818839f369..d04a840dab 100644
--- a/src/Http/Routing/perf/Microbenchmarks/LinkGeneration/SingleRouteRouteValuesAddressSchemeBenchmark.cs
+++ b/src/Http/Routing/perf/Microbenchmarks/LinkGeneration/SingleRouteRouteValuesAddressSchemeBenchmark.cs
@@ -55,7 +55,7 @@ public class SingleRouteRouteValuesAddressSchemeBenchmark : EndpointRoutingBench
});
}
- private class TestAddressScheme : IEndpointAddressScheme<int>
+ private sealed class TestAddressScheme : IEndpointAddressScheme<int>
{
private readonly Endpoint _endpoint;
diff --git a/src/Http/Routing/perf/Microbenchmarks/Matching/MatcherBuilderMultipleEntryBenchmark.cs b/src/Http/Routing/perf/Microbenchmarks/Matching/MatcherBuilderMultipleEntryBenchmark.cs
index fc2fd3b8a4..ce229fc57a 100644
--- a/src/Http/Routing/perf/Microbenchmarks/Matching/MatcherBuilderMultipleEntryBenchmark.cs
+++ b/src/Http/Routing/perf/Microbenchmarks/Matching/MatcherBuilderMultipleEntryBenchmark.cs
@@ -100,7 +100,7 @@ public partial class MatcherBuilderMultipleEntryBenchmark : EndpointRoutingBench
return new TestUberPolicy(order);
}
- private class TestUberPolicy : TestMatcherPolicyBase, INodeBuilderPolicy, IEndpointComparerPolicy
+ private sealed class TestUberPolicy : TestMatcherPolicyBase, INodeBuilderPolicy, IEndpointComparerPolicy
{
public TestUberPolicy(int order) : base(order)
{
@@ -124,7 +124,7 @@ public partial class MatcherBuilderMultipleEntryBenchmark : EndpointRoutingBench
}
}
- private class TestNodeBuilderPolicy : TestMatcherPolicyBase, INodeBuilderPolicy
+ private sealed class TestNodeBuilderPolicy : TestMatcherPolicyBase, INodeBuilderPolicy
{
public TestNodeBuilderPolicy(int order) : base(order)
{
@@ -146,7 +146,7 @@ public partial class MatcherBuilderMultipleEntryBenchmark : EndpointRoutingBench
}
}
- private class TestEndpointComparerPolicy : TestMatcherPolicyBase, IEndpointComparerPolicy
+ private sealed class TestEndpointComparerPolicy : TestMatcherPolicyBase, IEndpointComparerPolicy
{
public TestEndpointComparerPolicy(int order) : base(order)
{
@@ -165,7 +165,7 @@ public partial class MatcherBuilderMultipleEntryBenchmark : EndpointRoutingBench
}
}
- private class TestEndpointSelectorPolicy : TestMatcherPolicyBase, IEndpointSelectorPolicy
+ private sealed class TestEndpointSelectorPolicy : TestMatcherPolicyBase, IEndpointSelectorPolicy
{
public TestEndpointSelectorPolicy(int order) : base(order)
{
@@ -194,7 +194,7 @@ public partial class MatcherBuilderMultipleEntryBenchmark : EndpointRoutingBench
public override int Order { get { return _order; } }
}
- private class TestEndpointComparer : IComparer<Endpoint>
+ private sealed class TestEndpointComparer : IComparer<Endpoint>
{
public int Compare(Endpoint x, Endpoint y)
{
diff --git a/src/Http/Routing/perf/Microbenchmarks/Matching/TrivialMatcherBuilder.cs b/src/Http/Routing/perf/Microbenchmarks/Matching/TrivialMatcherBuilder.cs
index 0b47ce92e3..59cf37f8e9 100644
--- a/src/Http/Routing/perf/Microbenchmarks/Matching/TrivialMatcherBuilder.cs
+++ b/src/Http/Routing/perf/Microbenchmarks/Matching/TrivialMatcherBuilder.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class TrivialMatcherBuilder : MatcherBuilder
+internal sealed class TrivialMatcherBuilder : MatcherBuilder
{
private readonly List<RouteEndpoint> _endpoints = new List<RouteEndpoint>();
diff --git a/src/Http/Routing/src/Builder/EndpointFilterExtensions.cs b/src/Http/Routing/src/Builder/EndpointFilterExtensions.cs
new file mode 100644
index 0000000000..91ed5e9c7f
--- /dev/null
+++ b/src/Http/Routing/src/Builder/EndpointFilterExtensions.cs
@@ -0,0 +1,120 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Http;
+
+/// <summary>
+/// Extension methods for adding <see cref="IEndpointFilter"/> to a route handler.
+/// </summary>
+public static class EndpointFilterExtensions
+{
+ /// <summary>
+ /// Registers a filter onto the route handler.
+ /// </summary>
+ /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <param name="filter">The <see cref="IEndpointFilter"/> to register.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
+ public static TBuilder AddEndpointFilter<TBuilder>(this TBuilder builder, IEndpointFilter filter) where TBuilder : IEndpointConventionBuilder =>
+ builder.AddEndpointFilterFactory((routeHandlerContext, next) => (context) => filter.InvokeAsync(context, next));
+
+ /// <summary>
+ /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler.
+ /// </summary>
+ /// <typeparam name="TBuilder">The type of the <see cref="IEndpointConventionBuilder"/> to configure.</typeparam>
+ /// <typeparam name="TFilterType">The type of the <see cref="IEndpointFilter"/> to register.</typeparam>
+ /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
+ public static TBuilder AddEndpointFilter<TBuilder, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this TBuilder builder)
+ where TBuilder : IEndpointConventionBuilder
+ where TFilterType : IEndpointFilter
+ {
+ // We call `CreateFactory` twice here since the `CreateFactory` API does not support optional arguments.
+ // See https://github.com/dotnet/runtime/issues/67309 for more info.
+ ObjectFactory filterFactory;
+ try
+ {
+ filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), new[] { typeof(EndpointFilterFactoryContext) });
+ }
+ catch (InvalidOperationException)
+ {
+ filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), Type.EmptyTypes);
+ }
+
+ builder.AddEndpointFilterFactory((routeHandlerContext, next) =>
+ {
+ var invokeArguments = new[] { routeHandlerContext };
+ return (context) =>
+ {
+ var filter = (IEndpointFilter)filterFactory.Invoke(context.HttpContext.RequestServices, invokeArguments);
+ return filter.InvokeAsync(context, next);
+ };
+ });
+ return builder;
+ }
+
+ /// <summary>
+ /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler.
+ /// </summary>
+ /// <typeparam name="TFilterType">The type of the <see cref="IEndpointFilter"/> to register.</typeparam>
+ /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
+ public static RouteHandlerBuilder AddEndpointFilter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteHandlerBuilder builder)
+ where TFilterType : IEndpointFilter
+ {
+ // We have a RouteHandlerBuiler and GroupRouteBuilder-specific AddFilter methods for convenience so you don't have to specify both arguments most the time.
+ return builder.AddEndpointFilter<RouteHandlerBuilder, TFilterType>();
+ }
+
+ /// <summary>
+ /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler.
+ /// </summary>
+ /// <typeparam name="TFilterType">The type of the <see cref="IEndpointFilter"/> to register.</typeparam>
+ /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
+ public static RouteGroupBuilder AddEndpointFilter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteGroupBuilder builder)
+ where TFilterType : IEndpointFilter
+ {
+ // We have a RouteHandlerBuiler and GroupRouteBuilder-specific AddFilter methods for convenience so you don't have to specify both arguments most the time.
+ return builder.AddEndpointFilter<RouteGroupBuilder, TFilterType>();
+ }
+
+ /// <summary>
+ /// Registers a filter given a delegate onto the route handler.
+ /// </summary>
+ /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <param name="routeHandlerFilter">A method representing the core logic of the filter.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
+ public static TBuilder AddEndpointFilter<TBuilder>(this TBuilder builder, Func<EndpointFilterInvocationContext, EndpointFilterDelegate, ValueTask<object?>> routeHandlerFilter)
+ where TBuilder : IEndpointConventionBuilder
+ {
+ return builder.AddEndpointFilterFactory((routeHandlerContext, next) => (context) => routeHandlerFilter(context, next));
+ }
+
+ /// <summary>
+ /// Register a filter given a delegate representing the filter factory.
+ /// </summary>
+ /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <param name="filterFactory">A method representing the logic for constructing the filter.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
+ public static TBuilder AddEndpointFilterFactory<TBuilder>(this TBuilder builder, Func<EndpointFilterFactoryContext, EndpointFilterDelegate, EndpointFilterDelegate> filterFactory)
+ where TBuilder : IEndpointConventionBuilder
+ {
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.FilterFactories.Add(filterFactory);
+ });
+
+ return builder;
+ }
+}
diff --git a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs
index 7af7e03f09..22e82eb815 100644
--- a/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/EndpointRouteBuilderExtensions.cs
@@ -2,13 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-using System.Reflection;
-using System.Runtime.CompilerServices;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Patterns;
-using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
@@ -29,6 +25,35 @@ public static class EndpointRouteBuilderExtensions
private static readonly string[] PatchVerb = new[] { HttpMethods.Patch };
/// <summary>
+ /// Creates a <see cref="RouteGroupBuilder"/> for defining endpoints all prefixed with the specified <paramref name="prefix"/>.
+ /// </summary>
+ /// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/> to add the group to.</param>
+ /// <param name="prefix">The pattern that prefixes all routes in this group.</param>
+ /// <returns>
+ /// A <see cref="RouteGroupBuilder"/> that is both an <see cref="IEndpointRouteBuilder"/> and an <see cref="IEndpointConventionBuilder"/>.
+ /// The same builder can be used to add endpoints with the given <paramref name="prefix"/>, and to customize those endpoints using conventions.
+ /// </returns>
+ public static RouteGroupBuilder MapGroup(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string prefix) =>
+ endpoints.MapGroup(RoutePatternFactory.Parse(prefix ?? throw new ArgumentNullException(nameof(prefix))));
+
+ /// <summary>
+ /// Creates a <see cref="RouteGroupBuilder"/> for defining endpoints all prefixed with the specified <paramref name="prefix"/>.
+ /// </summary>
+ /// <param name="endpoints">The <see cref="IEndpointRouteBuilder"/> to add the group to.</param>
+ /// <param name="prefix">The pattern that prefixes all routes in this group.</param>
+ /// <returns>
+ /// A <see cref="RouteGroupBuilder"/> that is both an <see cref="IEndpointRouteBuilder"/> and an <see cref="IEndpointConventionBuilder"/>.
+ /// The same builder can be used to add endpoints with the given <paramref name="prefix"/>, and to customize those endpoints using conventions.
+ /// </returns>
+ public static RouteGroupBuilder MapGroup(this IEndpointRouteBuilder endpoints, RoutePattern prefix)
+ {
+ ArgumentNullException.ThrowIfNull(endpoints);
+ ArgumentNullException.ThrowIfNull(prefix);
+
+ return new(endpoints, prefix);
+ }
+
+ /// <summary>
/// Adds a <see cref="RouteEndpoint"/> to the <see cref="IEndpointRouteBuilder"/> that matches HTTP GET requests
/// for the specified pattern.
/// </summary>
@@ -36,17 +61,11 @@ public static class EndpointRouteBuilderExtensions
/// <param name="pattern">The route pattern.</param>
/// <param name="requestDelegate">The delegate executed when the endpoint is matched.</param>
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
- [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
public static IEndpointConventionBuilder MapGet(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
- var returnType = requestDelegate.Method.ReturnType;
- if (returnType is { IsGenericType: true } && returnType.GetGenericTypeDefinition() == typeof(Task<>))
- {
- return MapMethods(endpoints, pattern, GetVerb, requestDelegate as Delegate);
- }
return MapMethods(endpoints, pattern, GetVerb, requestDelegate);
}
@@ -60,7 +79,7 @@ public static class EndpointRouteBuilderExtensions
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
public static IEndpointConventionBuilder MapPost(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
return MapMethods(endpoints, pattern, PostVerb, requestDelegate);
@@ -76,7 +95,7 @@ public static class EndpointRouteBuilderExtensions
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
public static IEndpointConventionBuilder MapPut(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
return MapMethods(endpoints, pattern, PutVerb, requestDelegate);
@@ -92,7 +111,7 @@ public static class EndpointRouteBuilderExtensions
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
public static IEndpointConventionBuilder MapDelete(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
return MapMethods(endpoints, pattern, DeleteVerb, requestDelegate);
@@ -108,7 +127,7 @@ public static class EndpointRouteBuilderExtensions
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
public static IEndpointConventionBuilder MapPatch(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
return MapMethods(endpoints, pattern, PatchVerb, requestDelegate);
@@ -125,19 +144,13 @@ public static class EndpointRouteBuilderExtensions
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
public static IEndpointConventionBuilder MapMethods(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
IEnumerable<string> httpMethods,
RequestDelegate requestDelegate)
{
- if (httpMethods == null)
- {
- throw new ArgumentNullException(nameof(httpMethods));
- }
+ ArgumentNullException.ThrowIfNull(httpMethods);
- var builder = endpoints.Map(RoutePatternFactory.Parse(pattern), requestDelegate);
- builder.WithDisplayName($"{pattern} HTTP: {string.Join(", ", httpMethods)}");
- builder.WithMetadata(new HttpMethodMetadata(httpMethods));
- return builder;
+ return endpoints.Map(RoutePatternFactory.Parse(pattern), requestDelegate, httpMethods);
}
/// <summary>
@@ -150,7 +163,7 @@ public static class EndpointRouteBuilderExtensions
/// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
public static IEndpointConventionBuilder Map(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
return Map(endpoints, RoutePatternFactory.Parse(pattern), requestDelegate);
@@ -169,51 +182,20 @@ public static class EndpointRouteBuilderExtensions
RoutePattern pattern,
RequestDelegate requestDelegate)
{
- if (endpoints == null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
-
- if (pattern == null)
- {
- throw new ArgumentNullException(nameof(pattern));
- }
-
- if (requestDelegate == null)
- {
- throw new ArgumentNullException(nameof(requestDelegate));
- }
-
- const int defaultOrder = 0;
-
- var builder = new RouteEndpointBuilder(
- requestDelegate,
- pattern,
- defaultOrder)
- {
- DisplayName = pattern.RawText ?? pattern.DebuggerToString(),
- };
-
- // Add delegate attributes as metadata
- var attributes = requestDelegate.Method.GetCustomAttributes();
-
- // This can be null if the delegate is a dynamic method or compiled from an expression tree
- if (attributes != null)
- {
- foreach (var attribute in attributes)
- {
- builder.Metadata.Add(attribute);
- }
- }
+ return Map(endpoints, pattern, requestDelegate, httpMethods: null);
+ }
- var dataSource = endpoints.DataSources.OfType<ModelEndpointDataSource>().FirstOrDefault();
- if (dataSource == null)
- {
- dataSource = new ModelEndpointDataSource();
- endpoints.DataSources.Add(dataSource);
- }
+ private static IEndpointConventionBuilder Map(
+ this IEndpointRouteBuilder endpoints,
+ RoutePattern pattern,
+ RequestDelegate requestDelegate,
+ IEnumerable<string>? httpMethods)
+ {
+ ArgumentNullException.ThrowIfNull(endpoints);
+ ArgumentNullException.ThrowIfNull(pattern);
+ ArgumentNullException.ThrowIfNull(requestDelegate);
- return dataSource.AddEndpointBuilder(builder);
+ return endpoints.GetOrAddRouteEndpointDataSource().AddRequestDelegate(pattern, requestDelegate, httpMethods);
}
/// <summary>
@@ -227,7 +209,7 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapGet(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
return MapMethods(endpoints, pattern, GetVerb, handler);
@@ -244,7 +226,7 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapPost(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
return MapMethods(endpoints, pattern, PostVerb, handler);
@@ -261,7 +243,7 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapPut(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
return MapMethods(endpoints, pattern, PutVerb, handler);
@@ -278,7 +260,7 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapDelete(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
return MapMethods(endpoints, pattern, DeleteVerb, handler);
@@ -295,7 +277,7 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapPatch(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
return MapMethods(endpoints, pattern, PatchVerb, handler);
@@ -313,43 +295,12 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapMethods(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
IEnumerable<string> httpMethods,
Delegate handler)
{
- if (httpMethods is null)
- {
- throw new ArgumentNullException(nameof(httpMethods));
- }
-
- var disableInferredBody = false;
- foreach (var method in httpMethods)
- {
- disableInferredBody = ShouldDisableInferredBody(method);
- if (disableInferredBody is true)
- {
- break;
- }
- }
-
- var initialMetadata = new object[] { new HttpMethodMetadata(httpMethods) };
- var builder = endpoints.Map(RoutePatternFactory.Parse(pattern), handler, disableInferredBody, initialMetadata);
-
- // Prepends the HTTP method to the DisplayName produced with pattern + method name
- builder.Add(b => b.DisplayName = $"HTTP: {string.Join(", ", httpMethods)} {b.DisplayName}");
-
- return builder;
-
- static bool ShouldDisableInferredBody(string method)
- {
- // GET, DELETE, HEAD, CONNECT, TRACE, and OPTIONS normally do not contain bodies
- return method.Equals(HttpMethods.Get, StringComparison.Ordinal) ||
- method.Equals(HttpMethods.Delete, StringComparison.Ordinal) ||
- method.Equals(HttpMethods.Head, StringComparison.Ordinal) ||
- method.Equals(HttpMethods.Options, StringComparison.Ordinal) ||
- method.Equals(HttpMethods.Trace, StringComparison.Ordinal) ||
- method.Equals(HttpMethods.Connect, StringComparison.Ordinal);
- }
+ ArgumentNullException.ThrowIfNull(httpMethods);
+ return endpoints.Map(RoutePatternFactory.Parse(pattern), handler, httpMethods, isFallback: false);
}
/// <summary>
@@ -363,7 +314,7 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder Map(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
return Map(endpoints, RoutePatternFactory.Parse(pattern), handler);
@@ -383,7 +334,7 @@ public static class EndpointRouteBuilderExtensions
RoutePattern pattern,
Delegate handler)
{
- return Map(endpoints, pattern, handler, disableInferBodyFromParameters: false);
+ return Map(endpoints, pattern, handler, httpMethods: null, isFallback: false);
}
/// <summary>
@@ -408,16 +359,6 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapFallback(this IEndpointRouteBuilder endpoints, Delegate handler)
{
- if (endpoints == null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
-
- if (handler == null)
- {
- throw new ArgumentNullException(nameof(handler));
- }
-
return endpoints.MapFallback("{*path:nonfile}", handler);
}
@@ -445,28 +386,10 @@ public static class EndpointRouteBuilderExtensions
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
public static RouteHandlerBuilder MapFallback(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
Delegate handler)
{
- if (endpoints == null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
-
- if (pattern == null)
- {
- throw new ArgumentNullException(nameof(pattern));
- }
-
- if (handler == null)
- {
- throw new ArgumentNullException(nameof(handler));
- }
-
- var conventionBuilder = endpoints.Map(pattern, handler);
- conventionBuilder.WithDisplayName("Fallback " + pattern);
- conventionBuilder.Add(b => ((RouteEndpointBuilder)b).Order = int.MaxValue);
- return conventionBuilder;
+ return endpoints.Map(RoutePatternFactory.Parse(pattern), handler, httpMethods: null, isFallback: true);
}
[RequiresUnreferencedCode(MapEndpointTrimmerWarning)]
@@ -474,86 +397,45 @@ public static class EndpointRouteBuilderExtensions
this IEndpointRouteBuilder endpoints,
RoutePattern pattern,
Delegate handler,
- bool disableInferBodyFromParameters,
- IEnumerable<object>? initialEndpointMetadata = null)
+ IEnumerable<string>? httpMethods,
+ bool isFallback)
{
- if (endpoints is null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
+ ArgumentNullException.ThrowIfNull(endpoints);
+ ArgumentNullException.ThrowIfNull(pattern);
+ ArgumentNullException.ThrowIfNull(handler);
- if (pattern is null)
- {
- throw new ArgumentNullException(nameof(pattern));
- }
-
- if (handler is null)
- {
- throw new ArgumentNullException(nameof(handler));
- }
+ return endpoints.GetOrAddRouteEndpointDataSource().AddRouteHandler(pattern, handler, httpMethods, isFallback);
+ }
- const int defaultOrder = 0;
+ private static RouteEndpointDataSource GetOrAddRouteEndpointDataSource(this IEndpointRouteBuilder endpoints)
+ {
+ RouteEndpointDataSource? routeEndpointDataSource = null;
- var routeParams = new List<string>(pattern.Parameters.Count);
- foreach (var part in pattern.Parameters)
+ foreach (var dataSource in endpoints.DataSources)
{
- routeParams.Add(part.Name);
+ if (dataSource is RouteEndpointDataSource foundDataSource)
+ {
+ routeEndpointDataSource = foundDataSource;
+ break;
+ }
}
- var routeHandlerOptions = endpoints.ServiceProvider?.GetService<IOptions<RouteHandlerOptions>>();
-
- var builder = new RouteEndpointBuilder(
- pattern,
- defaultOrder)
- {
- DisplayName = pattern.RawText ?? pattern.DebuggerToString(),
- ServiceProvider = endpoints.ServiceProvider,
- };
-
- // Methods defined in a top-level program are generated as statics so the delegate
- // target will be null. Inline lambdas are compiler generated method so they can
- // be filtered that way.
- if (GeneratedNameParser.TryParseLocalFunctionName(handler.Method.Name, out var endpointName)
- || !TypeHelper.IsCompilerGeneratedMethod(handler.Method))
+ if (routeEndpointDataSource is null)
{
- endpointName ??= handler.Method.Name;
- builder.DisplayName = $"{builder.DisplayName} => {endpointName}";
- }
+ // ServiceProvider isn't nullable, but it is being called by methods that historically did not access this property, so we null check anyway.
+ var routeHandlerOptions = endpoints.ServiceProvider?.GetService<IOptions<RouteHandlerOptions>>();
+ var throwOnBadRequest = routeHandlerOptions?.Value.ThrowOnBadRequest ?? false;
- var dataSource = endpoints.DataSources.OfType<ModelEndpointDataSource>().FirstOrDefault();
- if (dataSource is null)
- {
- dataSource = new ModelEndpointDataSource();
- endpoints.DataSources.Add(dataSource);
+ routeEndpointDataSource = new RouteEndpointDataSource(endpoints.ServiceProvider ?? EmptyServiceProvider.Instance, throwOnBadRequest);
+ endpoints.DataSources.Add(routeEndpointDataSource);
}
- var routeHandlerBuilder = new RouteHandlerBuilder(dataSource.AddEndpointBuilder(builder));
- routeHandlerBuilder.Add(RouteHandlerBuilderConvention);
-
- [UnconditionalSuppressMessage("Trimmer", "IL2026", Justification = "We surface a RequireUnreferencedCode in the call to enclosing Map method. " +
- "The trimmer is unable to infer this on the nested lambda.")]
- void RouteHandlerBuilderConvention(EndpointBuilder endpointBuilder)
- {
- var options = new RequestDelegateFactoryOptions
- {
- ServiceProvider = endpoints.ServiceProvider,
- RouteParameterNames = routeParams,
- ThrowOnBadRequest = routeHandlerOptions?.Value.ThrowOnBadRequest ?? false,
- DisableInferBodyFromParameters = disableInferBodyFromParameters,
- RouteHandlerFilterFactories = routeHandlerBuilder.RouteHandlerFilterFactories,
- InitialEndpointMetadata = initialEndpointMetadata
- };
- var filteredRequestDelegateResult = RequestDelegateFactory.Create(handler, options);
-
- // Add request delegate metadata
- foreach (var metadata in filteredRequestDelegateResult.EndpointMetadata)
- {
- endpointBuilder.Metadata.Add(metadata);
- }
-
- endpointBuilder.RequestDelegate = filteredRequestDelegateResult.RequestDelegate;
- }
+ return routeEndpointDataSource;
+ }
- return routeHandlerBuilder;
+ private sealed class EmptyServiceProvider : IServiceProvider
+ {
+ public static EmptyServiceProvider Instance { get; } = new EmptyServiceProvider();
+ public object? GetService(Type serviceType) => null;
}
}
diff --git a/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs b/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs
index 69c7da5e8e..29598aea34 100644
--- a/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/EndpointRoutingApplicationBuilderExtensions.cs
@@ -15,6 +15,7 @@ public static class EndpointRoutingApplicationBuilderExtensions
{
private const string EndpointRouteBuilder = "__EndpointRouteBuilder";
private const string GlobalEndpointRouteBuilderKey = "__GlobalEndpointRouteBuilder";
+ private const string UseRoutingKey = "__UseRouting";
/// <summary>
/// Adds a <see cref="EndpointRoutingMiddleware"/> middleware to the specified <see cref="IApplicationBuilder"/>.
@@ -37,10 +38,7 @@ public static class EndpointRoutingApplicationBuilderExtensions
/// </remarks>
public static IApplicationBuilder UseRouting(this IApplicationBuilder builder)
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
+ ArgumentNullException.ThrowIfNull(builder);
VerifyRoutingServicesAreRegistered(builder);
@@ -57,6 +55,10 @@ public static class EndpointRoutingApplicationBuilderExtensions
builder.Properties[EndpointRouteBuilder] = endpointRouteBuilder;
}
+ // Add UseRouting function to properties so that middleware that can't reference UseRouting directly can call UseRouting via this property
+ // This is part of the global endpoint route builder concept
+ builder.Properties.TryAdd(UseRoutingKey, (object)UseRouting);
+
return builder.UseMiddleware<EndpointRoutingMiddleware>(endpointRouteBuilder);
}
@@ -85,15 +87,8 @@ public static class EndpointRoutingApplicationBuilderExtensions
/// </remarks>
public static IApplicationBuilder UseEndpoints(this IApplicationBuilder builder, Action<IEndpointRouteBuilder> configure)
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
-
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(configure);
VerifyRoutingServicesAreRegistered(builder);
diff --git a/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs b/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs
index 25082d9de5..173cfb59f4 100644
--- a/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/FallbackEndpointRouteBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
@@ -35,17 +36,11 @@ public static class FallbackEndpointRouteBuilderExtensions
/// <c>{*path:nonfile}</c>. The order of the registered endpoint will be <c>int.MaxValue</c>.
/// </para>
/// </remarks>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
public static IEndpointConventionBuilder MapFallback(this IEndpointRouteBuilder endpoints, RequestDelegate requestDelegate)
{
- if (endpoints == null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
-
- if (requestDelegate == null)
- {
- throw new ArgumentNullException(nameof(requestDelegate));
- }
+ ArgumentNullException.ThrowIfNull(endpoints);
+ ArgumentNullException.ThrowIfNull(requestDelegate);
return endpoints.MapFallback("{*path:nonfile}", requestDelegate);
}
@@ -71,25 +66,15 @@ public static class FallbackEndpointRouteBuilderExtensions
/// to exclude requests for static files.
/// </para>
/// </remarks>
+ [RequiresUnreferencedCode(EndpointRouteBuilderExtensions.MapEndpointTrimmerWarning)]
public static IEndpointConventionBuilder MapFallback(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
RequestDelegate requestDelegate)
{
- if (endpoints == null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
-
- if (pattern == null)
- {
- throw new ArgumentNullException(nameof(pattern));
- }
-
- if (requestDelegate == null)
- {
- throw new ArgumentNullException(nameof(requestDelegate));
- }
+ ArgumentNullException.ThrowIfNull(endpoints);
+ ArgumentNullException.ThrowIfNull(pattern);
+ ArgumentNullException.ThrowIfNull(requestDelegate);
var conventionBuilder = endpoints.Map(pattern, requestDelegate);
conventionBuilder.WithDisplayName("Fallback " + pattern);
diff --git a/src/Http/Routing/src/Builder/OpenApiRouteHandlerBuilderExtensions.cs b/src/Http/Routing/src/Builder/OpenApiRouteHandlerBuilderExtensions.cs
index 2456ed622c..2615e70e1a 100644
--- a/src/Http/Routing/src/Builder/OpenApiRouteHandlerBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/OpenApiRouteHandlerBuilderExtensions.cs
@@ -20,14 +20,19 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// Adds the <see cref="IExcludeFromDescriptionMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
/// produced by <paramref name="builder"/>.
/// </summary>
+ /// <param name="builder">The <see cref="IEndpointConventionBuilder"/>.</param>
+ /// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
+ public static TBuilder ExcludeFromDescription<TBuilder>(this TBuilder builder) where TBuilder : IEndpointConventionBuilder
+ => builder.WithMetadata(_excludeFromDescriptionMetadataAttribute);
+
+ /// <summary>
+ /// Adds the <see cref="IExcludeFromDescriptionMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
+ /// produced by <paramref name="builder"/>.
+ /// </summary>
/// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
public static RouteHandlerBuilder ExcludeFromDescription(this RouteHandlerBuilder builder)
- {
- builder.WithMetadata(_excludeFromDescriptionMetadataAttribute);
-
- return builder;
- }
+ => ExcludeFromDescription<RouteHandlerBuilder>(builder);
/// <summary>
/// Adds an <see cref="IProducesResponseTypeMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
@@ -40,9 +45,10 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="additionalContentTypes">Additional response content types the endpoint produces for the supplied status code.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
#pragma warning disable RS0026
- public static RouteHandlerBuilder Produces<TResponse>(this RouteHandlerBuilder builder,
+ public static RouteHandlerBuilder Produces<TResponse>(
#pragma warning restore RS0026
- int statusCode = StatusCodes.Status200OK,
+ this RouteHandlerBuilder builder,
+ int statusCode = StatusCodes.Status200OK,
string? contentType = null,
params string[] additionalContentTypes)
{
@@ -60,9 +66,10 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="additionalContentTypes">Additional response content types the endpoint produces for the supplied status code.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
#pragma warning disable RS0026
- public static RouteHandlerBuilder Produces(this RouteHandlerBuilder builder,
+ public static RouteHandlerBuilder Produces(
#pragma warning restore RS0026
- int statusCode,
+ this RouteHandlerBuilder builder,
+ int statusCode,
Type? responseType = null,
string? contentType = null,
params string[] additionalContentTypes)
@@ -74,13 +81,10 @@ public static class OpenApiRouteHandlerBuilderExtensions
if (contentType is null)
{
- builder.WithMetadata(new ProducesResponseTypeMetadata(responseType ?? typeof(void), statusCode));
- return builder;
+ return builder.WithMetadata(new ProducesResponseTypeMetadata(responseType ?? typeof(void), statusCode));
}
- builder.WithMetadata(new ProducesResponseTypeMetadata(responseType ?? typeof(void), statusCode, contentType, additionalContentTypes));
-
- return builder;
+ return builder.WithMetadata(new ProducesResponseTypeMetadata(responseType ?? typeof(void), statusCode, contentType, additionalContentTypes));
}
/// <summary>
@@ -91,16 +95,14 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="statusCode">The response status code.</param>
/// <param name="contentType">The response content type. Defaults to "application/problem+json".</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder ProducesProblem(this RouteHandlerBuilder builder,
- int statusCode,
- string? contentType = null)
+ public static RouteHandlerBuilder ProducesProblem(this RouteHandlerBuilder builder, int statusCode, string? contentType = null)
{
if (string.IsNullOrEmpty(contentType))
{
contentType = "application/problem+json";
}
- return Produces<ProblemDetails>(builder, statusCode, contentType);
+ return Produces(builder, statusCode, typeof(ProblemDetails), contentType);
}
/// <summary>
@@ -111,7 +113,8 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="statusCode">The response status code. Defaults to <see cref="StatusCodes.Status400BadRequest"/>.</param>
/// <param name="contentType">The response content type. Defaults to "application/problem+json".</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder ProducesValidationProblem(this RouteHandlerBuilder builder,
+ public static RouteHandlerBuilder ProducesValidationProblem(
+ this RouteHandlerBuilder builder,
int statusCode = StatusCodes.Status400BadRequest,
string? contentType = null)
{
@@ -120,7 +123,7 @@ public static class OpenApiRouteHandlerBuilderExtensions
contentType = "application/problem+json";
}
- return Produces<HttpValidationProblemDetails>(builder, statusCode, contentType);
+ return Produces(builder, statusCode, typeof(HttpValidationProblemDetails), contentType);
}
/// <summary>
@@ -132,14 +135,26 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// into related groups. These tags are typically included in the generated specification
/// and are typically used to group operations by tags in the UI.
/// </remarks>
+ /// <param name="builder">The <see cref="IEndpointConventionBuilder"/>.</param>
+ /// <param name="tags">A collection of tags to be associated with the endpoint.</param>
+ /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
+ public static TBuilder WithTags<TBuilder>(this TBuilder builder, params string[] tags) where TBuilder : IEndpointConventionBuilder
+ => builder.WithMetadata(new TagsAttribute(tags));
+
+ /// <summary>
+ /// Adds the <see cref="ITagsMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
+ /// produced by <paramref name="builder"/>.
+ /// </summary>
+ /// <remarks>
+ /// The OpenAPI specification supports a tags classification to categorize operations
+ /// into related groups. These tags are typically included in the generated specification
+ /// and are typically used to group operations by tags in the UI.
+ /// </remarks>
/// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
/// <param name="tags">A collection of tags to be associated with the endpoint.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
public static RouteHandlerBuilder WithTags(this RouteHandlerBuilder builder, params string[] tags)
- {
- builder.WithMetadata(new TagsAttribute(tags));
- return builder;
- }
+ => WithTags<RouteHandlerBuilder>(builder, tags);
/// <summary>
/// Adds <see cref="IAcceptsMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
@@ -150,12 +165,12 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="contentType">The request content type that the endpoint accepts.</param>
/// <param name="additionalContentTypes">The list of additional request content types that the endpoint accepts.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder Accepts<TRequest>(this RouteHandlerBuilder builder,
- string contentType, params string[] additionalContentTypes) where TRequest : notnull
+ public static RouteHandlerBuilder Accepts<TRequest>(
+ this RouteHandlerBuilder builder,
+ string contentType,
+ params string[] additionalContentTypes) where TRequest : notnull
{
- Accepts(builder, typeof(TRequest), contentType, additionalContentTypes);
-
- return builder;
+ return Accepts(builder, typeof(TRequest), contentType, additionalContentTypes);
}
/// <summary>
@@ -168,12 +183,13 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="contentType">The request content type that the endpoint accepts.</param>
/// <param name="additionalContentTypes">The list of additional request content types that the endpoint accepts.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder Accepts<TRequest>(this RouteHandlerBuilder builder,
- bool isOptional, string contentType, params string[] additionalContentTypes) where TRequest : notnull
+ public static RouteHandlerBuilder Accepts<TRequest>(
+ this RouteHandlerBuilder builder,
+ bool isOptional,
+ string contentType,
+ params string[] additionalContentTypes) where TRequest : notnull
{
- Accepts(builder, typeof(TRequest), isOptional, contentType, additionalContentTypes);
-
- return builder;
+ return Accepts(builder, typeof(TRequest), isOptional, contentType, additionalContentTypes);
}
/// <summary>
@@ -185,11 +201,13 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="contentType">The request content type that the endpoint accepts.</param>
/// <param name="additionalContentTypes">The list of additional request content types that the endpoint accepts.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder Accepts(this RouteHandlerBuilder builder,
- Type requestType, string contentType, params string[] additionalContentTypes)
+ public static RouteHandlerBuilder Accepts(
+ this RouteHandlerBuilder builder,
+ Type requestType,
+ string contentType,
+ params string[] additionalContentTypes)
{
- builder.WithMetadata(new AcceptsMetadata(requestType, false, GetAllContentTypes(contentType, additionalContentTypes)));
- return builder;
+ return Accepts(builder, requestType, isOptional: false, contentType, additionalContentTypes);
}
/// <summary>
@@ -202,38 +220,36 @@ public static class OpenApiRouteHandlerBuilderExtensions
/// <param name="contentType">The request content type that the endpoint accepts.</param>
/// <param name="additionalContentTypes">The list of additional request content types that the endpoint accepts.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder Accepts(this RouteHandlerBuilder builder,
- Type requestType, bool isOptional, string contentType, params string[] additionalContentTypes)
+ public static RouteHandlerBuilder Accepts(
+ this RouteHandlerBuilder builder,
+ Type requestType,
+ bool isOptional,
+ string contentType,
+ params string[] additionalContentTypes)
{
- builder.WithMetadata(new AcceptsMetadata(requestType, isOptional, GetAllContentTypes(contentType, additionalContentTypes)));
- return builder;
+ var contentTypes = GetAllContentTypes(contentType, additionalContentTypes);
+ return builder.WithMetadata(new AcceptsMetadata(requestType, isOptional, contentTypes));
}
/// <summary>
/// Adds <see cref="IEndpointDescriptionMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
/// produced by <paramref name="builder"/>.
/// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <param name="builder">The <see cref="IEndpointConventionBuilder"/>.</param>
/// <param name="description">A string representing a detailed description of the endpoint.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder WithDescription(this RouteHandlerBuilder builder, string description)
- {
- builder.WithMetadata(new EndpointDescriptionAttribute(description));
- return builder;
- }
+ public static TBuilder WithDescription<TBuilder>(this TBuilder builder, string description) where TBuilder : IEndpointConventionBuilder
+ => builder.WithMetadata(new EndpointDescriptionAttribute(description));
/// <summary>
/// Adds <see cref="IEndpointSummaryMetadata"/> to <see cref="EndpointBuilder.Metadata"/> for all endpoints
/// produced by <paramref name="builder"/>.
/// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
+ /// <param name="builder">The <see cref="IEndpointConventionBuilder"/>.</param>
/// <param name="summary">A string representing a brief description of the endpoint.</param>
/// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder WithSummary(this RouteHandlerBuilder builder, string summary)
- {
- builder.WithMetadata(new EndpointSummaryAttribute(summary));
- return builder;
- }
+ public static TBuilder WithSummary<TBuilder>(this TBuilder builder, string summary) where TBuilder : IEndpointConventionBuilder
+ => builder.WithMetadata(new EndpointSummaryAttribute(summary));
private static string[] GetAllContentTypes(string contentType, string[] additionalContentTypes)
{
diff --git a/src/Http/Routing/src/Builder/RouteHandlerBuilder.cs b/src/Http/Routing/src/Builder/RouteHandlerBuilder.cs
index 735178ff42..051972f44d 100644
--- a/src/Http/Routing/src/Builder/RouteHandlerBuilder.cs
+++ b/src/Http/Routing/src/Builder/RouteHandlerBuilder.cs
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Builder;
@@ -11,18 +11,19 @@ namespace Microsoft.AspNetCore.Builder;
public sealed class RouteHandlerBuilder : IEndpointConventionBuilder
{
private readonly IEnumerable<IEndpointConventionBuilder>? _endpointConventionBuilders;
- private readonly IEndpointConventionBuilder? _endpointConventionBuilder;
-
- internal List<Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate>> RouteHandlerFilterFactories { get; } = new();
+ private readonly ICollection<Action<EndpointBuilder>>? _conventions;
+ private readonly ICollection<Action<EndpointBuilder>>? _finallyConventions;
/// <summary>
- /// Instantiates a new <see cref="RouteHandlerBuilder" /> given a single
- /// <see cref="IEndpointConventionBuilder" />.
+ /// Instantiates a new <see cref="RouteHandlerBuilder" /> given a ThrowOnAddAfterEndpointBuiltConventionCollection from
+ /// <see cref="RouteEndpointDataSource.AddRouteHandler(Routing.Patterns.RoutePattern, Delegate, IEnumerable{string}?, bool)"/>.
/// </summary>
- /// <param name="endpointConventionBuilder">The <see cref="IEndpointConventionBuilder" /> to instantiate with.</param>
- internal RouteHandlerBuilder(IEndpointConventionBuilder endpointConventionBuilder)
+ /// <param name="conventions">The convention list returned from <see cref="RouteEndpointDataSource"/>.</param>
+ /// <param name="finallyConventions">The final convention list returned from <see cref="RouteEndpointDataSource"/>.</param>
+ internal RouteHandlerBuilder(ICollection<Action<EndpointBuilder>> conventions, ICollection<Action<EndpointBuilder>> finallyConventions)
{
- _endpointConventionBuilder = endpointConventionBuilder;
+ _conventions = conventions;
+ _finallyConventions = finallyConventions;
}
/// <summary>
@@ -41,9 +42,9 @@ public sealed class RouteHandlerBuilder : IEndpointConventionBuilder
/// <param name="convention">The convention to add to the builder.</param>
public void Add(Action<EndpointBuilder> convention)
{
- if (_endpointConventionBuilder != null)
+ if (_conventions is not null)
{
- _endpointConventionBuilder.Add(convention);
+ _conventions.Add(convention);
}
else
{
@@ -53,4 +54,20 @@ public sealed class RouteHandlerBuilder : IEndpointConventionBuilder
}
}
}
+
+ /// <inheritdoc />
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ if (_finallyConventions is not null)
+ {
+ _finallyConventions.Add(finalConvention);
+ }
+ else
+ {
+ foreach (var endpointConventionBuilder in _endpointConventionBuilders!)
+ {
+ endpointConventionBuilder.Finally(finalConvention);
+ }
+ }
+ }
}
diff --git a/src/Http/Routing/src/Builder/RouteHandlerFilterExtensions.cs b/src/Http/Routing/src/Builder/RouteHandlerFilterExtensions.cs
deleted file mode 100644
index f0032cc2bf..0000000000
--- a/src/Http/Routing/src/Builder/RouteHandlerFilterExtensions.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics.CodeAnalysis;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.Extensions.DependencyInjection;
-
-namespace Microsoft.AspNetCore.Http;
-
-/// <summary>
-/// Extension methods for adding <see cref="IRouteHandlerFilter"/> to a route handler.
-/// </summary>
-public static class RouteHandlerFilterExtensions
-{
- /// <summary>
- /// Registers a filter onto the route handler.
- /// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
- /// <param name="filter">The <see cref="IRouteHandlerFilter"/> to register.</param>
- /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
- public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, IRouteHandlerFilter filter)
- {
- builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) => (context) => filter.InvokeAsync(context, next));
- return builder;
- }
-
- /// <summary>
- /// Registers a filter of type <typeparamref name="TFilterType"/> onto the route handler.
- /// </summary>
- /// <typeparam name="TFilterType">The type of the <see cref="IRouteHandlerFilter"/> to register.</typeparam>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
- /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
- public static RouteHandlerBuilder AddFilter<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFilterType>(this RouteHandlerBuilder builder) where TFilterType : IRouteHandlerFilter
- {
- // We call `CreateFactory` twice here since the `CreateFactory` API does not support optional arguments.
- // See https://github.com/dotnet/runtime/issues/67309 for more info.
- ObjectFactory filterFactory;
- try
- {
- filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), new[] { typeof(RouteHandlerContext) });
- }
- catch (InvalidOperationException)
- {
- filterFactory = ActivatorUtilities.CreateFactory(typeof(TFilterType), Type.EmptyTypes);
- }
-
- builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) =>
- {
- var invokeArguments = new[] { routeHandlerContext };
- return (context) =>
- {
- var filter = (IRouteHandlerFilter)filterFactory.Invoke(context.HttpContext.RequestServices, invokeArguments);
- return filter.InvokeAsync(context, next);
- };
- });
- return builder;
- }
-
- /// <summary>
- /// Registers a filter given a delegate onto the route handler.
- /// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
- /// <param name="routeHandlerFilter">A <see cref="Delegate"/> representing the core logic of the filter.</param>
- /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
- public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, Func<RouteHandlerInvocationContext, RouteHandlerFilterDelegate, ValueTask<object?>> routeHandlerFilter)
- {
- builder.RouteHandlerFilterFactories.Add((routeHandlerContext, next) => (context) => routeHandlerFilter(context, next));
- return builder;
- }
-
- /// <summary>
- /// Register a filter given a delegate representing the filter factory.
- /// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
- /// <param name="filterFactory">A <see cref="Delegate"/> representing the logic for constructing the filter.</param>
- /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the route handler.</returns>
- public static RouteHandlerBuilder AddFilter(this RouteHandlerBuilder builder, Func<RouteHandlerContext, RouteHandlerFilterDelegate, RouteHandlerFilterDelegate> filterFactory)
- {
- builder.RouteHandlerFilterFactories.Add(filterFactory);
- return builder;
- }
-}
diff --git a/src/Http/Routing/src/Builder/RoutingBuilderExtensions.cs b/src/Http/Routing/src/Builder/RoutingBuilderExtensions.cs
index 3dcbef76c9..6dd8316c0f 100644
--- a/src/Http/Routing/src/Builder/RoutingBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/RoutingBuilderExtensions.cs
@@ -19,15 +19,8 @@ public static class RoutingBuilderExtensions
/// <returns>A reference to this instance after the operation has completed.</returns>
public static IApplicationBuilder UseRouter(this IApplicationBuilder builder, IRouter router)
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
-
- if (router == null)
- {
- throw new ArgumentNullException(nameof(router));
- }
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(router);
if (builder.ApplicationServices.GetService(typeof(RoutingMarkerService)) == null)
{
@@ -49,15 +42,8 @@ public static class RoutingBuilderExtensions
/// <returns>A reference to this instance after the operation has completed.</returns>
public static IApplicationBuilder UseRouter(this IApplicationBuilder builder, Action<IRouteBuilder> action)
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
-
- if (action == null)
- {
- throw new ArgumentNullException(nameof(action));
- }
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(action);
if (builder.ApplicationServices.GetService(typeof(RoutingMarkerService)) == null)
{
diff --git a/src/Http/Routing/src/Builder/RoutingEndpointConventionBuilderExtensions.cs b/src/Http/Routing/src/Builder/RoutingEndpointConventionBuilderExtensions.cs
index e2b64bab03..f70716135b 100644
--- a/src/Http/Routing/src/Builder/RoutingEndpointConventionBuilderExtensions.cs
+++ b/src/Http/Routing/src/Builder/RoutingEndpointConventionBuilderExtensions.cs
@@ -22,15 +22,8 @@ public static class RoutingEndpointConventionBuilderExtensions
/// <returns>A reference to this instance after the operation has completed.</returns>
public static TBuilder RequireHost<TBuilder>(this TBuilder builder, params string[] hosts) where TBuilder : IEndpointConventionBuilder
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
-
- if (hosts == null)
- {
- throw new ArgumentNullException(nameof(hosts));
- }
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(hosts);
builder.Add(endpointBuilder =>
{
@@ -48,10 +41,7 @@ public static class RoutingEndpointConventionBuilderExtensions
/// <returns>The <see cref="IEndpointConventionBuilder"/>.</returns>
public static TBuilder WithDisplayName<TBuilder>(this TBuilder builder, string displayName) where TBuilder : IEndpointConventionBuilder
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
+ ArgumentNullException.ThrowIfNull(builder);
builder.Add(b =>
{
@@ -70,15 +60,8 @@ public static class RoutingEndpointConventionBuilderExtensions
/// <returns>The <see cref="IEndpointConventionBuilder"/>.</returns>
public static TBuilder WithDisplayName<TBuilder>(this TBuilder builder, Func<EndpointBuilder, string> func) where TBuilder : IEndpointConventionBuilder
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
-
- if (func == null)
- {
- throw new ArgumentNullException(nameof(func));
- }
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(func);
builder.Add(b =>
{
@@ -97,15 +80,8 @@ public static class RoutingEndpointConventionBuilderExtensions
/// <returns>The <see cref="IEndpointConventionBuilder"/>.</returns>
public static TBuilder WithMetadata<TBuilder>(this TBuilder builder, params object[] items) where TBuilder : IEndpointConventionBuilder
{
- if (builder == null)
- {
- throw new ArgumentNullException(nameof(builder));
- }
-
- if (items == null)
- {
- throw new ArgumentNullException(nameof(items));
- }
+ ArgumentNullException.ThrowIfNull(builder);
+ ArgumentNullException.ThrowIfNull(items);
builder.Add(b =>
{
@@ -119,7 +95,7 @@ public static class RoutingEndpointConventionBuilderExtensions
}
/// <summary>
- /// Sets the <see cref="EndpointNameAttribute"/> for all endpoints produced
+ /// Adds the <see cref="IEndpointNameMetadata"/> to the Metadata collection for all endpoints produced
/// on the target <see cref="IEndpointConventionBuilder"/> given the <paramref name="endpointName" />.
/// The <see cref="IEndpointNameMetadata" /> on the endpoint is used for link generation and
/// is treated as the operation ID in the given endpoint's OpenAPI specification.
diff --git a/src/Http/Routing/src/CompositeEndpointDataSource.cs b/src/Http/Routing/src/CompositeEndpointDataSource.cs
index 96a4121f15..bb4250d26b 100644
--- a/src/Http/Routing/src/CompositeEndpointDataSource.cs
+++ b/src/Http/Routing/src/CompositeEndpointDataSource.cs
@@ -5,8 +5,6 @@ using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
-using System.Linq;
-using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
@@ -16,24 +14,20 @@ namespace Microsoft.AspNetCore.Routing;
/// Represents an <see cref="EndpointDataSource"/> whose values come from a collection of <see cref="EndpointDataSource"/> instances.
/// </summary>
[DebuggerDisplay("{DebuggerDisplayString,nq}")]
-public sealed class CompositeEndpointDataSource : EndpointDataSource
+public sealed class CompositeEndpointDataSource : EndpointDataSource, IDisposable
{
- private readonly object _lock;
- private readonly ICollection<EndpointDataSource> _dataSources = default!;
- private IReadOnlyList<Endpoint> _endpoints = default!;
- private IChangeToken _consumerChangeToken;
- private CancellationTokenSource _cts;
+ private readonly object _lock = new();
+ private readonly ICollection<EndpointDataSource> _dataSources;
- private CompositeEndpointDataSource()
- {
- CreateChangeToken();
- _lock = new object();
- }
+ private List<Endpoint>? _endpoints;
+ private IChangeToken? _consumerChangeToken;
+ private CancellationTokenSource? _cts;
+ private List<IDisposable>? _changeTokenRegistrations;
+ private bool _disposed;
- internal CompositeEndpointDataSource(ObservableCollection<EndpointDataSource> dataSources) : this()
+ internal CompositeEndpointDataSource(ObservableCollection<EndpointDataSource> dataSources)
{
dataSources.CollectionChanged += OnDataSourcesChanged;
-
_dataSources = dataSources;
}
@@ -41,8 +35,8 @@ public sealed class CompositeEndpointDataSource : EndpointDataSource
/// Instantiates a <see cref="CompositeEndpointDataSource"/> object from <paramref name="endpointDataSources"/>.
/// </summary>
/// <param name="endpointDataSources">An collection of <see cref="EndpointDataSource" /> objects.</param>
- /// <returns>A <see cref="CompositeEndpointDataSource"/> </returns>
- public CompositeEndpointDataSource(IEnumerable<EndpointDataSource> endpointDataSources) : this()
+ /// <returns>A <see cref="CompositeEndpointDataSource"/>.</returns>
+ public CompositeEndpointDataSource(IEnumerable<EndpointDataSource> endpointDataSources)
{
_dataSources = new List<EndpointDataSource>();
@@ -52,17 +46,7 @@ public sealed class CompositeEndpointDataSource : EndpointDataSource
}
}
- private void OnDataSourcesChanged(object? sender, NotifyCollectionChangedEventArgs e)
- {
- lock (_lock)
- {
- // Only trigger changes if composite data source has already initialized endpoints
- if (_endpoints != null)
- {
- HandleChange();
- }
- }
- }
+ private void OnDataSourcesChanged(object? sender, NotifyCollectionChangedEventArgs e) => HandleChange(collectionChanged: true);
/// <summary>
/// Returns the collection of <see cref="EndpointDataSource"/> instances associated with the object.
@@ -70,13 +54,12 @@ public sealed class CompositeEndpointDataSource : EndpointDataSource
public IEnumerable<EndpointDataSource> DataSources => _dataSources;
/// <summary>
- /// Gets a <see cref="IChangeToken"/> used to signal invalidation of cached <see cref="Endpoint"/>
- /// instances.
+ /// Gets a <see cref="IChangeToken"/> used to signal invalidation of cached <see cref="Endpoint"/> instances.
/// </summary>
/// <returns>The <see cref="IChangeToken"/>.</returns>
public override IChangeToken GetChangeToken()
{
- EnsureInitialized();
+ EnsureChangeTokenInitialized();
return _consumerChangeToken;
}
@@ -87,137 +70,204 @@ public sealed class CompositeEndpointDataSource : EndpointDataSource
{
get
{
- EnsureInitialized();
+ EnsureEndpointsInitialized();
return _endpoints;
}
}
- // Defer initialization to avoid doing lots of reflection on startup.
- private void EnsureInitialized()
+ /// <inheritdoc/>
+ public override IReadOnlyList<Endpoint> GetGroupedEndpoints(RouteGroupContext context)
{
- if (_endpoints == null)
+ if (_dataSources.Count is 0)
{
- Initialize();
+ return Array.Empty<Endpoint>();
}
+
+ // We could try to optimize the single data source case by returning its result directly like GroupDataSource does,
+ // but the CompositeEndpointDataSourceTest class was picky about the Endpoints property creating a shallow copy,
+ // so we'll shallow copy here for consistency.
+ var groupedEndpoints = new List<Endpoint>();
+
+ foreach (var dataSource in _dataSources)
+ {
+ groupedEndpoints.AddRange(dataSource.GetGroupedEndpoints(context));
+ }
+
+ // There's no need to cache these the way we do with _endpoints. This is only ever used to get intermediate results.
+ // Anything using the DataSourceDependentCache like the DfaMatcher will resolve the cached Endpoints property.
+ return groupedEndpoints;
}
- // Note: we can't use DataSourceDependentCache here because we also need to handle a list of change
- // tokens, which is a complication most of our code doesn't have.
- private void Initialize()
+ /// <inheritdoc/>
+ public void Dispose()
{
+ // CompositeDataSource is registered as a singleton by default by AddRouting().
+ // UseEndpoints() adds all root data sources to this singleton.
+ List<IDisposable>? disposables = null;
+
lock (_lock)
{
- if (_endpoints == null)
+ _disposed = true;
+
+ if (_dataSources is ObservableCollection<EndpointDataSource> observableDataSources)
{
- _endpoints = _dataSources.SelectMany(d => d.Endpoints).ToArray();
+ observableDataSources.CollectionChanged -= OnDataSourcesChanged;
+ }
- foreach (var dataSource in _dataSources)
+ foreach (var dataSource in _dataSources)
+ {
+ if (dataSource is IDisposable disposableDataSource)
{
- ChangeToken.OnChange(
- dataSource.GetChangeToken,
- HandleChange);
+ disposables ??= new List<IDisposable>();
+ disposables.Add(disposableDataSource);
}
}
+
+ if (_changeTokenRegistrations is { Count: > 0 })
+ {
+ disposables ??= new List<IDisposable>();
+ disposables.AddRange(_changeTokenRegistrations);
+ }
+ }
+
+ // Dispose everything outside of the lock in case a registration is blocking on HandleChange completing
+ // on another thread or something.
+ if (disposables is not null)
+ {
+ foreach (var disposable in disposables)
+ {
+ disposable.Dispose();
+ }
}
}
- private void HandleChange()
+ // Defer initialization to avoid doing lots of reflection on startup.
+ [MemberNotNull(nameof(_endpoints))]
+ private void EnsureEndpointsInitialized()
{
- lock (_lock)
+ if (_endpoints is not null)
{
- // Refresh the endpoints from datasource so that callbacks can get the latest endpoints
- _endpoints = _dataSources.SelectMany(d => d.Endpoints).ToArray();
+ return;
+ }
- // Prevent consumers from re-registering callback to inflight events as that can
- // cause a stackoverflow
- // Example:
- // 1. B registers A
- // 2. A fires event causing B's callback to get called
- // 3. B executes some code in its callback, but needs to re-register callback
- // in the same callback
- var oldTokenSource = _cts;
- var oldToken = _consumerChangeToken;
+ lock (_lock)
+ {
+ if (_endpoints is not null)
+ {
+ return;
+ }
- CreateChangeToken();
+ // Now that we're caching the _enpoints, we're responsible for keeping them up-to-date even if the caller
+ // hasn't started listening for changes themselves yet.
+ EnsureChangeTokenInitialized();
- // Raise consumer callbacks. Any new callback registration would happen on the new token
- // created in earlier step.
- oldTokenSource.Cancel();
+ // Note: we can't use DataSourceDependentCache here because we also need to handle a list of change
+ // tokens, which is a complication most of our code doesn't have.
+ CreateEndpointsUnsynchronized();
}
}
- [MemberNotNull(nameof(_cts), nameof(_consumerChangeToken))]
- private void CreateChangeToken()
+ [MemberNotNull(nameof(_consumerChangeToken))]
+ private void EnsureChangeTokenInitialized()
{
- _cts = new CancellationTokenSource();
- _consumerChangeToken = new CancellationChangeToken(_cts.Token);
+ if (_consumerChangeToken is not null)
+ {
+ return;
+ }
+
+ lock (_lock)
+ {
+ if (_consumerChangeToken is not null)
+ {
+ return;
+ }
+
+ // This is our first time initializing the change token, so the collection has "changed" from nothing.
+ CreateChangeTokenUnsynchronized(collectionChanged: true);
+ }
}
- private string DebuggerDisplayString
+ private void HandleChange(bool collectionChanged)
{
- get
+ CancellationTokenSource? oldTokenSource = null;
+ List<IDisposable>? oldChangeTokenRegistrations = null;
+
+ lock (_lock)
{
- // Try using private variable '_endpoints' to avoid initialization
- if (_endpoints == null)
+ if (_disposed)
{
- return "No endpoints";
+ return;
}
- var sb = new StringBuilder();
- foreach (var endpoint in _endpoints)
+ // Prevent consumers from re-registering callback to in-flight events as that can
+ // cause a stack overflow.
+ // Example:
+ // 1. B registers A.
+ // 2. A fires event causing B's callback to get called.
+ // 3. B executes some code in its callback, but needs to re-register callback
+ // in the same callback.
+ oldTokenSource = _cts;
+ oldChangeTokenRegistrations = _changeTokenRegistrations;
+
+ // Don't create a new change token if no one is listening.
+ if (oldTokenSource is not null)
{
- if (endpoint is RouteEndpoint routeEndpoint)
- {
- var template = routeEndpoint.RoutePattern.RawText;
- template = string.IsNullOrEmpty(template) ? "\"\"" : template;
- sb.Append(template);
- sb.Append(", Defaults: new { ");
- sb.AppendJoin(", ", FormatValues(routeEndpoint.RoutePattern.Defaults));
- sb.Append(" }");
- var routeNameMetadata = routeEndpoint.Metadata.GetMetadata<IRouteNameMetadata>();
- sb.Append(", Route Name: ");
- sb.Append(routeNameMetadata?.RouteName);
- var routeValues = routeEndpoint.RoutePattern.RequiredValues;
- if (routeValues.Count > 0)
- {
- sb.Append(", Required Values: new { ");
- sb.AppendJoin(", ", FormatValues(routeValues));
- sb.Append(" }");
- }
- sb.Append(", Order: ");
- sb.Append(routeEndpoint.Order);
-
- var httpMethodMetadata = routeEndpoint.Metadata.GetMetadata<IHttpMethodMetadata>();
- if (httpMethodMetadata != null)
- {
- sb.Append(", Http Methods: ");
- sb.AppendJoin(", ", httpMethodMetadata.HttpMethods);
- }
- sb.Append(", Display Name: ");
- sb.Append(routeEndpoint.DisplayName);
- sb.AppendLine();
- }
- else
- {
- sb.Append("Non-RouteEndpoint. DisplayName:");
- sb.AppendLine(endpoint.DisplayName);
- }
+ // We have to hook to any OnChange callbacks before caching endpoints,
+ // otherwise we might miss changes that occurred to one of the _dataSources after caching.
+ CreateChangeTokenUnsynchronized(collectionChanged);
+ }
+
+ // Don't update endpoints if no one has read them yet.
+ if (_endpoints is not null)
+ {
+ // Refresh the endpoints from data source so that callbacks can get the latest endpoints.
+ CreateEndpointsUnsynchronized();
}
- return sb.ToString();
+ }
+
+ // Disposing registrations can block on user defined code on running on other threads that could try to acquire the _lock.
+ if (collectionChanged && oldChangeTokenRegistrations is not null)
+ {
+ foreach (var registration in oldChangeTokenRegistrations)
+ {
+ registration.Dispose();
+ }
+ }
+
+ // Raise consumer callbacks. Any new callback registration would happen on the new token created in earlier step.
+ // Avoid raising callbacks inside a lock.
+ oldTokenSource?.Cancel();
+ }
+
+ [MemberNotNull(nameof(_consumerChangeToken))]
+ private void CreateChangeTokenUnsynchronized(bool collectionChanged)
+ {
+ _cts = new CancellationTokenSource();
+ _consumerChangeToken = new CancellationChangeToken(_cts.Token);
- static IEnumerable<string> FormatValues(IEnumerable<KeyValuePair<string, object?>> values)
+ if (collectionChanged)
+ {
+ _changeTokenRegistrations = new();
+ foreach (var dataSource in _dataSources)
{
- return values.Select(
- kvp =>
- {
- var value = "null";
- if (kvp.Value != null)
- {
- value = "\"" + kvp.Value.ToString() + "\"";
- }
- return kvp.Key + " = " + value;
- });
+ _changeTokenRegistrations.Add(ChangeToken.OnChange(
+ dataSource.GetChangeToken,
+ () => HandleChange(collectionChanged: false)));
}
}
}
+
+ [MemberNotNull(nameof(_endpoints))]
+ private void CreateEndpointsUnsynchronized()
+ {
+ _endpoints = new List<Endpoint>();
+
+ foreach (var dataSource in _dataSources)
+ {
+ _endpoints.AddRange(dataSource.Endpoints);
+ }
+ }
+
+ // Use private variable '_endpoints' to avoid initialization
+ private string DebuggerDisplayString => GetDebuggerDisplayStringForEndpoints(_endpoints);
}
diff --git a/src/Http/Routing/src/ConfigureRouteHandlerOptions.cs b/src/Http/Routing/src/ConfigureRouteHandlerOptions.cs
index 1341c9bb5f..5b38606d58 100644
--- a/src/Http/Routing/src/ConfigureRouteHandlerOptions.cs
+++ b/src/Http/Routing/src/ConfigureRouteHandlerOptions.cs
@@ -8,16 +8,16 @@ namespace Microsoft.AspNetCore.Routing;
internal sealed class ConfigureRouteHandlerOptions : IConfigureOptions<RouteHandlerOptions>
{
- private readonly IHostEnvironment _environment;
+ private readonly IHostEnvironment? _environment;
- public ConfigureRouteHandlerOptions(IHostEnvironment environment)
+ public ConfigureRouteHandlerOptions(IHostEnvironment? environment = null)
{
_environment = environment;
}
public void Configure(RouteHandlerOptions options)
{
- if (_environment.IsDevelopment())
+ if (_environment?.IsDevelopment() ?? false)
{
options.ThrowOnBadRequest = true;
}
diff --git a/src/Http/Routing/src/ConfigureRouteOptions.cs b/src/Http/Routing/src/ConfigureRouteOptions.cs
index 11bfa5d9c3..d426479171 100644
--- a/src/Http/Routing/src/ConfigureRouteOptions.cs
+++ b/src/Http/Routing/src/ConfigureRouteOptions.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Routing;
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.DependencyInjection;
-internal class ConfigureRouteOptions : IConfigureOptions<RouteOptions>
+internal sealed class ConfigureRouteOptions : IConfigureOptions<RouteOptions>
{
private readonly ICollection<EndpointDataSource> _dataSources;
diff --git a/src/Http/Routing/src/Constraints/NullRouteConstraint.cs b/src/Http/Routing/src/Constraints/NullRouteConstraint.cs
index 8e80ad4c4b..1b30e8f897 100644
--- a/src/Http/Routing/src/Constraints/NullRouteConstraint.cs
+++ b/src/Http/Routing/src/Constraints/NullRouteConstraint.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Routing.Constraints;
-internal class NullRouteConstraint : IRouteConstraint
+internal sealed class NullRouteConstraint : IRouteConstraint
{
public static readonly NullRouteConstraint Instance = new NullRouteConstraint();
diff --git a/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs b/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs
index eae3d5ff3d..0c4cbcb1f6 100644
--- a/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs
+++ b/src/Http/Routing/src/DecisionTree/DecisionCriterion.cs
@@ -5,7 +5,7 @@
namespace Microsoft.AspNetCore.Routing.DecisionTree;
-internal class DecisionCriterion<TItem>
+internal sealed class DecisionCriterion<TItem>
{
public string Key { get; set; }
diff --git a/src/Http/Routing/src/DecisionTree/DecisionCriterionValueEqualityComparer.cs b/src/Http/Routing/src/DecisionTree/DecisionCriterionValueEqualityComparer.cs
index cb2f5656b0..6e0ed03dc9 100644
--- a/src/Http/Routing/src/DecisionTree/DecisionCriterionValueEqualityComparer.cs
+++ b/src/Http/Routing/src/DecisionTree/DecisionCriterionValueEqualityComparer.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Routing.DecisionTree;
-internal class DecisionCriterionValueEqualityComparer : IEqualityComparer<DecisionCriterionValue>
+internal sealed class DecisionCriterionValueEqualityComparer : IEqualityComparer<DecisionCriterionValue>
{
public DecisionCriterionValueEqualityComparer(IEqualityComparer<object> innerComparer)
{
diff --git a/src/Http/Routing/src/DecisionTree/DecisionTreeBuilder.cs b/src/Http/Routing/src/DecisionTree/DecisionTreeBuilder.cs
index 08c81fe016..2c10846409 100644
--- a/src/Http/Routing/src/DecisionTree/DecisionTreeBuilder.cs
+++ b/src/Http/Routing/src/DecisionTree/DecisionTreeBuilder.cs
@@ -193,7 +193,7 @@ internal static class DecisionTreeBuilder<TItem>
};
}
- private class TreeBuilderContext
+ private sealed class TreeBuilderContext
{
public TreeBuilderContext()
{
@@ -213,7 +213,7 @@ internal static class DecisionTreeBuilder<TItem>
}
// Subclass just to give a logical name to a mess of generics
- private class Criterion : Dictionary<DecisionCriterionValue, List<ItemDescriptor<TItem>>>
+ private sealed class Criterion : Dictionary<DecisionCriterionValue, List<ItemDescriptor<TItem>>>
{
public Criterion(DecisionCriterionValueEqualityComparer comparer)
: base(comparer)
diff --git a/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs b/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs
index 15a09aa0a8..b6792343ac 100644
--- a/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs
+++ b/src/Http/Routing/src/DecisionTree/DecisionTreeNode.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Routing.DecisionTree;
// Data structure representing a node in a decision tree. These are created in DecisionTreeBuilder
// and walked to find a set of items matching some input criteria.
-internal class DecisionTreeNode<TItem>
+internal sealed class DecisionTreeNode<TItem>
{
// The list of matches for the current node. This represents a set of items that have had all
// of their criteria matched if control gets to this point in the tree.
diff --git a/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs b/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs
index 2837e3d77c..675ca3688b 100644
--- a/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs
+++ b/src/Http/Routing/src/DecisionTree/ItemDescriptor.cs
@@ -5,7 +5,7 @@
namespace Microsoft.AspNetCore.Routing.DecisionTree;
-internal class ItemDescriptor<TItem>
+internal sealed class ItemDescriptor<TItem>
{
public IDictionary<string, DecisionCriterionValue> Criteria { get; set; }
diff --git a/src/Http/Routing/src/DefaultEndpointConventionBuilder.cs b/src/Http/Routing/src/DefaultEndpointConventionBuilder.cs
deleted file mode 100644
index 78f24d6930..0000000000
--- a/src/Http/Routing/src/DefaultEndpointConventionBuilder.cs
+++ /dev/null
@@ -1,48 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-
-namespace Microsoft.AspNetCore.Routing;
-
-internal class DefaultEndpointConventionBuilder : IEndpointConventionBuilder
-{
- internal EndpointBuilder EndpointBuilder { get; }
-
- private List<Action<EndpointBuilder>>? _conventions;
-
- public DefaultEndpointConventionBuilder(EndpointBuilder endpointBuilder)
- {
- EndpointBuilder = endpointBuilder;
- _conventions = new();
- }
-
- public void Add(Action<EndpointBuilder> convention)
- {
- var conventions = _conventions;
-
- if (conventions is null)
- {
- throw new InvalidOperationException("Conventions cannot be added after building the endpoint");
- }
-
- conventions.Add(convention);
- }
-
- public Endpoint Build()
- {
- // Only apply the conventions once
- var conventions = Interlocked.Exchange(ref _conventions, null);
-
- if (conventions is not null)
- {
- foreach (var convention in conventions)
- {
- convention(EndpointBuilder);
- }
- }
-
- return EndpointBuilder.Build();
- }
-}
diff --git a/src/Http/Routing/src/DefaultEndpointDataSource.cs b/src/Http/Routing/src/DefaultEndpointDataSource.cs
index 1d5e09039d..940471d91f 100644
--- a/src/Http/Routing/src/DefaultEndpointDataSource.cs
+++ b/src/Http/Routing/src/DefaultEndpointDataSource.cs
@@ -1,6 +1,7 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;
@@ -10,6 +11,7 @@ namespace Microsoft.AspNetCore.Routing;
/// <summary>
/// Provides a collection of <see cref="Endpoint"/> instances.
/// </summary>
+[DebuggerDisplay("{DebuggerDisplayString,nq}")]
public sealed class DefaultEndpointDataSource : EndpointDataSource
{
private readonly IReadOnlyList<Endpoint> _endpoints;
@@ -53,4 +55,6 @@ public sealed class DefaultEndpointDataSource : EndpointDataSource
/// Returns a read-only collection of <see cref="Endpoint"/> instances.
/// </summary>
public override IReadOnlyList<Endpoint> Endpoints => _endpoints;
+
+ private string DebuggerDisplayString => GetDebuggerDisplayStringForEndpoints(_endpoints);
}
diff --git a/src/Http/Routing/src/DefaultEndpointRouteBuilder.cs b/src/Http/Routing/src/DefaultEndpointRouteBuilder.cs
index b020e91e07..da0ab8c21e 100644
--- a/src/Http/Routing/src/DefaultEndpointRouteBuilder.cs
+++ b/src/Http/Routing/src/DefaultEndpointRouteBuilder.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Builder;
namespace Microsoft.AspNetCore.Routing;
-internal class DefaultEndpointRouteBuilder : IEndpointRouteBuilder
+internal sealed class DefaultEndpointRouteBuilder : IEndpointRouteBuilder
{
public DefaultEndpointRouteBuilder(IApplicationBuilder applicationBuilder)
{
diff --git a/src/Http/Routing/src/DefaultParameterPolicyFactory.cs b/src/Http/Routing/src/DefaultParameterPolicyFactory.cs
index 965549816b..1b76e85c54 100644
--- a/src/Http/Routing/src/DefaultParameterPolicyFactory.cs
+++ b/src/Http/Routing/src/DefaultParameterPolicyFactory.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Routing;
-internal class DefaultParameterPolicyFactory : ParameterPolicyFactory
+internal sealed class DefaultParameterPolicyFactory : ParameterPolicyFactory
{
private readonly RouteOptions _options;
private readonly IServiceProvider _serviceProvider;
diff --git a/src/Http/Routing/src/EndpointDataSource.cs b/src/Http/Routing/src/EndpointDataSource.cs
index 71f0f4dd41..9d5e058654 100644
--- a/src/Http/Routing/src/EndpointDataSource.cs
+++ b/src/Http/Routing/src/EndpointDataSource.cs
@@ -1,7 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Text;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Routing;
@@ -22,4 +24,153 @@ public abstract class EndpointDataSource
/// Returns a read-only collection of <see cref="Endpoint"/> instances.
/// </summary>
public abstract IReadOnlyList<Endpoint> Endpoints { get; }
+
+ /// <summary>
+ /// Get the <see cref="Endpoint"/> instances for this <see cref="EndpointDataSource"/> given the specified <see cref="RouteGroupContext.Prefix"/> and <see cref="RouteGroupContext.Conventions"/>.
+ /// </summary>
+ /// <param name="context">Details about how the returned <see cref="Endpoint"/> instances should be grouped and a reference to application services.</param>
+ /// <returns>
+ /// Returns a read-only collection of <see cref="Endpoint"/> instances given the specified group <see cref="RouteGroupContext.Prefix"/> and <see cref="RouteGroupContext.Conventions"/>.
+ /// </returns>
+ public virtual IReadOnlyList<Endpoint> GetGroupedEndpoints(RouteGroupContext context)
+ {
+ // Only evaluate Endpoints once per call.
+ var endpoints = Endpoints;
+ var wrappedEndpoints = new RouteEndpoint[endpoints.Count];
+
+ for (int i = 0; i < endpoints.Count; i++)
+ {
+ var endpoint = endpoints[i];
+
+ // Endpoint does not provide a RoutePattern but RouteEndpoint does. So it's impossible to apply a prefix for custom Endpoints.
+ // Supporting arbitrary Endpoints just to add group metadata would require changing the Endpoint type breaking any real scenario.
+ if (endpoint is not RouteEndpoint routeEndpoint)
+ {
+ throw new NotSupportedException(Resources.FormatMapGroup_CustomEndpointUnsupported(endpoint.GetType()));
+ }
+
+ // Make the full route pattern visible to IEndpointConventionBuilder extension methods called on the group.
+ // This includes patterns from any parent groups.
+ var fullRoutePattern = RoutePatternFactory.Combine(context.Prefix, routeEndpoint.RoutePattern);
+
+ // RequestDelegate can never be null on a RouteEndpoint. The nullability carries over from Endpoint.
+ var routeEndpointBuilder = new RouteEndpointBuilder(routeEndpoint.RequestDelegate!, fullRoutePattern, routeEndpoint.Order)
+ {
+ DisplayName = routeEndpoint.DisplayName,
+ ApplicationServices = context.ApplicationServices,
+ };
+
+ // Apply group conventions to each endpoint in the group at a lower precedent than metadata already on the endpoint.
+ foreach (var convention in context.Conventions)
+ {
+ convention(routeEndpointBuilder);
+ }
+
+ // Any metadata already on the RouteEndpoint must have been applied directly to the endpoint or to a nested group.
+ // This makes the metadata more specific than what's being applied to this group. So add it after this group's conventions.
+ foreach (var metadata in routeEndpoint.Metadata)
+ {
+ routeEndpointBuilder.Metadata.Add(metadata);
+ }
+
+ foreach (var finallyConvention in context.FinallyConventions)
+ {
+ finallyConvention(routeEndpointBuilder);
+ }
+
+ // The RoutePattern, RequestDelegate, Order and DisplayName can all be overridden by non-group-aware conventions.
+ // Unlike with metadata, if a convention is applied to a group that changes any of these, I would expect these
+ // to be overridden as there's no reasonable way to merge these properties.
+ wrappedEndpoints[i] = (RouteEndpoint)routeEndpointBuilder.Build();
+ }
+
+ return wrappedEndpoints;
+ }
+
+ // We don't implement DebuggerDisplay directly on the EndpointDataSource base type because this could have side effects.
+ internal static string GetDebuggerDisplayStringForEndpoints(IReadOnlyList<Endpoint>? endpoints)
+ {
+ if (endpoints is null)
+ {
+ return "No endpoints";
+ }
+
+ var sb = new StringBuilder();
+
+ foreach (var endpoint in endpoints)
+ {
+ if (endpoint is RouteEndpoint routeEndpoint)
+ {
+ var template = routeEndpoint.RoutePattern.RawText;
+ template = string.IsNullOrEmpty(template) ? "\"\"" : template;
+ sb.Append(template);
+ sb.Append(", Defaults: new { ");
+ FormatValues(sb, routeEndpoint.RoutePattern.Defaults);
+ sb.Append(" }");
+ var routeNameMetadata = routeEndpoint.Metadata.GetMetadata<IRouteNameMetadata>();
+ sb.Append(", Route Name: ");
+ sb.Append(routeNameMetadata?.RouteName);
+ var routeValues = routeEndpoint.RoutePattern.RequiredValues;
+
+ if (routeValues.Count > 0)
+ {
+ sb.Append(", Required Values: new { ");
+ FormatValues(sb, routeValues);
+ sb.Append(" }");
+ }
+
+ sb.Append(", Order: ");
+ sb.Append(routeEndpoint.Order);
+
+ var httpMethodMetadata = routeEndpoint.Metadata.GetMetadata<IHttpMethodMetadata>();
+
+ if (httpMethodMetadata is not null)
+ {
+ sb.Append(", Http Methods: ");
+ sb.AppendJoin(", ", httpMethodMetadata.HttpMethods);
+ }
+
+ sb.Append(", Display Name: ");
+ }
+ else
+ {
+ sb.Append("Non-RouteEndpoint. DisplayName: ");
+ }
+
+ sb.AppendLine(endpoint.DisplayName);
+ }
+
+ return sb.ToString();
+
+ static void FormatValues(StringBuilder sb, IEnumerable<KeyValuePair<string, object?>> values)
+ {
+ var isFirst = true;
+
+ foreach (var (key, value) in values)
+ {
+ if (isFirst)
+ {
+ isFirst = false;
+ }
+ else
+ {
+ sb.Append(", ");
+ }
+
+ sb.Append(key);
+ sb.Append(" = ");
+
+ if (value is null)
+ {
+ sb.Append("null");
+ }
+ else
+ {
+ sb.Append('\"');
+ sb.Append(value);
+ sb.Append('\"');
+ }
+ }
+ }
+ }
}
diff --git a/src/Http/Routing/src/EndpointMiddleware.cs b/src/Http/Routing/src/EndpointMiddleware.cs
index d04af317c0..339772e5f8 100644
--- a/src/Http/Routing/src/EndpointMiddleware.cs
+++ b/src/Http/Routing/src/EndpointMiddleware.cs
@@ -31,41 +31,44 @@ internal sealed partial class EndpointMiddleware
public Task Invoke(HttpContext httpContext)
{
var endpoint = httpContext.GetEndpoint();
- if (endpoint?.RequestDelegate != null)
+ if (endpoint is not null)
{
if (!_routeOptions.SuppressCheckForUnhandledSecurityMetadata)
{
- if (endpoint.Metadata.GetMetadata<IAuthorizeData>() != null &&
+ if (endpoint.Metadata.GetMetadata<IAuthorizeData>() is not null &&
!httpContext.Items.ContainsKey(AuthorizationMiddlewareInvokedKey))
{
ThrowMissingAuthMiddlewareException(endpoint);
}
- if (endpoint.Metadata.GetMetadata<ICorsMetadata>() != null &&
+ if (endpoint.Metadata.GetMetadata<ICorsMetadata>() is not null &&
!httpContext.Items.ContainsKey(CorsMiddlewareInvokedKey))
{
ThrowMissingCorsMiddlewareException(endpoint);
}
}
- Log.ExecutingEndpoint(_logger, endpoint);
-
- try
+ if (endpoint.RequestDelegate is not null)
{
- var requestTask = endpoint.RequestDelegate(httpContext);
- if (!requestTask.IsCompletedSuccessfully)
+ Log.ExecutingEndpoint(_logger, endpoint);
+
+ try
{
- return AwaitRequestTask(endpoint, requestTask, _logger);
+ var requestTask = endpoint.RequestDelegate(httpContext);
+ if (!requestTask.IsCompletedSuccessfully)
+ {
+ return AwaitRequestTask(endpoint, requestTask, _logger);
+ }
}
- }
- catch (Exception exception)
- {
+ catch (Exception exception)
+ {
+ Log.ExecutedEndpoint(_logger, endpoint);
+ return Task.FromException(exception);
+ }
+
Log.ExecutedEndpoint(_logger, endpoint);
- return Task.FromException(exception);
+ return Task.CompletedTask;
}
-
- Log.ExecutedEndpoint(_logger, endpoint);
- return Task.CompletedTask;
}
return _next(httpContext);
diff --git a/src/Http/Routing/src/EndpointRoutingMiddleware.cs b/src/Http/Routing/src/EndpointRoutingMiddleware.cs
index ff2b382fdc..fe336e869c 100644
--- a/src/Http/Routing/src/EndpointRoutingMiddleware.cs
+++ b/src/Http/Routing/src/EndpointRoutingMiddleware.cs
@@ -26,6 +26,7 @@ internal sealed partial class EndpointRoutingMiddleware
MatcherFactory matcherFactory,
ILogger<EndpointRoutingMiddleware> logger,
IEndpointRouteBuilder endpointRouteBuilder,
+ EndpointDataSource rootCompositeEndpointDataSource,
DiagnosticListener diagnosticListener,
RequestDelegate next)
{
@@ -39,6 +40,9 @@ internal sealed partial class EndpointRoutingMiddleware
_diagnosticListener = diagnosticListener ?? throw new ArgumentNullException(nameof(diagnosticListener));
_next = next ?? throw new ArgumentNullException(nameof(next));
+ // rootCompositeEndpointDataSource is a constructor parameter only so it always gets disposed by DI. This ensures that any
+ // disposable EndpointDataSources also get disposed. _endpointDataSource is a component of rootCompositeEndpointDataSource.
+ _ = rootCompositeEndpointDataSource;
_endpointDataSource = new CompositeEndpointDataSource(endpointRouteBuilder.DataSources);
}
diff --git a/src/Http/Routing/src/HttpMethodMetadata.cs b/src/Http/Routing/src/HttpMethodMetadata.cs
index b172a8c714..221529b9f2 100644
--- a/src/Http/Routing/src/HttpMethodMetadata.cs
+++ b/src/Http/Routing/src/HttpMethodMetadata.cs
@@ -47,7 +47,7 @@ public sealed class HttpMethodMetadata : IHttpMethodMetadata
/// <summary>
/// Returns a value indicating whether the associated endpoint should accept CORS preflight requests.
/// </summary>
- public bool AcceptCorsPreflight { get; }
+ public bool AcceptCorsPreflight { get; set; }
/// <summary>
/// Returns a read-only collection of HTTP methods used during routing.
diff --git a/src/Http/Routing/src/IHttpMethodMetadata.cs b/src/Http/Routing/src/IHttpMethodMetadata.cs
index 2e41b4a59d..49e2963624 100644
--- a/src/Http/Routing/src/IHttpMethodMetadata.cs
+++ b/src/Http/Routing/src/IHttpMethodMetadata.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Routing;
@@ -11,7 +11,11 @@ public interface IHttpMethodMetadata
/// <summary>
/// Returns a value indicating whether the associated endpoint should accept CORS preflight requests.
/// </summary>
- bool AcceptCorsPreflight { get; }
+ bool AcceptCorsPreflight
+ {
+ get => false;
+ set => throw new NotImplementedException();
+ }
/// <summary>
/// Returns a read-only collection of HTTP methods used during routing.
diff --git a/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs b/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs
index 3e608cc6aa..9447793c78 100644
--- a/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs
+++ b/src/Http/Routing/src/MapRouteRouteBuilderExtensions.cs
@@ -26,7 +26,7 @@ public static class MapRouteRouteBuilderExtensions
public static IRouteBuilder MapRoute(
this IRouteBuilder routeBuilder,
string? name,
- string? template)
+ [StringSyntax("Route")] string? template)
{
MapRoute(routeBuilder, name, template, defaults: null);
return routeBuilder;
@@ -47,7 +47,7 @@ public static class MapRouteRouteBuilderExtensions
public static IRouteBuilder MapRoute(
this IRouteBuilder routeBuilder,
string? name,
- string? template,
+ [StringSyntax("Route")] string? template,
object? defaults)
{
return MapRoute(routeBuilder, name, template, defaults, constraints: null);
@@ -73,7 +73,7 @@ public static class MapRouteRouteBuilderExtensions
public static IRouteBuilder MapRoute(
this IRouteBuilder routeBuilder,
string? name,
- string? template,
+ [StringSyntax("Route")] string? template,
object? defaults,
object? constraints)
{
@@ -104,7 +104,7 @@ public static class MapRouteRouteBuilderExtensions
public static IRouteBuilder MapRoute(
this IRouteBuilder routeBuilder,
string? name,
- string? template,
+ [StringSyntax("Route")] string? template,
object? defaults,
object? constraints,
object? dataTokens)
@@ -139,7 +139,7 @@ public static class MapRouteRouteBuilderExtensions
return new BackCompatInlineConstraintResolver(inlineConstraintResolver, parameterPolicyFactory);
}
- private class BackCompatInlineConstraintResolver : IInlineConstraintResolver
+ private sealed class BackCompatInlineConstraintResolver : IInlineConstraintResolver
{
private readonly IInlineConstraintResolver _inner;
private readonly ParameterPolicyFactory _parameterPolicyFactory;
diff --git a/src/Http/Routing/src/Matching/AcceptsMatcherPolicy.cs b/src/Http/Routing/src/Matching/AcceptsMatcherPolicy.cs
index 67c0321480..87931a0306 100644
--- a/src/Http/Routing/src/Matching/AcceptsMatcherPolicy.cs
+++ b/src/Http/Routing/src/Matching/AcceptsMatcherPolicy.cs
@@ -10,6 +10,7 @@ namespace Microsoft.AspNetCore.Routing.Matching;
internal sealed class AcceptsMatcherPolicy : MatcherPolicy, IEndpointComparerPolicy, INodeBuilderPolicy, IEndpointSelectorPolicy
{
+ private static Endpoint? Http415Endpoint;
internal const string Http415EndpointDisplayName = "415 HTTP Unsupported Media Type";
internal const string AnyContentType = "*/*";
@@ -258,8 +259,7 @@ internal sealed class AcceptsMatcherPolicy : MatcherPolicy, IEndpointComparerPol
private static Endpoint CreateRejectionEndpoint()
{
- return new Endpoint(
- (context) =>
+ return Http415Endpoint ??= new Endpoint(context =>
{
context.Response.StatusCode = StatusCodes.Status415UnsupportedMediaType;
return Task.CompletedTask;
diff --git a/src/Http/Routing/src/Matching/AmbiguousMatchException.cs b/src/Http/Routing/src/Matching/AmbiguousMatchException.cs
index 717327c9e2..17031455a0 100644
--- a/src/Http/Routing/src/Matching/AmbiguousMatchException.cs
+++ b/src/Http/Routing/src/Matching/AmbiguousMatchException.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Runtime.Serialization;
@@ -9,14 +9,14 @@ namespace Microsoft.AspNetCore.Routing.Matching;
/// An exception which indicates multiple matches in endpoint selection.
/// </summary>
[Serializable]
-internal class AmbiguousMatchException : Exception
+internal sealed class AmbiguousMatchException : Exception
{
public AmbiguousMatchException(string message)
: base(message)
{
}
- protected AmbiguousMatchException(SerializationInfo info, StreamingContext context)
+ internal AmbiguousMatchException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
}
diff --git a/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs b/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs
index b8ea3cf480..f22f8c009c 100644
--- a/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs
+++ b/src/Http/Routing/src/Matching/DfaMatcherBuilder.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class DfaMatcherBuilder : MatcherBuilder
+internal sealed class DfaMatcherBuilder : MatcherBuilder
{
private readonly List<RouteEndpoint> _endpoints = new List<RouteEndpoint>();
@@ -111,7 +111,7 @@ internal class DfaMatcherBuilder : MatcherBuilder
return root;
}
- private class DfaBuilderWorker
+ private sealed class DfaBuilderWorker
{
private List<DfaBuilderWorkerWorkItem> _previousWork;
private List<DfaBuilderWorkerWorkItem> _work;
diff --git a/src/Http/Routing/src/Matching/DfaMatcherFactory.cs b/src/Http/Routing/src/Matching/DfaMatcherFactory.cs
index 9786526ce3..026ee65979 100644
--- a/src/Http/Routing/src/Matching/DfaMatcherFactory.cs
+++ b/src/Http/Routing/src/Matching/DfaMatcherFactory.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class DfaMatcherFactory : MatcherFactory
+internal sealed class DfaMatcherFactory : MatcherFactory
{
private readonly IServiceProvider _services;
diff --git a/src/Http/Routing/src/Matching/DfaNode.cs b/src/Http/Routing/src/Matching/DfaNode.cs
index f378ac2db4..87c9d5e5e2 100644
--- a/src/Http/Routing/src/Matching/DfaNode.cs
+++ b/src/Http/Routing/src/Matching/DfaNode.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Routing.Matching;
// Intermediate data structure used to build the DFA. Not used at runtime.
[DebuggerDisplay("{DebuggerToString(),nq}")]
-internal class DfaNode
+internal sealed class DfaNode
{
// The depth of the node. The depth indicates the number of segments
// that must be processed to arrive at this node.
diff --git a/src/Http/Routing/src/Matching/DictionaryJumpTable.cs b/src/Http/Routing/src/Matching/DictionaryJumpTable.cs
index 59380d9198..59cc386b4f 100644
--- a/src/Http/Routing/src/Matching/DictionaryJumpTable.cs
+++ b/src/Http/Routing/src/Matching/DictionaryJumpTable.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -6,7 +6,7 @@ using System.Text;
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class DictionaryJumpTable : JumpTable
+internal sealed class DictionaryJumpTable : JumpTable
{
private readonly int _defaultDestination;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Matching/EndpointComparer.cs b/src/Http/Routing/src/Matching/EndpointComparer.cs
index 4d3cdadb46..88f0714e18 100644
--- a/src/Http/Routing/src/Matching/EndpointComparer.cs
+++ b/src/Http/Routing/src/Matching/EndpointComparer.cs
@@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Routing.Matching;
// IComparer implementation considers the template string as a tiebreaker.
// IEqualityComparer implementation does not.
// This is cool and good.
-internal class EndpointComparer : IComparer<Endpoint>, IEqualityComparer<Endpoint>
+internal sealed class EndpointComparer : IComparer<Endpoint>, IEqualityComparer<Endpoint>
{
private readonly IComparer<Endpoint>[] _comparers;
@@ -103,7 +103,7 @@ internal class EndpointComparer : IComparer<Endpoint>, IEqualityComparer<Endpoin
return 0;
}
- private class OrderComparer : IComparer<Endpoint>
+ private sealed class OrderComparer : IComparer<Endpoint>
{
public static readonly IComparer<Endpoint> Instance = new OrderComparer();
@@ -130,7 +130,7 @@ internal class EndpointComparer : IComparer<Endpoint>, IEqualityComparer<Endpoin
}
}
- private class PrecedenceComparer : IComparer<Endpoint>
+ private sealed class PrecedenceComparer : IComparer<Endpoint>
{
public static readonly IComparer<Endpoint> Instance = new PrecedenceComparer();
diff --git a/src/Http/Routing/src/Matching/EndpointMetadataComparer.cs b/src/Http/Routing/src/Matching/EndpointMetadataComparer.cs
index 376d15d6de..f148245644 100644
--- a/src/Http/Routing/src/Matching/EndpointMetadataComparer.cs
+++ b/src/Http/Routing/src/Matching/EndpointMetadataComparer.cs
@@ -164,7 +164,7 @@ public abstract class EndpointMetadataComparer<TMetadata> : IComparer<Endpoint>
return 0;
}
- private class DefaultComparer<T> : EndpointMetadataComparer<T> where T : class
+ private sealed class DefaultComparer<T> : EndpointMetadataComparer<T> where T : class
{
}
}
diff --git a/src/Http/Routing/src/Matching/HostMatcherPolicy.cs b/src/Http/Routing/src/Matching/HostMatcherPolicy.cs
index 0a12340438..0680b343d0 100644
--- a/src/Http/Routing/src/Matching/HostMatcherPolicy.cs
+++ b/src/Http/Routing/src/Matching/HostMatcherPolicy.cs
@@ -343,7 +343,7 @@ public sealed class HostMatcherPolicy : MatcherPolicy, IEndpointComparerPolicy,
}
}
- private class HostMetadataEndpointComparer : EndpointMetadataComparer<IHostMetadata>
+ private sealed class HostMetadataEndpointComparer : EndpointMetadataComparer<IHostMetadata>
{
protected override int CompareMetadata(IHostMetadata? x, IHostMetadata? y)
{
@@ -354,7 +354,7 @@ public sealed class HostMatcherPolicy : MatcherPolicy, IEndpointComparerPolicy,
}
}
- private class HostPolicyJumpTable : PolicyJumpTable
+ private sealed class HostPolicyJumpTable : PolicyJumpTable
{
private readonly (EdgeKey host, int destination)[] _destinations;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs b/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs
index c24c69019a..cea2791414 100644
--- a/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs
+++ b/src/Http/Routing/src/Matching/HttpMethodMatcherPolicy.cs
@@ -404,12 +404,10 @@ public sealed class HttpMethodMatcherPolicy : MatcherPolicy, IEndpointComparerPo
return new Endpoint(
(context) =>
{
- context.Response.StatusCode = 405;
-
// Prevent ArgumentException from duplicate key if header already added, such as when the
// request is re-executed by an error handler (see https://github.com/dotnet/aspnetcore/issues/6415)
context.Response.Headers.Allow = allow;
-
+ context.Response.StatusCode = StatusCodes.Status405MethodNotAllowed;
return Task.CompletedTask;
},
EndpointMetadataCollection.Empty,
@@ -450,7 +448,7 @@ public sealed class HttpMethodMatcherPolicy : MatcherPolicy, IEndpointComparerPo
!StringValues.IsNullOrEmpty(accessControlRequestMethod);
}
- private class HttpMethodMetadataEndpointComparer : EndpointMetadataComparer<IHttpMethodMetadata>
+ private sealed class HttpMethodMetadataEndpointComparer : EndpointMetadataComparer<IHttpMethodMetadata>
{
protected override int CompareMetadata(IHttpMethodMetadata? x, IHttpMethodMetadata? y)
{
diff --git a/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs b/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs
index 90c3bbd93f..52af625d63 100644
--- a/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs
+++ b/src/Http/Routing/src/Matching/ILEmitTrieFactory.cs
@@ -416,7 +416,7 @@ internal static class ILEmitTrieFactory
}
#endif
- private class Locals
+ private sealed class Locals
{
public Locals(ILGenerator il, bool vectorize)
{
@@ -464,7 +464,7 @@ internal static class ILEmitTrieFactory
public LocalBuilder Span { get; }
}
- private class Labels
+ private sealed class Labels
{
/// <summary>
/// Label to goto that will return the default destination (not a match).
diff --git a/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs b/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs
index 386dc30a49..6a541a99b3 100644
--- a/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs
+++ b/src/Http/Routing/src/Matching/ILEmitTrieJumpTable.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Routing.Matching;
// a fallback jump table for two reasons:
// 1. We compute the IL lazily to avoid taking up significant time when processing a request
// 2. The generated IL only supports ASCII in the URL path
-internal class ILEmitTrieJumpTable : JumpTable
+internal sealed class ILEmitTrieJumpTable : JumpTable
{
private readonly int _defaultDestination;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Matching/LinearSearchJumpTable.cs b/src/Http/Routing/src/Matching/LinearSearchJumpTable.cs
index 6fabd9622a..c604c7c53f 100644
--- a/src/Http/Routing/src/Matching/LinearSearchJumpTable.cs
+++ b/src/Http/Routing/src/Matching/LinearSearchJumpTable.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -6,7 +6,7 @@ using System.Text;
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class LinearSearchJumpTable : JumpTable
+internal sealed class LinearSearchJumpTable : JumpTable
{
private readonly int _defaultDestination;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Matching/SingleEntryAsciiJumpTable.cs b/src/Http/Routing/src/Matching/SingleEntryAsciiJumpTable.cs
index 5f37305fa2..5fc9675454 100644
--- a/src/Http/Routing/src/Matching/SingleEntryAsciiJumpTable.cs
+++ b/src/Http/Routing/src/Matching/SingleEntryAsciiJumpTable.cs
@@ -5,7 +5,7 @@ namespace Microsoft.AspNetCore.Routing.Matching;
// Optimized implementation for cases where we know that we're
// comparing to ASCII.
-internal class SingleEntryAsciiJumpTable : JumpTable
+internal sealed class SingleEntryAsciiJumpTable : JumpTable
{
private readonly int _defaultDestination;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Matching/SingleEntryJumpTable.cs b/src/Http/Routing/src/Matching/SingleEntryJumpTable.cs
index 3c8e201be9..4769c87b62 100644
--- a/src/Http/Routing/src/Matching/SingleEntryJumpTable.cs
+++ b/src/Http/Routing/src/Matching/SingleEntryJumpTable.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class SingleEntryJumpTable : JumpTable
+internal sealed class SingleEntryJumpTable : JumpTable
{
private readonly int _defaultDestination;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Matching/ZeroEntryJumpTable.cs b/src/Http/Routing/src/Matching/ZeroEntryJumpTable.cs
index ba4243008c..8d39712369 100644
--- a/src/Http/Routing/src/Matching/ZeroEntryJumpTable.cs
+++ b/src/Http/Routing/src/Matching/ZeroEntryJumpTable.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Routing.Matching;
-internal class ZeroEntryJumpTable : JumpTable
+internal sealed class ZeroEntryJumpTable : JumpTable
{
private readonly int _defaultDestination;
private readonly int _exitDestination;
diff --git a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj
index 0e1f47d2ab..1351c5a7cc 100644
--- a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj
+++ b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj
@@ -27,7 +27,6 @@
<ItemGroup>
<Compile Include="$(SharedSourceRoot)PropertyHelper\*.cs" />
<Compile Include="$(SharedSourceRoot)RoslynUtils\TypeHelper.cs" />
- <Compile Include="$(SharedSourceRoot)RoslynUtils\GeneratedNameParser.cs" />
<Compile Include="$(SharedSourceRoot)MediaType\ReadOnlyMediaTypeHeaderValue.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)MediaType\HttpTokenParsingRule.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)ApiExplorerTypes\*.cs" LinkBase="Shared" />
diff --git a/src/Http/Routing/src/ModelEndpointDataSource.cs b/src/Http/Routing/src/ModelEndpointDataSource.cs
deleted file mode 100644
index 1a18d4db6e..0000000000
--- a/src/Http/Routing/src/ModelEndpointDataSource.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Linq;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-using Microsoft.Extensions.FileProviders;
-using Microsoft.Extensions.Primitives;
-
-namespace Microsoft.AspNetCore.Routing;
-
-internal class ModelEndpointDataSource : EndpointDataSource
-{
- private readonly List<DefaultEndpointConventionBuilder> _endpointConventionBuilders;
-
- public ModelEndpointDataSource()
- {
- _endpointConventionBuilders = new List<DefaultEndpointConventionBuilder>();
- }
-
- public IEndpointConventionBuilder AddEndpointBuilder(EndpointBuilder endpointBuilder)
- {
- var builder = new DefaultEndpointConventionBuilder(endpointBuilder);
- _endpointConventionBuilders.Add(builder);
-
- return builder;
- }
-
- public override IChangeToken GetChangeToken()
- {
- return NullChangeToken.Singleton;
- }
-
- public override IReadOnlyList<Endpoint> Endpoints => _endpointConventionBuilders.Select(e => e.Build()).ToArray();
-
- // for testing
- internal IEnumerable<EndpointBuilder> EndpointBuilders => _endpointConventionBuilders.Select(b => b.EndpointBuilder);
-}
diff --git a/src/Http/Routing/src/NullRouter.cs b/src/Http/Routing/src/NullRouter.cs
index 9e0b46ec19..1dd34fea58 100644
--- a/src/Http/Routing/src/NullRouter.cs
+++ b/src/Http/Routing/src/NullRouter.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Routing;
-internal class NullRouter : IRouter
+internal sealed class NullRouter : IRouter
{
public static readonly NullRouter Instance = new NullRouter();
diff --git a/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs b/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs
index 84e425b55a..461af9e90f 100644
--- a/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs
+++ b/src/Http/Routing/src/Patterns/DefaultRoutePatternTransformer.cs
@@ -7,7 +7,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.Routing.Patterns;
-internal class DefaultRoutePatternTransformer : RoutePatternTransformer
+internal sealed class DefaultRoutePatternTransformer : RoutePatternTransformer
{
private readonly ParameterPolicyFactory _policyFactory;
diff --git a/src/Http/Routing/src/Patterns/RoutePattern.cs b/src/Http/Routing/src/Patterns/RoutePattern.cs
index a60b0084b7..aaf7d13aa2 100644
--- a/src/Http/Routing/src/Patterns/RoutePattern.cs
+++ b/src/Http/Routing/src/Patterns/RoutePattern.cs
@@ -158,7 +158,7 @@ public sealed class RoutePattern
}
[DebuggerDisplay("{DebuggerToString(),nq}")]
- private class RequiredValueAnySentinal
+ private sealed class RequiredValueAnySentinal
{
private static string DebuggerToString() => "*any*";
}
diff --git a/src/Http/Routing/src/Patterns/RoutePatternException.cs b/src/Http/Routing/src/Patterns/RoutePatternException.cs
index 25be8445a2..01f99f2cb3 100644
--- a/src/Http/Routing/src/Patterns/RoutePatternException.cs
+++ b/src/Http/Routing/src/Patterns/RoutePatternException.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Runtime.Serialization;
namespace Microsoft.AspNetCore.Routing.Patterns;
@@ -22,7 +23,7 @@ public sealed class RoutePatternException : Exception
/// </summary>
/// <param name="pattern">The route pattern as raw text.</param>
/// <param name="message">The exception message.</param>
- public RoutePatternException(string pattern, string message)
+ public RoutePatternException([StringSyntax("Route")] string pattern, string message)
: base(message)
{
if (pattern == null)
diff --git a/src/Http/Routing/src/Patterns/RoutePatternFactory.cs b/src/Http/Routing/src/Patterns/RoutePatternFactory.cs
index 22123f60ac..edfd3a004f 100644
--- a/src/Http/Routing/src/Patterns/RoutePatternFactory.cs
+++ b/src/Http/Routing/src/Patterns/RoutePatternFactory.cs
@@ -27,7 +27,7 @@ public static class RoutePatternFactory
/// </summary>
/// <param name="pattern">The route pattern string to parse.</param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
- public static RoutePattern Parse(string pattern)
+ public static RoutePattern Parse([StringSyntax("Route")] string pattern)
{
if (pattern == null)
{
@@ -55,7 +55,7 @@ public static class RoutePatternFactory
/// </param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
[RequiresUnreferencedCode(RouteValueDictionaryTrimmerWarning.Warning)]
- public static RoutePattern Parse(string pattern, object? defaults, object? parameterPolicies)
+ public static RoutePattern Parse([StringSyntax("Route")] string pattern, object? defaults, object? parameterPolicies)
{
if (pattern == null)
{
@@ -83,7 +83,7 @@ public static class RoutePatternFactory
/// Multiple policies can be specified for a key by providing a collection as the value.
/// </param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
- public static RoutePattern Parse(string pattern, RouteValueDictionary? defaults, RouteValueDictionary? parameterPolicies)
+ public static RoutePattern Parse([StringSyntax("Route")] string pattern, RouteValueDictionary? defaults, RouteValueDictionary? parameterPolicies)
{
if (pattern == null)
{
@@ -115,7 +115,7 @@ public static class RoutePatternFactory
/// </param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
[RequiresUnreferencedCode(RouteValueDictionaryTrimmerWarning.Warning)]
- public static RoutePattern Parse(string pattern, object? defaults, object? parameterPolicies, object? requiredValues)
+ public static RoutePattern Parse([StringSyntax("Route")] string pattern, object? defaults, object? parameterPolicies, object? requiredValues)
{
if (pattern == null)
{
@@ -146,7 +146,7 @@ public static class RoutePatternFactory
/// Route values that can be substituted for parameters in the route pattern. See remarks on <see cref="RoutePattern.RequiredValues"/>.
/// </param>
/// <returns>The <see cref="RoutePattern"/>.</returns>
- public static RoutePattern Parse(string pattern, RouteValueDictionary? defaults, RouteValueDictionary? parameterPolicies, RouteValueDictionary? requiredValues)
+ public static RoutePattern Parse([StringSyntax("Route")] string pattern, RouteValueDictionary? defaults, RouteValueDictionary? parameterPolicies, RouteValueDictionary? requiredValues)
{
if (pattern is null)
{
@@ -1084,6 +1084,120 @@ public static class RoutePatternFactory
return ParameterPolicyCore(parameterPolicy);
}
+ /// <summary>
+ /// Creates a <see cref="RoutePattern"/> that combines the specified patterns.
+ /// </summary>
+ /// <param name="left">A string representing the first part of the route.</param>
+ /// <param name="right">A stirng representing the second part of the route.</param>
+ /// <returns>The combined <see cref="RoutePattern"/>.</returns>
+ /// <exception cref="InvalidOperationException"></exception>
+ /// <exception cref="RoutePatternException"></exception>
+ public static RoutePattern Combine(RoutePattern? left, RoutePattern right)
+ {
+ static IReadOnlyDictionary<string, TValue> CombineDictionaries<TValue>(
+ IReadOnlyDictionary<string, TValue> leftDictionary,
+ IReadOnlyDictionary<string, TValue> rightDictionary,
+ string rawText,
+ string dictionaryName)
+ {
+ if (leftDictionary.Count is 0)
+ {
+ return rightDictionary;
+ }
+ if (rightDictionary.Count is 0)
+ {
+ return leftDictionary;
+ }
+
+ var combinedDictionary = new Dictionary<string, TValue>(leftDictionary.Count + rightDictionary.Count, StringComparer.OrdinalIgnoreCase);
+ foreach (var (key, value) in leftDictionary)
+ {
+ combinedDictionary.Add(key, value);
+ }
+ foreach (var (key, value) in rightDictionary)
+ {
+ if (!combinedDictionary.TryAdd(key, value) && !Equals(combinedDictionary[key], value))
+ {
+ // Technically, the ParameterPolicies could probably be merged because it's a list, but it makes little sense to add policy
+ // for the same parameter in both the left and right part of the combined pattern. Defaults and Required values cannot be
+ // merged because the `TValue` is `object?`, but over-setting a Default or RequiredValue (which may not be in the parameter list)
+ // seems okay as long as the values are the same for a given key in both the left and right pattern. There's already similar logic
+ // in PatternCore for when defaults come from both the `defaults` and `segments` param. `requiredValues` cannot be defined in
+ // `segments` so there's no equivalent to merging these until now.
+ throw new InvalidOperationException(Resources.FormatMapGroup_RepeatedDictionaryEntry(rawText, dictionaryName, key));
+ }
+ }
+ return combinedDictionary;
+ }
+
+ static Action<RoutePatternParameterPart> CheckDuplicateParameters(int parameterCount, string rawText)
+ {
+ var parameterNameSet = new HashSet<string>(parameterCount, StringComparer.OrdinalIgnoreCase);
+ return parameterPart =>
+ {
+ if (!parameterNameSet.Add(parameterPart.Name))
+ {
+ var errorText = Resources.FormatTemplateRoute_RepeatedParameter(parameterPart.Name);
+ throw new RoutePatternException(rawText, errorText);
+ }
+ };
+ }
+
+ if (left is null)
+ {
+ return right;
+ }
+
+ var rawText = $"{left.RawText?.TrimEnd('/')}/{right.RawText?.TrimStart('/')}";
+
+ var parameters = CombineLists(left.Parameters, right.Parameters, CheckDuplicateParameters, rawText);
+ var pathSegments = CombineLists(left.PathSegments, right.PathSegments);
+
+ var defaults = CombineDictionaries(left.Defaults, right.Defaults, rawText, nameof(RoutePattern.Defaults));
+ var requiredValues = CombineDictionaries(left.RequiredValues, right.RequiredValues, rawText, nameof(RoutePattern.RequiredValues));
+ var parameterPolicies = CombineDictionaries(left.ParameterPolicies, right.ParameterPolicies, rawText, nameof(RoutePattern.ParameterPolicies));
+
+ return new RoutePattern(rawText, defaults, parameterPolicies, requiredValues, parameters, pathSegments);
+ }
+
+ internal static IReadOnlyList<T> CombineLists<T>(
+ IReadOnlyList<T> leftList,
+ IReadOnlyList<T> rightList,
+ Func<int, string, Action<T>>? checkDuplicates = null,
+ string? rawText = null)
+ {
+ var leftCount = leftList.Count;
+ if (leftCount is 0)
+ {
+ return rightList;
+ }
+
+ var rightCount = rightList.Count;
+ if (rightCount is 0)
+ {
+ return leftList;
+ }
+
+ var combinedList = new T[leftCount + rightCount];
+ var check = checkDuplicates?.Invoke(combinedList.Length, rawText!);
+
+ for (int i = 0; i < leftCount; i++)
+ {
+ var item = leftList[i];
+ check?.Invoke(item);
+ combinedList[i] = item;
+ }
+
+ for (int i = 0; i < rightCount; i++)
+ {
+ var item = rightList[i];
+ check?.Invoke(item);
+ combinedList[leftCount + i] = rightList[i];
+ }
+
+ return combinedList;
+ }
+
private static RoutePatternParameterPolicyReference ParameterPolicyCore(string parameterPolicy)
{
return new RoutePatternParameterPolicyReference(parameterPolicy);
diff --git a/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs b/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs
index 3c7bd18a85..6be83a36ce 100644
--- a/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs
+++ b/src/Http/Routing/src/Patterns/RoutePatternMatcher.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Routing;
-internal class RoutePatternMatcher
+internal sealed class RoutePatternMatcher
{
// Perf: This is a cache to avoid looking things up in 'Defaults' each request.
private readonly bool[] _hasDefaultValue;
diff --git a/src/Http/Routing/src/Patterns/RoutePatternParser.cs b/src/Http/Routing/src/Patterns/RoutePatternParser.cs
index 39dc65f3ef..a178eb78b6 100644
--- a/src/Http/Routing/src/Patterns/RoutePatternParser.cs
+++ b/src/Http/Routing/src/Patterns/RoutePatternParser.cs
@@ -478,7 +478,7 @@ internal static class RoutePatternParser
}
[DebuggerDisplay("{DebuggerToString()}")]
- private class Context
+ private sealed class Context
{
private readonly string _template;
private int _index;
diff --git a/src/Http/Routing/src/PublicAPI.Shipped.txt b/src/Http/Routing/src/PublicAPI.Shipped.txt
index 6d681236b3..ced97f229a 100644
--- a/src/Http/Routing/src/PublicAPI.Shipped.txt
+++ b/src/Http/Routing/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Routing.DefaultInlineConstraintResolver.DefaultInlineConstraintResolver(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions, System.IServiceProvider! serviceProvider) -> void
-~Microsoft.AspNetCore.Routing.Matching.EndpointMetadataComparer<TMetadata>
+Microsoft.AspNetCore.Routing.DefaultInlineConstraintResolver.DefaultInlineConstraintResolver(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions, System.IServiceProvider! serviceProvider) -> void
+Microsoft.AspNetCore.Routing.Matching.EndpointMetadataComparer<TMetadata>
~Microsoft.AspNetCore.Routing.Tree.InboundMatch.Entry.get -> Microsoft.AspNetCore.Routing.Tree.InboundRouteEntry
~Microsoft.AspNetCore.Routing.Tree.InboundMatch.Entry.set -> void
~Microsoft.AspNetCore.Routing.Tree.InboundMatch.TemplateMatcher.get -> Microsoft.AspNetCore.Routing.Template.TemplateMatcher
@@ -254,6 +254,7 @@ Microsoft.AspNetCore.Routing.Matching.CandidateSet.ReplaceEndpoint(int index, Mi
Microsoft.AspNetCore.Routing.Matching.CandidateSet.SetValidity(int index, bool value) -> void
Microsoft.AspNetCore.Routing.Matching.CandidateSet.this[int index].get -> Microsoft.AspNetCore.Routing.Matching.CandidateState
Microsoft.AspNetCore.Routing.Matching.CandidateState
+Microsoft.AspNetCore.Routing.Matching.CandidateState.CandidateState() -> void
Microsoft.AspNetCore.Routing.Matching.CandidateState.Endpoint.get -> Microsoft.AspNetCore.Http.Endpoint!
Microsoft.AspNetCore.Routing.Matching.CandidateState.Score.get -> int
Microsoft.AspNetCore.Routing.Matching.CandidateState.Values.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary?
@@ -288,10 +289,12 @@ Microsoft.AspNetCore.Routing.Matching.IParameterLiteralNodeMatchingPolicy.Matche
Microsoft.AspNetCore.Routing.Matching.PolicyJumpTable
Microsoft.AspNetCore.Routing.Matching.PolicyJumpTable.PolicyJumpTable() -> void
Microsoft.AspNetCore.Routing.Matching.PolicyJumpTableEdge
+Microsoft.AspNetCore.Routing.Matching.PolicyJumpTableEdge.PolicyJumpTableEdge() -> void
Microsoft.AspNetCore.Routing.Matching.PolicyJumpTableEdge.Destination.get -> int
Microsoft.AspNetCore.Routing.Matching.PolicyJumpTableEdge.PolicyJumpTableEdge(object! state, int destination) -> void
Microsoft.AspNetCore.Routing.Matching.PolicyJumpTableEdge.State.get -> object!
Microsoft.AspNetCore.Routing.Matching.PolicyNodeEdge
+Microsoft.AspNetCore.Routing.Matching.PolicyNodeEdge.PolicyNodeEdge() -> void
Microsoft.AspNetCore.Routing.Matching.PolicyNodeEdge.Endpoints.get -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Http.Endpoint!>!
Microsoft.AspNetCore.Routing.Matching.PolicyNodeEdge.PolicyNodeEdge(object! state, System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Http.Endpoint!>! endpoints) -> void
Microsoft.AspNetCore.Routing.Matching.PolicyNodeEdge.State.get -> object!
diff --git a/src/Http/Routing/src/PublicAPI.Unshipped.txt b/src/Http/Routing/src/PublicAPI.Unshipped.txt
index 3d9ca9b5f4..a3b111566e 100644
--- a/src/Http/Routing/src/PublicAPI.Unshipped.txt
+++ b/src/Http/Routing/src/PublicAPI.Unshipped.txt
@@ -1,18 +1,38 @@
#nullable enable
-Microsoft.AspNetCore.Http.RouteHandlerFilterExtensions
+Microsoft.AspNetCore.Builder.RouteHandlerBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finalConvention) -> void
+Microsoft.AspNetCore.Http.EndpointFilterExtensions
+Microsoft.AspNetCore.Routing.CompositeEndpointDataSource.Dispose() -> void
+Microsoft.AspNetCore.Routing.HttpMethodMetadata.AcceptCorsPreflight.set -> void
+Microsoft.AspNetCore.Routing.IHttpMethodMetadata.AcceptCorsPreflight.set -> void
+Microsoft.AspNetCore.Routing.RouteGroupBuilder
+Microsoft.AspNetCore.Routing.RouteGroupContext
+Microsoft.AspNetCore.Routing.RouteGroupContext.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Routing.RouteGroupContext.ApplicationServices.init -> void
+Microsoft.AspNetCore.Routing.RouteGroupContext.Conventions.get -> System.Collections.Generic.IReadOnlyList<System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>!>!
+Microsoft.AspNetCore.Routing.RouteGroupContext.Conventions.init -> void
+Microsoft.AspNetCore.Routing.RouteGroupContext.FinallyConventions.get -> System.Collections.Generic.IReadOnlyList<System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>!>!
+Microsoft.AspNetCore.Routing.RouteGroupContext.FinallyConventions.init -> void
+Microsoft.AspNetCore.Routing.RouteGroupContext.Prefix.get -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
+Microsoft.AspNetCore.Routing.RouteGroupContext.Prefix.init -> void
+Microsoft.AspNetCore.Routing.RouteGroupContext.RouteGroupContext() -> void
Microsoft.AspNetCore.Routing.RouteOptions.SetParameterPolicy(string! token, System.Type! type) -> void
Microsoft.AspNetCore.Routing.RouteOptions.SetParameterPolicy<T>(string! token) -> void
+override Microsoft.AspNetCore.Routing.CompositeEndpointDataSource.GetGroupedEndpoints(Microsoft.AspNetCore.Routing.RouteGroupContext! context) -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Http.Endpoint!>!
+static Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions.MapGroup(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder! endpoints, Microsoft.AspNetCore.Routing.Patterns.RoutePattern! prefix) -> Microsoft.AspNetCore.Routing.RouteGroupBuilder!
+static Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions.MapGroup(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder! endpoints, string! prefix) -> Microsoft.AspNetCore.Routing.RouteGroupBuilder!
static Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions.MapPatch(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder! endpoints, string! pattern, System.Delegate! handler) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
static Microsoft.AspNetCore.Builder.EndpointRouteBuilderExtensions.MapPatch(this Microsoft.AspNetCore.Routing.IEndpointRouteBuilder! endpoints, string! pattern, Microsoft.AspNetCore.Http.RequestDelegate! requestDelegate) -> Microsoft.AspNetCore.Builder.IEndpointConventionBuilder!
override Microsoft.AspNetCore.Routing.RouteValuesAddress.ToString() -> string?
-*REMOVED*~Microsoft.AspNetCore.Routing.DefaultInlineConstraintResolver.DefaultInlineConstraintResolver(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions, System.IServiceProvider! serviceProvider) -> void
-Microsoft.AspNetCore.Routing.DefaultInlineConstraintResolver.DefaultInlineConstraintResolver(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions, System.IServiceProvider! serviceProvider) -> void
-static Microsoft.AspNetCore.Http.RouteHandlerFilterExtensions.AddFilter(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder, Microsoft.AspNetCore.Http.IRouteHandlerFilter! filter) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
-static Microsoft.AspNetCore.Http.RouteHandlerFilterExtensions.AddFilter(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder, System.Func<Microsoft.AspNetCore.Http.RouteHandlerContext!, Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate!, Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate!>! filterFactory) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
-static Microsoft.AspNetCore.Http.RouteHandlerFilterExtensions.AddFilter(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder, System.Func<Microsoft.AspNetCore.Http.RouteHandlerInvocationContext!, Microsoft.AspNetCore.Http.RouteHandlerFilterDelegate!, System.Threading.Tasks.ValueTask<object?>>! routeHandlerFilter) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
-static Microsoft.AspNetCore.Http.RouteHandlerFilterExtensions.AddFilter<TFilterType>(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
-static Microsoft.AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.WithDescription(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder, string! description) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
-static Microsoft.AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.WithSummary(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder, string! summary) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
+static Microsoft.AspNetCore.Http.EndpointFilterExtensions.AddEndpointFilter<TBuilder, TFilterType>(this TBuilder builder) -> TBuilder
+static Microsoft.AspNetCore.Http.EndpointFilterExtensions.AddEndpointFilter<TBuilder>(this TBuilder builder, Microsoft.AspNetCore.Http.IEndpointFilter! filter) -> TBuilder
+static Microsoft.AspNetCore.Http.EndpointFilterExtensions.AddEndpointFilterFactory<TBuilder>(this TBuilder builder, System.Func<Microsoft.AspNetCore.Http.EndpointFilterFactoryContext!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!>! filterFactory) -> TBuilder
+static Microsoft.AspNetCore.Http.EndpointFilterExtensions.AddEndpointFilter<TBuilder>(this TBuilder builder, System.Func<Microsoft.AspNetCore.Http.EndpointFilterInvocationContext!, Microsoft.AspNetCore.Http.EndpointFilterDelegate!, System.Threading.Tasks.ValueTask<object?>>! routeHandlerFilter) -> TBuilder
+static Microsoft.AspNetCore.Http.EndpointFilterExtensions.AddEndpointFilter<TFilterType>(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
+static Microsoft.AspNetCore.Http.EndpointFilterExtensions.AddEndpointFilter<TFilterType>(this Microsoft.AspNetCore.Routing.RouteGroupBuilder! builder) -> Microsoft.AspNetCore.Routing.RouteGroupBuilder!
+static Microsoft.AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.ExcludeFromDescription<TBuilder>(this TBuilder builder) -> TBuilder
+static Microsoft.AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.WithDescription<TBuilder>(this TBuilder builder, string! description) -> TBuilder
+static Microsoft.AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.WithSummary<TBuilder>(this TBuilder builder, string! summary) -> TBuilder
+static Microsoft.AspNetCore.Http.OpenApiRouteHandlerBuilderExtensions.WithTags<TBuilder>(this TBuilder builder, params string![]! tags) -> TBuilder
static Microsoft.AspNetCore.Routing.LinkGeneratorEndpointNameAddressExtensions.GetPathByName(this Microsoft.AspNetCore.Routing.LinkGenerator! generator, Microsoft.AspNetCore.Http.HttpContext! httpContext, string! endpointName, Microsoft.AspNetCore.Routing.RouteValueDictionary? values = null, Microsoft.AspNetCore.Http.PathString? pathBase = null, Microsoft.AspNetCore.Http.FragmentString fragment = default(Microsoft.AspNetCore.Http.FragmentString), Microsoft.AspNetCore.Routing.LinkOptions? options = null) -> string?
static Microsoft.AspNetCore.Routing.LinkGeneratorEndpointNameAddressExtensions.GetPathByName(this Microsoft.AspNetCore.Routing.LinkGenerator! generator, string! endpointName, Microsoft.AspNetCore.Routing.RouteValueDictionary? values = null, Microsoft.AspNetCore.Http.PathString pathBase = default(Microsoft.AspNetCore.Http.PathString), Microsoft.AspNetCore.Http.FragmentString fragment = default(Microsoft.AspNetCore.Http.FragmentString), Microsoft.AspNetCore.Routing.LinkOptions? options = null) -> string?
static Microsoft.AspNetCore.Routing.LinkGeneratorEndpointNameAddressExtensions.GetUriByName(this Microsoft.AspNetCore.Routing.LinkGenerator! generator, Microsoft.AspNetCore.Http.HttpContext! httpContext, string! endpointName, Microsoft.AspNetCore.Routing.RouteValueDictionary? values = null, string? scheme = null, Microsoft.AspNetCore.Http.HostString? host = null, Microsoft.AspNetCore.Http.PathString? pathBase = null, Microsoft.AspNetCore.Http.FragmentString fragment = default(Microsoft.AspNetCore.Http.FragmentString), Microsoft.AspNetCore.Routing.LinkOptions? options = null) -> string?
@@ -21,10 +41,12 @@ static Microsoft.AspNetCore.Routing.LinkGeneratorRouteValuesAddressExtensions.Ge
static Microsoft.AspNetCore.Routing.LinkGeneratorRouteValuesAddressExtensions.GetPathByRouteValues(this Microsoft.AspNetCore.Routing.LinkGenerator! generator, string? routeName, Microsoft.AspNetCore.Routing.RouteValueDictionary? values = null, Microsoft.AspNetCore.Http.PathString pathBase = default(Microsoft.AspNetCore.Http.PathString), Microsoft.AspNetCore.Http.FragmentString fragment = default(Microsoft.AspNetCore.Http.FragmentString), Microsoft.AspNetCore.Routing.LinkOptions? options = null) -> string?
static Microsoft.AspNetCore.Routing.LinkGeneratorRouteValuesAddressExtensions.GetUriByRouteValues(this Microsoft.AspNetCore.Routing.LinkGenerator! generator, Microsoft.AspNetCore.Http.HttpContext! httpContext, string? routeName, Microsoft.AspNetCore.Routing.RouteValueDictionary? values = null, string? scheme = null, Microsoft.AspNetCore.Http.HostString? host = null, Microsoft.AspNetCore.Http.PathString? pathBase = null, Microsoft.AspNetCore.Http.FragmentString fragment = default(Microsoft.AspNetCore.Http.FragmentString), Microsoft.AspNetCore.Routing.LinkOptions? options = null) -> string?
static Microsoft.AspNetCore.Routing.LinkGeneratorRouteValuesAddressExtensions.GetUriByRouteValues(this Microsoft.AspNetCore.Routing.LinkGenerator! generator, string? routeName, Microsoft.AspNetCore.Routing.RouteValueDictionary! values, string! scheme, Microsoft.AspNetCore.Http.HostString host, Microsoft.AspNetCore.Http.PathString pathBase = default(Microsoft.AspNetCore.Http.PathString), Microsoft.AspNetCore.Http.FragmentString fragment = default(Microsoft.AspNetCore.Http.FragmentString), Microsoft.AspNetCore.Routing.LinkOptions? options = null) -> string?
+static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Combine(Microsoft.AspNetCore.Routing.Patterns.RoutePattern? left, Microsoft.AspNetCore.Routing.Patterns.RoutePattern! right) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Parse(string! pattern, Microsoft.AspNetCore.Routing.RouteValueDictionary? defaults, Microsoft.AspNetCore.Routing.RouteValueDictionary? parameterPolicies) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Parse(string! pattern, Microsoft.AspNetCore.Routing.RouteValueDictionary? defaults, Microsoft.AspNetCore.Routing.RouteValueDictionary? parameterPolicies, Microsoft.AspNetCore.Routing.RouteValueDictionary? requiredValues) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Pattern(Microsoft.AspNetCore.Routing.RouteValueDictionary? defaults, Microsoft.AspNetCore.Routing.RouteValueDictionary? parameterPolicies, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Routing.Patterns.RoutePatternPathSegment!>! segments) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Pattern(Microsoft.AspNetCore.Routing.RouteValueDictionary? defaults, Microsoft.AspNetCore.Routing.RouteValueDictionary? parameterPolicies, params Microsoft.AspNetCore.Routing.Patterns.RoutePatternPathSegment![]! segments) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Pattern(string? rawText, Microsoft.AspNetCore.Routing.RouteValueDictionary? defaults, Microsoft.AspNetCore.Routing.RouteValueDictionary? parameterPolicies, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Routing.Patterns.RoutePatternPathSegment!>! segments) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
static Microsoft.AspNetCore.Routing.Patterns.RoutePatternFactory.Pattern(string? rawText, Microsoft.AspNetCore.Routing.RouteValueDictionary? defaults, Microsoft.AspNetCore.Routing.RouteValueDictionary? parameterPolicies, params Microsoft.AspNetCore.Routing.Patterns.RoutePatternPathSegment![]! segments) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern!
+virtual Microsoft.AspNetCore.Routing.EndpointDataSource.GetGroupedEndpoints(Microsoft.AspNetCore.Routing.RouteGroupContext! context) -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Http.Endpoint!>!
virtual Microsoft.AspNetCore.Routing.Patterns.RoutePatternTransformer.SubstituteRequiredValues(Microsoft.AspNetCore.Routing.Patterns.RoutePattern! original, Microsoft.AspNetCore.Routing.RouteValueDictionary! requiredValues) -> Microsoft.AspNetCore.Routing.Patterns.RoutePattern?
diff --git a/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs b/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs
index 88c8f5807a..4751fdbbad 100644
--- a/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs
+++ b/src/Http/Routing/src/RequestDelegateRouteBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Constraints;
@@ -21,7 +22,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapRoute(this IRouteBuilder builder, string template, RequestDelegate handler)
+ public static IRouteBuilder MapRoute(this IRouteBuilder builder, [StringSyntax("Route")] string template, RequestDelegate handler)
{
var route = new Route(
new RouteHandler(handler),
@@ -43,7 +44,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapMiddlewareRoute(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
+ public static IRouteBuilder MapMiddlewareRoute(this IRouteBuilder builder, [StringSyntax("Route")] string template, Action<IApplicationBuilder> action)
{
var nested = builder.ApplicationBuilder.New();
action(nested);
@@ -58,7 +59,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapDelete(this IRouteBuilder builder, string template, RequestDelegate handler)
+ public static IRouteBuilder MapDelete(this IRouteBuilder builder, [StringSyntax("Route")] string template, RequestDelegate handler)
{
return builder.MapVerb("DELETE", template, handler);
}
@@ -71,7 +72,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapMiddlewareDelete(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
+ public static IRouteBuilder MapMiddlewareDelete(this IRouteBuilder builder, [StringSyntax("Route")] string template, Action<IApplicationBuilder> action)
{
return builder.MapMiddlewareVerb("DELETE", template, action);
}
@@ -86,7 +87,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapDelete(
this IRouteBuilder builder,
- string template,
+ [StringSyntax("Route")] string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb("DELETE", template, handler);
@@ -100,7 +101,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapGet(this IRouteBuilder builder, string template, RequestDelegate handler)
+ public static IRouteBuilder MapGet(this IRouteBuilder builder, [StringSyntax("Route")] string template, RequestDelegate handler)
{
return builder.MapVerb(HttpMethods.Get, template, handler);
}
@@ -113,7 +114,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapMiddlewareGet(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
+ public static IRouteBuilder MapMiddlewareGet(this IRouteBuilder builder, [StringSyntax("Route")] string template, Action<IApplicationBuilder> action)
{
return builder.MapMiddlewareVerb(HttpMethods.Get, template, action);
}
@@ -128,7 +129,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapGet(
this IRouteBuilder builder,
- string template,
+ [StringSyntax("Route")] string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb(HttpMethods.Get, template, handler);
@@ -142,7 +143,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapPost(this IRouteBuilder builder, string template, RequestDelegate handler)
+ public static IRouteBuilder MapPost(this IRouteBuilder builder, [StringSyntax("Route")] string template, RequestDelegate handler)
{
return builder.MapVerb(HttpMethods.Post, template, handler);
}
@@ -155,7 +156,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapMiddlewarePost(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
+ public static IRouteBuilder MapMiddlewarePost(this IRouteBuilder builder, [StringSyntax("Route")] string template, Action<IApplicationBuilder> action)
{
return builder.MapMiddlewareVerb(HttpMethods.Post, template, action);
}
@@ -170,7 +171,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapPost(
this IRouteBuilder builder,
- string template,
+ [StringSyntax("Route")] string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb(HttpMethods.Post, template, handler);
@@ -184,7 +185,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="handler">The <see cref="RequestDelegate"/> route handler.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapPut(this IRouteBuilder builder, string template, RequestDelegate handler)
+ public static IRouteBuilder MapPut(this IRouteBuilder builder, [StringSyntax("Route")] string template, RequestDelegate handler)
{
return builder.MapVerb(HttpMethods.Put, template, handler);
}
@@ -197,7 +198,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <param name="template">The route template.</param>
/// <param name="action">The action to apply to the <see cref="IApplicationBuilder"/>.</param>
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
- public static IRouteBuilder MapMiddlewarePut(this IRouteBuilder builder, string template, Action<IApplicationBuilder> action)
+ public static IRouteBuilder MapMiddlewarePut(this IRouteBuilder builder, [StringSyntax("Route")] string template, Action<IApplicationBuilder> action)
{
return builder.MapMiddlewareVerb(HttpMethods.Put, template, action);
}
@@ -212,7 +213,7 @@ public static class RequestDelegateRouteBuilderExtensions
/// <returns>A reference to the <paramref name="builder"/> after this operation has completed.</returns>
public static IRouteBuilder MapPut(
this IRouteBuilder builder,
- string template,
+ [StringSyntax("Route")] string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
return builder.MapVerb(HttpMethods.Put, template, handler);
@@ -230,7 +231,7 @@ public static class RequestDelegateRouteBuilderExtensions
public static IRouteBuilder MapVerb(
this IRouteBuilder builder,
string verb,
- string template,
+ [StringSyntax("Route")] string template,
Func<HttpRequest, HttpResponse, RouteData, Task> handler)
{
RequestDelegate requestDelegate = (httpContext) =>
@@ -253,7 +254,7 @@ public static class RequestDelegateRouteBuilderExtensions
public static IRouteBuilder MapVerb(
this IRouteBuilder builder,
string verb,
- string template,
+ [StringSyntax("Route")] string template,
RequestDelegate handler)
{
var constraints = new RouteValueDictionary
@@ -285,7 +286,7 @@ public static class RequestDelegateRouteBuilderExtensions
public static IRouteBuilder MapMiddlewareVerb(
this IRouteBuilder builder,
string verb,
- string template,
+ [StringSyntax("Route")] string template,
Action<IApplicationBuilder> action)
{
var nested = builder.ApplicationBuilder.New();
diff --git a/src/Http/Routing/src/Resources.resx b/src/Http/Routing/src/Resources.resx
index 3bed95c80f..9b3d90ce5b 100644
--- a/src/Http/Routing/src/Resources.resx
+++ b/src/Http/Routing/src/Resources.resx
@@ -234,4 +234,19 @@
<data name="FormatterMapping_MediaTypeInvalid" xml:space="preserve">
<value>No media type found for format '{0}'.</value>
</data>
+ <data name="MapGroup_ChangingRoutePatternUnsupported" xml:space="preserve">
+ <value>MapGroup does not support mutating RouteEndpointBuilder.RoutePattern from '{0}' to '{1}' via conventions.</value>
+ </data>
+ <data name="MapGroup_CustomEndpointUnsupported" xml:space="preserve">
+ <value>MapGroup does not support custom Endpoint type '{0}'. Only RouteEndpoints can be grouped.</value>
+ </data>
+ <data name="MapGroup_RepeatedDictionaryEntry" xml:space="preserve">
+ <value>MapGroup cannot build a pattern for '{0}' because the 'RoutePattern.{1}' dictionary key '{2}' has multiple values.</value>
+ </data>
+ <data name="RouteEndpointDataSource_ConventionsCannotBeModifiedAfterBuild" xml:space="preserve">
+ <value>Conventions cannot be added after building the endpoint.</value>
+ </data>
+ <data name="RouteEndpointDataSource_RequestDelegateCannotBeCalledBeforeBuild" xml:space="preserve">
+ <value>This RequestDelegate cannot be called before the final endpoint is built.</value>
+ </data>
</root> \ No newline at end of file
diff --git a/src/Http/Routing/src/Route.cs b/src/Http/Routing/src/Route.cs
index 6a27f976f8..fbd8bc0f46 100644
--- a/src/Http/Routing/src/Route.cs
+++ b/src/Http/Routing/src/Route.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
+
namespace Microsoft.AspNetCore.Routing;
/// <summary>
@@ -18,7 +20,7 @@ public class Route : RouteBase
/// <param name="inlineConstraintResolver">An <see cref="IInlineConstraintResolver"/> used for resolving inline constraints.</param>
public Route(
IRouter target,
- string routeTemplate,
+ [StringSyntax("Route")] string routeTemplate,
IInlineConstraintResolver inlineConstraintResolver)
: this(
target,
@@ -41,7 +43,7 @@ public class Route : RouteBase
/// <param name="inlineConstraintResolver">An <see cref="IInlineConstraintResolver"/> used for resolving inline constraints.</param>
public Route(
IRouter target,
- string routeTemplate,
+ [StringSyntax("Route")] string routeTemplate,
RouteValueDictionary? defaults,
IDictionary<string, object>? constraints,
RouteValueDictionary? dataTokens,
@@ -63,7 +65,7 @@ public class Route : RouteBase
public Route(
IRouter target,
string? routeName,
- string? routeTemplate,
+ [StringSyntax("Route")] string? routeTemplate,
RouteValueDictionary? defaults,
IDictionary<string, object>? constraints,
RouteValueDictionary? dataTokens,
diff --git a/src/Http/Routing/src/RouteBase.cs b/src/Http/Routing/src/RouteBase.cs
index 25e5c8f821..e1d4aa34cc 100644
--- a/src/Http/Routing/src/RouteBase.cs
+++ b/src/Http/Routing/src/RouteBase.cs
@@ -32,7 +32,7 @@ public abstract partial class RouteBase : IRouter, INamedRouter
/// <param name="constraints">The constraints for the route.</param>
/// <param name="dataTokens">The data tokens for the route.</param>
public RouteBase(
- string? template,
+ [StringSyntax("Route")] string? template,
string? name,
IInlineConstraintResolver constraintResolver,
RouteValueDictionary? defaults,
diff --git a/src/Http/Routing/src/RouteEndpointBuilder.cs b/src/Http/Routing/src/RouteEndpointBuilder.cs
index add1f849a4..2498426d06 100644
--- a/src/Http/Routing/src/RouteEndpointBuilder.cs
+++ b/src/Http/Routing/src/RouteEndpointBuilder.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Patterns;
@@ -18,7 +19,7 @@ public sealed class RouteEndpointBuilder : EndpointBuilder
public RoutePattern RoutePattern { get; set; }
/// <summary>
- /// Gets or sets the order assigned to the endpoint.
+ /// Gets or sets the order assigned to the endpoint.
/// </summary>
public int Order { get; set; }
@@ -38,24 +39,6 @@ public sealed class RouteEndpointBuilder : EndpointBuilder
Order = order;
}
- /// <summary>
- /// Constructs a new <see cref="RouteEndpointBuilder"/> instance.
- /// </summary>
- /// <param name="routePattern">The <see cref="RoutePattern"/> to use in URL matching.</param>
- /// <param name="order">The order assigned to the endpoint.</param>
- /// <remarks>
- /// This constructor allows the <see cref="RequestDelegate"/> to be added to the
- /// <see cref="RouteEndpointBuilder"/> after construction but before <see cref="Build"/>
- /// is invoked.
- /// </remarks>
- internal RouteEndpointBuilder(
- RoutePattern routePattern,
- int order)
- {
- RoutePattern = routePattern;
- Order = order;
- }
-
/// <inheritdoc />
public override Endpoint Build()
{
@@ -64,13 +47,52 @@ public sealed class RouteEndpointBuilder : EndpointBuilder
throw new InvalidOperationException($"{nameof(RequestDelegate)} must be specified to construct a {nameof(RouteEndpoint)}.");
}
- var routeEndpoint = new RouteEndpoint(
+ return new RouteEndpoint(
RequestDelegate,
RoutePattern,
Order,
- new EndpointMetadataCollection(Metadata),
+ CreateMetadataCollection(Metadata),
DisplayName);
+ }
+
+ private static EndpointMetadataCollection CreateMetadataCollection(IList<object> metadata)
+ {
+ if (metadata.Count > 0)
+ {
+ var hasCorsMetadata = false;
+ IHttpMethodMetadata? httpMethodMetadata = null;
+
+ // Before create the final collection we
+ // need to update the IHttpMethodMetadata if
+ // a CORS metadata is present
+ for (var i = 0; i < metadata.Count; i++)
+ {
+ // Not using else if since a metadata could have both
+ // interfaces.
+
+ if (metadata[i] is IHttpMethodMetadata methodMetadata)
+ {
+ // Storing only the last entry
+ // since the last metadata is the most significant.
+ httpMethodMetadata = methodMetadata;
+ }
+
+ if (!hasCorsMetadata && metadata[i] is ICorsMetadata)
+ {
+ // IEnableCorsAttribute, IDisableCorsAttribute and ICorsPolicyMetadata
+ // are ICorsMetadata
+ hasCorsMetadata = true;
+ }
+ }
+
+ if (hasCorsMetadata && httpMethodMetadata is not null && !httpMethodMetadata.AcceptCorsPreflight)
+ {
+ // Since we found a CORS metadata we will update it
+ // to make sure the acceptCorsPreflight is set to true.
+ httpMethodMetadata.AcceptCorsPreflight = true;
+ }
+ }
- return routeEndpoint;
+ return new EndpointMetadataCollection(metadata);
}
}
diff --git a/src/Http/Routing/src/RouteEndpointDataSource.cs b/src/Http/Routing/src/RouteEndpointDataSource.cs
new file mode 100644
index 0000000000..e6c3599c31
--- /dev/null
+++ b/src/Http/Routing/src/RouteEndpointDataSource.cs
@@ -0,0 +1,319 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing.Patterns;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.Routing;
+
+internal sealed class RouteEndpointDataSource : EndpointDataSource
+{
+ private readonly List<RouteEntry> _routeEntries = new();
+ private readonly IServiceProvider _applicationServices;
+ private readonly bool _throwOnBadRequest;
+
+ public RouteEndpointDataSource(IServiceProvider applicationServices, bool throwOnBadRequest)
+ {
+ _applicationServices = applicationServices;
+ _throwOnBadRequest = throwOnBadRequest;
+ }
+
+ public RouteHandlerBuilder AddRequestDelegate(
+ RoutePattern pattern,
+ RequestDelegate requestDelegate,
+ IEnumerable<string>? httpMethods)
+ {
+
+ var conventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();
+ var finallyConventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();
+
+ _routeEntries.Add(new()
+ {
+ RoutePattern = pattern,
+ RouteHandler = requestDelegate,
+ HttpMethods = httpMethods,
+ RouteAttributes = RouteAttributes.None,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions
+ });
+
+ return new RouteHandlerBuilder(conventions, finallyConventions);
+ }
+
+ public RouteHandlerBuilder AddRouteHandler(
+ RoutePattern pattern,
+ Delegate routeHandler,
+ IEnumerable<string>? httpMethods,
+ bool isFallback)
+ {
+ var conventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();
+ var finallyConventions = new ThrowOnAddAfterEndpointBuiltConventionCollection();
+
+ var routeAttributes = RouteAttributes.RouteHandler;
+ if (isFallback)
+ {
+ routeAttributes |= RouteAttributes.Fallback;
+ }
+
+ _routeEntries.Add(new()
+ {
+ RoutePattern = pattern,
+ RouteHandler = routeHandler,
+ HttpMethods = httpMethods,
+ RouteAttributes = routeAttributes,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions
+ });
+
+ return new RouteHandlerBuilder(conventions, finallyConventions);
+ }
+
+ public override IReadOnlyList<RouteEndpoint> Endpoints
+ {
+ get
+ {
+ var endpoints = new RouteEndpoint[_routeEntries.Count];
+ for (int i = 0; i < _routeEntries.Count; i++)
+ {
+ endpoints[i] = (RouteEndpoint)CreateRouteEndpointBuilder(_routeEntries[i]).Build();
+ }
+ return endpoints;
+ }
+ }
+
+ public override IReadOnlyList<RouteEndpoint> GetGroupedEndpoints(RouteGroupContext context)
+ {
+ var endpoints = new RouteEndpoint[_routeEntries.Count];
+ for (int i = 0; i < _routeEntries.Count; i++)
+ {
+ endpoints[i] = (RouteEndpoint)CreateRouteEndpointBuilder(_routeEntries[i], context.Prefix, context.Conventions, context.FinallyConventions).Build();
+ }
+ return endpoints;
+ }
+
+ public override IChangeToken GetChangeToken() => NullChangeToken.Singleton;
+
+ // For testing
+ internal RouteEndpointBuilder GetSingleRouteEndpointBuilder()
+ {
+ if (_routeEntries.Count is not 1)
+ {
+ throw new InvalidOperationException($"There are {_routeEntries.Count} endpoints defined! This can only be called for a single endpoint.");
+ }
+
+ return CreateRouteEndpointBuilder(_routeEntries[0]);
+ }
+
+ [UnconditionalSuppressMessage("Trimmer", "IL2026",
+ Justification = "We surface a RequireUnreferencedCode in the call to the Map method adding this EndpointDataSource. The trimmer is unable to infer this.")]
+ private RouteEndpointBuilder CreateRouteEndpointBuilder(
+ RouteEntry entry, RoutePattern? groupPrefix = null, IReadOnlyList<Action<EndpointBuilder>>? groupConventions = null, IReadOnlyList<Action<EndpointBuilder>>? groupFinallyConventions = null)
+ {
+ var pattern = RoutePatternFactory.Combine(groupPrefix, entry.RoutePattern);
+ var handler = entry.RouteHandler;
+ var isRouteHandler = (entry.RouteAttributes & RouteAttributes.RouteHandler) == RouteAttributes.RouteHandler;
+ var isFallback = (entry.RouteAttributes & RouteAttributes.Fallback) == RouteAttributes.Fallback;
+
+ // The Map methods don't support customizing the order apart from using int.MaxValue to give MapFallback the lowest priority.
+ // Otherwise, we always use the default of 0 unless a convention changes it later.
+ var order = isFallback ? int.MaxValue : 0;
+ var displayName = pattern.RawText ?? pattern.DebuggerToString();
+
+ // Don't include the method name for non-route-handlers because the name is just "Invoke" when built from
+ // ApplicationBuilder.Build(). This was observed in MapSignalRTests and is not very useful. Maybe if we come up
+ // with a better heuristic for what a useful method name is, we could use it for everything. Inline lambdas are
+ // compiler generated methods so they are filtered out even for route handlers.
+ if (isRouteHandler && TypeHelper.TryGetNonCompilerGeneratedMethodName(handler.Method, out var methodName))
+ {
+ displayName = $"{displayName} => {methodName}";
+ }
+
+ if (entry.HttpMethods is not null)
+ {
+ // Prepends the HTTP method to the DisplayName produced with pattern + method name
+ displayName = $"HTTP: {string.Join(", ", entry.HttpMethods)} {displayName}";
+ }
+
+ if (isFallback)
+ {
+ displayName = $"Fallback {displayName}";
+ }
+
+ // If we're not a route handler, we started with a fully realized (although unfiltered) RequestDelegate, so we can just redirect to that
+ // while running any conventions. We'll put the original back if it remains unfiltered right before building the endpoint.
+ RequestDelegate? factoryCreatedRequestDelegate = isRouteHandler ? null : (RequestDelegate)entry.RouteHandler;
+
+ // Let existing conventions capture and call into builder.RequestDelegate as long as they do so after it has been created.
+ RequestDelegate redirectRequestDelegate = context =>
+ {
+ if (factoryCreatedRequestDelegate is null)
+ {
+ throw new InvalidOperationException(Resources.RouteEndpointDataSource_RequestDelegateCannotBeCalledBeforeBuild);
+ }
+
+ return factoryCreatedRequestDelegate(context);
+ };
+
+ // Add MethodInfo and HttpMethodMetadata (if any) as first metadata items as they are intrinsic to the route much like
+ // the pattern or default display name. This gives visibility to conventions like WithOpenApi() to intrinsic route details
+ // (namely the MethodInfo) even when applied early as group conventions.
+ RouteEndpointBuilder builder = new(redirectRequestDelegate, pattern, order)
+ {
+ DisplayName = displayName,
+ ApplicationServices = _applicationServices,
+ Metadata = { handler.Method },
+ };
+
+ if (entry.HttpMethods is not null)
+ {
+ builder.Metadata.Add(new HttpMethodMetadata(entry.HttpMethods));
+ }
+
+ // Apply group conventions before entry-specific conventions added to the RouteHandlerBuilder.
+ if (groupConventions is not null)
+ {
+ foreach (var groupConvention in groupConventions)
+ {
+ groupConvention(builder);
+ }
+ }
+
+ // Add delegate attributes as metadata before entry-specific conventions but after group conventions.
+ var attributes = handler.Method.GetCustomAttributes();
+ if (attributes is not null)
+ {
+ foreach (var attribute in attributes)
+ {
+ builder.Metadata.Add(attribute);
+ }
+ }
+
+ entry.Conventions.IsReadOnly = true;
+ foreach (var entrySpecificConvention in entry.Conventions)
+ {
+ entrySpecificConvention(builder);
+ }
+
+ if (isRouteHandler || builder.FilterFactories.Count > 0)
+ {
+ var routeParamNames = new List<string>(pattern.Parameters.Count);
+ foreach (var parameter in pattern.Parameters)
+ {
+ routeParamNames.Add(parameter.Name);
+ }
+
+ RequestDelegateFactoryOptions factoryOptions = new()
+ {
+ ServiceProvider = _applicationServices,
+ RouteParameterNames = routeParamNames,
+ ThrowOnBadRequest = _throwOnBadRequest,
+ DisableInferBodyFromParameters = ShouldDisableInferredBodyParameters(entry.HttpMethods),
+ EndpointMetadata = builder.Metadata,
+ EndpointFilterFactories = builder.FilterFactories.AsReadOnly(),
+ };
+
+ // We ignore the returned EndpointMetadata has been already populated since we passed in non-null EndpointMetadata.
+ factoryCreatedRequestDelegate = RequestDelegateFactory.Create(entry.RouteHandler, factoryOptions).RequestDelegate;
+ }
+
+ if (ReferenceEquals(builder.RequestDelegate, redirectRequestDelegate))
+ {
+ // No convention has changed builder.RequestDelegate, so we can just replace it with the final version as an optimization.
+ // We still set factoryRequestDelegate in case something is still referencing the redirected version of the RequestDelegate.
+ builder.RequestDelegate = factoryCreatedRequestDelegate;
+ }
+
+ entry.FinallyConventions.IsReadOnly = true;
+ foreach (var entryFinallyConvention in entry.FinallyConventions)
+ {
+ entryFinallyConvention(builder);
+ }
+
+ if (groupFinallyConventions is not null)
+ {
+ // Group conventions are ordered by the RouteGroupBuilder before
+ // being provided here.
+ foreach (var groupFinallyConvention in groupFinallyConventions)
+ {
+ groupFinallyConvention(builder);
+ }
+ }
+
+ return builder;
+ }
+
+ private static bool ShouldDisableInferredBodyParameters(IEnumerable<string>? httpMethods)
+ {
+ static bool ShouldDisableInferredBodyForMethod(string method) =>
+ // GET, DELETE, HEAD, CONNECT, TRACE, and OPTIONS normally do not contain bodies
+ method.Equals(HttpMethods.Get, StringComparison.Ordinal) ||
+ method.Equals(HttpMethods.Delete, StringComparison.Ordinal) ||
+ method.Equals(HttpMethods.Head, StringComparison.Ordinal) ||
+ method.Equals(HttpMethods.Options, StringComparison.Ordinal) ||
+ method.Equals(HttpMethods.Trace, StringComparison.Ordinal) ||
+ method.Equals(HttpMethods.Connect, StringComparison.Ordinal);
+
+ // If the endpoint accepts any kind of request, we should still infer parameters can come from the body.
+ if (httpMethods is null)
+ {
+ return false;
+ }
+
+ foreach (var method in httpMethods)
+ {
+ if (ShouldDisableInferredBodyForMethod(method))
+ {
+ // If the route handler was mapped explicitly to handle an HTTP method that does not normally have a request body,
+ // we assume any invocation of the handler will not have a request body no matter what other HTTP methods it may support.
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private struct RouteEntry
+ {
+ public RoutePattern RoutePattern { get; init; }
+ public Delegate RouteHandler { get; init; }
+ public IEnumerable<string>? HttpMethods { get; init; }
+ public RouteAttributes RouteAttributes { get; init; }
+ public ThrowOnAddAfterEndpointBuiltConventionCollection Conventions { get; init; }
+ public ThrowOnAddAfterEndpointBuiltConventionCollection FinallyConventions { get; init; }
+ }
+
+ [Flags]
+ private enum RouteAttributes
+ {
+ // The endpoint was defined by a RequestDelegate, RequestDelegateFactory.Create() should be skipped unless there are endpoint filters.
+ None = 0,
+ // This was added as Delegate route handler, so RequestDelegateFactory.Create() should always be called.
+ RouteHandler = 1,
+ // This was added by MapFallback.
+ Fallback = 2,
+ }
+
+ // This private class is only exposed to internal code via ICollection<Action<EndpointBuilder>> in RouteEndpointBuilder where only Add is called.
+ private sealed class ThrowOnAddAfterEndpointBuiltConventionCollection : List<Action<EndpointBuilder>>, ICollection<Action<EndpointBuilder>>
+ {
+ // We throw if someone tries to add conventions to the RouteEntry after endpoints have already been resolved meaning the conventions
+ // will not be observed given RouteEndpointDataSource is not meant to be dynamic and uses NullChangeToken.Singleton.
+ public bool IsReadOnly { get; set; }
+
+ void ICollection<Action<EndpointBuilder>>.Add(Action<EndpointBuilder> convention)
+ {
+ if (IsReadOnly)
+ {
+ throw new InvalidOperationException(Resources.RouteEndpointDataSource_ConventionsCannotBeModifiedAfterBuild);
+ }
+
+ Add(convention);
+ }
+ }
+}
diff --git a/src/Http/Routing/src/RouteGroupBuilder.cs b/src/Http/Routing/src/RouteGroupBuilder.cs
new file mode 100644
index 0000000000..513ff3651b
--- /dev/null
+++ b/src/Http/Routing/src/RouteGroupBuilder.cs
@@ -0,0 +1,131 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing.Patterns;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.Routing;
+
+/// <summary>
+/// A builder for defining groups of endpoints with a common prefix that implements both the <see cref="IEndpointRouteBuilder"/>
+/// and <see cref="IEndpointConventionBuilder"/> interfaces. This can be used to add endpoints with the prefix defined by
+/// <see cref="EndpointRouteBuilderExtensions.MapGroup(Microsoft.AspNetCore.Routing.IEndpointRouteBuilder, RoutePattern)"/>
+/// and to customize those endpoints using conventions.
+/// </summary>
+public sealed class RouteGroupBuilder : IEndpointRouteBuilder, IEndpointConventionBuilder
+{
+ private readonly IEndpointRouteBuilder _outerEndpointRouteBuilder;
+ private readonly RoutePattern _partialPrefix;
+
+ private readonly List<EndpointDataSource> _dataSources = new();
+ private readonly List<Action<EndpointBuilder>> _conventions = new();
+ private readonly List<Action<EndpointBuilder>> _finallyConventions = new();
+
+ internal RouteGroupBuilder(IEndpointRouteBuilder outerEndpointRouteBuilder, RoutePattern partialPrefix)
+ {
+ _outerEndpointRouteBuilder = outerEndpointRouteBuilder;
+ _partialPrefix = partialPrefix;
+ _outerEndpointRouteBuilder.DataSources.Add(new GroupEndpointDataSource(this));
+ }
+
+ IServiceProvider IEndpointRouteBuilder.ServiceProvider => _outerEndpointRouteBuilder.ServiceProvider;
+ IApplicationBuilder IEndpointRouteBuilder.CreateApplicationBuilder() => _outerEndpointRouteBuilder.CreateApplicationBuilder();
+ ICollection<EndpointDataSource> IEndpointRouteBuilder.DataSources => _dataSources;
+ void IEndpointConventionBuilder.Add(Action<EndpointBuilder> convention) => _conventions.Add(convention);
+ void IEndpointConventionBuilder.Finally(Action<EndpointBuilder> finalConvention) => _finallyConventions.Add(finalConvention);
+
+ private sealed class GroupEndpointDataSource : EndpointDataSource, IDisposable
+ {
+ private readonly RouteGroupBuilder _routeGroupBuilder;
+ private CompositeEndpointDataSource? _compositeDataSource;
+
+ public GroupEndpointDataSource(RouteGroupBuilder groupRouteBuilder)
+ {
+ _routeGroupBuilder = groupRouteBuilder;
+ }
+
+ public override IReadOnlyList<Endpoint> Endpoints =>
+ GetGroupedEndpointsWithNullablePrefix(null, Array.Empty<Action<EndpointBuilder>>(),
+ Array.Empty<Action<EndpointBuilder>>(), _routeGroupBuilder._outerEndpointRouteBuilder.ServiceProvider);
+
+ public override IReadOnlyList<Endpoint> GetGroupedEndpoints(RouteGroupContext context) =>
+ GetGroupedEndpointsWithNullablePrefix(context.Prefix, context.Conventions, context.FinallyConventions, context.ApplicationServices);
+
+ public IReadOnlyList<Endpoint> GetGroupedEndpointsWithNullablePrefix(
+ RoutePattern? prefix,
+ IReadOnlyList<Action<EndpointBuilder>> conventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IServiceProvider applicationServices)
+ {
+ return _routeGroupBuilder._dataSources.Count switch
+ {
+ 0 => Array.Empty<Endpoint>(),
+ 1 => _routeGroupBuilder._dataSources[0].GetGroupedEndpoints(GetNextRouteGroupContext(prefix, conventions, finallyConventions, applicationServices)),
+ _ => SelectEndpointsFromAllDataSources(GetNextRouteGroupContext(prefix, conventions, finallyConventions, applicationServices)),
+ };
+ }
+
+ public override IChangeToken GetChangeToken() => _routeGroupBuilder._dataSources.Count switch
+ {
+ 0 => NullChangeToken.Singleton,
+ 1 => _routeGroupBuilder._dataSources[0].GetChangeToken(),
+ _ => GetCompositeChangeToken(),
+ };
+
+ public void Dispose()
+ {
+ _compositeDataSource?.Dispose();
+
+ foreach (var dataSource in _routeGroupBuilder._dataSources)
+ {
+ (dataSource as IDisposable)?.Dispose();
+ }
+ }
+
+ private RouteGroupContext GetNextRouteGroupContext(
+ RoutePattern? prefix,
+ IReadOnlyList<Action<EndpointBuilder>> conventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IServiceProvider applicationServices)
+ {
+ var fullPrefix = RoutePatternFactory.Combine(prefix, _routeGroupBuilder._partialPrefix);
+ // Apply conventions passed in from the outer group first so their metadata is added earlier in the list at a lower precedent.
+ var combinedConventions = RoutePatternFactory.CombineLists(conventions, _routeGroupBuilder._conventions);
+ var combinedFinallyConventions = RoutePatternFactory.CombineLists(_routeGroupBuilder._finallyConventions, finallyConventions);
+ return new RouteGroupContext
+ {
+ Prefix = fullPrefix,
+ Conventions = combinedConventions,
+ FinallyConventions = combinedFinallyConventions,
+ ApplicationServices = applicationServices
+ };
+ }
+
+ private IReadOnlyList<Endpoint> SelectEndpointsFromAllDataSources(RouteGroupContext context)
+ {
+ var groupedEndpoints = new List<Endpoint>();
+
+ foreach (var dataSource in _routeGroupBuilder._dataSources)
+ {
+ groupedEndpoints.AddRange(dataSource.GetGroupedEndpoints(context));
+ }
+
+ return groupedEndpoints;
+ }
+
+ private IChangeToken GetCompositeChangeToken()
+ {
+ // We are not guarding against concurrent RouteGroupBuilder._dataSources mutation.
+ // This is only to avoid double initialization of _compositeDataSource if GetChangeToken() is called concurrently.
+ lock (_routeGroupBuilder._dataSources)
+ {
+ _compositeDataSource ??= new CompositeEndpointDataSource(_routeGroupBuilder._dataSources);
+ }
+
+ return _compositeDataSource.GetChangeToken();
+ }
+ }
+}
diff --git a/src/Http/Routing/src/RouteGroupContext.cs b/src/Http/Routing/src/RouteGroupContext.cs
new file mode 100644
index 0000000000..558820c0e3
--- /dev/null
+++ b/src/Http/Routing/src/RouteGroupContext.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Routing.Patterns;
+
+namespace Microsoft.AspNetCore.Routing;
+
+/// <summary>
+/// Represents the information accessible to <see cref="EndpointDataSource.GetGroupedEndpoints(RouteGroupContext)"/>.
+/// </summary>
+public sealed class RouteGroupContext
+{
+ /// <summary>
+ /// Gets the <see cref="RouteEndpoint.RoutePattern"/> which should prefix the <see cref="RouteEndpoint.RoutePattern"/> of all <see cref="RouteEndpoint"/> instances
+ /// returned by the call to <see cref="EndpointDataSource.GetGroupedEndpoints(RouteGroupContext)"/>. This accounts for nested groups and gives the full group prefix
+ /// not just the prefix supplied to the innermost call to <see cref="EndpointRouteBuilderExtensions.MapGroup(IEndpointRouteBuilder, RoutePattern)"/>.
+ /// </summary>
+ public required RoutePattern Prefix { get; init; }
+
+ /// <summary>
+ /// Gets all conventions added to ancestor <see cref="RouteGroupBuilder"/> instances returned from <see cref="EndpointRouteBuilderExtensions.MapGroup(IEndpointRouteBuilder, RoutePattern)"/>
+ /// via <see cref="IEndpointConventionBuilder.Add(Action{EndpointBuilder})"/>. These should be applied in order when building every <see cref="RouteEndpoint"/>
+ /// returned from <see cref="EndpointDataSource.GetGroupedEndpoints(RouteGroupContext)"/>.
+ /// </summary>
+ public IReadOnlyList<Action<EndpointBuilder>> Conventions { get; init; } = Array.Empty<Action<EndpointBuilder>>();
+
+ /// <summary>
+ /// Gets all conventions added to ancestor <see cref="RouteGroupBuilder"/> instances returned from <see cref="EndpointRouteBuilderExtensions.MapGroup(IEndpointRouteBuilder, RoutePattern)"/>
+ /// via <see cref="IEndpointConventionBuilder.Add(Action{EndpointBuilder})"/>. These should be applied in LIFO order when building every <see cref="RouteEndpoint"/>
+ /// returned from <see cref="EndpointDataSource.GetGroupedEndpoints(RouteGroupContext)"/>.
+ /// </summary>
+ public IReadOnlyList<Action<EndpointBuilder>> FinallyConventions { get; init; } = Array.Empty<Action<EndpointBuilder>>();
+
+ /// <summary>
+ /// Gets the <see cref="IServiceProvider"/> instance used to access application services.
+ /// </summary>
+ public IServiceProvider ApplicationServices { get; init; } = EmptyServiceProvider.Instance;
+
+ private sealed class EmptyServiceProvider : IServiceProvider
+ {
+ public static EmptyServiceProvider Instance { get; } = new EmptyServiceProvider();
+ public object? GetService(Type serviceType) => null;
+ }
+}
diff --git a/src/Http/Routing/src/RouteOptions.cs b/src/Http/Routing/src/RouteOptions.cs
index ce7474c380..a1ef1ac8d1 100644
--- a/src/Http/Routing/src/RouteOptions.cs
+++ b/src/Http/Routing/src/RouteOptions.cs
@@ -70,7 +70,7 @@ public class RouteOptions
/// </summary>
public IDictionary<string, Type> ConstraintMap
{
- [RequiresUnreferencedCode($"The linker cannot determine what constraints are being added via the ConstraintMap property. Prefer {nameof(RouteOptions)}.{nameof(SetParameterPolicy)} instead for setting constraints. This warning can be suppressed if this property is being used to read of delete constraints.")]
+ [RequiresUnreferencedCode($"The linker cannot determine what constraints are being added via the ConstraintMap property. Prefer {nameof(RouteOptions)}.{nameof(SetParameterPolicy)} instead for setting constraints. This warning can be suppressed if this property is being used to read or delete constraints.")]
get
{
return _constraintTypeMap;
diff --git a/src/Http/Routing/src/RouteValuesAddressScheme.cs b/src/Http/Routing/src/RouteValuesAddressScheme.cs
index d299f5838f..95901f5153 100644
--- a/src/Http/Routing/src/RouteValuesAddressScheme.cs
+++ b/src/Http/Routing/src/RouteValuesAddressScheme.cs
@@ -169,7 +169,7 @@ internal sealed class RouteValuesAddressScheme : IEndpointAddressScheme<RouteVal
_cache.Dispose();
}
- internal class StateEntry
+ internal sealed class StateEntry
{
// For testing
public readonly List<OutboundMatch> MatchesWithRequiredValues;
diff --git a/src/Http/Routing/src/RoutingMarkerService.cs b/src/Http/Routing/src/RoutingMarkerService.cs
index b529fac658..6ecb681a49 100644
--- a/src/Http/Routing/src/RoutingMarkerService.cs
+++ b/src/Http/Routing/src/RoutingMarkerService.cs
@@ -9,6 +9,6 @@ namespace Microsoft.AspNetCore.Routing;
/// A marker class used to determine if all the routing services were added
/// to the <see cref="IServiceCollection"/> before routing is configured.
/// </summary>
-internal class RoutingMarkerService
+internal sealed class RoutingMarkerService
{
}
diff --git a/src/Http/Routing/src/Template/TemplateBinder.cs b/src/Http/Routing/src/Template/TemplateBinder.cs
index 55f508426a..574e6f0edc 100644
--- a/src/Http/Routing/src/Template/TemplateBinder.cs
+++ b/src/Http/Routing/src/Template/TemplateBinder.cs
@@ -745,7 +745,7 @@ public class TemplateBinder
// This represents an 'explicit null' in the slots array.
[DebuggerDisplay("explicit null")]
- private class SentinullValue
+ private sealed class SentinullValue
{
public static object Instance = new SentinullValue();
diff --git a/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs b/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs
index 109afdb9ff..8d517606bb 100644
--- a/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs
+++ b/src/Http/Routing/src/Tree/LinkGenerationDecisionTree.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Routing.Tree;
// A decision tree that matches link generation entries based on route data.
[DebuggerDisplay("{DebuggerDisplayString,nq}")]
-internal class LinkGenerationDecisionTree
+internal sealed class LinkGenerationDecisionTree
{
// Fallback value for cases where the ambient values weren't provided.
//
@@ -167,7 +167,7 @@ internal class LinkGenerationDecisionTree
}
}
- private class OutboundMatchClassifier : IClassifier<OutboundMatch>
+ private sealed class OutboundMatchClassifier : IClassifier<OutboundMatch>
{
public IEqualityComparer<object> ValueComparer => RouteValueEqualityComparer.Default;
@@ -183,7 +183,7 @@ internal class LinkGenerationDecisionTree
}
}
- private class OutboundMatchResultComparer : IComparer<OutboundMatchResult>
+ private sealed class OutboundMatchResultComparer : IComparer<OutboundMatchResult>
{
public static readonly OutboundMatchResultComparer Instance = new OutboundMatchResultComparer();
diff --git a/src/Http/Routing/src/UriBuilderContextPooledObjectPolicy.cs b/src/Http/Routing/src/UriBuilderContextPooledObjectPolicy.cs
index b9df322028..19a368cf33 100644
--- a/src/Http/Routing/src/UriBuilderContextPooledObjectPolicy.cs
+++ b/src/Http/Routing/src/UriBuilderContextPooledObjectPolicy.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.ObjectPool;
namespace Microsoft.AspNetCore.Routing;
-internal class UriBuilderContextPooledObjectPolicy : IPooledObjectPolicy<UriBuildingContext>
+internal sealed class UriBuilderContextPooledObjectPolicy : IPooledObjectPolicy<UriBuildingContext>
{
public UriBuildingContext Create()
{
diff --git a/src/Http/Routing/test/FunctionalTests/EndpointRoutingIntegrationTest.cs b/src/Http/Routing/test/FunctionalTests/EndpointRoutingIntegrationTest.cs
index db5be24fed..fddf3b5e5f 100644
--- a/src/Http/Routing/test/FunctionalTests/EndpointRoutingIntegrationTest.cs
+++ b/src/Http/Routing/test/FunctionalTests/EndpointRoutingIntegrationTest.cs
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Routing.FunctionalTests;
@@ -277,6 +278,42 @@ public class EndpointRoutingIntegrationTest
}
[Fact]
+ public async Task CorsMiddleware_WithCorsEndpoint_PreflightRequest()
+ {
+ // Arrange
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .Configure(app =>
+ {
+ app.UseRouting();
+ app.UseCors();
+ app.UseEndpoints(b => b.MapPut("/", TestDelegate).RequireCors(policy => policy.AllowAnyOrigin().AllowAnyMethod()));
+ })
+ .UseTestServer();
+ })
+ .ConfigureServices(services =>
+ {
+ services.AddCors();
+ services.AddRouting();
+ })
+ .Build();
+
+ using var server = host.GetTestServer();
+
+ await host.StartAsync();
+
+ var request = server.CreateRequest("/");
+ request.AddHeader(HeaderNames.Origin, "http://testlocation.com");
+ request.AddHeader(HeaderNames.AccessControlRequestMethod, HttpMethods.Put);
+
+ var response = await request.SendAsync(HttpMethods.Options);
+
+ response.EnsureSuccessStatusCode();
+ }
+
+ [Fact]
public async Task CorsMiddleware_ConfiguredBeforeRouting_Throws()
{
// Arrange
diff --git a/src/Http/Routing/test/FunctionalTests/RouteHandlerTest.cs b/src/Http/Routing/test/FunctionalTests/RouteHandlerTest.cs
index f3eff1389c..74e5568ffd 100644
--- a/src/Http/Routing/test/FunctionalTests/RouteHandlerTest.cs
+++ b/src/Http/Routing/test/FunctionalTests/RouteHandlerTest.cs
@@ -3,13 +3,16 @@
#nullable enable
+using System.Net;
using System.Net.Http.Json;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Routing.FunctionalTests;
@@ -56,10 +59,72 @@ public class RouteHandlerTest
Assert.Equal(42, echoedTodo?.Id);
}
+ [Fact]
+ public async Task CustomEndpointDataSource_IsDisposedIfResolved()
+ {
+ var testDisposeDataSource = new TestDisposeEndpointDataSource();
+ var testGroupDisposeDataSource = new TestDisposeEndpointDataSource();
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .Configure(app =>
+ {
+ app.UseRouting();
+ app.UseEndpoints(b =>
+ {
+ b.DataSources.Add(testDisposeDataSource);
+
+ var group = b.MapGroup("");
+ ((IEndpointRouteBuilder)group).DataSources.Add(testGroupDisposeDataSource);
+ });
+ })
+ .UseTestServer();
+ })
+ .ConfigureServices(services =>
+ {
+ services.AddRouting();
+ })
+ .Build();
+
+ using var server = host.GetTestServer();
+ await host.StartAsync();
+
+ // Make a request to ensure data sources are resolved.
+ var client = server.CreateClient();
+ var response = await client.GetAsync("/");
+ // We didn't define any endpoints.
+ Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
+
+ Assert.False(testDisposeDataSource.IsDisposed);
+ Assert.False(testGroupDisposeDataSource.IsDisposed);
+
+ await host.StopAsync();
+ host.Dispose();
+
+ Assert.True(testDisposeDataSource.IsDisposed);
+ Assert.True(testGroupDisposeDataSource.IsDisposed);
+ }
+
private record Todo
{
public int Id { get; set; }
public string Name { get; set; } = "Todo";
public bool IsComplete { get; set; }
}
+
+ private class TestDisposeEndpointDataSource : EndpointDataSource, IDisposable
+ {
+ public bool IsDisposed { get; private set; }
+
+ public override IReadOnlyList<Endpoint> Endpoints => Array.Empty<Endpoint>();
+
+ public override IChangeToken GetChangeToken() => NullChangeToken.Singleton;
+
+ public void Dispose()
+ {
+ IsDisposed = true;
+ }
+ }
}
diff --git a/src/Http/Routing/test/UnitTests/Builder/EndpointRoutingApplicationBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/EndpointRoutingApplicationBuilderExtensionsTest.cs
index 9caac8465e..bd352464d1 100644
--- a/src/Http/Routing/test/UnitTests/Builder/EndpointRoutingApplicationBuilderExtensionsTest.cs
+++ b/src/Http/Routing/test/UnitTests/Builder/EndpointRoutingApplicationBuilderExtensionsTest.cs
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Routing.Matching;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.AspNetCore.Routing.TestObjects;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Moq;
@@ -359,6 +360,7 @@ public class EndpointRoutingApplicationBuilderExtensionsTest
var listener = new DiagnosticListener("Microsoft.AspNetCore");
services.AddSingleton(listener);
services.AddSingleton<DiagnosticSource>(listener);
+ services.AddSingleton(Mock.Of<IHostEnvironment>());
var serviceProvder = services.BuildServiceProvider();
diff --git a/src/Http/Routing/test/UnitTests/Builder/GroupTest.cs b/src/Http/Routing/test/UnitTests/Builder/GroupTest.cs
new file mode 100644
index 0000000000..53ae8cae1c
--- /dev/null
+++ b/src/Http/Routing/test/UnitTests/Builder/GroupTest.cs
@@ -0,0 +1,399 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#nullable enable
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Routing.Patterns;
+using Microsoft.AspNetCore.Routing.TestObjects;
+using Microsoft.Extensions.Primitives;
+using Moq;
+
+namespace Microsoft.AspNetCore.Builder;
+
+public class GroupTest
+{
+ private EndpointDataSource GetEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder)
+ {
+ return Assert.IsAssignableFrom<EndpointDataSource>(Assert.Single(endpointRouteBuilder.DataSources));
+ }
+
+ [Fact]
+ public async Task Prefix_CanBeEmpty()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ var group = builder.MapGroup("");
+
+ group.MapGet("/{id}", (int id, HttpContext httpContext) =>
+ {
+ httpContext.Items["id"] = id;
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+ var routeEndpoint = Assert.IsType<RouteEndpoint>(endpoint);
+
+ var methodMetadata = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>();
+ Assert.NotNull(methodMetadata);
+ var method = Assert.Single(methodMetadata!.HttpMethods);
+ Assert.Equal("GET", method);
+
+ Assert.Equal("HTTP: GET /{id}", endpoint.DisplayName);
+ Assert.Equal("/{id}", routeEndpoint.RoutePattern.RawText);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues["id"] = "42";
+
+ await endpoint.RequestDelegate!(httpContext);
+
+ Assert.Equal(42, httpContext.Items["id"]);
+ }
+
+ [Fact]
+ public async Task PrefixWithRouteParameter_CanBeUsed()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ var group = builder.MapGroup("/{org}");
+
+ group.MapGet("/{id}", (string org, int id, HttpContext httpContext) =>
+ {
+ httpContext.Items["org"] = org;
+ httpContext.Items["id"] = id;
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+ var routeEndpoint = Assert.IsType<RouteEndpoint>(endpoint);
+
+ var methodMetadata = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>();
+ Assert.NotNull(methodMetadata);
+ var method = Assert.Single(methodMetadata!.HttpMethods);
+ Assert.Equal("GET", method);
+
+ Assert.Equal("HTTP: GET /{org}/{id}", endpoint.DisplayName);
+ Assert.Equal("/{org}/{id}", routeEndpoint.RoutePattern.RawText);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues["org"] = "dotnet";
+ httpContext.Request.RouteValues["id"] = "42";
+
+ await endpoint.RequestDelegate!(httpContext);
+
+ Assert.Equal("dotnet", httpContext.Items["org"]);
+ Assert.Equal(42, httpContext.Items["id"]);
+ }
+
+ [Fact]
+ public async Task NestedPrefixWithRouteParameters_CanBeUsed()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ var group = builder.MapGroup("/{org}").MapGroup("/{id}");
+
+ group.MapGet("/", (string org, int id, HttpContext httpContext) =>
+ {
+ httpContext.Items["org"] = org;
+ httpContext.Items["id"] = id;
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+ var routeEndpoint = Assert.IsType<RouteEndpoint>(endpoint);
+
+ var methodMetadata = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>();
+ Assert.NotNull(methodMetadata);
+ var method = Assert.Single(methodMetadata!.HttpMethods);
+ Assert.Equal("GET", method);
+
+ Assert.Equal("HTTP: GET /{org}/{id}/", endpoint.DisplayName);
+ Assert.Equal("/{org}/{id}/", routeEndpoint.RoutePattern.RawText);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.RouteValues["org"] = "dotnet";
+ httpContext.Request.RouteValues["id"] = "42";
+
+ await endpoint.RequestDelegate!(httpContext);
+
+ Assert.Equal("dotnet", httpContext.Items["org"]);
+ Assert.Equal(42, httpContext.Items["id"]);
+ }
+
+ [Fact]
+ public void RepeatedRouteParameter_ThrowsRoutePatternException()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ builder.MapGroup("/{ID}").MapGroup("/{id}").MapGet("/", () => { });
+
+ var ex = Assert.Throws<RoutePatternException>(() => builder.DataSources.Single().Endpoints);
+
+ Assert.Equal("/{ID}/{id}", ex.Pattern);
+ Assert.Equal("The route parameter name 'id' appears more than one time in the route template.", ex.Message);
+ }
+
+ [Fact]
+ public void NullParameters_ThrowsArgumentNullException()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var ex = Assert.Throws<ArgumentNullException>(() => builder.MapGroup((string)null!));
+ Assert.Equal("prefix", ex.ParamName);
+ ex = Assert.Throws<ArgumentNullException>(() => builder.MapGroup((RoutePattern)null!));
+ Assert.Equal("prefix", ex.ParamName);
+
+ builder = null;
+
+ ex = Assert.Throws<ArgumentNullException>(() => builder!.MapGroup(RoutePatternFactory.Parse("/")));
+ Assert.Equal("endpoints", ex.ParamName);
+ ex = Assert.Throws<ArgumentNullException>(() => builder!.MapGroup("/"));
+ Assert.Equal("endpoints", ex.ParamName);
+ }
+
+ [Fact]
+ public void RoutePatternInConvention_IncludesFullGroupPrefix()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var outer = builder.MapGroup("/outer");
+ var inner = outer.MapGroup("/inner");
+ inner.MapGet("/foo", () => "Hello World!");
+
+ RoutePattern? outerPattern = null;
+ RoutePattern? innerPattern = null;
+
+ ((IEndpointConventionBuilder)outer).Add(builder =>
+ {
+ outerPattern = ((RouteEndpointBuilder)builder).RoutePattern;
+ });
+ ((IEndpointConventionBuilder)inner).Add(builder =>
+ {
+ innerPattern = ((RouteEndpointBuilder)builder).RoutePattern;
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ Assert.Single(dataSource.Endpoints);
+
+ Assert.Equal("/outer/inner/foo", outerPattern?.RawText);
+ Assert.Equal("/outer/inner/foo", innerPattern?.RawText);
+ }
+
+ [Fact]
+ public void ServiceProviderInConvention_IsSet()
+ {
+ var serviceProvider = Mock.Of<IServiceProvider>();
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+
+ var group = builder.MapGroup("/group");
+ group.MapGet("/foo", () => "Hello World!");
+
+ IServiceProvider? endpointBuilderServiceProvider = null;
+
+ ((IEndpointConventionBuilder)group).Add(builder =>
+ {
+ endpointBuilderServiceProvider = builder.ApplicationServices;
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ Assert.Single(dataSource.Endpoints);
+
+ Assert.Same(serviceProvider, endpointBuilderServiceProvider);
+ }
+
+ [Fact]
+ public async Task BuildingEndpointInConvention_Works()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var group = builder.MapGroup("/group");
+ var mapGetCalled = false;
+
+ group.MapGet("/", () =>
+ {
+ mapGetCalled = true;
+ });
+
+ Endpoint? conventionBuiltEndpoint = null;
+
+ ((IEndpointConventionBuilder)group).Add(builder =>
+ {
+ conventionBuiltEndpoint = builder.Build();
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+
+ var httpContext = new DefaultHttpContext();
+
+ Assert.NotNull(conventionBuiltEndpoint);
+ Assert.False(mapGetCalled);
+ await conventionBuiltEndpoint!.RequestDelegate!(httpContext);
+ Assert.True(mapGetCalled);
+
+ mapGetCalled = false;
+ await endpoint.RequestDelegate!(httpContext);
+ Assert.True(mapGetCalled);
+ }
+
+ [Fact]
+ public void ModifyingRoutePatternInConvention_Works()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var group = builder.MapGroup("/group");
+ group.MapGet("/foo", () => "Hello World!");
+
+ ((IEndpointConventionBuilder)group).Add(builder =>
+ {
+ ((RouteEndpointBuilder)builder).RoutePattern = RoutePatternFactory.Parse("/bar");
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+ var routeEndpoint = Assert.IsType<RouteEndpoint>(endpoint);
+
+ Assert.Equal("/bar", routeEndpoint.RoutePattern.RawText);
+ }
+
+ [Fact]
+ public async Task ChangingMostEndpointBuilderPropertiesInConvention_Works()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var group = builder.MapGroup("/group");
+ var mapGetCalled = false;
+ var replacementCalled = false;
+
+ group.MapGet("/", () =>
+ {
+ mapGetCalled = true;
+ });
+
+ ((IEndpointConventionBuilder)group).Add(builder =>
+ {
+ builder.DisplayName = $"Prefixed! {builder.DisplayName}";
+ builder.RequestDelegate = ctx =>
+ {
+ replacementCalled = true;
+ return Task.CompletedTask;
+ };
+
+ ((RouteEndpointBuilder)builder).Order = 42;
+ });
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+
+ var httpContext = new DefaultHttpContext();
+
+ await endpoint!.RequestDelegate!(httpContext);
+
+ Assert.False(mapGetCalled);
+ Assert.True(replacementCalled);
+ Assert.Equal("Prefixed! HTTP: GET /group/", endpoint.DisplayName);
+
+ var routeEndpoint = Assert.IsType<RouteEndpoint>(endpoint);
+ Assert.Equal(42, routeEndpoint.Order);
+ }
+
+ [Fact]
+ public void GivenNonRouteEndpoint_ThrowsNotSupportedException()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var group = builder.MapGroup("/group");
+ ((IEndpointRouteBuilder)group).DataSources.Add(new TestCustomEndpintDataSource());
+
+ var dataSource = GetEndpointDataSource(builder);
+ var ex = Assert.Throws<NotSupportedException>(() => dataSource.Endpoints);
+ Assert.Equal(
+ "MapGroup does not support custom Endpoint type 'Microsoft.AspNetCore.Builder.GroupTest+TestCustomEndpoint'. " +
+ "Only RouteEndpoints can be grouped.",
+ ex.Message);
+ }
+
+ [Fact]
+ public void OuterGroupMetadata_AddedFirst()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var outer = builder.MapGroup("/outer");
+ var inner = outer.MapGroup("/inner");
+ inner.MapGet("/foo", () => "Hello World!").WithMetadata("/foo");
+
+ inner.WithMetadata("/inner");
+ outer.WithMetadata("/outer");
+
+ var dataSource = GetEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+
+ Assert.Equal(new[] { "/outer", "/inner", "/foo" }, endpoint.Metadata.GetOrderedMetadata<string>());
+ }
+
+ [Fact]
+ public void MultipleEndpoints_AreSupported()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ var group = builder.MapGroup("/group");
+ group.MapGet("/foo", () => "foo");
+ group.MapGet("/bar", () => "bar");
+
+ group.WithMetadata("/group");
+
+ var dataSource = GetEndpointDataSource(builder);
+ Assert.Collection(dataSource.Endpoints.OfType<RouteEndpoint>(),
+ routeEndpoint =>
+ {
+ Assert.Equal("/group/foo", routeEndpoint.RoutePattern.RawText);
+ Assert.True(routeEndpoint.Metadata.Count >= 1);
+ Assert.Equal("/group", routeEndpoint.Metadata.GetMetadata<string>());
+ },
+ routeEndpoint =>
+ {
+ Assert.Equal("/group/bar", routeEndpoint.RoutePattern.RawText);
+ Assert.True(routeEndpoint.Metadata.Count >= 1);
+ Assert.Equal("/group", routeEndpoint.Metadata.GetMetadata<string>());
+ });
+ }
+
+ [Fact]
+ public void DataSourceFiresChangeToken_WhenInnerDataSourceFiresChangeToken()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ var dynamicDataSource = new DynamicEndpointDataSource();
+
+ var group = builder.MapGroup("/group");
+ ((IEndpointRouteBuilder)group).DataSources.Add(dynamicDataSource);
+
+ var groupDataSource = GetEndpointDataSource(builder);
+
+ var groupChangeToken = groupDataSource.GetChangeToken();
+ Assert.False(groupChangeToken.HasChanged);
+
+ dynamicDataSource.AddEndpoint(new RouteEndpoint(
+ TestConstants.EmptyRequestDelegate,
+ RoutePatternFactory.Parse("/foo"),
+ 0, null, null));
+
+ Assert.True(groupChangeToken.HasChanged);
+
+ var prefixedEndpoint = Assert.IsType<RouteEndpoint>(Assert.Single(groupDataSource.Endpoints));
+ Assert.Equal("/group/foo", prefixedEndpoint.RoutePattern.RawText);
+ }
+
+ private sealed class TestCustomEndpoint : Endpoint
+ {
+ public TestCustomEndpoint() : base(null, null, null) { }
+ }
+
+ private sealed class TestCustomEndpintDataSource : EndpointDataSource
+ {
+ public override IReadOnlyList<Endpoint> Endpoints => new[] { new TestCustomEndpoint() };
+ public override IChangeToken GetChangeToken() => throw new NotImplementedException();
+ }
+
+ private sealed class EmptyServiceProvider : IServiceProvider
+ {
+ public static EmptyServiceProvider Instance { get; } = new EmptyServiceProvider();
+ public object? GetService(Type serviceType) => null;
+ }
+}
diff --git a/src/Http/Routing/test/UnitTests/Builder/OpenApiRouteHandlerBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/OpenApiRouteHandlerBuilderExtensionsTest.cs
new file mode 100644
index 0000000000..54a87d2aa5
--- /dev/null
+++ b/src/Http/Routing/test/UnitTests/Builder/OpenApiRouteHandlerBuilderExtensionsTest.cs
@@ -0,0 +1,158 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Microsoft.AspNetCore.Routing.Builder;
+
+public class OpenApiRouteHandlerBuilderExtensionsTest
+{
+ [Fact]
+ public void ExcludeFromDescription_AddsExcludeFromDescriptionAttribute()
+ {
+ static void GenericExclude(IEndpointConventionBuilder builder) => builder.ExcludeFromDescription();
+ static void SpecificExclude(RouteHandlerBuilder builder) => builder.ExcludeFromDescription();
+
+ static void AssertMetadata(EndpointBuilder builder)
+ => Assert.IsType<ExcludeFromDescriptionAttribute>(Assert.Single(builder.Metadata));
+
+ RunWithBothBuilders(GenericExclude, SpecificExclude, AssertMetadata);
+ }
+
+ [Fact]
+ public void WithTags_AddsTagsAttribute()
+ {
+ static void GenericWithTags(IEndpointConventionBuilder builder) => builder.WithTags("a", "b", "c");
+ static void SpecificWithTags(RouteHandlerBuilder builder) => builder.WithTags("a", "b", "c");
+
+ static void AssertMetadata(EndpointBuilder builder)
+ {
+ var tags = Assert.IsType<TagsAttribute>(Assert.Single(builder.Metadata));
+ Assert.Collection(tags.Tags,
+ tag => Assert.Equal("a", tag),
+ tag => Assert.Equal("b", tag),
+ tag => Assert.Equal("c", tag));
+ }
+
+ RunWithBothBuilders(GenericWithTags, SpecificWithTags, AssertMetadata);
+ }
+
+ [Fact]
+ public void Produces_AddsProducesResponseTypeMetadataWithJsonContentType()
+ {
+ var testBuilder = new TestEndointConventionBuilder();
+ var builder = new RouteHandlerBuilder(new[] { testBuilder });
+
+ builder.Produces<TestEndointConventionBuilder>();
+
+ var metadata = Assert.IsType<ProducesResponseTypeMetadata>(Assert.Single(testBuilder.Metadata));
+ Assert.Equal(typeof(TestEndointConventionBuilder), metadata.Type);
+ Assert.Equal(StatusCodes.Status200OK, metadata.StatusCode);
+ Assert.Equal("application/json", Assert.Single(metadata.ContentTypes));
+ }
+
+ [Fact]
+ public void Produces_AddsProducesResponseTypeMetadataWithVoidType()
+ {
+ var testBuilder = new TestEndointConventionBuilder();
+ var builder = new RouteHandlerBuilder(new[] { testBuilder });
+
+ builder.Produces(StatusCodes.Status404NotFound);
+
+ var metadata = Assert.IsType<ProducesResponseTypeMetadata>(Assert.Single(testBuilder.Metadata));
+ Assert.Equal(typeof(void), metadata.Type);
+ Assert.Equal(StatusCodes.Status404NotFound, metadata.StatusCode);
+ Assert.Empty(metadata.ContentTypes);
+ }
+
+ [Fact]
+ public void ProdcesProblem_AddsProducesResponseTypeMetadataWithProblemDetailsType()
+ {
+ var testBuilder = new TestEndointConventionBuilder();
+ var builder = new RouteHandlerBuilder(new[] { testBuilder });
+
+ builder.ProducesProblem(StatusCodes.Status400BadRequest);
+
+ var metadata = Assert.IsType<ProducesResponseTypeMetadata>(Assert.Single(testBuilder.Metadata));
+ Assert.Equal(typeof(ProblemDetails), metadata.Type);
+ Assert.Equal(StatusCodes.Status400BadRequest, metadata.StatusCode);
+ Assert.Equal("application/problem+json", Assert.Single(metadata.ContentTypes));
+ }
+
+ [Fact]
+ public void ProdcesValidiationProblem_AddsProducesResponseTypeMetadataWithHttpValidationProblemDetailsType()
+ {
+ var testBuilder = new TestEndointConventionBuilder();
+ var builder = new RouteHandlerBuilder(new[] { testBuilder });
+
+ builder.ProducesValidationProblem();
+
+ var metadata = Assert.IsType<ProducesResponseTypeMetadata>(Assert.Single(testBuilder.Metadata));
+ Assert.Equal(typeof(HttpValidationProblemDetails), metadata.Type);
+ Assert.Equal(StatusCodes.Status400BadRequest, metadata.StatusCode);
+ Assert.Equal("application/problem+json", Assert.Single(metadata.ContentTypes));
+ }
+
+ [Fact]
+ public void Accepts_AddsAcceptsMetadataWithSpecifiedType()
+ {
+ var testBuilder = new TestEndointConventionBuilder();
+ var builder = new RouteHandlerBuilder(new[] { testBuilder });
+
+ builder.Accepts<TestEndointConventionBuilder>("text/plain");
+
+ var metadata = Assert.IsType<AcceptsMetadata>(Assert.Single(testBuilder.Metadata));
+
+ Assert.Equal(typeof(TestEndointConventionBuilder), metadata.RequestType);
+ Assert.Equal("text/plain", Assert.Single(metadata.ContentTypes));
+ Assert.False(metadata.IsOptional);
+ }
+
+ [Fact]
+ public void WithDescription_AddsEndpointDescriptionAttribute()
+ {
+ var builder = new TestEndointConventionBuilder();
+ builder.WithDescription("test description");
+
+ var metadata = Assert.IsType<EndpointDescriptionAttribute>(Assert.Single(builder.Metadata));
+ Assert.Equal("test description", metadata.Description);
+ }
+
+ [Fact]
+ public void WithSummary_AddsEndpointSummaryAttribute()
+ {
+ var builder = new TestEndointConventionBuilder();
+ builder.WithSummary("test summary");
+
+ var metadata = Assert.IsType<EndpointSummaryAttribute>(Assert.Single(builder.Metadata));
+ Assert.Equal("test summary", metadata.Summary);
+ }
+
+ private void RunWithBothBuilders(
+ Action<IEndpointConventionBuilder> genericSetup,
+ Action<RouteHandlerBuilder> specificSetup,
+ Action<EndpointBuilder> assert)
+ {
+ var testBuilder = new TestEndointConventionBuilder();
+ genericSetup(testBuilder);
+ assert(testBuilder);
+
+ var routeTestBuilder = new TestEndointConventionBuilder();
+ var routeHandlerBuilder = new RouteHandlerBuilder(new[] { routeTestBuilder });
+ specificSetup(routeHandlerBuilder);
+ assert(routeTestBuilder);
+ }
+
+ private sealed class TestEndointConventionBuilder : EndpointBuilder, IEndpointConventionBuilder
+ {
+ public void Add(Action<EndpointBuilder> convention)
+ {
+ convention(this);
+ }
+
+ public override Endpoint Build() => throw new NotImplementedException();
+ }
+}
diff --git a/src/Http/Routing/test/UnitTests/Builder/RequestDelegateEndpointRouteBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/RequestDelegateEndpointRouteBuilderExtensionsTest.cs
index 54f4b313ec..ee89fa4088 100644
--- a/src/Http/Routing/test/UnitTests/Builder/RequestDelegateEndpointRouteBuilderExtensionsTest.cs
+++ b/src/Http/Routing/test/UnitTests/Builder/RequestDelegateEndpointRouteBuilderExtensionsTest.cs
@@ -1,59 +1,56 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.IO.Pipelines;
+#nullable enable
+
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Patterns;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Moq;
namespace Microsoft.AspNetCore.Builder;
public class RequestDelegateEndpointRouteBuilderExtensionsTest
{
- private ModelEndpointDataSource GetBuilderEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder)
- {
- return Assert.IsType<ModelEndpointDataSource>(Assert.Single(endpointRouteBuilder.DataSources));
- }
+ private EndpointDataSource GetBuilderEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder) =>
+ Assert.Single(endpointRouteBuilder.DataSources);
- private RouteEndpointBuilder GetRouteEndpointBuilder(IEndpointRouteBuilder endpointRouteBuilder)
- {
- return Assert.IsType<RouteEndpointBuilder>(Assert.Single(GetBuilderEndpointDataSource(endpointRouteBuilder).EndpointBuilders));
- }
+ private RouteEndpointBuilder GetRouteEndpointBuilder(IEndpointRouteBuilder endpointRouteBuilder) =>
+ GetBuilderEndpointDataSource(endpointRouteBuilder) switch
+ {
+ RouteEndpointDataSource routeDataSource => routeDataSource.GetSingleRouteEndpointBuilder(),
+ _ => throw new InvalidOperationException($"Unknown EndointDataSource type!"),
+ };
public static object[][] MapMethods
{
get
{
- IEndpointConventionBuilder MapGet(IEndpointRouteBuilder routes, string template, RequestDelegate action) =>
+ IEndpointConventionBuilder MapGet(IEndpointRouteBuilder routes, string template, Delegate action) =>
routes.MapGet(template, action);
- IEndpointConventionBuilder MapPost(IEndpointRouteBuilder routes, string template, RequestDelegate action) =>
+ IEndpointConventionBuilder MapPost(IEndpointRouteBuilder routes, string template, Delegate action) =>
routes.MapPost(template, action);
- IEndpointConventionBuilder MapPut(IEndpointRouteBuilder routes, string template, RequestDelegate action) =>
+ IEndpointConventionBuilder MapPut(IEndpointRouteBuilder routes, string template, Delegate action) =>
routes.MapPut(template, action);
- IEndpointConventionBuilder MapDelete(IEndpointRouteBuilder routes, string template, RequestDelegate action) =>
+ IEndpointConventionBuilder MapDelete(IEndpointRouteBuilder routes, string template, Delegate action) =>
routes.MapDelete(template, action);
- IEndpointConventionBuilder Map(IEndpointRouteBuilder routes, string template, RequestDelegate action) =>
+ IEndpointConventionBuilder Map(IEndpointRouteBuilder routes, string template, Delegate action) =>
routes.Map(template, action);
return new object[][]
{
- new object[] { (Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder>)MapGet },
- new object[] { (Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder>)MapPost },
- new object[] { (Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder>)MapPut },
- new object[] { (Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder>)MapDelete },
- new object[] { (Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder>)Map },
+ new object[] { (Func<IEndpointRouteBuilder, string, Delegate, IEndpointConventionBuilder>)MapGet },
+ new object[] { (Func<IEndpointRouteBuilder, string, Delegate, IEndpointConventionBuilder>)MapPost },
+ new object[] { (Func<IEndpointRouteBuilder, string, Delegate, IEndpointConventionBuilder>)MapPut },
+ new object[] { (Func<IEndpointRouteBuilder, string, Delegate, IEndpointConventionBuilder>)MapDelete },
+ new object[] { (Func<IEndpointRouteBuilder, string, Delegate, IEndpointConventionBuilder>)Map },
};
}
}
@@ -62,8 +59,8 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
public void MapEndpoint_StringPattern_BuildsEndpoint()
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
- RequestDelegate requestDelegate = (d) => null;
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ RequestDelegate requestDelegate = (d) => Task.CompletedTask;
// Act
var endpointBuilder = builder.Map("/", requestDelegate);
@@ -76,24 +73,27 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
Assert.Equal("/", endpointBuilder1.RoutePattern.RawText);
}
- [Fact]
- public async Task MapEndpoint_ReturnGenericTypeTask_GeneratedDelegate()
+ [Theory]
+ [MemberData(nameof(MapMethods))]
+ public async Task MapEndpoint_ReturnGenericTypeTask_GeneratedDelegate(Func<IEndpointRouteBuilder, string, Delegate, IEndpointConventionBuilder> map)
{
var httpContext = new DefaultHttpContext();
var responseBodyStream = new MemoryStream();
httpContext.Response.Body = responseBodyStream;
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
static async Task<string> GenericTypeTaskDelegate(HttpContext context) => await Task.FromResult("String Test");
// Act
- var endpointBuilder = builder.MapGet("/", GenericTypeTaskDelegate);
+ var endpointBuilder = map(builder, "/", GenericTypeTaskDelegate);
// Assert
var dataSource = GetBuilderEndpointDataSource(builder);
var endpoint = Assert.Single(dataSource.Endpoints); // Triggers build and construction of delegate
- var requestDelegate = endpoint.RequestDelegate;
+
+ Assert.NotNull(endpoint.RequestDelegate);
+ var requestDelegate = endpoint.RequestDelegate!;
await requestDelegate(httpContext);
var responseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
@@ -101,12 +101,73 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
Assert.Equal("String Test", responseBody);
}
+ [Theory]
+ [MemberData(nameof(MapMethods))]
+ public async Task MapEndpoint_CanBeFiltered_ByEndpointFilters(Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder> map)
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ var httpContext = new DefaultHttpContext();
+ var responseBodyStream = new MemoryStream();
+ httpContext.Response.Body = responseBodyStream;
+
+ RequestDelegate initialRequestDelegate = static (context) => Task.CompletedTask;
+ var filterTag = new TagsAttribute("filter");
+
+ var endpointBuilder = map(builder, "/", initialRequestDelegate).AddEndpointFilterFactory(filterFactory: (routeHandlerContext, next) =>
+ {
+ routeHandlerContext.EndpointMetadata.Add(filterTag);
+ return async invocationContext =>
+ {
+ Assert.IsAssignableFrom<HttpContext>(Assert.Single(invocationContext.Arguments));
+ // Ignore thre result and write filtered because we can!
+ await next(invocationContext);
+ return "filtered!";
+ };
+ });
+
+ var dataSource = GetBuilderEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+
+ Assert.NotSame(initialRequestDelegate, endpoint.RequestDelegate);
+ Assert.Same(filterTag, endpoint.Metadata.GetMetadata<ITagsMetadata>());
+
+ Assert.NotNull(endpoint.RequestDelegate);
+ var requestDelegate = endpoint.RequestDelegate!;
+ await requestDelegate(httpContext);
+
+ var responseBody = Encoding.UTF8.GetString(responseBodyStream.ToArray());
+
+ Assert.Equal("filtered!", responseBody);
+ }
+
+ [Theory]
+ [MemberData(nameof(MapMethods))]
+ public void MapEndpoint_UsesOriginalRequestDelegateInstance_IfFilterDoesNotChangePerRequestBehavior(Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder> map)
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+
+ RequestDelegate initialRequestDelegate = static (context) => Task.CompletedTask;
+ var filterTag = new TagsAttribute("filter");
+
+ var endpointBuilder = map(builder, "/", initialRequestDelegate).AddEndpointFilterFactory((routeHandlerContext, next) =>
+ {
+ routeHandlerContext.EndpointMetadata.Add(filterTag);
+ return next;
+ });
+
+ var dataSource = GetBuilderEndpointDataSource(builder);
+ var endpoint = Assert.Single(dataSource.Endpoints);
+
+ Assert.Same(initialRequestDelegate, endpoint.RequestDelegate);
+ Assert.Same(filterTag, endpoint.Metadata.GetMetadata<ITagsMetadata>());
+ }
+
[Fact]
public void MapEndpoint_TypedPattern_BuildsEndpoint()
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
- RequestDelegate requestDelegate = (d) => null;
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
+ RequestDelegate requestDelegate = (d) => Task.CompletedTask;
// Act
var endpointBuilder = builder.Map(RoutePatternFactory.Parse("/"), requestDelegate);
@@ -123,7 +184,7 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
public void MapEndpoint_AttributesCollectedAsMetadata()
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
// Act
var endpointBuilder = builder.Map(RoutePatternFactory.Parse("/"), Handle);
@@ -131,16 +192,17 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
// Assert
var endpointBuilder1 = GetRouteEndpointBuilder(builder);
Assert.Equal("/", endpointBuilder1.RoutePattern.RawText);
- Assert.Equal(2, endpointBuilder1.Metadata.Count);
- Assert.IsType<Attribute1>(endpointBuilder1.Metadata[0]);
- Assert.IsType<Attribute2>(endpointBuilder1.Metadata[1]);
+ Assert.Equal(3, endpointBuilder1.Metadata.Count);
+ Assert.Equal(((RequestDelegate)Handle).Method, endpointBuilder1.Metadata[0]);
+ Assert.IsType<Attribute1>(endpointBuilder1.Metadata[1]);
+ Assert.IsType<Attribute2>(endpointBuilder1.Metadata[2]);
}
[Fact]
public void MapEndpoint_GeneratedDelegateWorks()
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
Expression<RequestDelegate> handler = context => Task.CompletedTask;
@@ -156,7 +218,7 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
public void MapEndpoint_PrecedenceOfMetadata_BuilderMetadataReturned()
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
// Act
var endpointBuilder = builder.MapMethods("/", new[] { "METHOD" }, HandleHttpMetdata);
@@ -166,12 +228,15 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
var dataSource = Assert.Single(builder.DataSources);
var endpoint = Assert.Single(dataSource.Endpoints);
- Assert.Equal(3, endpoint.Metadata.Count);
- Assert.Equal("ATTRIBUTE", GetMethod(endpoint.Metadata[0]));
+ // As with the Delegate Map method overloads for route handlers, the attributes on the RequestDelegate
+ // can override the HttpMethodMetadata. Extension methods could already do this.
+ Assert.Equal(4, endpoint.Metadata.Count);
+ Assert.Equal(((RequestDelegate)HandleHttpMetdata).Method, endpoint.Metadata[0]);
Assert.Equal("METHOD", GetMethod(endpoint.Metadata[1]));
- Assert.Equal("BUILDER", GetMethod(endpoint.Metadata[2]));
+ Assert.Equal("ATTRIBUTE", GetMethod(endpoint.Metadata[2]));
+ Assert.Equal("BUILDER", GetMethod(endpoint.Metadata[3]));
- Assert.Equal("BUILDER", endpoint.Metadata.GetMetadata<IHttpMethodMetadata>().HttpMethods.Single());
+ Assert.Equal("BUILDER", endpoint.Metadata.GetMetadata<IHttpMethodMetadata>()?.HttpMethods.Single());
string GetMethod(object metadata)
{
@@ -185,7 +250,7 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
public void Map_EndpointMetadataNotDuplicated(Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder> map)
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
// Act
var endpointBuilder = map(builder, "/", context => Task.CompletedTask).WithMetadata(new EndpointNameMetadata("MapMe"));
@@ -208,7 +273,7 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
public void AddingMetadataAfterBuildingEndpointThrows(Func<IEndpointRouteBuilder, string, RequestDelegate, IEndpointConventionBuilder> map)
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
// Act
var endpointBuilder = map(builder, "/", context => Task.CompletedTask).WithMetadata(new EndpointNameMetadata("MapMe"));
@@ -221,13 +286,14 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
Assert.Single(endpoint.Metadata.GetOrderedMetadata<IEndpointNameMetadata>());
Assert.Throws<InvalidOperationException>(() => endpointBuilder.WithMetadata(new RouteNameMetadata("Foo")));
+ Assert.Throws<InvalidOperationException>(() => endpointBuilder.Finally(b => b.Metadata.Add(new RouteNameMetadata("Foo"))));
}
[Fact]
public void Map_AddsMetadata_InCorrectOrder()
{
// Arrange
- var builder = new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>());
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(EmptyServiceProvider.Instance));
var @delegate = [Attribute1, Attribute2] (AddsCustomParameterMetadata param1) => new AddsCustomEndpointMetadataResult();
// Act
@@ -240,6 +306,9 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
Assert.Collection(metadata,
m => Assert.IsAssignableFrom<MethodInfo>(m),
+ m => Assert.Equal("System.Runtime.CompilerServices.NullableContextAttribute", m.ToString()),
+ m => Assert.IsAssignableFrom<Attribute1>(m),
+ m => Assert.IsAssignableFrom<Attribute2>(m),
m => Assert.IsAssignableFrom<ParameterNameMetadata>(m),
m =>
{
@@ -250,9 +319,7 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
{
Assert.IsAssignableFrom<CustomEndpointMetadata>(m);
Assert.Equal(MetadataSource.ReturnType, ((CustomEndpointMetadata)m).Source);
- },
- m => Assert.IsAssignableFrom<Attribute1>(m),
- m => Assert.IsAssignableFrom<Attribute2>(m));
+ });
}
[Attribute1]
@@ -298,7 +365,7 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
public static void PopulateMetadata(EndpointParameterMetadataContext parameterContext)
{
- parameterContext.EndpointMetadata.Add(new ParameterNameMetadata { Name = parameterContext.Parameter.Name });
+ parameterContext.EndpointMetadata.Add(new ParameterNameMetadata { Name = parameterContext.Parameter.Name ?? string.Empty });
}
public static void PopulateMetadata(EndpointMetadataContext context)
@@ -309,12 +376,12 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
private class ParameterNameMetadata
{
- public string Name { get; init; }
+ public string Name { get; init; } = string.Empty;
}
private class CustomEndpointMetadata
{
- public string Data { get; init; }
+ public string Data { get; init; } = string.Empty;
public MetadataSource Source { get; init; }
}
@@ -324,4 +391,10 @@ public class RequestDelegateEndpointRouteBuilderExtensionsTest
Parameter,
ReturnType
}
+
+ private sealed class EmptyServiceProvider : IServiceProvider
+ {
+ public static EmptyServiceProvider Instance { get; } = new EmptyServiceProvider();
+ public object? GetService(Type serviceType) => null;
+ }
}
diff --git a/src/Http/Routing/test/UnitTests/Builder/RouteHandlerEndpointRouteBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/RouteHandlerEndpointRouteBuilderExtensionsTest.cs
index 8f885095fc..ad2f1dc3d7 100644
--- a/src/Http/Routing/test/UnitTests/Builder/RouteHandlerEndpointRouteBuilderExtensionsTest.cs
+++ b/src/Http/Routing/test/UnitTests/Builder/RouteHandlerEndpointRouteBuilderExtensionsTest.cs
@@ -16,14 +16,14 @@ namespace Microsoft.AspNetCore.Builder;
public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
{
- private ModelEndpointDataSource GetBuilderEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder)
+ private RouteEndpointDataSource GetBuilderEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder)
{
- return Assert.IsType<ModelEndpointDataSource>(Assert.Single(endpointRouteBuilder.DataSources));
+ return Assert.IsType<RouteEndpointDataSource>(Assert.Single(endpointRouteBuilder.DataSources));
}
private RouteEndpointBuilder GetRouteEndpointBuilder(IEndpointRouteBuilder endpointRouteBuilder)
{
- return Assert.IsType<RouteEndpointBuilder>(Assert.Single(GetBuilderEndpointDataSource(endpointRouteBuilder).EndpointBuilders));
+ return GetBuilderEndpointDataSource(endpointRouteBuilder).GetSingleRouteEndpointBuilder();
}
public static object?[]?[] MapMethods
@@ -129,7 +129,7 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
}
[Fact]
- public async Task MapGetWithRouteParameter_BuildsEndpointWithRouteSpecificBinding()
+ public async Task MapGet_WithRouteParameter_BuildsEndpointWithRouteSpecificBinding()
{
var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new EmptyServiceProvider()));
_ = builder.MapGet("/{id}", (int? id, HttpContext httpContext) =>
@@ -167,7 +167,7 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
}
[Fact]
- public async Task MapGetWithoutRouteParameter_BuildsEndpointWithQuerySpecificBinding()
+ public async Task MapGet_WithoutRouteParameter_BuildsEndpointWithQuerySpecificBinding()
{
var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new EmptyServiceProvider()));
_ = builder.MapGet("/", (int? id, HttpContext httpContext) =>
@@ -496,6 +496,7 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
}
Assert.Throws<InvalidOperationException>(() => endpointBuilder.WithMetadata(new RouteNameMetadata("Foo")));
+ Assert.Throws<InvalidOperationException>(() => endpointBuilder.Finally(b => b.Metadata.Add(new RouteNameMetadata("Foo"))));
}
[Theory]
@@ -851,88 +852,50 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
public static object[][] AddFiltersByClassData =
{
- new object[] { (Action<RouteHandlerBuilder>)((RouteHandlerBuilder builder) => builder.AddFilter(new IncrementArgFilter())) },
- new object[] { (Action<RouteHandlerBuilder>)((RouteHandlerBuilder builder) => builder.AddFilter<IncrementArgFilter>()) }
+ new object[] { (Action<IEndpointConventionBuilder>)((IEndpointConventionBuilder builder) => builder.AddEndpointFilter(new IncrementArgFilter())) },
+ new object[] { (Action<IEndpointConventionBuilder>)((IEndpointConventionBuilder builder) => builder.AddEndpointFilter<IEndpointConventionBuilder, IncrementArgFilter>()) }
};
- [Theory]
- [MemberData(nameof(AddFiltersByClassData))]
- public async Task AddFilterMethods_CanRegisterFilterWithClassImplementation(Action<RouteHandlerBuilder> addFilter)
- {
- var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()));
-
- string PrintId(int id) => $"ID: {id}";
- var routeHandlerBuilder = builder.Map("/{id}", PrintId);
- addFilter(routeHandlerBuilder);
-
- var dataSource = GetBuilderEndpointDataSource(builder);
- // Trigger Endpoint build by calling getter.
- var endpoint = Assert.Single(dataSource.Endpoints);
-
- var httpContext = new DefaultHttpContext();
- httpContext.Request.RouteValues["id"] = "2";
- var outStream = new MemoryStream();
- httpContext.Response.Body = outStream;
-
- await endpoint.RequestDelegate!(httpContext);
-
- // Assert;
- var httpResponse = httpContext.Response;
- httpResponse.Body.Seek(0, SeekOrigin.Begin);
- var streamReader = new StreamReader(httpResponse.Body);
- var body = streamReader.ReadToEndAsync().Result;
- Assert.Equal(200, httpContext.Response.StatusCode);
- Assert.Equal("ID: 3", body);
- }
-
public static object[][] AddFiltersByDelegateData
{
get
{
- void WithFilter(RouteHandlerBuilder builder) =>
- builder.AddFilter(async (context, next) =>
+ void WithFilter(IEndpointConventionBuilder builder) =>
+ builder.AddEndpointFilter(async (context, next) =>
{
- context.Parameters[0] = ((int)context.Parameters[0]!) + 1;
+ context.Arguments[0] = ((int)context.Arguments[0]!) + 1;
return await next(context);
});
- void WithFilterFactory(RouteHandlerBuilder builder) =>
- builder.AddFilter((routeHandlerContext, next) => async (context) =>
+ void WithFilterFactory(IEndpointConventionBuilder builder) =>
+ builder.AddEndpointFilterFactory((routeHandlerContext, next) => async (context) =>
{
Assert.NotNull(routeHandlerContext.MethodInfo);
Assert.NotNull(routeHandlerContext.MethodInfo.DeclaringType);
+ Assert.NotNull(routeHandlerContext.ApplicationServices);
Assert.Equal("RouteHandlerEndpointRouteBuilderExtensionsTest", routeHandlerContext.MethodInfo.DeclaringType?.Name);
- context.Parameters[0] = ((int)context.Parameters[0]!) + 1;
+ context.Arguments[0] = context.GetArgument<int>(0) + 1;
return await next(context);
});
return new object[][] {
- new object[] { (Action<RouteHandlerBuilder>)WithFilter },
- new object[] { (Action<RouteHandlerBuilder>)WithFilterFactory }
+ new object[] { (Action<IEndpointConventionBuilder>)WithFilter },
+ new object[] { (Action<IEndpointConventionBuilder>)WithFilterFactory }
};
}
}
- [Theory]
- [MemberData(nameof(AddFiltersByDelegateData))]
- public async Task AddFilterMethods_CanRegisterFilterWithDelegateImplementation(Action<RouteHandlerBuilder> addFilter)
+ private static async Task AssertIdAsync(Endpoint endpoint, string expectedPattern, int expectedId)
{
- var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()));
-
- string PrintId(int id) => $"ID: {id}";
- var routeHandlerBuilder = builder.Map("/{id}", PrintId);
- addFilter(routeHandlerBuilder);
-
- var dataSource = GetBuilderEndpointDataSource(builder);
- // Trigger Endpoint build by calling getter.
- var endpoint = Assert.Single(dataSource.Endpoints);
+ var routeEndpoint = Assert.IsType<RouteEndpoint>(endpoint);
+ Assert.Equal(expectedPattern, routeEndpoint.RoutePattern.RawText);
var httpContext = new DefaultHttpContext();
httpContext.Request.RouteValues["id"] = "2";
var outStream = new MemoryStream();
httpContext.Response.Body = outStream;
- await endpoint.RequestDelegate!(httpContext);
+ await routeEndpoint.RequestDelegate!(httpContext);
// Assert;
var httpResponse = httpContext.Response;
@@ -940,7 +903,53 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
var streamReader = new StreamReader(httpResponse.Body);
var body = streamReader.ReadToEndAsync().Result;
Assert.Equal(200, httpContext.Response.StatusCode);
- Assert.Equal("ID: 3", body);
+ Assert.Equal($"ID: {expectedId}", body);
+ }
+
+ [Theory]
+ [MemberData(nameof(AddFiltersByClassData))]
+ [MemberData(nameof(AddFiltersByDelegateData))]
+ public async Task AddEndpointFilterMethods_CanRegisterFilterWithClassAndDelegateImplementations(Action<IEndpointConventionBuilder> addFilter)
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()));
+
+ string PrintId(int id) => $"ID: {id}";
+ addFilter(builder.Map("/{id}", PrintId));
+
+ var dataSource = GetBuilderEndpointDataSource(builder);
+ // Trigger Endpoint build by calling getter.
+ var endpoint = Assert.Single(dataSource.Endpoints);
+ await AssertIdAsync(endpoint, "/{id}", 3);
+ }
+
+ [Theory]
+ [MemberData(nameof(AddFiltersByClassData))]
+ [MemberData(nameof(AddFiltersByDelegateData))]
+ public async Task AddEndpointFilterMethods_WorkWithMapGroup(Action<IEndpointConventionBuilder> addFilter)
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()));
+
+ string PrintId(int id) => $"ID: {id}";
+ addFilter(builder.Map("/{id}", PrintId));
+
+ var outerGroup = builder.MapGroup("/outer");
+ addFilter(outerGroup);
+ addFilter(outerGroup.Map("/{id}", PrintId));
+
+ var innerGroup = outerGroup.MapGroup("/inner");
+ addFilter(innerGroup);
+ addFilter(innerGroup.Map("/{id}", PrintId));
+
+ var endpoints = builder.DataSources
+ .SelectMany(ds => ds.Endpoints)
+ .ToDictionary(e => ((RouteEndpoint)e).RoutePattern.RawText!);
+
+ Assert.Equal(3, endpoints.Count);
+
+ // For each layer of grouping, another filter is applies which increments the expectedId by 1 each time.
+ await AssertIdAsync(endpoints["/{id}"], expectedPattern: "/{id}", expectedId: 3);
+ await AssertIdAsync(endpoints["/outer/{id}"], expectedPattern: "/outer/{id}", expectedId: 4);
+ await AssertIdAsync(endpoints["/outer/inner/{id}"], expectedPattern: "/outer/inner/{id}", expectedId: 5);
}
[Fact]
@@ -950,7 +959,7 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
string? PrintLogger(HttpContext context) => $"loggerErrorIsEnabled: {context.Items["loggerErrorIsEnabled"]}, parentName: {context.Items["parentName"]}";
var routeHandlerBuilder = builder.Map("/", PrintLogger);
- routeHandlerBuilder.AddFilter<ServiceAccessingRouteHandlerFilter>();
+ routeHandlerBuilder.AddEndpointFilter<ServiceAccessingEndpointFilter>();
var dataSource = GetBuilderEndpointDataSource(builder);
// Trigger Endpoint build by calling getter.
@@ -972,18 +981,122 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
Assert.Equal("loggerErrorIsEnabled: True, parentName: RouteHandlerEndpointRouteBuilderExtensionsTest", body);
}
- class ServiceAccessingRouteHandlerFilter : IRouteHandlerFilter
+ [Fact]
+ public void RequestDelegateFactory_ProvidesAppServiceProvider_ToFilterFactory()
+ {
+ var appServiceCollection = new ServiceCollection();
+ var appService = new MyService();
+ appServiceCollection.AddSingleton(appService);
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(appServiceCollection.BuildServiceProvider()));
+ var filterFactoryRan = false;
+
+ string? PrintLogger(HttpContext context) => $"loggerErrorIsEnabled: {context.Items["loggerErrorIsEnabled"]}, parentName: {context.Items["parentName"]}";
+ var routeHandlerBuilder = builder.Map("/", PrintLogger);
+ routeHandlerBuilder.AddEndpointFilterFactory((rhc, next) =>
+ {
+ Assert.NotNull(rhc.ApplicationServices);
+ var myService = rhc.ApplicationServices.GetRequiredService<MyService>();
+ Assert.Equal(appService, myService);
+ filterFactoryRan = true;
+ return next;
+ });
+
+ var dataSource = GetBuilderEndpointDataSource(builder);
+ // Trigger Endpoint build by calling getter.
+ Assert.Single(dataSource.Endpoints);
+ Assert.True(filterFactoryRan);
+ }
+
+ [Fact]
+ public void RouteHandlerContext_ThrowsArgumentNullException_ForMethodInfo()
+ {
+ Assert.Throws<ArgumentNullException>("methodInfo", () => new EndpointFilterFactoryContext(null!, new List<object>(), new ServiceCollection().BuildServiceProvider()));
+ }
+
+ [Fact]
+ public void RouteHandlerContext_ThrowsArgumentNullException_ForEndpointMetadata()
+ {
+ var handler = () => { };
+ Assert.Throws<ArgumentNullException>("endpointMetadata", () => new EndpointFilterFactoryContext(handler.Method, null!, new ServiceCollection().BuildServiceProvider()));
+ }
+
+ [Fact]
+ public void RouteHandlerContext_ThrowsArgumentNullException_ForApplicationServices()
+ {
+ var handler = () => { };
+ Assert.Throws<ArgumentNullException>("applicationServices", () => new EndpointFilterFactoryContext(handler.Method, new List<object>(), null!));
+ }
+
+ [Fact]
+ public void FinallyOnGroup_CanExamineFinallyOnEndpoint()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()));
+
+ var group = builder.MapGroup("/group");
+ ((IEndpointConventionBuilder)group).Finally(b =>
+ {
+ if (b.Metadata.Any(md => md is string smd && smd == "added-from-endpoint"))
+ {
+ b.Metadata.Add("added-from-group");
+ }
+ });
+
+ group.MapGet("/endpoint", () => { }).Finally(b => b.Metadata.Add("added-from-endpoint"));
+
+ var endpoint = Assert.Single(builder.DataSources
+ .SelectMany(ds => ds.Endpoints));
+
+ Assert.Equal(new[] { "added-from-endpoint", "added-from-group" }, endpoint.Metadata.GetOrderedMetadata<string>());
+ }
+
+ [Fact]
+ public void FinallyOnNestedGroups_OuterGroupCanExamineInnerGroup()
+ {
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(new ServiceCollection().BuildServiceProvider()));
+
+ var outerGroup = builder.MapGroup("/group");
+ var innerGroup = outerGroup.MapGroup("/");
+ ((IEndpointConventionBuilder)innerGroup).Finally(b =>
+ {
+ // Verifies that both endpoint-specific finally conventions have run
+ if (b.Metadata.Any(md => md is string smd && smd == "added-from-endpoint-1")
+ && b.Metadata.Any(md => md is string smd && smd == "added-from-endpoint-2"))
+ {
+ b.Metadata.Add("added-from-inner-group");
+ }
+ });
+ ((IEndpointConventionBuilder)outerGroup).Finally(b =>
+ {
+ if (b.Metadata.Any(md => md is string smd && smd == "added-from-inner-group"))
+ {
+ b.Metadata.Add("added-from-outer-group");
+ }
+ });
+
+ var handler = innerGroup.MapGet("/endpoint", () => { });
+ handler.Finally(b => b.Metadata.Add("added-from-endpoint-1"));
+ handler.Finally(b => b.Metadata.Add("added-from-endpoint-2"));
+
+ var endpoint = Assert.Single(builder.DataSources
+ .SelectMany(ds => ds.Endpoints));
+
+ Assert.Equal(new[] { "added-from-endpoint-1", "added-from-endpoint-2", "added-from-inner-group", "added-from-outer-group" }, endpoint.Metadata.GetOrderedMetadata<string>());
+ }
+
+ class MyService { }
+
+ class ServiceAccessingEndpointFilter : IEndpointFilter
{
private ILogger _logger;
- private RouteHandlerContext _routeHandlerContext;
+ private EndpointFilterFactoryContext _routeHandlerContext;
- public ServiceAccessingRouteHandlerFilter(ILoggerFactory loggerFactory, RouteHandlerContext routeHandlerContext)
+ public ServiceAccessingEndpointFilter(ILoggerFactory loggerFactory, EndpointFilterFactoryContext routeHandlerContext)
{
- _logger = loggerFactory.CreateLogger<ServiceAccessingRouteHandlerFilter>();
+ _logger = loggerFactory.CreateLogger<ServiceAccessingEndpointFilter>();
_routeHandlerContext = routeHandlerContext;
}
- public async ValueTask<object?> InvokeAsync(RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next)
+ public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
{
context.HttpContext.Items["loggerErrorIsEnabled"] = _logger.IsEnabled(LogLevel.Error);
context.HttpContext.Items["parentName"] = _routeHandlerContext.MethodInfo.DeclaringType?.Name;
@@ -991,11 +1104,11 @@ public class RouteHandlerEndpointRouteBuilderExtensionsTest : LoggedTest
}
}
- class IncrementArgFilter : IRouteHandlerFilter
+ class IncrementArgFilter : IEndpointFilter
{
- public async ValueTask<object?> InvokeAsync(RouteHandlerInvocationContext context, RouteHandlerFilterDelegate next)
+ public async ValueTask<object?> InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next)
{
- context.Parameters[0] = ((int)context.Parameters[0]!) + 1;
+ context.Arguments[0] = ((int)context.Arguments[0]!) + 1;
return await next(context);
}
}
diff --git a/src/Http/Routing/test/UnitTests/Builder/RoutingEndpointConventionBuilderExtensionsTest.cs b/src/Http/Routing/test/UnitTests/Builder/RoutingEndpointConventionBuilderExtensionsTest.cs
index e398c6c4d7..2140b8dc0c 100644
--- a/src/Http/Routing/test/UnitTests/Builder/RoutingEndpointConventionBuilderExtensionsTest.cs
+++ b/src/Http/Routing/test/UnitTests/Builder/RoutingEndpointConventionBuilderExtensionsTest.cs
@@ -10,6 +10,26 @@ namespace Microsoft.AspNetCore.Builder;
public class RoutingEndpointConventionBuilderExtensionsTest
{
[Fact]
+ public void RequireHost_RegisterConventionAndHostNames()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.RequireHost("contoso.com:8080");
+
+ // Assert
+ var convention = Assert.Single(builder.Conventions);
+
+ var endpointModel = new RouteEndpointBuilder((context) => Task.CompletedTask, RoutePatternFactory.Parse("/"), 0);
+ convention(endpointModel);
+
+ var hostMetadata = Assert.IsType<HostAttribute>(Assert.Single(endpointModel.Metadata));
+
+ Assert.Equal("contoso.com:8080", hostMetadata.Hosts.Single());
+ }
+
+ [Fact]
public void RequireHost_AddsHostMetadata()
{
// Arrange
@@ -149,6 +169,60 @@ public class RoutingEndpointConventionBuilderExtensionsTest
Assert.Equal("SomeEndpointGroupName", endpointGroupName.EndpointGroupName);
}
+ [Fact]
+ public void FinallyConventions_RunAfterOtherConventions()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.WithMetadata("test-metadata");
+ builder.Finally(inner =>
+ {
+ if (inner.Metadata.Any(md => md is string smd && smd == "test-metadata"))
+ {
+ inner.Metadata.Add("found-previous-metadata");
+ }
+ });
+
+ // Assert
+ var endpoint = builder.Build();
+
+ var metadata = endpoint.Metadata.OfType<string>().ToList();
+ Assert.Contains("test-metadata", metadata);
+ Assert.Contains("found-previous-metadata", metadata);
+ }
+
+ [Fact]
+ public void FinallyConventions_CanExamineMetadataInFIFOOrder()
+ {
+ // Arrange
+ var builder = CreateBuilder();
+
+ // Act
+ builder.WithMetadata("test-metadata");
+ builder.Finally(inner =>
+ {
+ if (inner.Metadata.Any(md => md is string smd && smd == "test-metadata"))
+ {
+ inner.Metadata.Add("inner-metadata");
+ }
+ });
+ builder.Finally(inner =>
+ {
+ if (inner.Metadata.Any(md => md is string smd && smd == "inner-metadata"))
+ {
+ inner.Metadata.Add("inner-metadata-2");
+ }
+ });
+
+ // Assert
+ var endpoint = builder.Build();
+
+ var metadata = endpoint.Metadata.OfType<string>().ToArray();
+ Assert.Equal(new[] { "test-metadata", "inner-metadata", "inner-metadata-2" }, metadata);
+ }
+
private TestEndpointConventionBuilder CreateBuilder()
{
var conventionBuilder = new DefaultEndpointConventionBuilder(new RouteEndpointBuilder(
@@ -163,6 +237,7 @@ public class RoutingEndpointConventionBuilderExtensionsTest
{
private readonly DefaultEndpointConventionBuilder _endpointConventionBuilder;
public bool TestProperty { get; } = true;
+ public IList<Action<EndpointBuilder>> Conventions { get; } = new List<Action<EndpointBuilder>>();
public TestEndpointConventionBuilder(DefaultEndpointConventionBuilder endpointConventionBuilder)
{
@@ -171,12 +246,75 @@ public class RoutingEndpointConventionBuilderExtensionsTest
public void Add(Action<EndpointBuilder> convention)
{
+ Conventions.Add(convention);
_endpointConventionBuilder.Add(convention);
}
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ _endpointConventionBuilder.Finally(finalConvention);
+ }
+
public Endpoint Build()
{
return _endpointConventionBuilder.Build();
}
}
+
+ private class DefaultEndpointConventionBuilder : IEndpointConventionBuilder
+ {
+ internal EndpointBuilder EndpointBuilder { get; }
+
+ private List<Action<EndpointBuilder>> _conventions;
+ private List<Action<EndpointBuilder>> _finallyConventions;
+
+ public DefaultEndpointConventionBuilder(EndpointBuilder endpointBuilder)
+ {
+ EndpointBuilder = endpointBuilder;
+ _conventions = new();
+ _finallyConventions = new();
+ }
+
+ public void Add(Action<EndpointBuilder> convention)
+ {
+ var conventions = _conventions;
+
+ if (conventions is null)
+ {
+ throw new InvalidOperationException(Resources.RouteEndpointDataSource_ConventionsCannotBeModifiedAfterBuild);
+ }
+
+ conventions.Add(convention);
+ }
+
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ _finallyConventions?.Add(finalConvention);
+ }
+
+ public Endpoint Build()
+ {
+ // Only apply the conventions once
+ var conventions = Interlocked.Exchange(ref _conventions, null);
+
+ if (conventions is not null)
+ {
+ foreach (var convention in conventions)
+ {
+ convention(EndpointBuilder);
+ }
+ }
+
+ var finallyConventions = Interlocked.Exchange(ref _finallyConventions, null);
+ if (finallyConventions is not null)
+ {
+ foreach (var finallyConvention in finallyConventions)
+ {
+ finallyConvention(EndpointBuilder);
+ }
+ }
+
+ return EndpointBuilder.Build();
+ }
+ }
}
diff --git a/src/Http/Routing/test/UnitTests/CompositeEndpointDataSourceTest.cs b/src/Http/Routing/test/UnitTests/CompositeEndpointDataSourceTest.cs
index ad7bee63ce..3cab4ecef2 100644
--- a/src/Http/Routing/test/UnitTests/CompositeEndpointDataSourceTest.cs
+++ b/src/Http/Routing/test/UnitTests/CompositeEndpointDataSourceTest.cs
@@ -1,9 +1,14 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Collections.ObjectModel;
+using System.Linq;
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.AspNetCore.Routing.TestObjects;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Routing;
@@ -28,6 +33,32 @@ public class CompositeEndpointDataSourceTest
}
[Fact]
+ public void CreatesShallowCopyOf_ListOfGroupedEndpoints()
+ {
+ var endpoint1 = CreateEndpoint("/a");
+ var endpoint2 = CreateEndpoint("/b");
+ var dataSource = new TestGroupDataSource(new RouteEndpoint[] { endpoint1, endpoint2 });
+ var compositeDataSource = new CompositeEndpointDataSource(new[] { dataSource });
+
+ var prefix = RoutePatternFactory.Parse("/");
+ var conventions = Array.Empty<Action<EndpointBuilder>>();
+ var finallyConventions = Array.Empty<Action<EndpointBuilder>>();
+ var applicationServices = new ServiceCollection().BuildServiceProvider();
+
+ var groupedEndpoints = compositeDataSource.GetGroupedEndpoints(new RouteGroupContext
+ {
+ Prefix = prefix,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions,
+ ApplicationServices = applicationServices
+ });
+
+ var resolvedGroupEndpoints = Assert.Single(dataSource.ResolvedGroupedEndpoints);
+ Assert.NotSame(groupedEndpoints, resolvedGroupEndpoints);
+ Assert.Equal(groupedEndpoints, resolvedGroupEndpoints);
+ }
+
+ [Fact]
public void Endpoints_ReturnsAllEndpoints_FromMultipleDataSources()
{
// Arrange
@@ -41,7 +72,7 @@ public class CompositeEndpointDataSourceTest
new DefaultEndpointDataSource(new Endpoint[] { endpoint1, endpoint2 }),
new DefaultEndpointDataSource(new Endpoint[] { endpoint3, endpoint4 }),
new DefaultEndpointDataSource(new Endpoint[] { endpoint5 }),
- });
+ });
// Act
var endpoints = compositeDataSource.Endpoints;
@@ -141,32 +172,334 @@ public class CompositeEndpointDataSourceTest
Assert.False(token.HasChanged);
}
+ [Fact]
+ public void ConsumerChangeToken_IsRefreshed_WhenNewDataSourceCallbackFires()
+ {
+ var endpoint1 = CreateEndpoint("/a");
+ var dataSource1 = new DynamicEndpointDataSource(endpoint1);
+ var observableCollection = new ObservableCollection<EndpointDataSource> { dataSource1 };
+ var compositeDataSource = new CompositeEndpointDataSource(observableCollection);
+
+ var changeToken1 = compositeDataSource.GetChangeToken();
+ var token = Assert.IsType<CancellationChangeToken>(changeToken1);
+ Assert.False(token.HasChanged);
+
+ var endpoint2 = CreateEndpoint("/b");
+
+ // Update ObservableCollection with a new DynamicEndpointDataSource
+ var dataSource2 = new DynamicEndpointDataSource(endpoint2);
+ observableCollection.Add(dataSource2);
+
+ Assert.True(changeToken1.HasChanged);
+ var changeToken2 = compositeDataSource.GetChangeToken();
+ Assert.NotSame(changeToken2, changeToken1);
+ token = Assert.IsType<CancellationChangeToken>(changeToken2);
+ Assert.False(token.HasChanged);
+
+ // Update the newly added DynamicEndpointDataSource
+ var endpoint3 = CreateEndpoint("/c");
+ dataSource2.AddEndpoint(endpoint3);
+
+ Assert.True(changeToken2.HasChanged);
+ var changeToken3 = compositeDataSource.GetChangeToken();
+ Assert.NotSame(changeToken3, changeToken2);
+ Assert.NotSame(changeToken3, changeToken1);
+ token = Assert.IsType<CancellationChangeToken>(changeToken3);
+ Assert.False(token.HasChanged);
+ }
+
+ [Fact]
+ public void ConsumerChangeToken_IsNotRefreshed_AfterDisposal()
+ {
+ var endpoint1 = CreateEndpoint("/a");
+ var dataSource1 = new DynamicEndpointDataSource(endpoint1);
+ var observableCollection = new ObservableCollection<EndpointDataSource> { dataSource1 };
+ var compositeDataSource = new CompositeEndpointDataSource(observableCollection);
+
+ var changeToken1 = compositeDataSource.GetChangeToken();
+ var token = Assert.IsType<CancellationChangeToken>(changeToken1);
+ Assert.False(token.HasChanged);
+
+ var endpoint2 = CreateEndpoint("/b");
+
+ // Update DynamicEndpointDatasource
+ dataSource1.AddEndpoint(endpoint2);
+
+ Assert.True(changeToken1.HasChanged);
+ var changeToken2 = compositeDataSource.GetChangeToken();
+ Assert.NotSame(changeToken2, changeToken1);
+ token = Assert.IsType<CancellationChangeToken>(changeToken2);
+ Assert.False(token.HasChanged);
+
+ // Update ObservableCollection
+ var endpoint3 = CreateEndpoint("/c");
+ var datasource2 = new DynamicEndpointDataSource(endpoint3);
+ observableCollection.Add(datasource2);
+
+ Assert.True(changeToken2.HasChanged);
+ var changeToken3 = compositeDataSource.GetChangeToken();
+ Assert.NotSame(changeToken3, changeToken2);
+ Assert.NotSame(changeToken3, changeToken1);
+ token = Assert.IsType<CancellationChangeToken>(changeToken3);
+ Assert.False(token.HasChanged);
+
+ compositeDataSource.Dispose();
+
+ // Update DynamicEndpointDatasource and ObservableCollection after disposing CompositeEndpointDataSource.
+ var endpoint4 = CreateEndpoint("/d");
+ dataSource1.AddEndpoint(endpoint4);
+ var endpoint5 = CreateEndpoint("/d");
+ var datasource3 = new DynamicEndpointDataSource(endpoint5);
+ observableCollection.Add(datasource3);
+
+ // Token is not changed since the CompositeEndpointDataSource was disposed prior to the last endpoint being added.
+ Assert.False(changeToken3.HasChanged);
+ }
+
+ [Fact]
+ public void GetGroupedEndpoints_ForwardedToChildDataSources()
+ {
+ var endpoint = CreateEndpoint("/a");
+ var dataSource = new TestGroupDataSource(new RouteEndpoint[] { endpoint });
+ var compositeDataSource = new CompositeEndpointDataSource(new[] { dataSource });
+
+ var prefix = RoutePatternFactory.Parse("/prefix");
+ var applicationServices = new ServiceCollection().BuildServiceProvider();
+ var metadata = new EndpointNameMetadata("name");
+ var conventions = new Action<EndpointBuilder>[]
+ {
+ b => b.Metadata.Add(metadata),
+ };
+ var finallyConventions = Array.Empty<Action<EndpointBuilder>>();
+
+ var context = new RouteGroupContext
+ {
+ Prefix = prefix,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions,
+ ApplicationServices = applicationServices
+ };
+ var groupedEndpoints = compositeDataSource.GetGroupedEndpoints(context);
+
+ var receivedContext = Assert.Single(dataSource.ReceivedRouteGroupContexts);
+ Assert.Same(context, receivedContext);
+
+ var resolvedEndpoint = Assert.IsType<RouteEndpoint>(Assert.Single(groupedEndpoints));
+ Assert.Equal("/prefix/a", resolvedEndpoint.RoutePattern.RawText);
+ var resolvedMetadata = Assert.Single(resolvedEndpoint.Metadata);
+ Assert.Same(metadata, resolvedMetadata);
+ }
+
+ [Fact]
+ public void GetGroupedEndpoints_GroupFinallyConventionsApplyToAllEndpoints()
+ {
+ var endpointMetadata = new EndpointMetadataCollection(new object[]
+ {
+ "initial-metadata"
+ });
+ var endpoint1 = CreateEndpoint("/a", metadata: endpointMetadata);
+ var endpoint2 = CreateEndpoint("/b", metadata: endpointMetadata);
+ var dataSource = new TestGroupDataSource(new RouteEndpoint[] { endpoint1, endpoint2 });
+ var compositeDataSource = new CompositeEndpointDataSource(new[] { dataSource });
+
+ var prefix = RoutePatternFactory.Parse("/prefix");
+ var applicationServices = new ServiceCollection().BuildServiceProvider();
+ var metadata = new EndpointNameMetadata("name");
+ var finallyConventions = new Action<EndpointBuilder>[]
+ {
+ b =>
+ {
+ if (b.Metadata.OfType<string>().SingleOrDefault() == "initial-metadata")
+ {
+ b.Metadata.Add(metadata);
+ }
+ }
+ };
+ var conventions = Array.Empty<Action<EndpointBuilder>>();
+
+ var context = new RouteGroupContext
+ {
+ Prefix = prefix,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions,
+ ApplicationServices = applicationServices
+ };
+ var groupedEndpoints = compositeDataSource.GetGroupedEndpoints(context);
+
+ var receivedContext = Assert.Single(dataSource.ReceivedRouteGroupContexts);
+ Assert.Same(context, receivedContext);
+
+ Assert.Collection(groupedEndpoints,
+ endpoint1 =>
+ {
+ var endpoint = Assert.IsType<RouteEndpoint>(endpoint1);
+ Assert.Equal("/prefix/a", endpoint.RoutePattern.RawText);
+ Assert.NotNull(endpoint.Metadata.GetMetadata<IEndpointNameMetadata>());
+ Assert.Equal("initial-metadata", endpoint.Metadata.GetMetadata<string>());
+ },
+ endpoint2 =>
+ {
+ var endpoint = Assert.IsType<RouteEndpoint>(endpoint2);
+ Assert.Equal("/prefix/b", endpoint.RoutePattern.RawText);
+ Assert.NotNull(endpoint.Metadata.GetMetadata<IEndpointNameMetadata>());
+ Assert.Equal("initial-metadata", endpoint.Metadata.GetMetadata<string>());
+ });
+ }
+
+ [Fact]
+ public void GetGroupedEndpoints_GroupFinallyConventionsCanExamineRegularConventions()
+ {
+ var endpoint1 = CreateEndpoint("/a");
+ var endpoint2 = CreateEndpoint("/b");
+ var dataSource = new TestGroupDataSource(new RouteEndpoint[] { endpoint1, endpoint2 });
+ var compositeDataSource = new CompositeEndpointDataSource(new[] { dataSource });
+
+ var prefix = RoutePatternFactory.Parse("/prefix");
+ var applicationServices = new ServiceCollection().BuildServiceProvider();
+ var metadata = new EndpointNameMetadata("name");
+ var conventions = new Action<EndpointBuilder>[]
+ {
+ b => b.Metadata.Add("initial-metadata")
+ };
+ var finallyConventions = new Action<EndpointBuilder>[]
+ {
+ b =>
+ {
+ if (b.Metadata.OfType<string>().SingleOrDefault() == "initial-metadata")
+ {
+ b.Metadata.Add(metadata);
+ }
+ }
+ };
+
+ var context = new RouteGroupContext
+ {
+ Prefix = prefix,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions,
+ ApplicationServices = applicationServices
+ };
+ var groupedEndpoints = compositeDataSource.GetGroupedEndpoints(context);
+
+ var receivedContext = Assert.Single(dataSource.ReceivedRouteGroupContexts);
+ Assert.Same(context, receivedContext);
+
+ Assert.Collection(groupedEndpoints,
+ endpoint1 =>
+ {
+ var endpoint = Assert.IsType<RouteEndpoint>(endpoint1);
+ Assert.Equal("/prefix/a", endpoint.RoutePattern.RawText);
+ Assert.NotNull(endpoint.Metadata.GetMetadata<IEndpointNameMetadata>());
+ Assert.Equal("initial-metadata", endpoint.Metadata.GetMetadata<string>());
+ },
+ endpoint2 =>
+ {
+ var endpoint = Assert.IsType<RouteEndpoint>(endpoint2);
+ Assert.Equal("/prefix/b", endpoint.RoutePattern.RawText);
+ Assert.NotNull(endpoint.Metadata.GetMetadata<IEndpointNameMetadata>());
+ Assert.Equal("initial-metadata", endpoint.Metadata.GetMetadata<string>());
+ });
+ }
+
+ [Fact]
+ public void GetGroupedEndpoints_MultipleGroupFinallyConventionsApplyToAllEndpoints()
+ {
+ var endpointMetadata = new EndpointMetadataCollection(new object[]
+ {
+ "initial-metadata"
+ });
+ var endpoint1 = CreateEndpoint("/a", metadata: endpointMetadata);
+ var endpoint2 = CreateEndpoint("/b", metadata: endpointMetadata);
+ var dataSource = new TestGroupDataSource(new RouteEndpoint[] { endpoint1, endpoint2 });
+ var compositeDataSource = new CompositeEndpointDataSource(new[] { dataSource });
+
+ var prefix = RoutePatternFactory.Parse("/prefix");
+ var applicationServices = new ServiceCollection().BuildServiceProvider();
+ var metadata = new EndpointNameMetadata("name");
+ var finallyConventions = new Action<EndpointBuilder>[]
+ {
+ b =>
+ {
+ if (b.Metadata.OfType<string>().SingleOrDefault() == "initial-metadata")
+ {
+ b.Metadata.Add(metadata);
+ }
+ },
+ b =>
+ {
+ if (b.Metadata.OfType<IEndpointNameMetadata>().SingleOrDefault() is not null)
+ {
+ b.Metadata.Add("saw-last-metadata");
+ }
+ }
+ };
+ var conventions = Array.Empty<Action<EndpointBuilder>>();
+
+ var context = new RouteGroupContext
+ {
+ Prefix = prefix,
+ Conventions = conventions,
+ FinallyConventions = finallyConventions,
+ ApplicationServices = applicationServices
+ };
+ var groupedEndpoints = compositeDataSource.GetGroupedEndpoints(context);
+ // Call twice to ensure that `GetGroupedEndpoints` is idempotent
+ groupedEndpoints = compositeDataSource.GetGroupedEndpoints(context);
+
+ Assert.Collection(dataSource.ReceivedRouteGroupContexts,
+ receivedContext => Assert.Same(context, receivedContext),
+ receivedContext => Assert.Same(context, receivedContext));
+
+ Assert.Collection(groupedEndpoints,
+ endpoint1 =>
+ {
+ var endpoint = Assert.IsType<RouteEndpoint>(endpoint1);
+ Assert.Equal("/prefix/a", endpoint.RoutePattern.RawText);
+ Assert.NotNull(endpoint.Metadata.GetMetadata<IEndpointNameMetadata>());
+ Assert.Equal(new[] { "initial-metadata", "saw-last-metadata" }, endpoint.Metadata.GetOrderedMetadata<string>());
+ },
+ endpoint2 =>
+ {
+ var endpoint = Assert.IsType<RouteEndpoint>(endpoint2);
+ Assert.Equal("/prefix/b", endpoint.RoutePattern.RawText);
+ Assert.NotNull(endpoint.Metadata.GetMetadata<IEndpointNameMetadata>());
+ Assert.Equal(new[] { "initial-metadata", "saw-last-metadata" }, endpoint.Metadata.GetOrderedMetadata<string>());
+ });
+ }
+
private RouteEndpoint CreateEndpoint(
string template,
object defaults = null,
int order = 0,
+ EndpointMetadataCollection metadata = null,
string routeName = null)
{
return new RouteEndpoint(
TestConstants.EmptyRequestDelegate,
RoutePatternFactory.Parse(template, defaults, parameterPolicies: null),
order,
- EndpointMetadataCollection.Empty,
+ metadata ?? EndpointMetadataCollection.Empty,
null);
}
- private class CustomEndpointDataSource : EndpointDataSource
+ private class TestGroupDataSource : EndpointDataSource
{
- private readonly CancellationTokenSource _cts;
- private readonly CancellationChangeToken _token;
+ public TestGroupDataSource(params Endpoint[] endpoints) => Endpoints = endpoints;
+
+ public override IReadOnlyList<Endpoint> Endpoints { get; }
+
+ public List<RouteGroupContext> ReceivedRouteGroupContexts { get; } = new();
+
+ public List<IReadOnlyList<Endpoint>> ResolvedGroupedEndpoints { get; } = new();
- public CustomEndpointDataSource()
+ public override IReadOnlyList<Endpoint> GetGroupedEndpoints(RouteGroupContext context)
{
- _cts = new CancellationTokenSource();
- _token = new CancellationChangeToken(_cts.Token);
+ ReceivedRouteGroupContexts.Add(context);
+ var resolved = base.GetGroupedEndpoints(context);
+ ResolvedGroupedEndpoints.Add(resolved);
+ return resolved;
}
- public override IChangeToken GetChangeToken() => _token;
- public override IReadOnlyList<Endpoint> Endpoints => Array.Empty<Endpoint>();
+ public override IChangeToken GetChangeToken() => NullChangeToken.Singleton;
}
}
diff --git a/src/Http/Routing/test/UnitTests/EndpointMiddlewareTest.cs b/src/Http/Routing/test/UnitTests/EndpointMiddlewareTest.cs
index 16c412e710..3356a1b6ef 100644
--- a/src/Http/Routing/test/UnitTests/EndpointMiddlewareTest.cs
+++ b/src/Http/Routing/test/UnitTests/EndpointMiddlewareTest.cs
@@ -121,6 +121,35 @@ public class EndpointMiddlewareTest
}
[Fact]
+ public async Task Invoke_WithEndpointWithNullRequestDelegate_ThrowsIfAuthAttributesWereFound_ButAuthMiddlewareNotInvoked()
+ {
+ // Arrange
+ var expected = "Endpoint Test contains authorization metadata, but a middleware was not found that supports authorization." +
+ Environment.NewLine +
+ "Configure your application startup by adding app.UseAuthorization() in the application startup code. " +
+ "If there are calls to app.UseRouting() and app.UseEndpoints(...), the call to app.UseAuthorization() must go between them.";
+ var httpContext = new DefaultHttpContext
+ {
+ RequestServices = new ServiceProvider()
+ };
+
+ RequestDelegate throwIfCalled = (c) =>
+ {
+ throw new InvalidTimeZoneException("Should not be called");
+ };
+
+ httpContext.SetEndpoint(new Endpoint(requestDelegate: null, new EndpointMetadataCollection(Mock.Of<IAuthorizeData>()), "Test"));
+
+ var middleware = new EndpointMiddleware(NullLogger<EndpointMiddleware>.Instance, throwIfCalled, RouteOptions);
+
+ // Act & Assert
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => middleware.Invoke(httpContext));
+
+ // Assert
+ Assert.Equal(expected, ex.Message);
+ }
+
+ [Fact]
public async Task Invoke_WithEndpoint_WorksIfAuthAttributesWereFound_AndAuthMiddlewareInvoked()
{
// Arrange
diff --git a/src/Http/Routing/test/UnitTests/EndpointRoutingMiddlewareTest.cs b/src/Http/Routing/test/UnitTests/EndpointRoutingMiddlewareTest.cs
index 6f6bc9b45f..ba1506102c 100644
--- a/src/Http/Routing/test/UnitTests/EndpointRoutingMiddlewareTest.cs
+++ b/src/Http/Routing/test/UnitTests/EndpointRoutingMiddlewareTest.cs
@@ -180,6 +180,7 @@ public class EndpointRoutingMiddlewareTest
matcherFactory,
logger,
new DefaultEndpointRouteBuilder(Mock.Of<IApplicationBuilder>()),
+ new DefaultEndpointDataSource(),
listener,
next);
diff --git a/src/Http/Routing/test/UnitTests/Patterns/RoutePatternFactoryTest.cs b/src/Http/Routing/test/UnitTests/Patterns/RoutePatternFactoryTest.cs
index d454299d25..d2e4bb1470 100644
--- a/src/Http/Routing/test/UnitTests/Patterns/RoutePatternFactoryTest.cs
+++ b/src/Http/Routing/test/UnitTests/Patterns/RoutePatternFactoryTest.cs
@@ -713,4 +713,133 @@ public class RoutePatternFactoryTest
Assert.Same(paramPartC, actual.Parts[1]);
Assert.Same(paramPartD, actual.Parts[2]);
}
+
+ [Theory]
+ [InlineData("/a/b", "")]
+ [InlineData("/a/b", "/")]
+ [InlineData("/a/b/", "")]
+ [InlineData("/a/b/", "/")]
+ [InlineData("/a", "b/")]
+ [InlineData("/a/", "b/")]
+ [InlineData("/a", "/b/")]
+ [InlineData("/a/", "/b/")]
+ [InlineData("/", "a/b/")]
+ [InlineData("/", "/a/b/")]
+ [InlineData("", "a/b/")]
+ [InlineData("", "/a/b/")]
+ public void Combine_HandlesEmptyPatternsAndDuplicateSeperatorsInRawText(string leftTemplate, string rightTemplate)
+ {
+ var left = RoutePatternFactory.Parse(leftTemplate);
+ var right = RoutePatternFactory.Parse(rightTemplate);
+
+ var combined = RoutePatternFactory.Combine(left, right);
+
+ static Action<RoutePatternPathSegment> AssertLiteral(string literal)
+ {
+ return segment =>
+ {
+ var part = Assert.IsType<RoutePatternLiteralPart>(Assert.Single(segment.Parts));
+ Assert.Equal(literal, part.Content);
+ };
+ }
+
+ Assert.Equal("/a/b/", combined.RawText);
+ Assert.Collection(combined.PathSegments, AssertLiteral("a"), AssertLiteral("b"));
+ }
+
+ [Fact]
+ public void Combine_WithDuplicateParameters_Throws()
+ {
+ // Parameter names are case insensitive
+ var left = RoutePatternFactory.Parse("/{id}");
+ var right = RoutePatternFactory.Parse("/{ID}");
+
+ var ex = Assert.Throws<RoutePatternException>(() => RoutePatternFactory.Combine(left, right));
+
+ Assert.Equal("/{id}/{ID}", ex.Pattern);
+ Assert.Equal("The route parameter name 'ID' appears more than one time in the route template.", ex.Message);
+ }
+
+ [Fact]
+ public void Combine_WithDuplicateDefaults_DoesNotThrow()
+ {
+ // Keys should be case insensitive.
+ var left = RoutePatternFactory.Parse("/a/{x=foo}");
+ var right = RoutePatternFactory.Parse("/b", defaults: new { X = "foo" }, parameterPolicies: null);
+
+ var combined = RoutePatternFactory.Combine(left, right);
+
+ Assert.Equal("/a/{x=foo}/b", combined.RawText);
+
+ var (key, value) = Assert.Single(combined.Defaults);
+ Assert.Equal("x", key);
+ Assert.Equal("foo", value);
+ }
+
+ [Fact]
+ public void Combine_WithDuplicateRequiredValues_DoesNotThrow()
+ {
+ // Keys should be case insensitive.
+ // The required value must be a parameter or a default to parse. Since we cannot repeat parameters, we set defaults instead.
+ var left = RoutePatternFactory.Parse("/a", defaults: new { x = "foo" }, parameterPolicies: null, requiredValues: new { x = "foo" });
+ var right = RoutePatternFactory.Parse("/b", defaults: new { X = "foo" }, parameterPolicies: null, requiredValues: new { X = "foo" });
+
+ var combined = RoutePatternFactory.Combine(left, right);
+
+ Assert.Equal("/a/b", combined.RawText);
+
+ var (key, value) = Assert.Single(combined.RequiredValues);
+ Assert.Equal("x", key);
+ Assert.Equal("foo", value);
+ }
+
+ [Fact]
+ public void Combine_WithDuplicateParameterPolicies_Throws()
+ {
+ // Since even the exact same instance and keys throw, we don't bother testing different key casing.
+ var policies = new { X = new RegexRouteConstraint("x"), };
+
+ var left = RoutePatternFactory.Parse("/a", defaults: null, parameterPolicies: policies);
+ var right = RoutePatternFactory.Parse("/b", defaults: null, parameterPolicies: policies);
+
+ var ex = Assert.Throws<InvalidOperationException>(() => RoutePatternFactory.Combine(left, right));
+ Assert.Equal("MapGroup cannot build a pattern for '/a/b' because the 'RoutePattern.ParameterPolicies' dictionary key 'X' has multiple values.", ex.Message);
+ }
+
+ [Fact]
+ public void Combine_WithConflictingDefaults_Throws()
+ {
+ // Keys should be case insensitive but not values.
+ // Value differs in casing. As long as object.Equals(object?, object?) returns false, there's a conflict.
+ var left = RoutePatternFactory.Parse("/a/{x=foo}");
+ var right = RoutePatternFactory.Parse("/b", defaults: new { X = "Foo" }, parameterPolicies: null);
+
+ var ex = Assert.Throws<InvalidOperationException>(() => RoutePatternFactory.Combine(left, right));
+ Assert.Equal("MapGroup cannot build a pattern for '/a/{x=foo}/b' because the 'RoutePattern.Defaults' dictionary key 'X' has multiple values.", ex.Message);
+ }
+
+ [Fact]
+ public void Combine_WithConflictingRequiredValues_Throws()
+ {
+ // Keys should be case insensitive but not values.
+ // Value differs in casing. As long as object.Equals(object?, object?) returns false, there's a conflict.
+ // The required value must be a parameter or a default to parse. Since we cannot repeat parameters, we set defaults instead.
+ var left = RoutePatternFactory.Parse("/a", defaults: new { x = "foo" }, parameterPolicies: null, requiredValues: new { x = "foo" });
+ var right = RoutePatternFactory.Parse("/b", defaults: new { X = "foo" }, parameterPolicies: null, requiredValues: new { X = "Foo" });
+
+ var ex = Assert.Throws<InvalidOperationException>(() => RoutePatternFactory.Combine(left, right));
+ Assert.Equal("MapGroup cannot build a pattern for '/a/b' because the 'RoutePattern.RequiredValues' dictionary key 'X' has multiple values.", ex.Message);
+ }
+
+ [Fact]
+ public void Combine_WithConflictingParameterPolicies_Throws()
+ {
+ // Even the exact same policy instance throws, but this verifies theres a conflict even if the policy is defined via a pattern in one part.
+ // The policy is defined via a pattern in bot parts because parameters cannot be repeated.
+ var left = RoutePatternFactory.Parse("/a/{x:string}");
+ var right = RoutePatternFactory.Parse("/b", defaults: null, parameterPolicies: new { X = new RegexRouteConstraint("foo") });
+
+ var ex = Assert.Throws<InvalidOperationException>(() => RoutePatternFactory.Combine(left, right));
+ Assert.Equal("MapGroup cannot build a pattern for '/a/{x:string}/b' because the 'RoutePattern.ParameterPolicies' dictionary key 'X' has multiple values.", ex.Message);
+ }
}
diff --git a/src/Http/Routing/test/UnitTests/RouteEndpointBuilderTest.cs b/src/Http/Routing/test/UnitTests/RouteEndpointBuilderTest.cs
index ed6f408337..7539757125 100644
--- a/src/Http/Routing/test/UnitTests/RouteEndpointBuilderTest.cs
+++ b/src/Http/Routing/test/UnitTests/RouteEndpointBuilderTest.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing.Patterns;
@@ -28,4 +29,105 @@ public class RouteEndpointBuilderTest
Assert.Equal("/", endpoint.RoutePattern.RawText);
Assert.Equal(metadata, Assert.Single(endpoint.Metadata));
}
+
+ [Fact]
+ public void Build_UpdateHttpMethodMetadata_WhenCorsPresent()
+ {
+ // Arrange
+ const int defaultOrder = 0;
+ static Task RequestDelegate(HttpContext d) => null;
+
+ var builder = new RouteEndpointBuilder(RequestDelegate, RoutePatternFactory.Parse("/"), defaultOrder)
+ {
+ DisplayName = "Display name!",
+ Metadata = { new TestCorsMetadata(), new HttpMethodMetadata(new[] { HttpMethods.Delete }, acceptCorsPreflight: false) }
+ };
+
+ // Act && Assert
+ var endpoint = Assert.IsType<RouteEndpoint>(builder.Build());
+ var httpMethodMetadata = endpoint.Metadata.GetMetadata<HttpMethodMetadata>();
+ Assert.NotNull(httpMethodMetadata);
+ Assert.True(httpMethodMetadata.AcceptCorsPreflight);
+ }
+
+ [Fact]
+ public void Build_UpdateLastHttpMethodMetadata_WhenCorsPresent()
+ {
+ // Arrange
+ const int defaultOrder = 0;
+ static Task RequestDelegate(HttpContext d) => null;
+
+ var builder = new RouteEndpointBuilder(RequestDelegate, RoutePatternFactory.Parse("/"), defaultOrder)
+ {
+ DisplayName = "Display name!",
+ Metadata = { new HttpMethodMetadata(new[] { HttpMethods.Get }, acceptCorsPreflight: false), new TestCorsMetadata(), new HttpMethodMetadata(new[] { HttpMethods.Delete }, acceptCorsPreflight: false) }
+ };
+
+ // Act && Assert
+ var endpoint = Assert.IsType<RouteEndpoint>(builder.Build());
+
+ Assert.Collection(endpoint.Metadata.GetOrderedMetadata<HttpMethodMetadata>(),
+ (metadata) => Assert.False(metadata.AcceptCorsPreflight),
+ (metadata) => Assert.True(metadata.AcceptCorsPreflight));
+ }
+
+ [Fact]
+ public void Build_DoesNotChangeHttpMethodMetadata_WhenCorsNotPresent()
+ {
+ // Arrange
+ const int defaultOrder = 0;
+ static Task RequestDelegate(HttpContext d) => null;
+
+ var builder = new RouteEndpointBuilder(RequestDelegate, RoutePatternFactory.Parse("/"), defaultOrder)
+ {
+ DisplayName = "Display name!",
+ Metadata = { new HttpMethodMetadata(new[] { HttpMethods.Delete }, acceptCorsPreflight: false) }
+ };
+
+ // Act && Assert
+ var endpoint = Assert.IsType<RouteEndpoint>(builder.Build());
+ var httpMethodMetadata = endpoint.Metadata.GetMetadata<HttpMethodMetadata>();
+ Assert.NotNull(httpMethodMetadata);
+ Assert.False(httpMethodMetadata.AcceptCorsPreflight);
+ }
+
+ [Fact]
+ public async void Build_DoesNot_RunFilters()
+ {
+ var endpointFilterCallCount = 0;
+ var invocationFilterCallCount = 0;
+ var invocationCallCount = 0;
+
+ const int defaultOrder = 0;
+ RequestDelegate requestDelegate = (d) =>
+ {
+ invocationCallCount++;
+ return Task.CompletedTask;
+ };
+
+ var builder = new RouteEndpointBuilder(requestDelegate, RoutePatternFactory.Parse("/"), defaultOrder);
+
+ builder.FilterFactories.Add((endopintContext, next) =>
+ {
+ endpointFilterCallCount++;
+
+ return invocationContext =>
+ {
+ invocationFilterCallCount++;
+
+ return next(invocationContext);
+ };
+ });
+
+ var endpoint = Assert.IsType<RouteEndpoint>(builder.Build());
+
+ await endpoint.RequestDelegate(new DefaultHttpContext());
+
+ Assert.Equal(0, endpointFilterCallCount);
+ Assert.Equal(0, invocationFilterCallCount);
+ Assert.Equal(1, invocationCallCount);
+ }
+
+ private class TestCorsMetadata : ICorsMetadata
+ { }
}
diff --git a/src/Http/Routing/test/UnitTests/RouteHandlerOptionsTests.cs b/src/Http/Routing/test/UnitTests/RouteHandlerOptionsTests.cs
index 247fc36674..96025ce574 100644
--- a/src/Http/Routing/test/UnitTests/RouteHandlerOptionsTests.cs
+++ b/src/Http/Routing/test/UnitTests/RouteHandlerOptionsTests.cs
@@ -55,14 +55,15 @@ public class RouteHandlerOptionsTests
}
[Fact]
- public void RouteHandlerOptionsFailsToResolveWithoutHostEnvironment()
+ public void RouteHandlerOptionsCanResolveWithoutHostEnvironment()
{
var services = new ServiceCollection();
services.AddOptions();
services.AddRouting();
var serviceProvider = services.BuildServiceProvider();
- Assert.Throws<InvalidOperationException>(() => serviceProvider.GetRequiredService<IOptions<RouteHandlerOptions>>());
+ var options = serviceProvider.GetRequiredService<IOptions<RouteHandlerOptions>>();
+ Assert.False(options.Value.ThrowOnBadRequest);
}
private class HostEnvironment : IHostEnvironment
diff --git a/src/Http/Routing/test/UnitTests/RoutingEndpointConventionBuilderExtensionsTests.cs b/src/Http/Routing/test/UnitTests/RoutingEndpointConventionBuilderExtensionsTests.cs
deleted file mode 100644
index f29aff5f1b..0000000000
--- a/src/Http/Routing/test/UnitTests/RoutingEndpointConventionBuilderExtensionsTests.cs
+++ /dev/null
@@ -1,40 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Routing.Patterns;
-
-namespace Microsoft.AspNetCore.Routing;
-
-public class RoutingEndpointConventionBuilderExtensionsTests
-{
- [Fact]
- public void RequireHost_HostNames()
- {
- // Arrange
- var builder = new TestEndpointConventionBuilder();
-
- // Act
- builder.RequireHost("contoso.com:8080");
-
- // Assert
- var convention = Assert.Single(builder.Conventions);
-
- var endpointModel = new RouteEndpointBuilder((context) => Task.CompletedTask, RoutePatternFactory.Parse("/"), 0);
- convention(endpointModel);
-
- var hostMetadata = Assert.IsType<HostAttribute>(Assert.Single(endpointModel.Metadata));
-
- Assert.Equal("contoso.com:8080", hostMetadata.Hosts.Single());
- }
-
- private class TestEndpointConventionBuilder : IEndpointConventionBuilder
- {
- public IList<Action<EndpointBuilder>> Conventions { get; } = new List<Action<EndpointBuilder>>();
-
- public void Add(Action<EndpointBuilder> convention)
- {
- Conventions.Add(convention);
- }
- }
-}
diff --git a/src/Http/Routing/test/testassets/RoutingSandbox/Framework/FrameworkEndpointDataSource.cs b/src/Http/Routing/test/testassets/RoutingSandbox/Framework/FrameworkEndpointDataSource.cs
index a7a88e5f3d..0ca5e83e0a 100644
--- a/src/Http/Routing/test/testassets/RoutingSandbox/Framework/FrameworkEndpointDataSource.cs
+++ b/src/Http/Routing/test/testassets/RoutingSandbox/Framework/FrameworkEndpointDataSource.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Routing.Patterns;
diff --git a/src/Http/Routing/tools/Swaggatherer/RouteEntry.cs b/src/Http/Routing/tools/Swaggatherer/RouteEntry.cs
index fc954d364e..c8c273d029 100644
--- a/src/Http/Routing/tools/Swaggatherer/RouteEntry.cs
+++ b/src/Http/Routing/tools/Swaggatherer/RouteEntry.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Routing.Template;
namespace Swaggatherer;
-internal class RouteEntry
+internal sealed class RouteEntry
{
public RouteTemplate Template { get; set; }
public string Method { get; set; }
diff --git a/src/Http/Routing/tools/Swaggatherer/SwaggathererApplication.cs b/src/Http/Routing/tools/Swaggatherer/SwaggathererApplication.cs
index 95bcb0ac4e..6fb018f50d 100644
--- a/src/Http/Routing/tools/Swaggatherer/SwaggathererApplication.cs
+++ b/src/Http/Routing/tools/Swaggatherer/SwaggathererApplication.cs
@@ -12,7 +12,7 @@ using Newtonsoft.Json.Linq;
namespace Swaggatherer;
-internal class SwaggathererApplication : CommandLineApplication
+internal sealed class SwaggathererApplication : CommandLineApplication
{
public SwaggathererApplication()
{
diff --git a/src/Http/WebUtilities/src/BufferedReadStream.cs b/src/Http/WebUtilities/src/BufferedReadStream.cs
index 46627a1a56..8e20cf3105 100644
--- a/src/Http/WebUtilities/src/BufferedReadStream.cs
+++ b/src/Http/WebUtilities/src/BufferedReadStream.cs
@@ -419,10 +419,7 @@ public class BufferedReadStream : Stream
private void CheckDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(BufferedReadStream));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(BufferedReadStream));
}
private static void ValidateBuffer(byte[] buffer, int offset, int count)
diff --git a/src/Http/WebUtilities/src/FileBufferingReadStream.cs b/src/Http/WebUtilities/src/FileBufferingReadStream.cs
index e96047a75a..11828e046f 100644
--- a/src/Http/WebUtilities/src/FileBufferingReadStream.cs
+++ b/src/Http/WebUtilities/src/FileBufferingReadStream.cs
@@ -313,7 +313,8 @@ public class FileBufferingReadStream : Stream
{
_buffer.Write(buffer.Slice(0, read));
}
- else
+ // Allow zero-byte reads
+ else if (buffer.Length > 0)
{
_completelyBuffered = true;
}
@@ -388,7 +389,8 @@ public class FileBufferingReadStream : Stream
{
await _buffer.WriteAsync(buffer.Slice(0, read), cancellationToken);
}
- else
+ // Allow zero-byte reads
+ else if (buffer.Length > 0)
{
_completelyBuffered = true;
}
@@ -500,9 +502,6 @@ public class FileBufferingReadStream : Stream
private void ThrowIfDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(FileBufferingReadStream));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(FileBufferingReadStream));
}
}
diff --git a/src/Http/WebUtilities/src/FileBufferingWriteStream.cs b/src/Http/WebUtilities/src/FileBufferingWriteStream.cs
index f6a71a3af6..d73e7a2c39 100644
--- a/src/Http/WebUtilities/src/FileBufferingWriteStream.cs
+++ b/src/Http/WebUtilities/src/FileBufferingWriteStream.cs
@@ -283,18 +283,12 @@ public sealed class FileBufferingWriteStream : Stream
private void ThrowIfDisposed()
{
- if (Disposed)
- {
- throw new ObjectDisposedException(nameof(FileBufferingWriteStream));
- }
+ ObjectDisposedException.ThrowIf(Disposed, nameof(FileBufferingWriteStream));
}
private static void ThrowArgumentException(byte[] buffer, int offset, int count)
{
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
+ ArgumentNullException.ThrowIfNull(buffer);
if (offset < 0)
{
diff --git a/src/Http/WebUtilities/src/FormMultipartSection.cs b/src/Http/WebUtilities/src/FormMultipartSection.cs
index bd67a6f162..890104773f 100644
--- a/src/Http/WebUtilities/src/FormMultipartSection.cs
+++ b/src/Http/WebUtilities/src/FormMultipartSection.cs
@@ -53,8 +53,13 @@ public class FormMultipartSection
/// Gets the form value
/// </summary>
/// <returns>The form value</returns>
- public Task<string> GetValueAsync()
- {
- return Section.ReadAsStringAsync();
- }
+ public Task<string> GetValueAsync() => Section.ReadAsStringAsync();
+
+ /// <summary>
+ /// Gets the form value
+ /// </summary>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns>The form value</returns>
+ public ValueTask<string> GetValueAsync(CancellationToken cancellationToken)
+ => Section.ReadAsStringAsync(cancellationToken);
}
diff --git a/src/Http/WebUtilities/src/FormPipeReader.cs b/src/Http/WebUtilities/src/FormPipeReader.cs
index 845ad7bf6b..d803dc7f72 100644
--- a/src/Http/WebUtilities/src/FormPipeReader.cs
+++ b/src/Http/WebUtilities/src/FormPipeReader.cs
@@ -26,8 +26,8 @@ public class FormPipeReader
// Used for UTF8/ASCII (precalculated for fast path)
// This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- private static ReadOnlySpan<byte> UTF8EqualEncoded => new byte[] { (byte)'=' };
- private static ReadOnlySpan<byte> UTF8AndEncoded => new byte[] { (byte)'&' };
+ private static ReadOnlySpan<byte> UTF8EqualEncoded => "="u8;
+ private static ReadOnlySpan<byte> UTF8AndEncoded => "&"u8;
// Used for other encodings
private readonly byte[]? _otherEqualEncoding;
@@ -251,7 +251,7 @@ public class FormPipeReader
if (!isFinalBlock)
{
// +2 to account for '&' and '='
- if ((sequenceReader.Length - consumedBytes) > (long)KeyLengthLimit + (long)ValueLengthLimit + 2)
+ if ((sequenceReader.Length - consumedBytes) > (long)KeyLengthLimit + (long)ValueLengthLimit + 2)
{
ThrowKeyOrValueTooLargeException();
}
diff --git a/src/Http/WebUtilities/src/HttpRequestStreamReader.cs b/src/Http/WebUtilities/src/HttpRequestStreamReader.cs
index eb746c8cc4..edb97c8465 100644
--- a/src/Http/WebUtilities/src/HttpRequestStreamReader.cs
+++ b/src/Http/WebUtilities/src/HttpRequestStreamReader.cs
@@ -123,10 +123,7 @@ public class HttpRequestStreamReader : TextReader
/// <inheritdoc />
public override int Peek()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpRequestStreamReader));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpRequestStreamReader));
if (_charBufferIndex == _charsRead)
{
@@ -142,10 +139,7 @@ public class HttpRequestStreamReader : TextReader
/// <inheritdoc />
public override int Read()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpRequestStreamReader));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpRequestStreamReader));
if (_charBufferIndex == _charsRead)
{
@@ -188,10 +182,7 @@ public class HttpRequestStreamReader : TextReader
throw new ArgumentNullException(nameof(buffer));
}
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpRequestStreamReader));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpRequestStreamReader));
var count = buffer.Length;
var charsRead = 0;
@@ -260,10 +251,7 @@ public class HttpRequestStreamReader : TextReader
[SuppressMessage("ApiDesign", "RS0027:Public API with optional parameter(s) should have the most parameters amongst its public overloads.", Justification = "Required to maintain compatibility")]
public override async ValueTask<int> ReadAsync(Memory<char> buffer, CancellationToken cancellationToken = default)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpRequestStreamReader));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpRequestStreamReader));
if (_charBufferIndex == _charsRead && await ReadIntoBufferAsync() == 0)
{
@@ -353,10 +341,7 @@ public class HttpRequestStreamReader : TextReader
/// <inheritdoc />
public override async Task<string?> ReadLineAsync()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpRequestStreamReader));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpRequestStreamReader));
StringBuilder? sb = null;
var consumeLineFeed = false;
@@ -391,10 +376,7 @@ public class HttpRequestStreamReader : TextReader
/// <inheritdoc />
public override string? ReadLine()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpRequestStreamReader));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpRequestStreamReader));
StringBuilder? sb = null;
var consumeLineFeed = false;
diff --git a/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs
index 82a510842f..93207cd904 100644
--- a/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs
+++ b/src/Http/WebUtilities/src/HttpResponseStreamWriter.cs
@@ -108,10 +108,7 @@ public class HttpResponseStreamWriter : TextWriter
/// <inheritdoc/>
public override void Write(char value)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpResponseStreamWriter));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpResponseStreamWriter));
if (_charBufferCount == _charBufferSize)
{
@@ -125,10 +122,7 @@ public class HttpResponseStreamWriter : TextWriter
/// <inheritdoc/>
public override void Write(char[] values, int index, int count)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpResponseStreamWriter));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpResponseStreamWriter));
if (values == null)
{
@@ -149,10 +143,7 @@ public class HttpResponseStreamWriter : TextWriter
/// <inheritdoc/>
public override void Write(ReadOnlySpan<char> value)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpResponseStreamWriter));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpResponseStreamWriter));
var remaining = value.Length;
while (remaining > 0)
@@ -172,10 +163,7 @@ public class HttpResponseStreamWriter : TextWriter
/// <inheritdoc/>
public override void Write(string? value)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpResponseStreamWriter));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpResponseStreamWriter));
if (value == null)
{
@@ -198,10 +186,7 @@ public class HttpResponseStreamWriter : TextWriter
/// <inheritdoc/>
public override void WriteLine(ReadOnlySpan<char> value)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpResponseStreamWriter));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpResponseStreamWriter));
Write(value);
Write(NewLine);
@@ -523,10 +508,7 @@ public class HttpResponseStreamWriter : TextWriter
/// <inheritdoc/>
public override void Flush()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(HttpResponseStreamWriter));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(HttpResponseStreamWriter));
FlushInternal(flushEncoder: true);
}
diff --git a/src/Http/WebUtilities/src/MultipartBoundary.cs b/src/Http/WebUtilities/src/MultipartBoundary.cs
index 798f20ac9d..efdc5eaf23 100644
--- a/src/Http/WebUtilities/src/MultipartBoundary.cs
+++ b/src/Http/WebUtilities/src/MultipartBoundary.cs
@@ -5,7 +5,7 @@ using System.Text;
namespace Microsoft.AspNetCore.WebUtilities;
-internal class MultipartBoundary
+internal sealed class MultipartBoundary
{
private readonly int[] _skipTable = new int[256];
private readonly string _boundary;
diff --git a/src/Http/WebUtilities/src/MultipartReader.cs b/src/Http/WebUtilities/src/MultipartReader.cs
index 847b263dd8..e8be2fe032 100644
--- a/src/Http/WebUtilities/src/MultipartReader.cs
+++ b/src/Http/WebUtilities/src/MultipartReader.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.Extensions.Primitives;
+using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.WebUtilities;
@@ -61,6 +62,7 @@ public class MultipartReader
throw new ArgumentOutOfRangeException(nameof(bufferSize), bufferSize, "Insufficient buffer space, the buffer must be larger than the boundary: " + boundary);
}
_stream = new BufferedReadStream(stream, bufferSize);
+ boundary = HeaderUtilities.RemoveQuotes(new StringSegment(boundary)).ToString();
_boundary = new MultipartBoundary(boundary, false);
// This stream will drain any preamble data and remove the first boundary marker.
// TODO: HeadersLengthLimit can't be modified until after the constructor.
@@ -78,7 +80,8 @@ public class MultipartReader
public int HeadersLengthLimit { get; set; } = DefaultHeadersLengthLimit;
/// <summary>
- /// The optional limit for the total response body length.
+ /// The optional limit for the body length of each multipart section.
+ /// The hosting server is responsible for limiting the overall body length.
/// </summary>
public long? BodyLengthLimit { get; set; }
diff --git a/src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs b/src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs
index 99de2d74a0..c7ef37f513 100644
--- a/src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs
+++ b/src/Http/WebUtilities/src/MultipartSectionStreamExtensions.cs
@@ -16,19 +16,25 @@ public static class MultipartSectionStreamExtensions
/// </summary>
/// <param name="section">The section to read from</param>
/// <returns>The body steam as string</returns>
- public static async Task<string> ReadAsStringAsync(this MultipartSection section)
+ public static Task<string> ReadAsStringAsync(this MultipartSection section)
+ => section.ReadAsStringAsync(CancellationToken.None).AsTask();
+
+ /// <summary>
+ /// Reads the body of the section as a string
+ /// </summary>
+ /// <param name="section">The section to read from</param>
+ /// <param name="cancellationToken">The cancellationt token.</param>
+ /// <returns>The body steam as string</returns>
+ public static async ValueTask<string> ReadAsStringAsync(this MultipartSection section, CancellationToken cancellationToken)
{
- if (section == null)
- {
- throw new ArgumentNullException(nameof(section));
- }
+ ArgumentNullException.ThrowIfNull(section);
if (section.Body is null)
{
throw new ArgumentException("Multipart section must have a body to be read.", nameof(section));
}
- MediaTypeHeaderValue.TryParse(section.ContentType, out var sectionMediaType);
+ _ = MediaTypeHeaderValue.TryParse(section.ContentType, out var sectionMediaType);
var streamEncoding = sectionMediaType?.Encoding;
// https://docs.microsoft.com/en-us/dotnet/core/compatibility/syslib-warnings/syslib0001
@@ -37,14 +43,12 @@ public static class MultipartSectionStreamExtensions
streamEncoding = Encoding.UTF8;
}
- using (var reader = new StreamReader(
+ using var reader = new StreamReader(
section.Body,
streamEncoding,
detectEncodingFromByteOrderMarks: true,
bufferSize: 1024,
- leaveOpen: true))
- {
- return await reader.ReadToEndAsync();
- }
+ leaveOpen: true);
+ return await reader.ReadToEndAsync(cancellationToken);
}
}
diff --git a/src/Http/WebUtilities/src/PagedByteBuffer.cs b/src/Http/WebUtilities/src/PagedByteBuffer.cs
index 92571acefe..519b103a2a 100644
--- a/src/Http/WebUtilities/src/PagedByteBuffer.cs
+++ b/src/Http/WebUtilities/src/PagedByteBuffer.cs
@@ -136,9 +136,6 @@ internal sealed class PagedByteBuffer : IDisposable
private void ThrowIfDisposed()
{
- if (Disposed)
- {
- throw new ObjectDisposedException(nameof(PagedByteBuffer));
- }
+ ObjectDisposedException.ThrowIf(Disposed, nameof(PagedByteBuffer));
}
}
diff --git a/src/Http/WebUtilities/src/PublicAPI.Shipped.txt b/src/Http/WebUtilities/src/PublicAPI.Shipped.txt
index 6d93c8e64c..dd7cfe5aff 100644
--- a/src/Http/WebUtilities/src/PublicAPI.Shipped.txt
+++ b/src/Http/WebUtilities/src/PublicAPI.Shipped.txt
@@ -108,17 +108,20 @@ Microsoft.AspNetCore.WebUtilities.MultipartSectionConverterExtensions
Microsoft.AspNetCore.WebUtilities.MultipartSectionStreamExtensions
Microsoft.AspNetCore.WebUtilities.QueryHelpers
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable
+Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair.EncodedNameValuePair() -> void
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair.DecodeName() -> System.ReadOnlyMemory<char>
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair.DecodeValue() -> System.ReadOnlyMemory<char>
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair.EncodedName.get -> System.ReadOnlyMemory<char>
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair.EncodedValue.get -> System.ReadOnlyMemory<char>
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.Enumerator
+Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.Enumerator.Current.get -> Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.EncodedNameValuePair
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.Enumerator.MoveNext() -> bool
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.GetEnumerator() -> Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.Enumerator
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.QueryStringEnumerable(string? queryString) -> void
Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.QueryStringEnumerable(System.ReadOnlyMemory<char> queryString) -> void
+Microsoft.AspNetCore.WebUtilities.QueryStringEnumerable.QueryStringEnumerable() -> void
Microsoft.AspNetCore.WebUtilities.ReasonPhrases
Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions
Microsoft.AspNetCore.WebUtilities.WebEncoders
diff --git a/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt b/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt
index 84904866b1..167cb41f2c 100644
--- a/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt
+++ b/src/Http/WebUtilities/src/PublicAPI.Unshipped.txt
@@ -1,7 +1,9 @@
#nullable enable
+Microsoft.AspNetCore.WebUtilities.FormMultipartSection.GetValueAsync(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<string!>
override Microsoft.AspNetCore.WebUtilities.BufferedReadStream.WriteAsync(System.ReadOnlyMemory<byte> buffer, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
override Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream.WriteAsync(System.ReadOnlyMemory<byte> buffer, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
override Microsoft.AspNetCore.WebUtilities.FileBufferingWriteStream.ReadAsync(System.Memory<byte> buffer, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<int>
override Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter.WriteLineAsync(char value) -> System.Threading.Tasks.Task!
override Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter.WriteLineAsync(char[]! values, int index, int count) -> System.Threading.Tasks.Task!
override Microsoft.AspNetCore.WebUtilities.HttpResponseStreamWriter.WriteLineAsync(string? value) -> System.Threading.Tasks.Task!
+static Microsoft.AspNetCore.WebUtilities.MultipartSectionStreamExtensions.ReadAsStringAsync(this Microsoft.AspNetCore.WebUtilities.MultipartSection! section, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<string!>
diff --git a/src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs b/src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs
index 26ed3a854e..c4bffe076f 100644
--- a/src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs
+++ b/src/Http/WebUtilities/test/FileBufferingReadStreamTests.cs
@@ -37,6 +37,39 @@ public class FileBufferingReadStreamTests
}
[Fact]
+ public void FileBufferingReadStream_Sync0ByteReadUnderThreshold_DoesntCreateFile()
+ {
+ var inner = MakeStream(1024);
+ using (var stream = new FileBufferingReadStream(inner, 1024 * 2, null, Directory.GetCurrentDirectory()))
+ {
+ var bytes = new byte[1000];
+ var read0 = stream.Read(bytes, 0, 0);
+ Assert.Equal(0, read0);
+ Assert.Equal(read0, stream.Length);
+ Assert.Equal(read0, stream.Position);
+ Assert.True(stream.InMemory);
+ Assert.Null(stream.TempFileName);
+
+ var read1 = stream.Read(bytes, 0, bytes.Length);
+ Assert.Equal(bytes.Length, read1);
+ Assert.Equal(read0 + read1, stream.Length);
+ Assert.Equal(read0 + read1, stream.Position);
+ Assert.True(stream.InMemory);
+ Assert.Null(stream.TempFileName);
+
+ var read2 = stream.Read(bytes, 0, bytes.Length);
+ Assert.Equal(inner.Length - read0 - read1, read2);
+ Assert.Equal(read0 + read1 + read2, stream.Length);
+ Assert.Equal(read0 + read1 + read2, stream.Position);
+ Assert.True(stream.InMemory);
+ Assert.Null(stream.TempFileName);
+
+ var read3 = stream.Read(bytes, 0, bytes.Length);
+ Assert.Equal(0, read3);
+ }
+ }
+
+ [Fact]
public void FileBufferingReadStream_SyncReadUnderThreshold_DoesntCreateFile()
{
var inner = MakeStream(1024 * 2);
@@ -166,6 +199,39 @@ public class FileBufferingReadStreamTests
///////////////////
[Fact]
+ public async Task FileBufferingReadStream_Async0ByteReadUnderThreshold_DoesntCreateFile()
+ {
+ var inner = MakeStream(1024);
+ using (var stream = new FileBufferingReadStream(inner, 1024 * 2, null, Directory.GetCurrentDirectory()))
+ {
+ var bytes = new byte[1000];
+ var read0 = await stream.ReadAsync(bytes, 0, 0);
+ Assert.Equal(0, read0);
+ Assert.Equal(read0, stream.Length);
+ Assert.Equal(read0, stream.Position);
+ Assert.True(stream.InMemory);
+ Assert.Null(stream.TempFileName);
+
+ var read1 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(bytes.Length, read1);
+ Assert.Equal(read0 + read1, stream.Length);
+ Assert.Equal(read0 + read1, stream.Position);
+ Assert.True(stream.InMemory);
+ Assert.Null(stream.TempFileName);
+
+ var read2 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(inner.Length - read0 - read1, read2);
+ Assert.Equal(read0 + read1 + read2, stream.Length);
+ Assert.Equal(read0 + read1 + read2, stream.Position);
+ Assert.True(stream.InMemory);
+ Assert.Null(stream.TempFileName);
+
+ var read3 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(0, read3);
+ }
+ }
+
+ [Fact]
public async Task FileBufferingReadStream_AsyncReadUnderThreshold_DoesntCreateFile()
{
var inner = MakeStream(1024 * 2);
@@ -238,6 +304,47 @@ public class FileBufferingReadStreamTests
}
[Fact]
+ public async Task FileBufferingReadStream_Async0ByteReadAfterBuffering_ReadsFromFile()
+ {
+ var inner = MakeStream(1024 * 2);
+ string tempFileName;
+ using (var stream = new FileBufferingReadStream(inner, 1024, null, GetCurrentDirectory()))
+ {
+ await stream.DrainAsync(default);
+ stream.Position = 0;
+ Assert.Equal(inner.Length, stream.Length);
+ Assert.Equal(0, stream.Position);
+ Assert.False(stream.InMemory);
+ Assert.NotNull(stream.TempFileName);
+ tempFileName = stream.TempFileName!;
+ Assert.True(File.Exists(tempFileName));
+
+ var bytes = new byte[1000];
+ var read0 = await stream.ReadAsync(bytes, 0, 0);
+ Assert.Equal(0, read0);
+ Assert.Equal(read0, stream.Position);
+
+ var read1 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(bytes.Length, read1);
+ Assert.Equal(read0 + read1, stream.Position);
+
+ var read2 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(bytes.Length, read2);
+ Assert.Equal(read0 + read1 + read2, stream.Position);
+
+ var read3 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(inner.Length - read0 - read1 - read2, read3);
+ Assert.Equal(read0 + read1 + read2 + read3, stream.Length);
+ Assert.Equal(read0 + read1 + read2 + read3, stream.Position);
+
+ var read4 = await stream.ReadAsync(bytes, 0, bytes.Length);
+ Assert.Equal(0, read4);
+ }
+
+ Assert.False(File.Exists(tempFileName));
+ }
+
+ [Fact]
public async Task FileBufferingReadStream_AsyncReadWithInMemoryLimit_EnforcesLimit()
{
var inner = MakeStream(1024 * 2);
diff --git a/src/Http/WebUtilities/test/MultipartReaderTests.cs b/src/Http/WebUtilities/test/MultipartReaderTests.cs
index ba6ddf7e52..8231ec472b 100644
--- a/src/Http/WebUtilities/test/MultipartReaderTests.cs
+++ b/src/Http/WebUtilities/test/MultipartReaderTests.cs
@@ -10,6 +10,7 @@ namespace Microsoft.AspNetCore.WebUtilities;
public class MultipartReaderTests
{
private const string Boundary = "9051914041544843365972754266";
+ private const string BoundaryWithQuotes = @"""9051914041544843365972754266""";
// Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF.
private const string OnePartBody =
"--9051914041544843365972754266\r\n" +
@@ -377,4 +378,15 @@ public class MultipartReaderTests
Assert.Null(await reader.ReadNextSectionAsync());
}
+
+ // MultiPartReader should strip any quotes from the boundary passed in instead of throwing an exception
+ [Fact]
+ public async Task MultipartReader_StripQuotesFromBoundary()
+ {
+ var stream = MakeStream(OnePartBody);
+ var reader = new MultipartReader(BoundaryWithQuotes, stream);
+
+ var section = await reader.ReadNextSectionAsync();
+ Assert.NotNull(section);
+ }
}
diff --git a/src/Http/samples/MinimalSample/MinimalSample.csproj b/src/Http/samples/MinimalSample/MinimalSample.csproj
index eea90b9652..4a160b6256 100644
--- a/src/Http/samples/MinimalSample/MinimalSample.csproj
+++ b/src/Http/samples/MinimalSample/MinimalSample.csproj
@@ -12,7 +12,6 @@
<Reference Include="Microsoft.AspNetCore.Http.Results" />
<!-- Mvc.Core is referenced only for its attributes -->
<Reference Include="Microsoft.AspNetCore.Mvc.Core" />
- <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
</ItemGroup>
</Project>
diff --git a/src/Http/samples/MinimalSample/Program.cs b/src/Http/samples/MinimalSample/Program.cs
index f2f50d8c27..c0705588ae 100644
--- a/src/Http/samples/MinimalSample/Program.cs
+++ b/src/Http/samples/MinimalSample/Program.cs
@@ -1,23 +1,63 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Reflection;
using Microsoft.AspNetCore.Http.HttpResults;
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
-
var app = builder.Build();
-if (app.Environment.IsDevelopment())
-{
- app.UseDeveloperExceptionPage();
-}
-
string Plaintext() => "Hello, World!";
app.MapGet("/plaintext", Plaintext);
+app.MapGet("/", () => $"""
+ Operating System: {Environment.OSVersion}
+ .NET version: {Environment.Version}
+ Username: {Environment.UserName}
+ Date and Time: {DateTime.Now}
+ """);
+var outer = app.MapGroup("/outer");
+var inner = outer.MapGroup("/inner");
+
+inner.AddEndpointFilterFactory((routeContext, next) =>
+{
+ var tags = routeContext.EndpointMetadata.OfType<ITagsMetadata>().FirstOrDefault();
+
+ return async invocationContext =>
+ {
+ Console.WriteLine("Running filter!");
+ var result = await next(invocationContext);
+ return ((string)result) + " | /inner filter! Tags:" + tags is null ? "(null)" : string.Join(", ", tags.Tags);
+ };
+});
+
+outer.MapGet("/outerget", () => "I'm nested.");
+inner.MapGet("/innerget", () => "I'm more nested.");
+
+inner.AddEndpointFilterFactory((routeContext, next) =>
+{
+ Console.WriteLine($"Building filter! Num args: {routeContext.MethodInfo.GetParameters().Length}"); ;
+ return async invocationContext =>
+ {
+ Console.WriteLine("Running filter!");
+ var result = await next(invocationContext);
+ return ((string)result) + "| nested filter!";
+ };
+});
+
+var superNested = inner.MapGroup("/group/{groupName}")
+ .MapGroup("/nested/{nestedName}")
+ .WithTags("nested", "more", "tags");
+
+superNested.MapGet("/", (string groupName, string nestedName) =>
+{
+ return $"Hello from {groupName}:{nestedName}!";
+});
+
object Json() => new { message = "Hello, World!" };
-app.MapGet("/json", Json);
+app.MapGet("/json", Json).WithTags("json");
string SayHello(string name) => $"Hello, {name}!";
app.MapGet("/hello/{name}", SayHello);
@@ -33,23 +73,32 @@ app.MapGet("/todo/{id}", Results<Ok<Todo>, NotFound, BadRequest> (int id) => id
var extensions = new Dictionary<string, object>() { { "traceId", "traceId123" } };
-app.MapGet("/problem", () =>
- Results.Problem(statusCode: 500, extensions: extensions));
-
-app.MapGet("/problem-object", () =>
- Results.Problem(new ProblemDetails() { Status = 500, Extensions = { { "traceId", "traceId123" } } }));
-
var errors = new Dictionary<string, string[]>() { { "Title", new[] { "The Title field is required." } } };
-app.MapGet("/validation-problem", () =>
- Results.ValidationProblem(errors, statusCode: 400, extensions: extensions));
+app.MapGet("/problem/{problemType}", (string problemType) => problemType switch
+ {
+ "plain" => Results.Problem(statusCode: 500, extensions: extensions),
+ "object" => Results.Problem(new ProblemDetails() { Status = 500, Extensions = { { "traceId", "traceId123" } } }),
+ "validation" => Results.ValidationProblem(errors, statusCode: 400, extensions: extensions),
+ "objectValidation" => Results.Problem(new HttpValidationProblemDetails(errors) { Status = 400, Extensions = { { "traceId", "traceId123" } } }),
+ "validationTyped" => TypedResults.ValidationProblem(errors, extensions: extensions),
+ _ => TypedResults.NotFound()
-app.MapGet("/validation-problem-object", () =>
- Results.Problem(new HttpValidationProblemDetails(errors) { Status = 400, Extensions = { { "traceId", "traceId123" } } }));
+ });
-app.MapGet("/validation-problem-typed", () =>
- TypedResults.ValidationProblem(errors, extensions: extensions));
+app.MapPost("/todos", (TodoBindable todo) => todo);
app.Run();
internal record Todo(int Id, string Title);
+public class TodoBindable : IBindableFromHttpContext<TodoBindable>
+{
+ public int Id { get; set; }
+ public string Title { get; set; }
+ public bool IsComplete { get; set; }
+
+ public static ValueTask<TodoBindable> BindAsync(HttpContext context, ParameterInfo parameter)
+ {
+ return ValueTask.FromResult(new TodoBindable { Id = 1, Title = "I was bound from IBindableFromHttpContext<TodoBindable>.BindAsync!" });
+ }
+}
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtBearerOptionsConfiguration.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtBearerOptionsConfiguration.cs
index 08e608ec49..f671c75ace 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtBearerOptionsConfiguration.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtBearerOptionsConfiguration.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Duende.IdentityServer.Extensions;
@@ -11,7 +11,7 @@ using Microsoft.IdentityModel.Protocols.OpenIdConnect;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class IdentityServerJwtBearerOptionsConfiguration : IConfigureNamedOptions<JwtBearerOptions>
+internal sealed class IdentityServerJwtBearerOptionsConfiguration : IConfigureNamedOptions<JwtBearerOptions>
{
private readonly string _scheme;
private readonly string _apiName;
@@ -61,7 +61,9 @@ internal class IdentityServerJwtBearerOptionsConfiguration : IConfigureNamedOpti
{
var store = messageReceivedContext.HttpContext.RequestServices.GetRequiredService<ISigningCredentialStore>();
var credential = await store.GetSigningCredentialsAsync();
+#pragma warning disable 0618
options.Authority = options.Authority ?? messageReceivedContext.HttpContext.GetIdentityServerIssuerUri();
+#pragma warning restore 0618
options.TokenValidationParameters.IssuerSigningKey = credential.Key;
options.TokenValidationParameters.ValidIssuer = options.Authority;
}
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtPolicySchemeForwardSelector.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtPolicySchemeForwardSelector.cs
index ae97494028..ce906403af 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtPolicySchemeForwardSelector.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/IdentityServerJwtPolicySchemeForwardSelector.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Http;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Identity;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Authentication;
-internal class IdentityServerJwtPolicySchemeForwardSelector
+internal sealed class IdentityServerJwtPolicySchemeForwardSelector
{
private readonly PathString _identityPath;
private readonly string _IdentityServerJwtScheme;
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/StaticConfigurationManager.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/StaticConfigurationManager.cs
index ed45068e0d..255c1a3564 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/StaticConfigurationManager.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Authentication/StaticConfigurationManager.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.IdentityModel.Protocols;
@@ -6,7 +6,7 @@ using Microsoft.IdentityModel.Protocols.OpenIdConnect;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class StaticConfigurationManager : IConfigurationManager<OpenIdConnectConfiguration>
+internal sealed class StaticConfigurationManager : IConfigurationManager<OpenIdConnectConfiguration>
{
private readonly Task<OpenIdConnectConfiguration> _configuration;
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/AspNetConventionsConfigureOptions.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/AspNetConventionsConfigureOptions.cs
index 18f5d45097..6df9e2f380 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/AspNetConventionsConfigureOptions.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/AspNetConventionsConfigureOptions.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class AspNetConventionsConfigureOptions : IConfigureOptions<IdentityServerOptions>
+internal sealed class AspNetConventionsConfigureOptions : IConfigureOptions<IdentityServerOptions>
{
public void Configure(IdentityServerOptions options)
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ClientDefinition.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ClientDefinition.cs
index 52336da70f..3729d7b614 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ClientDefinition.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ClientDefinition.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class ClientDefinition : ServiceDefinition
+internal sealed class ClientDefinition : ServiceDefinition
{
public string RedirectUri { get; set; }
public string LogoutUri { get; set; }
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiResources.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiResources.cs
index 16b1cc7f18..283e5f4a79 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiResources.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiResources.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.DependencyInjection;
-internal class ConfigureApiResources : IConfigureOptions<ApiAuthorizationOptions>
+internal sealed class ConfigureApiResources : IConfigureOptions<ApiAuthorizationOptions>
{
private const char ScopesSeparator = ' ';
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiScopes.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiScopes.cs
index 3346420854..6fca1ae613 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiScopes.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureApiScopes.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Configuration;
-internal class ConfigureApiScopes : IPostConfigureOptions<ApiAuthorizationOptions>
+internal sealed class ConfigureApiScopes : IPostConfigureOptions<ApiAuthorizationOptions>
{
public void PostConfigure(string name, ApiAuthorizationOptions options)
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClientScopes.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClientScopes.cs
index 34adfcced9..25a7e6a66d 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClientScopes.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClientScopes.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Configuration;
-internal class ConfigureClientScopes : IPostConfigureOptions<ApiAuthorizationOptions>
+internal sealed class ConfigureClientScopes : IPostConfigureOptions<ApiAuthorizationOptions>
{
private const char DefaultClientListSeparator = ' ';
private readonly ILogger<ConfigureClientScopes> _logger;
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClients.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClients.cs
index 3b490ff1b3..7650ca7f43 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClients.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureClients.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class ConfigureClients : IConfigureOptions<ApiAuthorizationOptions>
+internal sealed class ConfigureClients : IConfigureOptions<ApiAuthorizationOptions>
{
private const string DefaultLocalSPARelativeRedirectUri = "/authentication/login-callback";
private const string DefaultLocalSPARelativePostLogoutRedirectUri = "/authentication/logout-callback";
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureIdentityResources.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureIdentityResources.cs
index df9af86939..724e1f4f32 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureIdentityResources.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureIdentityResources.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.Extensions.Configuration;
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class ConfigureIdentityResources : IConfigureOptions<ApiAuthorizationOptions>
+internal sealed class ConfigureIdentityResources : IConfigureOptions<ApiAuthorizationOptions>
{
private readonly IConfiguration _configuration;
private const char ScopesSeparator = ' ';
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureSigningCredentials.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureSigningCredentials.cs
index fbba50180f..6ee69e0eac 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureSigningCredentials.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/ConfigureSigningCredentials.cs
@@ -11,7 +11,7 @@ using Microsoft.IdentityModel.Tokens;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class ConfigureSigningCredentials : IConfigureOptions<ApiAuthorizationOptions>
+internal sealed class ConfigureSigningCredentials : IConfigureOptions<ApiAuthorizationOptions>
{
// We need to cast the underlying int value of the EphemeralKeySet to X509KeyStorageFlags
// due to the fact that is not part of .NET Standard. This value is only used with non-windows
@@ -94,7 +94,7 @@ internal class ConfigureSigningCredentials : IConfigureOptions<ApiAuthorizationO
}
// for testing purposes only
- internal virtual DateTimeOffset GetCurrentTime() => DateTimeOffset.UtcNow;
+ internal static DateTimeOffset GetCurrentTime() => DateTimeOffset.UtcNow;
private static X509KeyStorageFlags GetStorageFlags(KeyDefinition key)
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityResourceDefinition.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityResourceDefinition.cs
index 68e623b54d..6e347e92bf 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityResourceDefinition.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityResourceDefinition.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class IdentityResourceDefinition : ResourceDefinition
+internal sealed class IdentityResourceDefinition : ResourceDefinition
{
public IdentityResourceDefinition()
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityServerJwtApiDescriptor.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityServerJwtApiDescriptor.cs
index 130b785ce1..4c7b28f60b 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityServerJwtApiDescriptor.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/IdentityServerJwtApiDescriptor.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Hosting;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Configuration;
-internal class IdentityServerJwtDescriptor : IIdentityServerJwtDescriptor
+internal sealed class IdentityServerJwtDescriptor : IIdentityServerJwtDescriptor
{
public IdentityServerJwtDescriptor(IWebHostEnvironment environment)
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeyDefinition.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeyDefinition.cs
index 6685524cf4..3fd1c581ae 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeyDefinition.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeyDefinition.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Configuration;
-internal class KeyDefinition
+internal sealed class KeyDefinition
{
public string Type { get; set; }
public bool? Persisted { get; set; }
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeySources.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeySources.cs
index 8f2e5a72d1..103586594f 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeySources.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/KeySources.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Configuration;
-internal class KeySources
+internal sealed class KeySources
{
public const string File = nameof(File);
public const string Development = nameof(Development);
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/SigningKeysLoader.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/SigningKeysLoader.cs
index 277c2fdd58..08b0d2d2f2 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/SigningKeysLoader.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Configuration/SigningKeysLoader.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -98,7 +98,7 @@ internal static class SigningKeysLoader
}
}
- private class RSAKeyParameters
+ private sealed class RSAKeyParameters
{
public string D { get; set; }
public string DP { get; set; }
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AbsoluteUrlFactory.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AbsoluteUrlFactory.cs
index 7bbe3323ec..5d7bcce35c 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AbsoluteUrlFactory.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AbsoluteUrlFactory.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class AbsoluteUrlFactory : IAbsoluteUrlFactory
+internal sealed class AbsoluteUrlFactory : IAbsoluteUrlFactory
{
public AbsoluteUrlFactory(IHttpContextAccessor httpContextAccessor)
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AutoRedirectEndSessionEndpoint.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AutoRedirectEndSessionEndpoint.cs
index 4ca71b50ac..ec74f4a2d9 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AutoRedirectEndSessionEndpoint.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/AutoRedirectEndSessionEndpoint.cs
@@ -18,7 +18,7 @@ using Microsoft.IdentityModel.Protocols.OpenIdConnect;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class AutoRedirectEndSessionEndpoint : IEndpointHandler
+internal sealed class AutoRedirectEndSessionEndpoint : IEndpointHandler
{
private readonly ILogger _logger;
private readonly IUserSession _session;
@@ -111,7 +111,7 @@ internal class AutoRedirectEndSessionEndpoint : IEndpointHandler
return null;
}
- internal class RedirectResult : IEndpointResult
+ internal sealed class RedirectResult : IEndpointResult
{
public RedirectResult(string url)
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/DefaultClientRequestParametersProvider.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/DefaultClientRequestParametersProvider.cs
index 653044e091..1d8c390bcf 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/DefaultClientRequestParametersProvider.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/DefaultClientRequestParametersProvider.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class DefaultClientRequestParametersProvider : IClientRequestParametersProvider
+internal sealed class DefaultClientRequestParametersProvider : IClientRequestParametersProvider
{
public DefaultClientRequestParametersProvider(
IAbsoluteUrlFactory urlFactory,
@@ -25,7 +25,10 @@ internal class DefaultClientRequestParametersProvider : IClientRequestParameters
public IDictionary<string, string> GetClientParameters(HttpContext context, string clientId)
{
var client = Options.Value.Clients[clientId];
+#pragma warning disable 0618
+ // Deprecated in Identity Server 6.0
var authority = context.GetIdentityServerIssuerUri();
+#pragma warning restore 0618
if (!client.Properties.TryGetValue(ApplicationProfilesPropertyNames.Profile, out var type))
{
throw new InvalidOperationException($"Can't determine the type for the client '{clientId}'");
diff --git a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/RelativeRedirectUriValidator.cs b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/RelativeRedirectUriValidator.cs
index 02e26ecac7..d6ba94860e 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/RelativeRedirectUriValidator.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/src/Extensions/RelativeRedirectUriValidator.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Duende.IdentityServer.Models;
@@ -6,7 +6,7 @@ using Duende.IdentityServer.Validation;
namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer;
-internal class RelativeRedirectUriValidator : StrictRedirectUriValidator
+internal sealed class RelativeRedirectUriValidator : StrictRedirectUriValidator
{
public RelativeRedirectUriValidator(IAbsoluteUrlFactory absoluteUrlFactory)
{
diff --git a/src/Identity/ApiAuthorization.IdentityServer/test/Authentication/LocalApiJwtBearerConfigurationTest.cs b/src/Identity/ApiAuthorization.IdentityServer/test/Authentication/IdentityServerJwtBearerConfigurationTest.cs
index b0df451be3..49e18a6714 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/test/Authentication/LocalApiJwtBearerConfigurationTest.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/test/Authentication/IdentityServerJwtBearerConfigurationTest.cs
@@ -1,8 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Security.Cryptography;
using Duende.IdentityServer.Configuration;
+using Duende.IdentityServer.Services;
using Duende.IdentityServer.Stores;
using Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Configuration;
using Microsoft.AspNetCore.Authentication;
@@ -59,12 +60,16 @@ public class IdentityServerJwtBearerOptionsConfigurationTest
credentialsStore.Setup(cs => cs.GetSigningCredentialsAsync())
.ReturnsAsync(new SigningCredentials(key, "RS256"));
+ var issuerName = new Mock<IIssuerNameService>();
+ issuerName.Setup(i => i.GetCurrentAsync()).ReturnsAsync("https://localhost");
+
var context = new DefaultHttpContext();
context.Request.Scheme = "https";
context.Request.Host = new HostString("localhost");
context.RequestServices = new ServiceCollection()
.AddSingleton(new IdentityServerOptions())
.AddSingleton(credentialsStore.Object)
+ .AddSingleton(issuerName.Object)
.BuildServiceProvider();
var options = new JwtBearerOptions();
diff --git a/src/Identity/ApiAuthorization.IdentityServer/test/Extensions/DefaultClientRequestParametersProviderTests.cs b/src/Identity/ApiAuthorization.IdentityServer/test/Extensions/DefaultClientRequestParametersProviderTests.cs
index 393dda2ea7..550c9a07fa 100644
--- a/src/Identity/ApiAuthorization.IdentityServer/test/Extensions/DefaultClientRequestParametersProviderTests.cs
+++ b/src/Identity/ApiAuthorization.IdentityServer/test/Extensions/DefaultClientRequestParametersProviderTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Duende.IdentityServer.Configuration;
+using Duende.IdentityServer.Services;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
@@ -11,6 +12,11 @@ namespace Microsoft.AspNetCore.ApiAuthorization.IdentityServer.Extensions;
public class DefaultClientRequestParametersProviderTests
{
+ class NameService : IIssuerNameService
+ {
+ public Task<string> GetCurrentAsync() => Task.FromResult("http://localhost");
+ }
+
[Fact]
public void GetClientParameters_ReturnsParametersForExistingClients()
{
@@ -30,6 +36,7 @@ public class DefaultClientRequestParametersProviderTests
context.Request.Host = new HostString("localhost");
context.RequestServices = new ServiceCollection()
.AddSingleton(new IdentityServerOptions())
+ .AddSingleton<IIssuerNameService>(new NameService())
.BuildServiceProvider();
var clientRequestParametersProvider =
diff --git a/src/Identity/Core/src/IdentityBuilderExtensions.cs b/src/Identity/Core/src/IdentityBuilderExtensions.cs
index 7f98ca8d2e..a05ca35c00 100644
--- a/src/Identity/Core/src/IdentityBuilderExtensions.cs
+++ b/src/Identity/Core/src/IdentityBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Identity;
@@ -55,7 +56,7 @@ public static class IdentityBuilderExtensions
/// <typeparam name="TSignInManager">The type of the sign in manager to add.</typeparam>
/// <param name="builder">The current <see cref="IdentityBuilder"/> instance.</param>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public static IdentityBuilder AddSignInManager<TSignInManager>(this IdentityBuilder builder) where TSignInManager : class
+ public static IdentityBuilder AddSignInManager<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TSignInManager>(this IdentityBuilder builder) where TSignInManager : class
{
builder.AddSignInManagerDeps();
var managerType = typeof(SignInManager<>).MakeGenericType(builder.UserType);
diff --git a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs
index 25ac9c4907..5cf717b3c3 100644
--- a/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs
+++ b/src/Identity/Core/src/IdentityServiceCollectionExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
@@ -20,7 +21,7 @@ public static class IdentityServiceCollectionExtensions
/// <typeparam name="TRole">The type representing a Role in the system.</typeparam>
/// <param name="services">The services available in the application.</param>
/// <returns>An <see cref="IdentityBuilder"/> for creating and configuring the identity system.</returns>
- public static IdentityBuilder AddIdentity<TUser, TRole>(
+ public static IdentityBuilder AddIdentity<TUser, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>(
this IServiceCollection services)
where TUser : class
where TRole : class
@@ -34,7 +35,7 @@ public static class IdentityServiceCollectionExtensions
/// <param name="services">The services available in the application.</param>
/// <param name="setupAction">An action to configure the <see cref="IdentityOptions"/>.</param>
/// <returns>An <see cref="IdentityBuilder"/> for creating and configuring the identity system.</returns>
- public static IdentityBuilder AddIdentity<TUser, TRole>(
+ public static IdentityBuilder AddIdentity<TUser, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>(
this IServiceCollection services,
Action<IdentityOptions> setupAction)
where TUser : class
diff --git a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj
index e021c9b31e..052f8efcc5 100644
--- a/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj
+++ b/src/Identity/Core/src/Microsoft.AspNetCore.Identity.csproj
@@ -7,11 +7,15 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;identity;membership</PackageTags>
<IsPackable>false</IsPackable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
<Reference Include="Microsoft.Extensions.Identity.Core" />
+
+ <Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
+ Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
</ItemGroup>
</Project>
diff --git a/src/Identity/Core/src/PublicAPI.Shipped.txt b/src/Identity/Core/src/PublicAPI.Shipped.txt
index 493c0cf119..67d8ebdac9 100644
--- a/src/Identity/Core/src/PublicAPI.Shipped.txt
+++ b/src/Identity/Core/src/PublicAPI.Shipped.txt
@@ -1,23 +1,23 @@
#nullable enable
-~Microsoft.AspNetCore.Identity.AspNetRoleManager<TRole>
-~Microsoft.AspNetCore.Identity.AspNetRoleManager<TRole>.AspNetRoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole> store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole>> roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole>> logger, Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor) -> void
-~Microsoft.AspNetCore.Identity.AspNetUserManager<TUser>
+Microsoft.AspNetCore.Identity.AspNetRoleManager<TRole>
+Microsoft.AspNetCore.Identity.AspNetRoleManager<TRole>.AspNetRoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole!>! store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole!>!>! roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole!>!>! logger, Microsoft.AspNetCore.Http.IHttpContextAccessor! contextAccessor) -> void
+Microsoft.AspNetCore.Identity.AspNetUserManager<TUser>
Microsoft.AspNetCore.Identity.AspNetUserManager<TUser>.AspNetUserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser!>! store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>! passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>! userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>! passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, System.IServiceProvider! services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser!>!>! logger) -> void
-~Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.get -> string
-~Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.set -> void
-~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>
+Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.get -> string!
+Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.set -> void
+Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>
Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.DataProtectorTokenProvider(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider! dataProtectionProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions!>! options, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser!>!>! logger) -> void
-~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>>
-~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Name.get -> string
-~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Options.get -> Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions
-~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Protector.get -> Microsoft.AspNetCore.DataProtection.IDataProtector
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.set -> void
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationToken>
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.set -> void
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.ExternalLoginInfo(System.Security.Claims.ClaimsPrincipal principal, string loginProvider, string providerKey, string displayName) -> void
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.get -> System.Security.Claims.ClaimsPrincipal
-~Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.set -> void
+Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser!>!>!
+Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Name.get -> string!
+Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Options.get -> Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions!
+Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Protector.get -> Microsoft.AspNetCore.DataProtection.IDataProtector!
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.set -> void
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationToken!>?
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.set -> void
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.ExternalLoginInfo(System.Security.Claims.ClaimsPrincipal! principal, string! loginProvider, string! providerKey, string! displayName) -> void
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.get -> System.Security.Claims.ClaimsPrincipal!
+Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.set -> void
Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ApplicationCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ApplicationCookie.set -> void
Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ExternalCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
@@ -26,94 +26,94 @@ Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorRememberMeCookie.g
Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorRememberMeCookie.set -> void
Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorUserIdCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorUserIdCookie.set -> void
-~Microsoft.AspNetCore.Identity.ISecurityStampValidator.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.get -> System.Security.Claims.ClaimsPrincipal
-~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.set -> void
-~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.get -> System.Security.Claims.ClaimsPrincipal
-~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.set -> void
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Clock.get -> Microsoft.AspNetCore.Authentication.ISystemClock
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.set -> void
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Options.get -> Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions
+Microsoft.AspNetCore.Identity.ISecurityStampValidator.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.set -> void
+Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.set -> void
+Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>
+Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Clock.get -> Microsoft.AspNetCore.Authentication.ISystemClock!
+Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
+Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.set -> void
+Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Options.get -> Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions!
Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampValidator(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions!>! options, Microsoft.AspNetCore.Identity.SignInManager<TUser!>! signInManager, Microsoft.AspNetCore.Authentication.ISystemClock! clock, Microsoft.Extensions.Logging.ILoggerFactory! logger) -> void
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SignInManager.get -> Microsoft.AspNetCore.Identity.SignInManager<TUser>
-~Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.get -> System.Func<Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.set -> void
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.get -> Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.set -> void
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.get -> Microsoft.AspNetCore.Http.HttpContext
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.set -> void
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.set -> void
+Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SignInManager.get -> Microsoft.AspNetCore.Identity.SignInManager<TUser!>!
+Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.get -> System.Func<Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext!, System.Threading.Tasks.Task!>?
+Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.set -> void
+Microsoft.AspNetCore.Identity.SignInManager<TUser>
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.get -> Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser!>!
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.set -> void
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.get -> Microsoft.AspNetCore.Http.HttpContext!
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.set -> void
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions!
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.set -> void
Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInManager(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.AspNetCore.Http.IHttpContextAccessor! contextAccessor, Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser!>! claimsFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<TUser!>!>! logger, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Identity.IUserConfirmation<TUser!>! confirmation) -> void
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser>
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.set -> void
-~Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser!>!
+Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.set -> void
+Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>
Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.TwoFactorSecurityStampValidator(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions!>! options, Microsoft.AspNetCore.Identity.SignInManager<TUser!>! signInManager, Microsoft.AspNetCore.Authentication.ISystemClock! clock, Microsoft.Extensions.Logging.ILoggerFactory! logger) -> void
-~override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.SecurityStampVerified(TUser user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-~static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddDefaultTokenProviders(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager<TSignInManager>(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
+override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.SecurityStampVerified(TUser! user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
+static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddDefaultTokenProviders(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager<TSignInManager>(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddApplicationCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddExternalCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
-~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder
-~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, System.Action<Microsoft.AspNetCore.Identity.IdentityCookiesBuilder> configureCookies) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder
+static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder!
+static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder, System.Action<Microsoft.AspNetCore.Identity.IdentityCookiesBuilder!>! configureCookies) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder!
static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddTwoFactorRememberMeCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddTwoFactorUserIdCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
-~static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidateAsync<TValidator>(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-~static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidatePrincipalAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions> setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureApplicationCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions> configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureExternalCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions> configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
-~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ApplicationScheme -> string
-~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme -> string
-~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorRememberMeScheme -> string
-~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorUserIdScheme -> string
-~virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampVerified(TUser user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CanSignInAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CheckPasswordSignInAsync(TUser user, string password, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ConfigureExternalAuthenticationProperties(string provider, string redirectUrl, string userId = null) -> Microsoft.AspNetCore.Authentication.AuthenticationProperties
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CreateUserPrincipalAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string loginProvider, string providerKey, bool isPersistent) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string loginProvider, string providerKey, bool isPersistent, bool bypassTwoFactor) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ForgetTwoFactorClientAsync() -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalAuthenticationSchemesAsync() -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationScheme>>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalLoginInfoAsync(string expectedXsrf = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetTwoFactorAuthenticationUserAsync() -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsLockedOut(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsSignedIn(System.Security.Claims.ClaimsPrincipal principal) -> bool
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsTwoFactorClientRememberedAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.LockedOut(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.set -> void
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(string userName, string password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PreSignInCheck(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RefreshSignInAsync(TUser user) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RememberTwoFactorClientAsync(TUser user) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ResetLockout(TUser user) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser user, bool isPersistent, string authenticationMethod = null) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser user, Microsoft.AspNetCore.Authentication.AuthenticationProperties authenticationProperties, string authenticationMethod = null) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInOrTwoFactorAsync(TUser user, bool isPersistent, string loginProvider = null, bool bypassTwoFactor = false) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser user, bool isPersistent, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> additionalClaims) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser user, Microsoft.AspNetCore.Authentication.AuthenticationProperties authenticationProperties, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> additionalClaims) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignOutAsync() -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorAuthenticatorSignInAsync(string code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorRecoveryCodeSignInAsync(string recoveryCode) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorSignInAsync(string provider, string code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.UpdateExternalAuthenticationTokensAsync(Microsoft.AspNetCore.Identity.ExternalLoginInfo externalLogin) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(TUser user, string securityStamp) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateTwoFactorSecurityStampAsync(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
+static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidateAsync<TValidator>(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
+static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidatePrincipalAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions!>! setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureApplicationCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureExternalCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ApplicationScheme -> string!
+static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme -> string!
+static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorRememberMeScheme -> string!
+static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorUserIdScheme -> string!
+virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampVerified(TUser! user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CanSignInAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CheckPasswordSignInAsync(TUser! user, string! password, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ConfigureExternalAuthenticationProperties(string? provider, string? redirectUrl, string? userId = null) -> Microsoft.AspNetCore.Authentication.AuthenticationProperties!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CreateUserPrincipalAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string! loginProvider, string! providerKey, bool isPersistent) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string! loginProvider, string! providerKey, bool isPersistent, bool bypassTwoFactor) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ForgetTwoFactorClientAsync() -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalAuthenticationSchemesAsync() -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalLoginInfoAsync(string? expectedXsrf = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo?>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetTwoFactorAuthenticationUserAsync() -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsLockedOut(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsSignedIn(System.Security.Claims.ClaimsPrincipal! principal) -> bool
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsTwoFactorClientRememberedAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.LockedOut(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.set -> void
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(string! userName, string! password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(TUser! user, string! password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PreSignInCheck(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult?>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RefreshSignInAsync(TUser! user) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RememberTwoFactorClientAsync(TUser! user) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ResetLockout(TUser! user) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser! user, bool isPersistent, string? authenticationMethod = null) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser! user, Microsoft.AspNetCore.Authentication.AuthenticationProperties! authenticationProperties, string? authenticationMethod = null) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInOrTwoFactorAsync(TUser! user, bool isPersistent, string? loginProvider = null, bool bypassTwoFactor = false) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser! user, bool isPersistent, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! additionalClaims) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser! user, Microsoft.AspNetCore.Authentication.AuthenticationProperties? authenticationProperties, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! additionalClaims) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignOutAsync() -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorAuthenticatorSignInAsync(string! code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorRecoveryCodeSignInAsync(string! recoveryCode) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorSignInAsync(string! provider, string! code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.UpdateExternalAuthenticationTokensAsync(Microsoft.AspNetCore.Identity.ExternalLoginInfo! externalLogin) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(TUser? user, string? securityStamp) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateTwoFactorSecurityStampAsync(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions
Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.DataProtectionTokenProviderOptions() -> void
Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.TokenLifespan.get -> System.TimeSpan
diff --git a/src/Identity/Core/src/PublicAPI.Unshipped.txt b/src/Identity/Core/src/PublicAPI.Unshipped.txt
index 3be5dd7c3b..7dc5c58110 100644
--- a/src/Identity/Core/src/PublicAPI.Unshipped.txt
+++ b/src/Identity/Core/src/PublicAPI.Unshipped.txt
@@ -1,220 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Identity.AspNetRoleManager<TRole>.AspNetRoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole> store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole>> roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole>> logger, Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.AspNetUserManager<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.AspNetUserManager<TUser>.AspNetUserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser> store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser> passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser>> userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>> passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, System.IServiceProvider services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser>> logger) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.DataProtectorTokenProvider(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtectionProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions> options, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>> logger) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>>
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Name.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Options.get -> Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Protector.get -> Microsoft.AspNetCore.DataProtection.IDataProtector
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationToken>
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.ExternalLoginInfo(System.Security.Claims.ClaimsPrincipal principal, string loginProvider, string providerKey, string displayName) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.get -> System.Security.Claims.ClaimsPrincipal
-*REMOVED*~Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ApplicationCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ApplicationCookie.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ExternalCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ExternalCookie.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorRememberMeCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorRememberMeCookie.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorUserIdCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorUserIdCookie.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ISecurityStampValidator.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.get -> System.Security.Claims.ClaimsPrincipal
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.get -> System.Security.Claims.ClaimsPrincipal
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Clock.get -> Microsoft.AspNetCore.Authentication.ISystemClock
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Options.get -> Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampValidator(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions> options, Microsoft.AspNetCore.Identity.SignInManager<TUser> signInManager, Microsoft.AspNetCore.Authentication.ISystemClock clock, Microsoft.Extensions.Logging.ILoggerFactory logger) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SignInManager.get -> Microsoft.AspNetCore.Identity.SignInManager<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.get -> System.Func<Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext, System.Threading.Tasks.Task>
-*REMOVED*~Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.get -> Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.get -> Microsoft.AspNetCore.Http.HttpContext
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInManager(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor, Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser> claimsFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<TUser>> logger, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider schemes, Microsoft.AspNetCore.Identity.IUserConfirmation<TUser> confirmation) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.TwoFactorSecurityStampValidator(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions> options, Microsoft.AspNetCore.Identity.SignInManager<TUser> signInManager, Microsoft.AspNetCore.Authentication.ISystemClock clock, Microsoft.Extensions.Logging.ILoggerFactory logger) -> void
-*REMOVED*~override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.SecurityStampVerified(TUser user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddDefaultTokenProviders(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager<TSignInManager>(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddApplicationCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddExternalCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder, System.Action<Microsoft.AspNetCore.Identity.IdentityCookiesBuilder> configureCookies) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddTwoFactorRememberMeCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddTwoFactorUserIdCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions>
-*REMOVED*~static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidateAsync<TValidator>(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-*REMOVED*~static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidatePrincipalAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions> setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureApplicationCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions> configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureExternalCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions> configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ApplicationScheme -> string
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme -> string
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorRememberMeScheme -> string
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorUserIdScheme -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampVerified(TUser user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext context) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CanSignInAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CheckPasswordSignInAsync(TUser user, string password, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ConfigureExternalAuthenticationProperties(string provider, string redirectUrl, string userId = null) -> Microsoft.AspNetCore.Authentication.AuthenticationProperties
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CreateUserPrincipalAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string loginProvider, string providerKey, bool isPersistent) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string loginProvider, string providerKey, bool isPersistent, bool bypassTwoFactor) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ForgetTwoFactorClientAsync() -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalAuthenticationSchemesAsync() -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationScheme>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalLoginInfoAsync(string expectedXsrf = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetTwoFactorAuthenticationUserAsync() -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsLockedOut(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsSignedIn(System.Security.Claims.ClaimsPrincipal principal) -> bool
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsTwoFactorClientRememberedAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.LockedOut(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(string userName, string password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(TUser user, string password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PreSignInCheck(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RefreshSignInAsync(TUser user) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RememberTwoFactorClientAsync(TUser user) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ResetLockout(TUser user) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser user, bool isPersistent, string authenticationMethod = null) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser user, Microsoft.AspNetCore.Authentication.AuthenticationProperties authenticationProperties, string authenticationMethod = null) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInOrTwoFactorAsync(TUser user, bool isPersistent, string loginProvider = null, bool bypassTwoFactor = false) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser user, bool isPersistent, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> additionalClaims) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser user, Microsoft.AspNetCore.Authentication.AuthenticationProperties authenticationProperties, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> additionalClaims) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignOutAsync() -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorAuthenticatorSignInAsync(string code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorRecoveryCodeSignInAsync(string recoveryCode) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorSignInAsync(string provider, string code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.UpdateExternalAuthenticationTokensAsync(Microsoft.AspNetCore.Identity.ExternalLoginInfo externalLogin) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(TUser user, string securityStamp) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateTwoFactorSecurityStampAsync(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-Microsoft.AspNetCore.Identity.AspNetRoleManager<TRole>.AspNetRoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole!>! store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole!>!>! roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole!>!>! logger, Microsoft.AspNetCore.Http.IHttpContextAccessor! contextAccessor) -> void
-~Microsoft.AspNetCore.Identity.AspNetUserManager<TUser>.AspNetUserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser!>! store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>! passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>! userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>! passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, System.IServiceProvider! services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser!>!>! logger) -> void
-Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.get -> string!
-Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions.Name.set -> void
-Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser!>!>!
-Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Name.get -> string!
-Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Options.get -> Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions!
-Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.Protector.get -> Microsoft.AspNetCore.DataProtection.IDataProtector!
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties?
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationProperties.set -> void
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationToken!>?
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.AuthenticationTokens.set -> void
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.ExternalLoginInfo(System.Security.Claims.ClaimsPrincipal! principal, string! loginProvider, string! providerKey, string! displayName) -> void
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.get -> System.Security.Claims.ClaimsPrincipal!
-Microsoft.AspNetCore.Identity.ExternalLoginInfo.Principal.set -> void
-~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ApplicationCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
-~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.ExternalCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
-~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorRememberMeCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
-~Microsoft.AspNetCore.Identity.IdentityCookiesBuilder.TwoFactorUserIdCookie.get -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>?
-Microsoft.AspNetCore.Identity.ISecurityStampValidator.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.get -> System.Security.Claims.ClaimsPrincipal?
-Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.CurrentPrincipal.set -> void
-Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.get -> System.Security.Claims.ClaimsPrincipal?
-Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext.NewPrincipal.set -> void
-Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Clock.get -> Microsoft.AspNetCore.Authentication.ISystemClock!
-Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
-Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Logger.set -> void
-Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.Options.get -> Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions!
-~Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampValidator(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions!>! options, Microsoft.AspNetCore.Identity.SignInManager<TUser!>! signInManager, Microsoft.AspNetCore.Authentication.ISystemClock! clock, Microsoft.Extensions.Logging.ILoggerFactory! logger) -> void
-Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SignInManager.get -> Microsoft.AspNetCore.Identity.SignInManager<TUser!>!
-Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.get -> System.Func<Microsoft.AspNetCore.Identity.SecurityStampRefreshingPrincipalContext!, System.Threading.Tasks.Task!>?
-Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions.OnRefreshingPrincipal.set -> void
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.get -> Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser!>!
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.ClaimsFactory.set -> void
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.get -> Microsoft.AspNetCore.Http.HttpContext!
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.Context.set -> void
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions!
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.Options.set -> void
-~Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInManager(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.AspNetCore.Http.IHttpContextAccessor! contextAccessor, Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser!>! claimsFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<TUser!>!>! logger, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! schemes, Microsoft.AspNetCore.Identity.IUserConfirmation<TUser!>! confirmation) -> void
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser!>!
-Microsoft.AspNetCore.Identity.SignInManager<TUser>.UserManager.set -> void
-~Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.TwoFactorSecurityStampValidator(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.SecurityStampValidatorOptions!>! options, Microsoft.AspNetCore.Identity.SignInManager<TUser!>! signInManager, Microsoft.AspNetCore.Authentication.ISystemClock! clock, Microsoft.Extensions.Logging.ILoggerFactory! logger) -> void
-override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.SecurityStampVerified(TUser! user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.TwoFactorSecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
-static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddDefaultTokenProviders(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.AspNetCore.Identity.IdentityBuilderExtensions.AddSignInManager<TSignInManager>(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddApplicationCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
-~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddExternalCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
-static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder!
-static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddIdentityCookies(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder, System.Action<Microsoft.AspNetCore.Identity.IdentityCookiesBuilder!>! configureCookies) -> Microsoft.AspNetCore.Identity.IdentityCookiesBuilder!
-~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddTwoFactorRememberMeCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
-~static Microsoft.AspNetCore.Identity.IdentityCookieAuthenticationBuilderExtensions.AddTwoFactorUserIdCookie(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder) -> Microsoft.Extensions.Options.OptionsBuilder<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>!
-static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidateAsync<TValidator>(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
-static Microsoft.AspNetCore.Identity.SecurityStampValidator.ValidatePrincipalAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentity<TUser, TRole>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions!>! setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureApplicationCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.ConfigureExternalCookie(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
-static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ApplicationScheme -> string!
-static readonly Microsoft.AspNetCore.Identity.IdentityConstants.ExternalScheme -> string!
-static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorRememberMeScheme -> string!
-static readonly Microsoft.AspNetCore.Identity.IdentityConstants.TwoFactorUserIdScheme -> string!
-virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.SecurityStampVerified(TUser! user, Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Authentication.Cookies.CookieValidatePrincipalContext! context) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SecurityStampValidator<TUser>.VerifySecurityStamp(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CanSignInAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CheckPasswordSignInAsync(TUser! user, string! password, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ConfigureExternalAuthenticationProperties(string? provider, string? redirectUrl, string? userId = null) -> Microsoft.AspNetCore.Authentication.AuthenticationProperties!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.CreateUserPrincipalAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string! loginProvider, string! providerKey, bool isPersistent) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ExternalLoginSignInAsync(string! loginProvider, string! providerKey, bool isPersistent, bool bypassTwoFactor) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ForgetTwoFactorClientAsync() -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalAuthenticationSchemesAsync() -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetExternalLoginInfoAsync(string? expectedXsrf = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.ExternalLoginInfo?>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.GetTwoFactorAuthenticationUserAsync() -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsLockedOut(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsSignedIn(System.Security.Claims.ClaimsPrincipal! principal) -> bool
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.IsTwoFactorClientRememberedAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.LockedOut(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.Logger.set -> void
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(string! userName, string! password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PasswordSignInAsync(TUser! user, string! password, bool isPersistent, bool lockoutOnFailure) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.PreSignInCheck(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult?>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RefreshSignInAsync(TUser! user) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.RememberTwoFactorClientAsync(TUser! user) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ResetLockout(TUser! user) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser! user, bool isPersistent, string? authenticationMethod = null) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInAsync(TUser! user, Microsoft.AspNetCore.Authentication.AuthenticationProperties! authenticationProperties, string? authenticationMethod = null) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInOrTwoFactorAsync(TUser! user, bool isPersistent, string? loginProvider = null, bool bypassTwoFactor = false) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser! user, bool isPersistent, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! additionalClaims) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignInWithClaimsAsync(TUser! user, Microsoft.AspNetCore.Authentication.AuthenticationProperties? authenticationProperties, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! additionalClaims) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.SignOutAsync() -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorAuthenticatorSignInAsync(string! code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorRecoveryCodeSignInAsync(string! recoveryCode) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.TwoFactorSignInAsync(string! provider, string! code, bool isPersistent, bool rememberClient) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.SignInResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.UpdateExternalAuthenticationTokensAsync(Microsoft.AspNetCore.Identity.ExternalLoginInfo! externalLogin) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateSecurityStampAsync(TUser? user, string? securityStamp) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.SignInManager<TUser>.ValidateTwoFactorSecurityStampAsync(System.Security.Claims.ClaimsPrincipal? principal) -> System.Threading.Tasks.Task<TUser?>!
-~Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser>.DataProtectorTokenProvider(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider! dataProtectionProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.DataProtectionTokenProviderOptions!>! options, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.DataProtectorTokenProvider<TUser!>!>! logger) -> void
diff --git a/src/Identity/EntityFrameworkCore/src/IdentityUserContext.cs b/src/Identity/EntityFrameworkCore/src/IdentityUserContext.cs
index ec395e81c4..07f6acacfe 100644
--- a/src/Identity/EntityFrameworkCore/src/IdentityUserContext.cs
+++ b/src/Identity/EntityFrameworkCore/src/IdentityUserContext.cs
@@ -101,7 +101,7 @@ public abstract class IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, T
?.GetService<IOptions<IdentityOptions>>()
?.Value?.Stores;
- private class PersonalDataConverter : ValueConverter<string, string>
+ private sealed class PersonalDataConverter : ValueConverter<string, string>
{
public PersonalDataConverter(IPersonalDataProtector protector) : base(s => protector.Protect(s), s => protector.Unprotect(s), default)
{ }
diff --git a/src/Identity/EntityFrameworkCore/src/PublicAPI.Shipped.txt b/src/Identity/EntityFrameworkCore/src/PublicAPI.Shipped.txt
index dacd75c74a..b4d4e77179 100644
--- a/src/Identity/EntityFrameworkCore/src/PublicAPI.Shipped.txt
+++ b/src/Identity/EntityFrameworkCore/src/PublicAPI.Shipped.txt
@@ -1,138 +1,138 @@
#nullable enable
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RoleStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>.RoleStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>.RoleStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>.RoleStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserOnlyStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UsersSet.get -> Microsoft.EntityFrameworkCore.DbSet<TUser>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>.UserOnlyStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>.UserOnlyStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>.UserOnlyStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore.UserStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>.UserStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>.UserStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>
-~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>.UserStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder builder) -> void
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder builder) -> void
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(TKey userId, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Users.get -> System.Linq.IQueryable<TUser>
-~static Microsoft.Extensions.DependencyInjection.IdentityEntityFrameworkBuilderExtensions.AddEntityFrameworkStores<TContext>(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TRoleClaim>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.get -> Microsoft.EntityFrameworkCore.DbSet<TRole>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.get -> Microsoft.EntityFrameworkCore.DbSet<TUserRole>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> Microsoft.EntityFrameworkCore.DbSet<TUser>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.set -> void
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Context.get -> TContext
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string id) -> TKey
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole role, System.Security.Claims.Claim claim) -> TRoleClaim
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole role, string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole role, string roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Context.get -> TContext
-~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Context.get -> TContext
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RoleStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>.RoleStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>.RoleStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>.RoleStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim!>!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin!>!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserOnlyStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UsersSet.get -> Microsoft.EntityFrameworkCore.DbSet<TUser!>!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken!>!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>.UserOnlyStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>.UserOnlyStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>.UserOnlyStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore.UserStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>.UserStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>.UserStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>
+Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>.UserStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder! builder) -> void
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder! builder) -> void
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(TKey userId, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole?>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Users.get -> System.Linq.IQueryable<TUser!>!
+static Microsoft.Extensions.DependencyInjection.IdentityEntityFrameworkBuilderExtensions.AddEntityFrameworkStores<TContext>(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TRoleClaim!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.get -> Microsoft.EntityFrameworkCore.DbSet<TRole!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.get -> Microsoft.EntityFrameworkCore.DbSet<TUserRole!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> Microsoft.EntityFrameworkCore.DbSet<TUser!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.set -> void
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Context.get -> TContext!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string! id) -> TKey?
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string?
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole! role, System.Security.Claims.Claim! claim) -> TRoleClaim!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string! normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole! role, string? normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole! role, string? roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Context.get -> TContext!
+virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Context.get -> TContext!
Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext
Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext.IdentityDbContext() -> void
Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.IdentityDbContext() -> void
diff --git a/src/Identity/EntityFrameworkCore/src/PublicAPI.Unshipped.txt b/src/Identity/EntityFrameworkCore/src/PublicAPI.Unshipped.txt
index bdfb0cddaa..5d7f33646a 100644
--- a/src/Identity/EntityFrameworkCore/src/PublicAPI.Unshipped.txt
+++ b/src/Identity/EntityFrameworkCore/src/PublicAPI.Unshipped.txt
@@ -1,252 +1,2 @@
#nullable enable
virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RoleStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>.RoleStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>.RoleStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>.RoleStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserOnlyStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UsersSet.get -> Microsoft.EntityFrameworkCore.DbSet<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>.UserOnlyStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>.UserOnlyStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>.UserOnlyStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore.UserStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>.UserStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>.UserStore(TContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>.UserStore(Microsoft.EntityFrameworkCore.DbContext context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer = null) -> void
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder builder) -> void
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder builder) -> void
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(TKey userId, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Users.get -> System.Linq.IQueryable<TUser>
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityEntityFrameworkBuilderExtensions.AddEntityFrameworkStores<TContext>(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TRoleClaim>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.get -> Microsoft.EntityFrameworkCore.DbSet<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.get -> Microsoft.EntityFrameworkCore.DbSet<TUserRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> Microsoft.EntityFrameworkCore.DbSet<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Context.get -> TContext
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string id) -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole role, System.Security.Claims.Claim claim) -> TRoleClaim
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole role, string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole role, string roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Context.get -> TContext
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Context.get -> TContext
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser>.IdentityDbContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser>.IdentityUserContext(Microsoft.EntityFrameworkCore.DbContextOptions! options) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RoleStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey>.RoleStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext>.RoleStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole>.RoleStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim!>!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin!>!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserOnlyStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UsersSet.get -> Microsoft.EntityFrameworkCore.DbSet<TUser!>!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken!>!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey>.UserOnlyStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext>.UserOnlyStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser>.UserOnlyStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore.UserStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.SaveChanges(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey>.UserStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext>.UserStore(TContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser>.UserStore(Microsoft.EntityFrameworkCore.DbContext! context, Microsoft.AspNetCore.Identity.IdentityErrorDescriber? describer = null) -> void
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder! builder) -> void
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.OnModelCreating(Microsoft.EntityFrameworkCore.ModelBuilder! builder) -> void
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserLoginAsync(TKey userId, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole?>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-override Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Users.get -> System.Linq.IQueryable<TUser!>!
-static Microsoft.Extensions.DependencyInjection.IdentityEntityFrameworkBuilderExtensions.AddEntityFrameworkStores<TContext>(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TRoleClaim!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.RoleClaims.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.get -> Microsoft.EntityFrameworkCore.DbSet<TRole!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.Roles.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.get -> Microsoft.EntityFrameworkCore.DbSet<TUserRole!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityDbContext<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TRoleClaim, TUserToken>.UserRoles.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.get -> Microsoft.EntityFrameworkCore.DbSet<TUserClaim!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserClaims.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.get -> Microsoft.EntityFrameworkCore.DbSet<TUserLogin!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserLogins.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> Microsoft.EntityFrameworkCore.DbSet<TUser!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.get -> Microsoft.EntityFrameworkCore.DbSet<TUserToken!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.IdentityUserContext<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserTokens.set -> void
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Context.get -> TContext!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string! id) -> TKey?
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string?
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole! role, System.Security.Claims.Claim! claim) -> TRoleClaim!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string! normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole! role, string? normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole! role, string? roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserOnlyStore<TUser, TContext, TKey, TUserClaim, TUserLogin, TUserToken>.Context.get -> TContext!
-virtual Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.Context.get -> TContext!
diff --git a/src/Identity/EntityFrameworkCore/src/RoleStore.cs b/src/Identity/EntityFrameworkCore/src/RoleStore.cs
index 308dbed866..19955565ea 100644
--- a/src/Identity/EntityFrameworkCore/src/RoleStore.cs
+++ b/src/Identity/EntityFrameworkCore/src/RoleStore.cs
@@ -346,10 +346,7 @@ public class RoleStore<TRole, TContext, TKey, TUserRole, TRoleClaim> :
/// </summary>
protected void ThrowIfDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(GetType().Name);
- }
+ ObjectDisposedException.ThrowIf(_disposed, this);
}
/// <summary>
diff --git a/src/Identity/EntityFrameworkCore/src/UserStore.cs b/src/Identity/EntityFrameworkCore/src/UserStore.cs
index fb5d7c90a4..e13662f26f 100644
--- a/src/Identity/EntityFrameworkCore/src/UserStore.cs
+++ b/src/Identity/EntityFrameworkCore/src/UserStore.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Security.Claims;
@@ -89,7 +90,7 @@ public class UserStore<TUser, TRole, TContext, TKey> : UserStore<TUser, TRole, T
/// <typeparam name="TUserLogin">The type representing a user external login.</typeparam>
/// <typeparam name="TUserToken">The type representing a user token.</typeparam>
/// <typeparam name="TRoleClaim">The type representing a role claim.</typeparam>
-public class UserStore<TUser, TRole, TContext, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim> :
+public class UserStore<TUser, TRole, TContext, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim> :
UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>,
IProtectedUserStore<TUser>
where TUser : IdentityUser<TKey>
diff --git a/src/Identity/Extensions.Core/src/Base32.cs b/src/Identity/Extensions.Core/src/Base32.cs
index e569b12d59..6a30a647fd 100644
--- a/src/Identity/Extensions.Core/src/Base32.cs
+++ b/src/Identity/Extensions.Core/src/Base32.cs
@@ -43,20 +43,20 @@ internal static class Base32
{
throw new ArgumentNullException(nameof(input));
}
- input = input.TrimEnd('=').ToUpperInvariant();
- if (input.Length == 0)
+ var trimmedInput = input.AsSpan().TrimEnd('=');
+ if (trimmedInput.Length == 0)
{
return Array.Empty<byte>();
}
- var output = new byte[input.Length * 5 / 8];
+ var output = new byte[trimmedInput.Length * 5 / 8];
var bitIndex = 0;
var inputIndex = 0;
var outputBits = 0;
var outputIndex = 0;
while (outputIndex < output.Length)
{
- var byteIndex = _base32Chars.IndexOf(input[inputIndex]);
+ var byteIndex = _base32Chars.IndexOf(char.ToUpperInvariant(trimmedInput[inputIndex]));
if (byteIndex < 0)
{
throw new FormatException();
diff --git a/src/Identity/Extensions.Core/src/IdentityBuilder.cs b/src/Identity/Extensions.Core/src/IdentityBuilder.cs
index c22746ba90..28e3804e9c 100644
--- a/src/Identity/Extensions.Core/src/IdentityBuilder.cs
+++ b/src/Identity/Extensions.Core/src/IdentityBuilder.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Identity.Core;
@@ -30,7 +31,7 @@ public class IdentityBuilder
/// <param name="user">The <see cref="Type"/> to use for the users.</param>
/// <param name="role">The <see cref="Type"/> to use for the roles.</param>
/// <param name="services">The <see cref="IServiceCollection"/> to attach to.</param>
- public IdentityBuilder(Type user, Type role, IServiceCollection services) : this(user, services)
+ public IdentityBuilder(Type user, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type role, IServiceCollection services) : this(user, services)
=> RoleType = role;
/// <summary>
@@ -47,6 +48,7 @@ public class IdentityBuilder
/// <value>
/// The <see cref="Type"/> used for roles.
/// </value>
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
public Type? RoleType { get; private set; }
/// <summary>
@@ -57,7 +59,7 @@ public class IdentityBuilder
/// </value>
public IServiceCollection Services { get; }
- private IdentityBuilder AddScoped(Type serviceType, Type concreteType)
+ private IdentityBuilder AddScoped(Type serviceType, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type concreteType)
{
Services.AddScoped(serviceType, concreteType);
return this;
@@ -68,7 +70,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TValidator">The user validator type.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddUserValidator<TValidator>() where TValidator : class
+ public virtual IdentityBuilder AddUserValidator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>() where TValidator : class
=> AddScoped(typeof(IUserValidator<>).MakeGenericType(UserType), typeof(TValidator));
/// <summary>
@@ -76,7 +78,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TFactory">The type of the claims principal factory.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddClaimsPrincipalFactory<TFactory>() where TFactory : class
+ public virtual IdentityBuilder AddClaimsPrincipalFactory<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TFactory>() where TFactory : class
=> AddScoped(typeof(IUserClaimsPrincipalFactory<>).MakeGenericType(UserType), typeof(TFactory));
/// <summary>
@@ -84,7 +86,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TDescriber">The type of the error describer.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddErrorDescriber<TDescriber>() where TDescriber : IdentityErrorDescriber
+ public virtual IdentityBuilder AddErrorDescriber<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TDescriber>() where TDescriber : IdentityErrorDescriber
{
Services.AddScoped<IdentityErrorDescriber, TDescriber>();
return this;
@@ -95,7 +97,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TValidator">The validator type used to validate passwords.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddPasswordValidator<TValidator>() where TValidator : class
+ public virtual IdentityBuilder AddPasswordValidator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TValidator>() where TValidator : class
=> AddScoped(typeof(IPasswordValidator<>).MakeGenericType(UserType), typeof(TValidator));
/// <summary>
@@ -103,7 +105,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TStore">The user store type.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddUserStore<TStore>() where TStore : class
+ public virtual IdentityBuilder AddUserStore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TStore>() where TStore : class
=> AddScoped(typeof(IUserStore<>).MakeGenericType(UserType), typeof(TStore));
/// <summary>
@@ -112,7 +114,7 @@ public class IdentityBuilder
/// <typeparam name="TProvider">The type of the token provider to add.</typeparam>
/// <param name="providerName">The name of the provider to add.</param>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddTokenProvider<TProvider>(string providerName) where TProvider : class
+ public virtual IdentityBuilder AddTokenProvider<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TProvider>(string providerName) where TProvider : class
=> AddTokenProvider(providerName, typeof(TProvider));
/// <summary>
@@ -121,7 +123,7 @@ public class IdentityBuilder
/// <param name="providerName">The name of the provider to add.</param>
/// <param name="provider">The type of the <see cref="IUserTwoFactorTokenProvider{TUser}"/> to add.</param>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddTokenProvider(string providerName, Type provider)
+ public virtual IdentityBuilder AddTokenProvider(string providerName, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type provider)
{
if (!typeof(IUserTwoFactorTokenProvider<>).MakeGenericType(UserType).IsAssignableFrom(provider))
{
@@ -140,7 +142,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TUserManager">The type of the user manager to add.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddUserManager<TUserManager>() where TUserManager : class
+ public virtual IdentityBuilder AddUserManager<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TUserManager>() where TUserManager : class
{
var userManagerType = typeof(UserManager<>).MakeGenericType(UserType);
var customType = typeof(TUserManager);
@@ -160,7 +162,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TRole">The role type.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddRoles<TRole>() where TRole : class
+ public virtual IdentityBuilder AddRoles<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>() where TRole : class
{
RoleType = typeof(TRole);
AddRoleValidator<RoleValidator<TRole>>();
@@ -174,7 +176,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TRole">The role validator type.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddRoleValidator<TRole>() where TRole : class
+ public virtual IdentityBuilder AddRoleValidator<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRole>() where TRole : class
{
if (RoleType == null)
{
@@ -189,7 +191,7 @@ public class IdentityBuilder
/// <typeparam name="TProtector">The personal data protector type.</typeparam>
/// <typeparam name="TKeyRing">The personal data protector key ring type.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddPersonalDataProtection<TProtector, TKeyRing>()
+ public virtual IdentityBuilder AddPersonalDataProtection<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TProtector, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TKeyRing>()
where TProtector : class, ILookupProtector
where TKeyRing : class, ILookupProtectorKeyRing
{
@@ -204,7 +206,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TStore">The role store.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddRoleStore<TStore>() where TStore : class
+ public virtual IdentityBuilder AddRoleStore<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TStore>() where TStore : class
{
if (RoleType == null)
{
@@ -218,7 +220,7 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TRoleManager">The type of the role manager to add.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddRoleManager<TRoleManager>() where TRoleManager : class
+ public virtual IdentityBuilder AddRoleManager<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TRoleManager>() where TRoleManager : class
{
if (RoleType == null)
{
@@ -242,6 +244,6 @@ public class IdentityBuilder
/// </summary>
/// <typeparam name="TUserConfirmation">The type of the user confirmation to add.</typeparam>
/// <returns>The current <see cref="IdentityBuilder"/> instance.</returns>
- public virtual IdentityBuilder AddUserConfirmation<TUserConfirmation>() where TUserConfirmation : class
+ public virtual IdentityBuilder AddUserConfirmation<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TUserConfirmation>() where TUserConfirmation : class
=> AddScoped(typeof(IUserConfirmation<>).MakeGenericType(UserType), typeof(TUserConfirmation));
}
diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj
index b47766eb79..f0ab95bac4 100644
--- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj
+++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>ASP.NET Core Identity is the membership system for building ASP.NET Core web applications, including membership, login, and user data. ASP.NET Core Identity allows you to add login features to your application and makes it easy to customize data about the logged in user.</Description>
@@ -7,12 +7,16 @@
<IsAspNetCoreApp>true</IsAspNetCoreApp>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;identity;membership</PackageTags>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.Extensions.Options" />
+
+ <Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
+ Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
</ItemGroup>
<ItemGroup
diff --git a/src/Identity/Extensions.Core/src/PublicAPI.Shipped.txt b/src/Identity/Extensions.Core/src/PublicAPI.Shipped.txt
index 4085d45cc7..852dc9d908 100644
--- a/src/Identity/Extensions.Core/src/PublicAPI.Shipped.txt
+++ b/src/Identity/Extensions.Core/src/PublicAPI.Shipped.txt
@@ -1,418 +1,418 @@
#nullable enable
-~abstract Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~const Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberTokenPurpose = "ChangePhoneNumber" -> string
-~const Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailTokenPurpose = "EmailConfirmation" -> string
-~const Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordTokenPurpose = "ResetPassword" -> string
-~Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.get -> string
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.set -> void
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.get -> string
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.set -> void
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.get -> string
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.set -> void
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.get -> string
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.set -> void
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.get -> string
-~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.set -> void
-~Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.DefaultPersonalDataProtector(Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing keyRing, Microsoft.AspNetCore.Identity.ILookupProtector protector) -> void
-~Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>
-~Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>
-~Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type user, Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> void
-~Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type user, System.Type role, Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> void
-~Microsoft.AspNetCore.Identity.IdentityBuilder.RoleType.get -> System.Type
-~Microsoft.AspNetCore.Identity.IdentityBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection
-~Microsoft.AspNetCore.Identity.IdentityBuilder.UserType.get -> System.Type
-~Microsoft.AspNetCore.Identity.IdentityError.Code.get -> string
-~Microsoft.AspNetCore.Identity.IdentityError.Code.set -> void
-~Microsoft.AspNetCore.Identity.IdentityError.Description.get -> string
-~Microsoft.AspNetCore.Identity.IdentityError.Description.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.get -> Microsoft.AspNetCore.Identity.ClaimsIdentityOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.get -> Microsoft.AspNetCore.Identity.LockoutOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.Password.get -> Microsoft.AspNetCore.Identity.PasswordOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.Password.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.get -> Microsoft.AspNetCore.Identity.SignInOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.Stores.get -> Microsoft.AspNetCore.Identity.StoreOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.Stores.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.get -> Microsoft.AspNetCore.Identity.TokenOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.set -> void
-~Microsoft.AspNetCore.Identity.IdentityOptions.User.get -> Microsoft.AspNetCore.Identity.UserOptions
-~Microsoft.AspNetCore.Identity.IdentityOptions.User.set -> void
-~Microsoft.AspNetCore.Identity.IdentityResult.Errors.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IdentityError>
-~Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeEmail(string email) -> string
-~Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeName(string name) -> string
-~Microsoft.AspNetCore.Identity.ILookupProtector.Protect(string keyId, string data) -> string
-~Microsoft.AspNetCore.Identity.ILookupProtector.Unprotect(string keyId, string data) -> string
-~Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.CurrentKeyId.get -> string
-~Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.GetAllKeyIds() -> System.Collections.Generic.IEnumerable<string>
-~Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.this[string keyId].get -> string
-~Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>
-~Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.HashPassword(TUser user, string password) -> string
-~Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-~Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>
-~Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IPersonalDataProtector.Protect(string data) -> string
-~Microsoft.AspNetCore.Identity.IPersonalDataProtector.Unprotect(string data) -> string
-~Microsoft.AspNetCore.Identity.IProtectedUserStore<TUser>
-~Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>
-~Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>.Roles.get -> System.Linq.IQueryable<TRole>
-~Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>
-~Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>.Users.get -> System.Linq.IQueryable<TUser>
-~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>
-~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.GetClaimsAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.CreateAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.DeleteAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByIdAsync(string roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByNameAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetNormalizedRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleIdAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetNormalizedRoleNameAsync(TRole role, string normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetRoleNameAsync(TRole role, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.UpdateAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IRoleValidator<TRole>
-~Microsoft.AspNetCore.Identity.IRoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole> manager, TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.GetTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.RemoveTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.SetTokenAsync(TUser user, string loginProvider, string name, string value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.GetAuthenticatorKeyAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.SetAuthenticatorKeyAsync(TUser user, string key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>
-~Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>.CreateAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal>
-~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>
-~Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetNormalizedEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailAsync(TUser user, string email, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetNormalizedEmailAsync(TUser user, string normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEndDateAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.DateTimeOffset?>
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.IncrementAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.ResetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEndDateAsync(TUser user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.GetPasswordHashAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.HasPasswordAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.SetPasswordHashAsync(TUser user, string passwordHash, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberAsync(TUser user, string phoneNumber, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.AddToRoleAsync(TUser user, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetRolesAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetUsersInRoleAsync(string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.IsInRoleAsync(TUser user, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.RemoveFromRoleAsync(TUser user, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.GetSecurityStampAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.SetSecurityStampAsync(TUser user, string stamp, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetNormalizedUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserIdAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetNormalizedUserNameAsync(TUser user, string normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetUserNameAsync(TUser user, string userName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserStore<TUser>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.CountCodesAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.RedeemCodeAsync(TUser user, string code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.ReplaceCodesAsync(TUser user, System.Collections.Generic.IEnumerable<string> recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.GetTwoFactorEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.SetTwoFactorEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~Microsoft.AspNetCore.Identity.IUserValidator<TUser>
-~Microsoft.AspNetCore.Identity.IUserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>
-~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions> optionsAccessor = null) -> void
-~Microsoft.AspNetCore.Identity.PasswordValidator<TUser>
-~Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.PasswordValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors = null) -> void
-~Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.set -> void
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.set -> void
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole> store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole>> roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole>> logger) -> void
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IRoleValidator<TRole>>
-~Microsoft.AspNetCore.Identity.RoleManager<TRole>.Store.get -> Microsoft.AspNetCore.Identity.IRoleStore<TRole>
-~Microsoft.AspNetCore.Identity.RoleValidator<TRole>
-~Microsoft.AspNetCore.Identity.RoleValidator<TRole>.RoleValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors = null) -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.get -> string
-~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.set -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.get -> string
-~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.set -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.get -> string
-~Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.set -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.get -> string
-~Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.set -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.get -> string
-~Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.set -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.get -> string
-~Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.set -> void
-~Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.get -> System.Collections.Generic.Dictionary<string, Microsoft.AspNetCore.Identity.TokenProviderDescriptor>
-~Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.set -> void
-~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.get -> object
-~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.set -> void
-~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderType.get -> System.Type
-~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.TokenProviderDescriptor(System.Type type) -> void
-~Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>
-~Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeEmail(string email) -> string
-~Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeName(string name) -> string
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.RoleManager.get -> Microsoft.AspNetCore.Identity.RoleManager<TRole>
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole> roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> options) -> void
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor) -> void
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser>
-~Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.get -> string
-~Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.set -> void
-~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.get -> string
-~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.set -> void
-~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.get -> string
-~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.set -> void
-~Microsoft.AspNetCore.Identity.UserLoginInfo.UserLoginInfo(string loginProvider, string providerKey, string displayName) -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.set -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.set -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.set -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.get -> Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.set -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>>
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.get -> Microsoft.AspNetCore.Identity.IUserStore<TUser>
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.set -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.UserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser> store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser> passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser>> userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>> passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, System.IServiceProvider services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser>> logger) -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.UserValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IUserValidator<TUser>>
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidatePasswordAsync(TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidateUserAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.get -> string
-~Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.set -> void
-~Microsoft.AspNetCore.Identity.UserValidator<TUser>
-~Microsoft.AspNetCore.Identity.UserValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.UserValidator<TUser>.UserValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors = null) -> void
-~override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.GetUserModifierAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~override Microsoft.AspNetCore.Identity.IdentityResult.ToString() -> string
-~override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.GetUserModifierAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~override Microsoft.AspNetCore.Identity.SignInResult.ToString() -> string
-~override Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.GenerateClaimsAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity>
-~static Microsoft.AspNetCore.Identity.IdentityResult.Failed(params Microsoft.AspNetCore.Identity.IdentityError[] errors) -> Microsoft.AspNetCore.Identity.IdentityResult
-~static Microsoft.AspNetCore.Identity.IdentityResult.Success.get -> Microsoft.AspNetCore.Identity.IdentityResult
-~static Microsoft.AspNetCore.Identity.SignInResult.Failed.get -> Microsoft.AspNetCore.Identity.SignInResult
-~static Microsoft.AspNetCore.Identity.SignInResult.LockedOut.get -> Microsoft.AspNetCore.Identity.SignInResult
-~static Microsoft.AspNetCore.Identity.SignInResult.NotAllowed.get -> Microsoft.AspNetCore.Identity.SignInResult
-~static Microsoft.AspNetCore.Identity.SignInResult.Success.get -> Microsoft.AspNetCore.Identity.SignInResult
-~static Microsoft.AspNetCore.Identity.SignInResult.TwoFactorRequired.get -> Microsoft.AspNetCore.Identity.SignInResult
-~static Microsoft.AspNetCore.Identity.UserManager<TUser>.GetChangeEmailTokenPurpose(string newEmail) -> string
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions> setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultAuthenticatorProvider -> string
-~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultEmailProvider -> string
-~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultPhoneProvider -> string
-~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultProvider -> string
-~static System.Security.Claims.PrincipalExtensions.FindFirstValue(this System.Security.Claims.ClaimsPrincipal principal, string claimType) -> string
-~virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Protect(string data) -> string
-~virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Unprotect(string data) -> string
-~virtual Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddClaimsPrincipalFactory<TFactory>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddErrorDescriber<TDescriber>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPasswordValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPersonalDataProtection<TProtector, TKeyRing>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleManager<TRoleManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoles<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleValidator<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider(string providerName, System.Type provider) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider<TProvider>(string providerName) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserConfirmation<TUserConfirmation>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserManager<TUserManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.ConcurrencyFailure() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DefaultError() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateEmail(string email) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateRoleName(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateUserName(string userName) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidEmail(string email) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidRoleName(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidToken() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidUserName(string userName) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.LoginAlreadyAssociated() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordMismatch() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresDigit() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresLower() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresNonAlphanumeric() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUniqueChars(int uniqueChars) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUpper() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordTooShort(int length) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.RecoveryCodeRedemptionFailed() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyHasPassword() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyInRole(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserLockoutNotEnabled() -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserNotInRole(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-~virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.HashPassword(TUser user, string password) -> string
-~virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-~virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.CreateAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.DeleteAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByIdAsync(string roleId) -> System.Threading.Tasks.Task<TRole>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByNameAsync(string roleName) -> System.Threading.Tasks.Task<TRole>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetClaimsAsync(TRole role) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleIdAsync(TRole role) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleNameAsync(TRole role) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.set -> void
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.NormalizeKey(string key) -> string
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleExistsAsync(string roleName) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Roles.get -> System.Linq.IQueryable<TRole>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.SetRoleNameAsync(TRole role, string name) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateNormalizedRoleNameAsync(TRole role) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateRoleAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.ValidateRoleAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.RoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole> manager, TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GetUserModifierAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.CreateAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal>
-~virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.GenerateClaimsAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AccessFailedAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimAsync(TUser user, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddPasswordAsync(TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRoleAsync(TUser user, string role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRolesAsync(TUser user, System.Collections.Generic.IEnumerable<string> roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangeEmailAsync(TUser user, string newEmail, string token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePasswordAsync(TUser user, string currentPassword, string newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberAsync(TUser user, string phoneNumber, string token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CheckPasswordAsync(TUser user, string password) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailAsync(TUser user, string token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CountRecoveryCodesAsync(TUser user) -> System.Threading.Tasks.Task<int>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateSecurityTokenAsync(TUser user) -> System.Threading.Tasks.Task<byte[]>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateTwoFactorRecoveryCode() -> string
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.DeleteAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByEmailAsync(string email) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByIdAsync(string userId) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByLoginAsync(string loginProvider, string providerKey) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByNameAsync(string userName) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangeEmailTokenAsync(TUser user, string newEmail) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangePhoneNumberTokenAsync(TUser user, string phoneNumber) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateConcurrencyStampAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateEmailConfirmationTokenAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewAuthenticatorKey() -> string
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewTwoFactorRecoveryCodesAsync(TUser user, int number) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<string>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GeneratePasswordResetTokenAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateTwoFactorTokenAsync(TUser user, string tokenProvider) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateUserTokenAsync(TUser user, string tokenProvider, string purpose) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAccessFailedCountAsync(TUser user) -> System.Threading.Tasks.Task<int>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticationTokenAsync(TUser user, string loginProvider, string tokenName) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticatorKeyAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetClaimsAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetEmailAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEnabledAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEndDateAsync(TUser user) -> System.Threading.Tasks.Task<System.DateTimeOffset?>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLoginsAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetPhoneNumberAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetRolesAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetSecurityStampAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetTwoFactorEnabledAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserAsync(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserId(System.Security.Claims.ClaimsPrincipal principal) -> string
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserIdAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserName(System.Security.Claims.ClaimsPrincipal principal) -> string
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserNameAsync(TUser user) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersInRoleAsync(string roleName) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetValidTwoFactorProvidersAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.HasPasswordAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsEmailConfirmedAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsInRoleAsync(TUser user, string role) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsLockedOutAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsPhoneNumberConfirmedAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.set -> void
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeEmail(string email) -> string
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeName(string name) -> string
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RedeemTwoFactorRecoveryCodeAsync(TUser user, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RegisterTokenProvider(string providerName, Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser> provider) -> void
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveAuthenticationTokenAsync(TUser user, string loginProvider, string tokenName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimAsync(TUser user, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRoleAsync(TUser user, string role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRolesAsync(TUser user, System.Collections.Generic.IEnumerable<string> roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemovePasswordAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAccessFailedCountAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAuthenticatorKeyAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordAsync(TUser user, string token, string newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetAuthenticationTokenAsync(TUser user, string loginProvider, string tokenName, string tokenValue) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetEmailAsync(TUser user, string email) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEnabledAsync(TUser user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEndDateAsync(TUser user, System.DateTimeOffset? lockoutEnd) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetPhoneNumberAsync(TUser user, string phoneNumber) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetTwoFactorEnabledAsync(TUser user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetUserNameAsync(TUser user, string userName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedEmailAsync(TUser user) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedUserNameAsync(TUser user) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdatePasswordHash(TUser user, string newPassword, bool validatePassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateSecurityStampAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateUserAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Users.get -> System.Linq.IQueryable<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyChangePhoneNumberTokenAsync(TUser user, string token, string phoneNumber) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyPasswordAsync(Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser> store, TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.PasswordVerificationResult>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyTwoFactorTokenAsync(TUser user, string tokenProvider, string token) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyUserTokenAsync(TUser user, string tokenProvider, string purpose, string token) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
+abstract Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+const Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberTokenPurpose = "ChangePhoneNumber" -> string!
+const Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailTokenPurpose = "EmailConfirmation" -> string!
+const Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordTokenPurpose = "ResetPassword" -> string!
+Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.get -> string!
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.set -> void
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.get -> string!
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.set -> void
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.get -> string!
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.set -> void
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.get -> string!
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.set -> void
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.get -> string!
+Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.set -> void
+Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.DefaultPersonalDataProtector(Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing! keyRing, Microsoft.AspNetCore.Identity.ILookupProtector! protector) -> void
+Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>
+Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>
+Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type! user, Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
+Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type! user, System.Type! role, Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
+Microsoft.AspNetCore.Identity.IdentityBuilder.RoleType.get -> System.Type?
+Microsoft.AspNetCore.Identity.IdentityBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+Microsoft.AspNetCore.Identity.IdentityBuilder.UserType.get -> System.Type!
+Microsoft.AspNetCore.Identity.IdentityError.Code.get -> string!
+Microsoft.AspNetCore.Identity.IdentityError.Code.set -> void
+Microsoft.AspNetCore.Identity.IdentityError.Description.get -> string!
+Microsoft.AspNetCore.Identity.IdentityError.Description.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.get -> Microsoft.AspNetCore.Identity.ClaimsIdentityOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.get -> Microsoft.AspNetCore.Identity.LockoutOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.Password.get -> Microsoft.AspNetCore.Identity.PasswordOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.Password.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.get -> Microsoft.AspNetCore.Identity.SignInOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.Stores.get -> Microsoft.AspNetCore.Identity.StoreOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.Stores.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.get -> Microsoft.AspNetCore.Identity.TokenOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.set -> void
+Microsoft.AspNetCore.Identity.IdentityOptions.User.get -> Microsoft.AspNetCore.Identity.UserOptions!
+Microsoft.AspNetCore.Identity.IdentityOptions.User.set -> void
+Microsoft.AspNetCore.Identity.IdentityResult.Errors.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IdentityError!>!
+Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeEmail(string? email) -> string?
+Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeName(string? name) -> string?
+Microsoft.AspNetCore.Identity.ILookupProtector.Protect(string! keyId, string? data) -> string?
+Microsoft.AspNetCore.Identity.ILookupProtector.Unprotect(string! keyId, string? data) -> string?
+Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.CurrentKeyId.get -> string!
+Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.GetAllKeyIds() -> System.Collections.Generic.IEnumerable<string!>!
+Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.this[string! keyId].get -> string!
+Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>
+Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.HashPassword(TUser! user, string! password) -> string!
+Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.VerifyHashedPassword(TUser! user, string! hashedPassword, string! providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
+Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>
+Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user, string? password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IPersonalDataProtector.Protect(string? data) -> string?
+Microsoft.AspNetCore.Identity.IPersonalDataProtector.Unprotect(string? data) -> string?
+Microsoft.AspNetCore.Identity.IProtectedUserStore<TUser>
+Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>
+Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>.Roles.get -> System.Linq.IQueryable<TRole!>!
+Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>
+Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>.Users.get -> System.Linq.IQueryable<TUser!>!
+Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>
+Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.GetClaimsAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.CreateAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.DeleteAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByIdAsync(string! roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByNameAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetNormalizedRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleIdAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string!>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetNormalizedRoleNameAsync(TRole! role, string? normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetRoleNameAsync(TRole! role, string? roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IRoleStore<TRole>.UpdateAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IRoleValidator<TRole>
+Microsoft.AspNetCore.Identity.IRoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole!>! manager, TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>
+Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.GetTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.RemoveTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.SetTokenAsync(TUser! user, string! loginProvider, string! name, string? value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>
+Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.GetAuthenticatorKeyAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.SetAuthenticatorKeyAsync(TUser! user, string! key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>
+Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>.CreateAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal!>!
+Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>
+Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>
+Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetNormalizedEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailAsync(TUser! user, string? email, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetNormalizedEmailAsync(TUser! user, string? normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEndDateAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.DateTimeOffset?>!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.IncrementAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.ResetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEndDateAsync(TUser! user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>
+Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
+Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>
+Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.GetPasswordHashAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.HasPasswordAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.SetPasswordHashAsync(TUser! user, string? passwordHash, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>
+Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberAsync(TUser! user, string? phoneNumber, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>
+Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.AddToRoleAsync(TUser! user, string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetRolesAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
+Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetUsersInRoleAsync(string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.IsInRoleAsync(TUser! user, string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.RemoveFromRoleAsync(TUser! user, string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>
+Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.GetSecurityStampAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.SetSecurityStampAsync(TUser! user, string! stamp, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetNormalizedUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserIdAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string!>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetNormalizedUserNameAsync(TUser! user, string? normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetUserNameAsync(TUser! user, string? userName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserStore<TUser>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>
+Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.CountCodesAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
+Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.RedeemCodeAsync(TUser! user, string! code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.ReplaceCodesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>
+Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.GetTwoFactorEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.SetTwoFactorEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>
+Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Identity.IUserValidator<TUser>
+Microsoft.AspNetCore.Identity.IUserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.PasswordHasher<TUser>
+Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions!>? optionsAccessor = null) -> void
+Microsoft.AspNetCore.Identity.PasswordValidator<TUser>
+Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.PasswordValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber? errors = null) -> void
+Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>
+Microsoft.AspNetCore.Identity.RoleManager<TRole>
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.set -> void
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer!
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.set -> void
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole!>! store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole!>!>! roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole!>!>! logger) -> void
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IRoleValidator<TRole!>!>!
+Microsoft.AspNetCore.Identity.RoleManager<TRole>.Store.get -> Microsoft.AspNetCore.Identity.IRoleStore<TRole!>!
+Microsoft.AspNetCore.Identity.RoleValidator<TRole>
+Microsoft.AspNetCore.Identity.RoleValidator<TRole>.RoleValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber? errors = null) -> void
+Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.get -> string!
+Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.set -> void
+Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.get -> string!
+Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.set -> void
+Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.get -> string!
+Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.set -> void
+Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.get -> string!
+Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.set -> void
+Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.get -> string!
+Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.set -> void
+Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.get -> string!
+Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.set -> void
+Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.get -> System.Collections.Generic.Dictionary<string!, Microsoft.AspNetCore.Identity.TokenProviderDescriptor!>!
+Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.set -> void
+Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.get -> object?
+Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.set -> void
+Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderType.get -> System.Type!
+Microsoft.AspNetCore.Identity.TokenProviderDescriptor.TokenProviderDescriptor(System.Type! type) -> void
+Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>
+Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeEmail(string? email) -> string?
+Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeName(string? name) -> string?
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.RoleManager.get -> Microsoft.AspNetCore.Identity.RoleManager<TRole!>!
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole!>! roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! options) -> void
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions!
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor) -> void
+Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser!>!
+Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.get -> string!
+Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.set -> void
+Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.get -> string?
+Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.set -> void
+Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.get -> string!
+Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.set -> void
+Microsoft.AspNetCore.Identity.UserLoginInfo.UserLoginInfo(string! loginProvider, string! providerKey, string? displayName) -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>
+Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.set -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.set -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.set -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.get -> Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.set -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.get -> Microsoft.AspNetCore.Identity.IUserStore<TUser!>!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.set -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>.UserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser!>! store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>! passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>! userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>! passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, System.IServiceProvider! services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser!>!>! logger) -> void
+Microsoft.AspNetCore.Identity.UserManager<TUser>.UserValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidatePasswordAsync(TUser! user, string? password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidateUserAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.get -> string!
+Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.set -> void
+Microsoft.AspNetCore.Identity.UserValidator<TUser>
+Microsoft.AspNetCore.Identity.UserValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.UserValidator<TUser>.UserValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber? errors = null) -> void
+override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.GetUserModifierAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+override Microsoft.AspNetCore.Identity.IdentityResult.ToString() -> string!
+override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.GetUserModifierAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+override Microsoft.AspNetCore.Identity.SignInResult.ToString() -> string!
+override Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.GenerateClaimsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity!>!
+static Microsoft.AspNetCore.Identity.IdentityResult.Failed(params Microsoft.AspNetCore.Identity.IdentityError![]! errors) -> Microsoft.AspNetCore.Identity.IdentityResult!
+static Microsoft.AspNetCore.Identity.IdentityResult.Success.get -> Microsoft.AspNetCore.Identity.IdentityResult!
+static Microsoft.AspNetCore.Identity.SignInResult.Failed.get -> Microsoft.AspNetCore.Identity.SignInResult!
+static Microsoft.AspNetCore.Identity.SignInResult.LockedOut.get -> Microsoft.AspNetCore.Identity.SignInResult!
+static Microsoft.AspNetCore.Identity.SignInResult.NotAllowed.get -> Microsoft.AspNetCore.Identity.SignInResult!
+static Microsoft.AspNetCore.Identity.SignInResult.Success.get -> Microsoft.AspNetCore.Identity.SignInResult!
+static Microsoft.AspNetCore.Identity.SignInResult.TwoFactorRequired.get -> Microsoft.AspNetCore.Identity.SignInResult!
+static Microsoft.AspNetCore.Identity.UserManager<TUser>.GetChangeEmailTokenPurpose(string! newEmail) -> string!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions!>! setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultAuthenticatorProvider -> string!
+static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultEmailProvider -> string!
+static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultPhoneProvider -> string!
+static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultProvider -> string!
+static System.Security.Claims.PrincipalExtensions.FindFirstValue(this System.Security.Claims.ClaimsPrincipal! principal, string! claimType) -> string?
+virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Protect(string? data) -> string?
+virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Unprotect(string? data) -> string?
+virtual Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddClaimsPrincipalFactory<TFactory>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddErrorDescriber<TDescriber>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPasswordValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPersonalDataProtection<TProtector, TKeyRing>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleManager<TRoleManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoles<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleValidator<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider(string! providerName, System.Type! provider) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider<TProvider>(string! providerName) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserConfirmation<TUserConfirmation>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserManager<TUserManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.ConcurrencyFailure() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DefaultError() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateEmail(string! email) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateRoleName(string! role) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateUserName(string! userName) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidEmail(string? email) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidRoleName(string? role) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidToken() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidUserName(string? userName) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.LoginAlreadyAssociated() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordMismatch() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresDigit() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresLower() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresNonAlphanumeric() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUniqueChars(int uniqueChars) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUpper() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordTooShort(int length) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.RecoveryCodeRedemptionFailed() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyHasPassword() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyInRole(string! role) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserLockoutNotEnabled() -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserNotInRole(string! role) -> Microsoft.AspNetCore.Identity.IdentityError!
+virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.HashPassword(TUser! user, string! password) -> string!
+virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.VerifyHashedPassword(TUser! user, string! hashedPassword, string! providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
+virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user, string? password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.CreateAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.DeleteAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByIdAsync(string! roleId) -> System.Threading.Tasks.Task<TRole?>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByNameAsync(string! roleName) -> System.Threading.Tasks.Task<TRole?>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetClaimsAsync(TRole! role) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleIdAsync(TRole! role) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleNameAsync(TRole! role) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.set -> void
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.NormalizeKey(string? key) -> string?
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleExistsAsync(string! roleName) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Roles.get -> System.Linq.IQueryable<TRole!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.SetRoleNameAsync(TRole! role, string? name) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateNormalizedRoleNameAsync(TRole! role) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateRoleAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.ValidateRoleAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.RoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole!>! manager, TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GetUserModifierAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.CreateAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal!>!
+virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.GenerateClaimsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AccessFailedAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimAsync(TUser! user, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddPasswordAsync(TUser! user, string! password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRoleAsync(TUser! user, string! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRolesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangeEmailAsync(TUser! user, string! newEmail, string! token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePasswordAsync(TUser! user, string! currentPassword, string! newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberAsync(TUser! user, string! phoneNumber, string! token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CheckPasswordAsync(TUser! user, string! password) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailAsync(TUser! user, string! token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CountRecoveryCodesAsync(TUser! user) -> System.Threading.Tasks.Task<int>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser! user, string! password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateSecurityTokenAsync(TUser! user) -> System.Threading.Tasks.Task<byte[]!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateTwoFactorRecoveryCode() -> string!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.DeleteAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByEmailAsync(string! email) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByIdAsync(string! userId) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByLoginAsync(string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByNameAsync(string! userName) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangeEmailTokenAsync(TUser! user, string! newEmail) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangePhoneNumberTokenAsync(TUser! user, string! phoneNumber) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateConcurrencyStampAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateEmailConfirmationTokenAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewAuthenticatorKey() -> string!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewTwoFactorRecoveryCodesAsync(TUser! user, int number) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<string!>?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GeneratePasswordResetTokenAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateTwoFactorTokenAsync(TUser! user, string! tokenProvider) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateUserTokenAsync(TUser! user, string! tokenProvider, string! purpose) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAccessFailedCountAsync(TUser! user) -> System.Threading.Tasks.Task<int>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticationTokenAsync(TUser! user, string! loginProvider, string! tokenName) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticatorKeyAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetClaimsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetEmailAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEnabledAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEndDateAsync(TUser! user) -> System.Threading.Tasks.Task<System.DateTimeOffset?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLoginsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetPhoneNumberAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetRolesAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetSecurityStampAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetTwoFactorEnabledAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserAsync(System.Security.Claims.ClaimsPrincipal! principal) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserId(System.Security.Claims.ClaimsPrincipal! principal) -> string?
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserIdAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserName(System.Security.Claims.ClaimsPrincipal! principal) -> string?
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserNameAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersInRoleAsync(string! roleName) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetValidTwoFactorProvidersAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.HasPasswordAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsEmailConfirmedAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsInRoleAsync(TUser! user, string! role) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsLockedOutAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsPhoneNumberConfirmedAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.set -> void
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeEmail(string? email) -> string?
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeName(string? name) -> string?
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RedeemTwoFactorRecoveryCodeAsync(TUser! user, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RegisterTokenProvider(string! providerName, Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser!>! provider) -> void
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveAuthenticationTokenAsync(TUser! user, string! loginProvider, string! tokenName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimAsync(TUser! user, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRoleAsync(TUser! user, string! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRolesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemovePasswordAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAccessFailedCountAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAuthenticatorKeyAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordAsync(TUser! user, string! token, string! newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetAuthenticationTokenAsync(TUser! user, string! loginProvider, string! tokenName, string? tokenValue) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetEmailAsync(TUser! user, string? email) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEnabledAsync(TUser! user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEndDateAsync(TUser! user, System.DateTimeOffset? lockoutEnd) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetPhoneNumberAsync(TUser! user, string? phoneNumber) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetTwoFactorEnabledAsync(TUser! user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetUserNameAsync(TUser! user, string? userName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedEmailAsync(TUser! user) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedUserNameAsync(TUser! user) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdatePasswordHash(TUser! user, string! newPassword, bool validatePassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateSecurityStampAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateUserAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Users.get -> System.Linq.IQueryable<TUser!>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyChangePhoneNumberTokenAsync(TUser! user, string! token, string! phoneNumber) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyPasswordAsync(Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser!>! store, TUser! user, string! password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.PasswordVerificationResult>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyTwoFactorTokenAsync(TUser! user, string! tokenProvider, string! token) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyUserTokenAsync(TUser! user, string! tokenProvider, string! purpose, string! token) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.AuthenticatorTokenProvider() -> void
Microsoft.AspNetCore.Identity.ClaimsIdentityOptions
Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.ClaimsIdentityOptions() -> void
diff --git a/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt b/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt
index 473a300d0b..7dc5c58110 100644
--- a/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt
+++ b/src/Identity/Extensions.Core/src/PublicAPI.Unshipped.txt
@@ -1,926 +1 @@
#nullable enable
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~const Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberTokenPurpose = "ChangePhoneNumber" -> string
-*REMOVED*~const Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailTokenPurpose = "EmailConfirmation" -> string
-*REMOVED*~const Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordTokenPurpose = "ResetPassword" -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.DefaultPersonalDataProtector(Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing keyRing, Microsoft.AspNetCore.Identity.ILookupProtector protector) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type user, Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type user, System.Type role, Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityBuilder.RoleType.get -> System.Type
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityBuilder.UserType.get -> System.Type
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityError.Code.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityError.Code.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityError.Description.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityError.Description.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.get -> Microsoft.AspNetCore.Identity.ClaimsIdentityOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.get -> Microsoft.AspNetCore.Identity.LockoutOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Password.get -> Microsoft.AspNetCore.Identity.PasswordOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.get -> Microsoft.AspNetCore.Identity.SignInOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Stores.get -> Microsoft.AspNetCore.Identity.StoreOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Stores.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.get -> Microsoft.AspNetCore.Identity.TokenOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.User.get -> Microsoft.AspNetCore.Identity.UserOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityOptions.User.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityResult.Errors.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IdentityError>
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeEmail(string email) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeName(string name) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupProtector.Protect(string keyId, string data) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupProtector.Unprotect(string keyId, string data) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.CurrentKeyId.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.GetAllKeyIds() -> System.Collections.Generic.IEnumerable<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.this[string keyId].get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.HashPassword(TUser user, string password) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-*REMOVED*~Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IPersonalDataProtector.Protect(string data) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.IPersonalDataProtector.Unprotect(string data) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.IProtectedUserStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>.Roles.get -> System.Linq.IQueryable<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>.Users.get -> System.Linq.IQueryable<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.GetClaimsAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.CreateAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.DeleteAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByIdAsync(string roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByNameAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetNormalizedRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleIdAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetNormalizedRoleNameAsync(TRole role, string normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetRoleNameAsync(TRole role, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleStore<TRole>.UpdateAsync(TRole role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleValidator<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.IRoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole> manager, TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.GetTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.RemoveTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.SetTokenAsync(TUser user, string loginProvider, string name, string value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.GetAuthenticatorKeyAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.SetAuthenticatorKeyAsync(TUser user, string key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>.CreateAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetNormalizedEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailAsync(TUser user, string email, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetNormalizedEmailAsync(TUser user, string normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEndDateAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.DateTimeOffset?>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.IncrementAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.ResetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEndDateAsync(TUser user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.GetPasswordHashAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.HasPasswordAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.SetPasswordHashAsync(TUser user, string passwordHash, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberAsync(TUser user, string phoneNumber, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.AddToRoleAsync(TUser user, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetRolesAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetUsersInRoleAsync(string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.IsInRoleAsync(TUser user, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.RemoveFromRoleAsync(TUser user, string roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.GetSecurityStampAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.SetSecurityStampAsync(TUser user, string stamp, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetNormalizedUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserIdAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetNormalizedUserNameAsync(TUser user, string normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetUserNameAsync(TUser user, string userName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserStore<TUser>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.CountCodesAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.RedeemCodeAsync(TUser user, string code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.ReplaceCodesAsync(TUser user, System.Collections.Generic.IEnumerable<string> recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.GetTwoFactorEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.SetTwoFactorEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserValidator<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.IUserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions> optionsAccessor = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordValidator<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.PasswordValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole> store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole>> roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole>> logger) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IRoleValidator<TRole>>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleManager<TRole>.Store.get -> Microsoft.AspNetCore.Identity.IRoleStore<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleValidator<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleValidator<TRole>.RoleValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.get -> System.Collections.Generic.Dictionary<string, Microsoft.AspNetCore.Identity.TokenProviderDescriptor>
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.get -> object
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderType.get -> System.Type
-*REMOVED*~Microsoft.AspNetCore.Identity.TokenProviderDescriptor.TokenProviderDescriptor(System.Type type) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeEmail(string email) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeName(string name) -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.RoleManager.get -> Microsoft.AspNetCore.Identity.RoleManager<TRole>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole> roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserLoginInfo.UserLoginInfo(string loginProvider, string providerKey, string displayName) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.get -> Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.get -> Microsoft.AspNetCore.Identity.IUserStore<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.UserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser> store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser> passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser>> userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>> passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, System.IServiceProvider services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser>> logger) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.UserValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IUserValidator<TUser>>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidatePasswordAsync(TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidateUserAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserValidator<TUser>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.UserValidator<TUser>.UserValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors = null) -> void
-*REMOVED*~override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.GetUserModifierAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~override Microsoft.AspNetCore.Identity.IdentityResult.ToString() -> string
-*REMOVED*~override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.GetUserModifierAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~override Microsoft.AspNetCore.Identity.SignInResult.ToString() -> string
-*REMOVED*~override Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.GenerateClaimsAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity>
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityResult.Failed(params Microsoft.AspNetCore.Identity.IdentityError[] errors) -> Microsoft.AspNetCore.Identity.IdentityResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityResult.Success.get -> Microsoft.AspNetCore.Identity.IdentityResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.SignInResult.Failed.get -> Microsoft.AspNetCore.Identity.SignInResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.SignInResult.LockedOut.get -> Microsoft.AspNetCore.Identity.SignInResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.SignInResult.NotAllowed.get -> Microsoft.AspNetCore.Identity.SignInResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.SignInResult.Success.get -> Microsoft.AspNetCore.Identity.SignInResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.SignInResult.TwoFactorRequired.get -> Microsoft.AspNetCore.Identity.SignInResult
-*REMOVED*~static Microsoft.AspNetCore.Identity.UserManager<TUser>.GetChangeEmailTokenPurpose(string newEmail) -> string
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions> setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultAuthenticatorProvider -> string
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultEmailProvider -> string
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultPhoneProvider -> string
-*REMOVED*~static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultProvider -> string
-*REMOVED*~static System.Security.Claims.PrincipalExtensions.FindFirstValue(this System.Security.Claims.ClaimsPrincipal principal, string claimType) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Protect(string data) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Unprotect(string data) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddClaimsPrincipalFactory<TFactory>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddErrorDescriber<TDescriber>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPasswordValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPersonalDataProtection<TProtector, TKeyRing>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleManager<TRoleManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoles<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleValidator<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider(string providerName, System.Type provider) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider<TProvider>(string providerName) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserConfirmation<TUserConfirmation>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserManager<TUserManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.ConcurrencyFailure() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DefaultError() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateEmail(string email) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateRoleName(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateUserName(string userName) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidEmail(string email) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidRoleName(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidToken() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidUserName(string userName) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.LoginAlreadyAssociated() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordMismatch() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresDigit() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresLower() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresNonAlphanumeric() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUniqueChars(int uniqueChars) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUpper() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordTooShort(int length) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.RecoveryCodeRedemptionFailed() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyHasPassword() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyInRole(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserLockoutNotEnabled() -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserNotInRole(string role) -> Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.HashPassword(TUser user, string password) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.VerifyHashedPassword(TUser user, string hashedPassword, string providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.CreateAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.DeleteAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByIdAsync(string roleId) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByNameAsync(string roleName) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetClaimsAsync(TRole role) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleIdAsync(TRole role) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleNameAsync(TRole role) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.NormalizeKey(string key) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleExistsAsync(string roleName) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Roles.get -> System.Linq.IQueryable<TRole>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.SetRoleNameAsync(TRole role, string name) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateNormalizedRoleNameAsync(TRole role) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateRoleAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.ValidateRoleAsync(TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole> manager, TRole role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GenerateAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GetUserModifierAsync(string purpose, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.ValidateAsync(string purpose, string token, Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.CreateAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.GenerateClaimsAsync(TUser user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AccessFailedAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimAsync(TUser user, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddPasswordAsync(TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRoleAsync(TUser user, string role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRolesAsync(TUser user, System.Collections.Generic.IEnumerable<string> roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangeEmailAsync(TUser user, string newEmail, string token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePasswordAsync(TUser user, string currentPassword, string newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberAsync(TUser user, string phoneNumber, string token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CheckPasswordAsync(TUser user, string password) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailAsync(TUser user, string token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CountRecoveryCodesAsync(TUser user) -> System.Threading.Tasks.Task<int>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateSecurityTokenAsync(TUser user) -> System.Threading.Tasks.Task<byte[]>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateTwoFactorRecoveryCode() -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.DeleteAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByEmailAsync(string email) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByIdAsync(string userId) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByLoginAsync(string loginProvider, string providerKey) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByNameAsync(string userName) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangeEmailTokenAsync(TUser user, string newEmail) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangePhoneNumberTokenAsync(TUser user, string phoneNumber) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateConcurrencyStampAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateEmailConfirmationTokenAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewAuthenticatorKey() -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewTwoFactorRecoveryCodesAsync(TUser user, int number) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<string>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GeneratePasswordResetTokenAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateTwoFactorTokenAsync(TUser user, string tokenProvider) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateUserTokenAsync(TUser user, string tokenProvider, string purpose) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAccessFailedCountAsync(TUser user) -> System.Threading.Tasks.Task<int>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticationTokenAsync(TUser user, string loginProvider, string tokenName) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticatorKeyAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetClaimsAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetEmailAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEnabledAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEndDateAsync(TUser user) -> System.Threading.Tasks.Task<System.DateTimeOffset?>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLoginsAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetPhoneNumberAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetRolesAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetSecurityStampAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetTwoFactorEnabledAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserAsync(System.Security.Claims.ClaimsPrincipal principal) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserId(System.Security.Claims.ClaimsPrincipal principal) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserIdAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserName(System.Security.Claims.ClaimsPrincipal principal) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserNameAsync(TUser user) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersInRoleAsync(string roleName) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetValidTwoFactorProvidersAsync(TUser user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.HasPasswordAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsEmailConfirmedAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsInRoleAsync(TUser user, string role) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsLockedOutAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsPhoneNumberConfirmedAsync(TUser user) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeEmail(string email) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeName(string name) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RedeemTwoFactorRecoveryCodeAsync(TUser user, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RegisterTokenProvider(string providerName, Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser> provider) -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveAuthenticationTokenAsync(TUser user, string loginProvider, string tokenName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimAsync(TUser user, System.Security.Claims.Claim claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRoleAsync(TUser user, string role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRolesAsync(TUser user, System.Collections.Generic.IEnumerable<string> roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemovePasswordAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAccessFailedCountAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAuthenticatorKeyAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordAsync(TUser user, string token, string newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetAuthenticationTokenAsync(TUser user, string loginProvider, string tokenName, string tokenValue) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetEmailAsync(TUser user, string email) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEnabledAsync(TUser user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEndDateAsync(TUser user, System.DateTimeOffset? lockoutEnd) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetPhoneNumberAsync(TUser user, string phoneNumber) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetTwoFactorEnabledAsync(TUser user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetUserNameAsync(TUser user, string userName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedEmailAsync(TUser user) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedUserNameAsync(TUser user) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdatePasswordHash(TUser user, string newPassword, bool validatePassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateSecurityStampAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateUserAsync(TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Users.get -> System.Linq.IQueryable<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyChangePhoneNumberTokenAsync(TUser user, string token, string phoneNumber) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyPasswordAsync(Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser> store, TUser user, string password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.PasswordVerificationResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyTwoFactorTokenAsync(TUser user, string tokenProvider, string token) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyUserTokenAsync(TUser user, string tokenProvider, string purpose, string token) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser> manager, TUser user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.AuthenticatorTokenProvider() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.ClaimsIdentityOptions
-*REMOVED*Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.ClaimsIdentityOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector
-*REMOVED*Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>.DefaultUserConfirmation() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.EmailTokenProvider() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityError
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityError.IdentityError() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityErrorDescriber.IdentityErrorDescriber() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityOptions
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityOptions.IdentityOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityResult
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityResult.IdentityResult() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityResult.Succeeded.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.IdentityResult.Succeeded.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.ILookupNormalizer
-*REMOVED*Microsoft.AspNetCore.Identity.ILookupProtector
-*REMOVED*Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing
-*REMOVED*Microsoft.AspNetCore.Identity.IPersonalDataProtector
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.AllowedForNewUsers.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.AllowedForNewUsers.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.DefaultLockoutTimeSpan.get -> System.TimeSpan
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.DefaultLockoutTimeSpan.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.LockoutOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.MaxFailedAccessAttempts.get -> int
-*REMOVED*Microsoft.AspNetCore.Identity.LockoutOptions.MaxFailedAccessAttempts.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode.IdentityV2 = 0 -> Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode.IdentityV3 = 1 -> Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherOptions
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherOptions.CompatibilityMode.get -> Microsoft.AspNetCore.Identity.PasswordHasherCompatibilityMode
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherOptions.CompatibilityMode.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherOptions.IterationCount.get -> int
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherOptions.IterationCount.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordHasherOptions.PasswordHasherOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.PasswordOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireDigit.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireDigit.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequiredLength.get -> int
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequiredLength.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequiredUniqueChars.get -> int
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequiredUniqueChars.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireLowercase.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireLowercase.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireNonAlphanumeric.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireNonAlphanumeric.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireUppercase.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordOptions.RequireUppercase.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordVerificationResult
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordVerificationResult.Failed = 0 -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordVerificationResult.Success = 1 -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-*REMOVED*Microsoft.AspNetCore.Identity.PasswordVerificationResult.SuccessRehashNeeded = 2 -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-*REMOVED*Microsoft.AspNetCore.Identity.PersonalDataAttribute
-*REMOVED*Microsoft.AspNetCore.Identity.PersonalDataAttribute.PersonalDataAttribute() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.PhoneNumberTokenProvider() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.ProtectedPersonalDataAttribute
-*REMOVED*Microsoft.AspNetCore.Identity.ProtectedPersonalDataAttribute.ProtectedPersonalDataAttribute() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.RoleManager<TRole>.Dispose() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.RoleManager<TRole>.ThrowIfDisposed() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.RequireConfirmedAccount.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.RequireConfirmedAccount.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.RequireConfirmedEmail.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.RequireConfirmedEmail.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.RequireConfirmedPhoneNumber.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.RequireConfirmedPhoneNumber.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInOptions.SignInOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.IsLockedOut.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.IsLockedOut.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.IsNotAllowed.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.IsNotAllowed.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.RequiresTwoFactor.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.RequiresTwoFactor.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.SignInResult() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.Succeeded.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.SignInResult.Succeeded.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.StoreOptions
-*REMOVED*Microsoft.AspNetCore.Identity.StoreOptions.MaxLengthForKeys.get -> int
-*REMOVED*Microsoft.AspNetCore.Identity.StoreOptions.MaxLengthForKeys.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.StoreOptions.ProtectPersonalData.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.StoreOptions.ProtectPersonalData.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.StoreOptions.StoreOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.TokenOptions
-*REMOVED*Microsoft.AspNetCore.Identity.TokenOptions.TokenOptions() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.TokenProviderDescriptor
-*REMOVED*Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.TotpSecurityStampBasedTokenProvider() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer
-*REMOVED*Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.UpperInvariantLookupNormalizer() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.UserLoginInfo
-*REMOVED*Microsoft.AspNetCore.Identity.UserManager<TUser>.Dispose() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.UserManager<TUser>.ThrowIfDisposed() -> void
-*REMOVED*Microsoft.AspNetCore.Identity.UserOptions
-*REMOVED*Microsoft.AspNetCore.Identity.UserOptions.RequireUniqueEmail.get -> bool
-*REMOVED*Microsoft.AspNetCore.Identity.UserOptions.RequireUniqueEmail.set -> void
-*REMOVED*Microsoft.AspNetCore.Identity.UserOptions.UserOptions() -> void
-*REMOVED*Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions
-*REMOVED*System.Security.Claims.PrincipalExtensions
-*REMOVED*virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.IsDigit(char c) -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.IsLetterOrDigit(char c) -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.IsLower(char c) -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.IsUpper(char c) -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.CancellationToken.get -> System.Threading.CancellationToken
-*REMOVED*virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Dispose(bool disposing) -> void
-*REMOVED*virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.SupportsQueryableRoles.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.SupportsRoleClaims.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CancellationToken.get -> System.Threading.CancellationToken
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Dispose(bool disposing) -> void
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsQueryableUsers.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserAuthenticationTokens.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserAuthenticatorKey.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserClaim.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserEmail.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserLockout.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserLogin.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserPassword.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserPhoneNumber.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserRole.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserSecurityStamp.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserTwoFactor.get -> bool
-*REMOVED*virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SupportsUserTwoFactorRecoveryCodes.get -> bool
-abstract Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-const Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberTokenPurpose = "ChangePhoneNumber" -> string!
-const Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailTokenPurpose = "EmailConfirmation" -> string!
-const Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordTokenPurpose = "ResetPassword" -> string!
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.get -> string!
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.EmailClaimType.set -> void
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.get -> string!
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.RoleClaimType.set -> void
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.get -> string!
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.SecurityStampClaimType.set -> void
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.get -> string!
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserIdClaimType.set -> void
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.get -> string!
-Microsoft.AspNetCore.Identity.ClaimsIdentityOptions.UserNameClaimType.set -> void
-Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.DefaultPersonalDataProtector(Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing! keyRing, Microsoft.AspNetCore.Identity.ILookupProtector! protector) -> void
-Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type! user, Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
-Microsoft.AspNetCore.Identity.IdentityBuilder.IdentityBuilder(System.Type! user, System.Type! role, Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
-Microsoft.AspNetCore.Identity.IdentityBuilder.RoleType.get -> System.Type?
-Microsoft.AspNetCore.Identity.IdentityBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
-Microsoft.AspNetCore.Identity.IdentityBuilder.UserType.get -> System.Type!
-Microsoft.AspNetCore.Identity.IdentityError.Code.get -> string!
-Microsoft.AspNetCore.Identity.IdentityError.Code.set -> void
-Microsoft.AspNetCore.Identity.IdentityError.Description.get -> string!
-Microsoft.AspNetCore.Identity.IdentityError.Description.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.get -> Microsoft.AspNetCore.Identity.ClaimsIdentityOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.ClaimsIdentity.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.get -> Microsoft.AspNetCore.Identity.LockoutOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.Lockout.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.Password.get -> Microsoft.AspNetCore.Identity.PasswordOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.Password.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.get -> Microsoft.AspNetCore.Identity.SignInOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.SignIn.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.Stores.get -> Microsoft.AspNetCore.Identity.StoreOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.Stores.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.get -> Microsoft.AspNetCore.Identity.TokenOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.Tokens.set -> void
-Microsoft.AspNetCore.Identity.IdentityOptions.User.get -> Microsoft.AspNetCore.Identity.UserOptions!
-Microsoft.AspNetCore.Identity.IdentityOptions.User.set -> void
-Microsoft.AspNetCore.Identity.IdentityResult.Errors.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IdentityError!>!
-Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeEmail(string? email) -> string?
-Microsoft.AspNetCore.Identity.ILookupNormalizer.NormalizeName(string? name) -> string?
-Microsoft.AspNetCore.Identity.ILookupProtector.Protect(string! keyId, string? data) -> string?
-Microsoft.AspNetCore.Identity.ILookupProtector.Unprotect(string! keyId, string? data) -> string?
-Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.CurrentKeyId.get -> string!
-Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.GetAllKeyIds() -> System.Collections.Generic.IEnumerable<string!>!
-Microsoft.AspNetCore.Identity.ILookupProtectorKeyRing.this[string! keyId].get -> string!
-Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.HashPassword(TUser! user, string! password) -> string!
-Microsoft.AspNetCore.Identity.IPasswordHasher<TUser>.VerifyHashedPassword(TUser! user, string! hashedPassword, string! providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user, string? password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IPersonalDataProtector.Protect(string? data) -> string?
-Microsoft.AspNetCore.Identity.IPersonalDataProtector.Unprotect(string? data) -> string?
-Microsoft.AspNetCore.Identity.IQueryableRoleStore<TRole>.Roles.get -> System.Linq.IQueryable<TRole!>!
-Microsoft.AspNetCore.Identity.IQueryableUserStore<TUser>.Users.get -> System.Linq.IQueryable<TUser!>!
-Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.GetClaimsAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-Microsoft.AspNetCore.Identity.IRoleClaimStore<TRole>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.CreateAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.DeleteAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByIdAsync(string! roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.FindByNameAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetNormalizedRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleIdAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string!>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.GetRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetNormalizedRoleNameAsync(TRole! role, string? normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.SetRoleNameAsync(TRole! role, string? roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IRoleStore<TRole>.UpdateAsync(TRole! role, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IRoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole!>! manager, TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.GetTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.RemoveTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserAuthenticationTokenStore<TUser>.SetTokenAsync(TUser! user, string! loginProvider, string! name, string? value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.GetAuthenticatorKeyAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserAuthenticatorKeyStore<TUser>.SetAuthenticatorKeyAsync(TUser! user, string! key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<TUser>.CreateAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal!>!
-Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserClaimStore<TUser>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetEmailConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.GetNormalizedEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailAsync(TUser! user, string? email, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetEmailConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserEmailStore<TUser>.SetNormalizedEmailAsync(TUser! user, string? normalizedEmail, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.GetLockoutEndDateAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.DateTimeOffset?>!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.IncrementAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.ResetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserLockoutStore<TUser>.SetLockoutEndDateAsync(TUser! user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
-Microsoft.AspNetCore.Identity.IUserLoginStore<TUser>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.GetPasswordHashAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.HasPasswordAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser>.SetPasswordHashAsync(TUser! user, string? passwordHash, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.GetPhoneNumberConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberAsync(TUser! user, string? phoneNumber, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserPhoneNumberStore<TUser>.SetPhoneNumberConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.AddToRoleAsync(TUser! user, string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetRolesAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
-Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.GetUsersInRoleAsync(string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.IsInRoleAsync(TUser! user, string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserRoleStore<TUser>.RemoveFromRoleAsync(TUser! user, string! roleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.GetSecurityStampAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserSecurityStampStore<TUser>.SetSecurityStampAsync(TUser! user, string! stamp, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetNormalizedUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserIdAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string!>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.GetUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetNormalizedUserNameAsync(TUser! user, string? normalizedName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.SetUserNameAsync(TUser! user, string? userName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserStore<TUser>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.CountCodesAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
-Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.RedeemCodeAsync(TUser! user, string! code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserTwoFactorRecoveryCodeStore<TUser>.ReplaceCodesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.GetTwoFactorEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserTwoFactorStore<TUser>.SetTwoFactorEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-Microsoft.AspNetCore.Identity.IUserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.PasswordValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber? errors = null) -> void
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.ErrorDescriber.set -> void
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer!
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.KeyNormalizer.set -> void
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleManager(Microsoft.AspNetCore.Identity.IRoleStore<TRole!>! store, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IRoleValidator<TRole!>!>! roleValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.RoleManager<TRole!>!>! logger) -> void
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IRoleValidator<TRole!>!>!
-Microsoft.AspNetCore.Identity.RoleManager<TRole>.Store.get -> Microsoft.AspNetCore.Identity.IRoleStore<TRole!>!
-Microsoft.AspNetCore.Identity.RoleValidator<TRole>.RoleValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber? errors = null) -> void
-Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.get -> string!
-Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorIssuer.set -> void
-Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.get -> string!
-Microsoft.AspNetCore.Identity.TokenOptions.AuthenticatorTokenProvider.set -> void
-Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.get -> string!
-Microsoft.AspNetCore.Identity.TokenOptions.ChangeEmailTokenProvider.set -> void
-Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.get -> string!
-Microsoft.AspNetCore.Identity.TokenOptions.ChangePhoneNumberTokenProvider.set -> void
-Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.get -> string!
-Microsoft.AspNetCore.Identity.TokenOptions.EmailConfirmationTokenProvider.set -> void
-Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.get -> string!
-Microsoft.AspNetCore.Identity.TokenOptions.PasswordResetTokenProvider.set -> void
-Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.get -> System.Collections.Generic.Dictionary<string!, Microsoft.AspNetCore.Identity.TokenProviderDescriptor!>!
-Microsoft.AspNetCore.Identity.TokenOptions.ProviderMap.set -> void
-Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.get -> object?
-Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderInstance.set -> void
-Microsoft.AspNetCore.Identity.TokenProviderDescriptor.ProviderType.get -> System.Type!
-Microsoft.AspNetCore.Identity.TokenProviderDescriptor.TokenProviderDescriptor(System.Type! type) -> void
-Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeEmail(string? email) -> string?
-Microsoft.AspNetCore.Identity.UpperInvariantLookupNormalizer.NormalizeName(string? name) -> string?
-Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.RoleManager.get -> Microsoft.AspNetCore.Identity.RoleManager<TRole!>!
-Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions!
-Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserManager.get -> Microsoft.AspNetCore.Identity.UserManager<TUser!>!
-Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.get -> string!
-Microsoft.AspNetCore.Identity.UserLoginInfo.LoginProvider.set -> void
-Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.get -> string?
-Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderDisplayName.set -> void
-Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.get -> string!
-Microsoft.AspNetCore.Identity.UserLoginInfo.ProviderKey.set -> void
-Microsoft.AspNetCore.Identity.UserLoginInfo.UserLoginInfo(string! loginProvider, string! providerKey, string? displayName) -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.ErrorDescriber.set -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.get -> Microsoft.AspNetCore.Identity.ILookupNormalizer!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.KeyNormalizer.set -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.get -> Microsoft.AspNetCore.Identity.IdentityOptions!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.Options.set -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.get -> Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordHasher.set -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.PasswordValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.get -> Microsoft.AspNetCore.Identity.IUserStore<TUser!>!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.Store.set -> void
-~Microsoft.AspNetCore.Identity.UserManager<TUser>.UserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser!>! store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>! passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>! userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>! passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, System.IServiceProvider! services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser!>!>! logger) -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.UserValidators.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidatePasswordAsync(TUser! user, string? password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.UserManager<TUser>.ValidateUserAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.get -> string!
-Microsoft.AspNetCore.Identity.UserOptions.AllowedUserNameCharacters.set -> void
-Microsoft.AspNetCore.Identity.UserValidator<TUser>.Describer.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.UserValidator<TUser>.UserValidator(Microsoft.AspNetCore.Identity.IdentityErrorDescriber? errors = null) -> void
-override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-override Microsoft.AspNetCore.Identity.EmailTokenProvider<TUser>.GetUserModifierAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-override Microsoft.AspNetCore.Identity.IdentityResult.ToString() -> string!
-override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-override Microsoft.AspNetCore.Identity.PhoneNumberTokenProvider<TUser>.GetUserModifierAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-override Microsoft.AspNetCore.Identity.SignInResult.ToString() -> string!
-override Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.GenerateClaimsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity!>!
-static Microsoft.AspNetCore.Identity.IdentityResult.Failed(params Microsoft.AspNetCore.Identity.IdentityError![]! errors) -> Microsoft.AspNetCore.Identity.IdentityResult!
-static Microsoft.AspNetCore.Identity.IdentityResult.Success.get -> Microsoft.AspNetCore.Identity.IdentityResult!
-static Microsoft.AspNetCore.Identity.SignInResult.Failed.get -> Microsoft.AspNetCore.Identity.SignInResult!
-static Microsoft.AspNetCore.Identity.SignInResult.LockedOut.get -> Microsoft.AspNetCore.Identity.SignInResult!
-static Microsoft.AspNetCore.Identity.SignInResult.NotAllowed.get -> Microsoft.AspNetCore.Identity.SignInResult!
-static Microsoft.AspNetCore.Identity.SignInResult.Success.get -> Microsoft.AspNetCore.Identity.SignInResult!
-static Microsoft.AspNetCore.Identity.SignInResult.TwoFactorRequired.get -> Microsoft.AspNetCore.Identity.SignInResult!
-static Microsoft.AspNetCore.Identity.UserManager<TUser>.GetChangeEmailTokenPurpose(string! newEmail) -> string!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionExtensions.AddIdentityCore<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions!>! setupAction) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultAuthenticatorProvider -> string!
-static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultEmailProvider -> string!
-static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultPhoneProvider -> string!
-static readonly Microsoft.AspNetCore.Identity.TokenOptions.DefaultProvider -> string!
-static System.Security.Claims.PrincipalExtensions.FindFirstValue(this System.Security.Claims.ClaimsPrincipal! principal, string! claimType) -> string?
-virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.CanGenerateTwoFactorTokenAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.AuthenticatorTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Protect(string? data) -> string?
-virtual Microsoft.AspNetCore.Identity.DefaultPersonalDataProtector.Unprotect(string? data) -> string?
-virtual Microsoft.AspNetCore.Identity.DefaultUserConfirmation<TUser>.IsConfirmedAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddClaimsPrincipalFactory<TFactory>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddErrorDescriber<TDescriber>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPasswordValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddPersonalDataProtection<TProtector, TKeyRing>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleManager<TRoleManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoles<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddRoleValidator<TRole>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider(string! providerName, System.Type! provider) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddTokenProvider<TProvider>(string! providerName) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserConfirmation<TUserConfirmation>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserManager<TUserManager>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserStore<TStore>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityBuilder.AddUserValidator<TValidator>() -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.ConcurrencyFailure() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DefaultError() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateEmail(string! email) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateRoleName(string! role) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.DuplicateUserName(string! userName) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidEmail(string? email) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidRoleName(string? role) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidToken() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.InvalidUserName(string? userName) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.LoginAlreadyAssociated() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordMismatch() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresDigit() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresLower() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresNonAlphanumeric() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUniqueChars(int uniqueChars) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordRequiresUpper() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.PasswordTooShort(int length) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.RecoveryCodeRedemptionFailed() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyHasPassword() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserAlreadyInRole(string! role) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserLockoutNotEnabled() -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.IdentityErrorDescriber.UserNotInRole(string! role) -> Microsoft.AspNetCore.Identity.IdentityError!
-virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.HashPassword(TUser! user, string! password) -> string!
-virtual Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.VerifyHashedPassword(TUser! user, string! hashedPassword, string! providedPassword) -> Microsoft.AspNetCore.Identity.PasswordVerificationResult
-virtual Microsoft.AspNetCore.Identity.PasswordValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user, string? password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.CreateAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.DeleteAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByIdAsync(string! roleId) -> System.Threading.Tasks.Task<TRole?>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.FindByNameAsync(string! roleName) -> System.Threading.Tasks.Task<TRole?>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetClaimsAsync(TRole! role) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleIdAsync(TRole! role) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.GetRoleNameAsync(TRole! role) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Logger.set -> void
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.NormalizeKey(string? key) -> string?
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.RoleExistsAsync(string! roleName) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.Roles.get -> System.Linq.IQueryable<TRole!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.SetRoleNameAsync(TRole! role, string? name) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateNormalizedRoleNameAsync(TRole! role) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.UpdateRoleAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleManager<TRole>.ValidateRoleAsync(TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.RoleValidator<TRole>.ValidateAsync(Microsoft.AspNetCore.Identity.RoleManager<TRole!>! manager, TRole! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GenerateAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.GetUserModifierAsync(string! purpose, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.TotpSecurityStampBasedTokenProvider<TUser>.ValidateAsync(string! purpose, string! token, Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.CreateAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsPrincipal!>!
-virtual Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.GenerateClaimsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Security.Claims.ClaimsIdentity!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AccessFailedAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimAsync(TUser! user, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddPasswordAsync(TUser! user, string! password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRoleAsync(TUser! user, string! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.AddToRolesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangeEmailAsync(TUser! user, string! newEmail, string! token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePasswordAsync(TUser! user, string! currentPassword, string! newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ChangePhoneNumberAsync(TUser! user, string! phoneNumber, string! token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CheckPasswordAsync(TUser! user, string! password) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ConfirmEmailAsync(TUser! user, string! token) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CountRecoveryCodesAsync(TUser! user) -> System.Threading.Tasks.Task<int>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateAsync(TUser! user, string! password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateSecurityTokenAsync(TUser! user) -> System.Threading.Tasks.Task<byte[]!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.CreateTwoFactorRecoveryCode() -> string!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.DeleteAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByEmailAsync(string! email) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByIdAsync(string! userId) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByLoginAsync(string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.FindByNameAsync(string! userName) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangeEmailTokenAsync(TUser! user, string! newEmail) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateChangePhoneNumberTokenAsync(TUser! user, string! phoneNumber) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateConcurrencyStampAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateEmailConfirmationTokenAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewAuthenticatorKey() -> string!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateNewTwoFactorRecoveryCodesAsync(TUser! user, int number) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<string!>?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GeneratePasswordResetTokenAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateTwoFactorTokenAsync(TUser! user, string! tokenProvider) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GenerateUserTokenAsync(TUser! user, string! tokenProvider, string! purpose) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAccessFailedCountAsync(TUser! user) -> System.Threading.Tasks.Task<int>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticationTokenAsync(TUser! user, string! loginProvider, string! tokenName) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetAuthenticatorKeyAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetClaimsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetEmailAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEnabledAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLockoutEndDateAsync(TUser! user) -> System.Threading.Tasks.Task<System.DateTimeOffset?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetLoginsAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetPhoneNumberAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetRolesAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetSecurityStampAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetTwoFactorEnabledAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserAsync(System.Security.Claims.ClaimsPrincipal! principal) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserId(System.Security.Claims.ClaimsPrincipal! principal) -> string?
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserIdAsync(TUser! user) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserName(System.Security.Claims.ClaimsPrincipal! principal) -> string?
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUserNameAsync(TUser! user) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetUsersInRoleAsync(string! roleName) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.GetValidTwoFactorProvidersAsync(TUser! user) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.HasPasswordAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsEmailConfirmedAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsInRoleAsync(TUser! user, string! role) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsLockedOutAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.IsPhoneNumberConfirmedAsync(TUser! user) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.get -> Microsoft.Extensions.Logging.ILogger!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Logger.set -> void
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeEmail(string? email) -> string?
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.NormalizeName(string? name) -> string?
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RedeemTwoFactorRecoveryCodeAsync(TUser! user, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RegisterTokenProvider(string! providerName, Microsoft.AspNetCore.Identity.IUserTwoFactorTokenProvider<TUser!>! provider) -> void
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveAuthenticationTokenAsync(TUser! user, string! loginProvider, string! tokenName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimAsync(TUser! user, System.Security.Claims.Claim! claim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRoleAsync(TUser! user, string! role) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveFromRolesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! roles) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.RemovePasswordAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAccessFailedCountAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetAuthenticatorKeyAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.ResetPasswordAsync(TUser! user, string! token, string! newPassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetAuthenticationTokenAsync(TUser! user, string! loginProvider, string! tokenName, string? tokenValue) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetEmailAsync(TUser! user, string? email) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEnabledAsync(TUser! user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetLockoutEndDateAsync(TUser! user, System.DateTimeOffset? lockoutEnd) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetPhoneNumberAsync(TUser! user, string? phoneNumber) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetTwoFactorEnabledAsync(TUser! user, bool enabled) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.SetUserNameAsync(TUser! user, string? userName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedEmailAsync(TUser! user) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateNormalizedUserNameAsync(TUser! user) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdatePasswordHash(TUser! user, string! newPassword, bool validatePassword) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateSecurityStampAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.UpdateUserAsync(TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.Users.get -> System.Linq.IQueryable<TUser!>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyChangePhoneNumberTokenAsync(TUser! user, string! token, string! phoneNumber) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyPasswordAsync(Microsoft.AspNetCore.Identity.IUserPasswordStore<TUser!>! store, TUser! user, string! password) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.PasswordVerificationResult>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyTwoFactorTokenAsync(TUser! user, string! tokenProvider, string! token) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserManager<TUser>.VerifyUserTokenAsync(TUser! user, string! tokenProvider, string! purpose, string! token) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserValidator<TUser>.ValidateAsync(Microsoft.AspNetCore.Identity.UserManager<TUser!>! manager, TUser! user) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions> optionsAccessor = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole> roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor) -> void
-~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions!>? optionsAccessor = null) -> void
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole!>! roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! options) -> void
-~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions> optionsAccessor = null) -> void
-Microsoft.AspNetCore.Identity.PasswordHasher<TUser>.PasswordHasher(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.PasswordHasherOptions!>? optionsAccessor = null) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole> roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> options) -> void
-Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser, TRole>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.AspNetCore.Identity.RoleManager<TRole!>! roleManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser> userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor) -> void
-Microsoft.AspNetCore.Identity.UserClaimsPrincipalFactory<TUser>.UserClaimsPrincipalFactory(Microsoft.AspNetCore.Identity.UserManager<TUser!>! userManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserManager<TUser>.UserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser> store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser> passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser>> userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser>> passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber errors, System.IServiceProvider services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser>> logger) -> void
-Microsoft.AspNetCore.Identity.UserManager<TUser>.UserManager(Microsoft.AspNetCore.Identity.IUserStore<TUser!>! store, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions!>! optionsAccessor, Microsoft.AspNetCore.Identity.IPasswordHasher<TUser!>! passwordHasher, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IUserValidator<TUser!>!>! userValidators, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Identity.IPasswordValidator<TUser!>!>! passwordValidators, Microsoft.AspNetCore.Identity.ILookupNormalizer! keyNormalizer, Microsoft.AspNetCore.Identity.IdentityErrorDescriber! errors, System.IServiceProvider! services, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.UserManager<TUser!>!>! logger) -> void \ No newline at end of file
diff --git a/src/Identity/Extensions.Core/src/UserLoginInfo.cs b/src/Identity/Extensions.Core/src/UserLoginInfo.cs
index 5978866cee..4c030b664f 100644
--- a/src/Identity/Extensions.Core/src/UserLoginInfo.cs
+++ b/src/Identity/Extensions.Core/src/UserLoginInfo.cs
@@ -13,7 +13,7 @@ public class UserLoginInfo
/// </summary>
/// <param name="loginProvider">The provider associated with this login information.</param>
/// <param name="providerKey">The unique identifier for this user provided by the login provider.</param>
- /// <param name="displayName">The display name for this user provided by the login provider.</param>
+ /// <param name="displayName">The display name for the login provider.</param>
public UserLoginInfo(string loginProvider, string providerKey, string? displayName)
{
LoginProvider = loginProvider;
diff --git a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj
index 367a0069f1..d5bd23af79 100644
--- a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj
+++ b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj
@@ -7,12 +7,16 @@
<IsAspNetCoreApp>true</IsAspNetCoreApp>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;identity;membership</PackageTags>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.Extensions.Caching.Abstractions" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="Microsoft.Extensions.Identity.Core" />
+
+ <Compile Include="$(SharedSourceRoot)TrimmingAttributes.cs" LinkBase="Shared"
+ Condition="'$(TargetFramework)' != '$(DefaultNetCoreTargetFramework)'" />
</ItemGroup>
</Project>
diff --git a/src/Identity/Extensions.Stores/src/PublicAPI.Shipped.txt b/src/Identity/Extensions.Stores/src/PublicAPI.Shipped.txt
index 9b39ec41f0..33d7a4a29c 100644
--- a/src/Identity/Extensions.Stores/src/PublicAPI.Shipped.txt
+++ b/src/Identity/Extensions.Stores/src/PublicAPI.Shipped.txt
@@ -1,178 +1,178 @@
#nullable enable
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole>
-~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.IdentityRole.IdentityRole(string roleName) -> void
-~Microsoft.AspNetCore.Identity.IdentityRole<TKey>
-~Microsoft.AspNetCore.Identity.IdentityRole<TKey>.IdentityRole(string roleName) -> void
-~Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>
-~Microsoft.AspNetCore.Identity.IdentityUser.IdentityUser(string userName) -> void
-~Microsoft.AspNetCore.Identity.IdentityUser<TKey>
-~Microsoft.AspNetCore.Identity.IdentityUser<TKey>.IdentityUser(string userName) -> void
-~Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>
-~Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>
-~Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>
-~Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>
-~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>
-~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
-~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RoleStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer) -> void
-~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>
-~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.set -> void
-~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer) -> void
-~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>
-~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer) -> void
-~override Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ToString() -> string
-~override Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ToString() -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim other) -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ToClaim() -> System.Security.Claims.Claim
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim claim) -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ToClaim() -> System.Security.Claims.Claim
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.get -> TKey
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.set -> void
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.get -> string
-~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.set -> void
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string id) -> TKey
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole role, System.Security.Claims.Claim claim) -> TRoleClaim
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole role, string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole role, string roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdFromString(string id) -> TKey
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdToString(TKey id) -> string
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CountCodesAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserClaim(TUser user, System.Security.Claims.Claim claim) -> TUserClaim
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserLogin(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login) -> TUserLogin
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserToken(TUser user, string loginProvider, string name, string value) -> TUserToken
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAuthenticatorKeyAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEndDateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.DateTimeOffset?>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPasswordHashAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetSecurityStampAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTwoFactorEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserIdAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.HasPasswordAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IncrementAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RedeemCodeAsync(TUser user, string code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceCodesAsync(TUser user, System.Collections.Generic.IEnumerable<string> recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ResetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetAuthenticatorKeyAsync(TUser user, string key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailAsync(TUser user, string email, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEndDateAsync(TUser user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedEmailAsync(TUser user, string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedUserNameAsync(TUser user, string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPasswordHashAsync(TUser user, string passwordHash, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberAsync(TUser user, string phoneNumber, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetSecurityStampAsync(TUser user, string stamp, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTokenAsync(TUser user, string loginProvider, string name, string value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTwoFactorEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetUserNameAsync(TUser user, string userName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateUserRole(TUser user, TRole role) -> TUserRole
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string! normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole!>!
+abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole?>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.IdentityRole.IdentityRole(string! roleName) -> void
+Microsoft.AspNetCore.Identity.IdentityRole<TKey>
+Microsoft.AspNetCore.Identity.IdentityRole<TKey>.IdentityRole(string! roleName) -> void
+Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>
+Microsoft.AspNetCore.Identity.IdentityUser.IdentityUser(string! userName) -> void
+Microsoft.AspNetCore.Identity.IdentityUser<TKey>
+Microsoft.AspNetCore.Identity.IdentityUser<TKey>.IdentityUser(string! userName) -> void
+Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>
+Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>
+Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>
+Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>
+Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>
+Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
+Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RoleStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber! describer) -> void
+Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>
+Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
+Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.set -> void
+Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber! describer) -> void
+Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>
+Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber! describer) -> void
+override Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ToString() -> string!
+override Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ToString() -> string!
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim? other) -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ToClaim() -> System.Security.Claims.Claim!
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim! claim) -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ToClaim() -> System.Security.Claims.Claim!
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.get -> string!
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.get -> string!
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.get -> string!
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.get -> string!
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.get -> TKey
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.set -> void
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.get -> string?
+virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.set -> void
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string? id) -> TKey?
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string?
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole! role, System.Security.Claims.Claim! claim) -> TRoleClaim!
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole! role, string? normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole! role, string? roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdFromString(string? id) -> TKey?
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdToString(TKey id) -> string?
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CountCodesAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserClaim(TUser! user, System.Security.Claims.Claim! claim) -> TUserClaim!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserLogin(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login) -> TUserLogin!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserToken(TUser! user, string! loginProvider, string! name, string? value) -> TUserToken!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAuthenticatorKeyAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEndDateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.DateTimeOffset?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPasswordHashAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetSecurityStampAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTwoFactorEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserIdAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string!>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.HasPasswordAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IncrementAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RedeemCodeAsync(TUser! user, string! code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceCodesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ResetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetAuthenticatorKeyAsync(TUser! user, string! key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailAsync(TUser! user, string? email, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEndDateAsync(TUser! user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedEmailAsync(TUser! user, string? normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedUserNameAsync(TUser! user, string? normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPasswordHashAsync(TUser! user, string? passwordHash, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberAsync(TUser! user, string? phoneNumber, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetSecurityStampAsync(TUser! user, string! stamp, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTokenAsync(TUser! user, string! loginProvider, string! name, string? value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTwoFactorEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetUserNameAsync(TUser! user, string? userName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateUserRole(TUser! user, TRole! role) -> TUserRole!
Microsoft.AspNetCore.Identity.IdentityRole
Microsoft.AspNetCore.Identity.IdentityRole.IdentityRole() -> void
Microsoft.AspNetCore.Identity.IdentityRole<TKey>.IdentityRole() -> void
diff --git a/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt b/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt
index 50fcb67a11..7dc5c58110 100644
--- a/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt
+++ b/src/Identity/Extensions.Stores/src/PublicAPI.Unshipped.txt
@@ -1,346 +1 @@
#nullable enable
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole role, System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim>>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim> claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser user, string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken token) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser user, System.Security.Claims.Claim claim, System.Security.Claims.Claim newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string>>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser>>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser user, string normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityRole.IdentityRole(string roleName) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityRole<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityRole<TKey>.IdentityRole(string roleName) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUser.IdentityUser(string userName) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUser<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUser<TKey>.IdentityUser(string userName) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RoleStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber
-*REMOVED*~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>
-*REMOVED*~Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber describer) -> void
-*REMOVED*~override Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ToString() -> string
-*REMOVED*~override Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ToString() -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim other) -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ToClaim() -> System.Security.Claims.Claim
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim claim) -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ToClaim() -> System.Security.Claims.Claim
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.get -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.get -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.set -> void
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string id) -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole role, System.Security.Claims.Claim claim) -> TRoleClaim
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole role, string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole role, string roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdFromString(string id) -> TKey
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdToString(TKey id) -> string
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CountCodesAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserClaim(TUser user, System.Security.Claims.Claim claim) -> TUserClaim
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserLogin(TUser user, Microsoft.AspNetCore.Identity.UserLoginInfo login) -> TUserLogin
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserToken(TUser user, string loginProvider, string name, string value) -> TUserToken
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string loginProvider, string providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAuthenticatorKeyAsync(TUser user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEndDateAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.DateTimeOffset?>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedEmailAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPasswordHashAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberConfirmedAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetSecurityStampAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTwoFactorEnabledAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserIdAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserNameAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.HasPasswordAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IncrementAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RedeemCodeAsync(TUser user, string code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveTokenAsync(TUser user, string loginProvider, string name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceCodesAsync(TUser user, System.Collections.Generic.IEnumerable<string> recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ResetAccessFailedCountAsync(TUser user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetAuthenticatorKeyAsync(TUser user, string key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailAsync(TUser user, string email, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEndDateAsync(TUser user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedEmailAsync(TUser user, string normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedUserNameAsync(TUser user, string normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPasswordHashAsync(TUser user, string passwordHash, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberAsync(TUser user, string phoneNumber, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberConfirmedAsync(TUser user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetSecurityStampAsync(TUser user, string stamp, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTokenAsync(TUser user, string loginProvider, string name, string value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTwoFactorEnabledAsync(TUser user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetUserNameAsync(TUser user, string userName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateUserRole(TUser user, TRole role) -> TUserRole
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.AddClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.DeleteAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByIdAsync(string! id, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.FindByNameAsync(string! normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TRole?>!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetClaimsAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RemoveClaimAsync(TRole! role, System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.Roles.get -> System.Linq.IQueryable<TRole!>!
-abstract Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.UpdateAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddLoginAsync(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.AddUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.DeleteAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByEmailAsync(string! normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByIdAsync(string! userId, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByNameAsync(string! normalizedUserName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserToken?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserAsync(TKey userId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUser?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindUserLoginAsync(TKey userId, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserLogin?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetClaimsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<System.Security.Claims.Claim!>!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLoginsAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUsersForClaimAsync(System.Security.Claims.Claim! claim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveClaimsAsync(TUser! user, System.Collections.Generic.IEnumerable<System.Security.Claims.Claim!>! claims, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveLoginAsync(TUser! user, string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveUserTokenAsync(TUserToken! token) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceClaimAsync(TUser! user, System.Security.Claims.Claim! claim, System.Security.Claims.Claim! newClaim, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UpdateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Identity.IdentityResult!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.Users.get -> System.Linq.IQueryable<TUser!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.AddToRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TRole?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.FindUserRoleAsync(TKey userId, TKey roleId, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<TUserRole?>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetRolesAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<string!>!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.GetUsersInRoleAsync(string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.Collections.Generic.IList<TUser!>!>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.IsInRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-abstract Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.RemoveFromRoleAsync(TUser! user, string! normalizedRoleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.IdentityRole.IdentityRole(string! roleName) -> void
-Microsoft.AspNetCore.Identity.IdentityRole<TKey>
-Microsoft.AspNetCore.Identity.IdentityRole<TKey>.IdentityRole(string! roleName) -> void
-Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>
-Microsoft.AspNetCore.Identity.IdentityUser.IdentityUser(string! userName) -> void
-Microsoft.AspNetCore.Identity.IdentityUser<TKey>
-Microsoft.AspNetCore.Identity.IdentityUser<TKey>.IdentityUser(string! userName) -> void
-Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>
-Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>
-Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>
-Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>
-Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ErrorDescriber.set -> void
-Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.RoleStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber! describer) -> void
-Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.get -> Microsoft.AspNetCore.Identity.IdentityErrorDescriber!
-Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ErrorDescriber.set -> void
-Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber! describer) -> void
-Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.UserStoreBase(Microsoft.AspNetCore.Identity.IdentityErrorDescriber! describer) -> void
-override Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ToString() -> string!
-override Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ToString() -> string!
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.ConcurrencyStamp.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Id.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.Name.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityRole<TKey>.NormalizedName.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimType.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ClaimValue.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim? other) -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.RoleId.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityRoleClaim<TKey>.ToClaim() -> System.Security.Claims.Claim!
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.ConcurrencyStamp.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Email.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.Id.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedEmail.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.NormalizedUserName.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PasswordHash.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.PhoneNumber.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.SecurityStamp.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUser<TKey>.UserName.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimType.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ClaimValue.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.InitializeFromClaim(System.Security.Claims.Claim! claim) -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.ToClaim() -> System.Security.Claims.Claim!
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityUserClaim<TKey>.UserId.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.get -> string!
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.LoginProvider.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderDisplayName.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.get -> string!
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.ProviderKey.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityUserLogin<TKey>.UserId.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.RoleId.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityUserRole<TKey>.UserId.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.get -> string!
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.LoginProvider.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.get -> string!
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Name.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.get -> TKey
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.UserId.set -> void
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.get -> string?
-virtual Microsoft.AspNetCore.Identity.IdentityUserToken<TKey>.Value.set -> void
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdFromString(string? id) -> TKey?
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.ConvertIdToString(TKey id) -> string?
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.CreateRoleClaim(TRole! role, System.Security.Claims.Claim! claim) -> TRoleClaim!
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetNormalizedRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleIdAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.GetRoleNameAsync(TRole! role, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetNormalizedRoleNameAsync(TRole! role, string? normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim>.SetRoleNameAsync(TRole! role, string? roleName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdFromString(string? id) -> TKey?
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ConvertIdToString(TKey id) -> string?
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CountCodesAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<int>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserClaim(TUser! user, System.Security.Claims.Claim! claim) -> TUserClaim!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserLogin(TUser! user, Microsoft.AspNetCore.Identity.UserLoginInfo! login) -> TUserLogin!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.CreateUserToken(TUser! user, string! loginProvider, string! name, string? value) -> TUserToken!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.FindByLoginAsync(string! loginProvider, string! providerKey, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<TUser?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetAuthenticatorKeyAsync(TUser! user, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetEmailConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetLockoutEndDateAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<System.DateTimeOffset?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedEmailAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetNormalizedUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPasswordHashAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetPhoneNumberConfirmedAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetSecurityStampAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetTwoFactorEnabledAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserIdAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string!>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.GetUserNameAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<string?>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.HasPasswordAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.IncrementAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<int>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RedeemCodeAsync(TUser! user, string! code, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<bool>!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.RemoveTokenAsync(TUser! user, string! loginProvider, string! name, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ReplaceCodesAsync(TUser! user, System.Collections.Generic.IEnumerable<string!>! recoveryCodes, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.ResetAccessFailedCountAsync(TUser! user, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetAuthenticatorKeyAsync(TUser! user, string! key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailAsync(TUser! user, string? email, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetEmailConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetLockoutEndDateAsync(TUser! user, System.DateTimeOffset? lockoutEnd, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedEmailAsync(TUser! user, string? normalizedEmail, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetNormalizedUserNameAsync(TUser! user, string? normalizedName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPasswordHashAsync(TUser! user, string? passwordHash, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberAsync(TUser! user, string? phoneNumber, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetPhoneNumberConfirmedAsync(TUser! user, bool confirmed, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetSecurityStampAsync(TUser! user, string! stamp, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTokenAsync(TUser! user, string! loginProvider, string! name, string? value, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetTwoFactorEnabledAsync(TUser! user, bool enabled, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>.SetUserNameAsync(TUser! user, string? userName, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim>.CreateUserRole(TUser! user, TRole! role) -> TUserRole!
diff --git a/src/Identity/Extensions.Stores/src/RoleStoreBase.cs b/src/Identity/Extensions.Stores/src/RoleStoreBase.cs
index d80e61d020..59c0f3176b 100644
--- a/src/Identity/Extensions.Stores/src/RoleStoreBase.cs
+++ b/src/Identity/Extensions.Stores/src/RoleStoreBase.cs
@@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.Identity;
/// <typeparam name="TKey">The type of the primary key for a role.</typeparam>
/// <typeparam name="TUserRole">The type of the class representing a user role.</typeparam>
/// <typeparam name="TRoleClaim">The type of the class representing a role claim.</typeparam>
-public abstract class RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim> :
+public abstract class RoleStoreBase<TRole, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TKey, TUserRole, TRoleClaim> :
IQueryableRoleStore<TRole>,
IRoleClaimStore<TRole>
where TRole : IdentityRole<TKey>
@@ -130,6 +130,8 @@ public abstract class RoleStoreBase<TRole, TKey, TUserRole, TRoleClaim> :
/// </summary>
/// <param name="id">The id to convert.</param>
/// <returns>An instance of <typeparamref name="TKey"/> representing the provided <paramref name="id"/>.</returns>
+ [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code",
+ Justification = "TKey is annoated with RequiresUnreferencedCodeAttribute.All.")]
public virtual TKey? ConvertIdFromString(string? id)
{
if (id == null)
diff --git a/src/Identity/Extensions.Stores/src/UserStoreBase.cs b/src/Identity/Extensions.Stores/src/UserStoreBase.cs
index 1277ee06bb..7eb2173358 100644
--- a/src/Identity/Extensions.Stores/src/UserStoreBase.cs
+++ b/src/Identity/Extensions.Stores/src/UserStoreBase.cs
@@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Identity;
/// <typeparam name="TUserClaim">The type representing a claim.</typeparam>
/// <typeparam name="TUserLogin">The type representing a user external login.</typeparam>
/// <typeparam name="TUserToken">The type representing a user token.</typeparam>
-public abstract class UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken> :
+public abstract class UserStoreBase<TUser, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TKey, TUserClaim, TUserLogin, TUserToken> :
IUserLoginStore<TUser>,
IUserClaimStore<TUser>,
IUserPasswordStore<TUser>,
@@ -237,6 +237,8 @@ public abstract class UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserTo
/// </summary>
/// <param name="id">The id to convert.</param>
/// <returns>An instance of <typeparamref name="TKey"/> representing the provided <paramref name="id"/>.</returns>
+ [UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code",
+ Justification = "TKey is annoated with RequiresUnreferencedCodeAttribute.All.")]
public virtual TKey? ConvertIdFromString(string? id)
{
if (id == null)
@@ -1085,7 +1087,7 @@ public abstract class UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserTo
/// <typeparam name="TUserLogin">The type representing a user external login.</typeparam>
/// <typeparam name="TUserToken">The type representing a user token.</typeparam>
/// <typeparam name="TRoleClaim">The type representing a role claim.</typeparam>
-public abstract class UserStoreBase<TUser, TRole, TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim> :
+public abstract class UserStoreBase<TUser, TRole, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] TKey, TUserClaim, TUserRole, TUserLogin, TUserToken, TRoleClaim> :
UserStoreBase<TUser, TKey, TUserClaim, TUserLogin, TUserToken>,
IUserRoleStore<TUser>
where TUser : IdentityUser<TKey>
diff --git a/src/Identity/README.md b/src/Identity/README.md
index af53decdb9..08fbb3a5d6 100644
--- a/src/Identity/README.md
+++ b/src/Identity/README.md
@@ -40,7 +40,10 @@ The previous versions of Identity for MVC5 and lower, previously available on Co
**IMPORTANT:** Extensions are built by a variety of sources and not maintained as part of the ASP.NET Identity project. When considering a third party provider, be sure to evaluate quality, licensing, compatibility, support, etc. to ensure they meet your requirements.
* [ASP.NET Identity Azure Table Storage Provider](https://dlmelendez.github.io/identityazuretable/)
-* [ASP.NET Identity CosmosDB SQL Provider](https://github.com/dlmelendez/identitycosmosdb)
+* ASP.NET Identity Cosmos DB Providers:
+ * [By Dave Melendez](https://github.com/dlmelendez/identitycosmosdb)
+ * [By Eric Kauffman](https://github.com/CosmosSoftware/AspNetCore.Identity.CosmosDb)
+ * [By Piero De Tomi](https://github.com/pierodetomi/efcore-identity-cosmos)
* ASP.NET Identity MongoDB Providers:
* [By Tugberk Ugurlu](https://github.com/tugberkugurlu/AspNetCore.Identity.MongoDB)
* [By Alexandre Spieser](https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore)
diff --git a/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs b/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs
index 3188b5d792..d426f18aee 100644
--- a/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs
+++ b/src/Identity/Specification.Tests/src/IdentitySpecificationTestBase.cs
@@ -135,7 +135,7 @@ public abstract class IdentitySpecificationTestBase<TUser, TRole, TKey> : UserMa
Assert.True(await manager.RoleExistsAsync(roleName));
}
- private class AlwaysBadValidator : IUserValidator<TUser>, IRoleValidator<TRole>,
+ private sealed class AlwaysBadValidator : IUserValidator<TUser>, IRoleValidator<TRole>,
IPasswordValidator<TUser>
{
public static readonly IdentityError ErrorMessage = new IdentityError { Description = "I'm Bad.", Code = "BadValidator" };
diff --git a/src/Identity/Specification.Tests/src/UserManagerSpecificationTests.cs b/src/Identity/Specification.Tests/src/UserManagerSpecificationTests.cs
index 5a66131e4a..317f6ee93b 100644
--- a/src/Identity/Specification.Tests/src/UserManagerSpecificationTests.cs
+++ b/src/Identity/Specification.Tests/src/UserManagerSpecificationTests.cs
@@ -137,7 +137,7 @@ public abstract class UserManagerSpecificationTestBase<TUser, TKey>
/// <returns>The query to use.</returns>
protected abstract Expression<Func<TUser, bool>> UserNameStartsWithPredicate(string userName);
- private class AlwaysBadValidator : IUserValidator<TUser>,
+ private sealed class AlwaysBadValidator : IUserValidator<TUser>,
IPasswordValidator<TUser>
{
public static readonly IdentityError ErrorMessage = new IdentityError { Description = "I'm Bad.", Code = "BadValidator" };
@@ -153,7 +153,7 @@ public abstract class UserManagerSpecificationTestBase<TUser, TKey>
}
}
- private class EmptyBadValidator : IUserValidator<TUser>,
+ private sealed class EmptyBadValidator : IUserValidator<TUser>,
IPasswordValidator<TUser>
{
public Task<IdentityResult> ValidateAsync(UserManager<TUser> manager, TUser user, string password)
@@ -956,7 +956,7 @@ public abstract class UserManagerSpecificationTestBase<TUser, TKey>
Assert.False(await manager.IsEmailConfirmedAsync(user));
}
- private class StaticTokenProvider : IUserTwoFactorTokenProvider<TUser>
+ private sealed class StaticTokenProvider : IUserTwoFactorTokenProvider<TUser>
{
public async Task<string> GenerateAsync(string purpose, UserManager<TUser> manager, TUser user)
{
@@ -1410,7 +1410,7 @@ public abstract class UserManagerSpecificationTestBase<TUser, TKey>
Assert.Equal(stamp, await manager.GetSecurityStampAsync(user));
}
- private class YesPhoneNumberProvider : IUserTwoFactorTokenProvider<TUser>
+ private sealed class YesPhoneNumberProvider : IUserTwoFactorTokenProvider<TUser>
{
public Task<bool> CanGenerateTwoFactorTokenAsync(UserManager<TUser> manager, TUser user)
=> Task.FromResult(true);
diff --git a/src/Identity/UI/src/Areas/Identity/Filters/ExternalLoginsPageFilter.cs b/src/Identity/UI/src/Areas/Identity/Filters/ExternalLoginsPageFilter.cs
index 1f4b166f9b..587a9b13d2 100644
--- a/src/Identity/UI/src/Areas/Identity/Filters/ExternalLoginsPageFilter.cs
+++ b/src/Identity/UI/src/Areas/Identity/Filters/ExternalLoginsPageFilter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Identity.UI.Areas.Identity.Filters;
-internal class ExternalLoginsPageFilter<TUser> : IAsyncPageFilter where TUser : class
+internal sealed class ExternalLoginsPageFilter<TUser> : IAsyncPageFilter where TUser : class
{
public async Task OnPageHandlerExecutionAsync(PageHandlerExecutingContext context, PageHandlerExecutionDelegate next)
{
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmail.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmail.cshtml.cs
index ce573a216b..34fefb7a2f 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmail.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmail.cshtml.cs
@@ -31,7 +31,7 @@ public abstract class ConfirmEmailModel : PageModel
public virtual Task<IActionResult> OnGetAsync(string userId, string code) => throw new NotImplementedException();
}
-internal class ConfirmEmailModel<TUser> : ConfirmEmailModel where TUser : class
+internal sealed class ConfirmEmailModel<TUser> : ConfirmEmailModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmailChange.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmailChange.cshtml.cs
index 488f48272a..a1995d4e99 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmailChange.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ConfirmEmailChange.cshtml.cs
@@ -31,7 +31,7 @@ public abstract class ConfirmEmailChangeModel : PageModel
public virtual Task<IActionResult> OnGetAsync(string userId, string email, string code) => throw new NotImplementedException();
}
-internal class ConfirmEmailChangeModel<TUser> : ConfirmEmailChangeModel where TUser : class
+internal sealed class ConfirmEmailChangeModel<TUser> : ConfirmEmailChangeModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ExternalLogin.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ExternalLogin.cshtml.cs
index b6bd1c69a6..ff281c6ad8 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ExternalLogin.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ExternalLogin.cshtml.cs
@@ -88,7 +88,7 @@ public class ExternalLoginModel : PageModel
public virtual Task<IActionResult> OnPostConfirmationAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class ExternalLoginModel<TUser> : ExternalLoginModel where TUser : class
+internal sealed class ExternalLoginModel<TUser> : ExternalLoginModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ForgotPassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ForgotPassword.cshtml.cs
index 2fdfba06e7..2a30467aa4 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ForgotPassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ForgotPassword.cshtml.cs
@@ -49,7 +49,7 @@ public abstract class ForgotPasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ForgotPasswordModel<TUser> : ForgotPasswordModel where TUser : class
+internal sealed class ForgotPasswordModel<TUser> : ForgotPasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly IEmailSender _emailSender;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Login.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Login.cshtml.cs
index 1fe85b2175..c2c30f5786 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Login.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Login.cshtml.cs
@@ -88,7 +88,7 @@ public abstract class LoginModel : PageModel
public virtual Task<IActionResult> OnPostAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LoginModel<TUser> : LoginModel where TUser : class
+internal sealed class LoginModel<TUser> : LoginModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly ILogger<LoginModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWith2fa.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWith2fa.cshtml.cs
index 8f8fa6fb47..c6e0194ed7 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWith2fa.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWith2fa.cshtml.cs
@@ -73,7 +73,7 @@ public abstract class LoginWith2faModel : PageModel
public virtual Task<IActionResult> OnPostAsync(bool rememberMe, string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LoginWith2faModel<TUser> : LoginWith2faModel where TUser : class
+internal sealed class LoginWith2faModel<TUser> : LoginWith2faModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWithRecoveryCode.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWithRecoveryCode.cshtml.cs
index aacb8b4d65..71e88c31f3 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWithRecoveryCode.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/LoginWithRecoveryCode.cshtml.cs
@@ -60,7 +60,7 @@ public abstract class LoginWithRecoveryCodeModel : PageModel
public virtual Task<IActionResult> OnPostAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LoginWithRecoveryCodeModel<TUser> : LoginWithRecoveryCodeModel where TUser : class
+internal sealed class LoginWithRecoveryCodeModel<TUser> : LoginWithRecoveryCodeModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Logout.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Logout.cshtml.cs
index 2a1c5269c4..574f85da5f 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Logout.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Logout.cshtml.cs
@@ -31,7 +31,7 @@ public abstract class LogoutModel : PageModel
public virtual Task<IActionResult> OnPost(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LogoutModel<TUser> : LogoutModel where TUser : class
+internal sealed class LogoutModel<TUser> : LogoutModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ChangePassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ChangePassword.cshtml.cs
index b57d1cd9c6..82c53d53b6 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ChangePassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ChangePassword.cshtml.cs
@@ -77,7 +77,7 @@ public abstract class ChangePasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ChangePasswordModel<TUser> : ChangePasswordModel where TUser : class
+internal sealed class ChangePasswordModel<TUser> : ChangePasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DeletePersonalData.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DeletePersonalData.cshtml.cs
index 5acf27ea47..8d031bb960 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DeletePersonalData.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DeletePersonalData.cshtml.cs
@@ -56,7 +56,7 @@ public abstract class DeletePersonalDataModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class DeletePersonalDataModel<TUser> : DeletePersonalDataModel where TUser : class
+internal sealed class DeletePersonalDataModel<TUser> : DeletePersonalDataModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Disable2fa.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Disable2fa.cshtml.cs
index 80446e5959..560990d546 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Disable2fa.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Disable2fa.cshtml.cs
@@ -34,7 +34,7 @@ public abstract class Disable2faModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class Disable2faModel<TUser> : Disable2faModel where TUser : class
+internal sealed class Disable2faModel<TUser> : Disable2faModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<Disable2faModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DownloadPersonalData.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DownloadPersonalData.cshtml.cs
index 180eeb1f1f..c0454587e9 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DownloadPersonalData.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/DownloadPersonalData.cshtml.cs
@@ -29,7 +29,7 @@ public abstract class DownloadPersonalDataModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class DownloadPersonalDataModel<TUser> : DownloadPersonalDataModel where TUser : class
+internal sealed class DownloadPersonalDataModel<TUser> : DownloadPersonalDataModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<DownloadPersonalDataModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Email.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Email.cshtml.cs
index 5c0f2baed8..d061d219c4 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Email.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Email.cshtml.cs
@@ -79,7 +79,7 @@ public abstract class EmailModel : PageModel
public virtual Task<IActionResult> OnPostSendVerificationEmailAsync() => throw new NotImplementedException();
}
-internal class EmailModel<TUser> : EmailModel where TUser : class
+internal sealed class EmailModel<TUser> : EmailModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/EnableAuthenticator.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/EnableAuthenticator.cshtml.cs
index 3eeb30595c..0e4cb980f1 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/EnableAuthenticator.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/EnableAuthenticator.cshtml.cs
@@ -82,7 +82,7 @@ public class EnableAuthenticatorModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class EnableAuthenticatorModel<TUser> : EnableAuthenticatorModel where TUser : class
+internal sealed class EnableAuthenticatorModel<TUser> : EnableAuthenticatorModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<EnableAuthenticatorModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ExternalLogins.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ExternalLogins.cshtml.cs
index bd2915ecac..403dc1bafb 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ExternalLogins.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ExternalLogins.cshtml.cs
@@ -65,7 +65,7 @@ public abstract class ExternalLoginsModel : PageModel
public virtual Task<IActionResult> OnGetLinkLoginCallbackAsync() => throw new NotImplementedException();
}
-internal class ExternalLoginsModel<TUser> : ExternalLoginsModel where TUser : class
+internal sealed class ExternalLoginsModel<TUser> : ExternalLoginsModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/GenerateRecoveryCodes.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/GenerateRecoveryCodes.cshtml.cs
index 35f73f45d7..0e1349821b 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/GenerateRecoveryCodes.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/GenerateRecoveryCodes.cshtml.cs
@@ -42,7 +42,7 @@ public abstract class GenerateRecoveryCodesModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class GenerateRecoveryCodesModel<TUser> : GenerateRecoveryCodesModel where TUser : class
+internal sealed class GenerateRecoveryCodesModel<TUser> : GenerateRecoveryCodesModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<GenerateRecoveryCodesModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Index.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Index.cshtml.cs
index eea0b12945..3d77bb9ee7 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Index.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/Index.cshtml.cs
@@ -62,7 +62,7 @@ public abstract class IndexModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class IndexModel<TUser> : IndexModel where TUser : class
+internal sealed class IndexModel<TUser> : IndexModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml
index 0d9e75cf80..4de320cd75 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml
@@ -17,7 +17,7 @@
<button class="btn btn-primary" type="submit">Download</button>
</form>
<p>
- <a id="delete" asp-page="DeletePersonalData" class="btn btn-secondary">Delete</a>
+ <a id="delete" role="button" asp-page="DeletePersonalData" class="btn btn-secondary">Delete</a>
</p>
</div>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml.cs
index f4ef5c8765..b14076b63d 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/PersonalData.cshtml.cs
@@ -21,7 +21,7 @@ public abstract class PersonalDataModel : PageModel
public virtual Task<IActionResult> OnGet() => throw new NotImplementedException();
}
-internal class PersonalDataModel<TUser> : PersonalDataModel where TUser : class
+internal sealed class PersonalDataModel<TUser> : PersonalDataModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<PersonalDataModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ResetAuthenticator.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ResetAuthenticator.cshtml.cs
index 9883edc98e..59278428bc 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ResetAuthenticator.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/ResetAuthenticator.cshtml.cs
@@ -34,7 +34,7 @@ public abstract class ResetAuthenticatorModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ResetAuthenticatorModel<TUser> : ResetAuthenticatorModel where TUser : class
+internal sealed class ResetAuthenticatorModel<TUser> : ResetAuthenticatorModel where TUser : class
{
readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/SetPassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/SetPassword.cshtml.cs
index 51f521f09a..d55a0cd9c6 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/SetPassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/SetPassword.cshtml.cs
@@ -67,7 +67,7 @@ public abstract class SetPasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class SetPasswordModel<TUser> : SetPasswordModel where TUser : class
+internal sealed class SetPasswordModel<TUser> : SetPasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/TwoFactorAuthentication.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/TwoFactorAuthentication.cshtml.cs
index b42adeb8b6..7d317923d5 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/TwoFactorAuthentication.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Manage/TwoFactorAuthentication.cshtml.cs
@@ -59,7 +59,7 @@ public abstract class TwoFactorAuthenticationModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class TwoFactorAuthenticationModel<TUser> : TwoFactorAuthenticationModel where TUser : class
+internal sealed class TwoFactorAuthenticationModel<TUser> : TwoFactorAuthenticationModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs
index e7dea1a6dd..a5372b979e 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/Register.cshtml.cs
@@ -90,7 +90,7 @@ public abstract class RegisterModel : PageModel
public virtual Task<IActionResult> OnPostAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class RegisterModel<TUser> : RegisterModel where TUser : class
+internal sealed class RegisterModel<TUser> : RegisterModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs
index ae3eb4a40b..f2b5236a62 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/RegisterConfirmation.cshtml.cs
@@ -43,7 +43,7 @@ public class RegisterConfirmationModel : PageModel
public virtual Task<IActionResult> OnGetAsync(string email, string? returnUrl = null) => throw new NotImplementedException();
}
-internal class RegisterConfirmationModel<TUser> : RegisterConfirmationModel where TUser : class
+internal sealed class RegisterConfirmationModel<TUser> : RegisterConfirmationModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly IEmailSender _sender;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResendEmailConfirmation.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResendEmailConfirmation.cshtml.cs
index 16020f3cf0..f6e3893fbc 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResendEmailConfirmation.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResendEmailConfirmation.cshtml.cs
@@ -55,7 +55,7 @@ public class ResendEmailConfirmationModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ResendEmailConfirmationModel<TUser> : ResendEmailConfirmationModel where TUser : class
+internal sealed class ResendEmailConfirmationModel<TUser> : ResendEmailConfirmationModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly IEmailSender _emailSender;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResetPassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResetPassword.cshtml.cs
index 2dde488f31..255ee2d80c 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResetPassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/Account/ResetPassword.cshtml.cs
@@ -78,7 +78,7 @@ public abstract class ResetPasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ResetPasswordModel<TUser> : ResetPasswordModel where TUser : class
+internal sealed class ResetPasswordModel<TUser> : ResetPasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml
index ca54b43f37..b03be81b08 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/_Layout.cshtml
@@ -74,11 +74,11 @@
<script src="~/Identity/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"
asp-fallback-src="~/Identity/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"
asp-fallback-src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V4/_ValidationScriptsPartial.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V4/_ValidationScriptsPartial.cshtml
index 74ca362665..a49314c56e 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V4/_ValidationScriptsPartial.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V4/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha256-F6h55Qw6sweK+t7SiOJX+2bpSAa3b/fnlrVCJvmEj1A=">
</script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/Identity/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha256-9GycpJnliUjJDVDqP0UEu/bsm9U+3dnQUH8+3W10vkY=">
+ integrity="sha384-DU2a51mTHKDhpXhTyJQ++hP8L9L8Gc48TlvbzBmUof71V7kNVs4ELmaVJKPxcAGn">
</script>
</environment>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmail.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmail.cshtml.cs
index 5388edfafe..74b8a3a950 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmail.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmail.cshtml.cs
@@ -31,7 +31,7 @@ public abstract class ConfirmEmailModel : PageModel
public virtual Task<IActionResult> OnGetAsync(string userId, string code) => throw new NotImplementedException();
}
-internal class ConfirmEmailModel<TUser> : ConfirmEmailModel where TUser : class
+internal sealed class ConfirmEmailModel<TUser> : ConfirmEmailModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmailChange.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmailChange.cshtml.cs
index e5477f0baa..ee0ed3991a 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmailChange.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ConfirmEmailChange.cshtml.cs
@@ -31,7 +31,7 @@ public abstract class ConfirmEmailChangeModel : PageModel
public virtual Task<IActionResult> OnGetAsync(string userId, string email, string code) => throw new NotImplementedException();
}
-internal class ConfirmEmailChangeModel<TUser> : ConfirmEmailChangeModel where TUser : class
+internal sealed class ConfirmEmailChangeModel<TUser> : ConfirmEmailChangeModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml
index eb838fc767..71c9fa2b66 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml
@@ -1,4 +1,4 @@
-@page
+@page
@model ExternalLoginModel
@{
ViewData["Title"] = "Register";
@@ -18,8 +18,8 @@
<div class="col-md-4">
<form asp-page-handler="Confirmation" asp-route-returnUrl="@Model.ReturnUrl" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.Email" class="form-control" autocomplete="email" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Email" class="form-control" autocomplete="email" placeholder="Please enter your email."/>
<label asp-for="Input.Email" class="form-label"></label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml.cs
index 396a9c5e43..7b726c56ec 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ExternalLogin.cshtml.cs
@@ -88,7 +88,7 @@ public class ExternalLoginModel : PageModel
public virtual Task<IActionResult> OnPostConfirmationAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class ExternalLoginModel<TUser> : ExternalLoginModel where TUser : class
+internal sealed class ExternalLoginModel<TUser> : ExternalLoginModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml
index 704576801c..106b8d1221 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml
@@ -11,8 +11,8 @@
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<label asp-for="Input.Email" class="form-label"></label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml.cs
index 4f7e9bbe89..ec8dc6fed9 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ForgotPassword.cshtml.cs
@@ -49,7 +49,7 @@ public abstract class ForgotPasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ForgotPasswordModel<TUser> : ForgotPasswordModel where TUser : class
+internal sealed class ForgotPasswordModel<TUser> : ForgotPasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly IEmailSender _emailSender;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml
index 6aadfbdf01..6354164a81 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml
@@ -13,23 +13,21 @@
<h2>Use a local account to log in.</h2>
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
- <label asp-for="Input.Email" class="form-label"></label>
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
+ <label asp-for="Input.Email" class="form-label">Email</label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" />
- <label asp-for="Input.Password" class="form-label"></label>
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="password" />
+ <label asp-for="Input.Password" class="form-label">Password</label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
- <div>
- <div class="checkbox">
- <label asp-for="Input.RememberMe" class="form-label">
- <input class="form-check-input" asp-for="Input.RememberMe" />
- @Html.DisplayNameFor(m => m.Input.RememberMe)
- </label>
- </div>
+ <div class="checkbox mb-3">
+ <label asp-for="Input.RememberMe" class="form-label">
+ <input class="form-check-input" asp-for="Input.RememberMe" />
+ @Html.DisplayNameFor(m => m.Input.RememberMe)
+ </label>
</div>
<div>
<button id="login-submit" type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml.cs
index 777cc72920..a19d4057f4 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Login.cshtml.cs
@@ -88,7 +88,7 @@ public abstract class LoginModel : PageModel
public virtual Task<IActionResult> OnPostAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LoginModel<TUser> : LoginModel where TUser : class
+internal sealed class LoginModel<TUser> : LoginModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly ILogger<LoginModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml
index f117a6b4e4..047462d71b 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml
@@ -1,4 +1,4 @@
-@page
+@page
@model LoginWith2faModel
@{
ViewData["Title"] = "Two-factor authentication";
@@ -12,18 +12,16 @@
<form method="post" asp-route-returnUrl="@Model.ReturnUrl">
<input asp-for="RememberMe" type="hidden" />
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
+ <div class="form-floating mb-3">
<input asp-for="Input.TwoFactorCode" class="form-control" autocomplete="off" />
<label asp-for="Input.TwoFactorCode" class="form-label"></label>
<span asp-validation-for="Input.TwoFactorCode" class="text-danger"></span>
</div>
- <div>
- <div class="checkbox">
- <label asp-for="Input.RememberMachine" class="form-label">
- <input asp-for="Input.RememberMachine" />
- @Html.DisplayNameFor(m => m.Input.RememberMachine)
- </label>
- </div>
+ <div class="checkbox mb-3">
+ <label asp-for="Input.RememberMachine" class="form-label">
+ <input asp-for="Input.RememberMachine" />
+ @Html.DisplayNameFor(m => m.Input.RememberMachine)
+ </label>
</div>
<div>
<button type="submit" class="w-100 btn btn-lg btn-primary">Log in</button>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml.cs
index fbba0f8fbd..9bd8f9597e 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWith2fa.cshtml.cs
@@ -73,7 +73,7 @@ public abstract class LoginWith2faModel : PageModel
public virtual Task<IActionResult> OnPostAsync(bool rememberMe, string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LoginWith2faModel<TUser> : LoginWith2faModel where TUser : class
+internal sealed class LoginWith2faModel<TUser> : LoginWith2faModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml
index 503fbf1616..0d44e37d0f 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml
@@ -14,8 +14,8 @@
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.RecoveryCode" class="form-control" autocomplete="off" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.RecoveryCode" class="form-control" autocomplete="off" placeholder="RecoveryCode" />
<label asp-for="Input.RecoveryCode" class="form-label"></label>
<span asp-validation-for="Input.RecoveryCode" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml.cs
index e8fc3144fe..339882fad3 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/LoginWithRecoveryCode.cshtml.cs
@@ -60,7 +60,7 @@ public abstract class LoginWithRecoveryCodeModel : PageModel
public virtual Task<IActionResult> OnPostAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LoginWithRecoveryCodeModel<TUser> : LoginWithRecoveryCodeModel where TUser : class
+internal sealed class LoginWithRecoveryCodeModel<TUser> : LoginWithRecoveryCodeModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Logout.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Logout.cshtml.cs
index c1d88d601b..ec5befa254 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Logout.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Logout.cshtml.cs
@@ -31,7 +31,7 @@ public abstract class LogoutModel : PageModel
public virtual Task<IActionResult> OnPost(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class LogoutModel<TUser> : LogoutModel where TUser : class
+internal sealed class LogoutModel<TUser> : LogoutModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly ILogger<LogoutModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml
index 3bcae81e71..073603a30c 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml
@@ -11,18 +11,18 @@
<div class="col-md-6">
<form id="change-password-form" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.OldPassword" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Please enter your old password." />
<label asp-for="Input.OldPassword" class="form-label"></label>
<span asp-validation-for="Input.OldPassword" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.NewPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please enter your new password." />
<label asp-for="Input.NewPassword" class="form-label"></label>
<span asp-validation-for="Input.NewPassword" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please confirm your new password."/>
<label asp-for="Input.ConfirmPassword" class="form-label"></label>
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml.cs
index 7675221175..ed2f61e43e 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ChangePassword.cshtml.cs
@@ -77,7 +77,7 @@ public abstract class ChangePasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ChangePasswordModel<TUser> : ChangePasswordModel where TUser : class
+internal sealed class ChangePasswordModel<TUser> : ChangePasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml
index cbc1a7a570..cecdd1d233 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml
@@ -18,8 +18,8 @@
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
@if (Model.RequirePassword)
{
- <div class="form-floating">
- <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Password" class="form-control" autocomplete="current-password" aria-required="true" placeholder="Please enter your password." />
<label asp-for="Input.Password" class="form-label"></label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml.cs
index 9a36d7b5dd..15671b8d33 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DeletePersonalData.cshtml.cs
@@ -56,7 +56,7 @@ public abstract class DeletePersonalDataModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class DeletePersonalDataModel<TUser> : DeletePersonalDataModel where TUser : class
+internal sealed class DeletePersonalDataModel<TUser> : DeletePersonalDataModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Disable2fa.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Disable2fa.cshtml.cs
index 8b431bfe8e..1615312497 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Disable2fa.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Disable2fa.cshtml.cs
@@ -34,7 +34,7 @@ public abstract class Disable2faModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class Disable2faModel<TUser> : Disable2faModel where TUser : class
+internal sealed class Disable2faModel<TUser> : Disable2faModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<Disable2faModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DownloadPersonalData.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DownloadPersonalData.cshtml.cs
index bb1d7035cc..4b9282683b 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DownloadPersonalData.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/DownloadPersonalData.cshtml.cs
@@ -29,7 +29,7 @@ public abstract class DownloadPersonalDataModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class DownloadPersonalDataModel<TUser> : DownloadPersonalDataModel where TUser : class
+internal sealed class DownloadPersonalDataModel<TUser> : DownloadPersonalDataModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<DownloadPersonalDataModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml
index 8a251c0c29..f3278e9ef5 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml
@@ -13,8 +13,8 @@
<div asp-validation-summary="All" class="text-danger" role="alert"></div>
@if (Model.IsEmailConfirmed)
{
- <div class="form-floating input-group">
- <input asp-for="Email" class="form-control" disabled />
+ <div class="form-floating mb-3 input-group">
+ <input asp-for="Email" class="form-control" placeholder="Please enter your email." disabled />
<div class="input-group-append">
<span class="h-100 input-group-text text-success font-weight-bold">✓</span>
</div>
@@ -23,14 +23,14 @@
}
else
{
- <div class="form-floating">
- <input asp-for="Email" class="form-control" disabled />
+ <div class="form-floating mb-3">
+ <input asp-for="Email" class="form-control" placeholder="Please enter your email." disabled />
<label asp-for="Email" class="form-label"></label>
<button id="email-verification" type="submit" asp-page-handler="SendVerificationEmail" class="btn btn-link">Send verification email</button>
</div>
}
- <div class="form-floating">
- <input asp-for="Input.NewEmail" class="form-control" autocomplete="email" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.NewEmail" class="form-control" autocomplete="email" aria-required="true" placeholder="Please enter new email." />
<label asp-for="Input.NewEmail" class="form-label"></label>
<span asp-validation-for="Input.NewEmail" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml.cs
index fbe3a77086..c56438d0ef 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Email.cshtml.cs
@@ -79,7 +79,7 @@ public abstract class EmailModel : PageModel
public virtual Task<IActionResult> OnPostSendVerificationEmailAsync() => throw new NotImplementedException();
}
-internal class EmailModel<TUser> : EmailModel where TUser : class
+internal sealed class EmailModel<TUser> : EmailModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml
index 8742fd3fa4..fefa57f2b7 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml
@@ -34,8 +34,8 @@
<div class="row">
<div class="col-md-6">
<form id="send-code" method="post">
- <div class="form-floating">
- <input asp-for="Input.Code" class="form-control" autocomplete="off" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Code" class="form-control" autocomplete="off" placeholder="Please enter the code."/>
<label asp-for="Input.Code" class="control-label form-label">Verification Code</label>
<span asp-validation-for="Input.Code" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml.cs
index acacb21300..472862667d 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/EnableAuthenticator.cshtml.cs
@@ -82,7 +82,7 @@ public class EnableAuthenticatorModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class EnableAuthenticatorModel<TUser> : EnableAuthenticatorModel where TUser : class
+internal sealed class EnableAuthenticatorModel<TUser> : EnableAuthenticatorModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<EnableAuthenticatorModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ExternalLogins.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ExternalLogins.cshtml.cs
index 0e8283cd3e..cf34d156a5 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ExternalLogins.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ExternalLogins.cshtml.cs
@@ -65,7 +65,7 @@ public abstract class ExternalLoginsModel : PageModel
public virtual Task<IActionResult> OnGetLinkLoginCallbackAsync() => throw new NotImplementedException();
}
-internal class ExternalLoginsModel<TUser> : ExternalLoginsModel where TUser : class
+internal sealed class ExternalLoginsModel<TUser> : ExternalLoginsModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/GenerateRecoveryCodes.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/GenerateRecoveryCodes.cshtml.cs
index f181731723..9fbe32ab85 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/GenerateRecoveryCodes.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/GenerateRecoveryCodes.cshtml.cs
@@ -42,7 +42,7 @@ public abstract class GenerateRecoveryCodesModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class GenerateRecoveryCodesModel<TUser> : GenerateRecoveryCodesModel where TUser : class
+internal sealed class GenerateRecoveryCodesModel<TUser> : GenerateRecoveryCodesModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<GenerateRecoveryCodesModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml
index 47f9fe2212..94b669d625 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml
@@ -11,12 +11,12 @@
<div class="col-md-6">
<form id="profile-form" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Username" class="form-control" disabled />
+ <div class="form-floating mb-3">
+ <input asp-for="Username" class="form-control" placeholder="Please choose your username." disabled />
<label asp-for="Username" class="form-label"></label>
</div>
- <div class="form-floating">
- <input asp-for="Input.PhoneNumber" class="form-control" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.PhoneNumber" class="form-control" placeholder="Please enter your phone number."/>
<label asp-for="Input.PhoneNumber" class="form-label"></label>
<span asp-validation-for="Input.PhoneNumber" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml.cs
index 97fb3409f3..d82fc46969 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/Index.cshtml.cs
@@ -62,7 +62,7 @@ public abstract class IndexModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class IndexModel<TUser> : IndexModel where TUser : class
+internal sealed class IndexModel<TUser> : IndexModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml
index 083549300c..2b5af23fc8 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml
@@ -17,7 +17,7 @@
<button class="btn btn-primary" type="submit">Download</button>
</form>
<p>
- <a id="delete" asp-page="DeletePersonalData" class="btn btn-danger">Delete</a>
+ <a id="delete" role="button" asp-page="DeletePersonalData" class="btn btn-danger">Delete</a>
</p>
</div>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml.cs
index 92b76e2b8f..7d309cb4df 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/PersonalData.cshtml.cs
@@ -21,7 +21,7 @@ public abstract class PersonalDataModel : PageModel
public virtual Task<IActionResult> OnGet() => throw new NotImplementedException();
}
-internal class PersonalDataModel<TUser> : PersonalDataModel where TUser : class
+internal sealed class PersonalDataModel<TUser> : PersonalDataModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly ILogger<PersonalDataModel> _logger;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ResetAuthenticator.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ResetAuthenticator.cshtml.cs
index fba579daf9..4494c0b81b 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ResetAuthenticator.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/ResetAuthenticator.cshtml.cs
@@ -34,7 +34,7 @@ public abstract class ResetAuthenticatorModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ResetAuthenticatorModel<TUser> : ResetAuthenticatorModel where TUser : class
+internal sealed class ResetAuthenticatorModel<TUser> : ResetAuthenticatorModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml
index 05af7edb56..a4ba058be4 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml
@@ -15,13 +15,13 @@
<div class="col-md-6">
<form id="set-password-form" method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.NewPassword" class="form-control" autocomplete="new-password" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.NewPassword" class="form-control" autocomplete="new-password" placeholder="Please enter your new password."/>
<label asp-for="Input.NewPassword" class="form-label"></label>
<span asp-validation-for="Input.NewPassword" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" placeholder="Please confirm your new password."/>
<label asp-for="Input.ConfirmPassword" class="form-label"></label>
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml.cs
index 4c95168eeb..b1d95a37fe 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/SetPassword.cshtml.cs
@@ -67,7 +67,7 @@ public abstract class SetPasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class SetPasswordModel<TUser> : SetPasswordModel where TUser : class
+internal sealed class SetPasswordModel<TUser> : SetPasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/TwoFactorAuthentication.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/TwoFactorAuthentication.cshtml.cs
index 1fbe1d3d5e..3d0255dd25 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/TwoFactorAuthentication.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Manage/TwoFactorAuthentication.cshtml.cs
@@ -59,7 +59,7 @@ public abstract class TwoFactorAuthenticationModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class TwoFactorAuthenticationModel<TUser> : TwoFactorAuthenticationModel where TUser : class
+internal sealed class TwoFactorAuthenticationModel<TUser> : TwoFactorAuthenticationModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly SignInManager<TUser> _signInManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml
index 578b1a58a1..6fbfc8fa4a 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml
@@ -12,19 +12,19 @@
<h2>Create a new account.</h2>
<hr />
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
- <label asp-for="Input.Email"></label>
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
+ <label asp-for="Input.Email">Email</label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" />
- <label asp-for="Input.Password"></label>
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
+ <label asp-for="Input.Password">Password</label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" />
- <label asp-for="Input.ConfirmPassword"></label>
+ <div class="form-floating mb-3">
+ <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="password" />
+ <label asp-for="Input.ConfirmPassword">Confirm Password</label>
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
<button id="registerSubmit" type="submit" class="w-100 btn btn-lg btn-primary">Register</button>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml.cs
index 978d183053..cbea4ecbb7 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/Register.cshtml.cs
@@ -90,7 +90,7 @@ public abstract class RegisterModel : PageModel
public virtual Task<IActionResult> OnPostAsync(string? returnUrl = null) => throw new NotImplementedException();
}
-internal class RegisterModel<TUser> : RegisterModel where TUser : class
+internal sealed class RegisterModel<TUser> : RegisterModel where TUser : class
{
private readonly SignInManager<TUser> _signInManager;
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/RegisterConfirmation.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/RegisterConfirmation.cshtml.cs
index 400e3c37d6..259172fbcf 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/RegisterConfirmation.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/RegisterConfirmation.cshtml.cs
@@ -43,7 +43,7 @@ public class RegisterConfirmationModel : PageModel
public virtual Task<IActionResult> OnGetAsync(string email, string? returnUrl = null) => throw new NotImplementedException();
}
-internal class RegisterConfirmationModel<TUser> : RegisterConfirmationModel where TUser : class
+internal sealed class RegisterConfirmationModel<TUser> : RegisterConfirmationModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly IEmailSender _sender;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml
index c9c4dd097b..d457b6b8bb 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml
@@ -11,8 +11,8 @@
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="All" class="text-danger" role="alert"></div>
- <div class="form-floating">
- <input asp-for="Input.Email" class="form-control" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Email" class="form-control" aria-required="true" placeholder="name@example.com" />
<label asp-for="Input.Email" class="form-label"></label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml.cs
index 2663be567a..b31525eb41 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResendEmailConfirmation.cshtml.cs
@@ -55,7 +55,7 @@ public class ResendEmailConfirmationModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ResendEmailConfirmationModel<TUser> : ResendEmailConfirmationModel where TUser : class
+internal sealed class ResendEmailConfirmationModel<TUser> : ResendEmailConfirmationModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
private readonly IEmailSender _emailSender;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml
index 494c0bf5dc..1133dd995c 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml
@@ -1,4 +1,4 @@
-@page
+@page
@model ResetPasswordModel
@{
ViewData["Title"] = "Reset password";
@@ -12,18 +12,18 @@
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger" role="alert"></div>
<input asp-for="Input.Code" type="hidden" />
- <div class="form-floating">
- <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Email" class="form-control" autocomplete="username" aria-required="true" placeholder="name@example.com" />
<label asp-for="Input.Email" class="form-label"></label>
<span asp-validation-for="Input.Email" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.Password" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please enter your password." />
<label asp-for="Input.Password" class="form-label"></label>
<span asp-validation-for="Input.Password" class="text-danger"></span>
</div>
- <div class="form-floating">
- <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" />
+ <div class="form-floating mb-3">
+ <input asp-for="Input.ConfirmPassword" class="form-control" autocomplete="new-password" aria-required="true" placeholder="Please confirm your password." />
<label asp-for="Input.ConfirmPassword" class="form-label"></label>
<span asp-validation-for="Input.ConfirmPassword" class="text-danger"></span>
</div>
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml.cs b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml.cs
index 60246c705a..6a6b26fc8a 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml.cs
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/Account/ResetPassword.cshtml.cs
@@ -78,7 +78,7 @@ public abstract class ResetPasswordModel : PageModel
public virtual Task<IActionResult> OnPostAsync() => throw new NotImplementedException();
}
-internal class ResetPasswordModel<TUser> : ResetPasswordModel where TUser : class
+internal sealed class ResetPasswordModel<TUser> : ResetPasswordModel where TUser : class
{
private readonly UserManager<TUser> _userManager;
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/_Layout.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/_Layout.cshtml
index b0cc26fd2f..a4177bc3cf 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/_Layout.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/_Layout.cshtml
@@ -75,11 +75,11 @@
<script src="~/Identity/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"
asp-fallback-src="~/Identity/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js"
asp-fallback-src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
diff --git a/src/Identity/UI/src/Areas/Identity/Pages/V5/_ValidationScriptsPartial.cshtml b/src/Identity/UI/src/Areas/Identity/Pages/V5/_ValidationScriptsPartial.cshtml
index 74ca362665..a49314c56e 100644
--- a/src/Identity/UI/src/Areas/Identity/Pages/V5/_ValidationScriptsPartial.cshtml
+++ b/src/Identity/UI/src/Areas/Identity/Pages/V5/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha256-F6h55Qw6sweK+t7SiOJX+2bpSAa3b/fnlrVCJvmEj1A=">
</script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/Identity/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha256-9GycpJnliUjJDVDqP0UEu/bsm9U+3dnQUH8+3W10vkY=">
+ integrity="sha384-DU2a51mTHKDhpXhTyJQ++hP8L9L8Gc48TlvbzBmUof71V7kNVs4ELmaVJKPxcAGn">
</script>
</environment>
diff --git a/src/Identity/UI/src/Areas/Identity/Services/EmailSender.cs b/src/Identity/UI/src/Areas/Identity/Services/EmailSender.cs
index 184105a101..5903931795 100644
--- a/src/Identity/UI/src/Areas/Identity/Services/EmailSender.cs
+++ b/src/Identity/UI/src/Areas/Identity/Services/EmailSender.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Identity.UI.Services;
-internal class EmailSender : IEmailSender
+internal sealed class EmailSender : IEmailSender
{
public Task SendEmailAsync(string email, string subject, string htmlMessage)
{
diff --git a/src/Identity/UI/src/IdentityBuilderUIExtensions.cs b/src/Identity/UI/src/IdentityBuilderUIExtensions.cs
index e85c1023b3..c9379a16f2 100644
--- a/src/Identity/UI/src/IdentityBuilderUIExtensions.cs
+++ b/src/Identity/UI/src/IdentityBuilderUIExtensions.cs
@@ -1,15 +1,15 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Reflection;
using System.Linq;
+using System.Reflection;
+using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Identity.UI;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Razor.Compilation;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.AspNetCore.Mvc.Razor.Compilation;
-using Microsoft.AspNetCore.Hosting;
namespace Microsoft.AspNetCore.Identity;
@@ -101,7 +101,7 @@ public static class IdentityBuilderUIExtensions
return true;
}
- internal class ViewVersionFeatureProvider : IApplicationFeatureProvider<ViewsFeature>
+ internal sealed class ViewVersionFeatureProvider : IApplicationFeatureProvider<ViewsFeature>
{
private readonly UIFramework _framework;
diff --git a/src/Identity/UI/src/IdentityDefaultUIConfigureOptions.cs b/src/Identity/UI/src/IdentityDefaultUIConfigureOptions.cs
index c026d208fb..b917222a04 100644
--- a/src/Identity/UI/src/IdentityDefaultUIConfigureOptions.cs
+++ b/src/Identity/UI/src/IdentityDefaultUIConfigureOptions.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Identity.UI;
-internal class IdentityDefaultUIConfigureOptions<TUser> :
+internal sealed class IdentityDefaultUIConfigureOptions<TUser> :
IPostConfigureOptions<RazorPagesOptions>,
IConfigureNamedOptions<CookieAuthenticationOptions> where TUser : class
{
diff --git a/src/Identity/UI/src/IdentityPageModelConvention.cs b/src/Identity/UI/src/IdentityPageModelConvention.cs
index 477b71b89a..7a6309341c 100644
--- a/src/Identity/UI/src/IdentityPageModelConvention.cs
+++ b/src/Identity/UI/src/IdentityPageModelConvention.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace Microsoft.AspNetCore.Identity.UI;
-internal class IdentityPageModelConvention<TUser> : IPageApplicationModelConvention where TUser : class
+internal sealed class IdentityPageModelConvention<TUser> : IPageApplicationModelConvention where TUser : class
{
public void Apply(PageApplicationModel model)
{
diff --git a/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj b/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj
index e5c0ef0f56..847aa53906 100644
--- a/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj
+++ b/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj
@@ -13,7 +13,6 @@
<StaticWebAssetBasePath>Identity</StaticWebAssetBasePath>
<ProvideApplicationPartFactoryAttributeTypeName>Microsoft.AspNetCore.Mvc.ApplicationParts.NullApplicationPartFactory, Microsoft.AspNetCore.Mvc.Core</ProvideApplicationPartFactoryAttributeTypeName>
- <GenerateStaticWebAssetsPackTargetsDependsOn>_GenerateIdentityUIPackItems;$(GenerateStaticWebAssetsPackTargetsDependsOn)</GenerateStaticWebAssetsPackTargetsDependsOn>
<DisableStaticWebAssetsBuildPropsFileGeneration>true</DisableStaticWebAssetsBuildPropsFileGeneration>
<StaticWebAssetsDisableProjectBuildPropsFileGeneration>true</StaticWebAssetsDisableProjectBuildPropsFileGeneration>
<StaticWebAssetsDisableProjectBuildMultiTargetingPropsFileGeneration>true</StaticWebAssetsDisableProjectBuildMultiTargetingPropsFileGeneration>
@@ -74,7 +73,7 @@
</ItemGroup>
</Target>
- <Target Name="_GenerateIdentityUIPackItems">
+ <Target Name="_GenerateIdentityUIPackItems" BeforeTargets="GenerateStaticWebAssetsPackFiles">
<ItemGroup>
<V4AssetsCandidates Include="assets\V4\**" />
<V4AssetsCandidates>
@@ -96,25 +95,19 @@
<GenerateStaticWebAsssetsPropsFile StaticWebAssets="@(V5Assets)" PackagePathPrefix="staticwebassets/V5" TargetPropsFilePath="$(IntermediateOutputPath)IdentityUI.V5.targets" />
<ComputeStaticWebAssetsTargetPaths Assets="@(V4Assets)" PathPrefix="staticwebassets/V4" AdjustPathsForPack="true">
- <Output TaskParameter="AssetsWithTargetPath" ItemName="_PackV4Asset" />
+ <Output TaskParameter="AssetsWithTargetPath" ItemName="_PackStaticWebAssetWithTargetPath" />
</ComputeStaticWebAssetsTargetPaths>
<ComputeStaticWebAssetsTargetPaths Assets="@(V5Assets)" PathPrefix="staticwebassets/V5" AdjustPathsForPack="true">
- <Output TaskParameter="AssetsWithTargetPath" ItemName="_PackV5Asset" />
+ <Output TaskParameter="AssetsWithTargetPath" ItemName="_PackStaticWebAssetWithTargetPath" />
</ComputeStaticWebAssetsTargetPaths>
<ItemGroup>
- <TfmSpecificPackageFile Include="$(IntermediateOutputPath)IdentityUI.V4.targets">
+ <StaticWebAssetPackageFile Include="$(IntermediateOutputPath)IdentityUI.V4.targets">
<PackagePath>build\Microsoft.AspNetCore.StaticWebAssets.V4.targets</PackagePath>
- </TfmSpecificPackageFile>
- <TfmSpecificPackageFile Include="%(_PackV4Asset.Identity)">
- <PackagePath>%(_PackV4Asset.TargetPath)</PackagePath>
- </TfmSpecificPackageFile>
- <TfmSpecificPackageFile Include="$(IntermediateOutputPath)IdentityUI.V5.targets">
+ </StaticWebAssetPackageFile>
+ <StaticWebAssetPackageFile Include="$(IntermediateOutputPath)IdentityUI.V5.targets">
<PackagePath>build\Microsoft.AspNetCore.StaticWebAssets.V5.targets</PackagePath>
- </TfmSpecificPackageFile>
- <TfmSpecificPackageFile Include="%(_PackV5Asset.Identity)">
- <PackagePath>%(_PackV5Asset.TargetPath)</PackagePath>
- </TfmSpecificPackageFile>
+ </StaticWebAssetPackageFile>
</ItemGroup>
</Target>
</Project>
diff --git a/src/Identity/UI/src/PublicAPI.Shipped.txt b/src/Identity/UI/src/PublicAPI.Shipped.txt
index b62fafcae9..fe17b7df87 100644
--- a/src/Identity/UI/src/PublicAPI.Shipped.txt
+++ b/src/Identity/UI/src/PublicAPI.Shipped.txt
@@ -1,448 +1,448 @@
#nullable enable
-~Microsoft.AspNetCore.Identity.UI.Services.IEmailSender.SendEmailAsync(string email, string subject, string htmlMessage) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFramework.get -> string
-~Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFrameworkAttribute(string uiFramework) -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string[]
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string[]
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string[]
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.get -> string
-~Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string[]
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string[]
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string[]
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.get -> string
-~Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.set -> void
-~static Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions> configureOptions) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string userId, string email, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string userId, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string returnUrl = null, string remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPost(string provider, string returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LogoutModel.OnPost(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string email, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnGet(string code = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string loginProvider, string providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string userId, string email, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string userId, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string returnUrl = null, string remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPost(string provider, string returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LogoutModel.OnPost(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string email, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnGet(string code = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string loginProvider, string providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
+Microsoft.AspNetCore.Identity.UI.Services.IEmailSender.SendEmailAsync(string! email, string! subject, string! htmlMessage) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFramework.get -> string!
+Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFrameworkAttribute(string! uiFramework) -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string![]?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string![]?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string![]?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.get -> string?
+Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string![]?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string![]?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string![]?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.get -> string?
+Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.set -> void
+static Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string!
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions!>! configureOptions) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string! userId, string! email, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string! userId, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string? returnUrl = null, string? remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPost(string! provider, string? returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LogoutModel.OnPost(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string! email, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnGet(string? code = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string! provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string! userId, string! email, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string! userId, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string? returnUrl = null, string? remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPost(string! provider, string? returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LogoutModel.OnPost(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string! email, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnGet(string? code = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string! provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
+virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions
Microsoft.AspNetCore.Identity.UI.LoggerEventIds
Microsoft.AspNetCore.Identity.UI.Services.IEmailSender
diff --git a/src/Identity/UI/src/PublicAPI.Unshipped.txt b/src/Identity/UI/src/PublicAPI.Unshipped.txt
index 89602036ed..7dc5c58110 100644
--- a/src/Identity/UI/src/PublicAPI.Unshipped.txt
+++ b/src/Identity/UI/src/PublicAPI.Unshipped.txt
@@ -1,889 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.Services.IEmailSender.SendEmailAsync(string email, string subject, string htmlMessage) -> System.Threading.Tasks.Task
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFramework.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFrameworkAttribute(string uiFramework) -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string[]
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string[]
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string[]
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string[]
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme>
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string[]
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string[]
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.get -> string
-*REMOVED*~Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.set -> void
-*REMOVED*~static Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI(this Microsoft.AspNetCore.Identity.IdentityBuilder builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, string page) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> string
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions> configureOptions) -> Microsoft.AspNetCore.Identity.IdentityBuilder
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string userId, string email, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string userId, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string returnUrl = null, string remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPost(string provider, string returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LogoutModel.OnPost(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string email, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnGet(string code = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string loginProvider, string providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string userId, string email, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string userId, string code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string returnUrl = null, string remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPost(string provider, string returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LogoutModel.OnPost(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string email, string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnGetAsync(string returnUrl = null) -> System.Threading.Tasks.Task
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnPostAsync(string returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnGet(string code = null) -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string loginProvider, string providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-*REMOVED*~virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult>
-Microsoft.AspNetCore.Identity.UI.Services.IEmailSender.SendEmailAsync(string! email, string! subject, string! htmlMessage) -> System.Threading.Tasks.Task!
-Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFramework.get -> string!
-Microsoft.AspNetCore.Identity.UI.UIFrameworkAttribute.UIFrameworkAttribute(string! uiFramework) -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string![]?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string![]?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string![]?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.get -> string?
-Microsoft.AspNetCore.Identity.UI.V4.Pages.Internal.ErrorModel.RequestId.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ErrorMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ProviderDisplayName.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ErrorMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ExternalLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.InputModel.TwoFactorCode.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.InputModel.RecoveryCode.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.EmailConfirmationUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ExternalLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.ReturnUrl.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Code.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.NewPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.InputModel.OldPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.InputModel.Password.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Email.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.InputModel.NewEmail.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.AuthenticatorUri.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.InputModel.Code.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.get -> string![]?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.RecoveryCodes.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.SharedKey.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Identity.UserLoginInfo!>?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.CurrentLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authentication.AuthenticationScheme!>?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OtherLogins.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.get -> string![]?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.RecoveryCodes.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.InputModel.PhoneNumber.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.Username.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.get -> Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.Input.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.ConfirmPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.get -> string!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.InputModel.NewPassword.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.get -> string![]?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.RecoveryCodes.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ShowRecoveryCodesModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.StatusMessage.set -> void
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.get -> string?
-Microsoft.AspNetCore.Identity.UI.V5.Pages.Internal.ErrorModel.RequestId.set -> void
-static Microsoft.AspNetCore.Identity.IdentityBuilderUIExtensions.AddDefaultUI(this Microsoft.AspNetCore.Identity.IdentityBuilder! builder) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.AriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePassword.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ChangePasswordNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalData.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DeletePersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalData.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.DownloadPersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Email.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.EmailNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLogins.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.ExternalLoginsNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.Index.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.IndexNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PageNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext, string! page) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalData.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.PersonalDataNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthentication.get -> string!
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationAriaCurrent(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ManageNavPages.TwoFactorAuthenticationNavClass(Microsoft.AspNetCore.Mvc.Rendering.ViewContext! viewContext) -> string?
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-static Microsoft.Extensions.DependencyInjection.IdentityServiceCollectionUIExtensions.AddDefaultIdentity<TUser>(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Identity.IdentityOptions!>! configureOptions) -> Microsoft.AspNetCore.Identity.IdentityBuilder!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string! userId, string! email, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string! userId, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string? returnUrl = null, string? remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPost(string! provider, string? returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.LogoutModel.OnPost(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string! email, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.RegisterModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnGet(string? code = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string! provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V4.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailChangeModel.OnGetAsync(string! userId, string! email, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ConfirmEmailModel.OnGetAsync(string! userId, string! code) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnGetCallbackAsync(string? returnUrl = null, string? remoteError = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPost(string! provider, string? returnUrl = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ExternalLoginModel.OnPostConfirmationAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ForgotPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnGetAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWith2faModel.OnPostAsync(bool rememberMe, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LoginWithRecoveryCodeModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.LogoutModel.OnPost(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterConfirmationModel.OnGetAsync(string! email, string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnGetAsync(string? returnUrl = null) -> System.Threading.Tasks.Task!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.RegisterModel.OnPostAsync(string? returnUrl = null) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResendEmailConfirmationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnGet(string? code = null) -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Internal.ResetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ChangePasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DeletePersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.Disable2faModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnGet() -> Microsoft.AspNetCore.Mvc.IActionResult!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.DownloadPersonalDataModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostChangeEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EmailModel.OnPostSendVerificationEmailAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.EnableAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnGetLinkLoginCallbackAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostLinkLoginAsync(string! provider) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ExternalLoginsModel.OnPostRemoveLoginAsync(string! loginProvider, string! providerKey) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.GenerateRecoveryCodesModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.IndexModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.PersonalDataModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnGet() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.ResetAuthenticatorModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.SetPasswordModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnGetAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
-virtual Microsoft.AspNetCore.Identity.UI.V5.Pages.Account.Manage.Internal.TwoFactorAuthenticationModel.OnPostAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.IActionResult!>!
diff --git a/src/Identity/UI/src/THIRD-PARTY-NOTICES.txt b/src/Identity/UI/src/THIRD-PARTY-NOTICES.txt
index 0167da0d04..688c43b8c0 100644
--- a/src/Identity/UI/src/THIRD-PARTY-NOTICES.txt
+++ b/src/Identity/UI/src/THIRD-PARTY-NOTICES.txt
@@ -152,18 +152,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-License notice for jQuery 3.5.1
+License notice for jQuery 3.6.0
-------------------------------
-Copyright JS Foundation and other contributors, https://js.foundation/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -184,13 +175,6 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
-
License notice for jQuery Validation v1.17.0
--------------------------------------------
The MIT License (MIT)
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/LICENSE.txt b/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/LICENSE.txt
index 0bdc1962b6..984713a496 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ b/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/LICENSE.txt
@@ -1,12 +1,23 @@
-Copyright (c) .NET Foundation. All rights reserved.
+The MIT License (MIT)
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-these files except in compliance with the License. You may obtain a copy of the
-License at
+Copyright (c) .NET Foundation and Contributors
-http://www.apache.org/licenses/LICENSE-2.0
+All rights reserved.
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 73f5298394..009306070a 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,7 +1,10 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index 57e8b2e475..d8d803c65e 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Identity/UI/src/assets/V4/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive}); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery/LICENSE.txt b/src/Identity/UI/src/assets/V4/lib/jquery/LICENSE.txt
index e4e5e00ef0..599bdf2c72 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery/LICENSE.txt
+++ b/src/Identity/UI/src/assets/V4/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright JS Foundation and other contributors, https://js.foundation/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.js b/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.js
+++ b/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.js b/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.js
+++ b/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.map b/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.map
+++ b/src/Identity/UI/src/assets/V4/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Identity/UI/src/assets/V5/css/site.css b/src/Identity/UI/src/assets/V5/css/site.css
index d18b278b61..896506fd71 100644
--- a/src/Identity/UI/src/assets/V5/css/site.css
+++ b/src/Identity/UI/src/assets/V5/css/site.css
@@ -13,13 +13,25 @@ a {
.form-control:focus {
border-color: #0077cc;
- box-shadow: 0 0 0 0.2rem #0077cc;
+ outline: black auto 1px;
+ box-shadow: none;
+}
+
+.form-check-input:focus {
+ border-color: #0077cc;
+ box-shadow: none;
+ outline: black auto 1px;
}
.btn-primary {
- color: #fff;
- background-color: #1b6ec2;
- border-color: #1861ac;
+ color: #fff;
+ background-color: #1b6ec2;
+ border-color: #1861ac;
+}
+
+.btn-primary:focus {
+ box-shadow: none;
+ outline: black auto 1px;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/LICENSE.txt b/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/LICENSE.txt
index 0bdc1962b6..984713a496 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ b/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/LICENSE.txt
@@ -1,12 +1,23 @@
-Copyright (c) .NET Foundation. All rights reserved.
+The MIT License (MIT)
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-these files except in compliance with the License. You may obtain a copy of the
-License at
+Copyright (c) .NET Foundation and Contributors
-http://www.apache.org/licenses/LICENSE-2.0
+All rights reserved.
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 73f5298394..009306070a 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,7 +1,10 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index 57e8b2e475..d8d803c65e 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Identity/UI/src/assets/V5/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive}); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery/LICENSE.txt b/src/Identity/UI/src/assets/V5/lib/jquery/LICENSE.txt
index e4e5e00ef0..599bdf2c72 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery/LICENSE.txt
+++ b/src/Identity/UI/src/assets/V5/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright JS Foundation and other contributors, https://js.foundation/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.js b/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.js
+++ b/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.js b/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.js
+++ b/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.map b/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.map
+++ b/src/Identity/UI/src/assets/V5/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAC1B,mBAAbD,EAAIE,MAIVC,EAAW,SAAmBH,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB8B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOtC,GAGC0C,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQxB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCyB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa/B,GAMrB,IAAIgC,IAAWhC,GAAO,WAAYA,GAAOA,EAAIgC,OAC5C3B,EAAOmB,EAAQxB,GAEhB,OAAKD,EAAYC,KAASG,EAAUH,KAIpB,UAATK,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAOhC,GArWhE0B,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOpD,EAAMG,KAAMT,OAKpB2D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGtD,EAAMG,KAAMT,MAIb4D,EAAM,EAAI5D,KAAM4D,EAAM5D,KAAKsD,QAAWtD,KAAM4D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAOhE,KAAKyD,cAAeK,GAM5C,OAHAC,EAAIE,WAAajE,KAGV+D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMlE,KAAMmE,IAG3BC,IAAK,SAAUD,GACd,OAAOnE,KAAK6D,UAAWb,EAAOoB,IAAKpE,KAAM,SAAUqE,EAAMlC,GACxD,OAAOgC,EAAS1D,KAAM4D,EAAMlC,EAAGkC,OAIjC/D,MAAO,WACN,OAAON,KAAK6D,UAAWvD,EAAMK,MAAOX,KAAMsE,aAG3CC,MAAO,WACN,OAAOvE,KAAKwE,GAAI,IAGjBC,KAAM,WACL,OAAOzE,KAAKwE,IAAK,IAGlBE,KAAM,WACL,OAAO1E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO7E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM9E,KAAKsD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO9E,KAAK6D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE9E,KAAM+E,IAAQ,KAG5DC,IAAK,WACJ,OAAOhF,KAAKiE,YAAcjE,KAAKyD,eAKhC7C,KAAMA,EACNqE,KAAM/E,EAAI+E,KACVC,OAAQhF,EAAIgF,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBpE,EAAYoE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASzF,KACTmC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAIvG,MAAOuG,IAGlBC,KAAM,aAENX,cAAe,SAAUrE,GACxB,IAAIiF,EAAOC,EAIX,SAAMlF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BiF,EAAQpG,EAAUmB,KASK,mBADvBkF,EAAOxF,EAAOP,KAAM8F,EAAO,gBAAmBA,EAAM9C,cACfvC,EAAWT,KAAM+F,KAAWrF,IAGlEsF,cAAe,SAAUnF,GACxB,IAAI+D,EAEJ,IAAMA,KAAQ/D,EACb,OAAO,EAER,OAAO,GAKRoF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU5C,EAAK6C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa/B,IAEjB,IADAgC,EAAShC,EAAIgC,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,WAIF,IAAMA,KAAKb,EACV,IAAgD,IAA3C6C,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,MAKH,OAAOb,GAIRqF,UAAW,SAAUzG,EAAK0G,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAP1G,IACCmD,EAAajD,OAAQF,IACzB8C,EAAOgB,MAAOD,EACE,iBAAR7D,EACN,CAAEA,GAAQA,GAGZU,EAAKH,KAAMsD,EAAK7D,IAIX6D,GAGR8C,QAAS,SAAUxC,EAAMnE,EAAKiC,GAC7B,OAAc,MAAPjC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKmE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQpG,KAAMkD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,GAMb,OAAO5G,EAAMwD,IAIdqD,KAAM,EAINhG,QAASA,IAGa,mBAAXiG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAapH,EAAKmH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC1F,SAAUC,EAAInC,GACbvE,EAAY,WAAauE,EAAO,KAAQA,EAAKoC,gBAmB/C,IAAIC,EAWJ,SAAY3H,GACZ,IAAIoC,EACHf,EACAuG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxI,EACAyI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe5I,EAAOH,SACtBgJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRnH,EAAS,GAAOC,eAChBf,EAAM,GACNoJ,EAAMpJ,EAAIoJ,IACVC,EAAarJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU2I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOjL,MAAO,GAAM,MAEtC,OAAOkL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGxL,MAAO,GAAI,GAAM,KAC1BwL,EAAGE,WAAYF,EAAGxI,OAAS,GAAIvC,SAAU,IAAO,IAI3C,KAAO+K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC3L,EAAKD,MACFT,EAAMI,EAAMG,KAAMkI,EAAa6D,YACjC7D,EAAa6D,YAMdtM,EAAKyI,EAAa6D,WAAWlJ,QAAS/B,SACrC,MAAQkL,GACT7L,EAAO,CAAED,MAAOT,EAAIoD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW5I,MAAO8E,EAAQnF,EAAMG,KAAMiM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC3L,EAAW2B,EAAUA,EAAQ3B,SAAW,EAKzC,GAHAqF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAb1B,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOqF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWtD,EAEhB0I,GAAiB,CAIrB,GAAkB,KAAb/G,IAAqBuL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbvL,EAAiB,CACrB,KAAO8C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQhG,KAAMyD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQhG,KAAMyD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAlM,EAAKD,MAAOiG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAAS1L,EAAQmM,wBACzCrK,EAAQqK,uBAGR,OADA3M,EAAKD,MAAOiG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKxF,EAAQoM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAb1B,GAAqD,WAAnC2B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb3B,IACF4I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY9B,EAAQuM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAjN,EAAKD,MAAOiG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKrN,KAAMuN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK5O,EAAS0C,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIzO,EAAMwO,EAAMnH,MAAO,KACtBpF,EAAIjC,EAAIoD,OAET,MAAQnB,IACPwF,EAAKiH,WAAY1O,EAAKiC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE7H,UAAiC,IAAf8H,EAAE9H,UACnC6H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNf,EAAUsG,GAAOtG,QAAU,GAO3ByG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,GAAQA,EAAKqL,aAC5BrH,EAAUhE,IAAUA,EAAK6I,eAAiB7I,GAAOsL,gBAKlD,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOtC,GAA6B,IAAjBsC,EAAIX,UAAmBW,EAAIyN,kBAMnDtH,GADAzI,EAAWsC,GACQyN,gBACnBrH,GAAkBT,EAAOjI,GAQpB+I,GAAgB/I,IAClBiQ,EAAYjQ,EAASkQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC7K,EAAQuM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa/C,EAAS0C,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDlC,EAAQwI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BpB,EAAQkM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa/C,EAASuQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxClC,EAAQmM,uBAAyBrC,EAAQuC,KAAM7N,EAAS2N,wBAMxDnM,EAAQgP,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBnG,EAASyQ,oBAAsBzQ,EAASyQ,kBAAmBtK,GAAUzC,SAIzElC,EAAQgP,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAIpP,EAAQkM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BtP,EAAQoM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK9C,UACToP,EAAI/P,KAAMyD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAIpP,EAAQmM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELnH,EAAQoM,IAAMtC,EAAQuC,KAAM7N,EAASkO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU3H,KAAM,SAAW8I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU3H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU3H,KAAM,OAQjBgQ,EAAQhR,EAAS0C,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU3H,KAAM,MAAQ8I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU3H,KAAM,YAMX4N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU3H,KAAM,YAKjB4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,iBAGjB2N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQhR,EAAS0C,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,OAAS8I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,WAAY,aAK7ByH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU3H,KAAM,WAAY,aAK7B4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,YAIXQ,EAAQ0P,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBpN,EAAQ+P,kBAAoBnK,EAAQvG,KAAM+N,EAAI,KAI9CxH,EAAQvG,KAAM+N,EAAI,aAClBhG,EAAc5H,KAAM,KAAMiJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE7H,SAAiB6H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI/P,YAClC8P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGjI,EAAQoQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKxJ,GAAYwJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKzJ,GAAYyJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJrH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKxJ,GAAY,EACvByJ,GAAKzJ,EAAW,EAEhB6R,GAAO,EACPH,EAAM,EACNpJ,EACErH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK/I,GAGR8H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERjD,EAAQ0P,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQvG,KAAM4D,EAAMwN,GAG9B,GAAK9N,GAAO3C,EAAQ+P,mBAInB9M,EAAKzE,UAAuC,KAA3ByE,EAAKzE,SAAS2B,SAC/B,OAAOwC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMjS,EAAU,KAAM,CAAEyE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAatD,GAC5CwI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUzE,GACtCwI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMnC,EAAOP,KAAMkH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAhB,EAAQwI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAIvG,MAAO,0CAA4CuG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB/G,EAAQgR,iBACxBlK,GAAa9G,EAAQiR,YAAczL,EAAQtG,MAAO,GAClDsG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWvR,KAAMuB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJZ,EAAW8C,EAAK9C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB8C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb9C,GAA+B,IAAbA,EAC7B,OAAO8C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMxM,MAAO,EAAG,IAGxBsK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIxM,MAAO,EAAG,IAGnBwM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASrS,QAAS,IAAKqS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIxM,MAAO,EAAG2S,GAClCnG,EAAO,GAAMoG,EAAS5S,MAAO,EAAG2S,IAI1BnG,EAAMxM,MAAO,EAAG,MAIzBgQ,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,GAASC,EAAOjT,OAAQgT,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMjJ,QAASyS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOjT,MAAO,EAAGgT,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKrB,MAAO,EAAG,GAC3BqT,EAA+B,SAArBhS,EAAKrB,OAAQ,GACvBsT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,SAEL,OAAO,EAKT2S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKV,YAAoBwN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,aACHwN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWxT,eAAgBsT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM7T,EAAS8L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASxD,QAAS0B,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASpU,QAASmU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK9C,UAC7C,OAAO,KAKTkE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,KAC9C,OAAOA,GAAQA,EAAK5U,MAAO,KAAQ+D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASzE,EAAS0V,iBACrB1V,EAAS2V,UAAY3V,EAAS2V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK9C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR4S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa5O,KAAMuB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK9C,UAAkBwV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAa1W,KAAMyD,GACdkT,GACJnT,EAAIxD,KAAMuB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ3B,SAAW,CAAE2B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAKhX,KAAQsX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa7W,EAAS8L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvClT,EAAKD,MAAOiG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCxD,EAASwX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU3B,SAC1BiX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOhB,MAAO,KAAMgW,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACErW,MAAO,EAAG6B,EAAI,GACdzB,OAAQ,CAAEyG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOrW,MAAO6B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOrW,MAAOyE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASxW,KAAMiU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOxY,MAAO,GAGtCsY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMtY,MAAOwM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOnM,KAAQ+V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASzM,MAAO,IA4ZzCyH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYpY,KAAMkY,GAElBC,EAAgBnY,KAAMkY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWtD,GAAYsD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBtN,IACtCwI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWtD,EAAUkU,GAAQ,CAChDlN,EAAQhG,KAAMyD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUlU,KAAMyD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI7I,KAAMmG,IAM/B0S,EAAajC,GAAUiC,GAIxB1Y,EAAKD,MAAOiG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIxM,MAAO,IAC5BgD,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ3B,UAAkB+G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS3C,MAAOqW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA/V,EAAKD,MAAOiG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRxF,EAAQiR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E3E,EAAQgR,mBAAqBjK,EAG7BC,IAIAhH,EAAQoQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBxR,EAAS0C,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjErG,EAAQwI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK3H,GAILiD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK9C,SACtC,GAAuB,IAAlB8C,EAAK9C,SAAiB,CAC1B,GAAK0Y,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ/T,KAAMyD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE7Y,UAAkB6Y,IAAM/V,GAC9BsQ,EAAQ/T,KAAMwZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAExB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG9D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKvT,EAAYmZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU/Z,KAAM4D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUjZ,SACPyB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCxD,EAAQJ,KAAM+Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK9C,SACxByB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK9C,aAIdyB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM9E,KAAKsD,OACXmX,EAAOza,KAER,GAAyB,iBAAbiD,EACX,OAAOjD,KAAK6D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKnC,MAChC,OAAO,KAQX,IAFA+D,EAAM/D,KAAK6D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRva,KAIoB,iBAAbiD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOjD,KAQR,GAHAoV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BjD,KAAKyD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAOhE,KAAMgD,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ3B,SAAW2B,EAAQgK,eAAiBhK,EAAUtD,GACjE,IAII0a,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT7B,EAAYrB,KAAM8M,IACtB9M,KAAM8M,GAAS5J,EAAS4J,IAIxB9M,KAAK+R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO9M,KAYP,OARAqE,EAAOzE,EAASwN,eAAgBN,EAAO,OAKtC9M,KAAM,GAAMqE,EACZrE,KAAKsD,OAAS,GAERtD,KAcH,OAAKiD,EAAS1B,UACpBvB,KAAM,GAAMiD,EACZjD,KAAKsD,OAAS,EACPtD,MAIIqB,EAAY4B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUjD,QAIhCuD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQpD,GAGrB,IAAIib,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAIvN,UACpC,OAAOuN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQzF,MAC7Bob,EAAID,EAAQ7X,OAEb,OAAOtD,KAAKsQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUzI,KAAMmb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAIpb,KAAKsD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM9O,KAAMmC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAIvN,SAAW,KAAQ4Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAIvN,UACHyB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ/T,KAAMkO,GACd,MAMJ,OAAO9O,KAAK6D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJxD,EAAQJ,KAAMuC,EAAQqB,GAAQrE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBqE,EAAKb,OAASa,EAAM,GAAMA,GAZjBrE,KAAM,IAAOA,KAAM,GAAI4C,WAAe5C,KAAKuE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOlD,KAAK6D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAOhE,KAAK2D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOjD,KAAKwb,IAAiB,MAAZvY,EAChBjD,KAAKiE,WAAajE,KAAKiE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO5S,SAAkB4S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT5b,EAAUkE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKpE,KAAMmD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK/E,OAAQ,KACjB2C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd3U,KAAKsD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHjc,KAAK6D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS9F,EAAcsb,EAASxV,EAAMyV,SAC1CD,EAAOlc,KAAM0G,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS9F,EAAcsb,EAASxV,EAAM2V,MACjDH,EAAOlc,KAAM0G,EAAOqV,EAASC,GAQ7BD,EAAQ7b,WAAOmF,EAAW,CAAEqB,GAAQ7G,MAAOoc,IAM3C,MAAQvV,GAITsV,EAAO9b,WAAOmF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc7c,MAAOyc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM3c,KAAMwc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B7F,EAAY6F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK5I,KAAMsG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKzd,MAIR4d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIxd,MAKR+U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDxJ,MAMR6d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTpd,MAERoM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVpd,MAERsd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQlU,MAAQkU,EAAKlU,QAAUkU,GAC9C+I,EAAM3c,KAAM4T,GACN2I,GACLM,KAGKzd,MAIRyd,KAAM,WAEL,OADAhD,EAAKsD,SAAU/d,KAAMsE,WACdtE,MAIRqd,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BtE,MAERse,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK9B,EAAYmd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGxC,MAAOX,KAAMsE,WAChCqa,GAAYtd,EAAYsd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtB1e,KACAmD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOpf,KACVwU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQhO,MAAOye,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLzb,EAAYyb,GAGXqC,EACJrC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY2d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAYyd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY0d,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUtb,GAClB,OAAc,MAAPA,EAAc0B,EAAOmC,OAAQ7D,EAAKsb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAU1e,OAASqe,OAAWvY,EAAY9F,KAAMsE,WAChEtE,MAMRqe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKxd,KAAM4d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB9f,EAAMG,KAAM6D,WAG5B+b,EAAUrd,EAAOgb,WAGjBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMnC,KACvBogB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAahD,EAAMG,KAAM6D,WAAc6C,IAC5D+Y,GACTG,EAAQb,YAAaW,EAAiBC,KAM1C,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAQxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAQ5D,QACxEyD,GAGuB,YAApBG,EAAQlC,SACZ9c,EAAY+e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAQvD,OAKjB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAQ5D,QAG1D,OAAO4D,EAAQzD,aAOjB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9EtF,EAAO0gB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCrG,EAAO+f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRlhB,EAASmhB,oBAAqB,mBAAoBD,GAClD/gB,EAAOghB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBpG,MAGRgD,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa5f,EAAU,CAAEoD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBld,EAASshB,YACa,YAAxBthB,EAASshB,aAA6BthB,EAAS+P,gBAAgBwR,SAGjEphB,EAAO+f,WAAY9c,EAAO4X,QAK1Bhb,EAASoQ,iBAAkB,mBAAoB8Q,GAG/C/gB,EAAOiQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAENhgB,EAAY8F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAG1C,KAAMqD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK/gB,KAAMuC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EAChBpa,EACAA,EAAM1G,KAAMqD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAMhD,OAAKkT,EACGvd,EAIH0d,EACGre,EAAG1C,KAAMqD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM5gB,UAAqC,IAAnB4gB,EAAM5gB,YAAsB4gB,EAAM5gB,UAMlE,SAAS6gB,IACRpiB,KAAK+F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOniB,KAAK+F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,SAAYoB,EAMxB/G,OAAOkiB,eAAgBH,EAAOniB,KAAK+F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQlO,KAAKkO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNnO,KAAKkO,MAAOiU,GAGZA,EAAOniB,KAAK+F,UAAaoc,EAAOniB,KAAK+F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElCnH,KAAK2D,IAAKwe,EAAOhU,IASzBnO,KAAKwiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOniB,KAAK+F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,cAAYD,SAEjBqc,EAAOniB,KAAK+F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOniB,KAAK+F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK9C,SAI/B,GAHA8D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOrE,KAAM,GACb0O,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKnO,KAAKsD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK9C,WAAmBqhB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRxE,QAAS,WAClBwE,EAAO2c,EAAW3c,EAAK/E,MAAO,IAC9B0iB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJnO,KAAKkE,KAAM,WACjB2e,EAASL,IAAKxiB,KAAMmO,KAIfiT,EAAQphB,KAAM,SAAUmH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDziB,KAAKkE,KAAM,WAGV2e,EAASL,IAAKxiB,KAAMmO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOnO,KAAKkE,KAAM,WACjB2e,EAASjF,OAAQ5d,KAAMmO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM3c,KAAM6hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAG1C,KAAM4D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOvd,KAAM,GAAK2B,QAGjBmE,IAAT2c,EACNziB,KACAA,KAAKkE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOvd,KAAM2B,EAAM8gB,GAGtCzf,EAAOygB,YAAazjB,KAAM2B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAAStjB,KAAM2B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO3B,KAAKkE,KAAM,WACjBlB,EAAOsgB,QAAStjB,KAAM2B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO3B,KAAKud,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAML,GACxB,IAAIqP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW9R,KACXmC,EAAInC,KAAKsD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXL,EAAMK,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAAStb,MAGxB,IAAIyiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB/P,EAAS+P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK9C,WAClByB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUtlB,MAAM,IAExB0lB,KAAM,WACL,OAAOJ,GAAUtlB,OAElB2lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQne,KAAKulB,OAASvlB,KAAK0lB,OAG5B1lB,KAAKkE,KAAM,WACZogB,GAAoBtkB,MACxBgD,EAAQhD,MAAOulB,OAEfviB,EAAQhD,MAAO0lB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADchmB,EAASomB,yBACRrjB,YAAa/C,EAAS0C,cAAe,SACpDsO,GAAQhR,EAAS0C,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBxP,EAAQ6kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBzP,EAAQ+kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBzP,EAAQglB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfrlB,EAAQglB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK9C,SAAW,CAAE8C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM/mB,KAAMsC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ3mB,KAAMyD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQzmB,KAAMyD,GAMlB,OAAOqjB,EAIR,IAAII,GAAiB,sBAErB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY5jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOzE,EAAS0V,cACf,MAAQ4S,KATQC,KAAqC,UAATxmB,GAY/C,SAASymB,GAAI/jB,EAAMgkB,EAAOplB,EAAUwf,EAAMtf,EAAImlB,GAC7C,IAAIC,EAAQ5mB,EAGZ,GAAsB,iBAAV0mB,EAAqB,CAShC,IAAM1mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEuiB,EACbD,GAAI/jB,EAAM1C,EAAMsB,EAAUwf,EAAM4F,EAAO1mB,GAAQ2mB,GAEhD,OAAOjkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK6kB,QACC,IAAM7kB,EACZ,OAAOkB,EAeR,OAZa,IAARikB,IACJC,EAASplB,GACTA,EAAK,SAAUqlB,GAId,OADAxlB,IAASylB,IAAKD,GACPD,EAAO5nB,MAAOX,KAAMsE,aAIzB8C,KAAOmhB,EAAOnhB,OAAUmhB,EAAOnhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAOwlB,MAAMhN,IAAKxb,KAAMqoB,EAAOllB,EAAIsf,EAAMxf,KA+a3C,SAASylB,GAAgBla,EAAI7M,EAAMsmB,GAG5BA,GAQNrF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU6Z,GAClB,IAAIG,EAAUpV,EACbqV,EAAQhG,EAASjf,IAAK3D,KAAM2B,GAE7B,GAAyB,EAAlB6mB,EAAMK,WAAmB7oB,KAAM2B,IAKrC,GAAMinB,EAAMtlB,QAuCEN,EAAOwlB,MAAMrJ,QAASxd,IAAU,IAAKmnB,cAClDN,EAAMO,uBArBN,GAdAH,EAAQtoB,EAAMG,KAAM6D,WACpBse,EAASJ,IAAKxiB,KAAM2B,EAAMinB,GAK1BD,EAAWV,EAAYjoB,KAAM2B,GAC7B3B,KAAM2B,KAEDinB,KADLrV,EAASqP,EAASjf,IAAK3D,KAAM2B,KACJgnB,EACxB/F,EAASJ,IAAKxiB,KAAM2B,GAAM,GAE1B4R,EAAS,GAELqV,IAAUrV,EAWd,OARAiV,EAAMQ,2BACNR,EAAMS,iBAOC1V,GAAUA,EAAOpM,WAefyhB,EAAMtlB,SAGjBsf,EAASJ,IAAKxiB,KAAM2B,EAAM,CACzBwF,MAAOnE,EAAOwlB,MAAMU,QAInBlmB,EAAOmC,OAAQyjB,EAAO,GAAK5lB,EAAOmmB,MAAM5lB,WACxCqlB,EAAMtoB,MAAO,GACbN,QAKFwoB,EAAMQ,qCA/E0BljB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAMomB,IA5a/B/kB,EAAOwlB,MAAQ,CAEdhpB,OAAQ,GAERgc,IAAK,SAAUnX,EAAMgkB,EAAO1Z,EAAS8T,EAAMxf,GAE1C,IAAImmB,EAAaC,EAAa1Y,EAC7B2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADAya,EAAcza,GACQA,QACtB1L,EAAWmmB,EAAYnmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfkiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASlpB,OAAOypB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUrd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAOwlB,MAAMuB,YAActd,EAAE9K,KACpEqB,EAAOwlB,MAAMwB,SAASrpB,MAAO0D,EAAMC,gBAAcwB,IAMpDyjB,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAEP5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,EAGjEwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1C6nB,EAAYxmB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNgoB,SAAUA,EACVlH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWia,EAAW7b,KAAM,MAC1Bub,IAGKK,EAAWH,EAAQ3nB,OAC1B8nB,EAAWH,EAAQ3nB,GAAS,IACnBuoB,cAAgB,EAGnB/K,EAAQgL,QACiD,IAA9DhL,EAAQgL,MAAM1pB,KAAM4D,EAAMoe,EAAMiH,EAAYL,IAEvChlB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM0nB,IAK3BlK,EAAQ3D,MACZ2D,EAAQ3D,IAAI/a,KAAM4D,EAAMmlB,GAElBA,EAAU7a,QAAQvH,OACvBoiB,EAAU7a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJwmB,EAASvkB,OAAQukB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS7oB,KAAM4oB,GAIhBxmB,EAAOwlB,MAAMhpB,OAAQmC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMgkB,EAAO1Z,EAAS1L,EAAUmnB,GAEjD,IAAIrlB,EAAGslB,EAAW1Z,EACjB2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMulB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAMP,GAJA5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAE1C8nB,EAAWH,EADX3nB,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAG9Dwc,EAAYtlB,EAAI0kB,EAASnmB,OACzB,MAAQyB,IACPykB,EAAYC,EAAU1kB,IAEfqlB,GAAeT,IAAaH,EAAUG,UACzChb,GAAWA,EAAQvH,OAASoiB,EAAUpiB,MACtCuJ,IAAOA,EAAIlD,KAAM+b,EAAU/Z,YAC3BxM,GAAYA,IAAaumB,EAAUvmB,WACxB,OAAbA,IAAqBumB,EAAUvmB,YAChCwmB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAUvmB,UACdwmB,EAASS,gBAEL/K,EAAQvB,QACZuB,EAAQvB,OAAOnd,KAAM4D,EAAMmlB,IAOzBa,IAAcZ,EAASnmB,SACrB6b,EAAQmL,WACkD,IAA/DnL,EAAQmL,SAAS7pB,KAAM4D,EAAMqlB,EAAYE,EAASE,SAElD9mB,EAAOunB,YAAalmB,EAAM1C,EAAMioB,EAASE,eAGnCR,EAAQ3nB,SA1Cf,IAAMA,KAAQ2nB,EACbtmB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,EAAO0mB,EAAOkB,GAAK5a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe6iB,IAC1B1G,EAAShF,OAAQvZ,EAAM,mBAIzB2lB,SAAU,SAAUQ,GAEnB,IAAIroB,EAAG4C,EAAGhB,EAAK4Q,EAAS6U,EAAWiB,EAClCjW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BklB,EAAQxlB,EAAOwlB,MAAMkC,IAAKF,GAE1Bf,GACC7G,EAASjf,IAAK3D,KAAM,WAAcI,OAAOypB,OAAQ,OAC/CrB,EAAM7mB,OAAU,GACnBwd,EAAUnc,EAAOwlB,MAAMrJ,QAASqJ,EAAM7mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMgU,EAENrmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAqmB,EAAMmC,eAAiB3qB,MAGlBmf,EAAQyL,cAA2D,IAA5CzL,EAAQyL,YAAYnqB,KAAMT,KAAMwoB,GAA5D,CAKAiC,EAAeznB,EAAOwlB,MAAMiB,SAAShpB,KAAMT,KAAMwoB,EAAOiB,GAGxDtnB,EAAI,EACJ,OAAUwS,EAAU8V,EAActoB,QAAYqmB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBnW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAUykB,EAAY7U,EAAQ8U,SAAU1kB,QACtCyjB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAU/Z,YACnC+Y,EAAMwC,WAAWvd,KAAM+b,EAAU/Z,aAEjC+Y,EAAMgB,UAAYA,EAClBhB,EAAM/F,KAAO+G,EAAU/G,UAKV3c,KAHb/B,IAAUf,EAAOwlB,MAAMrJ,QAASqK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU7a,SAAUhO,MAAOgU,EAAQtQ,KAAMmQ,MAGT,KAAzBgU,EAAMjV,OAASxP,KACrBykB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK5J,EAAQ8L,cACZ9L,EAAQ8L,aAAaxqB,KAAMT,KAAMwoB,GAG3BA,EAAMjV,SAGdkW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAItnB,EAAGqnB,EAAWvX,EAAKiZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBpb,EAAM0Z,EAAM/iB,OAGb,GAAKykB,GAIJpb,EAAIvN,YAOc,UAAfinB,EAAM7mB,MAAoC,GAAhB6mB,EAAMxS,QAEnC,KAAQlH,IAAQ9O,KAAM8O,EAAMA,EAAIlM,YAAc5C,KAI7C,GAAsB,IAAjB8O,EAAIvN,WAAoC,UAAfinB,EAAM7mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFA8e,EAAkB,GAClBC,EAAmB,GACbhpB,EAAI,EAAGA,EAAI+nB,EAAe/nB,SAME2D,IAA5BqlB,EAFLlZ,GAHAuX,EAAYC,EAAUtnB,IAGNc,SAAW,OAG1BkoB,EAAkBlZ,GAAQuX,EAAU1e,cACC,EAApC9H,EAAQiP,EAAKjS,MAAOsb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKjS,KAAM,KAAM,CAAE8O,IAAQxL,QAErC6nB,EAAkBlZ,IACtBiZ,EAAgBtqB,KAAM4oB,GAGnB0B,EAAgB5nB,QACpBmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUyB,IAY9C,OALApc,EAAM9O,KACDkqB,EAAgBT,EAASnmB,QAC7BmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUA,EAASnpB,MAAO4pB,KAGpDO,GAGRW,QAAS,SAAU/lB,EAAMgmB,GACxBjrB,OAAOkiB,eAAgBtf,EAAOmmB,MAAM5lB,UAAW8B,EAAM,CACpDimB,YAAY,EACZ/I,cAAc,EAEd5e,IAAKtC,EAAYgqB,GAChB,WACC,GAAKrrB,KAAKurB,cACT,OAAOF,EAAMrrB,KAAKurB,gBAGpB,WACC,GAAKvrB,KAAKurB,cACT,OAAOvrB,KAAKurB,cAAelmB,IAI9Bmd,IAAK,SAAUrb,GACd/G,OAAOkiB,eAAgBtiB,KAAMqF,EAAM,CAClCimB,YAAY,EACZ/I,cAAc,EACdiJ,UAAU,EACVrkB,MAAOA,QAMXujB,IAAK,SAAUa,GACd,OAAOA,EAAevoB,EAAO+C,SAC5BwlB,EACA,IAAIvoB,EAAOmmB,MAAOoC,IAGpBpM,QAAS,CACRsM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU1H,GAIhB,IAAIjU,EAAKxO,MAAQyiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAG1Bka,GAAgBla,EAAI,QAASuZ,KAIvB,GAERmB,QAAS,SAAUzG,GAIlB,IAAIjU,EAAKxO,MAAQyiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAE1Bka,GAAgBla,EAAI,UAId,GAKRkY,SAAU,SAAU8B,GACnB,IAAI/iB,EAAS+iB,EAAM/iB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOkmB,OAAStf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBmmB,aAAc,CACbX,aAAc,SAAUzC,QAID1iB,IAAjB0iB,EAAMjV,QAAwBiV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMjV,YAoG7CvQ,EAAOunB,YAAc,SAAUlmB,EAAM1C,EAAMmoB,GAGrCzlB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMmoB,IAIlC9mB,EAAOmmB,MAAQ,SAAUvnB,EAAKkqB,GAG7B,KAAQ9rB,gBAAgBgD,EAAOmmB,OAC9B,OAAO,IAAInmB,EAAOmmB,MAAOvnB,EAAKkqB,GAI1BlqB,GAAOA,EAAID,MACf3B,KAAKurB,cAAgB3pB,EACrB5B,KAAK2B,KAAOC,EAAID,KAIhB3B,KAAK+rB,mBAAqBnqB,EAAIoqB,uBACHlmB,IAAzBlE,EAAIoqB,mBAGgB,IAApBpqB,EAAIiqB,YACL9D,GACAC,GAKDhoB,KAAKyF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOlE,SACxCK,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELzF,KAAK8qB,cAAgBlpB,EAAIkpB,cACzB9qB,KAAKisB,cAAgBrqB,EAAIqqB,eAIzBjsB,KAAK2B,KAAOC,EAIRkqB,GACJ9oB,EAAOmC,OAAQnF,KAAM8rB,GAItB9rB,KAAKksB,UAAYtqB,GAAOA,EAAIsqB,WAAaxjB,KAAKyjB,MAG9CnsB,KAAMgD,EAAO+C,UAAY,GAK1B/C,EAAOmmB,MAAM5lB,UAAY,CACxBE,YAAaT,EAAOmmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAIxc,EAAIzM,KAAKurB,cAEbvrB,KAAK+rB,mBAAqBhE,GAErBtb,IAAMzM,KAAKosB,aACf3f,EAAEwc,kBAGJF,gBAAiB,WAChB,IAAItc,EAAIzM,KAAKurB,cAEbvrB,KAAK6qB,qBAAuB9C,GAEvBtb,IAAMzM,KAAKosB,aACf3f,EAAEsc,mBAGJC,yBAA0B,WACzB,IAAIvc,EAAIzM,KAAKurB,cAEbvrB,KAAK+qB,8BAAgChD,GAEhCtb,IAAMzM,KAAKosB,aACf3f,EAAEuc,2BAGHhpB,KAAK+oB,oBAKP/lB,EAAOkB,KAAM,CACZmoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRjrB,MAAM,EACNkrB,UAAU,EACV/e,KAAK,EACLgf,SAAS,EACTnX,QAAQ,EACRoX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,GACLhrB,EAAOwlB,MAAM4C,SAEhBpoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUtsB,EAAMmnB,GACpE9lB,EAAOwlB,MAAMrJ,QAASxd,GAAS,CAG9BwoB,MAAO,WAQN,OAHAzB,GAAgB1oB,KAAM2B,EAAMsmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB1oB,KAAM2B,IAGf,GAKR+kB,SAAU,WACT,OAAO,GAGRoC,aAAcA,KAYhB9lB,EAAOkB,KAAM,CACZgqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB1nB,EAAOwlB,MAAMrJ,QAASmP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAIzkB,EAEHwqB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTvuB,MAMgCgD,EAAOyF,SANvCzI,KAMyDuuB,MAClE/F,EAAM7mB,KAAO6nB,EAAUG,SACvB5lB,EAAMylB,EAAU7a,QAAQhO,MAAOX,KAAMsE,WACrCkkB,EAAM7mB,KAAO+oB,GAEP3mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBijB,GAAI,SAAUC,EAAOplB,EAAUwf,EAAMtf,GACpC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,IAEzCmlB,IAAK,SAAUD,EAAOplB,EAAUwf,EAAMtf,GACrC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,EAAI,IAE7CslB,IAAK,SAAUJ,EAAOplB,EAAUE,GAC/B,IAAIqmB,EAAW7nB,EACf,GAAK0mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClBxmB,EAAQqlB,EAAMsC,gBAAiBlC,IAC9Be,EAAU/Z,UACT+Z,EAAUG,SAAW,IAAMH,EAAU/Z,UACrC+Z,EAAUG,SACXH,EAAUvmB,SACVumB,EAAU7a,SAEJ3O,KAER,GAAsB,iBAAVqoB,EAAqB,CAGhC,IAAM1mB,KAAQ0mB,EACbroB,KAAKyoB,IAAK9mB,EAAMsB,EAAUolB,EAAO1mB,IAElC,OAAO3B,KAWR,OATkB,IAAbiD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK6kB,IAEChoB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAM5K,OAAQ5d,KAAMqoB,EAAOllB,EAAIF,QAMzC,IAKCurB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBtqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQza,SAAkBya,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASuqB,GAAevqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAASwqB,GAAexqB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKrB,MAAO,EAAG,GAClC+D,EAAK1C,KAAO0C,EAAK1C,KAAKrB,MAAO,GAE7B+D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAASyqB,GAAgBltB,EAAKmtB,GAC7B,IAAI5sB,EAAGiZ,EAAGzZ,EAAgBqtB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKxtB,SAAV,CAKA,GAAKqhB,EAASD,QAAS/gB,KAEtB0nB,EADW1G,EAASjf,IAAK/B,GACP0nB,QAKjB,IAAM3nB,KAFNihB,EAAShF,OAAQmR,EAAM,iBAETzF,EACb,IAAMnnB,EAAI,EAAGiZ,EAAIkO,EAAQ3nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAOwlB,MAAMhN,IAAKuT,EAAMptB,EAAM2nB,EAAQ3nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBotB,EAAWnM,EAASzB,OAAQxf,GAC5BqtB,EAAWjsB,EAAOmC,OAAQ,GAAI6pB,GAE9BnM,EAASL,IAAKuM,EAAME,KAkBtB,SAASC,GAAUC,EAAY3a,EAAMrQ,EAAUojB,GAG9C/S,EAAOjU,EAAMiU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAAS+H,EAAYntB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAI+T,EAAW7rB,OACf+rB,EAAWjU,EAAI,EACfjU,EAAQqN,EAAM,GACd8a,EAAkBjuB,EAAY8F,GAG/B,GAAKmoB,GACG,EAAJlU,GAA0B,iBAAVjU,IAChB/F,EAAQ6kB,YAAcwI,GAAShhB,KAAMtG,GACxC,OAAOgoB,EAAWjrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO0U,EAAW3qB,GAAI8W,GACrBgU,IACJ9a,EAAM,GAAMrN,EAAM1G,KAAMT,KAAMsb,EAAOb,EAAK8U,SAE3CL,GAAUzU,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM2a,EAAY,GAAIjiB,eAAe,EAAOiiB,EAAY5H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA6H,GADA/H,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYkH,KAC/BtrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMktB,IACVptB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BmtB,GAIJpsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAAS1D,KAAM0uB,EAAYhtB,GAAKF,EAAME,GAGvC,GAAKitB,EAOJ,IANAltB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAASwH,IAGf1sB,EAAI,EAAGA,EAAIitB,EAAYjtB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAOwsB,WAAavtB,EAAKH,UAC7BkB,EAAOwsB,SAAUvtB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAASwoB,GAAc,IAAMzsB,EAAMC,IAQnE,OAAOitB,EAGR,SAASvR,GAAQvZ,EAAMpB,EAAUwsB,GAKhC,IAJA,IAAIxtB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCstB,GAA8B,IAAlBxtB,EAAKV,UACtByB,EAAO0sB,UAAW/I,GAAQ1kB,IAGtBA,EAAKW,aACJ6sB,GAAYtL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU2H,GACxB,OAAOA,GAGR/pB,MAAO,SAAUnB,EAAMsrB,EAAeC,GACrC,IAAIztB,EAAGiZ,EAAGyU,EAAaC,EApINluB,EAAKmtB,EACnB1iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB6J,EAAS5L,GAAY9f,GAGtB,KAAMjD,EAAQ+kB,gBAAsC,IAAlB9hB,EAAK9C,UAAoC,KAAlB8C,EAAK9C,UAC3DyB,EAAO8W,SAAUzV,IAMnB,IAHAyrB,EAAenJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFbyU,EAAclJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLiuB,EAAa1tB,GAjJH4sB,EAiJQe,EAAc3tB,QAhJzCkK,EAGc,WAHdA,EAAW0iB,EAAK1iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDotB,EAAKpZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC0iB,EAAKnV,aAAehY,EAAIgY,cA6IxB,GAAK+V,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQtiB,GACrCyrB,EAAeA,GAAgBnJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAIyU,EAAYvsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C2sB,GAAgBe,EAAa1tB,GAAK2tB,EAAc3tB,SAGjD2sB,GAAgBzqB,EAAMmB,GAWxB,OAL2B,GAD3BsqB,EAAenJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAekJ,GAAeC,GAAUpJ,GAAQtiB,EAAM,WAIhDmB,GAGRkqB,UAAW,SAAU5rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAOwlB,MAAMrJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK6G,OACT,IAAM3nB,KAAQ8gB,EAAK6G,OACbnK,EAASxd,GACbqB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,GAI3BqB,EAAOunB,YAAalmB,EAAM1C,EAAM8gB,EAAKqH,QAOxCzlB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB6qB,OAAQ,SAAU/sB,GACjB,OAAO2a,GAAQ5d,KAAMiD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ5d,KAAMiD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMvC,MACbA,KAAK8V,QAAQ5R,KAAM,WACK,IAAlBlE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKsS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B2sB,OAAQ,WACP,OAAOf,GAAUlvB,KAAMsE,UAAW,SAAUD,GACpB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CotB,GAAoB3uB,KAAMqE,GAChC1B,YAAa0B,MAKvB6rB,QAAS,WACR,OAAOhB,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIkE,EAASkpB,GAAoB3uB,KAAMqE,GACvCoB,EAAO0qB,aAAc9rB,EAAMoB,EAAO8M,gBAKrC6d,OAAQ,WACP,OAAOlB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,SAKvCqwB,MAAO,WACN,OAAOnB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,KAAKiP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOrE,KAAMmC,IAAeA,IACd,IAAlBkC,EAAK9C,WAGTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOtS,MAGRwF,MAAO,SAAUmqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD5vB,KAAKoE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOxF,KAAM2vB,EAAeC,MAI5CL,KAAM,SAAUpoB,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,IAAI9C,EAAOrE,KAAM,IAAO,GACvBmC,EAAI,EACJiZ,EAAIpb,KAAKsD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK9C,SAChC,OAAO8C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBqnB,GAAa/gB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOrE,KAAMmC,IAAO,IAGVZ,WACTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJrE,KAAK8V,QAAQma,OAAQ9oB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BgtB,YAAa,WACZ,IAAI/I,EAAU,GAGd,OAAO2H,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,IAAI8P,EAASnU,KAAK4C,WAEbI,EAAO6D,QAAS7G,KAAMunB,GAAY,IACtCvkB,EAAO0sB,UAAW/I,GAAQ3mB,OACrBmU,GACJA,EAAOoc,aAAclsB,EAAMrE,QAK3BunB,MAILvkB,EAAOkB,KAAM,CACZssB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUtrB,EAAMurB,GAClB5tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACN8sB,EAAS7tB,EAAQC,GACjBwB,EAAOosB,EAAOvtB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOzE,KAAOA,KAAKwF,OAAO,GACxCxC,EAAQ6tB,EAAQ1uB,IAAOyuB,GAAY9sB,GAInClD,EAAKD,MAAOoD,EAAKD,EAAMH,OAGxB,OAAO3D,KAAK6D,UAAWE,MAGzB,IAAI+sB,GAAY,IAAI/mB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDgN,GAAY,SAAU1sB,GAKxB,IAAI2oB,EAAO3oB,EAAK6I,cAAc4C,YAM9B,OAJMkd,GAASA,EAAKgE,SACnBhE,EAAOjtB,GAGDitB,EAAKiE,iBAAkB5sB,IAG5B6sB,GAAO,SAAU7sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACR8rB,EAAM,GAGP,IAAM9rB,KAAQD,EACb+rB,EAAK9rB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAAS1D,KAAM4D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAAS8rB,EAAK9rB,GAG3B,OAAOtB,GAIJqtB,GAAY,IAAIrnB,OAAQma,GAAUrW,KAAM,KAAO,KAiJnD,SAASwjB,GAAQhtB,EAAMgB,EAAMisB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU1tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCA+M,EAAWA,GAAYP,GAAW1sB,MAQpB,MAFbN,EAAMutB,EAASI,iBAAkBrsB,IAAUisB,EAAUjsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBjE,EAAQuwB,kBAAoBb,GAAUrjB,KAAM1J,IAASqtB,GAAU3jB,KAAMpI,KAG1EksB,EAAQhN,EAAMgN,MACdC,EAAWjN,EAAMiN,SACjBC,EAAWlN,EAAMkN,SAGjBlN,EAAMiN,SAAWjN,EAAMkN,SAAWlN,EAAMgN,MAAQxtB,EAChDA,EAAMutB,EAASC,MAGfhN,EAAMgN,MAAQA,EACdhN,EAAMiN,SAAWA,EACjBjN,EAAMkN,SAAWA,SAIJ3rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS6tB,GAAcC,EAAaC,GAGnC,MAAO,CACNnuB,IAAK,WACJ,IAAKkuB,IASL,OAAS7xB,KAAK2D,IAAMmuB,GAASnxB,MAAOX,KAAMsE,kBALlCtE,KAAK2D,OA3MhB,WAIC,SAASouB,IAGR,GAAMnM,EAAN,CAIAoM,EAAUzN,MAAM0N,QAAU,+EAE1BrM,EAAIrB,MAAM0N,QACT,4HAGDtiB,GAAgBhN,YAAaqvB,GAAYrvB,YAAaijB,GAEtD,IAAIsM,EAAWnyB,EAAOkxB,iBAAkBrL,GACxCuM,EAAoC,OAAjBD,EAASniB,IAG5BqiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD1M,EAAIrB,MAAMgO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD3L,EAAIrB,MAAMmO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoBzM,EAAIgN,YAAc,GAEzDjjB,GAAgB9M,YAAamvB,GAI7BpM,EAAM,MAGP,SAASyM,EAAoBQ,GAC5B,OAAO7sB,KAAK8sB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYpyB,EAAS0C,cAAe,OACpCsjB,EAAMhmB,EAAS0C,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM0O,eAAiB,cAC3BrN,EAAIM,WAAW,GAAO3B,MAAM0O,eAAiB,GAC7C7xB,EAAQ8xB,gBAA+C,gBAA7BtN,EAAIrB,MAAM0O,eAEpCjwB,EAAOmC,OAAQ/D,EAAS,CACvB+xB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAYRY,qBAAsB,WACrB,IAAIC,EAAOhN,EAAIiN,EAASC,EAmCxB,OAlCgC,MAA3BV,IACJQ,EAAQ5zB,EAAS0C,cAAe,SAChCkkB,EAAK5mB,EAAS0C,cAAe,MAC7BmxB,EAAU7zB,EAAS0C,cAAe,OAElCkxB,EAAMjP,MAAM0N,QAAU,2DACtBzL,EAAGjC,MAAM0N,QAAU,mBAKnBzL,EAAGjC,MAAMoP,OAAS,MAClBF,EAAQlP,MAAMoP,OAAS,MAQvBF,EAAQlP,MAAMC,QAAU,QAExB7U,GACEhN,YAAa6wB,GACb7wB,YAAa6jB,GACb7jB,YAAa8wB,GAEfC,EAAU3zB,EAAOkxB,iBAAkBzK,GACnCwM,EAA4BY,SAAUF,EAAQC,OAAQ,IACrDC,SAAUF,EAAQG,eAAgB,IAClCD,SAAUF,EAAQI,kBAAmB,MAAWtN,EAAGuN,aAEpDpkB,GAAgB9M,YAAa2wB,IAEvBR,MAvIV,GAsNA,IAAIgB,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAar0B,EAAS0C,cAAe,OAAQiiB,MAC7C2P,GAAc,GAkBf,SAASC,GAAe9uB,GACvB,IAAI+uB,EAAQpxB,EAAOqxB,SAAUhvB,IAAU6uB,GAAa7uB,GAEpD,OAAK+uB,IAGA/uB,KAAQ4uB,GACL5uB,EAED6uB,GAAa7uB,GAxBrB,SAAyBA,GAGxB,IAAIivB,EAAUjvB,EAAM,GAAI0c,cAAgB1c,EAAK/E,MAAO,GACnD6B,EAAI6xB,GAAY1wB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO2uB,GAAa7xB,GAAMmyB,KACbL,GACZ,OAAO5uB,EAeoBkvB,CAAgBlvB,IAAUA,GAIxD,IAKCmvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAEhC,SAAU,WAAYiC,WAAY,SAAUnQ,QAAS,SACjEoQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBnwB,EAAOuC,EAAO6tB,GAIzC,IAAIhuB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKivB,IAAK,EAAGjuB,EAAS,IAAQguB,GAAY,KAAUhuB,EAAS,IAAO,MACpEG,EAGF,SAAS+tB,GAAoB7wB,EAAM8wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAIpzB,EAAkB,UAAdgzB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQlzB,EAAI,EAAGA,GAAK,EAGN,WAARizB,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM+wB,EAAMlR,GAAW/hB,IAAK,EAAMmzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,IAIjD,WAARF,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,MAtBvEG,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,GAGhD,YAARF,EACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,GAItEE,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASzvB,KAAKivB,IAAK,EAAGjvB,KAAK0vB,KAC1BrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEi1B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBtxB,EAAM8wB,EAAWK,GAG3C,IAAIF,EAASvE,GAAW1sB,GAKvBgxB,IADmBj0B,EAAQ+xB,qBAAuBqC,IAEE,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCM,EAAmBP,EAEnBjzB,EAAMivB,GAAQhtB,EAAM8wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,GAIzE,GAAKwwB,GAAUrjB,KAAMrL,GAAQ,CAC5B,IAAMozB,EACL,OAAOpzB,EAERA,EAAM,OAyCP,QAlCQhB,EAAQ+xB,qBAAuBkC,IAMrCj0B,EAAQmyB,wBAA0BlnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC2wB,WAAY3wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOixB,KAG1DjxB,EAAKyxB,iBAAiBxyB,SAEtB+xB,EAAiE,eAAnDryB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,IAKpDM,EAAmBC,KAAcxxB,KAEhCjC,EAAMiC,EAAMwxB,MAKdzzB,EAAM2wB,WAAY3wB,IAAS,GAI1B8yB,GACC7wB,EACA8wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAlzB,GAEE,KA+SL,SAAS2zB,GAAO1xB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GACzC,OAAO,IAAID,GAAMxyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GA7S5DhzB,EAAOmC,OAAQ,CAId8wB,SAAU,CACTC,QAAS,CACRvyB,IAAK,SAAUU,EAAMitB,GACpB,GAAKA,EAAW,CAGf,IAAIvtB,EAAMstB,GAAQhtB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACVgR,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV9P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOquB,GAGnC,GAAMnxB,GAA0B,IAAlBA,EAAK9C,UAAoC,IAAlB8C,EAAK9C,UAAmB8C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd6T,EAAWrV,EAAW3c,GACtBiyB,EAAe7C,GAAYhnB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM+S,IACLjyB,EAAO8uB,GAAekD,IAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,QAGrCvxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOmxB,IAEzBzxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB21B,IAC1BnwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWkS,GAAa,GAAK,OAI7Dj2B,EAAQ8xB,iBAA6B,KAAV/rB,GAAiD,IAAjC9B,EAAKxE,QAAS,gBAC9D0jB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOquB,MAE7B8B,EACJ/S,EAAMgT,YAAalyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMmwB,EAAOF,GACjC,IAAIlzB,EAAKwB,EAAK4f,EACb6T,EAAWrV,EAAW3c,GA6BvB,OA5BgBovB,GAAYhnB,KAAMpI,KAMjCA,EAAO8uB,GAAekD,KAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,KAGtC,QAAS7T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMmxB,SAIjB1vB,IAAR1D,IACJA,EAAMivB,GAAQhtB,EAAMgB,EAAMiwB,IAId,WAARlzB,GAAoBiD,KAAQuvB,KAChCxyB,EAAMwyB,GAAoBvvB,IAIZ,KAAVmwB,GAAgBA,GACpB5xB,EAAMmvB,WAAY3wB,IACD,IAAVozB,GAAkBgC,SAAU5zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI2tB,GACjDnyB,EAAOizB,SAAUd,GAAc,CAC9BxxB,IAAK,SAAUU,EAAMitB,EAAUkE,GAC9B,GAAKlE,EAIJ,OAAOkD,GAAa/mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKyxB,iBAAiBxyB,QAAWe,EAAKozB,wBAAwBlG,MAIjEoE,GAAkBtxB,EAAM8wB,EAAWK,GAHnCtE,GAAM7sB,EAAMqwB,GAAS,WACpB,OAAOiB,GAAkBtxB,EAAM8wB,EAAWK,MAM9ChT,IAAK,SAAUne,EAAM8C,EAAOquB,GAC3B,IAAIxuB,EACHsuB,EAASvE,GAAW1sB,GAIpBqzB,GAAsBt2B,EAAQkyB,iBACT,aAApBgC,EAAO5C,SAIR2C,GADkBqC,GAAsBlC,IAEY,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCN,EAAWQ,EACVN,GACC7wB,EACA8wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAYhvB,KAAK0vB,KAChBrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEyyB,WAAYuC,EAAQH,IACpBD,GAAoB7wB,EAAM8wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAchuB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO4Q,GAAchuB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM8wB,IAGpBJ,GAAmB1wB,EAAM8C,EAAO6tB,OAK1ChyB,EAAOizB,SAAS3D,WAAaV,GAAcxwB,EAAQiyB,mBAClD,SAAUhvB,EAAMitB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQhtB,EAAM,gBAClCA,EAAKozB,wBAAwBE,KAC5BzG,GAAM7sB,EAAM,CAAEiuB,WAAY,GAAK,WAC9B,OAAOjuB,EAAKozB,wBAAwBE,QAEnC,OAMP30B,EAAOkB,KAAM,CACZ0zB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBh1B,EAAOizB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU9wB,GAOjB,IANA,IAAIhF,EAAI,EACP+1B,EAAW,GAGXC,EAAyB,iBAAVhxB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd+1B,EAAUH,EAAS7T,GAAW/hB,GAAM61B,GACnCG,EAAOh2B,IAAOg2B,EAAOh2B,EAAI,IAAOg2B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ/0B,EAAOizB,SAAU8B,EAASC,GAASxV,IAAMuS,MAI3C/xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQphB,KAAM,SAAUqE,EAAMgB,EAAM8B,GAC1C,IAAImuB,EAAQxwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAiwB,EAASvE,GAAW1sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOmzB,GAGxD,OAAOlxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO+yB,MAAQA,IAETxyB,UAAY,CACjBE,YAAasyB,GACb3yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,EAAQ9Q,GACjDllB,KAAKqE,KAAOA,EACZrE,KAAK0iB,KAAOA,EACZ1iB,KAAKg2B,OAASA,GAAUhzB,EAAOgzB,OAAOtP,SACtC1mB,KAAKoF,QAAUA,EACfpF,KAAKkU,MAAQlU,KAAKmsB,IAAMnsB,KAAK8O,MAC7B9O,KAAKgF,IAAMA,EACXhF,KAAKklB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK3D,MACX+1B,GAAMqC,UAAU1R,SAAS/iB,IAAK3D,OAEhCq4B,IAAK,SAAUC,GACd,IAAIC,EACH/U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAoB/B,OAlBK1iB,KAAKoF,QAAQozB,SACjBx4B,KAAKy4B,IAAMF,EAAQv1B,EAAOgzB,OAAQh2B,KAAKg2B,QACtCsC,EAASt4B,KAAKoF,QAAQozB,SAAWF,EAAS,EAAG,EAAGt4B,KAAKoF,QAAQozB,UAG9Dx4B,KAAKy4B,IAAMF,EAAQD,EAEpBt4B,KAAKmsB,KAAQnsB,KAAKgF,IAAMhF,KAAKkU,OAAUqkB,EAAQv4B,KAAKkU,MAE/ClU,KAAKoF,QAAQszB,MACjB14B,KAAKoF,QAAQszB,KAAKj4B,KAAMT,KAAKqE,KAAMrE,KAAKmsB,IAAKnsB,MAGzCwjB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKxiB,MAEX+1B,GAAMqC,UAAU1R,SAASlE,IAAKxiB,MAExBA,QAIOoD,KAAKG,UAAYwyB,GAAMxyB,WAEvCwyB,GAAMqC,UAAY,CACjB1R,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK9C,UACa,MAA5BqjB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAC1B1f,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK9C,WACtByB,EAAOizB,SAAUrR,EAAMlC,OAC6B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO4P,GAAevP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,IAFjCnpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMuH,IAAMvH,EAAMM,UAU5C0T,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDrW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK9C,UAAYqjB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,OAKpCnpB,EAAOgzB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM/yB,KAAKizB,IAAKF,EAAI/yB,KAAKkzB,IAAO,GAExCxS,SAAU,SAGX1jB,EAAO21B,GAAK5C,GAAMxyB,UAAUH,KAG5BJ,EAAO21B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAmrBHxoB,GAEHyoB,GAprBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBx5B,EAAS65B,QAAoB15B,EAAO25B,sBACxC35B,EAAO25B,sBAAuBF,IAE9Bz5B,EAAO+f,WAAY0Z,GAAUx2B,EAAO21B,GAAGgB,UAGxC32B,EAAO21B,GAAGiB,QAKZ,SAASC,KAIR,OAHA95B,EAAO+f,WAAY,WAClBqZ,QAAQrzB,IAEAqzB,GAAQzwB,KAAKyjB,MAIvB,SAAS2N,GAAOn4B,EAAMo4B,GACrB,IAAI/L,EACH7rB,EAAI,EACJuM,EAAQ,CAAEilB,OAAQhyB,GAKnB,IADAo4B,EAAeA,EAAe,EAAI,EAC1B53B,EAAI,EAAGA,GAAK,EAAI43B,EAEvBrrB,EAAO,UADPsf,EAAQ9J,GAAW/hB,KACSuM,EAAO,UAAYsf,GAAUrsB,EAO1D,OAJKo4B,IACJrrB,EAAMwnB,QAAUxnB,EAAM6iB,MAAQ5vB,GAGxB+M,EAGR,SAASsrB,GAAa7yB,EAAOub,EAAMuX,GAKlC,IAJA,IAAIrV,EACHuK,GAAe+K,GAAUC,SAAUzX,IAAU,IAAKhiB,OAAQw5B,GAAUC,SAAU,MAC9E7e,EAAQ,EACRhY,EAAS6rB,EAAW7rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQuK,EAAY7T,GAAQ7a,KAAMw5B,EAAWvX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASsV,GAAW71B,EAAM+1B,EAAYh1B,GACrC,IAAImO,EACH8mB,EACA/e,EAAQ,EACRhY,EAAS42B,GAAUI,WAAWh3B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bwb,EAAKv1B,OAEbu1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B3Z,EAAYla,KAAKivB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHpY,EAAY+Z,EAAUzB,UAAY,GAEzCld,EAAQ,EACRhY,EAAS22B,EAAUQ,OAAOn3B,OAEnBgY,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAKC,GAMhC,OAHAja,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW3B,EAASpY,IAG5CoY,EAAU,GAAKh1B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAI5C5b,EAASmB,YAAanb,EAAM,CAAE41B,KACvB,IAERA,EAAY5b,EAASzB,QAAS,CAC7BvY,KAAMA,EACNynB,MAAO9oB,EAAOmC,OAAQ,GAAIi1B,GAC1BM,KAAM13B,EAAOmC,QAAQ,EAAM,CAC1Bw1B,cAAe,GACf3E,OAAQhzB,EAAOgzB,OAAOtP,UACpBthB,GACHw1B,mBAAoBR,EACpBS,gBAAiBz1B,EACjBo1B,UAAWrB,IAASU,KACpBrB,SAAUpzB,EAAQozB,SAClBiC,OAAQ,GACRT,YAAa,SAAUtX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO+yB,MAAO1xB,EAAM41B,EAAUS,KAAMhY,EAAM1d,EACrDi1B,EAAUS,KAAKC,cAAejY,IAAUuX,EAAUS,KAAK1E,QAExD,OADAiE,EAAUQ,OAAO75B,KAAMgkB,GAChBA,GAERlB,KAAM,SAAUoX,GACf,IAAIxf,EAAQ,EAIXhY,EAASw3B,EAAUb,EAAUQ,OAAOn3B,OAAS,EAC9C,GAAK+2B,EACJ,OAAOr6B,KAGR,IADAq6B,GAAU,EACF/e,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAK,GAUhC,OANKyC,GACJzc,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAC3C5b,EAASmB,YAAanb,EAAM,CAAE41B,EAAWa,KAEzCzc,EAASuB,WAAYvb,EAAM,CAAE41B,EAAWa,IAElC96B,QAGT8rB,EAAQmO,EAAUnO,MAInB,KA/HD,SAAqBA,EAAO6O,GAC3B,IAAIrf,EAAOjW,EAAM2wB,EAAQ7uB,EAAOqc,EAGhC,IAAMlI,KAASwQ,EAed,GAbAkK,EAAS2E,EADTt1B,EAAO2c,EAAW1G,IAElBnU,EAAQ2kB,EAAOxQ,GACV1V,MAAMC,QAASsB,KACnB6uB,EAAS7uB,EAAO,GAChBA,EAAQ2kB,EAAOxQ,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACdymB,EAAOzmB,GAAS8B,SACT2kB,EAAOxQ,KAGfkI,EAAQxgB,EAAOizB,SAAU5wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMyU,OAAQ9wB,UACf2kB,EAAOzmB,GAIC8B,EACNmU,KAASwQ,IAChBA,EAAOxQ,GAAUnU,EAAOmU,GACxBqf,EAAerf,GAAU0a,QAI3B2E,EAAet1B,GAAS2wB,EA6F1B+E,CAAYjP,EAAOmO,EAAUS,KAAKC,eAE1Brf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS2mB,GAAUI,WAAYhf,GAAQ7a,KAAMw5B,EAAW51B,EAAMynB,EAAOmO,EAAUS,MAM9E,OAJKr5B,EAAYkS,EAAOmQ,QACvB1gB,EAAOygB,YAAawW,EAAU51B,KAAM41B,EAAUS,KAAKnd,OAAQmG,KAC1DnQ,EAAOmQ,KAAKsX,KAAMznB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK0nB,EAAOkO,GAAaC,GAE3B54B,EAAY44B,EAAUS,KAAKxmB,QAC/B+lB,EAAUS,KAAKxmB,MAAMzT,KAAM4D,EAAM41B,GAIlCA,EACErb,SAAUqb,EAAUS,KAAK9b,UACzB/V,KAAMoxB,EAAUS,KAAK7xB,KAAMoxB,EAAUS,KAAKO,UAC1Cpe,KAAMod,EAAUS,KAAK7d,MACrBuB,OAAQ6b,EAAUS,KAAKtc,QAEzBpb,EAAO21B,GAAGuC,MACTl4B,EAAOmC,OAAQy0B,EAAM,CACpBv1B,KAAMA,EACN82B,KAAMlB,EACN1c,MAAO0c,EAAUS,KAAKnd,SAIjB0c,EAGRj3B,EAAOk3B,UAAYl3B,EAAOmC,OAAQ+0B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAU1Y,EAAMvb,GACtB,IAAIyd,EAAQ5kB,KAAKg6B,YAAatX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITyW,QAAS,SAAUvP,EAAO3nB,GACpB9C,EAAYyqB,IAChB3nB,EAAW2nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMhf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAASwoB,EAAMxoB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOoJ,EAAOxQ,GACd4e,GAAUC,SAAUzX,GAASwX,GAAUC,SAAUzX,IAAU,GAC3DwX,GAAUC,SAAUzX,GAAO9Q,QAASzN,IAItCm2B,WAAY,CA3Wb,SAA2Bj2B,EAAMynB,EAAO4O,GACvC,IAAIhY,EAAMvb,EAAOwe,EAAQnC,EAAO8X,EAASC,EAAWC,EAAgBhX,EACnEiX,EAAQ,UAAW3P,GAAS,WAAYA,EACxCqP,EAAOn7B,KACPsuB,EAAO,GACP/J,EAAQlgB,EAAKkgB,MACbkV,EAASp1B,EAAK9C,UAAY+iB,GAAoBjgB,GAC9Cq3B,EAAW9Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BAgY,EAAKnd,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBs3B,WACVnY,EAAMmY,SAAW,EACjBL,EAAU9X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMmY,UACXL,MAIH9X,EAAMmY,WAENR,EAAK/c,OAAQ,WAGZ+c,EAAK/c,OAAQ,WACZoF,EAAMmY,WACA34B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFqO,EAEb,GADA3kB,EAAQ2kB,EAAOpJ,GACV4W,GAAS7rB,KAAMtG,GAAU,CAG7B,UAFO2kB,EAAOpJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYsyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVtyB,IAAoBu0B,QAAiC51B,IAArB41B,EAAUhZ,GAK9C,SAJA+W,GAAS,EAOXnL,EAAM5L,GAASgZ,GAAYA,EAAUhZ,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA6Y,GAAav4B,EAAOyD,cAAeqlB,MAChB9oB,EAAOyD,cAAe6nB,GA8DzC,IAAM5L,KAzDD+Y,GAA2B,IAAlBp3B,EAAK9C,WAMlBm5B,EAAKkB,SAAW,CAAErX,EAAMqX,SAAUrX,EAAMsX,UAAWtX,EAAMuX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASlX,WAErCgX,EAAiB5Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBm3B,EACJhX,EAAUgX,GAIVlW,GAAU,CAAEjhB,IAAQ,GACpBm3B,EAAiBn3B,EAAKkgB,MAAMC,SAAWgX,EACvChX,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlBgX,IACrB,SAAhCx4B,EAAOyhB,IAAKpgB,EAAM,WAGhBk3B,IACLJ,EAAKtyB,KAAM,WACV0b,EAAMC,QAAUgX,IAEM,MAAlBA,IACJhX,EAAUD,EAAMC,QAChBgX,EAA6B,SAAZhX,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdkW,EAAKkB,WACTrX,EAAMqX,SAAW,SACjBT,EAAK/c,OAAQ,WACZmG,EAAMqX,SAAWlB,EAAKkB,SAAU,GAChCrX,EAAMsX,UAAYnB,EAAKkB,SAAU,GACjCrX,EAAMuX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACEjN,EAGPiN,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW9Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAASgX,IAInD7V,IACJ+V,EAASjC,QAAUA,GAIfA,GACJnU,GAAU,CAAEjhB,IAAQ,GAKrB82B,EAAKtyB,KAAM,WASV,IAAM6Z,KAJA+W,GACLnU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTiqB,EACbtrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM4L,EAAM5L,OAMnC6Y,EAAYvB,GAAaP,EAASiC,EAAUhZ,GAAS,EAAGA,EAAMyY,GACtDzY,KAAQgZ,IACfA,EAAUhZ,GAAS6Y,EAAUrnB,MACxBulB,IACJ8B,EAAUv2B,IAAMu2B,EAAUrnB,MAC1BqnB,EAAUrnB,MAAQ,MAuMrB6nB,UAAW,SAAU53B,EAAU+rB,GACzBA,EACJgK,GAAUI,WAAW1oB,QAASzN,GAE9B+1B,GAAUI,WAAW15B,KAAMuD,MAK9BnB,EAAOg5B,MAAQ,SAAUA,EAAOhG,EAAQ7yB,GACvC,IAAIk2B,EAAM2C,GAA0B,iBAAVA,EAAqBh5B,EAAOmC,OAAQ,GAAI62B,GAAU,CAC3Ef,SAAU93B,IAAOA,GAAM6yB,GACtB30B,EAAY26B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ7yB,GAAM6yB,GAAUA,IAAW30B,EAAY20B,IAAYA,GAoC5D,OAhCKhzB,EAAO21B,GAAGlQ,IACd4Q,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYx1B,EAAO21B,GAAGsD,OAC9B5C,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAOvV,UAMjB,MAAb2S,EAAI9b,QAA+B,IAAd8b,EAAI9b,QAC7B8b,EAAI9b,MAAQ,MAIb8b,EAAIlI,IAAMkI,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT55B,EAAYg4B,EAAIlI,MACpBkI,EAAIlI,IAAI1wB,KAAMT,MAGVq5B,EAAI9b,OACRva,EAAOsgB,QAAStjB,KAAMq5B,EAAI9b,QAIrB8b,GAGRr2B,EAAOG,GAAGgC,OAAQ,CACjB+2B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ7xB,GAGpC,OAAOnE,KAAKsQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMo3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ7xB,IAElDi4B,QAAS,SAAU1Z,EAAMsZ,EAAOhG,EAAQ7xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC2Z,EAASr5B,EAAOg5B,MAAOA,EAAOhG,EAAQ7xB,GACtCm4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWl6B,KAAMgD,EAAOmC,OAAQ,GAAIud,GAAQ2Z,IAGlDvmB,GAAS8M,EAASjf,IAAK3D,KAAM,YACjCm7B,EAAKzX,MAAM,IAMd,OAFA4Y,EAAYC,OAASD,EAEdxmB,IAA0B,IAAjBumB,EAAO9e,MACtBvd,KAAKkE,KAAMo4B,GACXt8B,KAAKud,MAAO8e,EAAO9e,MAAO+e,IAE5B5Y,KAAM,SAAU/hB,EAAMiiB,EAAYkX,GACjC,IAAI0B,EAAY,SAAUhZ,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMoX,IAYP,MATqB,iBAATn5B,IACXm5B,EAAUlX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ5jB,KAAKud,MAAO5b,GAAQ,KAAM,IAGpB3B,KAAKkE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B86B,EAASz5B,EAAOy5B,OAChBha,EAAOG,EAASjf,IAAK3D,MAEtB,GAAKsb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC8Y,EAAW/Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ6V,GAAK9rB,KAAM6N,IACtDkhB,EAAW/Z,EAAMnH,IAKpB,IAAMA,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MACnB,MAAR2B,GAAgB86B,EAAQnhB,GAAQiC,QAAU5b,IAE5C86B,EAAQnhB,GAAQ6f,KAAKzX,KAAMoX,GAC3BxX,GAAU,EACVmZ,EAAOv3B,OAAQoW,EAAO,KAOnBgI,GAAYwX,GAChB93B,EAAOsgB,QAAStjB,KAAM2B,MAIzB46B,OAAQ,SAAU56B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET3B,KAAKkE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK3D,MACrBud,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB86B,EAASz5B,EAAOy5B,OAChBn5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK8Z,QAAS,EAGdv5B,EAAOua,MAAOvd,KAAM2B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKjjB,KAAMT,MAAM,GAIlBsb,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MAAQy8B,EAAQnhB,GAAQiC,QAAU5b,IAC/D86B,EAAQnhB,GAAQ6f,KAAKzX,MAAM,GAC3B+Y,EAAOv3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQihB,QACrChf,EAAOjC,GAAQihB,OAAO97B,KAAMT,aAKvByiB,EAAK8Z,YAKfv5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIq3B,EAAQ15B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAgB,MAAT63B,GAAkC,kBAAVA,EAC9BU,EAAM/7B,MAAOX,KAAMsE,WACnBtE,KAAKo8B,QAAStC,GAAOz0B,GAAM,GAAQ22B,EAAOhG,EAAQ7xB,MAKrDnB,EAAOkB,KAAM,CACZy4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU7wB,EAAMymB,GAClB9oB,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAOnE,KAAKo8B,QAAStQ,EAAOkQ,EAAOhG,EAAQ7xB,MAI7CnB,EAAOy5B,OAAS,GAChBz5B,EAAO21B,GAAGiB,KAAO,WAChB,IAAIsB,EACH/4B,EAAI,EACJs6B,EAASz5B,EAAOy5B,OAIjB,IAFAtD,GAAQzwB,KAAKyjB,MAELhqB,EAAIs6B,EAAOn5B,OAAQnB,KAC1B+4B,EAAQuB,EAAQt6B,OAGCs6B,EAAQt6B,KAAQ+4B,GAChCuB,EAAOv3B,OAAQ/C,IAAK,GAIhBs6B,EAAOn5B,QACZN,EAAO21B,GAAGjV,OAEXyV,QAAQrzB,GAGT9C,EAAO21B,GAAGuC,MAAQ,SAAUA,GAC3Bl4B,EAAOy5B,OAAO77B,KAAMs6B,GACpBl4B,EAAO21B,GAAGzkB,SAGXlR,EAAO21B,GAAGgB,SAAW,GACrB32B,EAAO21B,GAAGzkB,MAAQ,WACZklB,KAILA,IAAa,EACbI,OAGDx2B,EAAO21B,GAAGjV,KAAO,WAChB0V,GAAa,MAGdp2B,EAAO21B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNxW,SAAU,KAMX1jB,EAAOG,GAAGg6B,MAAQ,SAAUC,EAAMz7B,GAIjC,OAHAy7B,EAAOp6B,EAAO21B,IAAK31B,EAAO21B,GAAGsD,OAAQmB,IAAiBA,EACtDz7B,EAAOA,GAAQ,KAER3B,KAAKud,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI6Z,EAAUt9B,EAAO+f,WAAYvT,EAAM6wB,GACvC5Z,EAAME,KAAO,WACZ3jB,EAAOu9B,aAAcD,OAOnBzsB,GAAQhR,EAAS0C,cAAe,SAEnC+2B,GADSz5B,EAAS0C,cAAe,UACpBK,YAAa/C,EAAS0C,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbP,EAAQm8B,QAA0B,KAAhB3sB,GAAMzJ,MAIxB/F,EAAQo8B,YAAcnE,GAAIzjB,UAI1BhF,GAAQhR,EAAS0C,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbP,EAAQq8B,WAA6B,MAAhB7sB,GAAMzJ,MAI5B,IAAIu2B,GACH9uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dq6B,WAAY,SAAUt4B,GACrB,OAAOrF,KAAKkE,KAAM,WACjBlB,EAAO26B,WAAY39B,KAAMqF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBv5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVy2B,GAAgB56B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO66B,UAAWx4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASq4B,QAAW53B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO26B,WAAYt5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC85B,UAAW,CACVl8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM/F,EAAQq8B,YAAwB,UAAVt2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXw2B,WAAY,SAAUt5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ27B,EAAY32B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK4hB,GAA+B,IAAlBz5B,EAAK9C,SACtB,MAAU8D,EAAOy4B,EAAW37B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bq4B,GAAW,CACVlb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO26B,WAAYt5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAI04B,EAASnvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAK+lB,EACRkU,EAAgB34B,EAAKoC,cAYtB,OAVMI,IAGLiiB,EAASlb,GAAYovB,GACrBpvB,GAAYovB,GAAkBj6B,EAC9BA,EAAqC,MAA/Bg6B,EAAQ15B,EAAMgB,EAAMwC,GACzBm2B,EACA,KACDpvB,GAAYovB,GAAkBlU,GAExB/lB,KAOT,IAAIk6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkBh3B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASuwB,GAAU/5B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS67B,GAAgBl3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dg7B,WAAY,SAAUj5B,GACrB,OAAOrF,KAAKkE,KAAM,kBACVlE,KAAMgD,EAAOu7B,QAASl5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB56B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOu7B,QAASl5B,IAAUA,EACjCme,EAAQxgB,EAAOo1B,UAAW/yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd+yB,UAAW,CACV3iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIm6B,EAAWx7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKm6B,EACG5K,SAAU4K,EAAU,IAI3BP,GAAWxwB,KAAMpJ,EAAKgI,WACtB6xB,GAAWzwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX+oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLt9B,EAAQo8B,cACbx6B,EAAOo1B,UAAUxiB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOu7B,QAASv+B,KAAKyH,eAAkBzH,OA4BxCgD,EAAOG,GAAGgC,OAAQ,CACjBw5B,SAAU,SAAUx3B,GACnB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAO2+B,SAAUx3B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAM1D,IAFA4+B,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAItB,GAHA08B,EAAWT,GAAU/5B,GACrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KACrB+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAAQ,IACvChwB,GAAOgwB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRg/B,YAAa,SAAU73B,GACtB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAOg/B,YAAa73B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAI7D,IAAMsE,UAAUhB,OACf,OAAOtD,KAAK+R,KAAM,QAAS,IAK5B,IAFA6sB,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAMtB,GALA08B,EAAWT,GAAU/5B,GAGrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KAG1B,OAA4C,EAApC+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAClChwB,EAAMA,EAAI5I,QAAS,IAAM44B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRi/B,YAAa,SAAU93B,EAAO+3B,GAC7B,IAAIv9B,SAAcwF,EACjBg4B,EAAwB,WAATx9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb+3B,GAA0BC,EAC9BD,EAAWl/B,KAAK2+B,SAAUx3B,GAAUnH,KAAKg/B,YAAa73B,GAGzD9F,EAAY8F,GACTnH,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOi/B,YACd93B,EAAM1G,KAAMT,KAAMmC,EAAGi8B,GAAUp+B,MAAQk/B,GACvCA,KAKIl/B,KAAKkE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM2kB,EAExB,GAAKD,EAAe,CAGnBh9B,EAAI,EACJsY,EAAOzX,EAAQhD,MACfo/B,EAAaf,GAAgBl3B,GAE7B,MAAU+I,EAAYkvB,EAAYj9B,KAG5BsY,EAAK4kB,SAAUnvB,GACnBuK,EAAKukB,YAAa9uB,GAElBuK,EAAKkkB,SAAUzuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYkuB,GAAUp+B,QAIrB4iB,EAASJ,IAAKxiB,KAAM,gBAAiBkQ,GAOjClQ,KAAKyC,cACTzC,KAAKyC,aAAc,QAClByN,IAAuB,IAAV/I,EACZ,GACAyb,EAASjf,IAAK3D,KAAM,kBAAqB,QAO/Cq/B,SAAU,SAAUp8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOrE,KAAMmC,KACtB,GAAuB,IAAlBkC,EAAK9C,WACoE,GAA3E,IAAM48B,GAAkBC,GAAU/5B,IAAW,KAAMxD,QAASqP,GAC9D,OAAO,EAIT,OAAO,KAOT,IAAIovB,GAAU,MAEdt8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKurB,EACfjrB,EAAOrE,KAAM,GAEd,OAAMsE,UAAUhB,QA0BhBgsB,EAAkBjuB,EAAY8F,GAEvBnH,KAAKkE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBpC,KAAKuB,WAWE,OANXa,EADIktB,EACEnoB,EAAM1G,KAAMT,KAAMmC,EAAGa,EAAQhD,MAAOoC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOu8B,SAAUv/B,KAAK2B,OAAUqB,EAAOu8B,SAAUv/B,KAAKqM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKxiB,KAAMoC,EAAK,WAC3DpC,KAAKmH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOu8B,SAAUl7B,EAAK1C,OAC7BqB,EAAOu8B,SAAUl7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASo5B,GAAS,IAIhB,MAAPv7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdo6B,SAAU,CACTnZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA+7B,GAAkBn7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACbyS,EAAoB,eAAdjkB,EAAK1C,KACX6jB,EAAS8C,EAAM,KAAO,GACtB2M,EAAM3M,EAAMhN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR2Z,EAGA3M,EAAMhN,EAAQ,EAIXnZ,EAAI8yB,EAAK9yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBkmB,EACJ,OAAOnhB,EAIRqe,EAAO5kB,KAAMuG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIq4B,EAAWpZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOu8B,SAASnZ,OAAOziB,IAAKyiB,GAAUZ,MAEtDga,GAAY,GAUd,OAHMA,IACLn7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOu8B,SAAUv/B,MAAS,CACzBwiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D/F,EAAQm8B,UACbv6B,EAAOu8B,SAAUv/B,MAAO2D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D/F,EAAQq+B,QAAU,cAAe1/B,EAGjC,IAAI2/B,GAAc,kCACjBC,GAA0B,SAAUlzB,GACnCA,EAAEsc,mBAGJ/lB,EAAOmC,OAAQnC,EAAOwlB,MAAO,CAE5BU,QAAS,SAAUV,EAAO/F,EAAMpe,EAAMu7B,GAErC,IAAIz9B,EAAG2M,EAAK6B,EAAKkvB,EAAYC,EAAQhW,EAAQ3K,EAAS4gB,EACrDC,EAAY,CAAE37B,GAAQzE,GACtB+B,EAAOX,EAAOP,KAAM+nB,EAAO,QAAWA,EAAM7mB,KAAO6mB,EACnDkB,EAAa1oB,EAAOP,KAAM+nB,EAAO,aAAgBA,EAAM/Y,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMixB,EAAcpvB,EAAMtM,EAAOA,GAAQzE,EAGlB,IAAlByE,EAAK9C,UAAoC,IAAlB8C,EAAK9C,WAK5Bm+B,GAAYjyB,KAAM9L,EAAOqB,EAAOwlB,MAAMuB,cAIf,EAAvBpoB,EAAKd,QAAS,OAIlBc,GADA+nB,EAAa/nB,EAAK4F,MAAO,MACP8G,QAClBqb,EAAWzkB,QAEZ66B,EAASn+B,EAAKd,QAAS,KAAQ,GAAK,KAAOc,GAG3C6mB,EAAQA,EAAOxlB,EAAO+C,SACrByiB,EACA,IAAIxlB,EAAOmmB,MAAOxnB,EAAuB,iBAAV6mB,GAAsBA,IAGhDK,UAAY+W,EAAe,EAAI,EACrCpX,EAAM/Y,UAAYia,EAAW7b,KAAM,KACnC2a,EAAMwC,WAAaxC,EAAM/Y,UACxB,IAAI1F,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAC7D,KAGD2a,EAAMjV,YAASzN,EACT0iB,EAAM/iB,SACX+iB,EAAM/iB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAE+F,GACFxlB,EAAO2D,UAAW8b,EAAM,CAAE+F,IAG3BrJ,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GACpCi+B,IAAgBzgB,EAAQ+J,UAAmD,IAAxC/J,EAAQ+J,QAAQvoB,MAAO0D,EAAMoe,IAAtE,CAMA,IAAMmd,IAAiBzgB,EAAQuM,WAAajqB,EAAU4C,GAAS,CAM9D,IAJAw7B,EAAa1gB,EAAQ2J,cAAgBnnB,EAC/B+9B,GAAYjyB,KAAMoyB,EAAal+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBo9B,EAAUp/B,KAAMkO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBtN,IACpCogC,EAAUp/B,KAAM+P,EAAIb,aAAea,EAAIsvB,cAAgBlgC,GAKzDoC,EAAI,EACJ,OAAU2M,EAAMkxB,EAAW79B,QAAYqmB,EAAMqC,uBAC5CkV,EAAcjxB,EACd0Z,EAAM7mB,KAAW,EAAJQ,EACZ09B,EACA1gB,EAAQ8K,UAAYtoB,GAGrBmoB,GAAWlH,EAASjf,IAAKmL,EAAK,WAAc1O,OAAOypB,OAAQ,OAAUrB,EAAM7mB,OAC1EihB,EAASjf,IAAKmL,EAAK,YAEnBgb,EAAOnpB,MAAOmO,EAAK2T,IAIpBqH,EAASgW,GAAUhxB,EAAKgxB,KACThW,EAAOnpB,OAASuhB,EAAYpT,KAC1C0Z,EAAMjV,OAASuW,EAAOnpB,MAAOmO,EAAK2T,IACZ,IAAjB+F,EAAMjV,QACViV,EAAMS,kBA8CT,OA1CAT,EAAM7mB,KAAOA,EAGPi+B,GAAiBpX,EAAMuD,sBAEpB5M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS/lB,MAAOq/B,EAAU12B,MAAOmZ,KACzCP,EAAY7d,IAIPy7B,GAAUz+B,EAAYgD,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMy7B,MAGXz7B,EAAMy7B,GAAW,MAIlB98B,EAAOwlB,MAAMuB,UAAYpoB,EAEpB6mB,EAAMqC,wBACVkV,EAAY/vB,iBAAkBrO,EAAMg+B,IAGrCt7B,EAAM1C,KAED6mB,EAAMqC,wBACVkV,EAAYhf,oBAAqBpf,EAAMg+B,IAGxC38B,EAAOwlB,MAAMuB,eAAYjkB,EAEpB6K,IACJtM,EAAMy7B,GAAWnvB,IAMd6X,EAAMjV,SAKd2sB,SAAU,SAAUv+B,EAAM0C,EAAMmkB,GAC/B,IAAI/b,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOmmB,MACXX,EACA,CACC7mB,KAAMA,EACNyqB,aAAa,IAIfppB,EAAOwlB,MAAMU,QAASzc,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjB+jB,QAAS,SAAUvnB,EAAM8gB,GACxB,OAAOziB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMziB,SAGpCmgC,eAAgB,SAAUx+B,EAAM8gB,GAC/B,IAAIpe,EAAOrE,KAAM,GACjB,GAAKqE,EACJ,OAAOrB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMpe,GAAM,MAc5CjD,EAAQq+B,SACbz8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAI/b,EAAU,SAAU6Z,GACvBxlB,EAAOwlB,MAAM0X,SAAUxV,EAAKlC,EAAM/iB,OAAQzC,EAAOwlB,MAAMkC,IAAKlC,KAG7DxlB,EAAOwlB,MAAMrJ,QAASuL,GAAQ,CAC7BP,MAAO,WAIN,IAAIjoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAE5B0V,GACLl+B,EAAI8N,iBAAkBse,EAAM3f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAKwoB,GAAO0V,GAAY,GAAM,IAEhD9V,SAAU,WACT,IAAIpoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAAQ,EAEpC0V,EAKLxd,EAASxB,OAAQlf,EAAKwoB,EAAK0V,IAJ3Bl+B,EAAI6e,oBAAqBuN,EAAM3f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAKwoB,QAS3B,IAAIvV,GAAWpV,EAAOoV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAKyjB,OAErBkU,GAAS,KAKbr9B,EAAOs9B,SAAW,SAAU7d,GAC3B,IAAI3O,EAAKysB,EACT,IAAM9d,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM/T,EAAOygC,WAAcC,gBAAiBhe,EAAM,YACvD,MAAQhW,IAYV,OAVA8zB,EAAkBzsB,GAAOA,EAAIxG,qBAAsB,eAAiB,GAC9DwG,IAAOysB,GACZv9B,EAAOoD,MAAO,iBACbm6B,EACCv9B,EAAOoB,IAAKm8B,EAAgB/zB,WAAY,SAAUgC,GACjD,OAAOA,EAAG8D,cACPzE,KAAM,MACV4U,IAGI3O,GAIR,IACC4sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa/I,EAAQz2B,EAAKy/B,EAAavlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAASvE,GAGnB0B,EAAOkB,KAAM5C,EAAK,SAAUa,EAAGia,GACzB2kB,GAAeL,GAASjzB,KAAMsqB,GAGlCvc,EAAKuc,EAAQ3b,GAKb0kB,GACC/I,EAAS,KAAqB,iBAAN3b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACA2kB,EACAvlB,UAKG,GAAMulB,GAAiC,WAAlBj+B,EAAQxB,GAUnCka,EAAKuc,EAAQz2B,QAPb,IAAM+D,KAAQ/D,EACbw/B,GAAa/I,EAAS,IAAM1yB,EAAO,IAAK/D,EAAK+D,GAAQ07B,EAAavlB,GAYrExY,EAAOg+B,MAAQ,SAAU53B,EAAG23B,GAC3B,IAAIhJ,EACHkJ,EAAI,GACJzlB,EAAM,SAAUrN,EAAK+yB,GAGpB,IAAI/5B,EAAQ9F,EAAY6/B,GACvBA,IACAA,EAEDD,EAAGA,EAAE39B,QAAW69B,mBAAoBhzB,GAAQ,IAC3CgzB,mBAA6B,MAATh6B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKxb,KAAKqF,KAAMrF,KAAKmH,cAOtB,IAAM4wB,KAAU3uB,EACf03B,GAAa/I,EAAQ3uB,EAAG2uB,GAAUgJ,EAAavlB,GAKjD,OAAOylB,EAAEpzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjBi8B,UAAW,WACV,OAAOp+B,EAAOg+B,MAAOhhC,KAAKqhC,mBAE3BA,eAAgB,WACf,OAAOrhC,KAAKoE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAM1iB,KAAM,YAClC,OAAO8R,EAAW9O,EAAO2D,UAAWmL,GAAa9R,OAC9CsQ,OAAQ,WACX,IAAI3O,EAAO3B,KAAK2B,KAGhB,OAAO3B,KAAKqF,OAASrC,EAAQhD,MAAOka,GAAI,cACvC2mB,GAAapzB,KAAMzN,KAAKqM,YAAeu0B,GAAgBnzB,KAAM9L,KAC3D3B,KAAK2V,UAAYkQ,GAAepY,KAAM9L,MACtCyC,IAAK,SAAUoD,EAAInD,GACtB,IAAIjC,EAAMY,EAAQhD,MAAOoC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAIhD,CAAEt7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAClDh9B,SAKN,IACC29B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZrH,GAAa,GAObsH,GAAa,GAGbC,GAAW,KAAKnhC,OAAQ,KAGxBohC,GAAeliC,EAAS0C,cAAe,KAKxC,SAASy/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBhkB,GAED,iBAAvBgkB,IACXhkB,EAAOgkB,EACPA,EAAqB,KAGtB,IAAIC,EACH//B,EAAI,EACJggC,EAAYF,EAAmBx6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK7a,EAAY4c,GAGhB,MAAUikB,EAAWC,EAAWhgC,KAGR,MAAlB+/B,EAAU,IACdA,EAAWA,EAAS5hC,MAAO,IAAO,KAChC0hC,EAAWE,GAAaF,EAAWE,IAAc,IAAKtwB,QAASqM,KAI/D+jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKthC,KAAMqd,IAQnE,SAASmkB,GAA+BJ,EAAW58B,EAASy1B,EAAiBwH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAItsB,EAcJ,OAbA0sB,EAAWJ,IAAa,EACxBl/B,EAAOkB,KAAM89B,EAAWE,IAAc,GAAI,SAAUjlB,EAAGwlB,GACtD,IAAIC,EAAsBD,EAAoBr9B,EAASy1B,EAAiBwH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACD3sB,EAAW8sB,QADf,GAHNt9B,EAAQ+8B,UAAUvwB,QAAS8wB,GAC3BF,EAASE,IACF,KAKF9sB,EAGR,OAAO4sB,EAASp9B,EAAQ+8B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYl9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRk9B,EAAc5/B,EAAO6/B,aAAaD,aAAe,GAElD,IAAMz0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPy0B,EAAaz0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/ERq8B,GAAatsB,KAAOL,GAASK,KAgP7BxS,EAAOmC,OAAQ,CAGd29B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK9tB,GAASK,KACd7T,KAAM,MACNuhC,QAxRgB,4DAwRQz1B,KAAM0H,GAASguB,UACvC3jC,QAAQ,EACR4jC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRnI,IAAKyG,GACLt/B,KAAM,aACNgtB,KAAM,YACNzb,IAAK,4BACL0vB,KAAM,qCAGPxoB,SAAU,CACTlH,IAAK,UACLyb,KAAM,SACNiU,KAAM,YAGPC,eAAgB,CACf3vB,IAAK,cACLvR,KAAM,eACNihC,KAAM,gBAKPE,WAAY,CAGXC,SAAUj4B,OAGVk4B,aAAa,EAGbC,YAAa5gB,KAAKC,MAGlB4gB,WAAY9gC,EAAOs9B,UAOpBsC,YAAa,CACZK,KAAK,EACL//B,SAAS,IAOX6gC,UAAW,SAAUt+B,EAAQu+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYl9B,EAAQzC,EAAO6/B,cAAgBmB,GAGvDrB,GAAY3/B,EAAO6/B,aAAcp9B,IAGnCw+B,cAAelC,GAA6BzH,IAC5C4J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK79B,GAGA,iBAAR69B,IACX79B,EAAU69B,EACVA,OAAMn9B,GAIPV,EAAUA,GAAW,GAErB,IAAIg/B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGA3jB,EAGA4jB,EAGAviC,EAGAwiC,EAGA1D,EAAIj+B,EAAO+gC,UAAW,GAAI3+B,GAG1Bw/B,EAAkB3D,EAAE/9B,SAAW+9B,EAG/B4D,EAAqB5D,EAAE/9B,UACpB0hC,EAAgBrjC,UAAYqjC,EAAgBphC,QAC9CR,EAAQ4hC,GACR5hC,EAAOwlB,MAGRnK,EAAWrb,EAAOgb,WAClB8mB,EAAmB9hC,EAAO+Z,UAAW,eAGrCgoB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPnhB,WAAY,EAGZikB,kBAAmB,SAAUh3B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMyjB,EAAkB,CACvBA,EAAkB,GAClB,MAAUz3B,EAAQ20B,GAASt0B,KAAMm3B,GAChCC,EAAiBz3B,EAAO,GAAIrF,cAAgB,MACzC88B,EAAiBz3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD/G,OAAQoM,EAAO,IAGpBA,EAAQy3B,EAAiBp2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cu3B,sBAAuB,WACtB,OAAOtkB,EAAYwjB,EAAwB,MAI5Ce,iBAAkB,SAAUhgC,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO4/B,EAAqB5/B,EAAKoC,eAChCw9B,EAAqB5/B,EAAKoC,gBAAmBpC,EAC9C2/B,EAAgB3/B,GAAS8B,GAEnBnH,MAIRslC,iBAAkB,SAAU3jC,GAI3B,OAHkB,MAAbmf,IACJmgB,EAAEsE,SAAW5jC,GAEP3B,MAIR+kC,WAAY,SAAU3gC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJuhB,EAAMjkB,OAAQha,EAAKi+B,EAAMmD,cAIzB,IAAMxjC,KAAQoC,EACb2gC,EAAY/iC,GAAS,CAAE+iC,EAAY/iC,GAAQoC,EAAKpC,IAInD,OAAOhC,MAIRylC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB98B,EAAM,EAAG88B,GACF3lC,OAoBV,GAfAqe,EAASzB,QAASylB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO9tB,GAASK,MAAS,IAC5CtP,QAASy7B,GAAWxsB,GAASguB,SAAW,MAG1ClC,EAAEt/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQs/B,EAAEtkB,QAAUskB,EAAEt/B,KAGzDs/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMz6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB+kB,EAAE2E,YAAsB,CAC5BnB,EAAY7kC,EAAS0C,cAAe,KAKpC,IACCmiC,EAAUjvB,KAAOyrB,EAAEgC,IAInBwB,EAAUjvB,KAAOivB,EAAUjvB,KAC3ByrB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQp5B,GAITw0B,EAAE2E,aAAc,GAalB,GARK3E,EAAExe,MAAQwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,OACxCwe,EAAExe,KAAOzf,EAAOg+B,MAAOC,EAAExe,KAAMwe,EAAEF,cAIlCqB,GAA+B9H,GAAY2G,EAAG77B,EAASi9B,GAGlDvhB,EACJ,OAAOuhB,EA8ER,IAAMlgC,KAzENuiC,EAAc1hC,EAAOwlB,OAASyY,EAAEzhC,SAGQ,GAApBwD,EAAO8/B,UAC1B9/B,EAAOwlB,MAAMU,QAAS,aAIvB+X,EAAEt/B,KAAOs/B,EAAEt/B,KAAKogB,cAGhBkf,EAAE6E,YAAcpE,GAAWj0B,KAAMwzB,EAAEt/B,MAKnC0iC,EAAWpD,EAAEgC,IAAI/8B,QAASq7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAExe,MAAQwe,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKziC,QAAS,uCACjCogC,EAAExe,KAAOwe,EAAExe,KAAKvc,QAASo7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAI3iC,MAAO+jC,EAAS/gC,QAG5B29B,EAAExe,OAAUwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,QAC1C4hB,IAAchE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQpD,EAAExe,YAGjDwe,EAAExe,OAIO,IAAZwe,EAAE/yB,QACNm2B,EAAWA,EAASn+B,QAASs7B,GAAY,MACzCmD,GAAatE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQ,KAASxiC,GAAMuF,OACnEu9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD/iC,EAAO+/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBriC,EAAO+/B,aAAcsB,IAE9DrhC,EAAOggC,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBriC,EAAOggC,KAAMqB,MAKnDpD,EAAExe,MAAQwe,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBl+B,EAAQk+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBljC,EAAG8+B,EAAE+E,QAAS7jC,IAIvC,GAAK8+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWxlC,KAAMmkC,EAAiBvC,EAAOpB,IAAiBngB,GAG9D,OAAOuhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBtpB,IAAKylB,EAAEhG,UACxBoH,EAAMx5B,KAAMo4B,EAAEiF,SACd7D,EAAMxlB,KAAMokB,EAAE76B,OAGdg+B,EAAYhC,GAA+BR,GAAYX,EAAG77B,EAASi9B,GAK5D,CASN,GARAA,EAAMnhB,WAAa,EAGdwjB,GACJG,EAAmB3b,QAAS,WAAY,CAAEmZ,EAAOpB,IAI7CngB,EACJ,OAAOuhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE5D,UACjBmH,EAAezkC,EAAO+f,WAAY,WACjCuiB,EAAMoD,MAAO,YACXxE,EAAE5D,UAGN,IACCvc,GAAY,EACZsjB,EAAU+B,KAAMnB,EAAgBn8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAM28B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS9/B,EAAOmgC,EAAUC,EACxCd,EAAaU,EAGTtlB,IAILA,GAAY,EAGP0jB,GACJzkC,EAAOu9B,aAAckH,GAKtBJ,OAAYt+B,EAGZw+B,EAAwB0B,GAAW,GAGnC3D,EAAMnhB,WAAsB,EAATskB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI9kC,EAAM+kC,EAAeC,EAC5B3rB,EAAWimB,EAAEjmB,SACbmnB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU9zB,aACEvI,IAAP2gC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM9kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAMg5B,GAAO,CACtDtE,EAAUvwB,QAASjQ,GACnB,MAMH,GAAKwgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMxgC,KAAQ0kC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY/hC,EAAO,IAAMwgC,EAAW,IAAQ,CACrEuE,EAAgB/kC,EAChB,MAEKglC,IACLA,EAAgBhlC,GAKlB+kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUvwB,QAAS80B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IACsC,EAA3CtjC,EAAO6D,QAAS,SAAUo6B,EAAEkB,YAC5Bn/B,EAAO6D,QAAS,OAAQo6B,EAAEkB,WAAc,IACxClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA9iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMp2B,EAAKsK,EAC9ByoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU7hC,QAGzB,GAAK6hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKt/B,eAAkBw5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU9zB,QAGpB,MAAQy4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCtrB,GAAQqrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtCjnB,EAAO6rB,EACPA,EAAU3E,EAAU9zB,QAKnB,GAAiB,MAAZy4B,EAEJA,EAAU7rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS6rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYzoB,EAAO,IAAM6rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA/yB,EAAMk2B,EAAMt/B,MAAO,MACT,KAAQu/B,IAGjBC,EAAOrD,EAAYzoB,EAAO,IAAMtK,EAAK,KACpC+yB,EAAY,KAAO/yB,EAAK,KACb,EAGG,IAATo2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUn2B,EAAK,GACfwxB,EAAUvwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATo2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ95B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAO2gC,EAAOt6B,EAAI,sBAAwBwO,EAAO,OAAS6rB,IASjE,MAAO,CAAE3oB,MAAO,UAAWsE,KAAM8jB,GAidpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCniC,EAAO+/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCniC,EAAOggC,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEt/B,KACxB+jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASpoB,MACtB+nB,EAAUK,EAAS9jB,KAEnB6jB,IADAlgC,EAAQmgC,EAASngC,UAMlBA,EAAQs/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJjoB,EAASmB,YAAaolB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9DhkB,EAASuB,WAAYglB,EAAiB,CAAEvC,EAAOqD,EAAYt/B,IAI5Di8B,EAAM0C,WAAYA,GAClBA,OAAaj/B,EAER4+B,GACJG,EAAmB3b,QAASod,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU9/B,IAIpC0+B,EAAiB/mB,SAAU6mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmB3b,QAAS,eAAgB,CAAEmZ,EAAOpB,MAG3Cj+B,EAAO8/B,QAChB9/B,EAAOwlB,MAAMU,QAAS,cAKzB,OAAOmZ,GAGR8E,QAAS,SAAUlE,EAAKxgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKs/B,EAAKxgB,EAAMte,EAAU,SAGzCijC,UAAW,SAAUnE,EAAK9+B,GACzB,OAAOnB,EAAOW,IAAKs/B,OAAKn9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUsmB,EAAKxgB,EAAMte,EAAUxC,GAUjD,OAPKN,EAAYohB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOmhC,KAAMnhC,EAAOmC,OAAQ,CAClC89B,IAAKA,EACLthC,KAAMgb,EACNulB,SAAUvgC,EACV8gB,KAAMA,EACNyjB,QAAS/hC,GACPnB,EAAO2C,cAAes9B,IAASA,OAIpCjgC,EAAOihC,cAAe,SAAUhD,GAC/B,IAAI9+B,EACJ,IAAMA,KAAK8+B,EAAE+E,QACa,iBAApB7jC,EAAEsF,gBACNw5B,EAAEqC,YAAcrC,EAAE+E,QAAS7jC,IAAO,MAMrCa,EAAOwsB,SAAW,SAAUyT,EAAK79B,EAASlD,GACzC,OAAOc,EAAOmhC,KAAM,CACnBlB,IAAKA,EAGLthC,KAAM,MACNugC,SAAU,SACVh0B,OAAO,EACPm1B,OAAO,EACP7jC,QAAQ,EAKRkkC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBvjC,EAAO0D,WAAY6/B,EAAUnhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBmiC,QAAS,SAAU/X,GAClB,IAAI/H,EAyBJ,OAvBKxnB,KAAM,KACLqB,EAAYkuB,KAChBA,EAAOA,EAAK9uB,KAAMT,KAAM,KAIzBwnB,EAAOxkB,EAAQusB,EAAMvvB,KAAM,GAAIkN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDxF,KAAM,GAAI4C,YACd4kB,EAAK2I,aAAcnwB,KAAM,IAG1BwnB,EAAKpjB,IAAK,WACT,IAAIC,EAAOrE,KAEX,MAAQqE,EAAKkjC,kBACZljC,EAAOA,EAAKkjC,kBAGb,OAAOljC,IACJ4rB,OAAQjwB,OAGNA,MAGRwnC,UAAW,SAAUjY,GACpB,OAAKluB,EAAYkuB,GACTvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOwnC,UAAWjY,EAAK9uB,KAAMT,KAAMmC,MAItCnC,KAAKkE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQhD,MAClBgb,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASssB,QAAS/X,GAGlB9U,EAAKwV,OAAQV,MAKhB/H,KAAM,SAAU+H,GACf,IAAIkY,EAAiBpmC,EAAYkuB,GAEjC,OAAOvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOsnC,QAASG,EAAiBlY,EAAK9uB,KAAMT,KAAMmC,GAAMotB,MAIlEmY,OAAQ,SAAUzkC,GAIjB,OAHAjD,KAAKmU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQhD,MAAOswB,YAAatwB,KAAKwM,cAE3BxM,QAKTgD,EAAO6O,KAAKhI,QAAQ4vB,OAAS,SAAUp1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ89B,QAAStjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ89B,QAAU,SAAUtjC,GACvC,SAAWA,EAAKuuB,aAAevuB,EAAK0vB,cAAgB1vB,EAAKyxB,iBAAiBxyB,SAM3EN,EAAO6/B,aAAa+E,IAAM,WACzB,IACC,OAAO,IAAI7nC,EAAO8nC,eACjB,MAAQp7B,MAGX,IAAIq7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAejlC,EAAO6/B,aAAa+E,MAEpCxmC,EAAQ8mC,OAASD,IAAkB,oBAAqBA,GACxD7mC,EAAQ+iC,KAAO8D,KAAiBA,GAEhCjlC,EAAOkhC,cAAe,SAAU9+B,GAC/B,IAAIjB,EAAUgkC,EAGd,GAAK/mC,EAAQ8mC,MAAQD,KAAiB7iC,EAAQwgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS/K,GACxB,IAAI94B,EACHylC,EAAMxiC,EAAQwiC,MAWf,GATAA,EAAIQ,KACHhjC,EAAQzD,KACRyD,EAAQ69B,IACR79B,EAAQi+B,MACRj+B,EAAQijC,SACRjjC,EAAQmR,UAIJnR,EAAQkjC,UACZ,IAAMnmC,KAAKiD,EAAQkjC,UAClBV,EAAKzlC,GAAMiD,EAAQkjC,UAAWnmC,GAmBhC,IAAMA,KAdDiD,EAAQmgC,UAAYqC,EAAItC,kBAC5BsC,EAAItC,iBAAkBlgC,EAAQmgC,UAQzBngC,EAAQwgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV4B,EAAIvC,iBAAkBljC,EAAG6jC,EAAS7jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAWgkC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAThnC,EACJimC,EAAInC,QACgB,UAAT9jC,EAKgB,iBAAfimC,EAAIpC,OACfvK,EAAU,EAAG,SAEbA,EAGC2M,EAAIpC,OACJoC,EAAIlC,YAINzK,EACC6M,GAAkBF,EAAIpC,SAAYoC,EAAIpC,OACtCoC,EAAIlC,WAK+B,UAAjCkC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAIrB,UACd,CAAEhkC,KAAMqlC,EAAIiB,cACbjB,EAAIxC,4BAQTwC,EAAIW,OAASpkC,IACbgkC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYvkC,EAAU,cAKnC2B,IAAhB8hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAI1mB,YAMRnhB,EAAO+f,WAAY,WACb3b,GACJgkC,OAQLhkC,EAAWA,EAAU,SAErB,IAGCyjC,EAAIzB,KAAM/gC,EAAQ0gC,YAAc1gC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKTg5B,MAAO,WACDthC,GACJA,QAWLnB,EAAOihC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAEjmB,SAAS3Y,QAAS,KAKtBW,EAAO+gC,UAAW,CACjBR,QAAS,CACRlhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETqhC,WAAY,CACX2D,cAAe,SAAU9kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAOihC,cAAe,SAAU,SAAUhD,QACxBn7B,IAAZm7B,EAAE/yB,QACN+yB,EAAE/yB,OAAQ,GAEN+yB,EAAE2E,cACN3E,EAAEt/B,KAAO,SAKXqB,EAAOkhC,cAAe,SAAU,SAAUjD,GAIxC,IAAI5+B,EAAQ8B,EADb,GAAK88B,EAAE2E,aAAe3E,EAAE8H,YAEvB,MAAO,CACN5C,KAAM,SAAUlpB,EAAGge,GAClB54B,EAASW,EAAQ,YACf+O,KAAMkvB,EAAE8H,aAAe,IACvBrmB,KAAM,CAAEsmB,QAAS/H,EAAEgI,cAAernC,IAAKq/B,EAAEgC,MACzC7a,GAAI,aAAcjkB,EAAW,SAAU+kC,GACvC7mC,EAAOub,SACPzZ,EAAW,KACN+kC,GACJjO,EAAuB,UAAbiO,EAAIvnC,KAAmB,IAAM,IAAKunC,EAAIvnC,QAKnD/B,EAAS8C,KAAKC,YAAaN,EAAQ,KAEpCojC,MAAO,WACDthC,GACJA,QAUL,IAqGKshB,GArGD0jB,GAAe,GAClBC,GAAS,oBAGVpmC,EAAO+gC,UAAW,CACjBsF,MAAO,WACPC,cAAe,WACd,IAAInlC,EAAWglC,GAAa7/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADApH,KAAMmE,IAAa,EACZA,KAKTnB,EAAOihC,cAAe,aAAc,SAAUhD,EAAGsI,EAAkBlH,GAElE,IAAImH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ1I,EAAEoI,QAAqBD,GAAO37B,KAAMwzB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAExe,MAE6C,KADnDwe,EAAEqC,aAAe,IACjBziC,QAAS,sCACXuoC,GAAO37B,KAAMwzB,EAAExe,OAAU,QAI5B,GAAKknB,GAAiC,UAArB1I,EAAEkB,UAAW,GA8D7B,OA3DAqH,EAAevI,EAAEqI,cAAgBjoC,EAAY4/B,EAAEqI,eAC9CrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWzjC,QAASkjC,GAAQ,KAAOI,IAC/B,IAAZvI,EAAEoI,QACbpI,EAAEgC,MAAS5C,GAAO5yB,KAAMwzB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMgG,GACL1mC,EAAOoD,MAAOojC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEkB,UAAW,GAAM,OAGnBsH,EAAc1pC,EAAQypC,GACtBzpC,EAAQypC,GAAiB,WACxBE,EAAoBplC,WAIrB+9B,EAAMjkB,OAAQ,gBAGQtY,IAAhB2jC,EACJzmC,EAAQjD,GAASu+B,WAAYkL,GAI7BzpC,EAAQypC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAavoC,KAAM4oC,IAIfE,GAAqBroC,EAAYooC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc3jC,IAI5B,WAYT1E,EAAQwoC,qBACHnkB,GAAO7lB,EAASiqC,eAAeD,mBAAoB,IAAKnkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS4mC,GAC3C,MAAqB,iBAATrnB,EACJ,IAEgB,kBAAZvf,IACX4mC,EAAc5mC,EACdA,GAAU,GAKLA,IAIA9B,EAAQwoC,qBAMZ/yB,GALA3T,EAAUtD,EAASiqC,eAAeD,mBAAoB,KAKvCtnC,cAAe,SACzBkT,KAAO5V,EAASuV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUtD,GAKZynB,GAAWyiB,GAAe,IAD1BC,EAASzvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAeynC,EAAQ,MAGzCA,EAAS3iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI+lC,EAAOv9B,cAlChC,IAAIqK,EAAMkzB,EAAQ1iB,GAyCnBrkB,EAAOG,GAAGsoB,KAAO,SAAUwX,EAAK+G,EAAQ7lC,GACvC,IAAIlB,EAAUtB,EAAM4kC,EACnB9rB,EAAOza,KACPyoB,EAAMwa,EAAIpiC,QAAS,KAsDpB,OApDY,EAAP4nB,IACJxlB,EAAWk7B,GAAkB8E,EAAI3iC,MAAOmoB,IACxCwa,EAAMA,EAAI3iC,MAAO,EAAGmoB,IAIhBpnB,EAAY2oC,IAGhB7lC,EAAW6lC,EACXA,OAASlkC,GAGEkkC,GAA4B,iBAAXA,IAC5BroC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOmhC,KAAM,CACZlB,IAAKA,EAKLthC,KAAMA,GAAQ,MACdugC,SAAU,OACVzf,KAAMunB,IACHnhC,KAAM,SAAUggC,GAGnBtC,EAAWjiC,UAEXmW,EAAK8U,KAAMtsB,EAIVD,EAAQ,SAAUitB,OAAQjtB,EAAO2X,UAAWkuB,IAAiBr4B,KAAMvN,GAGnE4lC,KAKEzqB,OAAQja,GAAY,SAAUk+B,EAAOmD,GACxC/qB,EAAKvW,KAAM,WACVC,EAASxD,MAAOX,KAAMumC,GAAY,CAAElE,EAAMwG,aAAcrD,EAAQnD,QAK5DriC,MAMRgD,EAAO6O,KAAKhI,QAAQogC,SAAW,SAAU5lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOy5B,OAAQ,SAAUt5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOknC,OAAS,CACfC,UAAW,SAAU9lC,EAAMe,EAASjD,GACnC,IAAIioC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD/X,EAAW1vB,EAAOyhB,IAAKpgB,EAAM,YAC7BqmC,EAAU1nC,EAAQqB,GAClBynB,EAAQ,GAGS,WAAb4G,IACJruB,EAAKkgB,MAAMmO,SAAW,YAGvB8X,EAAYE,EAAQR,SACpBI,EAAYtnC,EAAOyhB,IAAKpgB,EAAM,OAC9BomC,EAAaznC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbquB,GAAwC,UAAbA,KACA,GAA9C4X,EAAYG,GAAa5pC,QAAS,SAMpC0pC,GADAH,EAAcM,EAAQhY,YACD3iB,IACrBs6B,EAAUD,EAAYzS,OAGtB4S,EAASxX,WAAYuX,IAAe,EACpCD,EAAUtX,WAAY0X,IAAgB,GAGlCppC,EAAY+D,KAGhBA,EAAUA,EAAQ3E,KAAM4D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIqlC,KAGjC,MAAfplC,EAAQ2K,MACZ+b,EAAM/b,IAAQ3K,EAAQ2K,IAAMy6B,EAAUz6B,IAAQw6B,GAE1B,MAAhBnlC,EAAQuyB,OACZ7L,EAAM6L,KAASvyB,EAAQuyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWjlC,EACfA,EAAQulC,MAAMlqC,KAAM4D,EAAMynB,GAG1B4e,EAAQjmB,IAAKqH,KAKhB9oB,EAAOG,GAAGgC,OAAQ,CAGjB+kC,OAAQ,SAAU9kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNpF,KACAA,KAAKkE,KAAM,SAAU/B,GACpBa,EAAOknC,OAAOC,UAAWnqC,KAAMoF,EAASjD,KAI3C,IAAIyoC,EAAMC,EACTxmC,EAAOrE,KAAM,GAEd,OAAMqE,EAQAA,EAAKyxB,iBAAiBxyB,QAK5BsnC,EAAOvmC,EAAKozB,wBACZoT,EAAMxmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK66B,EAAK76B,IAAM86B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAEh7B,IAAK,EAAG4nB,KAAM,QATxB,GAuBDjF,SAAU,WACT,GAAM1yB,KAAM,GAAZ,CAIA,IAAIgrC,EAAcd,EAAQhoC,EACzBmC,EAAOrE,KAAM,GACbirC,EAAe,CAAEl7B,IAAK,EAAG4nB,KAAM,GAGhC,GAAwC,UAAnC30B,EAAOyhB,IAAKpgB,EAAM,YAGtB6lC,EAAS7lC,EAAKozB,4BAER,CACNyS,EAASlqC,KAAKkqC,SAIdhoC,EAAMmC,EAAK6I,cACX89B,EAAe3mC,EAAK2mC,cAAgB9oC,EAAIyN,gBACxC,MAAQq7B,IACLA,IAAiB9oC,EAAIujB,MAAQulB,IAAiB9oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKumB,EAAc,YAE1BA,EAAeA,EAAapoC,WAExBooC,GAAgBA,IAAiB3mC,GAAkC,IAA1B2mC,EAAazpC,YAG1D0pC,EAAejoC,EAAQgoC,GAAed,UACzBn6B,KAAO/M,EAAOyhB,IAAKumB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ30B,EAAOyhB,IAAKumB,EAAc,mBAAmB,IAKpE,MAAO,CACNj7B,IAAKm6B,EAAOn6B,IAAMk7B,EAAal7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEszB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO30B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E2mC,aAAc,WACb,OAAOhrC,KAAKoE,IAAK,WAChB,IAAI4mC,EAAehrC,KAAKgrC,aAExB,MAAQA,GAA2D,WAA3ChoC,EAAOyhB,IAAKumB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBr7B,QAM1B3M,EAAOkB,KAAM,CAAE20B,WAAY,cAAeD,UAAW,eAAiB,SAAUjc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQphB,KAAM,SAAUqE,EAAMsY,EAAQva,GAG5C,IAAIyoC,EAOJ,GANKppC,EAAU4C,GACdwmC,EAAMxmC,EACuB,IAAlBA,EAAK9C,WAChBspC,EAAMxmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOyoC,EAAMA,EAAKnoB,GAASre,EAAMsY,GAG7BkuB,EACJA,EAAIK,SACFn7B,EAAY86B,EAAIE,YAAV3oC,EACP2N,EAAM3N,EAAMyoC,EAAIC,aAIjBzmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOizB,SAAUvT,GAASkP,GAAcxwB,EAAQgyB,cAC/C,SAAU/uB,EAAMitB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQhtB,EAAMqe,GAGlBoO,GAAUrjB,KAAM6jB,GACtBtuB,EAAQqB,GAAOquB,WAAYhQ,GAAS,KACpC4O,MAQLtuB,EAAOkB,KAAM,CAAEinC,OAAQ,SAAUC,MAAO,SAAW,SAAU/lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CACZ2zB,QAAS,QAAUxyB,EACnB2W,QAASra,EACT0pC,GAAI,QAAUhmC,GACZ,SAAUimC,EAAcC,GAG1BvoC,EAAOG,GAAIooC,GAAa,SAAU3T,EAAQzwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAYgoC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVzwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQphB,KAAM,SAAUqE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCknC,EAAS1qC,QAAS,SACxBwD,EAAM,QAAUgB,GAChBhB,EAAKzE,SAAS+P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK9C,UACTW,EAAMmC,EAAKsL,gBAIJ3J,KAAKivB,IACX5wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM6zB,GAGxBxyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOquB,IAChC7zB,EAAM0f,EAAYuW,OAAS9xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOnD,KAAKooB,GAAIzmB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB61B,KAAM,SAAU3S,EAAO5F,EAAMtf,GAC5B,OAAOnD,KAAKooB,GAAIC,EAAO,KAAM5F,EAAMtf,IAEpCqoC,OAAQ,SAAUnjB,EAAOllB,GACxB,OAAOnD,KAAKyoB,IAAKJ,EAAO,KAAMllB,IAG/BsoC,SAAU,SAAUxoC,EAAUolB,EAAO5F,EAAMtf,GAC1C,OAAOnD,KAAKooB,GAAIC,EAAOplB,EAAUwf,EAAMtf,IAExCuoC,WAAY,SAAUzoC,EAAUolB,EAAOllB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBtD,KAAKyoB,IAAKxlB,EAAU,MACpBjD,KAAKyoB,IAAKJ,EAAOplB,GAAY,KAAME,IAGrCwoC,MAAO,SAAUC,EAAQC,GACxB,OAAO7rC,KAAKkuB,WAAY0d,GAASzd,WAAY0d,GAASD,MAIxD5oC,EAAOkB,KACN,wLAE4DqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBtD,KAAKooB,GAAI/iB,EAAM,KAAMod,EAAMtf,GAC3BnD,KAAKkpB,QAAS7jB,MAUlB,IAAI2E,GAAQ,qCAMZhH,EAAO8oC,MAAQ,SAAU3oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMs3B,EAUf,GARwB,iBAAZ5oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKAtP,EAAY8B,GAalB,OARAqR,EAAOlU,EAAMG,KAAM6D,UAAW,IAC9BwnC,EAAQ,WACP,OAAO3oC,EAAGxC,MAAOuC,GAAWlD,KAAMwU,EAAK9T,OAAQJ,EAAMG,KAAM6D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElC0kC,GAGR9oC,EAAO+oC,UAAY,SAAUC,GACvBA,EACJhpC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOipC,UAAYhpB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO3B,WAAaA,EACpB2B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOmpB,IAAMzjB,KAAKyjB,IAElBnpB,EAAOkpC,UAAY,SAAU5qC,GAK5B,IAAIK,EAAOqB,EAAOrB,KAAML,GACxB,OAAkB,WAATK,GAA8B,WAATA,KAK5BwqC,MAAO7qC,EAAMyxB,WAAYzxB,KAG5B0B,EAAOopC,KAAO,SAAU7pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXqiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOrpC,IAOT,IAGCupC,GAAUxsC,EAAOiD,OAGjBwpC,GAAKzsC,EAAO0sC,EAwBb,OAtBAzpC,EAAO0pC,WAAa,SAAUhnC,GAS7B,OARK3F,EAAO0sC,IAAMzpC,IACjBjD,EAAO0sC,EAAID,IAGP9mC,GAAQ3F,EAAOiD,SAAWA,IAC9BjD,EAAOiD,OAASupC,IAGVvpC,GAMiB,oBAAb/C,IACXF,EAAOiD,OAASjD,EAAO0sC,EAAIzpC,GAMrBA","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_Layout.cshtml b/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_Layout.cshtml
index 9ac2321ff0..fc5ea8d864 100644
--- a/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_Layout.cshtml
+++ b/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_Layout.cshtml
@@ -47,11 +47,11 @@
<script src="~/Identity/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"
asp-fallback-src="~/Identity/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.min.js"
asp-fallback-src="~/Identity/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
diff --git a/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_ValidationScriptsPartial.cshtml
index 6cd4eed868..454a065353 100644
--- a/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_ValidationScriptsPartial.cshtml
+++ b/src/Identity/samples/IdentitySample.DefaultUI/Views/Shared/_ValidationScriptsPartial.cshtml
@@ -1,2 +1,2 @@
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"></script>
diff --git a/src/Identity/samples/IdentitySample.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Identity/samples/IdentitySample.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml
index 6cd4eed868..454a065353 100644
--- a/src/Identity/samples/IdentitySample.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml
+++ b/src/Identity/samples/IdentitySample.Mvc/Views/Shared/_ValidationScriptsPartial.cshtml
@@ -1,2 +1,2 @@
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.17.0/jquery.validate.min.js"></script>
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/3.2.11/jquery.validate.unobtrusive.min.js"></script>
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validation-unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"></script>
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_Layout.cshtml b/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_Layout.cshtml
index c2845c7379..cb5a10e116 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_Layout.cshtml
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_Layout.cshtml
@@ -57,11 +57,11 @@
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
</environment>
<environment exclude="Development">
- <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.bundle.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_ValidationScriptsPartial.cshtml b/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_ValidationScriptsPartial.cshtml
index a2b13b317f..c94478210b 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_ValidationScriptsPartial.cshtml
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/Pages/_ValidationScriptsPartial.cshtml
@@ -3,16 +3,16 @@
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.14.0/jquery.validate.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.19.2/jquery.validate.min.js"
asp-fallback-src="~/lib/jquery-validation/dist/jquery.validate.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator"
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
index 0bdc1962b6..984713a496 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
@@ -1,12 +1,23 @@
-Copyright (c) .NET Foundation. All rights reserved.
+The MIT License (MIT)
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-these files except in compliance with the License. You may obtain a copy of the
-License at
+Copyright (c) .NET Foundation and Contributors
-http://www.apache.org/licenses/LICENSE-2.0
+All rights reserved.
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 73f5298394..009306070a 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,7 +1,10 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index 553d427471..d8d803c65e 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive});
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/LICENSE.txt b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/LICENSE.txt
index e4e5e00ef0..599bdf2c72 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright JS Foundation and other contributors, https://js.foundation/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.js b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.js b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.map b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Identity/testassets/Identity.DefaultUI.WebSite/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV2/ancm_iis_expressv2.wxs b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV2/ancm_iis_expressv2.wxs
index a83d82063a..973049c973 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV2/ancm_iis_expressv2.wxs
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/ANCMIISExpressV2/ancm_iis_expressv2.wxs
@@ -108,7 +108,7 @@
</Property>
<Condition Message="!(loc.AspNetCoreModuleIISExpressPrereq)"><![CDATA[Installed Or IISEXPRESS_INSTALL_PATH]]></Condition>
- <?if $(var.Platform) = "x64" ?>
+ <?if $(var.Platform) != "x86" ?>
<Condition Message="!(loc.AspNetCoreModuleIISExpressPrereq)"><![CDATA[Installed Or IISEXPRESS_INSTALL_PATH32]]></Condition>
<?endif?>
@@ -120,13 +120,13 @@
<?endif ?>
<!-- also prevent install of 64-bit product on 32-bit machine -->
- <?if $(var.Platform) = "x64"?>
+ <?if $(var.Platform) != "x86"?>
<Condition Message="!(loc.LaunchCondition_32BIT)">
<![CDATA[(Installed And NOT PATCH) Or VersionNT64]]>
</Condition>
<?endif ?>
- <?if $(var.Platform) = "x64" ?>
+ <?if $(var.Platform) != "x86" ?>
<Property Id="IISEXPRESS_INSTALL_PATH32" Secure="yes">
<DirectorySearch Id="ProgramFilesSearch32" Path="[ProgramFilesFolder]">
<DirectorySearch Id="IISExpressInstallPathSearch32" Path="IIS Express" AssignToProperty="yes">
@@ -160,7 +160,6 @@
</Directory>
</Directory>
-
<!-- Directory Structure and Component Definitions -->
<DirectoryRef Id="INSTALLDIR">
<Directory Id="INSTALLLOCATION" ShortName="ANCM" Name="$(var.ProductName)">
@@ -202,7 +201,7 @@
</Directory>
<!-- WOW64 Support -->
- <?if $(var.Platform) = "x64" ?>
+ <?if $(var.Platform) != "x86" ?>
<Directory Id="$(var.ProgramFilesFolder32)">
<Directory Id="INSTALLDIR32" Name="IIS Express" >
<Directory Id="INSTALLLOCATION32" ShortName="ANCM" Name="$(var.ProductName)">
@@ -253,7 +252,7 @@
<ComponentRef Id="AspNetCoreModule"/>
<ComponentRef Id="AspNetCoreModuleHandler"/>
<ComponentRef Id="AspNetCoreSchema"/>
- <?if $(var.Platform) = "x64" ?>
+ <?if $(var.Platform) != "x86" ?>
<ComponentRef Id="AspNetCoreModule.wow"/>
<ComponentRef Id="AspNetCoreModuleHandler.wow"/>
<ComponentRef Id="AspNetCoreSchema.wow"/>
@@ -390,7 +389,7 @@
Value="[IISEXPRESS_APPHOST_CONFIG_TMP]"/>
<CustomAction Id="CA_REMOVE_CONFIGSECTION_TMP" BinaryKey="IISCustomActionDll" DllEntry="RemoveConfigSection" Execute="deferred" Return="check" Impersonate="no" />
- <?if $(var.Platform) = "x64" ?>
+ <?if $(var.Platform) != "x86" ?>
<CustomAction Id="CA_UNLOCK_HANDLER32_PROPERTY"
Property="CA_UNLOCK_HANDLER32"
Value="&quot;[IISEXPRESS_INSTALL_PATH32]appcmd.exe&quot; unlock config /section:system.webserver/handlers /apphostconfig:&quot;[IISEXPRESS_APPHOST_CONFIG32]&quot;" />
@@ -551,7 +550,7 @@
<Custom Action="CA_REMOVE_MODULE_TMP_PROPERTY" Before="CA_REMOVE_MODULE_TMP"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
<Custom Action="CA_REMOVE_MODULE_TMP" Before="RemoveFiles"><![CDATA[(REMOVE~="ALL" AND NOT UPGRADINGPRODUCTCODE)]]></Custom>
- <?if $(var.Platform) = "x64" ?>
+ <?if $(var.Platform) != "x86" ?>
<Custom Action="CA_UNLOCK_HANDLER32_PROPERTY" After="InstallFiles"><![CDATA[(NOT REMOVE AND IISEXPRESS_INSTALL_PATH32)]]></Custom>
<Custom Action="CA_UNLOCK_HANDLER32" After="CA_UNLOCK_HANDLER32_PROPERTY"><![CDATA[(NOT REMOVE AND IISEXPRESS_INSTALL_PATH32)]]></Custom>
<Custom Action="CA_UNINSTALL_MODULE32_PROPERTY" After="CA_UNLOCK_HANDLER32"><![CDATA[(NOT REMOVE AND IISEXPRESS_INSTALL_PATH32)]]></Custom>
@@ -618,4 +617,3 @@
</Fragment>
</Wix>
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/CustomAction/aspnetcoreCA.vcxproj b/src/Installers/Windows/AspNetCoreModule-Setup/CustomAction/aspnetcoreCA.vcxproj
index 677c5fcfae..3672d1c285 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/CustomAction/aspnetcoreCA.vcxproj
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/CustomAction/aspnetcoreCA.vcxproj
@@ -49,16 +49,11 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
<ConfigurationType>DynamicLibrary</ConfigurationType>
- <PlatformToolsetVersion>v142</PlatformToolsetVersion>
- <PlatformToolset>$(PlatformToolsetVersion)</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)'=='Release'">
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
- <PropertyGroup Label="Configuration">
- <VCToolsVersion>14.29.30133</VCToolsVersion>
- </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup>
<AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(IIS-Setup)iisca\lib;$(WIX)sdk\$(WixPlatformToolset)\inc;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h
deleted file mode 100644
index 83e39fd7ff..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/acache.h
+++ /dev/null
@@ -1,116 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#include "percpu.h"
-
-
-class ALLOC_CACHE_HANDLER
-{
-public:
-
- ALLOC_CACHE_HANDLER(
- VOID
- );
-
- ~ALLOC_CACHE_HANDLER(
- VOID
- );
-
- HRESULT
- Initialize(
- DWORD cbSize,
- LONG nThreshold
- );
-
- LPVOID
- Alloc(
- VOID
- );
-
- VOID
- Free(
- __in LPVOID pMemory
- );
-
-
-private:
-
- VOID
- CleanupLookaside(
- VOID
- );
-
- DWORD
- QueryDepthForAllSLists(
- VOID
- );
-
- LONG m_nThreshold;
- DWORD m_cbSize;
-
- PER_CPU<SLIST_HEADER> * m_pFreeLists;
-
- //
- // Total heap allocations done over the lifetime.
- // Note that this is not interlocked, it is just a hint for debugging.
- //
- volatile LONG m_nTotal;
-
- LONG m_nFillPattern;
-
-public:
-
- static
- HRESULT
- StaticInitialize(
- VOID
- );
-
- static
- VOID
- StaticTerminate(
- VOID
- );
-
- static
- BOOL
- IsPageheapEnabled();
-
-private:
-
- static LONG sm_nFillPattern;
- static HANDLE sm_hHeap;
-};
-
-
-// You can use ALLOC_CACHE_HANDLER as a per-class allocator
-// in your C++ classes. Add the following to your class definition:
-//
-// protected:
-// static ALLOC_CACHE_HANDLER* sm_palloc;
-// public:
-// static void* operator new(size_t s)
-// {
-// IRTLASSERT(s == sizeof(C));
-// IRTLASSERT(sm_palloc != NULL);
-// return sm_palloc->Alloc();
-// }
-// static void operator delete(void* pv)
-// {
-// IRTLASSERT(pv != NULL);
-// if (sm_palloc != NULL)
-// sm_palloc->Free(pv);
-// }
-//
-// Obviously, you must initialize sm_palloc before you can allocate
-// any objects of this class.
-//
-// Note that if you derive a class from this base class, the derived class
-// must also provide its own operator new and operator delete. If not, the
-// base class's allocator will be called, but the size of the derived
-// object will almost certainly be larger than that of the base object.
-// Furthermore, the allocator will not be used for arrays of objects
-// (override operator new[] and operator delete[]), but this is a
-// harder problem since the allocator works with one fixed size.
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx
deleted file mode 100644
index 871c7e8e0f..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/base64.hxx
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _BASE64_HXX_
-#define _BASE64_HXX_
-
-DWORD
-Base64Encode(
- __in_bcount( cbDecodedBufferSize ) VOID * pDecodedBuffer,
- IN DWORD cbDecodedBufferSize,
- __out_ecount_opt( cchEncodedStringSize ) PWSTR pszEncodedString,
- IN DWORD cchEncodedStringSize,
- __out_opt DWORD * pcchEncoded
- );
-
-DWORD
-Base64Decode(
- __in PCWSTR pszEncodedString,
- __out_opt VOID * pDecodeBuffer,
- __in DWORD cbDecodeBufferSize,
- __out_opt DWORD * pcbDecoded
- );
-
-DWORD
-Base64Encode(
- __in_bcount( cbDecodedBufferSize ) VOID * pDecodedBuffer,
- IN DWORD cbDecodedBufferSize,
- __out_ecount_opt( cchEncodedStringSize ) PSTR pszEncodedString,
- IN DWORD cchEncodedStringSize,
- __out_opt DWORD * pcchEncoded
- );
-
-DWORD
-Base64Decode(
- __in PCSTR pszEncodedString,
- __out_opt VOID * pDecodeBuffer,
- __in DWORD cbDecodeBufferSize,
- __out_opt DWORD * pcbDecoded
- );
-
-#endif // _BASE64_HXX_
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h
deleted file mode 100644
index 82ac441abd..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/datetime.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _DATETIME_H_
-#define _DATETIME_H_
-
-BOOL
-StringTimeToFileTime(
- PCSTR pszTime,
- ULONGLONG * pulTime
-);
-
-#endif
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h
deleted file mode 100644
index 39033973ce..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/debugutil.h
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#define DEBUG_FLAG_INFO 0x00000001
-#define DEBUG_FLAG_WARN 0x00000002
-#define DEBUG_FLAG_ERROR 0x00000004
-
-//
-// Predefined error level values. These are backwards from the
-// windows definitions.
-//
-
-#define DEBUG_FLAGS_INFO (DEBUG_FLAG_ERROR | DEBUG_FLAG_WARN | DEBUG_FLAG_INFO)
-#define DEBUG_FLAGS_WARN (DEBUG_FLAG_ERROR | DEBUG_FLAG_WARN)
-#define DEBUG_FLAGS_ERROR (DEBUG_FLAG_ERROR)
-#define DEBUG_FLAGS_ANY (DEBUG_FLAG_INFO | DEBUG_FLAG_WARN | DEBUG_FLAG_ERROR)
-
-#define DEBUG_FLAGS_REGISTRY_LOCATION_A "DebugFlags"
-
-extern DWORD g_dwDebugFlags;
-
-static
-BOOL
-IfDebug(
- DWORD dwFlag
- )
-{
- return ( dwFlag & g_dwDebugFlags );
-}
-
-static
-VOID
-DebugPrint(
- DWORD dwFlag,
- LPCSTR szString
- )
-{
- STBUFF strOutput;
- HRESULT hr;
-
- if ( IfDebug( dwFlag ) )
- {
- hr = strOutput.Printf( "[dipmodule.dll] %s\r\n",
- szString );
-
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-
- OutputDebugStringA( strOutput.QueryStr() );
- }
-
-Finished:
-
- return;
-}
-
-static
-VOID
-DebugPrintf(
-DWORD dwFlag,
-LPCSTR szFormat,
-...
-)
-{
- STBUFF strCooked;
- STBUFF strOutput;
- va_list args;
- HRESULT hr;
-
- if ( IfDebug( dwFlag ) )
- {
- va_start( args, szFormat );
-
- hr = strCooked.Vsprintf( (LPSTR)szFormat, args );
-
- va_end( args );
-
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-
- DebugPrint( dwFlag, strCooked.QueryStr() );
- }
-
-Finished:
-
- return;
-}
-
-static void ReadDebugFlagFromRegistryKey(const char* pszRegKey, IN DWORD dwDefault)
-{
- HKEY hkey = NULL;
- g_dwDebugFlags = dwDefault;
- DWORD dwType;
- DWORD dwBuffer;
- DWORD cbBuffer = sizeof(dwBuffer);
-
- DWORD dwError = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
- pszRegKey,
- 0,
- KEY_READ,
- &hkey);
- if ( dwError == NO_ERROR && hkey != NULL)
- {
- dwError = RegQueryValueExA( hkey,
- DEBUG_FLAGS_REGISTRY_LOCATION_A,
- NULL,
- &dwType,
- (LPBYTE)&dwBuffer,
- &cbBuffer );
- if( ( dwError == NO_ERROR ) && ( dwType == REG_DWORD ) )
- {
- g_dwDebugFlags = dwBuffer;
- }
- RegCloseKey( hkey);
- hkey = NULL;
- }
-}
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h
deleted file mode 100644
index a86b0a1358..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashfn.h
+++ /dev/null
@@ -1,325 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef __HASHFN_H__
-#define __HASHFN_H__
-
-
-// Produce a scrambled, randomish number in the range 0 to RANDOM_PRIME-1.
-// Applying this to the results of the other hash functions is likely to
-// produce a much better distribution, especially for the identity hash
-// functions such as Hash(char c), where records will tend to cluster at
-// the low end of the hashtable otherwise. LKRhash applies this internally
-// to all hash signatures for exactly this reason.
-
-inline DWORD
-HashScramble(DWORD dwHash)
-{
- // Here are 10 primes slightly greater than 10^9
- // 1000000007, 1000000009, 1000000021, 1000000033, 1000000087,
- // 1000000093, 1000000097, 1000000103, 1000000123, 1000000181.
-
- // default value for "scrambling constant"
- const DWORD RANDOM_CONSTANT = 314159269UL;
- // large prime number, also used for scrambling
- const DWORD RANDOM_PRIME = 1000000007UL;
-
- return (RANDOM_CONSTANT * dwHash) % RANDOM_PRIME ;
-}
-
-
-// Faster scrambling function suggested by Eric Jacobsen
-
-inline DWORD
-HashRandomizeBits(DWORD dw)
-{
- return (((dw * 1103515245 + 12345) >> 16)
- | ((dw * 69069 + 1) & 0xffff0000));
-}
-
-
-// Small prime number used as a multiplier in the supplied hash functions
-const DWORD HASH_MULTIPLIER = 101;
-
-#undef HASH_SHIFT_MULTIPLY
-
-#ifdef HASH_SHIFT_MULTIPLY
-# define HASH_MULTIPLY(dw) (((dw) << 7) - (dw))
-#else
-# define HASH_MULTIPLY(dw) ((dw) * HASH_MULTIPLIER)
-#endif
-
-// Fast, simple hash function that tends to give a good distribution.
-// Apply HashScramble to the result if you're using this for something
-// other than LKRhash.
-
-inline DWORD
-HashString(
- const char* psz,
- DWORD dwHash = 0)
-{
- // force compiler to use unsigned arithmetic
- const unsigned char* upsz = (const unsigned char*) psz;
-
- for ( ; *upsz; ++upsz)
- dwHash = HASH_MULTIPLY(dwHash) + *upsz;
-
- return dwHash;
-}
-
-inline DWORD
-HashString(
- __in_ecount(cch) const char* psz,
- __in DWORD cch,
- __in DWORD dwHash
-)
-{
- // force compiler to use unsigned arithmetic
- const unsigned char* upsz = (const unsigned char*) psz;
-
- for (DWORD Index = 0;
- Index < cch;
- ++Index, ++upsz)
- {
- dwHash = HASH_MULTIPLY(dwHash) + *upsz;
- }
-
- return dwHash;
-}
-
-
-// Unicode version of above
-
-inline DWORD
-HashString(
- const wchar_t* pwsz,
- DWORD dwHash = 0)
-{
- for ( ; *pwsz; ++pwsz)
- dwHash = HASH_MULTIPLY(dwHash) + *pwsz;
-
- return dwHash;
-}
-
-// Based on length of the string instead of null-terminating character
-
-inline DWORD
-HashString(
- __in_ecount(cch) const wchar_t* pwsz,
- __in DWORD cch,
- __in DWORD dwHash
-)
-{
- for (DWORD Index = 0;
- Index < cch;
- ++Index, ++pwsz)
- {
- dwHash = HASH_MULTIPLY(dwHash) + *pwsz;
- }
-
- return dwHash;
-}
-
-
-// Quick-'n'-dirty case-insensitive string hash function.
-// Make sure that you follow up with _stricmp or _mbsicmp. You should
-// also cache the length of strings and check those first. Caching
-// an uppercase version of a string can help too.
-// Again, apply HashScramble to the result if using with something other
-// than LKRhash.
-// Note: this is not really adequate for MBCS strings.
-
-inline DWORD
-HashStringNoCase(
- const char* psz,
- DWORD dwHash = 0)
-{
- const unsigned char* upsz = (const unsigned char*) psz;
-
- for ( ; *upsz; ++upsz)
- dwHash = HASH_MULTIPLY(dwHash)
- + (*upsz & 0xDF); // strip off lowercase bit
-
- return dwHash;
-}
-
-inline DWORD
-HashStringNoCase(
- __in_ecount(cch)
- const char* psz,
- SIZE_T cch,
- DWORD dwHash)
-{
- const unsigned char* upsz = (const unsigned char*) psz;
-
- for (SIZE_T Index = 0;
- Index < cch;
- ++Index, ++upsz)
- {
- dwHash = HASH_MULTIPLY(dwHash)
- + (*upsz & 0xDF); // strip off lowercase bit
- }
- return dwHash;
-}
-
-
-// Unicode version of above
-
-inline DWORD
-HashStringNoCase(
- const wchar_t* pwsz,
- DWORD dwHash = 0)
-{
- for ( ; *pwsz; ++pwsz)
- dwHash = HASH_MULTIPLY(dwHash) + (*pwsz & 0xFFDF);
-
- return dwHash;
-}
-
-// Unicode version of above with length
-
-inline DWORD
-HashStringNoCase(
- __in_ecount(cch)
- const wchar_t* pwsz,
- SIZE_T cch,
- DWORD dwHash)
-{
- for (SIZE_T Index = 0;
- Index < cch;
- ++Index, ++pwsz)
- {
- dwHash = HASH_MULTIPLY(dwHash) + (*pwsz & 0xFFDF);
- }
- return dwHash;
-}
-
-
-// HashBlob returns the hash of a blob of arbitrary binary data.
-//
-// Warning: HashBlob is generally not the right way to hash a class object.
-// Consider:
-// class CFoo {
-// public:
-// char m_ch;
-// double m_d;
-// char* m_psz;
-// };
-//
-// inline DWORD Hash(const CFoo& rFoo)
-// { return HashBlob(&rFoo, sizeof(CFoo)); }
-//
-// This is the wrong way to hash a CFoo for two reasons: (a) there will be
-// a 7-byte gap between m_ch and m_d imposed by the alignment restrictions
-// of doubles, which will be filled with random data (usually non-zero for
-// stack variables), and (b) it hashes the address (rather than the
-// contents) of the string m_psz. Similarly,
-//
-// bool operator==(const CFoo& rFoo1, const CFoo& rFoo2)
-// { return memcmp(&rFoo1, &rFoo2, sizeof(CFoo)) == 0; }
-//
-// does the wrong thing. Much better to do this:
-//
-// DWORD Hash(const CFoo& rFoo)
-// {
-// return HashString(rFoo.m_psz,
-// HASH_MULTIPLIER * Hash(rFoo.m_ch)
-// + Hash(rFoo.m_d));
-// }
-//
-// Again, apply HashScramble if using with something other than LKRhash.
-
-inline DWORD
-HashBlob(
- const void* pv,
- size_t cb,
- DWORD dwHash = 0)
-{
- const BYTE * pb = static_cast<const BYTE *>(pv);
-
- while (cb-- > 0)
- dwHash = HASH_MULTIPLY(dwHash) + *pb++;
-
- return dwHash;
-}
-
-
-
-//
-// Overloaded hash functions for all the major builtin types.
-// Again, apply HashScramble to result if using with something other than
-// LKRhash.
-//
-
-inline DWORD Hash(const char* psz)
-{ return HashString(psz); }
-
-inline DWORD Hash(const unsigned char* pusz)
-{ return HashString(reinterpret_cast<const char*>(pusz)); }
-
-inline DWORD Hash(const signed char* pssz)
-{ return HashString(reinterpret_cast<const char*>(pssz)); }
-
-inline DWORD Hash(const wchar_t* pwsz)
-{ return HashString(pwsz); }
-
-inline DWORD
-Hash(
- const GUID* pguid,
- DWORD dwHash = 0)
-{
-
- return * reinterpret_cast<const DWORD *>(const_cast<GUID*>(pguid)) + dwHash;
-}
-
-// Identity hash functions: scalar values map to themselves
-inline DWORD Hash(char c)
-{ return c; }
-
-inline DWORD Hash(unsigned char uc)
-{ return uc; }
-
-inline DWORD Hash(signed char sc)
-{ return sc; }
-
-inline DWORD Hash(short sh)
-{ return sh; }
-
-inline DWORD Hash(unsigned short ush)
-{ return ush; }
-
-inline DWORD Hash(int i)
-{ return i; }
-
-inline DWORD Hash(unsigned int u)
-{ return u; }
-
-inline DWORD Hash(long l)
-{ return l; }
-
-inline DWORD Hash(unsigned long ul)
-{ return ul; }
-
-inline DWORD Hash(float f)
-{
- // be careful of rounding errors when computing keys
- union {
- float f;
- DWORD dw;
- } u;
- u.f = f;
- return u.dw;
-}
-
-inline DWORD Hash(double dbl)
-{
- // be careful of rounding errors when computing keys
- union {
- double dbl;
- DWORD dw[2];
- } u;
- u.dbl = dbl;
- return u.dw[0] * HASH_MULTIPLIER + u.dw[1];
-}
-
-#endif // __HASHFN_H__
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h
deleted file mode 100644
index a3cd2f5049..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hashtable.h
+++ /dev/null
@@ -1,666 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#include <crtdbg.h>
-#include "rwlock.h"
-#include "prime.h"
-
-template <class _Record>
-class HASH_NODE
-{
- template <class _Record, class _Key>
- friend class HASH_TABLE;
-
- HASH_NODE(
- _Record * pRecord,
- DWORD dwHash
- ) : _pNext (NULL),
- _pRecord (pRecord),
- _dwHash (dwHash)
- {}
-
- ~HASH_NODE()
- {
- _ASSERTE(_pRecord == NULL);
- }
-
- private:
- // Next node in the hash table look-aside
- HASH_NODE<_Record> *_pNext;
-
- // actual record
- _Record * _pRecord;
-
- // hash value
- DWORD _dwHash;
-};
-
-template <class _Record, class _Key>
-class HASH_TABLE
-{
-protected:
- typedef BOOL
- (PFN_DELETE_IF)(
- _Record * pRecord,
- PVOID pvContext
- );
-
- typedef VOID
- (PFN_APPLY)(
- _Record * pRecord,
- PVOID pvContext
- );
-
-public:
- HASH_TABLE(
- VOID
- )
- : _ppBuckets( NULL ),
- _nBuckets( 0 ),
- _nItems( 0 )
- {
- }
-
- virtual
- ~HASH_TABLE();
-
- virtual
- VOID
- ReferenceRecord(
- _Record * pRecord
- ) = 0;
-
- virtual
- VOID
- DereferenceRecord(
- _Record * pRecord
- ) = 0;
-
- virtual
- _Key
- ExtractKey(
- _Record * pRecord
- ) = 0;
-
- virtual
- DWORD
- CalcKeyHash(
- _Key key
- ) = 0;
-
- virtual
- BOOL
- EqualKeys(
- _Key key1,
- _Key key2
- ) = 0;
-
- DWORD
- Count(
- VOID
- ) const;
-
- bool
- IsInitialized(
- VOID
- ) const;
-
- virtual
- VOID
- Clear();
-
- HRESULT
- Initialize(
- DWORD nBucketSize
- );
-
- virtual
- VOID
- FindKey(
- _Key key,
- _Record ** ppRecord
- );
-
- virtual
- HRESULT
- InsertRecord(
- _Record * pRecord
- );
-
- virtual
- VOID
- DeleteKey(
- _Key key
- );
-
- virtual
- VOID
- DeleteIf(
- PFN_DELETE_IF pfnDeleteIf,
- PVOID pvContext
- );
-
- VOID
- Apply(
- PFN_APPLY pfnApply,
- PVOID pvContext
- );
-
-private:
-
- __success(*ppNode != NULL && return != FALSE)
- BOOL
- FindNodeInternal(
- _Key key,
- DWORD dwHash,
- __deref_out
- HASH_NODE<_Record> ** ppNode,
- __deref_opt_out
- HASH_NODE<_Record> *** pppPreviousNodeNextPointer = NULL
- );
-
- VOID
- DeleteNode(
- HASH_NODE<_Record> * pNode
- )
- {
- if (pNode->_pRecord != NULL)
- {
- DereferenceRecord(pNode->_pRecord);
- pNode->_pRecord = NULL;
- }
-
- delete pNode;
- }
-
- VOID
- RehashTableIfNeeded(
- VOID
- );
-
- HASH_NODE<_Record> ** _ppBuckets;
- DWORD _nBuckets;
- DWORD _nItems;
- //
- // Allow to use lock object in const methods.
- //
- mutable
- CWSDRWLock _tableLock;
-};
-
-template <class _Record, class _Key>
-HRESULT
-HASH_TABLE<_Record,_Key>::Initialize(
- DWORD nBuckets
-)
-{
- HRESULT hr = S_OK;
-
- if ( nBuckets == 0 )
- {
- hr = E_INVALIDARG;
- goto Failed;
- }
-
- if (nBuckets >= MAXDWORD/sizeof(HASH_NODE<_Record> *))
- {
- hr = E_INVALIDARG;
- goto Failed;
- }
-
- _ASSERTE(_ppBuckets == NULL );
- if ( _ppBuckets != NULL )
- {
- hr = E_INVALIDARG;
- goto Failed;
- }
-
- hr = _tableLock.Init();
- if ( FAILED( hr ) )
- {
- goto Failed;
- }
-
- _ppBuckets = (HASH_NODE<_Record> **)HeapAlloc(
- GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- nBuckets*sizeof(HASH_NODE<_Record> *));
- if (_ppBuckets == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- goto Failed;
- }
- _nBuckets = nBuckets;
-
- return S_OK;
-
-Failed:
-
- if (_ppBuckets)
- {
- HeapFree(GetProcessHeap(),
- 0,
- _ppBuckets);
- _ppBuckets = NULL;
- }
-
- return hr;
-}
-
-
-template <class _Record, class _Key>
-HASH_TABLE<_Record,_Key>::~HASH_TABLE()
-{
- if (_ppBuckets == NULL)
- {
- return;
- }
-
- _ASSERTE(_nItems == 0);
-
- HeapFree(GetProcessHeap(),
- 0,
- _ppBuckets);
- _ppBuckets = NULL;
- _nBuckets = 0;
-}
-
-template< class _Record, class _Key>
-DWORD
-HASH_TABLE<_Record,_Key>::Count() const
-{
- return _nItems;
-}
-
-template< class _Record, class _Key>
-bool
-HASH_TABLE<_Record,_Key>::IsInitialized(
- VOID
-) const
-{
- return _ppBuckets != NULL;
-}
-
-
-template <class _Record, class _Key>
-VOID
-HASH_TABLE<_Record,_Key>::Clear()
-{
- HASH_NODE<_Record> *pCurrent;
- HASH_NODE<_Record> *pNext;
-
- // This is here in the off cases where someone instantiates a hashtable
- // and then does an automatic "clear" before its destruction WITHOUT
- // ever initializing it.
- if ( ! _tableLock.QueryInited() )
- {
- return;
- }
-
- _tableLock.ExclusiveAcquire();
-
- for (DWORD i=0; i<_nBuckets; i++)
- {
- pCurrent = _ppBuckets[i];
- _ppBuckets[i] = NULL;
- while (pCurrent != NULL)
- {
- pNext = pCurrent->_pNext;
- DeleteNode(pCurrent);
- pCurrent = pNext;
- }
- }
-
- _nItems = 0;
- _tableLock.ExclusiveRelease();
-}
-
-template <class _Record, class _Key>
-__success(*ppNode != NULL && return != FALSE)
-BOOL
-HASH_TABLE<_Record,_Key>::FindNodeInternal(
- _Key key,
- DWORD dwHash,
- __deref_out
- HASH_NODE<_Record> ** ppNode,
- __deref_opt_out
- HASH_NODE<_Record> *** pppPreviousNodeNextPointer
-)
-/*++
- Return value indicates whether the item is found
- key, dwHash - key and hash for the node to find
- ppNode - on successful return, the node found, on failed return, the first
- node with hash value greater than the node to be found
- pppPreviousNodeNextPointer - the pointer to previous node's _pNext
-
- This routine may be called under either read or write lock
---*/
-{
- HASH_NODE<_Record> **ppPreviousNodeNextPointer;
- HASH_NODE<_Record> *pNode;
- BOOL fFound = FALSE;
-
- ppPreviousNodeNextPointer = _ppBuckets + (dwHash % _nBuckets);
- pNode = *ppPreviousNodeNextPointer;
- while (pNode != NULL)
- {
- if (pNode->_dwHash == dwHash)
- {
- if (EqualKeys(key,
- ExtractKey(pNode->_pRecord)))
- {
- fFound = TRUE;
- break;
- }
- }
- else if (pNode->_dwHash > dwHash)
- {
- break;
- }
-
- ppPreviousNodeNextPointer = &(pNode->_pNext);
- pNode = *ppPreviousNodeNextPointer;
- }
-
- __analysis_assume( (pNode == NULL && fFound == FALSE) ||
- (pNode != NULL && fFound == TRUE ) );
- *ppNode = pNode;
- if (pppPreviousNodeNextPointer != NULL)
- {
- *pppPreviousNodeNextPointer = ppPreviousNodeNextPointer;
- }
- return fFound;
-}
-
-template <class _Record, class _Key>
-VOID
-HASH_TABLE<_Record,_Key>::FindKey(
- _Key key,
- _Record ** ppRecord
-)
-{
- HASH_NODE<_Record> *pNode;
-
- *ppRecord = NULL;
-
- DWORD dwHash = CalcKeyHash(key);
-
- _tableLock.SharedAcquire();
-
- if (FindNodeInternal(key, dwHash, &pNode) &&
- pNode->_pRecord != NULL)
- {
- ReferenceRecord(pNode->_pRecord);
- *ppRecord = pNode->_pRecord;
- }
-
- _tableLock.SharedRelease();
-}
-
-template <class _Record, class _Key>
-HRESULT
-HASH_TABLE<_Record,_Key>::InsertRecord(
- _Record * pRecord
-)
-/*++
- This method inserts a node for this record and also empty nodes for paths
- in the hierarchy leading upto this path
-
- The insert is done under only a read-lock - this is possible by keeping
- the hashes in a bucket in increasing order and using interlocked operations
- to actually insert the item in the hash-bucket lookaside list and the parent
- children list
-
- Returns HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) if the record already exists.
- Never leak this error to the end user because "*file* already exists" may be confusing.
---*/
-{
- BOOL fLocked = FALSE;
- _Key key = ExtractKey(pRecord);
- DWORD dwHash = CalcKeyHash(key);
- HRESULT hr = S_OK;
- HASH_NODE<_Record> * pNewNode;
- HASH_NODE<_Record> * pNextNode;
- HASH_NODE<_Record> ** ppPreviousNodeNextPointer;
-
- //
- // Ownership of pRecord is not transferred to pNewNode yet, so remember
- // to either set it to null before deleting pNewNode or add an extra
- // reference later - this is to make sure we do not do an extra ref/deref
- // which users may view as getting flushed out of the hash-table
- //
- pNewNode = new HASH_NODE<_Record>(pRecord, dwHash);
- if (pNewNode == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- goto Finished;
- }
-
- _tableLock.SharedAcquire();
- fLocked = TRUE;
-
- do
- {
- //
- // Find the right place to add this node
- //
- if (FindNodeInternal(key, dwHash, &pNextNode, &ppPreviousNodeNextPointer))
- {
- //
- // If node already there, return error
- //
- pNewNode->_pRecord = NULL;
- DeleteNode(pNewNode);
-
- //
- // We should never leak this error to the end user
- // because "file already exists" may be confusing.
- //
- hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS);
- goto Finished;
- }
-
- //
- // If another node got inserted in between, we will have to retry
- //
- pNewNode->_pNext = pNextNode;
- } while (InterlockedCompareExchangePointer((PVOID *)ppPreviousNodeNextPointer,
- pNewNode,
- pNextNode) != pNextNode);
- // pass ownership of pRecord now
- if (pRecord != NULL)
- {
- ReferenceRecord(pRecord);
- pRecord = NULL;
- }
- InterlockedIncrement((LONG *)&_nItems);
-
-Finished:
-
- if (fLocked)
- {
- _tableLock.SharedRelease();
- }
-
- if (SUCCEEDED(hr))
- {
- RehashTableIfNeeded();
- }
-
- return hr;
-}
-
-template <class _Record, class _Key>
-VOID
-HASH_TABLE<_Record,_Key>::DeleteKey(
- _Key key
-)
-{
- HASH_NODE<_Record> *pNode;
- HASH_NODE<_Record> **ppPreviousNodeNextPointer;
-
- DWORD dwHash = CalcKeyHash(key);
-
- _tableLock.ExclusiveAcquire();
-
- if (FindNodeInternal(key, dwHash, &pNode, &ppPreviousNodeNextPointer))
- {
- *ppPreviousNodeNextPointer = pNode->_pNext;
- DeleteNode(pNode);
- _nItems--;
- }
-
- _tableLock.ExclusiveRelease();
-}
-
-template <class _Record, class _Key>
-VOID
-HASH_TABLE<_Record,_Key>::DeleteIf(
- PFN_DELETE_IF pfnDeleteIf,
- PVOID pvContext
-)
-{
- HASH_NODE<_Record> *pNode;
- HASH_NODE<_Record> **ppPreviousNodeNextPointer;
-
- _tableLock.ExclusiveAcquire();
-
- for (DWORD i=0; i<_nBuckets; i++)
- {
- ppPreviousNodeNextPointer = _ppBuckets + i;
- pNode = *ppPreviousNodeNextPointer;
- while (pNode != NULL)
- {
- //
- // Non empty nodes deleted based on DeleteIf, empty nodes deleted
- // if they have no children
- //
- if (pfnDeleteIf(pNode->_pRecord, pvContext))
- {
- *ppPreviousNodeNextPointer = pNode->_pNext;
- DeleteNode(pNode);
- _nItems--;
- }
- else
- {
- ppPreviousNodeNextPointer = &pNode->_pNext;
- }
-
- pNode = *ppPreviousNodeNextPointer;
- }
- }
-
- _tableLock.ExclusiveRelease();
-}
-
-template <class _Record, class _Key>
-VOID
-HASH_TABLE<_Record,_Key>::Apply(
- PFN_APPLY pfnApply,
- PVOID pvContext
-)
-{
- HASH_NODE<_Record> *pNode;
-
- _tableLock.SharedAcquire();
-
- for (DWORD i=0; i<_nBuckets; i++)
- {
- pNode = _ppBuckets[i];
- while (pNode != NULL)
- {
- if (pNode->_pRecord != NULL)
- {
- pfnApply(pNode->_pRecord, pvContext);
- }
-
- pNode = pNode->_pNext;
- }
- }
-
- _tableLock.SharedRelease();
-}
-
-template <class _Record, class _Key>
-VOID
-HASH_TABLE<_Record,_Key>::RehashTableIfNeeded(
- VOID
-)
-{
- HASH_NODE<_Record> **ppBuckets;
- DWORD nBuckets;
- HASH_NODE<_Record> *pNode;
- HASH_NODE<_Record> *pNextNode;
- HASH_NODE<_Record> **ppNextPointer;
- HASH_NODE<_Record> *pNewNextNode;
- DWORD nNewBuckets;
-
- //
- // If number of items has become too many, we will double the hash table
- // size (we never reduce it however)
- //
- if (_nItems <= PRIME::GetPrime(2*_nBuckets))
- {
- return;
- }
-
- _tableLock.ExclusiveAcquire();
-
- nNewBuckets = PRIME::GetPrime(2*_nBuckets);
-
- if (_nItems <= nNewBuckets)
- {
- goto Finished;
- }
-
- nBuckets = nNewBuckets;
- if (nBuckets >= 0xffffffff/sizeof(HASH_NODE<_Record> *))
- {
- goto Finished;
- }
- ppBuckets = (HASH_NODE<_Record> **)HeapAlloc(
- GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- nBuckets*sizeof(HASH_NODE<_Record> *));
- if (ppBuckets == NULL)
- {
- goto Finished;
- }
-
- //
- // Take out nodes from the old hash table and insert in the new one, make
- // sure to keep the hashes in increasing order
- //
- for (DWORD i=0; i<_nBuckets; i++)
- {
- pNode = _ppBuckets[i];
- while (pNode != NULL)
- {
- pNextNode = pNode->_pNext;
-
- ppNextPointer = ppBuckets + (pNode->_dwHash % nBuckets);
- pNewNextNode = *ppNextPointer;
- while (pNewNextNode != NULL &&
- pNewNextNode->_dwHash <= pNode->_dwHash)
- {
- ppNextPointer = &pNewNextNode->_pNext;
- pNewNextNode = pNewNextNode->_pNext;
- }
- pNode->_pNext = pNewNextNode;
- *ppNextPointer = pNode;
-
- pNode = pNextNode;
- }
- }
-
- HeapFree(GetProcessHeap(), 0, _ppBuckets);
- _ppBuckets = ppBuckets;
- _nBuckets = nBuckets;
- ppBuckets = NULL;
-
-Finished:
-
- _tableLock.ExclusiveRelease();
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h
deleted file mode 100644
index 2ea6b77bca..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/http_xp.h
+++ /dev/null
@@ -1,2797 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef __HTTP_H__
-#define __HTTP_H__
-
-#pragma once
-
-#if _WIN32_WINNT >= 0x0501
-
-//
-// HTTPAPI is available on
-//
-// a) WinXP SP2 and higher
-// b) Windows 2003 and higher
-// c) Vista and higher.
-//
-
-
-
-
-#include <winsock2.h>
-#include <ws2tcpip.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif // __cplusplus
-
-
-//
-// Flags for HttpInitialize() and HttpTerminate().
-//
-
-//
-// HTTP_INITIALIZE_SERVER - Initializes the HTTP API layer and driver for
-// applications using server APIs.
-//
-// HTTP_INITIALIZE_CONFIG - Initializes the HTTP API layer and driver for
-// applications using HTTP configuration APIs.
-//
-//
-// Notes -
-//
-// 1. These flags can be used in combination.
-//
-// 2. HttpTerminate() must be called for each call to HttpInitialize() made
-// with each flag set when invoking HttpInitialize. For example, one
-// could make two calls to HttpInitialize() setting HTTP_INITIALIZE_SERVER
-// the first time and HTTP_INITIALIZE_CONFIG the second time. One call
-// to HttpTerminate() with both flags set suffices to clean up both
-// calls to HttpInitialize().
-//
-
-#define HTTP_INITIALIZE_SERVER 0x00000001
-#define HTTP_INITIALIZE_CONFIG 0x00000002
-
-#if _WIN32_WINNT <= 0x0501
-#define BUILD_IIS_FOR_XP 1
-#endif
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-//
-// Following section defines the properties supported by the
-// server side HTTP API.
-//
-
-typedef enum _HTTP_SERVER_PROPERTY
-{
- //
- // Used for enabling server side authentication.
- //
-
- HttpServerAuthenticationProperty,
-
- //
- // Used for enabling logging.
- //
-
- HttpServerLoggingProperty,
-
- //
- // Used for setting QoS properties.
- //
-
- HttpServerQosProperty,
-
- //
- // Used for configuring timeouts.
- //
-
- HttpServerTimeoutsProperty,
-
- //
- // Used for limiting request queue lengths.
- //
-
- HttpServerQueueLengthProperty,
-
- //
- // Used for manipulating the state.
- //
-
- HttpServerStateProperty,
-
- //
- // Used for modifying the verbosity level of 503 type responses
- // generated by server side API.
- //
-
- HttpServer503VerbosityProperty,
-
- //
- // Used for manipulating Url Group to Request Queue association.
- //
-
- HttpServerBindingProperty,
-
- //
- // Extended authentication property.
- //
-
- HttpServerExtendedAuthenticationProperty,
-
- //
- // Listening endpoint property.
- //
-
- HttpServerListenEndpointProperty
-
- //
- // Authentication channel binding property
- //
-
-#endif
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP
-
- ,HttpServerChannelBindProperty
-
- //
- // IP Protection level policy for a Url Group.
- //
-
- ,HttpServerProtectionLevelProperty
-#endif
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-
-} HTTP_SERVER_PROPERTY, *PHTTP_SERVER_PROPERTY;
-
-
-#define HTTP_MAX_SERVER_QUEUE_LENGTH 0x7FFFFFFF
-#define HTTP_MIN_SERVER_QUEUE_LENGTH 1
-
-//
-// Generic property flags. Each structure defining a property info typically
-// contain an element of this type.
-//
-
-typedef struct _HTTP_PROPERTY_FLAGS
-{
- ULONG Present:1;
-
-} HTTP_PROPERTY_FLAGS, *PHTTP_PROPERTY_FLAGS;
-
-//
-// Enabled state.
-//
-
-typedef enum _HTTP_ENABLED_STATE
-{
- HttpEnabledStateActive,
- HttpEnabledStateInactive,
-
-} HTTP_ENABLED_STATE, *PHTTP_ENABLED_STATE;
-
-
-typedef struct _HTTP_STATE_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
- HTTP_ENABLED_STATE State;
-
-} HTTP_STATE_INFO, *PHTTP_STATE_INFO;
-
-//
-// Defines the verbosity level for a request queue which will be used
-// when sending "503 - Service Unavailable" type error responses. Note that
-// this setting only affects the error responses generated internally
-// by HTTPAPI.
-//
-
-typedef enum _HTTP_503_RESPONSE_VERBOSITY
-{
- //
- // Instead of sending a 503 response, the connection will be reset.
- // This is the default behavior.
- //
- Http503ResponseVerbosityBasic,
-
- //
- // Will send a 503 w/ a generic reason phrase.
- //
- Http503ResponseVerbosityLimited,
-
- //
- // Will send a 503 w/ a detailed reason phrase.
- //
- Http503ResponseVerbosityFull
-
-} HTTP_503_RESPONSE_VERBOSITY, *PHTTP_503_RESPONSE_VERBOSITY;
-
-//
-// Network QoS related.
-//
-
-typedef enum _HTTP_QOS_SETTING_TYPE
-{
- HttpQosSettingTypeBandwidth,
- HttpQosSettingTypeConnectionLimit,
- HttpQosSettingTypeFlowRate
-
-} HTTP_QOS_SETTING_TYPE, *PHTTP_QOS_SETTING_TYPE;
-
-typedef struct _HTTP_QOS_SETTING_INFO
-{
- HTTP_QOS_SETTING_TYPE QosType;
- PVOID QosSetting;
-} HTTP_QOS_SETTING_INFO, *PHTTP_QOS_SETTING_INFO;
-
-typedef struct _HTTP_CONNECTION_LIMIT_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
- ULONG MaxConnections;
-
-} HTTP_CONNECTION_LIMIT_INFO, *PHTTP_CONNECTION_LIMIT_INFO;
-
-typedef struct _HTTP_BANDWIDTH_LIMIT_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
- ULONG MaxBandwidth;
-
-} HTTP_BANDWIDTH_LIMIT_INFO, *PHTTP_BANDWIDTH_LIMIT_INFO;
-
-typedef struct _HTTP_FLOWRATE_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
- ULONG MaxBandwidth;
- ULONG MaxPeakBandwidth;
- ULONG BurstSize;
-
-} HTTP_FLOWRATE_INFO, *PHTTP_FLOWRATE_INFO;
-
-//
-// Bandwidth throttling limit can not be set lower than the following
-// number. The value is in bytes/sec.
-//
-
-#define HTTP_MIN_ALLOWED_BANDWIDTH_THROTTLING_RATE ((ULONG)1024)
-
-//
-// Distinguished value for bandwidth, connection limits and logging rollover
-// size indicating "no limit".
-//
-
-#define HTTP_LIMIT_INFINITE ((ULONG)-1)
-
-//
-// Timeout information.
-//
-
-//
-// For manipulating global timeout settings.
-// These timers run when connection does not belong to any application.
-// Value zero is not allowed for driver wide timeout settings.
-//
-
-typedef enum _HTTP_SERVICE_CONFIG_TIMEOUT_KEY
-{
- IdleConnectionTimeout = 0,
- HeaderWaitTimeout
-
-} HTTP_SERVICE_CONFIG_TIMEOUT_KEY, *PHTTP_SERVICE_CONFIG_TIMEOUT_KEY;
-
-typedef USHORT HTTP_SERVICE_CONFIG_TIMEOUT_PARAM,
- *PHTTP_SERVICE_CONFIG_TIMEOUT_PARAM;
-
-//
-// To set a timeout value use the set structure. To query/delete use the key
-// directly. When you query a timeout value the output buffer must be exactly
-// the sizeof param.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_TIMEOUT_SET
-{
- HTTP_SERVICE_CONFIG_TIMEOUT_KEY KeyDesc;
- HTTP_SERVICE_CONFIG_TIMEOUT_PARAM ParamDesc;
-
-} HTTP_SERVICE_CONFIG_TIMEOUT_SET, *PHTTP_SERVICE_CONFIG_TIMEOUT_SET;
-
-//
-// For manipulating application specific timeout settings.
-// These timers run when there's a request being processed on a connection
-// and HTTPAPI has already associated the request with an application.
-// Setting a timeout value to zero will cause HTTPAPI to revert to default.
-//
-
-typedef struct _HTTP_TIMEOUT_LIMIT_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
-
- //
- // Timeouts configured in seconds.
- //
-
- USHORT EntityBody;
- USHORT DrainEntityBody;
- USHORT RequestQueue;
-
- //
- // Following two timeouts are only enforced after first request on
- // connection is routed to the application. These will not manipulate
- // the driver wide timeouts.
- //
-
- USHORT IdleConnection;
- USHORT HeaderWait;
-
- //
- // Timeouts configured in bytes/second.
- // This timer can be turned off by setting it to MAXULONG.
- //
-
- ULONG MinSendRate;
-
-} HTTP_TIMEOUT_LIMIT_INFO, *PHTTP_TIMEOUT_LIMIT_INFO;
-
-//
-// Controls whether IP-based URLs should listen on the specific IP or wildcard.
-//
-
-typedef struct _HTTP_LISTEN_ENDPOINT_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
-
- BOOLEAN EnableSharing;
-
-} HTTP_LISTEN_ENDPOINT_INFO, *PHTTP_LISTEN_ENDPOINT_INFO;
-
-
-typedef struct _HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS
-{
- USHORT DomainNameLength;
- PWSTR DomainName;
- USHORT RealmLength;
- PWSTR Realm;
-} HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS,
- *PHTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS;
-
-typedef struct _HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS
-{
- USHORT RealmLength;
- PWSTR Realm;
-} HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS,
- *PHTTP_SERVER_AUTHENTICATION_BASIC_PARAMS;
-
-//
-// Definitions used for setting server side authentication property.
-//
-
-#define HTTP_AUTH_ENABLE_BASIC (0x00000001)
-#define HTTP_AUTH_ENABLE_DIGEST (0x00000002)
-#define HTTP_AUTH_ENABLE_NTLM (0x00000004)
-#define HTTP_AUTH_ENABLE_NEGOTIATE (0x00000008)
-#define HTTP_AUTH_ENABLE_KERBEROS (0x00000010)
-
-#define HTTP_AUTH_ENABLE_ALL \
- (HTTP_AUTH_ENABLE_BASIC |\
- HTTP_AUTH_ENABLE_DIGEST |\
- HTTP_AUTH_ENABLE_NTLM |\
- HTTP_AUTH_ENABLE_NEGOTIATE |\
- HTTP_AUTH_ENABLE_KERBEROS)
-
-
-C_ASSERT(HTTP_AUTH_ENABLE_NEGOTIATE > HTTP_AUTH_ENABLE_NTLM);
-C_ASSERT(HTTP_AUTH_ENABLE_NTLM > HTTP_AUTH_ENABLE_DIGEST);
-C_ASSERT(HTTP_AUTH_ENABLE_DIGEST > HTTP_AUTH_ENABLE_BASIC);
-
-#define HTTP_AUTH_EX_FLAG_ENABLE_KERBEROS_CREDENTIAL_CACHING (0x01)
-#define HTTP_AUTH_EX_FLAG_CAPTURE_CREDENTIAL (0x02)
-
-typedef struct _HTTP_SERVER_AUTHENTICATION_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
-
- ULONG AuthSchemes;
-
- BOOLEAN ReceiveMutualAuth;
- BOOLEAN ReceiveContextHandle;
- BOOLEAN DisableNTLMCredentialCaching;
-
- UCHAR ExFlags;
-
- HTTP_SERVER_AUTHENTICATION_DIGEST_PARAMS DigestParams;
- HTTP_SERVER_AUTHENTICATION_BASIC_PARAMS BasicParams;
-
-} HTTP_SERVER_AUTHENTICATION_INFO, *PHTTP_SERVER_AUTHENTICATION_INFO;
-
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP
-
-//
-// Definitions for setting authentication channel binding properties
-//
-
-typedef enum _HTTP_SERVICE_BINDING_TYPE
-{
- HttpServiceBindingTypeNone = 0,
- HttpServiceBindingTypeW,
- HttpServiceBindingTypeA
-
-} HTTP_SERVICE_BINDING_TYPE;
-
-typedef struct _HTTP_SERVICE_BINDING_BASE
-{
- HTTP_SERVICE_BINDING_TYPE Type;
-
-} HTTP_SERVICE_BINDING_BASE, *PHTTP_SERVICE_BINDING_BASE;
-
-typedef struct _HTTP_SERVICE_BINDING_A
-{
- HTTP_SERVICE_BINDING_BASE Base;
- PCHAR Buffer;
- ULONG BufferSize;
-
-} HTTP_SERVICE_BINDING_A, *PHTTP_SERVICE_BINDING_A;
-
-typedef struct _HTTP_SERVICE_BINDING_W
-{
- HTTP_SERVICE_BINDING_BASE Base;
- PWCHAR Buffer;
- ULONG BufferSize;
-
-} HTTP_SERVICE_BINDING_W, *PHTTP_SERVICE_BINDING_W;
-
-typedef enum _HTTP_AUTHENTICATION_HARDENING_LEVELS
-{
- HttpAuthenticationHardeningLegacy = 0,
- HttpAuthenticationHardeningMedium,
- HttpAuthenticationHardeningStrict
-
-} HTTP_AUTHENTICATION_HARDENING_LEVELS;
-
-//
-// Channel binding token verification flags.
-//
-
-#define HTTP_CHANNEL_BIND_PROXY 0x1
-#define HTTP_CHANNEL_BIND_PROXY_COHOSTING 0x20
-
-//
-// Service bind verification flags
-//
-
-#define HTTP_CHANNEL_BIND_NO_SERVICE_NAME_CHECK 0x2
-#define HTTP_CHANNEL_BIND_DOTLESS_SERVICE 0x4
-
-//
-// Flags triggering channel bind parameters retrieval
-//
-
-#define HTTP_CHANNEL_BIND_SECURE_CHANNEL_TOKEN 0x8
-#define HTTP_CHANNEL_BIND_CLIENT_SERVICE 0x10
-
-//
-// All valid flags (mask for internal checks)
-//
-
-typedef struct _HTTP_CHANNEL_BIND_INFO
-{
- HTTP_AUTHENTICATION_HARDENING_LEVELS Hardening;
- ULONG Flags;
- PHTTP_SERVICE_BINDING_BASE * ServiceNames;
- ULONG NumberOfServiceNames;
-
-} HTTP_CHANNEL_BIND_INFO, *PHTTP_CHANNEL_BIND_INFO;
-
-typedef struct _HTTP_REQUEST_CHANNEL_BIND_STATUS
-{
- PHTTP_SERVICE_BINDING_BASE ServiceName;
- PUCHAR ChannelToken;
- ULONG ChannelTokenSize;
- ULONG Flags;
-
-} HTTP_REQUEST_CHANNEL_BIND_STATUS, *PHTTP_REQUEST_CHANNEL_BIND_STATUS;
-
-#endif
-
-//
-// Definitions used for setting logging property.
-//
-
-//
-// The known log fields recognized/supported by HTTPAPI. Following fields
-// are used for W3C logging. Subset of them are also used for error
-// logging.
-//
-
-#define HTTP_LOG_FIELD_DATE 0x00000001
-#define HTTP_LOG_FIELD_TIME 0x00000002
-#define HTTP_LOG_FIELD_CLIENT_IP 0x00000004
-#define HTTP_LOG_FIELD_USER_NAME 0x00000008
-#define HTTP_LOG_FIELD_SITE_NAME 0x00000010
-#define HTTP_LOG_FIELD_COMPUTER_NAME 0x00000020
-#define HTTP_LOG_FIELD_SERVER_IP 0x00000040
-#define HTTP_LOG_FIELD_METHOD 0x00000080
-#define HTTP_LOG_FIELD_URI_STEM 0x00000100
-#define HTTP_LOG_FIELD_URI_QUERY 0x00000200
-#define HTTP_LOG_FIELD_STATUS 0x00000400
-#define HTTP_LOG_FIELD_WIN32_STATUS 0x00000800
-#define HTTP_LOG_FIELD_BYTES_SENT 0x00001000
-#define HTTP_LOG_FIELD_BYTES_RECV 0x00002000
-#define HTTP_LOG_FIELD_TIME_TAKEN 0x00004000
-#define HTTP_LOG_FIELD_SERVER_PORT 0x00008000
-#define HTTP_LOG_FIELD_USER_AGENT 0x00010000
-#define HTTP_LOG_FIELD_COOKIE 0x00020000
-#define HTTP_LOG_FIELD_REFERER 0x00040000
-#define HTTP_LOG_FIELD_VERSION 0x00080000
-#define HTTP_LOG_FIELD_HOST 0x00100000
-#define HTTP_LOG_FIELD_SUB_STATUS 0x00200000
-
-//
-// Fields that are used only for error logging.
-//
-
-#define HTTP_LOG_FIELD_CLIENT_PORT 0x00400000
-#define HTTP_LOG_FIELD_URI 0x00800000
-#define HTTP_LOG_FIELD_SITE_ID 0x01000000
-#define HTTP_LOG_FIELD_REASON 0x02000000
-#define HTTP_LOG_FIELD_QUEUE_NAME 0x04000000
-
-//
-// Defines the logging type.
-//
-
-typedef enum _HTTP_LOGGING_TYPE
-{
- HttpLoggingTypeW3C,
- HttpLoggingTypeIIS,
- HttpLoggingTypeNCSA,
- HttpLoggingTypeRaw
- ,HttpLoggingTypeMaximum
-
-} HTTP_LOGGING_TYPE, *PHTTP_LOGGING_TYPE;
-
-//
-// Defines the rollover type for log files.
-//
-
-typedef enum _HTTP_LOGGING_ROLLOVER_TYPE
-{
- HttpLoggingRolloverSize,
- HttpLoggingRolloverDaily,
- HttpLoggingRolloverWeekly,
- HttpLoggingRolloverMonthly,
- HttpLoggingRolloverHourly
-
-} HTTP_LOGGING_ROLLOVER_TYPE, *PHTTP_LOGGING_ROLLOVER_TYPE;
-
-//
-// Log file rollover size can not be set lower than the following
-// limit. The value is in bytes.
-//
-
-#define HTTP_MIN_ALLOWED_LOG_FILE_ROLLOVER_SIZE ((ULONG)(1 * 1024 * 1024))
-
-//
-// Logging option flags. When used in the logging configuration alters
-// some default logging behaviour.
-//
-// HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER - This flag is used to change
-// the log file rollover to happen by local time based. By default
-// log file rollovers happen by GMT time.
-//
-// HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION - When set the unicode fields
-// will be converted to UTF8 multibytes when writing to the log
-// files. When this flag is not present, the local code page
-// conversion happens.
-//
-// HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY -
-// HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY - These two flags are used to
-// to do selective logging. If neither of them are present both
-// types of requests will be logged. Only one these flags can be
-// set at a time. They are mutually exclusive.
-//
-
-#define HTTP_LOGGING_FLAG_LOCAL_TIME_ROLLOVER (0x00000001)
-#define HTTP_LOGGING_FLAG_USE_UTF8_CONVERSION (0x00000002)
-#define HTTP_LOGGING_FLAG_LOG_ERRORS_ONLY (0x00000004)
-#define HTTP_LOGGING_FLAG_LOG_SUCCESS_ONLY (0x00000008)
-
-//
-// Configuration structure used for setting the logging property.
-//
-
-typedef struct _HTTP_LOGGING_INFO
-{
- //
- // Specifies whether this property exists or not.
- //
-
- HTTP_PROPERTY_FLAGS Flags;
-
- //
- // Optional logging flags.
- //
-
- ULONG LoggingFlags;
-
- //
- // Optional informatonal software directive string for W3C type logging. Not
- // used for other types of logging. If nothing is provided here HTTPAPI will
- // log a default string. Any arbitrary string could be used here to identify
- // the application. Length cannot be greater than MAX_PATH. Lenght is in
- // bytes.
- //
-
- PCWSTR SoftwareName;
- USHORT SoftwareNameLength;
-
- //
- // Log file directory must be a fully qualified path.
- // Length must be in number of bytes.
- //
-
- USHORT DirectoryNameLength;
- PCWSTR DirectoryName;
-
- //
- // Specifies the format for the log files.
- //
-
- HTTP_LOGGING_TYPE Format;
-
- //
- // Bitmask value indicates which fields to be logged
- // if the log format is set to W3C. This must be the 'bitwise or'
- // of the HTTP_LOG_FIELD_... values.
- //
-
- ULONG Fields;
-
- //
- // Following fields are reserved they must be NULL and zero..
- //
-
- PVOID pExtFields;
- USHORT NumOfExtFields;
-
- //
- // Reserved must be zero.
- //
-
- USHORT MaxRecordSize;
-
- //
- // Defines the rollover type for the log files.
- //
-
- HTTP_LOGGING_ROLLOVER_TYPE RolloverType;
-
- //
- // Indicates the maximum size (in bytes) after which
- // the log files should be rolled over. A value of -1
- // (HTTP_LIMIT_INFINITE) indicates an unlimited size.
- // This value is discarded if rollover type is not set to
- // HttpLoggingRolloverSize.
- //
-
- ULONG RolloverSize;
-
- //
- // Specifies the security descriptor to be applied to
- // the log files and the sub-directories. If null we will
- // inherit the system default. This security descriptor must
- // be self-relative.
- //
-
- PSECURITY_DESCRIPTOR pSecurityDescriptor;
-
-} HTTP_LOGGING_INFO, *PHTTP_LOGGING_INFO;
-
-//
-// Binding information.
-//
-
-typedef struct _HTTP_BINDING_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
- HANDLE RequestQueueHandle;
-
-} HTTP_BINDING_INFO, *PHTTP_BINDING_INFO;
-
-#endif
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP
-
-//
-// Defines the protection level types for UrlGroups.
-//
-
-typedef enum _HTTP_PROTECTION_LEVEL_TYPE
-{
- //
- // This option will allow edge (NAT) traversed traffic, i.e. Teredo
- // for the UrlGroup, unless there is an admin rule that overwrites the
- // application's intend.
- //
-
- HttpProtectionLevelUnrestricted,
-
- //
- // This setting will ensure that edge (NAT) traversed traffic
- // will not be allowed.
- //
-
- HttpProtectionLevelEdgeRestricted,
-
- //
- // Below type is not supported by HTTP API.
- //
-
- HttpProtectionLevelRestricted
-
-
-} HTTP_PROTECTION_LEVEL_TYPE, *PHTTP_PROTECTION_LEVEL_TYPE;
-
-//
-// Controls whether the associated UrlGroup Namespace should receive
-// edge traversed traffic. By default this parameter is unspecified.
-//
-
-typedef struct _HTTP_PROTECTION_LEVEL_INFO
-{
- HTTP_PROPERTY_FLAGS Flags;
- HTTP_PROTECTION_LEVEL_TYPE Level;
-
-} HTTP_PROTECTION_LEVEL_INFO, *PHTTP_PROTECTION_LEVEL_INFO;
-
-#endif
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-
-//
-// Definitions for request queue manipulation.
-//
-// These flags are used with HttpCreateRequestQueue() API.
-//
-// HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING - To open an existing request
-// queue. The request queue name must be supplied.
-//
-// HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER - Creates the request queue and
-// marks that the caller process is not willing to do send/receive (HTTP I/O)on
-// the handle directly.
-//
-
-#define HTTP_CREATE_REQUEST_QUEUE_FLAG_OPEN_EXISTING (0x00000001)
-#define HTTP_CREATE_REQUEST_QUEUE_FLAG_CONTROLLER (0x00000002)
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// Flags for HttpReceiveHttpRequest().
-//
-// HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY - Specifies that the caller would like
-// any available entity body to be copied along with the protocol headers.
-//
-// HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY - Specifies that the caller would like
-// all of the entity bodies to be copied along with the protocol headers.
-//
-
-#define HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY 0x00000001
-#define HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY 0x00000002
-
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-//
-// Flags for HttpReceiveRequestEntityBody().
-//
-// HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER - Specifies that the
-// caller would like the buffer to get filled up with entity bodies unless
-// there are no more entity bodies to be copied.
-//
-
-#define HTTP_RECEIVE_REQUEST_ENTITY_BODY_FLAG_FILL_BUFFER 0x00000001
-
-#endif // _WIN32_WINNT >= 0x0600
-
-
-//
-// Flags for HttpSendHttpResponse() and HttpSendResponseEntityBody().
-//
-// HTTP_SEND_RESPONSE_FLAG_DISCONNECT - Specifies that the network connection
-// should be disconnected immediately after sending the response, overriding
-// the HTTP protocol's persistent connection features, such as
-// "Connection: keep-alive".
-//
-// HTTP_SEND_RESPONSE_FLAG_MORE_DATA - Specifies that additional entity body
-// data will be sent by the caller.
-//
-// HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA - Specifies that a caller wants the
-// response to complete as soon as possible at the cost of buffering partial
-// or the entire response.
-//
-// HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING - Specifies that a caller wants to
-// enable the TCP nagling algorithm for this particular send.
-//
-// HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES - Specifies that for a range request
-// a full response content is passed and a caller wants HTTP API to process
-// ranges properly.
-//
-
-#define HTTP_SEND_RESPONSE_FLAG_DISCONNECT 0x00000001
-#define HTTP_SEND_RESPONSE_FLAG_MORE_DATA 0x00000002
-#define HTTP_SEND_RESPONSE_FLAG_BUFFER_DATA 0x00000004
-#define HTTP_SEND_RESPONSE_FLAG_ENABLE_NAGLING 0x00000008
-#define HTTP_SEND_RESPONSE_FLAG_PROCESS_RANGES 0x00000020
-
-
-//
-// Flags for HttpFlushResponseCache().
-//
-// HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE - Flushes the specified URL and all
-// hierarchally-related sub-URLs from the response or fragment cache.
-//
-
-#define HTTP_FLUSH_RESPONSE_FLAG_RECURSIVE 0x00000001
-
-
-//
-// Opaque identifiers for various HTTPAPI objects.
-//
-
-typedef ULONGLONG HTTP_OPAQUE_ID, *PHTTP_OPAQUE_ID;
-
-typedef HTTP_OPAQUE_ID HTTP_REQUEST_ID, *PHTTP_REQUEST_ID;
-typedef HTTP_OPAQUE_ID HTTP_CONNECTION_ID, *PHTTP_CONNECTION_ID;
-typedef HTTP_OPAQUE_ID HTTP_RAW_CONNECTION_ID, *PHTTP_RAW_CONNECTION_ID;
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-typedef HTTP_OPAQUE_ID HTTP_URL_GROUP_ID, *PHTTP_URL_GROUP_ID;
-typedef HTTP_OPAQUE_ID HTTP_SERVER_SESSION_ID, *PHTTP_SERVER_SESSION_ID;
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// Macros for opaque identifier manipulations.
-//
-
-#define HTTP_NULL_ID (0ui64)
-#define HTTP_IS_NULL_ID(pid) (HTTP_NULL_ID == *(pid))
-#define HTTP_SET_NULL_ID(pid) (*(pid) = HTTP_NULL_ID)
-
-//
-// This structure defines a file byte range.
-//
-// If the Length field is HTTP_BYTE_RANGE_TO_EOF then the remainder of the
-// file (everything after StartingOffset) is sent.
-//
-
-#define HTTP_BYTE_RANGE_TO_EOF ((ULONGLONG)-1)
-
-typedef struct _HTTP_BYTE_RANGE
-{
- ULARGE_INTEGER StartingOffset;
- ULARGE_INTEGER Length;
-
-} HTTP_BYTE_RANGE, *PHTTP_BYTE_RANGE;
-
-//
-// The type for HTTP protocol version numbers.
-//
-
-typedef struct _HTTP_VERSION
-{
- USHORT MajorVersion;
- USHORT MinorVersion;
-
-} HTTP_VERSION, *PHTTP_VERSION;
-
-//
-// Some useful macros for HTTP protocol version manipulation.
-//
-
-#define HTTP_VERSION_UNKNOWN { 0, 0 }
-#define HTTP_VERSION_0_9 { 0, 9 }
-#define HTTP_VERSION_1_0 { 1, 0 }
-#define HTTP_VERSION_1_1 { 1, 1 }
-
-#define HTTP_SET_VERSION(version, major, minor) \
-do { \
- (version).MajorVersion = (major); \
- (version).MinorVersion = (minor); \
-} while (0, 0)
-
-#define HTTP_EQUAL_VERSION(version, major, minor) \
- ((version).MajorVersion == (major) && \
- (version).MinorVersion == (minor))
-
-#define HTTP_GREATER_VERSION(version, major, minor) \
- ((version).MajorVersion > (major) || \
- ((version).MajorVersion == (major) && \
- (version).MinorVersion > (minor)))
-
-#define HTTP_LESS_VERSION(version, major, minor) \
- ((version).MajorVersion < (major) || \
- ((version).MajorVersion == (major) && \
- (version).MinorVersion < (minor)))
-
-#define HTTP_NOT_EQUAL_VERSION(version, major, minor) \
- (!HTTP_EQUAL_VERSION(version, major, minor))
-
-#define HTTP_GREATER_EQUAL_VERSION(version, major, minor) \
- (!HTTP_LESS_VERSION(version, major, minor))
-
-#define HTTP_LESS_EQUAL_VERSION(version, major, minor) \
- (!HTTP_GREATER_VERSION(version, major, minor))
-
-//
-// The enum type for HTTP verbs.
-//
-
-typedef enum _HTTP_VERB
-{
- HttpVerbUnparsed,
- HttpVerbUnknown,
- HttpVerbInvalid,
- HttpVerbOPTIONS,
- HttpVerbGET,
- HttpVerbHEAD,
- HttpVerbPOST,
- HttpVerbPUT,
- HttpVerbDELETE,
- HttpVerbTRACE,
- HttpVerbCONNECT,
- HttpVerbTRACK, // used by Microsoft Cluster Server for a non-logged trace
- HttpVerbMOVE,
- HttpVerbCOPY,
- HttpVerbPROPFIND,
- HttpVerbPROPPATCH,
- HttpVerbMKCOL,
- HttpVerbLOCK,
- HttpVerbUNLOCK,
- HttpVerbSEARCH,
-
- HttpVerbMaximum
-
-} HTTP_VERB, *PHTTP_VERB;
-
-//
-// Symbols for all HTTP/1.1 headers and other tokens. Notice request +
-// response values overlap. Make sure you know which type of header array
-// you are indexing.
-//
-// These values are used as offsets into arrays and as token values in
-// HTTP_KNOWN_HEADER arrays in HTTP_REQUEST_HEADERS and HTTP_RESPONSE_HEADERS.
-//
-// See RFC 2616, HTTP/1.1, for further explanation of most of these headers.
-//
-
-typedef enum _HTTP_HEADER_ID
-{
- HttpHeaderCacheControl = 0, // general-header [section 4.5]
- HttpHeaderConnection = 1, // general-header [section 4.5]
- HttpHeaderDate = 2, // general-header [section 4.5]
- HttpHeaderKeepAlive = 3, // general-header [not in rfc]
- HttpHeaderPragma = 4, // general-header [section 4.5]
- HttpHeaderTrailer = 5, // general-header [section 4.5]
- HttpHeaderTransferEncoding = 6, // general-header [section 4.5]
- HttpHeaderUpgrade = 7, // general-header [section 4.5]
- HttpHeaderVia = 8, // general-header [section 4.5]
- HttpHeaderWarning = 9, // general-header [section 4.5]
-
- HttpHeaderAllow = 10, // entity-header [section 7.1]
- HttpHeaderContentLength = 11, // entity-header [section 7.1]
- HttpHeaderContentType = 12, // entity-header [section 7.1]
- HttpHeaderContentEncoding = 13, // entity-header [section 7.1]
- HttpHeaderContentLanguage = 14, // entity-header [section 7.1]
- HttpHeaderContentLocation = 15, // entity-header [section 7.1]
- HttpHeaderContentMd5 = 16, // entity-header [section 7.1]
- HttpHeaderContentRange = 17, // entity-header [section 7.1]
- HttpHeaderExpires = 18, // entity-header [section 7.1]
- HttpHeaderLastModified = 19, // entity-header [section 7.1]
-
-
- // Request Headers
-
- HttpHeaderAccept = 20, // request-header [section 5.3]
- HttpHeaderAcceptCharset = 21, // request-header [section 5.3]
- HttpHeaderAcceptEncoding = 22, // request-header [section 5.3]
- HttpHeaderAcceptLanguage = 23, // request-header [section 5.3]
- HttpHeaderAuthorization = 24, // request-header [section 5.3]
- HttpHeaderCookie = 25, // request-header [not in rfc]
- HttpHeaderExpect = 26, // request-header [section 5.3]
- HttpHeaderFrom = 27, // request-header [section 5.3]
- HttpHeaderHost = 28, // request-header [section 5.3]
- HttpHeaderIfMatch = 29, // request-header [section 5.3]
-
- HttpHeaderIfModifiedSince = 30, // request-header [section 5.3]
- HttpHeaderIfNoneMatch = 31, // request-header [section 5.3]
- HttpHeaderIfRange = 32, // request-header [section 5.3]
- HttpHeaderIfUnmodifiedSince = 33, // request-header [section 5.3]
- HttpHeaderMaxForwards = 34, // request-header [section 5.3]
- HttpHeaderProxyAuthorization = 35, // request-header [section 5.3]
- HttpHeaderReferer = 36, // request-header [section 5.3]
- HttpHeaderRange = 37, // request-header [section 5.3]
- HttpHeaderTe = 38, // request-header [section 5.3]
- HttpHeaderTranslate = 39, // request-header [webDAV, not in rfc 2518]
-
- HttpHeaderUserAgent = 40, // request-header [section 5.3]
-
- HttpHeaderRequestMaximum = 41,
-
-
- // Response Headers
-
- HttpHeaderAcceptRanges = 20, // response-header [section 6.2]
- HttpHeaderAge = 21, // response-header [section 6.2]
- HttpHeaderEtag = 22, // response-header [section 6.2]
- HttpHeaderLocation = 23, // response-header [section 6.2]
- HttpHeaderProxyAuthenticate = 24, // response-header [section 6.2]
- HttpHeaderRetryAfter = 25, // response-header [section 6.2]
- HttpHeaderServer = 26, // response-header [section 6.2]
- HttpHeaderSetCookie = 27, // response-header [not in rfc]
- HttpHeaderVary = 28, // response-header [section 6.2]
- HttpHeaderWwwAuthenticate = 29, // response-header [section 6.2]
-
- HttpHeaderResponseMaximum = 30,
-
-
- HttpHeaderMaximum = 41
-
-} HTTP_HEADER_ID, *PHTTP_HEADER_ID;
-
-
-//
-// Structure defining format of a known HTTP header.
-// Name is from HTTP_HEADER_ID.
-//
-
-typedef struct _HTTP_KNOWN_HEADER
-{
- USHORT RawValueLength; // in bytes not including the NUL
- PCSTR pRawValue;
-
-} HTTP_KNOWN_HEADER, *PHTTP_KNOWN_HEADER;
-
-//
-// Structure defining format of an unknown header.
-//
-
-typedef struct _HTTP_UNKNOWN_HEADER
-{
- USHORT NameLength; // in bytes not including the NUL
- USHORT RawValueLength; // in bytes not including the NUL
- PCSTR pName; // The header name (minus the ':' character)
- PCSTR pRawValue; // The header value
-
-} HTTP_UNKNOWN_HEADER, *PHTTP_UNKNOWN_HEADER;
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-//
-// Log fields data structure is used for logging a request. This structure must
-// be provided along with an HttpSendHttpResponse or HttpSendResponseEntityBody
-// call that concludes the send.
-//
-
-// Base structure is for future versioning.
-
-typedef enum _HTTP_LOG_DATA_TYPE
-{
- HttpLogDataTypeFields = 0
-
-} HTTP_LOG_DATA_TYPE, *PHTTP_LOG_DATA_TYPE;
-
-// should we DECLSPEC_ALIGN(4 or 8) == DECLSPEC_POINTERALIGN?
-typedef struct _HTTP_LOG_DATA
-{
- HTTP_LOG_DATA_TYPE Type;
-
-} HTTP_LOG_DATA, *PHTTP_LOG_DATA;
-
-// Current log fields data structure for of type HttpLogDataTypeFields.
-
-typedef struct _HTTP_LOG_FIELDS_DATA
-{
- HTTP_LOG_DATA Base;
-
- USHORT UserNameLength;
- USHORT UriStemLength;
- USHORT ClientIpLength;
- USHORT ServerNameLength;
- USHORT ServiceNameLength;
- USHORT ServerIpLength;
- USHORT MethodLength;
- USHORT UriQueryLength;
- USHORT HostLength;
- USHORT UserAgentLength;
- USHORT CookieLength;
- USHORT ReferrerLength;
-
- PWCHAR UserName;
- PWCHAR UriStem;
- PCHAR ClientIp;
- PCHAR ServerName;
- PCHAR ServiceName;
- PCHAR ServerIp;
- PCHAR Method;
- PCHAR UriQuery;
- PCHAR Host;
- PCHAR UserAgent;
- PCHAR Cookie;
- PCHAR Referrer;
-
- USHORT ServerPort;
- USHORT ProtocolStatus;
-
- ULONG Win32Status;
-
- HTTP_VERB MethodNum;
-
- USHORT SubStatus;
-
-} HTTP_LOG_FIELDS_DATA, *PHTTP_LOG_FIELDS_DATA;
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// This enum defines a data source for a particular chunk of data.
-//
-
-typedef enum _HTTP_DATA_CHUNK_TYPE
-{
- HttpDataChunkFromMemory,
- HttpDataChunkFromFileHandle,
- HttpDataChunkFromFragmentCache,
- HttpDataChunkFromFragmentCacheEx,
-
- HttpDataChunkMaximum
-
-} HTTP_DATA_CHUNK_TYPE, *PHTTP_DATA_CHUNK_TYPE;
-
-
-//
-// This structure describes an individual data chunk.
-//
-
-typedef struct _HTTP_DATA_CHUNK
-{
- //
- // The type of this data chunk.
- //
-
- HTTP_DATA_CHUNK_TYPE DataChunkType;
-
- //
- // The data chunk structures, one per supported data chunk type.
- //
-
- union
- {
- //
- // From-memory data chunk.
- //
-
- struct
- {
- PVOID pBuffer;
- ULONG BufferLength;
-
- } FromMemory;
-
- //
- // From-file handle data chunk.
- //
-
- struct
- {
- HTTP_BYTE_RANGE ByteRange;
- HANDLE FileHandle;
-
- } FromFileHandle;
-
- //
- // From-fragment cache data chunk.
- //
-
- struct
- {
- USHORT FragmentNameLength; // in bytes not including the NUL
- PCWSTR pFragmentName;
-
- } FromFragmentCache;
-
- //
- // From-fragment cache data chunk that specifies a byte range.
- //
-
- struct
- {
- HTTP_BYTE_RANGE ByteRange;
- PCWSTR pFragmentName; // NULL-terminated string
-
- } FromFragmentCacheEx;
-
- };
-
-} HTTP_DATA_CHUNK, *PHTTP_DATA_CHUNK;
-
-//
-// HTTP API doesn't support 16 bit applications.
-// Neither WIN32 nor _WIN64 was defined.
-//
-
-C_ASSERT(TYPE_ALIGNMENT(HTTP_DATA_CHUNK) == sizeof(ULONGLONG));
-
-//
-// Structure defining format of request headers.
-//
-
-typedef struct _HTTP_REQUEST_HEADERS
-{
- //
- // The array of unknown HTTP headers and the number of
- // entries in the array.
- //
-
- USHORT UnknownHeaderCount;
- PHTTP_UNKNOWN_HEADER pUnknownHeaders;
-
- //
- // Trailers - we don't use these currently, reserved for a future release
- //
- USHORT TrailerCount; // Reserved, must be 0
- PHTTP_UNKNOWN_HEADER pTrailers; // Reserved, must be NULL
-
-
- //
- // Known headers.
- //
-
- HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderRequestMaximum];
-
-} HTTP_REQUEST_HEADERS, *PHTTP_REQUEST_HEADERS;
-
-//
-// Structure defining format of response headers.
-//
-
-typedef struct _HTTP_RESPONSE_HEADERS
-{
- //
- // The array of unknown HTTP headers and the number of
- // entries in the array.
- //
-
- USHORT UnknownHeaderCount;
- PHTTP_UNKNOWN_HEADER pUnknownHeaders;
-
- //
- // Trailers - we don't use these currently, reserved for a future release
- //
- USHORT TrailerCount; // Reserved, must be 0
- PHTTP_UNKNOWN_HEADER pTrailers; // Reserved, must be NULL
-
- //
- // Known headers.
- //
-
- HTTP_KNOWN_HEADER KnownHeaders[HttpHeaderResponseMaximum];
-
-} HTTP_RESPONSE_HEADERS, *PHTTP_RESPONSE_HEADERS;
-
-//
-// Structure defining format of transport address. Use pLocalAddress->sa_family
-// to determine whether this is an IPv4 address (AF_INET) or IPv6 (AF_INET6).
-//
-// pRemoteAddress->sa_family will be the same as pLocalAddress->sa_family.
-//
-// SOCKADDRs are always in network order, not host order.
-//
-
-typedef struct _HTTP_TRANSPORT_ADDRESS
-{
- PSOCKADDR pRemoteAddress;
- PSOCKADDR pLocalAddress;
-
-} HTTP_TRANSPORT_ADDRESS, *PHTTP_TRANSPORT_ADDRESS;
-
-//
-// Structure defining format of cooked URL.
-//
-
-typedef struct _HTTP_COOKED_URL
-{
- //
- // Pointers overlap and point into pFullUrl. NULL if not present.
- //
-
- USHORT FullUrlLength; // in bytes not including the NUL
- USHORT HostLength; // in bytes (no NUL)
- USHORT AbsPathLength; // in bytes (no NUL)
- USHORT QueryStringLength; // in bytes (no NUL)
-
- PCWSTR pFullUrl; // points to "http://hostname:port/abs/.../path?query"
- PCWSTR pHost; // points to the first char in the hostname
- PCWSTR pAbsPath; // Points to the 3rd '/' char
- PCWSTR pQueryString; // Points to the 1st '?' char or NULL
-
-} HTTP_COOKED_URL, *PHTTP_COOKED_URL;
-
-//
-// An opaque context for URL manipulation.
-//
-
-typedef ULONGLONG HTTP_URL_CONTEXT;
-
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-//
-// Optional flags for URL manipulation functions.
-//
-// HTTP_URL_FLAG_REMOVE_ALL : When this flag is used
-// when removing a Url from a url group, regardless of
-// the passed URL, all of the Urls from the url group
-// will be removed.
-//
-
-#define HTTP_URL_FLAG_REMOVE_ALL 0x00000001
-
-
-//
-// Request Authentication related.
-//
-
-typedef enum _HTTP_AUTH_STATUS
-{
- HttpAuthStatusSuccess,
- HttpAuthStatusNotAuthenticated,
- HttpAuthStatusFailure
-
-} HTTP_AUTH_STATUS, *PHTTP_AUTH_STATUS;
-
-
-typedef enum _HTTP_REQUEST_AUTH_TYPE
-{
- HttpRequestAuthTypeNone = 0,
- HttpRequestAuthTypeBasic,
- HttpRequestAuthTypeDigest,
- HttpRequestAuthTypeNTLM,
- HttpRequestAuthTypeNegotiate,
- HttpRequestAuthTypeKerberos
-
-
-} HTTP_REQUEST_AUTH_TYPE, *PHTTP_REQUEST_AUTH_TYPE;
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// SSL Client certificate information.
-//
-
-typedef struct _HTTP_SSL_CLIENT_CERT_INFO
-{
- ULONG CertFlags;
- ULONG CertEncodedSize;
- PUCHAR pCertEncoded;
- HANDLE Token;
- BOOLEAN CertDeniedByMapper;
-
-} HTTP_SSL_CLIENT_CERT_INFO, *PHTTP_SSL_CLIENT_CERT_INFO;
-
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP
-
-//
-// Flag to retrieve secure channel binding with HttpReceiveClientCertificate
-//
-
-#define HTTP_RECEIVE_SECURE_CHANNEL_TOKEN 0x1
-
-#endif
-
-//
-// Data computed during SSL handshake.
-//
-
-typedef struct _HTTP_SSL_INFO
-{
- USHORT ServerCertKeySize;
- USHORT ConnectionKeySize;
- ULONG ServerCertIssuerSize;
- ULONG ServerCertSubjectSize;
-
- PCSTR pServerCertIssuer;
- PCSTR pServerCertSubject;
-
- PHTTP_SSL_CLIENT_CERT_INFO pClientCertInfo;
- ULONG SslClientCertNegotiated;
-
-} HTTP_SSL_INFO, *PHTTP_SSL_INFO;
-
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-//
-// Generic request information type.
-//
-
-typedef enum _HTTP_REQUEST_INFO_TYPE
-{
- HttpRequestInfoTypeAuth
-
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN7
- ,HttpRequestInfoTypeChannelBind
-#endif
-
-
-} HTTP_REQUEST_INFO_TYPE, *PHTTP_REQUEST_INFO_TYPE;
-
-typedef struct _HTTP_REQUEST_INFO
-{
- HTTP_REQUEST_INFO_TYPE InfoType;
- ULONG InfoLength;
- PVOID pInfo;
-
-} HTTP_REQUEST_INFO, *PHTTP_REQUEST_INFO;
-
-#ifndef __SECSTATUS_DEFINED__
-typedef LONG SECURITY_STATUS;
-#define __SECSTATUS_DEFINED__
-#endif // __SECSTATUS_DEFINED__
-
-//
-// Authentication request info structure
-//
-
-#define HTTP_REQUEST_AUTH_FLAG_TOKEN_FOR_CACHED_CRED (0x00000001)
-
-typedef struct _HTTP_REQUEST_AUTH_INFO
-{
- HTTP_AUTH_STATUS AuthStatus;
- SECURITY_STATUS SecStatus;
-
- ULONG Flags;
-
- HTTP_REQUEST_AUTH_TYPE AuthType;
-
- HANDLE AccessToken;
- ULONG ContextAttributes;
-
- //
- // Optional serialized context.
- //
-
- ULONG PackedContextLength;
- ULONG PackedContextType;
- PVOID PackedContext;
-
- //
- // Optional mutual authentication data and its length in bytes.
- //
-
- ULONG MutualAuthDataLength;
- PCHAR pMutualAuthData;
-
- //
- // For SSPI based schemes the package name is returned. Length does
- // not include the terminating null and it is in bytes.
- //
-
- USHORT PackageNameLength;
- PWSTR pPackageName;
-
-} HTTP_REQUEST_AUTH_INFO, *PHTTP_REQUEST_AUTH_INFO;
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// The structure of an HTTP request for downlevel OS
-//
-
-typedef struct _HTTP_REQUEST_V1
-{
- //
- // Request flags (see HTTP_REQUEST_FLAG_* definitions below).
- //
-
- ULONG Flags;
-
- //
- // An opaque request identifier. These values are used by the driver
- // to correlate outgoing responses with incoming requests.
- //
-
- HTTP_CONNECTION_ID ConnectionId;
- HTTP_REQUEST_ID RequestId;
-
- //
- // The context associated with the URL prefix.
- //
-
- HTTP_URL_CONTEXT UrlContext;
-
- //
- // The HTTP version number.
- //
-
- HTTP_VERSION Version;
-
- //
- // The request verb.
- //
-
- HTTP_VERB Verb;
-
- //
- // The length of the verb string if the Verb field is HttpVerbUnknown.
- //
-
- USHORT UnknownVerbLength; // in bytes not including the NUL
-
- //
- // The length of the raw (uncooked) URL
- //
-
- USHORT RawUrlLength; // in bytes not including the NUL
-
- //
- // Pointer to the verb string if the Verb field is HttpVerbUnknown.
- //
-
- PCSTR pUnknownVerb;
-
- //
- // Pointer to the raw (uncooked) URL
- //
-
- PCSTR pRawUrl;
-
- //
- // The canonicalized Unicode URL
- //
-
- HTTP_COOKED_URL CookedUrl;
-
- //
- // Local and remote transport addresses for the connection.
- //
-
- HTTP_TRANSPORT_ADDRESS Address;
-
- //
- // The request headers.
- //
-
- HTTP_REQUEST_HEADERS Headers;
-
- //
- // The total number of bytes received from network for this request.
- //
-
- ULONGLONG BytesReceived;
-
- //
- // pEntityChunks is an array of EntityChunkCount HTTP_DATA_CHUNKs. The
- // entity body is copied only if HTTP_RECEIVE_REQUEST_FLAG_COPY_BODY
- // was passed to HttpReceiveHttpRequest().
- //
-
- USHORT EntityChunkCount;
- PHTTP_DATA_CHUNK pEntityChunks;
-
- //
- // SSL connection information.
- //
-
- HTTP_RAW_CONNECTION_ID RawConnectionId;
- PHTTP_SSL_INFO pSslInfo;
-
-} HTTP_REQUEST_V1, *PHTTP_REQUEST_V1;
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-// Vista
-
-//
-// Version 2.0 members are defined here
-// N.B. One must define V2 elements in two places :(
-// This is due to the fact that C++ doesn't allow anonymous
-// structure declarations and one must use structure
-// inheritance instead.
-//
-
-#ifdef __cplusplus
-
-typedef struct _HTTP_REQUEST_V2 : _HTTP_REQUEST_V1
-{
- //
- // Version 1.0 members are inherited
- // Version 2.0 members are declared below
- //
-
- //
- // Additional Request Informations.
- //
-
- USHORT RequestInfoCount;
- PHTTP_REQUEST_INFO pRequestInfo;
-} HTTP_REQUEST_V2, *PHTTP_REQUEST_V2;
-
-#else // __cplusplus
-
-typedef struct _HTTP_REQUEST_V2
-{
- struct _HTTP_REQUEST_V1; // Anonymous structure
-
- //
- // Version 2.0 members are declared below
- //
-
- //
- // Additional Request Informations.
- //
-
- USHORT RequestInfoCount;
- PHTTP_REQUEST_INFO pRequestInfo;
-} HTTP_REQUEST_V2, *PHTTP_REQUEST_V2;
-
-#endif // __cplusplus
-
-typedef HTTP_REQUEST_V2 HTTP_REQUEST;
-
-#else // _WIN32_WINNT >= 0x0600
-
-typedef HTTP_REQUEST_V1 HTTP_REQUEST;
-
-#endif // _WIN32_WINNT >= 0x0600
-
-typedef HTTP_REQUEST * PHTTP_REQUEST;
-
-
-//
-// Values for HTTP_REQUEST::Flags. Zero or more of these may be ORed together.
-//
-// HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS - there is more entity body
-// to be read for this request. Otherwise, there is no entity body or
-// all of the entity body was copied into pEntityChunks.
-// HTTP_REQUEST_FLAG_IP_ROUTED - This flag indicates that the request has been
-// routed based on host plus ip or ip binding.This is a hint for the application
-// to include the local ip while flushing kernel cache entries build for this
-// request if any.
-//
-
-#define HTTP_REQUEST_FLAG_MORE_ENTITY_BODY_EXISTS 0x00000001
-#define HTTP_REQUEST_FLAG_IP_ROUTED 0x00000002
-
-
-//
-// This structure describes an HTTP response.
-//
-
-typedef struct _HTTP_RESPONSE_V1
-{
- //
- // Response flags (see HTTP_RESPONSE_FLAG_* definitions below).
- //
-
- ULONG Flags;
-
- //
- // The raw HTTP protocol version number.
- //
-
- HTTP_VERSION Version;
-
- //
- // The HTTP status code (e.g., 200).
- //
-
- USHORT StatusCode;
-
- //
- // The HTTP reason (e.g., "OK"). This MUST not contain
- // non-ASCII characters (i.e., all chars must be in range 0x20-0x7E).
- //
-
- USHORT ReasonLength; // in bytes not including the '\0'
- PCSTR pReason;
-
- //
- // The response headers.
- //
-
- HTTP_RESPONSE_HEADERS Headers;
-
- //
- // pEntityChunks points to an array of EntityChunkCount HTTP_DATA_CHUNKs.
- //
-
- USHORT EntityChunkCount;
- PHTTP_DATA_CHUNK pEntityChunks;
-
-} HTTP_RESPONSE_V1, *PHTTP_RESPONSE_V1;
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-//
-// Values for HTTP_RESPONSE::Flags.
-//
-// HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE - Set this flag if encodings
-// other than identity form are available for this resource.This flag is ignored
-// if application has not asked for response to be cached. It's used as a hint
-// to the Http Server API for content negotiation used when serving from the
-// the kernel response cache.
-//
-
-#define HTTP_RESPONSE_FLAG_MULTIPLE_ENCODINGS_AVAILABLE 0x00000001
-
-
-// Vista
-
-typedef enum _HTTP_RESPONSE_INFO_TYPE
-{
- HttpResponseInfoTypeMultipleKnownHeaders,
- HttpResponseInfoTypeAuthenticationProperty,
- HttpResponseInfoTypeQoSProperty
-
-#if _WIN32_WINNT >= _WIN32_WINNT_WIN7 || BUILD_IIS_FOR_XP
- ,HttpResponseInfoTypeChannelBind
-#endif
-
-} HTTP_RESPONSE_INFO_TYPE, PHTTP_RESPONSE_INFO_TYPE;
-
-typedef struct _HTTP_RESPONSE_INFO
-{
- HTTP_RESPONSE_INFO_TYPE Type;
- ULONG Length;
- PVOID pInfo;
-} HTTP_RESPONSE_INFO, *PHTTP_RESPONSE_INFO;
-
-#define HTTP_RESPONSE_INFO_FLAGS_PRESERVE_ORDER 0x00000001
-
-//
-// This structure allows the provision of providing multiple known headers.
-//
-
-typedef struct _HTTP_MULTIPLE_KNOWN_HEADERS
-{
- //
- // Known header id.
- //
-
- HTTP_HEADER_ID HeaderId;
-
- ULONG Flags;
-
- //
- // Number of headers of the same category.
- //
-
- USHORT KnownHeaderCount;
-
- //
- // Array of known header structures.
- //
-
- PHTTP_KNOWN_HEADER KnownHeaders;
-
-} HTTP_MULTIPLE_KNOWN_HEADERS, *PHTTP_MULTIPLE_KNOWN_HEADERS;
-
-//
-// Version 2.0 members are defined here
-// N.B. One must define V2 elements in two places :(
-// This is due to the fact that C++ doesn't allow anonymous
-// structure declarations and one must use structure
-// inheritance instead.
-//
-
-#ifdef __cplusplus
-
-typedef struct _HTTP_RESPONSE_V2 : _HTTP_RESPONSE_V1
-{
- //
- // Version 1.0 members are inherited
- // Version 2.0 members are declared below
- //
-
- USHORT ResponseInfoCount;
- PHTTP_RESPONSE_INFO pResponseInfo;
-
-} HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2;
-
-#else // __cplusplus
-
-typedef struct _HTTP_RESPONSE_V2
-{
- struct _HTTP_RESPONSE_V1;
-
- //
- // Version 2.0 members are declared below
- //
-
- USHORT ResponseInfoCount;
- PHTTP_RESPONSE_INFO pResponseInfo;
-} HTTP_RESPONSE_V2, *PHTTP_RESPONSE_V2;
-
-#endif // __cplusplus
-
-typedef HTTP_RESPONSE_V2 HTTP_RESPONSE;
-
-#else // _WIN32_WINNT >= 0x0600
-
-typedef HTTP_RESPONSE_V1 HTTP_RESPONSE;
-
-#endif // _WIN32_WINNT >= 0x0600
-
-typedef HTTP_RESPONSE *PHTTP_RESPONSE;
-
-//
-// Api Version. This is used to ensure compatibility between applications and
-// httpapi.dll and http.sys.
-//
-// This must not be confused with the HTTP Protocol version.
-//
-
-typedef struct _HTTPAPI_VERSION
-{
- USHORT HttpApiMajorVersion;
- USHORT HttpApiMinorVersion;
-
-} HTTPAPI_VERSION, *PHTTPAPI_VERSION;
-
-
-#if _WIN32_WINNT >= 0x0600 || BUILD_IIS_FOR_XP
-
-// Vista
-
-#define HTTPAPI_VERSION_2 { 2, 0 }
-
-#endif // _WIN32_WINNT >= 0x0600
-
-#define HTTPAPI_VERSION_1 { 1, 0 }
-
-#define HTTPAPI_EQUAL_VERSION(version, major, minor) \
- ((version).HttpApiMajorVersion == (major) && \
- (version).HttpApiMinorVersion == (minor))
-
-#define HTTPAPI_GREATER_VERSION(version, major, minor) \
- ((version).HttpApiMajorVersion > (major) || \
- ((version).HttpApiMajorVersion == (major) && \
- (version).HttpApiMinorVersion > (minor)))
-
-#define HTTPAPI_LESS_VERSION(version, major, minor) \
- ((version).HttpApiMajorVersion < (major) || \
- ((version).HttpApiMajorVersion == (major) && \
- (version).HttpApiMinorVersion < (minor)))
-
-#define HTTPAPI_VERSION_GREATER_OR_EQUAL( version, major, minor) \
- (!HTTPAPI_LESS_VERSION(version, major, minor))
-
-
-//
-// Cache control.
-//
-
-//
-// This enum defines the available cache policies.
-//
-
-typedef enum _HTTP_CACHE_POLICY_TYPE
-{
- HttpCachePolicyNocache,
- HttpCachePolicyUserInvalidates,
- HttpCachePolicyTimeToLive,
-
- HttpCachePolicyMaximum
-
-} HTTP_CACHE_POLICY_TYPE, *PHTTP_CACHE_POLICY_TYPE;
-
-
-//
-// Only cache unauthorized GETs + HEADs.
-//
-
-typedef struct _HTTP_CACHE_POLICY
-{
- HTTP_CACHE_POLICY_TYPE Policy;
- ULONG SecondsToLive;
-
-} HTTP_CACHE_POLICY, *PHTTP_CACHE_POLICY;
-
-//
-// Enum that is used with HttpSetServiceConfiguration(),
-// HttpQueryServiceConfiguration(), and HttpDeleteServiceConfiguration() APIs.
-//
-
-typedef enum _HTTP_SERVICE_CONFIG_ID
-{
- HttpServiceConfigIPListenList, // Set, Query & Delete.
- HttpServiceConfigSSLCertInfo, // Set, Query & Delete.
- HttpServiceConfigUrlAclInfo, // Set, Query & Delete.
- HttpServiceConfigTimeout, // Set, Query & Delete.
- HttpServiceConfigCache, // Set, Query & Delete.
- HttpServiceConfigMax
-
-} HTTP_SERVICE_CONFIG_ID, *PHTTP_SERVICE_CONFIG_ID;
-
-//
-// Generic Query enum that can be used with HttpQueryServiceConfiguration()
-//
-
-typedef enum _HTTP_SERVICE_CONFIG_QUERY_TYPE
-{
- HttpServiceConfigQueryExact,
- HttpServiceConfigQueryNext,
- HttpServiceConfigQueryMax
-
-} HTTP_SERVICE_CONFIG_QUERY_TYPE, *PHTTP_SERVICE_CONFIG_QUERY_TYPE;
-
-//
-// This data structure is used to define a key of the SSL certificate hash
-// store.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_SSL_KEY
-{
- PSOCKADDR pIpPort;
-} HTTP_SERVICE_CONFIG_SSL_KEY, *PHTTP_SERVICE_CONFIG_SSL_KEY;
-
-//
-// This defines a record for the SSL config store.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_SSL_PARAM
-{
- ULONG SslHashLength; // Length of the SSL hash (in bytes)
- PVOID pSslHash; // Pointer to the SSL hash
- GUID AppId; // A unique identifier that can be used to
- // identify the app that has set this parameter
-
- PWSTR pSslCertStoreName; // Store name to read the server certificate
- // from; defaults to "MY". Certificate must be
- // stored in the LOCAL_MACHINE context.
-
- //
- // The following settings are used only for client certificates
- //
-
- //
- // DefaultCertCheckMode is a bit flag with the following semantics
- // 0x1 - Client certificate will not be verified for revocation
- // 0x2 - Only cached certificate revocation will be used.
- // 0x4 - Enable use of the DefaultRevocationFreshnessTime setting
- // 0x10000 - No usage check.
-
- DWORD DefaultCertCheckMode;
-
- //
- // DefaultRevocationFreshnessTime (seconds) - How often to check for
- // an updated Certificate revocation list (CRL). If this value is 0
- // then the new CRL is updated only if the previous one expires
- //
-
- DWORD DefaultRevocationFreshnessTime;
-
- //
- // DefaultRevocationUrlRetrievalTimeout (milliseconds) - Timeout on
- // attempt to retrieve certificate revocation list from the remote URL.
- //
-
- DWORD DefaultRevocationUrlRetrievalTimeout;
-
- //
- // pDefaultSslCtlIdentifier - Restrict the certificate issuers that you
- // want to trust. Can be a subset of the certificate issuers that are
- // trusted by the machine.
- //
-
- PWSTR pDefaultSslCtlIdentifier;
-
- //
- // Store name under LOCAL_MACHINE where Ctl identified by
- // pDefaultSslCtlIdentifier is stored.
- //
-
- PWSTR pDefaultSslCtlStoreName;
-
- //
- // Default Flags - see HTTP_SERVICE_CONFIG_SSL_FLAG* below.
- //
-
- DWORD DefaultFlags;
-
-} HTTP_SERVICE_CONFIG_SSL_PARAM, *PHTTP_SERVICE_CONFIG_SSL_PARAM;
-
-#define HTTP_SERVICE_CONFIG_SSL_FLAG_USE_DS_MAPPER 0x00000001
-#define HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT 0x00000002
-#if _WIN32_WINNT < 0x0600
-#define HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER 0x00000004
-#endif // _WIN32_WINNT < 0x0600
-
-//
-// This data structure is used by HttpSetServiceConfiguration() for the
-// config ID HttpServiceConfigSSLCertInfo. It's used to add a new record
-// to the SSL store.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_SSL_SET
-{
- HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
- HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc;
-} HTTP_SERVICE_CONFIG_SSL_SET, *PHTTP_SERVICE_CONFIG_SSL_SET;
-
-//
-// This data structure is used by HttpQueryServiceConfiguration() for the
-// config ID HttpServiceConfigSSLCertInfo. It's used to query a particular
-// record from the SSL store.
-//
-// If QueryType is HttpServiceConfigQueryExact, then one particular record of
-// the type HTTP_SERVICE_CONFIG_SSL_SET is returned. If the QueryType is
-// HttpServiceConfigQueryNext, then the next instance of
-// HTTP_SERVICE_CONFIG_SSL_SET is returned. In such cases, the dwToken field
-// represents the cursor. For the first item, dwToken has to be 0.
-// For subsequent items, dwToken has to be incremented by 1,
-// until ERROR_NO_MORE_ITEMS is returned.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_SSL_QUERY
-{
- HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
- HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc;
- DWORD dwToken;
-} HTTP_SERVICE_CONFIG_SSL_QUERY, *PHTTP_SERVICE_CONFIG_SSL_QUERY;
-
-//
-// Set/Delete IP Listen-Only List record
-//
-// Used as a parameter to both HttpSetServiceConfiguration() and
-// HttpDeleteServiceConfiguration() functions.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM
-{
- USHORT AddrLength;
- PSOCKADDR pAddress;
-} HTTP_SERVICE_CONFIG_IP_LISTEN_PARAM, *PHTTP_SERVICE_CONFIG_IP_LISTEN_PARAM;
-
-//
-// Query IP Listen-Only List record.
-//
-// Parameter to HttpQueryServiceConfiguration() for the config ID
-// HttpServiceConfigIPListenList. On successful return, AddrList
-// contains an array of AddrCount elements. Caller must provide a
-// large enough buffer to hold all elements in one call.
-//
-// Caller may determine the type of each returned element by examining
-// AddrList[i].ss_family. If it's AF_INET, use ((PSOCKADDR_IN) &AddrList[i]);
-// otherwise, for AF_INET6, use ((PSOCKADDR_IN6) &AddrList[i])
-// to select the appropriate address type.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY
-{
- ULONG AddrCount;
- SOCKADDR_STORAGE AddrList[ANYSIZE_ARRAY];
-} HTTP_SERVICE_CONFIG_IP_LISTEN_QUERY, *PHTTP_SERVICE_CONFIG_IP_LISTEN_QUERY;
-
-//
-// URL ACL
-//
-//
-typedef struct _HTTP_SERVICE_CONFIG_URLACL_KEY
-{
- PWSTR pUrlPrefix;
-
-} HTTP_SERVICE_CONFIG_URLACL_KEY, *PHTTP_SERVICE_CONFIG_URLACL_KEY;
-
-//
-// This defines a record for the SSL config store.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_URLACL_PARAM
-{
- PWSTR pStringSecurityDescriptor;
-} HTTP_SERVICE_CONFIG_URLACL_PARAM, *PHTTP_SERVICE_CONFIG_URLACL_PARAM;
-
-
-//
-// This data structure is used by HttpSetServiceConfiguration for the config ID
-// HttpServiceConfigUrlAclInfo. It is used to add a new record to the URL ACL
-// store.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_URLACL_SET
-{
- HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc;
- HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc;
-} HTTP_SERVICE_CONFIG_URLACL_SET, *PHTTP_SERVICE_CONFIG_URLACL_SET;
-
-
-//
-// This data structure is used by HttpQueryServiceConfiguration() for the
-// config ID HttpServiceConfigUrlAclInfo. It's used to query a particular
-// record from the URL ACL store.
-//
-// If QueryType is HttpServiceConfigQueryExact, then one particular record of
-// the type HTTP_SERVICE_CONFIG_URLACL_SET is returned. If the QueryType is
-// HttpServiceConfigQueryNext, then the next instance of
-// HTTP_SERVICE_CONFIG_URLACL_SET is returned. In such cases, the dwToken field
-// represents the cursor. For the first item, dwToken has to be 0.
-// For subsequent items, dwToken has to be incremented by 1,
-// until ERROR_NO_MORE_ITEMS is returned.
-//
-
-typedef struct _HTTP_SERVICE_CONFIG_URLACL_QUERY
-{
- HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc;
- HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc;
- DWORD dwToken;
-} HTTP_SERVICE_CONFIG_URLACL_QUERY, *PHTTP_SERVICE_CONFIG_URLACL_QUERY;
-
-//
-// Cache Paramemers
-//
-
-//
-// For manipulating global cache parameters.
-// The parameters that can be changed or queued are per-uri cache size
-// and cached range chunk size.
-//
-
-typedef enum _HTTP_SERVICE_CONFIG_CACHE_KEY
-{
- MaxCacheResponseSize = 0,
- CacheRangeChunkSize
-} HTTP_SERVICE_CONFIG_CACHE_KEY, *PHTTP_SERVICE_CONFIG_CACHE_KEY;
-
-typedef ULONG HTTP_SERVICE_CONFIG_CACHE_PARAM,
- *PHTTP_SERVICE_CONFIG_CACHE_PARAM;
-
-//
-// To set a cache parameter value use the set structure. To query use the key
-// directly. When you query a parameter value the output buffer must be exactly
-// the sizeof param.
-//
-
-typedef struct {
- HTTP_SERVICE_CONFIG_CACHE_KEY KeyDesc;
- HTTP_SERVICE_CONFIG_CACHE_PARAM ParamDesc;
-} HTTP_SERVICE_CONFIG_CACHE_SET, *PHTTP_SERVICE_CONFIG_CACHE_SET;
-
-
-//
-// Define our API linkage.
-//
-
-#if !defined(HTTPAPI_LINKAGE)
-#define HTTPAPI_LINKAGE DECLSPEC_IMPORT
-#endif // !HTTPAPI_LINKAGE
-
-//
-// Initialize/Terminate APIs.
-//
-
-
-// NOTE: MUST be called once before all other APIs
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpInitialize(
- IN HTTPAPI_VERSION Version,
- IN ULONG Flags,
- __reserved IN OUT PVOID pReserved
- );
-
-// NOTE: MUST be called after final API call returns.
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpTerminate(
- IN ULONG Flags,
- __reserved IN OUT PVOID pReserved
- );
-
-//
-// HTTP Request Queue manipulation APIs.
-//
-// This API is maintained for backward competibility for the first
-// version of the HTTPAPI and should not be used. Instead the new
-// HttpCreateRequestQueue() API must be used.
-//
-// Use CloseHandle() to release the handles returned by
-// HttpCreateHttpHandle() API.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCreateHttpHandle(
- OUT PHANDLE pReqQueueHandle,
- __reserved IN ULONG Reserved
- );
-
-#if _WIN32_WINNT >= 0x0600
-
-//
-// Extended Request Queue manipulation APIs.
-//
-// Use HttpCloseRequestQueue() API to close the handles
-// created by the HttpCreateRequestQueue API.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCreateRequestQueue(
- IN HTTPAPI_VERSION Version,
- IN PCWSTR pName OPTIONAL,
- IN PSECURITY_ATTRIBUTES pSecurityAttributes OPTIONAL,
- IN ULONG Flags OPTIONAL,
- OUT PHANDLE pReqQueueHandle
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCloseRequestQueue(
- IN HANDLE ReqQueueHandle
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSetRequestQueueProperty(
- IN HANDLE Handle,
- IN HTTP_SERVER_PROPERTY Property,
- __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation,
- IN ULONG PropertyInformationLength,
- __reserved IN ULONG Reserved,
- __reserved IN PVOID pReserved
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpQueryRequestQueueProperty(
- IN HANDLE Handle,
- IN HTTP_SERVER_PROPERTY Property,
- __out_bcount_part(PropertyInformationLength, *pReturnLength)
- OUT PVOID pPropertyInformation,
- IN ULONG PropertyInformationLength,
- __reserved IN ULONG Reserved,
- __out_opt OUT PULONG pReturnLength OPTIONAL,
- __reserved IN PVOID pReserved
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpShutdownRequestQueue(
- IN HANDLE ReqQueueHandle
- );
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// SSL APIs.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpReceiveClientCertificate(
- IN HANDLE ReqQueueHandle,
- IN HTTP_CONNECTION_ID ConnectionId,
- IN ULONG Flags,
- __out_bcount_part(SslClientCertInfoSize, *pBytesReceived)
- OUT PHTTP_SSL_CLIENT_CERT_INFO pSslClientCertInfo,
- IN ULONG SslClientCertInfoSize,
- __out_opt OUT PULONG pBytesReceived OPTIONAL,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-#if _WIN32_WINNT >= 0x0600
-
-//
-// Server Session APIs.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCreateServerSession(
- IN HTTPAPI_VERSION Version,
- OUT PHTTP_SERVER_SESSION_ID pServerSessionId,
- __reserved IN ULONG Reserved
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCloseServerSession(
- IN HTTP_SERVER_SESSION_ID ServerSessionId
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpQueryServerSessionProperty(
- IN HTTP_SERVER_SESSION_ID ServerSessionId,
- IN HTTP_SERVER_PROPERTY Property,
- __out_bcount_part(PropertyInformationLength, *pReturnLength)
- OUT PVOID pPropertyInformation,
- IN ULONG PropertyInformationLength,
- __out_opt OUT PULONG pReturnLength OPTIONAL
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSetServerSessionProperty(
- IN HTTP_SERVER_SESSION_ID ServerSessionId,
- IN HTTP_SERVER_PROPERTY Property,
- __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation,
- IN ULONG PropertyInformationLength
- );
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// Url Configuration APIs. Can only be used for V1 request queues.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpAddUrl(
- IN HANDLE ReqQueueHandle,
- IN PCWSTR pFullyQualifiedUrl,
- __reserved IN PVOID pReserved
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpRemoveUrl(
- IN HANDLE ReqQueueHandle,
- IN PCWSTR pFullyQualifiedUrl
- );
-
-#if _WIN32_WINNT >= 0x0600
-
-//
-// Url Group APIs.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCreateUrlGroup(
- IN HTTP_SERVER_SESSION_ID ServerSessionId,
- OUT PHTTP_URL_GROUP_ID pUrlGroupId,
- __reserved IN ULONG Reserved
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCloseUrlGroup(
- IN HTTP_URL_GROUP_ID UrlGroupId
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpAddUrlToUrlGroup(
- IN HTTP_URL_GROUP_ID UrlGroupId,
- IN PCWSTR pFullyQualifiedUrl,
- IN HTTP_URL_CONTEXT UrlContext OPTIONAL,
- __reserved IN ULONG Reserved
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpRemoveUrlFromUrlGroup(
- IN HTTP_URL_GROUP_ID UrlGroupId,
- IN PCWSTR pFullyQualifiedUrl,
- IN ULONG Flags
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSetUrlGroupProperty(
- IN HTTP_URL_GROUP_ID UrlGroupId,
- IN HTTP_SERVER_PROPERTY Property,
- __in_bcount(PropertyInformationLength) IN PVOID pPropertyInformation,
- IN ULONG PropertyInformationLength
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpQueryUrlGroupProperty(
- IN HTTP_URL_GROUP_ID UrlGroupId,
- IN HTTP_SERVER_PROPERTY Property,
- __out_bcount_part(PropertyInformationLength, *pReturnLength)
- OUT PVOID pPropertyInformation,
- IN ULONG PropertyInformationLength,
- __out_opt OUT PULONG pReturnLength OPTIONAL
- );
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// HTTP Server I/O APIs.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpReceiveHttpRequest(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN ULONG Flags,
- __out_bcount_part(RequestBufferLength, *pBytesReceived)
- OUT PHTTP_REQUEST pRequestBuffer,
- IN ULONG RequestBufferLength,
- __out_opt OUT PULONG pBytesReceived OPTIONAL,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpReceiveRequestEntityBody(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN ULONG Flags,
- __out_bcount_part(BufferLength, *pBytesReceived) OUT PVOID pBuffer,
- IN ULONG BufferLength,
- __out_opt OUT PULONG pBytesReceived OPTIONAL,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-#if _WIN32_WINNT >= 0x0600
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSendHttpResponse(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN ULONG Flags,
- IN PHTTP_RESPONSE pHttpResponse,
- IN PHTTP_CACHE_POLICY pCachePolicy OPTIONAL,
- OUT PULONG pBytesSent OPTIONAL,
- OUT PVOID pReserved1 OPTIONAL, // must be NULL
- IN ULONG Reserved2 OPTIONAL, // must be 0
- IN LPOVERLAPPED pOverlapped OPTIONAL,
- IN PHTTP_LOG_DATA pLogData OPTIONAL
- );
-
-#else // _WIN32_WINNT >= 0x0600
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSendHttpResponse(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN ULONG Flags,
- IN PHTTP_RESPONSE pHttpResponse,
- IN PVOID pReserved1 OPTIONAL, // must be NULL
- OUT PULONG pBytesSent OPTIONAL,
- OUT PVOID pReserved2 OPTIONAL, // must be NULL
- IN ULONG Reserved3 OPTIONAL, // must be 0
- IN LPOVERLAPPED pOverlapped OPTIONAL,
- IN PVOID pReserved4 OPTIONAL // must be NULL
- );
-
-#endif // _WIN32_WINNT >= 0x0600
-
-#if _WIN32_WINNT >= 0x0600
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSendResponseEntityBody(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN ULONG Flags,
- IN USHORT EntityChunkCount OPTIONAL,
- __in_ecount_opt(EntityChunkCount)
- IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL,
- OUT PULONG pBytesSent OPTIONAL,
- OUT PVOID pReserved1 OPTIONAL, // must be NULL
- IN ULONG Reserved2 OPTIONAL, // must be 0
- IN LPOVERLAPPED pOverlapped OPTIONAL,
- IN PHTTP_LOG_DATA pLogData OPTIONAL
- );
-
-#else // _WIN32_WINNT >= 0x0600
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSendResponseEntityBody(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN ULONG Flags,
- IN USHORT EntityChunkCount OPTIONAL,
- __in_ecount_opt(EntityChunkCount)
- IN PHTTP_DATA_CHUNK pEntityChunks OPTIONAL,
- OUT PULONG pBytesSent OPTIONAL,
- OUT PVOID pReserved1 OPTIONAL, // must be NULL
- IN ULONG Reserved2 OPTIONAL, // must be 0
- IN LPOVERLAPPED pOverlapped OPTIONAL,
- IN PVOID pReserved3 OPTIONAL // must be NULL
- );
-
-#endif // _WIN32_WINNT >= 0x0600
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpWaitForDisconnect(
- IN HANDLE ReqQueueHandle,
- IN HTTP_CONNECTION_ID ConnectionId,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-#if _WIN32_WINNT >= 0x0600
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpWaitForDisconnectEx(
- IN HANDLE ReqQueueHandle,
- IN HTTP_CONNECTION_ID ConnectionId,
- __reserved IN ULONG Reserved OPTIONAL,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpCancelHttpRequest(
- IN HANDLE ReqQueueHandle,
- IN HTTP_REQUEST_ID RequestId,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpWaitForDemandStart(
- IN HANDLE ReqQueueHandle,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-
-#endif // _WIN32_WINNT >= 0x0600
-
-//
-// Cache manipulation APIs.
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpFlushResponseCache(
- IN HANDLE ReqQueueHandle,
- IN PCWSTR pUrlPrefix,
- IN ULONG Flags,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpAddFragmentToCache(
- IN HANDLE ReqQueueHandle,
- IN PCWSTR pUrlPrefix,
- IN PHTTP_DATA_CHUNK pDataChunk,
- IN PHTTP_CACHE_POLICY pCachePolicy,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpReadFragmentFromCache(
- IN HANDLE ReqQueueHandle,
- IN PCWSTR pUrlPrefix,
- IN PHTTP_BYTE_RANGE pByteRange OPTIONAL,
- __out_bcount_part(BufferLength, *pBytesRead) OUT PVOID pBuffer,
- IN ULONG BufferLength,
- OUT PULONG pBytesRead OPTIONAL,
- IN LPOVERLAPPED pOverlapped OPTIONAL
- );
-
-//
-// Server configuration APIs
-//
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpSetServiceConfiguration(
- __reserved IN HANDLE ServiceHandle,
- IN HTTP_SERVICE_CONFIG_ID ConfigId,
- __in_bcount(ConfigInformationLength) IN PVOID pConfigInformation,
- IN ULONG ConfigInformationLength,
- __reserved IN LPOVERLAPPED pOverlapped
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpDeleteServiceConfiguration(
- __reserved IN HANDLE ServiceHandle,
- IN HTTP_SERVICE_CONFIG_ID ConfigId,
- __in_bcount(ConfigInformationLength) IN PVOID pConfigInformation,
- IN ULONG ConfigInformationLength,
- __reserved IN LPOVERLAPPED pOverlapped
- );
-
-HTTPAPI_LINKAGE
-ULONG
-WINAPI
-HttpQueryServiceConfiguration(
- __reserved IN HANDLE ServiceHandle,
- IN HTTP_SERVICE_CONFIG_ID ConfigId,
- __in_bcount_opt(InputConfigInformationLength)
- IN PVOID pInputConfigInformation OPTIONAL,
- IN ULONG InputConfigInformationLength OPTIONAL,
- __out_bcount_part_opt(OutputConfigInformationLength, *pReturnLength)
- OUT PVOID pOutputConfigInformation OPTIONAL,
- IN ULONG OutputConfigInformationLength OPTIONAL,
- __out_opt OUT PULONG pReturnLength OPTIONAL,
- __reserved IN LPOVERLAPPED pOverlapped
- );
-
-
-#if BUILD_IIS_FOR_XP
-
-// part of the httpp.h necessary to build for XP
-
-//
-// Counter Group.
-//
-
-//
-// Counter property description.
-//
-
-typedef struct _HTTP_PROP_DESC
-{
- ULONG Size;
- ULONG Offset;
- BOOLEAN WPZeros;
-
-} HTTP_PROP_DESC, *PHTTP_PROP_DESC;
-
-
-//
-// This enum defines the available counter groups.
-//
-
-typedef enum _HTTP_COUNTER_GROUP
-{
- HttpCounterGroupSite,
- HttpCounterGroupGlobal,
-
- HttpCounterGroupMaximum
-
-} HTTP_COUNTER_GROUP, *PHTTP_COUNTER_GROUP;
-
-//
-// Structures for IOCTL_HTTP_GET_COUNTERS.
-//
-
-typedef struct _HTTP_COUNTER_INFO
-{
- HTTP_SERVER_SESSION_ID ServerSessionId;
- HTTP_COUNTER_GROUP CounterGroup;
-
-} HTTP_COUNTER_INFO, *PHTTP_COUNTER_INFO;
-
-//
-// This enum defines the type of global couters.
-//
-
-typedef enum _HTTP_GLOBAL_COUNTER_ID
-{
- HttpGlobalCounterCurrentUrisCached,
- HttpGlobalCounterTotalUrisCached,
- HttpGlobalCounterUriCacheHits,
- HttpGlobalCounterUriCacheMisses,
- HttpGlobalCounterUriCacheFlushes,
- HttpGlobalCounterTotalFlushedUris,
-
- HttpGlobalCounterMaximum
-
-} HTTP_GLOBAL_COUNTER_ID, *PHTTP_GLOBAL_COUNTER_ID;
-
-
-//
-// Global couters.
-//
-
-typedef struct _HTTP_GLOBAL_COUNTERS
-{
- ULONG CurrentUrisCached;
- ULONG TotalUrisCached;
- ULONG UriCacheHits;
- ULONG UriCacheMisses;
- ULONG UriCacheFlushes;
- ULONG TotalFlushedUris;
-
-} HTTP_GLOBAL_COUNTERS, *PHTTP_GLOBAL_COUNTERS;
-
-
-//
-// This enum defines the type of site counters.
-// NB: HTTP_SITE_COUNTER_ID and HTTP_SITE_COUNTERS
-// must be in the same order
-//
-
-typedef enum _HTTP_SITE_COUNTER_ID
-{
- HttpSiteCounterBytesSent,
- HttpSiteCounterBytesReceived,
- HttpSiteCounterBytesTransfered,
- HttpSiteCounterCurrentConns,
- HttpSiteCounterMaxConnections,
- HttpSiteCounterConnAttempts,
- HttpSiteCounterGetReqs,
- HttpSiteCounterHeadReqs,
- HttpSiteCounterAllReqs,
- HttpSiteCounterMeasuredIoBandwidthUsage,
- HttpSiteCounterCurrentBlockedBandwidthBytes,
- HttpSiteCounterTotalBlockedBandwidthBytes,
-
- HttpSiteCounterMaximum
-
-} HTTP_SITE_COUNTER_ID, *PHTTP_SITE_COUNTER_ID;
-
-
-//
-// Site counters.
-//
-
-typedef struct _HTTP_SITE_COUNTERS
-{
- ULONG SiteId;
- ULONGLONG BytesSent;
- ULONGLONG BytesReceived;
- ULONGLONG BytesTransfered;
- ULONG CurrentConns;
- ULONG MaxConnections;
- ULONG ConnAttempts;
- ULONG GetReqs;
- ULONG HeadReqs;
- ULONG AllReqs;
- ULONG MeasuredIoBandwidthUsage;
- ULONG CurrentBlockedBandwidthBytes;
- ULONG TotalBlockedBandwidthBytes;
-
-} HTTP_SITE_COUNTERS, *PHTTP_SITE_COUNTERS;
-
-#endif
-
-#ifdef __cplusplus
-} // extern "C"
-#endif // __cplusplus
-
-#endif // _WIN32_WINNT >= 0x0501
-
-#endif // __HTTP_H__
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h
deleted file mode 100644
index 6e9437d7ed..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/httpserv_xp.h
+++ /dev/null
@@ -1,3404 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _HTTPSERV_H_
-#define _HTTPSERV_H_
-
-#if (!defined(_WIN64) && !defined(WIN32))
-#error httpserv.h is only supported on WIN32 or WIN64 platforms
-#endif
-
-#include <ahadmin.h>
-
-#if _WIN32_WINNT >= 0x0600
-#include "http.h"
-#else
-#include "http_xp.h"
-#endif
-
-//
-// Request deterministic notifications
-//
-
-// request is beginning
-#define RQ_BEGIN_REQUEST 0x00000001
-// request is being authenticated
-#define RQ_AUTHENTICATE_REQUEST 0x00000002
-// request is being authorized
-#define RQ_AUTHORIZE_REQUEST 0x00000004
-// satisfy request from cache
-#define RQ_RESOLVE_REQUEST_CACHE 0x00000008
-// map handler for request
-#define RQ_MAP_REQUEST_HANDLER 0x00000010
-// acquire request state
-#define RQ_ACQUIRE_REQUEST_STATE 0x00000020
-// pre-execute handler
-#define RQ_PRE_EXECUTE_REQUEST_HANDLER 0x00000040
-// execute handler
-#define RQ_EXECUTE_REQUEST_HANDLER 0x00000080
-// release request state
-#define RQ_RELEASE_REQUEST_STATE 0x00000100
-// update cache
-#define RQ_UPDATE_REQUEST_CACHE 0x00000200
-// log request
-#define RQ_LOG_REQUEST 0x00000400
-// end request
-#define RQ_END_REQUEST 0x00000800
-
-//
-// Request non-deterministic notifications
-//
-
-// custom notification
-#define RQ_CUSTOM_NOTIFICATION 0x10000000
-// send response
-#define RQ_SEND_RESPONSE 0x20000000
-// read entity
-#define RQ_READ_ENTITY 0x40000000
-// map a url to a physical path
-#define RQ_MAP_PATH 0x80000000
-
-//
-// Global notifications
-//
-
-// stop accepting new requests
-#define GL_STOP_LISTENING 0x00000002
-// cache cleanup before termination
-#define GL_CACHE_CLEANUP 0x00000004
-// cache operation
-#define GL_CACHE_OPERATION 0x00000010
-// health check
-#define GL_HEALTH_CHECK 0x00000020
-// configuration changed
-#define GL_CONFIGURATION_CHANGE 0x00000040
-// file changed
-#define GL_FILE_CHANGE 0x00000080
-// before request pipeline has started
-#define GL_PRE_BEGIN_REQUEST 0x00000100
-// application start
-#define GL_APPLICATION_START 0x00000200
-// resolve modules for an application
-#define GL_APPLICATION_RESOLVE_MODULES 0x00000400
-// application end
-#define GL_APPLICATION_STOP 0x00000800
-// RSCA query
-#define GL_RSCA_QUERY 0x00001000
-// trace event was raised
-#define GL_TRACE_EVENT 0x00002000
-// custom notification
-#define GL_CUSTOM_NOTIFICATION 0x00004000
-// thread cleanup notification
-#define GL_THREAD_CLEANUP 0x00008000
-// application preload notification
-#define GL_APPLICATION_PRELOAD 0x00010000
-
-//
-// Request notification return status
-//
-
-typedef enum REQUEST_NOTIFICATION_STATUS
-{
- RQ_NOTIFICATION_CONTINUE, // continue processing
- // for notification
- RQ_NOTIFICATION_PENDING, // suspend processing
- // for notification
- RQ_NOTIFICATION_FINISH_REQUEST // finish request
- // processing
-};
-
-//
-// Out of band return codes
-//
-
-typedef enum GLOBAL_NOTIFICATION_STATUS
-{
- GL_NOTIFICATION_CONTINUE, // continue processing
- // for notification
- GL_NOTIFICATION_HANDLED // finish processing for
- // notification
-};
-
-//
-// Priority class aliases
-//
-
-#define PRIORITY_ALIAS_FIRST L"FIRST"
-#define PRIORITY_ALIAS_HIGH L"HIGH"
-#define PRIORITY_ALIAS_MEDIUM L"MEDIUM"
-#define PRIORITY_ALIAS_LOW L"LOW"
-#define PRIORITY_ALIAS_LAST L"LAST"
-
-//
-// Cache operations
-//
-
-typedef enum CACHE_OPERATION
-{
- CACHE_OPERATION_RETRIEVE,
- CACHE_OPERATION_ADD,
- CACHE_OPERATION_DELETE,
- CACHE_OPERATION_FLUSH_PREFIX,
- CACHE_OPERATION_ENUM
-};
-
-//
-// Module identifier
-//
-
-typedef VOID* HTTP_MODULE_ID;
-
-//
-// Flags for IHttpContext->CloneContext()
-//
-
-#define CLONE_FLAG_BASICS 0x01
-#define CLONE_FLAG_HEADERS 0x02
-#define CLONE_FLAG_ENTITY 0x04
-#define CLONE_FLAG_NO_PRECONDITION 0x08
-#define CLONE_FLAG_NO_DAV 0x10
-
-//
-// Flags for IHttpContext->ExecuteRequest()
-//
-
-#define EXECUTE_FLAG_NO_HEADERS 0x01
-#define EXECUTE_FLAG_IGNORE_CURRENT_INTERCEPTOR 0x02
-#define EXECUTE_FLAG_IGNORE_APPPOOL 0x04
-#define EXECUTE_FLAG_DISABLE_CUSTOM_ERROR 0x08
-#define EXECUTE_FLAG_SAME_URL 0x10
-// do not flush the child response but copy it back to the parent
-#define EXECUTE_FLAG_BUFFER_RESPONSE 0x20
-// child response is still eligible for http.sys caching
-#define EXECUTE_FLAG_HTTP_CACHE_ELIGIBLE 0x40
-
-
-//
-// forward declarations
-//
-struct HTTP_TRACE_CONFIGURATION;
-struct HTTP_TRACE_EVENT;
-
-class IWpfSettings;
-class IHttpTraceContext;
-
-//
-// Module-specific context descriptor
-//
-class __declspec(uuid("f1927f76-790e-4ccb-a72e-396bdfdae05d"))
-IHttpStoredContext
-{
- public:
- virtual
- VOID
- CleanupStoredContext(
- VOID
- ) = 0;
-};
-
-//
-// Context container
-//
-class __declspec(uuid("d7fad7c9-aa27-4ab9-bd60-e55ccba3f5dc"))
-IHttpModuleContextContainer
-{
- public:
- virtual
- IHttpStoredContext *
- GetModuleContext(
- IN HTTP_MODULE_ID moduleId
- ) = 0;
-
- virtual
- HRESULT
- SetModuleContext(
- IN IHttpStoredContext * ppStoredContext,
- IN HTTP_MODULE_ID moduleId
- ) = 0;
-};
-
-//
-// Dispensed context container
-//
-class __declspec(uuid("2ae49359-95dd-4e48-ae20-c0cb9d0bc03a"))
-IDispensedHttpModuleContextContainer : public IHttpModuleContextContainer
-{
-public:
- virtual
- VOID
- ReleaseContainer(
- VOID
- ) = 0;
-};
-
-//
-// Performance counter descriptor
-//
-class __declspec(uuid("bdfc4c4a-12a4-4744-87d8-765eb320c59f"))
-IHttpPerfCounterInfo
-{
- public:
- virtual
- VOID
- IncrementCounter(
- DWORD dwCounterIndex,
- DWORD dwValue = 1
- ) = 0;
-
- virtual
- VOID
- DecrementCounter(
- DWORD dwCounterIndex,
- DWORD dwValue = 1
- ) = 0;
-};
-
-//
-// Application descriptor
-//
-class __declspec(uuid("3f75d9e6-1075-422c-ad89-93a85f2d7bdc"))
-IHttpApplication
-{
- public:
- virtual
- PCWSTR
- GetApplicationPhysicalPath(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetApplicationId(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetAppConfigPath(
- VOID
- ) const = 0;
-
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-};
-
-//
-// URI cache entry descriptor
-//
-class __declspec(uuid("7e0e6167-0094-49a1-8287-ecf6dc6e73a6"))
-IHttpUrlInfo
-{
- public:
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-
- virtual
- BOOL
- IsFrequentlyHit(
- VOID
- ) const = 0;
-};
-
-//
-// Script map descriptor
-//
-class __declspec(uuid("d7fe3d77-68bc-4d4a-851f-eec9fb68017c"))
-IScriptMapInfo
-{
- public:
- virtual
- PCWSTR
- GetPath(
- VOID
- ) const = 0;
-
- virtual
- PCSTR
- GetAllowedVerbs(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetModules(
- OUT DWORD * pcchModules = NULL
- ) const = 0;
-
- virtual
- PCWSTR
- GetScriptProcessor(
- OUT DWORD * pcchScriptProcessor = NULL
- ) const = 0;
-
- virtual
- PCWSTR
- GetManagedType(
- OUT DWORD * pcchManagedType = NULL
- ) const = 0;
-
- virtual
- BOOL
- GetAllowPathInfoForScriptMappings(
- VOID
- ) const = 0;
-
- virtual
- DWORD
- GetRequiredAccess(
- VOID
- ) const = 0;
-
- virtual
- DWORD
- GetResourceType(
- VOID
- ) const = 0;
-
- virtual
- BOOL
- GetIsStarScriptMap(
- VOID
- ) const = 0;
-
- virtual
- DWORD
- GetResponseBufferLimit(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetName(
- VOID
- ) const = 0;
-};
-
-class __declspec(uuid("fd86e6de-fb0e-47dd-820a-e0da12be46e9"))
-IHttpTokenEntry;
-
-//
-// Metadata descriptor
-//
-class __declspec(uuid("48b10633-825d-495e-93b0-225380053e8e"))
-IMetadataInfo
-{
- public:
- virtual
- PCWSTR
- GetMetaPath(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetVrPath(
- VOID
- ) const = 0;
-
- virtual
- IHttpTokenEntry *
- GetVrToken(
- VOID
- ) = 0;
-
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-};
-
-//
-// Provides an interface to an HTTP request object. The methods on this
-// class can be used to inspect and modify request data.
-//
-class __declspec(uuid("e8698f7e-576e-4cac-a309-67435355faef"))
-IHttpRequest
-{
- public:
- virtual
- HTTP_REQUEST *
- GetRawHttpRequest(
- VOID
- ) = 0;
-
- virtual
- const HTTP_REQUEST *
- GetRawHttpRequest(
- VOID
- ) const = 0;
-
- virtual
- PCSTR
- GetHeader(
- IN PCSTR pszHeaderName,
- OUT USHORT * pcchHeaderValue = NULL
- ) const = 0;
-
- virtual
- PCSTR
- GetHeader(
- IN HTTP_HEADER_ID ulHeaderIndex,
- OUT USHORT * pcchHeaderValue = NULL
- ) const = 0;
-
- virtual
- HRESULT
- SetHeader(
- IN PCSTR pszHeaderName,
- IN PCSTR pszHeaderValue,
- IN USHORT cchHeaderValue,
- IN BOOL fReplace
- ) = 0;
-
- virtual
- HRESULT
- SetHeader(
- IN HTTP_HEADER_ID ulHeaderIndex,
- IN PCSTR pszHeaderValue,
- IN USHORT cchHeaderValue,
- IN BOOL fReplace
- ) = 0;
-
- virtual
- HRESULT
- DeleteHeader(
- IN PCSTR pszHeaderName
- ) = 0;
-
- virtual
- HRESULT
- DeleteHeader(
- IN HTTP_HEADER_ID ulHeaderIndex
- ) = 0;
-
- virtual
- PCSTR
- GetHttpMethod(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- SetHttpMethod(
- IN PCSTR pszHttpMethod
- ) = 0;
-
- virtual
- HRESULT
- SetUrl(
- IN PCWSTR pszUrl,
- IN DWORD cchUrl,
- IN BOOL fResetQueryString
- ) = 0;
-
- virtual
- HRESULT
- SetUrl(
- IN PCSTR pszUrl,
- IN DWORD cchUrl,
- IN BOOL fResetQueryString
- ) = 0;
-
- virtual
- BOOL
- GetUrlChanged(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetForwardedUrl(
- VOID
- ) const = 0;
-
- virtual
- PSOCKADDR
- GetLocalAddress(
- VOID
- ) const = 0;
-
- virtual
- PSOCKADDR
- GetRemoteAddress(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- ReadEntityBody(
- OUT VOID * pvBuffer,
- IN DWORD cbBuffer,
- IN BOOL fAsync,
- OUT DWORD * pcbBytesReceived,
- OUT BOOL * pfCompletionPending = NULL
- ) = 0;
-
- virtual
- HRESULT
- InsertEntityBody(
- IN VOID * pvBuffer,
- IN DWORD cbBuffer
- ) = 0;
-
- virtual
- DWORD
- GetRemainingEntityBytes(
- VOID
- ) = 0;
-
- virtual
- VOID
- GetHttpVersion(
- OUT USHORT * pMajorVersion,
- OUT USHORT * pMinorVersion
- ) const = 0;
-
- virtual
- HRESULT
- GetClientCertificate(
- OUT HTTP_SSL_CLIENT_CERT_INFO ** ppClientCertInfo,
- OUT BOOL * pfClientCertNegotiated
- ) = 0;
-
- virtual
- HRESULT
- NegotiateClientCertificate(
- IN BOOL fAsync,
- OUT BOOL * pfCompletionPending = NULL
- ) = 0;
-
- virtual
- DWORD
- GetSiteId(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- GetHeaderChanges(
- IN DWORD dwOldChangeNumber,
- OUT DWORD * pdwNewChangeNumber,
- IN OUT PCSTR knownHeaderSnapshot[HttpHeaderRequestMaximum],
- IN OUT DWORD * pdwUnknownHeaderSnapshot,
- IN OUT PCSTR **ppUnknownHeaderNameSnapshot,
- IN OUT PCSTR **ppUnknownHeaderValueSnapshot,
- __out_ecount(HttpHeaderRequestMaximum+1)
- DWORD diffedKnownHeaderIndices[HttpHeaderRequestMaximum+1],
- OUT DWORD * pdwDiffedUnknownHeaders,
- OUT DWORD **ppDiffedUnknownHeaderIndices
- ) = 0;
-};
-
-class __declspec(uuid("d9244ae1-51f8-4aa1-a66d-19277c33e610"))
-IHttpRequest2 : public IHttpRequest
-{
- public:
- virtual
- HRESULT
- GetChannelBindingToken(
- __deref_out_bcount_part(*pTokenSize, *pTokenSize)
- PBYTE * ppToken,
- DWORD * pTokenSize
- ) = 0;
-};
-
-class __declspec(uuid("cb1c40ca-70f2-41a0-add2-881f5ef57388"))
-IHttpCachePolicy
-{
- public:
- virtual
- HTTP_CACHE_POLICY *
- GetKernelCachePolicy(
- VOID
- ) = 0;
-
- virtual
- VOID
- SetKernelCacheInvalidatorSet(
- VOID
- ) = 0;
-
- virtual
- HTTP_CACHE_POLICY *
- GetUserCachePolicy(
- VOID
- ) = 0;
-
- virtual
- HRESULT
- AppendVaryByHeader(
- PCSTR pszHeader
- ) = 0;
-
- virtual
- PCSTR
- GetVaryByHeaders(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- AppendVaryByQueryString(
- PCSTR pszParam
- ) = 0;
-
- virtual
- PCSTR
- GetVaryByQueryStrings(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- SetVaryByValue(
- PCSTR pszValue
- ) = 0;
-
- virtual
- PCSTR
- GetVaryByValue(
- VOID
- ) const = 0;
-
- virtual
- BOOL
- IsUserCacheEnabled(
- VOID
- ) const = 0;
-
- virtual
- VOID
- DisableUserCache(
- VOID
- ) = 0;
-
- virtual
- BOOL
- IsCached(
- VOID
- ) const = 0;
-
- virtual
- VOID
- SetIsCached(
- VOID
- ) = 0;
-
- virtual
- BOOL
- GetKernelCacheInvalidatorSet(
- VOID
- ) const = 0;
-};
-
-class __declspec(uuid("9f4ba807-050e-4495-ae55-8870f7e9194a"))
-IHttpCachePolicy2 : public IHttpCachePolicy
-{
- public:
- virtual
- BOOL
- IsForceUpdateSet(
- VOID
- ) const = 0;
-
- virtual
- VOID
- SetForceUpdate(
- VOID
- ) = 0;
-};
-
-//
-// Response descriptor
-//
-class __declspec(uuid("7e1c6b38-628f-4e6c-95dc-41237eb7f95e"))
-IHttpResponse
-{
- public:
- virtual
- HTTP_RESPONSE *
- GetRawHttpResponse(
- VOID
- ) = 0;
-
- virtual
- const HTTP_RESPONSE *
- GetRawHttpResponse(
- VOID
- ) const = 0;
-
- virtual
- IHttpCachePolicy *
- GetCachePolicy(
- VOID
- ) = 0;
-
- virtual
- HRESULT
- SetStatus(
- IN USHORT statusCode,
- IN PCSTR pszReason,
- IN USHORT uSubStatus = 0,
- IN HRESULT hrErrorToReport = S_OK,
- IN IAppHostConfigException *pException = NULL,
- IN BOOL fTrySkipCustomErrors = FALSE
- ) = 0;
-
- virtual
- HRESULT
- SetHeader(
- IN PCSTR pszHeaderName,
- IN PCSTR pszHeaderValue,
- IN USHORT cchHeaderValue,
- IN BOOL fReplace
- ) = 0;
-
- virtual
- HRESULT
- SetHeader(
- IN HTTP_HEADER_ID ulHeaderIndex,
- IN PCSTR pszHeaderValue,
- IN USHORT cchHeaderValue,
- IN BOOL fReplace
- ) = 0;
-
- virtual
- HRESULT
- DeleteHeader(
- IN PCSTR pszHeaderName
- ) = 0;
-
- virtual
- HRESULT
- DeleteHeader(
- IN HTTP_HEADER_ID ulHeaderIndex
- ) = 0;
-
- virtual
- PCSTR
- GetHeader(
- IN PCSTR pszHeaderName,
- OUT USHORT * pcchHeaderValue = NULL
- ) const = 0;
-
- virtual
- PCSTR
- GetHeader(
- IN HTTP_HEADER_ID ulHeaderIndex,
- OUT USHORT * pcchHeaderValue = NULL
- ) const = 0;
-
- virtual
- VOID
- Clear(
- VOID
- ) = 0;
-
- virtual
- VOID
- ClearHeaders(
- VOID
- ) = 0;
-
- virtual
- VOID
- SetNeedDisconnect(
- VOID
- ) = 0;
-
- virtual
- VOID
- ResetConnection(
- VOID
- ) = 0;
-
- virtual
- VOID
- DisableKernelCache(
- ULONG reason = 9
- ) = 0;
-
- virtual
- BOOL
- GetKernelCacheEnabled(
- VOID
- ) const = 0;
-
- virtual
- VOID
- SuppressHeaders(
- VOID
- ) = 0;
-
- virtual
- BOOL
- GetHeadersSuppressed(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- Flush(
- IN BOOL fAsync,
- IN BOOL fMoreData,
- OUT DWORD * pcbSent,
- OUT BOOL * pfCompletionExpected = NULL
- ) = 0;
-
- virtual
- HRESULT
- Redirect(
- IN PCSTR pszUrl,
- IN BOOL fResetStatusCode = TRUE,
- IN BOOL fIncludeParameters = FALSE
- ) = 0;
-
- virtual
- HRESULT
- WriteEntityChunkByReference(
- IN HTTP_DATA_CHUNK * pDataChunk,
- IN LONG lInsertPosition = -1
- ) = 0;
-
- virtual
- HRESULT
- WriteEntityChunks(
- IN HTTP_DATA_CHUNK * pDataChunks,
- IN DWORD nChunks,
- IN BOOL fAsync,
- IN BOOL fMoreData,
- OUT DWORD * pcbSent,
- OUT BOOL * pfCompletionExpected = NULL
- ) = 0;
-
- virtual
- VOID
- DisableBuffering(
- VOID
- ) = 0;
-
- virtual
- VOID
- GetStatus(
- OUT USHORT * pStatusCode,
- OUT USHORT * pSubStatus = NULL,
- OUT PCSTR * ppszReason = NULL,
- OUT USHORT * pcchReason = NULL,
- OUT HRESULT * phrErrorToReport = NULL,
- OUT PCWSTR * ppszModule = NULL,
- OUT DWORD * pdwNotification = NULL,
- OUT IAppHostConfigException ** ppException = NULL,
- OUT BOOL * pfTrySkipCustomErrors = NULL
- ) = 0;
-
- virtual
- HRESULT
- SetErrorDescription(
- IN PCWSTR pszDescription,
- IN DWORD cchDescription,
- IN BOOL fHtmlEncode = TRUE
- ) = 0;
-
- virtual
- PCWSTR
- GetErrorDescription(
- OUT DWORD * pcchDescription = NULL
- ) = 0;
-
- virtual
- HRESULT
- GetHeaderChanges(
- IN DWORD dwOldChangeNumber,
- OUT DWORD * pdwNewChangeNumber,
- IN OUT PCSTR knownHeaderSnapshot[HttpHeaderResponseMaximum],
- IN OUT DWORD * pdwUnknownHeaderSnapshot,
- IN OUT PCSTR **ppUnknownHeaderNameSnapshot,
- IN OUT PCSTR **ppUnknownHeaderValueSnapshot,
- __out_ecount(HttpHeaderResponseMaximum+1)
- DWORD diffedKnownHeaderIndices[HttpHeaderResponseMaximum+1],
- OUT DWORD * pdwDiffedUnknownHeaders,
- OUT DWORD **ppDiffedUnknownHeaderIndices
- ) = 0;
-
- virtual
- VOID
- CloseConnection(
- VOID
- ) = 0;
-};
-
-//
-// User descriptor
-//
-class __declspec(uuid("8059e6f8-10ce-4d61-b47e-5a1d8d9a8b67"))
-IHttpUser
-{
- public:
- virtual
- PCWSTR
- GetRemoteUserName(
- VOID
- ) = 0;
-
- virtual
- PCWSTR
- GetUserName(
- VOID
- ) = 0;
-
- virtual
- PCWSTR
- GetAuthenticationType(
- VOID
- ) = 0;
-
- virtual
- PCWSTR
- GetPassword(
- VOID
- ) = 0;
-
- virtual
- HANDLE
- GetImpersonationToken(
- VOID
- ) = 0;
-
- virtual
- HANDLE
- GetPrimaryToken(
- VOID
- ) = 0;
-
- virtual
- VOID
- ReferenceUser(
- VOID
- ) = 0;
-
- virtual
- VOID
- DereferenceUser(
- VOID
- ) = 0;
-
- virtual
- BOOL
- SupportsIsInRole(
- VOID
- ) = 0;
-
- virtual
- HRESULT
- IsInRole(
- IN PCWSTR pszRoleName,
- OUT BOOL * pfInRole
- ) = 0;
-
- virtual
- PVOID
- GetUserVariable(
- IN PCSTR pszVariableName
- ) = 0;
-};
-
-#define HTTP_USER_VARIABLE_SID "SID"
-#define HTTP_USER_VARIABLE_CTXT_HANDLE "CtxtHandle"
-#define HTTP_USER_VARIABLE_CRED_HANDLE "CredHandle"
-
-class __declspec(uuid("841d9a71-75f4-4626-8b97-66046ca7e45b"))
-IHttpConnectionStoredContext : public IHttpStoredContext
-{
- public:
- virtual
- VOID
- NotifyDisconnect(
- VOID
- ) = 0;
-};
-
-class __declspec(uuid("f3dd2fb3-4d11-4295-b8ab-4cb667add1fe"))
-IHttpConnectionModuleContextContainer : public IHttpModuleContextContainer
-{
- public:
- virtual
- IHttpConnectionStoredContext *
- GetConnectionModuleContext(
- IN HTTP_MODULE_ID moduleId
- ) = 0;
-
- virtual
- HRESULT
- SetConnectionModuleContext(
- IN IHttpConnectionStoredContext * ppStoredContext,
- IN HTTP_MODULE_ID moduleId
- ) = 0;
-};
-
-//
-// Connection descriptor
-//
-class __declspec(uuid("d9a5de00-3346-4599-9826-fe88565e1226"))
-IHttpConnection
-{
- public:
- virtual
- BOOL
- IsConnected(
- VOID
- ) const = 0;
-
- virtual
- VOID *
- AllocateMemory(
- DWORD cbAllocation
- ) = 0;
-
- virtual
- IHttpConnectionModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-};
-
-//
-// Forward declarations
-//
-class __declspec(uuid("71e95595-8c74-44d9-88a9-f5112d5f5900"))
-IHttpFileInfo;
-
-class __declspec(uuid("eb16a6ec-ba5d-436f-bf24-3ede13906450"))
-IHttpSite;
-
-class __declspec(uuid("671e6d34-9380-4df4-b453-91129df02b24"))
-ICustomNotificationProvider;
-
-class __declspec(uuid("6f3f657d-2fb8-43c6-a096-5064b41f0580"))
-IHttpEventProvider;
-
-class CHttpModule;
-
-//
-// IHttpContext extended interface versions (deprecated)
-//
-enum HTTP_CONTEXT_INTERFACE_VERSION
-{
-};
-
-//
-// Context object representing the processing of an HTTP request
-//
-class __declspec(uuid("424c1b8c-a1ba-44d7-ac98-9f8f457701a5"))
-IHttpContext
-{
- public:
- virtual
- IHttpSite *
- GetSite(
- VOID
- ) = 0;
-
- virtual
- IHttpApplication *
- GetApplication(
- VOID
- ) = 0;
-
- virtual
- IHttpConnection *
- GetConnection(
- VOID
- ) = 0;
-
- virtual
- IHttpRequest *
- GetRequest(
- VOID
- ) = 0;
-
- virtual
- IHttpResponse *
- GetResponse(
- VOID
- ) = 0;
-
- virtual
- BOOL
- GetResponseHeadersSent(
- VOID
- ) const = 0;
-
- virtual
- IHttpUser *
- GetUser(
- VOID
- ) const = 0;
-
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-
- virtual
- VOID
- IndicateCompletion(
- IN REQUEST_NOTIFICATION_STATUS notificationStatus
- ) = 0;
-
- virtual
- HRESULT
- PostCompletion(
- IN DWORD cbBytes
- ) = 0;
-
- virtual
- VOID
- DisableNotifications(
- IN DWORD dwNotifications,
- IN DWORD dwPostNotifications
- ) = 0;
-
- virtual
- BOOL
- GetNextNotification(
- IN REQUEST_NOTIFICATION_STATUS status,
- OUT DWORD * pdwNotification,
- OUT BOOL * pfIsPostNotification,
- OUT CHttpModule ** ppModuleInfo,
- OUT IHttpEventProvider ** ppRequestOutput
- ) = 0;
-
- virtual
- BOOL
- GetIsLastNotification(
- IN REQUEST_NOTIFICATION_STATUS status
- ) = 0;
-
- virtual
- HRESULT
- ExecuteRequest(
- IN BOOL fAsync,
- IN IHttpContext * pHttpContext,
- IN DWORD dwExecuteFlags,
- IN IHttpUser * pHttpUser,
- OUT BOOL * pfCompletionExpected = NULL
- ) = 0;
-
- virtual
- DWORD
- GetExecuteFlags(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- GetServerVariable(
- PCSTR pszVariableName,
- __deref_out_ecount(*pcchValueLength) PCWSTR * ppszValue,
- __out DWORD * pcchValueLength
- ) = 0;
-
- virtual
- HRESULT
- GetServerVariable(
- PCSTR pszVariableName,
- __deref_out_ecount(*pcchValueLength) PCSTR * ppszValue,
- __out DWORD * pcchValueLength
- ) = 0;
-
- virtual
- HRESULT
- SetServerVariable(
- PCSTR pszVariableName,
- PCWSTR pszVariableValue
- ) = 0;
-
- virtual
- VOID *
- AllocateRequestMemory(
- IN DWORD cbAllocation
- ) = 0;
-
- virtual
- IHttpUrlInfo *
- GetUrlInfo(
- VOID
- ) = 0;
-
- virtual
- IMetadataInfo *
- GetMetadata(
- VOID
- ) = 0;
-
- virtual
- PCWSTR
- GetPhysicalPath(
- OUT DWORD * pcchPhysicalPath = NULL
- ) = 0;
-
- virtual
- PCWSTR
- GetScriptName(
- OUT DWORD * pcchScriptName = NULL
- ) const = 0;
-
- virtual
- PCWSTR
- GetScriptTranslated(
- OUT DWORD * pcchScriptTranslated = NULL
- ) = 0;
-
- virtual
- IScriptMapInfo *
- GetScriptMap(
- VOID
- ) const = 0;
-
- virtual
- VOID
- SetRequestHandled(
- VOID
- ) = 0;
-
- virtual
- IHttpFileInfo *
- GetFileInfo(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- MapPath(
- PCWSTR pszUrl,
- __out_bcount_opt(*pcbPhysicalPath) PWSTR pszPhysicalPath,
- IN OUT DWORD * pcbPhysicalPath
- ) = 0;
-
- virtual
- HRESULT
- NotifyCustomNotification(
- ICustomNotificationProvider * pCustomOutput,
- OUT BOOL * pfCompletionExpected
- ) = 0;
-
- virtual
- IHttpContext *
- GetParentContext(
- VOID
- ) const = 0;
-
- virtual
- IHttpContext *
- GetRootContext(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- CloneContext(
- IN DWORD dwCloneFlags,
- OUT IHttpContext ** ppHttpContext
- ) = 0;
-
- virtual
- HRESULT
- ReleaseClonedContext(
- VOID
- ) = 0;
-
- virtual
- HRESULT
- GetCurrentExecutionStats(
- OUT DWORD * pdwNotification,
- OUT DWORD * pdwNotificationStartTickCount = NULL,
- OUT PCWSTR * ppszModule = NULL,
- OUT DWORD * pdwModuleStartTickCount = NULL,
- OUT DWORD * pdwAsyncNotification = NULL,
- OUT DWORD * pdwAsyncNotificationStartTickCount = NULL
- ) const = 0;
-
- virtual
- IHttpTraceContext *
- GetTraceContext(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- GetServerVarChanges(
- IN DWORD dwOldChangeNumber,
- OUT DWORD * pdwNewChangeNumber,
- IN OUT DWORD * pdwVariableSnapshot,
- IN OUT PCSTR ** ppVariableNameSnapshot,
- IN OUT PCWSTR ** ppVariableValueSnapshot,
- OUT DWORD * pdwDiffedVariables,
- OUT DWORD ** ppDiffedVariableIndices
- ) = 0;
-
- virtual
- HRESULT
- CancelIo(
- VOID
- ) = 0;
-
- virtual
- HRESULT
- MapHandler(
- IN DWORD dwSiteId,
- IN PCWSTR pszSiteName,
- IN PCWSTR pszUrl,
- IN PCSTR pszVerb,
- OUT IScriptMapInfo ** ppScriptMap,
- IN BOOL fIgnoreWildcardMappings = FALSE
- ) = 0;
-
- __declspec(deprecated("This method is deprecated. Use the HttpGetExtendedInterface helper function instead."))
- virtual
- HRESULT
- GetExtendedInterface(
- IN HTTP_CONTEXT_INTERFACE_VERSION version,
- OUT PVOID * ppInterface
- ) = 0;
-};
-
-class __declspec(uuid("9f9098d5-915c-4294-a52e-66532a232bc9"))
-IHttpTraceContext
-{
-public:
- virtual
- HRESULT
- GetTraceConfiguration(
- IN OUT HTTP_TRACE_CONFIGURATION * pHttpTraceConfiguration
- ) = 0;
-
- virtual
- HRESULT
- SetTraceConfiguration(
- IN HTTP_MODULE_ID moduleId,
- IN HTTP_TRACE_CONFIGURATION * pHttpTraceConfiguration,
- IN DWORD cHttpTraceConfiguration = 1
- ) = 0;
-
- virtual
- HRESULT
- RaiseTraceEvent(
- IN HTTP_TRACE_EVENT * pTraceEvent
- ) = 0;
-
- virtual
- LPCGUID
- GetTraceActivityId(
- ) = 0;
-
- virtual
- HRESULT
- QuickTrace(
- IN PCWSTR pszData1,
- IN PCWSTR pszData2 = NULL,
- IN HRESULT hrLastError = S_OK,
- //
- // 4 == TRACE_LEVEL_INFORMATION
- //
- IN UCHAR Level = 4
- ) = 0;
-};
-
-class __declspec(uuid("37776aff-852e-4eec-93a5-b85a285a95b8"))
-IHttpCacheSpecificData;
-
-//
-// Cache helpers
-//
-class __declspec(uuid("cdef2aad-20b3-4512-b1b1-094b3844aeb2"))
-IHttpCacheKey
-{
- public:
- virtual
- DWORD
- GetHash(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetCacheName(
- VOID
- ) const = 0;
-
- virtual
- bool
- GetIsEqual(
- IHttpCacheKey * pCacheCompareKey
- ) const = 0;
-
- virtual
- bool
- GetIsPrefix(
- IHttpCacheKey * pCacheCompareKey
- ) const = 0;
-
- virtual
- VOID
- Enum(
- IHttpCacheSpecificData *
- ) = 0;
-};
-
-class __declspec(uuid("37776aff-852e-4eec-93a5-b85a285a95b8"))
-IHttpCacheSpecificData
-{
- public:
- virtual
- IHttpCacheKey *
- GetCacheKey(
- VOID
- ) const = 0;
-
- virtual
- VOID
- ReferenceCacheData(
- VOID
- ) = 0;
-
- virtual
- VOID
- DereferenceCacheData(
- VOID
- ) = 0;
-
- virtual
- VOID
- ResetTTL(
- VOID
- ) = 0;
-
- virtual
- VOID
- DecrementTTL(
- OUT BOOL *pfTTLExpired
- ) = 0;
-
- virtual
- VOID
- SetFlushed(
- VOID
- ) = 0;
-
- virtual
- BOOL
- GetFlushed(
- VOID
- ) const = 0;
-};
-
-//
-// Site descriptor
-//
-class __declspec(uuid("eb16a6ec-ba5d-436f-bf24-3ede13906450"))
-IHttpSite
-{
- public:
- virtual
- DWORD
- GetSiteId(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetSiteName(
- VOID
- ) const = 0;
-
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-
- virtual
- IHttpPerfCounterInfo *
- GetPerfCounterInfo(
- VOID
- ) = 0;
-};
-
-//
-// File change monitor
-//
-//
-class __declspec(uuid("985422da-b0cf-473b-ba9e-8148ceb3e240"))
-IHttpFileMonitor
-{
- public:
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-
- virtual
- VOID
- DereferenceFileMonitor(
- VOID
- ) = 0;
-};
-
-//
-// File descriptor
-//
-//
-class __declspec(uuid("71e95595-8c74-44d9-88a9-f5112d5f5900"))
-IHttpFileInfo : public IHttpCacheSpecificData
-{
- public:
- virtual
- DWORD
- GetAttributes(
- VOID
- ) const = 0;
-
- virtual
- VOID
- GetSize(
- OUT ULARGE_INTEGER * pliSize
- ) const = 0;
-
- virtual
- const BYTE *
- GetFileBuffer(
- VOID
- ) const = 0;
-
- virtual
- HANDLE
- GetFileHandle(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetFilePath(
- VOID
- ) const = 0;
-
- virtual
- PCSTR
- GetETag(
- OUT USHORT * pcchETag = NULL
- ) const = 0;
-
- virtual
- VOID
- GetLastModifiedTime(
- OUT FILETIME * pFileTime
- ) const = 0;
-
- virtual
- PCSTR
- GetLastModifiedString(
- VOID
- ) const = 0;
-
- virtual
- BOOL
- GetHttpCacheAllowed(
- OUT DWORD * pSecondsToLive
- ) const = 0;
-
- virtual
- HRESULT
- AccessCheck(
- IN HANDLE hUserToken,
- IN PSID pUserSid
- ) = 0;
-
- virtual
- HANDLE
- GetVrToken(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetVrPath(
- VOID
- ) const = 0;
-
- virtual
- IHttpModuleContextContainer *
- GetModuleContextContainer(
- VOID
- ) = 0;
-
- virtual
- BOOL
- CheckIfFileHasChanged(
- IN HANDLE hUserToken
- ) = 0;
-};
-
-
-//
-// Token-cache entry
-//
-class __declspec(uuid("fd86e6de-fb0e-47dd-820a-e0da12be46e9"))
-IHttpTokenEntry : public IHttpCacheSpecificData
-{
- public:
- virtual
- HANDLE
- GetImpersonationToken(
- VOID
- ) = 0;
-
- virtual
- HANDLE
- GetPrimaryToken(
- VOID
- ) = 0;
-
- virtual
- PSID
- GetSid(
- VOID
- ) = 0;
-};
-
-
-//
-// IHttpServer extended interface versions
-//
-enum HTTP_SERVER_INTERFACE_VERSION
-{
- HTTP_SERVER_INTERFACE_V2
-};
-
-
-//
-// Global utility descriptor
-//
-class __declspec(uuid("eda2a40f-fb92-4d6d-b52b-c8c207380b4e"))
-IHttpServer
-{
- public:
- virtual
- BOOL
- IsCommandLineLaunch(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetAppPoolName(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- AssociateWithThreadPool(
- IN HANDLE hHandle,
- IN LPOVERLAPPED_COMPLETION_ROUTINE completionRoutine
- ) = 0;
-
- virtual
- VOID
- IncrementThreadCount(
- VOID
- ) = 0;
-
- virtual
- VOID
- DecrementThreadCount(
- VOID
- ) = 0;
-
- virtual
- VOID
- ReportUnhealthy(
- IN PCWSTR pszReasonString,
- IN HRESULT hrReason
- ) = 0;
-
- virtual
- VOID
- RecycleProcess(
- PCWSTR pszReason
- ) = 0;
-
- virtual
- IAppHostAdminManager *
- GetAdminManager(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- GetFileInfo(
- IN PCWSTR pszPhysicalPath,
- IN HANDLE hUserToken,
- IN PSID pSid,
- IN PCWSTR pszChangeNotificationPath,
- IN HANDLE hChangeNotificationToken,
- IN BOOL fCache,
- OUT IHttpFileInfo ** ppFileInfo,
- IN IHttpTraceContext * pHttpTraceContext = NULL
- ) = 0;
-
- virtual
- HRESULT
- FlushKernelCache(
- IN PCWSTR pszUrl
- ) = 0;
-
- virtual
- HRESULT
- DoCacheOperation(
- IN CACHE_OPERATION cacheOperation,
- IN IHttpCacheKey * pCacheKey,
- OUT IHttpCacheSpecificData ** ppCacheSpecificData,
- IN IHttpTraceContext * pHttpTraceContext = NULL
- ) = 0;
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- NotifyCustomNotification(
- ICustomNotificationProvider * pCustomOutput
- ) = 0;
-
- virtual
- IHttpPerfCounterInfo *
- GetPerfCounterInfo(
- VOID
- ) = 0;
-
- virtual
- VOID
- RecycleApplication(
- PCWSTR pszAppConfigPath
- ) = 0;
-
- virtual
- VOID
- NotifyConfigurationChange(
- PCWSTR pszPath
- ) = 0;
-
- virtual
- VOID
- NotifyFileChange(
- PCWSTR pszFileName
- ) = 0;
-
- virtual
- IDispensedHttpModuleContextContainer *
- DispenseContainer(
- VOID
- ) = 0;
-
- virtual
- HRESULT
- AddFragmentToCache(
- IN HTTP_DATA_CHUNK * pDataChunk,
- PCWSTR pszFragmentName
- ) = 0;
-
- virtual
- HRESULT
- ReadFragmentFromCache(
- PCWSTR pszFragmentName,
- OUT BYTE * pvBuffer,
- DWORD cbSize,
- OUT DWORD * pcbCopied
- ) = 0;
-
- virtual
- HRESULT
- RemoveFragmentFromCache(
- PCWSTR pszFragmentName
- ) = 0;
-
- virtual
- HRESULT
- GetWorkerProcessSettings(
- OUT IWpfSettings ** ppWorkerProcessSettings
- ) = 0;
-
- virtual
- HRESULT
- GetProtocolManagerCustomInterface(
- IN PCWSTR pProtocolManagerDll,
- IN PCWSTR pProtocolManagerDllInitFunction,
- IN DWORD dwCustomInterfaceId,
- OUT PVOID* ppCustomInterface
- ) = 0;
-
- virtual
- BOOL
- SatisfiesPrecondition(
- PCWSTR pszPrecondition,
- BOOL * pfUnknownPrecondition = NULL
- ) const = 0;
-
- virtual
- IHttpTraceContext *
- GetTraceContext(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- RegisterFileChangeMonitor(
- PCWSTR pszPath,
- HANDLE hToken,
- IHttpFileMonitor ** ppFileMonitor
- ) = 0;
-
- virtual
- HRESULT
- GetExtendedInterface(
- IN HTTP_SERVER_INTERFACE_VERSION version,
- OUT PVOID * ppInterface
- ) = 0;
-};
-
-class __declspec(uuid("34af637e-afe8-4556-bcc1-767f8e0b4a4e"))
-IHttpServer2 : public IHttpServer
-{
- public:
-
- virtual
- HRESULT
- GetToken(
- PCWSTR pszUserName,
- PCWSTR pszPassword,
- DWORD dwLogonMethod,
- IHttpTokenEntry ** ppTokenEntry,
- PCWSTR pszDefaultDomain = NULL,
- PSOCKADDR pSockAddr = NULL,
- IHttpTraceContext * pHttpTraceContext = NULL
- ) = 0;
-
- virtual
- PCWSTR
- GetAppPoolConfigFile(
- __out DWORD * pcchConfigFilePath = NULL
- ) const = 0;
-
- virtual
- HRESULT
- GetExtendedInterface(
- __in const GUID & Version1,
- __in PVOID pInput,
- __in const GUID & Version2,
- __deref_out PVOID * ppOutput
- ) = 0;
-};
-
-//
-// Helper function to get extended HTTP interfaces.
-//
-// Template parameters (HttpType1 and HttpType2)
-// can be deduced from the arguments to the function.
-//
-// Example:
-//
-// IHttpRequest * pHttpRequest = pHttpContext->GetRequest();
-// IHttpRequest2 * pHttpRequest2;
-// HRESULT hr = HttpGetExtendedInterface(g_pHttpServer, pHttpRequest, &pHttpRequest2);
-// if( SUCCEEDED(hr) )
-// {
-// // Use pHttpRequest2.
-// }
-//
-// Where pHttpContext is an IHttpContext pointer and
-// g_pHttpServer is an IHttpServer pointer.
-//
-
-template <class HttpType1, class HttpType2>
-HRESULT
-HttpGetExtendedInterface(
- __in IHttpServer * pHttpServer,
- __in HttpType1 * pInput,
- __deref_out HttpType2 ** ppOutput
-)
-{
- HRESULT hr;
- IHttpServer2 * pHttpServer2;
- hr = pHttpServer->GetExtendedInterface(HTTP_SERVER_INTERFACE_V2,
- reinterpret_cast<void**>(&pHttpServer2) );
- if (SUCCEEDED(hr))
- {
- hr = pHttpServer2->GetExtendedInterface(__uuidof(HttpType1),
- pInput,
- __uuidof(HttpType2),
- reinterpret_cast<void**>(ppOutput) );
- }
- return hr;
-}
-
-//
-// Notification specific output for notifications
-//
-class __declspec(uuid("6f3f657d-2fb8-43c6-a096-5064b41f0580"))
-IHttpEventProvider
-{
- public:
- virtual
- VOID
- SetErrorStatus(
- HRESULT hrError
- ) = 0;
-};
-
-//
-// Completion information for notifications
-//
-class __declspec(uuid("49dd20e3-d9c0-463c-8821-f3413b55cc00"))
-IHttpCompletionInfo
-{
- public:
- virtual
- DWORD
- GetCompletionBytes(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- GetCompletionStatus(
- VOID
- ) const = 0;
-};
-
-//
-// RQ_ and GL_ CUSTOM_NOTIFICATION outputs
-//
-class __declspec(uuid("671e6d34-9380-4df4-b453-91129df02b24"))
-ICustomNotificationProvider : public IHttpEventProvider
-{
- public:
- virtual
- PCWSTR
- QueryNotificationType(
- VOID
- ) = 0;
-};
-
-//
-// RQ_REQUEST_AUTHENTICATE descriptor
-//
-class __declspec(uuid("304d51d0-0307-45ed-83fd-dd3fc032fdfc"))
-IAuthenticationProvider : public IHttpEventProvider
-{
- public:
- virtual
- VOID
- SetUser(
- IN IHttpUser * pUser
- ) = 0;
-};
-
-//
-// RQ_MAP_REQUEST_HANDLER
-//
-class __declspec(uuid("fea3ce6b-e346-47e7-b2a6-ad265baeff2c"))
-IMapHandlerProvider : public IHttpEventProvider
-{
- public:
- virtual
- HRESULT
- SetScriptName(
- PCWSTR pszScriptName,
- DWORD cchScriptName
- ) = 0;
-
- virtual
- VOID
- SetScriptMap(
- IN IScriptMapInfo * pScriptMap
- ) = 0;
-
- virtual
- VOID
- SetFileInfo(
- IN IHttpFileInfo * pFileInfo
- ) = 0;
-};
-
-//
-// RQ_MAP_PATH
-//
-class __declspec(uuid("8efdf557-a8f1-4bc9-b462-6df3b038a59a"))
-IMapPathProvider : public IHttpEventProvider
-{
- public:
- virtual
- PCWSTR
- GetUrl(
- ) const = 0;
-
- virtual
- PCWSTR
- GetPhysicalPath(
- ) const = 0;
-
- virtual
- HRESULT
- SetPhysicalPath(
- PCWSTR pszPhysicalPath,
- DWORD cchPhysicalPath
- ) = 0;
-};
-
-//
-// RQ_SEND_RESPONSE
-//
-class __declspec(uuid("57f2e7bc-0bcf-4a9f-94a4-10e55c6e5b51"))
-ISendResponseProvider : public IHttpEventProvider
-{
- public:
- virtual
- BOOL
- GetHeadersBeingSent(
- VOID
- ) const = 0;
-
- virtual
- DWORD
- GetFlags(
- VOID
- ) const = 0;
-
- virtual
- VOID
- SetFlags(
- DWORD dwFlags
- ) = 0;
-
- virtual
- HTTP_LOG_DATA *
- GetLogData(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- SetLogData(
- IN HTTP_LOG_DATA *pLogData
- ) = 0;
-
- virtual
- BOOL
- GetReadyToLogData(
- VOID
- ) const = 0;
-};
-
-//
-// RQ_READ_ENTITY
-//
-class __declspec(uuid("fe6d905a-99b8-49fd-b389-cfc809562b81"))
-IReadEntityProvider : public IHttpEventProvider
-{
- public:
- virtual
- VOID
- GetEntity(
- OUT PVOID * ppBuffer,
- OUT DWORD * pcbData,
- OUT DWORD * pcbBuffer
- ) = 0;
-
- virtual
- VOID
- SetEntity(
- IN PVOID pBuffer,
- DWORD cbData,
- DWORD cbBuffer
- ) = 0;
-};
-
-//
-// GL_PRE_BEGIN_REQUEST provider
-//
-class __declspec(uuid("fb715d26-aff9-476a-8fc0-6b1acb3d1098"))
-IPreBeginRequestProvider : public IHttpEventProvider
-{
- public:
- virtual
- IHttpContext *
- GetHttpContext(
- VOID
- ) = 0;
-};
-
-//
-// GL_APPLICATION_START provider
-//
-class __declspec(uuid("1de2c71c-c126-4512-aed3-f4f885e14997"))
-IHttpApplicationProvider : public IHttpEventProvider
-{
- public:
- virtual
- IHttpApplication *
- GetApplication(
- VOID
- ) = 0;
-};
-
-typedef IHttpApplicationProvider IHttpApplicationStartProvider;
-
-class __declspec(uuid("ba32d330-9ea8-4b9e-89f1-8c76a323277f"))
-IHttpModuleFactory;
-
-//
-// GL_APPLICATION_RESOLVE_MODULES provider
-//
-class __declspec(uuid("0617d9b9-e20f-4a9f-94f9-35403b3be01e"))
-IHttpApplicationResolveModulesProvider : public IHttpApplicationProvider
-{
- public:
- virtual
- HRESULT
- RegisterModule(
- IN HTTP_MODULE_ID parentModuleId,
- IN IHttpModuleFactory * pModuleFactory,
- IN PCWSTR pszModuleName,
- IN PCWSTR pszModuleType,
- IN PCWSTR pszModulePreCondition,
- IN DWORD dwRequestNotifications,
- IN DWORD dwPostRequestNotifications
- ) = 0;
-
- virtual
- HRESULT
- SetPriorityForRequestNotification(
- IN PCWSTR pszModuleName,
- IN DWORD dwRequestNotification,
- IN PCWSTR pszPriorityAlias
- ) = 0;
-};
-
-//
-// GL_APPLICATION_STOP provider
-//
-typedef IHttpApplicationProvider IHttpApplicationStopProvider;
-
-//
-// GL_RSCA_QUERY provider
-//
-class __declspec(uuid("63fdc43f-934a-4ee5-bcd8-7e7b50b75605"))
-IGlobalRSCAQueryProvider : public IHttpEventProvider
-{
- public:
- virtual
- PCWSTR
- GetFunctionName(
- VOID
- ) const = 0;
-
- virtual
- PCWSTR
- GetFunctionParameters(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- GetOutputBuffer(
- DWORD cbBuffer,
- OUT BYTE ** ppbBuffer
- ) = 0;
-
- virtual
- HRESULT
- ResizeOutputBuffer(
- DWORD cbNewBuffer,
- DWORD cbBytesToCopy,
- IN OUT BYTE ** ppbBuffer
- ) = 0;
-
- virtual
- VOID
- SetResult(
- DWORD cbData,
- HRESULT hr
- ) = 0;
-};
-
-//
-// GL_STOP_LISTENING
-//
-class __declspec(uuid("41f9a601-e25d-4ac8-8a1f-635698a30ab9"))
-IGlobalStopListeningProvider : public IHttpEventProvider
-{
- public:
- virtual
- BOOL
- DrainRequestsGracefully(
- VOID
- ) const = 0;
-};
-
-//
-// GL_CACHE_OPERATION
-//
-class __declspec(uuid("58925fb9-7c5e-4684-833b-4a04e1286690"))
-ICacheProvider : public IHttpEventProvider
-{
- public:
- virtual
- CACHE_OPERATION
- GetCacheOperation(
- VOID
- ) const = 0;
-
- virtual
- IHttpCacheKey *
- GetCacheKey(
- VOID
- ) const = 0;
-
- virtual
- IHttpCacheSpecificData *
- GetCacheRecord(
- VOID
- ) const = 0;
-
- virtual
- VOID
- SetCacheRecord(
- IHttpCacheSpecificData * pCacheRecord
- ) = 0;
-
- virtual
- IHttpTraceContext *
- GetTraceContext(
- VOID
- ) const = 0;
-};
-
-//
-// GL_CONFIGURATION_CHANGE
-//
-class __declspec(uuid("3405f3b4-b3d6-4b73-b5f5-4d8a3cc642ce"))
-IGlobalConfigurationChangeProvider : public IHttpEventProvider
-{
- public:
- virtual
- PCWSTR
- GetChangePath(
- VOID
- ) const = 0;
-};
-
-//
-// GL_FILE_CHANGE
-//
-class __declspec(uuid("ece31ee5-0486-4fb0-a875-6739a2d7daf5"))
-IGlobalFileChangeProvider : public IHttpEventProvider
-{
-public:
- virtual
- PCWSTR
- GetFileName(
- VOID
- ) const = 0;
-
- virtual
- IHttpFileMonitor *
- GetFileMonitor(
- VOID
- ) = 0;
-};
-
-//
-// GL_TRACE_EVENT
-//
-class __declspec(uuid("7c6bb150-0310-4718-a01f-6faceb62dc1d"))
-IGlobalTraceEventProvider : public IHttpEventProvider
-{
- public:
- virtual
- HRESULT
- GetTraceEvent(
- OUT HTTP_TRACE_EVENT ** ppTraceEvent
- ) = 0;
-
- virtual
- BOOL
- CheckSubscription(
- IN HTTP_MODULE_ID ModuleId
- ) = 0;
-
- virtual
- HRESULT
- GetCurrentHttpRequestContext(
- OUT IHttpContext ** ppHttpContext
- ) = 0;
-};
-
-//
-// GL_THREAD_CLEANUP
-//
-class __declspec(uuid("6b36a149-8620-45a0-8197-00814a706e2e"))
-IGlobalThreadCleanupProvider : public IHttpEventProvider
-{
-public:
- virtual
- IHttpApplication *
- GetApplication(
- VOID
- ) = 0;
-};
-
-//
-// GL_APPLICATION_PRELOAD
-//
-class __declspec(uuid("2111f8d6-0c41-4ff7-bd45-5c04c7e91a73"))
-IGlobalApplicationPreloadProvider : public IHttpEventProvider
-{
-public:
- virtual
- HRESULT
- CreateContext(
- OUT IHttpContext ** ppHttpContext
- ) = 0;
-
- virtual
- HRESULT
- ExecuteRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpUser * pHttpUser
- ) = 0;
-};
-
-class CHttpModule
-{
-public:
- // RQ_BEGIN_REQUEST
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnBeginRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostBeginRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_AUTHENTICATE_REQUEST
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnAuthenticateRequest(
- IN IHttpContext * pHttpContext,
- IN IAuthenticationProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostAuthenticateRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_AUTHORIZE_REQUEST
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnAuthorizeRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostAuthorizeRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_RESOLVE_REQUEST_CACHE
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnResolveRequestCache(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostResolveRequestCache(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_MAP_REQUEST_HANDLER
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnMapRequestHandler(
- IN IHttpContext * pHttpContext,
- IN IMapHandlerProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostMapRequestHandler(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_ACQUIRE_REQUEST_STATE
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnAcquireRequestState(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostAcquireRequestState(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_PRE_EXECUTE_REQUEST_HANDLER
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPreExecuteRequestHandler(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostPreExecuteRequestHandler(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_EXECUTE_REQUEST_HANDLER
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnExecuteRequestHandler(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostExecuteRequestHandler(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_RELEASE_REQUEST_STATE
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnReleaseRequestState(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostReleaseRequestState(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- // RQ_UPDATE_REQUEST_CACHE
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnUpdateRequestCache(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostUpdateRequestCache(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_LOG_REQUEST
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnLogRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostLogRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_END_REQUEST
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnEndRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnPostEndRequest(
- IN IHttpContext * pHttpContext,
- IN IHttpEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_SEND_RESPONSE
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnSendResponse(
- IN IHttpContext * pHttpContext,
- IN ISendResponseProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_MAP_PATH
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnMapPath(
- IN IHttpContext * pHttpContext,
- IN IMapPathProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_READ_ENTITY
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnReadEntity(
- IN IHttpContext * pHttpContext,
- IN IReadEntityProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // RQ_CUSTOM_NOTIFICATION
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnCustomRequestNotification(
- IN IHttpContext * pHttpContext,
- IN ICustomNotificationProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- // Completion
-
- virtual
- REQUEST_NOTIFICATION_STATUS
- OnAsyncCompletion(
- IN IHttpContext * pHttpContext,
- IN DWORD dwNotification,
- IN BOOL fPostNotification,
- IN IHttpEventProvider * pProvider,
- IN IHttpCompletionInfo * pCompletionInfo
- )
- {
- UNREFERENCED_PARAMETER( pHttpContext );
- UNREFERENCED_PARAMETER( dwNotification );
- UNREFERENCED_PARAMETER( fPostNotification );
- UNREFERENCED_PARAMETER( pProvider );
- UNREFERENCED_PARAMETER( pCompletionInfo );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CHttpModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return RQ_NOTIFICATION_CONTINUE;
- }
-
- virtual
- VOID
- Dispose(
- VOID
- )
- {
- delete this;
- }
-
- protected:
-
- CHttpModule()
- {}
-
- virtual
- ~CHttpModule()
- {}
-};
-
-class CGlobalModule
-{
- public:
-
- // GL_STOP_LISTENING
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalStopListening(
- IN IGlobalStopListeningProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_CACHE_CLEANUP
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalCacheCleanup(
- VOID
- )
- {
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_CACHE_OPERATION
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalCacheOperation(
- IN ICacheProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_HEALTH_CHECK
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalHealthCheck(
- VOID
- )
- {
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_CONFIGURATION_CHANGE
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalConfigurationChange(
- IN IGlobalConfigurationChangeProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_FILE_CHANGE
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalFileChange(
- IN IGlobalFileChangeProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_PRE_BEGIN_REQUEST
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalPreBeginRequest(
- IN IPreBeginRequestProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_APPLICATION_START
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalApplicationStart(
- IN IHttpApplicationStartProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_APPLICATION_RESOLVE_MODULES
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalApplicationResolveModules(
- IN IHttpApplicationResolveModulesProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_APPLICATION_STOP
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalApplicationStop(
- IN IHttpApplicationStopProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_RSCA_QUERY
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalRSCAQuery(
- IN IGlobalRSCAQueryProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_TRACE_EVENT
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalTraceEvent(
- IN IGlobalTraceEventProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_CUSTOM_NOTIFICATION
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalCustomNotification(
- IN ICustomNotificationProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- virtual
- VOID
- Terminate(
- VOID
- ) = 0;
-
- // GL_THREAD_CLEANUP
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalThreadCleanup(
- IN IGlobalThreadCleanupProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
- // GL_APPLICATION_PRELOAD
-
- virtual
- GLOBAL_NOTIFICATION_STATUS
- OnGlobalApplicationPreload(
- IN IGlobalApplicationPreloadProvider * pProvider
- )
- {
- UNREFERENCED_PARAMETER( pProvider );
- OutputDebugStringA(
- "This module subscribed to event "
- __FUNCTION__
- " but did not override the method in its CGlobalModule implementation."
- " Please check the method signature to make sure it matches the corresponding method.\n");
- DebugBreak();
-
- return GL_NOTIFICATION_CONTINUE;
- }
-
-};
-
-class __declspec(uuid("85c1679c-0b21-491c-afb5-c7b5c86464c4"))
-IModuleAllocator
-{
- public:
- virtual
- VOID *
- AllocateMemory(
- IN DWORD cbAllocation
- ) = 0;
-};
-
-class __declspec(uuid("ba32d330-9ea8-4b9e-89f1-8c76a323277f"))
-IHttpModuleFactory
-{
- public:
- virtual
- HRESULT
- GetHttpModule(
- OUT CHttpModule ** ppModule,
- IN IModuleAllocator * pAllocator
- ) = 0;
-
- virtual
- VOID
- Terminate(
- VOID
- ) = 0;
-};
-
-//
-// Register-module descriptor
-//
-class __declspec(uuid("07e5beb3-b798-459d-a98a-e6c485b2b3bc"))
-IHttpModuleRegistrationInfo
-{
- public:
- virtual
- PCWSTR
- GetName(
- VOID
- ) const = 0;
-
- virtual
- HTTP_MODULE_ID
- GetId(
- VOID
- ) const = 0;
-
- virtual
- HRESULT
- SetRequestNotifications(
- IN IHttpModuleFactory * pModuleFactory,
- IN DWORD dwRequestNotifications,
- IN DWORD dwPostRequestNotifications
- ) = 0;
-
- virtual
- HRESULT
- SetGlobalNotifications(
- IN CGlobalModule * pGlobalModule,
- IN DWORD dwGlobalNotifications
- ) = 0;
-
- virtual
- HRESULT
- SetPriorityForRequestNotification(
- IN DWORD dwRequestNotification,
- IN PCWSTR pszPriority
- ) = 0;
-
- virtual
- HRESULT
- SetPriorityForGlobalNotification(
- IN DWORD dwGlobalNotification,
- IN PCWSTR pszPriority
- ) = 0;
-};
-
-
-//
-// Register Module entry point
-//
-
-typedef
-HRESULT
-(WINAPI * PFN_REGISTERMODULE)(
- DWORD dwServerVersion,
- IHttpModuleRegistrationInfo * pModuleInfo,
- IHttpServer * pGlobalInfo
-);
-
-#define MODULE_REGISTERMODULE "RegisterModule"
-
-#endif
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h
deleted file mode 100644
index 4d0d5735bc..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/hybrid_array.h
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-template<typename TYPE, SIZE_T SIZE>
-class HYBRID_ARRAY
-{
-public:
-
- HYBRID_ARRAY(
- VOID
- ) : m_pArray(m_InlineArray),
- m_Capacity(ARRAYSIZE(m_InlineArray))
- {
- }
-
- ~HYBRID_ARRAY()
- {
- if ( !QueryUsesInlineArray() )
- {
- delete [] m_pArray;
- m_pArray = NULL;
- }
- }
-
- SIZE_T
- QueryCapacity(
- VOID
- ) const
- {
- //
- // Number of elements available in the array.
- //
- return m_Capacity;
- }
-
- TYPE *
- QueryArray(
- VOID
- ) const
- {
- //
- // Raw pointer to the current array.
- //
- return m_pArray;
- }
-
- TYPE &
- QueryItem(
- __in const SIZE_T Index
- )
- {
- //
- // Gets the array item giving the index.
- //
- return m_pArray[Index];
- }
-
- TYPE &
- operator [] (const SIZE_T Index)
- {
- //
- // Operator override for convenience.
- // Please don't add other overloads like '++' '--'
- // in order to keep it simple.
- //
- return m_pArray[Index];
- }
-
- const TYPE &
- operator [] (const SIZE_T Index) const
- {
- return m_pArray[Index];
- }
-
- template<SIZE_T SourceSize>
- HRESULT
- Copy(
- __in TYPE const (&SourceArray)[SourceSize],
- __in bool fHasTrivialAssign = false
- )
- /*++
-
- Routine Description:
-
- Copies a source array like:
-
- int source[] = { 1, 2, 3 };
- hr = hybridArray.Copy( source );
-
- It will statically determinate the length of the source array.
-
- Arguments:
-
- SourceArray - The array to copy.
- SourceSize - The number of array elements.
- fHasTrivialAssign - True if safe to perform buffer copy.
-
- Return Value:
-
- HRESULT
-
- --*/
- {
- return Copy( SourceArray, SourceSize, fHasTrivialAssign );
- }
-
- HRESULT
- Copy(
- __in_ecount(SourceSize)
- const TYPE * pSourceArray,
- __in const SIZE_T SourceSize,
- __in bool fHasTrivialAssign = false
- )
- /*++
-
- Routine Description:
-
- Copies a source array.
-
- Arguments:
-
- pSourceArray - The array to copy.
- SourceSize - The number of array elements.
- fHasTrivialAssign - True if safe to perform buffer copy.
-
- Return Value:
-
- HRESULT
-
- --*/
- {
- HRESULT hr;
-
- hr = EnsureCapacity( SourceSize,
- FALSE, // fCopyPrevious
- FALSE ); // fHasTrivialAssign
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- if ( fHasTrivialAssign ) // Future Work: use std::tr1::has_trivial_assign
- {
- CopyMemory(m_pArray, pSourceArray, m_Capacity * sizeof(TYPE));
- }
- else
- {
- for ( SIZE_T Index = 0; Index < SourceSize; ++Index )
- {
- m_pArray[Index] = pSourceArray[Index];
- }
- }
-
- return S_OK;
- }
-
- HRESULT
- EnsureCapacity(
- __in const SIZE_T MinimumCapacity,
- __in bool fCopyPrevious,
- __in bool fHasTrivialAssign = false
- )
- /*++
-
- Routine Description:
-
- Copies a source array.
-
- Arguments:
-
- MinimumCapacity - The expected length of the array.
- fCopyPrevious - Must be always explicit parameter.
- True if copy previous array data.
- fHasTrivialAssign - True if safe to perform buffer copy.
-
- Return Value:
-
- HRESULT
-
- --*/
- {
- //
- // Caller is responsible for calculating a length that won't cause
- // too many reallocations in the future.
- //
-
- if ( MinimumCapacity <= ARRAYSIZE(m_InlineArray) )
- {
- return S_OK;
- }
-
- TYPE * pNewArray;
-
- pNewArray = new TYPE[ MinimumCapacity ];
- if ( pNewArray == NULL )
- {
- return E_OUTOFMEMORY;
- }
-
- if ( fCopyPrevious )
- {
- if ( fHasTrivialAssign )
- {
- CopyMemory(pNewArray, m_pArray, m_Capacity * sizeof(TYPE));
- }
- else
- {
- for ( SIZE_T Index = 0; Index < m_Capacity; ++Index )
- {
- pNewArray[Index] = m_pArray[Index];
- }
- }
- }
-
- if ( QueryUsesInlineArray() )
- {
- m_pArray = pNewArray;
- }
- else
- {
- delete [] m_pArray;
- m_pArray = pNewArray;
- }
-
- m_Capacity = MinimumCapacity;
-
- return S_OK;
- }
-
-private:
-
- bool
- QueryUsesInlineArray(
- VOID
- ) const
- {
- return m_pArray == m_InlineArray;
- }
-
- TYPE m_InlineArray[SIZE];
- TYPE * m_pArray;
- SIZE_T m_Capacity;
-}; \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h
deleted file mode 100644
index 04c1d1ab46..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/listentry.h
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#ifndef _LIST_ENTRY_H
-#define _LIST_ENTRY_H
-
-//
-// Doubly-linked list manipulation routines.
-//
-
-
-#define InitializeListHead32(ListHead) (\
- (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead)))
-
-
-FORCEINLINE
-VOID
-InitializeListHead(
- IN PLIST_ENTRY ListHead
- )
-{
- ListHead->Flink = ListHead->Blink = ListHead;
-}
-
-FORCEINLINE
-BOOLEAN
-IsListEmpty(
- IN const LIST_ENTRY * ListHead
- )
-{
- return (BOOLEAN)(ListHead->Flink == ListHead);
-}
-
-FORCEINLINE
-BOOLEAN
-RemoveEntryList(
- IN PLIST_ENTRY Entry
- )
-{
- PLIST_ENTRY Blink;
- PLIST_ENTRY Flink;
-
- Flink = Entry->Flink;
- Blink = Entry->Blink;
- Blink->Flink = Flink;
- Flink->Blink = Blink;
- return (BOOLEAN)(Flink == Blink);
-}
-
-FORCEINLINE
-PLIST_ENTRY
-RemoveHeadList(
- IN PLIST_ENTRY ListHead
- )
-{
- PLIST_ENTRY Flink;
- PLIST_ENTRY Entry;
-
- Entry = ListHead->Flink;
- Flink = Entry->Flink;
- ListHead->Flink = Flink;
- Flink->Blink = ListHead;
- return Entry;
-}
-
-
-
-FORCEINLINE
-PLIST_ENTRY
-RemoveTailList(
- IN PLIST_ENTRY ListHead
- )
-{
- PLIST_ENTRY Blink;
- PLIST_ENTRY Entry;
-
- Entry = ListHead->Blink;
- Blink = Entry->Blink;
- ListHead->Blink = Blink;
- Blink->Flink = ListHead;
- return Entry;
-}
-
-
-FORCEINLINE
-VOID
-InsertTailList(
- IN PLIST_ENTRY ListHead,
- IN PLIST_ENTRY Entry
- )
-{
- PLIST_ENTRY Blink;
-
- Blink = ListHead->Blink;
- Entry->Flink = ListHead;
- Entry->Blink = Blink;
- Blink->Flink = Entry;
- ListHead->Blink = Entry;
-}
-
-
-FORCEINLINE
-VOID
-InsertHeadList(
- IN PLIST_ENTRY ListHead,
- IN PLIST_ENTRY Entry
- )
-{
- PLIST_ENTRY Flink;
-
- Flink = ListHead->Flink;
- Entry->Flink = Flink;
- Entry->Blink = ListHead;
- Flink->Blink = Entry;
- ListHead->Flink = Entry;
-}
-
-FORCEINLINE
-VOID
-AppendTailList(
- IN PLIST_ENTRY ListHead,
- IN PLIST_ENTRY ListToAppend
- )
-{
- PLIST_ENTRY ListEnd = ListHead->Blink;
-
- ListHead->Blink->Flink = ListToAppend;
- ListHead->Blink = ListToAppend->Blink;
- ListToAppend->Blink->Flink = ListHead;
- ListToAppend->Blink = ListEnd;
-}
-
-FORCEINLINE
-PSINGLE_LIST_ENTRY
-PopEntryList(
- PSINGLE_LIST_ENTRY ListHead
- )
-{
- PSINGLE_LIST_ENTRY FirstEntry;
- FirstEntry = ListHead->Next;
- if (FirstEntry != NULL) {
- ListHead->Next = FirstEntry->Next;
- }
-
- return FirstEntry;
-}
-
-
-FORCEINLINE
-VOID
-PushEntryList(
- PSINGLE_LIST_ENTRY ListHead,
- PSINGLE_LIST_ENTRY Entry
- )
-{
- Entry->Next = ListHead->Next;
- ListHead->Next = Entry;
-}
-
-
-#endif
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h
deleted file mode 100644
index 56a67eb1c4..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/macros.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _MACROS_H
-#define _MACROS_H
-
-//
-// The DIFF macro should be used around an expression involving pointer
-// subtraction. The expression passed to DIFF is cast to a size_t type,
-// allowing the result to be easily assigned to any 32-bit variable or
-// passed to a function expecting a 32-bit argument.
-//
-
-#define DIFF(x) ((size_t)(x))
-
-// Change a hexadecimal digit to its numerical equivalent
-#define TOHEX( ch ) \
- ((ch) > L'9' ? \
- (ch) >= L'a' ? \
- (ch) - L'a' + 10 : \
- (ch) - L'A' + 10 \
- : (ch) - L'0')
-
-
-// Change a number to its Hexadecimal equivalent
-
-#define TODIGIT( nDigit ) \
- (CHAR)((nDigit) > 9 ? \
- (nDigit) - 10 + 'A' \
- : (nDigit) + '0')
-
-
-inline int
-SAFEIsSpace(UCHAR c)
-{
- return isspace( c );
-}
-
-inline int
-SAFEIsAlNum(UCHAR c)
-{
- return isalnum( c );
-}
-
-inline int
-SAFEIsAlpha(UCHAR c)
-{
- return isalpha( c );
-}
-
-inline int
-SAFEIsXDigit(UCHAR c)
-{
- return isxdigit( c );
-}
-
-inline int
-SAFEIsDigit(UCHAR c)
-{
- return isdigit( c );
-}
-
-#endif // _MACROS_H
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx
deleted file mode 100644
index dd891b3252..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisz.hxx
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _MULTISZ_HXX_
-#define _MULTISZ_HXX_
-
-# include <stringu.h>
-
-
-/*++
- class MULTISZ:
-
- Intention:
- A light-weight multi-string class supporting encapsulated string class.
-
- This object is derived from BUFFER class.
- It maintains following state:
-
- m_fValid - whether this object is valid -
- used only by MULTISZ() init functions
- * NYI: I need to kill this someday *
- m_cchLen - string length cached when we update the string.
- m_cStrings - number of strings.
-
- Member Functions:
- There are two categories of functions:
- 1) Safe Functions - which do integrity checking of state
- 2) UnSafe Functions - which do not do integrity checking, but
- enable writing to the data stream freely.
- (someday this will be enabled as Safe versions without
- problem for users)
-
---*/
-class MULTISZ : public BUFFER
-{
-public:
-
- MULTISZ()
- : BUFFER (),
- m_cchLen ( 0),
- m_cStrings(0)
- { Reset(); }
-
- // creates a stack version of the MULTISZ object - uses passed in stack buffer
- // MULTISZ does not free this pbInit on its own.
- MULTISZ( __in_bcount(cbInit) WCHAR * pbInit, DWORD cbInit)
- : BUFFER( (BYTE *) pbInit, cbInit),
- m_cchLen (0),
- m_cStrings(0)
- {}
-
- MULTISZ( const WCHAR * pchInit )
- : BUFFER (),
- m_cchLen ( 0),
- m_cStrings(0)
- { AuxInit(pchInit); }
-
- MULTISZ( const MULTISZ & str )
- : BUFFER (),
- m_cchLen ( 0),
- m_cStrings(0)
- { AuxInit( str.QueryStr()); }
-
-// BOOL IsValid(VOID) const { return ( BUFFER::IsValid()) ; }
- //
- // Checks and returns TRUE if this string has no valid data else FALSE
- //
- BOOL IsEmpty( VOID) const { return ( *QueryStr() == L'\0'); }
-
- BOOL Append( const WCHAR * pchInit ) {
- return ((pchInit != NULL) ? (AuxAppend( pchInit,
- (DWORD) (::wcslen(pchInit)) * sizeof(WCHAR)
- )) :
- TRUE);
- }
-
-
- BOOL Append( const WCHAR * pchInit, DWORD cchLen ) {
- return ((pchInit != NULL) ? (AuxAppend( pchInit,
- cchLen * sizeof(WCHAR))) :
- TRUE);
- }
-
- BOOL Append( STRU & str )
- { return AuxAppend( str.QueryStr(),
- (str.QueryCCH()) * sizeof(WCHAR)); }
-
- // Resets the internal string to be NULL string. Buffer remains cached.
- VOID Reset( VOID)
- { DBG_ASSERT( QueryPtr() != NULL);
- QueryStr()[0] = L'\0';
- QueryStr()[1] = L'\0';
- m_cchLen = 2;
- m_cStrings = 0;
- }
-
- BOOL Copy( const WCHAR * pchInit, IN DWORD cbLen ) {
- if ( QueryPtr() ) { Reset(); }
- return ( (pchInit != NULL) ?
- AuxAppend( pchInit, cbLen, FALSE ):
- TRUE);
- }
-
- BOOL Copy( const MULTISZ & str )
- { return ( Copy(str.QueryStr(), str.QueryCB())); }
-
- //
- // Returns the number of bytes in the string including the terminating
- // NULLs
- //
- UINT QueryCB( VOID ) const
- { return ( m_cchLen * sizeof(WCHAR)); }
-
- //
- // Returns # of characters in the string including the terminating NULLs
- //
- UINT QueryCCH( VOID ) const { return (m_cchLen); }
-
- //
- // Returns # of strings in the multisz.
- //
-
- DWORD QueryStringCount( VOID ) const { return m_cStrings; }
-
- //
- // Makes a copy of the stored string in given buffer
- //
- BOOL CopyToBuffer( __out_ecount_opt(*lpcch) WCHAR * lpszBuffer, LPDWORD lpcch) const;
-
- //
- // Return the string buffer
- //
- WCHAR * QueryStrA( VOID ) const { return ( QueryStr()); }
- WCHAR * QueryStr( VOID ) const { return ((WCHAR *) QueryPtr()); }
-
- //
- // Makes a clone of the current string in the string pointer passed in.
- //
- BOOL
- Clone( OUT MULTISZ * pstrClone) const
- {
- return ((pstrClone == NULL) ?
- (SetLastError(ERROR_INVALID_PARAMETER), FALSE) :
- (pstrClone->Copy( *this))
- );
- } // MULTISZ::Clone()
-
- //
- // Recalculates the length of *this because we've modified the buffers
- // directly
- //
-
- VOID RecalcLen( VOID )
- { m_cchLen = MULTISZ::CalcLength( QueryStr(), &m_cStrings ); }
-
- //
- // Calculate total character length of a MULTI_SZ, including the
- // terminating NULLs.
- //
-
- static DWORD CalcLength( const WCHAR * str,
- LPDWORD pcStrings = NULL );
-
- //
- // Determine if the MULTISZ contains a specific string.
- //
-
- BOOL FindString( const WCHAR * str );
-
- BOOL FindString( STRU & str )
- { return FindString( str.QueryStr() ); }
-
- //
- // Determine if the MULTISZ contains a specific string - case-insensitive
- //
-
- BOOL FindStringNoCase( const WCHAR * str );
-
- BOOL FindStringNoCase( STRU & str )
- { return FindStringNoCase( str.QueryStr() ); }
-
- //
- // Used for scanning a multisz.
- //
-
- const WCHAR * First( VOID ) const
- { return *QueryStr() == L'\0' ? NULL : QueryStr(); }
-
- const WCHAR * Next( const WCHAR * Current ) const
- { Current += ::wcslen( Current ) + 1;
- return *Current == L'\0' ? NULL : Current; }
-
- BOOL
- Equals(
- MULTISZ* pmszRhs
- );
-
-private:
-
- DWORD m_cchLen;
- DWORD m_cStrings;
- VOID AuxInit( const WCHAR * pInit );
- BOOL AuxAppend( const WCHAR * pInit,
- UINT cbStr, BOOL fAddSlop = TRUE );
-
-};
-
-//
-// Quick macro for declaring a MULTISZ that will use stack memory of <size>
-// bytes. If the buffer overflows then a heap buffer will be allocated
-//
-
-#define STACK_MULTISZ( name, size ) WCHAR __ach##name[size]; \
- MULTISZ name( __ach##name, sizeof( __ach##name ))
-
-HRESULT
-SplitCommaDelimitedString(
- PCWSTR pszList,
- BOOL fTrimEntries,
- BOOL fRemoveEmptyEntries,
- MULTISZ * pmszList
-);
-
-#endif // !_MULTISZ_HXX_
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx
deleted file mode 100644
index 44aa802563..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/multisza.hxx
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _MULTISZA_HXX_
-#define _MULTISZA_HXX_
-
-# include <stringa.h>
-
-
-/*++
- class MULTISZ:
-
- Intention:
- A light-weight multi-string class supporting encapsulated string class.
-
- This object is derived from BUFFER class.
- It maintains following state:
-
- m_fValid - whether this object is valid -
- used only by MULTISZ() init functions
- * NYI: I need to kill this someday *
- m_cchLen - string length cached when we update the string.
- m_cStrings - number of strings.
-
- Member Functions:
- There are two categories of functions:
- 1) Safe Functions - which do integrity checking of state
- 2) UnSafe Functions - which do not do integrity checking, but
- enable writing to the data stream freely.
- (someday this will be enabled as Safe versions without
- problem for users)
-
---*/
-class MULTISZA : public BUFFER
-{
-public:
-
- MULTISZA()
- : BUFFER (),
- m_cchLen ( 0),
- m_cStrings(0)
- { Reset(); }
-
- // creates a stack version of the MULTISZA object - uses passed in stack buffer
- // MULTISZA does not free this pbInit on its own.
- MULTISZA( __in_bcount(cbInit) CHAR * pbInit, DWORD cbInit)
- : BUFFER( (BYTE *) pbInit, cbInit),
- m_cchLen (0),
- m_cStrings(0)
- {}
-
- MULTISZA( const CHAR * pchInit )
- : BUFFER (),
- m_cchLen ( 0),
- m_cStrings(0)
- { AuxInit(pchInit); }
-
- MULTISZA( const MULTISZA & str )
- : BUFFER (),
- m_cchLen ( 0),
- m_cStrings(0)
- { AuxInit( str.QueryStr()); }
-
-// BOOL IsValid(VOID) const { return ( BUFFER::IsValid()) ; }
- //
- // Checks and returns TRUE if this string has no valid data else FALSE
- //
- BOOL IsEmpty( VOID) const { return ( *QueryStr() == L'\0'); }
-
- BOOL Append( const CHAR * pchInit ) {
- return ((pchInit != NULL) ? (AuxAppend( pchInit,
- (DWORD) (::strlen(pchInit)) * sizeof(CHAR)
- )) :
- TRUE);
- }
-
-
- BOOL Append( const CHAR * pchInit, DWORD cchLen ) {
- return ((pchInit != NULL) ? (AuxAppend( pchInit,
- cchLen * sizeof(CHAR))) :
- TRUE);
- }
-
- BOOL Append( STRA & str )
- { return AuxAppend( str.QueryStr(),
- (str.QueryCCH()) * sizeof(CHAR)); }
-
- // Resets the internal string to be NULL string. Buffer remains cached.
- VOID Reset( VOID)
- { DBG_ASSERT( QueryPtr() != NULL);
- QueryStr()[0] = L'\0';
- QueryStr()[1] = L'\0';
- m_cchLen = 2;
- m_cStrings = 0;
- }
-
- BOOL Copy( const CHAR * pchInit, IN DWORD cbLen ) {
- if ( QueryPtr() ) { Reset(); }
- return ( (pchInit != NULL) ?
- AuxAppend( pchInit, cbLen, FALSE ):
- TRUE);
- }
-
- BOOL Copy( const MULTISZA & str )
- { return ( Copy(str.QueryStr(), str.QueryCB())); }
-
- //
- // Returns the number of bytes in the string including the terminating
- // NULLs
- //
- UINT QueryCB( VOID ) const
- { return ( m_cchLen * sizeof(CHAR)); }
-
- //
- // Returns # of characters in the string including the terminating NULLs
- //
- UINT QueryCCH( VOID ) const { return (m_cchLen); }
-
- //
- // Returns # of strings in the MULTISZA.
- //
-
- DWORD QueryStringCount( VOID ) const { return m_cStrings; }
-
- //
- // Makes a copy of the stored string in given buffer
- //
- BOOL CopyToBuffer( __out_ecount_opt(*lpcch) CHAR * lpszBuffer, LPDWORD lpcch) const;
-
- //
- // Return the string buffer
- //
- CHAR * QueryStrA( VOID ) const { return ( QueryStr()); }
- CHAR * QueryStr( VOID ) const { return ((CHAR *) QueryPtr()); }
-
- //
- // Makes a clone of the current string in the string pointer passed in.
- //
- BOOL
- Clone( OUT MULTISZA * pstrClone) const
- {
- return ((pstrClone == NULL) ?
- (SetLastError(ERROR_INVALID_PARAMETER), FALSE) :
- (pstrClone->Copy( *this))
- );
- } // MULTISZA::Clone()
-
- //
- // Recalculates the length of *this because we've modified the buffers
- // directly
- //
-
- VOID RecalcLen( VOID )
- { m_cchLen = MULTISZA::CalcLength( QueryStr(), &m_cStrings ); }
-
- //
- // Calculate total character length of a MULTI_SZ, including the
- // terminating NULLs.
- //
-
- static DWORD CalcLength( const CHAR * str,
- LPDWORD pcStrings = NULL );
-
- //
- // Determine if the MULTISZA contains a specific string.
- //
-
- BOOL FindString( const CHAR * str );
-
- BOOL FindString( STRA & str )
- { return FindString( str.QueryStr() ); }
-
- //
- // Determine if the MULTISZA contains a specific string - case-insensitive
- //
-
- BOOL FindStringNoCase( const CHAR * str );
-
- BOOL FindStringNoCase( STRA & str )
- { return FindStringNoCase( str.QueryStr() ); }
-
- //
- // Used for scanning a MULTISZA.
- //
-
- const CHAR * First( VOID ) const
- { return *QueryStr() == L'\0' ? NULL : QueryStr(); }
-
- const CHAR * Next( const CHAR * Current ) const
- { Current += ::strlen( Current ) + 1;
- return *Current == L'\0' ? NULL : Current; }
-
- BOOL
- Equals(
- MULTISZA* pmszRhs
- );
-
-private:
-
- DWORD m_cchLen;
- DWORD m_cStrings;
- VOID AuxInit( const CHAR * pInit );
- BOOL AuxAppend( const CHAR * pInit,
- UINT cbStr, BOOL fAddSlop = TRUE );
-
-};
-
-//
-// Quick macro for declaring a MULTISZA that will use stack memory of <size>
-// bytes. If the buffer overflows then a heap buffer will be allocated
-//
-
-#define STACK_MULTISZA( name, size ) CHAR __ach##name[size]; \
- MULTISZA name( __ach##name, sizeof( __ach##name ))
-
-HRESULT
-SplitCommaDelimitedString(
- PCSTR pszList,
- BOOL fTrimEntries,
- BOOL fRemoveEmptyEntries,
- MULTISZA * pmszList
-);
-
-#endif // !_MULTISZA_HXX_
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h
deleted file mode 100644
index 411c3660a4..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/normalize.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef __NORMALIZE_URL__H__
-#define __NORMALIZE_URL__H__
-
-HRESULT
-NormalizeUrl(
- __inout LPSTR pszUrl
-);
-
-
-HRESULT
-NormalizeUrlW(
- __inout LPWSTR pszUrl
-);
-
-
-
-HRESULT
-UlCleanAndCopyUrl(
- __in LPSTR pSource,
- IN ULONG SourceLength,
- OUT PULONG pBytesCopied,
- __inout PWSTR pDestination,
- __deref_opt_out_opt PWSTR * ppQueryString OPTIONAL
-);
-
-HRESULT
-UlInitializeParsing(
- VOID
-);
-
-HRESULT
-InitializeNormalizeUrl(
- VOID
-);
-
-
-#endif \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h
deleted file mode 100644
index a971a8a715..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/percpu.h
+++ /dev/null
@@ -1,305 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-template<typename T>
-class PER_CPU
-{
-public:
-
- template<typename FunctionInitializer>
- inline
- static
- HRESULT
- Create(
- FunctionInitializer Initializer,
- __deref_out PER_CPU<T> ** ppInstance
- );
-
- inline
- T *
- GetLocal(
- VOID
- );
-
- template<typename FunctionForEach>
- inline
- VOID
- ForEach(
- FunctionForEach Function
- );
-
- inline
- VOID
- Dispose(
- VOID
- );
-
-private:
-
- PER_CPU(
- VOID
- )
- {
- //
- // Don't perform any operation during constructor.
- // Constructor will never be called.
- //
- }
-
- ~PER_CPU(
- VOID
- )
- {
- //
- // Don't perform any operation during destructor.
- // Constructor will never be called.
- //
- }
-
- template<typename FunctionInitializer>
- HRESULT
- Initialize(
- FunctionInitializer Initializer,
- DWORD NumberOfVariables,
- DWORD Alignment
- );
-
- T *
- GetObject(
- DWORD Index
- );
-
- static
- HRESULT
- GetProcessorInformation(
- __out DWORD * pCacheLineSize,
- __out DWORD * pNumberOfProcessors
- );
-
- //
- // Pointer to the beginning of the inlined array.
- //
- PVOID m_pVariables;
- SIZE_T m_Alignment;
- SIZE_T m_VariablesCount;
-};
-
-template<typename T>
-template<typename FunctionInitializer>
-inline
-// static
-HRESULT
-PER_CPU<T>::Create(
- FunctionInitializer Initializer,
- __deref_out PER_CPU<T> ** ppInstance
-)
-{
- HRESULT hr = S_OK;
- DWORD CacheLineSize = 0;
- DWORD ObjectCacheLineSize = 0;
- DWORD NumberOfProcessors = 0;
- PER_CPU<T> * pInstance = NULL;
-
- hr = GetProcessorInformation(&CacheLineSize,
- &NumberOfProcessors);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- if (sizeof(T) > CacheLineSize)
- {
- //
- // Round to the next multiple of the cache line size.
- //
- ObjectCacheLineSize = (sizeof(T) + CacheLineSize-1) & (CacheLineSize-1);
- }
- else
- {
- ObjectCacheLineSize = CacheLineSize;
- }
-
- //
- // Calculate the size of the PER_CPU<T> object, including the array.
- // The first cache line is for the member variables and the array
- // starts in the next cache line.
- //
- SIZE_T Size = CacheLineSize + NumberOfProcessors * ObjectCacheLineSize;
-
- pInstance = (PER_CPU<T>*) _aligned_malloc(Size, CacheLineSize);
- if (pInstance == NULL)
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
- ZeroMemory(pInstance, Size);
-
- //
- // The array start in the 2nd cache line.
- //
- pInstance->m_pVariables = reinterpret_cast<PBYTE>(pInstance) + CacheLineSize;
-
- //
- // Pass a disposer for disposing initialized items in case of failure.
- //
- hr = pInstance->Initialize(Initializer,
- NumberOfProcessors,
- ObjectCacheLineSize);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- *ppInstance = pInstance;
- pInstance = NULL;
-
-Finished:
-
- if (pInstance != NULL)
- {
- //
- // Free the instance without disposing it.
- //
- pInstance->Dispose();
- pInstance = NULL;
- }
-
- return hr;
-}
-
-template<typename T>
-inline
-T *
-PER_CPU<T>::GetLocal(
- VOID
-)
-{
- // Use GetCurrentProcessorNumber (up to 64 logical processors) instead of
- // GetCurrentProcessorNumberEx (more than 64 logical processors) because
- // the number of processors are not densely packed per group.
- // The idea of distributing variables per CPU is to have
- // a scalability multiplier (could be NUMA node instead).
- //
- // Make sure the index don't go beyond the array size, if that happens,
- // there won't be even distribution, but still better
- // than one single variable.
- //
- return GetObject(GetCurrentProcessorNumber());
-}
-
-template<typename T>
-inline
-T *
-PER_CPU<T>::GetObject(
- DWORD Index
-)
-{
- return reinterpret_cast<T*>(static_cast<PBYTE>(m_pVariables) + Index * m_Alignment);
-}
-
-template<typename T>
-template<typename FunctionForEach>
-inline
-VOID
-PER_CPU<T>::ForEach(
- FunctionForEach Function
-)
-{
- for(DWORD Index = 0; Index < m_VariablesCount; ++Index)
- {
- T * pObject = GetObject(Index);
- Function(pObject);
- }
-}
-
-template<typename T>
-VOID
-PER_CPU<T>::Dispose(
- VOID
-)
-{
- _aligned_free(this);
-}
-
-template<typename T>
-template<typename FunctionInitializer>
-inline
-HRESULT
-PER_CPU<T>::Initialize(
- FunctionInitializer Initializer,
- DWORD NumberOfVariables,
- DWORD Alignment
-)
-/*++
-
-Routine Description:
-
- Initialize each object using the initializer function.
- If initialization for any object fails, it dispose the
- objects that were successfully initialized.
-
-Arguments:
-
- Initializer - Function for initialize one object.
- Signature: HRESULT Func(T*)
- Dispose - Function for disposing initialized objects in case of failure.
- Signature: void Func(T*)
- NumberOfVariables - The length of the array of variables.
- Alignment - Alignment to use for avoiding false sharing.
-
-Return:
-
- HRESULT - E_OUTOFMEMORY
-
---*/
-{
- HRESULT hr = S_OK;
- DWORD Index = 0;
-
- m_VariablesCount = NumberOfVariables;
- m_Alignment = Alignment;
-
- for (; Index < m_VariablesCount; ++Index)
- {
- T * pObject = GetObject(Index);
- Initializer(pObject);
- }
-
- return hr;
-}
-
-template<typename T>
-// static
-HRESULT
-PER_CPU<T>::GetProcessorInformation(
- __out DWORD * pCacheLineSize,
- __out DWORD * pNumberOfProcessors
-)
-/*++
-
-Routine Description:
-
- Gets the CPU cache-line size for the current system.
- This information is used for avoiding CPU false sharing.
-
-Arguments:
-
- pCacheLineSize - The processor cache-line size.
- pNumberOfProcessors - Maximum number of processors per group.
-
-Return:
-
- HRESULT - E_OUTOFMEMORY
-
---*/
-{
- SYSTEM_INFO SystemInfo = { };
-
- GetSystemInfo(&SystemInfo);
- *pNumberOfProcessors = SystemInfo.dwNumberOfProcessors;
- *pCacheLineSize = SYSTEM_CACHE_ALIGNMENT_SIZE;
-
- return S_OK;
-} \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h
deleted file mode 100644
index 77fcb75b8a..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/prime.h
+++ /dev/null
@@ -1,85 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#include <math.h>
-#include <stdlib.h>
-
-//
-// Pre-calculated prime numbers (up to 10,049,369).
-//
-extern __declspec(selectany) const DWORD g_Primes [] = {
- 3, 7, 11, 17, 23, 29, 37, 47, 59, 71, 89, 107, 131, 163, 197, 239, 293, 353, 431, 521, 631,
- 761, 919, 1103, 1327, 1597, 1931, 2333, 2801, 3371, 4049, 4861, 5839, 7013, 8419, 10103,
- 12143, 14591, 17519, 21023, 25229, 30293, 36353, 43627, 52361, 62851, 75431, 90523, 108631,
- 130363, 156437, 187751, 225307, 270371, 324449, 389357, 467237, 560689, 672827, 807403,
- 968897, 1162687, 1395263, 1674319, 2009191, 2411033, 2893249, 3471899, 4166287, 4999559,
- 5999471, 7199369, 7849369, 8649369, 9249369, 10049369
-};
-
-class PRIME
-{
-public:
-
- static
- DWORD
- GetPrime(
- DWORD dwMinimum
- )
- {
- //
- // Try to use the precalculated numbers.
- //
- for ( DWORD Index = 0; Index < _countof( g_Primes ); Index++ )
- {
- DWORD dwCandidate = g_Primes[Index];
- if ( dwCandidate >= dwMinimum )
- {
- return dwCandidate;
- }
- }
-
- //
- // Do calculation.
- //
- for ( DWORD dwCandidate = dwMinimum | 1;
- dwCandidate < MAXDWORD;
- dwCandidate += 2 )
- {
- if ( IsPrime( dwCandidate ) )
- {
- return dwCandidate;
- }
- }
- return dwMinimum;
- }
-
-private:
-
- static
- BOOL
- IsPrime(
- DWORD dwCandidate
- )
- {
- if ((dwCandidate & 1) == 0)
- {
- return ( dwCandidate == 2 );
- }
-
- DWORD dwMax = static_cast<DWORD>(sqrt(static_cast<double>(dwCandidate)));
-
- for ( DWORD Index = 3; Index <= dwMax; Index += 2 )
- {
- if ( (dwCandidate % Index) == 0 )
- {
- return FALSE;
- }
- }
- return TRUE;
- }
-
- PRIME() {}
- ~PRIME() {}
-}; \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h
deleted file mode 100644
index ace85dcde2..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/reftrace.h
+++ /dev/null
@@ -1,88 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _REFTRACE_H_
-#define _REFTRACE_H_
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif // __cplusplus
-
-
-#include <tracelog.h>
-
-
-//
-// This is the number of stack backtrace values captured in each
-// trace log entry. This value is chosen to make the log entry
-// exactly twelve dwords long, making it a bit easier to interpret
-// from within the debugger without the debugger extension.
-//
-
-#define REF_TRACE_LOG_STACK_DEPTH 9
-
-// No-op value for the Context1,2,3 parameters of WriteRefTraceLogEx
-//#define REF_TRACE_EMPTY_CONTEXT ((PVOID) -1)
-#define REF_TRACE_EMPTY_CONTEXT NULL
-
-
-//
-// This defines the entry written to the trace log.
-//
-
-typedef struct _REF_TRACE_LOG_ENTRY {
-
- LONG NewRefCount;
- CONST VOID * Context;
- CONST VOID * Context1;
- CONST VOID * Context2;
- CONST VOID * Context3;
- DWORD Thread;
- PVOID Stack[REF_TRACE_LOG_STACK_DEPTH];
-
-} REF_TRACE_LOG_ENTRY, *PREF_TRACE_LOG_ENTRY;
-
-
-//
-// Manipulators.
-//
-
-PTRACE_LOG
-CreateRefTraceLog(
- IN LONG LogSize,
- IN LONG ExtraBytesInHeader
- );
-
-VOID
-DestroyRefTraceLog(
- IN PTRACE_LOG Log
- );
-
-LONG
-__cdecl
-WriteRefTraceLog(
- IN PTRACE_LOG Log,
- IN LONG NewRefCount,
- IN CONST VOID * Context
- );
-
-LONG
-__cdecl
-WriteRefTraceLogEx(
- IN PTRACE_LOG Log,
- IN LONG NewRefCount,
- IN CONST VOID * Context,
- IN CONST VOID * Context1,
- IN CONST VOID * Context2,
- IN CONST VOID * Context3
- );
-
-
-#if defined(__cplusplus)
-} // extern "C"
-#endif // __cplusplus
-
-
-#endif // _REFTRACE_H_
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h
deleted file mode 100644
index 50b9b1ca11..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/rwlock.h
+++ /dev/null
@@ -1,193 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#if (_WIN32_WINNT < 0x600)
-
-//
-// XP implementation.
-//
-class CWSDRWLock
-{
-public:
-
- CWSDRWLock()
- : m_bInited(FALSE)
- {
- }
-
- ~CWSDRWLock()
- {
- if (m_bInited)
- {
- DeleteCriticalSection(&m_rwLock.critsec);
- CloseHandle(m_rwLock.ReadersDoneEvent);
- }
- }
-
- BOOL QueryInited() const
- {
- return m_bInited;
- }
-
- HRESULT Init()
- {
- HRESULT hr = S_OK;
-
- if (FALSE == m_bInited)
- {
- m_rwLock.fWriterWaiting = FALSE;
- m_rwLock.LockCount = 0;
- if ( !InitializeCriticalSectionAndSpinCount( &m_rwLock.critsec, 0 ))
- {
- DWORD dwError = GetLastError();
- hr = HRESULT_FROM_WIN32(dwError);
- return hr;
- }
-
- m_rwLock.ReadersDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
- if( NULL == m_rwLock.ReadersDoneEvent )
- {
- DWORD dwError = GetLastError();
- hr = HRESULT_FROM_WIN32(dwError);
- DeleteCriticalSection(&m_rwLock.critsec);
- return hr;
- }
- m_bInited = TRUE;
- }
-
- return hr;
- }
-
- void SharedAcquire()
- {
- EnterCriticalSection(&m_rwLock.critsec);
- InterlockedIncrement(&m_rwLock.LockCount);
- LeaveCriticalSection(&m_rwLock.critsec);
- }
-
- void SharedRelease()
- {
- ReleaseRWLock();
- }
-
- void ExclusiveAcquire()
- {
- EnterCriticalSection( &m_rwLock.critsec );
-
- m_rwLock.fWriterWaiting = TRUE;
-
- // check if there are any readers active
- if ( InterlockedExchangeAdd( &m_rwLock.LockCount, 0 ) > 0 )
- {
- //
- // Wait for all the readers to get done..
- //
- WaitForSingleObject( m_rwLock.ReadersDoneEvent, INFINITE );
- }
- m_rwLock.LockCount = -1;
- }
-
- void ExclusiveRelease()
- {
- ReleaseRWLock();
- }
-
-private:
-
- BOOL m_bInited;
-
- typedef struct _RW_LOCK
- {
- BOOL fWriterWaiting; // Is a writer waiting on the lock?
- LONG LockCount;
- CRITICAL_SECTION critsec;
- HANDLE ReadersDoneEvent;
- } RW_LOCK, *PRW_LOCK;
-
- RW_LOCK m_rwLock;
-
-private:
-
- void ReleaseRWLock()
- {
- LONG Count = InterlockedDecrement( &m_rwLock.LockCount );
-
- if ( 0 <= Count )
- {
- // releasing a read lock
- if (( m_rwLock.fWriterWaiting ) && ( 0 == Count ))
- {
- SetEvent( m_rwLock.ReadersDoneEvent );
- }
- }
- else
- {
- // Releasing a write lock
- m_rwLock.LockCount = 0;
- m_rwLock.fWriterWaiting = FALSE;
- LeaveCriticalSection(&m_rwLock.critsec);
- }
- }
-};
-
-#else
-
-//
-// Implementation for Windows Vista or greater.
-//
-class CWSDRWLock
-{
-public:
-
- CWSDRWLock()
- {
- InitializeSRWLock(&m_rwLock);
- }
-
- BOOL QueryInited()
- {
- return TRUE;
- }
-
-
- HRESULT Init()
- {
- //
- // Method defined to keep compatibility with CWSDRWLock class for XP.
- //
- return S_OK;
- }
-
- void SharedAcquire()
- {
- AcquireSRWLockShared(&m_rwLock);
- }
-
- void SharedRelease()
- {
- ReleaseSRWLockShared(&m_rwLock);
- }
-
- void ExclusiveAcquire()
- {
- AcquireSRWLockExclusive(&m_rwLock);
- }
-
- void ExclusiveRelease()
- {
- ReleaseSRWLockExclusive(&m_rwLock);
- }
-
-private:
-
- SRWLOCK m_rwLock;
-};
-
-#endif
-
-//
-// Rename the lock class to a more clear name.
-//
-typedef CWSDRWLock READ_WRITE_LOCK; \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h
deleted file mode 100644
index f2c7980405..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/statichash.h
+++ /dev/null
@@ -1,730 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef __STATIC_HASH__H_
-#define __STATIC_HASH__H_
-
-#define STATIC_STRING_HASH_BUCKETS 131
-
-//
-// SERVER_VARIABLE_HASH maps server variable string to routines to eval them
-//
-
-struct STATIC_STRING_HASH_RECORD
-{
- CHAR * _pszName;
- STATIC_STRING_HASH_RECORD * _pNext;
- USHORT _cchName;
-};
-
-struct STATIC_STRING_HASH_ITER
-{
- STATIC_STRING_HASH_RECORD *_pCursor;
- DWORD _dwBucket;
- BOOL _fRemove;
-};
-
-class STATIC_STRING_HASH
-{
- public:
-
- STATIC_STRING_HASH(
- BOOL fCaseSensitive = FALSE
- ) : _fCaseSensitive( fCaseSensitive )
- {
- Reset();
- }
-
- VOID
- Reset()
- {
- ZeroMemory( &_rgBuckets, sizeof( _rgBuckets ) );
- }
-
- static
- PCSTR
- ExtractKey(
- __in const STATIC_STRING_HASH_RECORD * pRecord
- )
- /*++
-
- Routine Description:
-
- Get the key out of the record
-
- Arguments:
-
- record to fetch the key from
-
- Return Value:
-
- key
-
- --*/
- {
- DBG_ASSERT( pRecord != NULL );
- return pRecord->_pszName;
- }
-
- VOID
- InsertRecord(
- __in STATIC_STRING_HASH_RECORD * pRecord
- )
- /*++
-
- Routine Description:
-
- Insert record to hash table
-
- Note: remember this is static hash table
- There is no synchronization on the table
- Exclusive acess must be assured by caller
-
- Arguments:
-
- record to fetch the key from
-
- Return Value:
-
- VOID
-
- --*/
- {
- DWORD dwIndex;
- STATIC_STRING_HASH_RECORD* pCursor;
-
- DBG_ASSERT( pRecord != NULL );
- DBG_ASSERT( pRecord->_pszName != NULL );
-
- if(NULL == pRecord->_pszName)
- {
- return;
- }
-
- if (_fCaseSensitive)
- {
- dwIndex = HashString( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
- else
- {
- dwIndex = HashStringNoCase( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
-
- pCursor = _rgBuckets[ dwIndex ];
-
- pRecord->_pNext = pCursor;
- _rgBuckets[ dwIndex ] = pRecord;
- }
-
- STATIC_STRING_HASH_RECORD *
- FindKey(
- __in PCSTR pszName,
- BOOL fRemove = FALSE
- )
- /*++
-
- Routine Description:
-
- Find key in the table (and remove it optionally)
-
- Arguments:
-
- key
-
- Return Value:
-
- record containing the key
-
- --*/
- {
- DWORD dwIndex;
- STATIC_STRING_HASH_RECORD* pRecord;
- STATIC_STRING_HASH_RECORD* pLastRecord = NULL;
-
- DBG_ASSERT( pszName != NULL );
-
- if (_fCaseSensitive)
- {
- dwIndex = HashString( pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
- else
- {
- dwIndex = HashStringNoCase( pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
-
- pRecord = _rgBuckets[ dwIndex ];
- while ( pRecord != NULL )
- {
- if (_fCaseSensitive)
- {
- if ( strcmp( pszName, pRecord->_pszName ) == 0 )
- {
- break;
- }
- }
- else if ( _stricmp( pszName, pRecord->_pszName ) == 0 )
- {
- break;
- }
-
- pLastRecord = pRecord;
- pRecord = pRecord->_pNext;
- }
-
- if (fRemove &&
- pRecord != NULL)
- {
- if (pLastRecord != NULL)
- {
- pLastRecord->_pNext = pRecord->_pNext;
- }
- else
- {
- _rgBuckets[dwIndex] = pRecord->_pNext;
- }
- }
-
- return pRecord;
- }
-
- BOOL
- CheckDistribution(
- IN DWORD dwConflictThreshold,
- IN BOOL fToDebugger
- )
- /*++
-
- Routine Description:
-
- Simple verification on conflicts within the table
-
- Arguments:
-
- dwConflictThreshold - max number of entries tolerated per bucket
- fToDebbuger - spew the entries exceeding threshold into debugger
-
- Return Value:
-
- FALSE it threshold was reached (means hash funcion may not be optimal)
-
- --*/
- {
- BOOL fThresholdReached = FALSE;
- STATIC_STRING_HASH_RECORD* pRecord;
- for ( DWORD dwIndex = 0; dwIndex < STATIC_STRING_HASH_BUCKETS; dwIndex++)
- {
- pRecord = _rgBuckets[ dwIndex ];
- DWORD countInBucket = 0;
- while ( pRecord != NULL )
- {
- countInBucket++;
- pRecord = pRecord->_pNext;
- }
- //
- // print out the list of multiple entries in bucket
- //
- if ( countInBucket > dwConflictThreshold && fToDebugger )
- {
- fThresholdReached = TRUE;
-
- pRecord = _rgBuckets[ dwIndex ];
- while ( pRecord != NULL )
- {
- pRecord = pRecord->_pNext;
- }
- }
- }
- return fThresholdReached;
- }
-
- STATIC_STRING_HASH_RECORD *
- FindFirst(
- STATIC_STRING_HASH_ITER *pIterator,
- BOOL fRemove = FALSE
- )
- /*++
-
- Routine Description:
-
- Begins a new hash item enumeration.
-
- Arguments:
-
- pIterator - Supplies the context for the enumeration.
-
- fRemove - Supplies TRUE if the items should be removed
- from the hash as they are enumerated.
-
- Return Value:
-
- The first entry in the hash if successful, NULL otherwise.
-
- --*/
- {
- pIterator->_dwBucket = 0;
- pIterator->_fRemove = fRemove;
- pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket);
-
- if (pIterator->_fRemove && pIterator->_pCursor != NULL)
- {
- _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext;
- }
-
- return pIterator->_pCursor;
- }
-
- STATIC_STRING_HASH_RECORD *
- FindNext(
- STATIC_STRING_HASH_ITER *pIterator
- )
- /*++
-
- Routine Description:
-
- Continues a hash item enumeration.
-
- Arguments:
-
- pIterator - Supplies the context for the enumeration.
-
- Return Value:
-
- The next entry in the hash if successful, NULL otherwise.
-
- --*/
- {
- if (pIterator->_pCursor != NULL)
- {
- if (pIterator->_fRemove)
- {
- pIterator->_pCursor = _rgBuckets[pIterator->_dwBucket];
- }
- else
- {
- pIterator->_pCursor = pIterator->_pCursor->_pNext;
- }
-
- if (pIterator->_pCursor == NULL)
- {
- pIterator->_dwBucket++;
- pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket);
- }
- }
-
- if (pIterator->_fRemove && pIterator->_pCursor != NULL)
- {
- _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext;
- }
-
- return pIterator->_pCursor;
- }
-
- protected:
-
- STATIC_STRING_HASH_RECORD * _rgBuckets[ STATIC_STRING_HASH_BUCKETS ];
-
- private:
-
- BOOL _fCaseSensitive;
-
- STATIC_STRING_HASH_RECORD *
- FindNextBucket(
- DWORD *pdwStartingBucket
- )
- /*++
-
- Routine Description:
-
- Scan for the next non-empty bucket.
-
- Arguments:
-
- pdwStartingBucket - Supplies a pointer to the starting
- bucket index. This value is updated with the index
- of the next non-empty bucket if successful.
-
- Return Value:
-
- The first entry in the next non-empty bucket if successful,
- NULL otherwise.
-
- --*/
- {
- DWORD i;
- STATIC_STRING_HASH_RECORD *pScan = NULL;
-
- for (i = *pdwStartingBucket ; i < STATIC_STRING_HASH_BUCKETS ; i++)
- {
- pScan = _rgBuckets[i];
-
- if (pScan != NULL)
- {
- break;
- }
- }
-
- *pdwStartingBucket = i;
- return pScan;
- }
-};
-
-
-
-
-struct STATIC_WSTRING_HASH_RECORD
-{
- WCHAR * _pszName;
- STATIC_WSTRING_HASH_RECORD * _pNext;
- USHORT _cchName;
-};
-
-
-struct STATIC_WSTRING_HASH_ITER
-{
- STATIC_WSTRING_HASH_RECORD *_pCursor;
- DWORD _dwBucket;
- BOOL _fRemove;
-};
-
-
-class STATIC_WSTRING_HASH
-{
- public:
- STATIC_WSTRING_HASH(
- BOOL fCaseSensitive = FALSE
- ) : _fCaseSensitive( fCaseSensitive )
- {
- Reset();
- }
-
- VOID
- Reset()
- {
- ZeroMemory( &_rgBuckets, sizeof( _rgBuckets ) );
- }
-
- static
- PCWSTR
- ExtractKey(
- __in const STATIC_WSTRING_HASH_RECORD * pRecord
- )
- /*++
-
- Routine Description:
-
- Get the key out of the record
-
- Arguments:
-
- record to fetch the key from
-
- Return Value:
-
- key
-
- --*/
- {
- DBG_ASSERT( pRecord != NULL );
- return pRecord->_pszName;
- }
-
- VOID
- InsertRecord(
- __in STATIC_WSTRING_HASH_RECORD * pRecord
- )
- /*++
-
- Routine Description:
-
- Insert record to hash table
-
- Note: remember this is static hash table
- There is no synchronization on the table
- Exclusive acess must be assured by caller
-
- Arguments:
-
- record to fetch the key from
-
- Return Value:
-
- VOID
-
- --*/
- {
- DWORD dwIndex;
- STATIC_WSTRING_HASH_RECORD* pCursor;
-
- DBG_ASSERT( pRecord != NULL );
- DBG_ASSERT( pRecord->_pszName != NULL );
-
- if (_fCaseSensitive)
- {
- dwIndex = HashString( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
- else
- {
- dwIndex = HashStringNoCase( pRecord->_pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
-
- pCursor = _rgBuckets[ dwIndex ];
-
- pRecord->_pNext = pCursor;
- _rgBuckets[ dwIndex ] = pRecord;
- }
-
- STATIC_WSTRING_HASH_RECORD *
- FindKey(
- __in PCWSTR pszName,
- BOOL fRemove = FALSE
- )
- /*++
-
- Routine Description:
-
- Find key in the table (and remove it optionally)
-
- Arguments:
-
- key
-
- Return Value:
-
- record containing the key
-
- --*/
- {
- DWORD dwIndex;
- STATIC_WSTRING_HASH_RECORD* pRecord;
- STATIC_WSTRING_HASH_RECORD* pLastRecord = NULL;
-
- DBG_ASSERT( pszName != NULL );
-
- if (_fCaseSensitive)
- {
- dwIndex = HashString( pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
- else
- {
- dwIndex = HashStringNoCase( pszName ) % STATIC_STRING_HASH_BUCKETS;
- }
-
- pRecord = _rgBuckets[ dwIndex ];
- while ( pRecord != NULL )
- {
- if ( _fCaseSensitive )
- {
- if ( wcscmp( pszName, pRecord->_pszName ) == 0 )
- {
- break;
- }
- }
- else if ( _wcsicmp( pszName, pRecord->_pszName ) == 0 )
- {
- break;
- }
-
- pLastRecord = pRecord;
- pRecord = pRecord->_pNext;
- }
-
- if (fRemove &&
- pRecord != NULL)
- {
- if (pLastRecord != NULL)
- {
- pLastRecord->_pNext = pRecord->_pNext;
- }
- else
- {
- _rgBuckets[dwIndex] = pRecord->_pNext;
- }
- }
-
- return pRecord;
- }
-
- BOOL
- CheckDistribution(
- IN DWORD dwConflictThreshold,
- IN BOOL fToDebugger
- )
- /*++
-
- Routine Description:
-
- Simple verification on conflicts within the table
-
- Arguments:
-
- dwConflictThreshold - max number of entries tolerated per bucket
- fToDebbuger - spew the entries exceeding threshold into debugger
-
- Return Value:
-
- FALSE it threshold was reached (means hash funcion may not be optimal)
-
- --*/
- {
- BOOL fThresholdReached = FALSE;
- STATIC_WSTRING_HASH_RECORD* pRecord;
- for ( DWORD dwIndex = 0; dwIndex < STATIC_STRING_HASH_BUCKETS; dwIndex++)
- {
- pRecord = _rgBuckets[ dwIndex ];
- DWORD countInBucket = 0;
- while ( pRecord != NULL )
- {
- countInBucket++;
- pRecord = pRecord->_pNext;
- }
- //
- // print out the list of multiple entries in bucket
- //
- if ( countInBucket > dwConflictThreshold && fToDebugger )
- {
- fThresholdReached = TRUE;
-
- pRecord = _rgBuckets[ dwIndex ];
- while ( pRecord != NULL )
- {
- pRecord = pRecord->_pNext;
- }
- }
- }
- return fThresholdReached;
- }
-
- STATIC_WSTRING_HASH_RECORD *
- FindFirst(
- STATIC_WSTRING_HASH_ITER *pIterator,
- BOOL fRemove = FALSE
- )
- /*++
-
- Routine Description:
-
- Begins a new hash item enumeration.
-
- Arguments:
-
- pIterator - Supplies the context for the enumeration.
-
- fRemove - Supplies TRUE if the items should be removed
- from the hash as they are enumerated.
-
- Return Value:
-
- The first entry in the hash if successful, NULL otherwise.
-
- --*/
- {
- pIterator->_dwBucket = 0;
- pIterator->_fRemove = fRemove;
- pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket);
-
- if (pIterator->_fRemove && pIterator->_pCursor != NULL)
- {
- _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext;
- }
-
- return pIterator->_pCursor;
- }
-
- STATIC_WSTRING_HASH_RECORD *
- FindNext(
- STATIC_WSTRING_HASH_ITER *pIterator
- )
- /*++
-
- Routine Description:
-
- Continues a hash item enumeration.
-
- Arguments:
-
- pIterator - Supplies the context for the enumeration.
-
- Return Value:
-
- The next entry in the hash if successful, NULL otherwise.
-
- --*/
- {
- if (pIterator->_pCursor != NULL)
- {
- if (pIterator->_fRemove)
- {
- pIterator->_pCursor = _rgBuckets[pIterator->_dwBucket];
- }
- else
- {
- pIterator->_pCursor = pIterator->_pCursor->_pNext;
- }
-
- if (pIterator->_pCursor == NULL)
- {
- pIterator->_dwBucket++;
- pIterator->_pCursor = FindNextBucket(&pIterator->_dwBucket);
- }
- }
-
- if (pIterator->_fRemove && pIterator->_pCursor != NULL)
- {
- _rgBuckets[pIterator->_dwBucket] = pIterator->_pCursor->_pNext;
- }
-
- return pIterator->_pCursor;
- }
-
- protected:
-
- STATIC_WSTRING_HASH_RECORD * _rgBuckets[ STATIC_STRING_HASH_BUCKETS ];
-
- private:
-
- BOOL _fCaseSensitive;
-
- STATIC_WSTRING_HASH_RECORD *
- FindNextBucket(
- DWORD *pdwStartingBucket
- )
- /*++
-
- Routine Description:
-
- Scan for the next non-empty bucket.
-
- Arguments:
-
- pdwStartingBucket - Supplies a pointer to the starting
- bucket index. This value is updated with the index
- of the next non-empty bucket if successful.
-
- Return Value:
-
- The first entry in the next non-empty bucket if successful,
- NULL otherwise.
-
- --*/
- {
- DWORD i;
- STATIC_WSTRING_HASH_RECORD *pScan = NULL;
-
- for (i = *pdwStartingBucket ; i < STATIC_STRING_HASH_BUCKETS ; i++)
- {
- pScan = _rgBuckets[i];
-
- if (pScan != NULL)
- {
- break;
- }
- }
-
- *pdwStartingBucket = i;
- return pScan;
- }
-};
-
-
-#endif //__STATIC_HASH__H_
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h
deleted file mode 100644
index 53a631b036..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stdtypes.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-//
-// Use C++ standard 'nullptr'
-//
-
-#ifdef NULL
-#undef NULL
-#endif
-
-#ifdef __cplusplus
-#ifdef _NATIVE_NULLPTR_SUPPORTED
-#define NULL nullptr
-#else
-#define NULL 0
-#define nullptr 0
-#endif
-#else
-#define NULL ((void *)0)
-//#define nullptr ((void *)0)
-#endif
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h
deleted file mode 100644
index d38604014e..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/stringa.h
+++ /dev/null
@@ -1,515 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#include "buffer.h"
-#include "macros.h"
-#include <strsafe.h>
-
-class STRA
-{
-
-public:
-
- STRA(
- VOID
- );
-
- STRA(
- __inout_ecount(cchInit) CHAR* pbInit,
- __in DWORD cchInit
- );
-
- BOOL
- IsEmpty(
- VOID
- ) const;
-
- BOOL
- Equals(
- __in PCSTR pszRhs,
- __in BOOL fIgnoreCase = FALSE
- ) const;
-
- BOOL
- Equals(
- __in const STRA * pstrRhs,
- __in BOOL fIgnoreCase = FALSE
- ) const;
-
- BOOL
- Equals(
- __in const STRA & strRhs,
- __in BOOL fIgnoreCase = FALSE
- ) const;
-
- static
- BOOL
- Equals(
- __in PCSTR pszLhs,
- __in PCSTR pszRhs,
- __in bool fIgnoreCase = false
- )
- {
- // Return FALSE if either or both strings are NULL.
- if (!pszLhs || !pszRhs) return FALSE;
-
- if( fIgnoreCase )
- {
- return ( 0 == _stricmp( pszLhs, pszRhs ) );
- }
-
- return ( 0 == strcmp( pszLhs, pszRhs ) );
- }
-
- VOID
- Trim();
-
- BOOL
- StartsWith(
- __in const STRA * pStraPrefix,
- __in bool fIgnoreCase = FALSE
- ) const;
-
- BOOL
- StartsWith(
- __in const STRA & straPrefix,
- __in bool fIgnoreCase = FALSE
- ) const;
-
- BOOL
- StartsWith(
- __in PCSTR pszPrefix,
- __in bool fIgnoreCase = FALSE
- ) const;
-
- BOOL
- EndsWith(
- __in const STRA * pStraSuffix,
- __in bool fIgnoreCase = FALSE
- ) const;
-
- BOOL
- EndsWith(
- __in const STRA & straSuffix,
- __in bool fIgnoreCase = FALSE
- ) const;
-
- BOOL
- EndsWith(
- __in PCSTR pszSuffix,
- __in bool fIgnoreCase = FALSE
- ) const;
-
- INT
- IndexOf(
- __in CHAR charValue,
- __in DWORD dwStartIndex = 0
- ) const;
-
- INT
- IndexOf(
- __in PCSTR pszValue,
- __in DWORD dwStartIndex = 0
- ) const;
-
- INT
- LastIndexOf(
- __in CHAR charValue,
- __in DWORD dwStartIndex = 0
- ) const;
-
- DWORD
- QueryCB(
- VOID
- ) const;
-
- DWORD
- QueryCCH(
- VOID
- ) const;
-
- DWORD
- QuerySizeCCH(
- VOID
- ) const;
-
- DWORD
- QuerySize(
- VOID
- ) const;
-
- __nullterminated
- __bcount(this->m_cchLen)
- CHAR *
- QueryStr(
- VOID
- ) const;
-
- VOID
- Reset(
- VOID
- );
-
- HRESULT
- Resize(
- __in DWORD cchSize
- );
-
- HRESULT
- SyncWithBuffer(
- VOID
- );
-
- HRESULT
- Copy(
- __in PCSTR pszCopy
- );
-
- HRESULT
- Copy(
- __in_ecount(cbLen)
- PCSTR pszCopy,
- __in SIZE_T cbLen
- );
-
- HRESULT
- Copy(
- __in const STRA * pstrRhs
- );
-
- HRESULT
- Copy(
- __in const STRA & strRhs
- );
-
- HRESULT
- CopyW(
- __in PCWSTR pszCopyW
- );
-
- HRESULT
- CopyW(
- __in_ecount(cchLen)
- PCWSTR pszCopyW,
- __in SIZE_T cchLen,
- __in UINT CodePage = CP_UTF8,
- __in BOOL fFailIfNoTranslation = FALSE
- )
- {
- _ASSERTE( cchLen <= MAXDWORD );
-
- return AuxAppendW(
- pszCopyW,
- static_cast<DWORD>(cchLen),
- 0,
- CodePage,
- fFailIfNoTranslation
- );
- }
-
- HRESULT
- CopyWTruncate(
- __in PCWSTR pszCopyWTruncate
- );
-
- HRESULT
- CopyWTruncate(
- __in_ecount(cchLen)
- PCWSTR pszCopyWTruncate,
- __in SIZE_T cchLen
- );
-
- HRESULT
- Append(
- __in PCSTR pszAppend
- );
-
- HRESULT
- Append(
- __in_ecount(cbLen)
- PCSTR pszAppend,
- __in SIZE_T cbLen
- );
-
- HRESULT
- Append(
- __in const STRA * pstrRhs
- );
-
- HRESULT
- Append(
- __in const STRA & strRhs
- );
-
- HRESULT
- AppendW(
- __in PCWSTR pszAppendW
- )
- {
- HRESULT hr;
- size_t cchLen;
- hr = StringCchLengthW( pszAppendW,
- STRSAFE_MAX_CCH,
- &cchLen );
- if ( FAILED( hr ) )
- {
- return hr;
- }
- return AppendW( pszAppendW, cchLen );
- }
-
- HRESULT
- AppendW(
- __in_ecount(cchLen)
- PCWSTR pszAppendW,
- __in SIZE_T cchLen,
- __in UINT CodePage = CP_UTF8,
- __in BOOL fFailIfNoTranslation = FALSE
- )
- {
- _ASSERTE( cchLen <= MAXDWORD );
- if ( cchLen == 0 )
- {
- return S_OK;
- }
- return AuxAppendW(
- pszAppendW,
- static_cast<DWORD>(cchLen),
- QueryCB(),
- CodePage,
- fFailIfNoTranslation
- );
- }
-
- HRESULT
- AppendWTruncate(
- __in PCWSTR pszAppendWTruncate
- );
-
- HRESULT
- AppendWTruncate(
- __in_ecount(cchLen)
- PCWSTR pszAppendWTruncate,
- __in SIZE_T cchLen
- );
-
- HRESULT
- CopyToBuffer(
- __out_bcount(*pcb) CHAR* pszBuffer,
- __inout DWORD * pcb
- ) const;
-
- HRESULT
- SetLen(
- __in DWORD cchLen
- );
-
- HRESULT
- SafeSnprintf(
- __in __format_string
- PCSTR pszFormatString,
- ...
- );
-
- HRESULT
- SafeVsnprintf(
- __in __format_string
- PCSTR pszFormatString,
- va_list argsList
- );
-
- HRESULT
- Escape(
- VOID
- );
-
- HRESULT
- EscapeUtf8(
- VOID
- );
-
- VOID
- Unescape(
- VOID
- );
-
- HRESULT
- CopyWToUTF8Unescaped(
- __in LPCWSTR cpchStr
- );
-
- HRESULT
- CopyWToUTF8Unescaped(
- __in_ecount(cch)
- LPCWSTR cpchStr,
- __in DWORD cch
- );
-
- HRESULT
- CopyWToUTF8Escaped(
- __in LPCWSTR cpchStr
- );
-
- HRESULT
- CopyWToUTF8Escaped(
- __in_ecount(cch)
- LPCWSTR cpchStr,
- __in DWORD cch
- );
-
-private:
-
- //
- // Avoid C++ errors. This object should never go through a copy
- // constructor, unintended cast or assignment.
- //
- STRA( const STRA &);
- STRA & operator = (const STRA &);
-
- HRESULT
- AuxAppend(
- __in_ecount(cbLen)
- LPCSTR pStr,
- __in DWORD cbLen,
- __in DWORD cbOffset
- );
-
- HRESULT
- AuxAppendW(
- __in_ecount(cchAppendW)
- PCWSTR pszAppendW,
- __in DWORD cchAppendW,
- __in DWORD cbOffset,
- __in UINT CodePage,
- __in BOOL fFailIfNoTranslation
- )
- {
- DWORD dwFlags = 0;
-
- if( CP_ACP == CodePage )
- {
- dwFlags = WC_NO_BEST_FIT_CHARS;
- }
- else if( fFailIfNoTranslation && CodePage == CP_UTF8 )
- {
- //
- // WC_ERR_INVALID_CHARS is only supported in Longhorn or greater.
- //
-#if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN
- dwFlags |= WC_ERR_INVALID_CHARS;
-#else
- UNREFERENCED_PARAMETER(fFailIfNoTranslation);
-#endif
- }
-
- return AuxAppendW( pszAppendW,
- cchAppendW,
- cbOffset,
- CodePage,
- fFailIfNoTranslation,
- dwFlags );
- }
-
- HRESULT
- AuxAppendW(
- __in_ecount(cchAppendW)
- PCWSTR pszAppendW,
- __in DWORD cchAppendW,
- __in DWORD cbOffset,
- __in UINT CodePage,
- __in BOOL fFailIfNoTranslation,
- __in DWORD dwFlags
- );
-
- HRESULT
- AuxAppendWTruncate(
- __in_ecount(cchAppendW)
- __in PCWSTR pszAppendW,
- __in DWORD cchAppendW,
- __in DWORD cbOffset
- );
-
- static
- int
- ConvertUnicodeToCodePage(
- __in_ecount(dwStringLen)
- LPCWSTR pszSrcUnicodeString,
- __inout BUFFER_T<CHAR,1> * pbufDstAnsiString,
- __in DWORD dwStringLen,
- __in UINT uCodePage
- );
-
- static
- HRESULT
- ConvertUnicodeToMultiByte(
- __in_ecount(dwStringLen)
- LPCWSTR pszSrcUnicodeString,
- __in BUFFER_T<CHAR,1> * pbufDstAnsiString,
- __in DWORD dwStringLen
- );
-
- static
- HRESULT
- ConvertUnicodeToUTF8(
- __in_ecount(dwStringLen)
- LPCWSTR pszSrcUnicodeString,
- __in BUFFER_T<CHAR,1> * pbufDstAnsiString,
- __in DWORD dwStringLen
- );
-
- typedef bool (* PFN_F_SHOULD_ESCAPE)(BYTE ch);
-
- HRESULT
- EscapeInternal(
- PFN_F_SHOULD_ESCAPE pfnFShouldEscape
- );
-
- //
- // Buffer with an inline buffer of 1,
- // enough to hold null-terminating character.
- //
- BUFFER_T<CHAR,1> m_Buff;
- DWORD m_cchLen;
-};
-
-inline
-HRESULT
-AppendToString(
- ULONGLONG Number,
- STRA & String
-)
-{
- // prefast complains Append requires input
- // to be null terminated, so zero initialize
- // and pass the size of the buffer minus one
- // to _ui64toa_s
- CHAR chNumber[32] = {0};
- if (_ui64toa_s(Number,
- chNumber,
- sizeof(chNumber) - sizeof(CHAR),
- 10) != 0)
- {
- return E_INVALIDARG;
- }
- return String.Append(chNumber);
-}
-
-template<DWORD size>
-CHAR* InitHelper(__out CHAR (&psz)[size])
-{
- psz[0] = '\0';
- return psz;
-}
-
-//
-// Heap operation reduction macros
-//
-#define STACK_STRA(name, size) CHAR __ach##name[size];\
- STRA name(InitHelper(__ach##name), sizeof(__ach##name))
-
-#define INLINE_STRA(name, size) CHAR __ach##name[size];\
- STRA name;
-
-#define INLINE_STRA_INIT(name) name(InitHelper(__ach##name), sizeof(__ach##name))
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h
deleted file mode 100644
index b0fba23559..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/sttimer.h
+++ /dev/null
@@ -1,243 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _STTIMER_H
-#define _STTIMER_H
-
-class STTIMER
-{
-public:
-
- STTIMER()
- : _pTimer( NULL )
- {
- fInCanel = FALSE;
- }
-
- virtual
- ~STTIMER()
- {
- if ( _pTimer )
- {
- CancelTimer();
-
- CloseThreadpoolTimer( _pTimer );
-
- _pTimer = NULL;
- }
- }
-
- HRESULT
- InitializeTimer(
- PTP_TIMER_CALLBACK pfnCallback,
- VOID * pContext,
- DWORD dwInitialWait = 0,
- DWORD dwPeriod = 0
- )
- {
- _pTimer = CreateThreadpoolTimer( pfnCallback,
- pContext,
- NULL );
-
- if ( !_pTimer )
- {
- return HRESULT_FROM_WIN32( GetLastError() );
- }
-
- if ( dwInitialWait )
- {
- SetTimer( dwInitialWait,
- dwPeriod );
- }
-
- return S_OK;
- }
-
- VOID
- SetTimer(
- DWORD dwInitialWait,
- DWORD dwPeriod = 0
- )
- {
- FILETIME ftInitialWait;
-
- if ( dwInitialWait == 0 && dwPeriod == 0 )
- {
- //
- // Special case. We are preventing new callbacks
- // from being queued. Any existing callbacks in the
- // queue will still run.
- //
- // This effectively disables the timer. It can be
- // re-enabled by setting non-zero initial wait or
- // period values.
- //
- if (_pTimer != NULL)
- {
- SetThreadpoolTimer(_pTimer, NULL, 0, 0);
- }
-
- return;
- }
-
- InitializeRelativeFileTime( &ftInitialWait, dwInitialWait );
-
- SetThreadpoolTimer( _pTimer,
- &ftInitialWait,
- dwPeriod,
- 0 );
- }
-
- VOID
- CancelTimer()
- {
- //
- // Disable the timer
- //
- if (fInCanel)
- return;
-
- fInCanel = TRUE;
- SetTimer( 0 );
-
- //
- // Wait until any callbacks queued prior to disabling
- // have completed.
- //
- if (_pTimer != NULL)
- WaitForThreadpoolTimerCallbacks( _pTimer, TRUE );
-
- _pTimer = NULL;
- fInCanel = FALSE;
- }
-
-private:
-
- VOID
- InitializeRelativeFileTime(
- FILETIME * pft,
- DWORD dwMilliseconds
- )
- {
- LARGE_INTEGER li;
-
- //
- // The pftDueTime parameter expects the time to be
- // expressed as the number of 100 nanosecond intervals
- // times -1.
- //
- // To convert from milliseconds, we'll multiply by
- // -10000
- //
-
- li.QuadPart = (LONGLONG)dwMilliseconds * -10000;
-
- pft->dwHighDateTime = li.HighPart;
- pft->dwLowDateTime = li.LowPart;
- };
-
- TP_TIMER * _pTimer;
- BOOL fInCanel;
-};
-
-class STELAPSED
-{
-public:
-
- STELAPSED()
- : _dwInitTime( 0 ),
- _dwInitTickCount( 0 ),
- _dwPerfCountsPerMillisecond( 0 ),
- _fUsingHighResolution( FALSE )
- {
- LARGE_INTEGER li;
- BOOL fResult;
-
- _dwInitTickCount = GetTickCount64();
-
- fResult = QueryPerformanceFrequency( &li );
-
- if ( !fResult )
- {
- goto Finished;
- }
-
- _dwPerfCountsPerMillisecond = li.QuadPart / 1000;
-
- fResult = QueryPerformanceCounter( &li );
-
- if ( !fResult )
- {
- goto Finished;
- }
-
- _dwInitTime = li.QuadPart / _dwPerfCountsPerMillisecond;
-
- _fUsingHighResolution = TRUE;
-
-Finished:
-
- return;
- }
-
- virtual
- ~STELAPSED()
- {
- }
-
- LONGLONG
- QueryElapsedTime()
- {
- LARGE_INTEGER li;
-
- if ( _fUsingHighResolution && QueryPerformanceCounter( &li ) )
- {
- DWORD64 dwCurrentTime = li.QuadPart / _dwPerfCountsPerMillisecond;
-
- if ( dwCurrentTime < _dwInitTime )
- {
- //
- // It's theoretically possible that QueryPerformanceCounter
- // may return slightly different values on different CPUs.
- // In this case, we don't want to return an unexpected value
- // so we'll return zero. This is acceptable because
- // presumably such a case would only happen for a very short
- // time window.
- //
- // It would be possible to prevent this by ensuring processor
- // affinity for all calls to QueryPerformanceCounter, but that
- // would be undesirable in the general case because it could
- // introduce unnecessary context switches and potentially a
- // CPU bottleneck.
- //
- // Note that this issue also applies to callers doing rapid
- // calls to this function. If a caller wants to mitigate
- // that, they could enforce the affinitization, or they
- // could implement a similar sanity check when comparing
- // returned values from this function.
- //
-
- return 0;
- }
-
- return dwCurrentTime - _dwInitTime;
- }
-
- return GetTickCount64() - _dwInitTickCount;
- }
-
- BOOL
- QueryUsingHighResolution()
- {
- return _fUsingHighResolution;
- }
-
-private:
-
- DWORD64 _dwInitTime;
- DWORD64 _dwInitTickCount;
- DWORD64 _dwPerfCountsPerMillisecond;
- BOOL _fUsingHighResolution;
-};
-
-#endif // _STTIMER_H \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h
deleted file mode 100644
index 1caff82ce3..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/tracelog.h
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#ifndef _TRACELOG_H_
-#define _TRACELOG_H_
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif // __cplusplus
-
-
-typedef struct _TRACE_LOG {
-
- //
- // Signature.
- //
-
- LONG Signature;
-
- //
- // The total number of entries available in the log.
- //
-
- LONG LogSize;
-
- //
- // The index of the next entry to use.
- //
-
- LONG NextEntry;
-
- //
- // The byte size of each entry.
- //
-
- LONG EntrySize;
-
- //
- // Pointer to the start of the circular buffer.
- //
-
- PUCHAR LogBuffer;
-
- //
- // The extra header bytes and actual log entries go here.
- //
- // BYTE ExtraHeaderBytes[ExtraBytesInHeader];
- // BYTE Entries[LogSize][EntrySize];
- //
-
-} TRACE_LOG, *PTRACE_LOG;
-
-
-//
-// Log header signature.
-//
-
-#define TRACE_LOG_SIGNATURE ((DWORD)'gOlT')
-#define TRACE_LOG_SIGNATURE_X ((DWORD)'golX')
-
-
-//
-// This macro maps a TRACE_LOG pointer to a pointer to the 'extra'
-// data associated with the log.
-//
-
-#define TRACE_LOG_TO_EXTRA_DATA(log) (PVOID)( (log) + 1 )
-
-
-//
-// Manipulators.
-//
-
-PTRACE_LOG
-CreateTraceLog(
- IN LONG LogSize,
- IN LONG ExtraBytesInHeader,
- IN LONG EntrySize
- );
-
-VOID
-DestroyTraceLog(
- IN PTRACE_LOG Log
- );
-
-LONG
-WriteTraceLog(
- IN PTRACE_LOG Log,
- IN PVOID Entry
- );
-
-VOID
-ResetTraceLog(
- IN PTRACE_LOG Log
- );
-
-
-#if defined(__cplusplus)
-} // extern "C"
-#endif // __cplusplus
-
-
-#endif // _TRACELOG_H_
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h
deleted file mode 100644
index 0e825e4e20..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/Include/treehash.h
+++ /dev/null
@@ -1,850 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#pragma once
-
-#include <crtdbg.h>
-#include "rwlock.h"
-#include "prime.h"
-
-template <class _Record>
-class TREE_HASH_NODE
-{
- template <class _Record>
- friend class TREE_HASH_TABLE;
-
- private:
- // Next node in the hash table look-aside
- TREE_HASH_NODE<_Record> *_pNext;
-
- // links in the tree structure
- TREE_HASH_NODE * _pParentNode;
- TREE_HASH_NODE * _pFirstChild;
- TREE_HASH_NODE * _pNextSibling;
-
- // actual record
- _Record * _pRecord;
-
- // hash value
- PCWSTR _pszPath;
- DWORD _dwHash;
-};
-
-template <class _Record>
-class TREE_HASH_TABLE
-{
-protected:
- typedef BOOL
- (PFN_DELETE_IF)(
- _Record * pRecord,
- PVOID pvContext
- );
-
- typedef VOID
- (PFN_APPLY)(
- _Record * pRecord,
- PVOID pvContext
- );
-
-public:
- TREE_HASH_TABLE(
- BOOL fCaseSensitive
- ) : _ppBuckets( NULL ),
- _nBuckets( 0 ),
- _nItems( 0 ),
- _fCaseSensitive( fCaseSensitive )
- {
- }
-
- virtual
- ~TREE_HASH_TABLE();
-
- virtual
- VOID
- ReferenceRecord(
- _Record * pRecord
- ) = 0;
-
- virtual
- VOID
- DereferenceRecord(
- _Record * pRecord
- ) = 0;
-
- virtual
- PCWSTR
- GetKey(
- _Record * pRecord
- ) = 0;
-
- DWORD
- Count()
- {
- return _nItems;
- }
-
- virtual
- VOID
- Clear();
-
- HRESULT
- Initialize(
- DWORD nBucketSize
- );
-
- DWORD
- CalcHash(
- PCWSTR pszKey
- )
- {
- return _fCaseSensitive ? HashString(pszKey) : HashStringNoCase(pszKey);
- }
-
- virtual
- VOID
- FindKey(
- PCWSTR pszKey,
- _Record ** ppRecord
- );
-
- virtual
- HRESULT
- InsertRecord(
- _Record * pRecord
- );
-
- virtual
- VOID
- DeleteKey(
- PCWSTR pszKey
- );
-
- virtual
- VOID
- DeleteIf(
- PFN_DELETE_IF pfnDeleteIf,
- PVOID pvContext
- );
-
- VOID
- Apply(
- PFN_APPLY pfnApply,
- PVOID pvContext
- );
-
-private:
-
- BOOL
- FindNodeInternal(
- PCWSTR pszKey,
- DWORD dwHash,
- TREE_HASH_NODE<_Record> ** ppNode,
- TREE_HASH_NODE<_Record> *** pppPreviousNodeNextPointer = NULL
- );
-
- HRESULT
- AddNodeInternal(
- PCWSTR pszPath,
- DWORD dwHash,
- _Record * pRecord,
- TREE_HASH_NODE<_Record> * pParentNode,
- TREE_HASH_NODE<_Record> ** ppNewNode
- );
-
- HRESULT
- AllocateNode(
- PCWSTR pszPath,
- DWORD dwHash,
- _Record * pRecord,
- TREE_HASH_NODE<_Record> * pParentNode,
- TREE_HASH_NODE<_Record> ** ppNewNode
- );
-
- VOID
- DeleteNode(
- TREE_HASH_NODE<_Record> * pNode
- )
- {
- if (pNode->_pRecord != NULL)
- {
- DereferenceRecord(pNode->_pRecord);
- pNode->_pRecord = NULL;
- }
-
- HeapFree(GetProcessHeap(),
- 0,
- pNode);
- }
-
- VOID
- DeleteNodeInternal(
- TREE_HASH_NODE<_Record> ** ppPreviousNodeNextPointer,
- TREE_HASH_NODE<_Record> * pNode
- );
-
- VOID
- RehashTableIfNeeded(
- VOID
- );
-
- TREE_HASH_NODE<_Record> ** _ppBuckets;
- DWORD _nBuckets;
- DWORD _nItems;
- BOOL _fCaseSensitive;
- CWSDRWLock _tableLock;
-};
-
-template <class _Record>
-HRESULT
-TREE_HASH_TABLE<_Record>::AllocateNode(
- PCWSTR pszPath,
- DWORD dwHash,
- _Record * pRecord,
- TREE_HASH_NODE<_Record> * pParentNode,
- TREE_HASH_NODE<_Record> ** ppNewNode
-)
-{
- //
- // Allocate enough extra space for pszPath
- //
- DWORD cchPath = (DWORD) wcslen(pszPath);
- if (cchPath >= ((0xffffffff - sizeof(TREE_HASH_NODE<_Record>))/sizeof(WCHAR) - 1))
- {
- return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- }
- TREE_HASH_NODE<_Record> *pNode = (TREE_HASH_NODE<_Record> *)HeapAlloc(
- GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- sizeof(TREE_HASH_NODE<_Record>) + (cchPath+1)*sizeof(WCHAR));
- if (pNode == NULL)
- {
- return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- }
-
- memcpy(pNode+1, pszPath, (cchPath+1)*sizeof(WCHAR));
- pNode->_pszPath = (PCWSTR)(pNode+1);
- pNode->_dwHash = dwHash;
- pNode->_pNext = pNode->_pNextSibling = pNode->_pFirstChild = NULL;
- pNode->_pParentNode = pParentNode;
- pNode->_pRecord = pRecord;
-
- *ppNewNode = pNode;
- return S_OK;
-}
-
-template <class _Record>
-HRESULT
-TREE_HASH_TABLE<_Record>::Initialize(
- DWORD nBuckets
-)
-{
- HRESULT hr = S_OK;
-
- if ( nBuckets == 0 )
- {
- hr = E_INVALIDARG;
- goto Failed;
- }
-
- hr = _tableLock.Init();
- if ( FAILED( hr ) )
- {
- goto Failed;
- }
-
- if (nBuckets >= 0xffffffff/sizeof(TREE_HASH_NODE<_Record> *))
- {
- hr = E_INVALIDARG;
- goto Failed;
- }
-
- _ppBuckets = (TREE_HASH_NODE<_Record> **)HeapAlloc(
- GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- nBuckets*sizeof(TREE_HASH_NODE<_Record> *));
- if (_ppBuckets == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY);
- goto Failed;
- }
- _nBuckets = nBuckets;
-
- return S_OK;
-
-Failed:
-
- if (_ppBuckets)
- {
- HeapFree(GetProcessHeap(),
- 0,
- _ppBuckets);
- _ppBuckets = NULL;
- }
-
- return hr;
-}
-
-
-template <class _Record>
-TREE_HASH_TABLE<_Record>::~TREE_HASH_TABLE()
-{
- if (_ppBuckets == NULL)
- {
- return;
- }
-
- _ASSERTE(_nItems == 0);
-
- HeapFree(GetProcessHeap(),
- 0,
- _ppBuckets);
- _ppBuckets = NULL;
- _nBuckets = 0;
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::Clear()
-{
- TREE_HASH_NODE<_Record> *pCurrent;
- TREE_HASH_NODE<_Record> *pNext;
-
- _tableLock.ExclusiveAcquire();
-
- for (DWORD i=0; i<_nBuckets; i++)
- {
- pCurrent = _ppBuckets[i];
- _ppBuckets[i] = NULL;
- while (pCurrent != NULL)
- {
- pNext = pCurrent->_pNext;
- DeleteNode(pCurrent);
- pCurrent = pNext;
- }
- }
-
- _nItems = 0;
- _tableLock.ExclusiveRelease();
-}
-
-template <class _Record>
-BOOL
-TREE_HASH_TABLE<_Record>::FindNodeInternal(
- PCWSTR pszKey,
- DWORD dwHash,
- TREE_HASH_NODE<_Record> ** ppNode,
- TREE_HASH_NODE<_Record> *** pppPreviousNodeNextPointer
-)
-/*++
- Return value indicates whether the item is found
- key, dwHash - key and hash for the node to find
- ppNode - on successful return, the node found, on failed return, the first
- node with hash value greater than the node to be found
- pppPreviousNodeNextPointer - the pointer to previous node's _pNext
-
- This routine may be called under either read or write lock
---*/
-{
- TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer;
- TREE_HASH_NODE<_Record> *pNode;
- BOOL fFound = FALSE;
-
- ppPreviousNodeNextPointer = _ppBuckets + (dwHash % _nBuckets);
- pNode = *ppPreviousNodeNextPointer;
- while (pNode != NULL)
- {
- if (pNode->_dwHash == dwHash)
- {
- if (CompareStringOrdinal(pszKey,
- -1,
- pNode->_pszPath,
- -1,
- !_fCaseSensitive) == CSTR_EQUAL)
- {
- fFound = TRUE;
- break;
- }
- }
- else if (pNode->_dwHash > dwHash)
- {
- break;
- }
-
- ppPreviousNodeNextPointer = &(pNode->_pNext);
- pNode = *ppPreviousNodeNextPointer;
- }
-
- *ppNode = pNode;
- if (pppPreviousNodeNextPointer != NULL)
- {
- *pppPreviousNodeNextPointer = ppPreviousNodeNextPointer;
- }
- return fFound;
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::FindKey(
- PCWSTR pszKey,
- _Record ** ppRecord
-)
-{
- TREE_HASH_NODE<_Record> *pNode;
-
- *ppRecord = NULL;
-
- DWORD dwHash = CalcHash(pszKey);
-
- _tableLock.SharedAcquire();
-
- if (FindNodeInternal(pszKey, dwHash, &pNode) &&
- pNode->_pRecord != NULL)
- {
- ReferenceRecord(pNode->_pRecord);
- *ppRecord = pNode->_pRecord;
- }
-
- _tableLock.SharedRelease();
-}
-
-template <class _Record>
-HRESULT
-TREE_HASH_TABLE<_Record>::AddNodeInternal(
- PCWSTR pszPath,
- DWORD dwHash,
- _Record * pRecord,
- TREE_HASH_NODE<_Record> * pParentNode,
- TREE_HASH_NODE<_Record> ** ppNewNode
-)
-/*++
- Return value is HRESULT indicating sucess or failure
- pszPath, dwHash, pRecord - path, hash value and record to be inserted
- pParentNode - this will be the parent of the node being inserted
- ppNewNode - on successful return, the new node created and inserted
-
- This function may be called under a read or write lock
---*/
-{
- TREE_HASH_NODE<_Record> *pNewNode;
- TREE_HASH_NODE<_Record> *pNextNode;
- TREE_HASH_NODE<_Record> **ppNextPointer;
- HRESULT hr;
-
- //
- // Ownership of pRecord is not transferred to pNewNode yet, so remember
- // to either set it to null before deleting pNewNode or add an extra
- // reference later - this is to make sure we do not do an extra ref/deref
- // which users may view as getting flushed out of the hash-table
- //
- hr = AllocateNode(pszPath,
- dwHash,
- pRecord,
- pParentNode,
- &pNewNode);
- if (FAILED(hr))
- {
- return hr;
- }
-
- do
- {
- //
- // Find the right place to add this node
- //
-
- if (FindNodeInternal(pszPath, dwHash, &pNextNode, &ppNextPointer))
- {
- //
- // If node already there, record may still need updating
- //
- if (pRecord != NULL &&
- InterlockedCompareExchangePointer((PVOID *)&pNextNode->_pRecord,
- pRecord,
- NULL) == NULL)
- {
- ReferenceRecord(pRecord);
- hr = S_OK;
- }
- else
- {
- hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS);
- }
-
- // ownership of pRecord has either passed to existing record or
- // not to anyone at all
- pNewNode->_pRecord = NULL;
- DeleteNode(pNewNode);
- *ppNewNode = pNextNode;
- return hr;
- }
-
- //
- // If another node got inserted in betwen, we will have to retry
- //
- pNewNode->_pNext = pNextNode;
- } while (InterlockedCompareExchangePointer((PVOID *)ppNextPointer,
- pNewNode,
- pNextNode) != pNextNode);
- // pass ownership of pRecord now
- if (pRecord != NULL)
- {
- ReferenceRecord(pRecord);
- pRecord = NULL;
- }
- InterlockedIncrement((LONG *)&_nItems);
-
- //
- // update the parent
- //
- if (pParentNode != NULL)
- {
- ppNextPointer = &pParentNode->_pFirstChild;
- do
- {
- pNextNode = *ppNextPointer;
- pNewNode->_pNextSibling = pNextNode;
- } while (InterlockedCompareExchangePointer((PVOID *)ppNextPointer,
- pNewNode,
- pNextNode) != pNextNode);
- }
-
- *ppNewNode = pNewNode;
- return S_OK;
-}
-
-template <class _Record>
-HRESULT
-TREE_HASH_TABLE<_Record>::InsertRecord(
- _Record * pRecord
-)
-/*++
- This method inserts a node for this record and also empty nodes for paths
- in the hierarchy leading upto this path
-
- The insert is done under only a read-lock - this is possible by keeping
- the hashes in a bucket in increasing order and using interlocked operations
- to actually insert the item in the hash-bucket lookaside list and the parent
- children list
-
- Returns HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) if the record already exists.
- Never leak this error to the end user because "*file* already exists" may be confusing.
---*/
-{
- PCWSTR pszKey = GetKey(pRecord);
- STACK_STRU( strPartialPath, 256);
- PWSTR pszPartialPath;
- DWORD dwHash;
- DWORD cchEnd;
- HRESULT hr;
- TREE_HASH_NODE<_Record> *pParentNode = NULL;
-
- hr = strPartialPath.Copy(pszKey);
- if (FAILED(hr))
- {
- goto Finished;
- }
- pszPartialPath = strPartialPath.QueryStr();
-
- _tableLock.SharedAcquire();
-
- //
- // First find the lowest parent node present
- //
- for (cchEnd = strPartialPath.QueryCCH() - 1; cchEnd > 0; cchEnd--)
- {
- if (pszPartialPath[cchEnd] == L'/' || pszPartialPath[cchEnd] == L'\\')
- {
- pszPartialPath[cchEnd] = L'\0';
-
- dwHash = CalcHash(pszPartialPath);
- if (FindNodeInternal(pszPartialPath, dwHash, &pParentNode))
- {
- pszPartialPath[cchEnd] = pszKey[cchEnd];
- break;
- }
- pParentNode = NULL;
- }
- }
-
- //
- // Now go ahead and add the rest of the tree (including our record)
- //
- for (; cchEnd <= strPartialPath.QueryCCH(); cchEnd++)
- {
- if (pszPartialPath[cchEnd] == L'\0')
- {
- dwHash = CalcHash(pszPartialPath);
- hr = AddNodeInternal(
- pszPartialPath,
- dwHash,
- (cchEnd == strPartialPath.QueryCCH()) ? pRecord : NULL,
- pParentNode,
- &pParentNode);
- if (FAILED(hr) &&
- hr != HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS))
- {
- goto Finished;
- }
-
- pszPartialPath[cchEnd] = pszKey[cchEnd];
- }
- }
-
-Finished:
- _tableLock.SharedRelease();
-
- if (SUCCEEDED(hr))
- {
- RehashTableIfNeeded();
- }
-
- return hr;
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::DeleteNodeInternal(
- TREE_HASH_NODE<_Record> ** ppNextPointer,
- TREE_HASH_NODE<_Record> * pNode
-)
-/*++
- pNode is the node to be deleted
- ppNextPointer is the pointer to the previous node's next pointer pointing
- to this node
-
- This function should be called under write-lock
---*/
-{
- //
- // First remove this node from hash table
- //
- *ppNextPointer = pNode->_pNext;
-
- //
- // Now fixup parent
- //
- if (pNode->_pParentNode != NULL)
- {
- ppNextPointer = &pNode->_pParentNode->_pFirstChild;
- while (*ppNextPointer != pNode)
- {
- ppNextPointer = &(*ppNextPointer)->_pNextSibling;
- }
- *ppNextPointer = pNode->_pNextSibling;
- }
-
- //
- // Now remove all children recursively
- //
- TREE_HASH_NODE<_Record> *pChild = pNode->_pFirstChild;
- TREE_HASH_NODE<_Record> *pNextChild;
- while (pChild != NULL)
- {
- pNextChild = pChild->_pNextSibling;
-
- ppNextPointer = _ppBuckets + (pChild->_dwHash % _nBuckets);
- while (*ppNextPointer != pChild)
- {
- ppNextPointer = &(*ppNextPointer)->_pNext;
- }
- pChild->_pParentNode = NULL;
- DeleteNodeInternal(ppNextPointer, pChild);
-
- pChild = pNextChild;
- }
-
- DeleteNode(pNode);
- _nItems--;
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::DeleteKey(
- PCWSTR pszKey
-)
-{
- TREE_HASH_NODE<_Record> *pNode;
- TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer;
-
- DWORD dwHash = CalcHash(pszKey);
-
- _tableLock.ExclusiveAcquire();
-
- if (FindNodeInternal(pszKey, dwHash, &pNode, &ppPreviousNodeNextPointer))
- {
- DeleteNodeInternal(ppPreviousNodeNextPointer, pNode);
- }
-
- _tableLock.ExclusiveRelease();
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::DeleteIf(
- PFN_DELETE_IF pfnDeleteIf,
- PVOID pvContext
-)
-{
- TREE_HASH_NODE<_Record> *pNode;
- TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer;
- BOOL fDelete;
-
- _tableLock.ExclusiveAcquire();
-
- for (DWORD i=0; i<_nBuckets; i++)
- {
- ppPreviousNodeNextPointer = _ppBuckets + i;
- pNode = *ppPreviousNodeNextPointer;
- while (pNode != NULL)
- {
- //
- // Non empty nodes deleted based on DeleteIf, empty nodes deleted
- // if they have no children
- //
- fDelete = FALSE;
- if (pNode->_pRecord != NULL)
- {
- if (pfnDeleteIf(pNode->_pRecord, pvContext))
- {
- fDelete = TRUE;
- }
- }
- else if (pNode->_pFirstChild == NULL)
- {
- fDelete = TRUE;
- }
-
- if (fDelete)
- {
- if (pNode->_pFirstChild == NULL)
- {
- DeleteNodeInternal(ppPreviousNodeNextPointer, pNode);
- }
- else
- {
- DereferenceRecord(pNode->_pRecord);
- pNode->_pRecord = NULL;
- }
- }
- else
- {
- ppPreviousNodeNextPointer = &pNode->_pNext;
- }
-
- pNode = *ppPreviousNodeNextPointer;
- }
- }
-
- _tableLock.ExclusiveRelease();
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::Apply(
- PFN_APPLY pfnApply,
- PVOID pvContext
-)
-{
- TREE_HASH_NODE<_Record> *pNode;
-
- _tableLock.SharedAcquire();
-
- for (DWORD i=0; i<_nBuckets; i++)
- {
- pNode = _ppBuckets[i];
- while (pNode != NULL)
- {
- if (pNode->_pRecord != NULL)
- {
- pfnApply(pNode->_pRecord, pvContext);
- }
-
- pNode = pNode->_pNext;
- }
- }
-
- _tableLock.SharedRelease();
-}
-
-template <class _Record>
-VOID
-TREE_HASH_TABLE<_Record>::RehashTableIfNeeded(
- VOID
-)
-{
- TREE_HASH_NODE<_Record> **ppBuckets;
- DWORD nBuckets;
- TREE_HASH_NODE<_Record> *pNode;
- TREE_HASH_NODE<_Record> *pNextNode;
- TREE_HASH_NODE<_Record> **ppNextPointer;
- TREE_HASH_NODE<_Record> *pNewNextNode;
- DWORD nNewBuckets;
-
- //
- // If number of items has become too many, we will double the hash table
- // size (we never reduce it however)
- //
- if (_nItems <= PRIME::GetPrime(2*_nBuckets))
- {
- return;
- }
-
- _tableLock.ExclusiveAcquire();
-
- nNewBuckets = PRIME::GetPrime(2*_nBuckets);
-
- if (_nItems <= nNewBuckets)
- {
- goto Finished;
- }
-
- nBuckets = nNewBuckets;
- if (nBuckets >= 0xffffffff/sizeof(TREE_HASH_NODE<_Record> *))
- {
- goto Finished;
- }
- ppBuckets = (TREE_HASH_NODE<_Record> **)HeapAlloc(
- GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- nBuckets*sizeof(TREE_HASH_NODE<_Record> *));
- if (ppBuckets == NULL)
- {
- goto Finished;
- }
-
- //
- // Take out nodes from the old hash table and insert in the new one, make
- // sure to keep the hashes in increasing order
- //
- for (DWORD i=0; i<_nBuckets; i++)
- {
- pNode = _ppBuckets[i];
- while (pNode != NULL)
- {
- pNextNode = pNode->_pNext;
-
- ppNextPointer = ppBuckets + (pNode->_dwHash % nBuckets);
- pNewNextNode = *ppNextPointer;
- while (pNewNextNode != NULL &&
- pNewNextNode->_dwHash <= pNode->_dwHash)
- {
- ppNextPointer = &pNewNextNode->_pNext;
- pNewNextNode = pNewNextNode->_pNext;
- }
- pNode->_pNext = pNewNextNode;
- *ppNextPointer = pNode;
-
- pNode = pNextNode;
- }
- }
-
- HeapFree(GetProcessHeap(), 0, _ppBuckets);
- _ppBuckets = ppBuckets;
- _nBuckets = nBuckets;
- ppBuckets = NULL;
-
-Finished:
-
- _tableLock.ExclusiveRelease();
-}
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj
index 13c0f1d8fe..d19c8d3f97 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/IISSetup.CommonLib.vcxproj
@@ -34,8 +34,6 @@
<Keyword>Win32Proj</Keyword>
<RootNamespace>Lib</RootNamespace>
<ProjectName>CommonLib</ProjectName>
- <PlatformToolsetVersion Condition=" '$(VisualStudioVersion)' == '17.0' ">v143</PlatformToolsetVersion>
- <PlatformToolsetVersion Condition=" '$(PlatformToolsetVersion)' == '' ">v142</PlatformToolsetVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
@@ -65,17 +63,9 @@
</Link>
</ItemDefinitionGroup>
<ItemGroup>
- <ClCompile Include="acache.cxx" />
- <ClCompile Include="ahutil.cpp" />
- <ClCompile Include="base64.cxx" />
- <ClCompile Include="datetime.cxx" />
- <ClCompile Include="multisz.cxx" />
- <ClCompile Include="multisza.cxx" />
- <ClCompile Include="normalize.cxx" />
- <ClCompile Include="stringa.cpp" />
- <ClCompile Include="stringu.cpp" />
- <ClCompile Include="ulparse.cxx" />
- <ClCompile Include="util.cxx" />
+ <ClCompile Include="$(RepoRoot)src\Servers\IIS\AspNetCoreModuleV2\IISLib\ahutil.cpp" />
+ <ClCompile Include="$(RepoRoot)src\Servers\IIS\AspNetCoreModuleV2\IISLib\stringa.cpp" />
+ <ClCompile Include="$(RepoRoot)src\Servers\IIS\AspNetCoreModuleV2\IISLib\stringu.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="precomp.h" />
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx
deleted file mode 100644
index 262c010a2a..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/acache.cxx
+++ /dev/null
@@ -1,443 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-LONG ALLOC_CACHE_HANDLER::sm_nFillPattern = 0xACA50000;
-HANDLE ALLOC_CACHE_HANDLER::sm_hHeap;
-
-//
-// This class is used to implement the free list. We cast the free'd
-// memory block to a FREE_LIST_HEADER*. The signature is used to guard against
-// double deletion. We also fill memory with a pattern.
-//
-class FREE_LIST_HEADER
-{
-public:
- SLIST_ENTRY ListEntry;
- DWORD dwSignature;
-
- enum
- {
- FREE_SIGNATURE = (('A') | ('C' << 8) | ('a' << 16) | (('$' << 24) | 0x80)),
- };
-};
-
-ALLOC_CACHE_HANDLER::ALLOC_CACHE_HANDLER(
- VOID
-) : m_nThreshold(0),
- m_cbSize(0),
- m_pFreeLists(NULL),
- m_nTotal(0)
-{
-}
-
-ALLOC_CACHE_HANDLER::~ALLOC_CACHE_HANDLER(
- VOID
-)
-{
- if (m_pFreeLists != NULL)
- {
- CleanupLookaside();
- m_pFreeLists->Dispose();
- m_pFreeLists = NULL;
- }
-}
-
-HRESULT
-ALLOC_CACHE_HANDLER::Initialize(
- DWORD cbSize,
- LONG nThreshold
-)
-{
- HRESULT hr = S_OK;
-
- m_nThreshold = nThreshold;
- if ( m_nThreshold > 0xffff)
- {
- //
- // This will be compared against QueryDepthSList return value (USHORT).
- //
- m_nThreshold = 0xffff;
- }
-
- if ( IsPageheapEnabled() )
- {
- //
- // Disable acache.
- //
- m_nThreshold = 0;
- }
-
- //
- // Make sure the block is big enough to hold a FREE_LIST_HEADER.
- //
- m_cbSize = cbSize;
- m_cbSize = max(m_cbSize, sizeof(FREE_LIST_HEADER));
-
- //
- // Round up the block size to a multiple of the size of a LONG (for
- // the fill pattern in Free()).
- //
- m_cbSize = (m_cbSize + sizeof(LONG) - 1) & ~(sizeof(LONG) - 1);
-
-#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10
- auto Init = [] (SLIST_HEADER* pHead)
- {
- InitializeSListHead(pHead);
- };
-#else
- class Functor
- {
- public:
- void operator()(SLIST_HEADER* pHead)
- {
- InitializeSListHead(pHead);
- }
- } Init;
-#endif
-
- hr = PER_CPU<SLIST_HEADER>::Create(Init,
- &m_pFreeLists );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- m_nFillPattern = InterlockedIncrement(&sm_nFillPattern);
-
-Finished:
-
- return hr;
-}
-
-// static
-HRESULT
-ALLOC_CACHE_HANDLER::StaticInitialize(
- VOID
-)
-{
- //
- // Since the memory allocated is fixed size,
- // a heap is not really needed, allocations can be done
- // using VirtualAllocEx[Numa]. For now use Windows Heap.
- //
- // Be aware that creating one private heap consumes more
- // virtual address space for the worker process.
- //
- sm_hHeap = GetProcessHeap();
- return S_OK;
-}
-
-
-// static
-VOID
-ALLOC_CACHE_HANDLER::StaticTerminate(
- VOID
-)
-{
- sm_hHeap = NULL;
-}
-
-VOID
-ALLOC_CACHE_HANDLER::CleanupLookaside(
- VOID
-)
-/*++
- Description:
- This function cleans up the lookaside list by removing storage space.
-
- Arguments:
- None.
-
- Returns:
- None
---*/
-{
- //
- // Free up all the entries in the list.
- // Don't use InterlockedFlushSList, in order to work
- // memory must be 16 bytes aligned and currently it is 64.
- //
-
-#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10
- auto Predicate = [=] (SLIST_HEADER * pListHeader)
- {
- PSLIST_ENTRY pl;
- LONG NodesToDelete = QueryDepthSList( pListHeader );
-
- pl = InterlockedPopEntrySList( pListHeader );
- while ( pl != NULL && --NodesToDelete >= 0 )
- {
- InterlockedDecrement( &m_nTotal);
-
- ::HeapFree( sm_hHeap, 0, pl );
-
- pl = InterlockedPopEntrySList(pListHeader);
- }
- };
-#else
- class Functor
- {
- public:
- explicit Functor(ALLOC_CACHE_HANDLER * pThis) : _pThis(pThis)
- {
- }
- void operator()(SLIST_HEADER * pListHeader)
- {
- PSLIST_ENTRY pl;
- LONG NodesToDelete = QueryDepthSList( pListHeader );
-
- pl = InterlockedPopEntrySList( pListHeader );
- while ( pl != NULL && --NodesToDelete >= 0 )
- {
- InterlockedDecrement( &_pThis->m_nTotal);
-
- ::HeapFree( sm_hHeap, 0, pl );
-
- pl = InterlockedPopEntrySList(pListHeader);
- }
- }
- private:
- ALLOC_CACHE_HANDLER * _pThis;
- } Predicate(this);
-#endif
-
- m_pFreeLists ->ForEach(Predicate);
-}
-
-LPVOID
-ALLOC_CACHE_HANDLER::Alloc(
- VOID
-)
-{
- LPVOID pMemory = NULL;
-
- if ( m_nThreshold > 0 )
- {
- SLIST_HEADER * pListHeader = m_pFreeLists ->GetLocal();
- pMemory = (LPVOID) InterlockedPopEntrySList(pListHeader); // get the real object
-
- if (pMemory != NULL)
- {
- FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory;
- //
- // If the signature is wrong then somebody's been scribbling
- // on memory that they've freed.
- //
- DBG_ASSERT(pfl->dwSignature == FREE_LIST_HEADER::FREE_SIGNATURE);
- }
- }
-
- if ( pMemory == NULL )
- {
- //
- // No free entry. Need to alloc a new object.
- //
- pMemory = (LPVOID) ::HeapAlloc( sm_hHeap,
- 0,
- m_cbSize );
-
- if ( pMemory != NULL )
- {
- //
- // Update counters.
- //
- m_nTotal++;
- }
- }
-
- if ( pMemory == NULL )
- {
- SetLastError( ERROR_NOT_ENOUGH_MEMORY );
- }
- else
- {
- FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory;
- pfl->dwSignature = 0; // clear; just in case caller never overwrites
- }
-
- return pMemory;
-}
-
-VOID
-ALLOC_CACHE_HANDLER::Free(
- __in LPVOID pMemory
-)
-{
- //
- // Assume that this is allocated using the Alloc() function.
- //
- DBG_ASSERT(NULL != pMemory);
-
- //
- // Use a signature to check against double deletions.
- //
- FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory;
- DBG_ASSERT(pfl->dwSignature != FREE_LIST_HEADER::FREE_SIGNATURE);
-
- //
- // Start filling the space beyond the portion overlaid by the initial
- // FREE_LIST_HEADER. Fill at most 6 DWORDS.
- //
- LONG* pl = (LONG*) (pfl+1);
-
- for (LONG cb = (LONG)min(6 * sizeof(LONG),m_cbSize) - sizeof(FREE_LIST_HEADER);
- cb > 0;
- cb -= sizeof(LONG))
- {
- *pl++ = m_nFillPattern;
- }
-
- //
- // Now, set the signature.
- //
- pfl->dwSignature = FREE_LIST_HEADER::FREE_SIGNATURE;
-
- //
- // Store the items in the alloc cache.
- //
- SLIST_HEADER * pListHeader = m_pFreeLists ->GetLocal();
-
- if ( QueryDepthSList(pListHeader) >= m_nThreshold )
- {
- //
- // Threshold for free entries is exceeded. Free the object to
- // process pool.
- //
- ::HeapFree( sm_hHeap, 0, pMemory );
- }
- else
- {
- //
- // Store the given pointer in the single linear list
- //
- InterlockedPushEntrySList(pListHeader, &pfl->ListEntry);
- }
-}
-
-DWORD
-ALLOC_CACHE_HANDLER::QueryDepthForAllSLists(
- VOID
-)
-/*++
-
-Description:
-
- Aggregates the total count of elements in all lists.
-
-Arguments:
-
- None.
-
-Return Value:
-
- Total count (snapshot).
-
---*/
-{
- DWORD Count = 0;
-
- if (m_pFreeLists != NULL)
- {
-#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10
- auto Predicate = [&Count] (SLIST_HEADER * pListHeader)
- {
- Count += QueryDepthSList(pListHeader);
- };
-#else
- class Functor
- {
- public:
- explicit Functor(DWORD& Count) : _Count(Count)
- {
- }
- void operator()(SLIST_HEADER * pListHeader)
- {
- _Count += QueryDepthSList(pListHeader);
- }
- private:
- DWORD& _Count;
- } Predicate(Count);
-#endif
- //
- // [&Count] means that the method can modify local variable Count.
- //
- m_pFreeLists ->ForEach(Predicate);
- }
-
- return Count;
-}
-
-// static
-BOOL
-ALLOC_CACHE_HANDLER::IsPageheapEnabled(
- VOID
-)
-{
- BOOL fRet = FALSE;
- BOOL fLockedHeap = FALSE;
- HMODULE hModule = NULL;
- HANDLE hHeap = NULL;
- PROCESS_HEAP_ENTRY heapEntry = {0};
-
- //
- // If verifier.dll is loaded - we are running under app verifier == pageheap is enabled
- //
- hModule = GetModuleHandle( L"verifier.dll" );
- if ( hModule != NULL )
- {
- hModule = NULL;
- fRet = TRUE;
- goto Finished;
- }
-
- //
- // Create a heap for calling heapwalk
- // otherwise HeapWalk turns off lookasides for a useful heap
- //
- hHeap = ::HeapCreate( 0, 0, 0 );
- if ( hHeap == NULL )
- {
- fRet = FALSE;
- goto Finished;
- }
-
- fRet = ::HeapLock( hHeap );
- if ( !fRet )
- {
- goto Finished;
- }
- fLockedHeap = TRUE;
-
- //
- // If HeapWalk is unsupported -> then running page heap
- //
- fRet = ::HeapWalk( hHeap, &heapEntry );
- if ( !fRet )
- {
- if ( GetLastError() == ERROR_INVALID_FUNCTION )
- {
- fRet = TRUE;
- goto Finished;
- }
- }
-
- fRet = FALSE;
-
-Finished:
-
- if ( fLockedHeap )
- {
- fLockedHeap = FALSE;
- DBG_REQUIRE( ::HeapUnlock( hHeap ) );
- }
-
- if ( hHeap )
- {
- DBG_REQUIRE( ::HeapDestroy( hHeap ) );
- hHeap = NULL;
- }
-
- return fRet;
-} \ No newline at end of file
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp
deleted file mode 100644
index 9685b233c8..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ahutil.cpp
+++ /dev/null
@@ -1,1734 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-HRESULT
-SetElementProperty(
- IN IAppHostElement * pElement,
- IN CONST WCHAR * szPropName,
- IN CONST VARIANT * varPropValue
- )
-{
- HRESULT hr = NOERROR;
-
- CComPtr<IAppHostProperty> pPropElement;
-
- BSTR bstrPropName = SysAllocString( szPropName );
-
- if( !bstrPropName )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pElement->GetPropertyByName( bstrPropName,
- &pPropElement );
- if( FAILED(hr) )
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pPropElement->put_Value( *varPropValue );
- if( FAILED(hr) )
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
-exit:
-
- if( bstrPropName )
- {
- SysFreeString( bstrPropName );
- bstrPropName = NULL;
- }
-
- return hr;
-}
-
-HRESULT
-SetElementStringProperty(
- IN IAppHostElement * pElement,
- IN CONST WCHAR * szPropName,
- IN CONST WCHAR * szPropValue
- )
-{
- HRESULT hr;
- VARIANT varPropValue;
- VariantInit(&varPropValue);
-
- hr = VariantAssign(&varPropValue, szPropValue);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = SetElementProperty(pElement, szPropName, &varPropValue);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
-exit:
-
- VariantClear(&varPropValue);
- return hr;
-}
-
-HRESULT
-GetElementStringProperty(
- IN IAppHostElement * pElement,
- IN CONST WCHAR * szPropName,
- OUT BSTR * pbstrPropValue
- )
-{
- HRESULT hr = S_OK;
- BSTR bstrPropName = SysAllocString( szPropName );
- IAppHostProperty* pProperty = NULL;
-
- *pbstrPropValue = NULL;
-
- if (!bstrPropName)
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pElement->GetPropertyByName( bstrPropName, &pProperty );
- if (FAILED(hr))
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pProperty->get_StringValue( pbstrPropValue );
- if (FAILED(hr))
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
-exit:
-
- if (pProperty)
- {
- pProperty->Release();
- }
-
- if (bstrPropName)
- {
- SysFreeString( bstrPropName );
- }
-
- return hr;
-}
-
-
-HRESULT
-GetElementStringProperty(
- IN IAppHostElement * pElement,
- IN CONST WCHAR * szPropName,
- OUT STRU * pstrPropValue
- )
-{
- HRESULT hr = S_OK;
- BSTR bstrPropName = SysAllocString( szPropName );
- IAppHostProperty* pProperty = NULL;
- BSTR bstrPropValue = NULL;
-
- if (!bstrPropName)
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pElement->GetPropertyByName( bstrPropName, &pProperty );
- if (FAILED(hr))
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pProperty->get_StringValue( &bstrPropValue );
- if (FAILED(hr))
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = pstrPropValue->Copy(bstrPropValue);
- if (FAILED(hr))
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
-exit:
-
- if (pProperty)
- {
- pProperty->Release();
- }
-
- if (bstrPropValue)
- {
- SysFreeString( bstrPropValue );
- }
-
- if (bstrPropName)
- {
- SysFreeString( bstrPropName );
- }
-
- return hr;
-}
-
-HRESULT
-GetElementChildByName(
- IN IAppHostElement * pElement,
- IN LPCWSTR pszElementName,
- OUT IAppHostElement ** ppChildElement
-)
-{
- BSTR bstrElementName = SysAllocString(pszElementName);
- if (bstrElementName == NULL)
- {
- return E_OUTOFMEMORY;
- }
- HRESULT hr = pElement->GetElementByName(bstrElementName,
- ppChildElement);
- SysFreeString(bstrElementName);
- return hr;
-}
-
-HRESULT
-GetElementBoolProperty(
- IN IAppHostElement * pElement,
- IN LPCWSTR pszPropertyName,
- OUT bool * pBool
-)
-{
- BOOL fValue;
- HRESULT hr = GetElementBoolProperty(pElement,
- pszPropertyName,
- &fValue);
- if (SUCCEEDED(hr))
- {
- *pBool = !!fValue;
- }
- return hr;
-}
-
-HRESULT
-GetElementBoolProperty(
- IN IAppHostElement * pElement,
- IN LPCWSTR pszPropertyName,
- OUT BOOL * pBool
-)
-{
- HRESULT hr = S_OK;
- BSTR bstrPropertyName = NULL;
- IAppHostProperty * pProperty = NULL;
- VARIANT varValue;
-
- VariantInit( &varValue );
-
- bstrPropertyName = SysAllocString( pszPropertyName );
- if ( bstrPropertyName == NULL )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- // Now ask for the property and if it succeeds it is returned directly back.
- hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty );
- if ( FAILED ( hr ) )
- {
- goto exit;
- }
-
- // Now let's get the property and then extract it from the Variant.
- hr = pProperty->get_Value( &varValue );
- if ( FAILED ( hr ) )
- {
- goto exit;
- }
-
- hr = VariantChangeType( &varValue, &varValue, 0, VT_BOOL );
- if ( FAILED ( hr ) )
- {
- goto exit;
- }
-
- // extract the value
- *pBool = ( V_BOOL( &varValue ) == VARIANT_TRUE );
-
-exit:
-
- VariantClear( &varValue );
-
- if ( bstrPropertyName != NULL )
- {
- SysFreeString( bstrPropertyName );
- bstrPropertyName = NULL;
- }
-
- if ( pProperty != NULL )
- {
- pProperty->Release();
- pProperty = NULL;
- }
-
- return hr;
-
-}
-
-HRESULT
-GetElementDWORDProperty(
- IN IAppHostElement * pSitesCollectionEntry,
- IN LPCWSTR pwszName,
- OUT DWORD * pdwValue
-)
-{
- HRESULT hr = S_OK;
- IAppHostProperty * pProperty = NULL;
- BSTR bstrName = NULL;
- VARIANT varValue;
-
- VariantInit( &varValue );
-
- bstrName = SysAllocString( pwszName );
- if ( bstrName == NULL )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto error;
- }
-
- hr = pSitesCollectionEntry->GetPropertyByName( bstrName,
- &pProperty );
- if ( FAILED ( hr ) )
- {
- goto error;
- }
-
- hr = pProperty->get_Value( &varValue );
- if ( FAILED ( hr ) )
- {
- goto error;
- }
-
- hr = VariantChangeType( &varValue, &varValue, 0, VT_UI4 );
- if ( FAILED ( hr ) )
- {
- goto error;
- }
-
- // extract the value
- *pdwValue = varValue.ulVal;
-
-error:
-
- VariantClear( &varValue );
-
- if ( pProperty != NULL )
- {
- pProperty->Release();
- pProperty = NULL;
- }
-
- if ( bstrName != NULL )
- {
- SysFreeString( bstrName );
- bstrName = NULL;
- }
-
- return hr;
-}
-
-HRESULT
-GetElementINTProperty(
- IN IAppHostElement * pElement,
- IN LPCWSTR pszPropertyName,
- OUT INT * pintValue
-)
-{
- HRESULT hr = S_OK;
- IAppHostProperty * pProperty = NULL;
- BSTR bstrName = NULL;
- VARIANT varValue;
-
- VariantInit( &varValue );
-
- bstrName = SysAllocString( pszPropertyName );
- if ( bstrName == NULL )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR( hr );
- goto error;
- }
-
- hr = pElement->GetPropertyByName( bstrName,
- &pProperty );
- if ( FAILED( hr ) )
- {
- goto error;
- }
-
- hr = pProperty->get_Value( &varValue );
- if ( FAILED( hr ) )
- {
- goto error;
- }
-
- hr = VariantChangeType( &varValue, &varValue, 0, VT_I4 );
- if ( FAILED( hr ) )
- {
- goto error;
- }
-
- // extract the value
- *pintValue = varValue.intVal;
-
-error:
-
- VariantClear( &varValue );
-
- if ( pProperty != NULL )
- {
- pProperty->Release();
- pProperty = NULL;
- }
-
- if ( bstrName != NULL )
- {
- SysFreeString( bstrName );
- bstrName = NULL;
- }
-
- return hr;
-}
-
-HRESULT
-GetElementLONGLONGProperty(
- IN IAppHostElement * pSitesCollectionEntry,
- IN LPCWSTR pwszName,
- OUT LONGLONG * pllValue
-)
-{
- HRESULT hr = S_OK;
- IAppHostProperty * pProperty = NULL;
- BSTR bstrName = NULL;
- VARIANT varValue;
-
- VariantInit( &varValue );
-
- bstrName = SysAllocString( pwszName );
- if ( bstrName == NULL )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto error;
- }
-
- hr = pSitesCollectionEntry->GetPropertyByName( bstrName,
- &pProperty );
- if ( FAILED ( hr ) )
- {
- goto error;
- }
-
- hr = pProperty->get_Value( &varValue );
- if ( FAILED ( hr ) )
- {
- goto error;
- }
-
- hr = VariantChangeType( &varValue, &varValue, 0, VT_I8 );
- if ( FAILED ( hr ) )
- {
- goto error;
- }
-
- // extract the value
- *pllValue = varValue.ulVal;
-
-error:
-
- VariantClear( &varValue );
-
- if ( pProperty != NULL )
- {
- pProperty->Release();
- pProperty = NULL;
- }
-
- if ( bstrName != NULL )
- {
- SysFreeString( bstrName );
- bstrName = NULL;
- }
-
- return hr;
-}
-
-HRESULT
-GetElementRawTimeSpanProperty(
- IN IAppHostElement * pElement,
- IN LPCWSTR pszPropertyName,
- OUT ULONGLONG * pulonglong
-)
-{
- HRESULT hr = S_OK;
- BSTR bstrPropertyName = NULL;
- IAppHostProperty * pProperty = NULL;
- VARIANT varValue;
-
- VariantInit( &varValue );
-
- bstrPropertyName = SysAllocString( pszPropertyName );
- if ( bstrPropertyName == NULL )
- {
- hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
- goto Finished;
- }
-
- // Now ask for the property and if it succeeds it is returned directly back
- hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty );
- if ( FAILED ( hr ) )
- {
- goto Finished;
- }
-
- // Now let's get the property and then extract it from the Variant.
- hr = pProperty->get_Value( &varValue );
- if ( FAILED ( hr ) )
- {
- goto Finished;
- }
-
- hr = VariantChangeType( &varValue, &varValue, 0, VT_UI8 );
- if ( FAILED ( hr ) )
- {
- goto Finished;
- }
-
- // extract the value
- *pulonglong = varValue.ullVal;
-
-
-Finished:
-
- VariantClear( &varValue );
-
- if ( bstrPropertyName != NULL )
- {
- SysFreeString( bstrPropertyName );
- bstrPropertyName = NULL;
- }
-
- if ( pProperty != NULL )
- {
- pProperty->Release();
- pProperty = NULL;
- }
-
- return hr;
-
-} // end of Config_GetRawTimeSpanProperty
-
-HRESULT
-DeleteElementFromCollection(
- IAppHostElementCollection *pCollection,
- CONST WCHAR * szKeyName,
- CONST WCHAR * szKeyValue,
- ULONG BehaviorFlags,
- BOOL * pfDeleted
- )
-{
- HRESULT hr = NOERROR;
- ULONG index;
-
- VARIANT varIndex;
- VariantInit( &varIndex );
-
- *pfDeleted = FALSE;
-
- hr = FindElementInCollection(
- pCollection,
- szKeyName,
- szKeyValue,
- BehaviorFlags,
- &index
- );
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if (hr == S_FALSE)
- {
- //
- // Not found.
- //
-
- goto exit;
- }
-
- varIndex.vt = VT_UI4;
- varIndex.ulVal = index;
-
- hr = pCollection->DeleteElement( varIndex );
-
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- *pfDeleted = TRUE;
-
-exit:
-
- return hr;
-}
-
-HRESULT
-DeleteAllElementsFromCollection(
- IAppHostElementCollection *pCollection,
- CONST WCHAR * szKeyName,
- CONST WCHAR * szKeyValue,
- ULONG BehaviorFlags,
- UINT * pNumDeleted
- )
-{
- HRESULT hr = S_OK;
- UINT numDeleted = 0;
- BOOL fDeleted = TRUE;
-
- while (fDeleted)
- {
- hr = DeleteElementFromCollection(
- pCollection,
- szKeyName,
- szKeyValue,
- BehaviorFlags,
- &fDeleted
- );
-
- if (hr == S_FALSE)
- {
- hr = S_OK;
- break;
- }
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- break;
- }
-
- if (fDeleted)
- {
- numDeleted++;
- }
- }
-
- *pNumDeleted = numDeleted;
- return hr;
-}
-
-BOOL
-FindCompareCaseSensitive(
- CONST WCHAR * szLookupValue,
- CONST WCHAR * szKeyValue
- )
-{
- return !wcscmp(szLookupValue, szKeyValue);
-}
-
-BOOL
-FindCompareCaseInsensitive(
- CONST WCHAR * szLookupValue,
- CONST WCHAR * szKeyValue
- )
-{
- return !_wcsicmp(szLookupValue, szKeyValue);
-}
-
-typedef
-BOOL
-(*PFN_FIND_COMPARE_PROC)(
- CONST WCHAR *szLookupValue,
- CONST WCHAR *szKeyValue
- );
-
-HRESULT
-FindElementInCollection(
- IAppHostElementCollection *pCollection,
- CONST WCHAR * szKeyName,
- CONST WCHAR * szKeyValue,
- ULONG BehaviorFlags,
- OUT ULONG * pIndex
- )
-{
- HRESULT hr = NOERROR;
-
- CComPtr<IAppHostElement> pElement;
- CComPtr<IAppHostProperty> pKeyProperty;
-
- VARIANT varIndex;
- VariantInit( &varIndex );
-
- VARIANT varKeyValue;
- VariantInit( &varKeyValue );
-
- DWORD count;
- DWORD i;
-
- BSTR bstrKeyName = NULL;
- PFN_FIND_COMPARE_PROC compareProc;
-
- compareProc = (BehaviorFlags & FIND_ELEMENT_CASE_INSENSITIVE)
- ? &FindCompareCaseInsensitive
- : &FindCompareCaseSensitive;
-
- bstrKeyName = SysAllocString( szKeyName );
- if( !bstrKeyName )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pCollection->get_Count( &count );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- for( i = 0; i < count; i++ )
- {
- varIndex.vt = VT_UI4;
- varIndex.ulVal = i;
-
- hr = pCollection->get_Item( varIndex,
- &pElement );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto tryNext;
- }
-
- hr = pElement->GetPropertyByName( bstrKeyName,
- &pKeyProperty );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto tryNext;
- }
-
- hr = pKeyProperty->get_Value( &varKeyValue );
-
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto tryNext;
- }
-
- if ((compareProc)(szKeyValue, varKeyValue.bstrVal))
- {
- *pIndex = i;
- break;
- }
-
-tryNext:
-
- pElement.Release();
- pKeyProperty.Release();
-
- VariantClear( &varKeyValue );
- }
-
- if (i >= count)
- {
- hr = S_FALSE;
- }
-
-exit:
-
- SysFreeString( bstrKeyName );
- VariantClear( &varKeyValue );
-
- return hr;
-}
-
-HRESULT
-VariantAssign(
- IN OUT VARIANT * pv,
- IN CONST WCHAR * sz
- )
-{
- if( !pv || !sz )
- {
- return E_INVALIDARG;
- }
-
- HRESULT hr = NOERROR;
-
- BSTR bstr = SysAllocString( sz );
- if( !bstr )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR( hr );
- goto exit;
- }
-
- hr = VariantClear( pv );
- if( FAILED(hr) )
- {
- DBGERROR_HR( hr );
- goto exit;
- }
-
- pv->vt = VT_BSTR;
- pv->bstrVal = bstr;
- bstr = NULL;
-
-exit:
-
- SysFreeString( bstr );
-
- return hr;
-}
-
-HRESULT
-GetLocationFromFile(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- IN CONST WCHAR * szLocationPath,
- OUT IAppHostConfigLocation ** ppLocation,
- OUT BOOL * pFound
- )
-{
- HRESULT hr = NOERROR;
-
- CComPtr<IAppHostConfigLocationCollection> pLocationCollection;
- CComPtr<IAppHostConfigLocation> pLocation;
-
- BSTR bstrLocationPath = NULL;
-
- *ppLocation = NULL;
- *pFound = FALSE;
-
- hr = GetLocationCollection( pAdminMgr,
- szConfigPath,
- &pLocationCollection );
-
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- DWORD count;
- DWORD i;
- VARIANT varIndex;
- VariantInit( &varIndex );
-
- hr = pLocationCollection->get_Count( &count );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- for( i = 0; i < count; i++ )
- {
- varIndex.vt = VT_UI4;
- varIndex.ulVal = i;
-
- hr = pLocationCollection->get_Item( varIndex,
- &pLocation );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pLocation->get_Path( &bstrLocationPath );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if( 0 == wcscmp ( szLocationPath, bstrLocationPath ) )
- {
- *pFound = TRUE;
- *ppLocation = pLocation.Detach();
- break;
- }
-
-
- pLocation.Release();
-
- SysFreeString( bstrLocationPath );
- bstrLocationPath = NULL;
- }
-
-exit:
-
- SysFreeString( bstrLocationPath );
-
- return hr;
-}
-
-HRESULT
-GetSectionFromLocation(
- IN IAppHostConfigLocation * pLocation,
- IN CONST WCHAR * szSectionName,
- OUT IAppHostElement ** ppSectionElement,
- OUT BOOL * pFound
- )
-{
- HRESULT hr = NOERROR;
-
- CComPtr<IAppHostElement> pSectionElement;
-
- DWORD count;
- DWORD i;
-
- VARIANT varIndex;
- VariantInit( &varIndex );
-
- BSTR bstrSectionName = NULL;
-
- *pFound = FALSE;
- *ppSectionElement = NULL;
-
- hr = pLocation->get_Count( &count );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- for( i = 0; i < count; i++ )
- {
- varIndex.vt = VT_UI4;
- varIndex.ulVal = i;
-
-
- hr = pLocation->get_Item( varIndex,
- &pSectionElement );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pSectionElement->get_Name( &bstrSectionName );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if( 0 == wcscmp ( szSectionName, bstrSectionName ) )
- {
- *pFound = TRUE;
- *ppSectionElement = pSectionElement.Detach();
- break;
- }
-
- pSectionElement.Release();
-
- SysFreeString( bstrSectionName );
- bstrSectionName = NULL;
- }
-
-exit:
-
- SysFreeString( bstrSectionName );
-
- return hr;
-}
-
-
-HRESULT
-GetAdminElement(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- IN CONST WCHAR * szElementName,
- OUT IAppHostElement ** pElement
-)
-{
- HRESULT hr = S_OK;
- BSTR bstrConfigPath = NULL;
- BSTR bstrElementName = NULL;
-
- bstrConfigPath = SysAllocString(szConfigPath);
- bstrElementName = SysAllocString(szElementName);
-
- if (bstrConfigPath == NULL || bstrElementName == NULL)
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pAdminMgr->GetAdminSection( bstrElementName,
- bstrConfigPath,
- pElement );
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
-exit:
-
- if ( bstrElementName != NULL )
- {
- SysFreeString(bstrElementName);
- bstrElementName = NULL;
- }
- if ( bstrConfigPath != NULL )
- {
- SysFreeString(bstrConfigPath);
- bstrConfigPath = NULL;
- }
-
- return hr;
-}
-
-
-HRESULT
-ClearAdminElement(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- IN CONST WCHAR * szElementName
- )
-{
- HRESULT hr;
- CComPtr<IAppHostElement> pElement;
-
- hr = GetAdminElement(
- pAdminMgr,
- szConfigPath,
- szElementName,
- &pElement
- );
-
- if (FAILED(hr))
- {
- if (hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND))
- {
- hr = S_OK;
- }
- else
- {
- DBGERROR_HR(hr);
- }
-
- goto exit;
- }
-
- hr = pElement->Clear();
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
-exit:
-
- return hr;
-}
-
-
-HRESULT
-ClearElementFromAllSites(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- IN CONST WCHAR * szElementName
- )
-{
- HRESULT hr;
- CComPtr<IAppHostElementCollection> pSitesCollection;
- CComPtr<IAppHostElement> pSiteElement;
- CComPtr<IAppHostChildElementCollection> pChildCollection;
- ENUM_INDEX index;
- BOOL found;
-
- //
- // Enumerate the sites, remove the specified elements.
- //
-
- hr = GetSitesCollection(
- pAdminMgr,
- szConfigPath,
- &pSitesCollection
- );
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- for (hr = FindFirstElement(pSitesCollection, &index, &pSiteElement) ;
- SUCCEEDED(hr) ;
- hr = FindNextElement(pSitesCollection, &index, &pSiteElement))
- {
- if (hr == S_FALSE)
- {
- hr = S_OK;
- break;
- }
-
- hr = pSiteElement->get_ChildElements(&pChildCollection);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if (pChildCollection)
- {
- hr = ClearChildElementsByName(
- pChildCollection,
- szElementName,
- &found
- );
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
- }
-
- pSiteElement.Release();
- }
-
-exit:
-
- return hr;
-
-}
-
-
-HRESULT
-ClearElementFromAllLocations(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- IN CONST WCHAR * szElementName
- )
-{
- HRESULT hr;
- CComPtr<IAppHostConfigLocationCollection> pLocationCollection;
- CComPtr<IAppHostConfigLocation> pLocation;
- CComPtr<IAppHostChildElementCollection> pChildCollection;
- ENUM_INDEX index;
-
- //
- // Enum the <location> tags, remove the specified elements.
- //
-
- hr = GetLocationCollection(
- pAdminMgr,
- szConfigPath,
- &pLocationCollection
- );
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- for (hr = FindFirstLocation(pLocationCollection, &index, &pLocation) ;
- SUCCEEDED(hr) ;
- hr = FindNextLocation(pLocationCollection, &index, &pLocation))
- {
- if (hr == S_FALSE)
- {
- hr = S_OK;
- break;
- }
-
- hr = ClearLocationElements(pLocation, szElementName);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- pLocation.Release();
- }
-
-exit:
-
- return hr;
-
-}
-
-HRESULT
-ClearLocationElements(
- IN IAppHostConfigLocation * pLocation,
- IN CONST WCHAR * szElementName
- )
-{
- HRESULT hr;
- CComPtr<IAppHostElement> pElement;
- ENUM_INDEX index;
- BOOL matched;
-
- for (hr = FindFirstLocationElement(pLocation, &index, &pElement) ;
- SUCCEEDED(hr) ;
- hr = FindNextLocationElement(pLocation, &index, &pElement))
- {
- if (hr == S_FALSE)
- {
- hr = S_OK;
- break;
- }
-
- hr = CompareElementName(pElement, szElementName, &matched);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if (matched)
- {
- pElement->Clear();
- }
-
- pElement.Release();
- }
-
-exit:
-
- return hr;
-}
-
-HRESULT
-CompareElementName(
- IN IAppHostElement * pElement,
- IN CONST WCHAR * szNameToMatch,
- OUT BOOL * pMatched
- )
-{
- HRESULT hr;
- BSTR bstrElementName = NULL;
-
- *pMatched = FALSE; // until proven otherwise
-
- hr = pElement->get_Name(&bstrElementName);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if( 0 == wcscmp ( szNameToMatch, bstrElementName ) )
- {
- *pMatched = TRUE;
- }
-
-exit:
-
- SysFreeString(bstrElementName);
- return hr;
-}
-
-
-HRESULT
-ClearChildElementsByName(
- IN IAppHostChildElementCollection * pCollection,
- IN CONST WCHAR * szElementName,
- OUT BOOL * pFound
- )
-{
- HRESULT hr;
- CComPtr<IAppHostElement> pElement;
- ENUM_INDEX index;
- BOOL matched;
-
- *pFound = FALSE;
-
- for (hr = FindFirstChildElement(pCollection, &index, &pElement) ;
- SUCCEEDED(hr) ;
- hr = FindNextChildElement(pCollection, &index, &pElement))
- {
- if (hr == S_FALSE)
- {
- hr = S_OK;
- break;
- }
-
- hr = CompareElementName(pElement, szElementName, &matched);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- if (matched)
- {
- hr = pElement->Clear();
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- *pFound = TRUE;
- }
-
- pElement.Release();
- }
-
-exit:
-
- return hr;
-}
-
-
-HRESULT
-GetSitesCollection(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- OUT IAppHostElementCollection ** pSitesCollection
- )
-{
- HRESULT hr;
- CComPtr<IAppHostElement> pSitesElement;
- BSTR bstrConfigPath;
- BSTR bstrSitesSectionName;
-
- bstrConfigPath = SysAllocString(szConfigPath);
- bstrSitesSectionName = SysAllocString(L"system.applicationHost/sites");
- *pSitesCollection = NULL;
-
- if (bstrConfigPath == NULL || bstrSitesSectionName == NULL)
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- //
- // Chase down the sites collection.
- //
-
- hr = pAdminMgr->GetAdminSection( bstrSitesSectionName,
- bstrConfigPath,
- &pSitesElement );
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pSitesElement->get_Collection(pSitesCollection);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
-exit:
-
- SysFreeString(bstrSitesSectionName);
- SysFreeString(bstrConfigPath);
- return hr;
-}
-
-
-HRESULT
-GetLocationCollection(
- IN IAppHostAdminManager * pAdminMgr,
- IN CONST WCHAR * szConfigPath,
- OUT IAppHostConfigLocationCollection ** pLocationCollection
- )
-{
- HRESULT hr;
- BSTR bstrConfigPath;
- CComPtr<IAppHostConfigManager> pConfigMgr;
- CComPtr<IAppHostConfigFile> pConfigFile;
-
- bstrConfigPath = SysAllocString(szConfigPath);
- *pLocationCollection = NULL;
-
- if (bstrConfigPath == NULL)
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pAdminMgr->get_ConfigManager(&pConfigMgr);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pConfigMgr->GetConfigFile(bstrConfigPath, &pConfigFile);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pConfigFile->get_Locations(pLocationCollection);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
-exit:
-
- SysFreeString(bstrConfigPath);
- return hr;
-}
-
-
-HRESULT
-FindFirstElement(
- IN IAppHostElementCollection * pCollection,
- OUT ENUM_INDEX * pIndex,
- OUT IAppHostElement ** pElement
- )
-{
- HRESULT hr;
-
- hr = pCollection->get_Count(&pIndex->Count);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- return hr;
- }
-
- VariantInit(&pIndex->Index);
- pIndex->Index.vt = VT_UI4;
- pIndex->Index.ulVal = 0;
-
- return FindNextElement(pCollection, pIndex, pElement);
-}
-
-HRESULT
-FindNextElement(
- IN IAppHostElementCollection * pCollection,
- IN OUT ENUM_INDEX * pIndex,
- OUT IAppHostElement ** pElement
- )
-{
- HRESULT hr;
-
- *pElement = NULL;
-
- if (pIndex->Index.ulVal >= pIndex->Count)
- {
- return S_FALSE;
- }
-
- hr = pCollection->get_Item(pIndex->Index, pElement);
-
- if (SUCCEEDED(hr))
- {
- pIndex->Index.ulVal++;
- }
-
- return hr;
-}
-
-HRESULT
-FindFirstChildElement(
- IN IAppHostChildElementCollection * pCollection,
- OUT ENUM_INDEX * pIndex,
- OUT IAppHostElement ** pElement
- )
-{
- HRESULT hr;
-
- hr = pCollection->get_Count(&pIndex->Count);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- return hr;
- }
-
- VariantInit(&pIndex->Index);
- pIndex->Index.vt = VT_UI4;
- pIndex->Index.ulVal = 0;
-
- return FindNextChildElement(pCollection, pIndex, pElement);
-}
-
-HRESULT
-FindNextChildElement(
- IN IAppHostChildElementCollection * pCollection,
- IN OUT ENUM_INDEX * pIndex,
- OUT IAppHostElement ** pElement
- )
-{
- HRESULT hr;
-
- *pElement = NULL;
-
- if (pIndex->Index.ulVal >= pIndex->Count)
- {
- return S_FALSE;
- }
-
- hr = pCollection->get_Item(pIndex->Index, pElement);
-
- if (SUCCEEDED(hr))
- {
- pIndex->Index.ulVal++;
- }
-
- return hr;
-}
-
-HRESULT
-FindFirstLocation(
- IN IAppHostConfigLocationCollection * pCollection,
- OUT ENUM_INDEX * pIndex,
- OUT IAppHostConfigLocation ** pLocation
- )
-{
- HRESULT hr;
-
- hr = pCollection->get_Count(&pIndex->Count);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- return hr;
- }
-
- VariantInit(&pIndex->Index);
- pIndex->Index.vt = VT_UI4;
- pIndex->Index.ulVal = 0;
-
- return FindNextLocation(pCollection, pIndex, pLocation);
-}
-
-HRESULT
-FindNextLocation(
- IN IAppHostConfigLocationCollection * pCollection,
- IN OUT ENUM_INDEX * pIndex,
- OUT IAppHostConfigLocation ** pLocation
- )
-{
- HRESULT hr;
-
- *pLocation = NULL;
-
- if (pIndex->Index.ulVal >= pIndex->Count)
- {
- return S_FALSE;
- }
-
- hr = pCollection->get_Item(pIndex->Index, pLocation);
-
- if (SUCCEEDED(hr))
- {
- pIndex->Index.ulVal++;
- }
-
- return hr;
-}
-
-HRESULT
-FindFirstLocationElement(
- IN IAppHostConfigLocation * pLocation,
- OUT ENUM_INDEX * pIndex,
- OUT IAppHostElement ** pElement
- )
-{
- HRESULT hr;
-
- hr = pLocation->get_Count(&pIndex->Count);
-
- if (FAILED(hr))
- {
- DBGERROR_HR(hr);
- return hr;
- }
-
- VariantInit(&pIndex->Index);
- pIndex->Index.vt = VT_UI4;
- pIndex->Index.ulVal = 0;
-
- return FindNextLocationElement(pLocation, pIndex, pElement);
-}
-
-HRESULT
-FindNextLocationElement(
- IN IAppHostConfigLocation * pLocation,
- IN OUT ENUM_INDEX * pIndex,
- OUT IAppHostElement ** pElement
- )
-{
- HRESULT hr;
-
- *pElement = NULL;
-
- if (pIndex->Index.ulVal >= pIndex->Count)
- {
- return S_FALSE;
- }
-
- hr = pLocation->get_Item(pIndex->Index, pElement);
-
- if (SUCCEEDED(hr))
- {
- pIndex->Index.ulVal++;
- }
-
- return hr;
-}
-
-HRESULT
-GetSharedConfigEnabled(
- BOOL * pfIsSharedConfig
-)
-/*++
-
-Routine Description:
- Search the configuration for the shared configuration property.
-
-Arguments:
-
- pfIsSharedConfig - true if shared configuration is enabled
-
-Return Value:
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- IAppHostAdminManager *pAdminManager = NULL;
-
- BSTR bstrSectionName = NULL;
- BSTR bstrConfigPath = NULL;
-
- IAppHostElement * pConfigRedirSection = NULL;
-
-
- bstrSectionName = SysAllocString( L"configurationRedirection" );
-
- if ( bstrSectionName == NULL )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- bstrConfigPath = SysAllocString( L"MACHINE/REDIRECTION" );
- if ( bstrConfigPath == NULL )
- {
- hr = E_OUTOFMEMORY;
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = CoCreateInstance( CLSID_AppHostAdminManager,
- NULL,
- CLSCTX_INPROC_SERVER,
- IID_IAppHostAdminManager,
- (VOID **)&pAdminManager );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = pAdminManager->GetAdminSection( bstrSectionName,
- bstrConfigPath,
- &pConfigRedirSection );
- if( FAILED(hr) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- hr = GetElementBoolProperty( pConfigRedirSection,
- L"enabled",
- pfIsSharedConfig );
-
- if ( FAILED( hr ) )
- {
- DBGERROR_HR(hr);
- goto exit;
- }
-
- pConfigRedirSection->Release();
- pConfigRedirSection = NULL;
-
-
-exit:
-
- //
- // dump config exception to setup log file (if available)
- //
-
- if ( pConfigRedirSection != NULL )
- {
- pConfigRedirSection->Release();
- }
-
- if ( pAdminManager != NULL )
- {
- pAdminManager->Release();
- }
-
- if ( bstrConfigPath != NULL )
- {
- SysFreeString( bstrConfigPath );
- }
-
- if ( bstrSectionName != NULL )
- {
- SysFreeString( bstrSectionName );
- }
-
- return hr;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx
deleted file mode 100644
index 26e601fac4..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/base64.cxx
+++ /dev/null
@@ -1,482 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-DWORD
-Base64Encode(
- __in_bcount(cbDecodedBufferSize) VOID * pDecodedBuffer,
- IN DWORD cbDecodedBufferSize,
- __out_ecount_opt(cchEncodedStringSize) PWSTR pszEncodedString,
- IN DWORD cchEncodedStringSize,
- __out_opt DWORD * pcchEncoded
- )
-/*++
-
-Routine Description:
-
- Decode a base64-encoded string.
-
-Arguments:
-
- pDecodedBuffer (IN) - buffer to encode.
- cbDecodedBufferSize (IN) - size of buffer to encode.
- cchEncodedStringSize (IN) - size of the buffer for the encoded string.
- pszEncodedString (OUT) = the encoded string.
- pcchEncoded (OUT) - size in characters of the encoded string.
-
-Return Values:
-
- 0 - success.
- E_OUTOFMEMORY
-
---*/
-{
- static WCHAR rgchEncodeTable[64] = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
- };
-
- DWORD ib;
- DWORD ich;
- DWORD cchEncoded;
- BYTE b0, b1, b2;
- BYTE * pbDecodedBuffer = (BYTE *) pDecodedBuffer;
-
- // Calculate encoded string size.
- cchEncoded = 1 + (cbDecodedBufferSize + 2) / 3 * 4;
-
- if (NULL != pcchEncoded) {
- *pcchEncoded = cchEncoded;
- }
-
- if (cchEncodedStringSize == 0 && pszEncodedString == NULL) {
- return ERROR_SUCCESS;
- }
-
- if (cchEncodedStringSize < cchEncoded) {
- // Given buffer is too small to hold encoded string.
- return ERROR_INSUFFICIENT_BUFFER;
- }
-
- // Encode data byte triplets into four-byte clusters.
- ib = ich = 0;
- while (ib < cbDecodedBufferSize) {
- b0 = pbDecodedBuffer[ib++];
- b1 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0;
- b2 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0;
-
- //
- // The checks below for buffer overflow seems redundant to me.
- // But it's the only way I can find to keep OACR quiet so it
- // will have to do.
- //
-
- pszEncodedString[ich++] = rgchEncodeTable[b0 >> 2];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
-
- pszEncodedString[ich++] = rgchEncodeTable[((b0 << 4) & 0x30) | ((b1 >> 4) & 0x0f)];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
-
- pszEncodedString[ich++] = rgchEncodeTable[((b1 << 2) & 0x3c) | ((b2 >> 6) & 0x03)];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
-
- pszEncodedString[ich++] = rgchEncodeTable[b2 & 0x3f];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
- }
-
- // Pad the last cluster as necessary to indicate the number of data bytes
- // it represents.
- switch (cbDecodedBufferSize % 3) {
- case 0:
- break;
- case 1:
- pszEncodedString[ich - 2] = '=';
- __fallthrough;
- case 2:
- pszEncodedString[ich - 1] = '=';
- break;
- }
-
- // Null-terminate the encoded string.
- pszEncodedString[ich++] = '\0';
-
- DBG_ASSERT(ich == cchEncoded);
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD
-Base64Decode(
- __in PCWSTR pszEncodedString,
- __out_opt VOID * pDecodeBuffer,
- __in DWORD cbDecodeBufferSize,
- __out_opt DWORD * pcbDecoded
- )
-/*++
-
-Routine Description:
-
- Decode a base64-encoded string.
-
-Arguments:
-
- pszEncodedString (IN) - base64-encoded string to decode.
- cbDecodeBufferSize (IN) - size in bytes of the decode buffer.
- pbDecodeBuffer (OUT) - holds the decoded data.
- pcbDecoded (OUT) - number of data bytes in the decoded data (if success or
- STATUS_BUFFER_TOO_SMALL).
-
-Return Values:
-
- 0 - success.
- E_OUTOFMEMORY
- E_INVALIDARG
-
---*/
-{
-#define NA (255)
-#define DECODE(x) (((ULONG)(x) < sizeof(rgbDecodeTable)) ? rgbDecodeTable[x] : NA)
-
- static BYTE rgbDecodeTable[128] = {
- NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 0-15
- NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 16-31
- NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62, NA, NA, NA, 63, // 32-47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, NA, NA, NA, 0, NA, NA, // 48-63
- NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, NA, NA, NA, NA, NA, // 80-95
- NA, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NA, NA, NA, NA, NA, // 112-127
- };
-
- DWORD cbDecoded;
- DWORD cchEncodedSize;
- DWORD ich;
- DWORD ib;
- BYTE b0, b1, b2, b3;
- BYTE * pbDecodeBuffer = (BYTE *) pDecodeBuffer;
-
- cchEncodedSize = (DWORD)wcslen(pszEncodedString);
- if (NULL != pcbDecoded) {
- *pcbDecoded = 0;
- }
-
- if ((0 == cchEncodedSize) || (0 != (cchEncodedSize % 4))) {
- // Input string is not sized correctly to be base64.
- return ERROR_INVALID_PARAMETER;
- }
-
- // Calculate decoded buffer size.
- cbDecoded = (cchEncodedSize + 3) / 4 * 3;
- if (pszEncodedString[cchEncodedSize-1] == '=') {
- if (pszEncodedString[cchEncodedSize-2] == '=') {
- // Only one data byte is encoded in the last cluster.
- cbDecoded -= 2;
- }
- else {
- // Only two data bytes are encoded in the last cluster.
- cbDecoded -= 1;
- }
- }
-
- if (NULL != pcbDecoded) {
- *pcbDecoded = cbDecoded;
- }
-
- if (cbDecodeBufferSize == 0 && pDecodeBuffer == NULL) {
- return ERROR_SUCCESS;
- }
-
- if (cbDecoded > cbDecodeBufferSize) {
- // Supplied buffer is too small.
- return ERROR_INSUFFICIENT_BUFFER;
- }
-
- // Decode each four-byte cluster into the corresponding three data bytes.
- ich = ib = 0;
- while (ich < cchEncodedSize) {
- b0 = DECODE(pszEncodedString[ich]); ich++;
- b1 = DECODE(pszEncodedString[ich]); ich++;
- b2 = DECODE(pszEncodedString[ich]); ich++;
- b3 = DECODE(pszEncodedString[ich]); ich++;
-
- if ((NA == b0) || (NA == b1) || (NA == b2) || (NA == b3)) {
- // Contents of input string are not base64.
- return ERROR_INVALID_PARAMETER;
- }
-
- pbDecodeBuffer[ib++] = (b0 << 2) | (b1 >> 4);
-
- if (ib < cbDecoded) {
- pbDecodeBuffer[ib++] = (b1 << 4) | (b2 >> 2);
-
- if (ib < cbDecoded) {
- pbDecodeBuffer[ib++] = (b2 << 6) | b3;
- }
- }
- }
-
- DBG_ASSERT(ib == cbDecoded);
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD
-Base64Encode(
- __in_bcount(cbDecodedBufferSize) VOID * pDecodedBuffer,
- IN DWORD cbDecodedBufferSize,
- __out_ecount_opt(cchEncodedStringSize) PSTR pszEncodedString,
- IN DWORD cchEncodedStringSize,
- __out_opt DWORD * pcchEncoded
- )
-/*++
-
-Routine Description:
-
- Decode a base64-encoded string.
-
-Arguments:
-
- pDecodedBuffer (IN) - buffer to encode.
- cbDecodedBufferSize (IN) - size of buffer to encode.
- cchEncodedStringSize (IN) - size of the buffer for the encoded string.
- pszEncodedString (OUT) = the encoded string.
- pcchEncoded (OUT) - size in characters of the encoded string.
-
-Return Values:
-
- 0 - success.
- E_OUTOFMEMORY
-
---*/
-{
- static CHAR rgchEncodeTable[64] = {
- 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
- 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
- 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
- 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
- };
-
- DWORD ib;
- DWORD ich;
- DWORD cchEncoded;
- BYTE b0, b1, b2;
- BYTE * pbDecodedBuffer = (BYTE *) pDecodedBuffer;
-
- // Calculate encoded string size.
- cchEncoded = 1 + (cbDecodedBufferSize + 2) / 3 * 4;
-
- if (NULL != pcchEncoded) {
- *pcchEncoded = cchEncoded;
- }
-
- if (cchEncodedStringSize == 0 && pszEncodedString == NULL) {
- return ERROR_SUCCESS;
- }
-
- if (cchEncodedStringSize < cchEncoded) {
- // Given buffer is too small to hold encoded string.
- return ERROR_INSUFFICIENT_BUFFER;
- }
-
- // Encode data byte triplets into four-byte clusters.
- ib = ich = 0;
- while (ib < cbDecodedBufferSize) {
- b0 = pbDecodedBuffer[ib++];
- b1 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0;
- b2 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0;
-
- //
- // The checks below for buffer overflow seems redundant to me.
- // But it's the only way I can find to keep OACR quiet so it
- // will have to do.
- //
-
- pszEncodedString[ich++] = rgchEncodeTable[b0 >> 2];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
-
- pszEncodedString[ich++] = rgchEncodeTable[((b0 << 4) & 0x30) | ((b1 >> 4) & 0x0f)];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
-
- pszEncodedString[ich++] = rgchEncodeTable[((b1 << 2) & 0x3c) | ((b2 >> 6) & 0x03)];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
-
- pszEncodedString[ich++] = rgchEncodeTable[b2 & 0x3f];
- if ( ich >= cchEncodedStringSize )
- {
- DBG_ASSERT( FALSE );
- return ERROR_BUFFER_OVERFLOW;
- }
- }
-
- // Pad the last cluster as necessary to indicate the number of data bytes
- // it represents.
- switch (cbDecodedBufferSize % 3) {
- case 0:
- break;
- case 1:
- pszEncodedString[ich - 2] = '=';
- __fallthrough;
- case 2:
- pszEncodedString[ich - 1] = '=';
- break;
- }
-
- // Null-terminate the encoded string.
- pszEncodedString[ich++] = '\0';
-
- DBG_ASSERT(ich == cchEncoded);
-
- return ERROR_SUCCESS;
-}
-
-
-DWORD
-Base64Decode(
- __in PCSTR pszEncodedString,
- __out_opt VOID * pDecodeBuffer,
- __in DWORD cbDecodeBufferSize,
- __out_opt DWORD * pcbDecoded
- )
-/*++
-
-Routine Description:
-
- Decode a base64-encoded string.
-
-Arguments:
-
- pszEncodedString (IN) - base64-encoded string to decode.
- cbDecodeBufferSize (IN) - size in bytes of the decode buffer.
- pbDecodeBuffer (OUT) - holds the decoded data.
- pcbDecoded (OUT) - number of data bytes in the decoded data (if success or
- STATUS_BUFFER_TOO_SMALL).
-
-Return Values:
-
- 0 - success.
- E_OUTOFMEMORY
- E_INVALIDARG
-
---*/
-{
-#define NA (255)
-#define DECODE(x) (((ULONG)(x) < sizeof(rgbDecodeTable)) ? rgbDecodeTable[x] : NA)
-
- static BYTE rgbDecodeTable[128] = {
- NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 0-15
- NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 16-31
- NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62, NA, NA, NA, 63, // 32-47
- 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, NA, NA, NA, 0, NA, NA, // 48-63
- NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79
- 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, NA, NA, NA, NA, NA, // 80-95
- NA, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111
- 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NA, NA, NA, NA, NA, // 112-127
- };
-
- DWORD cbDecoded;
- DWORD cchEncodedSize;
- DWORD ich;
- DWORD ib;
- BYTE b0, b1, b2, b3;
- BYTE * pbDecodeBuffer = (BYTE *) pDecodeBuffer;
-
- cchEncodedSize = (DWORD)strlen(pszEncodedString);
- if (NULL != pcbDecoded) {
- *pcbDecoded = 0;
- }
-
- if ((0 == cchEncodedSize) || (0 != (cchEncodedSize % 4))) {
- // Input string is not sized correctly to be base64.
- return ERROR_INVALID_PARAMETER;
- }
-
- // Calculate decoded buffer size.
- cbDecoded = (cchEncodedSize + 3) / 4 * 3;
- if (pszEncodedString[cchEncodedSize-1] == '=') {
- if (pszEncodedString[cchEncodedSize-2] == '=') {
- // Only one data byte is encoded in the last cluster.
- cbDecoded -= 2;
- }
- else {
- // Only two data bytes are encoded in the last cluster.
- cbDecoded -= 1;
- }
- }
-
- if (NULL != pcbDecoded) {
- *pcbDecoded = cbDecoded;
- }
-
- if (cbDecodeBufferSize == 0 && pDecodeBuffer == NULL) {
- return ERROR_SUCCESS;
- }
-
- if (cbDecoded > cbDecodeBufferSize) {
- // Supplied buffer is too small.
- return ERROR_INSUFFICIENT_BUFFER;
- }
-
- // Decode each four-byte cluster into the corresponding three data bytes.
- ich = ib = 0;
- while (ich < cchEncodedSize) {
- b0 = DECODE(pszEncodedString[ich]); ich++;
- b1 = DECODE(pszEncodedString[ich]); ich++;
- b2 = DECODE(pszEncodedString[ich]); ich++;
- b3 = DECODE(pszEncodedString[ich]); ich++;
-
- if ((NA == b0) || (NA == b1) || (NA == b2) || (NA == b3)) {
- // Contents of input string are not base64.
- return ERROR_INVALID_PARAMETER;
- }
-
- pbDecodeBuffer[ib++] = (b0 << 2) | (b1 >> 4);
-
- if (ib < cbDecoded) {
- pbDecodeBuffer[ib++] = (b1 << 4) | (b2 >> 2);
-
- if (ib < cbDecoded) {
- pbDecodeBuffer[ib++] = (b2 << 6) | b3;
- }
- }
- }
-
- DBG_ASSERT(ib == cbDecoded);
-
- return ERROR_SUCCESS;
-}
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx
deleted file mode 100644
index a856b997f1..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/datetime.cxx
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-static const CHAR* s_rgchMonths[] = {
- "Jan", "Feb", "Mar", "Apr",
- "May", "Jun", "Jul", "Aug",
- "Sep", "Oct", "Nov", "Dec"
-};
-
-// Custom hash table for make_month() for mapping "Apr" to 4
-static const CHAR MonthIndexTable[64] = {
- -1,'A', 2, 12, -1, -1, -1, 8, // A to G
- -1, -1, -1, -1, 7, -1,'N', -1, // F to O
- 9, -1,'R', -1, 10, -1, 11, -1, // P to W
- -1, 5, -1, -1, -1, -1, -1, -1, // X to Z
- -1,'A', 2, 12, -1, -1, -1, 8, // a to g
- -1, -1, -1, -1, 7, -1,'N', -1, // f to o
- 9, -1,'R', -1, 10, -1, 11, -1, // p to w
- -1, 5, -1, -1, -1, -1, -1, -1 // x to z
-};
-
-static const BYTE TensDigit[10] = { 0, 10, 20, 30, 40, 50, 60, 70, 80, 90 };
-
-WORD
-iis_2atoi(
- __in_ecount(2) PCHAR s
- )
-/*++
-
- Converts a 2 character string to integer
-
- Arguments:
- s String to convert
-
- Returns:
- numeric equivalent, 0 on failure.
---*/
-{
-
- DWORD tens = s[0] - '0';
- DWORD ones = s[1] - '0';
-
- if ( (tens <= 9) && (ones <= 9) ) {
- return((WORD)(TensDigit[tens] + ones));
- }
- return(0);
-}
-
-WORD
-make_month(
- __in_ecount(3) PCHAR s
- )
-{
- UCHAR monthIndex;
- UCHAR c;
- LPCSTR monthString;
-
- //
- // use the third character as the index
- //
-
- c = (s[2] - 0x40) & 0x3F;
-
- monthIndex = MonthIndexTable[c];
-
- if ( monthIndex < 13 ) {
- goto verify;
- }
-
- //
- // ok, we need to look at the second character
- //
-
- if ( monthIndex == 'N' ) {
-
- //
- // we got an N which we need to resolve further
- //
-
- //
- // if s[1] is 'u' then Jun, if 'a' then Jan
- //
-
- if ( MonthIndexTable[(s[1]-0x40) & 0x3f] == 'A' ) {
- monthIndex = 1;
- } else {
- monthIndex = 6;
- }
-
- } else if ( monthIndex == 'R' ) {
-
- //
- // if s[1] is 'a' then March, if 'p' then April
- //
-
- if ( MonthIndexTable[(s[1]-0x40) & 0x3f] == 'A' ) {
- monthIndex = 3;
- } else {
- monthIndex = 4;
- }
- } else {
- goto error_exit;
- }
-
-verify:
-
- monthString = s_rgchMonths[monthIndex-1];
-
- if ( (s[0] == monthString[0]) &&
- (s[1] == monthString[1]) &&
- (s[2] == monthString[2]) ) {
-
- return(monthIndex);
-
- } else if ( (toupper(s[0]) == monthString[0]) &&
- (tolower(s[1]) == monthString[1]) &&
- (tolower(s[2]) == monthString[2]) ) {
-
- return monthIndex;
- }
-
-error_exit:
- return(0);
-
-} // make_month
-
-BOOL
-StringTimeToFileTime(
- IN const CHAR * pszTime,
- OUT ULONGLONG * pulTime
- )
-/*++
-
- Converts a string representation of a GMT time (three different
- varieties) to an NT representation of a file time.
-
- We handle the following variations:
-
- Sun, 06 Nov 1994 08:49:37 GMT (RFC 822 updated by RFC 1123)
- Sunday, 06-Nov-94 08:49:37 GMT (RFC 850)
- Sun Nov 6 08:49:37 1994 (ANSI C's asctime() format
-
- Arguments:
- pszTime String representation of time field
- pliTime large integer containing the time in NT format.
-
- Returns:
- TRUE on success and FALSE on failure.
-
- History:
-
- Johnl 24-Jan-1995 Modified from WWW library
-
---*/
-{
-
- CHAR * s;
- SYSTEMTIME st;
-
- if (pszTime == NULL) {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
-
- st.wMilliseconds = 0;
-
- if ((s = (CHAR*) strchr(pszTime, ','))) {
-
- DWORD len;
-
- //
- // Thursday, 10-Jun-93 01:29:59 GMT
- // or: Thu, 10 Jan 1993 01:29:59 GMT */
- //
-
- s++;
-
- while (*s && *s==' ') s++;
- len = (DWORD)strlen(s);
-
- if (len < 18) {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
-
- if ( *(s+2) == '-' ) { /* First format */
-
- st.wDay = (WORD) atoi(s);
- st.wMonth = (WORD) make_month(s+3);
- st.wYear = (WORD) atoi(s+7);
- st.wHour = (WORD) atoi(s+10);
- st.wMinute = (WORD) atoi(s+13);
- st.wSecond = (WORD) atoi(s+16);
-
- } else { /* Second format */
-
- if (len < 20) {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
-
- st.wDay = iis_2atoi(s);
- st.wMonth = make_month(s+3);
- st.wYear = iis_2atoi(s+7) * 100 + iis_2atoi(s+9);
- st.wHour = iis_2atoi(s+12);
- st.wMinute = iis_2atoi(s+15);
- st.wSecond = iis_2atoi(s+18);
-
- }
- } else { /* Try the other format: Wed Jun 9 01:29:59 1993 GMT */
-
- s = (CHAR *) pszTime;
- while (*s && *s==' ') s++;
-
- if ((int)strlen(s) < 24) {
- SetLastError( ERROR_INVALID_PARAMETER );
- return FALSE;
- }
-
- st.wDay = (WORD) atoi(s+8);
- st.wMonth = (WORD) make_month(s+4);
- st.wYear = (WORD) atoi(s+20);
- st.wHour = (WORD) atoi(s+11);
- st.wMinute = (WORD) atoi(s+14);
- st.wSecond = (WORD) atoi(s+17);
- }
-
- //
- // Adjust for dates with only two digits
- //
-
- if ( st.wYear < 1000 ) {
- if ( st.wYear < 50 ) {
- st.wYear += 2000;
- } else {
- st.wYear += 1900;
- }
- }
-
- if (!SystemTimeToFileTime(&st, (FILETIME *)pulTime)) {
- return FALSE;
- }
- return(TRUE);
-}
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx
deleted file mode 100644
index 26eacdb244..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisz.cxx
+++ /dev/null
@@ -1,480 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-
-//#include <dbgutil.h>
-#include <multisz.hxx>
-//# include <auxctrs.h>
-
-#include <tchar.h>
-
-//
-// Private Definitions
-//
-
-#define MAXULONG 4294967295
-#define ISWHITE( ch ) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\r')
-
-//
-// When appending data, this is the extra amount we request to avoid
-// reallocations
-//
-#define STR_SLOP 128
-
-
-DWORD
-MULTISZ::CalcLength( const WCHAR * str,
- LPDWORD pcStrings )
-{
- DWORD count = 0;
- DWORD total = 1;
- DWORD len;
-
- while( *str ) {
- len = (DWORD)(::wcslen( str ) + 1);
- total += len;
- str += len;
- count++;
- }
-
- if( pcStrings != NULL ) {
- *pcStrings = count;
- }
-
- return total;
-
-} // MULTISZ::CalcLength
-
-
-BOOL
-MULTISZ::FindString( const WCHAR * str )
-{
-
- WCHAR * multisz;
-
- //
- // Sanity check.
- //
-
- DBG_ASSERT( QueryStr() != NULL );
- DBG_ASSERT( str != NULL );
- DBG_ASSERT( *str != '\0' );
-
- //
- // Scan it.
- //
-
- multisz = QueryStr();
-
- while( *multisz != '\0' ) {
-
- if( !::wcscmp( multisz, str ) ) {
-
- return TRUE;
-
- }
-
- multisz += ::wcslen( multisz ) + 1;
-
- }
-
- return FALSE;
-
-} // MULTISZ::FindString
-
-
-BOOL
-MULTISZ::FindStringNoCase( const WCHAR * str )
-{
-
- WCHAR * multisz;
-
- //
- // Sanity check.
- //
-
- DBG_ASSERT( QueryStr() != NULL );
- DBG_ASSERT( str != NULL );
- DBG_ASSERT( *str != '\0' );
-
- //
- // Scan it.
- //
-
- multisz = QueryStr();
-
- while( *multisz != '\0' ) {
-
- if( !_wcsicmp( multisz, str ) ) {
-
- return TRUE;
-
- }
-
- multisz += wcslen( multisz ) + 1;
-
- }
-
- return FALSE;
-
-} // MULTISZ::FindStringNoCase
-
-
-VOID
-MULTISZ::AuxInit( const WCHAR * pInit )
-{
- BOOL fRet;
-
- if ( pInit )
- {
- DWORD cStrings;
- int cbCopy = CalcLength( pInit, &cStrings ) * sizeof(WCHAR);
- fRet = Resize( cbCopy );
-
- if ( fRet ) {
- CopyMemory( QueryPtr(), pInit, cbCopy );
- m_cchLen = (cbCopy)/sizeof(WCHAR);
- m_cStrings = cStrings;
- } else {
-// BUFFER::SetValid( FALSE);
- }
-
- } else {
-
- Reset();
-
- }
-
-} // MULTISZ::AuxInit()
-
-
-/*******************************************************************
-
- NAME: MULTISZ::AuxAppend
-
- SYNOPSIS: Appends the string onto the multisz.
-
- ENTRY: Object to append
-********************************************************************/
-
-BOOL MULTISZ::AuxAppend( const WCHAR * pStr, UINT cbStr, BOOL fAddSlop )
-{
- DBG_ASSERT( pStr != NULL );
-
- UINT cbThis = QueryCB();
-
- DBG_ASSERT( cbThis >= 2 );
-
- if( cbThis == 4 ) {
-
- //
- // It's empty, so start at the beginning.
- //
-
- cbThis = 0;
-
- } else {
-
- //
- // It's not empty, so back up over the final terminating NULL.
- //
-
- cbThis -= sizeof(WCHAR);
-
- }
-
- //
- // Only resize when we have to. When we do resize, we tack on
- // some extra space to avoid extra reallocations.
- //
- // Note: QuerySize returns the requested size of the string buffer,
- // *not* the strlen of the buffer
- //
-
- //AcIncrement( CacMultiszAppend);
-
- //
- // Check for the arithmetic overflow
- //
- // ( 2 * sizeof( WCHAR ) ) is for the double terminator
- //
- ULONGLONG cb64Required = (ULONGLONG)cbThis + cbStr + 2 * sizeof(WCHAR);
- if ( cb64Required > MAXULONG )
- {
- SetLastError( ERROR_ARITHMETIC_OVERFLOW );
- return FALSE;
- }
- if ( QuerySize() < (DWORD) cb64Required )
- {
- ULONGLONG cb64AllocSize = cb64Required + (fAddSlop ? STR_SLOP : 0 );
- //
- // Check for the arithmetic overflow
- //
- if ( cb64AllocSize > MAXULONG )
- {
- SetLastError( ERROR_ARITHMETIC_OVERFLOW );
- return FALSE;
- }
- if ( !Resize( (DWORD) cb64AllocSize ) )
- return FALSE;
- }
-
- // copy the exact string and tack on the double terminator
- memcpy( (BYTE *) QueryPtr() + cbThis,
- pStr,
- cbStr);
- *(WCHAR *)((BYTE *)QueryPtr() + cbThis + cbStr) = L'\0';
- *(WCHAR *)((BYTE *)QueryPtr() + cbThis + cbStr + sizeof(WCHAR) ) = L'\0';
-
- m_cchLen = CalcLength( (const WCHAR *)QueryPtr(), &m_cStrings );
- return TRUE;
-
-} // MULTISZ::AuxAppend()
-
-
-#if 0
-
-BOOL
-MULTISZ::CopyToBuffer( WCHAR * lpszBuffer, LPDWORD lpcch) const
-/*++
- Description:
- Copies the string into the WCHAR buffer passed in if the buffer
- is sufficient to hold the translated string.
- If the buffer is small, the function returns small and sets *lpcch
- to contain the required number of characters.
-
- Arguments:
- lpszBuffer pointer to WCHAR buffer which on return contains
- the UNICODE version of string on success.
- lpcch pointer to DWORD containing the length of the buffer.
- If *lpcch == 0 then the function returns TRUE with
- the count of characters required stored in *lpcch.
- Also in this case lpszBuffer is not affected.
- Returns:
- TRUE on success.
- FALSE on failure. Use GetLastError() for further details.
-
- History:
- MuraliK 11-30-94
---*/
-{
- BOOL fReturn = TRUE;
-
- if ( lpcch == NULL) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return ( FALSE);
- }
-
- if ( *lpcch == 0) {
-
- //
- // Inquiring the size of buffer alone
- //
- *lpcch = QueryCCH() + 1; // add one character for terminating null
- } else {
-
- //
- // Copy after conversion from ANSI to Unicode
- //
- int iRet;
- iRet = MultiByteToWideChar( CP_ACP,
- MB_PRECOMPOSED | MB_ERR_INVALID_CHARS,
- QueryStrA(), QueryCCH() + 1,
- lpszBuffer, (int )*lpcch);
-
- if ( iRet == 0 || iRet != (int ) *lpcch) {
-
- //
- // Error in conversion.
- //
- fReturn = FALSE;
- }
- }
-
- return ( fReturn);
-} // MULTISZ::CopyToBuffer()
-#endif
-
-BOOL
-MULTISZ::CopyToBuffer( __out_ecount_opt(*lpcch) WCHAR * lpszBuffer, LPDWORD lpcch) const
-/*++
- Description:
- Copies the string into the WCHAR buffer passed in if the buffer
- is sufficient to hold the translated string.
- If the buffer is small, the function returns small and sets *lpcch
- to contain the required number of characters.
-
- Arguments:
- lpszBuffer pointer to WCHAR buffer which on return contains
- the string on success.
- lpcch pointer to DWORD containing the length of the buffer.
- If *lpcch == 0 then the function returns TRUE with
- the count of characters required stored in lpcch.
- Also in this case lpszBuffer is not affected.
- Returns:
- TRUE on success.
- FALSE on failure. Use GetLastError() for further details.
-
- History:
- MuraliK 20-Nov-1996
---*/
-{
- BOOL fReturn = TRUE;
-
- if ( lpcch == NULL) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return ( FALSE);
- }
-
- register DWORD cch = QueryCCH();
-
- if ( *lpcch >= cch) {
-
- DBG_ASSERT( lpszBuffer);
- memcpy( lpszBuffer, QueryStr(), cch * sizeof(WCHAR));
- } else {
- DBG_ASSERT( *lpcch < cch);
- SetLastError( ERROR_INSUFFICIENT_BUFFER);
- fReturn = FALSE;
- }
-
- *lpcch = cch;
-
- return ( fReturn);
-} // MULTISZ::CopyToBuffer()
-
-BOOL
-MULTISZ::Equals(
- MULTISZ* pmszRhs
-)
-//
-// Compares this to pmszRhs, returns TRUE if equal
-//
-{
- DBG_ASSERT( NULL != pmszRhs );
-
- PCWSTR pszLhs = First( );
- PCWSTR pszRhs = pmszRhs->First( );
-
- if( m_cStrings != pmszRhs->m_cStrings )
- {
- return FALSE;
- }
-
- while( NULL != pszLhs )
- {
- DBG_ASSERT( NULL != pszRhs );
-
- if( 0 != wcscmp( pszLhs, pszRhs ) )
- {
- return FALSE;
- }
-
- pszLhs = Next( pszLhs );
- pszRhs = pmszRhs->Next( pszRhs );
- }
-
- return TRUE;
-}
-
-HRESULT
-SplitCommaDelimitedString(
- PCWSTR pszList,
- BOOL fTrimEntries,
- BOOL fRemoveEmptyEntries,
- MULTISZ * pmszList
-)
-/*++
-
-Routine Description:
-
- Split comma delimited string into a multisz. Additional leading empty
- entries after the first are discarded.
-
-Arguments:
-
- pszList - List to split up
- fTrimEntries - Whether each entry should be trimmed before added to multisz
- fRemoveEmptyEntries - Whether empty entires should be discarded
- pmszList - Filled with MULTISZ list
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
-
- if ( pszList == NULL ||
- pmszList == NULL )
- {
- DBG_ASSERT( FALSE );
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- goto Finished;
- }
-
- pmszList->Reset();
-
- /*
- pszCurrent: start of the current entry which may be the comma that
- precedes the next entry if the entry is empty
-
- pszNext: the comma that precedes the next entry. If
- pszCurrent == pszNext, then the entry is empty
-
- pszEnd: just past the end of the current entry
- */
-
- for ( PCWSTR pszCurrent = pszList,
- pszNext = wcschr( pszCurrent, L',' )
- ;
- ;
- pszCurrent = pszNext + 1,
- pszNext = wcschr( pszCurrent, L',' ) )
- {
- PCWSTR pszEnd = NULL;
-
- if ( pszNext != NULL )
- {
- pszEnd = pszNext;
- }
- else
- {
- pszEnd = pszCurrent + wcslen( pszCurrent );
- }
-
- if ( fTrimEntries )
- {
- while ( pszCurrent < pszEnd && ISWHITE( pszCurrent[ 0 ] ) )
- {
- pszCurrent++;
- }
-
- while ( pszEnd > pszCurrent && ISWHITE( pszEnd[ -1 ] ) )
- {
- pszEnd--;
- }
- }
-
- if ( pszCurrent != pszEnd || !fRemoveEmptyEntries )
- {
- if ( !pmszList->Append( pszCurrent, (DWORD) ( pszEnd - pszCurrent ) ) )
- {
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Finished;
- }
- }
-
- if ( pszNext == NULL )
- {
- break;
- }
- }
-
-Finished:
-
- return hr;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx
deleted file mode 100644
index e6972534bb..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/multisza.cxx
+++ /dev/null
@@ -1,414 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-
-//#include <dbgutil.h>
-#include <multisza.hxx>
-//# include <auxctrs.h>
-
-#include <tchar.h>
-
-//
-// Private Definitions
-//
-
-#define MAXULONG 4294967295
-#define ISWHITE( ch ) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\r')
-
-//
-// When appending data, this is the extra amount we request to avoid
-// reallocations
-//
-#define STR_SLOP 128
-
-
-DWORD
-MULTISZA::CalcLength( const CHAR * str,
- LPDWORD pcStrings )
-{
- DWORD count = 0;
- DWORD total = 1;
- DWORD len;
-
- while( *str ) {
- len = (DWORD)(::strlen( str ) + 1);
- total += len;
- str += len;
- count++;
- }
-
- if( pcStrings != NULL ) {
- *pcStrings = count;
- }
-
- return total;
-
-} // MULTISZA::CalcLength
-
-
-BOOL
-MULTISZA::FindString( const CHAR * str )
-{
-
- CHAR * multisz;
-
- //
- // Sanity check.
- //
-
- DBG_ASSERT( QueryStr() != NULL );
- DBG_ASSERT( str != NULL );
- DBG_ASSERT( *str != '\0' );
-
- //
- // Scan it.
- //
-
- multisz = QueryStr();
-
- while( *multisz != '\0' ) {
-
- if( !::strcmp( multisz, str ) ) {
-
- return TRUE;
-
- }
-
- multisz += ::strlen( multisz ) + 1;
-
- }
-
- return FALSE;
-
-} // MULTISZA::FindString
-
-
-BOOL
-MULTISZA::FindStringNoCase( const CHAR * str )
-{
-
- CHAR * multisz;
-
- //
- // Sanity check.
- //
-
- DBG_ASSERT( QueryStr() != NULL );
- DBG_ASSERT( str != NULL );
- DBG_ASSERT( *str != '\0' );
-
- //
- // Scan it.
- //
-
- multisz = QueryStr();
-
- while( *multisz != '\0' ) {
-
- if( !_stricmp( multisz, str ) ) {
-
- return TRUE;
-
- }
-
- multisz += strlen( multisz ) + 1;
-
- }
-
- return FALSE;
-
-} // MULTISZA::FindStringNoCase
-
-
-VOID
-MULTISZA::AuxInit( const CHAR * pInit )
-{
- BOOL fRet;
-
- if ( pInit )
- {
- DWORD cStrings;
- int cbCopy = CalcLength( pInit, &cStrings ) * sizeof(CHAR);
- fRet = Resize( cbCopy );
-
- if ( fRet ) {
- CopyMemory( QueryPtr(), pInit, cbCopy );
- m_cchLen = (cbCopy)/sizeof(CHAR);
- m_cStrings = cStrings;
- } else {
-// BUFFER::SetValid( FALSE);
- }
-
- } else {
-
- Reset();
-
- }
-
-} // MULTISZA::AuxInit()
-
-
-/*******************************************************************
-
- NAME: MULTISZA::AuxAppend
-
- SYNOPSIS: Appends the string onto the MULTISZA.
-
- ENTRY: Object to append
-********************************************************************/
-
-BOOL MULTISZA::AuxAppend( const CHAR * pStr, UINT cbStr, BOOL fAddSlop )
-{
- DBG_ASSERT( pStr != NULL );
-
- UINT cbThis = QueryCB();
-
- if( cbThis == 2 ) {
-
- //
- // It's empty, so start at the beginning.
- //
-
- cbThis = 0;
-
- } else {
-
- //
- // It's not empty, so back up over the final terminating NULL.
- //
-
- cbThis -= sizeof(CHAR);
-
- }
-
- //
- // Only resize when we have to. When we do resize, we tack on
- // some extra space to avoid extra reallocations.
- //
- // Note: QuerySize returns the requested size of the string buffer,
- // *not* the strlen of the buffer
- //
-
- //AcIncrement( CacMultiszAppend);
-
- //
- // Check for the arithmetic overflow
- //
- // ( 2 * sizeof( CHAR ) ) is for the double terminator
- //
- ULONGLONG cb64Required = (ULONGLONG)cbThis + cbStr + 2 * sizeof(CHAR);
- if ( cb64Required > MAXULONG )
- {
- SetLastError( ERROR_ARITHMETIC_OVERFLOW );
- return FALSE;
- }
- if ( QuerySize() < (DWORD) cb64Required )
- {
- ULONGLONG cb64AllocSize = cb64Required + (fAddSlop ? STR_SLOP : 0 );
- //
- // Check for the arithmetic overflow
- //
- if ( cb64AllocSize > MAXULONG )
- {
- SetLastError( ERROR_ARITHMETIC_OVERFLOW );
- return FALSE;
- }
- if ( !Resize( (DWORD) cb64AllocSize ) )
- return FALSE;
- }
-
- // copy the exact string and tack on the double terminator
- memcpy( (BYTE *) QueryPtr() + cbThis,
- pStr,
- cbStr);
- *(CHAR *)((BYTE *)QueryPtr() + cbThis + cbStr) = L'\0';
- *(CHAR *)((BYTE *)QueryPtr() + cbThis + cbStr + sizeof(CHAR) ) = L'\0';
-
- m_cchLen = CalcLength( (const CHAR *)QueryPtr(), &m_cStrings );
- return TRUE;
-
-} // MULTISZA::AuxAppend()
-
-BOOL
-MULTISZA::CopyToBuffer( __out_ecount_opt(*lpcch) CHAR * lpszBuffer, LPDWORD lpcch) const
-/*++
- Description:
- Copies the string into the CHAR buffer passed in if the buffer
- is sufficient to hold the translated string.
- If the buffer is small, the function returns small and sets *lpcch
- to contain the required number of characters.
-
- Arguments:
- lpszBuffer pointer to CHAR buffer which on return contains
- the string on success.
- lpcch pointer to DWORD containing the length of the buffer.
- If *lpcch == 0 then the function returns TRUE with
- the count of characters required stored in lpcch.
- Also in this case lpszBuffer is not affected.
- Returns:
- TRUE on success.
- FALSE on failure. Use GetLastError() for further details.
-
- History:
- MuraliK 20-Nov-1996
---*/
-{
- BOOL fReturn = TRUE;
-
- if ( lpcch == NULL) {
- SetLastError( ERROR_INVALID_PARAMETER);
- return ( FALSE);
- }
-
- register DWORD cch = QueryCCH();
-
- if ( *lpcch >= cch) {
-
- DBG_ASSERT( lpszBuffer);
- memcpy( lpszBuffer, QueryStr(), cch * sizeof(CHAR));
- } else {
- DBG_ASSERT( *lpcch < cch);
- SetLastError( ERROR_INSUFFICIENT_BUFFER);
- fReturn = FALSE;
- }
-
- *lpcch = cch;
-
- return ( fReturn);
-} // MULTISZA::CopyToBuffer()
-
-BOOL
-MULTISZA::Equals(
- MULTISZA* pmszRhs
-)
-//
-// Compares this to pmszRhs, returns TRUE if equal
-//
-{
- DBG_ASSERT( NULL != pmszRhs );
-
- PCSTR pszLhs = First( );
- PCSTR pszRhs = pmszRhs->First( );
-
- if( m_cStrings != pmszRhs->m_cStrings )
- {
- return FALSE;
- }
-
- while( NULL != pszLhs )
- {
- DBG_ASSERT( NULL != pszRhs );
-
- if( 0 != strcmp( pszLhs, pszRhs ) )
- {
- return FALSE;
- }
-
- pszLhs = Next( pszLhs );
- pszRhs = pmszRhs->Next( pszRhs );
- }
-
- return TRUE;
-}
-
-HRESULT
-SplitCommaDelimitedString(
- PCSTR pszList,
- BOOL fTrimEntries,
- BOOL fRemoveEmptyEntries,
- MULTISZA * pmszList
-)
-/*++
-
-Routine Description:
-
- Split comma delimited string into a MULTISZA. Additional leading empty
- entries after the first are discarded.
-
-Arguments:
-
- pszList - List to split up
- fTrimEntries - Whether each entry should be trimmed before added to MULTISZA
- fRemoveEmptyEntries - Whether empty entires should be discarded
- pmszList - Filled with MULTISZA list
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
-
- if ( pszList == NULL ||
- pmszList == NULL )
- {
- DBG_ASSERT( FALSE );
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- goto Finished;
- }
-
- pmszList->Reset();
-
- /*
- pszCurrent: start of the current entry which may be the comma that
- precedes the next entry if the entry is empty
-
- pszNext: the comma that precedes the next entry. If
- pszCurrent == pszNext, then the entry is empty
-
- pszEnd: just past the end of the current entry
- */
-
- for ( PCSTR pszCurrent = pszList,
- pszNext = strchr( pszCurrent, L',' )
- ;
- ;
- pszCurrent = pszNext + 1,
- pszNext = strchr( pszCurrent, L',' ) )
- {
- PCSTR pszEnd = NULL;
-
- if ( pszNext != NULL )
- {
- pszEnd = pszNext;
- }
- else
- {
- pszEnd = pszCurrent + strlen( pszCurrent );
- }
-
- if ( fTrimEntries )
- {
- while ( pszCurrent < pszEnd && ISWHITE( pszCurrent[ 0 ] ) )
- {
- pszCurrent++;
- }
-
- while ( pszEnd > pszCurrent && ISWHITE( pszEnd[ -1 ] ) )
- {
- pszEnd--;
- }
- }
-
- if ( pszCurrent != pszEnd || !fRemoveEmptyEntries )
- {
- if ( !pmszList->Append( pszCurrent, (DWORD) ( pszEnd - pszCurrent ) ) )
- {
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Finished;
- }
- }
-
- if ( pszNext == NULL )
- {
- break;
- }
- }
-
-Finished:
-
- return hr;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx
deleted file mode 100644
index 48b41fdd1c..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/normalize.cxx
+++ /dev/null
@@ -1,890 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-#include "normalize.h"
-#include "stringa.h"
-
-BOOL g_fEnableNonUTF8;
-BOOL g_fEnableDBCS;
-BOOL g_fIsSystemDBCS;
-static BOOL g_fFavorDBCS;
-
-#ifndef STACK_STRA
-#define STACK_STRA(name, size) CHAR __ach##name[size]; \
- STRA name(__ach##name, sizeof(__ach##name) / sizeof(CHAR))
-#endif
-
-HRESULT
-InitializeNormalizeUrl(
- VOID
-)
-{
- HKEY hKey;
- DWORD dwType;
- DWORD dwData;
- DWORD cbData;
- WORD wPrimaryLangID;
-
- //
- // Read the registry settings on how to handle URLs
- //
-
- g_fEnableNonUTF8 = TRUE;
- g_fEnableDBCS = FALSE;
- g_fFavorDBCS = FALSE;
-
- if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
- L"System\\CurrentControlSet\\Services\\http\\Parameters",
- 0,
- KEY_READ,
- &hKey ) == ERROR_SUCCESS )
- {
- cbData = sizeof( dwData );
- if ( RegQueryValueEx( hKey,
- L"EnableNonUTF8",
- NULL,
- &dwType,
- (LPBYTE) &dwData,
- &cbData ) == ERROR_SUCCESS &&
- dwType == REG_DWORD )
- {
- g_fEnableNonUTF8 = !!dwData;
- }
-
- if ( g_fEnableNonUTF8 )
- {
- cbData = sizeof( dwData );
-
- if ( RegQueryValueEx( hKey,
- L"EnableDBCS",
- NULL,
- &dwType,
- (LPBYTE) &dwData,
- &cbData ) == ERROR_SUCCESS &&
- dwType == REG_DWORD )
- {
- g_fEnableDBCS = !!dwData;
- }
- }
- else
- {
- g_fEnableDBCS = FALSE;
- }
-
- if ( g_fEnableDBCS )
- {
- cbData = sizeof( dwData );
-
- if ( RegQueryValueEx( hKey,
- L"FavorDBCS",
- NULL,
- &dwType,
- (LPBYTE) &dwData,
- &cbData ) == ERROR_SUCCESS &&
- dwType == REG_DWORD )
- {
- g_fFavorDBCS = !!dwData;
- }
- }
- else
- {
- g_fFavorDBCS = FALSE;
- }
-
- RegCloseKey( hKey );
- }
-
-
- wPrimaryLangID = PRIMARYLANGID( GetSystemDefaultLangID() );
-
- g_fIsSystemDBCS = ( wPrimaryLangID == LANG_JAPANESE ||
- wPrimaryLangID == LANG_CHINESE ||
- wPrimaryLangID == LANG_KOREAN );
-
- return NO_ERROR;
-}
-
-//
-// Private constants.
-//
-
-#define ACTION_NOTHING 0x00000000
-#define ACTION_EMIT_CH 0x00010000
-#define ACTION_EMIT_DOT_CH 0x00020000
-#define ACTION_EMIT_DOT_DOT_CH 0x00030000
-#define ACTION_BACKUP 0x00040000
-#define ACTION_MASK 0xFFFF0000
-
-
-//
-// Private globals.
-//
-
-INT p_StateTable[16] =
- {
- // state 0
- 0 , // other
- 0 , // "."
- 4 , // EOS
- 1 , // "\"
-
- // state 1
- 0 , // other
- 2 , // "."
- 4 , // EOS
- 1 , // "\"
-
- // state 2
- 0 , // other
- 3 , // "."
- 4 , // EOS
- 1 , // "\"
-
- // state 3
- 0 , // other
- 0 , // "."
- 4 , // EOS
- 1 // "\"
- };
-
-
-
-INT p_ActionTable[16] =
- {
- // state 0
- ACTION_EMIT_CH, // other
- ACTION_EMIT_CH, // "."
- ACTION_EMIT_CH, // EOS
- ACTION_EMIT_CH, // "\"
-
- // state 1
- ACTION_EMIT_CH, // other
- ACTION_NOTHING, // "."
- ACTION_EMIT_CH, // EOS
- ACTION_NOTHING, // "\"
-
- // state 2
- ACTION_EMIT_DOT_CH, // other
- ACTION_NOTHING, // "."
- ACTION_EMIT_CH, // EOS
- ACTION_NOTHING, // "\"
-
- // state 3
- ACTION_EMIT_DOT_DOT_CH, // other
- ACTION_EMIT_DOT_DOT_CH, // "."
- ACTION_BACKUP, // EOS
- ACTION_BACKUP // "\"
- };
-
-// since max states = 4, we calculat the index by multiplying with 4.
-# define IndexFromState( st) ( (st) * 4)
-
-
-// the following table provides the index for various ISA Latin1 characters
-// in the incoming URL.
-// It assumes that the URL is ISO Latin1 == ASCII
-INT p_rgIndexForChar[] = {
-
- 2, // null char
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1 thru 10
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 11 thru 20
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 21 thru 30
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 31 thru 40
- 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, // 41 thru 50 46 = '.' 47 = '/'
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 51 thru 60
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 61 thru 70
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 71 thru 80
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 81 thru 90
- 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, // 91 thru 100 92 = '\\'
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 101 thru 110
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 111 thru 120
- 0, 0, 0, 0, 0, 0, 0, 0 // 121 thru 128
-};
-
-#define IS_UTF8_TRAILBYTE(ch) (((ch) & 0xc0) == 0x80)
-
-
-/*******************************************************************
-
- NAME: IsUTF8URL
-
- ENTRY: pszPath - The path to sanitize.
-
- HISTORY:
- atsusk 06-Jan-1998 Created.
-
-********************************************************************/
-
-BOOL IsUTF8URL(__in LPSTR pszPath)
-{
- CHAR ch;
-
- if ( g_fFavorDBCS )
- {
- return ( MultiByteToWideChar( CP_ACP,
- MB_ERR_INVALID_CHARS,
- pszPath,
- -1,
- NULL,
- 0) == 0);
- }
-
- while (ch = *pszPath++) {
-
- if (ch & 0x80) {
- wchar_t wch;
- int iLen;
- BOOL bDefault = FALSE;
- char chTrail1;
- char chTrail2;
-
- chTrail1 = *pszPath++;
- if (chTrail1) {
- chTrail2 = *pszPath;
- } else {
- chTrail2 = 0;
- }
-
- if ( ((ch & 0xF0) == 0xE0) &&
- IS_UTF8_TRAILBYTE(chTrail1) &&
- IS_UTF8_TRAILBYTE(chTrail2) ) {
-
- // handle three byte case
- // 1110xxxx 10xxxxxx 10xxxxxx
- wch = (wchar_t) (((ch & 0x0f) << 12) |
- ((chTrail1 & 0x3f) << 6) |
- (chTrail2 & 0x3f));
- pszPath++;
-
- } else
- if ( ((ch & 0xE0) == 0xC0) &&
- IS_UTF8_TRAILBYTE(chTrail1) ) {
-
- // handle two byte case
- // 110xxxxx 10xxxxxx
-
- wch = (wchar_t) (((ch & 0x1f) << 6) | (chTrail1 & 0x3f));
-
- } else
- return FALSE;
-
- iLen = WideCharToMultiByte( CP_ACP,
- WC_NO_BEST_FIT_CHARS,
- &wch,
- 1,
- NULL,
- 0,
- NULL,
- &bDefault );
-
- if (bDefault == TRUE || iLen == 0 || iLen > 2)
- return FALSE;
- }
- }
-
- return TRUE;
-} // IsUTF8URL()
-
-
-/*******************************************************************
-
- NAME: CanonURL
-
- SYNOPSIS: Sanitizes a path by removing bogus path elements.
-
- As expected, "/./" entries are simply removed, and
- "/../" entries are removed along with the previous
- path element.
-
- To maintain compatibility with URL path semantics
- additional transformations are required. All backward
- slashes "\\" are converted to forward slashes. Any
- repeated forward slashes (such as "///") are mapped to
- single backslashes.
-
- A state table (see the p_StateTable global at the
- beginning of this file) is used to perform most of
- the transformations. The table's rows are indexed
- by current state, and the columns are indexed by
- the current character's "class" (either slash, dot,
- NULL, or other). Each entry in the table consists
- of the new state tagged with an action to perform.
- See the ACTION_* constants for the valid action
- codes.
-
- ENTRY: pszPath - The path to sanitize.
- fIsDBCSLocale - Indicates the server is in a
- locale that uses DBCS.
-
- HISTORY:
- KeithMo 07-Sep-1994 Created.
- MuraliK 28-Apr-1995 Adopted this for symbolic paths
-
-********************************************************************/
-INT
-CanonURL(
- __inout LPSTR pszPath,
- BOOL fIsDBCSLocale
- )
-{
- UCHAR * pszSrc;
- UCHAR * pszDest;
- DWORD ch;
- INT index;
- BOOL fDBCS = FALSE;
- DWORD cchMultiByte = 0;
-
- DBG_ASSERT( pszPath != NULL );
-
- //
- // Always look for UTF8 except when DBCS characters are detected
- //
- BOOL fScanForUTF8 = IsUTF8URL(pszPath);
-
- // If fScanForUTF8 is true, this URL is UTF8. don't recognize DBCS.
- if (fIsDBCSLocale && fScanForUTF8) {
- fIsDBCSLocale = FALSE;
- }
-
- //
- // Start our scan at the first character
- //
-
- pszSrc = pszDest = (UCHAR *) pszPath;
-
- //
- // State 0 is the initial state.
- //
- index = 0; // State = 0
-
- //
- // Loop until we enter state 4 (the final, accepting state).
- //
-
- do {
-
- //
- // Grab the next character from the path and compute its
- // next state. While we're at it, map any forward
- // slashes to backward slashes.
- //
-
- index = IndexFromState( p_StateTable[index]); // 4 = # states
- ch = (DWORD ) *pszSrc++;
-
- //
- // If this is a DBCS trailing byte - skip it
- //
-
- if ( !fIsDBCSLocale )
- {
- index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]);
- }
- else
- {
- if ( fDBCS )
- {
- //
- // If this is a 0 terminator, we need to set next
- // state accordingly
- //
-
- if ( ch == 0 )
- {
- index += p_rgIndexForChar[ ch ];
- }
-
- //
- // fDBCS == TRUE means this byte was a trail byte.
- // index is implicitly set to zero.
- //
- fDBCS = FALSE;
- }
- else
- {
- index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]);
-
- if ( IsDBCSLeadByte( (UCHAR)ch ) )
- {
- //
- // This is a lead byte, so the next is a trail.
- //
- fDBCS = TRUE;
- }
- }
- }
-
- //
- // Interesting UTF8 characters always have the top bit set
- //
-
- if ( (ch & 0x80) && fScanForUTF8 )
- {
- wchar_t wch;
- UCHAR mbstr[2];
-
- //
- // This is a UTF8 character, convert it here.
- // index is implicitly set to zero.
- //
- if ( cchMultiByte < 2 )
- {
- char chTrail1;
- char chTrail2;
-
- chTrail1 = *pszSrc;
- if (chTrail1) {
- chTrail2 = *(pszSrc+1);
- } else {
- chTrail2 = 0;
- }
- wch = 0;
-
- if ((ch & 0xf0) == 0xe0)
- {
- // handle three byte case
- // 1110xxxx 10xxxxxx 10xxxxxx
-
- wch = (wchar_t) (((ch & 0x0f) << 12) |
- ((chTrail1 & 0x3f) << 6) |
- (chTrail2 & 0x3f));
-
- cchMultiByte = WideCharToMultiByte( CP_ACP,
- WC_NO_BEST_FIT_CHARS,
- &wch,
- 1,
- (LPSTR) mbstr,
- 2,
- NULL,
- NULL );
-
- ch = mbstr[0];
- pszSrc += (3 - cchMultiByte);
-
- // WinSE 12843: Security Fix, Index should be updated for this character
- index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]);
-
- } else if ((ch & 0xe0) == 0xc0)
- {
- // handle two byte case
- // 110xxxxx 10xxxxxx
-
- wch = (wchar_t) (((ch & 0x1f) << 6) | (chTrail1 & 0x3f));
-
- cchMultiByte = WideCharToMultiByte( CP_ACP,
- WC_NO_BEST_FIT_CHARS,
- &wch,
- 1,
- (LPSTR) mbstr,
- 2,
- NULL,
- NULL );
-
- ch = mbstr[0];
- pszSrc += (2 - cchMultiByte);
-
- // WinSE 12843: Security Fix, Index should be updated for this character
- index += (( ch >= 0x80) ? 0 : p_rgIndexForChar[ch]);
- }
-
- } else {
- //
- // get ready to emit 2nd byte of converted character
- //
- ch = mbstr[1];
- cchMultiByte = 0;
- }
- }
-
-
- //
- // Perform the action associated with the state.
- //
-
- switch( p_ActionTable[index] )
- {
- case ACTION_EMIT_DOT_DOT_CH :
- *pszDest++ = '.';
- /* fall through */
-
- case ACTION_EMIT_DOT_CH :
- *pszDest++ = '.';
- /* fall through */
-
- case ACTION_EMIT_CH :
- *pszDest++ = (CHAR ) ch;
- /* fall through */
-
- case ACTION_NOTHING :
- break;
-
- case ACTION_BACKUP :
- if( (pszDest > ( (UCHAR *) pszPath + 1 ) ) && (*pszPath == '/'))
- {
- pszDest--;
- DBG_ASSERT( *pszDest == '/' );
-
- *pszDest = '\0';
- pszDest = (UCHAR *) strrchr( pszPath, '/') + 1;
- }
-
- *pszDest = '\0';
- break;
-
- default :
- DBG_ASSERT( !"Invalid action code in state table!" );
- index = IndexFromState(0) + 2; // move to invalid state
- DBG_ASSERT( p_StateTable[index] == 4);
- *pszDest++ = '\0';
- break;
- }
-
- } while( p_StateTable[index] != 4 );
-
- //
- // point to terminating nul
- // only do the check if we aren't about to go outside of the number
- // of elements in the table.
- //
- if ( ( index < ( sizeof(p_ActionTable) / sizeof(p_ActionTable[0]) ) )
- && p_ActionTable[index] == ACTION_EMIT_CH )
- {
- pszDest--;
- }
-
- DBG_ASSERT(*pszDest == '\0' && pszDest > (UCHAR*) pszPath);
-
- return (INT)DIFF(pszDest - (UCHAR*)pszPath);
-} // CanonURL()
-
-
-
-HRESULT
-NormalizeUrl(
- __inout LPSTR pszStart
- )
-/*++
-
-Routine Description:
-
- Normalize URL
-
-Arguments:
-
- strUrl - URL to be updated to a canonical URI
-
-Return value:
-
- TRUE if no error, otherwise FALSE
-
---*/
-{
- CHAR * pchParams;
- LPSTR pszSlash;
- LPSTR pszURL;
- LPSTR pszValue;
- STACK_STRA( strChgUrl, MAX_PATH );
- HRESULT hr;
- DWORD cchInput;
-
- if ( pszStart == NULL )
- {
- return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- }
-
- cchInput = (DWORD)strlen( pszStart );
-
- if ( *pszStart != '/' )
- {
- //
- // assume HTTP URL, skip protocol & host name by
- // searching for 1st '/' following "//"
- //
- // We handle this information as a "Host:" header.
- // It will be overwritten by the real header if it is
- // present.
- //
- // We do not check for a match in this case.
- //
-
- if ( (pszSlash = strchr( pszStart, '/' )) && pszSlash[1] == '/' )
- {
- pszSlash += 2;
- if ( pszURL = strchr( pszSlash, '/' ) )
- {
- //
- // update pointer to URL to point to the 1st slash
- // following host name
- //
-
- pszValue = pszURL;
- }
- else
- {
- //
- // if no single slash following host name
- // consider the URL to be empty.
- //
-
- pszValue = pszSlash + strlen( pszSlash );
- }
-
- memmove( pszStart, pszValue, strlen(pszValue)+1 );
- }
-
- //
- // if no double slash, this is not a fully qualified URL
- // and we leave it alone.
- //
- }
-
- //
- // Check for a question mark which indicates this URL contains some
- // parameters and break the two apart if found
- //
-
- if ( (pchParams = strchr( pszStart, '?' )) )
- {
- *pchParams = '\0';
- }
-
- //
- // Unescape wants a STR ( sigh )
- //
-
- hr = strChgUrl.Copy( (CHAR*)pszStart );
-
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- strChgUrl.Unescape();
-
- hr = StringCchCopyNA( pszStart, cchInput + 1, strChgUrl.QueryStr(), cchInput );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- //
- // Canonicalize the URL
- //
-
- CanonURL( pszStart, g_fIsSystemDBCS );
-
- return NO_ERROR;
-}
-
-
-
-
-HRESULT
-NormalizeUrlOld(
- __inout LPSTR pszUrl
-)
-/*++
-
-Routine Description:
-
- NormalizeUrl wrapper (used by ISAPI filter and extension support functions)
-
-Parameters:
-
- pszUrl - On entry, the URL to be normalized
- On return, the normalized URL
- (size of normalized URL is always <= not normalized URL)
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = NO_ERROR;
-
- if ( pszUrl )
- {
- STACK_BUFFER( buffUrlOutput, MAX_PATH );
- STACK_STRA( strUrlA, MAX_PATH );
- LPWSTR szQueryString;
- DWORD cchData;
- DWORD cbOutput;
-
- cchData = (DWORD)strlen( pszUrl );
-
- //
- // Prepare the Output string
- //
-
- if ( !buffUrlOutput.Resize( ( cchData + 1 ) *sizeof( WCHAR ) ) )
- {
- return HRESULT_FROM_WIN32( GetLastError() );
- }
-
- //
- // Normalize it
- //
-
- hr = UlCleanAndCopyUrl(
- pszUrl,
- cchData,
- &cbOutput,
- (WCHAR *) buffUrlOutput.QueryPtr(),
- &szQueryString
- );
-
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- //
- // Terminate the string at the query so that the
- // query string doesn't appear in the output. IIS 5
- // truncated in this way.
- //
-
- if ( szQueryString != NULL )
- {
- ((WCHAR *) buffUrlOutput.QueryPtr())[ cbOutput - wcslen( szQueryString )] = 0;
- }
-
- //
- // Write the normalized URL over the input data
- //
-
- hr = strUrlA.CopyW( (WCHAR *) buffUrlOutput.QueryPtr() );
-
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- //
- // Normalized string will never be longer than the original one
- //
-
- DBG_ASSERT( strUrlA.QueryCCH() <= cchData );
-
- hr = StringCchCopyA( pszUrl, cchData + 1, strUrlA.QueryStr() );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- hr = NO_ERROR;
- }
- else
- {
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- }
- return hr;
-}
-
-
-HRESULT
-NormalizeUrlW(
- __inout LPWSTR pszUrl
-)
-/*++
-
-Routine Description:
-
- unicode version of NormalizeUrl wrapper (used by ISAPI filter and extension support functions)
-
-Parameters:
-
- pszUrl - On entry, the URL to be normalized
- On return, the normalized URL
- (size of normalized URL is always <= not normalized URL)
-
-Return Value:
-
- HRESULT
-
---*/
-{
-
- HRESULT hr = NO_ERROR;
-
- if ( pszUrl )
- {
- STACK_BUFFER( buffUrlOutput, MAX_PATH );
- STACK_STRA( strUrlA, MAX_PATH );
- LPWSTR szQueryString;
- DWORD cchData;
- DWORD cbOutput;
-
- cchData = (DWORD)wcslen( pszUrl );
-
- hr = strUrlA.CopyWToUTF8Escaped( pszUrl );
-
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- //
- // Prepare Output string
- //
-
- if ( !buffUrlOutput.Resize( ( cchData + 1 ) *sizeof( WCHAR ) ) )
- {
- return HRESULT_FROM_WIN32( GetLastError() );
- }
-
- //
- // Normalize it
- //
-
- hr = UlCleanAndCopyUrl(
- strUrlA.QueryStr(),
- strUrlA.QueryCB(),
- &cbOutput,
- (WCHAR *) buffUrlOutput.QueryPtr(),
- &szQueryString
- );
-
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
-
- //
- // Terminate the string at the query so that the
- // query string doesn't appear in the output. IIS 5
- // truncated in this way.
- //
-
- if ( szQueryString != NULL )
- {
- ((WCHAR *) buffUrlOutput.QueryPtr())[ cbOutput - wcslen( szQueryString )] = 0;
- }
-
- //
- // normalized string will never be longer than the original one
- //
-
- DBG_ASSERT( cbOutput <= cchData * sizeof( WCHAR ) );
-
- //
- // Write the normalized URL over the input data
- //
-
- hr = StringCchCopyW( pszUrl, cchData+1, (WCHAR *) buffUrlOutput.QueryPtr() );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- hr = NO_ERROR;
- }
- else
- {
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- }
- return hr;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h
deleted file mode 100644
index 8f578b2ad3..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/precomp.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include <windows.h>
-#include <ahadmin.h>
-#pragma warning( disable:4127 )
-#include <atlcomcli.h>
-#include <strsafe.h>
-#include <intsafe.h>
-
-#include "macros.h"
-#include "stringu.h"
-#include "stringa.h"
-#include "dbgutil.h"
-#include "ntassert.h"
-#include "ahutil.h"
-#include "acache.h"
-#include "base64.hxx"
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp
deleted file mode 100644
index db3ff5460e..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringa.cpp
+++ /dev/null
@@ -1,1767 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-STRA::STRA(
- VOID
-) : m_cchLen( 0 )
-{
- *( QueryStr() ) = '\0';
-}
-
-STRA::STRA(
- __inout_ecount(cchInit) CHAR* pbInit,
- __in DWORD cchInit
-) : m_Buff( pbInit, cchInit * sizeof( CHAR ) ),
- m_cchLen(0)
-/*++
- Description:
-
- Used by STACK_STRA. Initially populates underlying buffer with pbInit.
-
- pbInit is not freed.
-
- Arguments:
-
- pbInit - initial memory to use
- cchInit - count, in characters, of pbInit
-
- Returns:
-
- None.
-
---*/
-{
- _ASSERTE( NULL != pbInit );
- _ASSERTE( cchInit > 0 );
- _ASSERTE( pbInit[0] == '\0' );
-}
-
-BOOL
-STRA::IsEmpty(
- VOID
-) const
-{
- return ( m_cchLen == 0 );
-}
-
-BOOL
-STRA::Equals(
- __in PCSTR pszRhs,
- __in BOOL fIgnoreCase /*= FALSE*/
-) const
-{
- _ASSERTE( NULL != pszRhs );
-
- if( fIgnoreCase )
- {
- return ( 0 == _stricmp( QueryStr(), pszRhs ) );
- }
-
- return ( 0 == strcmp( QueryStr(), pszRhs ) );
-}
-
-BOOL
-STRA::Equals(
- __in const STRA * pstrRhs,
- __in BOOL fIgnoreCase /*= FALSE*/
-) const
-{
- _ASSERTE( NULL != pstrRhs );
- return Equals( pstrRhs->QueryStr(), fIgnoreCase );
-}
-
-BOOL
-STRA::Equals(
- __in const STRA & strRhs,
- __in BOOL fIgnoreCase /*= FALSE*/
-) const
-{
- return Equals( strRhs.QueryStr(), fIgnoreCase );
-}
-
-DWORD
-STRA::QueryCB(
- VOID
-) const
-//
-// Returns the number of bytes in the string excluding the terminating NULL
-//
-{
- return m_cchLen * sizeof( CHAR );
-}
-
-DWORD
-STRA::QueryCCH(
- VOID
-) const
-//
-// Returns the number of characters in the string excluding the terminating NULL
-//
-{
- return m_cchLen;
-}
-
-DWORD
-STRA::QuerySizeCCH(
- VOID
-) const
-//
-// Returns size of the underlying storage buffer, in characters
-//
-{
- return m_Buff.QuerySize() / sizeof( CHAR );
-}
-
-DWORD
-STRA::QuerySize(
- VOID
-) const
-//
-// Returns the size of the storage buffer in bytes
-//
-{
- return m_Buff.QuerySize();
-}
-
-__nullterminated
-__bcount(this->m_cchLen)
-CHAR *
-STRA::QueryStr(
- VOID
-) const
-//
-// Return the string buffer
-//
-{
- return m_Buff.QueryPtr();
-}
-
-VOID
-STRA::Reset(
- VOID
-)
-//
-// Resets the internal string to be NULL string. Buffer remains cached.
-//
-{
- _ASSERTE( QueryStr() != NULL );
- *(QueryStr()) = '\0';
- m_cchLen = 0;
-}
-
-HRESULT
-STRA::Resize(
- __in DWORD cchSize
-)
-{
- if( !m_Buff.Resize( cchSize * sizeof( CHAR ) ) )
- {
- return E_OUTOFMEMORY;
- }
-
- return S_OK;
-}
-
-HRESULT
-STRA::SyncWithBuffer(
- VOID
-)
-//
-// Recalculate the length of the string, etc. because we've modified
-// the buffer directly.
-//
-{
- HRESULT hr;
- size_t size;
- hr = StringCchLengthA( QueryStr(),
- QuerySizeCCH(),
- &size );
- if ( SUCCEEDED( hr ) )
- {
- m_cchLen = static_cast<DWORD>(size);
- }
- return hr;
-}
-
-HRESULT
-STRA::Copy(
- __in PCSTR pszCopy
-)
-{
- HRESULT hr;
- size_t cbLen;
- hr = StringCbLengthA( pszCopy,
- STRSAFE_MAX_CCH,
- &cbLen );
- if ( FAILED( hr ) )
- {
- return hr;
- }
- return Copy( pszCopy, cbLen );
-}
-
-
-HRESULT
-STRA::Copy(
- __in_ecount(cchLen)
- PCSTR pszCopy,
- __in SIZE_T cbLen
-)
-//
-// Copy the contents of another string to this one
-//
-{
- _ASSERTE( cbLen <= MAXDWORD );
-
- return AuxAppend(
- pszCopy,
- static_cast<DWORD>(cbLen),
- 0
- );
-}
-
-HRESULT
-STRA::Copy(
- __in const STRA * pstrRhs
-)
-{
- _ASSERTE( pstrRhs != NULL );
- return Copy( pstrRhs->QueryStr(), pstrRhs->QueryCCH() );
-}
-
-HRESULT
-STRA::Copy(
- __in const STRA & strRhs
-)
-{
- return Copy( strRhs.QueryStr(), strRhs.QueryCCH() );
-}
-
-HRESULT
-STRA::CopyW(
- __in PCWSTR pszCopyW
-)
-{
- HRESULT hr;
- size_t cchLen;
- hr = StringCchLengthW( pszCopyW,
- STRSAFE_MAX_CCH,
- &cchLen );
- if ( FAILED( hr ) )
- {
- return hr;
- }
- return CopyW( pszCopyW, cchLen );
-}
-
-HRESULT
-STRA::CopyWTruncate(
- __in PCWSTR pszCopyWTruncate
-)
-{
- HRESULT hr;
- size_t cchLen;
- hr = StringCchLengthW( pszCopyWTruncate,
- STRSAFE_MAX_CCH,
- &cchLen );
- if ( FAILED( hr ) )
- {
- return hr;
- }
- return CopyWTruncate( pszCopyWTruncate, cchLen );
-}
-
-HRESULT
-STRA::CopyWTruncate(
- __in_ecount(cchLen)
- PCWSTR pszCopyWTruncate,
- __in SIZE_T cchLen
-)
-//
-// The "Truncate" methods do not do proper conversion. They do a (CHAR) caste
-//
-{
- _ASSERTE( cchLen <= MAXDWORD );
-
- return AuxAppendWTruncate(
- pszCopyWTruncate,
- static_cast<DWORD>(cchLen),
- 0
- );
-}
-
-HRESULT
-STRA::Append(
- __in PCSTR pszAppend
-)
-{
- HRESULT hr;
- size_t cbLen;
- hr = StringCbLengthA( pszAppend,
- STRSAFE_MAX_CCH,
- &cbLen );
- if ( FAILED( hr ) )
- {
- return hr;
- }
- return Append( pszAppend, cbLen );
-}
-
-HRESULT
-STRA::Append(
- __in_ecount(cchLen)
- PCSTR pszAppend,
- __in SIZE_T cbLen
-)
-{
- _ASSERTE( cbLen <= MAXDWORD );
- if ( cbLen == 0 )
- {
- return S_OK;
- }
- return AuxAppend(
- pszAppend,
- static_cast<DWORD>(cbLen),
- QueryCB()
- );
-}
-
-HRESULT
-STRA::Append(
- __in const STRA * pstrRhs
-)
-{
- _ASSERTE( pstrRhs != NULL );
- return Append( pstrRhs->QueryStr(), pstrRhs->QueryCCH() );
-}
-
-HRESULT
-STRA::Append(
- __in const STRA & strRhs
-)
-{
- return Append( strRhs.QueryStr(), strRhs.QueryCCH() );
-}
-
-HRESULT
-STRA::AppendWTruncate(
- __in PCWSTR pszAppendWTruncate
-)
-{
- HRESULT hr;
- size_t cchLen;
- hr = StringCchLengthW( pszAppendWTruncate,
- STRSAFE_MAX_CCH,
- &cchLen );
- if ( FAILED( hr ) )
- {
- return hr;
- }
- return AppendWTruncate( pszAppendWTruncate, cchLen );
-}
-
-HRESULT
-STRA::AppendWTruncate(
- __in_ecount(cchLen)
- PCWSTR pszAppendWTruncate,
- __in SIZE_T cchLen
-)
-//
-// The "Truncate" methods do not do proper conversion. They do a (CHAR) caste
-//
-{
- _ASSERTE( cchLen <= MAXDWORD );
- if ( cchLen == 0 )
- {
- return S_OK;
- }
- return AuxAppendWTruncate(
- pszAppendWTruncate,
- static_cast<DWORD>(cchLen),
- QueryCB()
- );
-}
-
-HRESULT
-STRA::CopyToBuffer(
- __out_bcount(*pcb) CHAR* pszBuffer,
- __inout DWORD * pcb
-) const
-//
-// Makes a copy of the stored string into the given buffer
-//
-{
- _ASSERTE( NULL != pszBuffer );
- _ASSERTE( NULL != pcb );
-
- HRESULT hr = S_OK;
- DWORD cbNeeded = QueryCB() + sizeof( CHAR );
-
- if( *pcb < cbNeeded )
- {
- hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
- goto Finished;
- }
-
- memcpy( pszBuffer, QueryStr(), cbNeeded );
-
-Finished:
-
- *pcb = cbNeeded;
-
- return hr;
-}
-
-HRESULT
-STRA::SetLen(
- __in DWORD cchLen
-)
-/*++
- *
-Routine Description:
-
- Set the length of the string and null terminate, if there
- is sufficient buffer already allocated. Will not reallocate.
-
-Arguments:
-
- cchLen - The number of characters in the new string.
-
-Return Value:
-
- HRESULT
-
---*/
-{
- if( cchLen >= QuerySizeCCH() )
- {
- return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- }
-
- *( QueryStr() + cchLen ) = '\0';
- m_cchLen = cchLen;
-
- return S_OK;
-}
-
-
-HRESULT
-STRA::SafeSnprintf(
- __in __format_string
- PCSTR pszFormatString,
- ...
-)
-/*++
-
-Routine Description:
-
- Writes to a STRA, growing it as needed. It arbitrarily caps growth at 64k chars.
-
-Arguments:
-
- pszFormatString - printf format
- ... - printf args
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- va_list argsList;
- va_start( argsList, pszFormatString );
-
- hr = SafeVsnprintf(pszFormatString, argsList);
-
- va_end( argsList );
- return hr;
-}
-
-HRESULT
-STRA::SafeVsnprintf(
- __in __format_string
- PCSTR pszFormatString,
- va_list argsList
-)
-/*++
-
-Routine Description:
-
- Writes to a STRA, growing it as needed. It arbitrarily caps growth at 64k chars.
-
-Arguments:
-
- pszFormatString - printf format
- argsList - printf va_list
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- int cchOutput;
- int cchNeeded;
-
- //
- // Format the incoming message using vsnprintf()
- // so that the overflows are captured
- //
- cchOutput = _vsnprintf_s(
- QueryStr(),
- QuerySizeCCH(),
- QuerySizeCCH() - 1,
- pszFormatString,
- argsList
- );
-
- if( cchOutput == -1 )
- {
- //
- // Couldn't fit this in the original STRU size.
- //
- cchNeeded = _vscprintf( pszFormatString, argsList );
- if( cchNeeded > 64 * 1024 )
- {
- //
- // If we're trying to produce a string > 64k chars, then
- // there is probably a problem
- //
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
- goto Finished;
- }
-
- //
- // _vscprintf doesn't include terminating null character
- //
- cchNeeded++;
-
- hr = Resize( cchNeeded );
- if( FAILED( hr ) )
- {
- goto Finished;
- }
-
- cchOutput = _vsnprintf_s(
- QueryStr(),
- QuerySizeCCH(),
- QuerySizeCCH() - 1,
- pszFormatString,
- argsList
- );
- if( -1 == cchOutput )
- {
- //
- // This should never happen, cause we should already have correctly sized memory
- //
- _ASSERTE( FALSE );
-
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
- goto Finished;
- }
- }
-
- //
- // always null terminate at the last WCHAR
- //
- QueryStr()[ QuerySizeCCH() - 1 ] = L'\0';
-
- //
- // we directly touched the buffer - therefore:
- //
- hr = SyncWithBuffer();
- if( FAILED( hr ) )
- {
- goto Finished;
- }
-
-Finished:
-
- if( FAILED( hr ) )
- {
- Reset();
- }
-
- return hr;
-}
-
-bool
-FShouldEscapeUtf8(
- BYTE ch
- )
-{
- if ( ( ch >= 128 ) )
- {
- return true;
- }
-
- return false;
-}
-
-bool
-FShouldEscapeUrl(
- BYTE ch
- )
-{
- if ( ( ch >= 128 ||
- ch <= 32 ||
- ch == '<' ||
- ch == '>' ||
- ch == '%' ||
- ch == '?' ||
- ch == '#' ) &&
- !( ch == '\n' || ch == '\r' ) )
- {
- return true;
- }
-
- return false;
-}
-
-HRESULT
-STRA::Escape(
- VOID
-)
-/*++
-
-Routine Description:
-
- Escapes a STRA
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-{
- return EscapeInternal( FShouldEscapeUrl );
-}
-
-HRESULT
-STRA::EscapeUtf8(
- VOID
-)
-/*++
-
-Routine Description:
-
- Escapes the high-bit chars in a STRA. LWS, CR, LF & controls are untouched.
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-{
- return EscapeInternal( FShouldEscapeUtf8 );
-}
-
-
-HRESULT
-STRA::EscapeInternal(
- PFN_F_SHOULD_ESCAPE pfnFShouldEscape
-)
-/*++
-
-Routine Description:
-
- Escapes a STRA according to the predicate function passed in
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-{
- LPCSTR pch = QueryStr();
- __analysis_assume( pch != NULL );
- int i = 0;
- BYTE ch;
- HRESULT hr = S_OK;
- BOOL fRet = FALSE;
- SIZE_T NewSize = 0;
-
- // Set to true if any % escaping occurs
- BOOL fEscapingDone = FALSE;
-
- //
- // If there are any characters that need to be escaped we copy the entire string
- // character by character into straTemp, escaping as we go, then at the end
- // copy all of straTemp over. Don't modify InlineBuffer directly.
- //
- CHAR InlineBuffer[512];
- InlineBuffer[0] = '\0';
- STRA straTemp(InlineBuffer, sizeof(InlineBuffer)/sizeof(*InlineBuffer));
-
- _ASSERTE( pch );
-
- while (ch = pch[i])
- {
- //
- // Escape characters that are in the non-printable range
- // but ignore CR and LF
- //
-
- if ( pfnFShouldEscape( ch ) )
- {
- if (FALSE == fEscapingDone)
- {
- // first character in the string that needed escaping
- fEscapingDone = TRUE;
-
- // guess that the size needs to be larger than
- // what we used to have times two
- NewSize = QueryCCH() * 2;
- if ( NewSize > MAXDWORD )
- {
- hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- return hr;
- }
-
- hr = straTemp.Resize( static_cast<DWORD>(NewSize) );
-
- if (FAILED(hr))
- {
- return hr;
- }
-
- // Copy all of the previous buffer into buffTemp, only if it is not the first character:
-
- if ( i > 0)
- {
- hr = straTemp.Copy(QueryStr(),
- i * sizeof(CHAR));
- if (FAILED(hr))
- {
- return hr;
- }
- }
- }
-
- // resize the temporary (if needed) with the slop of the entire buffer length
- // this fixes constant reallocation if the entire string needs to be escaped
- NewSize = QueryCCH() + 2 * sizeof(CHAR) + 1 * sizeof(CHAR);
- if ( NewSize > MAXDWORD )
- {
- hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- return hr;
- }
-
- fRet = straTemp.m_Buff.Resize( NewSize );
- if ( !fRet )
- {
- hr = HRESULT_FROM_WIN32(GetLastError());
- return hr;
- }
-
- //
- // Create the string to append for the current character
- //
-
- CHAR chHex[3];
- chHex[0] = '%';
-
- //
- // Convert the low then the high character to hex
- //
-
- UINT nLowDigit = (UINT)(ch % 16);
- chHex[2] = TODIGIT( nLowDigit );
-
- ch /= 16;
-
- UINT nHighDigit = (UINT)(ch % 16);
-
- chHex[1] = TODIGIT( nHighDigit );
-
- //
- // Actually append the converted character to the end of the temporary
- //
- hr = straTemp.Append(chHex, 3);
- if (FAILED(hr))
- {
- return hr;
- }
- }
- else
- {
- // if no escaping done, no need to copy
- if (fEscapingDone)
- {
- // if ANY escaping done, copy current character into new buffer
- straTemp.Append(&pch[i], 1);
- }
- }
-
- // inspect the next character in the string
- i++;
- }
-
- if (fEscapingDone)
- {
- // the escaped string is now in straTemp
- hr = Copy(straTemp);
- }
-
- return hr;
-
-} // EscapeInternal()
-
-VOID
-STRA::Unescape(
- VOID
-)
-/*++
-
-Routine Description:
-
- Unescapes a STRA
-
- Supported escape sequences are:
- %uxxxx unescapes Unicode character xxxx into system codepage
- %xx unescapes character xx
- % without following hex digits is ignored
-
-Arguments:
-
- None
-
-Return Value:
-
- None
-
---*/
-{
- CHAR *pScan;
- CHAR *pDest;
- CHAR *pNextScan;
- WCHAR wch;
- DWORD dwLen;
- BOOL fChanged = FALSE;
-
- //
- // Now take care of any escape characters
- //
- pDest = pScan = strchr(QueryStr(), '%');
-
- while (pScan)
- {
- if ((pScan[1] == 'u' || pScan[1] == 'U') &&
- SAFEIsXDigit(pScan[2]) &&
- SAFEIsXDigit(pScan[3]) &&
- SAFEIsXDigit(pScan[4]) &&
- SAFEIsXDigit(pScan[5]))
- {
- wch = TOHEX(pScan[2]) * 4096 + TOHEX(pScan[3]) * 256
- + TOHEX(pScan[4]) * 16 + TOHEX(pScan[5]);
-
- dwLen = WideCharToMultiByte(CP_ACP,
- WC_NO_BEST_FIT_CHARS,
- &wch,
- 1,
- (LPSTR) pDest,
- 6,
- NULL,
- NULL);
-
- pDest += dwLen;
- pScan += 6;
- fChanged = TRUE;
- }
- else if (SAFEIsXDigit(pScan[1]) && SAFEIsXDigit(pScan[2]))
- {
- *pDest = TOHEX(pScan[1]) * 16 + TOHEX(pScan[2]);
-
- pDest ++;
- pScan += 3;
- fChanged = TRUE;
- }
- else // Not an escaped char, just a '%'
- {
- if (fChanged)
- {
- *pDest = *pScan;
- }
-
- pDest++;
- pScan++;
- }
-
- //
- // Copy all the information between this and the next escaped char
- //
- pNextScan = strchr(pScan, '%');
-
- if (fChanged) // pScan!=pDest, so we have to copy the char's
- {
- if (!pNextScan) // That was the last '%' in the string
- {
- memmove(pDest,
- pScan,
- QueryCCH() - DIFF(pScan - QueryStr()) + 1);
- }
- else
- {
- // There is another '%', move intermediate chars
- if ((dwLen = (DWORD)DIFF(pNextScan - pScan)) != 0)
- {
- memmove(pDest,
- pScan,
- dwLen);
- pDest += dwLen;
- }
- }
- }
-
- pScan = pNextScan;
- }
-
- if (fChanged)
- {
- m_cchLen = (DWORD)strlen(QueryStr()); // for safety recalc the length
- }
-
- return;
-}
-
-HRESULT
-STRA::CopyWToUTF8Unescaped(
- __in LPCWSTR cpchStr
-)
-{
- return STRA::CopyWToUTF8Unescaped(cpchStr, (DWORD) wcslen(cpchStr));
-}
-
-HRESULT
-STRA::CopyWToUTF8Unescaped(
- __in_ecount(cch)
- LPCWSTR cpchStr,
- __in DWORD cch
-)
-{
- HRESULT hr = S_OK;
- int iRet;
-
- if (cch == 0)
- {
- Reset();
- return S_OK;
- }
-
- iRet = ConvertUnicodeToUTF8(cpchStr,
- &m_Buff,
- cch);
- if (-1 == iRet)
- {
- // could not convert
- hr = HRESULT_FROM_WIN32(GetLastError());
- goto Finished;
- }
-
- m_cchLen = iRet;
-
- _ASSERTE(strlen(m_Buff.QueryPtr()) == m_cchLen);
-Finished:
- return hr;
-}
-
-HRESULT
-STRA::CopyWToUTF8Escaped(
- __in LPCWSTR cpchStr
-)
-{
- return STRA::CopyWToUTF8Escaped(cpchStr, (DWORD) wcslen(cpchStr));
-}
-
-HRESULT
-STRA::CopyWToUTF8Escaped(
- __in_ecount(cch)
- LPCWSTR cpchStr,
- __in DWORD cch
-)
-{
- HRESULT hr = S_OK;
-
- hr = CopyWToUTF8Unescaped(cpchStr, cch);
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = Escape();
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- hr = S_OK;
-Finished:
- return hr;
-}
-
-HRESULT
-STRA::AuxAppend(
- __in_ecount(cbLen)
- LPCSTR pStr,
- __in DWORD cbLen,
- __in DWORD cbOffset
-)
-{
- _ASSERTE( NULL != pStr );
- _ASSERTE( cbOffset <= QueryCB() );
-
- ULONGLONG cb64NewSize = (ULONGLONG)cbOffset + cbLen + sizeof( CHAR );
- if( cb64NewSize > MAXDWORD )
- {
- return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- }
-
- if( m_Buff.QuerySize() < cb64NewSize )
- {
- if( !m_Buff.Resize( static_cast<SIZE_T>(cb64NewSize) ) )
- {
- return E_OUTOFMEMORY;
- }
- }
-
- memcpy( reinterpret_cast<BYTE*>(m_Buff.QueryPtr()) + cbOffset, pStr, cbLen );
-
- m_cchLen = cbLen + cbOffset;
-
- *( QueryStr() + m_cchLen ) = '\0';
-
- return S_OK;
-}
-
-HRESULT
-STRA::AuxAppendW(
- __in_ecount(cchAppendW)
- PCWSTR pszAppendW,
- __in DWORD cchAppendW,
- __in DWORD cbOffset,
- __in UINT CodePage,
- __in BOOL fFailIfNoTranslation,
- __in DWORD dwFlags
-)
-{
- HRESULT hr = S_OK;
- DWORD cbAvailable = 0;
- DWORD cbRet = 0;
-
- //
- // There are only two expect places to append
- //
- _ASSERTE( 0 == cbOffset || QueryCB() == cbOffset );
-
- if ( cchAppendW == 0 )
- {
- goto Finished;
- }
-
- //
- // start by assuming 1 char to 1 char will be enough space
- //
- if( !m_Buff.Resize( cbOffset + cchAppendW + sizeof( CHAR ) ) )
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- cbAvailable = m_Buff.QuerySize() - cbOffset;
-
- cbRet = WideCharToMultiByte(
- CodePage,
- dwFlags,
- pszAppendW,
- cchAppendW,
- QueryStr() + cbOffset,
- cbAvailable,
- NULL,
- NULL
- );
- if( 0 != cbRet )
- {
- if(!m_Buff.Resize(cbOffset + cbRet + 1))
- {
- hr = E_OUTOFMEMORY;
- }
-
- //
- // not zero --> success, so we're done
- //
- goto Finished;
- }
-
- //
- // We only know how to handle ERROR_INSUFFICIENT_BUFFER
- //
- hr = HRESULT_FROM_WIN32( GetLastError() );
- if( hr != HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ) )
- {
- goto Finished;
- }
-
- //
- // Reset HResult because we need to get the number of bytes needed
- //
- hr = S_OK;
- cbRet = WideCharToMultiByte(
- CodePage,
- dwFlags,
- pszAppendW,
- cchAppendW,
- NULL,
- 0,
- NULL,
- NULL
- );
- if( 0 == cbRet )
- {
- //
- // no idea how we could ever reach here
- //
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Finished;
- }
-
- if( !m_Buff.Resize( cbOffset + cbRet + 1) )
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- cbAvailable = m_Buff.QuerySize() - cbOffset;
-
- cbRet = WideCharToMultiByte(
- CodePage,
- dwFlags,
- pszAppendW,
- cchAppendW,
- QueryStr() + cbOffset,
- cbAvailable,
- NULL,
- NULL
- );
- if( 0 == cbRet )
- {
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Finished;
- }
-
-Finished:
-
- if( SUCCEEDED( hr ) && 0 != cbRet )
- {
- m_cchLen = cbRet + cbOffset;
- }
-
- //
- // ensure we're still NULL terminated in the right spot
- // (regardless of success or failure)
- //
- QueryStr()[m_cchLen] = '\0';
-
- return hr;
-}
-
-HRESULT
-STRA::AuxAppendWTruncate(
- __in_ecount(cchAppendW)
- __in PCWSTR pszAppendW,
- __in DWORD cchAppendW,
- __in DWORD cbOffset
-)
-//
-// Cheesey WCHAR --> CHAR conversion
-//
-{
- HRESULT hr = S_OK;
- CHAR* pszBuffer;
-
- _ASSERTE( NULL != pszAppendW );
- _ASSERTE( 0 == cbOffset || cbOffset == QueryCB() );
-
- if( !pszAppendW )
- {
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- goto Finished;
- }
-
- ULONGLONG cbNeeded = (ULONGLONG)cbOffset + cchAppendW + sizeof( CHAR );
- if( cbNeeded > MAXDWORD )
- {
- hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- goto Finished;
- }
-
- if( !m_Buff.Resize( static_cast<SIZE_T>(cbNeeded) ) )
- {
- hr = E_OUTOFMEMORY;
- goto Finished;
- }
-
- //
- // Copy/convert the UNICODE string over (by making two bytes into one)
- //
- pszBuffer = QueryStr() + cbOffset;
- for( DWORD i = 0; i < cchAppendW; i++ )
- {
- pszBuffer[i] = static_cast<CHAR>(pszAppendW[i]);
- }
-
- m_cchLen = cchAppendW + cbOffset;
- *( QueryStr() + m_cchLen ) = '\0';
-
-Finished:
-
- return hr;
-}
-
-// static
-int
-STRA::ConvertUnicodeToCodePage(
- __in_ecount(dwStringLen)
- LPCWSTR pszSrcUnicodeString,
- __inout BUFFER_T<CHAR,1> * pbufDstAnsiString,
- __in DWORD dwStringLen,
- __in UINT uCodePage
-)
-{
- _ASSERTE(NULL != pszSrcUnicodeString);
- _ASSERTE(NULL != pbufDstAnsiString);
-
- BOOL bTemp;
- int iStrLen = 0;
- DWORD dwFlags;
-
- if (uCodePage == CP_ACP)
- {
- dwFlags = WC_NO_BEST_FIT_CHARS;
- }
- else
- {
- dwFlags = 0;
- }
-
- iStrLen = WideCharToMultiByte(uCodePage,
- dwFlags,
- pszSrcUnicodeString,
- dwStringLen,
- (LPSTR)pbufDstAnsiString->QueryPtr(),
- (int)pbufDstAnsiString->QuerySize(),
- NULL,
- NULL);
- if ((iStrLen == 0) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) {
- iStrLen = WideCharToMultiByte(uCodePage,
- dwFlags,
- pszSrcUnicodeString,
- dwStringLen,
- NULL,
- 0,
- NULL,
- NULL);
- if (iStrLen != 0) {
- // add one just for the extra NULL
- bTemp = pbufDstAnsiString->Resize(iStrLen + 1);
- if (!bTemp)
- {
- iStrLen = 0;
- }
- else
- {
- iStrLen = WideCharToMultiByte(uCodePage,
- dwFlags,
- pszSrcUnicodeString,
- dwStringLen,
- (LPSTR)pbufDstAnsiString->QueryPtr(),
- (int)pbufDstAnsiString->QuerySize(),
- NULL,
- NULL);
- }
-
- }
- }
-
- if (0 != iStrLen &&
- pbufDstAnsiString->Resize(iStrLen + 1))
- {
- // insert a terminating NULL into buffer for the dwStringLen+1 in the case that the dwStringLen+1 was not a NULL.
- ((CHAR*)pbufDstAnsiString->QueryPtr())[iStrLen] = '\0';
- }
- else
- {
- iStrLen = -1;
- }
-
- return iStrLen;
-}
-
-// static
-HRESULT
-STRA::ConvertUnicodeToMultiByte(
- __in_ecount(dwStringLen)
- LPCWSTR pszSrcUnicodeString,
- __in BUFFER_T<CHAR,1> * pbufDstAnsiString,
- __in DWORD dwStringLen
-)
-{
- return ConvertUnicodeToCodePage( pszSrcUnicodeString,
- pbufDstAnsiString,
- dwStringLen,
- CP_ACP );
-}
-
-// static
-HRESULT
-STRA::ConvertUnicodeToUTF8(
- __in_ecount(dwStringLen)
- LPCWSTR pszSrcUnicodeString,
- __in BUFFER_T<CHAR,1> * pbufDstAnsiString,
- __in DWORD dwStringLen
-)
-{
- return ConvertUnicodeToCodePage( pszSrcUnicodeString,
- pbufDstAnsiString,
- dwStringLen,
- CP_UTF8 );
-}
-
-/*++
-
-Routine Description:
-
- Removes leading and trailing whitespace
-
---*/
-
-VOID
-STRA::Trim()
-{
- PSTR pszString = QueryStr();
- DWORD cchNewLength = m_cchLen;
- DWORD cchLeadingWhitespace = 0;
- DWORD cchTempLength = 0;
-
- for (LONG ixString = m_cchLen - 1; ixString >= 0; ixString--)
- {
- if (isspace((unsigned char) pszString[ixString]) != 0)
- {
- pszString[ixString] = '\0';
- cchNewLength--;
- }
- else
- {
- break;
- }
- }
-
- cchTempLength = cchNewLength;
- for (DWORD ixString = 0; ixString < cchTempLength; ixString++)
- {
- if (isspace((unsigned char) pszString[ixString]) != 0)
- {
- cchLeadingWhitespace++;
- cchNewLength--;
- }
- else
- {
- break;
- }
- }
-
- if (cchNewLength == 0)
- {
-
- Reset();
- }
- else if (cchLeadingWhitespace > 0)
- {
- memmove(pszString, pszString + cchLeadingWhitespace, cchNewLength * sizeof(CHAR));
- pszString[cchNewLength] = '\0';
- }
-
- SyncWithBuffer();
-}
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided prefix to check for equality
-
-Arguments:
-
- pStraPrefix - string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if prefix string matches with internal string, FALSE otherwise
-
---*/
-BOOL
-STRA::StartsWith(
- __in const STRA * pStraPrefix,
- __in bool fIgnoreCase) const
-{
- _ASSERTE( pStraPrefix != NULL );
- return StartsWith(pStraPrefix->QueryStr(), fIgnoreCase);
-}
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided prefix to check for equality
-
-Arguments:
-
- straPrefix - string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if prefix string matches with internal string, FALSE otherwise
-
---*/
-BOOL
-STRA::StartsWith(
- __in const STRA & straPrefix,
- __in bool fIgnoreCase) const
-{
- return StartsWith(straPrefix.QueryStr(), fIgnoreCase);
-}
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided prefix to check for equality
-
-Arguments:
-
- pszPrefix - string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if prefix string matches with internal string, FALSE otherwise
-
---*/
-BOOL
-STRA::StartsWith(
- __in PCSTR pszPrefix,
- __in bool fIgnoreCase) const
-{
- HRESULT hr = S_OK;
- BOOL fMatch = FALSE;
- size_t cchPrefix = 0;
-
- if (pszPrefix == NULL)
- {
- goto Finished;
- }
-
- hr = StringCchLengthA( pszPrefix,
- STRSAFE_MAX_CCH,
- &cchPrefix );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- _ASSERTE( cchPrefix <= MAXDWORD );
-
- if (cchPrefix > m_cchLen)
- {
- goto Finished;
- }
-
- if( fIgnoreCase )
- {
- fMatch = ( 0 == _strnicmp( QueryStr(), pszPrefix, cchPrefix ) );
- }
- else
- {
- fMatch = ( 0 == strncmp( QueryStr(), pszPrefix, cchPrefix ) );
- }
-
-
-Finished:
-
- return fMatch;
-}
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided suffix to check for equality
-
-Arguments:
-
- pStraSuffix - string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if suffix string matches with internal string, FALSE otherwise
-
---*/
-BOOL
-STRA::EndsWith(
- __in const STRA * pStraSuffix,
- __in bool fIgnoreCase) const
-{
- _ASSERTE( pStraSuffix != NULL );
- return EndsWith(pStraSuffix->QueryStr(), fIgnoreCase);
-}
-
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided suffix to check for equality
-
-Arguments:
-
- straSuffix - string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if suffix string matches with internal string, FALSE otherwise
-
---*/
-BOOL
-STRA::EndsWith(
- __in const STRA & straSuffix,
- __in bool fIgnoreCase) const
-{
- return EndsWith(straSuffix.QueryStr(), fIgnoreCase);
-}
-
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided suffix to check for equality
-
-Arguments:
-
- pszSuffix - string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if suffix string matches with internal string, FALSE otherwise
-
---*/
-BOOL
-STRA::EndsWith(
- __in PCSTR pszSuffix,
- __in bool fIgnoreCase) const
-{
- HRESULT hr = S_OK;
- PSTR pszString = QueryStr();
- BOOL fMatch = FALSE;
- size_t cchSuffix = 0;
- ptrdiff_t ixOffset = 0;
-
- if (pszSuffix == NULL)
- {
- goto Finished;
- }
-
- hr = StringCchLengthA( pszSuffix,
- STRSAFE_MAX_CCH,
- &cchSuffix );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- _ASSERTE( cchSuffix <= MAXDWORD );
-
- if (cchSuffix > m_cchLen)
- {
- goto Finished;
- }
-
- ixOffset = m_cchLen - cchSuffix;
- _ASSERTE(ixOffset >= 0 && ixOffset <= MAXDWORD);
-
- if( fIgnoreCase )
- {
- fMatch = ( 0 == _strnicmp( pszString + ixOffset, pszSuffix, cchSuffix ) );
- }
- else
- {
- fMatch = ( 0 == strncmp( pszString + ixOffset, pszSuffix, cchSuffix ) );
- }
-
-Finished:
-
- return fMatch;
-}
-
-
-/*++
-
-Routine Description:
-
- Searches the string for the first occurrence of the specified character.
-
-Arguments:
-
- charValue - character to find
- dwStartIndex - the initial index.
-
-Return Value:
-
- The index for the first character occurrence in the string.
-
- -1 if not found.
-
---*/
-INT
-STRA::IndexOf(
- __in CHAR charValue,
- __in DWORD dwStartIndex
- ) const
-{
- INT nIndex = -1;
-
- // Make sure that there are no buffer overruns.
- if( dwStartIndex >= QueryCCH() )
- {
- goto Finished;
- }
-
- const CHAR* pChar = strchr( QueryStr() + dwStartIndex, charValue );
-
- // Determine the index if found
- if( pChar )
- {
- // nIndex will be set to -1 on failure.
- (VOID)SizeTToInt( pChar - QueryStr(), &nIndex );
- }
-
-Finished:
-
- return nIndex;
-}
-
-
-/*++
-
-Routine Description:
-
- Searches the string for the first occurrence of the specified substring.
-
-Arguments:
-
- pszValue - substring to find
- dwStartIndex - initial index.
-
-Return Value:
-
- The index for the first character occurrence in the string.
-
- -1 if not found.
-
---*/
-INT
-STRA::IndexOf(
- __in PCSTR pszValue,
- __in DWORD dwStartIndex
- ) const
-{
- HRESULT hr = S_OK;
- INT nIndex = -1;
- SIZE_T cchValue = 0;
-
- // Validate input parameters
- if( dwStartIndex >= QueryCCH() || !pszValue )
- {
- goto Finished;
- }
-
- const CHAR* pChar = strstr( QueryStr() + dwStartIndex, pszValue );
-
- // Determine the index if found
- if( pChar )
- {
- // nIndex will be set to -1 on failure.
- (VOID)SizeTToInt( pChar - QueryStr(), &nIndex );
- }
-
-Finished:
-
- return nIndex;
-}
-
-
-/*++
-
-Routine Description:
-
- Searches the string for the last occurrence of the specified character.
-
-Arguments:
-
- charValue - character to find
- dwStartIndex - initial index.
-
-Return Value:
-
- The index for the last character occurrence in the string.
-
- -1 if not found.
-
---*/
-INT
-STRA::LastIndexOf(
- __in CHAR charValue,
- __in DWORD dwStartIndex
- ) const
-{
- INT nIndex = -1;
-
- // Make sure that there are no buffer overruns.
- if( dwStartIndex >= QueryCCH() )
- {
- goto Finished;
- }
-
- const CHAR* pChar = strrchr( QueryStr() + dwStartIndex, charValue );
-
- // Determine the index if found
- if( pChar )
- {
- // nIndex will be set to -1 on failure.
- (VOID)SizeTToInt( pChar - QueryStr(), &nIndex );
- }
-
-Finished:
-
- return nIndex;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp
deleted file mode 100644
index 2a012666d5..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/stringu.cpp
+++ /dev/null
@@ -1,1289 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-STRU::STRU(
- VOID
-) : m_cchLen( 0 )
-{
- *(QueryStr()) = L'\0';
-}
-
-STRU::STRU(
- __inout_ecount(cchInit) WCHAR* pbInit,
- __in DWORD cchInit
-) : m_Buff( pbInit, cchInit * sizeof( WCHAR ) ),
- m_cchLen( 0 )
-/*++
- Description:
-
- Used by STACK_STRU. Initially populates underlying buffer with pbInit.
-
- pbInit is not freed.
-
- Arguments:
-
- pbInit - initial memory to use
- cchInit - count, in characters, of pbInit
-
- Returns:
-
- None.
-
---*/
-{
- _ASSERTE( cchInit <= (MAXDWORD / sizeof( WCHAR )) );
- _ASSERTE( NULL != pbInit );
- _ASSERTE(cchInit > 0 );
- _ASSERTE(pbInit[0] == L'\0');
-}
-
-BOOL
-STRU::IsEmpty(
- VOID
-) const
-{
- return ( m_cchLen == 0 );
-}
-
-DWORD
-STRU::QueryCB(
- VOID
-) const
-//
-// Returns the number of bytes in the string excluding the terminating NULL
-//
-{
- return m_cchLen * sizeof( WCHAR );
-}
-
-DWORD
-STRU::QueryCCH(
- VOID
-) const
-//
-// Returns the number of characters in the string excluding the terminating NULL
-//
-{
- return m_cchLen;
-}
-
-DWORD
-STRU::QuerySizeCCH(
- VOID
-) const
-//
-// Returns size of the underlying storage buffer, in characters
-//
-{
- return m_Buff.QuerySize() / sizeof( WCHAR );
-}
-
-__nullterminated
-__ecount(this->m_cchLen)
-WCHAR*
-STRU::QueryStr(
- VOID
-) const
-//
-// Return the string buffer
-//
-{
- return m_Buff.QueryPtr();
-}
-
-VOID
-STRU::Reset(
- VOID
-)
-//
-// Resets the internal string to be NULL string. Buffer remains cached.
-//
-{
- _ASSERTE( QueryStr() != NULL );
- *(QueryStr()) = L'\0';
- m_cchLen = 0;
-}
-
-HRESULT
-STRU::Resize(
- DWORD cchSize
-)
-{
- SIZE_T cbSize = cchSize * sizeof( WCHAR );
- if ( cbSize > MAXDWORD )
- {
- return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- }
- if( !m_Buff.Resize( cbSize ) )
- {
- return E_OUTOFMEMORY;
- }
-
- return S_OK;
-}
-
-HRESULT
-STRU::SyncWithBuffer(
- VOID
-)
-//
-// Recalculate the length of the string, etc. because we've modified
-// the buffer directly.
-//
-{
- HRESULT hr;
- size_t size;
- hr = StringCchLengthW( QueryStr(),
- QuerySizeCCH(),
- &size );
- if ( SUCCEEDED( hr ) )
- {
- m_cchLen = static_cast<DWORD>(size);
- }
- return hr;
-}
-
-HRESULT
-STRU::Copy(
- __in PCWSTR pszCopy
-)
-{
- HRESULT hr;
- size_t cbStr;
-
- hr = StringCchLengthW( pszCopy,
- STRSAFE_MAX_CCH,
- &cbStr );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- _ASSERTE( cbStr <= MAXDWORD );
- return Copy( pszCopy,
- cbStr );
-}
-
-HRESULT
-STRU::Copy(
- __in_ecount(cchLen)
- PCWSTR pszCopy,
- SIZE_T cchLen
-)
-//
-// Copy the contents of another string to this one
-//
-{
- return AuxAppend( pszCopy,
- cchLen * sizeof(WCHAR),
- 0);
-}
-
-HRESULT
-STRU::Copy(
- __in const STRU * pstrRhs
-)
-{
- _ASSERTE( NULL != pstrRhs );
- return Copy( pstrRhs->QueryStr(), pstrRhs->QueryCCH() );
-}
-
-HRESULT
-STRU::Copy(
- __in const STRU & str
-)
-{
- return Copy( str.QueryStr(), str.QueryCCH() );
-}
-
-HRESULT
-STRU::CopyAndExpandEnvironmentStrings(
- __in PCWSTR pszSource
-)
-{
- HRESULT hr = S_OK;
- DWORD cchDestReqBuff = 0;
-
- Reset();
-
- cchDestReqBuff = ExpandEnvironmentStringsW( pszSource,
- QueryStr(),
- QuerySizeCCH() );
- if ( cchDestReqBuff == 0 )
- {
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Finished;
- }
- else if ( cchDestReqBuff > QuerySizeCCH() )
- {
- hr = Resize( cchDestReqBuff );
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-
- cchDestReqBuff = ExpandEnvironmentStringsW( pszSource,
- QueryStr(),
- QuerySizeCCH() );
-
- if ( cchDestReqBuff == 0 || cchDestReqBuff > QuerySizeCCH() )
- {
- _ASSERTE( FALSE );
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Finished;
- }
- }
-
- hr = SyncWithBuffer();
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-
-Finished:
-
- return hr;
-
-}
-
-HRESULT
-STRU::CopyA(
- __in PCSTR pszCopyA
-)
-{
- HRESULT hr;
- size_t cbStr;
-
- hr = StringCbLengthA( pszCopyA,
- STRSAFE_MAX_CCH,
- &cbStr );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- _ASSERTE( cbStr <= MAXDWORD );
- return CopyA( pszCopyA,
- cbStr );
-}
-
-HRESULT
-STRU::CopyA(
- __in_bcount(cchLen)
- PCSTR pszCopyA,
- SIZE_T cchLen,
- UINT CodePage /*= CP_UTF8*/
-)
-{
- return AuxAppendA(
- pszCopyA,
- cchLen,
- 0,
- CodePage
- );
-}
-
-HRESULT
-STRU::Append(
- __in PCWSTR pszAppend
-)
-{
- HRESULT hr;
- size_t cbStr;
-
- hr = StringCchLengthW( pszAppend,
- STRSAFE_MAX_CCH,
- &cbStr );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- _ASSERTE( cbStr <= MAXDWORD );
- return Append( pszAppend,
- cbStr );
-}
-
-HRESULT
-STRU::Append(
- __in_ecount(cchLen)
- PCWSTR pszAppend,
- SIZE_T cchLen
-)
-//
-// Append something to the end of the string
-//
-{
- if ( cchLen == 0 )
- {
- return S_OK;
- }
- return AuxAppend( pszAppend,
- cchLen * sizeof(WCHAR),
- QueryCB() );
-}
-
-HRESULT
-STRU::Append(
- __in const STRU * pstrRhs
-)
-{
- _ASSERTE( NULL != pstrRhs );
- return Append( pstrRhs->QueryStr(), pstrRhs->QueryCCH() );
-}
-
-HRESULT
-STRU::Append(
- __in const STRU & strRhs
-)
-{
- return Append( strRhs.QueryStr(), strRhs.QueryCCH() );
-}
-
-HRESULT
-STRU::AppendA(
- __in PCSTR pszAppendA
-)
-{
- HRESULT hr;
- size_t cbStr;
-
- hr = StringCbLengthA( pszAppendA,
- STRSAFE_MAX_CCH,
- &cbStr );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- _ASSERTE( cbStr <= MAXDWORD );
- return AppendA( pszAppendA,
- cbStr );
-}
-
-HRESULT
-STRU::AppendA(
- __in_bcount(cchLen)
- PCSTR pszAppendA,
- SIZE_T cchLen,
- UINT CodePage /*= CP_UTF8*/
-)
-{
- if ( cchLen == 0 )
- {
- return S_OK;
- }
- return AuxAppendA(
- pszAppendA,
- cchLen,
- QueryCB(),
- CodePage
- );
-}
-
-HRESULT
-STRU::CopyToBuffer(
- __out_bcount(*pcb) WCHAR* pszBuffer,
- PDWORD pcb
-) const
-//
-// Makes a copy of the stored string into the given buffer
-//
-{
- _ASSERTE( NULL != pszBuffer );
- _ASSERTE( NULL != pcb );
-
- HRESULT hr = S_OK;
- DWORD cbNeeded = QueryCB() + sizeof( WCHAR );
-
- if( *pcb < cbNeeded )
- {
- hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER );
- goto Finished;
- }
-
- //
- // BUGBUG: StringCchCopy?
- //
- memcpy( pszBuffer, QueryStr(), cbNeeded );
-
-Finished:
-
- *pcb = cbNeeded;
-
- return hr;
-}
-
-HRESULT
-STRU::CopyToBufferA(
- __out_bcount(*pcb) CHAR* pszBuffer,
- __inout PDWORD pcb
-) const
-{
- HRESULT hr = S_OK;
- STACK_STRA( straBuffer, 256 );
- hr = straBuffer.CopyW( QueryStr() );
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
- hr = straBuffer.CopyToBuffer( pszBuffer, pcb );
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-Finished:
- return hr;
-}
-
-HRESULT
-STRU::SetLen(
- __in DWORD cchLen
-)
-/*++
- *
-Routine Description:
-
- Set the length of the string and null terminate, if there
- is sufficient buffer already allocated. Will not reallocate.
-
-Arguments:
-
- cchLen - The number of characters in the new string.
-
-Return Value:
-
- HRESULT
-
---*/
-{
- if( cchLen >= QuerySizeCCH() )
- {
- return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- }
-
- *( QueryStr() + cchLen ) = L'\0';
- m_cchLen = cchLen;
-
- return S_OK;
-}
-
-HRESULT
-STRU::SafeSnwprintf(
- __in PCWSTR pwszFormatString,
- ...
-)
-/*++
-
-Routine Description:
-
- Writes to a STRU, growing it as needed. It arbitrarily caps growth at 64k chars.
-
-Arguments:
-
- pwszFormatString - printf format
- ... - printf args
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- va_list argsList;
- va_start( argsList, pwszFormatString );
-
- hr = SafeVsnwprintf(pwszFormatString, argsList);
-
- va_end( argsList );
- return hr;
-}
-
-HRESULT
-STRU::SafeVsnwprintf(
- __in PCWSTR pwszFormatString,
- va_list argsList
-)
-/*++
-
-Routine Description:
-
- Writes to a STRU, growing it as needed. It arbitrarily caps growth at 64k chars.
-
-Arguments:
-
- pwszFormatString - printf format
- argsList - printf va_list
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- int cchOutput;
- int cchNeeded;
-
- //
- // Format the incoming message using vsnprintf()
- // so that the overflows are captured
- //
- cchOutput = _vsnwprintf_s(
- QueryStr(),
- QuerySizeCCH(),
- QuerySizeCCH() - 1,
- pwszFormatString,
- argsList
- );
-
- if( cchOutput == -1 )
- {
- //
- // Couldn't fit this in the original STRU size.
- //
- cchNeeded = _vscwprintf( pwszFormatString, argsList );
- if( cchNeeded > 64 * 1024 )
- {
- //
- // If we're trying to produce a string > 64k chars, then
- // there is probably a problem
- //
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
- goto Finished;
- }
-
- //
- // _vscprintf doesn't include terminating null character
- //
- cchNeeded++;
-
- hr = Resize( cchNeeded );
- if( FAILED( hr ) )
- {
- goto Finished;
- }
-
- cchOutput = _vsnwprintf_s(
- QueryStr(),
- QuerySizeCCH(),
- QuerySizeCCH() - 1,
- pwszFormatString,
- argsList
- );
- if( -1 == cchOutput )
- {
- //
- // This should never happen, cause we should already have correctly sized memory
- //
- _ASSERTE( FALSE );
-
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA );
- goto Finished;
- }
- }
-
- //
- // always null terminate at the last WCHAR
- //
- QueryStr()[ QuerySizeCCH() - 1 ] = L'\0';
-
- //
- // we directly touched the buffer - therefore:
- //
- hr = SyncWithBuffer();
- if ( FAILED( hr ) )
- {
- goto Finished;
- }
-
-Finished:
-
- if( FAILED( hr ) )
- {
- Reset();
- }
-
- return hr;
-}
-
-HRESULT
-STRU::AuxAppend(
- __in_ecount(cNumStrings)
- PCWSTR const rgpszStrings[],
- SIZE_T cNumStrings
-)
-/*++
-
-Routine Description:
-
- Appends an array of strings of length cNumStrings
-
-Arguments:
-
- rgStrings - The array of strings to be appened
- cNumStrings - The count of String
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- size_t cbStringsTotal = sizeof( WCHAR ); // Account for null-terminator
-
- //
- // Compute total size of the string.
- // Resize internal buffer
- // Copy each array element one by one to backing buffer
- // Update backing buffer string length
- //
- for ( SIZE_T i = 0; i < cNumStrings; i++ )
- {
- _ASSERTE( rgpszStrings[ i ] != NULL );
- if ( NULL == rgpszStrings[ i ] )
- {
- return E_INVALIDARG;
- }
-
- size_t cbString = 0;
-
- hr = StringCbLengthW( rgpszStrings[ i ],
- STRSAFE_MAX_CCH * sizeof( WCHAR ),
- &cbString );
- if ( FAILED( hr ) )
- {
- return hr;
- }
-
- cbStringsTotal += cbString;
-
- if ( cbStringsTotal > MAXDWORD )
- {
- return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- }
- }
-
- size_t cbBufSizeRequired = QueryCB() + cbStringsTotal;
- if ( cbBufSizeRequired > MAXDWORD )
- {
- return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- }
-
- if( m_Buff.QuerySize() < cbBufSizeRequired )
- {
- if( !m_Buff.Resize( cbBufSizeRequired ) )
- {
- return E_OUTOFMEMORY;
- }
- }
-
- STRSAFE_LPWSTR pszStringEnd = QueryStr() + QueryCCH();
- size_t cchRemaining = QuerySizeCCH() - QueryCCH();
- for ( SIZE_T i = 0; i < cNumStrings; i++ )
- {
- hr = StringCchCopyExW( pszStringEnd, // pszDest
- cchRemaining, // cchDest
- rgpszStrings[ i ], // pszSrc
- &pszStringEnd, // ppszDestEnd
- &cchRemaining, // pcchRemaining
- 0 ); // dwFlags
- if ( FAILED( hr ) )
- {
- _ASSERTE( FALSE );
- HRESULT hr2 = SyncWithBuffer();
- if ( FAILED( hr2 ) )
- {
- return hr2;
- }
- return hr;
- }
- }
-
- m_cchLen = static_cast< DWORD >( cbBufSizeRequired ) / sizeof( WCHAR ) - 1;
-
- return S_OK;
-}
-
-HRESULT
-STRU::AuxAppend(
- __in_bcount(cbStr)
- const WCHAR* pStr,
- SIZE_T cbStr,
- DWORD cbOffset
-)
-/*++
-
-Routine Description:
-
- Appends to the string starting at the (byte) offset cbOffset.
-
-Arguments:
-
- pStr - A unicode string to be appended
- cbStr - Length, in bytes, of pStr
- cbOffset - Offset, in bytes, at which to begin the append
-
-Return Value:
-
- HRESULT
-
---*/
-{
- _ASSERTE( NULL != pStr );
- _ASSERTE( 0 == cbStr % sizeof( WCHAR ) );
- _ASSERTE( cbOffset <= QueryCB() );
- _ASSERTE( 0 == cbOffset % sizeof( WCHAR ) );
-
- ULONGLONG cb64NewSize = (ULONGLONG)cbOffset + cbStr + sizeof( WCHAR );
- if( cb64NewSize > MAXDWORD )
- {
- return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- }
-
- if( m_Buff.QuerySize() < cb64NewSize )
- {
- if( !m_Buff.Resize( static_cast<SIZE_T>(cb64NewSize) ) )
- {
- return E_OUTOFMEMORY;
- }
- }
-
- memcpy( reinterpret_cast<BYTE*>(m_Buff.QueryPtr()) + cbOffset, pStr, cbStr );
-
- m_cchLen = (static_cast<DWORD>(cbStr) + cbOffset) / sizeof(WCHAR);
-
- *( QueryStr() + m_cchLen ) = L'\0';
-
- return S_OK;
-}
-
-HRESULT
-STRU::AuxAppendA(
- __in_bcount(cbStr)
- const CHAR* pStr,
- SIZE_T cbStr,
- DWORD cbOffset,
- UINT CodePage
-)
-/*++
-
-Routine Description:
-
- Convert and append an ANSI string to the string starting at
- the (byte) offset cbOffset
-
-Arguments:
-
- pStr - An ANSI string to be appended
- cbStr - Length, in bytes, of pStr
- cbOffset - Offset, in bytes, at which to begin the append
- CodePage - code page to use for conversion
-
-Return Value:
-
- HRESULT
-
---*/
-{
- WCHAR* pszBuffer;
- DWORD cchBuffer;
- DWORD cchCharsCopied = 0;
-
- _ASSERTE( NULL != pStr );
- _ASSERTE( cbOffset <= QueryCB() );
- _ASSERTE( 0 == cbOffset % sizeof( WCHAR ) );
-
- if ( NULL == pStr )
- {
- return E_INVALIDARG;
- }
-
- if( 0 == cbStr )
- {
- return S_OK;
- }
-
- //
- // Only resize when we have to. When we do resize, we tack on
- // some extra space to avoid extra reallocations.
- //
- if( m_Buff.QuerySize() < (ULONGLONG)cbOffset + (cbStr * sizeof( WCHAR )) + sizeof(WCHAR) )
- {
- ULONGLONG cb64NewSize = (ULONGLONG)( cbOffset + cbStr * sizeof(WCHAR) + sizeof( WCHAR ) );
-
- //
- // Check for the arithmetic overflow
- //
- if( cb64NewSize > MAXDWORD )
- {
- return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW );
- }
-
- if( !m_Buff.Resize( static_cast<SIZE_T>(cb64NewSize) ) )
- {
- return E_OUTOFMEMORY;
- }
- }
-
- pszBuffer = reinterpret_cast<WCHAR*>(reinterpret_cast<BYTE*>(m_Buff.QueryPtr()) + cbOffset);
- cchBuffer = ( m_Buff.QuerySize() - cbOffset - sizeof( WCHAR ) ) / sizeof( WCHAR );
-
- cchCharsCopied = MultiByteToWideChar(
- CodePage,
- MB_ERR_INVALID_CHARS,
- pStr,
- static_cast<int>(cbStr),
- pszBuffer,
- cchBuffer
- );
- if( 0 == cchCharsCopied )
- {
- return HRESULT_FROM_WIN32( GetLastError() );
- }
-
- //
- // set the new length
- //
- m_cchLen = cchCharsCopied + cbOffset/sizeof(WCHAR);
-
- //
- // Must be less than, cause still need to add NULL
- //
- _ASSERTE( m_cchLen < QuerySizeCCH() );
-
- //
- // append NULL character
- //
- *(QueryStr() + m_cchLen) = L'\0';
-
- return S_OK;
-}
-
-
-/*++
-
-Routine Description:
-
- Removes leading and trailing whitespace
-
---*/
-
-VOID
-STRU::Trim()
-{
- PWSTR pwszString = QueryStr();
- DWORD cchNewLength = m_cchLen;
- DWORD cchLeadingWhitespace = 0;
- DWORD cchTempLength = 0;
-
- for (LONG ixString = m_cchLen - 1; ixString >= 0; ixString--)
- {
- if (iswspace(pwszString[ixString]) != 0)
- {
- pwszString[ixString] = L'\0';
- cchNewLength--;
- }
- else
- {
- break;
- }
- }
-
- cchTempLength = cchNewLength;
- for (DWORD ixString = 0; ixString < cchTempLength; ixString++)
- {
- if (iswspace(pwszString[ixString]) != 0)
- {
- cchLeadingWhitespace++;
- cchNewLength--;
- }
- else
- {
- break;
- }
- }
-
- if (cchNewLength == 0)
- {
-
- Reset();
- }
- else if (cchLeadingWhitespace > 0)
- {
- memmove(pwszString, pwszString + cchLeadingWhitespace, cchNewLength * sizeof(WCHAR));
- pwszString[cchNewLength] = L'\0';
- }
-
- SyncWithBuffer();
-}
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided prefix to check for equality
-
-Arguments:
-
- pwszPrefix - wide char string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if prefix string matches with internal string, FALSE otherwise
-
---*/
-
-BOOL
-STRU::StartsWith(
- __in PCWSTR pwszPrefix,
- __in bool fIgnoreCase) const
-{
- HRESULT hr = S_OK;
- BOOL fMatch = FALSE;
- size_t cchPrefix = 0;
-
- if (pwszPrefix == NULL)
- {
- goto Finished;
- }
-
- hr = StringCchLengthW( pwszPrefix,
- STRSAFE_MAX_CCH,
- &cchPrefix );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- _ASSERTE( cchPrefix <= MAXLONG );
-
- if (cchPrefix > m_cchLen)
- {
- goto Finished;
- }
-
- #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN
-
- fMatch = ( CSTR_EQUAL == CompareStringOrdinal( QueryStr(),
- (int)cchPrefix,
- pwszPrefix,
- (int)cchPrefix,
- fIgnoreCase ) );
- #else
-
- if( fIgnoreCase )
- {
- fMatch = ( 0 == _wcsnicmp( QueryStr(), pwszPrefix, cchPrefix ) );
- }
- else
- {
- fMatch = ( 0 == wcsncmp( QueryStr(), pwszPrefix, cchPrefix ) );
- }
-
- #endif
-
-Finished:
-
- return fMatch;
-}
-
-/*++
-
-Routine Description:
-
- Compares the string to the provided suffix to check for equality
-
-Arguments:
-
- pwszSuffix - wide char string to compare with
- fIgnoreCase - indicates whether the string comparison should be case-sensitive
-
-Return Value:
-
- TRUE if suffix string matches with internal string, FALSE otherwise
-
---*/
-
-
-BOOL
-STRU::EndsWith(
- __in PCWSTR pwszSuffix,
- __in bool fIgnoreCase) const
-{
- HRESULT hr = S_OK;
- PWSTR pwszString = QueryStr();
- BOOL fMatch = FALSE;
- size_t cchSuffix = 0;
- ptrdiff_t ixOffset = 0;
-
- if (pwszSuffix == NULL)
- {
- goto Finished;
- }
-
- hr = StringCchLengthW( pwszSuffix,
- STRSAFE_MAX_CCH,
- &cchSuffix );
- if (FAILED(hr))
- {
- goto Finished;
- }
-
- _ASSERTE( cchSuffix <= MAXLONG );
-
- if (cchSuffix > m_cchLen)
- {
- goto Finished;
- }
-
- ixOffset = m_cchLen - cchSuffix;
- _ASSERTE(ixOffset >= 0 && ixOffset <= MAXDWORD);
-
- #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN
-
- fMatch = ( CSTR_EQUAL == CompareStringOrdinal( pwszString + ixOffset,
- (int)cchSuffix,
- pwszSuffix,
- (int)cchSuffix,
- fIgnoreCase ) );
- #else
-
- if( fIgnoreCase )
- {
- fMatch = ( 0 == _wcsnicmp( pwszString + ixOffset, pwszSuffix, cchSuffix ) );
- }
- else
- {
- fMatch = ( 0 == wcsncmp( pwszString + ixOffset, pwszSuffix, cchSuffix ) );
- }
-
- #endif
-
-Finished:
-
- return fMatch;
-}
-
-/*++
-
-Routine Description:
-
- Searches the string for the first occurrence of the specified character.
-
-Arguments:
-
- charValue - character to find
- dwStartIndex - the initial index.
-
-Return Value:
-
- The index for the first character occurrence in the string.
-
- -1 if not found.
-
---*/
-INT
-STRU::IndexOf(
- __in WCHAR charValue,
- __in DWORD dwStartIndex
- ) const
-{
- INT nIndex = -1;
-
- // Make sure that there are no buffer overruns.
- if( dwStartIndex >= QueryCCH() )
- {
- goto Finished;
- }
-
- const WCHAR* pwChar = wcschr( QueryStr() + dwStartIndex, charValue );
-
- // Determine the index if found
- if( pwChar )
- {
- // nIndex will be set to -1 on failure.
- (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex );
- }
-
-Finished:
-
- return nIndex;
-}
-
-
-/*++
-
-Routine Description:
-
- Searches the string for the first occurrence of the specified substring.
-
-Arguments:
-
- pwszValue - substring to find
- dwStartIndex - initial index.
-
-Return Value:
-
- The index for the first character occurrence in the string.
-
- -1 if not found.
-
---*/
-INT
-STRU::IndexOf(
- __in PCWSTR pwszValue,
- __in DWORD dwStartIndex
- ) const
-{
- HRESULT hr = S_OK;
- INT nIndex = -1;
- SIZE_T cchValue = 0;
-
- // Validate input parameters
- if( dwStartIndex >= QueryCCH() || !pwszValue )
- {
- goto Finished;
- }
-
- const WCHAR* pwChar = wcsstr( QueryStr() + dwStartIndex, pwszValue );
-
- // Determine the index if found
- if( pwChar )
- {
- // nIndex will be set to -1 on failure.
- (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex );
- }
-
-Finished:
-
- return nIndex;
-}
-
-
-/*++
-
-Routine Description:
-
- Searches the string for the last occurrence of the specified character.
-
-Arguments:
-
- charValue - character to find
- dwStartIndex - initial index.
-
-Return Value:
-
- The index for the last character occurrence in the string.
-
- -1 if not found.
-
---*/
-INT
-STRU::LastIndexOf(
- __in WCHAR charValue,
- __in DWORD dwStartIndex
- ) const
-{
- INT nIndex = -1;
-
- // Make sure that there are no buffer overruns.
- if( dwStartIndex >= QueryCCH() )
- {
- goto Finished;
- }
-
- const WCHAR* pwChar = wcsrchr( QueryStr() + dwStartIndex, charValue );
-
- // Determine the index if found
- if( pwChar )
- {
- // nIndex will be set to -1 on failure.
- (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex );
- }
-
-Finished:
-
- return nIndex;
-}
-
-//static
-HRESULT
-STRU::ExpandEnvironmentVariables(
- __in PCWSTR pszString,
- __out STRU * pstrExpandedString
- )
-/*++
-
-Routine Description:
-
- Expand the environment variables in a string
-
-Arguments:
-
- pszString - String with environment variables to expand
- pstrExpandedString - Receives expanded string on success
-
-Return Value:
-
- HRESULT
-
---*/
-{
- HRESULT hr = S_OK;
- DWORD cchNewSize = 0;
-
- if ( pszString == NULL ||
- pstrExpandedString == NULL )
- {
- DBG_ASSERT( FALSE );
- hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER );
- goto Exit;
- }
-
- cchNewSize = ExpandEnvironmentStrings( pszString,
- pstrExpandedString->QueryStr(),
- pstrExpandedString->QuerySizeCCH() );
- if ( cchNewSize == 0 )
- {
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Exit;
- }
-
- if ( cchNewSize > pstrExpandedString->QuerySizeCCH() )
- {
- hr = pstrExpandedString->Resize(
- ( cchNewSize + 1 ) * sizeof( WCHAR )
- );
- if ( FAILED( hr ) )
- {
- goto Exit;
- }
-
- cchNewSize = ExpandEnvironmentStrings(
- pszString,
- pstrExpandedString->QueryStr(),
- pstrExpandedString->QuerySizeCCH()
- );
-
- if ( cchNewSize == 0 ||
- cchNewSize > pstrExpandedString->QuerySizeCCH() )
- {
- hr = HRESULT_FROM_WIN32( GetLastError() );
- goto Exit;
- }
- }
-
- pstrExpandedString->SyncWithBuffer();
-
- hr = S_OK;
-
-Exit:
-
- return hr;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx
deleted file mode 100644
index 69b42e6250..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/ulparse.cxx
+++ /dev/null
@@ -1,1416 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-//
-// BUGBUG: Turn off optimization on ia64 builds due to a compiler bug
-//
-#if (defined(_M_IA64) && (_MSC_FULL_VER == 13009286))
-#pragma optimize("",off)
-#endif
-
-#define LF 0x0A
-#define SP 0x20
-#define HT 0x09
-
-#define HTTP_CHAR 0x001
-#define HTTP_UPCASE 0x002
-#define HTTP_LOCASE 0x004
-#define HTTP_ALPHA (HTTP_UPCASE | HTTP_LOCASE)
-#define HTTP_DIGIT 0x008
-#define HTTP_CTL 0x010
-#define HTTP_LWS 0x020
-#define HTTP_HEX 0x040
-#define HTTP_SEPERATOR 0x080
-#define HTTP_TOKEN 0x100
-
-#define URL_LEGAL 0x200
-#define URL_TOKEN (HTTP_ALPHA | HTTP_DIGIT | URL_LEGAL)
-
-#define IS_HTTP_UPCASE(c) (HttpChars[(UCHAR)(c)] & HTTP_UPCASE)
-#define IS_HTTP_LOCASE(c) (HttpChars[(UCHAR)(c)] & HTTP_UPCASE)
-#define IS_HTTP_ALPHA(c) (HttpChars[(UCHAR)(c)] & HTTP_ALPHA)
-#define IS_HTTP_DIGIT(c) (HttpChars[(UCHAR)(c)] & HTTP_DIGIT)
-#define IS_HTTP_HEX(c) (HttpChars[(UCHAR)(c)] & HTTP_HEX)
-#define IS_HTTP_CTL(c) (HttpChars[(UCHAR)(c)] & HTTP_CTL)
-#define IS_HTTP_LWS(c) (HttpChars[(UCHAR)(c)] & HTTP_LWS)
-#define IS_HTTP_SEPERATOR(c) (HttpChars[(UCHAR)(c)] & HTTP_SEPERATOR)
-#define IS_HTTP_TOKEN(c) (HttpChars[(UCHAR)(c)] & HTTP_TOKEN)
-#define IS_URL_TOKEN(c) (HttpChars[(UCHAR)(c)] & URL_TOKEN)
-
-// Some stuff not defined in VS SDK
-#ifndef NT_SUCCESS
-#define NT_SUCCESS(Status) (((NTSTATUS)(Status)) >= 0)
-#endif
-
-// Copied from ntstatus.h, otherwise we will have double definition for
-// number of macros that are both in ntstatus.h and winnt.h
-#ifndef STATUS_SUCCESS
-#define STATUS_SUCCESS ((NTSTATUS)0x00000000L) // ntsubauth
-#endif
-#ifndef STATUS_OBJECT_PATH_SYNTAX_BAD
-#define STATUS_OBJECT_PATH_SYNTAX_BAD ((NTSTATUS)0xC000003BL)
-#endif
-#ifndef STATUS_OBJECT_PATH_INVALID
-#define STATUS_OBJECT_PATH_INVALID ((NTSTATUS)0xC0000039L)
-#endif
-//
-// Constant Declarations for UTF8 Encoding
-//
-
-#define ASCII 0x007f
-
-#define UTF8_2_MAX 0x07ff // max UTF8 2-byte sequence (32 * 64 =2048)
-#define UTF8_1ST_OF_2 0xc0 // 110x xxxx
-#define UTF8_1ST_OF_3 0xe0 // 1110 xxxx
-#define UTF8_1ST_OF_4 0xf0 // 1111 xxxx
-#define UTF8_TRAIL 0x80 // 10xx xxxx
-
-#define HIGHER_6_BIT(u) ((u) >> 12)
-#define MIDDLE_6_BIT(u) (((u) & 0x0fc0) >> 6)
-#define LOWER_6_BIT(u) ((u) & 0x003f)
-
-#define BIT7(a) ((a) & 0x80)
-#define BIT6(a) ((a) & 0x40)
-
-#define HIGH_SURROGATE_START 0xd800
-#define HIGH_SURROGATE_END 0xdbff
-#define LOW_SURROGATE_START 0xdc00
-#define LOW_SURROGATE_END 0xdfff
-
-#define EMIT_CHAR(ch) \
- do { \
- pDest[0] = (ch); \
- pDest += 1; \
- BytesCopied += 2; \
- } while (0)
-
-typedef enum _URL_TYPE
-{
- UrlTypeUtf8,
- UrlTypeAnsi,
- UrlTypeDbcs
-} URL_TYPE;
-
-typedef enum _URL_PART
-{
- Scheme,
- HostName,
- AbsPath,
- QueryString
-
-} URL_PART;
-
-#define IS_UTF8_TRAILBYTE(ch) (((ch) & 0xc0) == 0x80)
-
-//
-// These are copied from RTL NLS routines.
-//
-
-#define DBCS_TABLE_SIZE 256
-extern PUSHORT NlsLeadByteInfo;
-
-#define LeadByteTable (*(PUSHORT *)NlsLeadByteInfo)
-#define IS_LEAD_BYTE(c) (IsDBCSLeadByte(c))
-
-ULONG HttpChars[256];
-USHORT FastPopChars[256];
-USHORT DummyPopChars[256];
-WCHAR FastUpcaseChars[256];
-BOOL g_UlEnableNonUTF8;
-BOOL g_UlEnableDBCS;
-BOOL g_UlFavorDBCS;
-
-// RtlNtStatusToDosError is nowhere defined, should be used through
-// native code "reflection"
-typedef ULONG (RTL_NT_STATUS_TO_DOS_ERROR_PROC)(NTSTATUS);
-static RTL_NT_STATUS_TO_DOS_ERROR_PROC* rtlNtStatusToDosErrorProc = NULL;
-static HMODULE lib = NULL;
-
-HRESULT
-WIN32_FROM_NTSTATUS(
- __in NTSTATUS status,
- __out DWORD * pResult
- )
-{
- HRESULT hr = S_OK;
- if (pResult == NULL)
- {
- hr = E_INVALIDARG;
- goto Finished;
- }
- if (lib == NULL)
- {
- lib = GetModuleHandle(L"Ntdll.dll");
- if (lib == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
- goto Finished;
- }
- }
- if (rtlNtStatusToDosErrorProc == NULL)
- {
- rtlNtStatusToDosErrorProc =
- (RTL_NT_STATUS_TO_DOS_ERROR_PROC*)GetProcAddress(
- lib, "RtlNtStatusToDosError");
- if (rtlNtStatusToDosErrorProc == NULL)
- {
- hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
- goto Finished;
- }
- }
- *pResult = rtlNtStatusToDosErrorProc(status);
-
-Finished:
- return hr;
-}
-
-NTSTATUS
-Unescape(
- IN PUCHAR pChar,
- OUT PUCHAR pOutChar
- )
-
-{
- UCHAR Result, Digit;
-
- if (pChar[0] != '%' ||
- SAFEIsXDigit(pChar[1]) == FALSE ||
- SAFEIsXDigit(pChar[2]) == FALSE)
- {
- return STATUS_OBJECT_PATH_SYNTAX_BAD;
- }
-
- //
- // HexToChar() inlined
- //
-
- // uppercase #1
- //
- if (SAFEIsAlpha(pChar[1]))
- Digit = (UCHAR) toupper(pChar[1]);
- else
- Digit = pChar[1];
-
- Result = ((Digit >= 'A') ? (Digit - 'A' + 0xA) : (Digit - '0')) << 4;
-
- // uppercase #2
- //
- if (SAFEIsAlpha(pChar[2]))
- Digit = (UCHAR) toupper(pChar[2]);
- else
- Digit = pChar[2];
-
- Result |= (Digit >= 'A') ? (Digit - 'A' + 0xA) : (Digit - '0');
-
- *pOutChar = Result;
-
- return STATUS_SUCCESS;
-
-} // Unescape
-
-//
-// PopChar is used only if the string is not UTF-8, or UrlPart != QueryString,
-// or the current character is '%' or its high bit is set. In all other cases,
-// the FastPopChars table is used for fast conversion.
-//
-
-__inline
-NTSTATUS
-PopChar(
- IN URL_TYPE UrlType,
- IN URL_PART UrlPart,
- __in LPSTR pChar,
- __out WCHAR * pUnicodeChar,
- __out WCHAR * pUnicodeChar2,
- OUT PULONG pCharToSkip
- )
-{
- NTSTATUS Status;
- WCHAR UnicodeChar = L'\0';
- WCHAR UnicodeChar2 = L'\0';
- UCHAR Char;
- UCHAR Trail1;
- UCHAR Trail2;
- UCHAR Trail3;
- ULONG CharToSkip;
-
- //
- // validate it as a valid url character
- //
-
- if (UrlPart != QueryString)
- {
- if (IS_URL_TOKEN((UCHAR)pChar[0]) == FALSE)
- {
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
- }
- else
- {
- //
- // Allow anything but linefeed in the query string.
- //
-
- if (pChar[0] == LF)
- {
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
-
- UnicodeChar = (USHORT) (UCHAR)pChar[0];
- CharToSkip = 1;
-
- // skip all the decoding stuff
- goto slash;
- }
-
- //
- // need to unescape ?
- //
- // can't decode the query string. that would be lossy decodeing
- // as '=' and '&' characters might be encoded, but have meaning
- // to the usermode parser.
- //
-
- if (pChar[0] == '%')
- {
- Status = Unescape((PUCHAR)pChar, &Char);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
- CharToSkip = 3;
- }
- else
- {
- Char = pChar[0];
- CharToSkip = 1;
- }
-
- if (UrlType == UrlTypeUtf8)
- {
- //
- // convert to unicode, checking for utf8 .
- //
- // 3 byte runs are the largest we can have. 16 bits in UCS-2 =
- // 3 bytes of (4+4,2+6,2+6) where it's code + char.
- // for a total of 6+6+4 char bits = 16 bits.
- //
-
- //
- // NOTE: we'll only bother to decode utf if it was escaped
- // thus the (CharToSkip == 3)
- //
- if ((CharToSkip == 3) && ((Char & 0xf8) == 0xf0))
- {
- // 4 byte run
- //
-
- // Unescape the next 3 trail bytes
- //
-
- Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail1);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
-
- CharToSkip += 3; // %xx
-
- Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail2);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
-
- CharToSkip += 3; // %xx
-
- Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail3);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
-
- CharToSkip += 3; // %xx
-
- if (IS_UTF8_TRAILBYTE(Trail1) == FALSE ||
- IS_UTF8_TRAILBYTE(Trail2) == FALSE ||
- IS_UTF8_TRAILBYTE(Trail3) == FALSE)
- {
- // bad utf!
- //
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
-
- // handle four byte case - convert to utf-16
- // 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
-
- UnicodeChar = ((USHORT) ((Char & 0x07) << 8) |
- ((Trail1 & 0x3f) << 2) |
- ((Trail2 & 0x30) >> 4)) + 0xD7C0;
- UnicodeChar2 = ((USHORT) ((Trail2 & 0x0f) << 6) |
- (Trail3 & 0x3f)) | 0xDC00;
- }
- else if ((CharToSkip == 3) && ((Char & 0xf0) == 0xe0))
- {
- // 3 byte run
- //
-
- // Unescape the next 2 trail bytes
- //
-
- Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail1);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
-
- CharToSkip += 3; // %xx
-
- Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail2);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
-
- CharToSkip += 3; // %xx
-
- if (IS_UTF8_TRAILBYTE(Trail1) == FALSE ||
- IS_UTF8_TRAILBYTE(Trail2) == FALSE)
- {
- // bad utf!
- //
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
-
- // handle three byte case
- // 1110xxxx 10xxxxxx 10xxxxxx
-
- UnicodeChar = (USHORT) (((Char & 0x0f) << 12) |
- ((Trail1 & 0x3f) << 6) |
- (Trail2 & 0x3f));
-
- }
- else if ((CharToSkip == 3) && ((Char & 0xe0) == 0xc0))
- {
- // 2 byte run
- //
-
- // Unescape the next 1 trail byte
- //
-
- Status = Unescape((PUCHAR)pChar+CharToSkip, &Trail1);
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
-
- CharToSkip += 3; // %xx
-
- if (IS_UTF8_TRAILBYTE(Trail1) == FALSE)
- {
- // bad utf!
- //
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
-
- // handle two byte case
- // 110xxxxx 10xxxxxx
-
- UnicodeChar = (USHORT) (((Char & 0x1f) << 6) |
- (Trail1 & 0x3f));
-
- }
-
- // now this can either be unescaped high-bit (bad)
- // or escaped high-bit. (also bad)
- //
- // thus not checking CharToSkip
- //
-
- else if ((Char & 0x80) == 0x80)
- {
- // high bit set ! bad utf!
- //
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
-
- }
- //
- // Normal character (again either escaped or unescaped)
- //
- else
- {
- //
- // Simple conversion to unicode, it's 7-bit ascii.
- //
-
- UnicodeChar = (USHORT)Char;
- }
-
- }
- else // UrlType != UrlTypeUtf8
- {
- UCHAR AnsiChar[2];
- ULONG AnsiCharSize;
-
- //
- // Convert ANSI character to Unicode.
- // If the UrlType is UrlTypeDbcs, then we may have
- // a DBCS lead/trail pair.
- //
-
- if (UrlType == UrlTypeDbcs && IS_LEAD_BYTE(Char))
- {
- UCHAR SecondByte;
-
- //
- // This is a double-byte character.
- //
-
- SecondByte = *(pChar+CharToSkip);
-
- AnsiCharSize = 2;
- AnsiChar[0] = Char;
-
- if (SecondByte == '%')
- {
- Status = Unescape((PUCHAR)pChar+CharToSkip, &AnsiChar[1]);
- if (!NT_SUCCESS(Status))
- {
- goto end;
- }
-
- CharToSkip += 3; // %xx
- }
- else
- {
- AnsiChar[1] = SecondByte;
- CharToSkip += 1;
- }
-
- }
- else
- {
- //
- // This is a single-byte character.
- //
-
- AnsiCharSize = 1;
- AnsiChar[0] = Char;
-
- }
- /*
- Status = RtlMultiByteToUnicodeN(
- &UnicodeChar,
- sizeof(WCHAR),
- NULL,
- (PCHAR) &AnsiChar[0],
- AnsiCharSize
- );
- */
- Status = MultiByteToWideChar(
- CP_ACP,
- 0,
- (PCHAR) &AnsiChar[0],
- AnsiCharSize,
- &UnicodeChar,
- sizeof(WCHAR)
- );
-
- if (!NT_SUCCESS(Status))
- {
- goto end;
- }
- }
-
-
-slash:
- //
- // turn backslashes into forward slashes
- //
-
- if (UrlPart != QueryString && UnicodeChar == L'\\')
- {
- UnicodeChar = L'/';
- }
- else if (UnicodeChar == UNICODE_NULL)
- {
- //
- // we pop'd a NULL. bad!
- //
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
-
- *pCharToSkip = CharToSkip;
- *pUnicodeChar = UnicodeChar;
- *pUnicodeChar2 = UnicodeChar2;
-
- Status = STATUS_SUCCESS;
-
-end:
- return Status;
-
-} // PopChar
-
-
-//
-// Private constants.
-//
-
-#define ACTION_NOTHING 0x00000000
-#define ACTION_EMIT_CH 0x00010000
-#define ACTION_EMIT_DOT_CH 0x00020000
-#define ACTION_EMIT_DOT_DOT_CH 0x00030000
-#define ACTION_BACKUP 0x00040000
-#define ACTION_MASK 0xFFFF0000
-
-//
-// Private globals
-//
-
-//
-// this table says what to do based on the current state and the current
-// character
-//
-ULONG pActionTable[16] =
-{
- //
- // state 0 = fresh, seen nothing exciting yet
- //
- ACTION_EMIT_CH, // other = emit it state = 0
- ACTION_EMIT_CH, // "." = emit it state = 0
- ACTION_NOTHING, // EOS = normal finish state = 4
- ACTION_EMIT_CH, // "/" = we saw the "/", emit it state = 1
-
- //
- // state 1 = we saw a "/" !
- //
- ACTION_EMIT_CH, // other = emit it, state = 0
- ACTION_NOTHING, // "." = eat it, state = 2
- ACTION_NOTHING, // EOS = normal finish state = 4
- ACTION_NOTHING, // "/" = extra slash, eat it, state = 1
-
- //
- // state 2 = we saw a "/" and ate a "." !
- //
- ACTION_EMIT_DOT_CH, // other = emit the dot we ate. state = 0
- ACTION_NOTHING, // "." = eat it, a .. state = 3
- ACTION_NOTHING, // EOS = normal finish state = 4
- ACTION_NOTHING, // "/" = we ate a "/./", swallow it state = 1
-
- //
- // state 3 = we saw a "/" and ate a ".." !
- //
- ACTION_EMIT_DOT_DOT_CH, // other = emit the "..". state = 0
- ACTION_EMIT_DOT_DOT_CH, // "." = 3 dots, emit the ".." state = 0
- ACTION_BACKUP, // EOS = we have a "/..\0", backup! state = 4
- ACTION_BACKUP // "/" = we have a "/../", backup! state = 1
-};
-
-//
-// this table says which newstate to be in given the current state and the
-// character we saw
-//
-ULONG pNextStateTable[16] =
-{
- // state 0
- 0 , // other
- 0 , // "."
- 4 , // EOS
- 1 , // "\"
-
- // state 1
- 0 , // other
- 2 , // "."
- 4 , // EOS
- 1 , // "\"
-
- // state 2
- 0 , // other
- 3 , // "."
- 4 , // EOS
- 1 , // "\"
-
- // state 3
- 0 , // other
- 0 , // "."
- 4 , // EOS
- 1 // "\"
-};
-
-//
-// this says how to index into pNextStateTable given our current state.
-//
-// since max states = 4, we calculate the index by multiplying with 4.
-//
-#define IndexFromState( st) ( (st) * 4)
-
-
-/***************************************************************************++
-
-Routine Description:
-
- This function can be told to clean up UTF-8, ANSI, or DBCS URLs.
-
- Unescape
- Convert backslash to forward slash
- Remove double slashes (empty directiories names) - e.g. // or \\
- Handle /./
- Handle /../
- Convert to unicode
- computes the case insensitive hash
-
-Arguments:
-
-
-Return Value:
-
- NTSTATUS - Completion status.
-
-
---***************************************************************************/
-NTSTATUS
-UlpCleanAndCopyUrlByType(
- IN URL_TYPE UrlType,
- IN URL_PART UrlPart,
- __inout PWSTR pDestination,
- __in_ecount(SourceLength) LPSTR pSource,
- IN ULONG SourceLength,
- OUT PULONG pBytesCopied,
- __deref_opt_out_opt PWSTR * ppQueryString
- )
-{
- NTSTATUS Status;
- PWSTR pDest;
- PUCHAR pChar;
- ULONG CharToSkip;
- ULONG BytesCopied;
- PWSTR pQueryString;
- ULONG StateIndex;
- WCHAR UnicodeChar;
- WCHAR UnicodeChar2 = L'\0';
- BOOLEAN MakeCanonical;
- PUSHORT pFastPopChar;
-
- pDest = pDestination;
- pQueryString = NULL;
- BytesCopied = 0;
-
- pChar = (PUCHAR)pSource;
- CharToSkip = 0;
-
- StateIndex = 0;
-
- MakeCanonical = (UrlPart == AbsPath) ? TRUE : FALSE;
-
- if (UrlType == UrlTypeUtf8 && UrlPart != QueryString)
- {
- pFastPopChar = FastPopChars;
- }
- else
- {
- pFastPopChar = DummyPopChars;
- }
-
- while (SourceLength > 0)
- {
- //
- // advance ! it's at the top of the loop to enable ANSI_NULL to
- // come through ONCE
- //
-
- pChar += CharToSkip;
- SourceLength -= CharToSkip;
-
- //
- // well? have we hit the end?
- //
-
- if (SourceLength == 0)
- {
- UnicodeChar = UNICODE_NULL;
- UnicodeChar2 = UNICODE_NULL;
- }
- else
- {
- //
- // Nope. Peek briefly to see if we hit the query string
- //
-
- if (UrlPart == AbsPath && pChar[0] == '?')
- {
- DBG_ASSERT(pQueryString == NULL);
-
- //
- // remember it's location
- //
-
- pQueryString = pDest;
-
- //
- // let it fall through ONCE to the canonical
- // in order to handle a trailing "/.." like
- // "http://hostname:80/a/b/..?v=1&v2"
- //
-
- UnicodeChar = L'?';
- UnicodeChar2 = UNICODE_NULL;
- CharToSkip = 1;
-
- //
- // now we are cleaning the query string
- //
-
- UrlPart = QueryString;
-
- //
- // cannot use fast path for PopChar anymore
- //
-
- pFastPopChar = DummyPopChars;
- }
- else
- {
- USHORT NextUnicodeChar = pFastPopChar[*pChar];
-
- //
- // Grab the next character. Try to be fast for the
- // normal character case. Otherwise call PopChar.
- //
-
- if (NextUnicodeChar == 0)
- {
- Status = PopChar(
- UrlType,
- UrlPart,
- (LPSTR)pChar,
- &UnicodeChar,
- &UnicodeChar2,
- &CharToSkip
- );
-
- if (NT_SUCCESS(Status) == FALSE)
- goto end;
- }
- else
- {
-#if DBG
- Status = PopChar(
- UrlType,
- UrlPart,
- (LPSTR)pChar,
- &UnicodeChar,
- &UnicodeChar2,
- &CharToSkip
- );
-
- DBG_ASSERT(NT_SUCCESS(Status));
- DBG_ASSERT(UnicodeChar == NextUnicodeChar);
- DBG_ASSERT(CharToSkip == 1);
-#endif
- UnicodeChar = NextUnicodeChar;
- UnicodeChar2 = UNICODE_NULL;
- CharToSkip = 1;
- }
- }
- }
-
- if (MakeCanonical)
- {
- //
- // now use the state machine to make it canonical .
- //
-
- //
- // from the old value of StateIndex, figure out our new base StateIndex
- //
- StateIndex = IndexFromState(pNextStateTable[StateIndex]);
-
- //
- // did we just hit the query string? this will only happen once
- // that we take this branch after hitting it, as we stop
- // processing after hitting it.
- //
-
- if (UrlPart == QueryString)
- {
- //
- // treat this just like we hit a NULL, EOS.
- //
-
- StateIndex += 2;
- }
- else
- {
- //
- // otherwise based the new state off of the char we
- // just popped.
- //
-
- switch (UnicodeChar)
- {
- case UNICODE_NULL: StateIndex += 2; break;
- case L'.': StateIndex += 1; break;
- case L'/': StateIndex += 3; break;
- default: StateIndex += 0; break;
- }
- }
-
- }
- else
- {
- StateIndex = (UnicodeChar == UNICODE_NULL) ? 2 : 0;
- }
-
- //
- // Perform the action associated with the state.
- //
-
- switch (pActionTable[StateIndex])
- {
- case ACTION_EMIT_DOT_DOT_CH:
-
- EMIT_CHAR(L'.');
-
- // fall through
-
- case ACTION_EMIT_DOT_CH:
-
- EMIT_CHAR(L'.');
-
- // fall through
-
- case ACTION_EMIT_CH:
-
- EMIT_CHAR(UnicodeChar);
- if (UnicodeChar2 != UNICODE_NULL)
- {
- EMIT_CHAR(UnicodeChar2);
- }
-
- // fall through
-
- case ACTION_NOTHING:
- break;
-
- case ACTION_BACKUP:
-
- //
- // pDest currently points 1 past the last '/'. backup over it and
- // find the preceding '/', set pDest to 1 past that one.
- //
-
- //
- // backup to the '/'
- //
-
- pDest -= 1;
- BytesCopied -= 2;
-
- DBG_ASSERT(pDest[0] == L'/');
-
- //
- // are we at the start of the string? that's bad, can't go back!
- //
-
- if (pDest == pDestination)
- {
- DBG_ASSERT(BytesCopied == 0);
- Status = STATUS_OBJECT_PATH_INVALID;
- goto end;
- }
-
- //
- // back up over the '/'
- //
-
- pDest -= 1;
- BytesCopied -= 2;
-
- DBG_ASSERT(pDest > pDestination);
-
- //
- // now find the previous slash
- //
-
- while (pDest > pDestination && pDest[0] != L'/')
- {
- pDest -= 1;
- BytesCopied -= 2;
- }
-
- //
- // we already have a slash, so don't have to store 1.
- //
-
- DBG_ASSERT(pDest[0] == L'/');
-
- //
- // simply skip it, as if we had emitted it just now
- //
-
- pDest += 1;
- BytesCopied += 2;
-
- break;
-
- default:
- DBG_ASSERT(!"http!UlpCleanAndCopyUrl: Invalid action code in state table!");
- Status = STATUS_OBJECT_PATH_SYNTAX_BAD;
- goto end;
- }
-
- //
- // Just hit the query string ?
- //
-
- if (MakeCanonical && UrlPart == QueryString)
- {
- //
- // Stop canonical processing
- //
-
- MakeCanonical = FALSE;
-
- //
- // Need to emit the '?', it wasn't emitted above
- //
-
- DBG_ASSERT(pActionTable[StateIndex] != ACTION_EMIT_CH);
-
- EMIT_CHAR(L'?');
-
- }
-
- }
-
- //
- // terminate the string, it hasn't been done in the loop
- //
-
- DBG_ASSERT((pDest-1)[0] != UNICODE_NULL);
-
- pDest[0] = UNICODE_NULL;
- *pBytesCopied = BytesCopied;
-
- if (ppQueryString != NULL)
- {
- *ppQueryString = pQueryString;
- }
-
- Status = STATUS_SUCCESS;
-
-
-end:
- return Status;
-
-} // UlpCleanAndCopyUrlByType
-
-
-/***************************************************************************++
-
-Routine Description:
-
-
- Unescape
- Convert backslash to forward slash
- Remove double slashes (empty directiories names) - e.g. // or \\
- Handle /./
- Handle /../
- Convert to unicode
-
-Arguments:
-
-Return Value:
-
- HRESULT
-
-
---***************************************************************************/
-HRESULT
-UlCleanAndCopyUrl(
- __in LPSTR pSource,
- IN ULONG SourceLength,
- OUT PULONG pBytesCopied,
- __inout PWSTR pDestination,
- __deref_opt_out_opt PWSTR * ppQueryString OPTIONAL
- )
-{
- NTSTATUS Status;
- URL_TYPE AnsiUrlType = g_UlEnableDBCS ? UrlTypeDbcs : UrlTypeAnsi;
-
- if (!g_UlEnableNonUTF8)
- {
- //
- // Only accept UTF-8 URLs.
- //
-
- Status = UlpCleanAndCopyUrlByType(
- UrlTypeUtf8,
- AbsPath,
- pDestination,
- pSource,
- SourceLength,
- pBytesCopied,
- ppQueryString
- );
-
- }
- else if (!g_UlFavorDBCS)
- {
- //
- // The URL may be either UTF-8 or ANSI. First
- // try UTF-8, and if that fails go for ANSI.
- //
-
- Status = UlpCleanAndCopyUrlByType(
- UrlTypeUtf8,
- AbsPath,
- pDestination,
- pSource,
- SourceLength,
- pBytesCopied,
- ppQueryString
- );
-
- if (!NT_SUCCESS(Status))
- {
- Status = UlpCleanAndCopyUrlByType(
- AnsiUrlType,
- AbsPath,
- pDestination,
- pSource,
- SourceLength,
- pBytesCopied,
- ppQueryString
- );
-
- }
-
- }
- else
- {
- //
- // The URL may be either ANSI or UTF-8. First
- // try the ANSI interpretation, and if that fails
- // go for UTF-8.
- //
- Status = UlpCleanAndCopyUrlByType(
- AnsiUrlType,
- AbsPath,
- pDestination,
- pSource,
- SourceLength,
- pBytesCopied,
- ppQueryString
- );
-
- if (!NT_SUCCESS(Status))
- {
- Status = UlpCleanAndCopyUrlByType(
- UrlTypeUtf8,
- AbsPath,
- pDestination,
- pSource,
- SourceLength,
- pBytesCopied,
- ppQueryString
- );
-
- }
- }
-
- //
- // Convert NTSTATUS to HRESULT
- //
-
- if ( Status == STATUS_SUCCESS )
- {
- return S_OK;
- }
- else
- {
- DWORD dwErr = 0;
- if (SUCCEEDED(WIN32_FROM_NTSTATUS( Status, &dwErr )))
- {
- return HRESULT_FROM_WIN32( dwErr );
- }
- else
- {
- return Status;
- }
- }
-}
-
-HRESULT
-UlInitializeParsing(
- VOID
-)
-{
- ULONG i;
- UCHAR c;
- HKEY hKey;
- DWORD dwType;
- DWORD dwData;
- DWORD cbData;
-
- //
- // First read the HTTP registry settings on how to handle URLs
- //
-
- g_UlEnableNonUTF8 = TRUE;
- g_UlEnableDBCS = FALSE;
- g_UlFavorDBCS = FALSE;
-
- if ( RegOpenKeyEx( HKEY_LOCAL_MACHINE,
- L"System\\CurrentControlSet\\Services\\http\\Parameters",
- 0,
- KEY_READ,
- &hKey ) == ERROR_SUCCESS )
- {
- cbData = sizeof( dwData );
-
- if ( RegQueryValueEx( hKey,
- L"EnableNonUTF8",
- NULL,
- &dwType,
- (LPBYTE) &dwData,
- &cbData ) == ERROR_SUCCESS &&
- dwType == REG_DWORD )
- {
- g_UlEnableNonUTF8 = !!dwData;
- }
-
- cbData = sizeof( dwData );
-
- if ( g_UlEnableNonUTF8 )
- {
- if ( RegQueryValueEx( hKey,
- L"EnableDBCS",
- NULL,
- &dwType,
- (LPBYTE) &dwData,
- &cbData ) == ERROR_SUCCESS &&
- dwType == REG_DWORD )
- {
- g_UlEnableDBCS = !!dwData;
- }
- }
- else
- {
- g_UlEnableDBCS = FALSE;
- }
-
- cbData = sizeof( dwData );
-
- if ( g_UlEnableDBCS )
- {
- if ( RegQueryValueEx( hKey,
- L"FavorDBCS",
- NULL,
- &dwType,
- (LPBYTE) &dwData,
- &cbData ) == ERROR_SUCCESS &&
- dwType == REG_DWORD )
- {
- g_UlFavorDBCS = !!dwData;
- }
- }
- else
- {
- g_UlFavorDBCS = FALSE;
- }
-
- RegCloseKey( hKey );
- }
-
-
- // Initialize the HttpChars array appropriately.
-
- for (i = 0; i < 128; i++)
- {
- HttpChars[i] = HTTP_CHAR;
- }
-
- for (i = 'A'; i <= 'Z'; i++)
- {
- HttpChars[i] |= HTTP_UPCASE;
- }
-
- for (i = 'a'; i <= 'z'; i++)
- {
- HttpChars[i] |= HTTP_LOCASE;
- }
-
- for (i = '0'; i <= '9'; i++)
- {
- HttpChars[i] |= (HTTP_DIGIT | HTTP_HEX);
- }
-
-
- for (i = 0; i <= 31; i++)
- {
- HttpChars[i] |= HTTP_CTL;
- }
-
- HttpChars[127] |= HTTP_CTL;
-
- HttpChars[SP] |= HTTP_LWS;
- HttpChars[HT] |= HTTP_LWS;
-
-
- for (i = 'A'; i <= 'F'; i++)
- {
- HttpChars[i] |= HTTP_HEX;
- }
-
- for (i = 'a'; i <= 'f'; i++)
- {
- HttpChars[i] |= HTTP_HEX;
- }
-
- HttpChars['('] |= HTTP_SEPERATOR;
- HttpChars[')'] |= HTTP_SEPERATOR;
- HttpChars['<'] |= HTTP_SEPERATOR;
- HttpChars['>'] |= HTTP_SEPERATOR;
- HttpChars['@'] |= HTTP_SEPERATOR;
- HttpChars[','] |= HTTP_SEPERATOR;
- HttpChars[';'] |= HTTP_SEPERATOR;
- HttpChars[':'] |= HTTP_SEPERATOR;
- HttpChars['\\'] |= HTTP_SEPERATOR;
- HttpChars['"'] |= HTTP_SEPERATOR;
- HttpChars['/'] |= HTTP_SEPERATOR;
- HttpChars['['] |= HTTP_SEPERATOR;
- HttpChars[']'] |= HTTP_SEPERATOR;
- HttpChars['?'] |= HTTP_SEPERATOR;
- HttpChars['='] |= HTTP_SEPERATOR;
- HttpChars['{'] |= HTTP_SEPERATOR;
- HttpChars['}'] |= HTTP_SEPERATOR;
- HttpChars[SP] |= HTTP_SEPERATOR;
- HttpChars[HT] |= HTTP_SEPERATOR;
-
-
- //
- // URL "reserved" characters (rfc2396)
- //
-
- HttpChars[';'] |= URL_LEGAL;
- HttpChars['/'] |= URL_LEGAL;
- HttpChars['\\'] |= URL_LEGAL;
- HttpChars['?'] |= URL_LEGAL;
- HttpChars[':'] |= URL_LEGAL;
- HttpChars['@'] |= URL_LEGAL;
- HttpChars['&'] |= URL_LEGAL;
- HttpChars['='] |= URL_LEGAL;
- HttpChars['+'] |= URL_LEGAL;
- HttpChars['$'] |= URL_LEGAL;
- HttpChars[','] |= URL_LEGAL;
-
-
- //
- // URL escape character
- //
-
- HttpChars['%'] |= URL_LEGAL;
-
- //
- // URL "mark" characters (rfc2396)
- //
-
- HttpChars['-'] |= URL_LEGAL;
- HttpChars['_'] |= URL_LEGAL;
- HttpChars['.'] |= URL_LEGAL;
- HttpChars['!'] |= URL_LEGAL;
- HttpChars['~'] |= URL_LEGAL;
- HttpChars['*'] |= URL_LEGAL;
- HttpChars['\''] |= URL_LEGAL;
- HttpChars['('] |= URL_LEGAL;
- HttpChars[')'] |= URL_LEGAL;
-
-
- //
- // RFC2396 describes these characters as `unwise' "because gateways and
- // other transport agents are known to sometimes modify such characters,
- // or they are used as delimiters". However, for compatibility with
- // IIS 5.0 and DAV, we must allow these unwise characters in URLs.
- //
-
- HttpChars['{'] |= URL_LEGAL;
- HttpChars['}'] |= URL_LEGAL;
- HttpChars['|'] |= URL_LEGAL;
- HttpChars['^'] |= URL_LEGAL;
- HttpChars['['] |= URL_LEGAL;
- HttpChars[']'] |= URL_LEGAL;
- HttpChars['`'] |= URL_LEGAL;
-
- //
- // '#', '%', and '"' are not considered URL_LEGAL, according to the RFC.
- // However, IIS 5.0 allowed them, so we should too.
- //
-
- HttpChars['#'] |= URL_LEGAL;
- HttpChars['%'] |= URL_LEGAL;
- HttpChars['"'] |= URL_LEGAL;
-
- //
- // In DBCS locales we need to explicitly accept lead bytes which
- // we would normally reject.
- //
-
- if (0) // BUGBUG
- {
- for (i = 0; i < DBCS_TABLE_SIZE; i++)
- {
- if (IS_LEAD_BYTE((BYTE)i))
- {
- HttpChars[i] |= URL_LEGAL;
- }
- }
- }
-
- //
- // These US-ASCII characters are "excluded"; i.e. not URL_LEGAL (see RFC):
- // '<' | '>' | ' ' (0x20)
- // In addition, control characters (0x00-0x1F and 0x7F) and
- // non US-ASCII characters (0x80-0xFF) are not URL_LEGAL.
- //
-
- for (i = 0; i < 128; i++)
- {
- if (!IS_HTTP_SEPERATOR(i) && !IS_HTTP_CTL(i))
- {
- HttpChars[i] |= HTTP_TOKEN;
- }
- }
-
-
- //
- // Fast path for PopChar
- //
-
- RtlZeroMemory(FastPopChars, 256 * sizeof(USHORT));
- RtlZeroMemory(DummyPopChars, 256 * sizeof(USHORT));
-
- for (i = 0; i < 256; i++)
- {
- c = (UCHAR)i;
-
- if (IS_URL_TOKEN(c) && c != '%' && (c & 0x80) != 0x80)
- {
- FastPopChars[i] = (USHORT)c;
- }
- }
-
- //
- // Turn backslashes into forward slashes
- //
-
- FastPopChars['\\'] = L'/';
-
-
- //
- // Fast path for UpcaseUnicodeChar
- //
-
- for (i = 0; i < 256; i++)
- {
- FastUpcaseChars[i] = towupper((WCHAR)i);
- }
-
-
- return S_OK;
-}
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx
deleted file mode 100644
index 22c31a0ed2..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/IIS-Common/lib/util.cxx
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT license.
-
-#include "precomp.h"
-
-HRESULT
-MakePathCanonicalizationProof(
- IN PCWSTR pszName,
- OUT STRU * pstrPath
-)
-/*++
-
-Routine Description:
-
- This functions adds a prefix
- to the string, which is "\\?\UNC\" for a UNC path, and "\\?\" for
- other paths. This prefix tells Windows not to parse the path.
-
-Arguments:
-
- IN pszName - The path to be converted
- OUT pstrPath - Output path created
-
-Return Values:
-
- HRESULT
-
---*/
-{
- HRESULT hr;
-
- if (pszName[0] == L'\\' && pszName[1] == L'\\')
- {
- //
- // If the path is already canonicalized, just return
- //
-
- if ((pszName[2] == '?' || pszName[2] == '.') &&
- pszName[3] == '\\')
- {
- hr = pstrPath->Copy(pszName);
-
- if (SUCCEEDED(hr))
- {
- //
- // If the path was in DOS form ("\\.\"),
- // we need to change it to Win32 from ("\\?\")
- //
-
- pstrPath->QueryStr()[2] = L'?';
- }
-
- return hr;
- }
-
- pszName += 2;
-
-
- if (FAILED(hr = pstrPath->Copy(L"\\\\?\\UNC\\")))
- {
- return hr;
- }
- }
- else
- {
- if (FAILED(hr = pstrPath->Copy(L"\\\\?\\")))
- {
- return hr;
- }
- }
-
- return pstrPath->Append(pszName);
-}
-
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/lib/iisca.vcxproj b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/lib/iisca.vcxproj
index 7b3ee0ebbb..4d3383bd08 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/lib/iisca.vcxproj
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/lib/iisca.vcxproj
@@ -76,8 +76,6 @@
<ProjectGuid>{7324770c-0871-4d73-be3d-5e2f3e9e1b1e}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>iisca</RootNamespace>
- <WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.18362.0</WindowsTargetPlatformVersion>
- <PlatformToolsetVersion>v142</PlatformToolsetVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup>
@@ -86,9 +84,6 @@
<PlatformToolset>$(PlatformToolsetVersion)</PlatformToolset>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
- <PropertyGroup Label="Configuration">
- <VCToolsVersion>14.29.30133</VCToolsVersion>
- </PropertyGroup>
<PropertyGroup>
<AdditionalIncludeDirectories>$(IIS-Common)version;$(IIS-Common)Include;$(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PrecompiledHeader>Create</PrecompiledHeader>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/wix/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/wix/setupstrings.wxl
deleted file mode 100644
index ccb1a67cfb..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/iisca/wix/setupstrings.wxl
+++ /dev/null
@@ -1,255 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="en-us" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1033</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Shared Config Install Options</String>
- <String Id="SharedConfigDlgDescription">Select option for installation to IIS shared configuration</String>
- <String Id="SharedConfigDlgCheckBox">Update shared configuration on install</String>
- <String Id="SharedConfigDlgText">You are installing this module onto an IIS server that is using shared configuration. If additional IIS servers are using this shared configuration then you will need to install this module onto all of these machines. To minimize disruption of the individual web servers you will need to install this module in the following steps: First, on all but the last of the machines you should install the module without updating shared config. Do this by not selecting the checkbox
- below. This will install all binaries and files necessary for the module on each machine without making any changes to shared config. Second, on the last machine you will need to verify that the user idenity you are running under has read and write access to the applicationhost.config file on the UNC share. Then you should install the module and select the update shared config option below. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Initializing WebConfig custom action</String>
- <String Id="ProgressText_WebConfigUpdate">Updating web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS Advanced Logging</String>
- <String Id="AdvancedLoggingDescription">Enables advanced logging of IIS pipeline data.</String>
- <String Id="AdvancedLoggingUI">IIS Advanced Logging</String>
- <String Id="AdvancedLoggingUIDescription">Enables creation of custom log files with extensible field selection.</String>
- <String Id="AdvancedLoggingUpdate01">Update for IIS Advanced Logging</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Enables the Transform Manager IIS Media Services.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">Enables creation of media transforms.</String>
- <String Id="TransformManagerServiceHostName">IIS Transform Manager Host</String>
- <String Id="TransformManagerServiceHostDescription">Service host for [ProductName].</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">Batch convert on-demand media files to alternate file and container formats.</String>
- <String Id="TransformManagerEESPTaskInstalled">An IIS Transform Manager 1.0 Expression Encoder SP Task package is installed on the computer. You must uninstall it before you can install [ProductName].</String>
-
- <String Id="NetFx35Required">Microsoft .NET Framework 3.5 is required to install [ProductName]. Use the 'Add Features Wizard' in Server Manager to install .NET Framework 3.5.1 Features or use 'Turn Windows features on or off' to turn on Microsoft .NET Framework 3.5.</String>
- <String Id="VistaSP1Required">[ProductName] requires Microsoft Windows Vista Service Pack 1 or later.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName] cannot be installed on Vista Home Basic.</String>
- <String Id="Windows7SP1Required">[ProductName] requires Microsoft Windows 7 Service Pack 1 or later.</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft Web Management Service</String>
- <String Id="WMSvcBasicFeatureDescription">Installs the basic features of the [ProductName].</String>
- <String Id="WMSvcServiceName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcServiceDescription">The Web Management Service enables remote and delegated management capabilities for administrators to manage for the Web server, sites and applications present on this machine.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Microsoft URL Rewrite Module 1.1 for IIS 7</String>
- <String Id="RewriteServicingPatchV1">Update for URL Rewrite Module 1.1 for IIS 7</String>
- <String Id="RewriteModuleTitleV1">URL Rewrite</String>
- <String Id="RewriteModuleDescriptionV1">Enables URL and content rewriting capabilities to IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">User Interface</String>
- <String Id="RewriteModuleUIDescriptionV1">Configures the URL Rewrite Module feature in IIS Manager.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL Rewrite Module 2</String>
- <String Id="RewriteServicingPatch">Update for IIS URL Rewrite Module 2</String>
- <String Id="RewriteModuleTitle">URL Rewrite</String>
- <String Id="RewriteModuleDescription">Enables URL and content rewriting capabilities to IIS 7.</String>
- <String Id="RewriteModuleUITitle">User Interface</String>
- <String Id="RewriteModuleUIDescription">Configures the URL Rewrite Module feature in IIS Manager.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Installs the basic features of the [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">This version of the operating system is not supported. [ProductName] can be installed only on Windows Server 2008, or Windows Vista Service Pack 1, and higher.</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.Net Features</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET includes Authorization and Error Pages features, which let you manage your authorization and custom error settings.</String>
- <String Id="Authentication" Overridable="yes">Authentication</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.Net Authentication Description.</String>
- <String Id="Authorization" Overridable="yes">Authorization</String>
- <String Id="AuthorizationDescription" Overridable="yes">ASP.NET Authorization lets you configure rules for authorizing users to access your Web sites and applications.</String>
- <String Id="ErrorPages" Overridable="yes">Error Pages</String>
- <String Id="ErrorPagesDescription" Overridable="yes">ASP.NET Error Pages lets you configure HTTP error responses to return when errors occur.</String>
- <String Id="Modules" Overridable="yes">Modules</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.Net Modules Description.</String>
- <String Id="Handlers" Overridable="yes">Handlers</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.Net Handers Description.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Configuration Editor</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Configuration Editor lets you manage your configuration files in IIS Manager by letting you edit sections, attributes, elements, and collections in your configuration files.</String>
- <String Id="RequestFiltering" Overridable="yes">Request Filtering</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Request Filtering lets you configure filtering rules for your Web site, and restrict protocol and content behavior.</String>
- <String Id="FastCgi" Overridable="yes">Fast CGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI lets you configure process pool settings for the FastCGI applications on your Web server.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Dynamic IP Restrictions for IIS 7 Setup </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[The setup wizard has detected that IIS built-in IP and Domain Restrictions is already installed. The setup wizard will uninstall the existing IP and Domain Restrictions in order to install Dynamic IP Restrictions. The existing IP security configuration will be preserved.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[This might take a few minutes.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Do you want to proceed?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamic IP Restrictions for IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamic IP Restrictions for IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamic IP Restrictions for IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamic IP Restrictions for IIS 7 - Release Candidate </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamic IP Restrictions for IIS 7 - Release Candidate 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamic IP Restrictions for IIS 7 - Release Candidate 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamic IP Restrictions for IIS 7</String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamic IP Restrictions for IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Dynamic IP Restrictions User Interface for IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Dynamic IP Restrictions for IIS 7 - Beta was found on this machine. Please uninstall it and try again</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 For IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">The IIS 7.0 CoreWebEngine and W3SVC features must be installed to use this product.</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV Server Module</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV Administration User Interface</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Search Engine Optimization (SEO) Toolkit 1.0</String>
- <String Id="SiteAnalyzerProductComments">This installer database contains the logic and data required to install IIS Search Engine Optimization Toolkit 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS Editor</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS Reports</String>
- <String Id="LogParserInstalled" Overridable="yes">Log Parser is not installed on this machine, Please install Log Parser 2.2 from http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 and then proceed with IIS Reports installation</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework is a requisite for installing Application Request Routing. Please install the Web Farm Framework.</String>
- <String Id="Arrv3ProductName">Microsoft Application Request Routing 3.0</String>
- <String Id="ArrModuleTitle">Runtime</String>
- <String Id="ArrModuleDescription">Adds the Application Request Routing capabilities to IIS.</String>
- <String Id="ArrUITitle">User Interface</String>
- <String Id="ArrUIDescription">Configures the Application Request Routing feature in IIS Manager.</String>
-
- <!-- Strings for CORS Module -->
- <String Id="CorsProductName">Microsoft CORS Module</String>
- <String Id="CorsModuleTitle">IIS CORS Runtime</String>
- <String Id="CorsModuleDescription">Adds the support of cross-origin resource sharing (CORS) to IIS.</String>
-
- <!-- Strings for IIS Compression -->
- <String Id="IisCompressionProductName">Microsoft IIS Compression</String>
- <String Id="IisCompressionTitle">IIS Compression</String>
- <String Id="IisCompressionDescription">Adds the Zlib and Brotli compression schemes to IIS.</String>
-
- <!-- Strings for Template Module -->
- <String Id="TemplateModuleProductName">IIS Team Template Module</String>
- <String Id="TemplateModuleTitle">Template Module Runtime</String>
- <String Id="TemplateModuleDescription">An example of an IIS module.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Microsoft Windows PowerShell snap-in for IIS 7.0</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS Manager Publishing for IIS 7.0</String>
- <String Id="PublishingFeatureName">Publishing User Interface</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 for IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">An incompatible product, [CONFLICTING_PRODUCT_NAME], is on this computer. Installation of [ProductName] cannot continue. To install this product, use Add/Remove Programs on the Control Panel to remove [CONFLICTING_PRODUCT_NAME].</String>
- <String Id="AdminRequired" Overridable="yes">Administrator privilege is required to install [ProductName].</String>
- <String Id="IIS7Only" Overridable="yes">IIS Version 7.0 is required to use [ProductName].</String>
- <String Id="IIS7OrGreater" Overridable="yes">IIS Version 7.0 or greater is required to install [ProductName].</String>
- <String Id="IIS75OrGreater" Overridable="yes">IIS Version 7.5 or greater is required to install [ProductName].</String>
- <String Id="IIS7Or75Only" Overridable="yes">IIS Version 7 or 7.5 is required to install [ProductName].</String>
- <String Id="IIS8OrGreater" Overridable="yes">IIS Version 8.0 or greater is required to install [ProductName].</String>
- <String Id="BetaVersionFound" Overridable="yes">The beta version of [ProductName] was found on this machine.</String>
- <String Id="NewerVersionFound" Overridable="yes">A newer version of [ProductName] was found on this machine.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Setup cannot continue because another instance of [ProductName] is already installed on this computer. Please uninstall it first and then re-launch this installation.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">The IIS 7.0 CoreWebEngine and W3SVC features must be installed to use [ProductName].</String>
- <String Id="IISManagementConsole" Overridable="yes">The IIS Management Console must be installed to use [ProductName].</String>
- <String Id="WebServicesRunning" Overridable="yes">Please stop both services Windows Process Activation Service (WAS) and Web Management Service (WMSvc) before installing [ProductName]. You will need to start the services after installing [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">IIS Metabase is required to install [ProductName].</String>
- <String Id="LaunchCondition_32BIT">The 64-bit version of [ProductName] cannot be installed on a 32-bit edition of Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">The 32-bit version of [ProductName] cannot be installed on a 64-bit edition of Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">Microsoft .NET Framework Version 2.0 or greater is required to install [ProductName].</String>
- <String Id="NetFX35OrGreaterRequired">Microsoft .NET Framework Version 3.5 or greater is required to install [ProductName]. Use 'Add Features' under the Server Manager to install Microsoft .Net Version 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">Microsoft .NET Framework Version 4.0 or greater is required to install [ProductName].</String>
- <String Id="NetFX20SP1IsRequired">Please install Microsoft .NET Framework Version 2.0 Service Pack 1 (or a later service pack), before installing [ProductName].</String>
- <String Id="WindowsUpdateEnabled">The Windows Update (wuauserv) service cannot be disabled, it is required to install [ProductName].</String>
- <String Id="GetFromOSforWin7">The PowerShell snap-in is part of Windows Operating System. Please install it via 'Programs and Features' or 'Server Manager'.</String>
- <String Id="WebPI3OrGreaterRequired">Microsoft Web Platform Installer Version 3.0 or greater is required to install [ProductName].</String>
-
- <String Id="Error30001" Overridable="yes">Setup failed to detect shared configuration.</String>
- <String Id="Error30002" Overridable="yes">Shared configuration is enabled for IIS. Installing [ProductName] is not supported when using shared configuration. Please disable shared configuration before installing this feature.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Please stop World Wide Web Publishing Service (W3SVC) before installing [ProductName]. You will need to start the service after installation. </String>
- <String Id="IISPowershellConsole">IIS PowerShell Management Console</String>
- <String Id="IISPowershellSnapin">IIS PowerShell snap-in</String>
- <String Id="PowerShellRequired">IIS PowerShell snap-in requires PowerShell v1.0 or v2.0 installed</String>
- <String Id="WasAndConfigRequired">IIS PowerShell snap-in requires WAS and configuration installed</String>
- <String Id="TestBogusString" Overridable="yes">This is a bogus string.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework Version 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent Version 2.2</String>
- <String Id="WebFarmBasicFeatureName">Web Farm Service</String>
- <String Id="WebFarmBasicFeatureDescription">Web Farm Service</String>
- <String Id="WebFarmControllerServiceName">Web Farm Controller Service</String>
- <String Id="WebFarmControllerServiceDescription">Web Farm Controller Service</String>
- <String Id="WebFarmAgentServiceName">Web Farm Agent Service</String>
- <String Id="WebFarmAgentServiceDescription">Web Farm Agent Service</String>
- <String Id="WebPIRequired">Web Platform Installer is a pre-requisite for installing Web Farm Framework. Please install the Web Plaform Installer from http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">Web Deployment Tool is a pre-requisite for installing Web Farm Framework. Please install the Web Deployment Tool from http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Web Hosting roles and features.</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework provides API's and PowerShell commands for managing the Web Hosting.</String>
- <String Id="WebHostingWebRoleFeatureName">Web Role</String>
- <String Id="WebHostingWebRoleFeatureDescription">Web Role installs Dynamic WAS service and URL Rewrite provider for Web Hosting.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Deploys a Control Panel configuration optimized for single machine setup.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Load Balancer Role</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Load Balancer Role configures Application Request Router to route based on Web Hosting rules.</String>
- <String Id="WebHostingControllerFeatureName">Hosting Controller</String>
- <String Id="WebHostingControllerFeatureDescription">Hosting Controller extends the Web Farm Framework 2.0 to work with Web Hosting.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Publishing Role</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Installs support for Web Deploy and FTP publishing.</String>
- <String Id="WebHostingPowerShellSnapInDescription">This is a PowerShell snap-in that contains cmdlets for managing Microsoft Web Hosting infrastructure.</String>
- <String Id="DWASServiceName">Dynamic WAS Service</String>
- <String Id="DWASServiceDescription">Windows Process Activation service optimized for high density Web Hosting.</String>
- <String Id="MeteringFeatureName">Resource Metering Service</String>
- <String Id="MeteringFeatureDescription">Installs the Resource Metering service that enables collecting and publishing both runtime and health information.</String>
- <String Id="MeteringServiceName">Resource Metering</String>
- <String Id="MeteringServiceDescription">Enables collecting and publishing runtime and health information from Web Role.</String>
- <String Id="QuotaEnforcementServiceName">Hosting Quota Enforcement</String>
- <String Id="QuotaEnforcementServiceDescription">Monitors the web sites resource usage and executes custom actions when usage quota is exceeded.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHS/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHS/misc/setupstrings.wxl
deleted file mode 100644
index 3acd415df3..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHS/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="zh-cn" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">2052</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">共享配置安装选项</String>
- <String Id="SharedConfigDlgDescription">选择用于安装到 IIS 共享配置的选项</String>
- <String Id="SharedConfigDlgCheckBox">安装时更新共享配置</String>
- <String Id="SharedConfigDlgText">您要将此模块安装到使用共享配置的 IIS 服务器上。如果其他 IIS 服务器正在使用此共享配置,则您需要将此模块安装到所有这些计算机上。为了尽可能减少对各个 Web 服务器的中断,您需要按以下步骤安装此模块: 首先,在除最后一台计算机外的所有其他计算机上,安装此模块但不更新共享配置。可通过不选中下面的复选框来执行
-此操作。这将在每台计算机上安装模块所需的所有二进制文件和其他文件,而不对共享配置进行任何更改。其次,在最后一台计算机上,您需要确保运行时使用的用户标识对 UNC 共享上的 applicationhost.config 文件具有读取和写入权限。然后,您应安装此模块并选中下面的更新共享配置选项。</String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">正在初始化 WebConfig 自定义操作</String>
- <String Id="ProgressText_WebConfigUpdate">正在更新 web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS 高级日志</String>
- <String Id="AdvancedLoggingDescription">启用 IIS 管道数据高级日志。</String>
- <String Id="AdvancedLoggingUI">IIS 高级日志</String>
- <String Id="AdvancedLoggingUIDescription">允许通过选择可扩展的字段来创建自定义日志文件。</String>
- <String Id="AdvancedLoggingUpdate01">适用于 IIS 高级日志记录的更新</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">启用 Transform Manager IIS 媒体服务。</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">允许创建媒体转换。</String>
- <String Id="TransformManagerServiceHostName">IIS Transform Manager 主机</String>
- <String Id="TransformManagerServiceHostDescription">[ProductName] 的服务主机。</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">根据需要将媒体文件批量转换为其他文件和容器格式。</String>
- <String Id="TransformManagerEESPTaskInstalled">计算机上安装了某个 IIS Transform Manager 1.0 表达式编码器 SP 任务包。您必须先将它卸载,然后才能安装 [ProductName]。</String>
-
- <String Id="NetFx35Required">安装 [ProductName] 需要 Microsoft .NET Framework 3.5。可在服务器管理器中使用“添加功能向导”来安装 .NET Framework 3.5.1 功能,或使用“打开或关闭 Windows 功能”来打开 Microsoft .NET Framework 3.5。</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS 数字版权管理</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">启用平滑流式处理演示的数字版权管理。</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">未安装 ASP.NET</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[必须先在服务器管理器中为 Web 服务器(IIS)角色安装 ASP.NET 角色服务,然后才能针对 Web 播放列表中的 ASP.NET 会话状态持续性安装会话帮助程序。若要继续安装 Media Services,而不安装 ASP.NET 的会话帮助程序,请单击“上一步”并从要安装的功能列表中删除会话帮助程序。否则,请单击“取消”,在服务器管理器中安装 ASP.NET 角色服务,然后再次运行 IIS Media Services 安装程序。]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Web 播放列表无法使用 ASP.NET 会话持续性提供程序,除非安装了适用于 Web 服务器(IIS)的 ASP.NET 角色服务。如果要将 ASP.NET 会话持续性与 Web 播放列表结合使用,请在服务器管理器中为 Web 服务器(IIS)安装 ASP.NET 角色服务。
-
-如果目前不想安装会话帮助程序功能,可以单击“上一步”并取消选择该功能。
-
-如果安装 ASP.NET 角色服务,则可以从控制面板的“程序和功能”菜单中更改此产品的已安装功能。]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">此计算机上找到了 IIS 平滑流式处理 - Beta。无法继续安装 [ProductName]。若要安装此产品,请使用控制面板中的“添加/删除程序”将 IIS 平滑流式处理 - Beta 删除。</String>
- <String Id="IncompatibleMediaServicesVersionFound">此计算机上装有 IIS Media Services 的不兼容版本。无法继续安装 [ProductName]。若要安装此产品,请使用控制面板中的“添加/删除程序”将 IIS Media Services 删除。</String>
- <String Id="NewerMediaServicesVersionFound">此计算机上已安装了该产品的新版本,或者可以在此计算机上安装该产品的新版本。无法继续安装 [ProductName]。若要安装该产品的新版本,请使用控制面板上的“添加/删除程序”更新 IIS Media Services。</String>
- <String Id="ISXConversionRequiredWarningTitle">需要进行播放列表文件转换</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[此版本不支持为以前版本的 Web 播放列表创建的播放列表文件。若要为这些播放列表创建此版本 Web 播放列表支持的副本,请运行 isxTranslate 转换工具,该工具可从 http://go.microsoft.com/fwlink/?LinkId=127838 中获得。]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">发现早期版本的 IIS Media Services 文件</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[此计算机上安装了一项或多项早期版本的 Media Services 功能。IIS Media Services 安装程序必须更新以前安装的所有 Media Services 功能,才能确保 IIS Media Services 中的这些功能可以正常运行。
-
-若要将以前安装的 Media Services 功能更新为当前版本,请单击“下一步”。如果不想更新以前安装的这些功能版本,请单击“取消”。]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">发现 Beta IIS Media Services 文件</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[在此计算机上安装了一个或多个 IIS Media Services 功能的 Beta 版本。IIS Media Services 安装程序无法继续。
-
-要安装此版本的 IIS Media Services,必须卸载 Beta 功能。]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">适用于 IIS Media Pack 1.0 的更新</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">适用于 IIS Media Services 2.0 的更新</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">适用于 IIS Media Services 3.0 的更新</String>
- <String Id="MediaServicesIISMediaDescription">IIS Media Services 功能和工具。</String>
- <String Id="MediaServicesBurbankDescription">IIS Media Services 5 Premium 功能和工具。</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Web 播放列表</String>
- <String Id="MediaServicesFeaturePlaylistDescription">对客户端播放在播放列表中引用的媒体资产的行为进行控制。</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">会话帮助程序</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">启用 ASP.NET 会话状态持续性。(需要适用于 Web 服务器(IIS)的 ASP.NET 角色服务)。</String>
- <String Id="MediaServicesFeaturePlaylistUI">用户界面</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">在 IIS 管理器中配置 Web 播放列表功能。</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">比特率限制</String>
- <String Id="MediaServicesFeatureBitrateDescription">对客户端下载的文件的传送进行限制,从而节省带宽。</String>
- <String Id="MediaServicesFeatureBitrateUI">用户界面</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">在 IIS 管理器中配置比特率限制功能。</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">资产</String>
- <String Id="MediaServicesFeatureSmoothDescription">对客户端的按需资产启用 HTTP 自适应流式处理。</String>
- <String Id="MediaServicesFeatureSmoothUI">用户界面</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">在 IIS 管理器中配置平滑流式处理功能。</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">频道</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">对客户端的频道广播启用 HTTP 自适应流式处理。</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">用户界面</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">在 IIS 管理器中配置实时平滑流式处理功能。</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">数字版权管理</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">提供平滑流式处理媒体的加密和许可。</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">用户界面</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">配置 IIS 管理器中的数字版权管理功能。</String>
-
- <String Id="VistaSP1Required">[ProductName] 需要 Microsoft Windows Vista Service Pack 1 或更高版本。</String>
- <String Id="VistaHomeBasicNotSupported">无法在 Vista Home Basic 上安装 [ProductName]。</String>
- <String Id="Windows7SP1Required">[ProductName] 需要 Microsoft Windows 7 Service Pack 1 或更高版本。</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS 数据库管理器</String>
- <String Id="DBManagerBasicFeatureName">IIS 数据库管理器</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft Web 管理服务 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft Web 管理服务</String>
- <String Id="WMSvcBasicFeatureDescription">安装 [ProductName] 的基本功能。</String>
- <String Id="WMSvcServiceName">Microsoft Web 管理服务 2</String>
- <String Id="WMSvcServiceDescription">Web 管理服务提供远程和委派管理功能,供管理员管理位于此计算机上的 Web 服务器、站点和应用程序。</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">用于 IIS 7 的 Microsoft URL 重写模块 1.1</String>
- <String Id="RewriteServicingPatchV1">对用于 IIS 7 的 URL 重写模块 1.1 的更新</String>
- <String Id="RewriteModuleTitleV1">URL 重写</String>
- <String Id="RewriteModuleDescriptionV1">对 IIS 7 启用 URL 和内容重写功能。</String>
- <String Id="RewriteModuleUITitleV1">用户界面</String>
- <String Id="RewriteModuleUIDescriptionV1">在 IIS 管理器中配置 URL 重写模块功能。</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL 重写模块 2</String>
- <String Id="RewriteServicingPatch">适用于 IIS URL 重写模块 2 的更新</String>
- <String Id="RewriteModuleTitle">URL 重写</String>
- <String Id="RewriteModuleDescription">对 IIS 7 启用 URL 和内容重写功能。</String>
- <String Id="RewriteModuleUITitle">用户界面</String>
- <String Id="RewriteModuleUIDescription">在 IIS 管理器中配置 URL 重写模块功能。</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">安装 [ProductName] 的基本功能。</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">不支持此操作系统版本。[ProductName] 只能安装在 Windows Server 2008 或 Windows Vista Service Pack 1 及更高版本上。</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.Net 功能</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET 包括“授权”和“错误页”功能,利用这些功能,您可以管理您的授权和自定义错误设置。</String>
- <String Id="Authentication" Overridable="yes">身份验证</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.Net 身份验证说明。</String>
- <String Id="Authorization" Overridable="yes">授权</String>
- <String Id="AuthorizationDescription" Overridable="yes">利用 ASP.NET 授权,您可以配置规则,以便允许用户访问您的网站和应用程序。</String>
- <String Id="ErrorPages" Overridable="yes">错误页</String>
- <String Id="ErrorPagesDescription" Overridable="yes">利用 ASP.NET 错误页,您可以配置要在发生错误时返回的 HTTP 错误响应。</String>
- <String Id="Modules" Overridable="yes">模块</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.Net 模块说明。</String>
- <String Id="Handlers" Overridable="yes">处理程序</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.Net 处理程序说明。</String>
- <String Id="ConfigurationEditor" Overridable="yes">配置编辑器</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">利用配置编辑器,您可以编辑配置文件中的节、属性、元素和集合,从而在 IIS 管理器中管理配置文件。</String>
- <String Id="RequestFiltering" Overridable="yes">请求筛选</String>
- <String Id="RequestFilteringDescription" Overridable="yes">利用请求筛选,您可以为您的网站配置筛选规则,并限制协议和内容行为。</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">利用 FastCGI,您可以在 Web 服务器上为 FastCGI 应用程序配置进程池设置。</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes">安装 Dynamic IP Restrictions for IIS 7</String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[安装向导检测到已安装 IIS 内置 IP 和域限制。此安装向导将卸载现有的 IP 和域限制,以便安装 Dynamic IP Restrictions。现有的 IP 安全配置将会保留。]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[此过程可能要花几分钟时间。]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[是否要继续?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamic IP Restrictions for IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamic IP Restrictions for IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamic IP Restrictions for IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamic IP Restrictions for IIS 7 - 候选发布 </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamic IP Restrictions for IIS 7 - 候选发布 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamic IP Restrictions for IIS 7 - 候选发布 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamic IP Restrictions for IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamic IP Restrictions for IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Dynamic IP Restrictions for IIS 7 用户界面</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> IIS 7 的动态 IP 限制 - 在此计算机上找到 Beta 版本。请卸载它,然后重试</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 For IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">若要使用此产品,必须安装 IIS 7.0 CoreWebEngine 和 W3SVC 功能。</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV 服务器模块</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV 管理用户界面</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS 搜索引擎优化工具包 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS 搜索引擎优化工具包 1.0</String>
- <String Id="SiteAnalyzerShortcutName">搜索引擎优化(SEO)工具包 1.0</String>
- <String Id="SiteAnalyzerProductComments">此安装程序数据库包含安装 IIS 搜索引擎优化工具包 1.0 所需的逻辑和数据。</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS 编辑器</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS Reports</String>
- <String Id="LogParserInstalled" Overridable="yes">未在此计算机上安装 Log Parser,请通过 http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 安装 Log Parser 2.2,然后继续安装 IIS Reports</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">未找到系统必备包。请运行 setup.exe 以解析依赖关系并安装此程序。</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 管理对象是安装 IIS 数据库管理器的必备组件。可以从 http://go.microsoft.com/fwlink/?LinkID=150946 安装 Micrsoft SQL Server 2008 管理对象。</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server System CLR Types 是安装 IIS 数据库管理器的必备组件。可以从 http://go.microsoft.com/fwlink/?LinkID=150949 安装 Microsoft SQL Server System CLR Types。</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework 是安装 Application Request Routing 的必备组件。请安装 Web Farm Framework。</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">运行时</String>
- <String Id="ArrModuleDescription">向 IIS 7 添加 Application Request Routing 功能。</String>
- <String Id="ArrUITitle">用户界面</String>
- <String Id="ArrUIDescription">在 IIS 管理器中配置应用程序请求路由功能。</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">用于 IIS 7.0 的 Microsoft Windows PowerShell 管理单元</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft Web 平台安装程序 4.0</String>
- <String Id="WebPIFeatureName">Microsoft Web 平台安装程序</String>
- <String Id="XPSP2Required">[ProductName] 需要 Windows XP SP2、Windows 2003 SP1、Windows Vista 或更高版本。</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] 需要 Windows XP Service Pack 3、Windows Server 2003 Service Pack 2 或更高版本。</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Microsoft Windows Azure 服务安装程序</String>
- <String Id="WASIFeatureName">Microsoft Windows Azure 服务安装程序</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Internet Information Services (IIS) 7+ 管理器</String>
- <String Id="RemoteMgrClientFeatureName">IIS 管理器客户端</String>
- <String Id="RemoteMgrRemotingFeatureName">远程支持</String>
- <String Id="RemoteMgrNotSupported">此产品需要 Windows XP SP2、Windows 2003 SP1、Windows Vista SP1 或 Windows 7 或更高版本</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">未安装 IIS 管理控制台,但需要此控制台才能管理远程 IIS 服务器。在安装远程管理支持之前,请先安装 IIS 管理控制台,方法是打开“控制面板”-&gt;“程序”-&gt;“打开或关闭 Windows 功能”,然后在 Ineternet Information Services 功能中选择 IIS 管理控制台。</String>
- <String Id="RemoteMgrNotRequired">此产品在 Windows Server 2008、Windows Server 2008 R2 或更高版本中不是必需的。请打开服务器管理器并在 Web 服务器角色的角色服务中选择 IIS 管理控制台,从而安装 IIS 管理控制台。</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS Manager Publishing for IIS 7.0</String>
- <String Id="PublishingFeatureName">Publishing 用户界面</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 for IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">此计算机上安装了不兼容的产品 [CONFLICTING_PRODUCT_NAME]。无法继续安装 [ProductName]。要安装此产品,请使用控制面板上的“添加/删除程序”来删除 [CONFLICTING_PRODUCT_NAME]。</String>
- <String Id="AdminRequired" Overridable="yes">若要安装 [ProductName],需要管理员特权。</String>
- <String Id="IIS7Only" Overridable="yes">若要使用 [ProductName],需要 IIS 7.0 版。</String>
- <String Id="IIS7OrGreater" Overridable="yes">若要安装 [ProductName],需要 IIS 7.0 版或更高版本。</String>
- <String Id="IIS75OrGreater" Overridable="yes">安装 [ProductName] 必须具有 IIS 7.5 版或更高版本。</String>
- <String Id="IIS7Or75Only" Overridable="yes">要安装 [产品名称],要求使用 IIS 版本 7 或 7.5。</String>
- <String Id="BetaVersionFound" Overridable="yes">已在此计算机上找到 [ProductName] 的 Beta 版本。</String>
- <String Id="NewerVersionFound" Overridable="yes">已在此计算机上找到 [ProductName] 的新版本。</String>
- <String Id="DuplicateVersionFound" Overridable="yes">安装程序无法继续,因为已在此计算机上安装了另一个 [ProductName] 实例。请先将其卸载,然后重新启动此安装。</String>
- <String Id="CoreWebW3SVC" Overridable="yes">若要使用 [ProductName],必须安装 IIS 7.0 CoreWebEngine 和 W3SVC 功能。</String>
- <String Id="IISManagementConsole" Overridable="yes">要使用 [ProductName],必须安装 IIS 管理控制台。</String>
- <String Id="WebServicesRunning" Overridable="yes">请先停止 Windows Process Activation Service (WAS)和 Web 管理服务(WMSvc),然后安装 [ProductName]。您将需要在安装 [ProductName] 后启动这两个服务。</String>
- <String Id="MetabaseRequired" Overridable="yes">若要安装 [ProductName],需要 IIS 元数据库。</String>
- <String Id="LaunchCondition_32BIT">无法在 32 位版本的 Microsoft Windows 上安装 64 位版本的 [ProductName]。</String>
- <String Id="LaunchCondition_64BIT">无法在 64 位版本的 Microsoft Windows 上安装 32 位版本的 [ProductName]。</String>
- <String Id="NetFX2OrGreaterRequired">若要安装 [ProductName],需要 Microsoft .NET Framework 2.0 版或更高版本。</String>
- <String Id="NetFX35OrGreaterRequired">需要有 Microsoft .NET Framework 3.5 版或更高版本才能安装 [ProductName]。使用“服务器管理器”下的“添加功能”可安装 Microsoft .Net 3.5 版。</String>
- <String Id="NetFX4OrGreaterRequired">需要有 Microsoft .NET Framework 4.0 版或更高版本才能安装 [ProductName]。</String>
- <String Id="NetFX20SP1IsRequired">请先安装 Microsoft .NET Framework 2.0 Service Pack 1(或更高版本的 Service Pack),然后再安装 [ProductName]。</String>
- <String Id="WindowsUpdateEnabled">不能禁用 Windows Update (wuauserv)服务,安装 [ProductName] 需要此服务。</String>
- <String Id="GetFromOSforWin7">PowerShell 管理单元是 Windows 操作系统的一部分。请通过“程序和功能”或“服务器管理器”来安装它。</String>
- <String Id="WebPI3OrGreaterRequired">需要有 Microsoft Web 平台安装程序 3.0 版或更高版本才能安装 [ProductName]。</String>
-
- <String Id="Error30001" Overridable="yes">安装程序无法检测到共享配置。</String>
- <String Id="Error30002" Overridable="yes">已为 IIS 启用了共享配置。使用共享配置时,不支持安装 [ProductName]。请先禁用共享配置,然后再安装此功能。</String>
-
- <String Id="W3SVCRunning" Overridable="yes">请在安装 [ProductName] 之前停止 World Wide Web 发布服务(W3SVC)。您将需要在安装后启动此服务。 </String>
- <String Id="IISPowershellConsole">IIS PowerShell 管理控制台</String>
- <String Id="IISPowershellSnapin">IIS PowerShell 管理单元</String>
- <String Id="PowerShellRequired">IIS PowerShell 管理单元要求安装 PowerShell v1.0 或 v2.0</String>
- <String Id="WasAndConfigRequired">IIS PowerShell 管理单元要求安装 WAS 和配置</String>
- <String Id="TestBogusString" Overridable="yes">这是一个假字符串。</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework 版本 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web 场代理版本 2.2</String>
- <String Id="WebFarmBasicFeatureName">Web 场服务</String>
- <String Id="WebFarmBasicFeatureDescription">Web 场服务</String>
- <String Id="WebFarmControllerServiceName">Web 场控制器服务</String>
- <String Id="WebFarmControllerServiceDescription">Web 场控制器服务</String>
- <String Id="WebFarmAgentServiceName">Web 场代理服务</String>
- <String Id="WebFarmAgentServiceDescription">Web 场代理服务</String>
- <String Id="WebPIRequired">Web 平台安装程序是安装 Web Farm Framework 的必备组件。请从 http://www.microsoft.com/web/downloads/platform.aspx 安装 Web 平台安装程序。 </String>
- <String Id="WebDeployRequired">Web 部署工具是安装 Web Farm Framework 的必备组件。请从 http://www.iis.net/download/WebDeploy 安装 Web 部署工具。</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting 框架</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting 框架</String>
- <String Id="WebHostingCommonFeatureDescription">Web Hosting 角色和功能。</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting 框架</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting 框架提供用于管理 Web Hosting 的 API 和 PowerShell 命令。</String>
- <String Id="WebHostingWebRoleFeatureName">Web 角色</String>
- <String Id="WebHostingWebRoleFeatureDescription">Web 角色为 Web Hosting 安装动态 WAS 服务和 URL 重写提供程序。</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express </String>
- <String Id="WebHostingAntaresExpressFeatureDescription">部署已针对单一计算机设置优化的控制面板配置。</String>
- <String Id="WebHostingLoadBalancerFeatureName">负载平衡器角色</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">负载平衡器将应用程序请求路由器配置为基于 Web Hosting 规则进行路由。</String>
- <String Id="WebHostingControllerFeatureName">Hosting 控制器</String>
- <String Id="WebHostingControllerFeatureDescription">Hosting 控制器扩展了 Web Farm Framework 2.0,使之能够与 Web Hosting 一起使用。</String>
- <String Id="WebHostingPublishingRoleFeatureName">发布角色</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">安装针对 Web Deploy 和 FTP 发布功能的支持。</String>
- <String Id="WebHostingPowerShellSnapInDescription">这是 PowerShell 管理单元,其中包含用于管理 Microsoft Web Hosting 基础架构的 cmdlet。</String>
- <String Id="DWASServiceName">动态 WAS 服务</String>
- <String Id="DWASServiceDescription">已为高密度 Web Hosting 优化了 Windows Process Activation Service。</String>
- <String Id="MeteringFeatureName">资源计量服务</String>
- <String Id="MeteringFeatureDescription">安装资源计量服务,该服务可以收集和发布运行时信息和运行状况信息。</String>
- <String Id="MeteringServiceName">资源计量</String>
- <String Id="MeteringServiceDescription">允许从 Web 角色收集和发布运行时信息与运行状况信息。</String>
- <String Id="QuotaEnforcementServiceName">强制实施宿主配额</String>
- <String Id="QuotaEnforcementServiceDescription">监视网站资源使用情况,并在超出使用配额时执行自定义操作。</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHT/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHT/misc/setupstrings.wxl
deleted file mode 100644
index fc4295abf7..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CHT/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="zh-tw" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1028</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">共用設定安裝選項</String>
- <String Id="SharedConfigDlgDescription">請選取安裝 IIS 共用設定的選項</String>
- <String Id="SharedConfigDlgCheckBox">在安裝時更新共用設定</String>
- <String Id="SharedConfigDlgText">您正在將這個模組安裝到使用共用設定的 IIS 伺服器上。如果有其他 IIS 伺服器也使用這個共用設定,您必須將這個模組安裝到所有電腦。若要將個別網頁伺服器發生中斷的情形降至最低,您必須依照下列步驟安裝這個模組: 首先,在所有電腦上 (最後一部電腦例外) 安裝模組,而且不要更新共用設定。請不要選取下面的核取方塊。
-這將會為每部電腦上的模組安裝所有二進位檔和必要檔案,而不會對共用設定進行任何變更。第二,在最後一部電腦上,您必須確認執行作業所使用的使用者識別具有讀取和寫入 UNC 共用上 applicationhost.config 檔案的權限。然後,您應安裝模組並選取下面的更新共用設定選項。 </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">正在初始化 WebConfig 自訂動作</String>
- <String Id="ProgressText_WebConfigUpdate">正在更新 web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS 進階記錄</String>
- <String Id="AdvancedLoggingDescription">啟用 IIS 管線資料的進階記錄。</String>
- <String Id="AdvancedLoggingUI">IIS 進階記錄</String>
- <String Id="AdvancedLoggingUIDescription">啟用以可延伸的欄位選擇建立自訂記錄檔。</String>
- <String Id="AdvancedLoggingUpdate01">IIS Advanced Logging 的更新</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">啟用 Transform Manager IIS Media Services。</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">啟用媒體轉換的建立。</String>
- <String Id="TransformManagerServiceHostName">IIS Transform Manager 主機</String>
- <String Id="TransformManagerServiceHostDescription">[ProductName] 的服務主機。</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">將隨選媒體檔案批次轉換為替代的檔案及容器格式。</String>
- <String Id="TransformManagerEESPTaskInstalled">IIS Transform Manager 1.0 Expression Encoder SP Task 套件已安裝於電腦。您必須先將它解除安裝,才能安裝 [ProductName]。</String>
-
- <String Id="NetFx35Required">需要 Microsoft .NET Framework 3.5 才能安裝 [ProductName]。請使用 [\[]伺服器管理員[\]] 中的 [\[]新增功能精靈[\]] 安裝 .NET Framework 3.5.1 功能,或者使用 [\[]開啟或關閉 Windows 功能[\]] 開啟 Microsoft .NET Framework 3.5。</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS 數位版權管理</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">啟用 Smooth Streaming 展示檔的數位版權管理。</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">未安裝 ASP.NET</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[在 Web 播放清單中安裝 Session Helper for ASP.NET 工作階段狀態持續性之前,您必須在伺服器管理員中安裝網頁伺服器 (IIS) 角色的 ASP.NET 角色服務。若要在沒有 Session Helper for ASP.NET 的情況下繼續安裝 Media Services,請按一下 [上一步],並將 Session Helper 從要安裝的功能清單中移除。否則,請按一下 [取消],在伺服器管理員中安裝 ASP.NET 角色服務,然後重新執行 IIS Media Services 安裝程式。]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Web 播放清單無法使用 ASP.NET 工作階段持續性提供者,除非已安裝網頁伺服器 (IIS) 的 ASP.NET 角色服務。如果要搭配 Web 播放清單使用 ASP.NET 工作階段持續性,請在伺服器管理員中安裝網頁伺服器 (IIS) 的 ASP.NET 角色服務。
-
-如果現在不想安裝 Session Helper 功能,您可以按一下 [上一步],並取消選取該功能。
-
-如果安裝 ASP.NET 角色服務,您可以從 [控制台] 的 [程式和功能] 功能表中變更這個產品的已安裝功能。]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">在這部電腦上找到 IIS Smooth Streaming - Beta。[ProductName] 的安裝無法繼續。若要安裝這個產品,請使用 [控制台] 中的 [新增/移除程式] 移除 IIS Smooth Streaming - Beta。</String>
- <String Id="IncompatibleMediaServicesVersionFound">這部電腦已經安裝不相容版本的 IIS Media Services。[ProductName] 的安裝無法繼續。若要安裝這個產品,請使用 [控制台] 中的 [新增/移除程式] 移除 IIS Media Services。</String>
- <String Id="NewerMediaServicesVersionFound">這部電腦可能已安裝這個產品的新版本或有新版本可供安裝。[ProductName] 的安裝無法繼續。若要安裝這個產品的新版本,請使用 [控制台] 中的 [新增/移除程式] 更新 IIS Media Services。</String>
- <String Id="ISXConversionRequiredWarningTitle">需要播放清單檔案轉換</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[這個版本不支援為舊版 Web 播放清單建立的播放清單檔案。若要為這些播放清單建立這個 Web 播放清單中支援的複本,請執行 isxTranslate 轉換工具。您可以從 http://go.microsoft.com/fwlink/?LinkId=127838 取得這個工具。]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">找到舊的 IIS Media Services 檔案</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[這部電腦上已安裝一或多個舊版的 Media Services 功能。IIS Media Services 安裝程式必須更新所有之前安裝的 Media Services 功能,以確保這些功能可以在 IIS Media Services 中正常運作。
-
-若要將之前安裝的 Media Services 功能更新成目前版本,請按一下 [下一步]。如果不想更新之前安裝的這些功能版本,請按一下 [取消]。]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">找到 Beta IIS Media Services 檔案</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[這部電腦已安裝一或多項 IIS Media Services 功能的 Beta 版本。IIS Media Services 安裝程式無法繼續。
-
-若要安裝這個版本的 IIS Media Services,必須先解除安裝 Beta 版功能。]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">IIS Media Pack 1.0 的更新</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">IIS Media Services 2.0 的更新</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">IIS Media Services 3.0 的更新</String>
- <String Id="MediaServicesIISMediaDescription">IIS Media Services 功能和工具。</String>
- <String Id="MediaServicesBurbankDescription">IIS Media Services 5 Premium 功能及工具。</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Web 播放清單</String>
- <String Id="MediaServicesFeaturePlaylistDescription">控制播放清單中參考之媒體資產的用戶端播放方式。</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Session Helper</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">啟用 ASP.NET 工作階段狀態持續性 (需要網頁伺服器 (IIS) 的 ASP.NET 角色服務)。</String>
- <String Id="MediaServicesFeaturePlaylistUI">使用者介面</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">設定 IIS 管理員中的 Web 播放清單功能。</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">位元速度節流設定</String>
- <String Id="MediaServicesFeatureBitrateDescription">藉由節流設定傳遞用戶端下載的檔案,以節省頻寬。</String>
- <String Id="MediaServicesFeatureBitrateUI">使用者介面</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">設定 IIS 管理員中的位元速度節流設定功能。</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">資產</String>
- <String Id="MediaServicesFeatureSmoothDescription">啟用對用戶端的隨選資產 HTTP 彈性資料流。</String>
- <String Id="MediaServicesFeatureSmoothUI">使用者介面</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">設定 IIS 管理員中的 Smooth Streaming 功能。</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">通道</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">啟用對用戶端的通道廣播 HTTP 彈性資料流。</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">使用者介面</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">設定 IIS 管理員中的 Live Smooth Streaming 功能。</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">數位版權管理</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">提供 Smooth Streaming 媒體的加密和授權。</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">使用者介面</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">設定 IIS 管理員中的數位版權管理功能。</String>
-
- <String Id="VistaSP1Required">[ProductName] 需要 Microsoft Windows Vista Service Pack 1 或更新版本。</String>
- <String Id="VistaHomeBasicNotSupported">無法將 [ProductName] 安裝在 Vista Home Basic 上。</String>
- <String Id="Windows7SP1Required">[ProductName] 需要 Microsoft Windows 7 Service Pack 1 或更新版本。</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS Database Manager</String>
- <String Id="DBManagerBasicFeatureName">IIS Database Manager</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft Web Management Service</String>
- <String Id="WMSvcBasicFeatureDescription">安裝 [ProductName] 的基本功能。</String>
- <String Id="WMSvcServiceName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcServiceDescription">Web Management Service 可啟用遠端及委派管理功能,讓系統管理員管理呈現在這部電腦上的網頁伺服器、站台及應用程式。</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Microsoft URL Rewrite Module 1.1 for IIS 7</String>
- <String Id="RewriteServicingPatchV1">URL Rewrite Module 1.1 for IIS 7 的更新</String>
- <String Id="RewriteModuleTitleV1">URL Rewrite</String>
- <String Id="RewriteModuleDescriptionV1">啟用 IIS 7 的 URL 和內容重寫功能。</String>
- <String Id="RewriteModuleUITitleV1">使用者介面</String>
- <String Id="RewriteModuleUIDescriptionV1">設定 IIS 管理員中的 URL Rewrite Module 功能。</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL Rewrite Module 2</String>
- <String Id="RewriteServicingPatch">IIS URL Rewrite Module 2 的更新</String>
- <String Id="RewriteModuleTitle">URL Rewrite</String>
- <String Id="RewriteModuleDescription">啟用 IIS 7 的 URL 和內容重寫功能。</String>
- <String Id="RewriteModuleUITitle">使用者介面</String>
- <String Id="RewriteModuleUIDescription">設定 IIS 管理員中的 URL Rewrite Module 功能。</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">安裝 [ProductName] 的基本功能。</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">不支援這個版本的作業系統。[ProductName] 只能安裝在 Windows Server 2008 或 Windows Vista Service Pack 1 和更新版本上。</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.NET 功能</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET 包含授權和錯誤網頁功能,可讓您管理授權和自訂錯誤訊息。</String>
- <String Id="Authentication" Overridable="yes">驗證</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.NET 驗證描述。</String>
- <String Id="Authorization" Overridable="yes">授權</String>
- <String Id="AuthorizationDescription" Overridable="yes">ASP.NET 授權可讓您設定規則,來授權使用者存取您的網站和應用程式。</String>
- <String Id="ErrorPages" Overridable="yes">錯誤網頁</String>
- <String Id="ErrorPagesDescription" Overridable="yes">ASP.NET 錯誤網頁可讓您設定發生錯誤時要傳回的 HTTP 錯誤回應。</String>
- <String Id="Modules" Overridable="yes">模組</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.NET 模組描述。</String>
- <String Id="Handlers" Overridable="yes">處理常式</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.NET 處理常式描述。</String>
- <String Id="ConfigurationEditor" Overridable="yes">設定編輯器</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">設定編輯器可讓您管理 IIS 管理員中的設定檔案,讓您編輯設定檔案中的區段、屬性、元素和集合。</String>
- <String Id="RequestFiltering" Overridable="yes">要求篩選</String>
- <String Id="RequestFilteringDescription" Overridable="yes">要求篩選可讓您為網站設定篩選規則,並限制通訊協定和內容的行為。</String>
- <String Id="FastCgi" Overridable="yes">Fast CGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI 可讓您設定您的網頁伺服器上 FastCGI 應用程式的處理序集區設定。</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Dynamic IP Restrictions for IIS 7 安裝程式 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[安裝精靈偵測到已經安裝 IIS 內建的 IP 和網域限制。安裝精靈將解除安裝現有的 IP 和網域限制,以安裝動態 IP 限制。現有的 IP 安全性設定將會保留。]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[這可能需要幾分鐘的時間。]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[您要繼續進行嗎?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamic IP Restrictions for IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamic IP Restrictions for IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamic IP Restrictions for IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamic IP Restrictions for IIS 7 - 發行候選版本 </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamic IP Restrictions for IIS 7 - 發行候選版本 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamic IP Restrictions for IIS 7 - 發行候選版本 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamic IP Restrictions for IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamic IP Restrictions for IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">IIS 7 的動態 IP 限制使用者介面</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> 在這部電腦上發現 Dynamic IP Restrictions for IIS 7 - Beta 版。請解除安裝,然後再試一次</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 For IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">必須安裝 IIS 7.0 CoreWebEngine 和 W3SVC 功能才能使用這個產品。</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV 伺服器模組</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV Administration 使用者介面</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Search Engine Optimization (SEO) Toolkit 1.0</String>
- <String Id="SiteAnalyzerProductComments">這個安裝程式資料庫內含安裝 IIS Search Engine Optimization Toolkit 1.0 所需的邏輯和資料。</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS 編輯器</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS 報告</String>
- <String Id="LogParserInstalled" Overridable="yes">這部電腦上未安裝記錄檔剖析器。請從 http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 安裝記錄檔剖析器 2.2,然後繼續安裝 IIS 報告</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">找不到必要條件封裝。請執行 setup.exe 解決相依性,然後再安裝這個程式。</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 管理物件是安裝 IIS Database Manager 的必要條件。您可以從 http://go.microsoft.com/fwlink/?LinkID=150946 安裝 Micrsoft SQL Server 2008 管理物件。</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server 系統 CLR 類型是安裝 IIS Database Manager 的必要條件。您可以從 http://go.microsoft.com/fwlink/?LinkID=150949 安裝 Microsoft SQL Server 系統 CLR 類型。</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework 是安裝應用程式要求路由的必要條件。請安裝 Web Farm Framework。</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">執行階段</String>
- <String Id="ArrModuleDescription">將應用程式要求路由功能新增至 IIS。</String>
- <String Id="ArrUITitle">使用者介面</String>
- <String Id="ArrUIDescription">設定 IIS 管理員中的應用程式要求路由功能。</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">IIS 7.0 的 Microsoft Windows PowerShell 嵌入式管理單元</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft Web Platform Installer 4.0</String>
- <String Id="WebPIFeatureName">Microsoft Web Platform Installer</String>
- <String Id="XPSP2Required">[ProductName] 需要 Windows XP SP2、Windows 2003 SP1、Windows Vista 或更新版本。</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] 需要 Windows XP Service Pack 3、Windows Server 2003 Service Pack 2 (含) 以上版本。</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Microsoft Windows Azure Services 安裝程式</String>
- <String Id="WASIFeatureName">Microsoft Windows Azure Services 安裝程式</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Internet Information Services (IIS) 7+ 管理員</String>
- <String Id="RemoteMgrClientFeatureName">IIS 管理員用戶端</String>
- <String Id="RemoteMgrRemotingFeatureName">遠端支援</String>
- <String Id="RemoteMgrNotSupported">這個產品需要 Windows XP SP2、Windows 2003 SP1、Windows Vista SP1、Windows 7 或更新版本</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">未安裝 IIS 管理主控台,但需要它才能管理遠端 IIS 伺服器。安裝遠端管理支援之前,請先安裝 IIS 管理主控台,安裝方式是開啟 [控制台]-&gt;[所有程式]-&gt;[開啟或關閉 Windows 功能],並在 Internet Information Services 功能中選取 [IIS 管理主控台]。</String>
- <String Id="RemoteMgrNotRequired">在 Windows Server 2008、Windows Server 2008 R2 或更新版本中不需要這個產品。請安裝 IIS 管理主控台,安裝方式是開啟伺服器管理員,然後在網頁伺服器角色的角色服務中選取 [IIS 管理主控台]。</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS Manager Publishing for IIS 7.0</String>
- <String Id="PublishingFeatureName">發行使用者介面</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 for IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">不相容的產品 [CONFLICTING_PRODUCT_NAME] 出現在這部電腦上。無法繼續安裝 [ProductName]。若要安裝這個產品,請使用 [控制台] 的 [新增/移除程式移除 [CONFLICTING_PRODUCT_NAME]。</String>
- <String Id="AdminRequired" Overridable="yes">需要有系統管理員權限,才能安裝 [ProductName]。</String>
- <String Id="IIS7Only" Overridable="yes">需要 IIS 7.0 版才能使用 [ProductName]。</String>
- <String Id="IIS7OrGreater" Overridable="yes">需要 IIS 7.0 版或更新版本,才能安裝 [ProductName]。</String>
- <String Id="IIS75OrGreater" Overridable="yes">需要 IIS 7.5 版或更新版本,才能安裝 [ProductName]。</String>
- <String Id="IIS7Or75Only" Overridable="yes">需要 IIS 第 7 版或第 7.5 版才能安裝 [ProductName]。</String>
- <String Id="BetaVersionFound" Overridable="yes">在這部電腦上發現 [ProductName] 的 Beta 版。</String>
- <String Id="NewerVersionFound" Overridable="yes">在這部電腦上發現 [ProductName] 較新的版本。</String>
- <String Id="DuplicateVersionFound" Overridable="yes">安裝程式無法繼續,因為這部電腦上已安裝另一份 [ProductName]。請先解除該安裝後,再重新啟動這個安裝。</String>
- <String Id="CoreWebW3SVC" Overridable="yes">必須安裝 IIS 7.0 CoreWebEngine 和 W3SVC 功能才能使用 [ProductName]。</String>
- <String Id="IISManagementConsole" Overridable="yes">必須安裝 IIS 管理主控台才能使用 [ProductName]。</String>
- <String Id="WebServicesRunning" Overridable="yes">安裝 [ProductName] 前,請先停止 Windows 處理序啟用服務 (WAS) 和 Web Management Service (WMSvc) 兩個服務。您必須在安裝 [ProductName] 後再啟動服務。</String>
- <String Id="MetabaseRequired" Overridable="yes">需要 IIS Metabase 才能安裝 [ProductName]。</String>
- <String Id="LaunchCondition_32BIT">無法將 64 位元版本的 [ProductName] 安裝在 32 位元版本的 Microsoft Windows 上。</String>
- <String Id="LaunchCondition_64BIT">無法將 32 位元版本的 [ProductName] 安裝在 64 位元版本的 Microsoft Windows 上。</String>
- <String Id="NetFX2OrGreaterRequired">需要 Microsoft .NET Framework 2.0 版本或更新版本,才能安裝 [ProductName]。</String>
- <String Id="NetFX35OrGreaterRequired">必須安裝 Microsoft .NET Framework 3.5 (含) 以上版本,才能安裝 [ProductName]。請使用伺服器管理員底下的「新增功能」安裝 Microsoft .NET 3.5 版。</String>
- <String Id="NetFX4OrGreaterRequired">需要 Microsoft .NET Framework 4 (含) 以上版本才能安裝 [ProductName]。</String>
- <String Id="NetFX20SP1IsRequired">請先安裝 Microsoft .NET Framework 2.0 版 Service Pack 1 (或更新版的 Service Pack),再安裝 [ProductName]。</String>
- <String Id="WindowsUpdateEnabled">無法停用 Windows Update (wuauserv) 服務,需要它才能安裝 [ProductName]。</String>
- <String Id="GetFromOSforWin7">PowerShell 嵌入式管理單元是 Windows 作業系統的一部分。請用 [程式和功能] 或 [伺服器管理員] 進行安裝。</String>
- <String Id="WebPI3OrGreaterRequired">需要 Microsoft Web Platform Installer 3.0 (含) 以上版本才能安裝 [ProductName]。</String>
-
- <String Id="Error30001" Overridable="yes">安裝程式偵測不到共用設定。</String>
- <String Id="Error30002" Overridable="yes">已為 IIS 啟用共用設定。不支援在使用共用設定時安裝 [ProductName]。請先停用共用設定,再安裝這項功能。</String>
-
- <String Id="W3SVCRunning" Overridable="yes">安裝 [ProductName] 前,請先停止 World Wide Web Publishing 服務 (W3SVC)。您必須在安裝後再啟動服務。 </String>
- <String Id="IISPowershellConsole">IIS PowerShell 管理主控台</String>
- <String Id="IISPowershellSnapin">IIS PowerShell 嵌入式管理單元</String>
- <String Id="PowerShellRequired">IIS PowerShell 嵌入式管理單元要求必須已安裝 PowerShell v1.0 或 v2.0</String>
- <String Id="WasAndConfigRequired">IIS PowerShell 嵌入式管理單元要求必須已安裝 WAS 和設定</String>
- <String Id="TestBogusString" Overridable="yes">這是假的字串。</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework 2.2版</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent 2.2 版</String>
- <String Id="WebFarmBasicFeatureName">Web 伺服陣列服務</String>
- <String Id="WebFarmBasicFeatureDescription">Web 伺服陣列服務</String>
- <String Id="WebFarmControllerServiceName">Web 伺服陣列控制器服務</String>
- <String Id="WebFarmControllerServiceDescription">Web 伺服陣列控制器服務</String>
- <String Id="WebFarmAgentServiceName">Web 伺服陣列代理程式服務</String>
- <String Id="WebFarmAgentServiceDescription">Web 伺服陣列代理程式服務</String>
- <String Id="WebPIRequired">Web Platform Installer 是安裝 Web Farm Framework 2.0 的必要元件。請從 http://www.microsoft.com/web/downloads/platform.aspx 安裝 Web Plaform Installer。</String>
- <String Id="WebDeployRequired">Web Deployment Tool 是安裝 Web Farm Framework 的必要元件。請從 http://www.iis.net/download/WebDeploy 安裝 Web Deployment Tool。 </String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Web Hosting 角色及功能。</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework 提供用於管理 Web Hosting 的 API 命令和 PowerShell 命令。</String>
- <String Id="WebHostingWebRoleFeatureName">Web 角色</String>
- <String Id="WebHostingWebRoleFeatureDescription">Web 角色會安裝 Web Hosting 的 Dynamic WAS 服務及 URL Rewrite 提供者。</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">部署已針對單一電腦環境最佳化的控制台設定。</String>
- <String Id="WebHostingLoadBalancerFeatureName">負載平衡器角色</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">負載平衡器角色會將應用程式要求路由器設定為根據 Web Hosting 規則進行路由。</String>
- <String Id="WebHostingControllerFeatureName">主機控制器</String>
- <String Id="WebHostingControllerFeatureDescription">主機控制器會擴充 Web Farm Framework 2.0 以搭配 Web Hosting 運作。</String>
- <String Id="WebHostingPublishingRoleFeatureName">發行角色</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">安裝 Web Deploy 及 FTP 發行的支援。</String>
- <String Id="WebHostingPowerShellSnapInDescription">這是包含 Cmdlet 的 PowerShell 嵌入式管理單元,可用來管理 Microsoft Web Hosting 基礎結構。</String>
- <String Id="DWASServiceName">動態 WAS 服務</String>
- <String Id="DWASServiceDescription">針對高密度 Web Hosting 最佳化的 Windows Process Activation 服務。</String>
- <String Id="MeteringFeatureName">資源計量服務</String>
- <String Id="MeteringFeatureDescription">安裝資源計量服務,此服務可收集和發行執行階段和健康狀態資訊。</String>
- <String Id="MeteringServiceName">資源計量</String>
- <String Id="MeteringServiceDescription">可從 Web 角色收集及發行執行階段和健康狀態資訊。</String>
- <String Id="QuotaEnforcementServiceName">主機配額強制</String>
- <String Id="QuotaEnforcementServiceDescription">監視網站資源使用量,並且在超過使用量配額時執行自訂動作。</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CSY/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CSY/misc/setupstrings.wxl
deleted file mode 100644
index 2e4fca8c5c..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/CSY/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="cs-cz" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1029</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Možnosti instalace sdílené konfigurace</String>
- <String Id="SharedConfigDlgDescription">Vyberte možnosti instalace pro sdílenou konfiguraci služby IIS.</String>
- <String Id="SharedConfigDlgCheckBox">Při instalaci aktualizovat sdílenou konfiguraci</String>
- <String Id="SharedConfigDlgText">Tento modul instalujete na server služby IIS, který používá sdílenou konfiguraci. Používají-li tuto sdílenou konfiguraci další servery služby IIS, bude tento modul nainstalován na všechny tyto servery. Chcete-li co nejméně narušit jednotlivé webové servery, nainstalujte tento modul následovně: Nejprve na všechny servery kromě jednoho nainstalujte modul, aniž byste aktualizovali sdílenou konfiguraci. To provedete tak, že zrušíte zaškrtnutí následujícího
- políčka. Tak nainstalujete všechny binární i ostatní soubory modulu na každý server, ale sdílená konfigurace zůstane beze změn. Následně na posledním serveru ověřte, zda má uživatelský účet, se kterým jste přihlášeni, dostatečná oprávnění ke čtení a zápisu do souboru applicationhost.config ve sdíleném úložišti UNC. Poté nainstalujte modul a vyberte níže uvedenou možnost aktualizace sdílené konfigurace. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Probíhá inicializace vlastní akce souboru web.config.</String>
- <String Id="ProgressText_WebConfigUpdate">Probíhá aktualizace souboru web.config.</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">Rozšířené protokolování Internetové informační služby</String>
- <String Id="AdvancedLoggingDescription">Umožňuje rozšířené protokolování dat kanálu IIS.</String>
- <String Id="AdvancedLoggingUI">Rozšířené protokolování Internetové informační služby</String>
- <String Id="AdvancedLoggingUIDescription">Umožňuje vytváření vlastních souborů protokolu s rozšířeným výběrem polí.</String>
- <String Id="AdvancedLoggingUpdate01">Aktualizace pro rozšířené protokolování Internetové informační služby</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">Správce transformace služby IIS</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Povoluje správce transformace služby IIS Media Services.</String>
- <String Id="TransformManagerUI">Správce transformace služby IIS</String>
- <String Id="TransformManagerUIDescription">Umožňuje tvorbu mediálních transformací.</String>
- <String Id="TransformManagerServiceHostName">Hostitel správce transformace služby IIS</String>
- <String Id="TransformManagerServiceHostDescription">Hostitel služby pro [ProductName].</String>
- <String Id="TransformManagerShortcutName">Správce transformace služby IIS</String>
- <String Id="TransformManagerShortcutTooltip">Dávkový převod souborů médií na vyžádání na jiné formáty souborů a kontejneru</String>
- <String Id="TransformManagerEESPTaskInstalled">V počítači je nainstalován balíček Expression Encoder SP Task Správce transformace služby IIS 1.0. Ten je třeba před instalací produktu [ProductName] odinstalovat.</String>
-
- <String Id="NetFx35Required">K instalaci produktu [ProductName] je vyžadováno rozhraní Microsoft .NET Framework 3.5. Můžete nainstalovat funkce rozhraní .NET Framework 3.5.1 pomocí Průvodce přidáním funkcí ve Správci serveru nebo zapnout rozhraní Microsoft .NET Framework 3.5 pomocí položky Zapnout nebo vypnout funkce systému Windows.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">Správa digitálních práv služby IIS</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Povoluje správu digitálních práv pro prezentace Smooth Streaming.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">Není nainstalována součást ASP.NET.</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Před instalací pomocníka relace pro trvalost stavu relace ASP NET ve funkci Webové seznamy stop je zapotřebí nainstalovat ve Správci serveru službu role ASP NET pro roli Webový server (IIS). Pokud chcete pokračovat v instalaci služby Media Services bez pomocníka relace pro ASP.NET, klikněte na tlačítko Zpět a odeberte součást Pomocník relace ze seznamu součástí, které mají být nainstalovány. Jinak klikněte na tlačítko Storno, ve Správci serveru nainstalujte službu role ASP.NET a poté opět spusťte instalační program služby IIS Media Services.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Dokud není nainstalována služba role ASP.NET pro roli Webový server (IIS), nemohou webové seznamy stop používat zprostředkovatele trvalosti relace ASP.NET. Pokud chcete používat trvalost relace ASP.NET s webovými seznamy stop, nainstalujte ve Správci serveru službu role ASP.NET pro roli Webový server (IIS).
-
-Pokud nyní nechcete nainstalovat součást Pomocník relace, klikněte na tlačítko Zpět a zrušte výběr této součásti.
-
-Pokud nainstalujete službu role ASP.NET, můžete později změnit nainstalované součásti tohoto produktu na ovládacím panelu Programy a funkce.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">V tomto počítači byla nalezena beta verze rozšíření IIS Smooth Streaming. Instalace produktu [ProductName] nemůže pokračovat. Pokud chcete tento produkt nainstalovat, pomocí ovládacího panelu Přidat nebo odebrat programy odeberte položku IIS Smooth Streaming – Beta.</String>
- <String Id="IncompatibleMediaServicesVersionFound">V tomto počítači je nekompatibilní verze služby IIS Media Services. Instalace produktu [ProductName] nemůže pokračovat. Pokud chcete tento produkt nainstalovat, pomocí ovládacího panelu Přidat nebo odebrat programy odeberte položku IIS Media Services.</String>
- <String Id="NewerMediaServicesVersionFound">V tomto počítači je již nainstalována nebo je k dispozici k instalaci novější verze tohoto produktu. Instalace produktu [ProductName] nemůže pokračovat. Pokud chcete nainstalovat novější verzi tohoto produktu, pomocí ovládacího panelu Přidat nebo odebrat programy aktualizujte položku IIS Media Services.</String>
- <String Id="ISXConversionRequiredWarningTitle">Je nutný převod souboru seznamu stop.</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Tato verze nepodporuje soubory seznamů stop vytvořené v předchozích verzích funkce Webové seznamy stop. Chcete-li vytvořit kopie těchto seznamů stop, které jsou podporovány touto verzí funkce Webové seznamy stop, spusťte nástroj pro převod isxTranslate, který je k dispozici na stránce http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Byly nalezeny starší soubory služby IIS Media Services.</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[V tomto počítači jsou nainstalovány starší verze jedné nebo více součástí služby Media Services. Instalační program služby IIS Media Services musí aktualizovat všechny dříve nainstalované součásti této služby, aby byla zajištěna její správná funkčnost.
-
-Chcete-li aktualizovat dříve nainstalované součásti služby Media Services na aktuální verze, klikněte na tlačítko Další. Pokud nechcete aktualizovat dříve nainstalované verze těchto součástí, klikněte na tlačítko Storno.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Byly nalezeny soubory beta verze služby IIS Media Services.</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[V tomto počítači je nainstalována beta verze jedné nebo více součástí služby Media Services. Instalační program služby IIS Media Services nemůže pokračovat.
-
-Pokud chcete nainstalovat tuto verzi služby IIS Media Services, je třeba odinstalovat součásti beta verze.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Aktualizace pro sadu IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">Aktualizace pro službu IIS Media Services 2.0</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Aktualizace pro službu IIS Media Services 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Součásti a nástroje služby IIS Media Services.</String>
- <String Id="MediaServicesBurbankDescription">Funkce a nástroje služby IIS Media Services 5 Premium</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Webové seznamy stop</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Řídí přehrávání mediálních materiálů odkazovaných v seznamech stop pro klienta.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Pomocník relace</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Umožňuje trvalost stavu relace ASP.NET. (Je požadována služba role ASP.NET pro roli Webový server (IIS)).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Uživatelské rozhraní</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Konfiguruje funkci Webové seznamy stop ve Správci služby IIS.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Omezení přenosové rychlosti</String>
- <String Id="MediaServicesFeatureBitrateDescription">Uspoří šířku pásma omezením doručování souborů stahovaných klienty.</String>
- <String Id="MediaServicesFeatureBitrateUI">Uživatelské rozhraní</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Konfiguruje funkci Omezení přenosové rychlosti ve Správci služby IIS.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Aktiva</String>
- <String Id="MediaServicesFeatureSmoothDescription">Umožňuje vysílání adaptivních datových proudů protokolu HTTP aktiv na vyžádání pro klienty.</String>
- <String Id="MediaServicesFeatureSmoothUI">Uživatelské rozhraní</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Konfiguruje funkci Smooth Streaming ve Správci služby IIS.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Kanály</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Umožňuje vysílání adaptivních datových proudů protokolu HTTP všesmerového vysílání kanálů pro klienty.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Uživatelské rozhraní</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Konfiguruje funkci Live Smooth Streaming ve Správci služby IIS.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Správa digitálních práv (DRM)</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Zajišťuje šifrování a správu licencí médií Smooth Streaming.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Uživatelské rozhraní</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Konfiguruje funkci správy digitálních práv ve správci služby IIS.</String>
-
- <String Id="VistaSP1Required">[ProductName] požaduje systém Microsoft Windows Vista Service Pack 1 nebo novější.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName] nelze nainstalovat v systému Vista Home Basic.</String>
- <String Id="Windows7SP1Required">[ProductName] požaduje systém Microsoft Windows 7 Service Pack 1 nebo novější.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">Správce databáze služby IIS</String>
- <String Id="DBManagerBasicFeatureName">Správce databáze služby IIS</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Služba webové správy Microsoft 2</String>
- <String Id="WMSvcBasicFeatureName">Služba webové správy Microsoft</String>
- <String Id="WMSvcBasicFeatureDescription">Nainstaluje základní součásti produktu [ProductName].</String>
- <String Id="WMSvcServiceName">Služba webové správy Microsoft 2</String>
- <String Id="WMSvcServiceDescription">Služba webové správy umožňuje vzdáleným a delegovaným funkcím správy pracovat s webovým serverem, weby a aplikacemi, které jsou uloženy v tomto počítači.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Microsoft URL Rewrite Module 1.1 for IIS 7</String>
- <String Id="RewriteServicingPatchV1">Aktualizace pro produkt URL Rewrite Module 1.1 for IIS 7</String>
- <String Id="RewriteModuleTitleV1">Přepisování adres URL</String>
- <String Id="RewriteModuleDescriptionV1">Dává službě IIS 7 možnost přepisovat adresy URL a obsah.</String>
- <String Id="RewriteModuleUITitleV1">Uživatelské rozhraní</String>
- <String Id="RewriteModuleUIDescriptionV1">Konfiguruje funkci URL Rewrite Module ve Správci služby IIS.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL Rewrite Module 2</String>
- <String Id="RewriteServicingPatch">Aktualizace pro produkt IIS URL Rewrite Module 2</String>
- <String Id="RewriteModuleTitle">Přepisování adres URL</String>
- <String Id="RewriteModuleDescription">Dává službě IIS 7 možnost přepisovat adresy URL a obsah.</String>
- <String Id="RewriteModuleUITitle">Uživatelské rozhraní</String>
- <String Id="RewriteModuleUIDescription">Konfiguruje funkci URL Rewrite Module ve Správci služby IIS.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Balíček pro správu služby IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Nainstaluje základní součásti produktu [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1250</String>
- <String Id="ProductName" Overridable="yes">Balíček pro správu služby IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">Tato verze operačního systému není podporována. Produkt [ProductName] lze nainstalovat pouze v systémech Windows Server 2008 nebo Windows Vista Service Pack 1 a novějších.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Součásti ASP.NET</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">Technologie ASP.NET obsahuje součásti Autorizace a Chybové stránky, které umožňují spravovat nastavení autorizace a vlastních chyb.</String>
- <String Id="Authentication" Overridable="yes">Ověřování</String>
- <String Id="AuthenticationDescription" Overridable="yes">Popis ověřování ASP.NET.</String>
- <String Id="Authorization" Overridable="yes">Autorizace</String>
- <String Id="AuthorizationDescription" Overridable="yes">Autorizace ASP.NET umožňuje konfigurovat pravidla pro autorizaci uživatelů pro přístup k vašim webům a aplikacím.</String>
- <String Id="ErrorPages" Overridable="yes">Chybové stránky</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Součást Chybové stránky ASP.NET umožňuje konfigurovat chybové odpovědi protokolu HTTP (stránky vrácené při chybě).</String>
- <String Id="Modules" Overridable="yes">Moduly</String>
- <String Id="ModulesDescription" Overridable="yes">Popis modulů ASP.NET.</String>
- <String Id="Handlers" Overridable="yes">Obslužné rutiny</String>
- <String Id="HandlersDescription" Overridable="yes">Popis obslužných rutin ASP.NET.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Editor konfigurací</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Editor konfigurací umožňuje spravovat konfigurační soubory ve Správci služby IIS. Umožňuje upravovat sekce, atributy, elementy a kolekce v konfiguračních souborech.</String>
- <String Id="RequestFiltering" Overridable="yes">Filtrování požadavků</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Funkce Filtrování žádostí umožňuje konfigurovat pravidla filtrování pro vaše weby a stanovit omezení pro protokol a chování obsahu.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">Rozšíření FastCGI umožňuje konfigurovat nastavení fondu procesů pro aplikace FastCGI na vašem webovém serveru.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Dynamická omezení IP adres pro službu IIS 7 – instalace </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[Průvodce instalací zjistil, že rozšíření Omezení podle IP adresy nebo domény vestavěné ve službě IIS je již nainstalováno. Průvodce instalací odinstaluje existující rozšíření Omezení podle IP adresy nebo domény, aby mohl nainstalovat rozšíření Dynamická omezení IP adres. Existující konfigurace zabezpečení protokolu IP bude zachována.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Tato operace může trvat několik minut.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Chcete pokračovat?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamická omezení IP adres pro službu IIS 7 – beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamická omezení IP adres pro službu IIS 7 – beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamická omezení IP adres pro službu IIS 7 – beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamická omezení IP adres pro službu IIS 7 – Release Candidate </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamická omezení IP adres pro službu IIS 7 – Release Candidate 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamická omezení IP adres pro službu IIS 7 – Release Candidate 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamická omezení IP adres pro službu IIS 7 – RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamická omezení IP adres pro službu IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Uživatelské rozhraní pro dynamického omezení IP adres pro službu IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Na tomto serveru byla zjištěn dynamická omezení IP adres pro službu IIS 7 – Beta. Odinstalujte službu a opakujte akci.</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 pro službu IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Tento produkt lze používat pouze tehdy, jsou-li nainstalovány součásti webového jádra a W3SVC služby IIS 7.0.</String>
- <String Id="WebDAVFeatureTitleModule">Modul serveru WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Uživatelské rozhraní pro správu protokolu WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">Sada nástrojů optimalizace pro vyhledávací weby 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">Sada nástrojů optimalizace pro vyhledávací weby 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Sada nástrojů optimalizace pro vyhledávací weby (SEO) 1.0</String>
- <String Id="SiteAnalyzerProductComments">Databáze instalačního programu obsahuje logiku a data vyžadovaná k instalaci sady nástrojů optimalizace pro vyhledávací weby služby IIS ve verzi 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Editor služby IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Sestavy služby IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">V tomto počítači není nainstalován analyzátor protokolu Log Parser. Nainstalujte nástroj Log Parser 2.2 ze stránky http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 a pokračujte dále v instalaci součásti Sestavy služby IIS.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Nebyly nalezeny požadované balíčky. Spusťte soubor setup.exe, abyste vyřešili potíže se závislostmi, a potom nainstalujte tento program.</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 Management Objects je požadovaným produktem pro instalaci Správce databáze služby IIS. Produkt Microsoft SQL Server 2008 Management Objects lze nainstalovat ze stránky http://go.microsoft.com/fwlink/?LinkID=150946.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server System CLR Types je požadovaným produktem pro instalaci Správce databáze služby IIS. Produkt Microsoft SQL Server System CLR Types lze nainstalovat ze stránky http://go.microsoft.com/fwlink/?LinkID=150949.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Technologie Směrování žádostí na aplikace požaduje, aby byla nainstalováno rozhraní Web Farm Framework. Nainstalujte rozhraní Web Farm Framework.</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">Modul runtime</String>
- <String Id="ArrModuleDescription">Přidá do služby IIS možnosti směrování žádostí na aplikace.</String>
- <String Id="ArrUITitle">Uživatelské rozhraní</String>
- <String Id="ArrUIDescription">Konfiguruje funkci směrování žádostí na aplikace ve správci služby IIS.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Modul snap-in Microsoft Windows PowerShell pro službu IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Instalace webové platformy Microsoft 4.0</String>
- <String Id="WebPIFeatureName">Instalační služba webové platformy Microsoft</String>
- <String Id="XPSP2Required">Produkt [ProductName] požaduje systém Windows XP SP2, Windows 2003 SP1, Windows Vista nebo novější.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">Produkt [ProductName] vyžaduje systém Windows XP Service Pack 3, Windows Server 2003 Service Pack 2 nebo novější.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Instalační program služby Microsoft Windows Azure Services</String>
- <String Id="WASIFeatureName">Instalační program služby Microsoft Windows Azure Services</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Správce Internetové informační služby (IIS) 7+</String>
- <String Id="RemoteMgrClientFeatureName">Klient Správce služby IIS</String>
- <String Id="RemoteMgrRemotingFeatureName">Podpora vzdálené komunikace</String>
- <String Id="RemoteMgrNotSupported">Tento produkt vyžaduje systém Windows XP SP2, Windows 2003 SP1, Windows Vista SP1, Windows 7 nebo novější.</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">Není nainstalována konzola pro správu služby IIS, která je nutná pro správu vzdálených serverů služby IIS. Před instalací podpory vzdálené správy nainstalujte konzolu pro správu služby IIS: Přejděte na Ovládací panely -&gt;Programy-&gt; Zapnout nebo vypnout funkce systému Windows a v součásti Internetová informační služba vyberte položku Konzola pro správu služby IIS.</String>
- <String Id="RemoteMgrNotRequired">Tento produkt není požadován v systémech Windows Server 2008 nebo Windows Server 2008 R2 nebo novějších. Nainstalujte konzolu pro správu služby IIS otevřením Správce serveru a výběrem položky Konzola pro správu služby IIS v uzlu Služby rolí pro roli Webový server.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">Publikování Správce služby IIS pro službu IIS 7.0</String>
- <String Id="PublishingFeatureName">Uživatelské rozhraní publikování</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 pro službu IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">V tomto počítači je nekompatibilní produkt [CONFLICTING_PRODUCT_NAME]. Instalace produktu [ProductName] nemůže pokračovat. Chcete-li tento produkt nainstalovat, odeberte pomocí funkce Přidat nebo odebrat programy v Ovládacích panelech produkt [CONFLICTING_PRODUCT_NAME].</String>
- <String Id="AdminRequired" Overridable="yes">K instalaci produktu [ProductName] jsou nutná oprávnění správce.</String>
- <String Id="IIS7Only" Overridable="yes">Produkt [ProductName] lze používat pouze ve verzi 7.0 služby IIS.</String>
- <String Id="IIS7OrGreater" Overridable="yes">K instalaci produktu [ProductName] je požadována služba IIS verze 7.0 nebo vyšší.</String>
- <String Id="IIS75OrGreater" Overridable="yes">K instalaci produktu [ProductName] je požadována služba IIS verze 7.5 nebo vyšší.</String>
- <String Id="IIS7Or75Only" Overridable="yes">K instalaci produktu [ProductName] je vyžadována služba IIS verze 7 nebo 7.5.</String>
- <String Id="BetaVersionFound" Overridable="yes">V tomto počítači byla nalezena beta verze produktu [ProductName].</String>
- <String Id="NewerVersionFound" Overridable="yes">V tomto počítači byla nalezena novější verze produktu [ProductName].</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Instalační program nemůže pokračovat, protože v tomto počítači je již nainstalována jiná instance produktu [ProductName]. Odinstalujte tuto instanci a poté znovu spusťte instalaci.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Produkt [ProductName] lze používat pouze tehdy, jsou-li nainstalovány součásti webového jádra a W3SVC služby IIS 7.0.</String>
- <String Id="IISManagementConsole" Overridable="yes">Produkt [ProductName] lze používat pouze v případě, že je nainstalována konzola pro správu služby IIS.</String>
- <String Id="WebServicesRunning" Overridable="yes">Před instalací produktu [ProductName] je třeba zastavit Aktivační službu procesů systému Windows (WAS) a Službu webové správy (WMSvc). Po instalaci produktu [ProductName] bude třeba tyto služby opět spustit.</String>
- <String Id="MetabaseRequired" Overridable="yes">K instalaci produktu [ProductName] je požadována metabáze služby IIS.</String>
- <String Id="LaunchCondition_32BIT">64bitovou verzi produktu [ProductName] nelze nainstalovat do 32bitové edice systému Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">32bitovou verzi produktu [ProductName] nelze nainstalovat do 64bitové edice systému Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">K instalaci produktu [ProductName] je požadováno rozhraní Microsoft .NET Framework 2.0 nebo vyšší.</String>
- <String Id="NetFX35OrGreaterRequired">K instalaci produktu [ProductName] je vyžadováno rozhraní Microsoft .NET Framework 3.5 nebo vyšší. Nainstalujte toto rozhraní pomocí tlačítka Přidat funkce ve správci serveru.</String>
- <String Id="NetFX4OrGreaterRequired">K instalaci produktu [ProductName] je vyžadováno rozhraní Microsoft .NET Framework 4.0 nebo vyšší.</String>
- <String Id="NetFX20SP1IsRequired">Před instalací produktu [ProductName] nainstalujte rozhraní Microsoft .NET Framework verze 2.0 Service Pack 1 (nebo novější aktualizaci Service Pack).</String>
- <String Id="WindowsUpdateEnabled">Služba Windows Update (wuauserv) nemůže být zakázána. Je požadována pro instalaci produktu [ProductName].</String>
- <String Id="GetFromOSforWin7">Modul snap-in PowerShell je součástí operačního systému Windows. Nainstalujte jej prostřednictvím ovládacího panelu Programy a funkce nebo prostřednictvím Správce serveru.</String>
- <String Id="WebPI3OrGreaterRequired">K instalaci produktu [ProductName] je vyžadována Instalace webové platformy společnosti Microsoft verze 3.0 nebo vyšší.</String>
-
- <String Id="Error30001" Overridable="yes">Instalačnímu programu se nepodařilo zjistit sdílenou konfiguraci.</String>
- <String Id="Error30002" Overridable="yes">Pro službu IIS je povolena sdílená konfigurace. Instalace produktu [ProductName] není podporována při použití sdílené konfigurace. Před instalací této součásti je třeba sdílenou konfiguraci zakázat.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Před instalací produktu [ProductName] zastavte Službu publikování na webu (W3SVC). Po instalaci bude třeba ji opět spustit. </String>
- <String Id="IISPowershellConsole">Konzola pro správu prostředí PowerShell služby IIS</String>
- <String Id="IISPowershellSnapin">Modul snap-in PowerShell služby IIS</String>
- <String Id="PowerShellRequired">Modul snap-in PowerShell služby IIS požaduje, aby byl nainstalována součást PowerShell v1.0 nebo v2.0.</String>
- <String Id="WasAndConfigRequired">Modul snap-in PowerShell služby IIS požaduje, aby byl nainstalována služba WAS a konfigurace.</String>
- <String Id="TestBogusString" Overridable="yes">Toto je nepravý řetězec.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Rozhraní Microsoft Web Farm Framework verze 2.2</String>
- <String Id="WebFarmAgentProductName">Agent Microsoft Web Farm verze 2.2</String>
- <String Id="WebFarmBasicFeatureName">Služba Web Farm</String>
- <String Id="WebFarmBasicFeatureDescription">Služba Web Farm</String>
- <String Id="WebFarmControllerServiceName">Služba řadiče Web Farm</String>
- <String Id="WebFarmControllerServiceDescription">Služba řadiče Web Farm</String>
- <String Id="WebFarmAgentServiceName">Služba agenta Web Farm</String>
- <String Id="WebFarmAgentServiceDescription">Služba agenta Web Farm</String>
- <String Id="WebPIRequired">K instalaci rozhraní Web Farm Framework je vyžadován průvodce Instalace webové platformy. Nainstalujte jej z adresy http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">K instalaci rozhraní Web Farm Framework je vyžadován Nástroj pro nasazení webu. Nainstalujte jej z adresy http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Architektura webových hostitelských služeb společnosti Microsoft</String>
- <String Id="WebHostingCommonFeatureName">Architektura webových hostitelských služeb</String>
- <String Id="WebHostingCommonFeatureDescription">Role a funkce webových hostitelských služeb</String>
- <String Id="WebHostingFrameworkFeatureName">Architektura hostitelských služeb</String>
- <String Id="WebHostingFrameworkFeatureDescription">Architektura hostitelských služeb poskytuje příkazy rozhraní API a prostředí PowerShell pro správu webových hostitelských služeb.</String>
- <String Id="WebHostingWebRoleFeatureName">Webová role</String>
- <String Id="WebHostingWebRoleFeatureDescription">Webová role nainstaluje Dynamickou službu WAS a zprostředkovatele pro přepis adresy URL pro webové hostitelské služby.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Nasadí konfiguraci ovládacích panelů optimalizovanou pro instalaci v jednom počítači.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Role nástroje pro vyrovnávání zatížení</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Role nástroje pro vyrovnávání zatížení nakonfiguruje směrovač žádostí aplikace na směrování na základě pravidel webových hostitelských služeb.</String>
- <String Id="WebHostingControllerFeatureName">Řadič hostingu</String>
- <String Id="WebHostingControllerFeatureDescription">Řadič hostitelských služeb rozšiřuje rozhraní Web Farm Framework 2.0 na práci s webovými hostitelskými službami.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Role publikování</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Nainstaluje podporu pro nasazení webu a publikování FTP.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Jde o modul snap-in prostředí PowerShell obsahující rutiny umožňující správu infrastruktury Microsoft Web Hosting.</String>
- <String Id="DWASServiceName">Dynamická služba WAS</String>
- <String Id="DWASServiceDescription">Aktivační služba procesů systému Windows optimalizovaná pro webové hostitelské služby s vysokou hustotou</String>
- <String Id="MeteringFeatureName">Služba měření četnosti odesílání dat ze zdrojů</String>
- <String Id="MeteringFeatureDescription">Nainstaluje službu měření četnosti odesílání dat ze zdrojů, která umožňuje shromažďovat a publikovat informace o běhu i o stavu.</String>
- <String Id="MeteringServiceName">Resource Metering</String>
- <String Id="MeteringServiceDescription">Povolí shromažďování a publikování informací o běhu a stavu z webové role.</String>
- <String Id="QuotaEnforcementServiceName">Vynucení kvóty hostitelských služeb</String>
- <String Id="QuotaEnforcementServiceDescription">Monitoruje využití prostředků na webech a v případě překročení kvóty použití spustí vlastní akce.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/DEU/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/DEU/misc/setupstrings.wxl
deleted file mode 100644
index 436243b9ad..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/DEU/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="de-de" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1031</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Installationsoptionen für freigegebene Konfiguration</String>
- <String Id="SharedConfigDlgDescription">Wählen Sie eine Option für die Installation in der freigegebenen IIS-Konfiguration aus.</String>
- <String Id="SharedConfigDlgCheckBox">Freigegebene Konfiguration bei Installation aktualisieren</String>
- <String Id="SharedConfigDlgText">Die Installation des Moduls erfolgt auf einem IIS-Server, der eine freigegebene Konfiguration verwendet. Wenn weitere IIS-Server diese freigegebene Konfiguration verwenden, müssen Sie dieses Modul auf allen beteiligten Computern installieren. Um Unterbrechungen auf den einzelnen Webservern zu vermeiden, beachten Sie bei der Installation des Moduls die folgenden Schritte: Führen Sie die Modulinstallation auf allen bis auf dem letzten Computer durch, ohne die freigegebene Konfiguration zu aktualisieren. Deaktivieren Sie hierzu das folgende
- Kontrollkästchen. Dadurch werden alle Binärdateien und andere für das Modul benötigten Dateien auf jedem Computer installiert, ohne Änderungen an der freigegebenen Konfiguration vorzunehmen. Anschließend müssen Sie auf dem letzten Computer sicherstellen, dass das verwendete Benutzerkonto über Lese- und Schreibzugriff auf die Datei "applicationhost.config" auf der UNC-Freigabe verfügt. Installieren Sie dann das Modul, und aktivieren Sie dabei die folgend gezeigte Option zum Aktualisieren der freigegebenen Konfiguration. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Die benutzerdefinierte WebConfig-Aktion wird initialisiert.</String>
- <String Id="ProgressText_WebConfigUpdate">"web.config" wird aktualisiert.</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS Advanced Logging</String>
- <String Id="AdvancedLoggingDescription">Aktiviert die erweiterte Protokollierung von IIS-Pipelinedaten.</String>
- <String Id="AdvancedLoggingUI">IIS Advanced Logging</String>
- <String Id="AdvancedLoggingUIDescription">Aktiviert die Erstellung von Protokolldateien mit umfangreicher Feldauswahl.</String>
- <String Id="AdvancedLoggingUpdate01">Update für IIS Advanced Logging</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Aktiviert die Transform Manager IIS Media Services.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">Aktiviert die Erstellung von Medientransformationen.</String>
- <String Id="TransformManagerServiceHostName">IIS Transform Manager-Host</String>
- <String Id="TransformManagerServiceHostDescription">Diensthost für [ProductName].</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">Bedarfsgesteuerte Batchkonvertierung von Mediendateien in andere Datei- und Containerformate.</String>
- <String Id="TransformManagerEESPTaskInstalled">Ein IIS Transform Manager 1.0 Expression Encoder SP-Aufgabenpaket ist auf dem Computer installiert. Sie müssen das Paket deinstallieren, bevor Sie [ProductName] installieren können.</String>
-
- <String Id="NetFx35Required">Microsoft .NET Framework 3.5 ist für die Installation von [ProductName] erforderlich. Verwenden Sie den Assistenten zum Hinzufügen von Features im Server-Manager, um .NET Framework 3.5.1-Features zu installieren, oder verwenden Sie die Option "Windows-Features ein- oder ausschalten" zum Aktivieren von Microsoft .NET Framework 3.5.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS-Verwaltung digitaler Rechte (DRM)</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Aktiviert die Verwaltung digitaler Rechte (DRM) für Smooth Streaming-Präsentationen.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET ist nicht installiert.</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Vor der Installation von Session Helper für die Dauerhaftigkeit des ASP.NET-Sitzungszustands in Internet-Wiedergabelisten müssen Sie den ASP.NET-Rollendienst für die Webserverrolle (IIS) im Server-Manager installieren. Um die Installation der Media Services ohne Session Helper für ASP.NET fortzusetzen, klicken Sie auf 'Zurück', und entfernen Sie Session Helper aus der Liste der zu installierenden Features. Klicken Sie andernfalls auf 'Abbrechen', installieren Sie den ASP.NET-Rollendienst im Server-Manager, und führen Sie dann die IIS Media Services-Einrichtung erneut aus.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Internet-Wiedergabelisten können nur dann den Anbieter für die ASP.NET-Sitzungsdauerhaftigkeit verwenden, wenn der ASP.NET-Rollendienst für den Webserver (IIS) installiert ist. Wenn Sie die ASP.NET-Sitzungsdauerhaftigkeit mit Internet-Wiedergabelisten verwenden möchten, installieren Sie den ASP.NET-Rollendienst für Webserver (IIS) im Server-Manager.
-
-Wenn Session Helper jetzt nicht installiert werden soll, können Sie auf 'Zurück' klicken und dieses Feature deaktivieren.
-
-Wenn Sie den ASP.NET-Rollendienst installieren, können Sie die installierten Features dieses Produkts über das Menü 'Programme und Funktionen' der Systemsteuerung ändern.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">IIS Smooth Streaming Beta wurde auf diesem Computer gefunden. Die Installation von [ProductName] kann nicht fortgesetzt werden. Um dieses Produkt zu installieren, können Sie IIS Smooth Streaming Beta über die Funktion "Software" in der Systemsteuerung entfernen.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Auf diesem Computer befindet sich eine inkompatible Version der IIS Media Services. Die Installation von [ProductName] kann nicht fortgesetzt werden. Um dieses Produkt zu installieren, können Sie IIS Media Services über die Funktion "Software" in der Systemsteuerung entfernen.</String>
- <String Id="NewerMediaServicesVersionFound">Eine neuere Version dieses Produkts ist entweder bereits installiert oder für die Installation auf diesem Computer verfügbar. Die Installation von [ProductName] kann nicht fortgesetzt werden. Zum Installieren einer neueren Version des Produkts rufen Sie die Systemsteuerung auf, wählen 'Software' und aktualisieren dann die IIS Media Services.</String>
- <String Id="ISXConversionRequiredWarningTitle">Die Konvertierung der Wiedergabelistendatei ist erforderlich.</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Die für frühere Versionen der Internet-Wiedergabelisten erstellten Wiedergabelistendateien werden in dieser Version nicht unterstützt. Um Kopien der Wiedergabelisten zu erstellen, die in dieser Version der Internet-Wiedergabelisten unterstützt werden, führen Sie das Konvertierungstool 'isxTranslate' aus, das verfügbar ist unter: http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Es wurden ältere IIS Media Services-Dateien gefunden.</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[Eine frühere Version mindestens eines Media Services-Features ist auf diesem Computer installiert. Alle installierten Media Services-Features müssen aktualisiert werden, damit die Features in den IIS Media Services ordnungsgemäß funktionieren.
-
-Um bereits installierte Media Services-Features auf aktuelle Versionen zu aktualisieren, klicken Sie auf 'Weiter'. Wenn Sie die installierten Versionen dieser Features nicht aktualisieren möchten, klicken Sie auf 'Abbrechen'.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Es wurden IIS Media Services-Dateien der Betaversion gefunden.</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[Auf dem Computer ist eine Betaversion von mindestens einem IIS Media Services-Feature installiert. Das Setup der IIS Media Services kann nicht fortgesetzt werden.
-
-Sie müssen die Features der Betaversion deinstallieren, um diese Version der IIS Media Services installieren zu können.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Update für IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">Update für IIS Media Services 2.0</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Update für IIS Media Services 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Features und Tools der IIS Media Services.</String>
- <String Id="MediaServicesBurbankDescription">Features und Tools der IIS Media Services 5 Premium.</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Internet-Wiedergabelisten</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Steuert die Clientwiedergabe von Medienobjekten, auf die in Wiedergabelisten verwiesen wird.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Session Helper</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Aktiviert die Dauerhaftigkeit des ASP.NET-Sitzungszustands (erfordert den ASP.NET-Rollendienst für Webserver (IIS)).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Benutzeroberfläche</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Konfiguriert das Feature 'Internet-Wiedergabelisten' im IIS-Manager.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Bitratendrosselung</String>
- <String Id="MediaServicesFeatureBitrateDescription">Spart Bandbreite durch Drosselung der Übermittlung von Dateien ein, die von Clients heruntergeladen wurden.</String>
- <String Id="MediaServicesFeatureBitrateUI">Benutzeroberfläche</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Konfiguriert das Feature 'Bitratendrosselung' im IIS-Manager.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Objekte</String>
- <String Id="MediaServicesFeatureSmoothDescription">Aktiviert adaptives HTTP-Streaming von bedarfsgesteuerten Objekten an Clients.</String>
- <String Id="MediaServicesFeatureSmoothUI">Benutzeroberfläche</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Konfiguriert das Feature 'Smooth Streaming' im IIS-Manager.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Kanäle</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Aktiviert adaptives HTTP-Streaming von Kanalübertragungen an Clients.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Benutzeroberfläche</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Konfiguriert das Live Smooth Streaming-Feature im IIS-Manager.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Verwaltung digitaler Rechte (DRM)</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Stellt Verschlüsselung und Lizenzierung für Smooth Streaming-Medien bereit.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Benutzeroberfläche</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Konfiguriert die Funktion zur Verwaltung digitaler Rechte (DRM) im IIS-Manager.</String>
-
- <String Id="VistaSP1Required">[ProductName] erfordert Microsoft Windows Vista Service Pack 1 oder höher.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName] darf nicht unter Vista Home Basic installiert werden.</String>
- <String Id="Windows7SP1Required">[ProductName] erfordert Microsoft Windows 7 Service Pack 1 oder höher.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS-Datenbank-Manager</String>
- <String Id="DBManagerBasicFeatureName">IIS-Datenbank-Manager</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft-Webverwaltungsdienst 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft-Webverwaltungsdienst</String>
- <String Id="WMSvcBasicFeatureDescription">Installiert die grundlegenden Features von [ProductName].</String>
- <String Id="WMSvcServiceName">Microsoft-Webverwaltungsdienst 2</String>
- <String Id="WMSvcServiceDescription">Der Webverwaltungsdienst bietet Remote- und delegierte Verwaltungsfunktionen für Administratoren zur Verwaltung des Webservers, der Websites und der Anwendungen auf diesem Computer.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Microsoft URL Rewrite-Modul 1.1 für IIS 7</String>
- <String Id="RewriteServicingPatchV1">Update für das URL Rewrite-Modul 1.1 für IIS 7</String>
- <String Id="RewriteModuleTitleV1">URL Rewrite</String>
- <String Id="RewriteModuleDescriptionV1">Aktiviert URL- und Inhaltsumschreibfunktionen für IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Benutzeroberfläche</String>
- <String Id="RewriteModuleUIDescriptionV1">Konfiguriert das Feature 'URL Rewrite-Modul' im IIS-Manager.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS-URL-Rewrite-Modul 2</String>
- <String Id="RewriteServicingPatch">Update für IIS-URL-Rewrite-Modul 2</String>
- <String Id="RewriteModuleTitle">URL Rewrite</String>
- <String Id="RewriteModuleDescription">Aktiviert URL- und Inhaltsumschreibfunktionen für IIS 7.</String>
- <String Id="RewriteModuleUITitle">Benutzeroberfläche</String>
- <String Id="RewriteModuleUIDescription">Konfiguriert das Feature 'URL Rewrite-Modul' im IIS-Manager.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack für IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Installiert die grundlegenden Features von [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack für IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">Diese Version des Betriebssystems wird nicht unterstützt. [ProductName] kann nur unter Windows Server 2008 oder Windows Vista Service Pack 1 und höher installiert werden.</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.NET-Features</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET umfasst Features für Autorisierung und Fehlerseiten, mit denen Sie die Autorisierungs- und benutzerdefinierten Fehlereinstellungen verwalten können.</String>
- <String Id="Authentication" Overridable="yes">Authentifizierung</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.NET-Authentifizierungsbeschreibung.</String>
- <String Id="Authorization" Overridable="yes">Autorisierung</String>
- <String Id="AuthorizationDescription" Overridable="yes">Mit der ASP.NET-Autorisierung können Sie Regeln für die Autorisierung von Benutzern für den Zugriff auf Websites und Anwendungen konfigurieren.</String>
- <String Id="ErrorPages" Overridable="yes">Fehlerseiten</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Mit den ASP.NET-Fehlerseiten können Sie HTTP-Fehlerreaktionen konfigurieren.</String>
- <String Id="Modules" Overridable="yes">Module</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.NET-Modulbeschreibung.</String>
- <String Id="Handlers" Overridable="yes">Handler</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.NET-Handlerbeschreibung.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Konfigurations-Editor</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Mit dem Konfigurations-Editor können Sie Konfigurationsdateien im IIS-Manager verwalten, indem Sie Abschnitte, Attribute, Elemente und Sammlungen der Konfigurationsdateien bearbeiten.</String>
- <String Id="RequestFiltering" Overridable="yes">Anforderungsfilterung</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Bei der Anforderungsfilterung können Sie Filterregeln für Ihre Website konfigurieren und das Protokoll- und Inhaltsverhalten beschränken.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">Mit 'FastCGI' können Sie Prozesspooleinstellungen für die FastCGI-Anwendungen auf Ihrem Webserver konfigurieren.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Dynamische IP-Einschränkungen für die IIS 7-Konfiguration </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[Der Setup-Assistent hat festgestellt, dass die in IIS integrierten IP- und Domäneneinschränkungen bereits installiert sind. Der Setup-Assistent deinstalliert die vorhandenen IP- und Domäneneinschränkungen, damit die dynamischen IP-Einschränkungen installiert werden können. Die vorhandene IP-Sicherheitskonfiguration wird beibehalten.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Dieser Vorgang kann einige Minuten dauern.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Möchten Sie den Vorgang fortsetzen?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamische IP-Einschränkungen für IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamische IP-Einschränkungen für IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamische IP-Einschränkungen für IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamische IP-Einschränkungen für IIS 7 - Release Candidate </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamische IP-Einschränkungen für IIS 7 - Release Candidate 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamische IP-Einschränkungen für IIS 7 - Release Candidate 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamische IP-Einschränkungen für IIS 7 - RTW</String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamische IP-Einschränkungen für IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Dynamische IP-Einschränkungen - Benutzeroberfläche für IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Dynamische IP-Einschränkungen für IIS 7 - Beta wurde auf diesem Computer gefunden. Deinstallieren Sie diese Anwendung, und versuchen Sie es erneut.</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 für IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Die IIS 7.0-Features CoreWebEngine und W3SVC müssen für die Verwendung dieses Produkts installiert sein.</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV-Servermodul</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV-Administrationsbenutzeroberfläche</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Search Engine Optimization (SEO) Toolkit 1.0</String>
- <String Id="SiteAnalyzerProductComments">Diese Installer-Datenbank enthält die zum Installieren von IIS Search Engine Optimization Toolkit 1.0 erforderliche Logik.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS-Editor</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS-Berichte</String>
- <String Id="LogParserInstalled" Overridable="yes">Der Protokollparser ist nicht auf diesem Computer installiert. Installieren Sie Log Parser 2.2 über http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07, und setzen Sie dann die Installation der IIS-Berichte fort.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Erforderliche Pakete wurden nicht gefunden. Führen Sie 'setup.exe' aus, um Abhängigkeiten aufzulösen und dieses Programm zu installieren.</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 Management Objects ist eine Voraussetzung für die Installation von IIS-Datenbank-Manager. Sie können Microsoft SQL Server 2008 Management Objects über http://go.microsoft.com/fwlink/?LinkID=150946 installieren.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server System CLR Types ist eine Voraussetzung für die Installation von IIS-Datenbank-Manager. Sie können Microsoft SQL Server System CLR Types über http://go.microsoft.com/fwlink/?LinkID=150949 installieren.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework ist eine Voraussetzung für die Installation des Routings von Anwendungsanforderungen. Installieren Sie Web Farm Framework.</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">Laufzeit</String>
- <String Id="ArrModuleDescription">Fügt die Funktionen des Routings von Anwendungsanforderungen zu IIS hinzu.</String>
- <String Id="ArrUITitle">Benutzeroberfläche</String>
- <String Id="ArrUIDescription">Konfiguriert das Feature "Routing von Anwendungsanforderungen" im IIS-Manager.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Microsoft Windows PowerShell snap-in für IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft-Webplattform-Installer 4.0</String>
- <String Id="WebPIFeatureName">Microsoft-Webplattform-Installer</String>
- <String Id="XPSP2Required">[ProductName] erfordert Windows XP SP2, Windows 2003 SP1, Windows Vista oder höher.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] benötigt Windows XP Service Pack 3, Windows Server 2003 Service Pack 2 oder höher.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Microsoft Windows Azure Services Installer</String>
- <String Id="WASIFeatureName">Microsoft Windows Azure Services Installer</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Internetinformationsdienste (IIS) 7+-Manager</String>
- <String Id="RemoteMgrClientFeatureName">IIS-Manager-Client</String>
- <String Id="RemoteMgrRemotingFeatureName">Remotesupport</String>
- <String Id="RemoteMgrNotSupported">Das Produkt erfordert Windows XP SP2, Windows 2003 SP1, Windows Vista SP1 oder Windows 7 oder höher.</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">Die IIS-Verwaltungskonsole ist nicht installiert, sie ist aber zur Verwaltung von Remote-IIS-Servern erforderlich. Installieren Sie die IIS-Verwaltungskonsole vor der Installation des Remoteverwaltungssupports durch Öffnen von 'Systemsteuerung-&gt;Programme-&gt;Windows-Funktionen ein- oder ausschalten' und Auswahl der IIS-Verwaltungskonsole im Feature 'Internetinformationsdienste'.</String>
- <String Id="RemoteMgrNotRequired">Dieses Produkt ist in Windows Server 2008 oder Windows Server 2008 R2 oder höher nicht erforderlich. Installieren Sie die IIS-Verwaltungskonsole durch Öffnen des Server-Managers und Auswahl der IIS-Verwaltungskonsole in den Rollendiensten für die Webserverrolle.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS-Manager-Publishing für IIS 7.0</String>
- <String Id="PublishingFeatureName">Publishing-Benutzeroberfläche</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 für IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">Ein inkompatibles Produkt ( [CONFLICTING_PRODUCT_NAME]) ist auf dem Computer. installiert. Die Installation von [ProductName] kann nicht fortgesetzt werden. Verwenden Sie zum Installieren dieses Produkts "Software" in der Systemsteuerung, um [CONFLICTING_PRODUCT_NAME] zu entfernen.</String>
- <String Id="AdminRequired" Overridable="yes">Administratorberechtigungen sind für die Installation von [ProductName] erforderlich.</String>
- <String Id="IIS7Only" Overridable="yes">IIS Version 7.0 ist für die Verwendung von [ProductName] erforderlich.</String>
- <String Id="IIS7OrGreater" Overridable="yes">IIS Version 7.0 oder höher ist für die Installation von [ProductName] erforderlich.</String>
- <String Id="IIS75OrGreater" Overridable="yes">IIS Version 7.5 oder höher ist für die Installation von [ProductName] erforderlich.</String>
- <String Id="IIS7Or75Only" Overridable="yes">IIS Version 7.0 oder 7.5 ist für die Installation von [ProductName] erforderlich.</String>
- <String Id="BetaVersionFound" Overridable="yes">Eine Betaversion von [ProductName] wurde auf diesem Computer gefunden.</String>
- <String Id="NewerVersionFound" Overridable="yes">Eine neuere Version von [ProductName] wurde auf diesem Computer gefunden.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Die Installation kann nicht fortgesetzt werden, da eine andere Instanz von [ProductName] bereits auf diesem Computer installiert ist. Deinstallieren Sie diese zuerst, und starten Sie die Installation dann erneut.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Die IIS 7.0-Features CoreWebEngine und W3SVC müssen für die Verwendung von [ProductName] installiert sein.</String>
- <String Id="IISManagementConsole" Overridable="yes">Die IIS-Verwaltungskonsole muss für die Verwendung von [ProductName] installiert sein.</String>
- <String Id="WebServicesRunning" Overridable="yes">Halten Sie die den Windows-Prozessaktivierungsdienst (WAS) und den Webverwaltungsdienst (WMSvc) vor der Installation von [ProductName] an. Sie müssen die Dienste nach der Installation von [ProductName] wieder starten.</String>
- <String Id="MetabaseRequired" Overridable="yes">IIS-Metabasis ist für die Installation von [ProductName] erforderlich.</String>
- <String Id="LaunchCondition_32BIT">Die 64-Bit-Version von [ProductName] kann nicht in einer 32-Bit-Version von Microsoft Windows installiert werden.</String>
- <String Id="LaunchCondition_64BIT">Die 32-Bit-Version von [ProductName] kann nicht in einer 64-Bit-Version von Microsoft Windows installiert werden.</String>
- <String Id="NetFX2OrGreaterRequired">Microsoft .NET Framework Version 2.0 oder höher ist für die Installation von [ProductName] erforderlich.</String>
- <String Id="NetFX35OrGreaterRequired">Microsoft .NET Framework Version 3.5 oder höher ist für die Installation von [ProductName] erforderlich. Verwenden Sie die Option "Features hinzufügen" im Server-Manager, um Microsoft .Net Version 3.5 zu installieren.</String>
- <String Id="NetFX4OrGreaterRequired">Microsoft .NET Framework Version 4.0 oder höher ist für die Installation von [ProductName] erforderlich.</String>
- <String Id="NetFX20SP1IsRequired">Installieren Sie Microsoft .NET Framework Version 2.0 Service Pack 1 (oder ein höheres Service Pack) vor der Installation von [ProductName].</String>
- <String Id="WindowsUpdateEnabled">Der Windows Update (wuauserv)-Dienst kann nicht deaktiviert werden, er ist zur Installation von [ProductName] erforderlich.</String>
- <String Id="GetFromOSforWin7">Das PowerShell-Snap-In ist Teil des Windows-Betriebssystems. Installieren Sie es über 'Programme und Funktionen' oder 'Server-Manager'.</String>
- <String Id="WebPI3OrGreaterRequired">Microsoft-Webplattform-Installer Version 3.0 oder höher ist für die Installation von [ProductName] erforderlich.</String>
-
- <String Id="Error30001" Overridable="yes">Die freigegebene Konfiguration konnte nicht ermittelt werden.</String>
- <String Id="Error30002" Overridable="yes">Die freigegebene Konfiguration ist für IIS aktiviert. Die Installation von [ProductName] wird bei Verwendung der freigegebenen Konfiguration nicht unterstützt. Deaktivieren Sie die freigegebene Konfiguration vor der Installation des Features.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Halten Sie den WWW-Publishingdienst (W3SVC) vor der Installation von [ProductName] an. Sie müssen den Dienst nach der Installation wieder starten. </String>
- <String Id="IISPowershellConsole">IIS-PowerShell-Verwaltungskonsole</String>
- <String Id="IISPowershellSnapin">IIS-PowerShell-Snap-In</String>
- <String Id="PowerShellRequired">Das IIS-PowerShell-Snap-In erfordert die Installation von PowerShell v1.0 oder v2.0.</String>
- <String Id="WasAndConfigRequired">Das IIS-PowerShell-Snap-In erfordert die Installation des Windows-Prozessaktivierungsdiensts und der Konfiguration.</String>
- <String Id="TestBogusString" Overridable="yes">Dies ist eine Platzhalter-Zeichenfolge.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework Version 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Webfarm-Agent Version 2.2</String>
- <String Id="WebFarmBasicFeatureName">Webfarmdienst</String>
- <String Id="WebFarmBasicFeatureDescription">Webfarmdienst</String>
- <String Id="WebFarmControllerServiceName">Webfarm-Controllerdienst</String>
- <String Id="WebFarmControllerServiceDescription">Webfarm-Controllerdienst</String>
- <String Id="WebFarmAgentServiceName">Webfarm-Agent-Dienst</String>
- <String Id="WebFarmAgentServiceDescription">Webfarm-Agent-Dienst</String>
- <String Id="WebPIRequired">Webplattform-Installer ist eine Voraussetzung für die Installation von Web Farm Framework. Installieren Sie den Webplattform-Installer von "http://www.microsoft.com/web/downloads/platform.aspx".</String>
- <String Id="WebDeployRequired">Die Webbereitstellungstools sind eine Voraussetzung für die Installation von Web Farm Framework. Installieren Sie das Webbereitstellungstool von "http://www.iis.net/download/WebDeploy".</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Rollen und Funktionen für Web Hosting.</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework stellt APIs und PowerShell-Befehle zum Verwalten von Web Hosting zur Verfügung.</String>
- <String Id="WebHostingWebRoleFeatureName">Webrolle</String>
- <String Id="WebHostingWebRoleFeatureDescription">Die Webrolle installiert den dynamischen WAS-Dienst und den URL-Rewrite-Anbieter für Web Hosting.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Stellt eine Systemsteuerungskonfiguration bereit, die für die Einrichtung eines einzelnen Computers optimiert ist.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Lastenausgleichsrolle</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Die Lastenausgleichsrolle konfiguriert den Anwendungsanforderungsrouter für Routing basierend auf Web Hosting-Regeln.</String>
- <String Id="WebHostingControllerFeatureName">Hostingcontroller</String>
- <String Id="WebHostingControllerFeatureDescription">Der Hostingcontroller erweitert Web Farm Framework 2.0 für die Zusammenarbeit mit Web Hosting.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Veröffentlichungsrolle</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Installiert Unterstützung für Web Deploy und FTP-Veröffentlichung.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Hierbei handelt es sich um ein PowerShell-Snap-In mit Cmdlets zur Verwaltung der Microsoft Web Hosting-Infrastruktur.</String>
- <String Id="DWASServiceName">Dynamischer WAS-Dienst</String>
- <String Id="DWASServiceDescription">Windows-Prozessaktivierungsdienst, der für HD-Web Hosting optimiert ist.</String>
- <String Id="MeteringFeatureName">Resource Metering-Dienst</String>
- <String Id="MeteringFeatureDescription">Installiert den Resource Metering-Dienst, der das Sammeln und Veröffentlichen von Laufzeit- und Systemintegritätsinformationen ermöglicht.</String>
- <String Id="MeteringServiceName">Resource Metering</String>
- <String Id="MeteringServiceDescription">Aktiviert das Sammeln und Veröffentlichen von Laufzeit- und Systemintegritätsinformationen aus der Webrolle.</String>
- <String Id="QuotaEnforcementServiceName">Durchsetzung des Hostingkontingents</String>
- <String Id="QuotaEnforcementServiceDescription">Überwacht den Website-Ressourceneinsatz und führt benutzerdefinierte Aktionen aus, wenn das Verwendungskontingent überschritten wurde.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ESN/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ESN/misc/setupstrings.wxl
deleted file mode 100644
index ea1579e794..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ESN/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="es-es" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">3082</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Opciones de instalación de la configuración compartida</String>
- <String Id="SharedConfigDlgDescription">Seleccionar la opción de instalación en la configuración compartida de IIS</String>
- <String Id="SharedConfigDlgCheckBox">Actualizar configuración compartida al instalar</String>
- <String Id="SharedConfigDlgText">Está instalando este módulo en un servidor IIS que usa una configuración compartida. Si otros servidores IIS usan esta configuración compartida, tendrá que instalar este módulo en todas estas máquinas. Para minimizar las interrupciones de los servidores web individuales, tendrá que instalar este módulo realizando los pasos siguientes. En primer lugar, en todas las máquinas, excepto en la última, debe instalar el módulo sin actualizar la configuración compartida. Hágalo sin activar la casilla
- siguiente. Esto instalará todos los binarios y archivos necesarios para el módulo en cada máquina sin modificar la configuración compartida. En segundo lugar, en la última máquina tendrá que comprobar que la identidad del usuario con la que está trabajando tiene acceso de lectura y escritura al archivo applicationhost.config del recurso compartido UNC. Después, debe instalar el módulo y seleccionar la opción de actualización de configuración compartida que figura a continuación. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Inicialización de acción personalizada de WebConfig</String>
- <String Id="ProgressText_WebConfigUpdate">Actualización de archivo web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">Registro avanzado de IIS</String>
- <String Id="AdvancedLoggingDescription">Permite el registro avanzado de datos de canalización de IIS.</String>
- <String Id="AdvancedLoggingUI">Registro avanzado de IIS</String>
- <String Id="AdvancedLoggingUIDescription">Permite la creación de archivos de registro personalizados con selección de campos extensible.</String>
- <String Id="AdvancedLoggingUpdate01">Actualización de Advanced Logging de IIS</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">Transform Manager para IIS</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Habilita los Servicios multimedia de IIS para Transform Manager.</String>
- <String Id="TransformManagerUI">Transform Manager para IIS</String>
- <String Id="TransformManagerUIDescription">Habilita la creación de transformaciones multimedia.</String>
- <String Id="TransformManagerServiceHostName">Host de Transform Manager para IIS</String>
- <String Id="TransformManagerServiceHostDescription">Host de servicios para [ProductName].</String>
- <String Id="TransformManagerShortcutName">Transform Manager para IIS</String>
- <String Id="TransformManagerShortcutTooltip">Permite convertir por lotes archivos multimedia a petición para alternar formatos de archivo y contenedor.</String>
- <String Id="TransformManagerEESPTaskInstalled">Existe un paquete de tareas de IIS Transform Manager 1.0 Expression Encoder SP instalado en el equipo. Deberá desinstalarlo antes de instalar [ProductName].</String>
-
- <String Id="NetFx35Required">Se necesita Microsoft .NET Framework 3.5 para instalar [ProductName]. Use el 'Asistente para agregar características' del Administrador del servidor para instalar las características de .NET Framework 3.5.1 o la opción 'Activar o desactivar las características de Windows' para activar Microsoft .NET Framework 3.5.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">Administración de derechos digitales de IIS</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Habilita la administración de derechos digitales de presentaciones de transmisión por secuencias suave.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET no está instalado</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Para poder instalar Aplicación auxiliar para sesiones para obtener persistencia de estado de sesión ASP.NET en Listas de reproducción en web, debe instalar el servicio de rol ASP.NET para el rol Servidor web (IIS) en el Administrador del servidor. Para continuar la instalación de Servicios multimedia sin Aplicación auxiliar para sesiones para ASP.NET, haga clic en Atrás y quite Aplicación auxiliar para sesiones de la lista de características que se van a instalar. De lo contrario, haga clic en cancelar, instale el servicio de rol ASP.NET en el Administrador del servidor y ejecute de nuevo el programa de instalación de Servicios multimedia de IIS.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Listas de reproducción en web no puede usar el proveedor de persistencia de sesión de ASP.NET a menos que esté instalado el servicio de rol ASP.NET para el rol Servidor web (IIS). Si desea usar la persistencia de sesión de ASP.NET con Listas de reproducción en web, instale el servicio de rol ASP.NET para el rol Servidor web (IIS) en el Administrador del servidor.
-
-Si no desea instalar la característica Aplicación auxiliar para sesiones ahora, haga clic en Atrás y anule la selección de esa característica.
-
-Si instala el servicio de rol ASP.NET, puede cambiar las características instaladas de este producto desde el menú Programas y características del Panel de control.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">Se encontró IIS Smooth Streaming - Beta en este equipo. La instalación de [ProductName] no puede continuar. Para instalar este producto, use Agregar o quitar programas en el Panel de control para quitar IIS Smooth Streaming - Beta.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Este equipo cuenta con una versión no compatible de Servicios multimedia de IIS. La instalación de [ProductName] no puede continuar. Para instalar este producto, use Agregar o quitar programas en el Panel de control para quitar Servicios multimedia de IIS.</String>
- <String Id="NewerMediaServicesVersionFound">Una versión más reciente de este producto está ya instalada o disponible para instalarla en este equipo. La instalación de [ProductName] no puede continuar. Para instalar la versión más reciente de este producto, use Agregar o quitar programas en el Panel de control para actualizar Servicios multimedia de IIS.</String>
- <String Id="ISXConversionRequiredWarningTitle">Conversión necesaria de archivo de lista de reproducción</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Los archivos de lista de reproducción creados para versiones anteriores de Listas de reproducción en web no se admiten en esta versión. Para crear copias de estas listas de reproducción que se admitan en esta versión de Listas de reproducción en web, ejecute la herramienta de conversión isxTranslate, disponible en http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Archivos de versiones anteriores de Servicios multimedia de IIS encontrados</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[En este equipo hay instalada una versión anterior de una o varias características de Servicios multimedia. El programa de instalación de Servicios multimedia de IIS debe actualizar estas características instaladas para garantizar que las características de Servicios multimedia de IIS funcionen correctamente.
-
-Para actualizarlas, haga clic en Siguiente. Si no desea actualizar las versiones instaladas previamente de estas características, haga clic en Cancelar.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Versión beta de los Servicios Multimedia de IIS encontrada</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[En este equipo hay instalada una versión beta de una o varias características de los Servicios multimedia de IIS. El programa de instalación de los Servicios multimedia de IIS no puede continuar.
-
-Para instalar esta versión de los Servicios multimedia de IIS, debe desinstalar las características beta.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Actualización de IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">Servicios multimedia 2.0 de IIS</String>
- <String Id="MediaServices20Update">Actualización de Servicios multimedia 2.0 de IIS</String>
- <String Id="MediaServices30Title">Servicios multimedia 3.0 de IIS</String>
- <String Id="MediaServices30TAP2Title">Servicios multimedia 3.0 de IIS (TAP 2)</String>
- <String Id="MediaServices30Update">Actualización de Servicios multimedia 3.0 de IIS</String>
- <String Id="MediaServicesIISMediaDescription">Características y herramientas de Servicios multimedia de IIS.</String>
- <String Id="MediaServicesBurbankDescription">Características y herramientas de Servicios multimedia de IIS 5 Premium.</String>
- <String Id="MediaServices40Beta1Title">Servicios multimedia 4.0 beta 1 de IIS</String>
- <String Id="MediaServices40Title">Servicios multimedia 4.0 de IIS</String>
- <String Id="MediaServicesIISMedia45Beta1Title">Servicios multimedia 4.5 beta 1 de IIS</String>
- <String Id="MediaServicesBurbankBeta1Title">Servicios multimedia de IIS 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Listas de reproducción en web</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Controla la reproducción en clientes de recursos multimedia digitales a los que se hace referencia en listas de reproducción.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Aplicación auxiliar para sesiones</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Habilita la persistencia de estado de sesión de ASP.NET. Requiere el servicio de rol ASP.NET para el rol Servidor web (IIS).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Interfaz de usuario</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Configura la característica Listas de reproducción en web en el Administrador de IIS.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Limitación de velocidad de bits</String>
- <String Id="MediaServicesFeatureBitrateDescription">Ahorra ancho de banda limitando la entrega de archivos descargados por los clientes.</String>
- <String Id="MediaServicesFeatureBitrateUI">Interfaz de usuario</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Configura la característica Limitación de velocidad de bits en el Administrador de IIS.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Activos</String>
- <String Id="MediaServicesFeatureSmoothDescription">Habilita la transmisión por secuencias adaptativa HTTP de archivos a petición a los clientes.</String>
- <String Id="MediaServicesFeatureSmoothUI">Interfaz de usuario</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Configura la característica Transmisión por secuencias suave en el Administrador de IIS.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Canales</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Habilita la transmisión por secuencias adaptativa HTTP de las difusiones de canal a los clientes.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Interfaz de usuario</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Configura la característica Live Smooth Streaming en el Administrador de IIS.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Administración de derechos digitales</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Proporciona cifrado y licencias de medios de transmisión por secuencias suave.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Interfaz de usuario</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Configura la característica de administración de derechos digitales en el administrador de IIS.</String>
-
- <String Id="VistaSP1Required">[ProductName] requiere Microsoft Windows Vista Service Pack 1 o posterior.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName] no se puede instalar en Vista Home Basic.</String>
- <String Id="Windows7SP1Required">[ProductName] requiere Microsoft Windows 7 Service Pack 1 o posterior.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">Administrador de bases de datos de IIS</String>
- <String Id="DBManagerBasicFeatureName">Administrador de bases de datos de IIS</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Servicio de administración web de Microsoft 2</String>
- <String Id="WMSvcBasicFeatureName">Servicio de administración web de Microsoft</String>
- <String Id="WMSvcBasicFeatureDescription">Instala las características básicas de [ProductName].</String>
- <String Id="WMSvcServiceName">Servicio de administración web de Microsoft 2</String>
- <String Id="WMSvcServiceDescription">El Servicio de administración web habilita funciones de administración remota y delegada para quienes administren los sitios, las aplicaciones y el servidor web presentes en este equipo.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Módulo URL Rewrite 1.1 para IIS 7</String>
- <String Id="RewriteServicingPatchV1">Actualización de Módulo URL Rewrite 1.1 para IIS 7</String>
- <String Id="RewriteModuleTitleV1">URL Rewrite</String>
- <String Id="RewriteModuleDescriptionV1">Habilita la reescritura de direcciones URL y contenido en IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Interfaz de usuario</String>
- <String Id="RewriteModuleUIDescriptionV1">Configura la característica Módulo URL Rewrite en el Administrador de IIS.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">Módulo URL Rewrite 2 de IIS</String>
- <String Id="RewriteServicingPatch">Actualización de Módulo URL Rewrite 2 de IIS</String>
- <String Id="RewriteModuleTitle">URL Rewrite</String>
- <String Id="RewriteModuleDescription">Habilita la reescritura de direcciones URL y contenido en IIS 7.</String>
- <String Id="RewriteModuleUITitle">Interfaz de usuario</String>
- <String Id="RewriteModuleUIDescription">Configura la característica Módulo URL Rewrite en el Administrador de IIS.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack para IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Instala las características básicas de [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack para IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">No se admite esta versión del sistema operativo. [ProductName] se puede instalar sólo en Windows Server 2008 o Windows Vista Service Pack 1 y posterior.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Características de ASP.NET</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET incluye las características Autorización y Páginas de errores, que permiten administrar la autorización y la configuración de errores personalizada.</String>
- <String Id="Authentication" Overridable="yes">Autenticación</String>
- <String Id="AuthenticationDescription" Overridable="yes">Descripción de autenticación ASP.NET.</String>
- <String Id="Authorization" Overridable="yes">Autorización</String>
- <String Id="AuthorizationDescription" Overridable="yes">Autorización de ASP.NET permite configurar reglas para autorizar a usuarios a obtener acceso a sitios y aplicaciones web.</String>
- <String Id="ErrorPages" Overridable="yes">Páginas de errores</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Páginas de errores de ASP.NET permite configurar respuestas a errores HTTP para devolverlas cuando se producen errores.</String>
- <String Id="Modules" Overridable="yes">Módulos</String>
- <String Id="ModulesDescription" Overridable="yes">Descripción de módulos de ASP.NET.</String>
- <String Id="Handlers" Overridable="yes">Controladores</String>
- <String Id="HandlersDescription" Overridable="yes">Descripción de controladores de ASP.NET.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Editor de configuración</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">El Editor de configuración permite administrar los archivos de configuración en el Administrador de IIS. Permite editar secciones, atributos, elementos y colecciones en los archivos de configuración.</String>
- <String Id="RequestFiltering" Overridable="yes">Filtrado de solicitudes</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Filtrado de solicitudes permite configurar reglas de filtrado para un sitio web y restringir el comportamiento de protocolo y contenido.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI permite configurar grupos de procesos para aplicaciones FastCGI del servidor web.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Programa de instalación de Restricciones de IP dinámicas para IIS 7 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[El asistente para la instalación ha detectado que la característica Restricciones de dominio e IP integrada en IIS está ya instalada. El asistente desinstalará la versión existente de Restricciones de dominio e IP para instalar Restricciones de IP dinámicas. La configuración de seguridad de IP existente se mantendrá.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Esto puede tardar varios minutos.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[¿Desea continuar?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Restricciones de IP dinámicas para IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Restricciones de IP dinámicas para IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Restricciones de IP dinámicas para IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Restricciones de IP dinámicas para IIS 7 - Release Candidate </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Restricciones de IP dinámicas para IIS 7 - Release Candidate 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Restricciones de IP dinámicas para IIS 7 - Release Candidate 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Restricciones de IP dinámicas para IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Restricciones de IP dinámicas para IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Interfaz de usuario de Restricciones de IP dinámicas para IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Se encontraron restricciones de IP dinámicas para IIS 7 - Beta en esta máquina. Desinstálelo e inténtelo de nuevo.</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 para IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Deben instalarse las características CoreWebEngine y W3SVC de IIS 7.0 para usar este producto.</String>
- <String Id="WebDAVFeatureTitleModule">Módulo de servidor de WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Interfaz de usuario de administración de WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">Herramientas de optimización para el motor de búsqueda de IIS 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">Herramientas de optimización para el motor de búsqueda de IIS 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Herramientas de optimización para el motor de búsqueda (SEO) de IIS 1.0</String>
- <String Id="SiteAnalyzerProductComments">Esta base de datos de instalador contiene la lógica y los datos necesarios para instalar las Herramientas de optimización para el motor de búsqueda de IIS 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Editor de IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Informes de IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">Log Parser no está instalado en esta máquina. Instale Log Parser 2.2 desde http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 y después continúe con la instalación de Informes de IIS.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">No se encontraron algunos paquetes de requisitos previos. Ejecute setup.exe para resolver las dependencias e instalar este programa.</String>
- <String Id="SMONotInstalled" Overridable="yes">Objetos de administración de Microsoft SQL Server 2008 es un requisito previo para instalar el Administrador de bases de datos de IIS. Puede instalar Objetos de administración de Microsoft SQL Server 2008 desde http://go.microsoft.com/fwlink/?LinkID=150946 .</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server System CLR Types es un requisito previo para instalar el Administrador de bases de datos de IIS. Puede instalar Microsoft SQL Server System CLR Types desde http://go.microsoft.com/fwlink/?LinkID=150949 .</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework es un requisito para instalar Enrutamiento de solicitud de aplicaciones. Instale Web Farm Framework.</String>
- <String Id="Arrv2ProductName">Enrutamiento de solicitud de aplicaciones de Microsoft 2.5</String>
- <String Id="ArrModuleTitle">Runtime</String>
- <String Id="ArrModuleDescription">Agrega las capacidades de Enrutamiento de solicitud de aplicaciones a IIS.</String>
- <String Id="ArrUITitle">Interfaz de usuario</String>
- <String Id="ArrUIDescription">Configura la característica Enrutamiento de solicitud de aplicaciones en el Administrador de IIS.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Complemento PowerShell de Microsoft Windows para IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Instalador de plataforma web 4.0 de Microsoft</String>
- <String Id="WebPIFeatureName">Instalador de plataforma web de Microsoft</String>
- <String Id="XPSP2Required">[ProductName] requiere Windows XP SP2, Windows 2003 SP1, Windows Vista o posterior.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] requiere Windows XP Service Pack 3, Windows Server 2003 Service Pack 2 o posterior.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Instalador de Microsoft Windows Azure Services</String>
- <String Id="WASIFeatureName">Instalador de Microsoft Windows Azure Services</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Administrador de Internet Information Services (IIS) 7 o posterior</String>
- <String Id="RemoteMgrClientFeatureName">Cliente del Administrador de IIS</String>
- <String Id="RemoteMgrRemotingFeatureName">Compatibilidad con comunicación remota</String>
- <String Id="RemoteMgrNotSupported">Este producto requiere Windows XP SP2, Windows 2003 SP1, Windows Vista SP1, Windows 7 o posterior.</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">La Consola de administración de IIS no está instalada, pero es necesaria para administrar servidores IIS remotos. Instale la Consola de administración de IIS antes de instalar la compatibilidad con administración remota. Para ello, abra 'Panel de control-&gt;Programas-&gt;Activar o desactivar las características de Windows' y seleccione Consola de administración de IIS en la característica Internet Information Services.</String>
- <String Id="RemoteMgrNotRequired">Este producto no es necesario en Windows Server 2008 ni Windows Server 2008 R2 o posterior. Para instalar la Consola de administración de IIS, abra el Administrador del servidor y seleccione Consola de administración de IIS en los servicios del rol Servidor web.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">Servicio de publicación del Administrador de IIS para IIS 7.0</String>
- <String Id="PublishingFeatureName">Interfaz de usuario para publicación</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 para IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">El equipo tiene un producto no compatible, [CONFLICTING_PRODUCT_NAME]. No es posible continuar con la instalación de [ProductName]. Para instalar este producto, vaya a Panel de control &gt; Agregar o quitar programas para quitar [CONFLICTING_PRODUCT_NAME].</String>
- <String Id="AdminRequired" Overridable="yes">Es necesario el privilegio de administrador para instalar [ProductName].</String>
- <String Id="IIS7Only" Overridable="yes">Es necesaria la versión 7.0 de IIS para usar [ProductName].</String>
- <String Id="IIS7OrGreater" Overridable="yes">Es necesaria la versión 7.0 o posterior de IIS para instalar [ProductName].</String>
- <String Id="IIS75OrGreater" Overridable="yes">Es necesaria la versión 7.5 o posterior de IIS para instalar [ProductName].</String>
- <String Id="IIS7Or75Only" Overridable="yes">Se requiere la versión 7 o 7.5 de IIS para instalar [ProductName].</String>
- <String Id="BetaVersionFound" Overridable="yes">Se encontró la versión beta de [ProductName] en esta máquina.</String>
- <String Id="NewerVersionFound" Overridable="yes">Se encontró una versión más reciente de [ProductName] en esta máquina.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">El programa de instalación no puede continuar porque ya hay instalada otra instancia de [ProductName] en esta máquina. Desinstale primero esa instancia y vuelva a iniciar esta instalación.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Deben estar instaladas las características CoreWebEngine y W3SVC de IIS 7.0 para usar [ProductName].</String>
- <String Id="IISManagementConsole" Overridable="yes">Para usar [ProductName], debe estar instalada la Consola de administración de IIS.</String>
- <String Id="WebServicesRunning" Overridable="yes">Detenga los servicios WAS (Windows Process Activation) y WMSvc (Servicio de administración web) antes de instalar [ProductName]. Deberá iniciar los servicios después de instalar [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">Es necesaria la metabase de IIS para instalar [ProductName].</String>
- <String Id="LaunchCondition_32BIT">No se puede instalar la versión de 64 bits de [ProductName] en una edición de 32 bits de Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">No se puede instalar la versión de 32 bits de [ProductName] en una edición de 64 bits de Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">Es necesario Microsoft .NET Framework 2.0 o posterior para instalar [ProductName].</String>
- <String Id="NetFX35OrGreaterRequired">Se requiere Microsoft .NET Framework, versión 3.5 o posterior, para instalar [ProductName]. Use la opción 'Agregar características' del Administrador del servidor para instalar Microsoft .Net, versión 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">Se requiere Microsoft .NET Framework, versión 4.0 o posterior, para instalar [ProductName].</String>
- <String Id="NetFX20SP1IsRequired">Instale Microsoft .NET Framework 2.0 Service Pack 1 (o un Service Pack posterior) antes de instalar [ProductName].</String>
- <String Id="WindowsUpdateEnabled">No se puede deshabilitar el servicio Windows Update (wuauserv), porque es necesario para instalar [ProductName].</String>
- <String Id="GetFromOSforWin7">El complemento PowerShell forma parte del sistema operativo Windows. Instálelo desde 'Programas y características' o 'Administrador del servidor'.</String>
- <String Id="WebPI3OrGreaterRequired">Se requiere Instalador de plataforma web de Microsoft, versión 3.0 o posterior, para instalar [ProductName].</String>
-
- <String Id="Error30001" Overridable="yes">El programa de instalación no detectó ninguna configuración compartida.</String>
- <String Id="Error30002" Overridable="yes">Está habilitada la configuración compartida para IIS. No se admite la instalación de [ProductName] cuando se usa configuración compartida. Deshabilite la configuración compartida antes de instalar esta característica.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Detenga el servicio de publicación World Wide Web (W3SVC) antes de instalar [ProductName]. Deberá iniciar el servicio después de la instalación. </String>
- <String Id="IISPowershellConsole">Consola de administración de PowerShell para IIS</String>
- <String Id="IISPowershellSnapin">Complemento PowerShell para IIS</String>
- <String Id="PowerShellRequired">El complemento PowerShell para IIS requiere que esté instalado PowerShell v1.0 o v2.0.</String>
- <String Id="WasAndConfigRequired">El complemento PowerShell para IIS requiere que estén instalados el servicio WAS y la configuración.</String>
- <String Id="TestBogusString" Overridable="yes">This is a bogus string.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework versión 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent versión 2.2</String>
- <String Id="WebFarmBasicFeatureName">Servicio de Web Farm</String>
- <String Id="WebFarmBasicFeatureDescription">Servicio de Web Farm</String>
- <String Id="WebFarmControllerServiceName">Servicio de controlador de Web Farm</String>
- <String Id="WebFarmControllerServiceDescription">Servicio de controlador de Web Farm</String>
- <String Id="WebFarmAgentServiceName">Servicio de agente de Web Farm</String>
- <String Id="WebFarmAgentServiceDescription">Servicio de agente de Web Farm</String>
- <String Id="WebPIRequired">El Instalador de plataforma web es un requisito previo para instalar Web Farm Framework. Instale el Instalador de plataforma web desde http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">La Herramienta de implementación web es un requisito previo para instalar Web Farm Framework. Instale la Herramienta de implementación web desde http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Roles y características de Microsoft Web Hosting.</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework ofrece comandos de las API y PowerShell para administrar Web Hosting.</String>
- <String Id="WebHostingWebRoleFeatureName">Rol web</String>
- <String Id="WebHostingWebRoleFeatureDescription">El rol web instala el servicio WAS dinámico y el proveedor de URL Rewrite para Web Hosting.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Implementa una configuración de Panel de control optimizada para la configuración de un único equipo.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Rol Equilibrador de carga</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">El rol Equilibrador de carga configura Application Request Router para enrutar en función de las reglas de Web Hosting.</String>
- <String Id="WebHostingControllerFeatureName">Controlador de hospedaje</String>
- <String Id="WebHostingControllerFeatureDescription">El controlador de hospedaje amplía Web Farm Framework 2.0 para que funcione con Web Hosting.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Rol de publicación</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Instala el soporte para la publicación FTP y de Web Deploy.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Se trata de un complemento de PowerShell que contiene cmdlets para administrar la infraestructura de Microsoft Web Hosting.</String>
- <String Id="DWASServiceName">Servicio WAS dinámico</String>
- <String Id="DWASServiceDescription">Servicio WAS (Windows Process Activation) optimizado para hospedaje web de alta densidad.</String>
- <String Id="MeteringFeatureName">Servicio de medición de recursos</String>
- <String Id="MeteringFeatureDescription">Instala el servicio Medición de recursos que habilita la recopilación y la publicación de información de estado y en tiempo de ejecución.</String>
- <String Id="MeteringServiceName">Medición de recursos</String>
- <String Id="MeteringServiceDescription">Habilita la recopilación y publicación de información de estado y en tiempo de ejecución del rol web.</String>
- <String Id="QuotaEnforcementServiceName">Cumplimiento de cuota de hospedaje</String>
- <String Id="QuotaEnforcementServiceDescription">Supervisa el uso de recursos de los sitios web y ejecuta acciones personalizadas si se supera la cuota.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/FRA/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/FRA/misc/setupstrings.wxl
deleted file mode 100644
index c00688e50c..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/FRA/misc/setupstrings.wxl
+++ /dev/null
@@ -1,352 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="fr-fr" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1036</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Options d'installation pour la configuration partagée</String>
- <String Id="SharedConfigDlgDescription">Sélectionnez une option pour l'installation dans une partagée IIS</String>
- <String Id="SharedConfigDlgCheckBox">Mettre à jour la configuration partagée lors de l'installation</String>
- <String Id="SharedConfigDlgText">Vous installez ce module sur un serveur IIS qui utilise une configuration partagée. Si des serveurs IIS supplémentaires utilisent cette configuration partagée, vous devez installer ce module sur tous ces ordinateurs. Pour réduire le risque d'interruptions sur les différents serveurs Web, installez ce module en respectant les étapes suivantes : premièrement, sur tous les ordinateurs à l'exception du dernier, vous devez installer le module sans mettre à jour la configuration partagée. Pour ce faire, n'activez pas la case à cocher
- ci-dessous. Cette opération installe l'ensemble des fichiers et ressources binaires requis pour le module sur chaque ordinateur sans apporter de modifications à la configuration partagée. Deuxièmement, sur le dernier ordinateur, vous devez vérifier que l'identité d'utilisateur que vous utilisez actuellement dispose d'un accès en lecture/écriture au fichier applicationhost.config du partage UNC. Vous devez ensuite installer le module et sélectionner l'option de mise à jour de la configuration partagée ci-dessous. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Initialisation de l'action personnalisée WebConfig</String>
- <String Id="ProgressText_WebConfigUpdate">Mise à jour de web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS Advanced Logging</String>
- <String Id="AdvancedLoggingDescription">Active la journalisation avancée des données de pipeline IIS.</String>
- <String Id="AdvancedLoggingUI">IIS Advanced Logging</String>
- <String Id="AdvancedLoggingUIDescription">Permet la création de fichiers journaux personnalisés avec une sélection de champ extensible.</String>
- <String Id="AdvancedLoggingUpdate01">Mise à jour pour IIS Advanced Logging</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Bêta</String>
- <String Id="TransformManagerDescription">Active IIS Services Multimédia pour Transform Manager.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">Active la création de transformations multimédias.</String>
- <String Id="TransformManagerServiceHostName">Hôte IIS Transform Manager</String>
- <String Id="TransformManagerServiceHostDescription">Hôte de service pour [ProductName].</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">Convertir sous forme de lot sur demande les fichiers multimédias en d'autres formats de fichier et de conteneur.</String>
- <String Id="TransformManagerEESPTaskInstalled">Un package IIS Transform Manager 1.0 Expression Encoder SP Task est installé sur l'ordinateur. Vous devez le désinstaller avant d'installer [ProductName].</String>
-
- <String Id="NetFx35Required">Microsoft .NET Framework 3.5 est requis pour installer [ProductName]. Utilisez l'Assistant Ajout de fonctionnalités du Gestionnaire de serveur pour installer le composant Fonctionnalités du .NET Framework 3.5.1, ou utilisez l'option Activer ou désactiver des fonctionnalités Windows pour activer Microsoft .NET Framework 3.5.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">Gestion des droits numériques (DRM) IIS</String>
- <String Id="DigitalRightsManagementRelease">Bêta</String>
- <String Id="DigitalRightsManagementDescription">Active la gestion des droits numériques (DRM) des présentations de diffusion en continu lisse.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET n'est pas installé</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Avant de pouvoir installer Session Helper ASP .NET pour la persistance de l'état de session dans Sélections Web, vous devez installer le service de rôle ASP.NET pour le rôle Serveur Web (IIS) dans le Gestionnaire de serveur. Pour poursuivre l'installation des Services Multimédia sans Session Helper pour ASP.NET, cliquez sur Précédent et supprimez Session Helper de la liste des fonctionnalités à installer. Dans le cas contraire, cliquez sur Annuler, installez le service de rôle ASP.NET dans le Gestionnaire de serveur et réexécutez le programme d'installation d'IIS Services Multimédia.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Les sélections Web ne peuvent pas utiliser le fournisseur de persistance de session ASP.NET sauf si le service de rôle ASP.NET pour le Serveur Web (IIS) est installé. Si vous voulez utiliser la persistance de session ASP.NET avec Sélections Web, installez le service de rôle ASP.NET pour le Serveur Web (IIS) dans le Gestionnaire de serveur.
-
-Si vous ne voulez pas installer la fonctionnalité Session Helper maintenant, vous pouvez cliquer sur Précédent et désélectionner cette fonctionnalité.
-
-Si vous installez le service de rôle ASP.NET, vous pouvez modifier les fonctionnalités installées pour ce produit à partir du menu Programme et fonctionnalités du Panneau de configuration.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">Diffusion en continu lisse IIS - Bêta a été détecté sur cet ordinateur. L'installation de [ProductName] ne peut pas continuer. Pour installer ce produit, utilisez Ajouter ou supprimer des programmes dans le Panneau de configuration afin de supprimer Diffusion en continu lisse IIS - Bêta.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Une version incompatible d'IIS Services Multimédia se trouve sur cet ordinateur. L'installation de [ProductName] ne peut pas continuer. Pour installer ce produit, utilisez Ajouter ou supprimer des programme dans le Panneau de configuration afin de supprimer IIS Services Multimédia.</String>
- <String Id="NewerMediaServicesVersionFound">Une version plus récente de ce produit est déjà installée ou disponible à l'installation sur cet ordinateur. L'installation de [ProductName] ne peut pas continuer. Pour installer la version la plus récente de ce produit, utilisez Ajouter ou supprimer des programme dans le Panneau de configuration pour mettre à jour IIS Services Multimédia.</String>
- <String Id="ISXConversionRequiredWarningTitle">Conversion du fichier de sélections requise</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Les fichiers de sélections créés pour les versions précédentes de Sélections Web ne sont pas pris en charge dans cette version. Pour créer des copies de ces sélections qui sont prises en charge par cette version de Sélections Web, exécutez l'outil de conversion isxTranslate, disponible à l'adresse http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Anciens fichiers IIS Services Multimédia trouvés</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[Une version antérieure d'une ou plusieurs fonctionnalités Services Multimédia est déjà installée sur cet ordinateur. Le programme d'installation d'IIS Services Multimédia doit mettre à jour toutes les fonctionnalités Services Multimédia précédemment installées afin que les fonctionnalités d'IIS Services Multimédia fonctionnent correctement.
-
-Pour mettre à jour les fonctionnalités Services Multimédia précédemment installées, cliquez sur Suivant. Si vous ne souhaitez pas effectuer cette mise à jour, cliquez sur Annuler.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Fichiers IIS Services Multimédia Bêta trouvés</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[Une version bêta d'une ou de plusieurs fonctionnalités IIS Services Multimédia est installée sur cet ordinateur. Le programme d'installation d'IIS Services Multimédia ne peut pas continuer.
-
-Pour installer cette version d'IIS Services Multimédia, vous devez désinstaller la ou les fonctionnalités en version bêta.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Pack Multimédia 1.0</String>
- <String Id="MediaPack10Update">Mise à jour pour IIS Pack Multimédia 1.0</String>
- <String Id="MediaServices20Title">IIS Services Multimédia 2.0</String>
- <String Id="MediaServices20Update">Mise à jour pour IIS Services Multimédia 2.0</String>
- <String Id="MediaServices30Title">IIS Services Multimédia 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Services Multimédia 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Mise à jour pour IIS Services Multimédia 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Fonctionnalités et outils IIS Services Multimédia.</String>
- <String Id="MediaServicesBurbankDescription">Fonctionnalités et outils IIS Media Services 5.</String>
- <String Id="MediaServices40Beta1Title">IIS Services Multimédia 4.0 Bêta 1</String>
- <String Id="MediaServices40Title">IIS Services Multimédia 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Services Multimédia 4.5 Bêta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Sélections Web</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Contrôle la lecture sur le client des fichiers multimédias référencés dans les sélections.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Session Helper</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Active la persistance d'état de session ASP.NET. (Requiert le service de rôle ASP.NET pour le serveur Web (IIS)).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Interface utilisateur</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Configure la fonctionnalité Sélections Web dans le Gestionnaire des services Internet.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Bit Rate Throttling</String>
- <String Id="MediaServicesFeatureBitrateDescription">Économise la bande passante en limitant la remise de fichiers téléchargés par les clients.</String>
- <String Id="MediaServicesFeatureBitrateUI">Interface utilisateur</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Configure la fonctionnalité Bit Rate Throttling dans le Gestionnaire des services Internet.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Éléments</String>
- <String Id="MediaServicesFeatureSmoothDescription">Active la diffusion adaptive en continu HTTP d’éléments à la demande sur les clients.</String>
- <String Id="MediaServicesFeatureSmoothUI">Interface utilisateur</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Configure la fonctionnalité de diffusion en continu lisse dans le Gestionnaire des services Internet.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Canaux</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Active la diffusion adaptive en continu HTTP de canaux sur les clients.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Interface utilisateur</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Configure la fonctionnalité Live Smooth Streaming dans le Gestionnaire des services Internet.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Gestion des droits numériques (DRM)</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Fournit le chiffrement et la licence des médias de diffusion en continu lisse.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Interface utilisateur</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Configure la fonctionnalité Gestion des droits numériques (DRM) dans le Gestionnaire des services Internet.</String>
-
- <String Id="VistaSP1Required">[ProductName] requiert Microsoft Windows Vista Service Pack 1 ou version ultérieure.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName] ne peut pas être installé sur Vista Édition Familiale Basique.</String>
- <String Id="Windows7SP1Required">[ProductName] requiert Microsoft Windows 7 Service Pack 1 ou version ultérieure.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">Gestionnaire de bases de données IIS</String>
- <String Id="DBManagerBasicFeatureName">Gestionnaire de bases de données IIS</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Service de gestion Web Microsoft 2</String>
- <String Id="WMSvcBasicFeatureName">Service de gestion Web Microsoft</String>
- <String Id="WMSvcBasicFeatureDescription">Installe les fonctionnalités de base de [ProductName].</String>
- <String Id="WMSvcServiceName">Service de gestion Web Microsoft 2</String>
- <String Id="WMSvcServiceDescription">Le service de gestion Web offre des fonctionnalités de gestion déléguée et à distance permettant aux administrateurs de gérer le serveur Web, les sites et les applications présents sur cet ordinateur.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Module de réécriture d'URL 1.1 Microsoft pour IIS 7</String>
- <String Id="RewriteServicingPatchV1">Mise à jour pour le Module de réécriture d'URL 1.1 pour IIS 7</String>
- <String Id="RewriteModuleTitleV1">Réécriture d'URL</String>
- <String Id="RewriteModuleDescriptionV1">Active des fonctionnalités de réécriture d'URL et de contenu pour IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Interface utilisateur</String>
- <String Id="RewriteModuleUIDescriptionV1">Configure la fonctionnalité Module de réécriture d'URL dans le Gestionnaire des services Internet.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">Module de réécriture d'URL 2 d'IIS</String>
- <String Id="RewriteServicingPatch">Mise à jour pour le Module de réécriture d'URL 2 d'IIS</String>
- <String Id="RewriteModuleTitle">Réécriture d'URL</String>
- <String Id="RewriteModuleDescription">Active des fonctionnalités de réécriture d'URL et de contenu pour IIS 7.</String>
- <String Id="RewriteModuleUITitle">Interface utilisateur</String>
- <String Id="RewriteModuleUIDescription">Configure la fonctionnalité Module de réécriture d'URL dans le Gestionnaire des services Internet.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Pack d'administration IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Installe les fonctionnalités de base de [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Pack d'administration IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">Cette version du système d'exploitation n'est pas prise en charge. [ProductName] ne peut être installé que sur Windows Server 2008 ou Windows Vista Service Pack 1 et versions ultérieures.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Fonctionnalités ASP.Net</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET comprend les fonctionnalités d'autorisation et de pages d'erreurs, qui vous permettent de gérer les paramètres d'autorisations et d'erreurs personnalisées.</String>
- <String Id="Authentication" Overridable="yes">Authentification</String>
- <String Id="AuthenticationDescription" Overridable="yes">Description de l'authentification ASP.Net.</String>
- <String Id="Authorization" Overridable="yes">Autorisation</String>
- <String Id="AuthorizationDescription" Overridable="yes">L'autorisation ASP.NET vous permet de configurer des règles pour autoriser les utilisateurs à accéder à vos applications et sites Web.</String>
- <String Id="ErrorPages" Overridable="yes">Pages d'erreurs</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Les pages d'erreurs ASP.NET vous permettent de configurer les réponses d'erreurs HTTP à retourner lorsque des erreurs se produisent.</String>
- <String Id="Modules" Overridable="yes">Modules</String>
- <String Id="ModulesDescription" Overridable="yes">Description des modules ASP.Net.</String>
- <String Id="Handlers" Overridable="yes">Gestionnaires</String>
- <String Id="HandlersDescription" Overridable="yes">Description des gestionnaires ASP.Net.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Éditeur de configuration</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">L'éditeur de configuration vous permet de gérer vos fichiers de configuration dans le Gestionnaire des services Internet en vous permettant de modifier des sections, des attributs, des éléments et des collections dans vos fichiers de configuration.</String>
- <String Id="RequestFiltering" Overridable="yes">Filtrage des demandes</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Le filtrage des demandes vous permet de configurer les règles de filtrage pour votre site Web et de limiter le comportement du protocole et du contenu.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI vous permet de configurer les paramètres du pool de processus pour les applications FastCGI sur votre serveur Web.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Programme d'installation de Restrictions dynamiques d'adresse IP pour IIS 7 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[Cet Assistant Installation a détecté que les restrictions d'adresse IP et de domaine intégrées IIS sont déjà installées. L'Assistant Installation va désinstaller les restrictions d'adresse IP et de domaine existantes afin d'installer Restrictions dynamiques d'adresse IP. La configuration de sécurité IP existante sera conservée.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Cette opération peut prendre quelques minutes.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Voulez-vous continuer ?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Restrictions dynamiques d'adresse IP pour IIS 7 - Bêta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Restrictions dynamiques d'adresse IP pour IIS 7 - Bêta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Restrictions dynamiques d'adresse IP pour IIS 7 - Bêta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Restrictions dynamiques d'adresse IP pour IIS 7 - version finale (RC) </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Restrictions dynamiques d'adresse IP pour IIS 7 - version finale (RC) 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Restrictions dynamiques d'adresse IP pour IIS 7 - version finale (RC) 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Restrictions dynamiques d'adresse IP pour IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Restrictions dynamiques d'adresse IP pour IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Interface utilisateur de Restrictions dynamiques d'adresse IP pour IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Restrictions d'adressage IP dynamique pour IIS 7 - Une version bêta a été détectée sur cet ordinateur. Désinstallez-la, puis réessayez</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 pour IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Les fonctionnalités IIS 7.0 CoreWebEngine et W3SVC doivent être installées pour utiliser ce produit.</String>
- <String Id="WebDAVFeatureTitleModule">Module serveur WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Interface utilisateur de l'administration WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">Kit de ressources d'optimisation du référencement d'un site auprès d'un moteur de recherche IIS 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">Kit de ressources d'optimisation du référencement d'un site auprès d'un moteur de recherche IIS 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Kit de ressources d'optimisation du référencement d'un site auprès d'un moteur de recherche (SEO) 1.0</String>
- <String Id="SiteAnalyzerProductComments">La base de données de ce programme d'installation contient la logique et les données requises pour installer le Kit de ressources d'optimisation du référencement d'un site auprès d'un moteur de recherche IIS 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Éditeur IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Rapports IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">Log Parser n'est pas installé sur cet ordinateur. Installez Log Parser 2.2 à partir de http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07, puis installez les rapports IIS</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Les packages de composants requis sont introuvables. Exécutez setup.exe pour résoudre les dépendances et installer ce programme.</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 Management Objects doit être installé avant l'installation du Gestionnaire de bases de données IIS. Vous pouvez installer Microsoft SQL Server 2008 Management Objects à partir de http://go.microsoft.com/fwlink/?LinkID=150946 .</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server System CLR Types doit être installé avant l'installation du Gestionnaire de bases de données IIS. Vous pouvez installer Microsoft SQL Server System CLR Types à partir de http://go.microsoft.com/fwlink/?LinkID=150949.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework est un composant requis pour l'installation d'Application Request Routing. Installez Web Farm Framework.</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">Exécution</String>
- <String Id="ArrModuleDescription">Ajoute les fonctionnalités d'Application Request Routing à IIS.</String>
- <String Id="ArrUITitle">Interface utilisateur</String>
- <String Id="ArrUIDescription">Configure la fonctionnalité Application Request Routing dans le Gestionnaire des services Internet.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Composant logiciel enfichable Microsoft Windows PowerShell pour IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft Web Platform Installer 4.0
-</String>
- <String Id="WebPIFeatureName">Microsoft Web Platform Installer</String>
- <String Id="XPSP2Required">[ProductName] requiert Windows XP SP2, Windows 2003 SP1, Windows Vista ou versions ultérieures.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] requiert Windows XP Service Pack 3, Windows Server 2003 Service Pack 2 ou versions ultérieures.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Programme d'installation des services Microsoft Windows Azure</String>
- <String Id="WASIFeatureName">Programme d'installation des services Microsoft Windows Azure</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Gestionnaire des services Internet (IIS) 7+</String>
- <String Id="RemoteMgrClientFeatureName">Client du Gestionnaire des services Internet</String>
- <String Id="RemoteMgrRemotingFeatureName">Support à distance</String>
- <String Id="RemoteMgrNotSupported">Ce produit requiert Windows XP SP2, Windows 2003 SP1, Windows Vista SP1, Windows 7 ou une version supérieure</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">La console de gestion IIS n'est pas installée, mais est requise pour gérer les serveurs IIS distants. Installez la console de gestion IIS avant d'installer le support de gestion à distance en ouvrant 'Panneau de configuration-&gt;Programmes-&gt;Activer ou désactiver des fonctionnalités Windows' et en sélectionnant la console de gestion IIS dans la fonctionnalité Services Internet.</String>
- <String Id="RemoteMgrNotRequired">Ce produit n'est pas requis dans Windows Server 2008 ou Windows Server 2008 R2 ou une version ultérieure. Installez la console de gestion IIS en ouvrant le Gestionnaire de serveur et en sélectionnant la console de gestion IIS dans les services de rôle pour le rôle Serveur Web.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">Gestionnaire de publication pour IIS 7.0</String>
- <String Id="PublishingFeatureName">Interface utilisateur de publication</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 pour IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">Un produit incompatible, [CONFLICTING_PRODUCT_NAME], se trouve sur cet ordinateur. Impossible de poursuivre l'installation de [ProductName]. Pour installer ce produit, utilisez Ajouter/Supprimer les programmes dans le Panneau de configuration pour supprimer [CONFLICTING_PRODUCT_NAME].</String>
- <String Id="AdminRequired" Overridable="yes">Des privilèges administrateur sont requis pour installer [ProductName].</String>
- <String Id="IIS7Only" Overridable="yes">IIS version 7.0 est requis pour utiliser [ProductName].</String>
- <String Id="IIS7OrGreater" Overridable="yes">IIS version 7.0 ou supérieure est requis pour installer [ProductName].</String>
- <String Id="IIS75OrGreater" Overridable="yes">IIS version 7.5 ou supérieure est requis pour installer [ProductName].</String>
- <String Id="IIS7Or75Only" Overridable="yes">IIS version 7 ou 7.5 est requis pour installer [ProductName].</String>
- <String Id="BetaVersionFound" Overridable="yes">La version bêta de [ProductName] est installée sur cet ordinateur.</String>
- <String Id="NewerVersionFound" Overridable="yes">Une version plus récente de [ProductName] est installée sur cet ordinateur.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Le programme d'installation ne peut pas continuer car une autre instance de [ProductName] est déjà installée sur cet ordinateur. Désinstallez-la, puis relancez l'installation.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Les fonctionnalités IIS 7.0 CoreWebEngine et W3SVC doivent être installées pour utiliser [ProductName].</String>
- <String Id="IISManagementConsole" Overridable="yes">Les fonctionnalités de la console de gestion IIS doivent être installées pour utiliser [ProductName].</String>
- <String Id="WebServicesRunning" Overridable="yes">Arrêtez les services d'activation des processus Windows (WAS) et de gestion Web (WMSvc) avant d'installer [ProductName]. Vous devrez redémarrer les services après avoir installé [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">La métabase IIS est requise pour installer [ProductName].</String>
- <String Id="LaunchCondition_32BIT">La version 64 bits de [ProductName] ne peut pas être installée sur une édition 32 bits de Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">La version 32 bits de [ProductName] ne peut pas être installée sur une édition 64 bits de Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">Microsoft .NET Framework version 2.0 ou supérieure est requise pour installer [ProductName].</String>
- <String Id="NetFX35OrGreaterRequired">Microsoft .NET Framework version 3.5 ou supérieure est requis pour installer [ProductName]. Utilisez l'option d'ajout de fonctionnalités du Gestionnaire de serveur pour installer Microsoft .NET Framework version 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">Microsoft .NET Framework version 4.0 ou supérieure est requis pour installer [ProductName].</String>
- <String Id="NetFX20SP1IsRequired">Installez Microsoft .NET Framework version 2.0 Service Pack 1 (ou SP supérieur), avant d'installer [ProductName].</String>
- <String Id="WindowsUpdateEnabled">Le service Windows Update (wuauserv) ne peut pas être désactivé, il est requis pour installer [ProductName].</String>
- <String Id="GetFromOSforWin7">Le composant logiciel enfichable PowerShell fait partie du système d'exploitation Windows. Installez-le via 'Programmes et fonctionnalités' ou 'Gestionnaire de serveur'.</String>
- <String Id="WebPI3OrGreaterRequired">Microsoft Web Platform Installer version 3.0 ou supérieure est requis pour installer [ProductName].</String>
-
- <String Id="Error30001" Overridable="yes">Le programme d'installation n'a pas réussi à détecter la configuration partagée.</String>
- <String Id="Error30002" Overridable="yes">La configuration partagée est activée pour IIS. L'installation de [ProductName] n'est pas prise en charge lors de l'utilisation d'une configuration partagée. Désactivez la configuration partagée avant d'installer cette fonctionnalité.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Arrêtez le service de publication World Wide Web (W3SVC) avant d'installer [ProductName]. Vous devrez le redémarrer après l'installation. </String>
- <String Id="IISPowershellConsole">Console de gestion PowerShell IIS</String>
- <String Id="IISPowershellSnapin">Composant logiciel enfichable PowerShell IIS</String>
- <String Id="PowerShellRequired">Le composant logiciel enfichable PowerShell IIS requiert PowerShell v1.0 ou v2.0</String>
- <String Id="WasAndConfigRequired">Le composant logiciel enfichable PowerShell IIS requiert WAS et une configuration</String>
- <String Id="TestBogusString" Overridable="yes">Chaîne d'exemple.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework Version 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent Version 2.2</String>
- <String Id="WebFarmBasicFeatureName">Service de batterie de serveurs Web</String>
- <String Id="WebFarmBasicFeatureDescription">Service de batterie de serveurs Web</String>
- <String Id="WebFarmControllerServiceName">Service du contrôleur de batterie de serveurs Web</String>
- <String Id="WebFarmControllerServiceDescription">Service du contrôleur de batterie de serveurs Web</String>
- <String Id="WebFarmAgentServiceName">Service de l'agent de batterie de serveurs Web</String>
- <String Id="WebFarmAgentServiceDescription">Service de l'agent de batterie de serveurs Web</String>
- <String Id="WebPIRequired">Web Platform Installer est un composant requis pour l'installation de Web Farm Framework 2.0. Installez Web Platform Installer à partir de http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">L'Outil de déploiement Web est un composant requis pour l'installation de Web Farm Framework. Installez l'Outil de déploiement Web à partir de http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Rôles et fonctionnalités de l'hébergement Web.</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework fournit les commandes des API et de PowerShell pour la gestion de l'hébergement Web.</String>
- <String Id="WebHostingWebRoleFeatureName">Rôle Web</String>
- <String Id="WebHostingWebRoleFeatureDescription">Le rôle Web installe le service dynamique WAS et le fournisseur de réécriture d'URL pour l'hébergement Web.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express </String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Déploie une configuration du Panneau de configuration optimisée pour l'installation sur un seul ordinateur.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Rôle de l'équilibrage de charge</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Le rôle de l'équilibrage de charge configure le routeur des requêtes d'applications pour diriger les règles d'hébergement Web.</String>
- <String Id="WebHostingControllerFeatureName">Contrôleur d'hébergement</String>
- <String Id="WebHostingControllerFeatureDescription">Le contrôleur d'hébergement étend Web Farm Framework 2.0 pour être utilisé avec l'hébergement Web.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Rôle de publication</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Installe le support pour le déploiement Web et la publication FTP.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Il s'agit d'un composant logiciel enfichable PowerShell qui contient des applets de commande pour gérer l'infrastructure Microsoft Web Hosting.</String>
- <String Id="DWASServiceName">Service WAS dynamique</String>
- <String Id="DWASServiceDescription">Service d'activation de processus Windows optimisé pour l'hébergement Web grande densité.</String>
- <String Id="MeteringFeatureName">Service Contrôle des ressources</String>
- <String Id="MeteringFeatureDescription">Installe le service Contrôle des ressources qui permet de collecter et de publier des informations d'exécution et d'intégration.</String>
- <String Id="MeteringServiceName">Contrôle des ressources</String>
- <String Id="MeteringServiceDescription">Active la collecte et la publication des informations sur l'exécution et l'intégration à partir du rôle Web.</String>
- <String Id="QuotaEnforcementServiceName">Hébergement de l'application des quotas</String>
- <String Id="QuotaEnforcementServiceDescription">Surveille l'utilisation des ressources des sites Web et exécute des actions personnalisées lorsque le quota d'utilisation est dépassé.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ITA/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ITA/misc/setupstrings.wxl
deleted file mode 100644
index 238a9292f9..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/ITA/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="it-it" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1040</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Opzioni di installazione configurazione condivisa</String>
- <String Id="SharedConfigDlgDescription">Selezionare un'opzione per l'installazione nella configurazione condivisa di IIS</String>
- <String Id="SharedConfigDlgCheckBox">Aggiorna configurazione condivisa al momento dell'installazione</String>
- <String Id="SharedConfigDlgText">Questo modulo verrà installato su un server IIS che utilizza una configurazione condivisa. Se altri server IIS utilizzano la medesima configurazione condivisa, sarà necessario installare il modulo in ciascuno di essi. Per ridurre al minimo l'interruzione dei servizi dei singoli server Web, sarà necessario installare il modulo attenendosi alla procedura seguente: in tutti i computer tranne l'ultimo installare il modulo senza aggiornare la configurazione condivisa. A tale scopo, non selezionare la casella di controllo sotto.
-In questo modo, verranno installati tutti i dati binari e i file necessari per il modulo in ogni computer senza apportare modifiche alla configurazione condivisa. A questo punto, nell'ultimo computer sarà necessario verificare che l'identità dell'utente in uso disponga di accesso in lettura e scrittura al file applicationhost.config nella condivisione UNC. Installare quindi il modulo e selezionare l'opzione di configurazione aggiornata sotto. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Inizializzazione dell'azione personalizzata WebConfig</String>
- <String Id="ProgressText_WebConfigUpdate">Aggiornamento di web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">Registrazione avanzata IIS</String>
- <String Id="AdvancedLoggingDescription">Consente la registrazione avanzata dei della pipeline IIS.</String>
- <String Id="AdvancedLoggingUI">Registrazione avanzata IIS</String>
- <String Id="AdvancedLoggingUIDescription">Consente la creazione di file di registro personalizzati con selezione campi estendibile.</String>
- <String Id="AdvancedLoggingUpdate01">Aggiornamento per IIS Advanced Logging</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Abilita IIS Media Services di Transform Manager.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">Abilita la creazione di trasformazioni multimediali.</String>
- <String Id="TransformManagerServiceHostName">Host di IIS Transform Manager</String>
- <String Id="TransformManagerServiceHostDescription">Host del servizio per [ProductName].</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">Esegue la conversione batch dei file multimediali su richiesta per alternare formati di file e contenitori.</String>
- <String Id="TransformManagerEESPTaskInstalled">Nel computer è installato un pacchetto IIS Transform Manager 1.0 Expression Encoder SP Task. È necessario disinstallarlo prima di eseguire l'installazione di [ProductName].</String>
-
- <String Id="NetFx35Required">Per installare [ProductName] è necessario Microsoft .NET Framework 3.5. Utilizzare 'Aggiunta guidata funzionalità' in Server Manager per installare Funzionalità di .NET Framework 3.5.1 oppure utilizzare 'Attiva o disattiva le funzionalità Windows' per attivare Microsoft .NET Framework 3.5.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS Digital Rights Management</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Abilita Digital Rights Management di presentazioni Smooth Streaming.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET non installato</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Prima di installare Session Helper per la persistenza dello stato della sessione ASP.NET in Web Playlists, è necessario installare il servizio ruolo ASP.NET per il ruolo Server Web (IIS) in Gestione server. Per continuare l'installazione di Media Services senza Session Helper for ASP.NET, fare clic su Indietro e rimuovere Session Helper dall'elenco di funzionalità da installare. In caso contrario, fare clic su Annulla, installare il servizio ruolo ASP.NET in Gestione server, quindi eseguire di nuovo l'installazione di IIS Media Services.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[In Web Playlists è possibile utilizzare il provider di persistenza della sessione ASP.NET solo se è installato il servizio ruolo ASP.NET per Server Web (IIS). Se si desidera utilizzare la persistenza della sessione ASP.NET con Web Playlists, installare il servizio ruolo ASP.NET per Server Web (IIS) in Gestione server.
-
-Se non si desidera installare ora la funzionalità Session Helper, è possibile fare clic su Indietro e deselezionare la funzionalità.
-
-Se si installa il servizio ruolo ASP.NET, è possibile modificare le funzionalità installate del prodotto dal menu Programmi e funzionalità del Pannello di controllo.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">IIS Smooth Streaming - Beta rilevato in questo computer. Impossibile continuare l'installazione di [ProductName]. Per installare il prodotto, utilizzare Installazione applicazioni nel Pannello di controllo per rimuovere IIS Smooth Streaming - Beta.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Una versione non compatibile di IIS Media Services è stata rilevata in questo computer. Impossibile continuare l'installazione di [ProductName]. Per installare il prodotto, utilizzare Installazione applicazioni nel Pannello di controllo per rimuovere IIS Media Services.</String>
- <String Id="NewerMediaServicesVersionFound">Nel computer in uso è già installata o disponibile per l'installazione una versione più recente del prodotto. Impossibile continuare l'installazione di [ProductName]. Per installare la versione più recente del prodotto, utilizzare Installazione applicazioni nel Pannello di controllo per aggiornare IIS Media Services.</String>
- <String Id="ISXConversionRequiredWarningTitle">Conversione file elenco di riproduzione obbligatoria</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[I file elenco di riproduzione delle versioni precedenti di Web Playlists non sono supportati in questa versione. Per creare copie degli elenchi di riproduzione supportati in questa versione di Web Playlists, eseguire lo strumento di conversione isxTranslate, disponibile all'indirizzo http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Rilevati file di una versione precedente di IIS Media Services</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[Nel computer in uso è installata una versione precedente di una o più funzionalità di Media Services. Aggiornare tutte le funzionalità di Media Services precedentemente installate per garantire il corretto funzionamento delle funzionalità in IIS Media Services.
-
-Per aggiornare le funzionalità di Media Services precedentemente installate alle versioni correnti, fare clic su Avanti. Se non si desidera aggiornare le versioni delle funzionalità precedentemente installate, fare clic su Annulla.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Rilevati file di una versione beta di IIS Media Services</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[Nel computer in uso è installata la versione beta di una o più funzionalità di IIS Media Services. Impossibile continuare l'installazione di IIS Media Services.
-
-Per installare questa versione di IIS Media Services, è necessario disinstallare le funzionalità beta.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Aggiornamento per IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">Aggiornamento per IIS Media Services 2.0</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Aggiornamento per IIS Media Services 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Funzionalità e strumenti di IIS Media Services.</String>
- <String Id="MediaServicesBurbankDescription">Funzionalità e strumenti di IIS Media Services 5 Premium.</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Web Playlists</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Controlla la riproduzione del client di asset di file multimediali a cui si fa riferimento negli elenchi di riproduzione.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Session Helper</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Consente la persistenza dello stato della sessione ASP.NET. Richiede il servizio ruolo ASP.NET per Server Web (IIS).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Interfaccia utente</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Configura la funzionalità Web Playlists in Gestione IIS.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Bit Rate Throttling</String>
- <String Id="MediaServicesFeatureBitrateDescription">Riduce la larghezza di banda necessaria limitando il recapito dei file scaricati dai client.</String>
- <String Id="MediaServicesFeatureBitrateUI">Interfaccia utente</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Configura la funzionalità Bit Rate Throttling in Gestione IIS.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Asset</String>
- <String Id="MediaServicesFeatureSmoothDescription">Consente il flusso adattivo HTTP degli asset su richiesta nei client.</String>
- <String Id="MediaServicesFeatureSmoothUI">Interfaccia utente</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Configura la funzionalità Smooth Streaming in Gestione IIS.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Canali</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Consente il flusso adattivo HTTP delle trasmissioni di canale ai client.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Interfaccia utente</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Configura la funzionalità Live Smooth Streaming in Gestione IIS.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Digital Rights Management</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Fornisce crittografia e licenze dei file multimediali Smooth Streaming.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Interfaccia utente</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Configura la funzionalità Digital Rights Management in Gestione IIS.</String>
-
- <String Id="VistaSP1Required">[ProductName] richiede Microsoft Windows Vista Service Pack 1 o versione successiva.</String>
- <String Id="VistaHomeBasicNotSupported">Impossibile installare [ProductName] in Vista Home Basic.</String>
- <String Id="Windows7SP1Required">[ProductName] richiede Microsoft Windows 7 Service Pack 1 o versione successiva.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS Database Manager</String>
- <String Id="DBManagerBasicFeatureName">IIS Database Manager</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Servizio Gestione Web Microsoft 2</String>
- <String Id="WMSvcBasicFeatureName">Servizio Gestione Web Microsoft</String>
- <String Id="WMSvcBasicFeatureDescription">Installa le funzionalità di base di [ProductName].</String>
- <String Id="WMSvcServiceName">Servizio Gestione Web Microsoft 2</String>
- <String Id="WMSvcServiceDescription">Il servizio Gestione Web offre agli amministratori funzionalità di gestione remota e delegata per il server Web, i siti e le applicazioni presenti nel computer.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Microsoft URL Rewrite Module 1.1 per IIS 7</String>
- <String Id="RewriteServicingPatchV1">Aggiornamento per URL Rewrite Module 1.1 per IIS 7</String>
- <String Id="RewriteModuleTitleV1">URL Rewrite</String>
- <String Id="RewriteModuleDescriptionV1">Abilita le funzionalità di riscrittura del contenuto e degli URL in IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Interfaccia utente</String>
- <String Id="RewriteModuleUIDescriptionV1">Configura la funzionalità URL Rewrite Module in Gestione IIS.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL Rewrite Module 2</String>
- <String Id="RewriteServicingPatch">Aggiornamento per IIS URL Rewrite Module 2</String>
- <String Id="RewriteModuleTitle">URL Rewrite</String>
- <String Id="RewriteModuleDescription">Abilita le funzionalità di riscrittura del contenuto e degli URL in IIS 7.</String>
- <String Id="RewriteModuleUITitle">Interfaccia utente</String>
- <String Id="RewriteModuleUIDescription">Configura la funzionalità URL Rewrite Module in Gestione IIS.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack per IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Installa le funzionalità di base di [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack per IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">Questa versione del sistema operativo non è supportata. [ProductName] può essere installato solo con Windows Server 2008 o Windows Vista Service Pack 1 e versioni successive.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Funzionalità ASP.Net</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET include le funzionalità Pagine errori e autorizzazione, che consentono di gestire le impostazioni di errori personalizzati e di autorizzazione.</String>
- <String Id="Authentication" Overridable="yes">Autenticazione</String>
- <String Id="AuthenticationDescription" Overridable="yes">Descrizione dell'autenticazione ASP.Net.</String>
- <String Id="Authorization" Overridable="yes">Autorizzazione</String>
- <String Id="AuthorizationDescription" Overridable="yes">L'autorizzazione ASP.NET consente di configurare le regole per autorizzare gli utenti ad accedere a siti Web e applicazioni.</String>
- <String Id="ErrorPages" Overridable="yes">Pagine errori</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Le pagine errori ASP.NET consentono di configurare le risposte di errore HTTP da restituire in caso di errori.</String>
- <String Id="Modules" Overridable="yes">Moduli</String>
- <String Id="ModulesDescription" Overridable="yes">Descrizione dei moduli ASP.Net.</String>
- <String Id="Handlers" Overridable="yes">Gestori</String>
- <String Id="HandlersDescription" Overridable="yes">Descrizione dei gestori ASP.Net.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Editor di configurazione</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Editor di configurazione consente di gestire i file di configurazione in Gestione IIS offrendo la possibilità di modificare sezioni, attributi, elementi e raccolte all'interno dei file di configurazione.</String>
- <String Id="RequestFiltering" Overridable="yes">Filtro richieste</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Filtro richieste consente di configurare le regole di filtro per il sito Web e di limitare il comportamento di protocollo e contenuto.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI consente di configurare le impostazioni del pool di processi per le applicazioni FastCGI del server Web.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Restrizioni IP dinamico per l'installazione di IIS 7 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[L'installazione guidata ha rilevato che le restrizioni di IP e dominio incorporate in IIS sono già installate. Per installare le restrizioni di IP dinamico verranno disinstallate le restrizioni di IP e dominio esistenti. Verrà tuttavia conservata la configurazione della protezione IP esistente.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[L'operazione potrebbe richiedere alcuni minuti.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Continuare?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Restrizioni IP dinamico per IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Restrizioni IP dinamico per IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Restrizioni IP dinamico per IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Restrizioni IP dinamico per IIS 7 - Versione finale candidata </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Restrizioni IP dinamico per IIS 7 - Versione finale candidata 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Restrizioni IP dinamico per IIS 7 - Versione finale candidata 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Restrizioni IP dinamico per IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Restrizioni IP dinamico per IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Interfaccia utente di Restrizioni IP dinamico per IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Restrizioni IP dinamico per IIS 7 - Beta rilevato nel computer. Disinstallarlo, quindi riprovare</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 per IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Per utilizzare questo prodotto, è necessario installare le funzionalità CoreWebEngine e W3SVC di IIS 7.0.</String>
- <String Id="WebDAVFeatureTitleModule">Modulo server WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Interfaccia utente di amministrazione WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS Search Engine Optimization Toolkit 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Search Engine Optimization (SEO) Toolkit 1.0</String>
- <String Id="SiteAnalyzerProductComments">Il database del programma di installazione contiene la logica e i dati necessari per l'installazione di IIS Search Engine Optimization Toolkit 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Editor IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Report IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">Log Parser non installato nel computer in uso. Installare Log Parser 2.2 dal sito Web http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07, quindi continuare con l'installazione di Report IIS.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Pacchetti dei prerequisiti non trovati. Eseguire setup.exe per risolvere le dipendenze e installare il programma.</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 Management Objects è un prerequisito per l'installazione di IIS Database Manager. È possibile installare Microsoft SQL Server 2008 Management Objects dal sito http://go.microsoft.com/fwlink/?LinkID=150946.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server System CLR Types è un prerequisito per l'installazione di IIS Database Manager. È possibile installare Microsoft SQL Server System CLR Types dal sito http://go.microsoft.com/fwlink/?LinkID=150949.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Farm Framework è un requisito per l'installazione di Application Request Routing. Installare Web Farm Framework.</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">Runtime</String>
- <String Id="ArrModuleDescription">Aggiunge le funzionalità di Application Request Routing a IIS.</String>
- <String Id="ArrUITitle">Interfaccia utente</String>
- <String Id="ArrUIDescription">Configura la funzionalità Application Request Routing in Gestione IIS.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Snap-in di Microsoft Windows PowerShell per IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Installazione guidata piattaforma Web Microsoft 4.0</String>
- <String Id="WebPIFeatureName">Installazione guidata piattaforma Web Microsoft</String>
- <String Id="XPSP2Required">[ProductName] richiede Windows XP SP2, Windows 2003 SP1, Windows Vista o versione successiva.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] richiede Windows XP Service Pack 3, Windows Server 2003 Service Pack 2 o versione successiva.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Programma di installazione servizi Microsoft Windows Azure</String>
- <String Id="WASIFeatureName">Programma di installazione servizi Microsoft Windows Azure</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Gestione Internet Information Services (IIS) 7+</String>
- <String Id="RemoteMgrClientFeatureName">Client Gestione IIS</String>
- <String Id="RemoteMgrRemotingFeatureName">Remoting Support</String>
- <String Id="RemoteMgrNotSupported">Per questo prodotto è necessario Windows XP SP2, Windows 2003 SP1, Windows Vista SP1, Windows 7 o versione successiva</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">La Console di gestione IIS necessaria per la gestione dei server IIS remoti non è installata. Installare la Console di gestione IIS prima di installare il supporto di gestione remoto. A tale scopo, aprire "Pannello di controllo-&gt;Programmi-&gt;Attiva o disattiva le funzionalità Windows" e selezionare Console di gestione IIS nella funzionalità Internet Information Services.</String>
- <String Id="RemoteMgrNotRequired">Questo prodotto non è necessario in Windows Server 2008 o in Windows Server 2008 R2 o versione successiva. Per installare la Console di gestione IIS, aprire Gestione server e selezionare la Console di gestione IIS nei Servizi ruolo per il ruolo Server Web.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS Manager Publishing per IIS 7.0</String>
- <String Id="PublishingFeatureName">Interfaccia utente di pubblicazione</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 per IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">Nel computer è installato un prodotto incompatibile, [CONFLICTING_PRODUCT_NAME]. Non è possibile continuare l'installazione di [ProductName]. Per installare il prodotto, utilizzare Installazione applicazioni nel Pannello di controllo e rimuovere [CONFLICTING_PRODUCT_NAME].</String>
- <String Id="AdminRequired" Overridable="yes">Per installare [ProductName], sono richiesti i privilegi di amministratore.</String>
- <String Id="IIS7Only" Overridable="yes">Per utilizzare [ProductName], è richiesto IIS versione 7.0.</String>
- <String Id="IIS7OrGreater" Overridable="yes">Per installare [ProductName], è richiesto IIS versione 7.0 o versione successiva.</String>
- <String Id="IIS75OrGreater" Overridable="yes">Per installare [ProductName] è necessario IIS 7.5 o versione successiva.</String>
- <String Id="IIS7Or75Only" Overridable="yes">Per installare [ProductName] è necessario IIS versione 7 o 7.5.</String>
- <String Id="BetaVersionFound" Overridable="yes">Versione beta di [ProductName] rilevata nel computer in uso.</String>
- <String Id="NewerVersionFound" Overridable="yes">Nel computer in uso è stata rilevata una versione più recente di [ProductName].</String>
- <String Id="DuplicateVersionFound" Overridable="yes">L'installazione non può continuare poiché un'altra istanza di [ProductName] è già installata nel computer in uso. Disinstallarla e quindi riavviare l'installazione.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Per utilizzare [ProductName], è necessario installare le funzionalità CoreWebEngine e W3SVC di IIS 7.0.</String>
- <String Id="IISManagementConsole" Overridable="yes">Per utilizzare [ProductName], è necessario installare la Console di gestione IIS.</String>
- <String Id="WebServicesRunning" Overridable="yes">Arrestare Servizio Attivazione processo Windows (WAS) e Servizio di gestione Web (WMSvc) prima di installare [ProductName]. Avviare i servizi dopo l'installazione di [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">Per installare [ProductName], è richiesta la metabase IIS.</String>
- <String Id="LaunchCondition_32BIT">Impossibile installare la versione a 64 bit di [ProductName] in un'edizione a 32 bit di Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">Impossibile installare la versione a 32 bit di [ProductName] in un'edizione a 64 bit di Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">Per installare [ProductName], è richiesto Microsoft .NET Framework versione 2.0 o versione successiva.</String>
- <String Id="NetFX35OrGreaterRequired">Microsoft .NET Framework versione 3.5 o successiva necessario per installare [ProductName]. Utilizzare 'Aggiungi funzionalità' in Server Manager per installare Microsoft .NET versione 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">Microsoft .NET Framework versione 4.0 o successiva necessario per installare [ProductName].</String>
- <String Id="NetFX20SP1IsRequired">Prima di installare [ProductName], installare Microsoft .NET Framework versione 2.0 Service Pack 1 o versione successiva.</String>
- <String Id="WindowsUpdateEnabled">Impossibile disabilitare il servizio Windows Update (wuauserv). È richiesto per installare [ProductName].</String>
- <String Id="GetFromOSforWin7">Lo snap-in di PowerShell fa parte del sistema operativo Windows. Installarlo mediante 'Programmi e funzionalità' o 'Server Manager'.</String>
- <String Id="WebPI3OrGreaterRequired">Installazione guidata piattaforma Web di Microsoft versione 3.0 o successiva necessaria per installare [ProductName].</String>
-
- <String Id="Error30001" Overridable="yes">Impossibile rilevare la configurazione condivisa.</String>
- <String Id="Error30002" Overridable="yes">Configurazione condivisa abilitata per IIS. L'installazione di [ProductName] non è supportata quando si utilizza la configurazione condivisa. Disabilitare la configurazione condivisa prima di installare questa funzionalità.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Arrestare il Servizio Pubblicazione sul Web (W3SVC) prima di installare [ProductName]. Avviare il servizio dopo l'installazione. </String>
- <String Id="IISPowershellConsole">Console di gestione IIS PowerShell</String>
- <String Id="IISPowershellSnapin">Snap-in di IIS PowerShell</String>
- <String Id="PowerShellRequired">Lo snap-in di IIS PowerShell richiede l'installazione di PowerShell v1.0 o v2.0</String>
- <String Id="WasAndConfigRequired">Lo snap-in di IIS PowerShell richiede l'installazione di WAS e della configurazione</String>
- <String Id="TestBogusString" Overridable="yes">Stringa non valida.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework versione 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent versione 2.2</String>
- <String Id="WebFarmBasicFeatureName">Servizio Web Farm</String>
- <String Id="WebFarmBasicFeatureDescription">Servizio Web Farm</String>
- <String Id="WebFarmControllerServiceName">Servizio controller Web Farm</String>
- <String Id="WebFarmControllerServiceDescription">Servizio controller Web Farm</String>
- <String Id="WebFarmAgentServiceName">Servizio agente Web Farm</String>
- <String Id="WebFarmAgentServiceDescription">Servizio agente Web Farm</String>
- <String Id="WebPIRequired">L'Installazione guidata piattaforma Web è un prerequisito per l'installazione di Web Farm Framework. Eseguire l'Installazione guidata piattaforma Web dall'indirizzo http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">Lo Strumento di distribuzione Web è un prerequisito per l'installazione di Web Farm Framework. Installare lo Strumento di distribuzione Web dall'indirizzo http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Ruoli e funzionalità di Web Hosting.</String>
- <String Id="WebHostingFrameworkFeatureName">Framework di hosting</String>
- <String Id="WebHostingFrameworkFeatureDescription">Framework di hosting fornisce le API e i comandi PowerShell per la gestione di Web Hosting.</String>
- <String Id="WebHostingWebRoleFeatureName">Ruolo Web</String>
- <String Id="WebHostingWebRoleFeatureDescription">Ruolo Web esegue l'installazione del Servizio Attivazione processo Windows dinamico e del provider di URL Rewrite per Web Hosting.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Esegue la distribuzione di una configurazione del Pannello di controllo ottimizzata per l'installazione su singolo computer.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Ruolo bilanciamento del carico</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Ruolo bilanciamento del carico configura Application Request Router per il routing in base alle regole di Web Hosting.</String>
- <String Id="WebHostingControllerFeatureName">Controller di hosting</String>
- <String Id="WebHostingControllerFeatureDescription">Controller di hosting estende Web Farm Framework 2.0 per consentirne il funzionamento con Web Hosting.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Ruolo di pubblicazione</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Installa il supporto per la pubblicazione mediante Distribuzione Web e FTP.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Lo snap-in di PowerShell contiene i cmdlet per gestire l'infrastruttura Microsoft Web Hosting.</String>
- <String Id="DWASServiceName">Servizio Attivazione processo Windows dinamico</String>
- <String Id="DWASServiceDescription">Servizio Attivazione processo Windows dinamico ottimizzato per Web Hosting ad alta densità.</String>
- <String Id="MeteringFeatureName">Servizio Misurazione risorse</String>
- <String Id="MeteringFeatureDescription">Installa il servizio Misurazione risorse che abilita la raccolta e la pubblicazione delle informazioni sul runtime e sull'integrità.</String>
- <String Id="MeteringServiceName">Misurazione risorse</String>
- <String Id="MeteringServiceDescription">Abilita la raccolta e la pubblicazione delle informazioni sul runtime e sull'integrità da parte di Ruolo Web.</String>
- <String Id="QuotaEnforcementServiceName">Imposizione quota hosting</String>
- <String Id="QuotaEnforcementServiceDescription">Esegue il monitoraggio dell'utilizzo delle risorse dei siti Web ed esegue azioni personalizzate quando la quota relativa all'utilizzo viene superata.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/JPN/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/JPN/misc/setupstrings.wxl
deleted file mode 100644
index ac70825d59..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/JPN/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="ja-jp" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1041</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">共有構成のインストール オプション</String>
- <String Id="SharedConfigDlgDescription">IIS 共有構成をインストールするためのオプションを選択します</String>
- <String Id="SharedConfigDlgCheckBox">インストール時に共有構成を更新する</String>
- <String Id="SharedConfigDlgText">共有構成を使用する IIS サーバーに、このモジュールをインストールしようとしています。その他の IIS サーバーでこの共有構成を使用している場合は、これらすべてのコンピューターにこのモジュールをインストールする必要があります。個々の Web サーバーの障害を最小限に抑えるには、以下の手順でこのモジュールをインストールします。まず、最後の 1 台を除くすべてのコンピューターに、共有構成を更新せずにモジュールをインストールします。そのためには、下のチェック ボックスをオフにします。
-これにより、共有構成に変更を加えることなく、各コンピューターでモジュールに必要なバイナリとファイルがすべてインストールされます。次に、最後のコンピューターで、実行に使用しているユーザー ID が、UNC 共有にある applicationhost.config ファイルに対する読み取りと書き込みのアクセス権を持っていることを確認します。そのうえで、モジュールをインストールし、下にある [インストール時に共有構成を更新する] チェック ボックスをオンにします。</String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">WebConfig カスタム アクションを初期化しています</String>
- <String Id="ProgressText_WebConfigUpdate">web.config を更新しています</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS 詳細ログ</String>
- <String Id="AdvancedLoggingDescription">IIS パイプライン データの詳細ログを有効にします。</String>
- <String Id="AdvancedLoggingUI">IIS 詳細ログ</String>
- <String Id="AdvancedLoggingUIDescription">拡張可能なフィールド選択機能を備えたカスタム ログ ファイルの作成を有効にします。</String>
- <String Id="AdvancedLoggingUpdate01">IIS 詳細ログの更新</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Transform Manager の IIS Media Services を有効にします。</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">メディア変換の作成を有効にします。</String>
- <String Id="TransformManagerServiceHostName">IIS Transform Manager ホスト</String>
- <String Id="TransformManagerServiceHostDescription">[ProductName] 用のサービス ホスト。</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">オンデマンド メディア ファイルを代替ファイルおよびコンテナー形式にバッチで変換します。</String>
- <String Id="TransformManagerEESPTaskInstalled">IIS Transform Manager 1.0 Expression Encoder SP Task パッケージがコンピューターにインストールされています。[ProductName] をインストールする前にそのパッケージをアンインストールする必要があります。</String>
-
- <String Id="NetFx35Required">[ProductName] をインストールするには、Microsoft .NET Framework 3.5 が必要です。サーバー マネージャーの機能の追加ウィザードを使用して .NET Framework 3.5.1 の各機能をインストールするか、[Windows の機能の有効化または無効化] を使用して Microsoft .NET Framework 3.5 を有効にします。</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS デジタル著作権管理</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Smooth Streaming プレゼンテーションのデジタル著作権管理を有効にします。</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET がインストールされていません</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Web プレイリストに ASP.NET セッション状態保持のためのセッション ヘルパーをインストールするには、サーバー マネージャーに Web サーバー (IIS) 役割の ASP.NET 役割サービスをインストールする必要があります。ASP.NET のセッション ヘルパーをインストールせずに、メディア サービスのインストールを続けるには、[戻る] をクリックし、インストールする機能の一覧からセッション ヘルパーを削除してください。それ以外の場合は、[キャンセル] をクリックして、サーバー マネージャーに ASP.NET 役割サービスをインストールしてから、IIS Media Services のセットアップを再度実行してください。]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Web サーバー (IIS) の ASP.NET 役割サービスがインストールされていないと、Web プレイリストは ASP.NET のセッション保持プロバイダーを使用できません。Web プレイリストで ASP.NET のセッション保持機能を使用する場合は、サーバー マネージャーに Web サーバー (IIS) の ASP.NET 役割サービスをインストールします。
-
-セッション ヘルパー機能を今インストールする必要がない場合は、[戻る] をクリックして、この機能の選択を解除してもかまいません。
-
-ASP.NET 役割サービスをインストールした後で、この製品のインストール済みの機能を変更するには、コントロール パネルの [プログラムと機能] メニューを使用します。]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">このコンピューターで、IIS Smooth Streaming - Beta が見つかりました。[ProductName] のインストールを続行できません。この製品をインストールするには、コントロール パネルの [プログラムの追加と削除] を使用して、IIS Smooth Streaming - Beta をアンインストールしてください。</String>
- <String Id="IncompatibleMediaServicesVersionFound">このコンピューターには、互換性のないバージョンの IIS Media Services が存在します。[ProductName] のインストールを続行できません。この製品をインストールするには、コントロール パネルの [プログラムの追加と削除] を使用して、IIS Media Services をアンインストールしてください。</String>
- <String Id="NewerMediaServicesVersionFound">このコンピューターには、この製品の新しいバージョンが既にインストールされているか、新しいバージョンを入手してインストールすることができます。[ProductName] のインストールを続行できません。この製品のより新しいバージョンをインストールするには、コントロール パネルの [プログラムの追加と削除] を使用して、IIS Media Services を更新してください。</String>
- <String Id="ISXConversionRequiredWarningTitle">プレイリスト ファイルの変換が必要</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[以前のバージョンの Web プレイリスト用に作成されたプレイリスト ファイルは、このバージョンではサポートされません。このバージョンの Web プレイリストで使用できるように、これらのプレイリストのコピーを作成するには、isxTranslate 変換ツールを実行します。このツールは、http://go.microsoft.com/fwlink/?LinkId=127838 からダウンロードできます。]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">古い IIS Media Services ファイルが見つかりました</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[このコンピューターには、以前のバージョンのメディア サービス機能がインストールされています。IIS Media Services の機能の正常動作を確保するため、IIS Media Services のセットアップで、過去にインストールされたメディア サービス機能をすべて更新する必要があります。
-
-過去にインストールされたメディア サービス機能を最新バージョンに更新するには、[次へ] をクリックしてください。これらの機能について、過去にインストールされたバージョンを更新しない場合は、[キャンセル] をクリックします。]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">ベータ版の IIS Media Services ファイルが見つかりました</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[このコンピューターには、ベータ版の IIS Media Services の機能が 1 つ以上インストールされています。IIS Media Services のセットアップを続行できません。
-
-このバージョンの IIS Media Services をインストールするには、ベータ版の機能をアンインストールする必要があります。]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">IIS Media Pack 1.0 の更新</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">IIS Media Services 2.0 の更新</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">IIS Media Services 3.0 の更新</String>
- <String Id="MediaServicesIISMediaDescription">IIS Media Services の機能とツール。</String>
- <String Id="MediaServicesBurbankDescription">IIS Media Services 5 Premium の機能およびツール。</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Web プレイリスト</String>
- <String Id="MediaServicesFeaturePlaylistDescription">プレイリストで参照されたメディア アセットに対するクライアントの再生を制御します。</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">セッション ヘルパー</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">ASP.NET セッション状態保持を有効にします (Web サーバー (IIS) の ASP.NET 役割サービスが必要)。</String>
- <String Id="MediaServicesFeaturePlaylistUI">ユーザー インターフェイス</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">IIS マネージャーで Web プレイリスト機能を構成します。</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">ビット レート調整</String>
- <String Id="MediaServicesFeatureBitrateDescription">クライアントによってダウンロードされるファイルの配信を制限することによって帯域幅を節約します。</String>
- <String Id="MediaServicesFeatureBitrateUI">ユーザー インターフェイス</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">IIS マネージャーでビット レート調整機能を構成します。</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">アセット</String>
- <String Id="MediaServicesFeatureSmoothDescription">クライアントに対し、オンデマンド アセットの HTTP アダプティブ ストリーミングを有効にします。</String>
- <String Id="MediaServicesFeatureSmoothUI">ユーザー インターフェイス</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">IIS マネージャーで Smooth Streaming 機能を構成します。</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">チャネル</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">クライアントに対し、チャネル ブロードキャストの HTTP アダプティブ ストリーミングを有効にします。</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">ユーザー インターフェイス</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">IIS Manager で Live Smooth Streaming 機能を構成します。</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">デジタル著作権管理</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Smooth Streaming メディアの暗号化とライセンスを提供します。</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">ユーザー インターフェイス</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">IIS マネージャーでデジタル著作権管理機能を構成します。</String>
-
- <String Id="VistaSP1Required">[ProductName] には Microsoft Windows Vista Service Pack 1 以降が必要です。</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName] を Vista Home Basic にインストールすることはできません。</String>
- <String Id="Windows7SP1Required">[ProductName] には Microsoft Windows 7 Service Pack 1 以降が必要です。</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS Database Manager</String>
- <String Id="DBManagerBasicFeatureName">IIS Database Manager</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft Web Management Service</String>
- <String Id="WMSvcBasicFeatureDescription">[ProductName] の基本的な機能をインストールします。</String>
- <String Id="WMSvcServiceName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcServiceDescription">Web 管理サービスでは、管理者がこのコンピューターの Web サーバー、サイトおよびアプリケーションを管理する機能をリモートで操作したり、委任したりすることができます。</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Microsoft URL Rewrite Module 1.1 for IIS 7</String>
- <String Id="RewriteServicingPatchV1">URL Rewrite Module 2 for IIS 7 の更新</String>
- <String Id="RewriteModuleTitleV1">URL 書き換え</String>
- <String Id="RewriteModuleDescriptionV1">IIS 7 への URL およびコンテンツの書き換え機能を有効にします。</String>
- <String Id="RewriteModuleUITitleV1">ユーザー インターフェイス</String>
- <String Id="RewriteModuleUIDescriptionV1">URL 書き換えモジュール機能を IIS マネージャーで構成します。</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL Rewrite Module 2</String>
- <String Id="RewriteServicingPatch">IIS URL Rewrite Module 2 の更新プログラム</String>
- <String Id="RewriteModuleTitle">URL 書き換え</String>
- <String Id="RewriteModuleDescription">IIS 7 への URL およびコンテンツの書き換え機能を有効にします。</String>
- <String Id="RewriteModuleUITitle">ユーザー インターフェイス</String>
- <String Id="RewriteModuleUIDescription">URL 書き換えモジュール機能を IIS マネージャーで構成します。</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">[ProductName] の基本的な機能をインストールします。</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack for IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">このバージョンのオペレーティング システムはサポートされません。[ProductName] は、Windows Server 2008 か、または Windows Vista Service Pack 1 以降にのみインストールできます。</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.Net の機能</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET には、承認とエラー ページの機能があり、それを使って承認やカスタム エラーの設定を管理できます。</String>
- <String Id="Authentication" Overridable="yes">認証</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.Net 認証の説明。</String>
- <String Id="Authorization" Overridable="yes">承認</String>
- <String Id="AuthorizationDescription" Overridable="yes">ASP.NET の承認では、Web サイトおよびアプリケーションへのユーザーのアクセスを承認するための規則を構成できます。</String>
- <String Id="ErrorPages" Overridable="yes">エラー ページ</String>
- <String Id="ErrorPagesDescription" Overridable="yes">ASP.NET エラー ページでは、エラー発生時に返す HTTP エラー応答を構成できます。</String>
- <String Id="Modules" Overridable="yes">モジュール</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.Net モジュールの説明。</String>
- <String Id="Handlers" Overridable="yes">ハンドラー</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.Net ハンドラーの説明。</String>
- <String Id="ConfigurationEditor" Overridable="yes">構成エディター</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">構成エディターを使用して、IIS マネージャー内の構成ファイルを管理できます。構成ファイル内のセクション、属性、要素、およびコレクションを編集することができます。</String>
- <String Id="RequestFiltering" Overridable="yes">要求のフィルタリング</String>
- <String Id="RequestFilteringDescription" Overridable="yes">要求のフィルタリングでは、Web サイトのフィルタリング規則を構成したり、プロトコルやコンテンツの動作を制限したりできます。</String>
- <String Id="FastCgi" Overridable="yes">Fast CGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI では、Web サーバー上の FastCGI アプリケーション用のプロセス プール設定を構成できます。</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Dynamic IP Restrictions for IIS 7 セットアップ</String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[IIS の組み込みの "IP およびドメインの制限" が既にインストールされています。動的 IP 制限をインストールするため、既存の "IP およびドメインの制限" はアンインストールされます。既存の IP セキュリティ構成は維持されます。]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[これには数分かかることがあります。]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[続行しますか?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamic IP Restrictions for IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamic IP Restrictions for IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamic IP Restrictions for IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamic IP Restrictions for IIS 7 - リリース候補</String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamic IP Restrictions for IIS 7 - リリース候補 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamic IP Restrictions for IIS 7 - リリース候補 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamic IP Restrictions for IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamic IP Restrictions for IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Dynamic IP Restrictions for IIS 7 のユーザー インターフェイス</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> このコンピューターに Dynamic IP Restrictions for IIS 7 - Beta が見つかりました。アンインストールしてからやり直してください</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 For IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">この製品を使用するには、IIS 7.0 の CoreWebEngine および W3SVC 機能をインストールする必要があります。</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV サーバー モジュール</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV 管理ユーザー インターフェイス</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS Search Engine Optimization ツールキット 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS Search Engine Optimization ツールキット 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Search Engine Optimization (SEO) ツールキット 1.0</String>
- <String Id="SiteAnalyzerProductComments">このインストーラー データベースには、IIS Search Engine Optimization ツールキット 1.0 のインストールに必要なロジックとデータが含まれています。</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS エディター</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS レポート</String>
- <String Id="LogParserInstalled" Overridable="yes">このコンピューターには、Log Parser がインストールされていません。http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 から Log Parser 2.2 をインストールし、IIS レポートのインストールを続行してください。</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">前提条件のパッケージが見つかりませんでした。setup.exe を実行して依存関係を解決してから、このプログラムをインストールしてください。</String>
- <String Id="SMONotInstalled" Overridable="yes">IIS Database Manager のインストールの前提条件として、Microsoft SQL Server 2008 管理オブジェクトが必要です。Micrsoft SQL Server 2008 管理オブジェクトは http://go.microsoft.com/fwlink/?LinkID=150946 からインストールできます。</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">IIS Database Manager のインストールの前提要件として、Microsoft SQL Server System CLR Types が必要です。Microsoft SQL Server System CLR Types は、http://go.microsoft.com/fwlink/?LinkID=150949 からインストールできます。</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">アプリケーション要求ルーティング処理の前提条件として、Web Farm Framework が必要です。Web Farm Framework をインストールしてください。</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">ランタイム</String>
- <String Id="ArrModuleDescription">アプリケーション要求ルーティング処理の機能を IIS に追加します。</String>
- <String Id="ArrUITitle">ユーザー インターフェイス</String>
- <String Id="ArrUIDescription">アプリケーション要求ルーティング処理の機能を IIS マネージャーで構成します。</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Microsoft Windows PowerShell snap-in for IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft Web Platform Installer 4.0</String>
- <String Id="WebPIFeatureName">Microsoft Web Platform Installer</String>
- <String Id="XPSP2Required">[ProductName] には、Windows XP SP2、Windows 2003 SP1、Windows Vista 以降が必要です。</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] には、Windows XP Service Pack 3、Windows Server 2003 Service Pack 2 以降が必要です。</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Microsoft Windows Azure サービス インストーラー</String>
- <String Id="WASIFeatureName">Microsoft Windows Azure サービス インストーラー</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">インターネット インフォメーション サービス (IIS) 7 以上のマネージャー</String>
- <String Id="RemoteMgrClientFeatureName">IIS マネージャー クライアント</String>
- <String Id="RemoteMgrRemotingFeatureName">リモート処理サポート</String>
- <String Id="RemoteMgrNotSupported">この製品には、Windows XP SP2、Windows 2003 SP1、Windows Vista SP1、または Windows 7 以上が必要です。</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">リモート IIS サーバーを管理するために必要な IIS 管理コンソールがインストールされていません。コントロール パネルの [プログラム] で、[Windows の機能の有効化または無効化] を開き、Ineternet Information Services 機能から [IIS 管理コンソール] を選択して、IIS 管理コンソールをインストールしてから、リモート管理サポートをインストールしてください。</String>
- <String Id="RemoteMgrNotRequired">この製品は、Windows Server 2008 または Windows Server 2008 R2 以上では必須ではありません。サーバー マネージャーを開き、Web サーバーの役割の役割サービスで [IIS 管理コンソール] を選択して、IIS 管理コンソールをインストールしてください。</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS Manager Publishing for IIS 7.0</String>
- <String Id="PublishingFeatureName">Publishing のユーザー インターフェイス</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 for IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">互換性のない製品 [CONFLICTING_PRODUCT_NAME] がこのコンピューター上にあります。[ProductName] のインストールを続行できません。この製品をインストールするには、[コントロール パネル] の [プログラムの追加と削除] を使用して、[CONFLICTING_PRODUCT_NAME] を削除してください。</String>
- <String Id="AdminRequired" Overridable="yes">[ProductName] をインストールするには管理者特権が必要です。</String>
- <String Id="IIS7Only" Overridable="yes">[ProductName] を使用するには、IIS Version 7.0 が必要です。</String>
- <String Id="IIS7OrGreater" Overridable="yes">[ProductName] をインストールするには、IIS Version 7.0 以降が必要です。</String>
- <String Id="IIS75OrGreater" Overridable="yes">[ProductName] をインストールするには、IIS Version 7.5 以降が必要です。</String>
- <String Id="IIS7Or75Only" Overridable="yes">[ProductName] をインストールするには、IIS Version 7 または 7.5 が必要です。</String>
- <String Id="BetaVersionFound" Overridable="yes">このコンピューターに [ProductName] のベータ版が見つかりました。</String>
- <String Id="NewerVersionFound" Overridable="yes">このコンピューターに、より新しいバージョンの [ProductName] が見つかりました。</String>
- <String Id="DuplicateVersionFound" Overridable="yes">このコンピューターには、[ProductName] の別のインスタンスが既にインストールされているため、セットアップを続行できません。最初にアンインストールしてから、再度インストールを行ってください。</String>
- <String Id="CoreWebW3SVC" Overridable="yes">[ProductName] を使用するには、IIS 7.0 の CoreWebEngine および W3SVC 機能をインストールする必要があります。</String>
- <String Id="IISManagementConsole" Overridable="yes">[ProductName] を使用するには、IIS 管理コンソールをインストールする必要があります。</String>
- <String Id="WebServicesRunning" Overridable="yes">Windows プロセス起動サービス (WAS) と Web 管理サービス (WMSvc) の両方のサービスを停止してから、[ProductName] をインストールしてください。[ProductName] のインストール後にサービスを起動する必要があります。</String>
- <String Id="MetabaseRequired" Overridable="yes">[ProductName] をインストールするには、IIS メタベースが必要です。</String>
- <String Id="LaunchCondition_32BIT">64 ビット版の [ProductName] を 32 ビット版の Microsoft Windows にインストールすることはできません。</String>
- <String Id="LaunchCondition_64BIT">32 ビット版の [ProductName] を 64 ビット版の Microsoft Windows にインストールすることはできません。</String>
- <String Id="NetFX2OrGreaterRequired">[ProductName] をインストールするには、Microsoft .NET Framework Version 2.0 以降が必要です。</String>
- <String Id="NetFX35OrGreaterRequired">[ProductName] をインストールするには、Microsoft .NET Framework Version 3.5 以降が必要です。サーバー マネージャーの [機能の追加] を使用して、Microsoft .Net Version 3.5 をインストールしてください。</String>
- <String Id="NetFX4OrGreaterRequired">[ProductName] をインストールするには、Microsoft .NET Framework Version 4.0 以降が必要です。</String>
- <String Id="NetFX20SP1IsRequired">[ProductName] をインストールする前に、Microsoft .NET Framework Version 2.0 Service Pack 1 (またはそれ以降の Service Pack) をインストールしてください。</String>
- <String Id="WindowsUpdateEnabled">Windows Update (wuauserv) サービスを無効にすることはできません。[ProductName] をインストールする場合は必須です。</String>
- <String Id="GetFromOSforWin7">PowerShell スナップインは、Windows オペレーティング システムに付属しています。[プログラムと機能] またはサーバー マネージャーからインストールしてください。</String>
- <String Id="WebPI3OrGreaterRequired">[ProductName] をインストールするには、Microsoft Web Platform Installer Version 3.0 以降が必要です。</String>
-
- <String Id="Error30001" Overridable="yes">共有構成を検出できませんでした。</String>
- <String Id="Error30002" Overridable="yes">IIS に対して共有構成が有効になっています。共有構成を使用している場合、[ProductName] をインストールすることはサポートされません。この機能をインストールする場合は、あらかじめ共有構成を無効にしてください。</String>
-
- <String Id="W3SVCRunning" Overridable="yes">[ProductName] をインストールする前に、World Wide Web 発行サービス (W3SVC) を停止してください。インストール後は、このサービスを起動する必要があります。</String>
- <String Id="IISPowershellConsole">IIS PowerShell 管理コンソール</String>
- <String Id="IISPowershellSnapin">IIS PowerShell スナップイン</String>
- <String Id="PowerShellRequired">IIS PowerShell スナップインを使用するには、PowerShell v1.0 または v2.0 がインストールされている必要があります。</String>
- <String Id="WasAndConfigRequired">IIS PowerShell スナップインを使用するには、WAS および構成がインストールされている必要があります。</String>
- <String Id="TestBogusString" Overridable="yes">これは仮の文字列です。</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework Version 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent Version 2.2</String>
- <String Id="WebFarmBasicFeatureName">Web Farm サービス</String>
- <String Id="WebFarmBasicFeatureDescription">Web Farm サービス</String>
- <String Id="WebFarmControllerServiceName">Web Farm コントローラー サービス</String>
- <String Id="WebFarmControllerServiceDescription">Web Farm コントローラー サービス</String>
- <String Id="WebFarmAgentServiceName">Web Farm エージェント サービス</String>
- <String Id="WebFarmAgentServiceDescription">Web Farm エージェント サービス</String>
- <String Id="WebPIRequired">Web Farm Framework をインストールする前提条件として、Web Platform Installer が必要です。http://www.microsoft.com/web/downloads/platform.aspx から Web Platform Installer をインストールしてください。</String>
- <String Id="WebDeployRequired">Web Farm Framework をインストールする前提条件として、Web 配置ツールが必要です。http://www.microsoft.com/downloads/details.aspx?displaylang=ja&amp;FamilyID=c7ca4240-5427-42ba-bd46-29a755549e37 (x64) または、http://www.microsoft.com/downloads/details.aspx?displaylang=ja&amp;FamilyID=f2b0fe35-15ae-4638-b72e-f96535c64591 (x86) から Web 配置ツールをインストールしてください。</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Web ホスティングの役割と機能。</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework は、Web ホスティングを管理するための API と PowerShell コマンドを提供します。</String>
- <String Id="WebHostingWebRoleFeatureName">Web ロール</String>
- <String Id="WebHostingWebRoleFeatureDescription">Web ロールは、Web ホスティングのための動的 WAS サービスおよび URL 書き換えプロバイダーをインストールします。</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">シングル コンピューター セットアップ用に最適化されたコントロール パネルの構成を展開します。</String>
- <String Id="WebHostingLoadBalancerFeatureName">負荷分散装置の役割</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">負荷分散装置の役割は、Web ホスティングの規則を基にしてルーティングするようにアプリケーション要求ルーターを構成します。</String>
- <String Id="WebHostingControllerFeatureName">ホスティング コントローラー</String>
- <String Id="WebHostingControllerFeatureDescription">ホスティング コントローラーは、Web ホスティングと連携するように Web Farm Framework 2.0 を拡張します。</String>
- <String Id="WebHostingPublishingRoleFeatureName">Publishing ロール</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Web 配置および FTP 発行のサポートをインストールします。</String>
- <String Id="WebHostingPowerShellSnapInDescription">これは、Microsoft Web Hosting インフラストラクチャを管理するためのコマンドレットを含む PowerShell スナップインです。</String>
- <String Id="DWASServiceName">動的 WAS サービス</String>
- <String Id="DWASServiceDescription">高密度な Web ホスティング用に最適化された Windows プロセス アクティブ化サービス。</String>
- <String Id="MeteringFeatureName">リソース メータリング サービス</String>
- <String Id="MeteringFeatureDescription">ランタイムおよび正常性情報の両方の収集と発行を有効にする、リソース メータリング サービスをインストールします。</String>
- <String Id="MeteringServiceName">リソース メータリング</String>
- <String Id="MeteringServiceDescription">Web ロールからのランタイムおよび正常性情報の収集と発行を有効にします。</String>
- <String Id="QuotaEnforcementServiceName">ホスティング クォータの強制</String>
- <String Id="QuotaEnforcementServiceDescription">Web サイトのリソースの使用率を監視し、使用率のクォータを超えた場合にカスタム アクションを実行します。</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/KOR/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/KOR/misc/setupstrings.wxl
deleted file mode 100644
index f4cb5f3312..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/KOR/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="ko-kr" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1042</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">공유 구성 설치 옵션</String>
- <String Id="SharedConfigDlgDescription">IIS 공유 구성 설치 옵션을 선택합니다.</String>
- <String Id="SharedConfigDlgCheckBox">설치 시 공유 구성 업데이트</String>
- <String Id="SharedConfigDlgText">공유 구성을 사용 중인 IIS 서버에 이 모듈을 설치하는 중입니다. 이 공유 구성을 사용하는 IIS 서버가 더 있는 경우 해당하는 모든 컴퓨터에 이 모듈을 설치해야 합니다. 각 웹 서버의 장애를 최소화하려면 다음 절차에 따라 이 모듈을 설치해야 합니다. 첫째, 마지막 컴퓨터를 제외한 모든 컴퓨터에서 공유 구성을 업데이트하지 않고 모듈을 설치합니다. 아래의 확인란을 선택하지 않고 이 작업을 실행하십시오.
-이렇게 하면 공유 구성을 변경하지 않고 모듈에 필요한 모든 파일 및 이진 파일이 각 컴퓨터에 설치됩니다. 둘째, 마지막 컴퓨터에서 사용자가 실행 중인 사용자 ID에 UNC 공유의 applicationhost.config 파일에 대한 읽기 및 쓰기 권한이 있는지 확인합니다. 그런 다음 모듈을 설치하고 아래의 업데이트 공유 구성 옵션을 선택합니다. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">WebConfig 사용자 지정 작업을 초기화하는 중</String>
- <String Id="ProgressText_WebConfigUpdate">web.config 업데이트 중</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS 고급 로깅</String>
- <String Id="AdvancedLoggingDescription">IIS 파이프라인 데이터의 고급 로깅을 사용합니다.</String>
- <String Id="AdvancedLoggingUI">IIS 고급 로깅</String>
- <String Id="AdvancedLoggingUIDescription">확장 가능한 필드 선택으로 사용자 지정 로그 파일을 만들 수 있도록 설정합니다.</String>
- <String Id="AdvancedLoggingUpdate01">IIS 고급 로깅 업데이트</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">베타</String>
- <String Id="TransformManagerDescription">Transform Manager IIS 미디어 서비스를 활성화합니다.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">미디어 변환을 만들 수 있도록 설정합니다.</String>
- <String Id="TransformManagerServiceHostName">IIS Transform Manager 호스트</String>
- <String Id="TransformManagerServiceHostDescription">[ProductName]의 서비스 호스트입니다.</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">요청 시 미디어 파일을 대체 파일 및 컨테이너 형식으로 일괄 변환합니다.</String>
- <String Id="TransformManagerEESPTaskInstalled">컴퓨터에 IIS Transform Manager 1.0 Expression Encoder SP 작업 패키지가 설치되어 있습니다. [ProductName]을(를) 설치하기 전에 IIS Transform Manager 1.0 Expression Encoder SP 작업 패키지를 제거해야 합니다.</String>
-
- <String Id="NetFx35Required">[ProductName]을(를) 설치하려면 Microsoft .NET Framework 3.5가 필요합니다. 서버 관리자에서 '기능 추가 마법사'를 사용하여 .NET Framework 3.5.1 기능을 설치하거나 'Windows 기능 사용/사용 안 함'을 사용하여 Microsoft .NET Framework 3.5 기능을 활성화합니다.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS 디지털 권한 관리</String>
- <String Id="DigitalRightsManagementRelease">베타</String>
- <String Id="DigitalRightsManagementDescription">부드러운 스트리밍 프레젠테이션의 디지털 권한 관리를 활성화합니다.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET이 설치되어 있지 않습니다.</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[웹 재생 목록에서 ASP.NET 세션 상태 지속성에 대한 Session Helper를 설치하려면 먼저 서버 관리자에서 웹 서버(IIS) 역할에 대한 ASP.NET 역할 서비스를 설치해야 합니다. ASP.NET용 Session Helper없이 Media Services 설치를 계속하려면 [뒤로]를 클릭한 다음 설치할 기능 목록에서 Session Helper를 제거합니다. 그렇지 않으면 [취소]를 클릭하고 서버 관리자에서 ASP.NET 역할 서비스를 설치한 다음 IIS Media Services 설치 프로그램을 다시 실행합니다.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[웹 서버(IIS)용 ASP.NET 역할 서비스가 설치되어 있지 않으면 웹 재생 목록에서 ASP.NET 세션 지속성 공급자를 사용할 수 없습니다. 웹 재생 목록과 함께 ASP.NET 세션 지속성 공급자를 사용하려면 서버 관리자에서 웹 서버(IIS)용 ASP.NET 역할 서비스를 설치하십시오.
-
-지금 Session Helper를 설치하지 않으려면 [뒤로]를 클릭한 다음 이 기능의 선택을 취소하십시오.
-
-ASP.NET 역할 서비스를 설치하는 경우 제어판의 [프로그램 및 기능] 메뉴에서 이 제품의 설치된 기능을 변경할 수 있습니다.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">이 컴퓨터에 IIS 부드러운 스트리밍 - 베타가 있으므로 [ProductName] 설치를 계속할 수 없습니다. 이 제품을 설치하려면 제어판의 [프로그램 추가/제거]를 사용하여 IIS 부드러운 스트리밍 - 베타를 제거하십시오.</String>
- <String Id="IncompatibleMediaServicesVersionFound">이 컴퓨터에 IIS 미디어 서비스의 비호환 버전이 있으므로 [ProductName] 설치를 계속할 수 없습니다. 이 제품을 설치하려면 제어판의 [프로그램 추가/제거]를 사용하여 IIS 미디어 서비스를 제거하십시오.</String>
- <String Id="NewerMediaServicesVersionFound">컴퓨터에 이 제품의 최신 버전이 이미 설치되어 있거나 설치에 사용할 수 있으므로 [ProductName] 설치를 계속할 수 없습니다. 이 제품의 최신 버전을 설치하려면 [제어판]에서 [프로그램 추가/제거]를 사용하여 IIS Media Services를 업데이트하십시오.</String>
- <String Id="ISXConversionRequiredWarningTitle">재생 목록 파일 변환이 필요합니다.</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[이전 버전의 웹 재생 목록에 대해 만들어진 재생 목록 파일은 이 버전에서 사용할 수 없습니다. 현재 버전의 웹 재생 목록에 지원되는 재생 목록의 복사본을 만들려면 http://go.microsoft.com/fwlink/?LinkId=127838에서 제공하는 isxTranslate 변환 도구를 실행하십시오.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">이전 IIS 미디어 서비스 파일이 있습니다.</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[이 컴퓨터에 이전 버전의 Media Services 기능이 하나 이상 설치되어 있습니다. IIS Media Services의 기능이 제대로 작동하려면 IIS Media Services 설치 프로그램에서 이전에 설치된 모든 Media Services 기능을 업데이트해야 합니다.
-
-이전에 설치된 Media Services 기능을 현재 버전으로 업데이트하려면 [다음]을 클릭하십시오. 이전에 설치된 버전을 업데이트하지 않으려면 [취소]를 클릭하십시오.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">베타 IIS 미디어 서비스 파일이 있습니다.</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[하나 이상의 IIS 미디어 서비스 기능 베타 버전이 이 컴퓨터에 설치되어 있으므로 IIS 미디어 서비스 설치를 계속할 수 없습니다.
-
-이 버전의 IIS 미디어 서비스를 설치하려면 베타 기능을 제거해야 합니다.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">IIS Media Pack 1.0에 대한 업데이트</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">IIS Media Services 2.0에 대한 업데이트</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS 미디어 서비스 3.0 TAP 2</String>
- <String Id="MediaServices30Update">IIS Media Services 3.0에 대한 업데이트</String>
- <String Id="MediaServicesIISMediaDescription">IIS Media Services 기능 및 도구입니다.</String>
- <String Id="MediaServicesBurbankDescription">IIS Media Services 5 Premium 기능 및 도구입니다.</String>
- <String Id="MediaServices40Beta1Title">IIS 미디어 서비스 4.0 베타 1</String>
- <String Id="MediaServices40Title">IIS 미디어 서비스 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS 미디어 서비스 4.5 베타 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">웹 재생 목록</String>
- <String Id="MediaServicesFeaturePlaylistDescription">재생 목록에 참조된 미디어 자산의 클라이언트 재생을 제어합니다.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Session Helper</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">ASP.NET 세션 상태가 지속되도록 설정합니다(웹 서버(IIS)에 대한 ASP.NET 역할 서비스 필요).</String>
- <String Id="MediaServicesFeaturePlaylistUI">사용자 인터페이스</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">IIS 관리자에서 웹 재생 목록 기능을 구성합니다.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">비트 전송률 제한</String>
- <String Id="MediaServicesFeatureBitrateDescription">클라이언트가 다운로드하는 파일 전달을 제한하여 대역폭을 절약합니다.</String>
- <String Id="MediaServicesFeatureBitrateUI">사용자 인터페이스</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">IIS 관리자에서 비트 전송률 제한 기능을 구성합니다.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">자산</String>
- <String Id="MediaServicesFeatureSmoothDescription">클라이언트에 대한 주문형 자산의 HTTP 적응 스트리밍을 사용하도록 설정합니다.</String>
- <String Id="MediaServicesFeatureSmoothUI">사용자 인터페이스</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">IIS 관리자에서 부드러운 스트리밍 기능을 구성합니다.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">채널</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">클라이언트에 대한 채널 브로드캐스트의 HTTP 적응 스트리밍을 사용하도록 설정합니다.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">사용자 인터페이스</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">IIS 관리자에서 Live Smooth Streaming 기능을 구성합니다.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">디지털 권한 관리</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">부드러운 스트리밍 미디어의 암호화 및 라이선스를 제공합니다.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">사용자 인터페이스</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">IIS 관리자의 디지털 권한 관리 기능을 구성합니다.</String>
-
- <String Id="VistaSP1Required">[ProductName]에는 Microsoft Windows Vista 서비스 팩 1 이상이 필요합니다.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName]은(는) Vista Home Basic에 설치할 수 없습니다.</String>
- <String Id="Windows7SP1Required">[ProductName]에는 Microsoft Windows 7 서비스 팩 1 이상이 필요합니다.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS 데이터베이스 관리자</String>
- <String Id="DBManagerBasicFeatureName">IIS 데이터베이스 관리자</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft Web Management Service</String>
- <String Id="WMSvcBasicFeatureDescription">[ProductName]의 기본 기능을 설치합니다.</String>
- <String Id="WMSvcServiceName">Microsoft Web Management Service 2</String>
- <String Id="WMSvcServiceDescription">Web Management Service를 사용하면 관리자가 원격 및 위임된 관리 기능을 사용하여 이 컴퓨터에 있는 웹 서버, 사이트 및 응용 프로그램을 관리할 수 있습니다.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">IIS 7용 Microsoft URL 재작성 모듈 1.1</String>
- <String Id="RewriteServicingPatchV1">IIS 7용 URL 재작성 모듈 1.1에 대한 업데이트</String>
- <String Id="RewriteModuleTitleV1">URL 재작성</String>
- <String Id="RewriteModuleDescriptionV1">IIS 7에 대한 URL 및 콘텐츠 재작성 기능을 활성화합니다.</String>
- <String Id="RewriteModuleUITitleV1">사용자 인터페이스</String>
- <String Id="RewriteModuleUIDescriptionV1">IIS 관리자에서 URL 재작성 모듈 기능을 구성합니다.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL 재작성 모듈 2</String>
- <String Id="RewriteServicingPatch">IIS URL 재작성 모듈 2에 대한 업데이트</String>
- <String Id="RewriteModuleTitle">URL 재작성</String>
- <String Id="RewriteModuleDescription">IIS 7에 대한 URL 및 콘텐츠 재작성 기능을 활성화합니다.</String>
- <String Id="RewriteModuleUITitle">사용자 인터페이스</String>
- <String Id="RewriteModuleUIDescription">IIS 관리자에서 URL 재작성 모듈 기능을 구성합니다.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">IIS 7.0 관리 팩</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">[ProductName]의 기본 기능을 설치합니다.</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">IIS 7.0 관리 팩</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">이 운영 체제 버전은 지원되지 않습니다. [ProductName]은(는) Windows Server 2008 또는 Windows Vista 서비스 팩 1 이상에만 설치할 수 있습니다.</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.NET 기능</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET에는 권한 부여 및 사용자 지정 오류 설정을 관리하는 데 사용할 수 있는 권한 부여 및 오류 페이지 기능이 있습니다.</String>
- <String Id="Authentication" Overridable="yes">인증</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.NET 인증에 대한 설명입니다.</String>
- <String Id="Authorization" Overridable="yes">권한 부여</String>
- <String Id="AuthorizationDescription" Overridable="yes">ASP.NET 권한 부여를 사용하여 사용자에게 웹 사이트 및 응용 프로그램에 액세스할 수 있는 권한을 부여하는 규칙을 구성할 수 있습니다.</String>
- <String Id="ErrorPages" Overridable="yes">오류 페이지</String>
- <String Id="ErrorPagesDescription" Overridable="yes">ASP.NET 오류 페이지를 사용하여 오류가 발생했을 때 반환할 HTTP 오류 응답을 구성할 수 있습니다.</String>
- <String Id="Modules" Overridable="yes">모듈</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.NET 모듈에 대한 설명입니다.</String>
- <String Id="Handlers" Overridable="yes">처리기</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.NET 처리기에 대한 설명입니다.</String>
- <String Id="ConfigurationEditor" Overridable="yes">구성 편집기</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">구성 편집기를 통해 구성 파일의 섹션, 특성, 요소 및 컬렉션을 편집하여 IIS 관리자의 구성 파일을 관리할 수 있습니다.</String>
- <String Id="RequestFiltering" Overridable="yes">요청 필터링</String>
- <String Id="RequestFilteringDescription" Overridable="yes">요청 필터링을 사용하여 웹 사이트에 대한 필터링 규칙을 구성하고 프로토콜 및 콘텐츠 동작을 제한할 수 있습니다.</String>
- <String Id="FastCgi" Overridable="yes">Fast CGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI를 사용하여 웹 서버의 FastCGI 응용 프로그램에 대한 프로세스 풀 설정을 구성할 수 있습니다.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> IIS 7 설치에 대한 동적 IP 제한 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[IIS 기본 제공 IP 및 도메인 제한이 이미 설치되어 있습니다. 설치 마법사는 동적 IP 제한을 설치하기 위해 기존 IP 및 도메인 제한을 제거합니다. 기존 IP 보안 구성은 유지됩니다.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[이 작업에는 몇 분 정도 걸릴 수 있습니다.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[계속하시겠습니까?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">IIS 7용 동적 IP 제한 - 베타 </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">IIS 7용 동적 IP 제한 - 베타 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">IIS 7용 동적 IP 제한 - 베타 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">IIS 7용 동적 IP 제한 - 릴리스 후보 </String>
- <String Id="DynamicIPRestrictionProductNameRC2">IIS 7용 동적 IP 제한 - 릴리스 후보 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">IIS 7용 동적 IP 제한 - 릴리스 후보 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">IIS 7용 동적 IP 제한 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">IIS 7용 동적 IP 제한</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">IIS 7용 동적 IP 제한 사용자 인터페이스</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> 이 시스템에서 IIS 7 - 베타에 대한 동적 IP 제한 사항이 발견되었습니다. 이 제한 사항을 제거한 후 다시 시도하십시오.</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">IIS 7.0용 WebDAV 7.5</String>
- <String Id="CoreWebEngineMustBeInstalled">이 제품을 사용하려면 IIS 7.0 CoreWebEngine 및 W3SVC 기능이 설치되어 있어야 합니다.</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV 서버 모듈</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV 관리 사용자 인터페이스</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS 검색 엔진 최적화 도구 키트 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS 검색 엔진 최적화 도구 키트 1.0</String>
- <String Id="SiteAnalyzerShortcutName">검색 엔진 최적화(SEO) 도구 키트 1.0</String>
- <String Id="SiteAnalyzerProductComments">이 설치 프로그램 데이터베이스에는 IIS 검색 엔진 최적화 도구 키트 1.0을 설치하는 데 필요한 논리 및 데이터가 들어 있습니다.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS 편집기</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS 보고서</String>
- <String Id="LogParserInstalled" Overridable="yes">이 컴퓨터에 Log Parser가 설치되어 있지 않습니다. http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07에서 Log Parser 2.2를 설치한 다음 IIS 보고서 설치를 계속하십시오.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">필수 구성 요소 패키지가 없습니다. setup.exe를 실행하여 종속성을 해결한 다음 이 프로그램을 설치하십시오.</String>
- <String Id="SMONotInstalled" Overridable="yes">IIS 데이터베이스 관리자를 설치하려면 Microsoft SQL Server 2008 관리 개체가 설치되어 있어야 합니다. http://go.microsoft.com/fwlink/?LinkID=150946에서 Microsoft SQL Server 2008 관리 개체를 설치할 수 있습니다.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">IIS 데이터베이스 관리자를 설치하려면 Microsoft SQL Server System CLR Types가 설치되어 있어야 합니다. http://go.microsoft.com/fwlink/?LinkID=150949에서 Microsoft SQL Server System CLR Types를 설치할 수 있습니다.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">응용 프로그램 요청 라우팅을 설치하려면 Web Farm Framework가 설치되어 있어야 합니다. Web Farm Framework를 설치하십시오.</String>
- <String Id="Arrv2ProductName">Microsoft 응용 프로그램 요청 라우팅 버전 2.5</String>
- <String Id="ArrModuleTitle">런타임</String>
- <String Id="ArrModuleDescription">IIS에 응용 프로그램 요청 라우팅 기능을 추가합니다.</String>
- <String Id="ArrUITitle">사용자 인터페이스</String>
- <String Id="ArrUIDescription">IIS 관리자에서 응용 프로그램 요청 라우팅 기능을 구성합니다.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">IIS 7.0용 Microsoft Windows PowerShell 스냅인</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft 웹 플랫폼 설치 관리자 4.0</String>
- <String Id="WebPIFeatureName">Microsoft 웹 플랫폼 설치 관리자</String>
- <String Id="XPSP2Required">[ProductName]에는 Windows XP SP2, Windows 2003 SP1, Windows Vista 이상이 필요합니다.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName]을(를) 사용하려면 Windows XP 서비스 팩 3, Windows Server 2003 서비스 팩 2 이상이 필요합니다.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Microsoft Windows Azure Services 설치 관리자</String>
- <String Id="WASIFeatureName">Microsoft Windows Azure Services 설치 관리자</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">IIS(인터넷 정보 서비스) 7+ 관리자</String>
- <String Id="RemoteMgrClientFeatureName">IIS 관리자 클라이언트</String>
- <String Id="RemoteMgrRemotingFeatureName">원격 지원</String>
- <String Id="RemoteMgrNotSupported">이 제품에는 Windows XP SP2, Windows 2003 SP1, Windows Vista SP1, Windows 7 이상이 있어야 합니다.</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">원격 IIS 서버 관리에 필요한 IIS 관리 콘솔이 설치되어 있지 않습니다. 원격 관리 지원을 설치하기 전에 '제어판-&gt;프로그램-&gt;Windows 기능 사용/사용 안 함'을 열고 인터넷 정보 서비스 기능에서 IIS 관리 콘솔을 선택하여 IIS 관리 콘솔을 설치하십시오.</String>
- <String Id="RemoteMgrNotRequired">이 제품은 Windows Server 2008 또는 Windows Server 2008 R2 이상에서 필수 사항이 아닙니다. 서버 관리자를 열고 웹 서버 역할에 대한 역할 서비스에서 IIS 관리 콘솔을 선택하여 IIS 관리 콘솔을 설치하십시오.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS 7.0용 IIS 관리자 게시</String>
- <String Id="PublishingFeatureName">게시 사용자 인터페이스</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">IIS 7.5용 응용 프로그램 웜업</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">이 컴퓨터에 호환되지 않는 제품 [CONFLICTING_PRODUCT_NAME]이(가) 있습니다. [ProductName]의 설치를 계속할 수 없습니다. 이 제품을 설치하려면 제어판에서 프로그램 추가/제거를 사용하여 [CONFLICTING_PRODUCT_NAME]을(를) 제거하십시오.</String>
- <String Id="AdminRequired" Overridable="yes">[ProductName]을(를) 설치하려면 관리자 권한이 있어야 합니다.</String>
- <String Id="IIS7Only" Overridable="yes">[ProductName]을(를) 사용하려면 IIS 버전 7.0이 있어야 합니다.</String>
- <String Id="IIS7OrGreater" Overridable="yes">[ProductName]을(를) 설치하려면 IIS 버전 7.0 이상이 있어야 합니다.</String>
- <String Id="IIS75OrGreater" Overridable="yes">[ProductName]을(를) 설치하려면 IIS 버전 7.5 이상이 있어야 합니다.</String>
- <String Id="IIS7Or75Only" Overridable="yes">[ProductName]을(를) 설치하려면 IIS 버전 7 또는 7.5가 있어야 합니다.</String>
- <String Id="BetaVersionFound" Overridable="yes">이 컴퓨터에 [ProductName]의 베타 버전이 설치되어 있습니다.</String>
- <String Id="NewerVersionFound" Overridable="yes">이 컴퓨터에 [ProductName]의 상위 버전이 설치되어 있습니다.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">컴퓨터에 [ProductName]의 다른 인스턴스가 이미 설치되어 있어서 설치를 계속할 수 없습니다. 먼저 해당 인스턴스를 제거한 다음 설치 프로그램을 다시 시작하십시오.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">[ProductName]을(를) 사용하려면 IIS 7.0 CoreWebEngine 및 W3SVC 기능이 설치되어 있어야 합니다.</String>
- <String Id="IISManagementConsole" Overridable="yes">[ProductName]을(를) 사용하려면 IIS 관리 콘솔이 설치되어 있어야 합니다.</String>
- <String Id="WebServicesRunning" Overridable="yes">[ProductName]을(를) 설치하기 전에 WAS(Windows Process Activation Service) 및 WMSvc(Web Management Service)를 모두 중지하십시오. [ProductName]을(를) 설치한 후에 해당 서비스를 시작해야 합니다.</String>
- <String Id="MetabaseRequired" Overridable="yes">[ProductName]을(를) 설치하려면 IIS 메타베이스가 있어야 합니다.</String>
- <String Id="LaunchCondition_32BIT">[ProductName] 64비트 버전은 Microsoft Windows 32비트 버전에 설치할 수 없습니다.</String>
- <String Id="LaunchCondition_64BIT">[ProductName] 32비트 버전은 Microsoft Windows 64비트 버전에 설치할 수 없습니다.</String>
- <String Id="NetFX2OrGreaterRequired">[ProductName]을(를) 설치하려면 Microsoft .NET Framework 버전 2.0 이상이 설치되어 있어야 합니다.</String>
- <String Id="NetFX35OrGreaterRequired">[ProductName]을(를) 설치하려면 Microsoft .NET Framework 버전 3.5 이상이 필요합니다. 서버 관리자에서 '기능 추가'를 사용하여 Microsoft .Net 버전 3.5를 설치하십시오.</String>
- <String Id="NetFX4OrGreaterRequired">[ProductName]을(를) 설치하려면 Microsoft .NET Framework 버전 4.0 이상이 필요합니다.</String>
- <String Id="NetFX20SP1IsRequired">[ProductName]을(를) 설치하기 전에 Microsoft .NET Framework 버전 2.0 서비스 팩 1 이상을 설치하십시오.</String>
- <String Id="WindowsUpdateEnabled">[ProductName]을(를) 설치하는 데 필요하므로 Windows Update(wuauserv) 서비스를 비활성화할 수 없습니다.</String>
- <String Id="GetFromOSforWin7">PowerShell 스냅인은 Windows 운영 체제에 포함되어 있습니다. '프로그램 및 기능' 또는 '서버 관리자'를 사용하여 설치하십시오.</String>
- <String Id="WebPI3OrGreaterRequired">[ProductName]을(를) 설치하려면 Microsoft 웹 플랫폼 설치 관리자 버전 3.0 이상이 필요합니다.</String>
-
- <String Id="Error30001" Overridable="yes">설치 프로그램이 공유 구성을 검색하지 못했습니다.</String>
- <String Id="Error30002" Overridable="yes">IIS에 대해 공유 구성이 활성화되어 있습니다. 공유 구성을 사용하는 경우 [ProductName]을(를) 설치할 수 없습니다. 이 기능을 설치하려면 공유 구성을 비활성화하십시오.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">[ProductName]을(를) 설치하려면 먼저 W3SVC(World Wide Web Publishing Service)를 중지하십시오. 설치 후 해당 서비스를 다시 시작해야 합니다. </String>
- <String Id="IISPowershellConsole">IIS PowerShell 관리 콘솔</String>
- <String Id="IISPowershellSnapin">IIS PowerShell 스냅인</String>
- <String Id="PowerShellRequired">IIS PowerShell 스냅인을 사용하려면 PowerShell v1.0 또는 v2.0이 설치되어 있어야 합니다.</String>
- <String Id="WasAndConfigRequired">IIS PowerShell 스냅인을 사용하려면 WAS 및 구성이 설치되어 있어야 합니다.</String>
- <String Id="TestBogusString" Overridable="yes">임시 문자열입니다.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework 버전 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft 웹 팜 에이전트 버전 2.2</String>
- <String Id="WebFarmBasicFeatureName">웹 팜 서비스</String>
- <String Id="WebFarmBasicFeatureDescription">웹 팜 서비스</String>
- <String Id="WebFarmControllerServiceName">웹 팜 컨트롤러 서비스</String>
- <String Id="WebFarmControllerServiceDescription">웹 팜 컨트롤러 서비스</String>
- <String Id="WebFarmAgentServiceName">웹 팜 에이전트 서비스</String>
- <String Id="WebFarmAgentServiceDescription">웹 팜 에이전트 서비스</String>
- <String Id="WebPIRequired">Web Farm Framework를 설치하려면 웹 플랫폼 설치 관리자가 설치되어 있어야 합니다. 웹 플랫폼 설치 관리자는 http://www.microsoft.com/web/downloads/platform.aspx에서 설치하십시오.</String>
- <String Id="WebDeployRequired">Web Farm Framework를 설치하려면 웹 배포 도구가 설치되어 있어야 합니다. 웹 배포 도구는 http://www.iis.net/download/WebDeploy에서 설치하십시오.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">웹 호스팅 역할 및 기능입니다.</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Hosting Framework는 웹 호스팅을 관리하기 위한 API 및 PowerShell 명령을 제공합니다.</String>
- <String Id="WebHostingWebRoleFeatureName">웹 역할</String>
- <String Id="WebHostingWebRoleFeatureDescription">웹 역할은 웹 호스팅용 동적 WAS 서비스 및 URL 재작성 공급자를 설치합니다.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">단일 컴퓨터 설치에 대해 최적화된 제어판 구성을 배포합니다.</String>
- <String Id="WebHostingLoadBalancerFeatureName">부하 분산 장치 역할</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">부하 분산 장치 역할은 웹 호스팅 규칙을 기반으로 라우팅하기 위한 응용 프로그램 요청 라우터를 구성합니다.</String>
- <String Id="WebHostingControllerFeatureName">호스팅 컨트롤러</String>
- <String Id="WebHostingControllerFeatureDescription">호스팅 컨트롤러는 웹 호스팅과 작동하도록 Web Farm Framework 2.0을 확장합니다.</String>
- <String Id="WebHostingPublishingRoleFeatureName">게시 역할</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">웹 배포 및 FTP 게시에 대한 지원을 설치합니다.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Microsoft Web Hosting 인프라 관리를 위한 cmdlets가 포함된 PowerShell 스냅인입니다.</String>
- <String Id="DWASServiceName">동적 WAS 서비스</String>
- <String Id="DWASServiceDescription">고밀도 웹 호스팅에 대해 최적화된 Windows Process Activation Service입니다.</String>
- <String Id="MeteringFeatureName">리소스 계량 서비스</String>
- <String Id="MeteringFeatureDescription">런타임 및 상태 정보를 둘 다 수집하고 게시하는 리소스 계량 서비스를 설치합니다.</String>
- <String Id="MeteringServiceName">리소스 계량</String>
- <String Id="MeteringServiceDescription">웹 역할의 런타임 및 상태 정보를 수집하고 게시할 수 있습니다.</String>
- <String Id="QuotaEnforcementServiceName">호스팅 할당량 적용</String>
- <String Id="QuotaEnforcementServiceDescription">웹 사이트 리소스 사용을 모니터링하고 사용 할당량을 초과하면 사용자 지정 작업을 실행합니다.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PLK/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PLK/misc/setupstrings.wxl
deleted file mode 100644
index fccd7b5d05..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PLK/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="pl-pl" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1045</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Opcje instalacji w konfiguracji udostępnionej</String>
- <String Id="SharedConfigDlgDescription">Wybierz opcję instalacji w konfiguracji udostępnionej usług IIS</String>
- <String Id="SharedConfigDlgCheckBox">Aktualizuj konfigurację udostępnioną podczas instalacji</String>
- <String Id="SharedConfigDlgText">Ten moduł zostanie zainstalowany na serwerze usług IIS korzystającym z konfiguracji udostępnionej. Jeśli z tej konfiguracji udostępnionej korzysta więcej serwerów usług IIS, należy zainstalować ten moduł na wszystkich tych komputerach. Aby zminimalizować zakłócenia pracy poszczególnych serwerów sieci Web, najlepiej jest zainstalować ten moduł w następujący sposób: Najpierw zainstaluj moduł na wszystkich komputerach z wyjątkiem ostatniego bez aktualizowania konfiguracji udostępnionej. W tym celu nie zaznaczaj poniższego pola wyboru.
- Wtedy na wszystkich komputerach zostaną zainstalowane wszystkie pliki binarne i inne wymagane przez moduł, ale nie zostaną wprowadzone żadne zmiany w konfiguracji udostępnionej. Następnie na ostatnim komputerze sprawdź, czy używana tożsamość użytkownika ma dostęp z prawem do zapisu i odczytu do pliku applicationhost.config w udziale UNC. Jeśli ma, zainstaluj moduł i wybierz poniższą opcję aktualizacji konfiguracji udostępnionej. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Inicjowanie akcji niestandardowej WebConfig</String>
- <String Id="ProgressText_WebConfigUpdate">Aktualizowanie pliku web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">Zaawansowane rejestrowanie usług IIS</String>
- <String Id="AdvancedLoggingDescription">Włącza zaawansowane rejestrowanie danych potoku usług IIS.</String>
- <String Id="AdvancedLoggingUI">Zaawansowane rejestrowanie usług IIS</String>
- <String Id="AdvancedLoggingUIDescription">Umożliwia tworzenie niestandardowych plików dziennika przy użyciu rozszerzalnego wyboru pól.</String>
- <String Id="AdvancedLoggingUpdate01">Aktualizacja zaawansowanego rejestrowania usług IIS</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">Menedżer transformat usług IIS</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Włącza menedżera transformat usług IIS Media.</String>
- <String Id="TransformManagerUI">Menedżer transformat usług IIS</String>
- <String Id="TransformManagerUIDescription">Włącza tworzenie transformat plików multimedialnych.</String>
- <String Id="TransformManagerServiceHostName">Host menedżera transformat usług IIS</String>
- <String Id="TransformManagerServiceHostDescription">Host usługi programu [ProductName].</String>
- <String Id="TransformManagerShortcutName">Menedżer transformat usług IIS</String>
- <String Id="TransformManagerShortcutTooltip">Konwersja wsadowa plików multimedialnych na żądnie w celu zmiany formatów kontenerów i plików.</String>
- <String Id="TransformManagerEESPTaskInstalled">Na komputerze zainstalowano pakiet „IIS Transform Manager 1.0 Expression Encoder SP Task”. Należy go odinstalować przed zainstalowaniem produktu [ProductName].</String>
-
- <String Id="NetFx35Required">Do zainstalowania produktu [ProductName] jest wymagany program Microsoft .NET Framework w wersji 3.5. Aby zainstalować funkcje programu .NET Framework 3.5.1, należy użyć Kreatora dodawania funkcji w Menedżerze serwerów. Aby włączyć program Microsoft .NET Framework 3.5, należy użyć apletu Włącz lub wyłącz funkcje systemu Windows.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">Zarządzanie prawami cyfrowymi w usługach IIS</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Włącza zarządzanie prawami cyfrowymi prezentacji w formacie Smooth Streaming.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">Niezainstalowany program ASP.NET</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Aby można było zainstalować pomocnika sesji w celu utrwalania stanu sesji programu ASP.NET na listach odtwarzania w sieci Web, należy zainstalować usługę roli programu ASP.NET dla roli Serwer sieci Web (IIS) w Menedżerze serwera. Aby kontynuować instalację usług Media Services bez pomocnika sesji dla programu ASP.NET, kliknij przycisk Wstecz i usuń pozycję Pomocnik sesji z listy funkcji do zainstalowania. W przeciwnym razie kliknij przycisk Anuluj, zainstaluj usługę roli programu ASP.NET w Menedżerze serwera, a następnie ponownie uruchom Instalatora usług IIS Media Services.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Listy odtwarzania w sieci Web nie mogą używać dostawcy utrwalania sesji programu ASP.NET, jeśli nie jest zainstalowana usługa roli programu ASP.NET dla serwera sieci Web (IIS). Aby używać utrwalania sesji programu ASP.NET z listami odtwarzania w sieci Web, zainstaluj w Menedżerze serwera usługę roli programu ASP.NET dla serwera sieci Web (IIS).
-
-Jeśli nie chcesz teraz instalować funkcji Pomocnik sesji, możesz kliknąć przycisk Wstecz i usunąć zaznaczenie tej funkcji.
-
-Zainstalowanie usługi roli programu ASP.NET umożliwi zmianę zainstalowanych funkcji tego produktu za pomocą menu Programy i funkcje w Panelu sterowania.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">Na tym komputerze wykryto funkcję Płynne przesyłanie strumieniowe w wersji beta. Nie można kontynuować instalacji produktu [ProductName]. Aby zainstalować ten produkt, usuń funkcję Płynne przesyłanie strumieniowe w wersji beta, używając apletu Dodaj/Usuń programy w Panelu sterowania.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Na tym komputerze znajduje się niezgodna wersja usług IIS Media Services. Nie można kontynuować instalacji produktu [ProductName]. Aby zainstalować ten produkt, usuń usługi IIS Media Services, używając apletu Dodaj/Usuń programy w Panelu sterowania.</String>
- <String Id="NewerMediaServicesVersionFound">Nowsza wersja tego produktu jest już zainstalowana lub dostępna do zainstalowania na tym komputerze. Nie można kontynuować instalacji produktu [ProductName]. Aby zainstalować nowszą wersję tego produktu, używaj apletu Dodaj/Usuń programy w Panelu sterowania w celu zaktualizowania usług IIS Media Services.</String>
- <String Id="ISXConversionRequiredWarningTitle">Wymagana konwersja pliku listy odtwarzania</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Pliki list odtwarzania utworzone dla poprzednich wersji funkcji Listy odtwarzania w sieci Web są nieobsługiwane w tej wersji. Aby utworzyć kopie tych list odtwarzania, które są obsługiwane w tej wersji funkcji Listy odtwarzania w sieci Web, uruchom narzędzie do konwersji isxTranslate, które jest dostępne pod adresem http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Odnaleziono starsze pliki usług IIS Media Services</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[Na tym komputerze jest zainstalowana wcześniejsza wersja co najmniej jednej z funkcji usług Media Services. Instalator usług IIS Media Services musi zaktualizować wszystkie uprzednio zainstalowane funkcje usług Media Services, aby zagwarantować poprawne działanie funkcji usług IIS Media Services.
-
-Aby zaktualizować uprzednio zainstalowane funkcje usług Media Services do bieżących wersji, kliknij przycisk Dalej. Jeśli nie chcesz aktualizować uprzednio zainstalowanych wersji tych funkcji, kliknij przycisk Anuluj.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Odnaleziono pliki usług IIS Media Services w wersji beta</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[Na tym komputerze jest zainstalowana wersja beta co najmniej jednej z funkcji usług IIS Media Services. Nie można kontynuować działania Instalatora usług IIS Media Services.
-
-Aby zainstalować tę wersję usług IIS Media Services, musisz odinstalować funkcje w wersji beta.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Aktualizacja pakietu IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">Aktualizacja usług IIS Media Services 2.0</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Aktualizacja usług IIS Media Services 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Funkcje i narzędzia usług IIS Media Services.</String>
- <String Id="MediaServicesBurbankDescription">Funkcje i narzędzia usług IIS Media Services 5 Premium.</String>
- <String Id="MediaServices40Beta1Title">Usługi IIS Media 4.0 w wersji beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 w wersji beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Listy odtwarzania w sieci Web</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Steruje odtwarzaniem przez klienta zasobów multimedialnych wymienionych na listach odtwarzania.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Pomocnik sesji</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Umożliwia utrwalanie stanu sesji programu ASP.NET. (Wymaga usługi roli programu ASP.NET dla serwera sieci Web [IIS]).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Interfejs użytkownika</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Konfiguruje funkcję Listy odtwarzania w sieci Web w Menedżerze usług IIS.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Ograniczanie szybkości transmisji bitów</String>
- <String Id="MediaServicesFeatureBitrateDescription">Oszczędza przepustowość, ograniczając dostarczanie plików pobieranych przez klientów.</String>
- <String Id="MediaServicesFeatureBitrateUI">Interfejs użytkownika</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Konfiguruje funkcję Ograniczanie szybkości transmisji bitów w Menedżerze usług IIS.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Zasoby</String>
- <String Id="MediaServicesFeatureSmoothDescription">Włącza adaptacyjne przesyłanie strumieniowe zasobów na żądanie przez protokół HTTP do klientów.</String>
- <String Id="MediaServicesFeatureSmoothUI">Interfejs użytkownika</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Konfiguruje funkcję Płynne przesyłanie strumieniowe w Menedżerze usług IIS.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Kanały</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Włącza adaptacyjne przesyłanie strumieniowe emisji kanałów przez protokół HTTP do klientów.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Interfejs użytkownika</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Konfiguruje funkcję Płynne przesyłanie strumieniowe na żywo w Menedżerze usług IIS.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Zarządzanie prawami cyfrowymi</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Realizuje szyfrowanie i licencjonowanie plików multimedialnych w formacie Smooth Streaming.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Interfejs użytkownika</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Konfiguruje funkcję zarządzania prawami cyfrowymi w module Menedżer usług IIS.</String>
-
- <String Id="VistaSP1Required">Produkt [ProductName] wymaga systemu Microsoft Windows Vista z dodatkiem Service Pack 1 lub nowszym.</String>
- <String Id="VistaHomeBasicNotSupported">Produktu [ProductName] nie można zainstalować w systemie Vista Home Basic.</String>
- <String Id="Windows7SP1Required">Produkt [ProductName] wymaga systemu Microsoft Windows 7 z dodatkiem Service Pack 1 lub nowszym.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">Menedżer baz danych usług IIS</String>
- <String Id="DBManagerBasicFeatureName">Menedżer baz danych usług IIS</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Usługa zarządzania siecią Web firmy Microsoft 2</String>
- <String Id="WMSvcBasicFeatureName">Usługa zarządzania siecią Web firmy Microsoft</String>
- <String Id="WMSvcBasicFeatureDescription">Instaluje podstawowe funkcje produktu [ProductName].</String>
- <String Id="WMSvcServiceName">Usługa zarządzania siecią Web firmy Microsoft 2</String>
- <String Id="WMSvcServiceDescription">Usługa zarządzania siecią Web zawiera mechanizmy zarządzania zdalnego i delegowanego, dzięki którym administratorzy mogą skutecznie zarządzać serwerem sieci Web, witrynami i aplikacjami obecnymi na komputerze.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Moduł ponownego zapisywania adresów URL firmy Microsoft w wersji 1.1 dla usług IIS 7</String>
- <String Id="RewriteServicingPatchV1">Aktualizacja Modułu ponownego zapisywania adresów URL firmy Microsoft w wersji 1.1 dla usług IIS 7</String>
- <String Id="RewriteModuleTitleV1">Ponowne zapisywanie adresów URL</String>
- <String Id="RewriteModuleDescriptionV1">Włącza funkcje ponownego zapisywania adresów URL i zawartości w usługach IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Interfejs użytkownika</String>
- <String Id="RewriteModuleUIDescriptionV1">Konfiguruje funkcję Moduł ponownego zapisywania adresów URL w Menedżerze usług IIS.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">Moduł ponownego zapisywania adresów URL usług IIS w wersji 2</String>
- <String Id="RewriteServicingPatch">Aktualizacja modułu ponownego zapisywania adresów URL usług IIS w wersji 2</String>
- <String Id="RewriteModuleTitle">Ponowne zapisywanie adresów URL</String>
- <String Id="RewriteModuleDescription">Włącza funkcje ponownego zapisywania adresów URL i zawartości w usługach IIS 7.</String>
- <String Id="RewriteModuleUITitle">Interfejs użytkownika</String>
- <String Id="RewriteModuleUIDescription">Konfiguruje funkcję Moduł ponownego zapisywania adresów URL w Menedżerze usług IIS.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Pakiet administracyjny dla usług IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Instaluje podstawowe funkcje produktu [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Pakiet administracyjny dla usług IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">Ta wersja systemu operacyjnego jest nieobsługiwana. Produkt [ProductName] można zainstalować tylko w systemie Windows Server 2008 lub Windows Vista z dodatkiem Service Pack 1 lub nowszym.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Funkcje programu ASP.NET</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">Program ASP.NET zawiera funkcje Autoryzacja i Strony błędów, które umożliwiają zarządzanie ustawieniami autoryzacji i błędów niestandardowych.</String>
- <String Id="Authentication" Overridable="yes">Uwierzytelnianie</String>
- <String Id="AuthenticationDescription" Overridable="yes">Opis funkcji Uwierzytelnianie programu ASP.NET.</String>
- <String Id="Authorization" Overridable="yes">Autoryzacja</String>
- <String Id="AuthorizationDescription" Overridable="yes">Funkcja Autoryzacja programu ASP.NET umożliwia konfigurowanie reguł dotyczących autoryzacji użytkowników uzyskujących dostęp do witryn i aplikacji sieci Web.</String>
- <String Id="ErrorPages" Overridable="yes">Strony błędów</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Funkcja Strony błędów programu ASP.NET umożliwia konfigurowanie odpowiedzi na błędy protokołu HTTP, które będą zwracane w przypadku wystąpienia błędów.</String>
- <String Id="Modules" Overridable="yes">Moduły</String>
- <String Id="ModulesDescription" Overridable="yes">Opis funkcji Moduły programu ASP.NET.</String>
- <String Id="Handlers" Overridable="yes">Obsługa</String>
- <String Id="HandlersDescription" Overridable="yes">Opis funkcji Obsługa programu ASP.NET.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Edytor konfiguracji</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Edytor konfiguracji służy do zarządzania plikami konfiguracji w Menedżerze usług IIS, umożliwiając edytowanie sekcji, atrybutów, elementów i kolekcji w plikach konfiguracji.</String>
- <String Id="RequestFiltering" Overridable="yes">Filtrowanie żądań</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Filtrowanie żądań umożliwia konfigurowania reguł filtrowania dla witryny sieci Web oraz ograniczanie zachowania protokołu i zawartości.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">Funkcja FastCGI umożliwia konfigurowanie ustawień puli procesów dla aplikacji FastCGI na serwerze sieci Web.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Dynamiczne ograniczenia adresów IP dla Instalatora usług IIS 7 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[Kreator instalacji wykrył, że wbudowana funkcja Ograniczenia adresów IP i domen usług IIS jest już zainstalowana. Kreator instalacji odinstaluje istniejącą funkcję Ograniczenia adresów IP i domen w celu zainstalowania funkcji Dynamiczne ograniczenia adresów IP. Istniejąca konfiguracja zabezpieczeń protokołu IP zostanie zachowana.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Może to potrwać kilka minut.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Czy chcesz kontynuować?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja Release Candidate </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja Release Candidate 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja Release Candidate 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Dynamiczne ograniczenia adresów IP dla usług IIS 7 — wersja RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Dynamiczne ograniczenia adresów IP dla usług IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Interfejs użytkownika funkcji Dynamiczne ograniczenia adresów IP dla usług IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Dynamiczne ograniczenia adresu IP w usługach IIS 7 — na komputerze znaleziono wersję beta. Odinstaluj ją i spróbuj ponownie</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 dla usług IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Aby można było używać tego produktu, muszą być zainstalowane funkcje CoreWebEngine i W3SVC usług IIS 7.0.</String>
- <String Id="WebDAVFeatureTitleModule">Moduł serwera WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Interfejs użytkownika administracji funkcją WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">Zestaw narzędzi do optymalizacji aparatu wyszukiwania usług IIS w wersji 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">Zestaw narzędzi do optymalizacji aparatu wyszukiwania usług IIS w wersji 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Zestaw narzędzi do optymalizacji aparatu wyszukiwania (SEO) w wersji 1.0</String>
- <String Id="SiteAnalyzerProductComments">Ta baza danych instalatora zawiera logikę i dane wymagane do zainstalowania narzędzia do optymalizacji aparatu wyszukiwania usług IIS w wersji 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Edytor usług IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Raporty usług IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">Analizator dzienników nie jest zainstalowany na tym komputerze; zainstaluj funkcję Analizator dzienników w wersji 2.2 spod adresu http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07, a następnie kontynuuj instalowanie funkcji Raporty usług IIS.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Nie można odnaleźć wstępnie wymaganych pakietów. Uruchom plik setup.exe, aby rozpoznać zależności i zainstalować ten program.</String>
- <String Id="SMONotInstalled" Overridable="yes">Program Microsoft SQL Server 2008 Management Objects jest wstępnie wymaganym składnikiem instalacji Menedżera baz danych usług IIS. Program Microsoft SQL Server 2008 Management Objects można zainstalować spod adresu http://go.microsoft.com/fwlink/?LinkID=150946.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Program Microsoft SQL Server System CLR Types jest wstępnie wymaganym składnikiem instalacji Menedżera baz danych usług IIS. Program Microsoft SQL Server System CLR Types można zainstalować spod adresu http://go.microsoft.com/fwlink/?LinkID=150946.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Zewnętrzna pamięć podręczna firmy Microsoft</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Struktura farmy sieci Web jest wymaganym składnikiem instalacji funkcji Routing żądań aplikacji. Zainstaluj strukturę farmy sieci Web.</String>
- <String Id="Arrv2ProductName">Routing żądań aplikacji firmy Microsoft 2.5</String>
- <String Id="ArrModuleTitle">Wersja wykonawcza</String>
- <String Id="ArrModuleDescription">Dodaje funkcje routingu żądań aplikacji do usług IIS.</String>
- <String Id="ArrUITitle">Interfejs użytkownika</String>
- <String Id="ArrUIDescription">Konfiguruje funkcję routingu żądań aplikacji w module Menedżer usług IIS.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Przystawka środowiska Microsoft Windows PowerShell dla usług IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Instalator platformy Microsoft Web 4.0</String>
- <String Id="WebPIFeatureName">Instalator platformy sieci Web firmy Microsoft</String>
- <String Id="XPSP2Required">Produkt [ProductName] wymaga systemu Windows XP z dodatkiem SP2, Windows 2003 z dodatkiem SP1, Windows Vista lub nowszego.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">Program [ProductName] wymaga systemu Windows XP z dodatkiem Service Pack 3, Windows Server 2003 z dodatkiem Service Pack 2 lub nowszego.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Instalator usług Microsoft Windows Azure</String>
- <String Id="WASIFeatureName">Instalator usług Microsoft Windows Azure</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Menedżer internetowych usług informacyjnych (IIS) 7+</String>
- <String Id="RemoteMgrClientFeatureName">Klient Menedżera usług IIS</String>
- <String Id="RemoteMgrRemotingFeatureName">Obsługa operacji zdalnych</String>
- <String Id="RemoteMgrNotSupported">Ten produkt wymaga systemu Windows XP z dodatkiem SP2, Windows 2003 z dodatkiem SP1, Windows Vista z dodatkiem SP1, Windows 7 lub nowszego</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">Konsola zarządzania usługami IIS nie jest zainstalowana, ale jest wymagana do zarządzania zdalnymi serwerami usług IIS. Zainstaluj Konsolę zarządzania usługami IIS przed zainstalowaniem obsługi operacji zdalnych, klikając polecenia Panel sterowania -&gt; Programy -&gt; Włącz lub wyłącz funkcje systemu Windows i wybierając opcję Konsola zarządzania usługami IIS w funkcji Internetowe usługi informacyjne.</String>
- <String Id="RemoteMgrNotRequired">Ten produkt nie jest wymagany w systemach Windows Server 2008 i Windows Server 2008 R2 ani w nowszych. Zainstaluj Konsolę zarządzania usługami IIS, otwierając Menedżera serwera i wybierając pozycję Konsola zarządzania usługami IIS z usług roli dla roli Serwer sieci Web.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">Publikowanie Menedżera usług IIS dla usług IIS 7.0</String>
- <String Id="PublishingFeatureName">Interfejs użytkownika funkcji Publikowanie</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Zwiększanie gotowości aplikacji w wersji 1.0 dla usług IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">Na tym komputerze znajduje się niezgodny produkt: [CONFLICTING_PRODUCT_NAME]. Nie można kontynuować instalowania produktu [ProductName]. Aby zainstalować ten produkt, usuń produkt [CONFLICTING_PRODUCT_NAME] za pomocą apletu Dodaj/Usuń programy w Panelu sterowania.</String>
- <String Id="AdminRequired" Overridable="yes">Do zainstalowania produktu [ProductName] jest wymagane uprawnienie administratora.</String>
- <String Id="IIS7Only" Overridable="yes">Do używania produktu [ProductName] są wymagane usługi IIS w wersji 7.0.</String>
- <String Id="IIS7OrGreater" Overridable="yes">Do używania produktu [ProductName] są wymagane usługi IIS w wersji 7.0 lub nowsze.</String>
- <String Id="IIS75OrGreater" Overridable="yes">Do używania produktu [ProductName] są wymagane usługi IIS w wersji 7.5 lub nowsze.</String>
- <String Id="IIS7Or75Only" Overridable="yes">Do zainstalowania produktu [ProductName] wymagany jest program IIS 7 lub 7.5.</String>
- <String Id="BetaVersionFound" Overridable="yes">Odnaleziono wersję beta produktu [ProductName] na tym komputerze.</String>
- <String Id="NewerVersionFound" Overridable="yes">Odnaleziono nowszą wersję produktu [ProductName] na tym komputerze.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Instalator nie może kontynuować, ponieważ na tym komputerze jest już zainstalowane inne wystąpienie produktu [ProductName]. Odinstaluj je, a następnie ponownie rozpocznij tę instalację.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Aby można było używać produktu [ProductName], muszą być zainstalowane funkcje CoreWebEngine i W3SVC usług IIS 7.0.</String>
- <String Id="IISManagementConsole" Overridable="yes">Aby można było używać produktu [ProductName], musi być zainstalowana Konsola zarządzania usługami IIS.</String>
- <String Id="WebServicesRunning" Overridable="yes">Przed zainstalowaniem produktu [ProductName] zatrzymaj usługę aktywacji procesów systemu Windows (WAS) i usługę zarządzania siecią Web (WMSvc). Te usługi trzeba będzie uruchomić po zainstalowaniu produktu [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">Do zainstalowania produktu [ProductName] jest wymagana metabaza usług IIS.</String>
- <String Id="LaunchCondition_32BIT">Nie można zainstalować 64-bitowej wersji produktu [ProductName] w 32-bitowej wersji systemu Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">Nie można zainstalować 32-bitowej wersji produktu [ProductName] w 64-bitowej wersji systemu Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">Do zainstalowania produktu [ProductName] jest wymagany program .NET Framework w wersji 2.0 lub nowszy.</String>
- <String Id="NetFX35OrGreaterRequired">Do zainstalowania programu [ProductName] jest potrzebny program Microsoft .NET Framework w wersji 3.5 lub nowszej. Naciśnij przycisk „Dodaj funkcje” w sekcji Menedżer serwera, aby zainstalować program Microsoft .Net w wersji 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">Do zainstalowania programu [ProductName] jest wymagany program Microsoft .NET Framework w wersji 4.0 lub nowszej.</String>
- <String Id="NetFX20SP1IsRequired">Przed zainstalowaniem produktu [ProductName] zainstaluj dodatek Service Pack 1 (lub nowszy) dla programu Microsoft .NET Framework w wersji 2.0.</String>
- <String Id="WindowsUpdateEnabled">Nie można wyłączyć usługi Windows Update (wuauserv), ponieważ jest ona wymagana do zainstalowania produktu [ProductName].</String>
- <String Id="GetFromOSforWin7">Przystawka PowerShell stanowi część systemu operacyjnego Windows. Zainstaluj ją za pomocą menu Programy i funkcje lub narzędzia Menedżer serwera.</String>
- <String Id="WebPI3OrGreaterRequired">Do zainstalowania programu [ProductName] jest wymagany instalator platformy sieci Web firmy Microsoft w wersji 3.0 lub nowszej.</String>
-
- <String Id="Error30001" Overridable="yes">Instalator nie może wykryć konfiguracji udostępnionej.</String>
- <String Id="Error30002" Overridable="yes">Konfiguracja udostępniona jest włączona dla usług IIS. Instalowanie produktu [ProductName] jest nieobsługiwane, gdy jest używana konfiguracja udostępniona. Wyłącz konfigurację udostępnioną przed zainstalowaniem tej funkcji.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Zatrzymaj usługę publikowania w sieci World Wide Web (W3SVC) przed zainstalowaniem produktu [ProductName]. Tę usługę trzeba będzie uruchomić po instalacji. </String>
- <String Id="IISPowershellConsole">Konsola zarządzania środowiskiem IIS PowerShell</String>
- <String Id="IISPowershellSnapin">Przystawka IIS PowerShell</String>
- <String Id="PowerShellRequired">Przystawka IIS PowerShell wymaga zainstalowanego środowiska PowerShell w wersji 1.0 lub 2.0.</String>
- <String Id="WasAndConfigRequired">Przystawka IIS PowerShell wymaga zainstalowanej usługi WAS oraz konfiguracji.</String>
- <String Id="TestBogusString" Overridable="yes">To jest nieprawdziwy ciąg.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Farm Framework 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Farm Agent 2.2</String>
- <String Id="WebFarmBasicFeatureName">Usługa kolektywu serwerów sieci Web</String>
- <String Id="WebFarmBasicFeatureDescription">Usługa kolektywu serwerów sieci Web</String>
- <String Id="WebFarmControllerServiceName">Usługa kontrolera kolektywu serwerów sieci Web</String>
- <String Id="WebFarmControllerServiceDescription">Usługa kontrolera kolektywu serwerów sieci Web</String>
- <String Id="WebFarmAgentServiceName">Usługa agenta kolektywu serwerów sieci Web</String>
- <String Id="WebFarmAgentServiceDescription">Usługa agenta kolektywu serwerów sieci Web</String>
- <String Id="WebPIRequired">Do zainstalowania składnika Web Farm Framework jest wymagany instalator platformy sieci Web. Zainstaluj instalatora platformy sieci Web ze strony http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">Do zainstalowania składnika Web Farm Framework jest wymagane narzędzie Web Deployment. Zainstaluj narzędzie Web Deployment ze strony http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureName">Web Hosting Framework</String>
- <String Id="WebHostingCommonFeatureDescription">Role i funkcje obsługi hostingu sieci Web.</String>
- <String Id="WebHostingFrameworkFeatureName">Hosting Framework</String>
- <String Id="WebHostingFrameworkFeatureDescription">Składnik Hosting Framework udostępnia interfejsy API i polecenia programu PowerShell do zarządzania hostingiem sieci Web.</String>
- <String Id="WebHostingWebRoleFeatureName">Rola sieci Web</String>
- <String Id="WebHostingWebRoleFeatureDescription">Rola sieci Web instaluje usługę Dynamiczna usługa WAS i dostawcę Moduł ponownego zapisywania adresów URL na potrzeby hostingu sieci Web.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Wdraża konfigurację Panelu sterowania zoptymalizowaną pod kątem konfiguracji jednego komputera.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Rola Usługa równoważenia obciążenia</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Rola Usługa równoważenia obciążenia konfiguruje router żądań aplikacji do routingu na podstawie reguł hostingu sieci Web.</String>
- <String Id="WebHostingControllerFeatureName">Kontroler hostingu</String>
- <String Id="WebHostingControllerFeatureDescription">Kontroler hostingu rozszerza funkcje składnika Web Farm Framework 2.0 o współdziałanie z hostingiem sieci Web.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Rola publikowania</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Instaluje obsługę narzędzia Web Deploy i publikowana FTP.</String>
- <String Id="WebHostingPowerShellSnapInDescription">To jest przystawka PowerShell zawierająca aplety poleceń służące do zarządzania infrastrukturą Microsoft Web Hosting.</String>
- <String Id="DWASServiceName">Dynamiczna usługa WAS</String>
- <String Id="DWASServiceDescription">Usługa aktywacji procesów systemu Windows zoptymalizowana pod kątem hostingu sieci Web o dużej gęstości.</String>
- <String Id="MeteringFeatureName">Usługa pomiaru użycia zasobów</String>
- <String Id="MeteringFeatureDescription">Instaluje usługę pomiaru użycia zasobów, która umożliwia gromadzenie i publikowanie informacji na temat środowiska wykonawczego i kondycji.</String>
- <String Id="MeteringServiceName">Miernik zasobów</String>
- <String Id="MeteringServiceDescription">Umożliwia gromadzenie i publikowanie informacji na temat środowiska wykonawczego i kondycji pochodzących z roli sieci Web.</String>
- <String Id="QuotaEnforcementServiceName">Wymuszanie przydziału hostingu</String>
- <String Id="QuotaEnforcementServiceDescription">Monitoruje użycie zasobów witryn sieci Web i w razie przekroczenia przydziału użycia wykonuje akcje niestandardowe.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PTB/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PTB/misc/setupstrings.wxl
deleted file mode 100644
index 4fdfeffca5..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/PTB/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="pt-br" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1046</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Opções de Instalação da Configuração Compartilhada</String>
- <String Id="SharedConfigDlgDescription">Selecionar a opção de instalação na configuração compartilhada do IIS</String>
- <String Id="SharedConfigDlgCheckBox">Atualizar configuração compartilhada na instalação</String>
- <String Id="SharedConfigDlgText">Você está instalando este módulo em um servidor do IIS que usa a configuração compartilhada. Se outros servidores do IIS estiverem usando essa configuração compartilhada, você precisará instalar este módulo em todos os computadores. Para minimizar interrupções de servidores Web individuais, será preciso instalar este módulo de acordo com as seguintes etapas: primeiro, em todos os computadores, com exceção do último, você deverá instalar o módulo sem atualizar a configuração compartilhada. Para isso, não marque a caixa de seleção
- a seguir. Isso instalará todos os binários e arquivos necessários para o módulo em cada computador sem fazer alterações na configuração compartilhada. Em segundo lugar, no último computador, será preciso verificar se a identidade do usuário usada por você na execução tem acesso de leitura e gravação ao arquivo applicationhost.config no compartilhamento UNC. Em seguida, instale o módulo e selecione a opção abaixo de atualização da configuração compartilhada. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Inicializando a ação personalizada do WebConfig</String>
- <String Id="ProgressText_WebConfigUpdate">Atualizando o web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">Registro em Log Avançado do IIS</String>
- <String Id="AdvancedLoggingDescription">Habilita o registro em log avançado dos dados de pipeline do IIS.</String>
- <String Id="AdvancedLoggingUI">Registro em Log Avançado do IIS</String>
- <String Id="AdvancedLoggingUIDescription">Habilita a criação de arquivos de log personalizados com seleção de campo extensível.</String>
- <String Id="AdvancedLoggingUpdate01">Atualização para o Registro em Log Avançado do IIS</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Habilita o IIS Media Services do Transform Manager.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">Habilita a criação de transformações de mídia.</String>
- <String Id="TransformManagerServiceHostName">Host do IIS Transform Manager</String>
- <String Id="TransformManagerServiceHostDescription">Host de serviço de [ProductName].</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">Conversão em lote de arquivos de mídia por demanda para formatos de arquivo e de contêiner alternativos.</String>
- <String Id="TransformManagerEESPTaskInstalled">Um pacote de Tarefa do Expression Encoder SP do IIS Transform Manager 1.0 está instalado no computador. Desinstale-o para que possa instalar o [ProductName].</String>
-
- <String Id="NetFx35Required">O Microsoft .NET Framework 3.5 é exigido para instalar o produto [ProductName]. Use o "Assistente Adicionar Recursos" no Gerenciador do Servidor para instalar os Recursos do .NET Framework 3.5.1 ou use a opção "Ativar ou desativar os recursos do Windows" para ativar o Microsoft .NET Framework 3.5.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">Gerenciamento de Direitos Digitais do IIS</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Habilita o Gerenciamento de Direitos Digitais de apresentações de Smooth Streaming.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">O ASP.NET Não Está Instalado</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Antes de instalar o Auxiliar de Sessão para persistência do estado de sessão do ASP.NET no Web Playlists, você deve instalar o serviço de função do ASP.NET para a função de Servidor Web (IIS) no Gerenciador do Servidor. Para continuar a instalação do Media Services sem o Auxiliar de Sessão do ASP.NET, clique em Voltar e remova o Auxiliar de Sessão da lista de recursos a serem instalados. Caso contrário, clique em Cancelar, instale o serviço de função do ASP.NET no Gerenciador do Servidor e execute a Instalação do IIS Media Services novamente.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[O Web Playlists não pode usar o provedor de persistência de sessão do ASP.NET a menos que o serviço de função do ASP.NET para o Servidor Web (IIS) esteja instalado. Se desejar usar a persistência de sessão do ASP.NET com o Web Playlists, instale o serviço de função do ASP.NET para o Servidor Web (IIS) no Gerenciador do Servidor.
-
-Se não desejar instalar o recurso Auxiliar de Sessão agora, clique em Voltar e cancele a seleção desse recurso.
-
-Se instalar o serviço de função do ASP.NET, será possível alterar os recursos instalados desse produto nos menus Programa e Recursos do Painel de Controle.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">O IIS Smooth Streaming - Beta foi encontrado no computador. Não é possível continuar a instalação do [ProductName]. Para instalar o produto, use Adicionar/Remover Programas no Painel de Controle para remover o IIS Smooth Streaming - Beta.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Uma versão incompatível do IIS Media Services está no computador. Não é possível continuar a instalação do [ProductName]. Para instalar o produto, use Adicionar/Remover Programas no Painel de Controle para remover o IIS Media Services.</String>
- <String Id="NewerMediaServicesVersionFound">Uma versão mais recente do produto já está instalada ou disponível para instalação neste computador. Não é possível continuar a instalação do [ProductName]. Para instalar a versão mais recente do produto, use Adicionar/Remover Programas no Painel de Controle para atualizar o IIS Media Services.</String>
- <String Id="ISXConversionRequiredWarningTitle">Conversão do Arquivo da Lista de Reprodução Necessária</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Esta versão não dá suporte a arquivos de lista de reprodução criados para versões anteriores do Web Playlists. Para criar cópias dessas listas de reprodução que tenham suporte nesta versão do Web Playlists, execute a ferramenta de conversão isxTranslate, disponível em http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Arquivos Antigos do IIS Media Services Encontrados</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[Uma versão anterior de um ou mais recursos do Media Services está instalada. A Instalação do IIS Media Services deve atualizar todos os recursos previamente instalados do Media Services para garantir que os recursos no IIS Media Services funcionem corretamente.
-
-Para atualizar recursos previamente instalados do Media Services para as versões atuais, clique em Avançar. Se não deseja atualizar as versões previamente instaladas desses recursos, clique em Cancelar.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Arquivos do IIS Media Services Beta Encontrados</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[Uma versão Beta de um ou mais recursos do IIS Media Services está instalada no computador. Não é possível continuar a instalação do IIS Media Services.
-
-Para instalar esta versão do IIS Media Services, desinstale os recursos Beta.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Atualização para o IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">Atualização para o IIS Media Services 2.0</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Atualização para o IIS Media Services 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Recursos e ferramentas do IIS Media Services.</String>
- <String Id="MediaServicesBurbankDescription">Recursos e ferramentas do IIS Media Services 5 Premium.</String>
- <String Id="MediaServices40Beta1Title">IIS Media Services 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Media Services 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Web Playlists</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Controla a reprodução no cliente de ativos de mídia referenciados em listas de reprodução.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Auxiliar de Sessão</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Habilita a persistência do estado de sessão do ASP.NET. (Requer o serviço de função do ASP.NET para o Servidor Web (IIS)).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Interface do Usuário</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Configura o recurso Web Playlists no Gerenciador do IIS.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Limitação da Taxa de Bits</String>
- <String Id="MediaServicesFeatureBitrateDescription">Economiza largura de banda limitando a entrega de arquivos baixados por clientes.</String>
- <String Id="MediaServicesFeatureBitrateUI">Interface do Usuário</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Configura o recurso Limitação da Taxa de Bits no Gerenciador do IIS.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Ativos</String>
- <String Id="MediaServicesFeatureSmoothDescription">Habilita o streaming HTTP adaptável de ativos por demanda para clientes.</String>
- <String Id="MediaServicesFeatureSmoothUI">Interface do Usuário</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Configura o recurso Smooth Streaming no Gerenciador do IIS.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Canais</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Habilita o streaming HTTP adaptável de difusões de canais para clientes.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Interface do Usuário</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Configura o recurso Live Smooth Streaming no Gerenciador do IIS.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Gerenciamento de Direitos Digitais</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Fornece criptografia e licenciamento de mídia Smooth Streaming.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Interface do Usuário</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Configura o recurso de Gerenciamento de Direitos Digitais no Gerenciador do IIS.</String>
-
- <String Id="VistaSP1Required">O [ProductName] requer o Microsoft Windows Vista Service Pack 1 ou posterior.</String>
- <String Id="VistaHomeBasicNotSupported">Não é possível instalar o [ProductName] no Vista Home Basic.</String>
- <String Id="Windows7SP1Required">O [ProductName] requer o Microsoft Windows 7 Service Pack 1 ou posterior.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">Gerenciador de Banco de Dados do IIS</String>
- <String Id="DBManagerBasicFeatureName">Gerenciador de Banco de Dados do IIS</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Serviço de Gerenciamento da Web 2 da Microsoft</String>
- <String Id="WMSvcBasicFeatureName">Serviço de Gerenciamento da Web da Microsoft</String>
- <String Id="WMSvcBasicFeatureDescription">Instala os recursos básicos do [ProductName].</String>
- <String Id="WMSvcServiceName">Serviço de Gerenciamento da Web 2 da Microsoft</String>
- <String Id="WMSvcServiceDescription">O Serviço de Gerenciamento da Web habilita recursos de gerenciamento remotos e delegados para que os administradores gerenciem o servidor Web, os sites e os aplicativos presentes neste computador.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Módulo 1.1 de Reescrita de URL da Microsoft para IIS 7</String>
- <String Id="RewriteServicingPatchV1">Atualização do Módulo 1.1 de Reescrita de URL para IIS 7</String>
- <String Id="RewriteModuleTitleV1">Reescrita de URL</String>
- <String Id="RewriteModuleDescriptionV1">Habilita os recursos de reescrita de conteúdo e URL do IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Interface do Usuário</String>
- <String Id="RewriteModuleUIDescriptionV1">Configura o recurso do Módulo de Reescrita de URL no Gerenciador do IIS.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">Módulo 2 de Reescrita de URL do IIS</String>
- <String Id="RewriteServicingPatch">Atualização do Módulo 2 de Reescrita de URL do IIS</String>
- <String Id="RewriteModuleTitle">Reescrita de URL</String>
- <String Id="RewriteModuleDescription">Habilita os recursos de reescrita de conteúdo e URL do IIS 7.</String>
- <String Id="RewriteModuleUITitle">Interface do Usuário</String>
- <String Id="RewriteModuleUIDescription">Configura o recurso do Módulo de Reescrita de URL no Gerenciador do IIS.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Administration Pack para IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Instala os recursos básicos do [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1252</String>
- <String Id="ProductName" Overridable="yes">Administration Pack para IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">Não há suporte a esta versão do sistema operacional. Só é possível instalar o [ProductName] no Windows Server 2008 ou no Windows Vista Service Pack 1 ou posterior.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Recursos do ASP.Net</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">O ASP.NET inclui os recursos Páginas de Erro e Autorização, que permitem o gerenciamento das configurações de erro personalizadas e de autorizações.</String>
- <String Id="Authentication" Overridable="yes">Autenticação</String>
- <String Id="AuthenticationDescription" Overridable="yes">Descrição da Autenticação do ASP.Net.</String>
- <String Id="Authorization" Overridable="yes">Autorização</String>
- <String Id="AuthorizationDescription" Overridable="yes">A Autorização do ASP.NET permite a configuração de regras para autorizar usuários a acessar seus sites e aplicativos.</String>
- <String Id="ErrorPages" Overridable="yes">Páginas de Erro</String>
- <String Id="ErrorPagesDescription" Overridable="yes">As Páginas de Erro do ASP.NET permitem a configuração de respostas de erro de HTTP retornadas quando um erro ocorre.</String>
- <String Id="Modules" Overridable="yes">Módulos</String>
- <String Id="ModulesDescription" Overridable="yes">Descrição dos Módulos do ASP.Net.</String>
- <String Id="Handlers" Overridable="yes">Manipuladores</String>
- <String Id="HandlersDescription" Overridable="yes">Descrição dos Manipuladores do ASP.Net.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Editor de Configurações</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">O Editor de Configurações permite o gerenciamento de arquivos de configuração no Gerenciador do IIS por meio da edição de seções, atributos, elementos e coleções nos arquivos de configuração.</String>
- <String Id="RequestFiltering" Overridable="yes">Filtragem de Solicitações</String>
- <String Id="RequestFilteringDescription" Overridable="yes">A Filtragem de Solicitações permite a configuração de regras de filtragem para o seu site, protocolo restrito e comportamento de conteúdo.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">O FastCGI permite a definição de configurações do pool de processos para os aplicativos FastCGI no servidor Web.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Instalação de Restrições de IP Dinâmico para IIS 7 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[O assistente de instalação detectou que já foram instaladas Restrições internas de Domínio e IP do IIS. O assistente de instalação desinstalará as Restrições de Domínio e IP existentes para instalar as Restrições de IP Dinâmico. A configuração de segurança do IP existente será preservada.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Isso pode demorar alguns minutos.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Deseja continuar?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Restrições de IP Dinâmico para IIS 7 - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Restrições de IP Dinâmico para IIS 7 - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Restrições de IP Dinâmico para IIS 7 - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Restrições de IP Dinâmico para IIS 7 - Versão Release Candidate </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Restrições de IP Dinâmico para IIS 7 - Versão Release Candidate 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Restrições de IP Dinâmico para IIS 7 - Versão Release Candidate 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Restrições de IP Dinâmico para IIS 7 - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Restrições de IP Dinâmico para IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Interface do Usuário de Restrições de IP Dinâmico para IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Restrições de IP Dinâmico para IIS 7 - Beta encontradas neste computador. Desinstale-as e tente novamente</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 para IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Os recursos CoreWebEngine e W3SVC do IIS 7.0 devem ser instalados para usar este produto.</String>
- <String Id="WebDAVFeatureTitleModule">Módulo do Servidor WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Interface do Usuário de Administração do WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">Toolkit de Otimização do Mecanismo de Pesquisa do IIS 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">Toolkit de Otimização do Mecanismo de Pesquisa do IIS 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Toolkit de SEO (Otimização do Mecanismo de Pesquisa) 1.0</String>
- <String Id="SiteAnalyzerProductComments">Este banco de dados de instalador contém a lógica e os dados necessários para instalar o Kit de Ferramentas de Otimização do Mecanismo de Pesquisa do IIS 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Editor do IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Relatórios do IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">O Analisador de Log não foi instalado neste computador. Instale o Analisador de Log 2.2 de http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 e continue a instalação dos Relatórios do IIS</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Os pacotes de pré-requisito não foram encontrados. Execute setup.exe para resolver as dependências e instalar o programa.</String>
- <String Id="SMONotInstalled" Overridable="yes">O Microsoft SQL Server 2008 Management Objects é um pré-requisito para a instalação do Gerenciador de Banco de Dados do IIS. É possível instalar o Microsoft SQL Server 2008 Management Objects de http://go.microsoft.com/fwlink/?LinkID=150946.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Os Microsoft SQL Server System CLR Types são um pré-requisito para a instalação do Gerenciador de Banco de Dados do IIS. É possível instalar os Microsoft SQL Server System CLR Types de http://go.microsoft.com/fwlink/?LinkID=150949.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">O Web Farm Framework é um requisito para a instalação do Application Request Routing. Instale o Web Farm Framework.</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">Tempo de Execução</String>
- <String Id="ArrModuleDescription">Adiciona os recursos de Roteamento de Solicitações de Aplicativo no IIS.</String>
- <String Id="ArrUITitle">Interface do Usuário</String>
- <String Id="ArrUIDescription">Configura o recurso de Roteamento de Solicitações de Aplicativo no Gerenciador do IIS.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Snap-in do Microsoft Windows PowerShell para o IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft Web Platform Installer 4.0</String>
- <String Id="WebPIFeatureName">Microsoft Web Platform Installer</String>
- <String Id="XPSP2Required">O [ProductName] requer o Windows XP SP2, o Windows 2003 SP1, o Windows Vista ou posterior.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">O [ProductName] exige o Windows XP Service Pack 3, o Windows Server 2003 Service Pack 2 ou versão posterior.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Instalador de Serviços do Microsoft Windows Azure</String>
- <String Id="WASIFeatureName">Instalador de Serviços do Microsoft Windows Azure</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Gerenciador do IIS (Serviços de Informações da Internet) 7+</String>
- <String Id="RemoteMgrClientFeatureName">Cliente do Gerenciador do IIS</String>
- <String Id="RemoteMgrRemotingFeatureName">Suporte Remoto</String>
- <String Id="RemoteMgrNotSupported">Este produto requer o Windows XP SP2, o Windows 2003 SP1, o Windows Vista SP1, o Windows 7 ou mais recente</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">O Console de Gerenciamento do IIS não foi instalado, mas é necessário para o gerenciamento de servidores remotos do IIS. Para instalar o Console de Gerenciamento do IIS antes de instalar o suporte de gerenciamento remoto, abra o 'Painel de Controle-&gt;Programas-&gt;Ativar ou Desativar Recursos do Windows' e selecione o Console de Gerenciamento do IIS no recurso Serviços de Informações da Internet.</String>
- <String Id="RemoteMgrNotRequired">Este produto não é necessário no Windows Server 2008 ou no Windows Server 2008 R2 ou mais recente. Para instalar o Console de Gerenciamento do IIS, abra o Gerenciador do Servidor e selecione o Console de Gerenciamento do IIS em Serviços de Função para a Função de Servidor Web.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS Manager Publishing para IIS 7.0</String>
- <String Id="PublishingFeatureName">Interface do Usuário de Publicação</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 para IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">Este computador contém um produto incompatível, [CONFLICTING_PRODUCT_NAME]. A instalação do [ProductName] não pode continuar. Para instalar esse produto, use Adicionar/Remover Programas no Painel de Controle para remover o [CONFLICTING_PRODUCT_NAME].</String>
- <String Id="AdminRequired" Overridable="yes">São necessários privilégios de Administrador para instalar o [ProductName].</String>
- <String Id="IIS7Only" Overridable="yes">É necessário o IIS Versão 7.0 para usar o [ProductName].</String>
- <String Id="IIS7OrGreater" Overridable="yes">É necessário o IIS Versão 7.0 ou posterior para instalar o [ProductName].</String>
- <String Id="IIS75OrGreater" Overridable="yes">É necessário o IIS Versão 7.5 ou posterior para instalar o [ProductName].</String>
- <String Id="IIS7Or75Only" Overridable="yes">É necessário o IIS versão 7 ou 7.5 para instalar o [ProductName].</String>
- <String Id="BetaVersionFound" Overridable="yes">A versão beta do [ProductName] foi encontrada no computador.</String>
- <String Id="NewerVersionFound" Overridable="yes">Uma versão mais recente do [ProductName] foi encontrada no computador.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Não é possível continuar a instalação, pois outra instância do [ProductName] já está instalada no computador. Desinstale a versão antiga e reinicie a instalação.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Os recursos CoreWebEngine e W3SVC do IIS 7.0 devem estar instalados para usar o [ProductName].</String>
- <String Id="IISManagementConsole" Overridable="yes">O Console de Gerenciamento do IIS deve estar instalado para usar o [ProductName].</String>
- <String Id="WebServicesRunning" Overridable="yes">Interrompa o WAS (Serviço de Ativação de Processos do Windows) e o WMSvc (Serviço de Gerenciamento da Web) antes de instalar o [ProductName]. Será necessário instalar os serviços após a instalação do [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">É necessária a Metabase do IIS para instalar o [ProductName].</String>
- <String Id="LaunchCondition_32BIT">Não é possível instalar a versão de 64 bits do [ProductName] em uma edição de 32 bits do Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">Não é possível instalar a versão de 32 bits do [ProductName] em uma edição de 64 bits do Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">É necessário o Microsoft .NET Framework Versão 2.0 ou posterior para instalar o [ProductName].</String>
- <String Id="NetFX35OrGreaterRequired">O Microsoft .NET Framework Versão 3.5 ou posterior é necessário para instalar o [ProductName]. Use 'Adicionar Recursos' no Gerenciador do Servidor para instalar o Microsoft .Net Versão 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">O Microsoft .NET Framework Versão 4.0 ou posterior é necessário para instalar o [ProductName].</String>
- <String Id="NetFX20SP1IsRequired">Instale o Microsoft .NET Framework Service Pack 1 Versão 2.0, ou um service pack posterior, antes de instalar o [ProductName].</String>
- <String Id="WindowsUpdateEnabled">Não é possível desabilitar o serviço Windows Update (wuauserv), pois ele é necessário para instalar o [ProductName].</String>
- <String Id="GetFromOSforWin7">O snap-in do PowerShell é parte o Sistema Operacional Windows. Instale o snap-in por meio dos 'Programas e Recursos' ou 'Gerenciador do Servidor'.</String>
- <String Id="WebPI3OrGreaterRequired">O Microsoft Web Platform Installer Versão 3.0 ou posterior é necessário para instalar o [ProductName].</String>
-
- <String Id="Error30001" Overridable="yes">A instalação não detectou configurações compartilhadas.</String>
- <String Id="Error30002" Overridable="yes">A configuração compartilhada está habilitada para o IIS. Não há suporte à instalação do [ProductName] quando é usada uma configuração compartilhada. Desabilite a configuração compartilhada antes de instalar este recurso.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Interrompa o Serviço de Publicação na World Wide Web (W3SVC) antes de instalar o [ProductName]. Será necessário iniciar o serviço após a instalação. </String>
- <String Id="IISPowershellConsole">Console de Gerenciamento do PowerShell do IIS</String>
- <String Id="IISPowershellSnapin">Snap-in do PowerShell do IIS</String>
- <String Id="PowerShellRequired">O snap-in do PowerShell do IIS requer o PowerShell versão 1.0 ou 2.0 instalado</String>
- <String Id="WasAndConfigRequired">O snap-in do PowerShell do IIS requer WAS e configuração instalados</String>
- <String Id="TestBogusString" Overridable="yes">Cadeia de caracteres inválida.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Estrutura do Microsoft Web Farm Versão 2.2</String>
- <String Id="WebFarmAgentProductName">Agente do Microsoft Web Farm Versão 2.2</String>
- <String Id="WebFarmBasicFeatureName">Serviço de Web Farm</String>
- <String Id="WebFarmBasicFeatureDescription">Serviço de Web Farm</String>
- <String Id="WebFarmControllerServiceName">Serviço Controlador de Web Farm</String>
- <String Id="WebFarmControllerServiceDescription">Serviço Controlador de Web Farm</String>
- <String Id="WebFarmAgentServiceName">Serviço de Agente de Web Farm</String>
- <String Id="WebFarmAgentServiceDescription">Serviço de Agente de Web Farm</String>
- <String Id="WebPIRequired">O Web Plaform Installer é um pré-requisito para instalar a Estrutura do Web Farm. Instale o Web Plaform Installer a partir de http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">A Ferramenta de Implantação da Web é um pré-requisito para instalar a Estrutura do Web Farm. Instale a Ferramenta de Implantação da Web a partir de http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Estrutura de Hospedagem na Web da Microsoft</String>
- <String Id="WebHostingCommonFeatureName">Estrutura de Hospedagem na Web</String>
- <String Id="WebHostingCommonFeatureDescription">Funções e recursos de Hospedagem na Web.</String>
- <String Id="WebHostingFrameworkFeatureName">Estrutura de Hospedagem</String>
- <String Id="WebHostingFrameworkFeatureDescription">A Estrutura de Hospedagem oferece comandos de API e PowerShell para gerenciamento de Hospedagem na Web.</String>
- <String Id="WebHostingWebRoleFeatureName">Função da Web</String>
- <String Id="WebHostingWebRoleFeatureDescription">A Função Web instala o serviço WAS Dinâmico e o provedor de Reescrita de URL de Hospedagem na Web.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Implanta uma configuração do Painel de Controle otimizada para configuração de máquina única.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Função do Balanceador de Carga</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">A Função do Balanceador de Carga configura o Roteador de Solicitação de Aplicativo para rotear com base nas regras de Hospedagem na Web.</String>
- <String Id="WebHostingControllerFeatureName">Controlador de Hospedagem</String>
- <String Id="WebHostingControllerFeatureDescription">O Controlador de Hospedagem estende a Estrutura do Web Farm 2.0 para trabalhar com Hospedagem na Web.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Função de Publicação</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Instala suporte para Implantação da Web e publicação em FTP.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Este é um snap-in do PowerShellque contém cmdlets para gerenciar a infraestrutura de Hospedagem na Web da Microsoft.</String>
- <String Id="DWASServiceName">Serviço WAS Dinâmico</String>
- <String Id="DWASServiceDescription">Serviço de Ativação de Processos do Windows otimizado para Hospedagem na Web de alta densidade.</String>
- <String Id="MeteringFeatureName">Serviço de Medição de Recursos</String>
- <String Id="MeteringFeatureDescription">Instala o serviço de Medição de Recursos que habilita a coleta e a publicação de informações de integridade e tempo de execução.</String>
- <String Id="MeteringServiceName">Medição de Recursos</String>
- <String Id="MeteringServiceDescription">Habilita a coleta e a publicação de informações de tempo de execução e integridade a partir da Função Web.</String>
- <String Id="QuotaEnforcementServiceName">Imposição de Cota de Hospedagem</String>
- <String Id="QuotaEnforcementServiceDescription">Monitora o uso de recursos de sites e executa ações personalizadas quando a cota de uso é excedida.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/RUS/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/RUS/misc/setupstrings.wxl
deleted file mode 100644
index e9613c04ec..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/RUS/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="ru-ru" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1049</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Параметры установки общей конфигурации</String>
- <String Id="SharedConfigDlgDescription">Выбор параметров установки общей конфигурации IIS</String>
- <String Id="SharedConfigDlgCheckBox">Обновить общую конфигурацию при установке</String>
- <String Id="SharedConfigDlgText">Вы устанавливаете этот модуль на сервер IIS, использующий общую конфигурацию. Если дополнительные серверы IIS используют эту общую конфигурацию, вам необходимо установить этот модуль на все эти компьютеры. Чтобы минимизировать нарушение работы отдельных веб-серверов, вам потребуется устанавливать этот модуль в соответствии с шагами, описанными ниже. Сначала следует установить модуль на все компьютеры, кроме последнего, не обновляя при этом общую конфигурацию. Для этого не устанавливайте флажок ниже.
-При этом на каждый компьютер будут установлены все файлы, необходимые для модуля, но не будет изменена общая конфигурация. Затем на последнем компьютере следует убедиться в том, что у используемой для работы учетной записи есть права чтения и записи файла applicationhost.config, расположенного на общем ресурсе UNC. Затем следует установить модуль и установить флажок "Обновить общую конфигурацию" ниже. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">Инициализируется настраиваемое действие WebConfig</String>
- <String Id="ProgressText_WebConfigUpdate">Обновляется файл web.config</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">Расширенное ведение журнала IIS</String>
- <String Id="AdvancedLoggingDescription">Обеспечивает расширенные возможности ведения журнала данных конвейера IIS.</String>
- <String Id="AdvancedLoggingUI">Расширенное ведение журнала IIS</String>
- <String Id="AdvancedLoggingUIDescription">Позволяет создавать настраиваемые файлы журналов с расширяемым набором полей.</String>
- <String Id="AdvancedLoggingUpdate01">Обновление для расширенного ведения журнала</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Transform Manager</String>
- <String Id="TransformManagerRelease">Бета-версия</String>
- <String Id="TransformManagerDescription">Включает диспетчер Transform Manager IIS Media Services.</String>
- <String Id="TransformManagerUI">IIS Transform Manager</String>
- <String Id="TransformManagerUIDescription">Включает создание преобразований мультимедиа.</String>
- <String Id="TransformManagerServiceHostName">Узел диспетчера IIS Transform Manager</String>
- <String Id="TransformManagerServiceHostDescription">Узел службы для [ProductName].</String>
- <String Id="TransformManagerShortcutName">IIS Transform Manager</String>
- <String Id="TransformManagerShortcutTooltip">Пакетное преобразование файлов мультимедиа в альтернативные форматы файлов и контейнеров по запросу.</String>
- <String Id="TransformManagerEESPTaskInstalled">На компьютере установлен пакет задач IIS Transform Manager 1.0 Expression Encoder SP. Его следует удалить перед установкой [ProductName].</String>
-
- <String Id="NetFx35Required">Microsoft .NET Framework 3.5 требуется для установки [ProductName]. Используйте мастер добавления компонентов в диспетчере сервера, чтобы установить компоненты .NET Framework 3.5.1, или используйте параметр "Включение или отключение компонентов Windows", чтобы включить Microsoft .NET Framework 3.5.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS: управление цифровыми правами</String>
- <String Id="DigitalRightsManagementRelease">Бета-версия</String>
- <String Id="DigitalRightsManagementDescription">Включает управление цифровыми правами для презентаций Smooth Streaming.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET не установлен</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Перед установкой модуля поддержки сеансов для сохранения состояния сеансов ASP.NET в веб-списках воспроизведения нужно установить службу роли ASP.NET для роли веб-сервера (IIS) в диспетчере сервера. Чтобы продолжить установку служб мультимедиа без модуля поддержки сеансов для ASP.NET, нажмите кнопку "Назад" и удалите модуль поддержки сеансов из списка устанавливаемых компонентов. В противном случае нажмите кнопку "Отмена", установите службу роли ASP.NET в диспетчере сервера, а затем снова запустите программу установки служб мультимедиа IIS.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Веб-списки воспроизведения не могут использовать поставщика сохранения сеансов ASP.NET, если не установлена служба роли ASP.NET для роли веб-сервера (IIS). Если нужно использовать сохранение сеансов ASP.NET в веб-списках воспроизведения, установите службу роли ASP.NET в диспетчере сервера.
-
-Если модуль поддержки сеансов не нужно устанавливать сейчас, нажмите кнопку "Назад" и отмените выбор этого компонента.
-
-После установки службы роли ASP.NET набор установленных компонентов продукта можно изменить с помощью элемента панели управления "Программы и компоненты".]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">На компьютере обнаружена бета-версия IIS Smooth Streaming. Установка [ProductName] не будет продолжена. Чтобы установить этот продукт, используйте компонент "Установка и удаление программ" панели управления для удаления бета-версии IIS Smooth Streaming.</String>
- <String Id="IncompatibleMediaServicesVersionFound">На компьютере имеется несовместимая версия служб IIS Media Services. Установка [ProductName] не будет продолжена. Чтобы установить этот продукт, используйте компонент "Установка и удаление программ" панели управления для удаления служб IIS Media Services.</String>
- <String Id="NewerMediaServicesVersionFound">Более новая версия этого продукта уже установлена или доступна для установки на этом компьютере. Установка [ProductName] не будет продолжена. Чтобы установить более новую версию этой программы, используйте элемент панели управления "Установка и удаление программ" для обновления служб мультимедиа IIS.</String>
- <String Id="ISXConversionRequiredWarningTitle">Необходимо преобразовать файл списка воспроизведения</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Файлы списков воспроизведения, созданные для предыдущих версий веб-списков воспроизведения, не поддерживаются в этой версии. Чтобы создать копии этих списков воспроизведения, поддерживающиеся в данной версии веб-списков воспроизведения, запустите программу преобразования isxTranslate, доступную по адресу http://go.microsoft.com/fwlink/?LinkId=127838.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Обнаружены старые файлы служб IIS Media</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[На этом компьютере установлена более ранняя версия одного или нескольких компонентов служб Media Services. Программа установки служб IIS Media Services должна обновить все ранее установленные компоненты, чтобы обеспечить их правильную работу.
-
-Чтобы обновить ранее установленные компоненты служб Media Services до текущих версий, нажмите кнопку "Далее". Если не нужно обновлять ранее установленные версии этих компонентов, нажмите кнопку "Отмена".]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Обнаружены старые файлы бета-версии служб IIS Media</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[На компьютере установлены бета-версии одного или нескольких компонентов служб IIS Media Services. Продолжение работы программы установки служб IIS Media Services невозможно.
-
-Чтобы установить данную версию служб IIS Media Services, необходимо удалить бета-версии компонентов.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Media Pack 1.0</String>
- <String Id="MediaPack10Update">Обновление для IIS Media Pack 1.0</String>
- <String Id="MediaServices20Title">IIS Media Services 2.0</String>
- <String Id="MediaServices20Update">Обновление для IIS Media Services 2.0</String>
- <String Id="MediaServices30Title">IIS Media Services 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Media Services 3.0 TAP 2</String>
- <String Id="MediaServices30Update">Обновление для IIS Media Services 3.0</String>
- <String Id="MediaServicesIISMediaDescription">Средства и компоненты IIS Media Services.</String>
- <String Id="MediaServicesBurbankDescription">Средства и компоненты IIS Media Services 5 Premium.</String>
- <String Id="MediaServices40Beta1Title">Бета-версия 1 служб IIS Media Services 4.0</String>
- <String Id="MediaServices40Title">Службы IIS Media Services 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">Бета-версия 1 служб IIS Media Services 4.5</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Веб-списки воспроизведения</String>
- <String Id="MediaServicesFeaturePlaylistDescription">Управляет воспроизведением клиентами данных мультимедиа, на которые есть ссылки в списках воспроизведения.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Модуль поддержки сеансов</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">Поддерживает сохранение сеансов ASP.NET. (Требуется служба роли ASP.NET ля веб-сервера (IIS)).</String>
- <String Id="MediaServicesFeaturePlaylistUI">Пользовательский интерфейс</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">Настройка компонента веб-списков воспроизведения в диспетчере IIS.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Регулирование скорости</String>
- <String Id="MediaServicesFeatureBitrateDescription">Экономия полосы пропускания путем регулирования доставки файлов, загружаемых клиентами.</String>
- <String Id="MediaServicesFeatureBitrateUI">Пользовательский интерфейс</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">Настройка функции регулирования скорости в диспетчере IIS.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Файлы</String>
- <String Id="MediaServicesFeatureSmoothDescription">Поддерживает адаптивную потоковую передачу файлов по запросу клиентам.</String>
- <String Id="MediaServicesFeatureSmoothUI">Пользовательский интерфейс</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">Настройка Smooth Streaming в диспетчере IIS.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Каналы</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Поддерживает адаптивную потоковую передачу при канальной широковещательной трансляции клиентам.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Пользовательский интерфейс</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">Настраивает компонент Live Smooth Streaming в диспетчере IIS.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Управление цифровыми правами</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Обеспечивает шифрование и лицензирование содержимого Smooth Streaming.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Пользовательский интерфейс</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">Настройка функции управления цифровыми правами в диспетчере IIS.</String>
-
- <String Id="VistaSP1Required">Для [ProductName] требуется Microsoft Windows Vista с пакетом обновления 1 (SP1) или более поздней версии.</String>
- <String Id="VistaHomeBasicNotSupported">Невозможно установить [ProductName] в операционной системе Vista Home Basic.</String>
- <String Id="Windows7SP1Required">Для [ProductName] требуется Microsoft Windows 7 с пакетом обновления 1 (SP1) или более поздней версии.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">Диспетчер баз данных IIS</String>
- <String Id="DBManagerBasicFeatureName">Диспетчер баз данных IIS</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Служба веб-управления 2 (Майкрософт)</String>
- <String Id="WMSvcBasicFeatureName">Служба веб-управления (Майкрософт)</String>
- <String Id="WMSvcBasicFeatureDescription">Установка основных компонентов [ProductName].</String>
- <String Id="WMSvcServiceName">Служба веб-управления 2 (Майкрософт)</String>
- <String Id="WMSvcServiceDescription">Служба управления сетью предоставляет для администраторов удаленные и делегированные возможности управления веб-сервером, сайтами и приложениями, существующими на данном компьютере.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">Модуль 1.1 видоизменения URL-адресов (Майкрософт) для IIS 7</String>
- <String Id="RewriteServicingPatchV1">Обновление для модуля 1.1 видоизменения URL-адресов для IIS 7</String>
- <String Id="RewriteModuleTitleV1">Видоизменение URL-адресов</String>
- <String Id="RewriteModuleDescriptionV1">Включает функции, отвечающие за видоизменение URL-адресов и содержимого в IIS 7.</String>
- <String Id="RewriteModuleUITitleV1">Пользовательский интерфейс</String>
- <String Id="RewriteModuleUIDescriptionV1">Настраивает компонент "модуль видоизменения URL-адресов" в диспетчере служб IIS.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">Модуль переопределения URL-адресов 2 для IIS</String>
- <String Id="RewriteServicingPatch">Обновление для модуля 2 переопределения URL-адресов для IIS</String>
- <String Id="RewriteModuleTitle">Видоизменение URL-адресов</String>
- <String Id="RewriteModuleDescription">Включает функции, отвечающие за видоизменение URL-адресов и содержимого в IIS 7.</String>
- <String Id="RewriteModuleUITitle">Пользовательский интерфейс</String>
- <String Id="RewriteModuleUIDescription">Настраивает компонент "модуль видоизменения URL-адресов" в диспетчере служб IIS.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">Пакет администрирования IIS 7.0</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">Установка основных компонентов [ProductName].</String>
- <String Id="SummaryCodepage" Overridable="yes">1251</String>
- <String Id="ProductName" Overridable="yes">Пакет администрирования IIS 7.0</String>
- <String Id="Manufacturer" Overridable="yes">Корпорация Майкрософт</String>
- <String Id="OsNotSupported" Overridable="yes">Эта версия операционной системы не поддерживается. [ProductName] можно установить только в Windows Server 2008 или Windows Vista с пакетом обновления 1 (SP1) или более поздних версий.</String>
- <String Id="ASPNETFeatures" Overridable="yes">Компоненты ASP.Net</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">В ASP.NET содержатся компоненты авторизации и страниц ошибок, позволяющие управлять параметрами авторизации и настраиваемых сообщений об ошибках.</String>
- <String Id="Authentication" Overridable="yes">Проверка подлинности</String>
- <String Id="AuthenticationDescription" Overridable="yes">Описание проверки подлинности ASP.Net.</String>
- <String Id="Authorization" Overridable="yes">Авторизация</String>
- <String Id="AuthorizationDescription" Overridable="yes">Модуль проверки подлинности ASP.NET позволяет настраивать правила проверки подлинности пользователей для доступа к веб-сайтам и приложениям.</String>
- <String Id="ErrorPages" Overridable="yes">Страницы ошибок</String>
- <String Id="ErrorPagesDescription" Overridable="yes">Страницы ошибок ASP.NET позволяют настраивать отклики на ошибки HTTP, отображаемые при возникновении таких ошибок.</String>
- <String Id="Modules" Overridable="yes">Модули</String>
- <String Id="ModulesDescription" Overridable="yes">Описание модулей ASP.Net.</String>
- <String Id="Handlers" Overridable="yes">Обработчики</String>
- <String Id="HandlersDescription" Overridable="yes">Описание обработчиков ASP.Net.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Редактор конфигураций</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Редактор конфигурации позволяет управлять файлами конфигурации в диспетчере IIS, обеспечивая возможность изменять разделы, атрибуты, элементы и семейства в файлах конфигурации.</String>
- <String Id="RequestFiltering" Overridable="yes">Фильтрация запросов</String>
- <String Id="RequestFilteringDescription" Overridable="yes">Фильтрация запросов позволяет настраивать правила фильтрации для веб-сайта, ограничивать поведение протоколов и содержимого.</String>
- <String Id="FastCgi" Overridable="yes">Fast CGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI позволяет настраивать параметры пула процессов для приложений FastCGI на веб-сервере.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> Программа установки ограничения динамических IP-адресов для IIS 7 </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[Мастер установки обнаружил, что встроенные ограничения IP-адресов и доменов IIS уже установлены. Мастер установки удалит существующие ограничения IP-адресов и доменов, чтобы установить динамические ограничения IP-адресов. Существующая конфигурация IP-безопасности будет сохранена.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Это может занять несколько минут.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Продолжить?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">Ограничения динамических IP-адресов для IIS 7 - бета-версия </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">Ограничения динамических IP-адресов для IIS 7 - бета-версия 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">Ограничения динамических IP-адресов для IIS 7 - бета-версия 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">Ограничения динамических IP-адресов для IIS 7 - версия-кандидат </String>
- <String Id="DynamicIPRestrictionProductNameRC2">Ограничения динамических IP-адресов для IIS 7 - версия-кандидат 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">Ограничения динамических IP-адресов для IIS 7 - версия-кандидат 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">Ограничения динамических IP-адресов для IIS 7 - рабочий выпуск </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">Ограничения динамических IP-адресов для IIS 7</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">Пользовательский интерфейс ограничения динамических IP-адресов для IIS 7</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Ограничения динамического IP-адреса для IIS 7 - на компьютере обнаружена бета-версия. Удалите ее и повторите попытку</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">WebDAV 7.5 для IIS 7.0</String>
- <String Id="CoreWebEngineMustBeInstalled">Для использования этого продукта необходимо установить компоненты IIS 7.0 CoreWebEngine и W3SVC.</String>
- <String Id="WebDAVFeatureTitleModule">Серверный модуль WebDAV</String>
- <String Id="WebDAVFeatureTitleUI">Пользовательский интерфейс администрирования WebDAV</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">Инструменты оптимизации IIS Search Engine 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">Инструменты оптимизации IIS Search Engine 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Инструменты оптимизации Search Engine (SEO) 1.0</String>
- <String Id="SiteAnalyzerProductComments">Эта база данных установщика содержит логику и данные, необходимые для установки инструментов оптимизации IIS Search Engine 1.0.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">Редактор IIS</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">Отчеты IIS</String>
- <String Id="LogParserInstalled" Overridable="yes">Программа Log Parser не установлена на этом компьютере. Установите программу Log Parser 2.2 с сайта http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07, затем установите отчеты IIS.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Необходимые компоненты не найдены. Запустите setup.exe, чтобы установить необходимые зависимые компоненты и установить эту программу.</String>
- <String Id="SMONotInstalled" Overridable="yes">Управляющие объекты Microsoft SQL Server 2008 являются необходимым условием для установки диспетчера базы данных IIS. Управляющие объекты Micrsoft SQL Server 2008 можно установить на странице http://go.microsoft.com/fwlink/?LinkID=150946.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Системные типы Microsoft SQL Server System CLR Types являются необходимым условием для установки диспетчера базы данных IIS. Системные типы Microsoft SQL Server System CLR Types можно установить на странице http://go.microsoft.com/fwlink/?LinkID=150949.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Farm Framework</String>
- <String Id="ECacheProductName">Microsoft External Cache</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Для установки маршрутизации запросов приложений требуется установить платформу веб-фермы. Установите платформу веб-фермы.</String>
- <String Id="Arrv2ProductName">Microsoft Application Request Routing 2.5</String>
- <String Id="ArrModuleTitle">Среда выполнения</String>
- <String Id="ArrModuleDescription">Добавляет функции маршрутизации запросов приложений в IIS.</String>
- <String Id="ArrUITitle">Пользовательский интерфейс</String>
- <String Id="ArrUIDescription">Настраивает функцию маршрутизации запросов приложений в диспетчере IIS.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">Оснастка Microsoft Windows PowerShell для IIS 7.0</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Установщик веб-платформы Майкрософт 4.0</String>
- <String Id="WebPIFeatureName">Установщик веб-платформы Майкрософт</String>
- <String Id="XPSP2Required">Для [ProductName] требуется Windows XP SP2, Windows 2003 SP1, Windows Vista или более поздняя версия.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">Для [ProductName] требуется Windows XP с пакетом обновления 3, Windows Server 2003 с пакетом обновления 2, или более поздние версии.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Установщик служб Microsoft Windows Azure</String>
- <String Id="WASIFeatureName">Установщик служб Microsoft Windows Azure</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Диспетчер служб IIS 7+</String>
- <String Id="RemoteMgrClientFeatureName">Клиент диспетчера IIS</String>
- <String Id="RemoteMgrRemotingFeatureName">Поддержка удаленной работы</String>
- <String Id="RemoteMgrNotSupported">Для этого продукта требуется Windows XP с пакетом обновления 2 (SP2), Windows 2003 с пакетом обновления 1 (SP1), Windows Vista с пакетом обновления 1 (SP1), Windows 7 или более новая система</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">Консоль управления IIS не установлена, но она необходима для управления удаленными серверами IIS. Установите консоль управления IIS перед установкой поддержки удаленного управления. Для этого в панели управления откройте "Программы", "Включение или отключение компонентов Windows", и выберите консоль управления IIS среди компонентов IIS.</String>
- <String Id="RemoteMgrNotRequired">Этот продукт не требуется при использовании Windows Server 2008, Windows Server 2008 R2 и более новых систем. Установите консоль управления IIS, открыв диспетчер сервера и выбрав консоль управления IIS в службах ролей для роли веб-сервера.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">Публикация диспетчера IIS 7.0</String>
- <String Id="PublishingFeatureName">Пользовательский интерфейс публикации</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">Application Warm-Up 1.0 для IIS 7.5</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">На компьютере установлен несовместимый продукт: [CONFLICTING_PRODUCT_NAME]. Установку [ProductName] продолжить невозможно. Чтобы установить этот продукт, удалите CONFLICTING_PRODUCT_NAME] в разделе "Добавление и удаление программ" в панели управления.</String>
- <String Id="AdminRequired" Overridable="yes">Для установки [ProductName] требуются права администратора.</String>
- <String Id="IIS7Only" Overridable="yes">Для использования [ProductName] требуется IIS версии 7.0.</String>
- <String Id="IIS7OrGreater" Overridable="yes">Для установки [ProductName] требуется IIS версии 7.0 или более поздней.</String>
- <String Id="IIS75OrGreater" Overridable="yes">Для установки [ProductName] требуется IIS версии 7.5 или более поздней.</String>
- <String Id="IIS7Or75Only" Overridable="yes">Для установки [ProductName] требуется IIS версии 7 или 7.5.</String>
- <String Id="BetaVersionFound" Overridable="yes">На компьютере обнаружена бета-версия [ProductName].</String>
- <String Id="NewerVersionFound" Overridable="yes">На компьютере обнаружена более поздняя версия [ProductName].</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Программа установки не может продолжить работу, поскольку на компьютере уже установлен другой экземпляр [ProductName]. Удалите его, затем заново запустите эту установку.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">Для использования [ProductName] необходимо установить компоненты IIS 7.0 CoreWebEngine и W3SVC.</String>
- <String Id="IISManagementConsole" Overridable="yes">Для использования [ProductName] требуется установить консоль управления IIS.</String>
- <String Id="WebServicesRunning" Overridable="yes">Перед установкой [ProductName] остановите службу активации Windows (WAS) и службу веб-управления (WMSvc). Эти службы нужно будет запустить после установки [ProductName].</String>
- <String Id="MetabaseRequired" Overridable="yes">Для установки [ProductName] требуется метабаза IIS.</String>
- <String Id="LaunchCondition_32BIT">64-разрядную версию [ProductName] нельзя установить на 32-разрядный выпуск Microsoft Windows.</String>
- <String Id="LaunchCondition_64BIT">32-разрядную версию [ProductName] нельзя установить на 64-разрядный выпуск Microsoft Windows.</String>
- <String Id="NetFX2OrGreaterRequired">Для установки [ProductName] требуется Microsoft .NET Framework версии 2.0 или более поздней.</String>
- <String Id="NetFX35OrGreaterRequired">Для установки [ProductName] требуется Microsoft .NET Framework версии 3.5 или более поздней. Воспользуйтесь функцией диспетчера сервера "Добавить функции", чтобы установить Microsoft .Net версии 3.5.</String>
- <String Id="NetFX4OrGreaterRequired">Для установки [ProductName] требуется Microsoft .NET Framework версии 4.0 или более поздней.</String>
- <String Id="NetFX20SP1IsRequired">Перед установкой [ProductName] установите Microsoft .NET Framework версии 2.0 с пакетом обновления 1 (SP1)или более поздним.</String>
- <String Id="WindowsUpdateEnabled">Службу Windows Update (wuauserv) невозможно отключить, она необходима для установки [ProductName].</String>
- <String Id="GetFromOSforWin7">Оснастка PowerShell является частью операционной системы Windows. Установите ее с помощью элемента панели управления "Программы и компоненты" или диспетчера сервера.</String>
- <String Id="WebPI3OrGreaterRequired">Для установки [ProductName] требуется установщик веб-платформы Майкрософт, версии 3.0 или более поздней.</String>
-
- <String Id="Error30001" Overridable="yes">Программа установки не обнаружила общую конфигурацию.</String>
- <String Id="Error30002" Overridable="yes">Для IIS включена общая конфигурация. Установка [ProductName] не поддерживается при использовании общей конфигурации. Отключите общую конфигурацию перед установкой этого компонента.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">Перед установкой [ProductName] необходимо остановить службу веб-публикаций (W3SVC). Эту службу нужно будет включить после установки. </String>
- <String Id="IISPowershellConsole">Консоль управления IIS PowerShell</String>
- <String Id="IISPowershellSnapin">Оснастка IIS PowerShell</String>
- <String Id="PowerShellRequired">Для оснастки IIS PowerShell требуется PowerShell v1.0 или v2.0</String>
- <String Id="WasAndConfigRequired">Для оснастки IIS PowerShell требуется установить WAS и конфигурацию</String>
- <String Id="TestBogusString" Overridable="yes">Пустая строка.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Платформа веб-ферм Майкрософт 2.2</String>
- <String Id="WebFarmAgentProductName">Агент веб-ферм Майкрософт 2.2</String>
- <String Id="WebFarmBasicFeatureName">Служба Web Farm Service</String>
- <String Id="WebFarmBasicFeatureDescription">Служба Web Farm Service</String>
- <String Id="WebFarmControllerServiceName">Служба Web Farm Controller Service</String>
- <String Id="WebFarmControllerServiceDescription">Служба Web Farm Controller Service</String>
- <String Id="WebFarmAgentServiceName">Служба Web Farm Agent Service</String>
- <String Id="WebFarmAgentServiceDescription">Служба Web Farm Agent Service</String>
- <String Id="WebPIRequired">Установщик веб-платформы является необходимым компонентом для установки платформы веб-ферм. Установите установщик веб-платформы с сайта http://www.microsoft.com/web/downloads/platform.aspx.</String>
- <String Id="WebDeployRequired">Инструмент веб-развертывания является необходимым компонентом для установки платформы веб-ферм. Установите инструмент веб-развертывания с сайта http://www.iis.net/download/WebDeploy.</String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Платформа веб-размещения Майкрософт</String>
- <String Id="WebHostingCommonFeatureName">Платформа веб-размещения</String>
- <String Id="WebHostingCommonFeatureDescription">Роли и компоненты веб-размещения.</String>
- <String Id="WebHostingFrameworkFeatureName">Платформа размещения</String>
- <String Id="WebHostingFrameworkFeatureDescription">Платформа размещения предоставляет API и команды PowerShell для управления веб-размещением.</String>
- <String Id="WebHostingWebRoleFeatureName">Веб-роль</String>
- <String Id="WebHostingWebRoleFeatureDescription">Веб-роль устанавливает динамическую службу WAS и поставщик переопределения URL-адресов для веб-размещения.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Развертывание панели управления в конфигурации, оптимизированной для установки на одном компьютере.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Роль подсистемы балансировки нагрузки</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Роль подсистемы балансировки нагрузки позволяет настроить в маршрутизаторе запросов приложений маршрутизацию на основе правил веб-размещения.</String>
- <String Id="WebHostingControllerFeatureName">Контроллер размещения</String>
- <String Id="WebHostingControllerFeatureDescription">Контроллер размещения расширяет платформу веб-ферм 2.0, позволяя ей работать с веб-размещением.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Публикация — роль</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Установка средств поддержки веб-развертывания и FTP-публикации.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Эта оснастка PowerShell, которая содержит командлеты для управления инфраструктурой Microsoft Web Hosting.</String>
- <String Id="DWASServiceName">Динамическая служба WAS</String>
- <String Id="DWASServiceDescription">Служба активации Windows, оптимизированная для веб-размещения высокой плотности.</String>
- <String Id="MeteringFeatureName">Служба контроля ресурсов</String>
- <String Id="MeteringFeatureDescription">Установка службы контроля ресурсов, которая позволяет собирать и публиковать сведения о среде выполнения и работоспособности.</String>
- <String Id="MeteringServiceName">Resource Metering</String>
- <String Id="MeteringServiceDescription">Позволяет собирать с веб-роли сведения о среде выполнения и работоспособности и публиковать их.</String>
- <String Id="QuotaEnforcementServiceName">Применение квот размещения</String>
- <String Id="QuotaEnforcementServiceDescription">Служит для отслеживания использования ресурсов веб-сайтами и выполнения настраиваемых действий при превышении квот.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/TRK/misc/setupstrings.wxl b/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/TRK/misc/setupstrings.wxl
deleted file mode 100644
index 83599c3b1c..0000000000
--- a/src/Installers/Windows/AspNetCoreModule-Setup/IIS-Setup/loc/TRK/misc/setupstrings.wxl
+++ /dev/null
@@ -1,351 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- Copyright (c) Microsoft Corporation. All rights reserved.
- Licensed under the MIT license.
--->
-
-<WixLocalization Culture="tr-tr" xmlns="http://schemas.microsoft.com/wix/2006/localization">
-
- <String Id="Language">1055</String>
-
- <!-- strings for WixUI_SelectSharedConfigInstallDlg -->
-
- <String Id="SharedConfigDlgTitle">Paylaşılan Yapılandırma Yükleme Seçenekleri</String>
- <String Id="SharedConfigDlgDescription">IIS paylaşılan yapılandırmasına yükleme seçeneğini belirtin</String>
- <String Id="SharedConfigDlgCheckBox">Yüklerken paylaşılan yapılandırmayı güncelleştir</String>
- <String Id="SharedConfigDlgText">Bu modülü paylaşılan yapılandırma kullanan bir IIS sunucusuna yüklüyorsunuz. Bu paylaşılan yapılandırmayı kullanan ek IIS sunucuları varsa, bu modülü söz konusu makinelerin tümüne yüklemeniz gerekir. Web sunucularında oluşabilecek kesintileri en az indirmek için bu modülü şu adımları kullanarak yüklemeniz gerekir: İlk olarak, sonuncu hariç tüm makinelerde paylaşılan yapılandırmayı güncelleştirmeden modülü yüklemeniz gerekir. Bunu, aşağıdaki onay kutusunu seçmeden yapın.
-Bu işlem, paylaşılan yapılandırmada hiçbir değişiklik yapmadan modül için gereken tüm ikili ve diğer dosyaları her bir makineye yükler. İkinci olarak, sonuncu makinede, altında çalıştığınız kullanıcı kimliğinin UNC paylaşımındaki applicationhost.config dosyasında okuma ve yazma erişimi olduğunu doğrulamalısınız. Sonra, modülü yüklemeli ve aşağıdaki paylaşılan yapılandırmayı güncelleştirme seçeneğini seçmeniz gerekir. </String>
-
- <!-- strings for ASPNet CA -->
- <String Id="ProgressText_WebConfigInitialize">WebConfig özel eylemi başlatılıyor</String>
- <String Id="ProgressText_WebConfigUpdate">web.config güncelleştiriliyor</String>
-
- <!-- strings for Advanced Logging -->
-
- <String Id="AdvancedLoggingTitle">IIS Gelişmiş Günlüğü</String>
- <String Id="AdvancedLoggingDescription">IIS ardışık düzen verileri için gelişmiş günlüğü etkinleştirir.</String>
- <String Id="AdvancedLoggingUI">IIS Gelişmiş Günlüğü</String>
- <String Id="AdvancedLoggingUIDescription">Genişletilebilir alan seçimi olan özel günlük dosyaları oluşturmaya olanak tanır.</String>
- <String Id="AdvancedLoggingUpdate01">IIS Gelişmiş Günlüğü Güncelleştirmesi</String>
-
- <!-- strings for Transform Manager -->
-
- <String Id="TransformManagerTitle">IIS Dönüşüm Yöneticisi</String>
- <String Id="TransformManagerRelease">Beta</String>
- <String Id="TransformManagerDescription">Dönüşüm Yöneticisi IIS Medya Hizmetleri'ni etkinleştirir.</String>
- <String Id="TransformManagerUI">IIS Dönüşüm Yöneticisi</String>
- <String Id="TransformManagerUIDescription">Medya dönüşümleri oluşturmayı etkinleştirir.</String>
- <String Id="TransformManagerServiceHostName">IIS Dönüşüm Yöneticisi Ana Bilgisayarı</String>
- <String Id="TransformManagerServiceHostDescription">[ProductName] için hizmet ana bilgisayarı.</String>
- <String Id="TransformManagerShortcutName">IIS Dönüşüm Yöneticisi</String>
- <String Id="TransformManagerShortcutTooltip">İsteğe bağlı medya dosyalarını alternatif dosya ve kapsayıcı biçimlerine toplu olarak dönüştürün.</String>
- <String Id="TransformManagerEESPTaskInstalled">Bir IIS Transform Manager 1.0 Expression Encoder SP Task paketi bilgisayarda yüklü. [ProductName] ürününü yüklemeden önce bunu kaldırmalısınız.</String>
-
- <String Id="NetFx35Required">[ProductName] ürününü yüklemek için Microsoft .NET Framework 3.5 gereklidir. Sunucu Yöneticisi'ndeki 'Özellik Ekleme Sihirbazı'nı kullanarak .NET Framework 3.5.1 Özellikleri'ni yükleyin veya 'Windows özelliklerini aç veya kapat'ı kullanarak Microsoft .NET Framework 3.5'i açın.</String>
-
- <!-- strings for Digital Rights Management -->
-
- <String Id="DigitalRightsManagementTitle">IIS Dijital Hak Yönetimi</String>
- <String Id="DigitalRightsManagementRelease">Beta</String>
- <String Id="DigitalRightsManagementDescription">Kesintisiz Akış sunularında Dijital Hak Yönetimini etkinleştirir.</String>
-
- <!-- strings for Media Services -->
- <String Id="ASPNETNotInstalledTitle">ASP.NET Yüklü Değil</String>
- <String Id="ASPNETNotInstalled">
- <![CDATA[Web Çalma Listeleri'nde oturum durumunu kalıcı yapmak amacıyla ASP.NET için Oturum Yardımcısı'nı yükleyebilmeniz için, önce Sunucu Yöneticisi'nde Web Sunucusu (IIS) rolü için ASP.NOT rol hizmetini yüklemeniz gerekir. Medya Hizmetleri yüklemesine ASP.NET için Oturum Yardımcısı olmadan devam etmek için, Geri'yi tıklatın ve yüklenecek özellikler listesinden Oturum Yardımcısı'nı çıkarın. Aksi durumda, İptal'i tıklatın, Sunucu Yöneticisi'ne ASP.NET rol hizmetini yükleyin ve sonra IIS Medya Hizmetleri Kurulumu'nu yeniden çalıştırın.]]>
- </String>
-
- <String Id="ASPNETSesssionHelperCannotBeInstalled">
- <![CDATA[Web Sunucusu (IIS) için ASP.NET rolü hizmeti yüklenmedikçe Web Çalma Listeleri ASP.NET oturumu kalıcı yapma sağlayıcısını kullanamaz. ASP.NET oturum kalıcılığını Web Çalma Listeleri ile kullanmak istiyorsanız, Sunucu Yöneticisi'ne Web Sunucusu (IIS) için ASP.NET rol hizmetini yükleyin.
-
-Oturum Yardımcısı özelliğini şu anda yüklemek istemiyorsanız, Geri'yi tıklatıp özelliğin seçimini kaldırabilirsiniz.
-
-ASP.NET rol hizmetini yüklerseniz, bu ürünün yüklü özelliklerini Denetim Masası'ndaki Programlar ve özellikler menüsünden değiştirebilirsiniz.]]>
- </String>
-
- <String Id="SmoothStreamingBetaVersionFound">Bu bilgisayarda IIS Kesintisiz Akış - Beta bulundu. [ProductName] yüklemesi devam edemez. Bu ürünü yüklemek için, Denetim Masası'ndaki Program Ekle/Kaldır'ı kullanarak IIS Kesintisiz Akış - Beta'yı kaldırın.</String>
- <String Id="IncompatibleMediaServicesVersionFound">Bu bilgisayarda IIS Medya Hizmetleri'nin uyumsuz bir sürümü var. [ProductName] yüklemesi devam edemez. Bu ürünü yüklemek için, Denetim Masası'ndaki Program Ekle/Kaldır'ı kullanarak IIS Medya Hizmetleri'ni kaldırın.</String>
- <String Id="NewerMediaServicesVersionFound">Bu ürünün daha yeni bir sürümü bu bilgisayarda yüklü veya bu bilgisayara yüklenebilir durumda. [ProductName] yüklemesi devam edemiyor. Bu ürünün yeni sürümünü yüklemek için, Denetim Masası'ndaki Program Ekle/Kaldır'ı kullanarak IIS Medya Hizmetleri'ni güncelleştirin.</String>
- <String Id="ISXConversionRequiredWarningTitle">Çalma Listesi Dosyasının Dönüştürülmesi Gerekiyor</String>
- <String Id="ISXConversionRequiredWarning">
- <![CDATA[Web Çalma Listeleri'nin önceki sürümleri için oluşturulan Çalma Listesi dosyaları bu sürümde desteklenmiyor. Bu çalma listelerinin bu Web Çalma Listeleri sürümünde desteklenen kopyalarını oluşturmak için, http://go.microsoft.com/fwlink/?LinkId=127838 adresinden alabileceğiniz isxTranslate dönüştürme aracını kullanın.]]>
- </String>
-
- <String Id="MediaServicesVersioningWarningTitle">Eski IIS Medya Hizmetleri Dosyaları Bulundu</String>
- <String Id="MediaServicesVersioningWarning">
- <![CDATA[Bu bilgisayarda bir veya daha fazla Medya Hizmetleri özelliğinin önceki bir sürümü yüklü. IIS Medya Hizmetleri'ndeki özelliklerin doğru çalışacağından emin olmak için IIS Medya Hizmetleri Kurulumu'nun önceden yüklenen tüm Medya Hizmetleri özelliklerini güncelleştirmesi gerekiyor.
-
-Önceden yüklenen Medya Hizmetleri özelliklerini güncel sürümlerine güncelleştirmek için İleri'yi tıklatın. Bu özelliklerin önceden yüklenen özelliklerini güncelleştirmek istemiyorsanız İptal'i tıklatın.]]>
- </String>
-
- <String Id="MediaServicesBetaVersioningErrorTitle">Beta IIS Medya Hizmetleri Dosyaları Bulundu</String>
- <String Id="MediaServicesBetaVersioningError">
- <![CDATA[Bu bilgisayarda bir veya daha fazla IIS Medya Hizmetleri özelliğinin bir beta sürümü yüklü. IIS Medya Hizmetleri Kurulumu devam edemez.
-
-IIS Medya Hizmetleri'nin bu sürümünü yüklemek için, Beta özellikleri kaldırmalısınız.]]>
- </String>
-
- <!-- When adding a version title, also add a string for servicing -->
- <String Id="MediaPack10Title">IIS Medya Paketi 1.0</String>
- <String Id="MediaPack10Update">IIS Medya Paketi 1.0 Güncelleştirmesi</String>
- <String Id="MediaServices20Title">IIS Medya Hizmetleri 2.0</String>
- <String Id="MediaServices20Update">IIS Medya Paketi 2.0 Güncelleştirmesi</String>
- <String Id="MediaServices30Title">IIS Medya Hizmetleri 3.0</String>
- <String Id="MediaServices30TAP2Title">IIS Medya Hizmetleri 3.0 TAP 2</String>
- <String Id="MediaServices30Update">IIS Medya Paketi 3.0 Güncelleştirmesi</String>
- <String Id="MediaServicesIISMediaDescription">IIS Medya Paketi özellikleri ve araçları.</String>
- <String Id="MediaServicesBurbankDescription">IIS Media Services 5 Premium özellikleri ve araçları.</String>
- <String Id="MediaServices40Beta1Title">IIS Medya Hizmetleri 4.0 Beta 1</String>
- <String Id="MediaServices40Title">IIS Medya Hizmetleri 4.0</String>
- <String Id="MediaServicesIISMedia45Beta1Title">IIS Medya Hizmetleri 4.5 Beta 1</String>
- <String Id="MediaServicesBurbankBeta1Title">IIS Media Services 5 Premium</String>
-
- <String Id="MediaServicesFeaturePlaylistTitle">Web Çalma Listeleri</String>
- <String Id="MediaServicesFeaturePlaylistDescription">İstemcinin, çalma listelerinde başvurulan medya listelerini kayıttan yürütmesini denetler.</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelper">Oturum Yardımcısı</String>
- <String Id="MediaServicesFeaturePlaylistSessionHelperDescription">ASP.NET oturum durumu kalıcılığını etkinleştirir. (Web Sunucusu (IIS) için ASP.NET rol hizmetini gerektirir.)</String>
- <String Id="MediaServicesFeaturePlaylistUI">Kullanıcı Arabirimi</String>
- <String Id="MediaServicesFeaturePlaylistUIDescription">IIS Yöneticisi'nde Web Çalma Listeleri özelliğini yapılandırır.</String>
-
- <String Id="MediaServicesFeatureBitrateTitle">Bit Hızı Azaltma</String>
- <String Id="MediaServicesFeatureBitrateDescription">İstemcilerin karşıdan yüklediği dosyaların teslimini yavaşlatarak bant genişliğinden tasarruf sağlar.</String>
- <String Id="MediaServicesFeatureBitrateUI">Kullanıcı Arabirimi</String>
- <String Id="MediaServicesFeatureBitrateUIDescription">IIS Yöneticisi'nde Bit Hızı Azaltma özelliğini yapılandırır.</String>
-
- <String Id="MediaServicesFeatureSmoothTitle">Varlıklar</String>
- <String Id="MediaServicesFeatureSmoothDescription">İsteğe bağlı varlıkların istemcilere HTTP ile uyarlamalı akışını etkinleştirir.</String>
- <String Id="MediaServicesFeatureSmoothUI">Kullanıcı Arabirimi</String>
- <String Id="MediaServicesFeatureSmoothUIDescription">IIS Yöneticisi'nde Kesintisiz Akış özelliğini yapılandırır.</String>
-
- <String Id="MediaServicesFeatureLiveStreamingTitle">Kanallar</String>
- <String Id="MediaServicesFeatureLiveStreamingDescription">Kanal yayınlarının istemcilere HTTP ile uyarlamalı akışını etkinleştirir.</String>
- <String Id="MediaServicesFeatureLiveStreamingUI">Kullanıcı Arabirimi</String>
- <String Id="MediaServicesFeatureLiveStreamingUIDescription">IIS Yöneticisi'nde Canlı Kesintisiz Akış özelliğini yapılandırır.</String>
-
- <String Id="MediaServicesFeatureDigitalRightsManagementTitle">Dijital Hak Yönetimi</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementDescription">Kesintisiz Akış medyası için şifreleme ve lisanslama sağlar.</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUI">Kullanıcı Arabirimi</String>
- <String Id="MediaServicesFeatureDigitalRightsManagementUIDescription">IIS Yöneticisi'nde Dijital Hak Yönetimi özelliğini yapılandırır.</String>
-
- <String Id="VistaSP1Required">[ProductName] için Microsoft Windows Vista Service Pack 1 veya üstü gereklidir.</String>
- <String Id="VistaHomeBasicNotSupported">[ProductName], Vista Home Basic üzerine yüklenemez.</String>
- <String Id="Windows7SP1Required">[ProductName] için Microsoft Windows 7 Service Pack 1 veya üstü gereklidir.</String>
-
- <!-- Strings for DB Manager -->
- <String Id="DBManagerProductName">IIS Veritabanı Yöneticisi</String>
- <String Id="DBManagerBasicFeatureName">IIS Veritabanı Yöneticisi</String>
-
- <!-- Strings for WMSvc -->
- <String Id="WMSvcProductName">Microsoft Web Yönetimi Hizmeti 2</String>
- <String Id="WMSvcBasicFeatureName">Microsoft Web Yönetimi Hizmeti</String>
- <String Id="WMSvcBasicFeatureDescription">[ProductName] ürününün temel özelliklerini yükler.</String>
- <String Id="WMSvcServiceName">Microsoft Web Yönetimi Hizmeti 2</String>
- <String Id="WMSvcServiceDescription">Web Yönetimi Hizmeti, yöneticilerin bu makinede bulunan Web sunucularını, siteleri ve uygulamaları yönetmeleri için uzaktan ve temsilci seçilmiş yönetim becerileri sağlar.</String>
-
- <!-- Strings for URL Rewrite V1.1 -->
- <String Id="RewriteProductNameV1">IIS 7 için Microsoft URL Yeniden Yazma Modülü 1.1</String>
- <String Id="RewriteServicingPatchV1">IIS 7 için URL Yeniden Yazma Modülü 1.1 Güncelleştirmesi</String>
- <String Id="RewriteModuleTitleV1">URL Yeniden Yazma</String>
- <String Id="RewriteModuleDescriptionV1">IIS 7'nin URL ve içerik yeniden yazma yeteneklerini etkinleştirir.</String>
- <String Id="RewriteModuleUITitleV1">Kullanıcı Arabirimi</String>
- <String Id="RewriteModuleUIDescriptionV1">IIS Yöneticisi'nde URL Yeniden Yazma Modülü özelliğini yapılandırır.</String>
-
- <!-- Strings for URL Rewrite V2.0 -->
- <String Id="RewriteProductName">IIS URL Yeniden Yazma Modülü 2</String>
- <String Id="RewriteServicingPatch">IIS URL Yeniden Yazma Modülü 2 Güncelleştirmesi</String>
- <String Id="RewriteModuleTitle">URL Yeniden Yazma</String>
- <String Id="RewriteModuleDescription">IIS 7'nin URL ve içerik yeniden yazma yeteneklerini etkinleştirir.</String>
- <String Id="RewriteModuleUITitle">Kullanıcı Arabirimi</String>
- <String Id="RewriteModuleUIDescription">IIS Yöneticisi'nde URL Yeniden Yazma Modülü özelliğini yapılandırır.</String>
-
- <!--Strings for Admin Pack-->
- <String Id="AdminPackBasicFeatureName" Overridable="yes">IIS 7.0 için Yönetim Paketi</String>
- <String Id="AdminPackBasicFeatureDescription" Overridable="yes">[ProductName] ürününün temel özelliklerini yükler.</String>
- <String Id="SummaryCodepage" Overridable="yes">1254</String>
- <String Id="ProductName" Overridable="yes">IIS 7.0 için Yönetim Paketi</String>
- <String Id="Manufacturer" Overridable="yes">Microsoft Corporation</String>
- <String Id="OsNotSupported" Overridable="yes">İşletim sisteminin bu sürümü desteklenmiyor. [ProductName] yalnızca Windows Server 2008 ya da Windows Vista Service Pack 1 ve üstü üzerine yüklenebilir.</String>
- <String Id="ASPNETFeatures" Overridable="yes">ASP.Net Özellikleri</String>
- <String Id="ASPNETFeaturesDescription" Overridable="yes">ASP.NET, yetkilendirme ve özel hata ayarlarınızı yönetmenizi sağlayan Yetkilendirme ve Hata Sayfaları özelliklerini içerir.</String>
- <String Id="Authentication" Overridable="yes">Kimlik Doğrulaması</String>
- <String Id="AuthenticationDescription" Overridable="yes">ASP.Net Kimlik Doğrulaması Açıklaması.</String>
- <String Id="Authorization" Overridable="yes">Yetkilendirme</String>
- <String Id="AuthorizationDescription" Overridable="yes">ASP.NET Yetkilendirme, kullanıcılara Web sitelerinize ve uygulamalarınıza erişme yetkisi verme kurallarını yapılandırmanızı sağlar.</String>
- <String Id="ErrorPages" Overridable="yes">Hata Sayfaları</String>
- <String Id="ErrorPagesDescription" Overridable="yes">ASP.NET Hata Sayfaları, hata oluştuğunda döndürülen HTTP hata yanıtlarını yapılandırmanızı sağlar.</String>
- <String Id="Modules" Overridable="yes">Modüller</String>
- <String Id="ModulesDescription" Overridable="yes">ASP.Net Modülleri Açıklaması.</String>
- <String Id="Handlers" Overridable="yes">İşleyiciler</String>
- <String Id="HandlersDescription" Overridable="yes">ASP.Net İşleyiciler Açıklaması.</String>
- <String Id="ConfigurationEditor" Overridable="yes">Yapılandırma Düzenleyicisi</String>
- <String Id="ConfigurationEditorDescription" Overridable="yes">Yapılandırma Düzenleyicisi, IIS Yöneticisi'nde yapılandırma dosyalarındaki bölümleri, öznitelikleri, öğeleri ve koleksiyonları düzenlemenize olanak tanıyarak yapılandırma dosyalarınızı yönetmenizi sağlar.</String>
- <String Id="RequestFiltering" Overridable="yes">İstek Filtreleme</String>
- <String Id="RequestFilteringDescription" Overridable="yes">İstek Filtreleme, Web siteniz için filtreleme kurallarını yapılandırmanızı, protokol ve içerik davranışını kısıtlamanızı sağlar.</String>
- <String Id="FastCgi" Overridable="yes">FastCGI</String>
- <String Id="FastCgiDescription" Overridable="yes">FastCGI, Web sunucunuzdaki FastCGI uygulamaları için işlem havuzu ayarlarını yapılandırmanızı sağlar.</String>
-
- <!-- Strings for Dynamic IP Restrictions -->
- <String Id="IpRestrictionModuleDetectedTitle" Overridable="yes"> IIS 7 için Dinamik IP Kısıtlamaları Kurulumu </String>
- <String Id="IpRestrictionModuleDetected1" Overridable="yes">
- <![CDATA[Kurulum sihirbazı IIS'nin yerleşik IP ve Etki Alanı Kısıtlamaları'nın önceden yüklendiğini belirledi. Kurulum sihirbazı Dinamik IP Kısıtlamaları'nı yüklemek varolan IP ve Etki Alanı Kısıtlamaları'nı kaldıracak. Varolan IP güvenliği yapılandırması korunacak.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected2" Overridable="yes">
- <![CDATA[Bu işlem birkaç dakika sürebilir.]]>
- </String>
-
- <String Id="IpRestrictionModuleDetected3" Overridable="yes">
- <![CDATA[Devam etmek istiyor musunuz?]]>
- </String>
-
- <String Id="DynamicIPRestrictionProductNameBeta1">IIS 7 için Dinamik IP Kısıtlamaları - Beta </String>
- <String Id="DynamicIPRestrictionProductNameBeta2">IIS 7 için Dinamik IP Kısıtlamaları - Beta 2</String>
- <String Id="DynamicIPRestrictionProductNameBeta3">IIS 7 için Dinamik IP Kısıtlamaları - Beta 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRC1">IIS 7 için Dinamik IP Kısıtlamaları - Sürüm Adayı </String>
- <String Id="DynamicIPRestrictionProductNameRC2">IIS 7 için Dinamik IP Kısıtlamaları - Sürüm Adayı 2</String>
- <String Id="DynamicIPRestrictionProductNameRC3">IIS 7 için Dinamik IP Kısıtlamaları - Sürüm Adayı 3</String>
-
- <String Id="DynamicIPRestrictionProductNameRTW">IIS 7 için Dinamik IP Kısıtlamaları - RTW </String>
-
- <String Id="DynamicIPRestriction" Overridable="yes">IIS 7 için Dinamik IP Kısıtlamaları</String>
- <String Id="DynamicIPRestrictionUI" Overridable="yes">IIS 7 için Dinamik IP Kısıtlamaları Kullanıcı Arabirimi</String>
-
- <String Id="DynamicIPRestrictionBeta1Found" Overridable="yes"> Bu makinede IIS 7 - Beta için Dinamik IP Kısıtlamaları bulundu. Lütfen kaldırın ve yeniden deneyin</String>
-
- <!-- Strings for WebDAV -->
- <String Id="WebDAVProductName">IIS 7.0 için WebDAV 7.5</String>
- <String Id="CoreWebEngineMustBeInstalled">Bu ürünü kullanmak için IIS 7.0 CoreWebEngine ve W3SVC özellikleri yüklenmelidir.</String>
- <String Id="WebDAVFeatureTitleModule">WebDAV Sunucu Modülü</String>
- <String Id="WebDAVFeatureTitleUI">WebDAV Yönetimi Kullanıcı Arabirimi</String>
-
- <!-- Strings for Site Analyzer -->
- <String Id="SiteAnalyzerProductName">IIS Arama Alt Yapısı İyileştirme Araç Seti 1.0</String>
- <String Id="SiteAnalyzerBasicFeatureName">IIS Arama Alt Yapısı İyileştirme Araç Seti 1.0</String>
- <String Id="SiteAnalyzerShortcutName">Arama Alt Yapısı İyileştirme (SEO) Araç Seti 1.0</String>
- <String Id="SiteAnalyzerProductComments">Bu yükleyici veritabanı IIS Arama Alt Yapısı İyileştirme Araç Seti 1.0'ı yüklemek için gereken mantığı ve verileri içermektedir.</String>
-
- <!-- Strings for IIS Editor-->
- <String Id="IISEditor" Overridable="yes">IIS Düzenleyicisi</String>
-
- <!-- Strings for IIS Reports-->
- <String Id="IISReports" Overridable="yes">IIS Raporları</String>
- <String Id="LogParserInstalled" Overridable="yes">Bu makinede Günlük Ayrıştırıcısı yüklü değil. Lütfen http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07 adresinden Günlük Ayrıştırıcısı 2.2 sürümünü yükleyin ve sonra IIS Raporları yüklemesine devam edin</String>
-
- <!-- Strings for DB Manager -->
- <String Id="LaunchSetup" Overridable="yes">Önkoşul paketler bulunamadı. Bağımlılıkları çözümlemek ve bu programı yüklemek için lütfen setup.exe'yi çalıştırın.</String>
- <String Id="SMONotInstalled" Overridable="yes">Microsoft SQL Server 2008 Yönetim Nesneleri, IIS Veritabanı Yöneticisi'ni yüklemek için bir önkoşuldur. Microsoft SQL Server 2008 Yönetim Nesneleri'ni http://go.microsoft.com/fwlink/?LinkID=150946 adresinden yükleyebilirsiniz.</String>
- <String Id="CLRTypesNotInstalled" Overridable="yes">Microsoft SQL Server Sistem CLR Türleri, IIS Veritabanı Yöneticisi'ni yüklemek için bir önkoşuldur. Microsoft SQL Server Sistem CLR Türleri'ni http://go.microsoft.com/fwlink/?LinkID=150949 adresinden yükleyebilirsiniz.</String>
-
- <!-- Strings for ARR -->
- <String Id="WebFarmProductName">Microsoft Web Grubu Çerçevesi</String>
- <String Id="ECacheProductName">Microsoft Dış Önbellek</String>
- <String Id="WebfarmFrameworkReqd" Overridable="yes">Web Grubu Çerçevesi, Uygulama İsteği Yönlendirme için bir önkoşuldur. Lütfen Web Grubu Çerçevesi'ni yükleyin.</String>
- <String Id="Arrv2ProductName">Microsoft Uygulama İsteği Yönlendirme 2.5</String>
- <String Id="ArrModuleTitle">Çalışma Zamanı</String>
- <String Id="ArrModuleDescription">IIS'ye Uygulama İsteği Yönlendirme özellikleri ekler.</String>
- <String Id="ArrUITitle">Kullanıcı Arabirimi</String>
- <String Id="ArrUIDescription">IIS Yöneticisi'nde Uygulama İsteği Yönlendirme özelliğini yapılandırır.</String>
-
- <!-- Strings for PowerShell -->
- <String Id="PowerShellProductName" Overridable="yes">IIS 7.0 için Microsoft Windows PowerShell ek bileşeni</String>
-
- <!-- Strings for WPI -->
- <String Id="WebPIProductName">Microsoft Web Platformu Yükleyicisi 4.0</String>
- <String Id="WebPIFeatureName">Microsoft Web Platformu Yükleyicisi</String>
- <String Id="XPSP2Required">[ProductName] için Windows XP SP2, Windows 2003 SP1, Windows Vista veya üstü gereklidir.</String>
- <String Id="XPSP3OrWIN2K3SP2Required">[ProductName] için Windows XP Service Pack 3, Windows Server 2003 Service Pack 2 veya üstü gereklidir.</String>
-
- <!-- Strings for Windows Azure Installer -->
- <String Id="WASIProductName">Microsoft Windows Azure Hizmetleri Yükleyicisi</String>
- <String Id="WASIFeatureName">Microsoft Windows Azure Hizmetleri Yükleyicisi</String>
-
- <!-- Strings for Remote Manager -->
- <String Id="RemoteMgrProductName">Internet Information Services (IIS) 7+ Yöneticisi</String>
- <String Id="RemoteMgrClientFeatureName">IIS Yöneticisi İstemcisi</String>
- <String Id="RemoteMgrRemotingFeatureName">Uzaktan İletişim Desteği</String>
- <String Id="RemoteMgrNotSupported">Bu ürün için Windows XP SP2, Windows 2003 SP1, Windows Vista SP1, Windows 7 veya daha üstü gereklidir</String>
- <String Id="RemoteMgrIISManagementConsoleRequired">IIS Yönetim Konsolu yüklenmedi ancak uzak IIS Sunucularını yönetmek için gerekiyor. Uzaktan yönetim desteğini yüklemeden önce lütfen 'Denetim Masası -&gt; Programlar -&gt; Windows Özelliklerini Aç veya Kapat'ı açın ve Internet Information Services özelliğinde IIS Yönetimi Konsolu'nu seçin.</String>
- <String Id="RemoteMgrNotRequired">Bu ürün Windows Server 2008, Windows Server 2008 R2 veya daha üstünde gerekli değildir. IIS Yönetim Konsolu'nu yüklemek üzere lütfen Sunucu Yöneticisi'ni açın ve Web Sunucusu Rolü için Rol Hizmetleri'nde IIS Yönetim Konsolu'nu seçin.</String>
-
- <!-- Strings for Publishing UI module -->
- <String Id="PublishingProductName">IIS 7.0 için IIS Yöneticisi Yayımlama</String>
- <String Id="PublishingFeatureName">Yayımlama Kullanıcı Arabirimi</String>
-
- <!-- Strings for application warmup module -->
- <String Id="AppwarmupProductName">IIS 7.5 için Application Warm-Up 1.0</String>
-
- <!--Custom errors for OOB Projects -->
-
- <String Id="ConflictingProduct" Overridable="yes">Bu bilgisayarda uyumsuz bir ürün ([CONFLICTING_PRODUCT_NAME]) mevcut. [ProductName] ürününün yüklemesi devam edemiyor. Bu ürünü yüklemek için [CONFLICTING_PRODUCT_NAME] ürününü kaldırmak amacıyla Denetim Masası'ndaki Program Ekle/Kaldır'ı kullanın.</String>
- <String Id="AdminRequired" Overridable="yes">[ProductName] ürününü yüklemek için yönetici ayrıcalıkları gereklidir.</String>
- <String Id="IIS7Only" Overridable="yes">[ProductName] ürününü kullanmak için IIS Sürüm 7.0 gereklidir.</String>
- <String Id="IIS7OrGreater" Overridable="yes">[ProductName] ürününü yüklemek için IIS Sürüm 7.0 veya üstü gereklidir.</String>
- <String Id="IIS75OrGreater" Overridable="yes">[ProductName] ürününü yüklemek için IIS Sürüm 7.5 veya üstü gereklidir.</String>
- <String Id="IIS7Or75Only" Overridable="yes">[ProductName] ürününü yüklemek için IIS Sürüm 7 veya 7.5 gereklidir.</String>
- <String Id="BetaVersionFound" Overridable="yes">Bu makinede [ProductName] ürününün beta sürümü bulundu.</String>
- <String Id="NewerVersionFound" Overridable="yes">Bu makinede [ProductName] ürününün daha yeni bir sürümü bulundu.</String>
- <String Id="DuplicateVersionFound" Overridable="yes">Bu bilgisayara başka bir [ProductName] örneği önceden yüklendiğinden Kurulum devam edemiyor. Lütfen önce onu kaldırın ve sonra bu yükleme işlemini yeniden başlatın.</String>
- <String Id="CoreWebW3SVC" Overridable="yes">[ProductName] ürününü kullanmak için IIS 7.0 CoreWebEngine ve W3SVC özellikleri yüklenmelidir.</String>
- <String Id="IISManagementConsole" Overridable="yes">[ProductName] ürününü kullanmak için IIS Yönetim Konsolu yüklenmelidir.</String>
- <String Id="WebServicesRunning" Overridable="yes">[ProductName] ürününü yüklemeden önce lütfen Windows İşlem Etkinleştirme Hizmeti (WAS) ve Web Yönetimi Hizmeti (WMSvc) hizmetlerinin ikisini de durdurun. [ProductName] yüklendikten sonra hizmetleri yeniden başlatmanız gerekir.</String>
- <String Id="MetabaseRequired" Overridable="yes">[ProductName] ürününü yüklemek için IIS Metatabanı gereklidir.</String>
- <String Id="LaunchCondition_32BIT">[ProductName] ürünün 64-bit sürümü Microsoft Windows'un 32-bit bir sürümüne yüklenemez.</String>
- <String Id="LaunchCondition_64BIT">[ProductName] ürünün 32-bit sürümü Microsoft Windows'un 64-bit bir sürümüne yüklenemez.</String>
- <String Id="NetFX2OrGreaterRequired">[ProductName] ürününü yüklemek için Microsoft .NET Framework Sürüm 2.0 veya üstü gereklidir.</String>
- <String Id="NetFX35OrGreaterRequired">[ProductName] ürününü yüklemek için Microsoft .NET Framework Sürüm 3.5 veya üstü gereklidir. Microsoft .Net Sürüm 3.5'i yüklemek için Sunucu Yöneticisi altındaki 'Özellik Ekle' seçeneğini kullanın.</String>
- <String Id="NetFX4OrGreaterRequired">[ProductName] ürününü yüklemek için Microsoft .NET Framework Sürüm 4.0 veya üstü gereklidir.</String>
- <String Id="NetFX20SP1IsRequired">[ProductName] ürününü yüklemeden önce lütfen Microsoft .NET Framework Sürüm 2.0 Service Pack 1'i (veya daha yeni bir hizmet paketini) yükleyin.</String>
- <String Id="WindowsUpdateEnabled">Windows Update (wuauserv) hizmeti devre dışı bırakılamaz; [ProductName] ürününü yüklemek için gereklidir.</String>
- <String Id="GetFromOSforWin7">PowerShell ek bileşeni Windows İşletim Sisteminin bir parçasıdır. Lütfen 'Programlar ve Özellikler' veya 'Sunucu Yöneticisi' aracılığıyla yükleyin.</String>
- <String Id="WebPI3OrGreaterRequired">[ProductName] ürününü yüklemek için Microsoft Web Platformu Yükleyicisi 3.0 veya üstü gereklidir.</String>
-
- <String Id="Error30001" Overridable="yes">Kurulum paylaşılan yapılandırmayı silemedi.</String>
- <String Id="Error30002" Overridable="yes">IIS için paylaşılan yapılandırma etkin. Paylaşılan yapılandırma kullanılırken [ProductName] ürününün yüklenmesi desteklenmiyor. Bu özelliği yüklemeden önce lütfen paylaşılan yapılandırmayı devre dışı bırakın.</String>
-
- <String Id="W3SVCRunning" Overridable="yes">[ProductName] ürününü yüklemeden önce lütfen World Wide Web Yayımlama Hizmeti'ni (W3SVC) durdurun. Yükleme işleminden sonra hizmeti yeniden başlatmanız gerekir. </String>
- <String Id="IISPowershellConsole">IIS PowerShell Yönetim Konsolu</String>
- <String Id="IISPowershellSnapin">IIS PowerShell ek bileşeni</String>
- <String Id="PowerShellRequired">IIS PowerShell ek bileşeni için PowerShell v1.0 veya v2.0 yüklü olmalıdır</String>
- <String Id="WasAndConfigRequired">IIS PowerShell ek bileşeni için WAS ve yapılandırma yüklü olmalıdır</String>
- <String Id="TestBogusString" Overridable="yes">Bu hatalı bir dizedir.</String>
-
- <!-- Strings for Web Farm Framework 2.0 -->
- <String Id="WebFarm2ProductName">Microsoft Web Grubu Çerçevesi Sürüm 2.2</String>
- <String Id="WebFarmAgentProductName">Microsoft Web Grubu Aracısı Sürüm 2.2</String>
- <String Id="WebFarmBasicFeatureName">Web Grubu Hizmeti</String>
- <String Id="WebFarmBasicFeatureDescription">Web Grubu Hizmeti</String>
- <String Id="WebFarmControllerServiceName">Web Grubu Denetleyicisi Hizmeti</String>
- <String Id="WebFarmControllerServiceDescription">Web Grubu Denetleyicisi Hizmeti</String>
- <String Id="WebFarmAgentServiceName">Web Grubu Aracısı Hizmeti</String>
- <String Id="WebFarmAgentServiceDescription">Web Grubu Aracısı Hizmeti</String>
- <String Id="WebPIRequired">Web Grubu Çerçevesi'ni yüklemek için Web Platformu Yükleyicisi bir önkoşuldur. Lütfen http://www.microsoft.com/web/downloads/platform.aspx adresinden Web Platformu Yükleyicisi'ni yükleyin. </String>
- <String Id="WebDeployRequired">Web Grubu Çerçevesi'ni yüklemek için Web Dağıtım Aracı bir önkoşuldur. Lütfen http://www.iis.net/download/WebDeploy adresinden Web Dağıtımı Aracı'nı yükleyin. </String>
-
- <!-- Strings for Web Hosting Framework -->
- <String Id="WebHostingProductName">Microsoft Web Barındırma Çerçevesi</String>
- <String Id="WebHostingCommonFeatureName">Web Barındırma Çerçevesi</String>
- <String Id="WebHostingCommonFeatureDescription">Web Barındırma rolleri ve özellikleri.</String>
- <String Id="WebHostingFrameworkFeatureName">Barındırma Çerçevesi</String>
- <String Id="WebHostingFrameworkFeatureDescription">Barındırma Çerçevesi, Web Barındırma'yı yönetmek için API'ler ve PowerShell komutları sağlar.</String>
- <String Id="WebHostingWebRoleFeatureName">Web Rolü</String>
- <String Id="WebHostingWebRoleFeatureDescription">Web Rolü, Web Barındırma için Dinamik WAS hizmetini ve URL Yeniden Yazma sağlayıcısını yükler.</String>
- <String Id="WebHostingAntaresExpressFeatureName">Antares Express</String>
- <String Id="WebHostingAntaresExpressFeatureDescription">Tek makineli kurulum için en iyi duruma getirilen bir Denetim Masası yapılandırmasını dağıtır.</String>
- <String Id="WebHostingLoadBalancerFeatureName">Yük Dengeleyici Rolü</String>
- <String Id="WebHostingLoadBalancerFeatureDescription">Yük Dengeleyici Rolü, Uygulama İstek Yönlendiricisini Web Barındırma kurallarına göre yönlendirecek şekilde yapılandırır.</String>
- <String Id="WebHostingControllerFeatureName">Barındırma Denetleyicisi</String>
- <String Id="WebHostingControllerFeatureDescription">Barındırma Denetleyicisi, Web Grubu Çerçevesi 2.0'ı Web Barındırma ile çalışacak şekilde genişletir.</String>
- <String Id="WebHostingPublishingRoleFeatureName">Yayımlama Rolü</String>
- <String Id="WebHostingPublishingRoleFeatureDescription">Web Dağıtımı ve FTP yayımlama için desteği yükler.</String>
- <String Id="WebHostingPowerShellSnapInDescription">Bu, Microsoft Web Barındırma altyapısını yönetmeyi sağlayan cmdlet'ler içeren bir PowerShell ek bileşenidir.</String>
- <String Id="DWASServiceName">Dinamik WAS Hizmeti</String>
- <String Id="DWASServiceDescription">Yüksek yoğunluklu Web Barındırma için en iyi duruma getirilmiş Windows İşlem Etkinleştirme hizmeti.</String>
- <String Id="MeteringFeatureName">Kaynak Ölçümü Hizmeti</String>
- <String Id="MeteringFeatureDescription">Çalışma zamanı ve sistem bilgisi toplamayı ve yayımlamayı sağlayan Kaynak Ölçümü hizmetini yükler.</String>
- <String Id="MeteringServiceName">Kaynak Ölçümü</String>
- <String Id="MeteringServiceDescription">Web Rolünden çalışma zamanı ve sistem bilgisi toplamayı ve yayımlamayı sağlar.</String>
- <String Id="QuotaEnforcementServiceName">Barındırma Kota Uygulama</String>
- <String Id="QuotaEnforcementServiceDescription">Web sitesi kaynak kullanımını izler ve kullanım kotası aşıldığında özel eylemler uygular.</String>
-</WixLocalization>
diff --git a/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props b/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props
index 23de62ca65..1e3896890e 100644
--- a/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props
+++ b/src/Installers/Windows/AspNetCoreModule-Setup/build/settings/common.props
@@ -14,8 +14,6 @@
<!-- General properties -->
<PropertyGroup>
- <IisOobWinSdkVersion Condition="'$(IisOobWinSdkVersion)' == ''">10.0.18362.0</IisOobWinSdkVersion>
- <WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">$(IisOobWinSdkVersion)</WindowsTargetPlatformVersion>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
@@ -25,7 +23,10 @@
<ItemDefinitionGroup>
<ClCompile>
- <WarningLevel>Level3</WarningLevel>
+ <!-- Microsoft.Security.SystemsADM.10086 - SDL required warnings -->
+ <!-- See https://github.com/dotnet/aspnetcore/issues/40525 -->
+ <WarningLevel>Level4</WarningLevel>
+ <TreatSpecificWarningsAsErrors>$(TreatSpecificWarningsAsErrors);4018;4055;4146;4242;4244;4267;4302;4308;4509;4510;4532;4533;4610;4611;4700;4701;4703;4789;4995;4996</TreatSpecificWarningsAsErrors>
</ClCompile>
</ItemDefinitionGroup>
diff --git a/src/Installers/Windows/SharedFramework/Product.wxs b/src/Installers/Windows/SharedFramework/Product.wxs
index 98b5756c69..ae95ee10ae 100644
--- a/src/Installers/Windows/SharedFramework/Product.wxs
+++ b/src/Installers/Windows/SharedFramework/Product.wxs
@@ -7,7 +7,7 @@
<MajorUpgrade DowngradeErrorMessage="A newer version of [ProductName] is already installed." Schedule="afterInstallFinalize" />
<Media Id="1" Cabinet="$(var.Cabinet)" CompressionLevel="high" EmbedCab="$(var.EmbedCab)" />
- <WixVariable Id="WixUILicenseRtf" Value="$(var.files)\eula.rtf" />
+ <WixVariable Id="WixUILicenseRtf" Value="$(var.files)\eula.txt" />
<UIRef Id="WixUI_Minimal" />
<FeatureRef Id="FT_DepProvider" />
@@ -53,7 +53,7 @@
</Feature>
<ComponentGroup Id="CG_ProductInfo">
- <ComponentRef Id="C_eula.rtf" />
+ <ComponentRef Id="C_eula.txt" />
<ComponentRef Id="C_ProductVersion"/>
<ComponentRef Id="C_ProductInstallDir"/>
<?if $(var.Platform)=x64 ?>
@@ -63,8 +63,8 @@
</ComponentGroup>
<DirectoryRef Id="SharedFolder">
- <Component Id="C_eula.rtf">
- <File Name="eula.rtf" Source="$(var.files)\eula.rtf" />
+ <Component Id="C_eula.txt">
+ <File Name="eula.txt" Source="$(var.files)\eula.txt" />
</Component>
<?ifdef ProductVersionKey?>
diff --git a/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs b/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs
index 453548c275..ca33112a07 100644
--- a/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs
+++ b/src/Installers/Windows/SharedFrameworkBundle/Bundle.wxs
@@ -4,6 +4,7 @@
<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.HyperlinkLicense">
<bal:WixStandardBootstrapperApplication LicenseUrl="https://go.microsoft.com/fwlink/?LinkId=329770"
LogoFile="DotNetLogo.bmp"
+ SuppressDowngradeFailure="yes"
SuppressOptionsUI="yes"
ThemeFile="thm.xml"
LocalizationFile="thm.wxl"/>
diff --git a/src/Installers/Windows/TargetingPack/Product.wxs b/src/Installers/Windows/TargetingPack/Product.wxs
index 6317450b26..5b28e5e417 100644
--- a/src/Installers/Windows/TargetingPack/Product.wxs
+++ b/src/Installers/Windows/TargetingPack/Product.wxs
@@ -13,7 +13,7 @@
<Media Id="1" Cabinet="$(var.Cabinet)" CompressionLevel="high" EmbedCab="no" />
<?endif?>
- <WixVariable Id="WixUILicenseRtf" Value="$(var.files)\eula.rtf" />
+ <WixVariable Id="WixUILicenseRtf" Value="$(var.files)\eula.txt" />
<UIRef Id="WixUI_Minimal" />
<FeatureRef Id="FT_DepProvider" />
diff --git a/src/Installers/Windows/files/eula.rtf b/src/Installers/Windows/files/eula.rtf
deleted file mode 100644
index 70fb842c6c..0000000000
--- a/src/Installers/Windows/files/eula.rtf
+++ /dev/null
@@ -1,113 +0,0 @@
-{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Tahoma;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\fswiss\fprq2\fcharset0 Calibri;}{\f3\fnil\fcharset2 Symbol;}}
-{\colortbl ;\red31\green73\blue125;\red0\green0\blue255;}
-{\*\listtable
-{\list\listhybrid
-{\listlevel\levelnfc0\leveljc0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\jclisttab\tx360}
-{\listlevel\levelnfc4\leveljc0\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\jclisttab\tx363}
-{\listlevel\levelnfc2\leveljc0\levelstartat1{\leveltext\'02\'02.;}{\levelnumbers\'01;}\jclisttab\tx720}\listid1 }
-{\list\listhybrid
-{\listlevel\levelnfc0\leveljc0\levelstartat1{\leveltext\'02\'00.;}{\levelnumbers\'01;}\jclisttab\tx363}
-{\listlevel\levelnfc4\leveljc0\levelstartat1{\leveltext\'02\'01.;}{\levelnumbers\'01;}\jclisttab\tx363}\listid2 }}
-{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}{\listoverride\listid2\listoverridecount0\ls2}}
-{\*\generator Riched20 6.3.9600}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1
-\pard\nowidctlpar\sb120\sa120\b\f0\fs24 MICROSOFT SOFTWARE LICENSE TERMS\par
-
-\pard\brdrb\brdrs\brdrw10\brsp20 \nowidctlpar\sb120\sa120 MICROSOFT .NET LIBRARY \par
-
-\pard\nowidctlpar\sb120\sa120\fs19 These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. Please read them. They apply to the software named above, which includes the media on which you received it, if any. The terms also apply to any Microsoft\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent363{\pntxtb\'B7}}\nowidctlpar\fi-363\li720\sb120\sa120\b0 updates,\par
-{\pntext\f3\'B7\tab}supplements,\par
-{\pntext\f3\'B7\tab}Internet-based services, and\par
-{\pntext\f3\'B7\tab}support services\par
-
-\pard\nowidctlpar\sb120\sa120\b for this software, unless other terms accompany those items. If so, those terms apply.\par
-BY USING THE SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.\par
-
-\pard\brdrt\brdrs\brdrw10\brsp20 \nowidctlpar\sb120\sa120 IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE PERPETUAL RIGHTS BELOW.\par
-
-\pard
-{\listtext\f0 1.\tab}\jclisttab\tx360\ls1\nowidctlpar\fi-357\li357\sb120\sa120 INSTALLATION AND USE RIGHTS. \par
-
-\pard
-{\listtext\f0 a.\tab}\jclisttab\tx363\ls1\ilvl1\nowidctlpar\fi-363\li720\sb120\sa120 Installation and Use.\b0\fs20 You may install and use any number of copies of the software to design, develop and test your programs.\par
-{\listtext\f0 b.\tab}\b\fs19 Third Party Programs.\b0\fs20 The software may include third party programs that Microsoft, not the third party, licenses to you under this agreement. Notices, if any, for the third party program are included for your information only.\b\fs19\par
-
-\pard
-{\listtext\f0 2.\tab}\jclisttab\tx360\ls1\nowidctlpar\fi-357\li357\sb120\sa120\fs20 ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS.\par
-
-\pard
-{\listtext\f0 a.\tab}\jclisttab\tx363\ls1\ilvl1\nowidctlpar\fi-363\li720\sb120\sa120 DISTRIBUTABLE CODE.\~ \b0 The software is comprised of Distributable Code. \f1\ldblquote\f0 Distributable Code\f1\rdblquote\f0 is code that you are permitted to distribute in programs you develop if you comply with the terms below.\b\par
-
-\pard
-{\listtext\f0 i.\tab}\jclisttab\tx720\ls1\ilvl2\nowidctlpar\fi-357\li1077\sb120\sa120\tx1077 Right to Use and Distribute. \par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-357\li1434\sb120\sa120\b0 You may copy and distribute the object code form of the software.\par
-{\pntext\f3\'B7\tab}Third Party Distribution. You may permit distributors of your programs to copy and distribute the Distributable Code as part of those programs.\par
-
-\pard\nowidctlpar\fi-357\li1077\sb120\sa120\tx1077\b ii.\tab Distribution Requirements.\b0 \b For any Distributable Code you distribute, you must\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-357\li1434\sb120\sa120\b0 add significant primary functionality to it in your programs;\par
-{\pntext\f3\'B7\tab}require distributors and external end users to agree to terms that protect it at least as much as this agreement;\par
-{\pntext\f3\'B7\tab}display your valid copyright notice on your programs; and\par
-{\pntext\f3\'B7\tab}indemnify, defend, and hold harmless Microsoft from any claims, including attorneys\rquote fees, related to the distribution or use of your programs.\par
-
-\pard\nowidctlpar\fi-357\li1077\sb120\sa120\tx1077\b iii.\tab Distribution Restrictions.\b0 \b You may not\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-357\li1434\sb120\sa120\b0 alter any copyright, trademark or patent notice in the Distributable Code;\par
-{\pntext\f3\'B7\tab}use Microsoft\rquote s trademarks in your programs\rquote names or in a way that suggests your programs come from or are endorsed by Microsoft;\par
-{\pntext\f3\'B7\tab}include Distributable Code in malicious, deceptive or unlawful programs; or\par
-{\pntext\f3\'B7\tab}modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\fi-358\li1792\sb120\sa120 the code be disclosed or distributed in source code form; or\cf1\f2\par
-{\pntext\f3\'B7\tab}\cf0\f0 others have the right to modify it.\cf1\f2\par
-
-\pard\nowidctlpar\fi-357\li357\sb120\sa120\cf0\b\f0 3.\tab\fs19 SCOPE OF LICENSE. \b0 The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent363{\pntxtb\'B7}}\nowidctlpar\fi-363\li720\sb120\sa120 work around any technical limitations in the software;\par
-{\pntext\f3\'B7\tab}reverse engineer, decompile or disassemble the software, except and only to the extent that applicable law expressly permits, despite this limitation;\par
-{\pntext\f3\'B7\tab}publish the software for others to copy;\par
-{\pntext\f3\'B7\tab}rent, lease or lend the software;\par
-{\pntext\f3\'B7\tab}transfer the software or this agreement to any third party; or\par
-{\pntext\f3\'B7\tab}use the software for commercial software hosting services.\par
-
-\pard\nowidctlpar\fi-357\li357\sb120\sa120\b\fs20 4.\tab\fs19 BACKUP COPY. \b0 You may make one backup copy of the software. You may use it only to reinstall the software.\par
-\b\fs20 5.\tab\fs19 DOCUMENTATION. \b0 Any person that has valid access to your computer or internal network may copy and use the documentation for your internal, reference purposes.\par
-\b\fs20 6.\tab\fs19 EXPORT RESTRICTIONS. \b0 The software is subject to United States export laws and regulations. You must comply with all domestic and international export laws and regulations that apply to the software. These laws include restrictions on destinations, end users and end use. For additional information, see {\fs20{\field{\*\fldinst{HYPERLINK www.microsoft.com/exporting }}{\fldrslt{www.microsoft.com/exporting\ul0\cf0}}}}\f0\fs19 .\fs20\par
-\b 7.\tab\fs19 SUPPORT SERVICES. \b0 Because this software is \ldblquote as is,\rdblquote we may not provide support services for it.\par
-\b\fs20 8.\tab\fs19 ENTIRE AGREEMENT. \b0 This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services.\par
-\b\fs20 9.\tab\fs19 APPLICABLE LAW.\par
-
-\pard
-{\listtext\f0 a.\tab}\jclisttab\tx363\ls2\ilvl1\nowidctlpar\fi-363\li720\sb120\sa120 United States. \b0 If you acquired the software in the United States, Washington state law governs the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of laws principles. The laws of the state where you live govern all other claims, including claims under state consumer protection laws, unfair competition laws, and in tort.\par
-{\listtext\f0 b.\tab}\b Outside the United States. If you acquired the software in any other country, the laws of that country apply.\par
-
-\pard
-{\pntext\f0 1.\tab}{\*\pn\pnlvlbody\pnf0\pnindent360\pnstart1\pndec{\pntxta.}}
-\nowidctlpar\fi-357\li357\sb120\sa120 LEGAL EFFECT. \b0 This agreement describes certain legal rights. You may have other rights under the laws of your country. You may also have rights with respect to the party from whom you acquired the software. This agreement does not change your rights under the laws of your country if the laws of your country do not permit it to do so.\par
-{\pntext\f0 2.\tab}\b DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED \ldblquote AS-IS.\rdblquote YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. YOU MAY HAVE ADDITIONAL CONSUMER RIGHTS OR STATUTORY GUARANTEES UNDER YOUR LOCAL LAWS WHICH THIS AGREEMENT CANNOT CHANGE. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\par
-
-\pard\nowidctlpar\li357\sb120\sa120 FOR AUSTRALIA \endash YOU HAVE STATUTORY GUARANTEES UNDER THE AUSTRALIAN CONSUMER LAW AND NOTHING IN THESE TERMS IS INTENDED TO AFFECT THOSE RIGHTS.\par
-
-\pard\nowidctlpar\fi-357\li357\sb120\sa120\fs20 12.\tab\fs19 LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES.\par
-
-\pard\nowidctlpar\li357\sb120\sa120\b0 This limitation applies to\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent363{\pntxtb\'B7}}\nowidctlpar\fi-363\li720\sb120\sa120 anything related to the software, services, content (including code) on third party Internet sites, or third party programs; and\par
-{\pntext\f3\'B7\tab}claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law.\par
-
-\pard\nowidctlpar\sb120\sa120 It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your country may not allow the exclusion or limitation of incidental, consequential or other damages.\par
-\lang9 Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French.\par
-Remarque : Ce logiciel \'e9tant distribu\'e9 au Qu\'e9bec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en fran\'e7ais.\par
-\b\lang1033 EXON\'c9RATION DE GARANTIE. \b0 Le logiciel vis\'e9 par une licence est offert \'ab tel quel \'bb. Toute utilisation de ce logiciel est \'e0 votre seule risque et p\'e9ril. Microsoft n\rquote accorde aucune autre garantie expresse. Vous pouvez b\'e9n\'e9ficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualit\'e9 marchande, d\rquote ad\'e9quation \'e0 un usage particulier et d\rquote absence de contrefa\'e7on sont exclues.\par
-\b LIMITATION DES DOMMAGES-INT\'c9R\'caTS ET EXCLUSION DE RESPONSABILIT\'c9 POUR LES DOMMAGES. \b0 Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement \'e0 hauteur de 5,00 $ US. Vous ne pouvez pr\'e9tendre \'e0 aucune indemnisation pour les autres dommages, y compris les dommages sp\'e9ciaux, indirects ou accessoires et pertes de b\'e9n\'e9fices.\par
-\lang9 Cette limitation concerne :\par
-
-\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent360{\pntxtb\'B7}}\nowidctlpar\li720\sb120\sa120 tout ce qui est reli\'e9 au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et\par
-{\pntext\f3\'B7\tab}les r\'e9clamations au titre de violation de contrat ou de garantie, ou au titre de responsabilit\'e9 stricte, de n\'e9gligence ou d\rquote une autre faute dans la limite autoris\'e9e par la loi en vigueur.\par
-
-\pard\nowidctlpar\sb120\sa120 Elle s\rquote applique \'e9galement, m\'eame si Microsoft connaissait ou devrait conna\'eetre l\rquote\'e9ventualit\'e9 d\rquote un tel dommage. Si votre pays n\rquote autorise pas l\rquote exclusion ou la limitation de responsabilit\'e9 pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l\rquote exclusion ci-dessus ne s\rquote appliquera pas \'e0 votre \'e9gard.\par
-\b\lang1033 EFFET JURIDIQUE. \b0 Le pr\'e9sent contrat d\'e9crit certains droits juridiques. Vous pourriez avoir d\rquote autres droits pr\'e9vus par les lois de votre pays. Le pr\'e9sent contrat ne modifie pas les droits que vous conf\'e8rent les lois de votre pays si celles-ci ne le permettent pas.\par
-\b\fs20\lang1036\par
-}
-
diff --git a/src/Installers/Windows/files/eula.txt b/src/Installers/Windows/files/eula.txt
new file mode 100644
index 0000000000..984713a496
--- /dev/null
+++ b/src/Installers/Windows/files/eula.txt
@@ -0,0 +1,23 @@
+The MIT License (MIT)
+
+Copyright (c) .NET Foundation and Contributors
+
+All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/JSInterop/Microsoft.JSInterop.JS/src/.npmrc b/src/JSInterop/Microsoft.JSInterop.JS/src/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/JSInterop/Microsoft.JSInterop.JS/src/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/JSInterop/Microsoft.JSInterop.JS/src/package.json b/src/JSInterop/Microsoft.JSInterop.JS/src/package.json
index 7025dc93af..268464037c 100644
--- a/src/JSInterop/Microsoft.JSInterop.JS/src/package.json
+++ b/src/JSInterop/Microsoft.JSInterop.JS/src/package.json
@@ -26,10 +26,10 @@
"dist/**"
],
"devDependencies": {
- "@typescript-eslint/eslint-plugin": "^5.8.0",
- "@typescript-eslint/parser": "^5.8.0",
- "eslint": "^8.5.0",
- "eslint-plugin-jsdoc": "^37.4.0",
+ "@typescript-eslint/eslint-plugin": "^5.26.0",
+ "@typescript-eslint/parser": "^5.26.0",
+ "eslint": "^8.16.0",
+ "eslint-plugin-jsdoc": "^39.3.2",
"eslint-plugin-prefer-arrow": "^1.2.3",
"rimraf": "^3.0.2",
"typescript": "^4.2.2"
diff --git a/src/JSInterop/Microsoft.JSInterop.JS/src/src/Microsoft.JSInterop.ts b/src/JSInterop/Microsoft.JSInterop.JS/src/src/Microsoft.JSInterop.ts
index e29f430f0c..46676d0d6f 100644
--- a/src/JSInterop/Microsoft.JSInterop.JS/src/src/Microsoft.JSInterop.ts
+++ b/src/JSInterop/Microsoft.JSInterop.JS/src/src/Microsoft.JSInterop.ts
@@ -392,12 +392,10 @@ export module DotNet {
if (asyncHandle) {
// On completion, dispatch result back to .NET
// Not using "await" because it codegens a lot of boilerplate
- promise.then(
- result => getRequiredDispatcher().endInvokeJSFromDotNet(asyncHandle, true, stringifyArgs([
- asyncHandle,
- true,
- createJSCallResult(result, resultType)
- ])),
+ promise
+ .then(result => stringifyArgs([asyncHandle, true, createJSCallResult(result, resultType)]))
+ .then(
+ result => getRequiredDispatcher().endInvokeJSFromDotNet(asyncHandle, true, result),
error => getRequiredDispatcher().endInvokeJSFromDotNet(asyncHandle, false, JSON.stringify([
asyncHandle,
false,
diff --git a/src/JSInterop/Microsoft.JSInterop.JS/src/yarn.lock b/src/JSInterop/Microsoft.JSInterop.JS/src/yarn.lock
index 3dd5bed2fa..4470a246ea 100644
--- a/src/JSInterop/Microsoft.JSInterop.JS/src/yarn.lock
+++ b/src/JSInterop/Microsoft.JSInterop.JS/src/yarn.lock
@@ -2,28 +2,28 @@
# yarn lockfile v1
-"@es-joy/jsdoccomment@~0.20.1":
- version "0.20.1"
- resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.20.1.tgz#fe89f435f045ae5aaf89c7a4df3616c03e9d106e"
- integrity sha512-oeJK41dcdqkvdZy/HctKklJNkt/jh+av3PZARrZEl+fs/8HaHeeYoAvEwOV0u5I6bArTF17JEsTZMY359e/nfQ==
+"@es-joy/jsdoccomment@~0.31.0":
+ version "0.31.0"
+ resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz#dbc342cc38eb6878c12727985e693eaef34302bc"
+ integrity sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==
dependencies:
- comment-parser "1.3.0"
+ comment-parser "1.3.1"
esquery "^1.4.0"
- jsdoc-type-pratt-parser "~2.2.3"
+ jsdoc-type-pratt-parser "~3.1.0"
-"@eslint/eslintrc@^1.2.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.2.0.tgz#7ce1547a5c46dfe56e1e45c3c9ed18038c721c6a"
- integrity sha512-igm9SjJHNEJRiUnecP/1R5T3wKLEJ7pL6e2P+GUSfCd0dGjPYYZve08uzw8L2J8foVHFz+NGu12JxRcU2gGo6w==
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
dependencies:
ajv "^6.12.4"
debug "^4.3.2"
- espree "^9.3.1"
- globals "^13.9.0"
- ignore "^4.0.6"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.2.1"
js-yaml "^4.1.0"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
strip-json-comments "^3.1.1"
"@humanwhocodes/config-array@^0.9.2":
@@ -62,99 +62,99 @@
fastq "^1.6.0"
"@types/json-schema@^7.0.9":
- version "7.0.9"
- resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
- integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
-
-"@typescript-eslint/eslint-plugin@^5.8.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.14.0.tgz#5119b67152356231a0e24b998035288a9cd21335"
- integrity sha512-ir0wYI4FfFUDfLcuwKzIH7sMVA+db7WYen47iRSaCGl+HMAZI9fpBwfDo45ZALD3A45ZGyHWDNLhbg8tZrMX4w==
- dependencies:
- "@typescript-eslint/scope-manager" "5.14.0"
- "@typescript-eslint/type-utils" "5.14.0"
- "@typescript-eslint/utils" "5.14.0"
- debug "^4.3.2"
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@typescript-eslint/eslint-plugin@^5.26.0":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.3.tgz#2f293e56b73c4f281e48d253af4a17f21a55d54c"
+ integrity sha512-QEgE1uahnDbWEkZlidq7uKB630ny1NN8KbLPmznX+8hYsYpoV1/quG1Nzvs141FVuumuS7O0EpqYw3RB4AVzRg==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.30.3"
+ "@typescript-eslint/type-utils" "5.30.3"
+ "@typescript-eslint/utils" "5.30.3"
+ debug "^4.3.4"
functional-red-black-tree "^1.0.1"
- ignore "^5.1.8"
+ ignore "^5.2.0"
regexpp "^3.2.0"
- semver "^7.3.5"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/parser@^5.8.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.14.0.tgz#7c79f898aa3cff0ceee6f1d34eeed0f034fb9ef3"
- integrity sha512-aHJN8/FuIy1Zvqk4U/gcO/fxeMKyoSv/rS46UXMXOJKVsLQ+iYPuXNbpbH7cBLcpSbmyyFbwrniLx5+kutu1pw==
+"@typescript-eslint/parser@^5.26.0":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.3.tgz#d288c7dbeadf22403112c773dd53e0700f6dd6d5"
+ integrity sha512-ddwGEPC3E49DduAUC8UThQafHRE5uc1NE8jdOgl+w8/NrYF50MJQNeD3u4JZrqAXdY9rJz0CdQ9HpNME20CzkA==
dependencies:
- "@typescript-eslint/scope-manager" "5.14.0"
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/typescript-estree" "5.14.0"
- debug "^4.3.2"
+ "@typescript-eslint/scope-manager" "5.30.3"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/typescript-estree" "5.30.3"
+ debug "^4.3.4"
-"@typescript-eslint/scope-manager@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.14.0.tgz#ea518962b42db8ed0a55152ea959c218cb53ca7b"
- integrity sha512-LazdcMlGnv+xUc5R4qIlqH0OWARyl2kaP8pVCS39qSL3Pd1F7mI10DbdXeARcE62sVQE4fHNvEqMWsypWO+yEw==
+"@typescript-eslint/scope-manager@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.3.tgz#de7edb0b59efd71975a82cbf3f1b97c5c90769f0"
+ integrity sha512-yVJIIUXeo/vv6Alj6lKBvsqnRs5hcxUpN3Dg3aD9Zv6r7p6Nn106jJcr5rnpRHAReEb/aMI2RWrt3JmL17eCVA==
dependencies:
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/visitor-keys" "5.14.0"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/visitor-keys" "5.30.3"
-"@typescript-eslint/type-utils@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.14.0.tgz#711f08105860b12988454e91df433567205a8f0b"
- integrity sha512-d4PTJxsqaUpv8iERTDSQBKUCV7Q5yyXjqXUl3XF7Sd9ogNLuKLkxz82qxokqQ4jXdTPZudWpmNtr/JjbbvUixw==
+"@typescript-eslint/type-utils@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.3.tgz#1bb4efcfc8de38086d50096709b2cccf72684515"
+ integrity sha512-IIzakE7OXOqdwPaXhRiPnaZ8OuJJYBLufOffd9fqzkI4IMFIYq8KC7bghdnF7QUJTirURRErQFrJ/w5UpwIqaw==
dependencies:
- "@typescript-eslint/utils" "5.14.0"
- debug "^4.3.2"
+ "@typescript-eslint/utils" "5.30.3"
+ debug "^4.3.4"
tsutils "^3.21.0"
-"@typescript-eslint/types@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.14.0.tgz#96317cf116cea4befabc0defef371a1013f8ab11"
- integrity sha512-BR6Y9eE9360LNnW3eEUqAg6HxS9Q35kSIs4rp4vNHRdfg0s+/PgHgskvu5DFTM7G5VKAVjuyaN476LCPrdA7Mw==
+"@typescript-eslint/types@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.3.tgz#8ef6313dcec2e297b167dd25ef363e36857c49ff"
+ integrity sha512-vshU3pjSTgBPNgfd55JLYngHkXuwQP68fxYFUAg1Uq+JrR3xG/XjvL9Dmv28CpOERtqwkaR4QQ3mD0NLZcE2Xw==
-"@typescript-eslint/typescript-estree@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.14.0.tgz#78b7f7385d5b6f2748aacea5c9b7f6ae62058314"
- integrity sha512-QGnxvROrCVtLQ1724GLTHBTR0lZVu13izOp9njRvMkCBgWX26PKvmMP8k82nmXBRD3DQcFFq2oj3cKDwr0FaUA==
+"@typescript-eslint/typescript-estree@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.3.tgz#d5ff918499dd56039864c157a898b1322d7bff8c"
+ integrity sha512-jqVh5N9AJx6+7yRgoA+ZelAFrHezgI9pzI9giv7s84DDOmtpFwTgURcpICDHyz9x6vAeOu91iACZ4dBTVfzIyA==
dependencies:
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/visitor-keys" "5.14.0"
- debug "^4.3.2"
- globby "^11.0.4"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/visitor-keys" "5.30.3"
+ debug "^4.3.4"
+ globby "^11.1.0"
is-glob "^4.0.3"
- semver "^7.3.5"
+ semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/utils@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.14.0.tgz#6c8bc4f384298cbbb32b3629ba7415f9f80dc8c4"
- integrity sha512-EHwlII5mvUA0UsKYnVzySb/5EE/t03duUTweVy8Zqt3UQXBrpEVY144OTceFKaOe4xQXZJrkptCf7PjEBeGK4w==
+"@typescript-eslint/utils@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.3.tgz#be2ebaef73e5610c866c4f29ed33669acc89e3fc"
+ integrity sha512-OEaBXGxxdIy35H+jyXfYAMQ66KMJczK9hEhL3gR6IRbWe5PyK+bPDC9zbQNVII6rNFTfF/Mse0z21NlEU+vOMw==
dependencies:
"@types/json-schema" "^7.0.9"
- "@typescript-eslint/scope-manager" "5.14.0"
- "@typescript-eslint/types" "5.14.0"
- "@typescript-eslint/typescript-estree" "5.14.0"
+ "@typescript-eslint/scope-manager" "5.30.3"
+ "@typescript-eslint/types" "5.30.3"
+ "@typescript-eslint/typescript-estree" "5.30.3"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
-"@typescript-eslint/visitor-keys@5.14.0":
- version "5.14.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.14.0.tgz#1927005b3434ccd0d3ae1b2ecf60e65943c36986"
- integrity sha512-yL0XxfzR94UEkjBqyymMLgCBdojzEuy/eim7N9/RIcTNxpJudAcqsU8eRyfzBbcEzGoPWfdM3AGak3cN08WOIw==
+"@typescript-eslint/visitor-keys@5.30.3":
+ version "5.30.3"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.3.tgz#2c5f7a16c36748d1c51ea5a9c29bfb64780ce466"
+ integrity sha512-ep2xtHOhnSRt6fDP9DSSxrA/FqZhdMF7/Y9fYsxrKss2uWJMbzJyBJ/We1fKc786BJ10pHwrzUlhvpz8i7XzBg==
dependencies:
- "@typescript-eslint/types" "5.14.0"
- eslint-visitor-keys "^3.0.0"
+ "@typescript-eslint/types" "5.30.3"
+ eslint-visitor-keys "^3.3.0"
-acorn-jsx@^5.3.1:
+acorn-jsx@^5.3.2:
version "5.3.2"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
-acorn@^8.7.0:
- version "8.7.0"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf"
- integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
+acorn@^8.7.1:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
ajv@^6.10.0, ajv@^6.12.4:
version "6.12.6"
@@ -201,7 +201,7 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
-braces@^3.0.1:
+braces@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -233,15 +233,15 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-comment-parser@1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.0.tgz#68beb7dbe0849295309b376406730cd16c719c44"
- integrity sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==
+comment-parser@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b"
+ integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
cross-spawn@^7.0.2:
version "7.0.3"
@@ -252,10 +252,10 @@ cross-spawn@^7.0.2:
shebang-command "^2.0.0"
which "^2.0.1"
-debug@^4.1.1, debug@^4.3.2, debug@^4.3.3:
- version "4.3.3"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
- integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==
+debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
dependencies:
ms "2.1.2"
@@ -283,18 +283,17 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-eslint-plugin-jsdoc@^37.4.0:
- version "37.9.7"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.7.tgz#ef46141aa2e5fcbb89adfa658eef8126435e9eac"
- integrity sha512-8alON8yYcStY94o0HycU2zkLKQdcS+qhhOUNQpfONHHwvI99afbmfpYuPqf6PbLz5pLZldG3Te5I0RbAiTN42g==
+eslint-plugin-jsdoc@^39.3.2:
+ version "39.3.3"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.3.tgz#75dd67ce581e7527a69f27800138cc0f9c388236"
+ integrity sha512-K/DAjKRUNaUTf0KQhI9PvsF+Y3mGDx/j0pofXsJCQe/tmRsRweBIXR353c8nAro0lytZYEf7l0PluBpzKDiHxw==
dependencies:
- "@es-joy/jsdoccomment" "~0.20.1"
- comment-parser "1.3.0"
- debug "^4.3.3"
+ "@es-joy/jsdoccomment" "~0.31.0"
+ comment-parser "1.3.1"
+ debug "^4.3.4"
escape-string-regexp "^4.0.0"
esquery "^1.4.0"
- regextras "^0.8.0"
- semver "^7.3.5"
+ semver "^7.3.7"
spdx-expression-parse "^3.0.1"
eslint-plugin-prefer-arrow@^1.2.3:
@@ -330,17 +329,17 @@ eslint-visitor-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint-visitor-keys@^3.0.0, eslint-visitor-keys@^3.3.0:
+eslint-visitor-keys@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-eslint@^8.5.0:
- version "8.10.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.10.0.tgz#931be395eb60f900c01658b278e05b6dae47199d"
- integrity sha512-tcI1D9lfVec+R4LE1mNDnzoJ/f71Kl/9Cv4nG47jOueCMBrCCKYXr4AUVS7go6mWYGFD4+EoN6+eXSrEbRzXVw==
+eslint@^8.16.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.18.0.tgz#78d565d16c993d0b73968c523c0446b13da784fd"
+ integrity sha512-As1EfFMVk7Xc6/CvhssHUjsAQSkpfXvUGMFC3ce8JDe6WvqCgRrLOBQbVpsBFr1X1V+RACOadnzVvcUS5ni2bA==
dependencies:
- "@eslint/eslintrc" "^1.2.0"
+ "@eslint/eslintrc" "^1.3.0"
"@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
@@ -351,14 +350,14 @@ eslint@^8.5.0:
eslint-scope "^7.1.1"
eslint-utils "^3.0.0"
eslint-visitor-keys "^3.3.0"
- espree "^9.3.1"
+ espree "^9.3.2"
esquery "^1.4.0"
esutils "^2.0.2"
fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^6.0.1"
- globals "^13.6.0"
+ globals "^13.15.0"
ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
@@ -367,7 +366,7 @@ eslint@^8.5.0:
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
lodash.merge "^4.6.2"
- minimatch "^3.0.4"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
regexpp "^3.2.0"
@@ -376,13 +375,13 @@ eslint@^8.5.0:
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^9.3.1:
- version "9.3.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
- integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
dependencies:
- acorn "^8.7.0"
- acorn-jsx "^5.3.1"
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
eslint-visitor-keys "^3.3.0"
esquery@^1.4.0:
@@ -438,7 +437,7 @@ fast-json-stable-stringify@^2.0.0:
fast-levenshtein@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
- integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
fastq@^1.6.0:
version "1.13.0"
@@ -470,19 +469,19 @@ flat-cache@^3.0.4:
rimraf "^3.0.2"
flatted@^3.1.0:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
- integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
+ version "3.2.6"
+ resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2"
+ integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
- integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
glob-parent@^5.1.2:
version "5.1.2"
@@ -499,25 +498,25 @@ glob-parent@^6.0.1:
is-glob "^4.0.3"
glob@^7.1.3:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
- integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
- minimatch "^3.0.4"
+ minimatch "^3.1.1"
once "^1.3.0"
path-is-absolute "^1.0.0"
-globals@^13.6.0, globals@^13.9.0:
- version "13.12.1"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb"
- integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
dependencies:
type-fest "^0.20.2"
-globby@^11.0.4:
+globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -534,12 +533,7 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.8, ignore@^5.2.0:
+ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
@@ -555,12 +549,12 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
dependencies:
once "^1.3.0"
wrappy "1"
@@ -573,7 +567,7 @@ inherits@2:
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
- integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
@@ -590,7 +584,7 @@ is-number@^7.0.0:
isexe@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
js-yaml@^4.1.0:
version "4.1.0"
@@ -599,10 +593,10 @@ js-yaml@^4.1.0:
dependencies:
argparse "^2.0.1"
-jsdoc-type-pratt-parser@~2.2.3:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-2.2.3.tgz#3910cd0120054a512a73942d644ef1eb5a9df6e9"
- integrity sha512-QPyxq62Q8veBSDtDrWmqaEPjSCeknUV9dH/OAGt3q9an8qC8UQDqitQiw1NvoMskIESpoRZ6qzt4H3rlK0xo8A==
+jsdoc-type-pratt-parser@~3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz#a4a56bdc6e82e5865ffd9febc5b1a227ff28e67e"
+ integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==
json-schema-traverse@^0.4.1:
version "0.4.1"
@@ -612,7 +606,7 @@ json-schema-traverse@^0.4.1:
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
- integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
levn@^0.4.1:
version "0.4.1"
@@ -640,14 +634,14 @@ merge2@^1.3.0, merge2@^1.4.1:
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
micromatch@^4.0.4:
- version "4.0.4"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
- integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
dependencies:
- braces "^3.0.1"
- picomatch "^2.2.3"
+ braces "^3.0.2"
+ picomatch "^2.3.1"
-minimatch@^3.0.4:
+minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -662,12 +656,12 @@ ms@2.1.2:
natural-compare@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
@@ -693,7 +687,7 @@ parent-module@^1.0.0:
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
path-key@^3.1.0:
version "3.1.1"
@@ -705,7 +699,7 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-picomatch@^2.2.3:
+picomatch@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
@@ -730,11 +724,6 @@ regexpp@^3.2.0:
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
-regextras@^0.8.0:
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.8.0.tgz#ec0f99853d4912839321172f608b544814b02217"
- integrity sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==
-
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
@@ -759,10 +748,10 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-semver@^7.3.5:
- version "7.3.5"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
- integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
dependencies:
lru-cache "^6.0.0"
@@ -823,7 +812,7 @@ supports-color@^7.1.0:
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
- integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
to-regex-range@^5.0.1:
version "5.0.1"
@@ -857,9 +846,9 @@ type-fest@^0.20.2:
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
typescript@^4.2.2:
- version "4.6.2"
- resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.2.tgz#fe12d2727b708f4eef40f51598b3398baa9611d4"
- integrity sha512-HM/hFigTBHZhLXshn9sN37H085+hQGeJHJ/X7LpBWLID/fbc2acUMfU+lGD98X81sKP+pFa9f0DZmCwB9GnbAg==
+ version "4.7.4"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235"
+ integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==
uri-js@^4.2.2:
version "4.4.1"
@@ -888,7 +877,7 @@ word-wrap@^1.2.3:
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
yallist@^4.0.0:
version "4.0.0"
diff --git a/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReference.cs b/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReference.cs
index b792268315..56de56eedb 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReference.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReference.cs
@@ -1,6 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
+
namespace Microsoft.JSInterop;
/// <summary>
@@ -13,7 +16,7 @@ public static class DotNetObjectReference
/// </summary>
/// <param name="value">The reference type to track.</param>
/// <returns>An instance of <see cref="DotNetObjectReference{TValue}" />.</returns>
- public static DotNetObjectReference<TValue> Create<TValue>(TValue value) where TValue : class
+ public static DotNetObjectReference<TValue> Create<[DynamicallyAccessedMembers(JSInvokable)] TValue>(TValue value) where TValue : class
{
if (value is null)
{
diff --git a/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReferenceOfT.cs b/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReferenceOfT.cs
index efe21477ce..8e2c9a3b08 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReferenceOfT.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/DotNetObjectReferenceOfT.cs
@@ -2,7 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
using Microsoft.JSInterop.Infrastructure;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.JSInterop;
@@ -13,7 +15,8 @@ namespace Microsoft.JSInterop;
/// To avoid leaking memory, the reference must later be disposed by JS code or by .NET code.
/// </summary>
/// <typeparam name="TValue">The type of the value to wrap.</typeparam>
-public sealed class DotNetObjectReference<TValue> : IDotNetObjectReference, IDisposable where TValue : class
+public sealed class DotNetObjectReference<[DynamicallyAccessedMembers(JSInvokable)] TValue> :
+ IDotNetObjectReference, IDisposable where TValue : class
{
private readonly TValue _value;
private long _objectId;
@@ -94,9 +97,6 @@ public sealed class DotNetObjectReference<TValue> : IDotNetObjectReference, IDis
internal void ThrowIfDisposed()
{
- if (Disposed)
- {
- throw new ObjectDisposedException(GetType().Name);
- }
+ ObjectDisposedException.ThrowIf(Disposed, this);
}
}
diff --git a/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledObjectReference.cs b/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledObjectReference.cs
index faff2634c4..e906556b00 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledObjectReference.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledObjectReference.cs
@@ -14,6 +14,7 @@ public interface IJSUnmarshalledObjectReference : IJSInProcessObjectReference
/// <typeparam name="TResult">The .NET type corresponding to the function's return value type.</typeparam>
/// <param name="identifier">The identifier used when registering the target function.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<TResult>(string identifier);
/// <summary>
@@ -24,6 +25,7 @@ public interface IJSUnmarshalledObjectReference : IJSInProcessObjectReference
/// <param name="identifier">The identifier used when registering the target function.</param>
/// <param name="arg0">The first argument.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<T0, TResult>(string identifier, T0 arg0);
/// <summary>
@@ -36,6 +38,7 @@ public interface IJSUnmarshalledObjectReference : IJSInProcessObjectReference
/// <param name="arg0">The first argument.</param>
/// <param name="arg1">The second argument.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<T0, T1, TResult>(string identifier, T0 arg0, T1 arg1);
/// <summary>
@@ -50,5 +53,6 @@ public interface IJSUnmarshalledObjectReference : IJSInProcessObjectReference
/// <param name="arg1">The second argument.</param>
/// <param name="arg2">The third argument.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<T0, T1, T2, TResult>(string identifier, T0 arg0, T1 arg1, T2 arg2);
}
diff --git a/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledRuntime.cs b/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledRuntime.cs
index 1708130ad5..d5241f1392 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledRuntime.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/IJSUnmarshalledRuntime.cs
@@ -17,6 +17,7 @@ public interface IJSUnmarshalledRuntime
/// <typeparam name="TResult">The .NET type corresponding to the function's return value type.</typeparam>
/// <param name="identifier">The identifier used when registering the target function.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<TResult>(string identifier);
/// <summary>
@@ -27,6 +28,7 @@ public interface IJSUnmarshalledRuntime
/// <param name="identifier">The identifier used when registering the target function.</param>
/// <param name="arg0">The first argument.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<T0, TResult>(string identifier, T0 arg0);
/// <summary>
@@ -39,6 +41,7 @@ public interface IJSUnmarshalledRuntime
/// <param name="arg0">The first argument.</param>
/// <param name="arg1">The second argument.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<T0, T1, TResult>(string identifier, T0 arg0, T1 arg1);
/// <summary>
@@ -53,5 +56,6 @@ public interface IJSUnmarshalledRuntime
/// <param name="arg1">The second argument.</param>
/// <param name="arg2">The third argument.</param>
/// <returns>The result of the function invocation.</returns>
+ [Obsolete("This method is obsolete. Use JSImportAttribute instead.")]
TResult InvokeUnmarshalled<T0, T1, T2, TResult>(string identifier, T0 arg0, T1 arg1, T2 arg2);
}
diff --git a/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSObjectReference.cs b/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSObjectReference.cs
index cb0af1c4da..ca5d958ad3 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSObjectReference.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/Implementation/JSObjectReference.cs
@@ -62,9 +62,6 @@ public class JSObjectReference : IJSObjectReference
/// <inheritdoc />
protected void ThrowIfDisposed()
{
- if (Disposed)
- {
- throw new ObjectDisposedException(GetType().Name);
- }
+ ObjectDisposedException.ThrowIf(Disposed, this);
}
}
diff --git a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetDispatcher.cs b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetDispatcher.cs
index 46a77c390e..38e84716e1 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetDispatcher.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetDispatcher.cs
@@ -11,15 +11,15 @@ using System.Runtime.ExceptionServices;
using System.Text;
using System.Text.Json;
using Microsoft.AspNetCore.Internal;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
-[assembly: MetadataUpdateHandler(typeof(Microsoft.JSInterop.Infrastructure.DotNetDispatcher))]
+[assembly: MetadataUpdateHandler(typeof(Microsoft.JSInterop.Infrastructure.DotNetDispatcher.MetadataUpdateHandler))]
namespace Microsoft.JSInterop.Infrastructure;
/// <summary>
/// Provides methods that receive incoming calls from JS to .NET.
/// </summary>
-[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2070", Justification = "Linker does not propogate annotations to generated state machine. https://github.com/mono/linker/issues/1403")]
public static class DotNetDispatcher
{
private const string DisposeDotNetObjectReferenceMethodName = "__Dispose";
@@ -41,6 +41,7 @@ public static class DotNetDispatcher
/// <param name="invocationInfo">The <see cref="DotNetInvocationInfo"/>.</param>
/// <param name="argsJson">A JSON representation of the parameters.</param>
/// <returns>A JSON representation of the return value, or null.</returns>
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to ensure return types of JSInvokable methods are retained.")]
public static string? Invoke(JSRuntime jsRuntime, in DotNetInvocationInfo invocationInfo, string argsJson)
{
// This method doesn't need [JSInvokable] because the platform is responsible for having
@@ -70,6 +71,7 @@ public static class DotNetDispatcher
/// <param name="invocationInfo">The <see cref="DotNetInvocationInfo"/>.</param>
/// <param name="argsJson">A JSON representation of the parameters.</param>
/// <returns>A JSON representation of the return value, or null.</returns>
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to ensure return types of JSInvokable methods are retained.")]
public static void BeginInvokeDotNet(JSRuntime jsRuntime, DotNetInvocationInfo invocationInfo, string argsJson)
{
// This method doesn't need [JSInvokable] because the platform is responsible for having
@@ -116,7 +118,7 @@ public static class DotNetDispatcher
task.ContinueWith(t => EndInvokeDotNetAfterTask(t, jsRuntime, invocationInfo), TaskScheduler.Current);
}
- else if(syncResult is ValueTask valueTaskResult)
+ else if (syncResult is ValueTask valueTaskResult)
{
valueTaskResult.AsTask().ContinueWith(t => EndInvokeDotNetAfterTask(t, jsRuntime, invocationInfo), TaskScheduler.Current);
}
@@ -136,6 +138,7 @@ public static class DotNetDispatcher
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to ensure return types of JSInvokable methods are retained.")]
private static void EndInvokeDotNetAfterTask(Task task, JSRuntime jsRuntime, in DotNetInvocationInfo invocationInfo)
{
if (task.Exception != null)
@@ -208,6 +211,7 @@ public static class DotNetDispatcher
}
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to ensure return types of JSInvokable methods are retained.")]
internal static object?[] ParseArguments(JSRuntime jsRuntime, string methodIdentifier, string arguments, Type[] parameterTypes)
{
if (parameterTypes.Length == 0)
@@ -380,7 +384,7 @@ public static class DotNetDispatcher
}
private static Task CreateValueTaskConverter<[DynamicallyAccessedMembers(LinkerFlags.JsonSerialized)] T>(object result) => ((ValueTask<T>)result).AsTask();
-
+
private static (MethodInfo methodInfo, Type[] parameterTypes) GetCachedMethodInfo(IDotNetObjectReference objectReference, string methodIdentifier)
{
var type = objectReference.Value.GetType();
@@ -394,7 +398,7 @@ public static class DotNetDispatcher
throw new ArgumentException($"The type '{type.Name}' does not contain a public invokable method with [{nameof(JSInvokableAttribute)}(\"{methodIdentifier}\")].");
}
- static Dictionary<string, (MethodInfo, Type[])> ScanTypeForCallableMethods(Type type)
+ static Dictionary<string, (MethodInfo, Type[])> ScanTypeForCallableMethods([DynamicallyAccessedMembers(JSInvokable)] Type type)
{
var result = new Dictionary<string, (MethodInfo, Type[])>(StringComparer.Ordinal);
@@ -425,6 +429,7 @@ public static class DotNetDispatcher
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "We expect application code is configured to ensure JSInvokable methods are retained. https://github.com/dotnet/aspnetcore/issues/29946")]
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072", Justification = "We expect application code is configured to ensure JSInvokable methods are retained. https://github.com/dotnet/aspnetcore/issues/29946")]
+ [UnconditionalSuppressMessage("Trimming", "IL2075", Justification = "We expect application code is configured to ensure JSInvokable methods are retained. https://github.com/dotnet/aspnetcore/issues/29946")]
private static Dictionary<string, (MethodInfo, Type[])> ScanAssemblyForCallableMethods(AssemblyKey assemblyKey)
{
// TODO: Consider looking first for assembly-level attributes (i.e., if there are any,
@@ -499,11 +504,16 @@ public static class DotNetDispatcher
?? throw new ArgumentException($"There is no loaded assembly with the name '{assemblyKey.AssemblyName}'.");
}
- private static void ClearCache(Type[]? _)
+ // don't point the MetadataUpdateHandlerAttribute at the DotNetDispatcher class, since the attribute has
+ // DynamicallyAccessedMemberTypes.All. This causes unnecessary trim warnings on the non-MetadataUpdateHandler methods.
+ internal static class MetadataUpdateHandler
{
- _cachedMethodsByAssembly.Clear();
- _cachedMethodsByType.Clear();
- _cachedConvertToTaskByType.Clear();
+ public static void ClearCache(Type[]? _)
+ {
+ _cachedMethodsByAssembly.Clear();
+ _cachedMethodsByType.Clear();
+ _cachedConvertToTaskByType.Clear();
+ }
}
private readonly struct AssemblyKey : IEquatable<AssemblyKey>
diff --git a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverter.cs b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverter.cs
index e99686cc61..a5f18229fe 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverter.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverter.cs
@@ -1,12 +1,14 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;
+using static Microsoft.AspNetCore.Internal.LinkerFlags;
namespace Microsoft.JSInterop.Infrastructure;
-internal sealed class DotNetObjectReferenceJsonConverter<TValue> : JsonConverter<DotNetObjectReference<TValue>> where TValue : class
+internal sealed class DotNetObjectReferenceJsonConverter<[DynamicallyAccessedMembers(JSInvokable)] TValue> : JsonConverter<DotNetObjectReference<TValue>> where TValue : class
{
public DotNetObjectReferenceJsonConverter(JSRuntime jsRuntime)
{
diff --git a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverterFactory.cs b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverterFactory.cs
index 8c1bb14d21..b769b949d9 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverterFactory.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/DotNetObjectReferenceJsonConverterFactory.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -20,6 +21,7 @@ internal sealed class DotNetObjectReferenceJsonConverterFactory : JsonConverterF
return typeToConvert.IsGenericType && typeToConvert.GetGenericTypeDefinition() == typeof(DotNetObjectReference<>);
}
+ [UnconditionalSuppressMessage("Trimming", "IL2055", Justification = "We expect that types used with DotNetObjectReference are retained.")]
public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions jsonSerializerOptions)
{
// System.Text.Json handles caching the converters per type on our behalf. No caching is required here.
diff --git a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/TaskGenericsUtil.cs b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/TaskGenericsUtil.cs
index 06921466a6..a03d87536d 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/TaskGenericsUtil.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/Infrastructure/TaskGenericsUtil.cs
@@ -64,12 +64,12 @@ internal static class TaskGenericsUtil
object? GetResult(Task task);
}
- private class TaskResultGetter<T> : ITaskResultGetter
+ private sealed class TaskResultGetter<T> : ITaskResultGetter
{
public object? GetResult(Task task) => ((Task<T>)task).Result!;
}
- private class VoidTaskResultGetter : ITaskResultGetter
+ private sealed class VoidTaskResultGetter : ITaskResultGetter
{
public object? GetResult(Task task)
{
@@ -78,7 +78,7 @@ internal static class TaskGenericsUtil
}
}
- private class TcsResultSetter<T> : ITcsResultSetter
+ private sealed class TcsResultSetter<T> : ITcsResultSetter
{
public Type ResultType => typeof(T);
diff --git a/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs b/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs
index 9656cd77c8..59cc9153d7 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs
+++ b/src/JSInterop/Microsoft.JSInterop/src/JSRuntime.cs
@@ -94,6 +94,7 @@ public abstract partial class JSRuntime : IJSRuntime, IDisposable
return await InvokeAsync<TValue>(targetInstanceId, identifier, CancellationToken.None, args);
}
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We expect application code is configured to ensure JS interop arguments are linker friendly.")]
internal ValueTask<TValue> InvokeAsync<[DynamicallyAccessedMembers(JsonSerialized)] TValue>(
long targetInstanceId,
string identifier,
@@ -225,6 +226,7 @@ public abstract partial class JSRuntime : IJSRuntime, IDisposable
}
[UnconditionalSuppressMessage("ReflectionAnalysis", "IL2072:RequiresUnreferencedCode", Justification = "We enforce trimmer attributes for JSON deserialized types on InvokeAsync.")]
+ [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We enforce trimmer attributes for JSON deserialized types on InvokeAsync.")]
internal bool EndInvokeJS(long taskId, bool succeeded, ref Utf8JsonReader jsonReader)
{
if (!_pendingTasks.TryRemove(taskId, out var tcs))
@@ -290,7 +292,7 @@ public abstract partial class JSRuntime : IJSRuntime, IDisposable
return streamId;
}
- internal long TrackObjectReference<TValue>(DotNetObjectReference<TValue> dotNetObjectReference) where TValue : class
+ internal long TrackObjectReference<[DynamicallyAccessedMembers(JSInvokable)] TValue>(DotNetObjectReference<TValue> dotNetObjectReference) where TValue : class
{
if (dotNetObjectReference == null)
{
diff --git a/src/JSInterop/Microsoft.JSInterop/src/Microsoft.JSInterop.WarningSuppressions.xml b/src/JSInterop/Microsoft.JSInterop/src/Microsoft.JSInterop.WarningSuppressions.xml
index 6306606df5..1af0e56483 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/Microsoft.JSInterop.WarningSuppressions.xml
+++ b/src/JSInterop/Microsoft.JSInterop/src/Microsoft.JSInterop.WarningSuppressions.xml
@@ -1,6 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?>
+<?xml version="1.0" encoding="utf-8"?>
<linker>
- <assembly fullname="Microsoft.JSInterop, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
+ <assembly fullname="Microsoft.JSInterop, Version=7.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60">
<attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
<argument>ILLink</argument>
<argument>IL2026</argument>
@@ -39,9 +39,9 @@
</attribute>
<attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
<argument>ILLink</argument>
- <argument>IL2060</argument>
+ <argument>IL2055</argument>
<property name="Scope">member</property>
- <property name="Target">M:Microsoft.JSInterop.Infrastructure.DotNetDispatcher.&lt;&gt;c.&lt;GetTaskByType&gt;b__14_0(System.Type,System.Reflection.MethodInfo)</property>
+ <property name="Target">M:Microsoft.JSInterop.Infrastructure.DotNetObjectReferenceJsonConverterFactory.CreateConverter(System.Type,System.Text.Json.JsonSerializerOptions)</property>
</attribute>
<attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
<argument>ILLink</argument>
@@ -67,5 +67,11 @@
<property name="Scope">member</property>
<property name="Target">M:Microsoft.JSInterop.JSRuntimeExtensions.&lt;InvokeAsync&gt;d__4`1.MoveNext</property>
</attribute>
+ <attribute fullname="System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
+ <argument>ILLink</argument>
+ <argument>IL2111</argument>
+ <property name="Scope">member</property>
+ <property name="Target">M:Microsoft.JSInterop.Infrastructure.DotNetDispatcher.GetCachedMethodInfo(Microsoft.JSInterop.Infrastructure.IDotNetObjectReference,System.String)</property>
+ </attribute>
</assembly>
-</linker>
+</linker> \ No newline at end of file
diff --git a/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Shipped.txt b/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Shipped.txt
index 7ca7a01daf..a0fba9ac06 100644
--- a/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Shipped.txt
+++ b/src/JSInterop/Microsoft.JSInterop/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.JSInterop.DotNetObjectReference<TValue>
+Microsoft.JSInterop.DotNetObjectReference<TValue>
abstract Microsoft.JSInterop.JSInProcessRuntime.InvokeJS(string! identifier, string? argsJson, Microsoft.JSInterop.JSCallResultType resultType, long targetInstanceId) -> string?
abstract Microsoft.JSInterop.JSRuntime.BeginInvokeJS(long taskId, string! identifier, string? argsJson, Microsoft.JSInterop.JSCallResultType resultType, long targetInstanceId) -> void
abstract Microsoft.JSInterop.JSRuntime.EndInvokeDotNet(Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo invocationInfo, in Microsoft.JSInterop.Infrastructure.DotNetInvocationResult invocationResult) -> void
@@ -50,12 +50,14 @@ Microsoft.JSInterop.Implementation.JSStreamReference
Microsoft.JSInterop.Implementation.JSStreamReference.Length.get -> long
Microsoft.JSInterop.Infrastructure.DotNetDispatcher
Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo
+Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo.DotNetInvocationInfo() -> void
Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo.AssemblyName.get -> string?
Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo.CallId.get -> string?
Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo.DotNetInvocationInfo(string? assemblyName, string! methodIdentifier, long dotNetObjectId, string? callId) -> void
Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo.DotNetObjectId.get -> long
Microsoft.JSInterop.Infrastructure.DotNetInvocationInfo.MethodIdentifier.get -> string!
Microsoft.JSInterop.Infrastructure.DotNetInvocationResult
+Microsoft.JSInterop.Infrastructure.DotNetInvocationResult.DotNetInvocationResult() -> void
Microsoft.JSInterop.Infrastructure.DotNetInvocationResult.ErrorKind.get -> string?
Microsoft.JSInterop.Infrastructure.DotNetInvocationResult.Exception.get -> System.Exception?
Microsoft.JSInterop.Infrastructure.DotNetInvocationResult.ResultJson.get -> string?
diff --git a/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj b/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj
index ac1da8c6f6..d9945fec8d 100644
--- a/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj
+++ b/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Product>Microsoft .NET Extensions</Product>
@@ -12,6 +12,7 @@ Microsoft.Extensions.Localization.IStringLocalizer&lt;T&gt;</Description>
<PackageTags>localization</PackageTags>
<IsAspNetCoreApp>true</IsAspNetCoreApp>
<Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
</Project>
diff --git a/src/Localization/Localization/src/Internal/AssemblyWrapper.cs b/src/Localization/Localization/src/Internal/AssemblyWrapper.cs
index 1f379d46cd..573348d1e0 100644
--- a/src/Localization/Localization/src/Internal/AssemblyWrapper.cs
+++ b/src/Localization/Localization/src/Internal/AssemblyWrapper.cs
@@ -11,7 +11,9 @@ namespace Microsoft.Extensions.Localization;
/// This API supports infrastructure and is not intended to be used
/// directly from your code. This API may change or be removed in future releases.
/// </summary>
+#pragma warning disable CA1852 // Seal internal types
internal class AssemblyWrapper
+#pragma warning restore CA1852 // Seal internal types
{
public AssemblyWrapper(Assembly assembly)
{
diff --git a/src/Localization/Localization/src/Internal/ResourceManagerStringProvider.cs b/src/Localization/Localization/src/Internal/ResourceManagerStringProvider.cs
index 8823ea7598..a92ef32d59 100644
--- a/src/Localization/Localization/src/Internal/ResourceManagerStringProvider.cs
+++ b/src/Localization/Localization/src/Internal/ResourceManagerStringProvider.cs
@@ -13,7 +13,9 @@ namespace Microsoft.Extensions.Localization;
/// This API supports infrastructure and is not intended to be used
/// directly from your code. This API may change or be removed in future releases.
/// </summary>
+#pragma warning disable CA1852 // Seal internal types
internal class ResourceManagerStringProvider : IResourceStringProvider
+#pragma warning restore CA1852 // Seal internal types
{
private readonly IResourceNamesCache _resourceNamesCache;
private readonly ResourceManager _resourceManager;
diff --git a/src/Localization/Localization/src/PublicAPI.Shipped.txt b/src/Localization/Localization/src/PublicAPI.Shipped.txt
index e7349b15e6..1c2bbe7910 100644
--- a/src/Localization/Localization/src/PublicAPI.Shipped.txt
+++ b/src/Localization/Localization/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory.ResourceManagerStringLocalizerFactory(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions!>! localizationOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory.ResourceManagerStringLocalizerFactory(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions!>! localizationOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
Microsoft.Extensions.DependencyInjection.LocalizationServiceCollectionExtensions
Microsoft.Extensions.Localization.IResourceNamesCache
Microsoft.Extensions.Localization.IResourceNamesCache.GetOrAdd(string! name, System.Func<string!, System.Collections.Generic.IList<string!>?>! valueFactory) -> System.Collections.Generic.IList<string!>?
diff --git a/src/Localization/Localization/src/PublicAPI.Unshipped.txt b/src/Localization/Localization/src/PublicAPI.Unshipped.txt
index 990999758d..7dc5c58110 100644
--- a/src/Localization/Localization/src/PublicAPI.Unshipped.txt
+++ b/src/Localization/Localization/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory.ResourceManagerStringLocalizerFactory(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions!>! localizationOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.Extensions.Localization.ResourceManagerStringLocalizerFactory.ResourceManagerStringLocalizerFactory(Microsoft.Extensions.Options.IOptions<Microsoft.Extensions.Localization.LocalizationOptions!>! localizationOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/Logging.AzureAppServices/src/BatchingLogger.cs b/src/Logging.AzureAppServices/src/BatchingLogger.cs
index 321749badb..5b6cdf5057 100644
--- a/src/Logging.AzureAppServices/src/BatchingLogger.cs
+++ b/src/Logging.AzureAppServices/src/BatchingLogger.cs
@@ -7,7 +7,7 @@ using System.Text;
namespace Microsoft.Extensions.Logging.AzureAppServices;
-internal class BatchingLogger : ILogger
+internal sealed class BatchingLogger : ILogger
{
private readonly BatchingLoggerProvider _provider;
private readonly string _category;
diff --git a/src/Logging.AzureAppServices/src/BlobAppendReferenceWrapper.cs b/src/Logging.AzureAppServices/src/BlobAppendReferenceWrapper.cs
index 38749564fd..a773b80527 100644
--- a/src/Logging.AzureAppServices/src/BlobAppendReferenceWrapper.cs
+++ b/src/Logging.AzureAppServices/src/BlobAppendReferenceWrapper.cs
@@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace Microsoft.Extensions.Logging.AzureAppServices;
/// <inheritdoc />
-internal class BlobAppendReferenceWrapper : ICloudAppendBlob
+internal sealed class BlobAppendReferenceWrapper : ICloudAppendBlob
{
private readonly Uri _fullUri;
private readonly HttpClient _client;
diff --git a/src/Logging.AzureAppServices/src/BlobLoggerConfigureOptions.cs b/src/Logging.AzureAppServices/src/BlobLoggerConfigureOptions.cs
index 600a2cc92f..9939e4d7db 100644
--- a/src/Logging.AzureAppServices/src/BlobLoggerConfigureOptions.cs
+++ b/src/Logging.AzureAppServices/src/BlobLoggerConfigureOptions.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.Logging.AzureAppServices;
-internal class BlobLoggerConfigureOptions : BatchLoggerConfigureOptions, IConfigureOptions<AzureBlobLoggerOptions>
+internal sealed class BlobLoggerConfigureOptions : BatchLoggerConfigureOptions, IConfigureOptions<AzureBlobLoggerOptions>
{
private readonly IConfiguration _configuration;
private readonly IWebAppContext _context;
diff --git a/src/Logging.AzureAppServices/src/ConfigurationBasedLevelSwitcher.cs b/src/Logging.AzureAppServices/src/ConfigurationBasedLevelSwitcher.cs
index b879c54130..57c8983afb 100644
--- a/src/Logging.AzureAppServices/src/ConfigurationBasedLevelSwitcher.cs
+++ b/src/Logging.AzureAppServices/src/ConfigurationBasedLevelSwitcher.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.Logging.AzureAppServices;
-internal class ConfigurationBasedLevelSwitcher : IConfigureOptions<LoggerFilterOptions>
+internal sealed class ConfigurationBasedLevelSwitcher : IConfigureOptions<LoggerFilterOptions>
{
private readonly IConfiguration _configuration;
private readonly Type _provider;
diff --git a/src/Logging.AzureAppServices/src/FileLoggerConfigureOptions.cs b/src/Logging.AzureAppServices/src/FileLoggerConfigureOptions.cs
index ad24d4ace0..15032e13b5 100644
--- a/src/Logging.AzureAppServices/src/FileLoggerConfigureOptions.cs
+++ b/src/Logging.AzureAppServices/src/FileLoggerConfigureOptions.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.Logging.AzureAppServices;
-internal class FileLoggerConfigureOptions : BatchLoggerConfigureOptions, IConfigureOptions<AzureFileLoggerOptions>
+internal sealed class FileLoggerConfigureOptions : BatchLoggerConfigureOptions, IConfigureOptions<AzureFileLoggerOptions>
{
private readonly IWebAppContext _context;
diff --git a/src/Logging.AzureAppServices/src/PublicAPI.Shipped.txt b/src/Logging.AzureAppServices/src/PublicAPI.Shipped.txt
index a710df1a25..391e22724e 100644
--- a/src/Logging.AzureAppServices/src/PublicAPI.Shipped.txt
+++ b/src/Logging.AzureAppServices/src/PublicAPI.Shipped.txt
@@ -14,6 +14,7 @@
~static Microsoft.Extensions.Logging.AzureAppServicesLoggerFactoryExtensions.AddAzureWebAppDiagnostics(this Microsoft.Extensions.Logging.ILoggingBuilder builder) -> Microsoft.Extensions.Logging.ILoggingBuilder
~static Microsoft.Extensions.Logging.AzureAppServicesLoggerFactoryExtensions.AddAzureWebAppDiagnostics(this Microsoft.Extensions.Logging.ILoggingBuilder builder, System.Action<Microsoft.Extensions.Logging.AzureAppServices.AzureBlobLoggerOptions> configureBlobLoggerOptions) -> Microsoft.Extensions.Logging.ILoggingBuilder
Microsoft.Extensions.Logging.AzureAppServices.AzureBlobLoggerContext
+Microsoft.Extensions.Logging.AzureAppServices.AzureBlobLoggerContext.AzureBlobLoggerContext() -> void
Microsoft.Extensions.Logging.AzureAppServices.AzureBlobLoggerContext.Timestamp.get -> System.DateTimeOffset
Microsoft.Extensions.Logging.AzureAppServices.AzureBlobLoggerOptions
Microsoft.Extensions.Logging.AzureAppServices.AzureBlobLoggerOptions.AzureBlobLoggerOptions() -> void
diff --git a/src/Logging.AzureAppServices/src/SiteConfigurationProvider.cs b/src/Logging.AzureAppServices/src/SiteConfigurationProvider.cs
index e757c74e56..fa56f937d6 100644
--- a/src/Logging.AzureAppServices/src/SiteConfigurationProvider.cs
+++ b/src/Logging.AzureAppServices/src/SiteConfigurationProvider.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Configuration;
namespace Microsoft.Extensions.Logging.AzureAppServices;
-internal class SiteConfigurationProvider
+internal sealed class SiteConfigurationProvider
{
public static IConfiguration GetAzureLoggingConfiguration(IWebAppContext context)
{
diff --git a/src/Logging.AzureAppServices/src/WebAppContext.cs b/src/Logging.AzureAppServices/src/WebAppContext.cs
index becd1633be..63b8d434af 100644
--- a/src/Logging.AzureAppServices/src/WebAppContext.cs
+++ b/src/Logging.AzureAppServices/src/WebAppContext.cs
@@ -8,7 +8,7 @@ namespace Microsoft.Extensions.Logging.AzureAppServices;
/// <summary>
/// Represents the default implementation of <see cref="IWebAppContext"/>.
/// </summary>
-internal class WebAppContext : IWebAppContext
+internal sealed class WebAppContext : IWebAppContext
{
/// <summary>
/// Gets the default instance of the WebApp context.
diff --git a/src/Logging.AzureAppServices/test/AzureAppendBlobTests.cs b/src/Logging.AzureAppServices/test/AzureAppendBlobTests.cs
index c9408e2889..398f1b1ca9 100644
--- a/src/Logging.AzureAppServices/test/AzureAppendBlobTests.cs
+++ b/src/Logging.AzureAppServices/test/AzureAppendBlobTests.cs
@@ -166,7 +166,6 @@ public class AzureAppendBlobTests
Assert.Equal(2, stage);
}
-
private class TestMessageHandler : HttpMessageHandler
{
private readonly Func<HttpRequestMessage, Task<HttpResponseMessage>> _callback;
diff --git a/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj b/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj
index ac6088f6b3..751cf4415a 100644
--- a/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj
+++ b/src/Middleware/CORS/src/Microsoft.AspNetCore.Cors.csproj
@@ -10,7 +10,7 @@ Microsoft.AspNetCore.Cors.EnableCorsAttribute</Description>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;cors</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/CORS/src/PublicAPI.Shipped.txt b/src/Middleware/CORS/src/PublicAPI.Shipped.txt
index 364db6b723..e1a368079c 100644
--- a/src/Middleware/CORS/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/CORS/src/PublicAPI.Shipped.txt
@@ -2,8 +2,6 @@
~Microsoft.AspNetCore.Cors.CorsPolicyMetadata.CorsPolicyMetadata(Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy policy) -> void
~Microsoft.AspNetCore.Cors.CorsPolicyMetadata.Policy.get -> Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy
~Microsoft.AspNetCore.Cors.EnableCorsAttribute.EnableCorsAttribute(string policyName) -> void
-~Microsoft.AspNetCore.Cors.EnableCorsAttribute.PolicyName.get -> string
-~Microsoft.AspNetCore.Cors.EnableCorsAttribute.PolicyName.set -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.CorsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.AspNetCore.Cors.Infrastructure.ICorsService corsService, Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy policy, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.CorsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.AspNetCore.Cors.Infrastructure.ICorsService corsService, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsMiddleware.CorsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.AspNetCore.Cors.Infrastructure.ICorsService corsService, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, string policyName) -> void
@@ -12,15 +10,9 @@
~Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions.AddDefaultPolicy(System.Action<Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder> configurePolicy) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions.AddPolicy(string name, Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy policy) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions.AddPolicy(string name, System.Action<Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder> configurePolicy) -> void
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions.DefaultPolicyName.get -> string
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions.DefaultPolicyName.set -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions.GetPolicy(string name) -> Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy
~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.ExposedHeaders.get -> System.Collections.Generic.IList<string>
~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.Headers.get -> System.Collections.Generic.IList<string>
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.IsOriginAllowed.get -> System.Func<string, bool>
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.IsOriginAllowed.set -> void
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.Methods.get -> System.Collections.Generic.IList<string>
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.Origins.get -> System.Collections.Generic.IList<string>
~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder.AllowAnyHeader() -> Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder
~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder.AllowAnyMethod() -> Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder
~Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder.AllowAnyOrigin() -> Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicyBuilder
@@ -39,21 +31,15 @@
~Microsoft.AspNetCore.Cors.Infrastructure.CorsResult.AllowedExposedHeaders.get -> System.Collections.Generic.IList<string>
~Microsoft.AspNetCore.Cors.Infrastructure.CorsResult.AllowedHeaders.get -> System.Collections.Generic.IList<string>
~Microsoft.AspNetCore.Cors.Infrastructure.CorsResult.AllowedMethods.get -> System.Collections.Generic.IList<string>
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsResult.AllowedOrigin.get -> string
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsResult.AllowedOrigin.set -> void
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-~Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
+Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.CorsService.EvaluatePolicy(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy policy) -> Microsoft.AspNetCore.Cors.Infrastructure.CorsResult
~Microsoft.AspNetCore.Cors.Infrastructure.CorsService.EvaluatePolicy(Microsoft.AspNetCore.Http.HttpContext context, string policyName) -> Microsoft.AspNetCore.Cors.Infrastructure.CorsResult
-~Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.DefaultCorsPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options) -> void
-~Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.DefaultCorsPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions> options) -> void
+Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.DefaultCorsPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.GetPolicyAsync(Microsoft.AspNetCore.Http.HttpContext context, string policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy>
~Microsoft.AspNetCore.Cors.Infrastructure.ICorsPolicyMetadata.Policy.get -> Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy
~Microsoft.AspNetCore.Cors.Infrastructure.ICorsPolicyProvider.GetPolicyAsync(Microsoft.AspNetCore.Http.HttpContext context, string policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy>
~Microsoft.AspNetCore.Cors.Infrastructure.ICorsService.ApplyResult(Microsoft.AspNetCore.Cors.Infrastructure.CorsResult result, Microsoft.AspNetCore.Http.HttpResponse response) -> void
~Microsoft.AspNetCore.Cors.Infrastructure.ICorsService.EvaluatePolicy(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy policy) -> Microsoft.AspNetCore.Cors.Infrastructure.CorsResult
-~Microsoft.AspNetCore.Cors.Infrastructure.IEnableCorsAttribute.PolicyName.get -> string
-~Microsoft.AspNetCore.Cors.Infrastructure.IEnableCorsAttribute.PolicyName.set -> void
~override Microsoft.AspNetCore.Cors.Infrastructure.CorsPolicy.ToString() -> string
~override Microsoft.AspNetCore.Cors.Infrastructure.CorsResult.ToString() -> string
~static Microsoft.AspNetCore.Builder.CorsEndpointConventionBuilderExtensions.RequireCors<TBuilder>(this TBuilder builder, string policyName) -> TBuilder
diff --git a/src/Middleware/CORS/src/PublicAPI.Unshipped.txt b/src/Middleware/CORS/src/PublicAPI.Unshipped.txt
index ff6f6581eb..815c92006a 100644
--- a/src/Middleware/CORS/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/CORS/src/PublicAPI.Unshipped.txt
@@ -1,7 +1 @@
-#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-Microsoft.AspNetCore.Cors.Infrastructure.CorsService.CorsService(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.DefaultCorsPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.DefaultCorsPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions> options) -> void
-Microsoft.AspNetCore.Cors.Infrastructure.DefaultCorsPolicyProvider.DefaultCorsPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Cors.Infrastructure.CorsOptions!>! options) -> void \ No newline at end of file
+#nullable enable \ No newline at end of file
diff --git a/src/Middleware/CORS/test/testassets/CorsMiddlewareWebSite/Properties/launchSettings.json b/src/Middleware/CORS/test/testassets/CorsMiddlewareWebSite/Properties/launchSettings.json
index 485cac49a9..3528609bc2 100644
--- a/src/Middleware/CORS/test/testassets/CorsMiddlewareWebSite/Properties/launchSettings.json
+++ b/src/Middleware/CORS/test/testassets/CorsMiddlewareWebSite/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61226;http://localhost:61227"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Shipped.txt b/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Shipped.txt
index 35846f2f34..300e9d0222 100644
--- a/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware.ConcurrencyLimiterMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.ConcurrencyLimiter.IQueuePolicy! queue, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterOptions!>! options) -> void
+Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware.ConcurrencyLimiterMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.ConcurrencyLimiter.IQueuePolicy! queue, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterOptions!>! options) -> void
Microsoft.AspNetCore.Builder.ConcurrencyLimiterExtensions
Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware
Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext! context) -> System.Threading.Tasks.Task!
diff --git a/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Unshipped.txt b/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Unshipped.txt
index 933c1e19b0..7dc5c58110 100644
--- a/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/ConcurrencyLimiter/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware.ConcurrencyLimiterMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.ConcurrencyLimiter.IQueuePolicy! queue, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterOptions!>! options) -> void
-Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterMiddleware.ConcurrencyLimiterMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.ConcurrencyLimiter.IQueuePolicy! queue, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ConcurrencyLimiter.ConcurrencyLimiterOptions!>! options) -> void
diff --git a/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/BasePolicy.cs b/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/BasePolicy.cs
index d9a6cbffc5..ed3ec46ddd 100644
--- a/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/BasePolicy.cs
+++ b/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/BasePolicy.cs
@@ -32,7 +32,12 @@ internal class BasePolicy : IQueuePolicy, IDisposable
throw new ArgumentException("The RequestQueueLimit cannot be a negative number.", nameof(options));
}
- _limiter = new Limiter(new LimiterOptions(permitLimit: maxConcurrentRequests, order, queueLimit: requestQueueLimit));
+ _limiter = new Limiter(new LimiterOptions
+ {
+ PermitLimit = maxConcurrentRequests,
+ QueueProcessingOrder = order,
+ QueueLimit = requestQueueLimit
+ });
}
public ValueTask<bool> TryEnterAsync()
@@ -40,14 +45,14 @@ internal class BasePolicy : IQueuePolicy, IDisposable
// a return value of 'false' indicates that the request is rejected
// a return value of 'true' indicates that the request may proceed
- var lease = _limiter.Acquire();
+ var lease = _limiter.AttemptAcquire();
if (lease.IsAcquired)
{
_leases.Enqueue(lease);
return ValueTask.FromResult(true);
}
- var task = _limiter.WaitAsync();
+ var task = _limiter.AcquireAsync();
if (task.IsCompletedSuccessfully)
{
lease = task.Result;
diff --git a/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/QueuePolicy.cs b/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/QueuePolicy.cs
index 1ee6ff0d7a..cea11a8a4f 100644
--- a/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/QueuePolicy.cs
+++ b/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/QueuePolicy.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ConcurrencyLimiter;
-internal class QueuePolicy : BasePolicy
+internal sealed class QueuePolicy : BasePolicy
{
public QueuePolicy(IOptions<QueuePolicyOptions> options)
: base(options, QueueProcessingOrder.OldestFirst)
diff --git a/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/StackPolicy.cs b/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/StackPolicy.cs
index a65010a690..0dbd580ac3 100644
--- a/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/StackPolicy.cs
+++ b/src/Middleware/ConcurrencyLimiter/src/QueuePolicies/StackPolicy.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.ConcurrencyLimiter;
-internal class StackPolicy : BasePolicy
+internal sealed class StackPolicy : BasePolicy
{
public StackPolicy(IOptions<QueuePolicyOptions> options)
: base(options, QueueProcessingOrder.NewestFirst)
diff --git a/src/Middleware/Diagnostics.Abstractions/src/Microsoft.AspNetCore.Diagnostics.Abstractions.csproj b/src/Middleware/Diagnostics.Abstractions/src/Microsoft.AspNetCore.Diagnostics.Abstractions.csproj
index 6696c7c038..7c88f05a95 100644
--- a/src/Middleware/Diagnostics.Abstractions/src/Microsoft.AspNetCore.Diagnostics.Abstractions.csproj
+++ b/src/Middleware/Diagnostics.Abstractions/src/Microsoft.AspNetCore.Diagnostics.Abstractions.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;diagnostics</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/Diagnostics.Abstractions/src/PublicAPI.Shipped.txt b/src/Middleware/Diagnostics.Abstractions/src/PublicAPI.Shipped.txt
index 8382f51584..ee749dc522 100644
--- a/src/Middleware/Diagnostics.Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Diagnostics.Abstractions/src/PublicAPI.Shipped.txt
@@ -16,13 +16,6 @@
~Microsoft.AspNetCore.Diagnostics.ICompilationException.CompilationFailures.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.CompilationFailure>
~Microsoft.AspNetCore.Diagnostics.IDeveloperPageExceptionFilter.HandleExceptionAsync(Microsoft.AspNetCore.Diagnostics.ErrorContext errorContext, System.Func<Microsoft.AspNetCore.Diagnostics.ErrorContext, System.Threading.Tasks.Task> next) -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature.Error.get -> System.Exception
-~Microsoft.AspNetCore.Diagnostics.IExceptionHandlerPathFeature.Path.get -> string
-~Microsoft.AspNetCore.Diagnostics.IStatusCodeReExecuteFeature.OriginalPath.get -> string
-~Microsoft.AspNetCore.Diagnostics.IStatusCodeReExecuteFeature.OriginalPath.set -> void
-~Microsoft.AspNetCore.Diagnostics.IStatusCodeReExecuteFeature.OriginalPathBase.get -> string
-~Microsoft.AspNetCore.Diagnostics.IStatusCodeReExecuteFeature.OriginalPathBase.set -> void
-~Microsoft.AspNetCore.Diagnostics.IStatusCodeReExecuteFeature.OriginalQueryString.get -> string
-~Microsoft.AspNetCore.Diagnostics.IStatusCodeReExecuteFeature.OriginalQueryString.set -> void
Microsoft.AspNetCore.Diagnostics.CompilationFailure
Microsoft.AspNetCore.Diagnostics.CompilationFailure.CompilationFailure(string? sourceFilePath, string? sourceFileContent, string? compiledContent, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.DiagnosticMessage!>? messages) -> void
Microsoft.AspNetCore.Diagnostics.CompilationFailure.CompilationFailure(string? sourceFilePath, string? sourceFileContent, string? compiledContent, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.DiagnosticMessage?>? messages, string? failureSummary) -> void
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/DatabaseContextDetails.cs b/src/Middleware/Diagnostics.EntityFrameworkCore/src/DatabaseContextDetails.cs
index 1835066af2..a2837fe3e1 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/DatabaseContextDetails.cs
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/DatabaseContextDetails.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore;
-internal class DatabaseContextDetails
+internal sealed class DatabaseContextDetails
{
public Type Type { get; }
public bool DatabaseExists { get; }
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj
index 7418616058..b4716f36d3 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;diagnostics;entityframeworkcore</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/MigrationsEndPointMiddleware.cs b/src/Middleware/Diagnostics.EntityFrameworkCore/src/MigrationsEndPointMiddleware.cs
index 4178a8bdca..a78e2fb80a 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/MigrationsEndPointMiddleware.cs
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/MigrationsEndPointMiddleware.cs
@@ -121,7 +121,9 @@ public class MigrationsEndPointMiddleware
var registeredContexts = context.RequestServices.GetServices<DbContextOptions>()
.Select(o => o.ContextType);
- if (!registeredContexts.Any(c => string.Equals(contextTypeName, c.AssemblyQualifiedName)))
+ var contextType = registeredContexts.FirstOrDefault(c => string.Equals(contextTypeName, c.AssemblyQualifiedName, StringComparison.Ordinal));
+
+ if (contextType is null)
{
var message = Strings.FormatMigrationsEndPointMiddleware_ContextNotRegistered(contextTypeName);
@@ -132,8 +134,6 @@ public class MigrationsEndPointMiddleware
return null;
}
- var contextType = Type.GetType(contextTypeName)!;
-
var db = (DbContext?)context.RequestServices.GetService(contextType);
return db;
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Shipped.txt b/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Shipped.txt
index 73dea328c3..b3836054a8 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Shipped.txt
@@ -1,9 +1,7 @@
#nullable enable
-~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter.DatabaseDeveloperPageExceptionFilter(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
-~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.DatabaseErrorPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions> options) -> void
-~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.DatabaseErrorPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
-~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.MigrationsEndPointMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware> logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.MigrationsEndPointOptions> options) -> void
-~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.MigrationsEndPointMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.MigrationsEndPointOptions!>! options) -> void
+Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter.DatabaseDeveloperPageExceptionFilter(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
+Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.DatabaseErrorPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
+Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.MigrationsEndPointMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.MigrationsEndPointOptions!>! options) -> void
~static Microsoft.AspNetCore.Builder.DatabaseErrorPageExtensions.UseDatabaseErrorPage(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.DatabaseErrorPageExtensions.UseDatabaseErrorPage(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions options) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.MigrationsEndPointExtensions.UseMigrationsEndPoint(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Unshipped.txt b/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Unshipped.txt
index 30313775b1..7dc5c58110 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/PublicAPI.Unshipped.txt
@@ -1,9 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter.DatabaseDeveloperPageExceptionFilter(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.DatabaseErrorPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.DatabaseErrorPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.MigrationsEndPointMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware> logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.MigrationsEndPointOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.MigrationsEndPointMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.MigrationsEndPointOptions!>! options) -> void
-Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter.DatabaseDeveloperPageExceptionFilter(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseDeveloperPageExceptionFilter!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
-Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.DatabaseErrorPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DatabaseErrorPageOptions!>! options) -> void
-Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.MigrationsEndPointMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.MigrationsEndPointOptions!>! options) -> void
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.Designer.cs b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.Designer.cs
index b28c68854a..0ca1cf88a4 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.Designer.cs
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPage.Designer.cs
@@ -32,7 +32,7 @@ using Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Views;
#line default
#line hidden
#nullable disable
- internal class DatabaseErrorPage : Microsoft.Extensions.RazorViews.BaseView
+ internal sealed class DatabaseErrorPage : Microsoft.Extensions.RazorViews.BaseView
{
#pragma warning disable 1998
public async override global::System.Threading.Tasks.Task ExecuteAsync()
diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPageModel.cs b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPageModel.cs
index f3e937c8fa..2bbdb164db 100644
--- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPageModel.cs
+++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Views/DatabaseErrorPageModel.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.Views;
-internal class DatabaseErrorPageModel
+internal sealed class DatabaseErrorPageModel
{
public DatabaseErrorPageModel(
Exception exception,
@@ -20,8 +20,8 @@ internal class DatabaseErrorPageModel
PathBase = pathBase;
}
- public virtual Exception Exception { get; }
- public virtual IEnumerable<DatabaseContextDetails> ContextDetails { get; }
- public virtual DatabaseErrorPageOptions Options { get; }
- public virtual PathString PathBase { get; }
+ public Exception Exception { get; }
+ public IEnumerable<DatabaseContextDetails> ContextDetails { get; }
+ public DatabaseErrorPageOptions Options { get; }
+ public PathString PathBase { get; }
}
diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageExtensions.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageExtensions.cs
index b8d748b7c7..39e1ecb24d 100644
--- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageExtensions.cs
+++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageExtensions.cs
@@ -26,7 +26,8 @@ public static class DeveloperExceptionPageExtensions
throw new ArgumentNullException(nameof(app));
}
- return app.UseMiddleware<DeveloperExceptionPageMiddleware>();
+ app.Properties["analysis.NextMiddlewareName"] = "Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware";
+ return app.UseMiddleware<DeveloperExceptionPageMiddlewareImpl>();
}
/// <summary>
@@ -52,6 +53,7 @@ public static class DeveloperExceptionPageExtensions
throw new ArgumentNullException(nameof(options));
}
- return app.UseMiddleware<DeveloperExceptionPageMiddleware>(Options.Create(options));
+ app.Properties["analysis.NextMiddlewareName"] = "Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware";
+ return app.UseMiddleware<DeveloperExceptionPageMiddlewareImpl>(Options.Create(options));
}
}
diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddleware.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddleware.cs
index 4780baeb14..5ac530518f 100644
--- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddleware.cs
+++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddleware.cs
@@ -2,18 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
-using System.Linq;
-using System.Text;
using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Diagnostics.RazorViews;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Routing;
-using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
-using Microsoft.Extensions.StackTrace.Sources;
-using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Diagnostics;
@@ -22,24 +15,17 @@ namespace Microsoft.AspNetCore.Diagnostics;
/// </summary>
public class DeveloperExceptionPageMiddleware
{
- private readonly RequestDelegate _next;
- private readonly DeveloperExceptionPageOptions _options;
- private readonly ILogger _logger;
- private readonly IFileProvider _fileProvider;
- private readonly DiagnosticSource _diagnosticSource;
- private readonly ExceptionDetailsProvider _exceptionDetailsProvider;
- private readonly Func<ErrorContext, Task> _exceptionHandler;
- private static readonly MediaTypeHeaderValue _textHtmlMediaType = new MediaTypeHeaderValue("text/html");
+ private readonly DeveloperExceptionPageMiddlewareImpl _innerMiddlewareImpl;
/// <summary>
/// Initializes a new instance of the <see cref="DeveloperExceptionPageMiddleware"/> class
/// </summary>
- /// <param name="next"></param>
- /// <param name="options"></param>
- /// <param name="loggerFactory"></param>
+ /// <param name="next">The <see cref="RequestDelegate"/> representing the next middleware in the pipeline.</param>
+ /// <param name="options">The options for configuring the middleware.</param>
+ /// <param name="loggerFactory">The <see cref="ILoggerFactory"/> used for logging.</param>
/// <param name="hostingEnvironment"></param>
- /// <param name="diagnosticSource"></param>
- /// <param name="filters"></param>
+ /// <param name="diagnosticSource">The <see cref="DiagnosticSource"/> used for writing diagnostic messages.</param>
+ /// <param name="filters">The list of registered <see cref="IDeveloperPageExceptionFilter"/>.</param>
public DeveloperExceptionPageMiddleware(
RequestDelegate next,
IOptions<DeveloperExceptionPageOptions> options,
@@ -48,34 +34,14 @@ public class DeveloperExceptionPageMiddleware
DiagnosticSource diagnosticSource,
IEnumerable<IDeveloperPageExceptionFilter> filters)
{
- if (next == null)
- {
- throw new ArgumentNullException(nameof(next));
- }
-
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
-
- if (filters == null)
- {
- throw new ArgumentNullException(nameof(filters));
- }
-
- _next = next;
- _options = options.Value;
- _logger = loggerFactory.CreateLogger<DeveloperExceptionPageMiddleware>();
- _fileProvider = _options.FileProvider ?? hostingEnvironment.ContentRootFileProvider;
- _diagnosticSource = diagnosticSource;
- _exceptionDetailsProvider = new ExceptionDetailsProvider(_fileProvider, _logger, _options.SourceCodeLineCount);
- _exceptionHandler = DisplayException;
-
- foreach (var filter in filters.Reverse())
- {
- var nextFilter = _exceptionHandler;
- _exceptionHandler = errorContext => filter.HandleExceptionAsync(errorContext, nextFilter);
- }
+ _innerMiddlewareImpl = new(
+ next,
+ options,
+ loggerFactory,
+ hostingEnvironment,
+ diagnosticSource,
+ filters,
+ problemDetailsService: null);
}
/// <summary>
@@ -83,198 +49,6 @@ public class DeveloperExceptionPageMiddleware
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
- public async Task Invoke(HttpContext context)
- {
- try
- {
- await _next(context);
- }
- catch (Exception ex)
- {
- _logger.UnhandledException(ex);
-
- if (context.Response.HasStarted)
- {
- _logger.ResponseStartedErrorPageMiddleware();
- throw;
- }
-
- try
- {
- context.Response.Clear();
-
- // Preserve the status code that would have been written by the server automatically when a BadHttpRequestException is thrown.
- if (ex is BadHttpRequestException badHttpRequestException)
- {
- context.Response.StatusCode = badHttpRequestException.StatusCode;
- }
- else
- {
- context.Response.StatusCode = 500;
- }
-
- await _exceptionHandler(new ErrorContext(context, ex));
-
- if (_diagnosticSource.IsEnabled("Microsoft.AspNetCore.Diagnostics.UnhandledException"))
- {
- _diagnosticSource.Write("Microsoft.AspNetCore.Diagnostics.UnhandledException", new { httpContext = context, exception = ex });
- }
-
- return;
- }
- catch (Exception ex2)
- {
- // If there's a Exception while generating the error page, re-throw the original exception.
- _logger.DisplayErrorPageException(ex2);
- }
- throw;
- }
- }
-
- // Assumes the response headers have not been sent. If they have, still attempt to write to the body.
- private Task DisplayException(ErrorContext errorContext)
- {
- var httpContext = errorContext.HttpContext;
- var headers = httpContext.Request.GetTypedHeaders();
- var acceptHeader = headers.Accept;
-
- // If the client does not ask for HTML just format the exception as plain text
- if (acceptHeader == null || !acceptHeader.Any(h => h.IsSubsetOf(_textHtmlMediaType)))
- {
- httpContext.Response.ContentType = "text/plain; charset=utf-8";
-
- var sb = new StringBuilder();
- sb.AppendLine(errorContext.Exception.ToString());
- sb.AppendLine();
- sb.AppendLine("HEADERS");
- sb.AppendLine("=======");
- foreach (var pair in httpContext.Request.Headers)
- {
- sb.AppendLine(FormattableString.Invariant($"{pair.Key}: {pair.Value}"));
- }
-
- return httpContext.Response.WriteAsync(sb.ToString());
- }
-
- if (errorContext.Exception is ICompilationException compilationException)
- {
- return DisplayCompilationException(httpContext, compilationException);
- }
-
- return DisplayRuntimeException(httpContext, errorContext.Exception);
- }
-
- private Task DisplayCompilationException(
- HttpContext context,
- ICompilationException compilationException)
- {
- var model = new CompilationErrorPageModel(_options);
-
- var errorPage = new CompilationErrorPage(model);
-
- if (compilationException.CompilationFailures == null)
- {
- return errorPage.ExecuteAsync(context);
- }
-
- foreach (var compilationFailure in compilationException.CompilationFailures)
- {
- if (compilationFailure == null)
- {
- continue;
- }
-
- var stackFrames = new List<StackFrameSourceCodeInfo>();
- var exceptionDetails = new ExceptionDetails(compilationFailure.FailureSummary!, stackFrames);
- model.ErrorDetails.Add(exceptionDetails);
- model.CompiledContent.Add(compilationFailure.CompiledContent);
-
- if (compilationFailure.Messages == null)
- {
- continue;
- }
-
- var sourceLines = compilationFailure
- .SourceFileContent?
- .Split(new[] { Environment.NewLine }, StringSplitOptions.None);
-
- foreach (var item in compilationFailure.Messages)
- {
- if (item == null)
- {
- continue;
- }
-
- var frame = new StackFrameSourceCodeInfo
- {
- File = compilationFailure.SourceFilePath,
- Line = item.StartLine,
- Function = string.Empty
- };
-
- if (sourceLines != null)
- {
- _exceptionDetailsProvider.ReadFrameContent(frame, sourceLines, item.StartLine, item.EndLine);
- }
-
- frame.ErrorDetails = item.Message;
-
- stackFrames.Add(frame);
- }
- }
-
- return errorPage.ExecuteAsync(context);
- }
-
- private Task DisplayRuntimeException(HttpContext context, Exception ex)
- {
- var endpoint = context.GetEndpoint();
-
- EndpointModel? endpointModel = null;
- if (endpoint != null)
- {
- endpointModel = new EndpointModel();
- endpointModel.DisplayName = endpoint.DisplayName;
-
- if (endpoint is RouteEndpoint routeEndpoint)
- {
- endpointModel.RoutePattern = routeEndpoint.RoutePattern.RawText;
- endpointModel.Order = routeEndpoint.Order;
-
- var httpMethods = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>()?.HttpMethods;
- if (httpMethods != null)
- {
- endpointModel.HttpMethods = string.Join(", ", httpMethods);
- }
- }
- }
-
- var request = context.Request;
- var title = Resources.ErrorPageHtml_Title;
-
- if (ex is BadHttpRequestException badHttpRequestException)
- {
- var badRequestReasonPhrase = WebUtilities.ReasonPhrases.GetReasonPhrase(badHttpRequestException.StatusCode);
-
- if (!string.IsNullOrEmpty(badRequestReasonPhrase))
- {
- title = badRequestReasonPhrase;
- }
- }
-
- var model = new ErrorPageModel
- {
- Options = _options,
- ErrorDetails = _exceptionDetailsProvider.GetDetails(ex),
- Query = request.Query,
- Cookies = request.Cookies,
- Headers = request.Headers,
- RouteValues = request.RouteValues,
- Endpoint = endpointModel,
- Title = title,
- };
-
- var errorPage = new ErrorPage(model);
- return errorPage.ExecuteAsync(context);
- }
+ public Task Invoke(HttpContext context)
+ => _innerMiddlewareImpl.Invoke(context);
}
diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs
new file mode 100644
index 0000000000..595ecabda9
--- /dev/null
+++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/DeveloperExceptionPageMiddlewareImpl.cs
@@ -0,0 +1,337 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using System.Text;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Diagnostics.RazorViews;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.FileProviders;
+using Microsoft.Extensions.Internal;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.StackTrace.Sources;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.Diagnostics;
+
+/// <summary>
+/// Captures synchronous and asynchronous exceptions from the pipeline and generates error responses.
+/// </summary>
+internal class DeveloperExceptionPageMiddlewareImpl
+{
+ private readonly RequestDelegate _next;
+ private readonly DeveloperExceptionPageOptions _options;
+ private readonly ILogger _logger;
+ private readonly IFileProvider _fileProvider;
+ private readonly DiagnosticSource _diagnosticSource;
+ private readonly ExceptionDetailsProvider _exceptionDetailsProvider;
+ private readonly Func<ErrorContext, Task> _exceptionHandler;
+ private static readonly MediaTypeHeaderValue _textHtmlMediaType = new MediaTypeHeaderValue("text/html");
+ private readonly IProblemDetailsService? _problemDetailsService;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DeveloperExceptionPageMiddleware"/> class
+ /// </summary>
+ /// <param name="next">The <see cref="RequestDelegate"/> representing the next middleware in the pipeline.</param>
+ /// <param name="options">The options for configuring the middleware.</param>
+ /// <param name="loggerFactory">The <see cref="ILoggerFactory"/> used for logging.</param>
+ /// <param name="hostingEnvironment"></param>
+ /// <param name="diagnosticSource">The <see cref="DiagnosticSource"/> used for writing diagnostic messages.</param>
+ /// <param name="filters">The list of registered <see cref="IDeveloperPageExceptionFilter"/>.</param>
+ /// <param name="problemDetailsService">The <see cref="IProblemDetailsService"/> used for writing <see cref="ProblemDetails"/> messages.</param>
+ public DeveloperExceptionPageMiddlewareImpl(
+ RequestDelegate next,
+ IOptions<DeveloperExceptionPageOptions> options,
+ ILoggerFactory loggerFactory,
+ IWebHostEnvironment hostingEnvironment,
+ DiagnosticSource diagnosticSource,
+ IEnumerable<IDeveloperPageExceptionFilter> filters,
+ IProblemDetailsService? problemDetailsService = null)
+ {
+ if (next == null)
+ {
+ throw new ArgumentNullException(nameof(next));
+ }
+
+ if (options == null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ if (filters == null)
+ {
+ throw new ArgumentNullException(nameof(filters));
+ }
+
+ _next = next;
+ _options = options.Value;
+ _logger = loggerFactory.CreateLogger<DeveloperExceptionPageMiddleware>();
+ _fileProvider = _options.FileProvider ?? hostingEnvironment.ContentRootFileProvider;
+ _diagnosticSource = diagnosticSource;
+ _exceptionDetailsProvider = new ExceptionDetailsProvider(_fileProvider, _logger, _options.SourceCodeLineCount);
+ _exceptionHandler = DisplayException;
+ _problemDetailsService = problemDetailsService;
+
+ foreach (var filter in filters.Reverse())
+ {
+ var nextFilter = _exceptionHandler;
+ _exceptionHandler = errorContext => filter.HandleExceptionAsync(errorContext, nextFilter);
+ }
+ }
+
+ /// <summary>
+ /// Process an individual request.
+ /// </summary>
+ /// <param name="context"></param>
+ /// <returns></returns>
+ public async Task Invoke(HttpContext context)
+ {
+ try
+ {
+ await _next(context);
+ }
+ catch (Exception ex)
+ {
+ _logger.UnhandledException(ex);
+
+ if (context.Response.HasStarted)
+ {
+ _logger.ResponseStartedErrorPageMiddleware();
+ throw;
+ }
+
+ try
+ {
+ context.Response.Clear();
+
+ // Preserve the status code that would have been written by the server automatically when a BadHttpRequestException is thrown.
+ if (ex is BadHttpRequestException badHttpRequestException)
+ {
+ context.Response.StatusCode = badHttpRequestException.StatusCode;
+ }
+ else
+ {
+ context.Response.StatusCode = 500;
+ }
+
+ await _exceptionHandler(new ErrorContext(context, ex));
+
+ const string eventName = "Microsoft.AspNetCore.Diagnostics.UnhandledException";
+ if (_diagnosticSource.IsEnabled(eventName))
+ {
+ WriteDiagnosticEvent(_diagnosticSource, eventName, new { httpContext = context, exception = ex });
+ }
+
+ return;
+ }
+ catch (Exception ex2)
+ {
+ // If there's a Exception while generating the error page, re-throw the original exception.
+ _logger.DisplayErrorPageException(ex2);
+ }
+ throw;
+ }
+
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026",
+ Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")]
+ static void WriteDiagnosticEvent<TValue>(DiagnosticSource diagnosticSource, string name, TValue value)
+ => diagnosticSource.Write(name, value);
+ }
+
+ // Assumes the response headers have not been sent. If they have, still attempt to write to the body.
+ private Task DisplayException(ErrorContext errorContext)
+ {
+ var httpContext = errorContext.HttpContext;
+ var headers = httpContext.Request.GetTypedHeaders();
+ var acceptHeader = headers.Accept;
+
+ // If the client does not ask for HTML just format the exception as plain text
+ if (acceptHeader == null || !acceptHeader.Any(h => h.IsSubsetOf(_textHtmlMediaType)))
+ {
+ return DisplayExceptionContent(errorContext);
+ }
+
+ if (errorContext.Exception is ICompilationException compilationException)
+ {
+ return DisplayCompilationException(httpContext, compilationException);
+ }
+
+ return DisplayRuntimeException(httpContext, errorContext.Exception);
+ }
+
+ private async Task DisplayExceptionContent(ErrorContext errorContext)
+ {
+ var httpContext = errorContext.HttpContext;
+
+ if (_problemDetailsService != null)
+ {
+ var problemDetails = new ProblemDetails
+ {
+ Title = TypeNameHelper.GetTypeDisplayName(errorContext.Exception.GetType()),
+ Detail = errorContext.Exception.Message,
+ Status = httpContext.Response.StatusCode
+ };
+
+ var exceptionDetails = _exceptionDetailsProvider.GetDetails(errorContext.Exception);
+ problemDetails.Extensions["exception"] = new
+ {
+ Details = exceptionDetails.Select(d => new
+ {
+ Message = d.ErrorMessage ?? d.Error?.Message,
+ Type = TypeNameHelper.GetTypeDisplayName(d.Error),
+ StackFrames = d.StackFrames,
+ }),
+ Headers = httpContext.Request.Headers,
+ Error = errorContext.Exception.ToString(),
+ Path = httpContext.Request.Path,
+ Endpoint = httpContext.GetEndpoint()?.ToString(),
+ RouteValues = httpContext.Features.Get<IRouteValuesFeature>()?.RouteValues,
+ };
+
+ await _problemDetailsService.WriteAsync(new()
+ {
+ HttpContext = httpContext,
+ ProblemDetails = problemDetails
+ });
+ }
+
+ // If the response has not started, assume the problem details was not written.
+ if (!httpContext.Response.HasStarted)
+ {
+ httpContext.Response.ContentType = "text/plain; charset=utf-8";
+
+ var sb = new StringBuilder();
+ sb.AppendLine(errorContext.Exception.ToString());
+ sb.AppendLine();
+ sb.AppendLine("HEADERS");
+ sb.AppendLine("=======");
+ foreach (var pair in httpContext.Request.Headers)
+ {
+ sb.AppendLine(FormattableString.Invariant($"{pair.Key}: {pair.Value}"));
+ }
+
+ await httpContext.Response.WriteAsync(sb.ToString());
+ }
+ }
+
+ private Task DisplayCompilationException(
+ HttpContext context,
+ ICompilationException compilationException)
+ {
+ var model = new CompilationErrorPageModel(_options);
+
+ var errorPage = new CompilationErrorPage(model);
+
+ if (compilationException.CompilationFailures == null)
+ {
+ return errorPage.ExecuteAsync(context);
+ }
+
+ foreach (var compilationFailure in compilationException.CompilationFailures)
+ {
+ if (compilationFailure == null)
+ {
+ continue;
+ }
+
+ var stackFrames = new List<StackFrameSourceCodeInfo>();
+ var exceptionDetails = new ExceptionDetails(compilationFailure.FailureSummary!, stackFrames);
+ model.ErrorDetails.Add(exceptionDetails);
+ model.CompiledContent.Add(compilationFailure.CompiledContent);
+
+ if (compilationFailure.Messages == null)
+ {
+ continue;
+ }
+
+ var sourceLines = compilationFailure
+ .SourceFileContent?
+ .Split(new[] { Environment.NewLine }, StringSplitOptions.None);
+
+ foreach (var item in compilationFailure.Messages)
+ {
+ if (item == null)
+ {
+ continue;
+ }
+
+ var frame = new StackFrameSourceCodeInfo
+ {
+ File = compilationFailure.SourceFilePath,
+ Line = item.StartLine,
+ Function = string.Empty
+ };
+
+ if (sourceLines != null)
+ {
+ _exceptionDetailsProvider.ReadFrameContent(frame, sourceLines, item.StartLine, item.EndLine);
+ }
+
+ frame.ErrorDetails = item.Message;
+
+ stackFrames.Add(frame);
+ }
+ }
+
+ return errorPage.ExecuteAsync(context);
+ }
+
+ private Task DisplayRuntimeException(HttpContext context, Exception ex)
+ {
+ var endpoint = context.GetEndpoint();
+
+ EndpointModel? endpointModel = null;
+ if (endpoint != null)
+ {
+ endpointModel = new EndpointModel();
+ endpointModel.DisplayName = endpoint.DisplayName;
+
+ if (endpoint is RouteEndpoint routeEndpoint)
+ {
+ endpointModel.RoutePattern = routeEndpoint.RoutePattern.RawText;
+ endpointModel.Order = routeEndpoint.Order;
+
+ var httpMethods = endpoint.Metadata.GetMetadata<IHttpMethodMetadata>()?.HttpMethods;
+ if (httpMethods != null)
+ {
+ endpointModel.HttpMethods = string.Join(", ", httpMethods);
+ }
+ }
+ }
+
+ var request = context.Request;
+ var title = Resources.ErrorPageHtml_Title;
+
+ if (ex is BadHttpRequestException badHttpRequestException)
+ {
+ var badRequestReasonPhrase = WebUtilities.ReasonPhrases.GetReasonPhrase(badHttpRequestException.StatusCode);
+
+ if (!string.IsNullOrEmpty(badRequestReasonPhrase))
+ {
+ title = badRequestReasonPhrase;
+ }
+ }
+
+ var model = new ErrorPageModel
+ {
+ Options = _options,
+ ErrorDetails = _exceptionDetailsProvider.GetDetails(ex),
+ Query = request.Query,
+ Cookies = request.Cookies,
+ Headers = request.Headers,
+ RouteValues = request.RouteValues,
+ Endpoint = endpointModel,
+ Title = title,
+ };
+
+ var errorPage = new ErrorPage(model);
+ return errorPage.ExecuteAsync(context);
+ }
+}
diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/CompilationErrorModel.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/CompilationErrorModel.cs
index 01bdae90fb..09a7720be3 100644
--- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/CompilationErrorModel.cs
+++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/CompilationErrorModel.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Diagnostics.RazorViews;
/// <summary>
/// Holds data to be displayed on the compilation error page.
/// </summary>
-internal class CompilationErrorPageModel
+internal sealed class CompilationErrorPageModel
{
public CompilationErrorPageModel(DeveloperExceptionPageOptions options)
{
diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/EndpointModel.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/EndpointModel.cs
index 35923a8fd0..8c46b8b0d3 100644
--- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/EndpointModel.cs
+++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/EndpointModel.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Diagnostics.RazorViews;
-internal class EndpointModel
+internal sealed class EndpointModel
{
public string? DisplayName { get; set; }
public string? RoutePattern { get; set; }
diff --git a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/ErrorPageModel.cs b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/ErrorPageModel.cs
index beaa8a29c2..e0f2e0a18d 100644
--- a/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/ErrorPageModel.cs
+++ b/src/Middleware/Diagnostics/src/DeveloperExceptionPage/Views/ErrorPageModel.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Diagnostics.RazorViews;
/// <summary>
/// Holds data to be displayed on the error page.
/// </summary>
-internal class ErrorPageModel
+internal sealed class ErrorPageModel
{
/// <summary>
/// Options for what output to display.
diff --git a/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerExtensions.cs b/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerExtensions.cs
index 602b1bc217..a0e77bd337 100644
--- a/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerExtensions.cs
+++ b/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerExtensions.cs
@@ -4,6 +4,7 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -103,9 +104,12 @@ public static class ExceptionHandlerExtensions
private static IApplicationBuilder SetExceptionHandlerMiddleware(IApplicationBuilder app, IOptions<ExceptionHandlerOptions>? options)
{
- const string globalRouteBuilderKey = "__GlobalEndpointRouteBuilder";
+ var problemDetailsService = app.ApplicationServices.GetService<IProblemDetailsService>();
+
+ app.Properties["analysis.NextMiddlewareName"] = "Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware";
+
// Only use this path if there's a global router (in the 'WebApplication' case).
- if (app.Properties.TryGetValue(globalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
+ if (app.Properties.TryGetValue(RerouteHelper.GlobalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
{
return app.Use(next =>
{
@@ -119,27 +123,20 @@ public static class ExceptionHandlerExtensions
if (!string.IsNullOrEmpty(options.Value.ExceptionHandlingPath) && options.Value.ExceptionHandler is null)
{
- // start a new middleware pipeline
- var builder = app.New();
- // use the old routing pipeline if it exists so we preserve all the routes and matching logic
- // ((IApplicationBuilder)WebApplication).New() does not copy globalRouteBuilderKey automatically like it does for all other properties.
- builder.Properties[globalRouteBuilderKey] = routeBuilder;
- builder.UseRouting();
- // apply the next middleware
- builder.Run(next);
+ var newNext = RerouteHelper.Reroute(app, routeBuilder, next);
// store the pipeline for the error case
- options.Value.ExceptionHandler = builder.Build();
+ options.Value.ExceptionHandler = newNext;
}
- return new ExceptionHandlerMiddleware(next, loggerFactory, options, diagnosticListener).Invoke;
+ return new ExceptionHandlerMiddlewareImpl(next, loggerFactory, options, diagnosticListener, problemDetailsService).Invoke;
});
}
if (options is null)
{
- return app.UseMiddleware<ExceptionHandlerMiddleware>();
+ return app.UseMiddleware<ExceptionHandlerMiddlewareImpl>();
}
- return app.UseMiddleware<ExceptionHandlerMiddleware>(options);
+ return app.UseMiddleware<ExceptionHandlerMiddlewareImpl>(options);
}
}
diff --git a/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddleware.cs b/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddleware.cs
index 28a09ff144..5b9f875143 100644
--- a/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddleware.cs
+++ b/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddleware.cs
@@ -2,10 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
-using System.Runtime.ExceptionServices;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -16,11 +14,7 @@ namespace Microsoft.AspNetCore.Diagnostics;
/// </summary>
public class ExceptionHandlerMiddleware
{
- private readonly RequestDelegate _next;
- private readonly ExceptionHandlerOptions _options;
- private readonly ILogger _logger;
- private readonly Func<object, Task> _clearCacheHeadersDelegate;
- private readonly DiagnosticListener _diagnosticListener;
+ private readonly ExceptionHandlerMiddlewareImpl _innerMiddlewareImpl;
/// <summary>
/// Creates a new <see cref="ExceptionHandlerMiddleware"/>
@@ -35,22 +29,12 @@ public class ExceptionHandlerMiddleware
IOptions<ExceptionHandlerOptions> options,
DiagnosticListener diagnosticListener)
{
- _next = next;
- _options = options.Value;
- _logger = loggerFactory.CreateLogger<ExceptionHandlerMiddleware>();
- _clearCacheHeadersDelegate = ClearCacheHeaders;
- _diagnosticListener = diagnosticListener;
- if (_options.ExceptionHandler == null)
- {
- if (_options.ExceptionHandlingPath == null)
- {
- throw new InvalidOperationException(Resources.ExceptionHandlerOptions_NotConfiguredCorrectly);
- }
- else
- {
- _options.ExceptionHandler = _next;
- }
- }
+ _innerMiddlewareImpl = new (
+ next,
+ loggerFactory,
+ options,
+ diagnosticListener,
+ problemDetailsService: null);
}
/// <summary>
@@ -58,129 +42,5 @@ public class ExceptionHandlerMiddleware
/// </summary>
/// <param name="context">The <see cref="HttpContext"/> for the current request.</param>
public Task Invoke(HttpContext context)
- {
- ExceptionDispatchInfo edi;
- try
- {
- var task = _next(context);
- if (!task.IsCompletedSuccessfully)
- {
- return Awaited(this, context, task);
- }
-
- return Task.CompletedTask;
- }
- catch (Exception exception)
- {
- // Get the Exception, but don't continue processing in the catch block as its bad for stack usage.
- edi = ExceptionDispatchInfo.Capture(exception);
- }
-
- return HandleException(context, edi);
-
- static async Task Awaited(ExceptionHandlerMiddleware middleware, HttpContext context, Task task)
- {
- ExceptionDispatchInfo? edi = null;
- try
- {
- await task;
- }
- catch (Exception exception)
- {
- // Get the Exception, but don't continue processing in the catch block as its bad for stack usage.
- edi = ExceptionDispatchInfo.Capture(exception);
- }
-
- if (edi != null)
- {
- await middleware.HandleException(context, edi);
- }
- }
- }
-
- private async Task HandleException(HttpContext context, ExceptionDispatchInfo edi)
- {
- _logger.UnhandledException(edi.SourceException);
- // We can't do anything if the response has already started, just abort.
- if (context.Response.HasStarted)
- {
- _logger.ResponseStartedErrorHandler();
- edi.Throw();
- }
-
- PathString originalPath = context.Request.Path;
- if (_options.ExceptionHandlingPath.HasValue)
- {
- context.Request.Path = _options.ExceptionHandlingPath;
- }
- try
- {
- var exceptionHandlerFeature = new ExceptionHandlerFeature()
- {
- Error = edi.SourceException,
- Path = originalPath.Value!,
- Endpoint = context.GetEndpoint(),
- RouteValues = context.Features.Get<IRouteValuesFeature>()?.RouteValues
- };
-
- ClearHttpContext(context);
-
- context.Features.Set<IExceptionHandlerFeature>(exceptionHandlerFeature);
- context.Features.Set<IExceptionHandlerPathFeature>(exceptionHandlerFeature);
- context.Response.StatusCode = StatusCodes.Status500InternalServerError;
- context.Response.OnStarting(_clearCacheHeadersDelegate, context.Response);
-
- await _options.ExceptionHandler!(context);
-
- // If the response has already started, assume exception handler was successful.
- if (context.Response.HasStarted || context.Response.StatusCode != StatusCodes.Status404NotFound || _options.AllowStatusCode404Response)
- {
- if (_diagnosticListener.IsEnabled() && _diagnosticListener.IsEnabled("Microsoft.AspNetCore.Diagnostics.HandledException"))
- {
- _diagnosticListener.Write("Microsoft.AspNetCore.Diagnostics.HandledException", new { httpContext = context, exception = edi.SourceException });
- }
-
- return;
- }
-
- edi = ExceptionDispatchInfo.Capture(new InvalidOperationException($"The exception handler configured on {nameof(ExceptionHandlerOptions)} produced a 404 status response. " +
- $"This {nameof(InvalidOperationException)} containing the original exception was thrown since this is often due to a misconfigured {nameof(ExceptionHandlerOptions.ExceptionHandlingPath)}. " +
- $"If the exception handler is expected to return 404 status responses then set {nameof(ExceptionHandlerOptions.AllowStatusCode404Response)} to true.", edi.SourceException));
- }
- catch (Exception ex2)
- {
- // Suppress secondary exceptions, re-throw the original.
- _logger.ErrorHandlerException(ex2);
- }
- finally
- {
- context.Request.Path = originalPath;
- }
-
- edi.Throw(); // Re-throw wrapped exception or the original if we couldn't handle it
- }
-
- private static void ClearHttpContext(HttpContext context)
- {
- context.Response.Clear();
-
- // An endpoint may have already been set. Since we're going to re-invoke the middleware pipeline we need to reset
- // the endpoint and route values to ensure things are re-calculated.
- context.SetEndpoint(endpoint: null);
- var routeValuesFeature = context.Features.Get<IRouteValuesFeature>();
- if (routeValuesFeature != null)
- {
- routeValuesFeature.RouteValues = null!;
- }
- }
-
- private static Task ClearCacheHeaders(object state)
- {
- var headers = ((HttpResponse)state).Headers;
- headers.CacheControl = "no-cache,no-store";
- headers.Pragma = "no-cache";
- headers.Expires = "-1";
- headers.ETag = default;
- return Task.CompletedTask;
- }
+ => _innerMiddlewareImpl.Invoke(context);
}
diff --git a/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddlewareImpl.cs b/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddlewareImpl.cs
new file mode 100644
index 0000000000..48939e0e1f
--- /dev/null
+++ b/src/Middleware/Diagnostics/src/ExceptionHandler/ExceptionHandlerMiddlewareImpl.cs
@@ -0,0 +1,216 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Runtime.ExceptionServices;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Diagnostics;
+
+/// <summary>
+/// A middleware for handling exceptions in the application.
+/// </summary>
+internal class ExceptionHandlerMiddlewareImpl
+{
+ private const int DefaultStatusCode = StatusCodes.Status500InternalServerError;
+
+ private readonly RequestDelegate _next;
+ private readonly ExceptionHandlerOptions _options;
+ private readonly ILogger _logger;
+ private readonly Func<object, Task> _clearCacheHeadersDelegate;
+ private readonly DiagnosticListener _diagnosticListener;
+ private readonly IProblemDetailsService? _problemDetailsService;
+
+ /// <summary>
+ /// Creates a new <see cref="ExceptionHandlerMiddleware"/>
+ /// </summary>
+ /// <param name="next">The <see cref="RequestDelegate"/> representing the next middleware in the pipeline.</param>
+ /// <param name="loggerFactory">The <see cref="ILoggerFactory"/> used for logging.</param>
+ /// <param name="options">The options for configuring the middleware.</param>
+ /// <param name="diagnosticListener">The <see cref="DiagnosticListener"/> used for writing diagnostic messages.</param>
+ /// <param name="problemDetailsService">The <see cref="IProblemDetailsService"/> used for writing <see cref="ProblemDetails"/> messages.</param>
+ public ExceptionHandlerMiddlewareImpl(
+ RequestDelegate next,
+ ILoggerFactory loggerFactory,
+ IOptions<ExceptionHandlerOptions> options,
+ DiagnosticListener diagnosticListener,
+ IProblemDetailsService? problemDetailsService = null)
+ {
+ _next = next;
+ _options = options.Value;
+ _logger = loggerFactory.CreateLogger<ExceptionHandlerMiddleware>();
+ _clearCacheHeadersDelegate = ClearCacheHeaders;
+ _diagnosticListener = diagnosticListener;
+ _problemDetailsService = problemDetailsService;
+
+ if (_options.ExceptionHandler == null)
+ {
+ if (_options.ExceptionHandlingPath == null)
+ {
+ if (problemDetailsService == null)
+ {
+ throw new InvalidOperationException(Resources.ExceptionHandlerOptions_NotConfiguredCorrectly);
+ }
+ }
+ else
+ {
+ _options.ExceptionHandler = _next;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Executes the middleware.
+ /// </summary>
+ /// <param name="context">The <see cref="HttpContext"/> for the current request.</param>
+ public Task Invoke(HttpContext context)
+ {
+ ExceptionDispatchInfo edi;
+ try
+ {
+ var task = _next(context);
+ if (!task.IsCompletedSuccessfully)
+ {
+ return Awaited(this, context, task);
+ }
+
+ return Task.CompletedTask;
+ }
+ catch (Exception exception)
+ {
+ // Get the Exception, but don't continue processing in the catch block as its bad for stack usage.
+ edi = ExceptionDispatchInfo.Capture(exception);
+ }
+
+ return HandleException(context, edi);
+
+ static async Task Awaited(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
+ {
+ ExceptionDispatchInfo? edi = null;
+ try
+ {
+ await task;
+ }
+ catch (Exception exception)
+ {
+ // Get the Exception, but don't continue processing in the catch block as its bad for stack usage.
+ edi = ExceptionDispatchInfo.Capture(exception);
+ }
+
+ if (edi != null)
+ {
+ await middleware.HandleException(context, edi);
+ }
+ }
+ }
+
+ private async Task HandleException(HttpContext context, ExceptionDispatchInfo edi)
+ {
+ _logger.UnhandledException(edi.SourceException);
+ // We can't do anything if the response has already started, just abort.
+ if (context.Response.HasStarted)
+ {
+ _logger.ResponseStartedErrorHandler();
+ edi.Throw();
+ }
+
+ PathString originalPath = context.Request.Path;
+ if (_options.ExceptionHandlingPath.HasValue)
+ {
+ context.Request.Path = _options.ExceptionHandlingPath;
+ }
+ try
+ {
+ var exceptionHandlerFeature = new ExceptionHandlerFeature()
+ {
+ Error = edi.SourceException,
+ Path = originalPath.Value!,
+ Endpoint = context.GetEndpoint(),
+ RouteValues = context.Features.Get<IRouteValuesFeature>()?.RouteValues
+ };
+
+ ClearHttpContext(context);
+
+ context.Features.Set<IExceptionHandlerFeature>(exceptionHandlerFeature);
+ context.Features.Set<IExceptionHandlerPathFeature>(exceptionHandlerFeature);
+ context.Response.StatusCode = DefaultStatusCode;
+ context.Response.OnStarting(_clearCacheHeadersDelegate, context.Response);
+
+ if (_options.ExceptionHandler != null)
+ {
+ await _options.ExceptionHandler!(context);
+ }
+ else
+ {
+ await _problemDetailsService!.WriteAsync(new ()
+ {
+ HttpContext = context,
+ AdditionalMetadata = exceptionHandlerFeature.Endpoint?.Metadata,
+ ProblemDetails = { Status = DefaultStatusCode }
+ });
+ }
+
+ // If the response has already started, assume exception handler was successful.
+ if (context.Response.HasStarted || context.Response.StatusCode != StatusCodes.Status404NotFound || _options.AllowStatusCode404Response)
+ {
+ const string eventName = "Microsoft.AspNetCore.Diagnostics.HandledException";
+ if (_diagnosticListener.IsEnabled() && _diagnosticListener.IsEnabled(eventName))
+ {
+ WriteDiagnosticEvent(_diagnosticListener, eventName, new { httpContext = context, exception = edi.SourceException });
+ }
+
+ return;
+ }
+
+ edi = ExceptionDispatchInfo.Capture(new InvalidOperationException($"The exception handler configured on {nameof(ExceptionHandlerOptions)} produced a 404 status response. " +
+ $"This {nameof(InvalidOperationException)} containing the original exception was thrown since this is often due to a misconfigured {nameof(ExceptionHandlerOptions.ExceptionHandlingPath)}. " +
+ $"If the exception handler is expected to return 404 status responses then set {nameof(ExceptionHandlerOptions.AllowStatusCode404Response)} to true.", edi.SourceException));
+ }
+ catch (Exception ex2)
+ {
+ // Suppress secondary exceptions, re-throw the original.
+ _logger.ErrorHandlerException(ex2);
+ }
+ finally
+ {
+ context.Request.Path = originalPath;
+ }
+
+ edi.Throw(); // Re-throw wrapped exception or the original if we couldn't handle it
+
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026",
+ Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")]
+ static void WriteDiagnosticEvent<TValue>(DiagnosticSource diagnosticSource, string name, TValue value)
+ => diagnosticSource.Write(name, value);
+ }
+
+ private static void ClearHttpContext(HttpContext context)
+ {
+ context.Response.Clear();
+
+ // An endpoint may have already been set. Since we're going to re-invoke the middleware pipeline we need to reset
+ // the endpoint and route values to ensure things are re-calculated.
+ context.SetEndpoint(endpoint: null);
+ var routeValuesFeature = context.Features.Get<IRouteValuesFeature>();
+ if (routeValuesFeature != null)
+ {
+ routeValuesFeature.RouteValues = null!;
+ }
+ }
+
+ private static Task ClearCacheHeaders(object state)
+ {
+ var headers = ((HttpResponse)state).Headers;
+ headers.CacheControl = "no-cache,no-store";
+ headers.Pragma = "no-cache";
+ headers.Expires = "-1";
+ headers.ETag = default;
+ return Task.CompletedTask;
+ }
+}
diff --git a/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj b/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj
index 3a479bf0a0..97805388d9 100644
--- a/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj
+++ b/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;diagnostics</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
@@ -15,6 +15,7 @@
<Compile Include="$(SharedSourceRoot)RazorViews\*.cs" />
<Compile Include="$(SharedSourceRoot)StackTrace\**\*.cs" />
<Compile Include="$(SharedSourceRoot)TypeNameHelper\*.cs" />
+ <Compile Include="$(SharedSourceRoot)Reroute.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Middleware/Diagnostics/src/PublicAPI.Shipped.txt b/src/Middleware/Diagnostics/src/PublicAPI.Shipped.txt
index f637264269..c73ebb5c8f 100644
--- a/src/Middleware/Diagnostics/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Diagnostics/src/PublicAPI.Shipped.txt
@@ -1,8 +1,8 @@
#nullable enable
-~Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.DeveloperExceptionPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DeveloperExceptionPageOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, System.Diagnostics.DiagnosticSource! diagnosticSource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.IDeveloperPageExceptionFilter!>! filters) -> void
-~Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.ExceptionHandlerMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ExceptionHandlerOptions!>! options, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
-~Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.StatusCodePagesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StatusCodePagesOptions!>! options) -> void
-~Microsoft.AspNetCore.Diagnostics.WelcomePageMiddleware.WelcomePageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WelcomePageOptions!>! options) -> void
+Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.DeveloperExceptionPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DeveloperExceptionPageOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, System.Diagnostics.DiagnosticSource! diagnosticSource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.IDeveloperPageExceptionFilter!>! filters) -> void
+Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.ExceptionHandlerMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ExceptionHandlerOptions!>! options, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
+Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.StatusCodePagesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StatusCodePagesOptions!>! options) -> void
+Microsoft.AspNetCore.Diagnostics.WelcomePageMiddleware.WelcomePageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WelcomePageOptions!>! options) -> void
Microsoft.AspNetCore.Builder.DeveloperExceptionPageExtensions
Microsoft.AspNetCore.Builder.DeveloperExceptionPageOptions
Microsoft.AspNetCore.Builder.DeveloperExceptionPageOptions.DeveloperExceptionPageOptions() -> void
diff --git a/src/Middleware/Diagnostics/src/PublicAPI.Unshipped.txt b/src/Middleware/Diagnostics/src/PublicAPI.Unshipped.txt
index a8796b9637..eb10f3ac15 100644
--- a/src/Middleware/Diagnostics/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/Diagnostics/src/PublicAPI.Unshipped.txt
@@ -3,11 +3,3 @@ Microsoft.AspNetCore.Diagnostics.StatusCodeReExecuteFeature.Endpoint.get -> Micr
Microsoft.AspNetCore.Diagnostics.StatusCodeReExecuteFeature.Endpoint.set -> void
Microsoft.AspNetCore.Diagnostics.StatusCodeReExecuteFeature.RouteValues.get -> Microsoft.AspNetCore.Routing.RouteValueDictionary?
Microsoft.AspNetCore.Diagnostics.StatusCodeReExecuteFeature.RouteValues.set -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.DeveloperExceptionPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DeveloperExceptionPageOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, System.Diagnostics.DiagnosticSource! diagnosticSource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.IDeveloperPageExceptionFilter!>! filters) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.ExceptionHandlerMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ExceptionHandlerOptions!>! options, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.StatusCodePagesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StatusCodePagesOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.WelcomePageMiddleware.WelcomePageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WelcomePageOptions!>! options) -> void
-Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.DeveloperExceptionPageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DeveloperExceptionPageOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, System.Diagnostics.DiagnosticSource! diagnosticSource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Diagnostics.IDeveloperPageExceptionFilter!>! filters) -> void
-Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware.ExceptionHandlerMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ExceptionHandlerOptions!>! options, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
-Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.StatusCodePagesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StatusCodePagesOptions!>! options) -> void
-Microsoft.AspNetCore.Diagnostics.WelcomePageMiddleware.WelcomePageMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WelcomePageOptions!>! options) -> void
diff --git a/src/Middleware/Diagnostics/src/Resources.resx b/src/Middleware/Diagnostics/src/Resources.resx
index 6e62f49494..6ac14a9a8b 100644
--- a/src/Middleware/Diagnostics/src/Resources.resx
+++ b/src/Middleware/Diagnostics/src/Resources.resx
@@ -248,7 +248,7 @@
<value>Environment:</value>
</data>
<data name="ExceptionHandlerOptions_NotConfiguredCorrectly" xml:space="preserve">
- <value>An error occurred when configuring the exception handler middleware. Either the 'ExceptionHandlingPath' or the 'ExceptionHandler' property must be set in 'UseExceptionHandler()'. Alternatively, set one of the aforementioned properties in 'Startup.ConfigureServices' as follows: 'services.AddExceptionHandler(options =&gt; { ... });'.</value>
+ <value>An error occurred when configuring the exception handler middleware. Either the 'ExceptionHandlingPath' or the 'ExceptionHandler' property must be set in 'UseExceptionHandler()'. Alternatively, set one of the aforementioned properties in 'Startup.ConfigureServices' as follows: 'services.AddExceptionHandler(options =&gt; { ... });' or configure to generate a 'ProblemDetails' response in 'service.AddProblemDetails()'.</value>
</data>
<data name="ErrorPageHtml_NoRouteValues" xml:space="preserve">
<value>No route values.</value>
@@ -280,4 +280,4 @@
<data name="ErrorPageHtml_NameColumn" xml:space="preserve">
<value>Name</value>
</data>
-</root>
+</root> \ No newline at end of file
diff --git a/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesExtensions.cs b/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesExtensions.cs
index 745834c359..f615da9112 100644
--- a/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesExtensions.cs
+++ b/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesExtensions.cs
@@ -5,6 +5,7 @@ using System.Globalization;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Builder;
@@ -172,23 +173,12 @@ public static class StatusCodePagesExtensions
throw new ArgumentNullException(nameof(app));
}
- const string globalRouteBuilderKey = "__GlobalEndpointRouteBuilder";
// Only use this path if there's a global router (in the 'WebApplication' case).
- if (app.Properties.TryGetValue(globalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
+ if (app.Properties.TryGetValue(RerouteHelper.GlobalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
{
return app.Use(next =>
{
- RequestDelegate? newNext = null;
- // start a new middleware pipeline
- var builder = app.New();
- // use the old routing pipeline if it exists so we preserve all the routes and matching logic
- // ((IApplicationBuilder)WebApplication).New() does not copy globalRouteBuilderKey automatically like it does for all other properties.
- builder.Properties[globalRouteBuilderKey] = routeBuilder;
- builder.UseRouting();
- // apply the next middleware
- builder.Run(next);
- newNext = builder.Build();
-
+ var newNext = RerouteHelper.Reroute(app, routeBuilder, next);
return new StatusCodePagesMiddleware(next,
Options.Create(new StatusCodePagesOptions() { HandleAsync = CreateHandler(pathFormat, queryFormat, newNext) })).Invoke;
});
diff --git a/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesOptions.cs b/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesOptions.cs
index 56c00d2ea6..496e02d763 100644
--- a/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesOptions.cs
+++ b/src/Middleware/Diagnostics/src/StatusCodePage/StatusCodePagesOptions.cs
@@ -5,6 +5,7 @@ using System.Globalization;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebUtilities;
+using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Builder;
@@ -19,15 +20,27 @@ public class StatusCodePagesOptions
/// </summary>
public StatusCodePagesOptions()
{
- HandleAsync = context =>
+ HandleAsync = async context =>
{
- // TODO: Render with a pre-compiled html razor view.
var statusCode = context.HttpContext.Response.StatusCode;
- var body = BuildResponseBody(statusCode);
+ if (context.HttpContext.RequestServices.GetService<IProblemDetailsService>() is { } problemDetailsService)
+ {
+ await problemDetailsService.WriteAsync(new ()
+ {
+ HttpContext = context.HttpContext,
+ ProblemDetails = { Status = statusCode }
+ });
+ }
+
+ // TODO: Render with a pre-compiled html razor view.
+ if (!context.HttpContext.Response.HasStarted)
+ {
+ var body = BuildResponseBody(statusCode);
- context.HttpContext.Response.ContentType = "text/plain";
- return context.HttpContext.Response.WriteAsync(body);
+ context.HttpContext.Response.ContentType = "text/plain";
+ await context.HttpContext.Response.WriteAsync(body);
+ }
};
}
diff --git a/src/Middleware/Diagnostics/src/WelcomePage/Views/Obsolete/WelcomePage.cs b/src/Middleware/Diagnostics/src/WelcomePage/Views/Obsolete/WelcomePage.cs
index 07f6c0e1e8..b20996b74c 100644
--- a/src/Middleware/Diagnostics/src/WelcomePage/Views/Obsolete/WelcomePage.cs
+++ b/src/Middleware/Diagnostics/src/WelcomePage/Views/Obsolete/WelcomePage.cs
@@ -15,7 +15,7 @@ using Microsoft.AspNetCore.Diagnostics
;
using System.Threading.Tasks;
- internal class WelcomePage : Microsoft.AspNetCore.DiagnosticsViewPage.Views.BaseView
+ internal sealed class WelcomePage : Microsoft.AspNetCore.DiagnosticsViewPage.Views.BaseView
{
#line hidden
public WelcomePage()
diff --git a/src/Middleware/Diagnostics/src/WelcomePage/Views/WelcomePage.Designer.cs b/src/Middleware/Diagnostics/src/WelcomePage/Views/WelcomePage.Designer.cs
index 95d4c08050..83bcbdf2a4 100644
--- a/src/Middleware/Diagnostics/src/WelcomePage/Views/WelcomePage.Designer.cs
+++ b/src/Middleware/Diagnostics/src/WelcomePage/Views/WelcomePage.Designer.cs
@@ -18,7 +18,7 @@ using Microsoft.AspNetCore.Diagnostics;
#line default
#line hidden
#nullable disable
- internal class WelcomePage : Microsoft.Extensions.RazorViews.BaseView
+ internal sealed class WelcomePage : Microsoft.Extensions.RazorViews.BaseView
{
#pragma warning disable 1998
public async override global::System.Threading.Tasks.Task ExecuteAsync()
diff --git a/src/Middleware/Diagnostics/test/FunctionalTests/DeveloperExceptionPageSampleTest.cs b/src/Middleware/Diagnostics/test/FunctionalTests/DeveloperExceptionPageSampleTest.cs
index 7691e4a9c0..25770a6d51 100644
--- a/src/Middleware/Diagnostics/test/FunctionalTests/DeveloperExceptionPageSampleTest.cs
+++ b/src/Middleware/Diagnostics/test/FunctionalTests/DeveloperExceptionPageSampleTest.cs
@@ -1,8 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Net;
using System.Net.Http;
+using System.Net.Http.Headers;
+using Microsoft.AspNetCore.Mvc;
+using System.Net.Http.Json;
namespace Microsoft.AspNetCore.Diagnostics.FunctionalTests;
@@ -29,4 +32,22 @@ public class DeveloperExceptionPageSampleTest : IClassFixture<TestFixture<Develo
Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
Assert.Contains("Exception: Demonstration exception.", body);
}
+
+ [Fact]
+ public async Task DeveloperExceptionPage_ShowsProblemDetails_WhenHtmlNotAccepted()
+ {
+ // Arrange
+ var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/");
+ request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+
+ // Act
+ var response = await Client.SendAsync(request);
+
+ // Assert
+ var body = await response.Content.ReadFromJsonAsync<ProblemDetails>();
+ Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+ Assert.NotNull(body);
+ Assert.Equal(500, body.Status);
+ Assert.Contains("Demonstration exception", body.Detail);
+ }
}
diff --git a/src/Middleware/Diagnostics/test/FunctionalTests/ProblemDetailsExceptionHandlerSampleTest.cs b/src/Middleware/Diagnostics/test/FunctionalTests/ProblemDetailsExceptionHandlerSampleTest.cs
new file mode 100644
index 0000000000..06b54ccfd0
--- /dev/null
+++ b/src/Middleware/Diagnostics/test/FunctionalTests/ProblemDetailsExceptionHandlerSampleTest.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Http;
+using Microsoft.AspNetCore.Mvc;
+using System.Net.Http.Json;
+using System.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.Diagnostics.FunctionalTests;
+
+public class ProblemDetailsExceptionHandlerSampleTest : IClassFixture<TestFixture<ExceptionHandlerSample.StartupWithProblemDetails>>
+{
+ public ProblemDetailsExceptionHandlerSampleTest(TestFixture<ExceptionHandlerSample.StartupWithProblemDetails> fixture)
+ {
+ Client = fixture.Client;
+ }
+
+ public HttpClient Client { get; }
+
+ [Fact]
+ public async Task ExceptionHandlerPage_ProducesProblemDetails()
+ {
+ // Arrange
+ var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/throw");
+ request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+
+ // Act
+ var response = await Client.SendAsync(request);
+
+ // Assert
+ var body = await response.Content.ReadFromJsonAsync<ProblemDetails>();
+ Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+ Assert.NotNull(body);
+ Assert.Equal(500, body.Status);
+ }
+}
diff --git a/src/Middleware/Diagnostics/test/FunctionalTests/StatusCodeSampleTest.cs b/src/Middleware/Diagnostics/test/FunctionalTests/StatusCodeSampleTest.cs
index 193999955a..3299200c28 100644
--- a/src/Middleware/Diagnostics/test/FunctionalTests/StatusCodeSampleTest.cs
+++ b/src/Middleware/Diagnostics/test/FunctionalTests/StatusCodeSampleTest.cs
@@ -1,9 +1,13 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Net;
using System.Net.Http;
+using Microsoft.AspNetCore.Mvc;
+using System.Net.Http.Json;
using Microsoft.AspNetCore.WebUtilities;
+using Microsoft.Net.Http.Headers;
+using System.Net.Http.Headers;
namespace Microsoft.AspNetCore.Diagnostics.FunctionalTests;
@@ -70,4 +74,22 @@ public class StatusCodeSampleTest : IClassFixture<TestFixture<StatusCodePagesSam
Assert.Contains(";", responseBody);
Assert.Contains(statusCodeReasonPhrase, responseBody);
}
+
+ [Fact]
+ public async Task StatusCodePage_ProducesProblemDetails()
+ {
+ // Arrange
+ var httpStatusCode = 400;
+ var request = new HttpRequestMessage(HttpMethod.Get, $"http://localhost?statuscode={httpStatusCode}");
+ request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
+
+ // Act
+ var response = await Client.SendAsync(request);
+
+ // Assert
+ var body = await response.Content.ReadFromJsonAsync<ProblemDetails>();
+ Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
+ Assert.NotNull(body);
+ Assert.Equal(400, body.Status);
+ }
}
diff --git a/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerTest.cs b/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerTest.cs
index ee3582ab0b..9b7053d4c0 100644
--- a/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerTest.cs
+++ b/src/Middleware/Diagnostics/test/UnitTests/ExceptionHandlerTest.cs
@@ -523,7 +523,8 @@ public class ExceptionHandlerTest
// Assert
Assert.Equal("An error occurred when configuring the exception handler middleware. " +
"Either the 'ExceptionHandlingPath' or the 'ExceptionHandler' property must be set in 'UseExceptionHandler()'. " +
- "Alternatively, set one of the aforementioned properties in 'Startup.ConfigureServices' as follows: 'services.AddExceptionHandler(options => { ... });'.",
+ "Alternatively, set one of the aforementioned properties in 'Startup.ConfigureServices' as follows: 'services.AddExceptionHandler(options => { ... });' " +
+ "or configure to generate a 'ProblemDetails' response in 'service.AddProblemDetails()'.",
exception.Message);
}
diff --git a/src/Middleware/Diagnostics/test/testassets/DatabaseErrorPageSample/Properties/launchSettings.json b/src/Middleware/Diagnostics/test/testassets/DatabaseErrorPageSample/Properties/launchSettings.json
index 3fbc5274ba..b2929adc68 100644
--- a/src/Middleware/Diagnostics/test/testassets/DatabaseErrorPageSample/Properties/launchSettings.json
+++ b/src/Middleware/Diagnostics/test/testassets/DatabaseErrorPageSample/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61218;http://localhost:61219"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/DeveloperExceptionPageSample.csproj b/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/DeveloperExceptionPageSample.csproj
index 40106c9233..39fb247b92 100644
--- a/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/DeveloperExceptionPageSample.csproj
+++ b/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/DeveloperExceptionPageSample.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
diff --git a/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Properties/launchSettings.json b/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Properties/launchSettings.json
index 8f4f5d821b..919228c334 100644
--- a/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Properties/launchSettings.json
+++ b/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61228;http://localhost:61229"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Startup.cs b/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Startup.cs
index f3592f61c7..a81b1593ca 100644
--- a/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Startup.cs
+++ b/src/Middleware/Diagnostics/test/testassets/DeveloperExceptionPageSample/Startup.cs
@@ -7,6 +7,11 @@ namespace DeveloperExceptionPageSample;
public class Startup
{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddProblemDetails();
+ }
+
public void Configure(IApplicationBuilder app)
{
app.Use((context, next) =>
@@ -21,7 +26,8 @@ public class Startup
c => null,
RoutePatternFactory.Parse("/"),
0,
- new EndpointMetadataCollection(new HttpMethodMetadata(new[] { "GET", "POST" })),
+ new EndpointMetadataCollection(
+ new HttpMethodMetadata(new[] { "GET", "POST" })),
"Endpoint display name");
context.SetEndpoint(endpoint);
diff --git a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/ExceptionHandlerSample.csproj b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/ExceptionHandlerSample.csproj
index 907fa264f8..2faf636c49 100644
--- a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/ExceptionHandlerSample.csproj
+++ b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/ExceptionHandlerSample.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -11,5 +11,4 @@
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
<Reference Include="Microsoft.AspNetCore.StaticFiles" />
</ItemGroup>
-
</Project>
diff --git a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Program.cs b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Program.cs
new file mode 100644
index 0000000000..f49dd9f042
--- /dev/null
+++ b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Program.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace ExceptionHandlerSample;
+
+public class Program
+{
+ public static Task Main(string[] args)
+ {
+ var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseKestrel()
+ .UseIISIntegration()
+ .UseStartup<Startup>();
+ })
+ .Build();
+
+ return host.RunAsync();
+ }
+}
diff --git a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Properties/launchSettings.json b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Properties/launchSettings.json
index c69c9dd556..86c5743f7e 100644
--- a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Properties/launchSettings.json
+++ b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61220;http://localhost:61221"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Startup.cs b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Startup.cs
index 4d9402a535..b54320e195 100644
--- a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Startup.cs
+++ b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/Startup.cs
@@ -53,20 +53,5 @@ public class Startup
await context.Response.WriteAsync("</body></html>\r\n");
});
}
-
- public static Task Main(string[] args)
- {
- var host = new HostBuilder()
- .ConfigureWebHost(webHostBuilder =>
- {
- webHostBuilder
- .UseKestrel()
- .UseIISIntegration()
- .UseStartup<Startup>();
- })
- .Build();
-
- return host.RunAsync();
- }
}
diff --git a/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/StartupWithProblemDetails.cs b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/StartupWithProblemDetails.cs
new file mode 100644
index 0000000000..ec842f6667
--- /dev/null
+++ b/src/Middleware/Diagnostics/test/testassets/ExceptionHandlerSample/StartupWithProblemDetails.cs
@@ -0,0 +1,40 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Encodings.Web;
+using Microsoft.AspNetCore.Diagnostics;
+using Microsoft.AspNetCore.Http.Metadata;
+
+namespace ExceptionHandlerSample;
+
+public class StartupWithProblemDetails
+{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddProblemDetails();
+ }
+
+ public void Configure(IApplicationBuilder app)
+ {
+ // Configure the error handler to produces a ProblemDetails.
+ app.UseExceptionHandler();
+
+ // The broken section of our application.
+ app.Map("/throw", throwApp =>
+ {
+ throwApp.Run(context => { throw new Exception("Application Exception"); });
+ });
+
+ app.UseStaticFiles();
+
+ // The home page.
+ app.Run(async context =>
+ {
+ context.Response.ContentType = "text/html";
+ await context.Response.WriteAsync("<html><body>Welcome to the sample<br><br>\r\n");
+ await context.Response.WriteAsync("Click here to throw an exception: <a href=\"/throw\">throw</a>\r\n");
+ await context.Response.WriteAsync("</body></html>\r\n");
+ });
+ }
+}
+
diff --git a/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Properties/launchSettings.json b/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Properties/launchSettings.json
index f27a4afd71..97b0bd2ba9 100644
--- a/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Properties/launchSettings.json
+++ b/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61230;http://localhost:61231"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Startup.cs b/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Startup.cs
index c1c8fd1e3f..ba0bda543a 100644
--- a/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Startup.cs
+++ b/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/Startup.cs
@@ -11,6 +11,11 @@ namespace StatusCodePagesSample;
public class Startup
{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddProblemDetails();
+ }
+
public void Configure(IApplicationBuilder app)
{
app.UseDeveloperExceptionPage();
diff --git a/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/StatusCodePagesSample.csproj b/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/StatusCodePagesSample.csproj
index 755410745d..9c24fc8c3f 100644
--- a/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/StatusCodePagesSample.csproj
+++ b/src/Middleware/Diagnostics/test/testassets/StatusCodePagesSample/StatusCodePagesSample.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
diff --git a/src/Middleware/Diagnostics/test/testassets/WelcomePageSample/Properties/launchSettings.json b/src/Middleware/Diagnostics/test/testassets/WelcomePageSample/Properties/launchSettings.json
index b82719da65..10feca9e72 100644
--- a/src/Middleware/Diagnostics/test/testassets/WelcomePageSample/Properties/launchSettings.json
+++ b/src/Middleware/Diagnostics/test/testassets/WelcomePageSample/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61223;http://localhost:61225"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/HeaderPropagation/src/Microsoft.AspNetCore.HeaderPropagation.csproj b/src/Middleware/HeaderPropagation/src/Microsoft.AspNetCore.HeaderPropagation.csproj
index c0c8415105..10e0fc0333 100644
--- a/src/Middleware/HeaderPropagation/src/Microsoft.AspNetCore.HeaderPropagation.csproj
+++ b/src/Middleware/HeaderPropagation/src/Microsoft.AspNetCore.HeaderPropagation.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;httpclient</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/HeaderPropagation/src/PublicAPI.Shipped.txt b/src/Middleware/HeaderPropagation/src/PublicAPI.Shipped.txt
index 25ef6c0383..3d927f90c0 100644
--- a/src/Middleware/HeaderPropagation/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/HeaderPropagation/src/PublicAPI.Shipped.txt
@@ -16,15 +16,8 @@
~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandlerEntry.OutboundHeaderName.get -> string
~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandlerEntryCollection.Add(string capturedHeaderName, string outboundHeaderName) -> void
~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandlerEntryCollection.Add(string headerName) -> void
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandlerOptions.Headers.get -> Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandlerEntryCollection
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandlerOptions.Headers.set -> void
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.HeaderPropagationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions> options, Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues values) -> void
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.HeaderPropagationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions!>! options, Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues! values) -> void
+Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.HeaderPropagationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions!>! options, Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues! values) -> void
~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions.Headers.get -> Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationEntryCollection
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions.Headers.set -> void
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues.Headers.get -> System.Collections.Generic.IDictionary<string, Microsoft.Extensions.Primitives.StringValues>
-~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues.Headers.set -> void
~override Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMessageHandler.SendAsync(System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>
~static Microsoft.AspNetCore.Builder.HeaderPropagationApplicationBuilderExtensions.UseHeaderPropagation(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.Extensions.DependencyInjection.HeaderPropagationHttpClientBuilderExtensions.AddHeaderPropagation(this Microsoft.Extensions.DependencyInjection.IHttpClientBuilder builder) -> Microsoft.Extensions.DependencyInjection.IHttpClientBuilder
@@ -33,6 +26,7 @@
~static Microsoft.Extensions.DependencyInjection.HeaderPropagationServiceCollectionExtensions.AddHeaderPropagation(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions> configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
Microsoft.AspNetCore.Builder.HeaderPropagationApplicationBuilderExtensions
Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationContext
+Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationContext.HeaderPropagationContext() -> void
Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationContext.HeaderName.get -> string!
Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationContext.HeaderPropagationContext(Microsoft.AspNetCore.Http.HttpContext! httpContext, string! headerName, Microsoft.Extensions.Primitives.StringValues headerValue) -> void
Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationContext.HeaderValue.get -> Microsoft.Extensions.Primitives.StringValues
diff --git a/src/Middleware/HeaderPropagation/src/PublicAPI.Unshipped.txt b/src/Middleware/HeaderPropagation/src/PublicAPI.Unshipped.txt
index 8f81c7f044..7dc5c58110 100644
--- a/src/Middleware/HeaderPropagation/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/HeaderPropagation/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.HeaderPropagationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions> options, Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues values) -> void
-*REMOVED*~Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.HeaderPropagationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions!>! options, Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues! values) -> void
-Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationMiddleware.HeaderPropagationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationOptions!>! options, Microsoft.AspNetCore.HeaderPropagation.HeaderPropagationValues! values) -> void
diff --git a/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj b/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj
index 7dc9d6dac2..2dfa54b0c1 100644
--- a/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj
+++ b/src/Middleware/HealthChecks.EntityFrameworkCore/src/Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>diagnostics;healthchecks;entityframeworkcore</PackageTags>
<BaseNamespace>Microsoft.Extensions.Diagnostics.HealthChecks</BaseNamespace>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs b/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs
index c4586cd074..069d874281 100644
--- a/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs
+++ b/src/Middleware/HealthChecks/src/Builder/HealthCheckEndpointRouteBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
@@ -59,6 +60,8 @@ public static class HealthCheckEndpointRouteBuilderExtensions
return MapHealthChecksCore(endpoints, pattern, options);
}
+ [UnconditionalSuppressMessage("Trimmer", "IL2026",
+ Justification = "MapHealthChecksCore only RequireUnreferencedCode if the RequestDelegate has a Task<T> return type which is not the case here.")]
private static IEndpointConventionBuilder MapHealthChecksCore(IEndpointRouteBuilder endpoints, string pattern, HealthCheckOptions? options)
{
if (endpoints.ServiceProvider.GetService(typeof(HealthCheckService)) == null)
diff --git a/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj b/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj
index 1da2d8fb5b..8a6aebd55d 100644
--- a/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj
+++ b/src/Middleware/HealthChecks/src/Microsoft.AspNetCore.Diagnostics.HealthChecks.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>diagnostics;healthchecks</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/HealthChecks/src/PublicAPI.Shipped.txt b/src/Middleware/HealthChecks/src/PublicAPI.Shipped.txt
index fcc4a3d75a..073ef61200 100644
--- a/src/Middleware/HealthChecks/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/HealthChecks/src/PublicAPI.Shipped.txt
@@ -1,13 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.HealthCheckMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions> healthCheckOptions, Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService healthCheckService) -> void
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.HealthCheckMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions!>! healthCheckOptions, Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService! healthCheckService) -> void
+Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.HealthCheckMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions!>! healthCheckOptions, Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService! healthCheckService) -> void
~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.InvokeAsync(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.Predicate.get -> System.Func<Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckRegistration, bool>
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.Predicate.set -> void
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.ResponseWriter.get -> System.Func<Microsoft.AspNetCore.Http.HttpContext, Microsoft.Extensions.Diagnostics.HealthChecks.HealthReport, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.ResponseWriter.set -> void
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.ResultStatusCodes.get -> System.Collections.Generic.IDictionary<Microsoft.Extensions.Diagnostics.HealthChecks.HealthStatus, int>
-~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions.ResultStatusCodes.set -> void
~static Microsoft.AspNetCore.Builder.HealthCheckApplicationBuilderExtensions.UseHealthChecks(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, Microsoft.AspNetCore.Http.PathString path) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.HealthCheckApplicationBuilderExtensions.UseHealthChecks(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, Microsoft.AspNetCore.Http.PathString path, int port) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.HealthCheckApplicationBuilderExtensions.UseHealthChecks(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, Microsoft.AspNetCore.Http.PathString path, int port, Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions options) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
diff --git a/src/Middleware/HealthChecks/src/PublicAPI.Unshipped.txt b/src/Middleware/HealthChecks/src/PublicAPI.Unshipped.txt
index 4820745db3..7dc5c58110 100644
--- a/src/Middleware/HealthChecks/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/HealthChecks/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.HealthCheckMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions> healthCheckOptions, Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService healthCheckService) -> void
-*REMOVED*~Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.HealthCheckMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions!>! healthCheckOptions, Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService! healthCheckService) -> void
-Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckMiddleware.HealthCheckMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Diagnostics.HealthChecks.HealthCheckOptions!>! healthCheckOptions, Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService! healthCheckService) -> void
diff --git a/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj b/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj
index d041ad41ce..7ea30334f1 100644
--- a/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj
+++ b/src/Middleware/HostFiltering/src/Microsoft.AspNetCore.HostFiltering.csproj
@@ -9,7 +9,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/HostFiltering/src/PublicAPI.Shipped.txt b/src/Middleware/HostFiltering/src/PublicAPI.Shipped.txt
index 68cdd66e5c..71d9bdf92d 100644
--- a/src/Middleware/HostFiltering/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/HostFiltering/src/PublicAPI.Shipped.txt
@@ -1,8 +1,6 @@
#nullable enable
~Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware.HostFilteringMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware> logger, Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.AspNetCore.HostFiltering.HostFilteringOptions> optionsMonitor) -> void
~Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.HostFiltering.HostFilteringOptions.AllowedHosts.get -> System.Collections.Generic.IList<string>
-~Microsoft.AspNetCore.HostFiltering.HostFilteringOptions.AllowedHosts.set -> void
~static Microsoft.AspNetCore.Builder.HostFilteringBuilderExtensions.UseHostFiltering(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.HostFilteringServicesExtensions.AddHostFiltering(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.HostFiltering.HostFilteringOptions> configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
Microsoft.AspNetCore.Builder.HostFilteringBuilderExtensions
diff --git a/src/Middleware/HttpLogging/samples/Logging.W3C.Sample/Startup.cs b/src/Middleware/HttpLogging/samples/Logging.W3C.Sample/Startup.cs
index f340c64143..b8e451c978 100644
--- a/src/Middleware/HttpLogging/samples/Logging.W3C.Sample/Startup.cs
+++ b/src/Middleware/HttpLogging/samples/Logging.W3C.Sample/Startup.cs
@@ -15,6 +15,9 @@ public class Startup
{
// Log all W3C fields
logging.LoggingFields = W3CLoggingFields.All;
+ logging.AdditionalRequestHeaders.Clear();
+ logging.AdditionalRequestHeaders.Add("x-forwarded-for");
+ logging.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
});
}
diff --git a/src/Middleware/HttpLogging/src/BufferingStream.cs b/src/Middleware/HttpLogging/src/BufferingStream.cs
index 8fabe1006d..53fa1c8cbf 100644
--- a/src/Middleware/HttpLogging/src/BufferingStream.cs
+++ b/src/Middleware/HttpLogging/src/BufferingStream.cs
@@ -59,7 +59,8 @@ internal abstract class BufferingStream : Stream, IBufferWriter<byte>
if (encoding == null)
{
- _logger.UnrecognizedMediaType();
+ // This method is used only for the response body
+ _logger.UnrecognizedMediaType("response");
return "";
}
diff --git a/src/Middleware/HttpLogging/src/FileLoggerProcessor.cs b/src/Middleware/HttpLogging/src/FileLoggerProcessor.cs
index f6b5a1804d..3f9a317fd5 100644
--- a/src/Middleware/HttpLogging/src/FileLoggerProcessor.cs
+++ b/src/Middleware/HttpLogging/src/FileLoggerProcessor.cs
@@ -35,6 +35,7 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
internal ISystemDateTime SystemDateTime { get; set; } = new SystemDateTime();
private readonly object _pathLock = new object();
+ private ISet<string> _additionalHeaders;
public FileLoggerProcessor(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory)
{
@@ -61,6 +62,8 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
_maxRetainedFiles = loggerOptions.RetainedFileCountLimit;
_flushInterval = loggerOptions.FlushInterval;
_fields = loggerOptions.LoggingFields;
+ _additionalHeaders = W3CLoggerOptions.FilterRequestHeaders(loggerOptions);
+
_options.OnChange(options =>
{
lock (_pathLock)
@@ -69,7 +72,7 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
loggerOptions = options;
// Move to a new file if the fields have changed
- if (_fields != loggerOptions.LoggingFields)
+ if (_fields != loggerOptions.LoggingFields || !_additionalHeaders.SetEquals(loggerOptions.AdditionalRequestHeaders))
{
_fileNumber++;
if (_fileNumber >= W3CLoggerOptions.MaxFileCount)
@@ -78,6 +81,7 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
Log.MaxFilesReached(_logger);
}
_fields = loggerOptions.LoggingFields;
+ _additionalHeaders = W3CLoggerOptions.FilterRequestHeaders(loggerOptions);
}
if (!string.IsNullOrEmpty(loggerOptions.LogDirectory))
@@ -152,23 +156,28 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
{
// Files are written up to _maxFileSize before rolling to a new file
DateTime today = SystemDateTime.Now;
+
+ if (!TryCreateDirectory())
+ {
+ // return early if we fail to create the directory
+ return;
+ }
+
var fullName = GetFullName(today);
// Don't write to an incomplete file left around by a previous FileLoggerProcessor
if (_firstFile)
{
- while (File.Exists(fullName))
+ _fileNumber = GetFirstFileCount(today);
+ fullName = GetFullName(today);
+ if (_fileNumber >= W3CLoggerOptions.MaxFileCount)
{
- _fileNumber++;
- if (_fileNumber >= W3CLoggerOptions.MaxFileCount)
- {
- _maxFilesReached = true;
- // Return early if log directory is already full
- Log.MaxFilesReached(_logger);
- return;
- }
- fullName = GetFullName(today);
+ _maxFilesReached = true;
+ // Return early if log directory is already full
+ Log.MaxFilesReached(_logger);
+ return;
}
}
+
_firstFile = false;
if (_maxFilesReached)
{
@@ -178,12 +187,6 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
return;
}
var fileInfo = new FileInfo(fullName);
-
- if (!TryCreateDirectory())
- {
- // return early if we fail to create the directory
- return;
- }
var streamWriter = GetStreamWriter(fullName);
try
@@ -296,6 +299,23 @@ internal partial class FileLoggerProcessor : IAsyncDisposable
await _outputTask;
}
+ private int GetFirstFileCount(DateTime date)
+ {
+ lock (_pathLock)
+ {
+ var searchString = FormattableString.Invariant($"{_fileName}{date.Year:0000}{date.Month:00}{date.Day:00}.*.txt");
+ var files = new DirectoryInfo(_path)
+ .GetFiles(searchString);
+
+ return files.Length == 0
+ ? 0
+ : files
+ .Max(x => int.TryParse(x.Name.Split('.').ElementAtOrDefault(Index.FromEnd(2)), out var parsed)
+ ? parsed + 1
+ : 0);
+ }
+ }
+
private string GetFullName(DateTime date)
{
lock (_pathLock)
diff --git a/src/Middleware/HttpLogging/src/HttpLoggingExtensions.cs b/src/Middleware/HttpLogging/src/HttpLoggingExtensions.cs
index 8e812b790e..a5f04101c3 100644
--- a/src/Middleware/HttpLogging/src/HttpLoggingExtensions.cs
+++ b/src/Middleware/HttpLogging/src/HttpLoggingExtensions.cs
@@ -29,6 +29,9 @@ internal static partial class HttpLoggingExtensions
[LoggerMessage(5, LogLevel.Debug, "Decode failure while converting body.", EventName = "DecodeFailure")]
public static partial void DecodeFailure(this ILogger logger, Exception ex);
- [LoggerMessage(6, LogLevel.Debug, "Unrecognized Content-Type for body.", EventName = "UnrecognizedMediaType")]
- public static partial void UnrecognizedMediaType(this ILogger logger);
+ [LoggerMessage(6, LogLevel.Debug, "Unrecognized Content-Type for {Name} body.", EventName = "UnrecognizedMediaType")]
+ public static partial void UnrecognizedMediaType(this ILogger logger, string name);
+
+ [LoggerMessage(7, LogLevel.Debug, "No Content-Type header for {Name} body.", EventName = "NoMediaType")]
+ public static partial void NoMediaType(this ILogger logger, string name);
}
diff --git a/src/Middleware/HttpLogging/src/HttpLoggingFields.cs b/src/Middleware/HttpLogging/src/HttpLoggingFields.cs
index 995b2c5478..3aa63637b0 100644
--- a/src/Middleware/HttpLogging/src/HttpLoggingFields.cs
+++ b/src/Middleware/HttpLogging/src/HttpLoggingFields.cs
@@ -138,12 +138,20 @@ public enum HttpLoggingFields : long
/// including <see cref="RequestPath"/>, <see cref="RequestProtocol"/>,
/// <see cref="RequestMethod"/>, and <see cref="RequestScheme"/>.
/// </summary>
+ /// <remarks>
+ /// The HTTP Request <see cref="HttpRequest.QueryString"/> is not included with this flag as it may contain private information.
+ /// If desired, it should be explicitly specified with <see cref="RequestQuery"/>.
+ /// </remarks>
RequestProperties = RequestPath | RequestProtocol | RequestMethod | RequestScheme,
/// <summary>
/// Flag for logging HTTP Request properties and headers.
/// Includes <see cref="RequestProperties"/> and <see cref="RequestHeaders"/>
/// </summary>
+ /// <remarks>
+ /// The HTTP Request <see cref="HttpRequest.QueryString"/> is not included with this flag as it may contain private information.
+ /// If desired, it should be explicitly specified with <see cref="RequestQuery"/>.
+ /// </remarks>
RequestPropertiesAndHeaders = RequestProperties | RequestHeaders,
/// <summary>
@@ -158,6 +166,10 @@ public enum HttpLoggingFields : long
/// Logging the request body has performance implications, as it requires buffering
/// the entire request body up to <see cref="HttpLoggingOptions.RequestBodyLogLimit"/>.
/// </summary>
+ /// <remarks>
+ /// The HTTP Request <see cref="HttpRequest.QueryString"/> is not included with this flag as it may contain private information.
+ /// If desired, it should be explicitly specified with <see cref="RequestQuery"/>.
+ /// </remarks>
Request = RequestPropertiesAndHeaders | RequestBody,
/// <summary>
@@ -175,5 +187,9 @@ public enum HttpLoggingFields : long
/// the entire request and response body up to the <see cref="HttpLoggingOptions.RequestBodyLogLimit"/>
/// and <see cref="HttpLoggingOptions.ResponseBodyLogLimit"/>.
/// </summary>
+ /// <remarks>
+ /// The HTTP Request <see cref="HttpRequest.QueryString"/> is not included with this flag as it may contain private information.
+ /// If desired, it should be explicitly specified with <see cref="RequestQuery"/>.
+ /// </remarks>
All = Request | Response
}
diff --git a/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs b/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs
index 50eba7a015..d2417a3022 100644
--- a/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs
+++ b/src/Middleware/HttpLogging/src/HttpLoggingMiddleware.cs
@@ -105,7 +105,11 @@ internal sealed class HttpLoggingMiddleware
if (options.LoggingFields.HasFlag(HttpLoggingFields.RequestBody))
{
- if (MediaTypeHelpers.TryGetEncodingForMediaType(request.ContentType,
+ if (request.ContentType is null)
+ {
+ _logger.NoMediaType("request");
+ }
+ else if (MediaTypeHelpers.TryGetEncodingForMediaType(request.ContentType,
options.MediaTypeOptions.MediaTypeStates,
out var encoding))
{
@@ -119,7 +123,7 @@ internal sealed class HttpLoggingMiddleware
}
else
{
- _logger.UnrecognizedMediaType();
+ _logger.UnrecognizedMediaType("request");
}
}
diff --git a/src/Middleware/HttpLogging/src/HttpLoggingOptions.cs b/src/Middleware/HttpLogging/src/HttpLoggingOptions.cs
index 06431c2900..6faaa08b71 100644
--- a/src/Middleware/HttpLogging/src/HttpLoggingOptions.cs
+++ b/src/Middleware/HttpLogging/src/HttpLoggingOptions.cs
@@ -20,6 +20,11 @@ public sealed class HttpLoggingOptions
/// <p>
/// If a request header is not present in the <see cref="RequestHeaders"/>,
/// the header name will be logged with a redacted value.
+ /// Request headers can contain authentication tokens,
+ /// or private information which may have regulatory concerns
+ /// under GDPR and other laws. Arbitrary request headers
+ /// should not be logged unless logs are secure and
+ /// access controlled and the privacy impact assessed.
/// </p>
/// </summary>
public ISet<string> RequestHeaders => _internalRequestHeaders;
@@ -81,7 +86,6 @@ public sealed class HttpLoggingOptions
HeaderNames.LastModified,
HeaderNames.Location,
HeaderNames.Server,
- HeaderNames.Status,
HeaderNames.TransferEncoding,
HeaderNames.Upgrade,
HeaderNames.XPoweredBy
diff --git a/src/Middleware/HttpLogging/src/HttpLoggingServicesExtensions.cs b/src/Middleware/HttpLogging/src/HttpLoggingServicesExtensions.cs
index 6627d89925..3634893fc7 100644
--- a/src/Middleware/HttpLogging/src/HttpLoggingServicesExtensions.cs
+++ b/src/Middleware/HttpLogging/src/HttpLoggingServicesExtensions.cs
@@ -49,6 +49,7 @@ public static class HttpLoggingServicesExtensions
}
services.Configure(configureOptions);
+ services.AddSingleton<W3CLoggerProcessor>();
services.AddSingleton<W3CLogger>();
return services;
}
diff --git a/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj b/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj
index 7fc0102e13..5e304b5dfc 100644
--- a/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj
+++ b/src/Middleware/HttpLogging/src/Microsoft.AspNetCore.HttpLogging.csproj
@@ -9,14 +9,14 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.AspNetCore.Http.Abstractions" />
<Reference Include="Microsoft.Extensions.Options" />
-
+
<Compile Include="$(RepoRoot)src\Shared\TaskToApm.cs" Link="Internal\TaskToApm.cs" />
<Compile Include="$(SharedSourceRoot)Buffers\**\*.cs" LinkBase="Internal\" />
<Compile Include="$(SharedSourceRoot)ValueStringBuilder\**\*.cs" />
diff --git a/src/Middleware/HttpLogging/src/PublicAPI.Unshipped.txt b/src/Middleware/HttpLogging/src/PublicAPI.Unshipped.txt
index 7dc5c58110..3f0003737c 100644
--- a/src/Middleware/HttpLogging/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/HttpLogging/src/PublicAPI.Unshipped.txt
@@ -1 +1,2 @@
#nullable enable
+Microsoft.AspNetCore.HttpLogging.W3CLoggerOptions.AdditionalRequestHeaders.get -> System.Collections.Generic.ISet<string!>!
diff --git a/src/Middleware/HttpLogging/src/StatusCodeHelper.cs b/src/Middleware/HttpLogging/src/StatusCodeHelper.cs
new file mode 100644
index 0000000000..7858a912da
--- /dev/null
+++ b/src/Middleware/HttpLogging/src/StatusCodeHelper.cs
@@ -0,0 +1,148 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.Net;
+
+namespace Microsoft.AspNetCore.HttpLogging;
+
+internal static class StatusCodeHelper
+{
+ public static string ToStatusString(int statusCode)
+ {
+ switch (statusCode)
+ {
+ case (int)HttpStatusCode.Continue:
+ return "100";
+ case (int)HttpStatusCode.SwitchingProtocols:
+ return "101";
+ case (int)HttpStatusCode.Processing:
+ return "102";
+
+ case (int)HttpStatusCode.OK:
+ return "200";
+ case (int)HttpStatusCode.Created:
+ return "201";
+ case (int)HttpStatusCode.Accepted:
+ return "202";
+ case (int)HttpStatusCode.NonAuthoritativeInformation:
+ return "203";
+ case (int)HttpStatusCode.NoContent:
+ return "204";
+ case (int)HttpStatusCode.ResetContent:
+ return "205";
+ case (int)HttpStatusCode.PartialContent:
+ return "206";
+ case (int)HttpStatusCode.MultiStatus:
+ return "207";
+ case (int)HttpStatusCode.AlreadyReported:
+ return "208";
+ case (int)HttpStatusCode.IMUsed:
+ return "226";
+
+ case (int)HttpStatusCode.MultipleChoices:
+ return "300";
+ case (int)HttpStatusCode.MovedPermanently:
+ return "301";
+ case (int)HttpStatusCode.Found:
+ return "302";
+ case (int)HttpStatusCode.SeeOther:
+ return "303";
+ case (int)HttpStatusCode.NotModified:
+ return "304";
+ case (int)HttpStatusCode.UseProxy:
+ return "305";
+ case (int)HttpStatusCode.Unused:
+ return "306";
+ case (int)HttpStatusCode.TemporaryRedirect:
+ return "307";
+ case (int)HttpStatusCode.PermanentRedirect:
+ return "308";
+
+ case (int)HttpStatusCode.BadRequest:
+ return "400";
+ case (int)HttpStatusCode.Unauthorized:
+ return "401";
+ case (int)HttpStatusCode.PaymentRequired:
+ return "402";
+ case (int)HttpStatusCode.Forbidden:
+ return "403";
+ case (int)HttpStatusCode.NotFound:
+ return "404";
+ case (int)HttpStatusCode.MethodNotAllowed:
+ return "405";
+ case (int)HttpStatusCode.NotAcceptable:
+ return "406";
+ case (int)HttpStatusCode.ProxyAuthenticationRequired:
+ return "407";
+ case (int)HttpStatusCode.RequestTimeout:
+ return "408";
+ case (int)HttpStatusCode.Conflict:
+ return "409";
+ case (int)HttpStatusCode.Gone:
+ return "410";
+ case (int)HttpStatusCode.LengthRequired:
+ return "411";
+ case (int)HttpStatusCode.PreconditionFailed:
+ return "412";
+ case (int)HttpStatusCode.RequestEntityTooLarge:
+ return "413";
+ case (int)HttpStatusCode.RequestUriTooLong:
+ return "414";
+ case (int)HttpStatusCode.UnsupportedMediaType:
+ return "415";
+ case (int)HttpStatusCode.RequestedRangeNotSatisfiable:
+ return "416";
+ case (int)HttpStatusCode.ExpectationFailed:
+ return "417";
+ case (int)418:
+ return "418";
+ case (int)419:
+ return "419";
+ case (int)HttpStatusCode.MisdirectedRequest:
+ return "421";
+ case (int)HttpStatusCode.UnprocessableEntity:
+ return "422";
+ case (int)HttpStatusCode.Locked:
+ return "423";
+ case (int)HttpStatusCode.FailedDependency:
+ return "424";
+ case (int)HttpStatusCode.UpgradeRequired:
+ return "426";
+ case (int)HttpStatusCode.PreconditionRequired:
+ return "428";
+ case (int)HttpStatusCode.TooManyRequests:
+ return "429";
+ case (int)HttpStatusCode.RequestHeaderFieldsTooLarge:
+ return "431";
+ case (int)HttpStatusCode.UnavailableForLegalReasons:
+ return "451";
+
+ case (int)HttpStatusCode.InternalServerError:
+ return "500";
+ case (int)HttpStatusCode.NotImplemented:
+ return "501";
+ case (int)HttpStatusCode.BadGateway:
+ return "502";
+ case (int)HttpStatusCode.ServiceUnavailable:
+ return "503";
+ case (int)HttpStatusCode.GatewayTimeout:
+ return "504";
+ case (int)HttpStatusCode.HttpVersionNotSupported:
+ return "505";
+ case (int)HttpStatusCode.VariantAlsoNegotiates:
+ return "506";
+ case (int)HttpStatusCode.InsufficientStorage:
+ return "507";
+ case (int)HttpStatusCode.LoopDetected:
+ return "508";
+ case (int)HttpStatusCode.NotExtended:
+ return "510";
+ case (int)HttpStatusCode.NetworkAuthenticationRequired:
+ return "511";
+
+ default:
+ return statusCode.ToString(CultureInfo.InvariantCulture);
+ }
+ }
+}
diff --git a/src/Middleware/HttpLogging/src/SystemDateTime.cs b/src/Middleware/HttpLogging/src/SystemDateTime.cs
index c065f8ac0a..340e074650 100644
--- a/src/Middleware/HttpLogging/src/SystemDateTime.cs
+++ b/src/Middleware/HttpLogging/src/SystemDateTime.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.HttpLogging;
-internal class SystemDateTime : ISystemDateTime
+internal sealed class SystemDateTime : ISystemDateTime
{
public DateTime Now => DateTime.Now;
}
diff --git a/src/Middleware/HttpLogging/src/W3CLogger.cs b/src/Middleware/HttpLogging/src/W3CLogger.cs
index 4ab1b47289..084b08ed00 100644
--- a/src/Middleware/HttpLogging/src/W3CLogger.cs
+++ b/src/Middleware/HttpLogging/src/W3CLogger.cs
@@ -2,19 +2,19 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.HttpLogging;
+#pragma warning disable CA1852 // Seal internal types
internal class W3CLogger : IAsyncDisposable
+#pragma warning restore CA1852 // Seal internal types
{
private readonly W3CLoggerProcessor _messageQueue;
private readonly IOptionsMonitor<W3CLoggerOptions> _options;
private W3CLoggingFields _loggingFields;
- public W3CLogger(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory)
+ public W3CLogger(IOptionsMonitor<W3CLoggerOptions> options, W3CLoggerProcessor messageQueue)
{
_options = options;
_loggingFields = _options.CurrentValue.LoggingFields;
@@ -22,23 +22,17 @@ internal class W3CLogger : IAsyncDisposable
{
_loggingFields = options.LoggingFields;
});
- _messageQueue = InitializeMessageQueue(_options, environment, factory);
- }
-
- // Virtual for testing
- internal virtual W3CLoggerProcessor InitializeMessageQueue(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory)
- {
- return new W3CLoggerProcessor(options, environment, factory);
+ _messageQueue = messageQueue;
}
public ValueTask DisposeAsync() => _messageQueue.DisposeAsync();
- public void Log(string[] elements)
+ public void Log(string[] elements, string[] additionalHeaders)
{
- _messageQueue.EnqueueMessage(Format(elements));
+ _messageQueue.EnqueueMessage(Format(elements, additionalHeaders));
}
- private string Format(string[] elements)
+ private string Format(string[] elements, string[] additionalHeaders)
{
// 200 is around the length of an average cookie-less entry
var sb = new ValueStringBuilder(200);
@@ -66,6 +60,27 @@ internal class W3CLogger : IAsyncDisposable
}
}
}
+
+ for (var i = 0; i < additionalHeaders.Length; i++)
+ {
+ if (!firstElement)
+ {
+ sb.Append(' ');
+ }
+ else
+ {
+ firstElement = false;
+ }
+ // If the element was not logged, or was the empty string, we log it as a dash
+ if (string.IsNullOrEmpty(additionalHeaders[i]))
+ {
+ sb.Append('-');
+ }
+ else
+ {
+ sb.Append(additionalHeaders[i]);
+ }
+ }
return sb.ToString();
}
}
diff --git a/src/Middleware/HttpLogging/src/W3CLoggerOptions.cs b/src/Middleware/HttpLogging/src/W3CLoggerOptions.cs
index bb9406eb73..8ca86c7f33 100644
--- a/src/Middleware/HttpLogging/src/W3CLoggerOptions.cs
+++ b/src/Middleware/HttpLogging/src/W3CLoggerOptions.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.Net.Http.Headers;
+
namespace Microsoft.AspNetCore.HttpLogging;
/// <summary>
@@ -107,6 +109,18 @@ public sealed class W3CLoggerOptions
}
/// <summary>
+ /// List of additional request header values to log.
+ /// <p>
+ /// Request headers can contain authentication tokens,
+ /// or private information which may have regulatory concerns
+ /// under GDPR and other laws. Arbitrary request headers
+ /// should not be logged unless logs are secure and
+ /// access controlled and the privacy impact assessed.
+ /// </p>
+ /// </summary>
+ public ISet<string> AdditionalRequestHeaders { get; } = new SortedSet<string>(StringComparer.OrdinalIgnoreCase);
+
+ /// <summary>
/// Fields to log. Defaults to logging request and response properties and headers,
/// plus date/time info and server name.
/// </summary>
@@ -115,4 +129,26 @@ public sealed class W3CLoggerOptions
W3CLoggingFields.ProtocolStatus | W3CLoggingFields.TimeTaken | W3CLoggingFields.ProtocolVersion |
W3CLoggingFields.Host | W3CLoggingFields.UserAgent | W3CLoggingFields.Referer | W3CLoggingFields.ConnectionInfoFields;
+ internal static ISet<string> FilterRequestHeaders(W3CLoggerOptions options)
+ {
+ var clonedSet = new SortedSet<string>(options.AdditionalRequestHeaders, StringComparer.InvariantCultureIgnoreCase);
+
+ if (options.LoggingFields.HasFlag(W3CLoggingFields.Host))
+ {
+ clonedSet.Remove(HeaderNames.Host);
+ }
+ if (options.LoggingFields.HasFlag(W3CLoggingFields.Referer))
+ {
+ clonedSet.Remove(HeaderNames.Referer);
+ }
+ if (options.LoggingFields.HasFlag(W3CLoggingFields.UserAgent))
+ {
+ clonedSet.Remove(HeaderNames.UserAgent);
+ }
+ if (options.LoggingFields.HasFlag(W3CLoggingFields.Cookie))
+ {
+ clonedSet.Remove(HeaderNames.Cookie);
+ }
+ return clonedSet;
+ }
}
diff --git a/src/Middleware/HttpLogging/src/W3CLoggerProcessor.cs b/src/Middleware/HttpLogging/src/W3CLoggerProcessor.cs
index bee9b496f7..d75d5f74fe 100644
--- a/src/Middleware/HttpLogging/src/W3CLoggerProcessor.cs
+++ b/src/Middleware/HttpLogging/src/W3CLoggerProcessor.cs
@@ -9,13 +9,17 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.HttpLogging;
+#pragma warning disable CA1852 // Seal internal types
internal class W3CLoggerProcessor : FileLoggerProcessor
+#pragma warning restore CA1852 // Seal internal types
{
private readonly W3CLoggingFields _loggingFields;
+ private readonly ISet<string>? _additionalRequestHeaders;
public W3CLoggerProcessor(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory) : base(options, environment, factory)
{
_loggingFields = options.CurrentValue.LoggingFields;
+ _additionalRequestHeaders = W3CLoggerOptions.FilterRequestHeaders(options.CurrentValue);
}
public override async Task OnFirstWrite(StreamWriter streamWriter, CancellationToken cancellationToken)
@@ -101,6 +105,14 @@ internal class W3CLoggerProcessor : FileLoggerProcessor
sb.Append(" cs(Referer)");
}
+ if (_additionalRequestHeaders != null)
+ {
+ foreach (var header in _additionalRequestHeaders)
+ {
+ sb.Append($" cs({header})");
+ }
+ }
+
return sb.ToString();
}
diff --git a/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs b/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs
index 9fdeffd79b..90fe835629 100644
--- a/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs
+++ b/src/Middleware/HttpLogging/src/W3CLoggingMiddleware.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Globalization;
+using System.Linq;
using System.Numerics;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Internal;
@@ -13,7 +14,7 @@ namespace Microsoft.AspNetCore.HttpLogging;
/// <summary>
/// Middleware that logs HTTP requests and HTTP responses.
/// </summary>
-internal class W3CLoggingMiddleware
+internal sealed class W3CLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly W3CLogger _w3cLogger;
@@ -38,6 +39,7 @@ internal class W3CLoggingMiddleware
internal static readonly int _userAgentIndex = BitOperations.Log2((int)W3CLoggingFields.UserAgent);
internal static readonly int _cookieIndex = BitOperations.Log2((int)W3CLoggingFields.Cookie);
internal static readonly int _refererIndex = BitOperations.Log2((int)W3CLoggingFields.Referer);
+ private readonly ISet<string> _additionalRequestHeaders;
// Number of fields in W3CLoggingFields - equal to the number of _*Index variables above
internal const int _fieldsLength = 17;
@@ -68,6 +70,7 @@ internal class W3CLoggingMiddleware
_next = next;
_options = options;
_w3cLogger = w3cLogger;
+ _additionalRequestHeaders = W3CLoggerOptions.FilterRequestHeaders(options.CurrentValue);
}
/// <summary>
@@ -80,6 +83,7 @@ internal class W3CLoggingMiddleware
var options = _options.CurrentValue;
var elements = new string[_fieldsLength];
+ var additionalHeaderElements = new string[_additionalRequestHeaders.Count];
// Whether any of the requested fields actually had content
bool shouldLog = false;
@@ -148,11 +152,9 @@ internal class W3CLoggingMiddleware
if ((W3CLoggingFields.RequestHeaders & options.LoggingFields) != W3CLoggingFields.None)
{
- var headers = request.Headers;
-
if (options.LoggingFields.HasFlag(W3CLoggingFields.Host))
{
- if (headers.TryGetValue(HeaderNames.Host, out var host))
+ if (request.Headers.TryGetValue(HeaderNames.Host, out var host))
{
shouldLog |= AddToList(elements, _hostIndex, host.ToString());
}
@@ -160,7 +162,7 @@ internal class W3CLoggingMiddleware
if (options.LoggingFields.HasFlag(W3CLoggingFields.Referer))
{
- if (headers.TryGetValue(HeaderNames.Referer, out var referer))
+ if (request.Headers.TryGetValue(HeaderNames.Referer, out var referer))
{
shouldLog |= AddToList(elements, _refererIndex, referer.ToString());
}
@@ -168,7 +170,7 @@ internal class W3CLoggingMiddleware
if (options.LoggingFields.HasFlag(W3CLoggingFields.UserAgent))
{
- if (headers.TryGetValue(HeaderNames.UserAgent, out var agent))
+ if (request.Headers.TryGetValue(HeaderNames.UserAgent, out var agent))
{
shouldLog |= AddToList(elements, _userAgentIndex, agent.ToString());
}
@@ -176,7 +178,7 @@ internal class W3CLoggingMiddleware
if (options.LoggingFields.HasFlag(W3CLoggingFields.Cookie))
{
- if (headers.TryGetValue(HeaderNames.Cookie, out var cookie))
+ if (request.Headers.TryGetValue(HeaderNames.Cookie, out var cookie))
{
shouldLog |= AddToList(elements, _cookieIndex, cookie.ToString());
}
@@ -184,6 +186,19 @@ internal class W3CLoggingMiddleware
}
}
+ if (_additionalRequestHeaders.Count != 0)
+ {
+ var additionalRequestHeaders = _additionalRequestHeaders.ToList();
+
+ for (var i = 0; i < additionalRequestHeaders.Count; i++)
+ {
+ if (context.Request.Headers.TryGetValue(additionalRequestHeaders[i], out var headerValue))
+ {
+ shouldLog |= AddToList(additionalHeaderElements, i, headerValue.ToString());
+ }
+ }
+ }
+
var response = context.Response;
try
@@ -195,7 +210,7 @@ internal class W3CLoggingMiddleware
// Write the log
if (shouldLog)
{
- _w3cLogger.Log(elements);
+ _w3cLogger.Log(elements, additionalHeaderElements);
}
throw;
}
@@ -207,7 +222,7 @@ internal class W3CLoggingMiddleware
if (options.LoggingFields.HasFlag(W3CLoggingFields.ProtocolStatus))
{
- shouldLog |= AddToList(elements, _protocolStatusIndex, response.StatusCode.ToString(CultureInfo.InvariantCulture));
+ shouldLog |= AddToList(elements, _protocolStatusIndex, StatusCodeHelper.ToStatusString(response.StatusCode));
}
if (options.LoggingFields.HasFlag(W3CLoggingFields.TimeTaken))
@@ -218,7 +233,7 @@ internal class W3CLoggingMiddleware
// Write the log
if (shouldLog)
{
- _w3cLogger.Log(elements);
+ _w3cLogger.Log(elements, additionalHeaderElements);
}
}
diff --git a/src/Middleware/HttpLogging/test/FileLoggerProcessorTests.cs b/src/Middleware/HttpLogging/test/FileLoggerProcessorTests.cs
index beb24a9ddd..8634f58ee9 100644
--- a/src/Middleware/HttpLogging/test/FileLoggerProcessorTests.cs
+++ b/src/Middleware/HttpLogging/test/FileLoggerProcessorTests.cs
@@ -4,15 +4,16 @@
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Hosting.Internal;
using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Logging.Testing;
namespace Microsoft.AspNetCore.HttpLogging;
public class FileLoggerProcessorTests
{
-
private string _messageOne = "Message one";
private string _messageTwo = "Message two";
private string _messageThree = "Message three";
+ private string _messageFour = "Message four";
private DateTime _today = new DateTime(2021, 01, 01, 12, 00, 00);
@@ -34,7 +35,7 @@ public class FileLoggerProcessorTests
try
{
- string fileName;
+ string filePath;
var options = new W3CLoggerOptions()
{
LogDirectory = path
@@ -43,13 +44,13 @@ public class FileLoggerProcessorTests
{
logger.SystemDateTime = mockSystemDateTime;
logger.EnqueueMessage(_messageOne);
- fileName = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0000.txt"));
+ filePath = GetLogFilePath(path, options.FileName, _today, 0);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(fileName, _messageOne.Length).DefaultTimeout();
+ await WaitForFile(filePath, _messageOne.Length).DefaultTimeout();
}
- Assert.True(File.Exists(fileName));
+ Assert.True(File.Exists(filePath));
- Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(fileName));
+ Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(filePath));
}
finally
{
@@ -74,30 +75,30 @@ public class FileLoggerProcessorTests
try
{
- string fileNameToday;
- string fileNameTomorrow;
+ string filePathToday;
+ string filePathTomorrow;
await using (var logger = new FileLoggerProcessor(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), NullLoggerFactory.Instance))
{
logger.SystemDateTime = mockSystemDateTime;
logger.EnqueueMessage(_messageOne);
- fileNameToday = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0000.txt"));
+ filePathToday = GetLogFilePath(path, options.FileName, _today, 0);
- await WaitForFile(fileNameToday, _messageOne.Length).DefaultTimeout();
+ await WaitForFile(filePathToday, _messageOne.Length).DefaultTimeout();
mockSystemDateTime.Now = tomorrow;
logger.EnqueueMessage(_messageTwo);
- fileNameTomorrow = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{tomorrow.Year:0000}{tomorrow.Month:00}{tomorrow.Day:00}.0000.txt"));
+ filePathTomorrow = GetLogFilePath(path, options.FileName, tomorrow, 0);
- await WaitForFile(fileNameTomorrow, _messageTwo.Length).DefaultTimeout();
+ await WaitForFile(filePathTomorrow, _messageTwo.Length).DefaultTimeout();
}
- Assert.True(File.Exists(fileNameToday));
- Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(fileNameToday));
- Assert.True(File.Exists(fileNameTomorrow));
- Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(fileNameTomorrow));
+ Assert.True(File.Exists(filePathToday));
+ Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(filePathToday));
+ Assert.True(File.Exists(filePathTomorrow));
+ Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(filePathTomorrow));
}
finally
{
@@ -112,8 +113,8 @@ public class FileLoggerProcessorTests
try
{
- string fileName1;
- string fileName2;
+ string filePath1;
+ string filePath2;
var mockSystemDateTime = new MockSystemDateTime
{
Now = _today
@@ -128,16 +129,16 @@ public class FileLoggerProcessorTests
logger.SystemDateTime = mockSystemDateTime;
logger.EnqueueMessage(_messageOne);
logger.EnqueueMessage(_messageTwo);
- fileName1 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0000.txt"));
- fileName2 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0001.txt"));
+ filePath1 = GetLogFilePath(path, options.FileName, _today, 0);
+ filePath2 = GetLogFilePath(path, options.FileName, _today, 1);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(fileName2, _messageTwo.Length).DefaultTimeout();
+ await WaitForFile(filePath2, _messageTwo.Length).DefaultTimeout();
}
- Assert.True(File.Exists(fileName1));
- Assert.True(File.Exists(fileName2));
+ Assert.True(File.Exists(filePath1));
+ Assert.True(File.Exists(filePath2));
- Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(fileName1));
- Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(fileName2));
+ Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(filePath1));
+ Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(filePath2));
}
finally
{
@@ -158,7 +159,7 @@ public class FileLoggerProcessorTests
try
{
- string lastFileName;
+ string lastFilePath;
var options = new W3CLoggerOptions()
{
LogDirectory = path,
@@ -172,12 +173,12 @@ public class FileLoggerProcessorTests
{
logger.EnqueueMessage(_messageOne);
}
- lastFileName = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0009.txt"));
+ lastFilePath = GetLogFilePath(path, options.FileName, _today, 9);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(lastFileName, _messageOne.Length).DefaultTimeout();
+ await WaitForFile(lastFilePath, _messageOne.Length).DefaultTimeout();
for (int i = 0; i < 6; i++)
{
- await WaitForRoll(Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.{i:0000}.txt"))).DefaultTimeout();
+ await WaitForRoll(GetLogFilePath(path, options.FileName, _today, i)).DefaultTimeout();
}
}
@@ -191,7 +192,67 @@ public class FileLoggerProcessorTests
Assert.Equal("randomFile.txt", actualFiles[0]);
for (int i = 1; i < 4; i++)
{
- Assert.True((actualFiles[i].StartsWith($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}", StringComparison.InvariantCulture)));
+ Assert.StartsWith(GetLogFileBaseName(options.FileName, _today), actualFiles[i], StringComparison.InvariantCulture);
+ }
+ }
+ finally
+ {
+ Helpers.DisposeDirectory(path);
+ }
+ }
+
+ [Fact]
+ public async Task StopsLoggingAfter10000Files()
+ {
+ var path = Path.Combine(TempPath, Path.GetRandomFileName());
+ Directory.CreateDirectory(path);
+ var mockSystemDateTime = new MockSystemDateTime
+ {
+ Now = _today
+ };
+
+ try
+ {
+ string lastFilePath;
+ var options = new W3CLoggerOptions()
+ {
+ LogDirectory = path,
+ FileSizeLimit = 5,
+ RetainedFileCountLimit = 10000
+ };
+ var testSink = new TestSink();
+ var testLogger = new TestLoggerFactory(testSink, enabled:true);
+ await using (var logger = new FileLoggerProcessor(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), testLogger))
+ {
+ logger.SystemDateTime = mockSystemDateTime;
+ for (int i = 0; i < 10000; i++)
+ {
+ logger.EnqueueMessage(_messageOne);
+ }
+ lastFilePath = GetLogFilePath(path, options.FileName, _today, 9999);
+ await WaitForFile(lastFilePath, _messageOne.Length).DefaultTimeout();
+
+ // directory is full, no warnings yet
+ Assert.Equal(0, testSink.Writes.Count);
+
+ logger.EnqueueMessage(_messageOne);
+ await WaitForCondition(() => testSink.Writes.FirstOrDefault()?.EventId.Name == "MaxFilesReached").DefaultTimeout();
+ }
+
+ Assert.Equal(10000, new DirectoryInfo(path)
+ .GetFiles()
+ .ToArray().Length);
+
+ // restarting the logger should do nothing since the folder is still full
+ var testSink2 = new TestSink();
+ var testLogger2 = new TestLoggerFactory(testSink2, enabled:true);
+ await using (var logger = new FileLoggerProcessor(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), testLogger2))
+ {
+ Assert.Equal(0, testSink2.Writes.Count);
+
+ logger.SystemDateTime = mockSystemDateTime;
+ logger.EnqueueMessage(_messageOne);
+ await WaitForCondition(() => testSink2.Writes.FirstOrDefault()?.EventId.Name == "MaxFilesReached").DefaultTimeout();
}
}
finally
@@ -226,7 +287,7 @@ public class FileLoggerProcessorTests
{
logger.EnqueueMessage(_messageOne);
}
- var filePath = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0002.txt"));
+ var filePath = GetLogFilePath(path, options.FileName, _today, 2);
// Pause for a bit before disposing so logger can finish logging
await WaitForFile(filePath, _messageOne.Length).DefaultTimeout();
}
@@ -239,7 +300,7 @@ public class FileLoggerProcessorTests
{
logger.EnqueueMessage(_messageOne);
}
- var filePath = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0005.txt"));
+ var filePath = GetLogFilePath(path, options.FileName, _today, 5);
// Pause for a bit before disposing so logger can finish logging
await WaitForFile(filePath, _messageOne.Length).DefaultTimeout();
}
@@ -253,7 +314,7 @@ public class FileLoggerProcessorTests
Assert.Equal(6, actualFiles1.Length);
for (int i = 0; i < 6; i++)
{
- Assert.Contains($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.{i:0000}.txt", actualFiles1[i]);
+ Assert.Contains(GetLogFileName(options.FileName, _today, i), actualFiles1[i]);
}
// Third instance should roll to 5 most recent files
@@ -263,9 +324,9 @@ public class FileLoggerProcessorTests
logger.SystemDateTime = mockSystemDateTime;
logger.EnqueueMessage(_messageOne);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0006.txt")), _messageOne.Length).DefaultTimeout();
- await WaitForRoll(Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0000.txt"))).DefaultTimeout();
- await WaitForRoll(Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0001.txt"))).DefaultTimeout();
+ await WaitForFile(GetLogFilePath(path, options.FileName, _today, 6), _messageOne.Length).DefaultTimeout();
+ await WaitForRoll(GetLogFilePath(path, options.FileName, _today, 0)).DefaultTimeout();
+ await WaitForRoll(GetLogFilePath(path, options.FileName, _today, 1)).DefaultTimeout();
}
var actualFiles2 = new DirectoryInfo(path)
@@ -277,7 +338,7 @@ public class FileLoggerProcessorTests
Assert.Equal(5, actualFiles2.Length);
for (int i = 0; i < 5; i++)
{
- Assert.Equal($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.{i + 2:0000}.txt", actualFiles2[i]);
+ Assert.Equal(GetLogFileName(options.FileName, _today, i + 2), actualFiles2[i]);
}
}
finally
@@ -304,9 +365,9 @@ public class FileLoggerProcessorTests
LogDirectory = path,
FileSizeLimit = 5
};
- var fileName1 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0000.txt"));
- var fileName2 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0001.txt"));
- var fileName3 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0002.txt"));
+ var filePath1 = GetLogFilePath(path, options.FileName, _today, 0);
+ var filePath2 = GetLogFilePath(path, options.FileName, _today, 1);
+ var filePath3 = GetLogFilePath(path, options.FileName, _today, 2);
await using (var logger = new FileLoggerProcessor(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), NullLoggerFactory.Instance))
{
@@ -314,7 +375,7 @@ public class FileLoggerProcessorTests
logger.EnqueueMessage(_messageOne);
logger.EnqueueMessage(_messageTwo);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(fileName2, _messageTwo.Length).DefaultTimeout();
+ await WaitForFile(filePath2, _messageTwo.Length).DefaultTimeout();
}
// Even with a big enough FileSizeLimit, we still won't try to write to files from a previous instance.
@@ -325,7 +386,7 @@ public class FileLoggerProcessorTests
logger.SystemDateTime = mockSystemDateTime;
logger.EnqueueMessage(_messageThree);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(fileName3, _messageThree.Length).DefaultTimeout();
+ await WaitForFile(filePath3, _messageThree.Length).DefaultTimeout();
}
var actualFiles = new DirectoryInfo(path)
@@ -336,22 +397,90 @@ public class FileLoggerProcessorTests
Assert.Equal(3, actualFiles.Length);
- Assert.True(File.Exists(fileName1));
- Assert.True(File.Exists(fileName2));
- Assert.True(File.Exists(fileName3));
+ Assert.True(File.Exists(filePath1));
+ Assert.True(File.Exists(filePath2));
+ Assert.True(File.Exists(filePath3));
- Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(fileName1));
- Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(fileName2));
- Assert.Equal(_messageThree + Environment.NewLine, File.ReadAllText(fileName3));
+ Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(filePath1));
+ Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(filePath2));
+ Assert.Equal(_messageThree + Environment.NewLine, File.ReadAllText(filePath3));
}
finally
{
Helpers.DisposeDirectory(path);
}
}
-
[Fact]
- public async Task WritesToNewFileOnOptionsChange()
+ public async Task RollsTextFilesWhenFirstLogOfDayIsMissing()
+ {
+ var mockSystemDateTime = new MockSystemDateTime
+ {
+ Now = _today
+ };
+
+ var path = Path.Combine(TempPath, Path.GetRandomFileName());
+ Directory.CreateDirectory(path);
+
+ try
+ {
+ var options = new W3CLoggerOptions()
+ {
+ LogDirectory = path,
+ FileSizeLimit = 5,
+ RetainedFileCountLimit = 2,
+ };
+ var filePath1 = GetLogFilePath(path, options.FileName, _today, 0);
+ var filePath2 = GetLogFilePath(path, options.FileName, _today, 1);
+ var filePath3 = GetLogFilePath(path, options.FileName, _today, 2);
+ var filePath4 = GetLogFilePath(path, options.FileName, _today, 3);
+
+ await using (var logger = new FileLoggerProcessor(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), NullLoggerFactory.Instance))
+ {
+ logger.SystemDateTime = mockSystemDateTime;
+ logger.EnqueueMessage(_messageOne);
+ logger.EnqueueMessage(_messageTwo);
+ logger.EnqueueMessage(_messageThree);
+ // Pause for a bit before disposing so logger can finish logging
+ await WaitForFile(filePath3, _messageThree.Length).DefaultTimeout();
+ }
+
+ // Even with a big enough FileSizeLimit, we still won't try to write to files from a previous instance.
+ options.FileSizeLimit = 10000;
+
+ await using (var logger = new FileLoggerProcessor(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), NullLoggerFactory.Instance))
+ {
+ logger.SystemDateTime = mockSystemDateTime;
+ logger.EnqueueMessage(_messageFour);
+ // Pause for a bit before disposing so logger can finish logging
+ await WaitForFile(filePath4, _messageFour.Length).DefaultTimeout();
+ }
+
+ var actualFiles = new DirectoryInfo(path)
+ .GetFiles()
+ .Select(f => f.Name)
+ .OrderBy(f => f)
+ .ToArray();
+
+ Assert.Equal(2, actualFiles.Length);
+
+ Assert.False(File.Exists(filePath1));
+ Assert.False(File.Exists(filePath2));
+ Assert.True(File.Exists(filePath3));
+ Assert.True(File.Exists(filePath4));
+
+ Assert.Equal(_messageThree + Environment.NewLine, File.ReadAllText(filePath3));
+ Assert.Equal(_messageFour + Environment.NewLine, File.ReadAllText(filePath4));
+ }
+ finally
+ {
+ Helpers.DisposeDirectory(path);
+ }
+ }
+
+ [Theory]
+ [InlineData(false, true)]
+ [InlineData(true, false)]
+ public async Task WritesToNewFileOnOptionsChange(bool fieldsChanged, bool headersChanged)
{
var mockSystemDateTime = new MockSystemDateTime
{
@@ -367,22 +496,33 @@ public class FileLoggerProcessorTests
{
LogDirectory = path,
LoggingFields = W3CLoggingFields.Time,
- FileSizeLimit = 10000
+ FileSizeLimit = 10000,
};
- var fileName1 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0000.txt"));
- var fileName2 = Path.Combine(path, FormattableString.Invariant($"{options.FileName}{_today.Year:0000}{_today.Month:00}{_today.Day:00}.0001.txt"));
+ options.AdditionalRequestHeaders.Add("one");
+ var filePath1 = GetLogFilePath(path, options.FileName, _today, 0);
+ var filePath2 = GetLogFilePath(path, options.FileName, _today, 1);
var monitor = new OptionsWrapperMonitor<W3CLoggerOptions>(options);
await using (var logger = new FileLoggerProcessor(monitor, new HostingEnvironment(), NullLoggerFactory.Instance))
{
logger.SystemDateTime = mockSystemDateTime;
logger.EnqueueMessage(_messageOne);
- await WaitForFile(fileName1, _messageOne.Length).DefaultTimeout();
- options.LoggingFields = W3CLoggingFields.Date;
+ await WaitForFile(filePath1, _messageOne.Length).DefaultTimeout();
+
+ if (fieldsChanged)
+ {
+ options.LoggingFields = W3CLoggingFields.Date;
+ }
+
+ if (headersChanged)
+ {
+ options.AdditionalRequestHeaders.Remove("one");
+ options.AdditionalRequestHeaders.Add("two");
+ }
monitor.InvokeChanged();
logger.EnqueueMessage(_messageTwo);
// Pause for a bit before disposing so logger can finish logging
- await WaitForFile(fileName2, _messageTwo.Length).DefaultTimeout();
+ await WaitForFile(filePath2, _messageTwo.Length).DefaultTimeout();
}
var actualFiles = new DirectoryInfo(path)
@@ -393,11 +533,11 @@ public class FileLoggerProcessorTests
Assert.Equal(2, actualFiles.Length);
- Assert.True(File.Exists(fileName1));
- Assert.True(File.Exists(fileName2));
+ Assert.True(File.Exists(filePath1));
+ Assert.True(File.Exists(filePath2));
- Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(fileName1));
- Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(fileName2));
+ Assert.Equal(_messageOne + Environment.NewLine, File.ReadAllText(filePath1));
+ Assert.Equal(_messageTwo + Environment.NewLine, File.ReadAllText(filePath2));
}
finally
{
@@ -405,9 +545,9 @@ public class FileLoggerProcessorTests
}
}
- private async Task WaitForFile(string fileName, int length)
+ private async Task WaitForFile(string filePath, int length)
{
- while (!File.Exists(fileName))
+ while (!File.Exists(filePath))
{
await Task.Delay(100);
}
@@ -415,7 +555,7 @@ public class FileLoggerProcessorTests
{
try
{
- if (File.ReadAllText(fileName).Length >= length)
+ if (File.ReadAllText(filePath).Length >= length)
{
break;
}
@@ -428,11 +568,34 @@ public class FileLoggerProcessorTests
}
}
- private async Task WaitForRoll(string fileName)
+ private async Task WaitForCondition(Func<bool> waitForLog)
+ {
+ while (!waitForLog())
+ {
+ await Task.Delay(10);
+ }
+ }
+
+ private async Task WaitForRoll(string filePath)
{
- while (File.Exists(fileName))
+ while (File.Exists(filePath))
{
await Task.Delay(100);
}
}
+
+ private static string GetLogFilePath(string path, string prefix, DateTime dateTime, int fileNumber)
+ {
+ return Path.Combine(path, GetLogFileName(prefix, dateTime, fileNumber));
+ }
+
+ private static string GetLogFileName(string prefix, DateTime dateTime, int fileNumber)
+ {
+ return FormattableString.Invariant($"{GetLogFileBaseName(prefix, dateTime)}.{fileNumber:0000}.txt");
+ }
+
+ private static string GetLogFileBaseName(string prefix, DateTime dateTime)
+ {
+ return FormattableString.Invariant($"{prefix}{dateTime.Year:0000}{dateTime.Month:00}{dateTime.Day:00}");
+ }
}
diff --git a/src/Middleware/HttpLogging/test/Helpers.cs b/src/Middleware/HttpLogging/test/Helpers.cs
index cbdf8ed754..ee0014122e 100644
--- a/src/Middleware/HttpLogging/test/Helpers.cs
+++ b/src/Middleware/HttpLogging/test/Helpers.cs
@@ -1,9 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.Extensions.Hosting.Internal;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
+
namespace Microsoft.AspNetCore.HttpLogging;
-public class Helpers
+internal static class Helpers
{
public static void DisposeDirectory(string path)
{
@@ -19,4 +23,14 @@ public class Helpers
// ignored
}
}
+
+ public static TestW3CLogger CreateTestW3CLogger(IOptionsMonitor<W3CLoggerOptions> options)
+ {
+ return new TestW3CLogger(
+ options,
+ new TestW3CLoggerProcessor(
+ options,
+ new HostingEnvironment(),
+ NullLoggerFactory.Instance));
+ }
}
diff --git a/src/Middleware/HttpLogging/test/HttpLoggingMiddlewareTests.cs b/src/Middleware/HttpLogging/test/HttpLoggingMiddlewareTests.cs
index 41c63fe804..b80d0db1e9 100644
--- a/src/Middleware/HttpLogging/test/HttpLoggingMiddlewareTests.cs
+++ b/src/Middleware/HttpLogging/test/HttpLoggingMiddlewareTests.cs
@@ -511,7 +511,7 @@ public class HttpLoggingMiddlewareTests : LoggedTest
await middleware.Invoke(httpContext);
Assert.DoesNotContain(TestSink.Writes, w => w.Message.Contains(expected));
- Assert.Contains(TestSink.Writes, w => w.Message.Contains("Unrecognized Content-Type for body."));
+ Assert.Contains(TestSink.Writes, w => w.Message.Contains("Unrecognized Content-Type for request body."));
}
[Fact]
@@ -836,7 +836,38 @@ public class HttpLoggingMiddlewareTests : LoggedTest
await middleware.Invoke(httpContext);
- Assert.Contains(TestSink.Writes, w => w.Message.Contains("Unrecognized Content-Type for body."));
+ Assert.Contains(TestSink.Writes, w => w.Message.Contains("Unrecognized Content-Type for response body."));
+ }
+
+ [Fact]
+ public async Task NoMediaType()
+ {
+ var options = CreateOptionsAccessor();
+ options.CurrentValue.LoggingFields = HttpLoggingFields.RequestBody;
+ var middleware = new HttpLoggingMiddleware(
+ async c =>
+ {
+ c.Request.ContentType = null;
+ var arr = new byte[4096];
+ while (true)
+ {
+ var res = await c.Request.Body.ReadAsync(arr);
+ if (res == 0)
+ {
+ break;
+ }
+ }
+ },
+ options,
+ LoggerFactory.CreateLogger<HttpLoggingMiddleware>());
+
+ var httpContext = new DefaultHttpContext();
+
+ httpContext.Request.Headers["foo"] = "bar";
+
+ await middleware.Invoke(httpContext);
+
+ Assert.Contains(TestSink.Writes, w => w.Message.Contains("No Content-Type header for request body."));
}
[Fact]
diff --git a/src/Middleware/HttpLogging/test/TestW3CLogger.cs b/src/Middleware/HttpLogging/test/TestW3CLogger.cs
index c502c5f5dc..72e3620214 100644
--- a/src/Middleware/HttpLogging/test/TestW3CLogger.cs
+++ b/src/Middleware/HttpLogging/test/TestW3CLogger.cs
@@ -1,22 +1,16 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.HttpLogging;
internal class TestW3CLogger : W3CLogger
{
-
- public TestW3CLogger(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory) : base(options, environment, factory) { }
-
- public TestW3CLoggerProcessor Processor { get; set; }
-
- internal override W3CLoggerProcessor InitializeMessageQueue(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory)
+ public TestW3CLogger(IOptionsMonitor<W3CLoggerOptions> options, TestW3CLoggerProcessor processor) : base(options, processor)
{
- Processor = new TestW3CLoggerProcessor(options, environment, factory);
- return Processor;
+ Processor = processor;
}
+
+ public TestW3CLoggerProcessor Processor { get; set; }
}
diff --git a/src/Middleware/HttpLogging/test/W3CLoggerTests.cs b/src/Middleware/HttpLogging/test/W3CLoggerTests.cs
index d8d976caa3..ce2b382f10 100644
--- a/src/Middleware/HttpLogging/test/W3CLoggerTests.cs
+++ b/src/Middleware/HttpLogging/test/W3CLoggerTests.cs
@@ -3,8 +3,6 @@
using System.Globalization;
using Microsoft.AspNetCore.Testing;
-using Microsoft.Extensions.Hosting.Internal;
-using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.HttpLogging;
@@ -24,13 +22,14 @@ public class W3CLoggerTests
};
try
{
- await using (var logger = new TestW3CLogger(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), NullLoggerFactory.Instance))
+ await using (var logger = Helpers.CreateTestW3CLogger(new OptionsWrapperMonitor<W3CLoggerOptions>(options)))
{
var elements = new string[W3CLoggingMiddleware._fieldsLength];
+ var additionalHeaders = new string[0];
AddToList(elements, W3CLoggingMiddleware._dateIndex, _timestampOne.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture));
AddToList(elements, W3CLoggingMiddleware._timeIndex, _timestampOne.ToString("HH:mm:ss", CultureInfo.InvariantCulture));
- logger.Log(elements);
+ logger.Log(elements, additionalHeaders);
await logger.Processor.WaitForWrites(4).DefaultTimeout();
var lines = logger.Processor.Lines;
@@ -66,14 +65,15 @@ public class W3CLoggerTests
};
try
{
- await using (var logger = new TestW3CLogger(new OptionsWrapperMonitor<W3CLoggerOptions>(options), new HostingEnvironment(), NullLoggerFactory.Instance))
+ await using (var logger = Helpers.CreateTestW3CLogger(new OptionsWrapperMonitor<W3CLoggerOptions>(options)))
{
var elements = new string[W3CLoggingMiddleware._fieldsLength];
+ var additionalHeaders = new string[0];
AddToList(elements, W3CLoggingMiddleware._uriQueryIndex, null);
AddToList(elements, W3CLoggingMiddleware._hostIndex, null);
AddToList(elements, W3CLoggingMiddleware._protocolStatusIndex, null);
- logger.Log(elements);
+ logger.Log(elements, additionalHeaders);
await logger.Processor.WaitForWrites(4).DefaultTimeout();
var lines = logger.Processor.Lines;
diff --git a/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs b/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs
index 9876620112..988631cd96 100644
--- a/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs
+++ b/src/Middleware/HttpLogging/test/W3CLoggingMiddlewareTests.cs
@@ -4,8 +4,6 @@
using System.Globalization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Testing;
-using Microsoft.Extensions.Hosting.Internal;
-using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Moq;
@@ -20,14 +18,14 @@ public class W3CLoggingMiddlewareTests
Assert.Throws<ArgumentNullException>(() => new W3CLoggingMiddleware(
null,
options,
- new TestW3CLogger(options, new HostingEnvironment(), NullLoggerFactory.Instance)));
+ Helpers.CreateTestW3CLogger(options)));
Assert.Throws<ArgumentNullException>(() => new W3CLoggingMiddleware(c =>
{
return Task.CompletedTask;
},
null,
- new TestW3CLogger(options, new HostingEnvironment(), NullLoggerFactory.Instance)));
+ Helpers.CreateTestW3CLogger(options)));
Assert.Throws<ArgumentNullException>(() => new W3CLoggingMiddleware(c =>
{
@@ -42,7 +40,7 @@ public class W3CLoggingMiddlewareTests
{
var options = CreateOptionsAccessor();
options.CurrentValue.LoggingFields = W3CLoggingFields.None;
- var logger = new TestW3CLogger(options, new HostingEnvironment(), NullLoggerFactory.Instance);
+ var logger = Helpers.CreateTestW3CLogger(options);
var middleware = new W3CLoggingMiddleware(
c =>
@@ -69,7 +67,7 @@ public class W3CLoggingMiddlewareTests
public async Task DefaultDoesNotLogOptionalFields()
{
var options = CreateOptionsAccessor();
- var logger = new TestW3CLogger(options, new HostingEnvironment(), NullLoggerFactory.Instance);
+ var logger = Helpers.CreateTestW3CLogger(options);
var middleware = new W3CLoggingMiddleware(
c =>
@@ -104,11 +102,148 @@ public class W3CLoggingMiddlewareTests
}
[Fact]
+ public async Task LogsAdditionalRequestHeaders()
+ {
+ var options = CreateOptionsAccessor();
+ options.CurrentValue.AdditionalRequestHeaders.Add("x-forwarded-for");
+ options.CurrentValue.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
+ options.CurrentValue.AdditionalRequestHeaders.Add(":invalid");
+
+ var logger = Helpers.CreateTestW3CLogger(options);
+
+ var middleware = new W3CLoggingMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = 200;
+ return Task.CompletedTask;
+ },
+ options,
+ logger);
+
+ options.CurrentValue.AdditionalRequestHeaders.Add("ignored-header-added-after-clone");
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Protocol = "HTTP/1.0";
+ httpContext.Request.Headers["Cookie"] = "Snickerdoodle";
+ httpContext.Request.Headers["x-forwarded-for"] = "1.3.3.7, 2001:db8:85a3:8d3:1319:8a2e:370:7348";
+ httpContext.Response.StatusCode = 200;
+
+ var now = DateTime.UtcNow;
+ await middleware.Invoke(httpContext);
+ await logger.Processor.WaitForWrites(4).DefaultTimeout();
+
+ var lines = logger.Processor.Lines;
+ Assert.Equal("#Version: 1.0", lines[0]);
+
+ Assert.StartsWith("#Start-Date: ", lines[1]);
+ var startDate = DateTime.Parse(lines[1].Substring(13), CultureInfo.InvariantCulture);
+ // Assert that the log was written in the last 10 seconds
+ // W3CLogger writes start-time to second precision, so delta could be as low as -0.999...
+ var delta = startDate.Subtract(now).TotalSeconds;
+ Assert.InRange(delta, -1, 10);
+
+ Assert.Equal("#Fields: date time c-ip s-computername s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status time-taken cs-version cs-host cs(User-Agent) cs(Referer) cs(:invalid) cs(x-client-ssl-protocol) cs(x-forwarded-for)", lines[2]);
+ Assert.DoesNotContain("Snickerdoodle", lines[3]);
+ Assert.EndsWith("- - 1.3.3.7,+2001:db8:85a3:8d3:1319:8a2e:370:7348", lines[3]);
+ }
+
+ [Fact]
+ public async Task LogsAdditionalRequestHeaders_WithNoOtherOptions()
+ {
+ var options = CreateOptionsAccessor();
+ options.CurrentValue.AdditionalRequestHeaders.Add("x-forwarded-for");
+ options.CurrentValue.LoggingFields = W3CLoggingFields.None;
+
+ var logger = Helpers.CreateTestW3CLogger(options);
+
+ var middleware = new W3CLoggingMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = 200;
+ return Task.CompletedTask;
+ },
+ options,
+ logger);
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Protocol = "HTTP/1.0";
+ httpContext.Request.Headers["Cookie"] = "Snickerdoodle";
+ httpContext.Request.Headers["x-forwarded-for"] = "1.3.3.7, 2001:db8:85a3:8d3:1319:8a2e:370:7348";
+ httpContext.Response.StatusCode = 200;
+
+ var now = DateTime.UtcNow;
+ await middleware.Invoke(httpContext);
+ await logger.Processor.WaitForWrites(4).DefaultTimeout();
+
+ var lines = logger.Processor.Lines;
+ Assert.Equal("#Version: 1.0", lines[0]);
+
+ Assert.StartsWith("#Start-Date: ", lines[1]);
+ Assert.Equal("#Fields: cs(x-forwarded-for)", lines[2]);
+ Assert.Equal("1.3.3.7,+2001:db8:85a3:8d3:1319:8a2e:370:7348", lines[3]);
+ }
+
+ [Fact]
+ public async Task OmitsDuplicateAdditionalRequestHeaders()
+ {
+ var options = CreateOptionsAccessor();
+ options.CurrentValue.LoggingFields = options.CurrentValue.LoggingFields | W3CLoggingFields.Host |
+ W3CLoggingFields.Referer | W3CLoggingFields.UserAgent |
+ W3CLoggingFields.Cookie;
+
+ options.CurrentValue.AdditionalRequestHeaders.Add(":invalid");
+ options.CurrentValue.AdditionalRequestHeaders.Add("x-forwarded-for");
+ options.CurrentValue.AdditionalRequestHeaders.Add("Host");
+ options.CurrentValue.AdditionalRequestHeaders.Add("Referer");
+ options.CurrentValue.AdditionalRequestHeaders.Add("User-Agent");
+ options.CurrentValue.AdditionalRequestHeaders.Add("Cookie");
+ options.CurrentValue.AdditionalRequestHeaders.Add("x-client-ssl-protocol");
+
+ var logger = Helpers.CreateTestW3CLogger(options);
+
+ var middleware = new W3CLoggingMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = 200;
+ return Task.CompletedTask;
+ },
+ options,
+ logger);
+
+ options.CurrentValue.AdditionalRequestHeaders.Add("ignored-header-added-after-clone");
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Protocol = "HTTP/1.0";
+ httpContext.Request.Headers["Cookie"] = "Snickerdoodle";
+ httpContext.Request.Headers["x-forwarded-for"] = "1.3.3.7, 2001:db8:85a3:8d3:1319:8a2e:370:7348";
+ httpContext.Response.StatusCode = 200;
+
+ var now = DateTime.UtcNow;
+ await middleware.Invoke(httpContext);
+ await logger.Processor.WaitForWrites(4).DefaultTimeout();
+
+ var lines = logger.Processor.Lines;
+ Assert.Equal("#Version: 1.0", lines[0]);
+
+ Assert.StartsWith("#Start-Date: ", lines[1]);
+ var startDate = DateTime.Parse(lines[1].Substring(13), CultureInfo.InvariantCulture);
+ // Assert that the log was written in the last 10 seconds
+ // W3CLogger writes start-time to second precision, so delta could be as low as -0.999...
+ var delta = startDate.Subtract(now).TotalSeconds;
+ Assert.InRange(delta, -1, 10);
+
+ Assert.Equal("#Fields: date time c-ip s-computername s-ip s-port cs-method cs-uri-stem cs-uri-query sc-status time-taken cs-version cs-host cs(User-Agent) cs(Cookie) cs(Referer) cs(:invalid) cs(x-client-ssl-protocol) cs(x-forwarded-for)", lines[2]);
+ Assert.Equal(19, lines[3].Split(' ').Length);
+ Assert.Contains("Snickerdoodle", lines[3]);
+ Assert.Contains("- - 1.3.3.7,+2001:db8:85a3:8d3:1319:8a2e:370:7348", lines[3]);
+ }
+
+ [Fact]
public async Task TimeTakenIsInMilliseconds()
{
var options = CreateOptionsAccessor();
options.CurrentValue.LoggingFields = W3CLoggingFields.TimeTaken;
- var logger = new TestW3CLogger(options, new HostingEnvironment(), NullLoggerFactory.Instance);
+ var logger = Helpers.CreateTestW3CLogger(options);
var middleware = new W3CLoggingMiddleware(
c =>
diff --git a/src/Middleware/HttpOverrides/src/CertificateForwardingFeature.cs b/src/Middleware/HttpOverrides/src/CertificateForwardingFeature.cs
index d7a773eff6..abb41e5d8f 100644
--- a/src/Middleware/HttpOverrides/src/CertificateForwardingFeature.cs
+++ b/src/Middleware/HttpOverrides/src/CertificateForwardingFeature.cs
@@ -8,12 +8,12 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.HttpOverrides;
-internal class CertificateForwardingFeature : ITlsConnectionFeature
+internal sealed class CertificateForwardingFeature : ITlsConnectionFeature
{
private readonly ILogger _logger;
private readonly StringValues _header;
private readonly CertificateForwardingOptions _options;
- private X509Certificate2? _certificate;
+ private Task<X509Certificate2?>? _certificateTask;
public CertificateForwardingFeature(ILogger logger, StringValues header, CertificateForwardingOptions options)
{
@@ -24,24 +24,29 @@ internal class CertificateForwardingFeature : ITlsConnectionFeature
public X509Certificate2? ClientCertificate
{
- get
+ get => GetClientCertificateAsync(CancellationToken.None).Result;
+ set => _certificateTask = value is not null ? Task.FromResult<X509Certificate2?>(value) : null;
+ }
+
+ public Task<X509Certificate2?> GetClientCertificateAsync(CancellationToken cancellationToken)
+ {
+ if (_certificateTask == null)
{
- if (_certificate == null)
+ try
+ {
+ var certificate = _options.HeaderConverter(_header.ToString());
+ _certificateTask = Task.FromResult<X509Certificate2?>(certificate);
+ return _certificateTask;
+ }
+ catch (Exception e)
{
- try
- {
- _certificate = _options.HeaderConverter(_header.ToString());
- }
- catch (Exception e)
- {
- _logger.NoCertificate(e);
- }
+ _logger.NoCertificate(e);
+ return Task.FromResult<X509Certificate2?>(null);
}
- return _certificate;
}
- set => _certificate = value;
+ else
+ {
+ return _certificateTask;
+ }
}
-
- public Task<X509Certificate2?> GetClientCertificateAsync(CancellationToken cancellationToken)
- => Task.FromResult(ClientCertificate);
}
diff --git a/src/Middleware/HttpOverrides/src/PublicAPI.Shipped.txt b/src/Middleware/HttpOverrides/src/PublicAPI.Shipped.txt
index f54708ea9d..e46020e38b 100644
--- a/src/Middleware/HttpOverrides/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/HttpOverrides/src/PublicAPI.Shipped.txt
@@ -1,34 +1,11 @@
#nullable enable
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.AllowedHosts.get -> System.Collections.Generic.IList<string>
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.AllowedHosts.set -> void
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.ForwardedForHeaderName.get -> string
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.ForwardedForHeaderName.set -> void
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.ForwardedHostHeaderName.get -> string
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.ForwardedHostHeaderName.set -> void
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.ForwardedProtoHeaderName.get -> string
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.ForwardedProtoHeaderName.set -> void
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.KnownNetworks.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.HttpOverrides.IPNetwork>
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.KnownProxies.get -> System.Collections.Generic.IList<System.Net.IPAddress>
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.OriginalForHeaderName.get -> string
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.OriginalForHeaderName.set -> void
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.OriginalHostHeaderName.get -> string
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.OriginalHostHeaderName.set -> void
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.OriginalProtoHeaderName.get -> string
-~Microsoft.AspNetCore.Builder.ForwardedHeadersOptions.OriginalProtoHeaderName.set -> void
-~Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions.FormFieldName.get -> string
-~Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions.FormFieldName.set -> void
-~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.CertificateForwardingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions> options) -> void
-~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.CertificateForwardingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions!>! options) -> void
+Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.CertificateForwardingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions!>! options) -> void
~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions.CertificateHeader.get -> string
-~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions.CertificateHeader.set -> void
~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions.HeaderConverter -> System.Func<string, System.Security.Cryptography.X509Certificates.X509Certificate2>
~Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ApplyForwarders(Microsoft.AspNetCore.Http.HttpContext context) -> void
-~Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ForwardedHeadersMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ForwardedHeadersOptions> options) -> void
-~Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ForwardedHeadersMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ForwardedHeadersOptions!>! options) -> void
+Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ForwardedHeadersMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ForwardedHeadersOptions!>! options) -> void
~Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.HttpMethodOverrideMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions> options) -> void
-~Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.HttpMethodOverrideMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions!>! options) -> void
+Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.HttpMethodOverrideMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions!>! options) -> void
~Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.HttpOverrides.IPNetwork.Contains(System.Net.IPAddress address) -> bool
~Microsoft.AspNetCore.HttpOverrides.IPNetwork.IPNetwork(System.Net.IPAddress prefix, int prefixLength) -> void
diff --git a/src/Middleware/HttpOverrides/src/PublicAPI.Unshipped.txt b/src/Middleware/HttpOverrides/src/PublicAPI.Unshipped.txt
index f50b43e1aa..7dc5c58110 100644
--- a/src/Middleware/HttpOverrides/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/HttpOverrides/src/PublicAPI.Unshipped.txt
@@ -1,10 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.CertificateForwardingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.CertificateForwardingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions!>! options) -> void
-Microsoft.AspNetCore.HttpOverrides.CertificateForwardingMiddleware.CertificateForwardingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpOverrides.CertificateForwardingOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ForwardedHeadersMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ForwardedHeadersOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ForwardedHeadersMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ForwardedHeadersOptions!>! options) -> void
-Microsoft.AspNetCore.HttpOverrides.ForwardedHeadersMiddleware.ForwardedHeadersMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.ForwardedHeadersOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.HttpMethodOverrideMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.HttpMethodOverrideMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions!>! options) -> void
-Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.HttpMethodOverrideMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.HttpMethodOverrideOptions!>! options) -> void \ No newline at end of file
diff --git a/src/Middleware/HttpOverrides/test/CertificateForwardingTest.cs b/src/Middleware/HttpOverrides/test/CertificateForwardingTest.cs
index a729ef21e0..332fe321aa 100644
--- a/src/Middleware/HttpOverrides/test/CertificateForwardingTest.cs
+++ b/src/Middleware/HttpOverrides/test/CertificateForwardingTest.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Security.Cryptography.X509Certificates;
+using Microsoft.AspNetCore.Authentication.Certificate;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
diff --git a/src/Middleware/HttpsPolicy/src/HttpsRedirectionMiddleware.cs b/src/Middleware/HttpsPolicy/src/HttpsRedirectionMiddleware.cs
index 74f32307c5..ebc479192b 100644
--- a/src/Middleware/HttpsPolicy/src/HttpsRedirectionMiddleware.cs
+++ b/src/Middleware/HttpsPolicy/src/HttpsRedirectionMiddleware.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Globalization;
using Microsoft.AspNetCore.Hosting.Server.Features;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
@@ -123,7 +124,7 @@ public class HttpsRedirectionMiddleware
// 3. IServerAddressesFeature
// 4. Fail if not sets
- var nullablePort = _config.GetValue<int?>("HTTPS_PORT") ?? _config.GetValue<int?>("ANCM_HTTPS_PORT");
+ var nullablePort = GetIntConfigValue("HTTPS_PORT") ?? GetIntConfigValue("ANCM_HTTPS_PORT");
if (nullablePort.HasValue)
{
var port = nullablePort.Value;
@@ -165,5 +166,8 @@ public class HttpsRedirectionMiddleware
_logger.FailedToDeterminePort();
return PortNotFound;
+
+ int? GetIntConfigValue(string name) =>
+ int.TryParse(_config[name], NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var value) ? value : null;
}
}
diff --git a/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj b/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj
index c14e35c11f..2722a69c9d 100644
--- a/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj
+++ b/src/Middleware/HttpsPolicy/src/Microsoft.AspNetCore.HttpsPolicy.csproj
@@ -9,7 +9,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;https;hsts</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/HttpsPolicy/src/PublicAPI.Shipped.txt b/src/Middleware/HttpsPolicy/src/PublicAPI.Shipped.txt
index 25ee536105..2864766cbe 100644
--- a/src/Middleware/HttpsPolicy/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/HttpsPolicy/src/PublicAPI.Shipped.txt
@@ -1,14 +1,10 @@
#nullable enable
-~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions> options) -> void
-~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options) -> void
-~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options) -> void
+Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.HttpsPolicy.HstsOptions.ExcludedHosts.get -> System.Collections.Generic.IList<string>
-~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions> options, Microsoft.Extensions.Configuration.IConfiguration config, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions> options, Microsoft.Extensions.Configuration.IConfiguration config, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature serverAddressesFeature) -> void
-~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature! serverAddressesFeature) -> void
+Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature! serverAddressesFeature) -> void
~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
~static Microsoft.AspNetCore.Builder.HstsBuilderExtensions.UseHsts(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.HstsServicesExtensions.AddHsts(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.HttpsPolicy.HstsOptions> configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
diff --git a/src/Middleware/HttpsPolicy/src/PublicAPI.Unshipped.txt b/src/Middleware/HttpsPolicy/src/PublicAPI.Unshipped.txt
index 06a935bf5d..7dc5c58110 100644
--- a/src/Middleware/HttpsPolicy/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/HttpsPolicy/src/PublicAPI.Unshipped.txt
@@ -1,13 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options) -> void
-Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware.HstsMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HstsOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions> options, Microsoft.Extensions.Configuration.IConfiguration config, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions> options, Microsoft.Extensions.Configuration.IConfiguration config, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature serverAddressesFeature) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature! serverAddressesFeature) -> void
-Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware.HttpsRedirectionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionOptions!>! options, Microsoft.Extensions.Configuration.IConfiguration! config, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Hosting.Server.Features.IServerAddressesFeature! serverAddressesFeature) -> void
diff --git a/src/Middleware/Localization.Routing/src/Microsoft.AspNetCore.Localization.Routing.csproj b/src/Middleware/Localization.Routing/src/Microsoft.AspNetCore.Localization.Routing.csproj
index e6a7d73378..0177a1bbaa 100644
--- a/src/Middleware/Localization.Routing/src/Microsoft.AspNetCore.Localization.Routing.csproj
+++ b/src/Middleware/Localization.Routing/src/Microsoft.AspNetCore.Localization.Routing.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;localization</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/Localization.Routing/src/PublicAPI.Shipped.txt b/src/Middleware/Localization.Routing/src/PublicAPI.Shipped.txt
index e2484d3d70..966d0e3208 100644
--- a/src/Middleware/Localization.Routing/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Localization.Routing/src/PublicAPI.Shipped.txt
@@ -1,8 +1,4 @@
#nullable enable
-~Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider.RouteDataStringKey.get -> string
-~Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider.RouteDataStringKey.set -> void
-~Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider.UIRouteDataStringKey.get -> string
-~Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider.UIRouteDataStringKey.set -> void
~override Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider.DetermineProviderCultureResult(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Localization.ProviderCultureResult>
Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider
Microsoft.AspNetCore.Localization.Routing.RouteDataRequestCultureProvider.RouteDataRequestCultureProvider() -> void
diff --git a/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj b/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj
index 0824605d9c..d66c2ed3e5 100644
--- a/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj
+++ b/src/Middleware/Localization/src/Microsoft.AspNetCore.Localization.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;localization</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/Localization/src/PublicAPI.Shipped.txt b/src/Middleware/Localization/src/PublicAPI.Shipped.txt
index 10ea2606c4..d6439fd4a9 100644
--- a/src/Middleware/Localization/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Localization/src/PublicAPI.Shipped.txt
@@ -2,17 +2,7 @@
~abstract Microsoft.AspNetCore.Localization.RequestCultureProvider.DetermineProviderCultureResult(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Localization.ProviderCultureResult>
~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.AddSupportedCultures(params string[] cultures) -> Microsoft.AspNetCore.Builder.RequestLocalizationOptions
~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.AddSupportedUICultures(params string[] uiCultures) -> Microsoft.AspNetCore.Builder.RequestLocalizationOptions
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.DefaultRequestCulture.get -> Microsoft.AspNetCore.Localization.RequestCulture
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.DefaultRequestCulture.set -> void
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.RequestCultureProviders.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Localization.IRequestCultureProvider>
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.RequestCultureProviders.set -> void
~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.SetDefaultCulture(string defaultCulture) -> Microsoft.AspNetCore.Builder.RequestLocalizationOptions
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.SupportedCultures.get -> System.Collections.Generic.IList<System.Globalization.CultureInfo>
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.SupportedCultures.set -> void
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.SupportedUICultures.get -> System.Collections.Generic.IList<System.Globalization.CultureInfo>
-~Microsoft.AspNetCore.Builder.RequestLocalizationOptions.SupportedUICultures.set -> void
-~Microsoft.AspNetCore.Localization.CookieRequestCultureProvider.CookieName.get -> string
-~Microsoft.AspNetCore.Localization.CookieRequestCultureProvider.CookieName.set -> void
~Microsoft.AspNetCore.Localization.CustomRequestCultureProvider.CustomRequestCultureProvider(System.Func<Microsoft.AspNetCore.Http.HttpContext, System.Threading.Tasks.Task<Microsoft.AspNetCore.Localization.ProviderCultureResult>> provider) -> void
~Microsoft.AspNetCore.Localization.IRequestCultureFeature.Provider.get -> Microsoft.AspNetCore.Localization.IRequestCultureProvider
~Microsoft.AspNetCore.Localization.IRequestCultureFeature.RequestCulture.get -> Microsoft.AspNetCore.Localization.RequestCulture
@@ -21,10 +11,6 @@
~Microsoft.AspNetCore.Localization.ProviderCultureResult.ProviderCultureResult(System.Collections.Generic.IList<Microsoft.Extensions.Primitives.StringSegment> cultures) -> void
~Microsoft.AspNetCore.Localization.ProviderCultureResult.ProviderCultureResult(System.Collections.Generic.IList<Microsoft.Extensions.Primitives.StringSegment> cultures, System.Collections.Generic.IList<Microsoft.Extensions.Primitives.StringSegment> uiCultures) -> void
~Microsoft.AspNetCore.Localization.ProviderCultureResult.UICultures.get -> System.Collections.Generic.IList<Microsoft.Extensions.Primitives.StringSegment>
-~Microsoft.AspNetCore.Localization.QueryStringRequestCultureProvider.QueryStringKey.get -> string
-~Microsoft.AspNetCore.Localization.QueryStringRequestCultureProvider.QueryStringKey.set -> void
-~Microsoft.AspNetCore.Localization.QueryStringRequestCultureProvider.UIQueryStringKey.get -> string
-~Microsoft.AspNetCore.Localization.QueryStringRequestCultureProvider.UIQueryStringKey.set -> void
~Microsoft.AspNetCore.Localization.RequestCulture.Culture.get -> System.Globalization.CultureInfo
~Microsoft.AspNetCore.Localization.RequestCulture.RequestCulture(string culture) -> void
~Microsoft.AspNetCore.Localization.RequestCulture.RequestCulture(string culture, string uiCulture) -> void
@@ -34,11 +20,8 @@
~Microsoft.AspNetCore.Localization.RequestCultureFeature.Provider.get -> Microsoft.AspNetCore.Localization.IRequestCultureProvider
~Microsoft.AspNetCore.Localization.RequestCultureFeature.RequestCulture.get -> Microsoft.AspNetCore.Localization.RequestCulture
~Microsoft.AspNetCore.Localization.RequestCultureFeature.RequestCultureFeature(Microsoft.AspNetCore.Localization.RequestCulture requestCulture, Microsoft.AspNetCore.Localization.IRequestCultureProvider provider) -> void
-~Microsoft.AspNetCore.Localization.RequestCultureProvider.Options.get -> Microsoft.AspNetCore.Builder.RequestLocalizationOptions
-~Microsoft.AspNetCore.Localization.RequestCultureProvider.Options.set -> void
~Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.RequestLocalizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.RequestLocalizationOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-~Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.RequestLocalizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.RequestLocalizationOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.RequestLocalizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.RequestLocalizationOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
~override Microsoft.AspNetCore.Localization.AcceptLanguageHeaderRequestCultureProvider.DetermineProviderCultureResult(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Localization.ProviderCultureResult>
~override Microsoft.AspNetCore.Localization.CookieRequestCultureProvider.DetermineProviderCultureResult(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Localization.ProviderCultureResult>
~override Microsoft.AspNetCore.Localization.CustomRequestCultureProvider.DetermineProviderCultureResult(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Localization.ProviderCultureResult>
diff --git a/src/Middleware/Localization/src/PublicAPI.Unshipped.txt b/src/Middleware/Localization/src/PublicAPI.Unshipped.txt
index 2eba56eafa..7dc5c58110 100644
--- a/src/Middleware/Localization/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/Localization/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.RequestLocalizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.RequestLocalizationOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.RequestLocalizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.RequestLocalizationOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.Localization.RequestLocalizationMiddleware.RequestLocalizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.RequestLocalizationOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/Middleware/Localization/testassets/LocalizationWebsite/Properties/launchSettings.json b/src/Middleware/Localization/testassets/LocalizationWebsite/Properties/launchSettings.json
index 3b71d90077..7494427a69 100644
--- a/src/Middleware/Localization/testassets/LocalizationWebsite/Properties/launchSettings.json
+++ b/src/Middleware/Localization/testassets/LocalizationWebsite/Properties/launchSettings.json
@@ -9,4 +9,4 @@
"applicationUrl": "https://localhost:61222;http://localhost:61224"
}
}
-} \ No newline at end of file
+}
diff --git a/src/Middleware/Middleware.slnf b/src/Middleware/Middleware.slnf
index 2321ac94ea..de0c711220 100644
--- a/src/Middleware/Middleware.slnf
+++ b/src/Middleware/Middleware.slnf
@@ -76,8 +76,16 @@
"src\\Middleware\\MiddlewareAnalysis\\samples\\MiddlewareAnalysisSample\\MiddlewareAnalysisSample.csproj",
"src\\Middleware\\MiddlewareAnalysis\\src\\Microsoft.AspNetCore.MiddlewareAnalysis.csproj",
"src\\Middleware\\MiddlewareAnalysis\\test\\Microsoft.AspNetCore.MiddlewareAnalysis.Tests.csproj",
+ "src\\Middleware\\OutputCaching\\samples\\OutputCachingSample\\OutputCachingSample.csproj",
+ "src\\Middleware\\OutputCaching\\src\\Microsoft.AspNetCore.OutputCaching.csproj",
+ "src\\Middleware\\OutputCaching\\test\\Microsoft.AspNetCore.OutputCaching.Tests.csproj",
+ "src\\Middleware\\RateLimiting\\samples\\RateLimitingSample\\RateLimitingSample.csproj",
"src\\Middleware\\RateLimiting\\src\\Microsoft.AspNetCore.RateLimiting.csproj",
"src\\Middleware\\RateLimiting\\test\\Microsoft.AspNetCore.RateLimiting.Tests.csproj",
+ "src\\Middleware\\RequestDecompression\\perf\\Microbenchmarks\\Microsoft.AspNetCore.RequestDecompression.Microbenchmarks.csproj",
+ "src\\Middleware\\RequestDecompression\\sample\\RequestDecompressionSample.csproj",
+ "src\\Middleware\\RequestDecompression\\src\\Microsoft.AspNetCore.RequestDecompression.csproj",
+ "src\\Middleware\\RequestDecompression\\test\\Microsoft.AspNetCore.RequestDecompression.Tests.csproj",
"src\\Middleware\\ResponseCaching.Abstractions\\src\\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj",
"src\\Middleware\\ResponseCaching\\samples\\ResponseCachingSample\\ResponseCachingSample.csproj",
"src\\Middleware\\ResponseCaching\\src\\Microsoft.AspNetCore.ResponseCaching.csproj",
@@ -117,4 +125,4 @@
"src\\Servers\\Kestrel\\Transport.Sockets\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj"
]
}
-}
+} \ No newline at end of file
diff --git a/src/Middleware/MiddlewareAnalysis/src/PublicAPI.Shipped.txt b/src/Middleware/MiddlewareAnalysis/src/PublicAPI.Shipped.txt
index 109bea5ad1..c916ea04ac 100644
--- a/src/Middleware/MiddlewareAnalysis/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/MiddlewareAnalysis/src/PublicAPI.Shipped.txt
@@ -1,7 +1,5 @@
#nullable enable
~Microsoft.AspNetCore.MiddlewareAnalysis.AnalysisBuilder.AnalysisBuilder(Microsoft.AspNetCore.Builder.IApplicationBuilder inner) -> void
-~Microsoft.AspNetCore.MiddlewareAnalysis.AnalysisBuilder.ApplicationServices.get -> System.IServiceProvider
-~Microsoft.AspNetCore.MiddlewareAnalysis.AnalysisBuilder.ApplicationServices.set -> void
~Microsoft.AspNetCore.MiddlewareAnalysis.AnalysisBuilder.Build() -> Microsoft.AspNetCore.Http.RequestDelegate
~Microsoft.AspNetCore.MiddlewareAnalysis.AnalysisBuilder.New() -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~Microsoft.AspNetCore.MiddlewareAnalysis.AnalysisBuilder.Properties.get -> System.Collections.Generic.IDictionary<string, object>
diff --git a/src/Middleware/OutputCaching/OutputCaching.slnf b/src/Middleware/OutputCaching/OutputCaching.slnf
new file mode 100644
index 0000000000..7d85ca7205
--- /dev/null
+++ b/src/Middleware/OutputCaching/OutputCaching.slnf
@@ -0,0 +1,10 @@
+{
+ "solution": {
+ "path": "..\\..\\..\\AspNetCore.sln",
+ "projects": [
+ "src\\Middleware\\OutputCaching\\samples\\OutputCachingSample\\OutputCachingSample.csproj",
+ "src\\Middleware\\OutputCaching\\src\\Microsoft.AspNetCore.OutputCaching.csproj",
+ "src\\Middleware\\OutputCaching\\test\\Microsoft.AspNetCore.OutputCaching.Tests.csproj"
+ ]
+ }
+} \ No newline at end of file
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/launch.json b/src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/launch.json
new file mode 100644
index 0000000000..93e3163e87
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/launch.json
@@ -0,0 +1,35 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": ".NET Core Launch (web)",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build",
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/bin/Debug/net7.0/OutputCachingSample.dll",
+ "args": [],
+ "cwd": "${workspaceFolder}",
+ "stopAtEntry": false,
+ // Enable launching a web browser when ASP.NET Core starts. For more information: https://aka.ms/VSCode-CS-LaunchJson-WebBrowser
+ "serverReadyAction": {
+ "action": "openExternally",
+ "pattern": "\\bNow listening on:\\s+(https?://\\S+)"
+ },
+ "env": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "sourceFileMap": {
+ "/Views": "${workspaceFolder}/Views"
+ }
+ },
+ {
+ "name": ".NET Core Attach",
+ "type": "coreclr",
+ "request": "attach"
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/tasks.json b/src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/tasks.json
new file mode 100644
index 0000000000..5b41ee7a09
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/.vscode/tasks.json
@@ -0,0 +1,41 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/OutputCachingSample.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/OutputCachingSample.csproj",
+ "/property:GenerateFullPaths=true",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "watch",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "watch",
+ "run",
+ "--project",
+ "${workspaceFolder}/OutputCachingSample.csproj"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/Gravatar.cs b/src/Middleware/OutputCaching/samples/OutputCachingSample/Gravatar.cs
new file mode 100644
index 0000000000..08eccafbb9
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/Gravatar.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+public static class Gravatar
+{
+ public static async Task WriteGravatar(HttpContext context)
+ {
+ const string type = "monsterid"; // identicon, monsterid, wavatar
+ const int size = 200;
+ var hash = Guid.NewGuid().ToString("n");
+
+ context.Response.StatusCode = 200;
+ context.Response.ContentType = "text/html";
+ await context.Response.WriteAsync($"<img src=\"https://www.gravatar.com/avatar/{hash}?s={size}&d={type}\"/>");
+ await context.Response.WriteAsync($"<pre>Generated at {DateTime.Now:hh:mm:ss.ff}</pre>");
+ }
+}
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/OutputCachingSample.csproj b/src/Middleware/OutputCaching/samples/OutputCachingSample/OutputCachingSample.csproj
new file mode 100644
index 0000000000..8e76982e4d
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/OutputCachingSample.csproj
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <ImplicitUsings>enable</ImplicitUsings>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
+ <!-- Mvc.Core is referenced only for its attributes -->
+ <Reference Include="Microsoft.AspNetCore.Mvc.Core" />
+ </ItemGroup>
+
+</Project> \ No newline at end of file
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/Properties/launchSettings.json b/src/Middleware/OutputCaching/samples/OutputCachingSample/Properties/launchSettings.json
new file mode 100644
index 0000000000..b544fed195
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/Properties/launchSettings.json
@@ -0,0 +1,27 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:54270/",
+ "sslPort": 44398
+ }
+ },
+ "profiles": {
+ "OutputCachingSample": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:5001;http://localhost:5000"
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/README.md b/src/Middleware/OutputCaching/samples/OutputCachingSample/README.md
new file mode 100644
index 0000000000..f88770eaaf
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/README.md
@@ -0,0 +1,6 @@
+ASP.NET Core Output Caching Sample
+===================================
+
+This sample illustrates the usage of ASP.NET Core output caching middleware. The application sends a `Hello World!` message and the current time. A different cache entry is created for each variation of the query string.
+
+When running the sample, a response will be served from cache when possible and will be stored for up to 10 seconds.
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/Startup.cs b/src/Middleware/OutputCaching/samples/OutputCachingSample/Startup.cs
new file mode 100644
index 0000000000..ca91981bc6
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/Startup.cs
@@ -0,0 +1,75 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using Microsoft.AspNetCore.OutputCaching;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services.AddOutputCache(options =>
+{
+ // Define policies for all requests which are not configured per endpoint or per request
+ options.AddBasePolicy(builder => builder.With(c => c.HttpContext.Request.Path.StartsWithSegments("/js")).Expire(TimeSpan.FromDays(1)));
+ options.AddBasePolicy(builder => builder.With(c => c.HttpContext.Request.Path.StartsWithSegments("/js")).NoCache());
+
+ options.AddPolicy("NoCache", b => b.NoCache());
+});
+
+var app = builder.Build();
+
+app.UseOutputCache();
+
+app.MapGet("/", Gravatar.WriteGravatar);
+
+app.MapGet("/cached", Gravatar.WriteGravatar).CacheOutput();
+
+app.MapGet("/nocache", Gravatar.WriteGravatar).CacheOutput(x => x.NoCache());
+
+app.MapGet("/profile", Gravatar.WriteGravatar).CacheOutput("NoCache");
+
+app.MapGet("/attribute", [OutputCache(PolicyName = "NoCache")] () => Gravatar.WriteGravatar);
+
+var blog = app.MapGroup("blog").CacheOutput(x => x.Tag("blog"));
+blog.MapGet("/", Gravatar.WriteGravatar);
+blog.MapGet("/post/{id}", Gravatar.WriteGravatar).CacheOutput(x => x.Tag("blog", "byid")); // Calling CacheOutput() here overwrites the group's policy
+
+app.MapPost("/purge/{tag}", async (IOutputCacheStore cache, string tag) =>
+{
+ // POST such that the endpoint is not cached itself
+
+ await cache.EvictByTagAsync(tag, default);
+});
+
+// Cached entries will vary by culture, but any other additional query is ignored and returns the same cached content
+app.MapGet("/query", Gravatar.WriteGravatar).CacheOutput(p => p.VaryByQuery("culture"));
+
+app.MapGet("/vary", Gravatar.WriteGravatar).CacheOutput(c => c.VaryByValue((context) => new KeyValuePair<string, string>("time", (DateTime.Now.Second % 2).ToString(CultureInfo.InvariantCulture))));
+
+long requests = 0;
+
+// Locking is enabled by default
+app.MapGet("/lock", async (context) =>
+{
+ await Task.Delay(1000);
+ await context.Response.WriteAsync($"<pre>{requests++}</pre>");
+}).CacheOutput(p => p.AllowLocking(false).Expire(TimeSpan.FromMilliseconds(1)));
+
+// Etag
+app.MapGet("/etag", async (context) =>
+{
+ // If the client sends an If-None-Match header with the etag value, the server
+ // returns 304 if the cache entry is fresh instead of the full response
+
+ var etag = $"\"{Guid.NewGuid():n}\"";
+ context.Response.Headers.ETag = etag;
+
+ await Gravatar.WriteGravatar(context);
+
+ var cacheContext = context.Features.Get<IOutputCacheFeature>()?.Context;
+
+}).CacheOutput();
+
+// When the request header If-Modified-Since is provided, return 304 if the cached entry is older
+app.MapGet("/ims", Gravatar.WriteGravatar).CacheOutput();
+
+await app.RunAsync();
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.Development.json b/src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.Development.json
new file mode 100644
index 0000000000..4e8090a0ee
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.Development.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information",
+ "Microsoft.AspNetCore.OutputCaching": "Debug"
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.json b/src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.json
new file mode 100644
index 0000000000..d9d9a9bff6
--- /dev/null
+++ b/src/Middleware/OutputCaching/samples/OutputCachingSample/appsettings.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/Middleware/OutputCaching/src/CacheEntryHelpers.cs b/src/Middleware/OutputCaching/src/CacheEntryHelpers.cs
new file mode 100644
index 0000000000..e7fdcf1bcb
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/CacheEntryHelpers.cs
@@ -0,0 +1,59 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal static class CacheEntryHelpers
+{
+ internal static long EstimateCachedResponseSize(OutputCacheEntry cachedResponse)
+ {
+ if (cachedResponse == null)
+ {
+ return 0L;
+ }
+
+ checked
+ {
+ // StatusCode
+ long size = sizeof(int);
+
+ // Headers
+ if (cachedResponse.Headers != null)
+ {
+ foreach (var item in cachedResponse.Headers)
+ {
+ size += (item.Key.Length * sizeof(char)) + EstimateStringValuesSize(item.Value);
+ }
+ }
+
+ // Body
+ if (cachedResponse.Body != null)
+ {
+ size += cachedResponse.Body.Length;
+ }
+
+ return size;
+ }
+ }
+
+ internal static long EstimateStringValuesSize(StringValues stringValues)
+ {
+ checked
+ {
+ var size = 0L;
+
+ for (var i = 0; i < stringValues.Count; i++)
+ {
+ var stringValue = stringValues[i];
+ if (!string.IsNullOrEmpty(stringValue))
+ {
+ size += stringValue.Length * sizeof(char);
+ }
+ }
+
+ return size;
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/CacheVaryByRules.cs b/src/Middleware/OutputCaching/src/CacheVaryByRules.cs
new file mode 100644
index 0000000000..abbd9f8d62
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/CacheVaryByRules.cs
@@ -0,0 +1,42 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Represents vary-by rules.
+/// </summary>
+public sealed class CacheVaryByRules
+{
+ private Dictionary<string, string>? _varyByCustom;
+
+ internal bool HasVaryByCustom => _varyByCustom != null && _varyByCustom.Any();
+
+ /// <summary>
+ /// Gets a dictionary of key-pair values to vary the cache by.
+ /// </summary>
+ public IDictionary<string, string> VaryByCustom => _varyByCustom ??= new();
+
+ /// <summary>
+ /// Gets or sets the list of route value names to vary by.
+ /// </summary>
+ public StringValues RouteValueNames { get; set; }
+
+ /// <summary>
+ /// Gets or sets the list of header names to vary by.
+ /// </summary>
+ public StringValues HeaderNames { get; set; }
+
+ /// <summary>
+ /// Gets or sets the list of query string keys to vary by.
+ /// </summary>
+ public StringValues QueryKeys { get; set; }
+
+ /// <summary>
+ /// Gets or sets a prefix to vary by.
+ /// </summary>
+ public StringValues VaryByPrefix { get; set; }
+}
diff --git a/src/Middleware/OutputCaching/src/CachedResponseBody.cs b/src/Middleware/OutputCaching/src/CachedResponseBody.cs
new file mode 100644
index 0000000000..dd46a5ece7
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/CachedResponseBody.cs
@@ -0,0 +1,53 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IO.Pipelines;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Represents a cached response body.
+/// </summary>
+internal sealed class CachedResponseBody
+{
+ /// <summary>
+ /// Creates a new <see cref="CachedResponseBody"/> instance.
+ /// </summary>
+ /// <param name="segments">The segments.</param>
+ /// <param name="length">The length.</param>
+ public CachedResponseBody(List<byte[]> segments, long length)
+ {
+ ArgumentNullException.ThrowIfNull(segments);
+
+ Segments = segments;
+ Length = length;
+ }
+
+ /// <summary>
+ /// Gets the segments of the body.
+ /// </summary>
+ public List<byte[]> Segments { get; }
+
+ /// <summary>
+ /// Gets the length of the body.
+ /// </summary>
+ public long Length { get; }
+
+ /// <summary>
+ /// Copies the body to a <see cref="PipeWriter"/>.
+ /// </summary>
+ /// <param name="destination">The destination</param>
+ /// <param name="cancellationToken">The cancellation token.</param>
+ /// <returns></returns>
+ public async Task CopyToAsync(PipeWriter destination, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(destination);
+
+ foreach (var segment in Segments)
+ {
+ cancellationToken.ThrowIfCancellationRequested();
+
+ await destination.WriteAsync(segment, cancellationToken);
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/DispatcherExtensions.cs b/src/Middleware/OutputCaching/src/DispatcherExtensions.cs
new file mode 100644
index 0000000000..173b7147d1
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/DispatcherExtensions.cs
@@ -0,0 +1,89 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Concurrent;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class WorkDispatcher<TKey, TValue> where TKey : notnull
+{
+ private readonly ConcurrentDictionary<TKey, Task<TValue?>> _workers = new();
+
+ public async Task<TValue?> ScheduleAsync(TKey key, Func<TKey, Task<TValue?>> valueFactory)
+ {
+ ArgumentNullException.ThrowIfNull(key);
+
+ while (true)
+ {
+ if (_workers.TryGetValue(key, out var task))
+ {
+ return await task;
+ }
+
+ // This is the task that we'll return to all waiters. We'll complete it when the factory is complete
+ var tcs = new TaskCompletionSource<TValue?>(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ if (_workers.TryAdd(key, tcs.Task))
+ {
+ try
+ {
+ var value = await valueFactory(key);
+ tcs.TrySetResult(value);
+ return await tcs.Task;
+ }
+ catch (Exception ex)
+ {
+ // Make sure all waiters see the exception
+ tcs.SetException(ex);
+
+ throw;
+ }
+ finally
+ {
+ // We remove the entry if the factory failed so it's not a permanent failure
+ // and future gets can retry (this could be a pluggable policy)
+ _workers.TryRemove(key, out _);
+ }
+ }
+ }
+ }
+
+ public async Task<TValue?> ScheduleAsync<TState>(TKey key, TState state, Func<TKey, TState, Task<TValue?>> valueFactory)
+ {
+ ArgumentNullException.ThrowIfNull(key);
+
+ while (true)
+ {
+ if (_workers.TryGetValue(key, out var task))
+ {
+ return await task;
+ }
+
+ // This is the task that we'll return to all waiters. We'll complete it when the factory is complete
+ var tcs = new TaskCompletionSource<TValue?>(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ if (_workers.TryAdd(key, tcs.Task))
+ {
+ try
+ {
+ var value = await valueFactory(key, state);
+ tcs.TrySetResult(value);
+ return await tcs.Task;
+ }
+ catch (Exception ex)
+ {
+ // Make sure all waiters see the exception
+ tcs.SetException(ex);
+
+ throw;
+ }
+ finally
+ {
+ // We remove the entry if the factory failed so it's not a permanent failure
+ // and future gets can retry (this could be a pluggable policy)
+ _workers.TryRemove(key, out _);
+ }
+ }
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/IOutputCacheFeature.cs b/src/Middleware/OutputCaching/src/IOutputCacheFeature.cs
new file mode 100644
index 0000000000..db651bd7c0
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/IOutputCacheFeature.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A feature for configuring additional output cache options on the HTTP response.
+/// </summary>
+public interface IOutputCacheFeature
+{
+ /// <summary>
+ /// Gets the cache context.
+ /// </summary>
+ OutputCacheContext Context { get; }
+}
diff --git a/src/Middleware/OutputCaching/src/IOutputCacheKeyProvider.cs b/src/Middleware/OutputCaching/src/IOutputCacheKeyProvider.cs
new file mode 100644
index 0000000000..e86cf6c679
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/IOutputCacheKeyProvider.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal interface IOutputCacheKeyProvider
+{
+ /// <summary>
+ /// Create a key for storing cached responses.
+ /// </summary>
+ /// <param name="context">The <see cref="OutputCacheContext"/>.</param>
+ /// <returns>The created key.</returns>
+ string CreateStorageKey(OutputCacheContext context);
+}
diff --git a/src/Middleware/OutputCaching/src/IOutputCachePolicy.cs b/src/Middleware/OutputCaching/src/IOutputCachePolicy.cs
new file mode 100644
index 0000000000..aae03b76db
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/IOutputCachePolicy.cs
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// An implementation of this interface can update how the current request is cached.
+/// </summary>
+public interface IOutputCachePolicy
+{
+ /// <summary>
+ /// Updates the <see cref="OutputCacheContext"/> before the cache middleware is invoked.
+ /// At that point the cache middleware can still be enabled or disabled for the request.
+ /// </summary>
+ /// <param name="context">The current request's cache context.</param>
+ ValueTask CacheRequestAsync(OutputCacheContext context, CancellationToken cancellation);
+
+ /// <summary>
+ /// Updates the <see cref="OutputCacheContext"/> before the cached response is used.
+ /// At that point the freshness of the cached response can be updated.
+ /// </summary>
+ /// <param name="context">The current request's cache context.</param>
+ ValueTask ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellation);
+
+ /// <summary>
+ /// Updates the <see cref="OutputCacheContext"/> before the response is served and can be cached.
+ /// At that point cacheability of the response can be updated.
+ /// </summary>
+ ValueTask ServeResponseAsync(OutputCacheContext context, CancellationToken cancellation);
+}
diff --git a/src/Middleware/OutputCaching/src/IOutputCacheStore.cs b/src/Middleware/OutputCaching/src/IOutputCacheStore.cs
new file mode 100644
index 0000000000..ffba017ef6
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/IOutputCacheStore.cs
@@ -0,0 +1,36 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Represents a store for cached responses.
+/// </summary>
+public interface IOutputCacheStore
+{
+ /// <summary>
+ /// Evicts cached responses by tag.
+ /// </summary>
+ /// <param name="tag">The tag to evict.</param>
+ /// <param name="cancellationToken">Indicates that the operation should be cancelled.</param>
+ ValueTask EvictByTagAsync(string tag, CancellationToken cancellationToken);
+
+ /// <summary>
+ /// Gets the cached response for the given key, if it exists.
+ /// If no cached response exists for the given key, <c>null</c> is returned.
+ /// </summary>
+ /// <param name="key">The cache key to look up.</param>
+ /// <param name="cancellationToken">Indicates that the operation should be cancelled.</param>
+ /// <returns>The response cache entry if it exists; otherwise <c>null</c>.</returns>
+ ValueTask<byte[]?> GetAsync(string key, CancellationToken cancellationToken);
+
+ /// <summary>
+ /// Stores the given response in the response cache.
+ /// </summary>
+ /// <param name="key">The cache key to store the response under.</param>
+ /// <param name="value">The response cache entry to store.</param>
+ /// <param name="tags">The tags associated with the cache entry to store.</param>
+ /// <param name="validFor">The amount of time the entry will be kept in the cache before expiring, relative to now.</param>
+ /// <param name="cancellationToken">Indicates that the operation should be cancelled.</param>
+ ValueTask SetAsync(string key, byte[] value, string[]? tags, TimeSpan validFor, CancellationToken cancellationToken);
+}
diff --git a/src/Middleware/OutputCaching/src/ISystemClock.cs b/src/Middleware/OutputCaching/src/ISystemClock.cs
new file mode 100644
index 0000000000..8e2ead45b9
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/ISystemClock.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Abstracts the system clock to facilitate testing.
+/// </summary>
+internal interface ISystemClock
+{
+ /// <summary>
+ /// Retrieves the current system time in UTC.
+ /// </summary>
+ DateTimeOffset UtcNow { get; }
+}
diff --git a/src/Middleware/OutputCaching/src/LoggerExtensions.cs b/src/Middleware/OutputCaching/src/LoggerExtensions.cs
new file mode 100644
index 0000000000..7a05e21f7c
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/LoggerExtensions.cs
@@ -0,0 +1,55 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Defines the logger messages produced by output caching
+/// </summary>
+internal static partial class LoggerExtensions
+{
+ [LoggerMessage(1, LogLevel.Debug, "The 'IfNoneMatch' header of the request contains a value of *.", EventName = "NotModifiedIfNoneMatchStar")]
+ internal static partial void NotModifiedIfNoneMatchStar(this ILogger logger);
+
+ [LoggerMessage(2, LogLevel.Debug, "The ETag {ETag} in the 'IfNoneMatch' header matched the ETag of a cached entry.",
+ EventName = "NotModifiedIfNoneMatchMatched")]
+ internal static partial void NotModifiedIfNoneMatchMatched(this ILogger logger, EntityTagHeaderValue etag);
+
+ [LoggerMessage(3, LogLevel.Debug, "The last modified date of {LastModified} is before the date {IfModifiedSince} specified in the 'IfModifiedSince' header.",
+ EventName = "NotModifiedIfModifiedSinceSatisfied")]
+ internal static partial void NotModifiedIfModifiedSinceSatisfied(this ILogger logger, DateTimeOffset lastModified, DateTimeOffset ifModifiedSince);
+
+ [LoggerMessage(4, LogLevel.Information, "The content requested has not been modified.", EventName = "NotModifiedServed")]
+ internal static partial void NotModifiedServed(this ILogger logger);
+
+ [LoggerMessage(5, LogLevel.Information, "Serving response from cache.", EventName = "CachedResponseServed")]
+ internal static partial void CachedResponseServed(this ILogger logger);
+
+ [LoggerMessage(6, LogLevel.Information, "No cached response available for this request and the 'only-if-cached' cache directive was specified.",
+ EventName = "GatewayTimeoutServed")]
+ internal static partial void GatewayTimeoutServed(this ILogger logger);
+
+ [LoggerMessage(7, LogLevel.Information, "No cached response available for this request.", EventName = "NoResponseServed")]
+ internal static partial void NoResponseServed(this ILogger logger);
+
+ [LoggerMessage(8, LogLevel.Debug, "Vary by rules were updated. Header names: {HeaderNames}, Query keys: {QueryKeys}, Route value names: {RouteValueNames}", EventName = "VaryByRulesUpdated")]
+ internal static partial void VaryByRulesUpdated(this ILogger logger, string headerNames, string queryKeys, string routeValueNames);
+
+ [LoggerMessage(9, LogLevel.Information, "The response has been cached.", EventName = "ResponseCached")]
+ internal static partial void ResponseCached(this ILogger logger);
+
+ [LoggerMessage(10, LogLevel.Information, "The response could not be cached for this request.", EventName = "ResponseNotCached")]
+ internal static partial void ResponseNotCached(this ILogger logger);
+
+ [LoggerMessage(11, LogLevel.Warning, "The response could not be cached for this request because the 'Content-Length' did not match the body length.",
+ EventName = "ResponseContentLengthMismatchNotCached")]
+ internal static partial void ResponseContentLengthMismatchNotCached(this ILogger logger);
+
+ [LoggerMessage(12, LogLevel.Debug, "The response time of the entry is {ResponseTime} and has exceeded its expiry date.",
+ EventName = "ExpirationExpiresExceeded")]
+ internal static partial void ExpirationExpiresExceeded(this ILogger logger, DateTimeOffset responseTime);
+
+}
diff --git a/src/Middleware/OutputCaching/src/Memory/MemoryOutputCacheStore.cs b/src/Middleware/OutputCaching/src/Memory/MemoryOutputCacheStore.cs
new file mode 100644
index 0000000000..3f1df73c7b
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Memory/MemoryOutputCacheStore.cs
@@ -0,0 +1,96 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Caching.Memory;
+
+namespace Microsoft.AspNetCore.OutputCaching.Memory;
+
+internal sealed class MemoryOutputCacheStore : IOutputCacheStore
+{
+ private readonly IMemoryCache _cache;
+ private readonly Dictionary<string, HashSet<string>> _taggedEntries = new();
+ private readonly object _tagsLock = new();
+
+ internal MemoryOutputCacheStore(IMemoryCache cache)
+ {
+ ArgumentNullException.ThrowIfNull(cache);
+
+ _cache = cache;
+ }
+
+ public ValueTask EvictByTagAsync(string tag, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(tag);
+
+ lock (_tagsLock)
+ {
+ if (_taggedEntries.TryGetValue(tag, out var keys))
+ {
+ foreach (var key in keys)
+ {
+ _cache.Remove(key);
+ }
+
+ _taggedEntries.Remove(tag);
+ }
+ }
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ public ValueTask<byte[]?> GetAsync(string key, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(key);
+
+ var entry = _cache.Get(key) as byte[];
+ return ValueTask.FromResult(entry);
+ }
+
+ /// <inheritdoc />
+ public ValueTask SetAsync(string key, byte[] value, string[]? tags, TimeSpan validFor, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(key);
+ ArgumentNullException.ThrowIfNull(value);
+
+ if (tags != null)
+ {
+ // Lock with SetEntry() to prevent EvictByTagAsync() from trying to remove a tag whose entry hasn't been added yet.
+ // It might be acceptable to not lock SetEntry() since in this case Remove(key) would just no-op and the user retry to evict.
+
+ lock (_tagsLock)
+ {
+ foreach (var tag in tags)
+ {
+ if (!_taggedEntries.TryGetValue(tag, out var keys))
+ {
+ keys = new HashSet<string>();
+ _taggedEntries[tag] = keys;
+ }
+
+ keys.Add(key);
+ }
+
+ SetEntry();
+ }
+ }
+ else
+ {
+ SetEntry();
+ }
+
+ void SetEntry()
+ {
+ _cache.Set(
+ key,
+ value,
+ new MemoryCacheEntryOptions
+ {
+ AbsoluteExpirationRelativeToNow = validFor,
+ Size = value.Length
+ });
+ }
+
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj b/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj
new file mode 100644
index 0000000000..1396a66e27
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Microsoft.AspNetCore.OutputCaching.csproj
@@ -0,0 +1,26 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <Description>ASP.NET Core middleware for caching HTTP responses on the server.</Description>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <IsAspNetCoreApp>true</IsAspNetCoreApp>
+ <IsPackable>false</IsPackable>
+ <IsTrimmable>true</IsTrimmable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.OutputCaching.Tests" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Http.Extensions" />
+ <Reference Include="Microsoft.AspNetCore.Http" />
+ <Reference Include="Microsoft.Extensions.Caching.Memory" />
+ <Reference Include="Microsoft.Extensions.Logging.Abstractions" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Compile Include="$(RepoRoot)src\Shared\TaskToApm.cs" Link="Streams\TaskToApm.cs" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Middleware/OutputCaching/src/OutputCacheApplicationBuilderExtensions.cs b/src/Middleware/OutputCaching/src/OutputCacheApplicationBuilderExtensions.cs
new file mode 100644
index 0000000000..4d6caa87d0
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheApplicationBuilderExtensions.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.OutputCaching;
+
+namespace Microsoft.AspNetCore.Builder;
+
+/// <summary>
+/// Extension methods for adding the <see cref="OutputCacheMiddleware"/> to an application.
+/// </summary>
+public static class OutputCacheApplicationBuilderExtensions
+{
+ /// <summary>
+ /// Adds the <see cref="OutputCacheMiddleware"/> for caching HTTP responses.
+ /// </summary>
+ /// <param name="app">The <see cref="IApplicationBuilder"/>.</param>
+ public static IApplicationBuilder UseOutputCache(this IApplicationBuilder app)
+ {
+ ArgumentNullException.ThrowIfNull(app);
+
+ return app.UseMiddleware<OutputCacheMiddleware>();
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheAttribute.cs b/src/Middleware/OutputCaching/src/OutputCacheAttribute.cs
new file mode 100644
index 0000000000..b5bbd028bd
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheAttribute.cs
@@ -0,0 +1,103 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Specifies the parameters necessary for setting appropriate headers in output caching.
+/// </summary>
+/// <remarks>
+/// This attribute requires the output cache middleware.
+/// </remarks>
+[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+public sealed class OutputCacheAttribute : Attribute
+{
+ // A nullable-int cannot be used as an Attribute parameter.
+ // Hence this nullable-int is present to back the Duration property.
+ // The same goes for nullable-ResponseCacheLocation and nullable-bool.
+ private int? _duration;
+ private bool? _noCache;
+
+ private IOutputCachePolicy? _builtPolicy;
+
+ /// <summary>
+ /// Gets or sets the duration in seconds for which the response is cached.
+ /// </summary>
+ public int Duration
+ {
+ get => _duration ?? 0;
+ init => _duration = value;
+ }
+
+ /// <summary>
+ /// Gets or sets the value which determines whether the reponse should be cached or not.
+ /// When set to <see langword="true"/>, the response won't be cached.
+ /// </summary>
+ public bool NoStore
+ {
+ get => _noCache ?? false;
+ init => _noCache = value;
+ }
+
+ /// <summary>
+ /// Gets or sets the query keys to vary by.
+ /// </summary>
+ public string[]? VaryByQueryKeys { get; init; }
+
+ /// <summary>
+ /// Gets or sets the header names to vary by.
+ /// </summary>
+ public string[]? VaryByHeaderNames { get; init; }
+
+ /// <summary>
+ /// Gets or sets the route value names to vary by.
+ /// </summary>
+ public string[]? VaryByRouteValueNames { get; init; }
+
+ /// <summary>
+ /// Gets or sets the value of the cache policy name.
+ /// </summary>
+ public string? PolicyName { get; init; }
+
+ internal IOutputCachePolicy BuildPolicy()
+ {
+ if (_builtPolicy != null)
+ {
+ return _builtPolicy;
+ }
+
+ var builder = new OutputCachePolicyBuilder();
+
+ if (PolicyName != null)
+ {
+ builder.AddPolicy(new NamedPolicy(PolicyName));
+ }
+
+ if (_noCache != null && _noCache.Value)
+ {
+ builder.NoCache();
+ }
+
+ if (VaryByQueryKeys != null)
+ {
+ builder.VaryByQuery(VaryByQueryKeys);
+ }
+
+ if (VaryByHeaderNames != null)
+ {
+ builder.VaryByHeader(VaryByHeaderNames);
+ }
+
+ if (VaryByRouteValueNames != null)
+ {
+ builder.VaryByRouteValue(VaryByRouteValueNames);
+ }
+
+ if (_duration != null)
+ {
+ builder.Expire(TimeSpan.FromSeconds(_duration.Value));
+ }
+
+ return _builtPolicy = builder.Build();
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheContext.cs b/src/Middleware/OutputCaching/src/OutputCacheContext.cs
new file mode 100644
index 0000000000..be51451ec1
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheContext.cs
@@ -0,0 +1,77 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Represent the current cache context for the request.
+/// </summary>
+public sealed class OutputCacheContext
+{
+ public OutputCacheContext()
+ {
+ }
+
+ /// <summary>
+ /// Determines whether the output caching logic should be configured for the incoming HTTP request.
+ /// </summary>
+ public bool EnableOutputCaching { get; set; }
+
+ /// <summary>
+ /// Determines whether a cache lookup is allowed for the incoming HTTP request.
+ /// </summary>
+ public bool AllowCacheLookup { get; set; }
+
+ /// <summary>
+ /// Determines whether storage of the response is allowed for the incoming HTTP request.
+ /// </summary>
+ public bool AllowCacheStorage { get; set; }
+
+ /// <summary>
+ /// Determines whether the request should be locked.
+ /// </summary>
+ public bool AllowLocking { get; set; }
+
+ /// <summary>
+ /// Gets the <see cref="HttpContext"/>.
+ /// </summary>
+ public required HttpContext HttpContext { get; init; }
+
+ /// <summary>
+ /// Gets or sets the response time.
+ /// </summary>
+ public DateTimeOffset? ResponseTime { get; set; }
+
+ /// <summary>
+ /// Gets the <see cref="CacheVaryByRules"/> instance.
+ /// </summary>
+ public CacheVaryByRules CacheVaryByRules { get; } = new();
+
+ /// <summary>
+ /// Gets the tags of the cached response.
+ /// </summary>
+ public HashSet<string> Tags { get; } = new();
+
+ /// <summary>
+ /// Gets or sets the amount of time the response should be cached for.
+ /// </summary>
+ public TimeSpan? ResponseExpirationTimeSpan { get; set; }
+
+ internal string CacheKey { get; set; } = default!;
+
+ internal TimeSpan CachedResponseValidFor { get; set; }
+
+ internal bool IsCacheEntryFresh { get; set; }
+
+ internal TimeSpan CachedEntryAge { get; set; }
+
+ internal OutputCacheEntry CachedResponse { get; set; } = default!;
+
+ internal bool ResponseStarted { get; set; }
+
+ internal Stream OriginalResponseStream { get; set; } = default!;
+
+ internal OutputCacheStream OutputCacheStream { get; set; } = default!;
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheEntry.cs b/src/Middleware/OutputCaching/src/OutputCacheEntry.cs
new file mode 100644
index 0000000000..325f2e6607
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheEntry.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class OutputCacheEntry
+{
+ /// <summary>
+ /// Gets the created date and time of the cache entry.
+ /// </summary>
+ public DateTimeOffset Created { get; set; }
+
+ /// <summary>
+ /// Gets the status code of the cache entry.
+ /// </summary>
+ public int StatusCode { get; set; }
+
+ /// <summary>
+ /// Gets the headers of the cache entry.
+ /// </summary>
+ public HeaderDictionary Headers { get; set; } = default!;
+
+ /// <summary>
+ /// Gets the body of the cache entry.
+ /// </summary>
+ public CachedResponseBody Body { get; set; } = default!;
+
+ /// <summary>
+ /// Gets the tags of the cache entry.
+ /// </summary>
+ public string[] Tags { get; set; } = Array.Empty<string>();
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheEntryFormatter.cs b/src/Middleware/OutputCaching/src/OutputCacheEntryFormatter.cs
new file mode 100644
index 0000000000..b6dbef1c2c
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheEntryFormatter.cs
@@ -0,0 +1,81 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using System.Text.Json;
+using Microsoft.AspNetCore.OutputCaching.Serialization;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+/// <summary>
+/// Formats <see cref="OutputCacheEntry"/> instance to match structures supported by the <see cref="IOutputCacheStore"/> implementations.
+/// </summary>
+internal static class OutputCacheEntryFormatter
+{
+ public static async ValueTask<OutputCacheEntry?> GetAsync(string key, IOutputCacheStore store, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(key);
+
+ var content = await store.GetAsync(key, cancellationToken);
+
+ if (content == null)
+ {
+ return null;
+ }
+
+ var formatter = JsonSerializer.Deserialize(content, FormatterEntrySerializerContext.Default.FormatterEntry);
+
+ if (formatter == null)
+ {
+ return null;
+ }
+
+ var outputCacheEntry = new OutputCacheEntry
+ {
+ StatusCode = formatter.StatusCode,
+ Created = formatter.Created,
+ Tags = formatter.Tags,
+ Headers = new(),
+ Body = new CachedResponseBody(formatter.Body, formatter.Body.Sum(x => x.Length))
+ };
+
+ if (formatter.Headers != null)
+ {
+ foreach (var header in formatter.Headers)
+ {
+ outputCacheEntry.Headers.TryAdd(header.Key, header.Value);
+ }
+ }
+
+ return outputCacheEntry;
+ }
+
+ public static async ValueTask StoreAsync(string key, OutputCacheEntry value, TimeSpan duration, IOutputCacheStore store, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(value);
+ ArgumentNullException.ThrowIfNull(value.Body);
+ ArgumentNullException.ThrowIfNull(value.Headers);
+
+ var formatterEntry = new FormatterEntry
+ {
+ StatusCode = value.StatusCode,
+ Created = value.Created,
+ Tags = value.Tags,
+ Body = value.Body.Segments
+ };
+
+ if (value.Headers != null)
+ {
+ formatterEntry.Headers = new();
+ foreach (var header in value.Headers)
+ {
+ formatterEntry.Headers.TryAdd(header.Key, header.Value.ToArray());
+ }
+ }
+
+ using var bufferStream = new MemoryStream();
+
+ JsonSerializer.Serialize(bufferStream, formatterEntry, FormatterEntrySerializerContext.Default.FormatterEntry);
+
+ await store.SetAsync(key, bufferStream.ToArray(), value.Tags ?? Array.Empty<string>(), duration, cancellationToken);
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheFeature.cs b/src/Middleware/OutputCaching/src/OutputCacheFeature.cs
new file mode 100644
index 0000000000..b1ce32b97a
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheFeature.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class OutputCacheFeature : IOutputCacheFeature
+{
+ public OutputCacheFeature(OutputCacheContext context)
+ {
+ Context = context;
+ }
+
+ public OutputCacheContext Context { get; }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheKeyProvider.cs b/src/Middleware/OutputCaching/src/OutputCacheKeyProvider.cs
new file mode 100644
index 0000000000..456ff01472
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheKeyProvider.cs
@@ -0,0 +1,214 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using Microsoft.Extensions.ObjectPool;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class OutputCacheKeyProvider : IOutputCacheKeyProvider
+{
+ // Use the record separator for delimiting components of the cache key to avoid possible collisions
+ private const char KeyDelimiter = '\x1e';
+ // Use the unit separator for delimiting subcomponents of the cache key to avoid possible collisions
+ private const char KeySubDelimiter = '\x1f';
+
+ private readonly ObjectPool<StringBuilder> _builderPool;
+ private readonly OutputCacheOptions _options;
+
+ internal OutputCacheKeyProvider(ObjectPoolProvider poolProvider, IOptions<OutputCacheOptions> options)
+ {
+ ArgumentNullException.ThrowIfNull(poolProvider);
+ ArgumentNullException.ThrowIfNull(options);
+
+ _builderPool = poolProvider.CreateStringBuilderPool();
+ _options = options.Value;
+ }
+
+ // GET<delimiter>SCHEME<delimiter>HOST:PORT/PATHBASE/PATH<delimiter>H<delimiter>HeaderName=HeaderValue<delimiter>Q<delimiter>QueryName=QueryValue1<subdelimiter>QueryValue2<delimiter>R<delimiter>RouteName1=RouteValue1<subdelimiter>RouteName2=RouteValue2
+ public string CreateStorageKey(OutputCacheContext context)
+ {
+ ArgumentNullException.ThrowIfNull(_builderPool);
+
+ var varyByRules = context.CacheVaryByRules;
+ if (varyByRules == null)
+ {
+ throw new InvalidOperationException($"{nameof(CacheVaryByRules)} must not be null on the {nameof(OutputCacheContext)}");
+ }
+
+ var request = context.HttpContext.Request;
+ var builder = _builderPool.Get();
+
+ try
+ {
+ builder
+ .AppendUpperInvariant(request.Method)
+ .Append(KeyDelimiter)
+ .AppendUpperInvariant(request.Scheme)
+ .Append(KeyDelimiter)
+ .AppendUpperInvariant(request.Host.Value);
+
+ if (_options.UseCaseSensitivePaths)
+ {
+ builder
+ .Append(request.PathBase.Value)
+ .Append(request.Path.Value);
+ }
+ else
+ {
+ builder
+ .AppendUpperInvariant(request.PathBase.Value)
+ .AppendUpperInvariant(request.Path.Value);
+ }
+
+ // Vary by prefix and custom
+ var prefixCount = varyByRules?.VaryByPrefix.Count ?? 0;
+ if (prefixCount > 0)
+ {
+ // Append a group separator for the header segment of the cache key
+ builder.Append(KeyDelimiter)
+ .Append('C');
+
+ for (var i = 0; i < prefixCount; i++)
+ {
+ var value = varyByRules?.VaryByPrefix[i] ?? string.Empty;
+ builder.Append(KeyDelimiter).Append(value);
+ }
+ }
+
+ // Vary by header names
+ var headersCount = varyByRules?.HeaderNames.Count ?? 0;
+ if (headersCount > 0)
+ {
+ // Append a group separator for the header segment of the cache key
+ builder.Append(KeyDelimiter)
+ .Append('H');
+
+ var requestHeaders = context.HttpContext.Request.Headers;
+ for (var i = 0; i < headersCount; i++)
+ {
+ var header = varyByRules!.HeaderNames[i] ?? string.Empty;
+ var headerValues = requestHeaders[header];
+ builder.Append(KeyDelimiter)
+ .Append(header)
+ .Append('=');
+
+ var headerValuesArray = headerValues.ToArray();
+ Array.Sort(headerValuesArray, StringComparer.Ordinal);
+
+ for (var j = 0; j < headerValuesArray.Length; j++)
+ {
+ builder.Append(headerValuesArray[j]);
+ }
+ }
+ }
+
+ // Vary by query keys
+ if (varyByRules?.QueryKeys.Count > 0)
+ {
+ // Append a group separator for the query key segment of the cache key
+ builder.Append(KeyDelimiter)
+ .Append('Q');
+
+ if (varyByRules.QueryKeys.Count == 1 && string.Equals(varyByRules.QueryKeys[0], "*", StringComparison.Ordinal) && context.HttpContext.Request.Query.Count > 0)
+ {
+ // Vary by all available query keys
+ var queryArray = context.HttpContext.Request.Query.ToArray();
+ // Query keys are aggregated case-insensitively whereas the query values are compared ordinally.
+ Array.Sort(queryArray, QueryKeyComparer.OrdinalIgnoreCase);
+
+ for (var i = 0; i < queryArray.Length; i++)
+ {
+ builder.Append(KeyDelimiter)
+ .AppendUpperInvariant(queryArray[i].Key)
+ .Append('=');
+
+ var queryValueArray = queryArray[i].Value.ToArray();
+ Array.Sort(queryValueArray, StringComparer.Ordinal);
+
+ for (var j = 0; j < queryValueArray.Length; j++)
+ {
+ if (j > 0)
+ {
+ builder.Append(KeySubDelimiter);
+ }
+
+ builder.Append(queryValueArray[j]);
+ }
+ }
+ }
+ else
+ {
+ for (var i = 0; i < varyByRules.QueryKeys.Count; i++)
+ {
+ var queryKey = varyByRules.QueryKeys[i] ?? string.Empty;
+ var queryKeyValues = context.HttpContext.Request.Query[queryKey];
+ builder.Append(KeyDelimiter)
+ .Append(queryKey)
+ .Append('=');
+
+ var queryValueArray = queryKeyValues.ToArray();
+ Array.Sort(queryValueArray, StringComparer.Ordinal);
+
+ for (var j = 0; j < queryValueArray.Length; j++)
+ {
+ if (j > 0)
+ {
+ builder.Append(KeySubDelimiter);
+ }
+
+ builder.Append(queryValueArray[j]);
+ }
+ }
+ }
+ }
+
+ // Vary by route value names
+ var routeValueNamesCount = varyByRules?.RouteValueNames.Count ?? 0;
+ if (routeValueNamesCount > 0)
+ {
+ // Append a group separator for the route values segment of the cache key
+ builder.Append(KeyDelimiter)
+ .Append('R');
+
+ for (var i = 0; i < routeValueNamesCount; i++)
+ {
+ // The lookup key can't be null
+ var routeValueName = varyByRules!.RouteValueNames[i] ?? string.Empty;
+
+ // RouteValueNames returns null if the key doesn't exist
+ var routeValueValue = context.HttpContext.Request.RouteValues[routeValueName];
+
+ builder.Append(KeyDelimiter)
+ .Append(routeValueName)
+ .Append('=')
+ .Append(Convert.ToString(routeValueValue, CultureInfo.InvariantCulture));
+ }
+ }
+
+ return builder.ToString();
+ }
+ finally
+ {
+ _builderPool.Return(builder);
+ }
+ }
+
+ private sealed class QueryKeyComparer : IComparer<KeyValuePair<string, StringValues>>
+ {
+ private readonly StringComparer _stringComparer;
+
+ public static QueryKeyComparer OrdinalIgnoreCase { get; } = new QueryKeyComparer(StringComparer.OrdinalIgnoreCase);
+
+ public QueryKeyComparer(StringComparer stringComparer)
+ {
+ _stringComparer = stringComparer;
+ }
+
+ public int Compare(KeyValuePair<string, StringValues> x, KeyValuePair<string, StringValues> y) => _stringComparer.Compare(x.Key, y.Key);
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheMiddleware.cs b/src/Middleware/OutputCaching/src/OutputCacheMiddleware.cs
new file mode 100644
index 0000000000..78ea55b156
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheMiddleware.cs
@@ -0,0 +1,621 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.ObjectPool;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Primitives;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Enable HTTP response caching.
+/// </summary>
+internal sealed class OutputCacheMiddleware
+{
+ // see https://tools.ietf.org/html/rfc7232#section-4.1
+ private static readonly string[] HeadersToIncludeIn304 =
+ new[] { "Cache-Control", "Content-Location", "Date", "ETag", "Expires", "Vary" };
+
+ private readonly RequestDelegate _next;
+ private readonly OutputCacheOptions _options;
+ private readonly ILogger _logger;
+ private readonly IOutputCacheStore _store;
+ private readonly IOutputCacheKeyProvider _keyProvider;
+ private readonly WorkDispatcher<string, OutputCacheEntry?> _outputCacheEntryDispatcher;
+ private readonly WorkDispatcher<string, OutputCacheEntry?> _requestDispatcher;
+
+ /// <summary>
+ /// Creates a new <see cref="OutputCacheMiddleware"/>.
+ /// </summary>
+ /// <param name="next">The <see cref="RequestDelegate"/> representing the next middleware in the pipeline.</param>
+ /// <param name="options">The options for this middleware.</param>
+ /// <param name="loggerFactory">The <see cref="ILoggerFactory"/> used for logging.</param>
+ /// <param name="outputCache">The <see cref="IOutputCacheStore"/> store.</param>
+ /// <param name="poolProvider">The <see cref="ObjectPoolProvider"/> used for creating <see cref="ObjectPool"/> instances.</param>
+ public OutputCacheMiddleware(
+ RequestDelegate next,
+ IOptions<OutputCacheOptions> options,
+ ILoggerFactory loggerFactory,
+ IOutputCacheStore outputCache,
+ ObjectPoolProvider poolProvider
+ )
+ : this(
+ next,
+ options,
+ loggerFactory,
+ outputCache,
+ new OutputCacheKeyProvider(poolProvider, options))
+ { }
+
+ // for testing
+ internal OutputCacheMiddleware(
+ RequestDelegate next,
+ IOptions<OutputCacheOptions> options,
+ ILoggerFactory loggerFactory,
+ IOutputCacheStore cache,
+ IOutputCacheKeyProvider keyProvider)
+ {
+ ArgumentNullException.ThrowIfNull(next);
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(loggerFactory);
+ ArgumentNullException.ThrowIfNull(cache);
+ ArgumentNullException.ThrowIfNull(keyProvider);
+
+ _next = next;
+ _options = options.Value;
+ _logger = loggerFactory.CreateLogger<OutputCacheMiddleware>();
+ _store = cache;
+ _keyProvider = keyProvider;
+ _outputCacheEntryDispatcher = new();
+ _requestDispatcher = new();
+ }
+
+ /// <summary>
+ /// Invokes the logic of the middleware.
+ /// </summary>
+ /// <param name="httpContext">The <see cref="HttpContext"/>.</param>
+ /// <returns>A <see cref="Task"/> that completes when the middleware has completed processing.</returns>
+ public Task Invoke(HttpContext httpContext)
+ {
+ // Skip the middleware if there is no policy for the current request
+ if (!TryGetRequestPolicies(httpContext, out var policies))
+ {
+ return _next(httpContext);
+ }
+
+ return InvokeAwaited(httpContext, policies);
+ }
+
+ private async Task InvokeAwaited(HttpContext httpContext, IReadOnlyList<IOutputCachePolicy> policies)
+ {
+ var context = new OutputCacheContext { HttpContext = httpContext };
+
+ // Add IOutputCacheFeature
+ AddOutputCacheFeature(context);
+
+ try
+ {
+ foreach (var policy in policies)
+ {
+ await policy.CacheRequestAsync(context, httpContext.RequestAborted);
+ }
+
+ // Should we attempt any caching logic?
+ if (context.EnableOutputCaching)
+ {
+ // Can this request be served from cache?
+ if (context.AllowCacheLookup)
+ {
+ if (await TryServeFromCacheAsync(context, policies))
+ {
+ return;
+ }
+ }
+
+ // Should we store the response to this request?
+ if (context.AllowCacheStorage)
+ {
+ // It is also a pre-condition to reponse locking
+
+ var executed = false;
+
+ if (context.AllowLocking)
+ {
+ var cacheEntry = await _requestDispatcher.ScheduleAsync(context.CacheKey, key => ExecuteResponseAsync());
+
+ // The current request was processed, nothing more to do
+ if (executed)
+ {
+ return;
+ }
+
+ // If the result was processed by another request, try to serve it from cache entry (no lookup)
+ if (await TryServeCachedResponseAsync(context, cacheEntry, policies))
+ {
+ return;
+ }
+
+ // If the cache entry couldn't be served, continue to processing the request as usual
+ }
+
+ await ExecuteResponseAsync();
+
+ async Task<OutputCacheEntry?> ExecuteResponseAsync()
+ {
+ // Hook up to listen to the response stream
+ ShimResponseStream(context);
+
+ try
+ {
+ await _next(httpContext);
+
+ // The next middleware might change the policy
+ foreach (var policy in policies)
+ {
+ await policy.ServeResponseAsync(context, httpContext.RequestAborted);
+ }
+
+ // If there was no response body, check the response headers now. We can cache things like redirects.
+ StartResponse(context);
+
+ // Finalize the cache entry
+ await FinalizeCacheBodyAsync(context);
+
+ executed = true;
+ }
+ finally
+ {
+ UnshimResponseStream(context);
+ }
+
+ return context.CachedResponse;
+ }
+
+ return;
+ }
+ }
+
+ await _next(httpContext);
+ }
+ finally
+ {
+ RemoveOutputCacheFeature(httpContext);
+ }
+ }
+
+ internal bool TryGetRequestPolicies(HttpContext httpContext, out IReadOnlyList<IOutputCachePolicy> policies)
+ {
+ policies = Array.Empty<IOutputCachePolicy>();
+ List<IOutputCachePolicy>? result = null;
+
+ if (_options.BasePolicies != null)
+ {
+ result = new();
+ result.AddRange(_options.BasePolicies);
+ }
+
+ var metadata = httpContext.GetEndpoint()?.Metadata;
+
+ var policy = metadata?.GetMetadata<IOutputCachePolicy>();
+
+ if (policy != null)
+ {
+ result ??= new();
+ result.Add(policy);
+ }
+
+ var attribute = metadata?.GetMetadata<OutputCacheAttribute>();
+
+ if (attribute != null)
+ {
+ result ??= new();
+ result.Add(attribute.BuildPolicy());
+ }
+
+ if (result != null)
+ {
+ policies = result;
+ return true;
+ }
+
+ return false;
+ }
+
+ internal async Task<bool> TryServeCachedResponseAsync(OutputCacheContext context, OutputCacheEntry? cacheEntry, IReadOnlyList<IOutputCachePolicy> policies)
+ {
+ if (cacheEntry == null)
+ {
+ return false;
+ }
+
+ context.CachedResponse = cacheEntry;
+ context.ResponseTime = _options.SystemClock.UtcNow;
+ var cacheEntryAge = context.ResponseTime.Value - context.CachedResponse.Created;
+ context.CachedEntryAge = cacheEntryAge > TimeSpan.Zero ? cacheEntryAge : TimeSpan.Zero;
+
+ foreach (var policy in policies)
+ {
+ await policy.ServeFromCacheAsync(context, context.HttpContext.RequestAborted);
+ }
+
+ context.IsCacheEntryFresh = true;
+
+ // Validate expiration
+ if (context.CachedEntryAge <= TimeSpan.Zero)
+ {
+ _logger.ExpirationExpiresExceeded(context.ResponseTime!.Value);
+ context.IsCacheEntryFresh = false;
+ }
+
+ if (context.IsCacheEntryFresh)
+ {
+ var cachedResponseHeaders = context.CachedResponse.Headers;
+
+ // Check conditional request rules
+ if (ContentIsNotModified(context))
+ {
+ _logger.NotModifiedServed();
+ context.HttpContext.Response.StatusCode = StatusCodes.Status304NotModified;
+
+ if (cachedResponseHeaders != null)
+ {
+ foreach (var key in HeadersToIncludeIn304)
+ {
+ if (cachedResponseHeaders.TryGetValue(key, out var values))
+ {
+ context.HttpContext.Response.Headers[key] = values;
+ }
+ }
+ }
+ }
+ else
+ {
+ var response = context.HttpContext.Response;
+ // Copy the cached status code and response headers
+ response.StatusCode = context.CachedResponse.StatusCode;
+ foreach (var header in context.CachedResponse.Headers)
+ {
+ response.Headers[header.Key] = header.Value;
+ }
+
+ // Note: int64 division truncates result and errors may be up to 1 second. This reduction in
+ // accuracy of age calculation is considered appropriate since it is small compared to clock
+ // skews and the "Age" header is an estimate of the real age of cached content.
+ response.Headers.Age = HeaderUtilities.FormatNonNegativeInt64(context.CachedEntryAge.Ticks / TimeSpan.TicksPerSecond);
+
+ // Copy the cached response body
+ var body = context.CachedResponse.Body;
+ if (body.Length > 0)
+ {
+ try
+ {
+ await body.CopyToAsync(response.BodyWriter, context.HttpContext.RequestAborted);
+ }
+ catch (OperationCanceledException)
+ {
+ context.HttpContext.Abort();
+ }
+ }
+ _logger.CachedResponseServed();
+ }
+ return true;
+ }
+
+ return false;
+ }
+
+ internal async Task<bool> TryServeFromCacheAsync(OutputCacheContext cacheContext, IReadOnlyList<IOutputCachePolicy> policies)
+ {
+ CreateCacheKey(cacheContext);
+
+ // Locking cache lookups by default
+ // TODO: should it be part of the cache implementations or can we assume all caches would benefit from it?
+ // It makes sense for caches that use IO (disk, network) or need to deserialize the state but could also be a global option
+
+ var cacheEntry = await _outputCacheEntryDispatcher.ScheduleAsync(cacheContext.CacheKey, (Store: _store, CacheContext: cacheContext), static async (key, state) => await OutputCacheEntryFormatter.GetAsync(key, state.Store, state.CacheContext.HttpContext.RequestAborted));
+
+ if (await TryServeCachedResponseAsync(cacheContext, cacheEntry, policies))
+ {
+ return true;
+ }
+
+ if (HeaderUtilities.ContainsCacheDirective(cacheContext.HttpContext.Request.Headers.CacheControl, CacheControlHeaderValue.OnlyIfCachedString))
+ {
+ _logger.GatewayTimeoutServed();
+ cacheContext.HttpContext.Response.StatusCode = StatusCodes.Status504GatewayTimeout;
+ return true;
+ }
+
+ _logger.NoResponseServed();
+ return false;
+ }
+
+ internal void CreateCacheKey(OutputCacheContext context)
+ {
+ if (!string.IsNullOrEmpty(context.CacheKey))
+ {
+ return;
+ }
+
+ var varyHeaderNames = context.CacheVaryByRules.HeaderNames;
+ var varyRouteValueNames = context.CacheVaryByRules.RouteValueNames;
+ var varyQueryKeys = context.CacheVaryByRules.QueryKeys;
+ var varyByCustomKeys = context.CacheVaryByRules.HasVaryByCustom ? context.CacheVaryByRules.VaryByCustom : null;
+ var varyByPrefix = context.CacheVaryByRules.VaryByPrefix;
+
+ // Check if any vary rules exist
+ if (!StringValues.IsNullOrEmpty(varyHeaderNames) || !StringValues.IsNullOrEmpty(varyRouteValueNames) || !StringValues.IsNullOrEmpty(varyQueryKeys) || !StringValues.IsNullOrEmpty(varyByPrefix) || varyByCustomKeys?.Count > 0)
+ {
+ // Normalize order and casing of vary by rules
+ var normalizedVaryHeaderNames = GetOrderCasingNormalizedStringValues(varyHeaderNames);
+ var normalizedVaryRouteValueNames = GetOrderCasingNormalizedStringValues(varyRouteValueNames);
+ var normalizedVaryQueryKeys = GetOrderCasingNormalizedStringValues(varyQueryKeys);
+ var normalizedVaryByCustom = GetOrderCasingNormalizedDictionary(varyByCustomKeys);
+
+ // Update vary rules with normalized values
+ context.CacheVaryByRules.VaryByCustom.Clear();
+ context.CacheVaryByRules.VaryByPrefix = varyByPrefix + normalizedVaryByCustom;
+ context.CacheVaryByRules.HeaderNames = normalizedVaryHeaderNames;
+ context.CacheVaryByRules.RouteValueNames = normalizedVaryRouteValueNames;
+ context.CacheVaryByRules.QueryKeys = normalizedVaryQueryKeys;
+
+ // TODO: Add same condition on LogLevel in Response Caching
+ // Always overwrite the CachedVaryByRules to update the expiry information
+ if (_logger.IsEnabled(LogLevel.Debug))
+ {
+ _logger.VaryByRulesUpdated(normalizedVaryHeaderNames.ToString(), normalizedVaryQueryKeys.ToString(), normalizedVaryRouteValueNames.ToString());
+ }
+ }
+
+ context.CacheKey = _keyProvider.CreateStorageKey(context);
+ }
+
+ /// <summary>
+ /// Finalize cache headers.
+ /// </summary>
+ /// <param name="context"></param>
+ internal void FinalizeCacheHeaders(OutputCacheContext context)
+ {
+ if (context.AllowCacheStorage)
+ {
+ // Create the cache entry now
+ var response = context.HttpContext.Response;
+ var headers = response.Headers;
+
+ context.CachedResponseValidFor = context.ResponseExpirationTimeSpan ?? _options.DefaultExpirationTimeSpan;
+
+ // Setting the date on the raw response headers.
+ headers.Date = HeaderUtilities.FormatDate(context.ResponseTime!.Value);
+
+ // Store the response on the state
+ context.CachedResponse = new OutputCacheEntry
+ {
+ Created = context.ResponseTime!.Value,
+ StatusCode = response.StatusCode,
+ Headers = new HeaderDictionary(),
+ Tags = context.Tags.ToArray()
+ };
+
+ foreach (var header in headers)
+ {
+ if (!string.Equals(header.Key, HeaderNames.Age, StringComparison.OrdinalIgnoreCase))
+ {
+ context.CachedResponse.Headers[header.Key] = header.Value;
+ }
+ }
+
+ return;
+ }
+
+ context.OutputCacheStream.DisableBuffering();
+ }
+
+ /// <summary>
+ /// Stores the response body
+ /// </summary>
+ internal async ValueTask FinalizeCacheBodyAsync(OutputCacheContext context)
+ {
+ if (context.AllowCacheStorage && context.OutputCacheStream.BufferingEnabled)
+ {
+ // If AllowCacheLookup is false, the cache key was not created
+ CreateCacheKey(context);
+
+ var contentLength = context.HttpContext.Response.ContentLength;
+ var cachedResponseBody = context.OutputCacheStream.GetCachedResponseBody();
+ if (!contentLength.HasValue || contentLength == cachedResponseBody.Length
+ || (cachedResponseBody.Length == 0
+ && HttpMethods.IsHead(context.HttpContext.Request.Method)))
+ {
+ var response = context.HttpContext.Response;
+ // Add a content-length if required
+ if (!response.ContentLength.HasValue && StringValues.IsNullOrEmpty(response.Headers.TransferEncoding))
+ {
+ context.CachedResponse.Headers.ContentLength = cachedResponseBody.Length;
+ }
+
+ context.CachedResponse.Body = cachedResponseBody;
+ _logger.ResponseCached();
+
+ if (string.IsNullOrEmpty(context.CacheKey))
+ {
+ throw new InvalidOperationException("Cache key must be defined");
+ }
+
+ await OutputCacheEntryFormatter.StoreAsync(context.CacheKey, context.CachedResponse, context.CachedResponseValidFor, _store, context.HttpContext.RequestAborted);
+ }
+ else
+ {
+ _logger.ResponseContentLengthMismatchNotCached();
+ }
+ }
+ else
+ {
+ _logger.ResponseNotCached();
+ }
+ }
+
+ /// <summary>
+ /// Mark the response as started and set the response time if no response was started yet.
+ /// </summary>
+ /// <param name="context"></param>
+ /// <returns><c>true</c> if the response was not started before this call; otherwise <c>false</c>.</returns>
+ private bool OnStartResponse(OutputCacheContext context)
+ {
+ if (!context.ResponseStarted)
+ {
+ context.ResponseStarted = true;
+ context.ResponseTime = _options.SystemClock.UtcNow;
+
+ return true;
+ }
+ return false;
+ }
+
+ internal void StartResponse(OutputCacheContext context)
+ {
+ if (OnStartResponse(context))
+ {
+ FinalizeCacheHeaders(context);
+ }
+ }
+
+ internal static void AddOutputCacheFeature(OutputCacheContext context)
+ {
+ if (context.HttpContext.Features.Get<IOutputCacheFeature>() != null)
+ {
+ throw new InvalidOperationException($"Another instance of {nameof(OutputCacheFeature)} already exists. Only one instance of {nameof(OutputCacheMiddleware)} can be configured for an application.");
+ }
+
+ context.HttpContext.Features.Set<IOutputCacheFeature>(new OutputCacheFeature(context));
+ }
+
+ internal void ShimResponseStream(OutputCacheContext context)
+ {
+ // Shim response stream
+ context.OriginalResponseStream = context.HttpContext.Response.Body;
+ context.OutputCacheStream = new OutputCacheStream(
+ context.OriginalResponseStream,
+ _options.MaximumBodySize,
+ StreamUtilities.BodySegmentSize,
+ () => StartResponse(context));
+ context.HttpContext.Response.Body = context.OutputCacheStream;
+ }
+
+ internal static void RemoveOutputCacheFeature(HttpContext context) =>
+ context.Features.Set<IOutputCacheFeature?>(null);
+
+ internal static void UnshimResponseStream(OutputCacheContext context)
+ {
+ // Unshim response stream
+ context.HttpContext.Response.Body = context.OriginalResponseStream;
+
+ // Remove IOutputCachingFeature
+ RemoveOutputCacheFeature(context.HttpContext);
+ }
+
+ internal bool ContentIsNotModified(OutputCacheContext context)
+ {
+ var cachedResponseHeaders = context.CachedResponse.Headers;
+ var ifNoneMatchHeader = context.HttpContext.Request.Headers.IfNoneMatch;
+
+ if (!StringValues.IsNullOrEmpty(ifNoneMatchHeader))
+ {
+ if (ifNoneMatchHeader.Count == 1 && StringSegment.Equals(ifNoneMatchHeader[0], EntityTagHeaderValue.Any.Tag, StringComparison.OrdinalIgnoreCase))
+ {
+ _logger.NotModifiedIfNoneMatchStar();
+ return true;
+ }
+
+ if (!StringValues.IsNullOrEmpty(cachedResponseHeaders[HeaderNames.ETag])
+ && EntityTagHeaderValue.TryParse(cachedResponseHeaders[HeaderNames.ETag].ToString(), out var eTag)
+ && EntityTagHeaderValue.TryParseList(ifNoneMatchHeader, out var ifNoneMatchEtags))
+ {
+ for (var i = 0; i < ifNoneMatchEtags?.Count; i++)
+ {
+ var requestETag = ifNoneMatchEtags[i];
+ if (eTag.Compare(requestETag, useStrongComparison: false))
+ {
+ _logger.NotModifiedIfNoneMatchMatched(requestETag);
+ return true;
+ }
+ }
+ }
+ }
+ else
+ {
+ var ifModifiedSince = context.HttpContext.Request.Headers.IfModifiedSince;
+ if (!StringValues.IsNullOrEmpty(ifModifiedSince))
+ {
+ if (!HeaderUtilities.TryParseDate(cachedResponseHeaders[HeaderNames.LastModified].ToString(), out var modified) &&
+ !HeaderUtilities.TryParseDate(cachedResponseHeaders[HeaderNames.Date].ToString(), out modified))
+ {
+ return false;
+ }
+
+ if (HeaderUtilities.TryParseDate(ifModifiedSince.ToString(), out var modifiedSince) &&
+ modified <= modifiedSince)
+ {
+ _logger.NotModifiedIfModifiedSinceSatisfied(modified, modifiedSince);
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ // Normalize order and casing
+ internal static StringValues GetOrderCasingNormalizedStringValues(StringValues stringValues)
+ {
+ if (stringValues.Count == 0)
+ {
+ return StringValues.Empty;
+ }
+ else if (stringValues.Count == 1)
+ {
+ return new StringValues(stringValues.ToString().ToUpperInvariant());
+ }
+ else
+ {
+ var originalArray = stringValues.ToArray();
+ var newArray = new string[originalArray.Length];
+
+ for (var i = 0; i < originalArray.Length; i++)
+ {
+ newArray[i] = originalArray[i]!.ToUpperInvariant();
+ }
+
+ // Since the casing has already been normalized, use Ordinal comparison
+ Array.Sort(newArray, StringComparer.Ordinal);
+
+ return new StringValues(newArray);
+ }
+ }
+
+ internal static StringValues GetOrderCasingNormalizedDictionary(IDictionary<string, string>? dictionary)
+ {
+ const char KeySubDelimiter = '\x1f';
+
+ if (dictionary == null || dictionary.Count == 0)
+ {
+ return StringValues.Empty;
+ }
+
+ var newArray = new string[dictionary.Count];
+
+ var i = 0;
+ foreach (var (key, value) in dictionary)
+ {
+ newArray[i++] = $"{key.ToUpperInvariant()}{KeySubDelimiter}{value}";
+ }
+
+ // Since the casing has already been normalized, use Ordinal comparison
+ Array.Sort(newArray, StringComparer.Ordinal);
+
+ return new StringValues(newArray);
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheOptions.cs b/src/Middleware/OutputCaching/src/OutputCacheOptions.cs
new file mode 100644
index 0000000000..fdd316d4d3
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheOptions.cs
@@ -0,0 +1,96 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.ComponentModel;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Options for configuring the <see cref="OutputCacheMiddleware"/>.
+/// </summary>
+public class OutputCacheOptions
+{
+ /// <summary>
+ /// The size limit for the output cache middleware in bytes. The default is set to 100 MB.
+ /// When this limit is exceeded, no new responses will be cached until older entries are
+ /// evicted.
+ /// </summary>
+ public long SizeLimit { get; set; } = 100 * 1024 * 1024;
+
+ /// <summary>
+ /// The largest cacheable size for the response body in bytes. The default is set to 64 MB.
+ /// If the response body exceeds this limit, it will not be cached by the <see cref="OutputCacheMiddleware"/>.
+ /// </summary>
+ public long MaximumBodySize { get; set; } = 64 * 1024 * 1024;
+
+ /// <summary>
+ /// The duration a response is cached when no specific value is defined by a policy. The default is set to 60 seconds.
+ /// </summary>
+ public TimeSpan DefaultExpirationTimeSpan { get; set; } = TimeSpan.FromSeconds(60);
+
+ /// <summary>
+ /// <c>true</c> if request paths are case-sensitive; otherwise <c>false</c>. The default is to treat paths as case-insensitive.
+ /// </summary>
+ public bool UseCaseSensitivePaths { get; set; }
+
+ /// <summary>
+ /// Gets the application <see cref="IServiceProvider"/>.
+ /// </summary>
+ public IServiceProvider ApplicationServices { get; internal set; } = default!;
+
+ internal Dictionary<string, IOutputCachePolicy>? NamedPolicies { get; set; }
+
+ internal List<IOutputCachePolicy>? BasePolicies { get; set; }
+
+ /// <summary>
+ /// For testing purposes only.
+ /// </summary>
+ [EditorBrowsable(EditorBrowsableState.Never)]
+ internal ISystemClock SystemClock { get; set; } = new SystemClock();
+
+ /// <summary>
+ /// Defines a <see cref="IOutputCachePolicy"/> which can be referenced by name.
+ /// </summary>
+ /// <param name="name">The name of the policy.</param>
+ /// <param name="policy">The policy to add</param>
+ public void AddPolicy(string name, IOutputCachePolicy policy)
+ {
+ NamedPolicies ??= new Dictionary<string, IOutputCachePolicy>(StringComparer.OrdinalIgnoreCase);
+ NamedPolicies[name] = policy;
+ }
+
+ /// <summary>
+ /// Defines a <see cref="IOutputCachePolicy"/> which can be referenced by name.
+ /// </summary>
+ /// <param name="name">The name of the policy.</param>
+ /// <param name="build">an action on <see cref="OutputCachePolicyBuilder"/>.</param>
+ public void AddPolicy(string name, Action<OutputCachePolicyBuilder> build)
+ {
+ var builder = new OutputCachePolicyBuilder();
+ build(builder);
+ NamedPolicies ??= new Dictionary<string, IOutputCachePolicy>(StringComparer.OrdinalIgnoreCase);
+ NamedPolicies[name] = builder.Build();
+ }
+
+ /// <summary>
+ /// Adds an <see cref="IOutputCachePolicy"/> instance to base policies.
+ /// </summary>
+ /// <param name="policy">The policy to add</param>
+ public void AddBasePolicy(IOutputCachePolicy policy)
+ {
+ BasePolicies ??= new();
+ BasePolicies.Add(policy);
+ }
+
+ /// <summary>
+ /// Builds and adds an <see cref="IOutputCachePolicy"/> instance to base policies.
+ /// </summary>
+ /// <param name="build">an action on <see cref="OutputCachePolicyBuilder"/>.</param>
+ public void AddBasePolicy(Action<OutputCachePolicyBuilder> build)
+ {
+ var builder = new OutputCachePolicyBuilder();
+ build(builder);
+ BasePolicies ??= new();
+ BasePolicies.Add(builder.Build());
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheOptionsSetup.cs b/src/Middleware/OutputCaching/src/OutputCacheOptionsSetup.cs
new file mode 100644
index 0000000000..76353e2d79
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheOptionsSetup.cs
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class OutputCacheOptionsSetup : IConfigureOptions<OutputCacheOptions>
+{
+ private readonly IServiceProvider _services;
+
+ public OutputCacheOptionsSetup(IServiceProvider services)
+ {
+ _services = services;
+ }
+
+ public void Configure(OutputCacheOptions options)
+ {
+ options.ApplicationServices = _services;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCachePolicyBuilder.cs b/src/Middleware/OutputCaching/src/OutputCachePolicyBuilder.cs
new file mode 100644
index 0000000000..b386083e91
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCachePolicyBuilder.cs
@@ -0,0 +1,269 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.OutputCaching.Policies;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Provides helper methods to create custom policies.
+/// </summary>
+public sealed class OutputCachePolicyBuilder
+{
+ private const DynamicallyAccessedMemberTypes ActivatorAccessibility = DynamicallyAccessedMemberTypes.PublicConstructors;
+
+ private IOutputCachePolicy? _builtPolicy;
+ private readonly List<IOutputCachePolicy> _policies = new();
+ private List<Func<OutputCacheContext, CancellationToken, ValueTask<bool>>>? _requirements;
+
+ /// <summary>
+ /// Creates a new <see cref="OutputCachePolicyBuilder"/> instance.
+ /// </summary>
+ public OutputCachePolicyBuilder()
+ {
+ _builtPolicy = null;
+ _policies.Add(DefaultPolicy.Instance);
+ }
+
+ internal OutputCachePolicyBuilder AddPolicy(IOutputCachePolicy policy)
+ {
+ _builtPolicy = null;
+ _policies.Add(policy);
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a dynamically resolved policy.
+ /// </summary>
+ /// <param name="policyType">The type of policy to add</param>
+ public OutputCachePolicyBuilder AddPolicy([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type policyType)
+ {
+ return AddPolicy(new TypedPolicy(policyType));
+ }
+
+ /// <summary>
+ /// Adds a dynamically resolved policy.
+ /// </summary>
+ /// <typeparam name="T">The policy type.</typeparam>
+ public OutputCachePolicyBuilder AddPolicy<[DynamicallyAccessedMembers(ActivatorAccessibility)] T>() where T : IOutputCachePolicy
+ {
+ return AddPolicy(typeof(T));
+ }
+
+ /// <summary>
+ /// Adds a requirement to the current policy.
+ /// </summary>
+ /// <param name="predicate">The predicate applied to the policy.</param>
+ public OutputCachePolicyBuilder With(Func<OutputCacheContext, CancellationToken, ValueTask<bool>> predicate)
+ {
+ ArgumentNullException.ThrowIfNull(predicate);
+
+ _builtPolicy = null;
+ _requirements ??= new();
+ _requirements.Add(predicate);
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a requirement to the current policy.
+ /// </summary>
+ /// <param name="predicate">The predicate applied to the policy.</param>
+ public OutputCachePolicyBuilder With(Func<OutputCacheContext, bool> predicate)
+ {
+ ArgumentNullException.ThrowIfNull(predicate);
+
+ _builtPolicy = null;
+ _requirements ??= new();
+ _requirements.Add((c, t) => ValueTask.FromResult(predicate(c)));
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by query strings.
+ /// </summary>
+ /// <param name="queryKeys">The query keys to vary the cached responses by. Leave empty to ignore all query strings.</param>
+ /// <remarks>
+ /// By default all query keys vary the cache entries. However when specific query keys are specified only these are then taken into account.
+ /// </remarks>
+ public OutputCachePolicyBuilder VaryByQuery(params string[] queryKeys)
+ {
+ ArgumentNullException.ThrowIfNull(queryKeys);
+
+ return AddPolicy(new VaryByQueryPolicy(queryKeys));
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by header.
+ /// </summary>
+ /// <param name="headerNames">The header names to vary the cached responses by.</param>
+ public OutputCachePolicyBuilder VaryByHeader(params string[] headerNames)
+ {
+ ArgumentNullException.ThrowIfNull(headerNames);
+
+ return AddPolicy(new VaryByHeaderPolicy(headerNames));
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by route value.
+ /// </summary>
+ /// <param name="routeValueNames">The route value names to vary the cached responses by.</param>
+ public OutputCachePolicyBuilder VaryByRouteValue(params string[] routeValueNames)
+ {
+ ArgumentNullException.ThrowIfNull(routeValueNames);
+
+ return AddPolicy(new VaryByRouteValuePolicy(routeValueNames));
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by custom values.
+ /// </summary>
+ /// <param name="varyBy">The value to vary the cached responses by.</param>
+ public OutputCachePolicyBuilder VaryByValue(Func<HttpContext, CancellationToken, ValueTask<string>> varyBy)
+ {
+ ArgumentNullException.ThrowIfNull(varyBy);
+
+ return AddPolicy(new VaryByValuePolicy(varyBy));
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by custom key/value.
+ /// </summary>
+ /// <param name="varyBy">The key/value to vary the cached responses by.</param>
+ public OutputCachePolicyBuilder VaryByValue(Func<HttpContext, CancellationToken, ValueTask<KeyValuePair<string, string>>> varyBy)
+ {
+ ArgumentNullException.ThrowIfNull(varyBy);
+
+ return AddPolicy(new VaryByValuePolicy(varyBy));
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by custom values.
+ /// </summary>
+ /// <param name="varyBy">The value to vary the cached responses by.</param>
+ public OutputCachePolicyBuilder VaryByValue(Func<HttpContext, string> varyBy)
+ {
+ ArgumentNullException.ThrowIfNull(varyBy);
+
+ return AddPolicy(new VaryByValuePolicy(varyBy));
+ }
+
+ /// <summary>
+ /// Adds a policy to vary the cached responses by custom key/value.
+ /// </summary>
+ /// <param name="varyBy">The key/value to vary the cached responses by.</param>
+ public OutputCachePolicyBuilder VaryByValue(Func<HttpContext, KeyValuePair<string, string>> varyBy)
+ {
+ ArgumentNullException.ThrowIfNull(varyBy);
+
+ return AddPolicy(new VaryByValuePolicy(varyBy));
+ }
+
+ /// <summary>
+ /// Adds a policy to tag the cached response.
+ /// </summary>
+ /// <param name="tags">The tags to add to the cached reponse.</param>
+ public OutputCachePolicyBuilder Tag(params string[] tags)
+ {
+ ArgumentNullException.ThrowIfNull(tags);
+
+ return AddPolicy(new TagsPolicy(tags));
+ }
+
+ /// <summary>
+ /// Adds a policy to change the cached response expiration.
+ /// </summary>
+ /// <param name="expiration">The expiration of the cached reponse.</param>
+ public OutputCachePolicyBuilder Expire(TimeSpan expiration)
+ {
+ return AddPolicy(new ExpirationPolicy(expiration));
+ }
+
+ /// <summary>
+ /// Adds a policy to change the request locking strategy.
+ /// </summary>
+ /// <param name="lockResponse">Whether the request should be locked.</param>
+ public OutputCachePolicyBuilder AllowLocking(bool lockResponse = true)
+ {
+ return AddPolicy(lockResponse ? LockingPolicy.Enabled : LockingPolicy.Disabled);
+ }
+
+ /// <summary>
+ /// Clears the current policies.
+ /// </summary>
+ /// <remarks>It also removed the default cache policy.</remarks>
+ public OutputCachePolicyBuilder Clear()
+ {
+ _builtPolicy = null;
+ if (_requirements != null)
+ {
+ _requirements.Clear();
+ }
+ _policies.Clear();
+ return this;
+ }
+
+ /// <summary>
+ /// Clears the policies and adds one preventing any caching logic to happen.
+ /// </summary>
+ /// <remarks>
+ /// The cache key will never be computed.
+ /// </remarks>
+ public OutputCachePolicyBuilder NoCache()
+ {
+ _policies.Clear();
+ return AddPolicy(EnableCachePolicy.Disabled);
+ }
+
+ /// <summary>
+ /// Enables caching for the current request if not already enabled.
+ /// </summary>
+ public OutputCachePolicyBuilder Cache()
+ {
+ // If no custom policy is added, the DefaultPolicy is already "enabled".
+ if (_policies.Count != 1 || _policies[0] != DefaultPolicy.Instance)
+ {
+ AddPolicy(EnableCachePolicy.Enabled);
+ }
+
+ return this;
+ }
+
+ /// <summary>
+ /// Creates the <see cref="IOutputCachePolicy"/>.
+ /// </summary>
+ /// <returns>The<see cref="IOutputCachePolicy"/> instance.</returns>
+ internal IOutputCachePolicy Build()
+ {
+ if (_builtPolicy != null)
+ {
+ return _builtPolicy;
+ }
+
+ var policies = _policies.Count == 1
+ ? _policies[0]
+ : new CompositePolicy(_policies.ToArray())
+ ;
+
+ // If the policy was built with requirements, wrap it
+ if (_requirements != null && _requirements.Any())
+ {
+ policies = new PredicatePolicy(async c =>
+ {
+ foreach (var r in _requirements)
+ {
+ if (!await r(c, c.HttpContext.RequestAborted))
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }, policies);
+ }
+
+ return _builtPolicy = policies;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/OutputCacheServiceCollectionExtensions.cs b/src/Middleware/OutputCaching/src/OutputCacheServiceCollectionExtensions.cs
new file mode 100644
index 0000000000..b0184e1339
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/OutputCacheServiceCollectionExtensions.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.OutputCaching;
+using Microsoft.AspNetCore.OutputCaching.Memory;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+using Microsoft.Extensions.ObjectPool;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+/// <summary>
+/// Extension methods for the OutputCaching middleware.
+/// </summary>
+public static class OutputCacheServiceCollectionExtensions
+{
+ /// <summary>
+ /// Add output caching services.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
+ /// <returns></returns>
+ public static IServiceCollection AddOutputCache(this IServiceCollection services)
+ {
+ ArgumentNullException.ThrowIfNull(services);
+
+ services.AddTransient<IConfigureOptions<OutputCacheOptions>, OutputCacheOptionsSetup>();
+
+ services.TryAddSingleton<ObjectPoolProvider, DefaultObjectPoolProvider>();
+
+ services.TryAddSingleton<IOutputCacheStore>(sp =>
+ {
+ var outputCacheOptions = sp.GetRequiredService<IOptions<OutputCacheOptions>>();
+ return new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions
+ {
+ SizeLimit = outputCacheOptions.Value.SizeLimit
+ }));
+ });
+ return services;
+ }
+
+ /// <summary>
+ /// Add output caching services and configure the related options.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
+ /// <param name="configureOptions">A delegate to configure the <see cref="OutputCacheOptions"/>.</param>
+ /// <returns></returns>
+ public static IServiceCollection AddOutputCache(this IServiceCollection services, Action<OutputCacheOptions> configureOptions)
+ {
+ ArgumentNullException.ThrowIfNull(services);
+ ArgumentNullException.ThrowIfNull(configureOptions);
+
+ services.Configure(configureOptions);
+ services.AddOutputCache();
+
+ return services;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/CompositePolicy.cs b/src/Middleware/OutputCaching/src/Policies/CompositePolicy.cs
new file mode 100644
index 0000000000..b82b54386d
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/CompositePolicy.cs
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching.Policies;
+
+/// <summary>
+/// A composite policy.
+/// </summary>
+internal sealed class CompositePolicy : IOutputCachePolicy
+{
+ private readonly IOutputCachePolicy[] _policies;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="CompositePolicy"/>
+ /// </summary>
+ /// <param name="policies">The policies to include.</param>
+ public CompositePolicy(params IOutputCachePolicy[] policies)
+ {
+ _policies = policies;
+ }
+
+ /// <inheritdoc/>
+ async ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ foreach (var policy in _policies)
+ {
+ await policy.CacheRequestAsync(context, cancellationToken);
+ }
+ }
+
+ /// <inheritdoc/>
+ async ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ foreach (var policy in _policies)
+ {
+ await policy.ServeFromCacheAsync(context, cancellationToken);
+ }
+ }
+
+ /// <inheritdoc/>
+ async ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ foreach (var policy in _policies)
+ {
+ await policy.ServeResponseAsync(context, cancellationToken);
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/DefaultPolicy.cs b/src/Middleware/OutputCaching/src/Policies/DefaultPolicy.cs
new file mode 100644
index 0000000000..cc9ea67ec2
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/DefaultPolicy.cs
@@ -0,0 +1,83 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy which caches un-authenticated, GET and HEAD, 200 responses.
+/// </summary>
+internal sealed class DefaultPolicy : IOutputCachePolicy
+{
+ public static readonly DefaultPolicy Instance = new();
+
+ private DefaultPolicy()
+ {
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ var attemptOutputCaching = AttemptOutputCaching(context);
+ context.EnableOutputCaching = true;
+ context.AllowCacheLookup = attemptOutputCaching;
+ context.AllowCacheStorage = attemptOutputCaching;
+ context.AllowLocking = true;
+
+ // Vary by any query by default
+ context.CacheVaryByRules.QueryKeys = "*";
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ var response = context.HttpContext.Response;
+
+ // Verify existence of cookie headers
+ if (!StringValues.IsNullOrEmpty(response.Headers.SetCookie))
+ {
+ context.AllowCacheStorage = false;
+ return ValueTask.CompletedTask;
+ }
+
+ // Check response code
+ if (response.StatusCode != StatusCodes.Status200OK)
+ {
+ context.AllowCacheStorage = false;
+ return ValueTask.CompletedTask;
+ }
+
+ return ValueTask.CompletedTask;
+ }
+
+ private static bool AttemptOutputCaching(OutputCacheContext context)
+ {
+ // Check if the current request fulfills the requirements to be cached
+
+ var request = context.HttpContext.Request;
+
+ // Verify the method
+ if (!HttpMethods.IsGet(request.Method) && !HttpMethods.IsHead(request.Method))
+ {
+ return false;
+ }
+
+ // Verify existence of authorization headers
+ if (!StringValues.IsNullOrEmpty(request.Headers.Authorization) || request.HttpContext.User?.Identity?.IsAuthenticated == true)
+ {
+ return false;
+ }
+
+ return true;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/EnableCachePolicy.cs b/src/Middleware/OutputCaching/src/Policies/EnableCachePolicy.cs
new file mode 100644
index 0000000000..3ebb8d4764
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/EnableCachePolicy.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy that enables caching
+/// </summary>
+internal sealed class EnableCachePolicy : IOutputCachePolicy
+{
+ public static readonly EnableCachePolicy Enabled = new();
+ public static readonly EnableCachePolicy Disabled = new();
+
+ private EnableCachePolicy()
+ {
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ context.EnableOutputCaching = this == Enabled;
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/ExpirationPolicy.cs b/src/Middleware/OutputCaching/src/Policies/ExpirationPolicy.cs
new file mode 100644
index 0000000000..5a9f963f63
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/ExpirationPolicy.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy that defines a custom expiration duration.
+/// </summary>
+internal sealed class ExpirationPolicy : IOutputCachePolicy
+{
+ private readonly TimeSpan _expiration;
+
+ /// <summary>
+ /// Creates a new <see cref="ExpirationPolicy"/> instance.
+ /// </summary>
+ /// <param name="expiration">The expiration duration.</param>
+ public ExpirationPolicy(TimeSpan expiration)
+ {
+ _expiration = expiration;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ context.ResponseExpirationTimeSpan = _expiration;
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/LockingPolicy.cs b/src/Middleware/OutputCaching/src/Policies/LockingPolicy.cs
new file mode 100644
index 0000000000..504ac4e6a2
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/LockingPolicy.cs
@@ -0,0 +1,47 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy that changes the locking behavior.
+/// </summary>
+internal sealed class LockingPolicy : IOutputCachePolicy
+{
+ private readonly bool _lockResponse;
+
+ private LockingPolicy(bool lockResponse)
+ {
+ _lockResponse = lockResponse;
+ }
+
+ /// <summary>
+ /// A policy that enables locking.
+ /// </summary>
+ public static readonly LockingPolicy Enabled = new(true);
+
+ /// <summary>
+ /// A policy that disables locking.
+ /// </summary>
+ public static readonly LockingPolicy Disabled = new(false);
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ context.AllowLocking = _lockResponse;
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/NamedPolicy.cs b/src/Middleware/OutputCaching/src/Policies/NamedPolicy.cs
new file mode 100644
index 0000000000..43ba24e9a0
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/NamedPolicy.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A named policy.
+/// </summary>
+internal sealed class NamedPolicy : IOutputCachePolicy
+{
+ private readonly string _policyName;
+ private IOptions<OutputCacheOptions>? _options;
+ private readonly object _synLock = new();
+
+ /// <summary>
+ /// Create a new <see cref="NamedPolicy"/> instance.
+ /// </summary>
+ /// <param name="policyName">The name of the profile.</param>
+ public NamedPolicy(string policyName)
+ {
+ _policyName = policyName;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ var policy = GetProfilePolicy(context);
+
+ if (policy == null)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ return policy.ServeResponseAsync(context, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ var policy = GetProfilePolicy(context);
+
+ if (policy == null)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ return policy.ServeFromCacheAsync(context, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ var policy = GetProfilePolicy(context);
+
+ if (policy == null)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ return policy.CacheRequestAsync(context, cancellationToken); ;
+ }
+
+ internal IOutputCachePolicy? GetProfilePolicy(OutputCacheContext context)
+ {
+ if (_options == null)
+ {
+ lock (_synLock)
+ {
+ _options ??= context.HttpContext.RequestServices.GetRequiredService<IOptions<OutputCacheOptions>>();
+ }
+ }
+
+ var policies = _options!.Value.NamedPolicies;
+
+ return policies != null && policies.TryGetValue(_policyName, out var cacheProfile)
+ ? cacheProfile
+ : null;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/NoLookupPolicy.cs b/src/Middleware/OutputCaching/src/Policies/NoLookupPolicy.cs
new file mode 100644
index 0000000000..d6fee5da0d
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/NoLookupPolicy.cs
@@ -0,0 +1,36 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy that prevents the response from being served from cache.
+/// </summary>
+internal sealed class NoLookupPolicy : IOutputCachePolicy
+{
+ public static NoLookupPolicy Instance = new();
+
+ private NoLookupPolicy()
+ {
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ context.AllowCacheLookup = false;
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/NoStorePolicy.cs b/src/Middleware/OutputCaching/src/Policies/NoStorePolicy.cs
new file mode 100644
index 0000000000..11a22b6c5e
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/NoStorePolicy.cs
@@ -0,0 +1,36 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy that prevents the response from being cached.
+/// </summary>
+internal sealed class NoStorePolicy : IOutputCachePolicy
+{
+ public static NoStorePolicy Instance = new();
+
+ private NoStorePolicy()
+ {
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ context.AllowCacheStorage = false;
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/OutputCacheConventionBuilderExtensions.cs b/src/Middleware/OutputCaching/src/Policies/OutputCacheConventionBuilderExtensions.cs
new file mode 100644
index 0000000000..050fbeb84e
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/OutputCacheConventionBuilderExtensions.cs
@@ -0,0 +1,81 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.OutputCaching;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+/// <summary>
+/// A set of endpoint extension methods.
+/// </summary>
+public static class OutputCacheConventionBuilderExtensions
+{
+ /// <summary>
+ /// Marks an endpoint to be cached with the default policy.
+ /// </summary>
+ public static TBuilder CacheOutput<TBuilder>(this TBuilder builder) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ // Enable caching if this method is invoked on an endpoint, extra policies can disable it
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(DefaultPolicy.Instance);
+ });
+ return builder;
+ }
+
+ /// <summary>
+ /// Marks an endpoint to be cached with the specified policy.
+ /// </summary>
+ public static TBuilder CacheOutput<TBuilder>(this TBuilder builder, IOutputCachePolicy policy) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ // Enable caching if this method is invoked on an endpoint, extra policies can disable it
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(policy);
+ });
+ return builder;
+ }
+
+ /// <summary>
+ /// Marks an endpoint to be cached using the specified policy builder.
+ /// </summary>
+ public static TBuilder CacheOutput<TBuilder>(this TBuilder builder, Action<OutputCachePolicyBuilder> policy) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ var outputCachePolicyBuilder = new OutputCachePolicyBuilder();
+
+ policy?.Invoke(outputCachePolicyBuilder);
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(outputCachePolicyBuilder.Build());
+ });
+
+ return builder;
+ }
+
+ /// <summary>
+ /// Marks an endpoint to be cached using a named policy.
+ /// </summary>
+ public static TBuilder CacheOutput<TBuilder>(this TBuilder builder, string policyName) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ var policy = new NamedPolicy(policyName);
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(policy);
+ });
+
+ return builder;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/PredicatePolicy.cs b/src/Middleware/OutputCaching/src/Policies/PredicatePolicy.cs
new file mode 100644
index 0000000000..d58c67fa57
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/PredicatePolicy.cs
@@ -0,0 +1,76 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching.Policies;
+
+/// <summary>
+/// A policy that adds a requirement to another policy.
+/// </summary>
+internal sealed class PredicatePolicy : IOutputCachePolicy
+{
+ // TODO: Accept a non async predicate too?
+
+ private readonly Func<OutputCacheContext, ValueTask<bool>> _predicate;
+ private readonly IOutputCachePolicy _policy;
+
+ /// <summary>
+ /// Creates a new <see cref="PredicatePolicy"/> instance.
+ /// </summary>
+ /// <param name="asyncPredicate">The predicate.</param>
+ /// <param name="policy">The policy.</param>
+ public PredicatePolicy(Func<OutputCacheContext, ValueTask<bool>> asyncPredicate, IOutputCachePolicy policy)
+ {
+ _predicate = asyncPredicate;
+ _policy = policy;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ExecuteAwaited(static (policy, context, cancellationToken) => policy.CacheRequestAsync(context, cancellationToken), _policy, context, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ExecuteAwaited(static (policy, context, cancellationToken) => policy.ServeFromCacheAsync(context, cancellationToken), _policy, context, cancellationToken);
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ExecuteAwaited(static (policy, context, cancellationToken) => policy.ServeResponseAsync(context, cancellationToken), _policy, context, cancellationToken);
+ }
+
+ private ValueTask ExecuteAwaited(Func<IOutputCachePolicy, OutputCacheContext, CancellationToken, ValueTask> action, IOutputCachePolicy policy, OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(action);
+
+ if (_predicate == null)
+ {
+ return action(policy, context, cancellationToken);
+ }
+
+ var task = _predicate(context);
+
+ if (task.IsCompletedSuccessfully)
+ {
+ if (task.Result)
+ {
+ return action(policy, context, cancellationToken);
+ }
+
+ return ValueTask.CompletedTask;
+ }
+
+ return Awaited(task);
+
+ async ValueTask Awaited(ValueTask<bool> task)
+ {
+ if (await task)
+ {
+ await action(policy, context, cancellationToken);
+ }
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/TagsPolicy.cs b/src/Middleware/OutputCaching/src/Policies/TagsPolicy.cs
new file mode 100644
index 0000000000..070e2a66b1
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/TagsPolicy.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// A policy that defines custom tags on the cache entry.
+/// </summary>
+internal sealed class TagsPolicy : IOutputCachePolicy
+{
+ private readonly string[] _tags;
+
+ /// <summary>
+ /// Creates a new <see cref="TagsPolicy"/> instance.
+ /// </summary>
+ /// <param name="tags">The tags.</param>
+ public TagsPolicy(params string[] tags)
+ {
+ _tags = tags;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ foreach (var tag in _tags)
+ {
+ context.Tags.Add(tag);
+ }
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/TypedPolicy.cs b/src/Middleware/OutputCaching/src/Policies/TypedPolicy.cs
new file mode 100644
index 0000000000..96dfe7e7aa
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/TypedPolicy.cs
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.OutputCaching.Policies;
+
+/// <summary>
+/// A type base policy.
+/// </summary>
+internal sealed class TypedPolicy : IOutputCachePolicy
+{
+ private IOutputCachePolicy? _instance;
+
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ private readonly Type _policyType;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="TypedPolicy"/>
+ /// </summary>
+ /// <param name="policyType">The type of policy.</param>
+ public TypedPolicy([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type policyType)
+ {
+ ArgumentNullException.ThrowIfNull(policyType);
+
+ _policyType = policyType;
+ }
+
+ private IOutputCachePolicy? CreatePolicy(OutputCacheContext context)
+ {
+ var options = context.HttpContext.RequestServices.GetRequiredService<IOptions<OutputCacheOptions>>();
+ return _instance ??= ActivatorUtilities.CreateInstance(options.Value.ApplicationServices, _policyType) as IOutputCachePolicy;
+ }
+
+ /// <inheritdoc/>
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return CreatePolicy(context)?.CacheRequestAsync(context, cancellationToken) ?? ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc/>
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return CreatePolicy(context)?.ServeFromCacheAsync(context, cancellationToken) ?? ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc/>
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return CreatePolicy(context)?.ServeResponseAsync(context, cancellationToken) ?? ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/VaryByHeaderPolicy.cs b/src/Middleware/OutputCaching/src/Policies/VaryByHeaderPolicy.cs
new file mode 100644
index 0000000000..a110936678
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/VaryByHeaderPolicy.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// When applied, the cached content will be different for every value of the provided headers.
+/// </summary>
+internal sealed class VaryByHeaderPolicy : IOutputCachePolicy
+{
+ private readonly StringValues _headerNames;
+
+ /// <summary>
+ /// Creates a policy that doesn't vary the cached content based on headers.
+ /// </summary>
+ public VaryByHeaderPolicy()
+ {
+ }
+
+ /// <summary>
+ /// Creates a policy that varies the cached content based on the specified header name.
+ /// </summary>
+ public VaryByHeaderPolicy(string header)
+ {
+ ArgumentNullException.ThrowIfNull(header);
+
+ _headerNames = header;
+ }
+
+ /// <summary>
+ /// Creates a policy that varies the cached content based on the specified header names.
+ /// </summary>
+ public VaryByHeaderPolicy(params string[] headerNames)
+ {
+ ArgumentNullException.ThrowIfNull(headerNames);
+
+ _headerNames = headerNames;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ // No vary by header?
+ if (_headerNames.Count == 0)
+ {
+ context.CacheVaryByRules.HeaderNames = _headerNames;
+ return ValueTask.CompletedTask;
+ }
+
+ context.CacheVaryByRules.HeaderNames = StringValues.Concat(context.CacheVaryByRules.HeaderNames, _headerNames);
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/VaryByQueryPolicy.cs b/src/Middleware/OutputCaching/src/Policies/VaryByQueryPolicy.cs
new file mode 100644
index 0000000000..e415459644
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/VaryByQueryPolicy.cs
@@ -0,0 +1,72 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// When applied, the cached content will be different for every value of the provided query string keys.
+/// It also disables the default behavior which is to vary on all query string keys.
+/// </summary>
+internal sealed class VaryByQueryPolicy : IOutputCachePolicy
+{
+ private readonly StringValues _queryKeys;
+
+ /// <summary>
+ /// Creates a policy that doesn't vary the cached content based on query string.
+ /// </summary>
+ public VaryByQueryPolicy()
+ {
+ }
+
+ /// <summary>
+ /// Creates a policy that varies the cached content based on the specified query string key.
+ /// </summary>
+ public VaryByQueryPolicy(string queryKey)
+ {
+ _queryKeys = queryKey;
+ }
+
+ /// <summary>
+ /// Creates a policy that varies the cached content based on the specified query string keys.
+ /// </summary>
+ public VaryByQueryPolicy(params string[] queryKeys)
+ {
+ _queryKeys = queryKeys;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ // No vary by query?
+ if (_queryKeys.Count == 0)
+ {
+ context.CacheVaryByRules.QueryKeys = _queryKeys;
+ return ValueTask.CompletedTask;
+ }
+
+ // If the current key is "*" (default) replace it
+ if (context.CacheVaryByRules.QueryKeys.Count == 1 && string.Equals(context.CacheVaryByRules.QueryKeys[0], "*", StringComparison.Ordinal))
+ {
+ context.CacheVaryByRules.QueryKeys = _queryKeys;
+ return ValueTask.CompletedTask;
+ }
+
+ context.CacheVaryByRules.QueryKeys = StringValues.Concat(context.CacheVaryByRules.QueryKeys, _queryKeys);
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/VaryByRouteValuePolicy.cs b/src/Middleware/OutputCaching/src/Policies/VaryByRouteValuePolicy.cs
new file mode 100644
index 0000000000..d3a3686f14
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/VaryByRouteValuePolicy.cs
@@ -0,0 +1,68 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// When applied, the cached content will be different for every value of the provided route values.
+/// </summary>
+internal sealed class VaryByRouteValuePolicy : IOutputCachePolicy
+{
+ private readonly StringValues _routeValueNames;
+
+ /// <summary>
+ /// Creates a policy that doesn't vary the cached content based on route values.
+ /// </summary>
+ public VaryByRouteValuePolicy()
+ {
+ }
+
+ /// <summary>
+ /// Creates a policy that varies the cached content based on the specified route value name.
+ /// </summary>
+ public VaryByRouteValuePolicy(string routeValue)
+ {
+ ArgumentNullException.ThrowIfNull(routeValue);
+
+ _routeValueNames = routeValue;
+ }
+
+ /// <summary>
+ /// Creates a policy that varies the cached content based on the specified route value names.
+ /// </summary>
+ public VaryByRouteValuePolicy(params string[] routeValueNames)
+ {
+ ArgumentNullException.ThrowIfNull(routeValueNames);
+
+ _routeValueNames = routeValueNames;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ // No vary by route value?
+ if (_routeValueNames.Count == 0)
+ {
+ context.CacheVaryByRules.RouteValueNames = _routeValueNames;
+ return ValueTask.CompletedTask;
+ }
+
+ context.CacheVaryByRules.RouteValueNames = StringValues.Concat(context.CacheVaryByRules.RouteValueNames, _routeValueNames);
+
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc />
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/Policies/VaryByValuePolicy.cs b/src/Middleware/OutputCaching/src/Policies/VaryByValuePolicy.cs
new file mode 100644
index 0000000000..5de5366307
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Policies/VaryByValuePolicy.cs
@@ -0,0 +1,82 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// When applied, the cached content will be different for every provided value.
+/// </summary>
+internal sealed class VaryByValuePolicy : IOutputCachePolicy
+{
+ private readonly Action<HttpContext, CacheVaryByRules>? _varyBy;
+ private readonly Func<HttpContext, CacheVaryByRules, CancellationToken, ValueTask>? _varyByAsync;
+
+ /// <summary>
+ /// Creates a policy that doesn't vary the cached content based on values.
+ /// </summary>
+ public VaryByValuePolicy()
+ {
+ }
+
+ /// <summary>
+ /// Creates a policy that vary the cached content based on the specified value.
+ /// </summary>
+ public VaryByValuePolicy(Func<HttpContext, string> varyBy)
+ {
+ _varyBy = (context, rules) => rules.VaryByPrefix += varyBy(context);
+ }
+
+ /// <summary>
+ /// Creates a policy that vary the cached content based on the specified value.
+ /// </summary>
+ public VaryByValuePolicy(Func<HttpContext, CancellationToken, ValueTask<string>> varyBy)
+ {
+ _varyByAsync = async (context, rules, token) => rules.VaryByPrefix += await varyBy(context, token);
+ }
+
+ /// <summary>
+ /// Creates a policy that vary the cached content based on the specified value.
+ /// </summary>
+ public VaryByValuePolicy(Func<HttpContext, KeyValuePair<string, string>> varyBy)
+ {
+ _varyBy = (context, rules) =>
+ {
+ var result = varyBy(context);
+ rules.VaryByCustom?.TryAdd(result.Key, result.Value);
+ };
+ }
+
+ /// <summary>
+ /// Creates a policy that vary the cached content based on the specified value.
+ /// </summary>
+ public VaryByValuePolicy(Func<HttpContext, CancellationToken, ValueTask<KeyValuePair<string, string>>> varyBy)
+ {
+ _varyBy = async (context, rules) =>
+ {
+ var result = await varyBy(context, context.RequestAborted);
+ rules.VaryByCustom?.TryAdd(result.Key, result.Value);
+ };
+ }
+
+ /// <inheritdoc/>
+ ValueTask IOutputCachePolicy.CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ _varyBy?.Invoke(context.HttpContext, context.CacheVaryByRules);
+
+ return _varyByAsync?.Invoke(context.HttpContext, context.CacheVaryByRules, context.HttpContext.RequestAborted) ?? ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc/>
+ ValueTask IOutputCachePolicy.ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ /// <inheritdoc/>
+ ValueTask IOutputCachePolicy.ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Unshipped.txt b/src/Middleware/OutputCaching/src/PublicAPI.Shipped.txt
index 7dc5c58110..7dc5c58110 100644
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/OutputCaching/src/PublicAPI.Shipped.txt
diff --git a/src/Middleware/OutputCaching/src/PublicAPI.Unshipped.txt b/src/Middleware/OutputCaching/src/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..fd1ea27461
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/PublicAPI.Unshipped.txt
@@ -0,0 +1,98 @@
+#nullable enable
+Microsoft.AspNetCore.Builder.OutputCacheApplicationBuilderExtensions
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.CacheVaryByRules() -> void
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.HeaderNames.get -> Microsoft.Extensions.Primitives.StringValues
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.HeaderNames.set -> void
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.QueryKeys.get -> Microsoft.Extensions.Primitives.StringValues
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.QueryKeys.set -> void
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.RouteValueNames.get -> Microsoft.Extensions.Primitives.StringValues
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.RouteValueNames.set -> void
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.VaryByCustom.get -> System.Collections.Generic.IDictionary<string!, string!>!
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.VaryByPrefix.get -> Microsoft.Extensions.Primitives.StringValues
+Microsoft.AspNetCore.OutputCaching.CacheVaryByRules.VaryByPrefix.set -> void
+Microsoft.AspNetCore.OutputCaching.IOutputCacheFeature
+Microsoft.AspNetCore.OutputCaching.IOutputCacheFeature.Context.get -> Microsoft.AspNetCore.OutputCaching.OutputCacheContext!
+Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy.CacheRequestAsync(Microsoft.AspNetCore.OutputCaching.OutputCacheContext! context, System.Threading.CancellationToken cancellation) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy.ServeFromCacheAsync(Microsoft.AspNetCore.OutputCaching.OutputCacheContext! context, System.Threading.CancellationToken cancellation) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy.ServeResponseAsync(Microsoft.AspNetCore.OutputCaching.OutputCacheContext! context, System.Threading.CancellationToken cancellation) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.OutputCaching.IOutputCacheStore
+Microsoft.AspNetCore.OutputCaching.IOutputCacheStore.EvictByTagAsync(string! tag, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy
+Microsoft.AspNetCore.OutputCaching.IOutputCacheStore.GetAsync(string! key, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask<byte[]?>
+Microsoft.AspNetCore.OutputCaching.IOutputCacheStore.SetAsync(string! key, byte[]! value, string![]? tags, System.TimeSpan validFor, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.Duration.get -> int
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.Duration.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.NoStore.get -> bool
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.NoStore.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.OutputCacheAttribute() -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.PolicyName.get -> string?
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.PolicyName.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.VaryByHeaderNames.get -> string![]?
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.VaryByHeaderNames.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.VaryByQueryKeys.get -> string![]?
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.VaryByQueryKeys.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.VaryByRouteValueNames.get -> string![]?
+Microsoft.AspNetCore.OutputCaching.OutputCacheAttribute.VaryByRouteValueNames.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.EnableOutputCaching.get -> bool
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.EnableOutputCaching.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.HttpContext.init -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.OutputCacheContext() -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.ResponseTime.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.AddBasePolicy(Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy! policy) -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.AddBasePolicy(System.Action<Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!>! build) -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.AddPolicy(string! name, Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy! policy) -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.AddPolicy(string! name, System.Action<Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!>! build) -> void
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.AddPolicy(System.Type! policyType) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.AddPolicy<T>() -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.AllowLocking(bool lockResponse = true) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.Cache() -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.Clear() -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.Expire(System.TimeSpan expiration) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.NoCache() -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.OutputCachePolicyBuilder() -> void
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.Tag(params string![]! tags) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByHeader(params string![]! headerNames) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByQuery(params string![]! queryKeys) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByRouteValue(params string![]! routeValueNames) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByValue(System.Func<Microsoft.AspNetCore.Http.HttpContext!, System.Collections.Generic.KeyValuePair<string!, string!>>! varyBy) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByValue(System.Func<Microsoft.AspNetCore.Http.HttpContext!, string!>! varyBy) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByValue(System.Func<Microsoft.AspNetCore.Http.HttpContext!, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<string!>>! varyBy) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.VaryByValue(System.Func<Microsoft.AspNetCore.Http.HttpContext!, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<System.Collections.Generic.KeyValuePair<string!, string!>>>! varyBy) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.AllowCacheLookup.get -> bool
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.AllowCacheLookup.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.AllowCacheStorage.get -> bool
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.AllowCacheStorage.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.AllowLocking.get -> bool
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.AllowLocking.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.ResponseExpirationTimeSpan.get -> System.TimeSpan?
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.ResponseExpirationTimeSpan.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.ResponseTime.get -> System.DateTimeOffset?
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.DefaultExpirationTimeSpan.get -> System.TimeSpan
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.DefaultExpirationTimeSpan.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.MaximumBodySize.get -> long
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.MaximumBodySize.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.OutputCacheOptions() -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.SizeLimit.get -> long
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.SizeLimit.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.UseCaseSensitivePaths.get -> bool
+Microsoft.AspNetCore.OutputCaching.OutputCacheOptions.UseCaseSensitivePaths.set -> void
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.With(System.Func<Microsoft.AspNetCore.OutputCaching.OutputCacheContext!, bool>! predicate) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder.With(System.Func<Microsoft.AspNetCore.OutputCaching.OutputCacheContext!, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<bool>>! predicate) -> Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!
+Microsoft.Extensions.DependencyInjection.OutputCacheConventionBuilderExtensions
+Microsoft.Extensions.DependencyInjection.OutputCacheServiceCollectionExtensions
+static Microsoft.AspNetCore.Builder.OutputCacheApplicationBuilderExtensions.UseOutputCache(this Microsoft.AspNetCore.Builder.IApplicationBuilder! app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder!
+static Microsoft.Extensions.DependencyInjection.OutputCacheConventionBuilderExtensions.CacheOutput<TBuilder>(this TBuilder builder) -> TBuilder
+static Microsoft.Extensions.DependencyInjection.OutputCacheConventionBuilderExtensions.CacheOutput<TBuilder>(this TBuilder builder, Microsoft.AspNetCore.OutputCaching.IOutputCachePolicy! policy) -> TBuilder
+static Microsoft.Extensions.DependencyInjection.OutputCacheConventionBuilderExtensions.CacheOutput<TBuilder>(this TBuilder builder, string! policyName) -> TBuilder
+static Microsoft.Extensions.DependencyInjection.OutputCacheConventionBuilderExtensions.CacheOutput<TBuilder>(this TBuilder builder, System.Action<Microsoft.AspNetCore.OutputCaching.OutputCachePolicyBuilder!>! policy) -> TBuilder
+static Microsoft.Extensions.DependencyInjection.OutputCacheServiceCollectionExtensions.AddOutputCache(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.OutputCacheServiceCollectionExtensions.AddOutputCache(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.OutputCaching.OutputCacheOptions!>! configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.CacheVaryByRules.get -> Microsoft.AspNetCore.OutputCaching.CacheVaryByRules!
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.HttpContext.get -> Microsoft.AspNetCore.Http.HttpContext!
+Microsoft.AspNetCore.OutputCaching.OutputCacheContext.Tags.get -> System.Collections.Generic.HashSet<string!>!
diff --git a/src/Middleware/OutputCaching/src/Resources.resx b/src/Middleware/OutputCaching/src/Resources.resx
new file mode 100644
index 0000000000..3a19868a73
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Resources.resx
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="Policy_InvalidType" xml:space="preserve">
+ <value>The type '{0}' is not a valid output policy.</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/src/Middleware/OutputCaching/src/Serialization/FormatterEntry.cs b/src/Middleware/OutputCaching/src/Serialization/FormatterEntry.cs
new file mode 100644
index 0000000000..f3aadfbadd
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Serialization/FormatterEntry.cs
@@ -0,0 +1,12 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching.Serialization;
+internal sealed class FormatterEntry
+{
+ public DateTimeOffset Created { get; set; }
+ public int StatusCode { get; set; }
+ public Dictionary<string, string?[]> Headers { get; set; } = default!;
+ public List<byte[]> Body { get; set; } = default!;
+ public string[] Tags { get; set; } = default!;
+}
diff --git a/src/Middleware/OutputCaching/src/Serialization/FormatterEntrySerializerContext.cs b/src/Middleware/OutputCaching/src/Serialization/FormatterEntrySerializerContext.cs
new file mode 100644
index 0000000000..6f49367409
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Serialization/FormatterEntrySerializerContext.cs
@@ -0,0 +1,12 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Json.Serialization;
+
+namespace Microsoft.AspNetCore.OutputCaching.Serialization;
+
+[JsonSourceGenerationOptions(WriteIndented = false)]
+[JsonSerializable(typeof(FormatterEntry))]
+internal partial class FormatterEntrySerializerContext : JsonSerializerContext
+{
+}
diff --git a/src/Middleware/OutputCaching/src/Streams/OutputCacheStream.cs b/src/Middleware/OutputCaching/src/Streams/OutputCacheStream.cs
new file mode 100644
index 0000000000..d868586d69
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Streams/OutputCacheStream.cs
@@ -0,0 +1,187 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class OutputCacheStream : Stream
+{
+ private readonly Stream _innerStream;
+ private readonly long _maxBufferSize;
+ private readonly int _segmentSize;
+ private readonly SegmentWriteStream _segmentWriteStream;
+ private readonly Action _startResponseCallback;
+
+ internal OutputCacheStream(Stream innerStream, long maxBufferSize, int segmentSize, Action startResponseCallback)
+ {
+ _innerStream = innerStream;
+ _maxBufferSize = maxBufferSize;
+ _segmentSize = segmentSize;
+ _startResponseCallback = startResponseCallback;
+ _segmentWriteStream = new SegmentWriteStream(_segmentSize);
+ }
+
+ internal bool BufferingEnabled { get; private set; } = true;
+
+ public override bool CanRead => _innerStream.CanRead;
+
+ public override bool CanSeek => _innerStream.CanSeek;
+
+ public override bool CanWrite => _innerStream.CanWrite;
+
+ public override long Length => _innerStream.Length;
+
+ public override long Position
+ {
+ get { return _innerStream.Position; }
+ set
+ {
+ DisableBuffering();
+ _innerStream.Position = value;
+ }
+ }
+
+ internal CachedResponseBody GetCachedResponseBody()
+ {
+ if (!BufferingEnabled)
+ {
+ throw new InvalidOperationException("Buffer stream cannot be retrieved since buffering is disabled.");
+ }
+ return new CachedResponseBody(_segmentWriteStream.GetSegments(), _segmentWriteStream.Length);
+ }
+
+ internal void DisableBuffering()
+ {
+ BufferingEnabled = false;
+ _segmentWriteStream.Dispose();
+ }
+
+ public override void SetLength(long value)
+ {
+ DisableBuffering();
+ _innerStream.SetLength(value);
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ DisableBuffering();
+ return _innerStream.Seek(offset, origin);
+ }
+
+ public override void Flush()
+ {
+ try
+ {
+ _startResponseCallback();
+ _innerStream.Flush();
+ }
+ catch
+ {
+ DisableBuffering();
+ throw;
+ }
+ }
+
+ public override async Task FlushAsync(CancellationToken cancellationToken)
+ {
+ try
+ {
+ _startResponseCallback();
+ await _innerStream.FlushAsync(cancellationToken);
+ }
+ catch
+ {
+ DisableBuffering();
+ throw;
+ }
+ }
+
+ // Underlying stream is write-only, no need to override other read related methods
+ public override int Read(byte[] buffer, int offset, int count)
+ => _innerStream.Read(buffer, offset, count);
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ try
+ {
+ _startResponseCallback();
+ _innerStream.Write(buffer, offset, count);
+ }
+ catch
+ {
+ DisableBuffering();
+ throw;
+ }
+
+ if (BufferingEnabled)
+ {
+ if (_segmentWriteStream.Length + count > _maxBufferSize)
+ {
+ DisableBuffering();
+ }
+ else
+ {
+ _segmentWriteStream.Write(buffer, offset, count);
+ }
+ }
+ }
+
+ public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) =>
+ await WriteAsync(buffer.AsMemory(offset, count), cancellationToken);
+
+ public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
+ {
+ try
+ {
+ _startResponseCallback();
+ await _innerStream.WriteAsync(buffer, cancellationToken);
+ }
+ catch
+ {
+ DisableBuffering();
+ throw;
+ }
+
+ if (BufferingEnabled)
+ {
+ if (_segmentWriteStream.Length + buffer.Length > _maxBufferSize)
+ {
+ DisableBuffering();
+ }
+ else
+ {
+ await _segmentWriteStream.WriteAsync(buffer, cancellationToken);
+ }
+ }
+ }
+
+ public override void WriteByte(byte value)
+ {
+ try
+ {
+ _innerStream.WriteByte(value);
+ }
+ catch
+ {
+ DisableBuffering();
+ throw;
+ }
+
+ if (BufferingEnabled)
+ {
+ if (_segmentWriteStream.Length + 1 > _maxBufferSize)
+ {
+ DisableBuffering();
+ }
+ else
+ {
+ _segmentWriteStream.WriteByte(value);
+ }
+ }
+ }
+
+ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
+ => TaskToApm.Begin(WriteAsync(buffer, offset, count, CancellationToken.None), callback, state);
+
+ public override void EndWrite(IAsyncResult asyncResult)
+ => TaskToApm.End(asyncResult);
+}
diff --git a/src/Middleware/OutputCaching/src/Streams/SegmentWriteStream.cs b/src/Middleware/OutputCaching/src/Streams/SegmentWriteStream.cs
new file mode 100644
index 0000000000..b7491fc174
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Streams/SegmentWriteStream.cs
@@ -0,0 +1,199 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal sealed class SegmentWriteStream : Stream
+{
+ private readonly List<byte[]> _segments = new();
+ private readonly MemoryStream _bufferStream = new();
+ private readonly int _segmentSize;
+ private long _length;
+ private bool _closed;
+ private bool _disposed;
+
+ internal SegmentWriteStream(int segmentSize)
+ {
+ if (segmentSize <= 0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(segmentSize), segmentSize, $"{nameof(segmentSize)} must be greater than 0.");
+ }
+
+ _segmentSize = segmentSize;
+ }
+
+ // Extracting the buffered segments closes the stream for writing
+ internal List<byte[]> GetSegments()
+ {
+ if (!_closed)
+ {
+ _closed = true;
+ FinalizeSegments();
+ }
+ return _segments;
+ }
+
+ public override bool CanRead => false;
+
+ public override bool CanSeek => false;
+
+ public override bool CanWrite => !_closed;
+
+ public override long Length => _length;
+
+ public override long Position
+ {
+ get
+ {
+ return _length;
+ }
+ set
+ {
+ throw new NotSupportedException("The stream does not support seeking.");
+ }
+ }
+
+ private void DisposeMemoryStream()
+ {
+ // Clean up the memory stream
+ _bufferStream.SetLength(0);
+ _bufferStream.Capacity = 0;
+ _bufferStream.Dispose();
+ }
+
+ private void FinalizeSegments()
+ {
+ // Append any remaining segments
+ if (_bufferStream.Length > 0)
+ {
+ // Add the last segment
+ _segments.Add(_bufferStream.ToArray());
+ }
+
+ DisposeMemoryStream();
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ try
+ {
+ if (_disposed)
+ {
+ return;
+ }
+
+ if (disposing)
+ {
+ _segments.Clear();
+ DisposeMemoryStream();
+ }
+
+ _disposed = true;
+ _closed = true;
+ }
+ finally
+ {
+ base.Dispose(disposing);
+ }
+ }
+
+ public override void Flush()
+ {
+ if (!CanWrite)
+ {
+ throw new ObjectDisposedException("The stream has been closed for writing.");
+ }
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ throw new NotSupportedException("The stream does not support reading.");
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NotSupportedException("The stream does not support seeking.");
+ }
+
+ public override void SetLength(long value)
+ {
+ throw new NotSupportedException("The stream does not support seeking.");
+ }
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ ArgumentNullException.ThrowIfNull(buffer);
+
+ if (offset < 0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(offset), offset, "Non-negative number required.");
+ }
+ if (count < 0)
+ {
+ throw new ArgumentOutOfRangeException(nameof(count), count, "Non-negative number required.");
+ }
+ if (count > buffer.Length - offset)
+ {
+ throw new ArgumentException("Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.");
+ }
+ if (!CanWrite)
+ {
+ throw new ObjectDisposedException("The stream has been closed for writing.");
+ }
+
+ Write(buffer.AsSpan(offset, count));
+ }
+
+ public override void Write(ReadOnlySpan<byte> buffer)
+ {
+ while (!buffer.IsEmpty)
+ {
+ if ((int)_bufferStream.Length == _segmentSize)
+ {
+ _segments.Add(_bufferStream.ToArray());
+ _bufferStream.SetLength(0);
+ }
+
+ var bytesWritten = Math.Min(buffer.Length, _segmentSize - (int)_bufferStream.Length);
+
+ _bufferStream.Write(buffer[..bytesWritten]);
+ buffer = buffer[bytesWritten..];
+ _length += bytesWritten;
+ }
+ }
+
+ public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ Write(buffer, offset, count);
+ return Task.CompletedTask;
+ }
+
+ public override ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken)
+ {
+ Write(buffer.Span);
+ return default;
+ }
+
+ public override void WriteByte(byte value)
+ {
+ if (!CanWrite)
+ {
+ throw new ObjectDisposedException("The stream has been closed for writing.");
+ }
+
+ if ((int)_bufferStream.Length == _segmentSize)
+ {
+ _segments.Add(_bufferStream.ToArray());
+ _bufferStream.SetLength(0);
+ }
+
+ _bufferStream.WriteByte(value);
+ _length++;
+ }
+
+ public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback? callback, object? state)
+ => TaskToApm.Begin(WriteAsync(buffer, offset, count, CancellationToken.None), callback, state);
+
+ public override void EndWrite(IAsyncResult asyncResult)
+ => TaskToApm.End(asyncResult);
+}
diff --git a/src/Middleware/OutputCaching/src/Streams/StreamUtilities.cs b/src/Middleware/OutputCaching/src/Streams/StreamUtilities.cs
new file mode 100644
index 0000000000..2b9fb359c7
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/Streams/StreamUtilities.cs
@@ -0,0 +1,13 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal static class StreamUtilities
+{
+ /// <summary>
+ /// The segment size for buffering the response body in bytes. The default is set to 80 KB (81920 Bytes) to avoid allocations on the LOH.
+ /// </summary>
+ // Internal for testing
+ internal static int BodySegmentSize { get; set; } = 81920;
+}
diff --git a/src/Middleware/OutputCaching/src/StringBuilderExtensions.cs b/src/Middleware/OutputCaching/src/StringBuilderExtensions.cs
new file mode 100644
index 0000000000..6835e9af6c
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/StringBuilderExtensions.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text;
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+internal static class StringBuilderExtensions
+{
+ internal static StringBuilder AppendUpperInvariant(this StringBuilder builder, string? value)
+ {
+ if (!string.IsNullOrEmpty(value))
+ {
+ builder.EnsureCapacity(builder.Length + value.Length);
+ for (var i = 0; i < value.Length; i++)
+ {
+ builder.Append(char.ToUpperInvariant(value[i]));
+ }
+ }
+
+ return builder;
+ }
+}
diff --git a/src/Middleware/OutputCaching/src/SystemClock.cs b/src/Middleware/OutputCaching/src/SystemClock.cs
new file mode 100644
index 0000000000..6cb33a828b
--- /dev/null
+++ b/src/Middleware/OutputCaching/src/SystemClock.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching;
+
+/// <summary>
+/// Provides access to the normal system clock.
+/// </summary>
+internal sealed class SystemClock : ISystemClock
+{
+ /// <summary>
+ /// Retrieves the current system time in UTC.
+ /// </summary>
+ public DateTimeOffset UtcNow => DateTimeOffset.UtcNow;
+}
diff --git a/src/Middleware/OutputCaching/startvs.cmd b/src/Middleware/OutputCaching/startvs.cmd
new file mode 100644
index 0000000000..5c25af9f64
--- /dev/null
+++ b/src/Middleware/OutputCaching/startvs.cmd
@@ -0,0 +1,3 @@
+@ECHO OFF
+
+%~dp0..\..\..\startvs.cmd %~dp0OutputCaching.slnf
diff --git a/src/Middleware/OutputCaching/test/CachedResponseBodyTests.cs b/src/Middleware/OutputCaching/test/CachedResponseBodyTests.cs
new file mode 100644
index 0000000000..6867fc2fb7
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/CachedResponseBodyTests.cs
@@ -0,0 +1,122 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Buffers;
+using System.Diagnostics;
+using System.IO.Pipelines;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class CachedResponseBodyTests
+{
+ private readonly int _timeout = Debugger.IsAttached ? -1 : 5000;
+
+ [Fact]
+ public void GetSegments()
+ {
+ var segments = new List<byte[]>();
+ var body = new CachedResponseBody(segments, 0);
+
+ Assert.Same(segments, body.Segments);
+ }
+
+ [Fact]
+ public void GetLength()
+ {
+ var segments = new List<byte[]>();
+ var body = new CachedResponseBody(segments, 42);
+
+ Assert.Equal(42, body.Length);
+ }
+
+ [Fact]
+ public async Task Copy_DoNothingWhenNoSegments()
+ {
+ var segments = new List<byte[]>();
+ var receivedSegments = new List<byte[]>();
+ var body = new CachedResponseBody(segments, 0);
+
+ var pipe = new Pipe();
+ using var cts = new CancellationTokenSource(_timeout);
+
+ var receiverTask = ReceiveDataAsync(pipe.Reader, receivedSegments, cts.Token);
+ var copyTask = body.CopyToAsync(pipe.Writer, cts.Token).ContinueWith(_ => pipe.Writer.CompleteAsync());
+
+ await Task.WhenAll(receiverTask, copyTask);
+
+ Assert.Empty(receivedSegments);
+ }
+
+ [Fact]
+ public async Task Copy_SingleSegment()
+ {
+ var segments = new List<byte[]>
+ {
+ new byte[] { 1 }
+ };
+ var receivedSegments = new List<byte[]>();
+ var body = new CachedResponseBody(segments, 0);
+
+ var pipe = new Pipe();
+
+ using var cts = new CancellationTokenSource(_timeout);
+
+ var receiverTask = ReceiveDataAsync(pipe.Reader, receivedSegments, cts.Token);
+ var copyTask = CopyDataAsync(body, pipe.Writer, cts.Token);
+
+ await Task.WhenAll(receiverTask, copyTask);
+
+ Assert.Equal(segments, receivedSegments);
+ }
+
+ [Fact]
+ public async Task Copy_MultipleSegments()
+ {
+ var segments = new List<byte[]>
+ {
+ new byte[] { 1 },
+ new byte[] { 2, 3 }
+ };
+ var receivedSegments = new List<byte[]>();
+ var body = new CachedResponseBody(segments, 0);
+
+ var pipe = new Pipe();
+
+ using var cts = new CancellationTokenSource(_timeout);
+
+ var receiverTask = ReceiveDataAsync(pipe.Reader, receivedSegments, cts.Token);
+ var copyTask = CopyDataAsync(body, pipe.Writer, cts.Token);
+
+ await Task.WhenAll(receiverTask, copyTask);
+
+ Assert.Equal(new byte[] { 1, 2, 3 }, receivedSegments.SelectMany(x => x).ToArray());
+ }
+
+ static async Task CopyDataAsync(CachedResponseBody body, PipeWriter writer, CancellationToken cancellationToken)
+ {
+ await body.CopyToAsync(writer, cancellationToken);
+ await writer.CompleteAsync();
+ }
+
+ static async Task ReceiveDataAsync(PipeReader reader, List<byte[]> receivedSegments, CancellationToken cancellationToken)
+ {
+ while (true)
+ {
+ var result = await reader.ReadAsync(cancellationToken);
+ var buffer = result.Buffer;
+
+ foreach (var memory in buffer)
+ {
+ receivedSegments.Add(memory.ToArray());
+ }
+
+ reader.AdvanceTo(buffer.End, buffer.End);
+
+ if (result.IsCompleted)
+ {
+ break;
+ }
+ }
+ await reader.CompleteAsync();
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/MemoryOutputCacheStoreTests.cs b/src/Middleware/OutputCaching/test/MemoryOutputCacheStoreTests.cs
new file mode 100644
index 0000000000..c3a8d48388
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/MemoryOutputCacheStoreTests.cs
@@ -0,0 +1,155 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.OutputCaching.Memory;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class MemoryOutputCacheStoreTests
+{
+ [Fact]
+ public async Task StoreAndGetValue_Succeeds()
+ {
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions()));
+ var value = "abc"u8.ToArray();
+ var key = "abc";
+
+ await store.SetAsync(key, value, null, TimeSpan.FromMinutes(1), default);
+
+ var result = await store.GetAsync(key, default);
+
+ Assert.Equal(value, result);
+ }
+
+ [Fact]
+ public async Task StoreAndGetValue_TimesOut()
+ {
+ var testClock = new TestMemoryOptionsClock { UtcNow = DateTimeOffset.UtcNow };
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions { Clock = testClock }));
+ var value = "abc"u8.ToArray();
+ var key = "abc";
+
+ await store.SetAsync(key, value, null, TimeSpan.FromMilliseconds(5), default);
+ testClock.Advance(TimeSpan.FromMilliseconds(10));
+
+ var result = await store.GetAsync(key, default);
+
+ Assert.Null(result);
+ }
+
+ [Fact]
+ public async Task StoreNullKey_ThrowsException()
+ {
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions()));
+ var value = "abc"u8.ToArray();
+ string key = null;
+
+ _ = await Assert.ThrowsAsync<ArgumentNullException>("key", () => store.SetAsync(key, value, null, TimeSpan.FromMilliseconds(5), default).AsTask());
+ }
+
+ [Fact]
+ public async Task StoreNullValue_ThrowsException()
+ {
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions()));
+ var value = default(byte[]);
+ string key = "abc";
+
+ _ = await Assert.ThrowsAsync<ArgumentNullException>("value", () => store.SetAsync(key, value, null, TimeSpan.FromMilliseconds(5), default).AsTask());
+ }
+
+ [Fact]
+ public async Task EvictByTag_SingleTag_SingleEntry()
+ {
+ var testClock = new TestMemoryOptionsClock { UtcNow = DateTimeOffset.UtcNow };
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions { Clock = testClock }));
+ var value = "abc"u8.ToArray();
+ var key = "abc";
+ var tags = new string[] { "tag1" };
+
+ await store.SetAsync(key, value, tags, TimeSpan.FromDays(1), default);
+ await store.EvictByTagAsync("tag1", default);
+ var result = await store.GetAsync(key, default);
+
+ Assert.Null(result);
+ }
+
+ [Fact]
+ public async Task EvictByTag_SingleTag_MultipleEntries()
+ {
+ var testClock = new TestMemoryOptionsClock { UtcNow = DateTimeOffset.UtcNow };
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions { Clock = testClock }));
+ var value = "abc"u8.ToArray();
+ var key1 = "abc";
+ var key2 = "def";
+ var tags = new string[] { "tag1" };
+
+ await store.SetAsync(key1, value, tags, TimeSpan.FromDays(1), default);
+ await store.SetAsync(key2, value, tags, TimeSpan.FromDays(1), default);
+ await store.EvictByTagAsync("tag1", default);
+ var result1 = await store.GetAsync(key1, default);
+ var result2 = await store.GetAsync(key2, default);
+
+ Assert.Null(result1);
+ Assert.Null(result2);
+ }
+
+ [Fact]
+ public async Task EvictByTag_MultipleTags_SingleEntry()
+ {
+ var testClock = new TestMemoryOptionsClock { UtcNow = DateTimeOffset.UtcNow };
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions { Clock = testClock }));
+ var value = "abc"u8.ToArray();
+ var key = "abc";
+ var tags = new string[] { "tag1", "tag2" };
+
+ await store.SetAsync(key, value, tags, TimeSpan.FromDays(1), default);
+ await store.EvictByTagAsync("tag1", default);
+ var result1 = await store.GetAsync(key, default);
+
+ Assert.Null(result1);
+ }
+
+ [Fact]
+ public async Task EvictByTag_MultipleTags_MultipleEntries()
+ {
+ var testClock = new TestMemoryOptionsClock { UtcNow = DateTimeOffset.UtcNow };
+ var store = new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions { Clock = testClock }));
+ var value = "abc"u8.ToArray();
+ var key1 = "abc";
+ var key2 = "def";
+ var tags1 = new string[] { "tag1", "tag2" };
+ var tags2 = new string[] { "tag2", "tag3" };
+
+ await store.SetAsync(key1, value, tags1, TimeSpan.FromDays(1), default);
+ await store.SetAsync(key2, value, tags2, TimeSpan.FromDays(1), default);
+ await store.EvictByTagAsync("tag1", default);
+
+ var result1 = await store.GetAsync(key1, default);
+ var result2 = await store.GetAsync(key2, default);
+
+ Assert.Null(result1);
+ Assert.NotNull(result2);
+
+ await store.EvictByTagAsync("tag3", default);
+
+ result1 = await store.GetAsync(key1, default);
+ result2 = await store.GetAsync(key2, default);
+
+ Assert.Null(result1);
+ Assert.Null(result2);
+ }
+
+ private class TestMemoryOptionsClock : Extensions.Internal.ISystemClock
+ {
+ public DateTimeOffset UtcNow { get; set; }
+ public void Advance(TimeSpan duration)
+ {
+ UtcNow += duration;
+ }
+ }
+}
diff --git a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/Microsoft.AspNetCore.Authentication.AzureAD.UI.Test.csproj b/src/Middleware/OutputCaching/test/Microsoft.AspNetCore.OutputCaching.Tests.csproj
index b5daa435a5..f3a12d8a3c 100644
--- a/src/Azure/AzureAD/Authentication.AzureAD.UI/test/Microsoft.AspNetCore.Authentication.AzureAD.UI.Test.csproj
+++ b/src/Middleware/OutputCaching/test/Microsoft.AspNetCore.OutputCaching.Tests.csproj
@@ -1,20 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
-
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <RootNamespace>Microsoft.AspNetCore.Authentication.AzureAD.UI</RootNamespace>
- <!-- This package will be deprecated -->
- <NoWarn>$(NoWarn);CS0618</NoWarn>
</PropertyGroup>
<ItemGroup>
- <Content Include="xunit.runner.json">
+ <Content Include="TestDocument.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+ <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
- <Reference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" />
+ <Reference Include="Microsoft.AspNetCore.OutputCaching" />
+ <Reference Include="Microsoft.AspNetCore.TestHost" />
</ItemGroup>
</Project>
diff --git a/src/Middleware/OutputCaching/test/OutputCacheAttributeTests.cs b/src/Middleware/OutputCaching/test/OutputCacheAttributeTests.cs
new file mode 100644
index 0000000000..cd43d2d58a
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCacheAttributeTests.cs
@@ -0,0 +1,138 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Castle.Core.Internal;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCacheAttributeTests
+{
+ [Fact]
+ public void Attribute_CreatesDefaultPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.Default));
+ var policy = attribute.BuildPolicy();
+
+ Assert.Equal(DefaultPolicy.Instance, policy);
+ }
+
+ [Fact]
+ public async Task Attribute_CreatesExpirePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.Duration));
+ await attribute.BuildPolicy().CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Equal(42, context.ResponseExpirationTimeSpan?.TotalSeconds);
+ }
+
+ [Fact]
+ public async Task Attribute_CreatesNoStorePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.NoStore));
+ await attribute.BuildPolicy().CacheRequestAsync(context, cancellation: default);
+
+ Assert.False(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task Attribute_CreatesNamedPolicy()
+ {
+ var options = new OutputCacheOptions();
+ options.AddPolicy("MyPolicy", b => b.Expire(TimeSpan.FromSeconds(42)));
+
+ var context = TestUtils.CreateTestContext(options: options);
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.PolicyName));
+ await attribute.BuildPolicy().CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Equal(42, context.ResponseExpirationTimeSpan?.TotalSeconds);
+ }
+
+ [Fact]
+ public async Task Attribute_CreatesVaryByHeaderPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ context.HttpContext.Request.Headers["HeaderA"] = "ValueA";
+ context.HttpContext.Request.Headers["HeaderB"] = "ValueB";
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.VaryByHeaderNames));
+ await attribute.BuildPolicy().CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("HeaderA", (IEnumerable<string>)context.CacheVaryByRules.HeaderNames);
+ Assert.Contains("HeaderC", (IEnumerable<string>)context.CacheVaryByRules.HeaderNames);
+ Assert.DoesNotContain("HeaderB", (IEnumerable<string>)context.CacheVaryByRules.HeaderNames);
+ }
+
+ [Fact]
+ public async Task Attribute_CreatesVaryByQueryPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueA&QueryB=ValueB");
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.VaryByQueryKeys));
+ await attribute.BuildPolicy().CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("QueryA", (IEnumerable<string>)context.CacheVaryByRules.QueryKeys);
+ Assert.Contains("QueryC", (IEnumerable<string>)context.CacheVaryByRules.QueryKeys);
+ Assert.DoesNotContain("QueryB", (IEnumerable<string>)context.CacheVaryByRules.QueryKeys);
+ }
+
+ [Fact]
+ public async Task Attribute_CreatesVaryByRoutePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ context.HttpContext.Request.RouteValues = new Routing.RouteValueDictionary()
+ {
+ ["RouteA"] = "ValueA",
+ ["RouteB"] = 123.456,
+ };
+
+ var attribute = OutputCacheMethods.GetAttribute(nameof(OutputCacheMethods.VaryByRouteValueNames));
+ await attribute.BuildPolicy().CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("RouteA", (IEnumerable<string>)context.CacheVaryByRules.RouteValueNames);
+ Assert.Contains("RouteC", (IEnumerable<string>)context.CacheVaryByRules.RouteValueNames);
+ Assert.DoesNotContain("RouteB", (IEnumerable<string>)context.CacheVaryByRules.RouteValueNames);
+ }
+
+ private class OutputCacheMethods
+ {
+ public static OutputCacheAttribute GetAttribute(string methodName)
+ {
+ return typeof(OutputCacheMethods).GetMethod(methodName, System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public).GetAttribute<OutputCacheAttribute>();
+ }
+
+ [OutputCache()]
+ public static void Default() { }
+
+ [OutputCache(Duration = 42)]
+ public static void Duration() { }
+
+ [OutputCache(NoStore = true)]
+ public static void NoStore() { }
+
+ [OutputCache(PolicyName = "MyPolicy")]
+ public static void PolicyName() { }
+
+ [OutputCache(VaryByHeaderNames = new[] { "HeaderA", "HeaderC" })]
+ public static void VaryByHeaderNames() { }
+
+ [OutputCache(VaryByQueryKeys = new[] { "QueryA", "QueryC" })]
+ public static void VaryByQueryKeys() { }
+
+ [OutputCache(VaryByRouteValueNames = new[] { "RouteA", "RouteC" })]
+ public static void VaryByRouteValueNames() { }
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCacheEntryFormatterTests.cs b/src/Middleware/OutputCaching/test/OutputCacheEntryFormatterTests.cs
new file mode 100644
index 0000000000..a0de533fc0
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCacheEntryFormatterTests.cs
@@ -0,0 +1,66 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.OutputCaching.Memory;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCacheEntryFormatterTests
+{
+ [Fact]
+ public async Task StoreAndGet_StoresEmptyValues()
+ {
+ var store = new TestOutputCache();
+ var key = "abc";
+ var entry = new OutputCacheEntry()
+ {
+ Body = new CachedResponseBody(new List<byte[]>(), 0),
+ Headers = new HeaderDictionary(),
+ Tags = Array.Empty<string>()
+ };
+
+ await OutputCacheEntryFormatter.StoreAsync(key, entry, TimeSpan.Zero, store, default);
+
+ var result = await OutputCacheEntryFormatter.GetAsync(key, store, default);
+
+ AssertEntriesAreSame(entry, result);
+ }
+
+ [Fact]
+ public async Task StoreAndGet_StoresAllValues()
+ {
+ var store = new TestOutputCache();
+ var key = "abc";
+ var entry = new OutputCacheEntry()
+ {
+ Body = new CachedResponseBody(new List<byte[]>() { "lorem"u8.ToArray(), "ipsum"u8.ToArray() }, 10),
+ Created = DateTimeOffset.UtcNow,
+ Headers = new HeaderDictionary { [HeaderNames.Accept] = "text/plain", [HeaderNames.AcceptCharset] = "utf8" },
+ StatusCode = StatusCodes.Status201Created,
+ Tags = new[] { "tag1", "tag2" }
+ };
+
+ await OutputCacheEntryFormatter.StoreAsync(key, entry, TimeSpan.Zero, store, default);
+
+ var result = await OutputCacheEntryFormatter.GetAsync(key, store, default);
+
+ AssertEntriesAreSame(entry, result);
+ }
+
+ private static void AssertEntriesAreSame(OutputCacheEntry expected, OutputCacheEntry actual)
+ {
+ Assert.NotNull(expected);
+ Assert.NotNull(actual);
+ Assert.Equal(expected.Tags, actual.Tags);
+ Assert.Equal(expected.Created, actual.Created);
+ Assert.Equal(expected.StatusCode, actual.StatusCode);
+ Assert.Equal(expected.Headers, actual.Headers);
+ Assert.Equal(expected.Body.Length, actual.Body.Length);
+ Assert.Equal(expected.Body.Segments, actual.Body.Segments);
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCacheKeyProviderTests.cs b/src/Middleware/OutputCaching/test/OutputCacheKeyProviderTests.cs
new file mode 100644
index 0000000000..92809d018f
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCacheKeyProviderTests.cs
@@ -0,0 +1,224 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCacheKeyProviderTests
+{
+ private const char KeyDelimiter = '\x1e';
+ private const char KeySubDelimiter = '\x1f';
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageKey_IncludesOnlyNormalizedMethodSchemeHostPortAndPath()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.Method = "head";
+ context.HttpContext.Request.Path = "/path/subpath";
+ context.HttpContext.Request.Scheme = "https";
+ context.HttpContext.Request.Host = new HostString("example.com", 80);
+ context.HttpContext.Request.PathBase = "/pathBase";
+ context.HttpContext.Request.QueryString = new QueryString("?query.Key=a&query.Value=b");
+
+ Assert.Equal($"HEAD{KeyDelimiter}HTTPS{KeyDelimiter}EXAMPLE.COM:80/PATHBASE/PATH/SUBPATH", cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageKey_CaseInsensitivePath_NormalizesPath()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider(new OutputCacheOptions()
+ {
+ UseCaseSensitivePaths = false
+ });
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.Method = HttpMethods.Get;
+ context.HttpContext.Request.Path = "/Path";
+
+ Assert.Equal($"{HttpMethods.Get}{KeyDelimiter}{KeyDelimiter}/PATH", cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageKey_CaseSensitivePath_PreservesPathCase()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider(new OutputCacheOptions()
+ {
+ UseCaseSensitivePaths = true
+ });
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.Method = HttpMethods.Get;
+ context.HttpContext.Request.Path = "/Path";
+
+ Assert.Equal($"{HttpMethods.Get}{KeyDelimiter}{KeyDelimiter}/Path", cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageKey_VaryByRulesIsotNull()
+ {
+ var context = TestUtils.CreateTestContext();
+
+ Assert.NotNull(context.CacheVaryByRules);
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageKey_ReturnsCachedVaryByGuid_IfVaryByRulesIsEmpty()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}", cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_IncludesListedRouteValuesOnly()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.RouteValues["RouteA"] = "ValueA";
+ context.HttpContext.Request.RouteValues["RouteB"] = "ValueB";
+ context.CacheVaryByRules.RouteValueNames = new string[] { "RouteA", "RouteC" };
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}R{KeyDelimiter}RouteA=ValueA{KeyDelimiter}RouteC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_SerializeRouteValueToStringInvariantCulture()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.RouteValues["RouteA"] = 123.456;
+ context.CacheVaryByRules.RouteValueNames = new string[] { "RouteA", "RouteC" };
+
+ var culture = Thread.CurrentThread.CurrentCulture;
+ try
+ {
+ Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-FR");
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}R{KeyDelimiter}RouteA=123.456{KeyDelimiter}RouteC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+ finally
+ {
+ Thread.CurrentThread.CurrentCulture = culture;
+ }
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_IncludesListedHeadersOnly()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.Headers["HeaderA"] = "ValueA";
+ context.HttpContext.Request.Headers["HeaderB"] = "ValueB";
+ context.CacheVaryByRules.HeaderNames = new string[] { "HeaderA", "HeaderC" };
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}H{KeyDelimiter}HeaderA=ValueA{KeyDelimiter}HeaderC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_HeaderValuesAreSorted()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.Headers["HeaderA"] = "ValueB";
+ context.HttpContext.Request.Headers.Append("HeaderA", "ValueA");
+ context.CacheVaryByRules.HeaderNames = new string[] { "HeaderA", "HeaderC" };
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}H{KeyDelimiter}HeaderA=ValueAValueB{KeyDelimiter}HeaderC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_IncludesListedQueryKeysOnly()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueA&QueryB=ValueB");
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+ context.CacheVaryByRules.QueryKeys = new string[] { "QueryA", "QueryC" };
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}{KeyDelimiter}Q{KeyDelimiter}QueryA=ValueA{KeyDelimiter}QueryC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_IncludesQueryKeys_QueryKeyCaseInsensitive_UseQueryKeyCasing()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.QueryString = new QueryString("?queryA=ValueA&queryB=ValueB");
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+ context.CacheVaryByRules.QueryKeys = new string[] { "QueryA", "QueryC" };
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}{KeyDelimiter}Q{KeyDelimiter}QueryA=ValueA{KeyDelimiter}QueryC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_IncludesAllQueryKeysGivenAsterisk()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueA&QueryB=ValueB");
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+ context.CacheVaryByRules.QueryKeys = new string[] { "*" };
+
+ // To support case insensitivity, all query keys are converted to upper case.
+ // Explicit query keys uses the casing specified in the setting.
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}{KeyDelimiter}Q{KeyDelimiter}QUERYA=ValueA{KeyDelimiter}QUERYB=ValueB",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_QueryKeysValuesNotConsolidated()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueA&QueryA=ValueB");
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+ context.CacheVaryByRules.QueryKeys = new string[] { "*" };
+
+ // To support case insensitivity, all query keys are converted to upper case.
+ // Explicit query keys uses the casing specified in the setting.
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}{KeyDelimiter}Q{KeyDelimiter}QUERYA=ValueA{KeySubDelimiter}ValueB",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_QueryKeysValuesAreSorted()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueB&QueryA=ValueA");
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+ context.CacheVaryByRules.QueryKeys = new string[] { "*" };
+
+ // To support case insensitivity, all query keys are converted to upper case.
+ // Explicit query keys uses the casing specified in the setting.
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}{KeyDelimiter}Q{KeyDelimiter}QUERYA=ValueA{KeySubDelimiter}ValueB",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+
+ [Fact]
+ public void OutputCachingKeyProvider_CreateStorageVaryKey_IncludesListedHeadersAndQueryKeysAndRouteValues()
+ {
+ var cacheKeyProvider = TestUtils.CreateTestKeyProvider();
+ var context = TestUtils.CreateTestContext();
+ context.HttpContext.Request.Headers["HeaderA"] = "ValueA";
+ context.HttpContext.Request.Headers["HeaderB"] = "ValueB";
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueA&QueryB=ValueB");
+ context.HttpContext.Request.RouteValues["RouteA"] = "ValueA";
+ context.HttpContext.Request.RouteValues["RouteB"] = "ValueB";
+ context.CacheVaryByRules.VaryByPrefix = Guid.NewGuid().ToString("n");
+ context.CacheVaryByRules.HeaderNames = new string[] { "HeaderA", "HeaderC" };
+ context.CacheVaryByRules.QueryKeys = new string[] { "QueryA", "QueryC" };
+ context.CacheVaryByRules.RouteValueNames = new string[] { "RouteA", "RouteC" };
+
+ Assert.Equal($"{KeyDelimiter}{KeyDelimiter}{KeyDelimiter}C{KeyDelimiter}{context.CacheVaryByRules.VaryByPrefix}{KeyDelimiter}H{KeyDelimiter}HeaderA=ValueA{KeyDelimiter}HeaderC={KeyDelimiter}Q{KeyDelimiter}QueryA=ValueA{KeyDelimiter}QueryC={KeyDelimiter}R{KeyDelimiter}RouteA=ValueA{KeyDelimiter}RouteC=",
+ cacheKeyProvider.CreateStorageKey(context));
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCacheMiddlewareTests.cs b/src/Middleware/OutputCaching/test/OutputCacheMiddlewareTests.cs
new file mode 100644
index 0000000000..550e2077cb
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCacheMiddlewareTests.cs
@@ -0,0 +1,911 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.Metrics;
+using System.Threading.Tasks;
+using System;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.OutputCaching.Memory;
+using Microsoft.Extensions.Caching.Memory;
+using Microsoft.Extensions.Logging.Testing;
+using Microsoft.Extensions.Primitives;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCacheMiddlewareTests
+{
+ [Fact]
+ public async Task TryServeFromCacheAsync_OnlyIfCached_Serves504()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache, keyProvider: new TestResponseCachingKeyProvider("BaseKey"));
+ var context = TestUtils.CreateTestContext(cache: cache);
+ context.HttpContext.Request.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ OnlyIfCached = true
+ }.ToString();
+ middleware.TryGetRequestPolicies(context.HttpContext, out var policies);
+
+ Assert.True(await middleware.TryServeFromCacheAsync(context, policies));
+ Assert.Equal(StatusCodes.Status504GatewayTimeout, context.HttpContext.Response.StatusCode);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.GatewayTimeoutServed);
+ }
+
+ [Fact]
+ public async Task TryServeFromCacheAsync_CachedResponseNotFound_Fails()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache, keyProvider: new TestResponseCachingKeyProvider("BaseKey"));
+ var context = TestUtils.CreateTestContext(cache: cache);
+ middleware.TryGetRequestPolicies(context.HttpContext, out var policies);
+
+ Assert.False(await middleware.TryServeFromCacheAsync(context, policies));
+ Assert.Equal(1, cache.GetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NoResponseServed);
+ }
+
+ [Fact]
+ public async Task TryServeFromCacheAsync_CachedResponseFound_Succeeds()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache, keyProvider: new TestResponseCachingKeyProvider("BaseKey"));
+ var context = TestUtils.CreateTestContext(cache: cache);
+ middleware.TryGetRequestPolicies(context.HttpContext, out var policies);
+
+ await OutputCacheEntryFormatter.StoreAsync(
+ "BaseKey",
+ new OutputCacheEntry()
+ {
+ Headers = new HeaderDictionary(),
+ Body = new CachedResponseBody(new List<byte[]>(0), 0)
+ },
+ TimeSpan.Zero,
+ cache,
+ default);
+
+ Assert.True(await middleware.TryServeFromCacheAsync(context, policies));
+ Assert.Equal(1, cache.GetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.CachedResponseServed);
+ }
+
+ [Fact]
+ public async Task TryServeFromCacheAsync_CachedResponseFound_OverwritesExistingHeaders()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache, keyProvider: new TestResponseCachingKeyProvider("BaseKey"));
+ var context = TestUtils.CreateTestContext(cache: cache);
+ middleware.TryGetRequestPolicies(context.HttpContext, out var policies);
+ context.CacheKey = "BaseKey";
+
+ context.HttpContext.Response.Headers["MyHeader"] = "OldValue";
+ await OutputCacheEntryFormatter.StoreAsync(context.CacheKey,
+ new OutputCacheEntry()
+ {
+ Headers = new HeaderDictionary()
+ {
+ { "MyHeader", "NewValue" }
+ },
+ Body = new CachedResponseBody(new List<byte[]>(0), 0)
+ },
+ TimeSpan.Zero,
+ cache,
+ default);
+
+ Assert.True(await middleware.TryServeFromCacheAsync(context, policies));
+ Assert.Equal("NewValue", context.HttpContext.Response.Headers["MyHeader"]);
+ Assert.Equal(1, cache.GetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.CachedResponseServed);
+ }
+
+ [Fact]
+ public async Task TryServeFromCacheAsync_CachedResponseFound_Serves304IfPossible()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache, keyProvider: new TestResponseCachingKeyProvider("BaseKey"));
+ var context = TestUtils.CreateTestContext(cache: cache);
+ context.HttpContext.Request.Headers.IfNoneMatch = "*";
+ middleware.TryGetRequestPolicies(context.HttpContext, out var policies);
+
+ await OutputCacheEntryFormatter.StoreAsync("BaseKey",
+ new OutputCacheEntry()
+ {
+ Body = new CachedResponseBody(new List<byte[]>(0), 0),
+ Headers = new()
+ },
+ TimeSpan.Zero,
+ cache,
+ default);
+
+ Assert.True(await middleware.TryServeFromCacheAsync(context, policies));
+ Assert.Equal(1, cache.GetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NotModifiedIfNoneMatchStar,
+ LoggedMessage.NotModifiedServed);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_NotConditionalRequest_False()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+
+ Assert.False(middleware.ContentIsNotModified(context));
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfModifiedSince_FallsbackToDateHeader()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+
+ context.HttpContext.Request.Headers.IfModifiedSince = HeaderUtilities.FormatDate(utcNow);
+
+ // Verify modifications in the past succeeds
+ context.CachedResponse.Headers[HeaderNames.Date] = HeaderUtilities.FormatDate(utcNow - TimeSpan.FromSeconds(10));
+ Assert.True(middleware.ContentIsNotModified(context));
+ Assert.Single(sink.Writes);
+
+ // Verify modifications at present succeeds
+ context.CachedResponse.Headers[HeaderNames.Date] = HeaderUtilities.FormatDate(utcNow);
+ Assert.True(middleware.ContentIsNotModified(context));
+ Assert.Equal(2, sink.Writes.Count);
+
+ // Verify modifications in the future fails
+ context.CachedResponse.Headers[HeaderNames.Date] = HeaderUtilities.FormatDate(utcNow + TimeSpan.FromSeconds(10));
+ Assert.False(middleware.ContentIsNotModified(context));
+
+ // Verify logging
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NotModifiedIfModifiedSinceSatisfied,
+ LoggedMessage.NotModifiedIfModifiedSinceSatisfied);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfModifiedSince_LastModifiedOverridesDateHeader()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+
+ context.HttpContext.Request.Headers.IfModifiedSince = HeaderUtilities.FormatDate(utcNow);
+
+ // Verify modifications in the past succeeds
+ context.CachedResponse.Headers[HeaderNames.Date] = HeaderUtilities.FormatDate(utcNow + TimeSpan.FromSeconds(10));
+ context.CachedResponse.Headers[HeaderNames.LastModified] = HeaderUtilities.FormatDate(utcNow - TimeSpan.FromSeconds(10));
+ Assert.True(middleware.ContentIsNotModified(context));
+ Assert.Single(sink.Writes);
+
+ // Verify modifications at present
+ context.CachedResponse.Headers[HeaderNames.Date] = HeaderUtilities.FormatDate(utcNow + TimeSpan.FromSeconds(10));
+ context.CachedResponse.Headers[HeaderNames.LastModified] = HeaderUtilities.FormatDate(utcNow);
+ Assert.True(middleware.ContentIsNotModified(context));
+ Assert.Equal(2, sink.Writes.Count);
+
+ // Verify modifications in the future fails
+ context.CachedResponse.Headers[HeaderNames.Date] = HeaderUtilities.FormatDate(utcNow - TimeSpan.FromSeconds(10));
+ context.CachedResponse.Headers[HeaderNames.LastModified] = HeaderUtilities.FormatDate(utcNow + TimeSpan.FromSeconds(10));
+ Assert.False(middleware.ContentIsNotModified(context));
+
+ // Verify logging
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NotModifiedIfModifiedSinceSatisfied,
+ LoggedMessage.NotModifiedIfModifiedSinceSatisfied);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfNoneMatch_Overrides_IfModifiedSince_ToTrue()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+
+ // This would fail the IfModifiedSince checks
+ context.HttpContext.Request.Headers.IfModifiedSince = HeaderUtilities.FormatDate(utcNow);
+ context.CachedResponse.Headers[HeaderNames.LastModified] = HeaderUtilities.FormatDate(utcNow + TimeSpan.FromSeconds(10));
+
+ context.HttpContext.Request.Headers.IfNoneMatch = EntityTagHeaderValue.Any.ToString();
+ Assert.True(middleware.ContentIsNotModified(context));
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NotModifiedIfNoneMatchStar);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfNoneMatch_Overrides_IfModifiedSince_ToFalse()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+
+ // This would pass the IfModifiedSince checks
+ context.HttpContext.Request.Headers.IfModifiedSince = HeaderUtilities.FormatDate(utcNow);
+ context.CachedResponse.Headers[HeaderNames.LastModified] = HeaderUtilities.FormatDate(utcNow - TimeSpan.FromSeconds(10));
+
+ context.HttpContext.Request.Headers.IfNoneMatch = "\"E1\"";
+ Assert.False(middleware.ContentIsNotModified(context));
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfNoneMatch_AnyWithoutETagInResponse_False()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+ context.HttpContext.Request.Headers.IfNoneMatch = "\"E1\"";
+
+ Assert.False(middleware.ContentIsNotModified(context));
+ Assert.Empty(sink.Writes);
+ }
+
+ public static TheoryData<EntityTagHeaderValue, EntityTagHeaderValue> EquivalentWeakETags
+ {
+ get
+ {
+ return new TheoryData<EntityTagHeaderValue, EntityTagHeaderValue>
+ {
+ { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag\"") },
+ { new EntityTagHeaderValue("\"tag\"", true), new EntityTagHeaderValue("\"tag\"") },
+ { new EntityTagHeaderValue("\"tag\""), new EntityTagHeaderValue("\"tag\"", true) },
+ { new EntityTagHeaderValue("\"tag\"", true), new EntityTagHeaderValue("\"tag\"", true) }
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(EquivalentWeakETags))]
+ public void ContentIsNotModified_IfNoneMatch_ExplicitWithMatch_True(EntityTagHeaderValue responseETag, EntityTagHeaderValue requestETag)
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+ context.CachedResponse.Headers[HeaderNames.ETag] = responseETag.ToString();
+ context.HttpContext.Request.Headers.IfNoneMatch = requestETag.ToString();
+
+ Assert.True(middleware.ContentIsNotModified(context));
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NotModifiedIfNoneMatchMatched);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfNoneMatch_ExplicitWithoutMatch_False()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+ context.CachedResponse.Headers[HeaderNames.ETag] = "\"E2\"";
+ context.HttpContext.Request.Headers.IfNoneMatch = "\"E1\"";
+
+ Assert.False(middleware.ContentIsNotModified(context));
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void ContentIsNotModified_IfNoneMatch_MatchesAtLeastOneValue_True()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+ context.CachedResponse.Headers[HeaderNames.ETag] = "\"E2\"";
+ context.HttpContext.Request.Headers.IfNoneMatch = new string[] { "\"E0\", \"E1\"", "\"E1\", \"E2\"" };
+
+ Assert.True(middleware.ContentIsNotModified(context));
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.NotModifiedIfNoneMatchMatched);
+ }
+
+ [Fact]
+ public void StartResponsegAsync_IfAllowResponseCaptureIsTrue_SetsResponseTime()
+ {
+ var clock = new TestClock
+ {
+ UtcNow = DateTimeOffset.UtcNow
+ };
+ var middleware = TestUtils.CreateTestMiddleware(options: new OutputCacheOptions
+ {
+ SystemClock = clock
+ });
+ var context = TestUtils.CreateTestContext();
+ context.ResponseTime = null;
+
+ middleware.StartResponse(context);
+
+ Assert.Equal(clock.UtcNow, context.ResponseTime);
+ }
+
+ [Fact]
+ public void StartResponseAsync_IfAllowResponseCaptureIsTrue_SetsResponseTimeOnlyOnce()
+ {
+ var clock = new TestClock
+ {
+ UtcNow = DateTimeOffset.UtcNow
+ };
+ var middleware = TestUtils.CreateTestMiddleware(options: new OutputCacheOptions
+ {
+ SystemClock = clock
+ });
+ var context = TestUtils.CreateTestContext();
+ var initialTime = clock.UtcNow;
+ context.ResponseTime = null;
+
+ middleware.StartResponse(context);
+ Assert.Equal(initialTime, context.ResponseTime);
+
+ clock.UtcNow += TimeSpan.FromSeconds(10);
+
+ middleware.StartResponse(context);
+ Assert.NotEqual(clock.UtcNow, context.ResponseTime);
+ Assert.Equal(initialTime, context.ResponseTime);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_DefaultResponseValidity_Is60Seconds()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext();
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(TimeSpan.FromSeconds(60), context.CachedResponseValidFor);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_ResponseValidity_IgnoresExpiryIfAvailable()
+ {
+ // The Expires header should not be used when set in the response
+
+ var clock = new TestClock
+ {
+ UtcNow = DateTimeOffset.MinValue
+ };
+ var options = new OutputCacheOptions
+ {
+ SystemClock = clock
+ };
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, options: options);
+ var context = TestUtils.CreateTestContext();
+
+ context.ResponseTime = clock.UtcNow;
+ context.HttpContext.Response.Headers.Expires = HeaderUtilities.FormatDate(clock.UtcNow + TimeSpan.FromSeconds(11));
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(options.DefaultExpirationTimeSpan, context.CachedResponseValidFor);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_ResponseValidity_UseMaxAgeIfAvailable()
+ {
+ // The MaxAge header should not be used if set in the response
+
+ var clock = new TestClock
+ {
+ UtcNow = DateTimeOffset.UtcNow
+ };
+ var sink = new TestSink();
+ var options = new OutputCacheOptions
+ {
+ SystemClock = clock
+ };
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, options: options);
+ var context = TestUtils.CreateTestContext();
+
+ context.ResponseTime = clock.UtcNow;
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ MaxAge = TimeSpan.FromSeconds(12)
+ }.ToString();
+
+ context.HttpContext.Response.Headers.Expires = HeaderUtilities.FormatDate(clock.UtcNow + TimeSpan.FromSeconds(11));
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(options.DefaultExpirationTimeSpan, context.CachedResponseValidFor);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_ResponseValidity_UseSharedMaxAgeIfAvailable()
+ {
+ var clock = new TestClock
+ {
+ UtcNow = DateTimeOffset.UtcNow
+ };
+ var sink = new TestSink();
+ var options = new OutputCacheOptions
+ {
+ SystemClock = clock
+ };
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, options: options);
+ var context = TestUtils.CreateTestContext();
+
+ context.ResponseTime = clock.UtcNow;
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ MaxAge = TimeSpan.FromSeconds(12),
+ SharedMaxAge = TimeSpan.FromSeconds(13)
+ }.ToString();
+ context.HttpContext.Response.Headers.Expires = HeaderUtilities.FormatDate(clock.UtcNow + TimeSpan.FromSeconds(11));
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(options.DefaultExpirationTimeSpan, context.CachedResponseValidFor);
+ Assert.Empty(sink.Writes);
+ }
+
+ public static TheoryData<StringValues> NullOrEmptyVaryRules
+ {
+ get
+ {
+ return new TheoryData<StringValues>
+ {
+ default(StringValues),
+ StringValues.Empty,
+ new StringValues((string)null),
+ new StringValues(string.Empty),
+ new StringValues((string[])null),
+ new StringValues(new string[0]),
+ new StringValues(new string[] { null }),
+ new StringValues(new string[] { string.Empty })
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(NullOrEmptyVaryRules))]
+ public void FinalizeCacheHeadersAsync_UpdateCachedVaryByRules_NullOrEmptyRules(StringValues vary)
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ context.HttpContext.Response.Headers.Vary = vary;
+ context.HttpContext.Features.Set<IOutputCacheFeature>(new OutputCacheFeature(context));
+ context.CacheVaryByRules.QueryKeys = vary;
+
+ middleware.FinalizeCacheHeaders(context);
+
+ // Vary rules should not be updated
+ Assert.Equal(0, cache.SetCount);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_AddsDate_IfNoneSpecified()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext();
+ // ResponseTime is the actual value that's used to set the Date header in FinalizeCacheHeadersAsync
+ context.ResponseTime = utcNow;
+
+ Assert.True(StringValues.IsNullOrEmpty(context.HttpContext.Response.Headers.Date));
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(HeaderUtilities.FormatDate(utcNow), context.HttpContext.Response.Headers.Date);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_IgnoresDate_IfSpecified()
+ {
+ // The Date header should not be used when set in the response
+
+ var utcNow = DateTimeOffset.UtcNow;
+ var responseTime = utcNow + TimeSpan.FromSeconds(10);
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext();
+
+ context.HttpContext.Response.Headers.Date = HeaderUtilities.FormatDate(utcNow);
+ context.ResponseTime = responseTime;
+
+ Assert.Equal(HeaderUtilities.FormatDate(utcNow), context.HttpContext.Response.Headers.Date);
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(HeaderUtilities.FormatDate(responseTime), context.HttpContext.Response.Headers.Date);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_StoresCachedResponse_InState()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext();
+
+ Assert.Null(context.CachedResponse);
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.NotNull(context.CachedResponse);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public void FinalizeCacheHeadersAsync_StoresHeaders()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink);
+ var context = TestUtils.CreateTestContext();
+
+ context.HttpContext.Response.Headers.Vary = "HeaderB, heaDera";
+
+ middleware.FinalizeCacheHeaders(context);
+
+ Assert.Equal(new StringValues(new[] { "HeaderB, heaDera" }), context.CachedResponse.Headers[HeaderNames.Vary]);
+ }
+
+ [Fact]
+ public async Task FinalizeCacheBody_Cache_IfContentLengthMatches()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ middleware.ShimResponseStream(context);
+ context.HttpContext.Response.ContentLength = 20;
+
+ await context.HttpContext.Response.WriteAsync(new string('0', 20));
+
+ context.CachedResponse = new OutputCacheEntry { Headers = new() };
+ context.CacheKey = "BaseKey";
+ context.CachedResponseValidFor = TimeSpan.FromSeconds(10);
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ Assert.Equal(1, cache.SetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseCached);
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task FinalizeCacheBody_DoNotCache_IfContentLengthMismatches(string method)
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ middleware.ShimResponseStream(context);
+ context.HttpContext.Response.ContentLength = 9;
+ context.HttpContext.Request.Method = method;
+
+ await context.HttpContext.Response.WriteAsync(new string('0', 10));
+
+ context.CachedResponse = new OutputCacheEntry();
+ context.CacheKey = "BaseKey";
+ context.CachedResponseValidFor = TimeSpan.FromSeconds(10);
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ Assert.Equal(0, cache.SetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseContentLengthMismatchNotCached);
+ }
+
+ [Theory]
+ [InlineData(false)]
+ [InlineData(true)]
+ public async Task FinalizeCacheBody_RequestHead_Cache_IfContentLengthPresent_AndBodyAbsentOrOfSameLength(bool includeBody)
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ middleware.ShimResponseStream(context);
+ context.HttpContext.Response.ContentLength = 10;
+ context.HttpContext.Request.Method = "HEAD";
+
+ if (includeBody)
+ {
+ // A response to HEAD should not include a body, but it may be present
+ await context.HttpContext.Response.WriteAsync(new string('0', 10));
+ }
+
+ context.CachedResponse = new OutputCacheEntry { Headers = new() };
+ context.CacheKey = "BaseKey";
+ context.CachedResponseValidFor = TimeSpan.FromSeconds(10);
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ Assert.Equal(1, cache.SetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseCached);
+ }
+
+ [Fact]
+ public async Task FinalizeCacheBody_Cache_IfContentLengthAbsent()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ middleware.ShimResponseStream(context);
+
+ await context.HttpContext.Response.WriteAsync(new string('0', 10));
+
+ context.CachedResponse = new OutputCacheEntry { Headers = new HeaderDictionary() };
+ context.CacheKey = "BaseKey";
+ context.CachedResponseValidFor = TimeSpan.FromSeconds(10);
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ Assert.Equal(1, cache.SetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseCached);
+ }
+
+ [Fact]
+ public async Task FinalizeCacheBody_DoNotCache_IfIsResponseCacheableFalse()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ middleware.ShimResponseStream(context);
+ await context.HttpContext.Response.WriteAsync(new string('0', 10));
+ context.AllowCacheStorage = false;
+ context.CacheKey = "BaseKey";
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ Assert.Equal(0, cache.SetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseNotCached);
+ }
+
+ [Fact]
+ public async Task FinalizeCacheBody_DoNotCache_IfBufferingDisabled()
+ {
+ var cache = new TestOutputCache();
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(testSink: sink, cache: cache);
+ var context = TestUtils.CreateTestContext(cache: cache);
+
+ middleware.ShimResponseStream(context);
+ await context.HttpContext.Response.WriteAsync(new string('0', 10));
+
+ context.OutputCacheStream.DisableBuffering();
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ Assert.Equal(0, cache.SetCount);
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseNotCached);
+ }
+
+ [Fact]
+ public async Task FinalizeCacheBody_DoNotCache_IfSizeTooBig()
+ {
+ var sink = new TestSink();
+ var middleware = TestUtils.CreateTestMiddleware(
+ testSink: sink,
+ keyProvider: new TestResponseCachingKeyProvider("BaseKey"),
+ cache: new MemoryOutputCacheStore(new MemoryCache(new MemoryCacheOptions
+ {
+ SizeLimit = 100
+ })));
+ var context = TestUtils.CreateTestContext();
+ middleware.TryGetRequestPolicies(context.HttpContext, out var policies);
+ middleware.ShimResponseStream(context);
+
+ await context.HttpContext.Response.WriteAsync(new string('0', 101));
+
+ context.CachedResponse = new OutputCacheEntry() { Headers = new HeaderDictionary() };
+ context.CacheKey = "BaseKey";
+ context.CachedResponseValidFor = TimeSpan.FromSeconds(10);
+
+ await middleware.FinalizeCacheBodyAsync(context);
+
+ // The response cached message will be logged but the adding of the entry will no-op
+ TestUtils.AssertLoggedMessages(
+ sink.Writes,
+ LoggedMessage.ResponseCached);
+
+ // The entry cannot be retrieved
+ Assert.False(await middleware.TryServeFromCacheAsync(context, policies));
+ }
+
+ [Fact]
+ public void AddOutputCachingFeature_SecondInvocation_Throws()
+ {
+ var httpContext = new DefaultHttpContext();
+ var context = TestUtils.CreateTestContext(httpContext);
+
+ // Should not throw
+ OutputCacheMiddleware.AddOutputCacheFeature(context);
+
+ // Should throw
+ Assert.ThrowsAny<InvalidOperationException>(() => OutputCacheMiddleware.AddOutputCacheFeature(context));
+ }
+
+ private class FakeResponseFeature : HttpResponseFeature
+ {
+ public override void OnStarting(Func<object, Task> callback, object state) { }
+ }
+
+ [Fact]
+ public void GetOrderCasingNormalizedStringValues_NormalizesCasingToUpper()
+ {
+ var uppercaseStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
+ var lowercaseStrings = new StringValues(new[] { "stringA", "stringB" });
+
+ var normalizedStrings = OutputCacheMiddleware.GetOrderCasingNormalizedStringValues(lowercaseStrings);
+
+ Assert.Equal(uppercaseStrings, normalizedStrings);
+ }
+
+ [Fact]
+ public void GetOrderCasingNormalizedStringValues_NormalizesOrder()
+ {
+ var orderedStrings = new StringValues(new[] { "STRINGA", "STRINGB" });
+ var reverseOrderStrings = new StringValues(new[] { "STRINGB", "STRINGA" });
+
+ var normalizedStrings = OutputCacheMiddleware.GetOrderCasingNormalizedStringValues(reverseOrderStrings);
+
+ Assert.Equal(orderedStrings, normalizedStrings);
+ }
+
+ [Fact]
+ public void GetOrderCasingNormalizedStringValues_PreservesCommas()
+ {
+ var originalStrings = new StringValues(new[] { "STRINGA, STRINGB" });
+
+ var normalizedStrings = OutputCacheMiddleware.GetOrderCasingNormalizedStringValues(originalStrings);
+
+ Assert.Equal(originalStrings, normalizedStrings);
+ }
+
+ [Fact]
+ public async Task Locking_PreventsConcurrentRequests()
+ {
+ var responseCounter = 0;
+
+ var task1Executing = new ManualResetEventSlim(false);
+ var task2Executing = new ManualResetEventSlim(false);
+
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(build => build.Cache());
+
+ var middleware = TestUtils.CreateTestMiddleware(options: options, next: async c =>
+ {
+ responseCounter++;
+ task1Executing.Set();
+
+ // Wait for the second request to start before processing the first one
+ task2Executing.Wait();
+
+ // Simluate some delay to allow for the second request to run while this one is pending
+ await Task.Delay(500);
+
+ c.Response.Write("Hello" + responseCounter);
+ });
+
+ var context1 = TestUtils.CreateTestContext();
+ context1.HttpContext.Request.Method = "GET";
+ context1.HttpContext.Request.Path = "/";
+
+ var context2 = TestUtils.CreateTestContext();
+ context2.HttpContext.Request.Method = "GET";
+ context2.HttpContext.Request.Path = "/";
+
+ var task1 = Task.Run(() => middleware.Invoke(context1.HttpContext));
+
+ // Wait for the first request to be processed before sending a second one
+ task1Executing.Wait();
+
+ var task2 = Task.Run(() => middleware.Invoke(context2.HttpContext));
+
+ task2Executing.Set();
+
+ await Task.WhenAll(task1, task2);
+
+ Assert.Equal(1, responseCounter);
+ }
+
+ [Fact]
+ public async Task Locking_ExecuteAllRequestsWhenDisabled()
+ {
+ var responseCounter = 0;
+
+ var task1Executing = new ManualResetEventSlim(false);
+ var task2Executing = new ManualResetEventSlim(false);
+
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(build => build.Cache().AllowLocking(false));
+
+ var middleware = TestUtils.CreateTestMiddleware(options: options, next: c =>
+ {
+ responseCounter++;
+
+ switch (responseCounter)
+ {
+ case 1:
+ task1Executing.Set();
+ task2Executing.Wait();
+ break;
+ case 2:
+ task1Executing.Wait();
+ task2Executing.Set();
+ break;
+ }
+
+ c.Response.Write("Hello" + responseCounter);
+ return Task.CompletedTask;
+ });
+
+ var context1 = TestUtils.CreateTestContext();
+ context1.HttpContext.Request.Method = "GET";
+ context1.HttpContext.Request.Path = "/";
+
+ var context2 = TestUtils.CreateTestContext();
+ context2.HttpContext.Request.Method = "GET";
+ context2.HttpContext.Request.Path = "/";
+
+ var task1 = Task.Run(() => middleware.Invoke(context1.HttpContext));
+
+ var task2 = Task.Run(() => middleware.Invoke(context2.HttpContext));
+
+ await Task.WhenAll(task1, task2);
+
+ Assert.Equal(2, responseCounter);
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCachePoliciesTests.cs b/src/Middleware/OutputCaching/test/OutputCachePoliciesTests.cs
new file mode 100644
index 0000000000..a33e4f103a
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCachePoliciesTests.cs
@@ -0,0 +1,289 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.OutputCaching.Policies;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCachePoliciesTests
+{
+ [Fact]
+ public async Task DefaultCachePolicy_EnablesCache()
+ {
+ IOutputCachePolicy policy = DefaultPolicy.Instance;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.True(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task DefaultCachePolicy_AllowsLocking()
+ {
+ IOutputCachePolicy policy = DefaultPolicy.Instance;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.True(context.AllowLocking);
+ }
+
+ [Fact]
+ public async Task DefaultCachePolicy_VariesByStar()
+ {
+ IOutputCachePolicy policy = DefaultPolicy.Instance;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal("*", context.CacheVaryByRules.QueryKeys);
+ }
+
+ [Fact]
+ public async Task EnableCachePolicy_DisablesCache()
+ {
+ IOutputCachePolicy policy = EnableCachePolicy.Disabled;
+ var context = TestUtils.CreateUninitializedContext();
+ context.EnableOutputCaching = true;
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task ExpirationPolicy_SetsResponseExpirationTimeSpan()
+ {
+ var duration = TimeSpan.FromDays(1);
+ IOutputCachePolicy policy = new ExpirationPolicy(duration);
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(duration, context.ResponseExpirationTimeSpan);
+ }
+
+ [Fact]
+ public async Task LockingPolicy_EnablesLocking()
+ {
+ IOutputCachePolicy policy = LockingPolicy.Enabled;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.True(context.AllowLocking);
+ }
+
+ [Fact]
+ public async Task LockingPolicy_DisablesLocking()
+ {
+ IOutputCachePolicy policy = LockingPolicy.Disabled;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.AllowLocking);
+ }
+
+ [Fact]
+ public async Task NoLookupPolicy_DisablesLookup()
+ {
+ IOutputCachePolicy policy = NoLookupPolicy.Instance;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.AllowCacheLookup);
+ }
+
+ [Fact]
+ public async Task NoStorePolicy_DisablesStore()
+ {
+ IOutputCachePolicy policy = NoStorePolicy.Instance;
+ var context = TestUtils.CreateUninitializedContext();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.AllowCacheStorage);
+ }
+
+ [Theory]
+ [InlineData(true, true, true)]
+ [InlineData(true, false, false)]
+ [InlineData(false, true, false)]
+ [InlineData(false, false, false)]
+ public async Task PredicatePolicy_Filters(bool filter, bool enabled, bool expected)
+ {
+ IOutputCachePolicy predicate = new PredicatePolicy(c => ValueTask.FromResult(filter), enabled ? EnableCachePolicy.Enabled : EnableCachePolicy.Disabled);
+ var context = TestUtils.CreateUninitializedContext();
+
+ await predicate.CacheRequestAsync(context, default);
+
+ Assert.Equal(expected, context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task ProfilePolicy_UsesNamedProfile()
+ {
+ var options = new OutputCacheOptions();
+ options.AddPolicy("enabled", EnableCachePolicy.Enabled);
+ options.AddPolicy("disabled", EnableCachePolicy.Disabled);
+ var context = TestUtils.CreateUninitializedContext(options: options);
+
+ IOutputCachePolicy policy = new NamedPolicy("enabled");
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.True(context.EnableOutputCaching);
+
+ policy = new NamedPolicy("disabled");
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task TagsPolicy_Tags()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ IOutputCachePolicy policy = new TagsPolicy("tag1", "tag2");
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Contains("tag1", context.Tags);
+ Assert.Contains("tag2", context.Tags);
+ }
+
+ [Fact]
+ public async Task VaryByHeadersPolicy_IsEmpty()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ IOutputCachePolicy policy = new VaryByHeaderPolicy();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Empty(context.CacheVaryByRules.HeaderNames);
+ }
+
+ [Fact]
+ public async Task VaryByHeadersPolicy_AddsSingleHeader()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var header = "header";
+
+ IOutputCachePolicy policy = new VaryByHeaderPolicy(header);
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(header, context.CacheVaryByRules.HeaderNames);
+ }
+
+ [Fact]
+ public async Task VaryByHeadersPolicy_AddsMultipleHeaders()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var headers = new[] { "header1", "header2" };
+
+ IOutputCachePolicy policy = new VaryByHeaderPolicy(headers);
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(headers, context.CacheVaryByRules.HeaderNames);
+ }
+
+ [Fact]
+ public async Task VaryByQueryPolicy_IsEmpty()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ IOutputCachePolicy policy = new VaryByQueryPolicy();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Empty(context.CacheVaryByRules.QueryKeys);
+ }
+
+ [Fact]
+ public async Task VaryByQueryPolicy_AddsSingleHeader()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var query = "query";
+
+ IOutputCachePolicy policy = new VaryByQueryPolicy(query);
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(query, context.CacheVaryByRules.QueryKeys);
+ }
+
+ [Fact]
+ public async Task VaryByQueryPolicy_AddsMultipleHeaders()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var queries = new[] { "query1", "query2" };
+
+ IOutputCachePolicy policy = new VaryByQueryPolicy(queries);
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(queries, context.CacheVaryByRules.QueryKeys);
+ }
+
+ [Fact]
+ public async Task VaryByValuePolicy_SingleValue()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var value = "value";
+
+ IOutputCachePolicy policy = new VaryByValuePolicy(context => value);
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(value, context.CacheVaryByRules.VaryByPrefix);
+ }
+
+ [Fact]
+ public async Task VaryByValuePolicy_SingleValueAsync()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var value = "value";
+
+ IOutputCachePolicy policy = new VaryByValuePolicy((context, token) => ValueTask.FromResult(value));
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Equal(value, context.CacheVaryByRules.VaryByPrefix);
+ }
+
+ [Fact]
+ public async Task VaryByValuePolicy_KeyValuePair()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var key = "key";
+ var value = "value";
+
+ IOutputCachePolicy policy = new VaryByValuePolicy(context => new KeyValuePair<string, string>(key, value));
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Contains(new KeyValuePair<string, string>(key, value), context.CacheVaryByRules.VaryByCustom);
+ }
+
+ [Fact]
+ public async Task VaryByValuePolicy_KeyValuePairAsync()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var key = "key";
+ var value = "value";
+
+ IOutputCachePolicy policy = new VaryByValuePolicy((context, token) => ValueTask.FromResult(new KeyValuePair<string, string>(key, value)));
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.Contains(new KeyValuePair<string, string>(key, value), context.CacheVaryByRules.VaryByCustom);
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCachePolicyBuilderTests.cs b/src/Middleware/OutputCaching/test/OutputCachePolicyBuilderTests.cs
new file mode 100644
index 0000000000..6fbe8e193f
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCachePolicyBuilderTests.cs
@@ -0,0 +1,276 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCachePolicyBuilderTests
+{
+ [Fact]
+ public void BuildPolicy_CreatesDefaultPolicy()
+ {
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.Build();
+
+ Assert.Equal(DefaultPolicy.Instance, policy);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesExpirePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ var duration = 42;
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.Expire(TimeSpan.FromSeconds(duration)).Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Equal(duration, context.ResponseExpirationTimeSpan?.TotalSeconds);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesNoStorePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.NoCache().Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.False(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_AddsCustomPolicy()
+ {
+ var options = new OutputCacheOptions();
+ var name = "MyPolicy";
+ var duration = 42;
+ options.AddPolicy(name, b => b.Expire(TimeSpan.FromSeconds(duration)));
+
+ var context = TestUtils.CreateUninitializedContext(options: options);
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.AddPolicy(new NamedPolicy(name)).Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Equal(duration, context.ResponseExpirationTimeSpan?.TotalSeconds);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesVaryByHeaderPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ context.HttpContext.Request.Headers["HeaderA"] = "ValueA";
+ context.HttpContext.Request.Headers["HeaderB"] = "ValueB";
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.VaryByHeader("HeaderA", "HeaderC").Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("HeaderA", (IEnumerable<string>)context.CacheVaryByRules.HeaderNames);
+ Assert.Contains("HeaderC", (IEnumerable<string>)context.CacheVaryByRules.HeaderNames);
+ Assert.DoesNotContain("HeaderB", (IEnumerable<string>)context.CacheVaryByRules.HeaderNames);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesVaryByQueryPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ context.HttpContext.Request.QueryString = new QueryString("?QueryA=ValueA&QueryB=ValueB");
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.VaryByQuery("QueryA", "QueryC").Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("QueryA", (IEnumerable<string>)context.CacheVaryByRules.QueryKeys);
+ Assert.Contains("QueryC", (IEnumerable<string>)context.CacheVaryByRules.QueryKeys);
+ Assert.DoesNotContain("QueryB", (IEnumerable<string>)context.CacheVaryByRules.QueryKeys);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesVaryByRoutePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+ context.HttpContext.Request.RouteValues = new Routing.RouteValueDictionary()
+ {
+ ["RouteA"] = "ValueA",
+ ["RouteB"] = 123.456,
+ };
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.VaryByRouteValue("RouteA", "RouteC").Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("RouteA", (IEnumerable<string>)context.CacheVaryByRules.RouteValueNames);
+ Assert.Contains("RouteC", (IEnumerable<string>)context.CacheVaryByRules.RouteValueNames);
+ Assert.DoesNotContain("RouteB", (IEnumerable<string>)context.CacheVaryByRules.RouteValueNames);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesVaryByValuePolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.VaryByValue(context => new KeyValuePair<string, string>("color", "blue")).Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Equal("blue", context.CacheVaryByRules.VaryByCustom["color"]);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CreatesTagPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.Tag("tag1", "tag2").Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Contains("tag1", context.Tags);
+ Assert.Contains("tag2", context.Tags);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_AllowsLocking()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.AllowLocking);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_EnablesLocking()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.AllowLocking(true).Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.AllowLocking);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_DisablesLocking()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.AllowLocking(false).Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.False(context.AllowLocking);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_ClearsDefaultPolicy()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.Clear().Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.False(context.AllowLocking);
+ Assert.False(context.AllowCacheLookup);
+ Assert.False(context.AllowCacheStorage);
+ Assert.False(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_DisablesCache()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.NoCache().Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.False(context.EnableOutputCaching);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_EnablesCache()
+ {
+ var context = TestUtils.CreateUninitializedContext();
+
+ var builder = new OutputCachePolicyBuilder();
+ var policy = builder.NoCache().Cache().Build();
+ await policy.CacheRequestAsync(context, cancellation: default);
+
+ Assert.True(context.EnableOutputCaching);
+ }
+
+ [Theory]
+ [InlineData(0, 1)]
+ [InlineData(1, 2)]
+ [InlineData(2, 3)]
+ public async Task BuildPolicy_ChecksWithPredicate(int source, int expected)
+ {
+ // Each predicate should override the duration from the first base policy
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(build => build.Expire(TimeSpan.FromSeconds(1)));
+ options.AddBasePolicy(build => build.With(c => source == 1).Expire(TimeSpan.FromSeconds(2)));
+ options.AddBasePolicy(build => build.With(c => source == 2).Expire(TimeSpan.FromSeconds(3)));
+
+ var context = TestUtils.CreateUninitializedContext(options: options);
+
+ foreach (var policy in options.BasePolicies)
+ {
+ await policy.CacheRequestAsync(context, default);
+ }
+
+ Assert.True(context.EnableOutputCaching);
+ Assert.Equal(expected, context.ResponseExpirationTimeSpan?.TotalSeconds);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_NoDefaultWithFalsePredicate()
+ {
+ // Each predicate should override the duration from the first base policy
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(build => build.With(c => false).Expire(TimeSpan.FromSeconds(2)));
+
+ var context = TestUtils.CreateUninitializedContext(options: options);
+
+ foreach (var policy in options.BasePolicies)
+ {
+ await policy.CacheRequestAsync(context, default);
+ }
+
+ Assert.False(context.EnableOutputCaching);
+ Assert.NotEqual(2, context.ResponseExpirationTimeSpan?.TotalSeconds);
+ }
+
+ [Fact]
+ public async Task BuildPolicy_CacheReturnsDefault()
+ {
+ // Each predicate should override the duration from the first base policy
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(build => build.Cache());
+
+ var context = TestUtils.CreateUninitializedContext(options: options);
+
+ foreach (var policy in options.BasePolicies)
+ {
+ await policy.CacheRequestAsync(context, default);
+ }
+
+ Assert.True(context.EnableOutputCaching);
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCachePolicyProviderTests.cs b/src/Middleware/OutputCaching/test/OutputCachePolicyProviderTests.cs
new file mode 100644
index 0000000000..ce93251c18
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCachePolicyProviderTests.cs
@@ -0,0 +1,397 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.OutputCaching.Policies;
+using Microsoft.Extensions.Logging.Testing;
+using Microsoft.Extensions.Options;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCachePolicyProviderTests
+{
+ public static TheoryData<string> CacheableMethods
+ {
+ get
+ {
+ return new TheoryData<string>
+ {
+ HttpMethods.Get,
+ HttpMethods.Head
+ };
+ }
+ }
+
+ public static TheoryData<string> NonCacheableMethods
+ {
+ get
+ {
+ return new TheoryData<string>
+ {
+ HttpMethods.Post,
+ HttpMethods.Put,
+ HttpMethods.Delete,
+ HttpMethods.Trace,
+ HttpMethods.Connect,
+ HttpMethods.Options,
+ "",
+ null
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(CacheableMethods))]
+ public async Task AttemptOutputCaching_CacheableMethods_IsAllowed(string method)
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ var policies = new[] { new OutputCachePolicyBuilder().Build() };
+ context.HttpContext.Request.Method = method;
+
+ foreach (var policy in policies)
+ {
+ await policy.CacheRequestAsync(context, default);
+ }
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Theory]
+ [MemberData(nameof(NonCacheableMethods))]
+ public async Task AttemptOutputCaching_UncacheableMethods_NotAllowed(string method)
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ var policy = new OutputCachePolicyBuilder().Build();
+ context.HttpContext.Request.Method = method;
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.AllowCacheLookup);
+ Assert.False(context.AllowCacheStorage);
+ }
+
+ [Fact]
+ public async Task AttemptResponseCaching_AuthorizationHeaders_NotAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Request.Method = HttpMethods.Get;
+ context.HttpContext.Request.Headers.Authorization = "Placeholder";
+
+ var policy = new OutputCachePolicyBuilder().Build();
+
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.False(context.AllowCacheStorage);
+ Assert.False(context.AllowCacheLookup);
+ }
+
+ [Fact]
+ public async Task AllowCacheStorage_NoStore_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Request.Method = HttpMethods.Get;
+ context.HttpContext.Request.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ NoStore = true
+ }.ToString();
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task AllowCacheLookup_LegacyDirectives_OverridenByCacheControl()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Request.Method = HttpMethods.Get;
+ context.HttpContext.Request.Headers.Pragma = "no-cache";
+ context.HttpContext.Request.Headers.CacheControl = "max-age=10";
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.CacheRequestAsync(context, default);
+
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_NoPublic_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_Public_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ Public = true
+ }.ToString();
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_NoCache_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ NoCache = true
+ }.ToString();
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_ResponseNoStore_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ NoStore = true
+ }.ToString();
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_SetCookieHeader_NotAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.Headers.SetCookie = "cookieName=cookieValue";
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.False(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_VaryHeaderByStar_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.Headers.Vary = "*";
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_Private_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ Private = true
+ }.ToString();
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Theory]
+ [InlineData(StatusCodes.Status200OK)]
+ public async Task IsResponseCacheable_SuccessStatusCodes_IsAllowed(int statusCode)
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.StatusCode = statusCode;
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Theory]
+ [InlineData(StatusCodes.Status100Continue)]
+ [InlineData(StatusCodes.Status101SwitchingProtocols)]
+ [InlineData(StatusCodes.Status102Processing)]
+ [InlineData(StatusCodes.Status201Created)]
+ [InlineData(StatusCodes.Status202Accepted)]
+ [InlineData(StatusCodes.Status203NonAuthoritative)]
+ [InlineData(StatusCodes.Status204NoContent)]
+ [InlineData(StatusCodes.Status205ResetContent)]
+ [InlineData(StatusCodes.Status206PartialContent)]
+ [InlineData(StatusCodes.Status207MultiStatus)]
+ [InlineData(StatusCodes.Status208AlreadyReported)]
+ [InlineData(StatusCodes.Status226IMUsed)]
+ [InlineData(StatusCodes.Status300MultipleChoices)]
+ [InlineData(StatusCodes.Status301MovedPermanently)]
+ [InlineData(StatusCodes.Status302Found)]
+ [InlineData(StatusCodes.Status303SeeOther)]
+ [InlineData(StatusCodes.Status304NotModified)]
+ [InlineData(StatusCodes.Status305UseProxy)]
+ [InlineData(StatusCodes.Status306SwitchProxy)]
+ [InlineData(StatusCodes.Status307TemporaryRedirect)]
+ [InlineData(StatusCodes.Status308PermanentRedirect)]
+ [InlineData(StatusCodes.Status400BadRequest)]
+ [InlineData(StatusCodes.Status401Unauthorized)]
+ [InlineData(StatusCodes.Status402PaymentRequired)]
+ [InlineData(StatusCodes.Status403Forbidden)]
+ [InlineData(StatusCodes.Status404NotFound)]
+ [InlineData(StatusCodes.Status405MethodNotAllowed)]
+ [InlineData(StatusCodes.Status406NotAcceptable)]
+ [InlineData(StatusCodes.Status407ProxyAuthenticationRequired)]
+ [InlineData(StatusCodes.Status408RequestTimeout)]
+ [InlineData(StatusCodes.Status409Conflict)]
+ [InlineData(StatusCodes.Status410Gone)]
+ [InlineData(StatusCodes.Status411LengthRequired)]
+ [InlineData(StatusCodes.Status412PreconditionFailed)]
+ [InlineData(StatusCodes.Status413RequestEntityTooLarge)]
+ [InlineData(StatusCodes.Status414RequestUriTooLong)]
+ [InlineData(StatusCodes.Status415UnsupportedMediaType)]
+ [InlineData(StatusCodes.Status416RequestedRangeNotSatisfiable)]
+ [InlineData(StatusCodes.Status417ExpectationFailed)]
+ [InlineData(StatusCodes.Status418ImATeapot)]
+ [InlineData(StatusCodes.Status419AuthenticationTimeout)]
+ [InlineData(StatusCodes.Status421MisdirectedRequest)]
+ [InlineData(StatusCodes.Status422UnprocessableEntity)]
+ [InlineData(StatusCodes.Status423Locked)]
+ [InlineData(StatusCodes.Status424FailedDependency)]
+ [InlineData(StatusCodes.Status426UpgradeRequired)]
+ [InlineData(StatusCodes.Status428PreconditionRequired)]
+ [InlineData(StatusCodes.Status429TooManyRequests)]
+ [InlineData(StatusCodes.Status431RequestHeaderFieldsTooLarge)]
+ [InlineData(StatusCodes.Status451UnavailableForLegalReasons)]
+ [InlineData(StatusCodes.Status500InternalServerError)]
+ [InlineData(StatusCodes.Status501NotImplemented)]
+ [InlineData(StatusCodes.Status502BadGateway)]
+ [InlineData(StatusCodes.Status503ServiceUnavailable)]
+ [InlineData(StatusCodes.Status504GatewayTimeout)]
+ [InlineData(StatusCodes.Status505HttpVersionNotsupported)]
+ [InlineData(StatusCodes.Status506VariantAlsoNegotiates)]
+ [InlineData(StatusCodes.Status507InsufficientStorage)]
+ [InlineData(StatusCodes.Status508LoopDetected)]
+ [InlineData(StatusCodes.Status510NotExtended)]
+ [InlineData(StatusCodes.Status511NetworkAuthenticationRequired)]
+ public async Task IsResponseCacheable_NonSuccessStatusCodes_NotAllowed(int statusCode)
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.StatusCode = statusCode;
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheLookup);
+ Assert.False(context.AllowCacheStorage);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_NoExpiryRequirements_IsAllowed()
+ {
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
+
+ var utcNow = DateTimeOffset.UtcNow;
+ context.HttpContext.Response.Headers.Date = HeaderUtilities.FormatDate(utcNow);
+ context.ResponseTime = DateTimeOffset.MaxValue;
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_MaxAgeOverridesExpiry_IsAllowed()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ MaxAge = TimeSpan.FromSeconds(10)
+ }.ToString();
+ context.HttpContext.Response.Headers.Expires = HeaderUtilities.FormatDate(utcNow);
+ context.HttpContext.Response.Headers.Date = HeaderUtilities.FormatDate(utcNow);
+ context.ResponseTime = utcNow + TimeSpan.FromSeconds(9);
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+
+ [Fact]
+ public async Task IsResponseCacheable_SharedMaxAgeOverridesMaxAge_IsAllowed()
+ {
+ var utcNow = DateTimeOffset.UtcNow;
+ var sink = new TestSink();
+ var context = TestUtils.CreateTestContext(testSink: sink);
+ context.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
+ context.HttpContext.Response.Headers.CacheControl = new CacheControlHeaderValue()
+ {
+ MaxAge = TimeSpan.FromSeconds(10),
+ SharedMaxAge = TimeSpan.FromSeconds(15)
+ }.ToString();
+ context.HttpContext.Response.Headers.Date = HeaderUtilities.FormatDate(utcNow);
+ context.ResponseTime = utcNow + TimeSpan.FromSeconds(11);
+
+ var policy = new OutputCachePolicyBuilder().Build();
+ await policy.ServeResponseAsync(context, default);
+
+ Assert.True(context.AllowCacheStorage);
+ Assert.True(context.AllowCacheLookup);
+ Assert.Empty(sink.Writes);
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/OutputCacheTests.cs b/src/Middleware/OutputCaching/test/OutputCacheTests.cs
new file mode 100644
index 0000000000..83080b67ef
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/OutputCacheTests.cs
@@ -0,0 +1,985 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class OutputCacheTests
+{
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesCachedContent_IfAvailable(string method)
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesFreshContent_IfNotAvailable(string method)
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, "different"));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_Post()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.PostAsync("", new StringContent(string.Empty));
+ var subsequentResponse = await client.PostAsync("", new StringContent(string.Empty));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_Head_Get()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var subsequentResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, ""));
+ var initialResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, ""));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_Get_Head()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, ""));
+ var subsequentResponse = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, ""));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesCachedContent_If_CacheControlNoCache(string method)
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ // verify the response is cached
+ var cachedResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ await AssertCachedResponseAsync(initialResponse, cachedResponse);
+
+ // assert cached response still served
+ client.DefaultRequestHeaders.CacheControl =
+ new System.Net.Http.Headers.CacheControlHeaderValue { NoCache = true };
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesCachedContent_If_PragmaNoCache(string method)
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ // verify the response is cached
+ var cachedResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ await AssertCachedResponseAsync(initialResponse, cachedResponse);
+
+ // assert cached response still served
+ client.DefaultRequestHeaders.Pragma.Clear();
+ client.DefaultRequestHeaders.Pragma.Add(new System.Net.Http.Headers.NameValueHeaderValue("no-cache"));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesCachedContent_If_PathCasingDiffers(string method)
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, "path"));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, "PATH"));
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesFreshContent_If_PathCasingDiffers(string method)
+ {
+ var options = new OutputCacheOptions { UseCaseSensitivePaths = true };
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, "path"));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, "PATH"));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesFreshContent_If_ResponseExpired(string method)
+ {
+ var options = new OutputCacheOptions
+ {
+ DefaultExpirationTimeSpan = TimeSpan.FromMicroseconds(100)
+ };
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ await Task.Delay(1);
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesFreshContent_If_Authorization_HeaderExists(string method)
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("abc");
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Theory]
+ [InlineData("GET")]
+ [InlineData("HEAD")]
+ public async Task ServesCachedContent_If_Authorization_HeaderExists(string method)
+ {
+ var options = new OutputCacheOptions();
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ // This is added after the DefaultPolicy which disables caching for authenticated requests
+ options.AddBasePolicy(b => b.AddPolicy<AllowTestPolicy>());
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("abc");
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest(method, ""));
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfVaryHeader_Matches()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context => context.Response.Headers.Vary = HeaderNames.From);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.From = "user@example.com";
+ var initialResponse = await client.GetAsync("");
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_IfVaryHeader_Mismatches()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByHeader(HeaderNames.From).Build());
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.From = "user@example.com";
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.From = "user2@example.com";
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfVaryQueryKeys_Matches()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("query"));
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?query=value");
+ var subsequentResponse = await client.GetAsync("?query=value");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfVaryQueryKeysExplicit_Matches_QueryKeyCaseInsensitive()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("QueryA", "queryb"));
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?querya=valuea&queryb=valueb");
+ var subsequentResponse = await client.GetAsync("?QueryA=valuea&QueryB=valueb");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfVaryQueryKeyStar_Matches_QueryKeyCaseInsensitive()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("*"));
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?querya=valuea&queryb=valueb");
+ var subsequentResponse = await client.GetAsync("?QueryA=valuea&QueryB=valueb");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfVaryQueryKeyExplicit_Matches_OrderInsensitive()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("QueryB", "QueryA"));
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?QueryA=ValueA&QueryB=ValueB");
+ var subsequentResponse = await client.GetAsync("?QueryB=ValueB&QueryA=ValueA");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfVaryQueryKeyStar_Matches_OrderInsensitive()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("*"));
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?QueryA=ValueA&QueryB=ValueB");
+ var subsequentResponse = await client.GetAsync("?QueryB=ValueB&QueryA=ValueA");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_IfVaryQueryKey_Mismatches()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("query").Build());
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?query=value");
+ var subsequentResponse = await client.GetAsync("?query=value2");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfOtherVaryQueryKey_Mismatches()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(b => b.VaryByQuery("query").Build());
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?other=value1");
+ var subsequentResponse = await client.GetAsync("?other=value2");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_IfVaryQueryKeyExplicit_Mismatch_QueryKeyCaseSensitive()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(new VaryByQueryPolicy("QueryA", "QueryB"));
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?querya=valuea&queryb=valueb");
+ var subsequentResponse = await client.GetAsync("?querya=ValueA&queryb=ValueB");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_IfVaryQueryKeyStar_Mismatch_QueryKeyValueCaseSensitive()
+ {
+ var options = new OutputCacheOptions();
+ options.AddBasePolicy(new VaryByQueryPolicy("*"));
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("?querya=valuea&queryb=valueb");
+ var subsequentResponse = await client.GetAsync("?querya=ValueA&queryb=ValueB");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfRequestRequirements_NotMet()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue()
+ {
+ MaxAge = TimeSpan.FromSeconds(0)
+ };
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task Serves504_IfOnlyIfCachedHeader_IsSpecified()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue()
+ {
+ OnlyIfCached = true
+ };
+ var subsequentResponse = await client.GetAsync("/different");
+
+ initialResponse.EnsureSuccessStatusCode();
+ Assert.Equal(System.Net.HttpStatusCode.GatewayTimeout, subsequentResponse.StatusCode);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_IfSetCookie_IsSpecified()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context => context.Response.Headers.SetCookie = "cookieName=cookieValue");
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfSubsequentRequestContainsNoStore()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue()
+ {
+ NoStore = true
+ };
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfInitialRequestContainsNoStore()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue()
+ {
+ NoStore = true
+ };
+ var initialResponse = await client.GetAsync("");
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfInitialResponseContainsNoStore()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context => context.Response.Headers.CacheControl = CacheControlHeaderValue.NoStoreString);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task Serves304_IfIfModifiedSince_Satisfied()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context =>
+ {
+ // Ensure these headers are also returned on the subsequent response
+ context.Response.GetTypedHeaders().ETag = new EntityTagHeaderValue("\"E1\"");
+ context.Response.Headers.ContentLocation = "/";
+ context.Response.Headers.Vary = HeaderNames.From;
+ });
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.MaxValue;
+ var subsequentResponse = await client.GetAsync("");
+
+ initialResponse.EnsureSuccessStatusCode();
+ Assert.Equal(System.Net.HttpStatusCode.NotModified, subsequentResponse.StatusCode);
+ Assert304Headers(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfIfModifiedSince_NotSatisfied()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.IfModifiedSince = DateTimeOffset.MinValue;
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task Serves304_IfIfNoneMatch_Satisfied()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context =>
+ {
+ context.Response.GetTypedHeaders().ETag = new EntityTagHeaderValue("\"E1\"");
+ context.Response.Headers.ContentLocation = "/";
+ context.Response.Headers.Vary = HeaderNames.From;
+ });
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.IfNoneMatch.Add(new System.Net.Http.Headers.EntityTagHeaderValue("\"E1\""));
+ var subsequentResponse = await client.GetAsync("");
+
+ initialResponse.EnsureSuccessStatusCode();
+ Assert.Equal(System.Net.HttpStatusCode.NotModified, subsequentResponse.StatusCode);
+ Assert304Headers(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfIfNoneMatch_NotSatisfied()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context => context.Response.GetTypedHeaders().ETag = new EntityTagHeaderValue("\"E1\""));
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.IfNoneMatch.Add(new System.Net.Http.Headers.EntityTagHeaderValue("\"E2\""));
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfBodySize_IsCacheable()
+ {
+ var options = new OutputCacheOptions
+ {
+ MaximumBodySize = 1000
+ };
+ options.AddBasePolicy(b => b.Build());
+
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: options);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_IfBodySize_IsNotCacheable()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: new OutputCacheOptions()
+ {
+ MaximumBodySize = 1
+ });
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("");
+ var subsequentResponse = await client.GetAsync("/different");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesFreshContent_CaseSensitivePaths_IsNotCacheable()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(options: new OutputCacheOptions()
+ {
+ UseCaseSensitivePaths = true
+ });
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.GetAsync("/path");
+ var subsequentResponse = await client.GetAsync("/Path");
+
+ await AssertFreshResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_WithoutReplacingCachedVaryBy_OnCacheMiss()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context => context.Response.Headers.Vary = HeaderNames.From);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.From = "user@example.com";
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.From = "user2@example.com";
+ var otherResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.From = "user@example.com";
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfCachedVaryByNotUpdated_OnCacheMiss()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching(contextAction: context => context.Response.Headers.Vary = context.Request.Headers.Pragma);
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ client.DefaultRequestHeaders.From = "user@example.com";
+ client.DefaultRequestHeaders.Pragma.Clear();
+ client.DefaultRequestHeaders.Pragma.Add(new System.Net.Http.Headers.NameValueHeaderValue("From"));
+ client.DefaultRequestHeaders.MaxForwards = 1;
+ var initialResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.From = "user2@example.com";
+ client.DefaultRequestHeaders.Pragma.Clear();
+ client.DefaultRequestHeaders.Pragma.Add(new System.Net.Http.Headers.NameValueHeaderValue("From"));
+ client.DefaultRequestHeaders.MaxForwards = 2;
+ var otherResponse = await client.GetAsync("");
+ client.DefaultRequestHeaders.From = "user@example.com";
+ client.DefaultRequestHeaders.Pragma.Clear();
+ client.DefaultRequestHeaders.Pragma.Add(new System.Net.Http.Headers.NameValueHeaderValue("From"));
+ client.DefaultRequestHeaders.MaxForwards = 1;
+ var subsequentResponse = await client.GetAsync("");
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ [Fact]
+ public async Task ServesCachedContent_IfAvailable_UsingHead_WithContentLength()
+ {
+ var builders = TestUtils.CreateBuildersWithOutputCaching();
+
+ foreach (var builder in builders)
+ {
+ using var host = builder.Build();
+
+ await host.StartAsync();
+
+ using var server = host.GetTestServer();
+ var client = server.CreateClient();
+ var initialResponse = await client.SendAsync(TestUtils.CreateRequest("HEAD", "?contentLength=10"));
+ var subsequentResponse = await client.SendAsync(TestUtils.CreateRequest("HEAD", "?contentLength=10"));
+
+ await AssertCachedResponseAsync(initialResponse, subsequentResponse);
+ }
+ }
+
+ private static void Assert304Headers(HttpResponseMessage initialResponse, HttpResponseMessage subsequentResponse)
+ {
+ // https://tools.ietf.org/html/rfc7232#section-4.1
+ // The server generating a 304 response MUST generate any of the
+ // following header fields that would have been sent in a 200 (OK)
+ // response to the same request: Cache-Control, Content-Location, Date,
+ // ETag, Expires, and Vary.
+
+ Assert.Equal(initialResponse.Headers.CacheControl, subsequentResponse.Headers.CacheControl);
+ Assert.Equal(initialResponse.Content.Headers.ContentLocation, subsequentResponse.Content.Headers.ContentLocation);
+ Assert.Equal(initialResponse.Headers.Date, subsequentResponse.Headers.Date);
+ Assert.Equal(initialResponse.Headers.ETag, subsequentResponse.Headers.ETag);
+ Assert.Equal(initialResponse.Content.Headers.Expires, subsequentResponse.Content.Headers.Expires);
+ Assert.Equal(initialResponse.Headers.Vary, subsequentResponse.Headers.Vary);
+ }
+
+ private static async Task AssertCachedResponseAsync(HttpResponseMessage initialResponse, HttpResponseMessage subsequentResponse)
+ {
+ initialResponse.EnsureSuccessStatusCode();
+ subsequentResponse.EnsureSuccessStatusCode();
+
+ foreach (var header in initialResponse.Headers)
+ {
+ Assert.Equal(initialResponse.Headers.GetValues(header.Key), subsequentResponse.Headers.GetValues(header.Key));
+ }
+ Assert.True(subsequentResponse.Headers.Contains(HeaderNames.Age));
+ Assert.Equal(await initialResponse.Content.ReadAsStringAsync(), await subsequentResponse.Content.ReadAsStringAsync());
+ }
+
+ private static async Task AssertFreshResponseAsync(HttpResponseMessage initialResponse, HttpResponseMessage subsequentResponse)
+ {
+ initialResponse.EnsureSuccessStatusCode();
+ subsequentResponse.EnsureSuccessStatusCode();
+
+ Assert.False(subsequentResponse.Headers.Contains(HeaderNames.Age));
+
+ if (initialResponse.RequestMessage.Method == HttpMethod.Head &&
+ subsequentResponse.RequestMessage.Method == HttpMethod.Head)
+ {
+ Assert.True(initialResponse.Headers.Contains("X-Value"));
+ Assert.NotEqual(initialResponse.Headers.GetValues("X-Value"), subsequentResponse.Headers.GetValues("X-Value"));
+ }
+ else
+ {
+ Assert.NotEqual(await initialResponse.Content.ReadAsStringAsync(), await subsequentResponse.Content.ReadAsStringAsync());
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/SegmentWriteStreamTests.cs b/src/Middleware/OutputCaching/test/SegmentWriteStreamTests.cs
new file mode 100644
index 0000000000..cb8d4bcfbb
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/SegmentWriteStreamTests.cs
@@ -0,0 +1,105 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+public class SegmentWriteStreamTests
+{
+ private static readonly byte[] WriteData = new byte[]
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
+ };
+
+ [Theory]
+ [InlineData(0)]
+ [InlineData(-1)]
+ public void SegmentWriteStream_InvalidSegmentSize_Throws(int segmentSize)
+ {
+ Assert.Throws<ArgumentOutOfRangeException>(() => new SegmentWriteStream(segmentSize));
+ }
+
+ [Fact]
+ public void ReadAndSeekOperations_Throws()
+ {
+ var stream = new SegmentWriteStream(1);
+
+ Assert.Throws<NotSupportedException>(() => stream.Read(new byte[1], 0, 0));
+ Assert.Throws<NotSupportedException>(() => stream.Position = 0);
+ Assert.Throws<NotSupportedException>(() => stream.Seek(0, SeekOrigin.Begin));
+ }
+
+ [Fact]
+ public void GetSegments_ExtractionDisablesWriting()
+ {
+ var stream = new SegmentWriteStream(1);
+
+ Assert.True(stream.CanWrite);
+ Assert.Empty(stream.GetSegments());
+ Assert.False(stream.CanWrite);
+ }
+
+ [Theory]
+ [InlineData(4)]
+ [InlineData(5)]
+ [InlineData(6)]
+ public void WriteByte_CanWriteAllBytes(int segmentSize)
+ {
+ var stream = new SegmentWriteStream(segmentSize);
+
+ foreach (var datum in WriteData)
+ {
+ stream.WriteByte(datum);
+ }
+ var segments = stream.GetSegments();
+
+ Assert.Equal(WriteData.Length, stream.Length);
+ Assert.Equal((WriteData.Length + segmentSize - 1) / segmentSize, segments.Count);
+
+ for (var i = 0; i < WriteData.Length; i += segmentSize)
+ {
+ var expectedSegmentSize = Math.Min(segmentSize, WriteData.Length - i);
+ var expectedSegment = new byte[expectedSegmentSize];
+ for (int j = 0; j < expectedSegmentSize; j++)
+ {
+ expectedSegment[j] = (byte)(i + j);
+ }
+ var segment = segments[i / segmentSize];
+
+ Assert.Equal(expectedSegmentSize, segment.Length);
+ Assert.True(expectedSegment.SequenceEqual(segment));
+ }
+ }
+
+ [Theory]
+ [InlineData(4)]
+ [InlineData(5)]
+ [InlineData(6)]
+ public void Write_CanWriteAllBytes(int writeSize)
+ {
+ var segmentSize = 5;
+ var stream = new SegmentWriteStream(segmentSize);
+
+ for (var i = 0; i < WriteData.Length; i += writeSize)
+ {
+ stream.Write(WriteData, i, Math.Min(writeSize, WriteData.Length - i));
+ }
+ var segments = stream.GetSegments();
+
+ Assert.Equal(WriteData.Length, stream.Length);
+ Assert.Equal((WriteData.Length + segmentSize - 1) / segmentSize, segments.Count);
+
+ for (var i = 0; i < WriteData.Length; i += segmentSize)
+ {
+ var expectedSegmentSize = Math.Min(segmentSize, WriteData.Length - i);
+ var expectedSegment = new byte[expectedSegmentSize];
+ for (int j = 0; j < expectedSegmentSize; j++)
+ {
+ expectedSegment[j] = (byte)(i + j);
+ }
+ var segment = segments[i / segmentSize];
+
+ Assert.Equal(expectedSegmentSize, segment.Length);
+ Assert.True(expectedSegment.SequenceEqual(segment));
+ }
+ }
+}
diff --git a/src/Middleware/OutputCaching/test/TestDocument.txt b/src/Middleware/OutputCaching/test/TestDocument.txt
new file mode 100644
index 0000000000..fb31ae6de8
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/TestDocument.txt
@@ -0,0 +1 @@
+0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ \ No newline at end of file
diff --git a/src/Middleware/OutputCaching/test/TestUtils.cs b/src/Middleware/OutputCaching/test/TestUtils.cs
new file mode 100644
index 0000000000..f8fe9fce58
--- /dev/null
+++ b/src/Middleware/OutputCaching/test/TestUtils.cs
@@ -0,0 +1,374 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#nullable enable
+using System;
+using System.Net.Http;
+using System.Text;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Logging.Testing;
+using Microsoft.Extensions.ObjectPool;
+using Microsoft.Extensions.Options;
+using Moq;
+
+namespace Microsoft.AspNetCore.OutputCaching.Tests;
+
+internal class TestUtils
+{
+ static TestUtils()
+ {
+ // Force sharding in tests
+ StreamUtilities.BodySegmentSize = 10;
+ }
+
+ private static bool TestRequestDelegate(HttpContext context, string guid)
+ {
+ var headers = context.Response.GetTypedHeaders();
+ headers.Date = DateTimeOffset.UtcNow;
+ headers.Headers["X-Value"] = guid;
+
+ if (context.Request.Method != "HEAD")
+ {
+ return true;
+ }
+ return false;
+ }
+
+ internal static async Task TestRequestDelegateWriteAsync(HttpContext context)
+ {
+ var uniqueId = Guid.NewGuid().ToString();
+ if (TestRequestDelegate(context, uniqueId))
+ {
+ await context.Response.WriteAsync(uniqueId);
+ }
+ }
+
+ internal static async Task TestRequestDelegateSendFileAsync(HttpContext context)
+ {
+ var path = Path.Combine(AppContext.BaseDirectory, "TestDocument.txt");
+ var uniqueId = Guid.NewGuid().ToString();
+ if (TestRequestDelegate(context, uniqueId))
+ {
+ await context.Response.SendFileAsync(path, 0, null);
+ await context.Response.WriteAsync(uniqueId);
+ }
+ }
+
+ internal static Task TestRequestDelegateWrite(HttpContext context)
+ {
+ var uniqueId = Guid.NewGuid().ToString();
+ if (TestRequestDelegate(context, uniqueId))
+ {
+ var feature = context.Features.Get<IHttpBodyControlFeature>();
+ if (feature != null)
+ {
+ feature.AllowSynchronousIO = true;
+ }
+ context.Response.Write(uniqueId);
+ }
+ return Task.CompletedTask;
+ }
+
+ internal static IOutputCacheKeyProvider CreateTestKeyProvider()
+ {
+ return CreateTestKeyProvider(new OutputCacheOptions());
+ }
+
+ internal static IOutputCacheKeyProvider CreateTestKeyProvider(OutputCacheOptions options)
+ {
+ return new OutputCacheKeyProvider(new DefaultObjectPoolProvider(), Options.Create(options));
+ }
+
+ internal static IEnumerable<IHostBuilder> CreateBuildersWithOutputCaching(
+ Action<IApplicationBuilder>? configureDelegate = null,
+ OutputCacheOptions? options = null,
+ Action<HttpContext>? contextAction = null)
+ {
+ return CreateBuildersWithOutputCaching(configureDelegate, options, new RequestDelegate[]
+ {
+ context =>
+ {
+ contextAction?.Invoke(context);
+ return TestRequestDelegateWrite(context);
+ },
+ context =>
+ {
+ contextAction?.Invoke(context);
+ return TestRequestDelegateWriteAsync(context);
+ },
+ context =>
+ {
+ contextAction?.Invoke(context);
+ return TestRequestDelegateSendFileAsync(context);
+ },
+ });
+ }
+
+ private static IEnumerable<IHostBuilder> CreateBuildersWithOutputCaching(
+ Action<IApplicationBuilder>? configureDelegate = null,
+ OutputCacheOptions? options = null,
+ IEnumerable<RequestDelegate>? requestDelegates = null)
+ {
+ if (configureDelegate == null)
+ {
+ configureDelegate = app => { };
+ }
+ if (requestDelegates == null)
+ {
+ requestDelegates = new RequestDelegate[]
+ {
+ TestRequestDelegateWriteAsync,
+ TestRequestDelegateWrite
+ };
+ }
+
+ foreach (var requestDelegate in requestDelegates)
+ {
+ // Test with in memory OutputCache
+ yield return new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddOutputCache(outputCachingOptions =>
+ {
+ if (options != null)
+ {
+ outputCachingOptions.MaximumBodySize = options.MaximumBodySize;
+ outputCachingOptions.UseCaseSensitivePaths = options.UseCaseSensitivePaths;
+ outputCachingOptions.SystemClock = options.SystemClock;
+ outputCachingOptions.BasePolicies = options.BasePolicies;
+ outputCachingOptions.DefaultExpirationTimeSpan = options.DefaultExpirationTimeSpan;
+ outputCachingOptions.SizeLimit = options.SizeLimit;
+ }
+ else
+ {
+ outputCachingOptions.BasePolicies = new();
+ outputCachingOptions.BasePolicies.Add(new OutputCachePolicyBuilder().Build());
+ }
+ });
+ })
+ .Configure(app =>
+ {
+ configureDelegate(app);
+ app.UseOutputCache();
+ app.Run(requestDelegate);
+ });
+ });
+ }
+ }
+
+ internal static OutputCacheMiddleware CreateTestMiddleware(
+ RequestDelegate? next = null,
+ IOutputCacheStore? cache = null,
+ OutputCacheOptions? options = null,
+ TestSink? testSink = null,
+ IOutputCacheKeyProvider? keyProvider = null
+ )
+ {
+ if (next == null)
+ {
+ next = httpContext => Task.CompletedTask;
+ }
+ if (cache == null)
+ {
+ cache = new TestOutputCache();
+ }
+ if (options == null)
+ {
+ options = new OutputCacheOptions();
+ }
+ if (keyProvider == null)
+ {
+ keyProvider = new OutputCacheKeyProvider(new DefaultObjectPoolProvider(), Options.Create(options));
+ }
+
+ return new OutputCacheMiddleware(
+ next,
+ Options.Create(options),
+ testSink == null ? NullLoggerFactory.Instance : new TestLoggerFactory(testSink, true),
+ cache,
+ keyProvider);
+ }
+
+ internal static OutputCacheContext CreateTestContext(HttpContext? httpContext = null, IOutputCacheStore? cache = null, OutputCacheOptions? options = null, ITestSink? testSink = null)
+ {
+ var serviceProvider = new Mock<IServiceProvider>();
+ serviceProvider.Setup(x => x.GetService(typeof(IOutputCacheStore))).Returns(cache ?? new TestOutputCache());
+ serviceProvider.Setup(x => x.GetService(typeof(IOptions<OutputCacheOptions>))).Returns(Options.Create(options ?? new OutputCacheOptions()));
+ serviceProvider.Setup(x => x.GetService(typeof(ILogger<OutputCacheMiddleware>))).Returns(testSink == null ? NullLogger.Instance : new TestLogger("OutputCachingTests", testSink, true));
+
+ httpContext ??= new DefaultHttpContext();
+ httpContext.RequestServices = serviceProvider.Object;
+
+ return new OutputCacheContext()
+ {
+ HttpContext = httpContext,
+ EnableOutputCaching = true,
+ AllowCacheStorage = true,
+ AllowCacheLookup = true,
+ ResponseTime = DateTimeOffset.UtcNow
+ };
+ }
+
+ internal static OutputCacheContext CreateUninitializedContext(HttpContext? httpContext = null, IOutputCacheStore? cache = null, OutputCacheOptions? options = null, ITestSink? testSink = null)
+ {
+ var serviceProvider = new Mock<IServiceProvider>();
+ serviceProvider.Setup(x => x.GetService(typeof(IOutputCacheStore))).Returns(cache ?? new TestOutputCache());
+ serviceProvider.Setup(x => x.GetService(typeof(IOptions<OutputCacheOptions>))).Returns(Options.Create(options ?? new OutputCacheOptions()));
+ serviceProvider.Setup(x => x.GetService(typeof(ILogger<OutputCacheMiddleware>))).Returns(testSink == null ? NullLogger.Instance : new TestLogger("OutputCachingTests", testSink, true));
+
+ httpContext ??= new DefaultHttpContext();
+ httpContext.RequestServices = serviceProvider.Object;
+
+ return new OutputCacheContext()
+ {
+ HttpContext = httpContext,
+ };
+ }
+ internal static void AssertLoggedMessages(IEnumerable<WriteContext> messages, params LoggedMessage[] expectedMessages)
+ {
+ var messageList = messages.ToList();
+ Assert.Equal(expectedMessages.Length, messageList.Count);
+
+ for (var i = 0; i < messageList.Count; i++)
+ {
+ Assert.Equal(expectedMessages[i].EventId, messageList[i].EventId);
+ Assert.Equal(expectedMessages[i].LogLevel, messageList[i].LogLevel);
+ }
+ }
+
+ public static HttpRequestMessage CreateRequest(string method, string requestUri)
+ {
+ return new HttpRequestMessage(new HttpMethod(method), requestUri);
+ }
+}
+
+internal static class HttpResponseWritingExtensions
+{
+ internal static void Write(this HttpResponse response, string text)
+ {
+ ArgumentNullException.ThrowIfNull(response);
+ ArgumentNullException.ThrowIfNull(text);
+
+ var data = Encoding.UTF8.GetBytes(text);
+ response.Body.Write(data, 0, data.Length);
+ }
+}
+
+internal class LoggedMessage
+{
+ internal static LoggedMessage NotModifiedIfNoneMatchStar => new LoggedMessage(1, LogLevel.Debug);
+ internal static LoggedMessage NotModifiedIfNoneMatchMatched => new LoggedMessage(2, LogLevel.Debug);
+ internal static LoggedMessage NotModifiedIfModifiedSinceSatisfied => new LoggedMessage(3, LogLevel.Debug);
+ internal static LoggedMessage NotModifiedServed => new LoggedMessage(4, LogLevel.Information);
+ internal static LoggedMessage CachedResponseServed => new LoggedMessage(5, LogLevel.Information);
+ internal static LoggedMessage GatewayTimeoutServed => new LoggedMessage(6, LogLevel.Information);
+ internal static LoggedMessage NoResponseServed => new LoggedMessage(7, LogLevel.Information);
+ internal static LoggedMessage VaryByRulesUpdated => new LoggedMessage(8, LogLevel.Debug);
+ internal static LoggedMessage ResponseCached => new LoggedMessage(9, LogLevel.Information);
+ internal static LoggedMessage ResponseNotCached => new LoggedMessage(10, LogLevel.Information);
+ internal static LoggedMessage ResponseContentLengthMismatchNotCached => new LoggedMessage(11, LogLevel.Warning);
+ internal static LoggedMessage ExpirationExpiresExceeded => new LoggedMessage(12, LogLevel.Debug);
+
+ private LoggedMessage(int evenId, LogLevel logLevel)
+ {
+ EventId = evenId;
+ LogLevel = logLevel;
+ }
+
+ internal int EventId { get; }
+ internal LogLevel LogLevel { get; }
+}
+
+internal class TestResponseCachingKeyProvider : IOutputCacheKeyProvider
+{
+ private readonly string _key;
+
+ public TestResponseCachingKeyProvider(string key)
+ {
+ _key = key;
+ }
+
+ public string CreateStorageKey(OutputCacheContext? context)
+ {
+ return _key;
+ }
+}
+
+internal class TestOutputCache : IOutputCacheStore
+{
+ private readonly Dictionary<string, byte[]?> _storage = new();
+ public int GetCount { get; private set; }
+ public int SetCount { get; private set; }
+ private readonly object synLock = new();
+
+ public ValueTask EvictByTagAsync(string tag, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
+
+ public ValueTask<byte[]?> GetAsync(string? key, CancellationToken cancellationToken)
+ {
+ ArgumentNullException.ThrowIfNull(key);
+
+ lock (synLock)
+ {
+ GetCount++;
+ try
+ {
+ return ValueTask.FromResult(_storage[key]);
+ }
+ catch
+ {
+ return ValueTask.FromResult(default(byte[]));
+ }
+ }
+ }
+
+ public ValueTask SetAsync(string key, byte[] entry, string[]? tags, TimeSpan validFor, CancellationToken cancellationToken)
+ {
+ lock (synLock)
+ {
+ SetCount++;
+ _storage[key] = entry;
+
+ return ValueTask.CompletedTask;
+ }
+ }
+}
+
+internal class TestClock : ISystemClock
+{
+ public DateTimeOffset UtcNow { get; set; }
+}
+
+internal class AllowTestPolicy : IOutputCachePolicy
+{
+ public ValueTask CacheRequestAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ context.AllowCacheLookup = true;
+ context.AllowCacheStorage = true;
+ return ValueTask.CompletedTask;
+ }
+
+ public ValueTask ServeFromCacheAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ public ValueTask ServeResponseAsync(OutputCacheContext context, CancellationToken cancellationToken)
+ {
+ return ValueTask.CompletedTask;
+ }
+}
diff --git a/src/Middleware/RateLimiting/samples/RateLimitingSample/Program.cs b/src/Middleware/RateLimiting/samples/RateLimitingSample/Program.cs
new file mode 100644
index 0000000000..2709f8df07
--- /dev/null
+++ b/src/Middleware/RateLimiting/samples/RateLimitingSample/Program.cs
@@ -0,0 +1,123 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.EntityFrameworkCore;
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.RateLimiting;
+using RateLimitingSample;
+using Microsoft.Extensions.Logging.Abstractions;
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddDbContext<TodoDb>(opt => opt.UseInMemoryDatabase("TodoList"));
+builder.Services.AddDatabaseDeveloperPageExceptionFilter();
+// Inject an ILogger<SampleRateLimiterPolicy>
+builder.Services.AddLogging();
+
+var todoName = "todoPolicy";
+var completeName = "completePolicy";
+var helloName = "helloPolicy";
+
+builder.Services.AddRateLimiter(options =>
+{
+ // Define endpoint limiters and a global limiter.
+ options.AddTokenBucketLimiter(todoName, options =>
+ {
+ options.TokenLimit = 1;
+ options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
+ options.QueueLimit = 1;
+ options.ReplenishmentPeriod = TimeSpan.FromSeconds(10);
+ options.TokensPerPeriod = 1;
+ })
+ .AddPolicy<string>(completeName, new SampleRateLimiterPolicy(NullLogger<SampleRateLimiterPolicy>.Instance))
+ .AddPolicy<string, SampleRateLimiterPolicy>(helloName);
+ // The global limiter will be a concurrency limiter with a max permit count of 10 and a queue depth of 5.
+ options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
+ {
+ return RateLimitPartition.GetConcurrencyLimiter<string>("globalLimiter", key => new ConcurrencyLimiterOptions
+ {
+ PermitLimit = 10,
+ QueueProcessingOrder = QueueProcessingOrder.NewestFirst,
+ QueueLimit = 5
+ });
+ });
+});
+
+var app = builder.Build();
+
+app.UseRateLimiter();
+
+// The limiter on this endpoint allows 1 request every 5 seconds
+app.MapGet("/", () => "Hello World!").RequireRateLimiting(helloName);
+
+// Requests to this endpoint will be processed in 10 second intervals
+app.MapGet("/todoitems", async (TodoDb db) =>
+ await db.Todos.ToListAsync())
+ .RequireRateLimiting(todoName);
+
+// The limiter on this endpoint allows 1 request every 5 seconds
+app.MapGet("/todoitems/complete", async (TodoDb db) =>
+ await db.Todos.Where(t => t.IsComplete).ToListAsync())
+ .RequireRateLimiting(completeName);
+
+app.MapGet("/todoitems/{id}", async (int id, TodoDb db) =>
+ await db.Todos.FindAsync(id)
+ is Todo todo
+ ? Results.Ok(todo)
+ : Results.NotFound());
+
+app.MapPost("/todoitems", async (Todo todo, TodoDb db) =>
+{
+ db.Todos.Add(todo);
+ await db.SaveChangesAsync();
+
+ return Results.Created($"/todoitems/{todo.Id}", todo);
+});
+
+app.MapPut("/todoitems/{id}", async (int id, Todo inputTodo, TodoDb db) =>
+{
+ var todo = await db.Todos.FindAsync(id);
+
+ if (todo is null)
+ {
+ return Results.NotFound();
+ }
+
+ todo.Name = inputTodo.Name;
+ todo.IsComplete = inputTodo.IsComplete;
+
+ await db.SaveChangesAsync();
+
+ return Results.NoContent();
+});
+
+app.MapDelete("/todoitems/{id}", async (int id, TodoDb db) =>
+{
+ if (await db.Todos.FindAsync(id) is Todo todo)
+ {
+ db.Todos.Remove(todo);
+ await db.SaveChangesAsync();
+ return Results.Ok(todo);
+ }
+
+ return Results.NotFound();
+});
+
+app.Run();
+
+class Todo
+{
+ public int Id { get; set; }
+ public string? Name { get; set; }
+ public bool IsComplete { get; set; }
+}
+
+class TodoDb : DbContext
+{
+ public TodoDb(DbContextOptions<TodoDb> options)
+ : base(options) { }
+
+ public DbSet<Todo> Todos => Set<Todo>();
+}
diff --git a/src/Middleware/RateLimiting/samples/RateLimitingSample/Properties/launchSettings.json b/src/Middleware/RateLimiting/samples/RateLimitingSample/Properties/launchSettings.json
new file mode 100644
index 0000000000..b052590cfe
--- /dev/null
+++ b/src/Middleware/RateLimiting/samples/RateLimitingSample/Properties/launchSettings.json
@@ -0,0 +1,31 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:8855",
+ "sslPort": 44312
+ }
+ },
+ "profiles": {
+ "RateLimitingSample": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:7036;http://localhost:5085",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Middleware/RateLimiting/samples/RateLimitingSample/RateLimitingSample.csproj b/src/Middleware/RateLimiting/samples/RateLimitingSample/RateLimitingSample.csproj
new file mode 100644
index 0000000000..80fe67ee1e
--- /dev/null
+++ b/src/Middleware/RateLimiting/samples/RateLimitingSample/RateLimitingSample.csproj
@@ -0,0 +1,19 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <Nullable>enable</Nullable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
+ <Reference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" />
+ <Reference Include="Microsoft.AspNetCore.HttpsPolicy" />
+ <Reference Include="Microsoft.AspNetCore.Http.Results" />
+ <Reference Include="Microsoft.AspNetCore.Mvc" />
+ <Reference Include="Microsoft.AspNetCore.RateLimiting" />
+ <Reference Include="Microsoft.EntityFrameworkCore.InMemory" />
+ <Reference Include="Microsoft.Extensions.DependencyInjection" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Middleware/RateLimiting/samples/RateLimitingSample/SampleRateLimiterPolicy.cs b/src/Middleware/RateLimiting/samples/RateLimitingSample/SampleRateLimiterPolicy.cs
new file mode 100644
index 0000000000..83d486dbf0
--- /dev/null
+++ b/src/Middleware/RateLimiting/samples/RateLimitingSample/SampleRateLimiterPolicy.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.RateLimiting;
+
+namespace RateLimitingSample;
+
+public class SampleRateLimiterPolicy : IRateLimiterPolicy<string>
+{
+ private Func<OnRejectedContext, CancellationToken, ValueTask>? _onRejected;
+
+ public SampleRateLimiterPolicy(ILogger<SampleRateLimiterPolicy> logger)
+ {
+ _onRejected = (context, token) =>
+ {
+ context.HttpContext.Response.StatusCode = 429;
+ logger.LogInformation($"Request rejected by {nameof(SampleRateLimiterPolicy)}");
+ return ValueTask.CompletedTask;
+ };
+ }
+
+ public Func<OnRejectedContext, CancellationToken, ValueTask>? OnRejected { get => _onRejected; }
+
+ // Use a sliding window limiter allowing 1 request every 10 seconds
+ public RateLimitPartition<string> GetPartition(HttpContext httpContext)
+ {
+ return RateLimitPartition.GetSlidingWindowLimiter<string>(string.Empty, key => new SlidingWindowRateLimiterOptions
+ {
+ PermitLimit = 1,
+ QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
+ QueueLimit = 1,
+ Window = TimeSpan.FromSeconds(5),
+ SegmentsPerWindow = 1
+ });
+ }
+}
diff --git a/src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.Development.json b/src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.Development.json
new file mode 100644
index 0000000000..0c208ae918
--- /dev/null
+++ b/src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.json b/src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.json
new file mode 100644
index 0000000000..10f68b8c8b
--- /dev/null
+++ b/src/Middleware/RateLimiting/samples/RateLimitingSample/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/Middleware/RateLimiting/src/DefaultCombinedLease.cs b/src/Middleware/RateLimiting/src/DefaultCombinedLease.cs
new file mode 100644
index 0000000000..c7581155f1
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/DefaultCombinedLease.cs
@@ -0,0 +1,99 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+internal sealed class DefaultCombinedLease : RateLimitLease
+{
+ private readonly RateLimitLease _globalLease;
+ private readonly RateLimitLease _endpointLease;
+ private HashSet<string>? _metadataNames;
+
+ public DefaultCombinedLease(RateLimitLease globalLease, RateLimitLease endpointLease)
+ {
+ _globalLease = globalLease;
+ _endpointLease = endpointLease;
+ }
+
+ public override bool IsAcquired => true;
+
+ public override IEnumerable<string> MetadataNames
+ {
+ get
+ {
+ if (_metadataNames is null)
+ {
+ _metadataNames = new HashSet<string>();
+ foreach (var metadataName in _globalLease.MetadataNames)
+ {
+ _metadataNames.Add(metadataName);
+ }
+ foreach (var metadataName in _endpointLease.MetadataNames)
+ {
+ _metadataNames.Add(metadataName);
+ }
+ }
+ return _metadataNames;
+ }
+ }
+
+ public override bool TryGetMetadata(string metadataName, out object? metadata)
+ {
+ // Use the first metadata item of a given name, ignore duplicates, we can't reliably merge arbitrary metadata
+ // Creating an object[] if there are multiple of the same metadataName could work, but makes consumption of metadata messy
+ // and makes MetadataName.Create<T>(...) uses no longer work
+ if (_endpointLease.TryGetMetadata(metadataName, out metadata))
+ {
+ return true;
+ }
+ if (_globalLease.TryGetMetadata(metadataName, out metadata))
+ {
+ return true;
+ }
+
+ metadata = null;
+ return false;
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ List<Exception>? exceptions = null;
+
+ // Dispose endpoint lease first, then global lease (reverse order of when they were acquired)
+ // Avoids issues where dispose might unblock a queued acquire and then the acquire fails when acquiring the next limiter.
+ // When disposing in reverse order there wont be any issues of unblocking an acquire that affects acquires on limiters in the chain after it
+ try
+ {
+ _endpointLease.Dispose();
+ }
+ catch (Exception ex)
+ {
+ exceptions ??= new List<Exception>();
+ exceptions.Add(ex);
+ }
+
+ try
+ {
+ _globalLease.Dispose();
+ }
+ catch (Exception ex)
+ {
+ exceptions ??= new List<Exception>(1);
+ exceptions.Add(ex);
+ }
+
+ if (exceptions is not null)
+ {
+ if (exceptions.Count == 1)
+ {
+ throw exceptions[0];
+ }
+ else
+ {
+ throw new AggregateException(exceptions);
+ }
+ }
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/DefaultKeyType.cs b/src/Middleware/RateLimiting/src/DefaultKeyType.cs
new file mode 100644
index 0000000000..fd599833f5
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/DefaultKeyType.cs
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+internal struct DefaultKeyType
+{
+ public DefaultKeyType(string? policyName, object? key, object? factory = null)
+ {
+ PolicyName = policyName;
+ Key = key;
+ Factory = factory;
+ }
+
+ public string? PolicyName { get; }
+
+ public object? Key { get; }
+
+ // This is really a Func<TPartitionKey, RateLimiter>
+ public object? Factory { get; }
+}
diff --git a/src/Middleware/RateLimiting/src/DefaultKeyTypeEqualityComparer.cs b/src/Middleware/RateLimiting/src/DefaultKeyTypeEqualityComparer.cs
new file mode 100644
index 0000000000..08997d7136
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/DefaultKeyTypeEqualityComparer.cs
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+internal sealed class DefaultKeyTypeEqualityComparer : IEqualityComparer<DefaultKeyType>
+{
+ public bool Equals(DefaultKeyType x, DefaultKeyType y)
+ {
+ var xKey = x.Key;
+ var yKey = y.Key;
+ if (xKey == null && yKey == null)
+ {
+ return string.Equals(x.PolicyName, y.PolicyName, StringComparison.Ordinal);
+ }
+ else if (xKey == null || yKey == null)
+ {
+ return false;
+ }
+
+ return string.Equals(x.PolicyName, y.PolicyName, StringComparison.Ordinal) && xKey.Equals(yKey);
+ }
+
+ public int GetHashCode([DisallowNull] DefaultKeyType obj)
+ {
+ return HashCode.Combine(obj.Key, obj.PolicyName);
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/DefaultRateLimiterPolicy.cs b/src/Middleware/RateLimiting/src/DefaultRateLimiterPolicy.cs
new file mode 100644
index 0000000000..e155779381
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/DefaultRateLimiterPolicy.cs
@@ -0,0 +1,26 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+internal sealed class DefaultRateLimiterPolicy : IRateLimiterPolicy<DefaultKeyType>
+{
+ private readonly Func<HttpContext, RateLimitPartition<DefaultKeyType>> _partitioner;
+ private readonly Func<OnRejectedContext, CancellationToken, ValueTask>? _onRejected;
+
+ public DefaultRateLimiterPolicy(Func<HttpContext, RateLimitPartition<DefaultKeyType>> partitioner, Func<OnRejectedContext, CancellationToken, ValueTask>? onRejected)
+ {
+ _partitioner = partitioner;
+ _onRejected = onRejected;
+ }
+
+ public Func<OnRejectedContext, CancellationToken, ValueTask>? OnRejected => _onRejected;
+
+ public RateLimitPartition<DefaultKeyType> GetPartition(HttpContext httpContext)
+ {
+ return _partitioner(httpContext);
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/DisableRateLimitingAttribute.cs b/src/Middleware/RateLimiting/src/DisableRateLimitingAttribute.cs
new file mode 100644
index 0000000000..55d888f05c
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/DisableRateLimitingAttribute.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+/// <summary>
+/// Metadata that disables request rate limiting on an endpoint.
+/// </summary>
+/// <remarks>
+/// Completely disables the rate limiting middleware from applying to this endpoint.
+/// </remarks>
+[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+public sealed class DisableRateLimitingAttribute : Attribute
+{
+ internal static DisableRateLimitingAttribute Instance { get; } = new DisableRateLimitingAttribute();
+}
diff --git a/src/Middleware/RateLimiting/src/EnableRateLimitingAttribute.cs b/src/Middleware/RateLimiting/src/EnableRateLimitingAttribute.cs
new file mode 100644
index 0000000000..6486f6c898
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/EnableRateLimitingAttribute.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+/// <summary>
+/// Metadata that provides endpoint-specific request rate limiting.
+/// </summary>
+/// <remarks>
+/// Replaces any policies currently applied to the endpoint.
+/// The global limiter will still run on endpoints with this attribute applied.
+/// </remarks>
+[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
+public sealed class EnableRateLimitingAttribute : Attribute
+{
+ /// <summary>
+ /// Creates a new instance of <see cref="EnableRateLimitingAttribute"/> using the specified policy.
+ /// </summary>
+ /// <param name="policyName">The name of the policy which needs to be applied.</param>
+ public EnableRateLimitingAttribute(string policyName)
+ {
+ ArgumentNullException.ThrowIfNull(policyName);
+
+ PolicyName = policyName;
+ }
+
+ internal EnableRateLimitingAttribute(DefaultRateLimiterPolicy policy)
+ {
+ Policy = policy;
+ }
+
+ /// <summary>
+ /// The name of the policy which needs to be applied.
+ /// </summary>
+ public string? PolicyName { get; }
+
+ /// <summary>
+ /// The policy which needs to be applied, if present.
+ /// </summary>
+ internal DefaultRateLimiterPolicy? Policy { get; }
+}
diff --git a/src/Middleware/RateLimiting/src/IRateLimiterPolicy.cs b/src/Middleware/RateLimiting/src/IRateLimiterPolicy.cs
new file mode 100644
index 0000000000..7487253858
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/IRateLimiterPolicy.cs
@@ -0,0 +1,24 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+/// <summary>
+/// An interface which is used to represent a RateLimiter policy.
+/// </summary>
+public interface IRateLimiterPolicy<TPartitionKey>
+{
+ /// <summary>
+ /// Gets the <see cref="Func{OnRejectedContext, CancellationToken, ValueTask}"/> that handles requests rejected by this middleware.
+ /// </summary>
+ Func<OnRejectedContext, CancellationToken, ValueTask>? OnRejected { get; }
+
+ /// <summary>
+ /// Gets the <see cref="RateLimitPartition{TPartitionKey}"/> that applies to the given <see cref="HttpContext"/>.
+ /// </summary>
+ /// <param name="httpContext">The <see cref="HttpContext"/> to get the partition for.</param>
+ RateLimitPartition<TPartitionKey> GetPartition(HttpContext httpContext);
+}
diff --git a/src/Middleware/RateLimiting/src/LeaseContext.cs b/src/Middleware/RateLimiting/src/LeaseContext.cs
new file mode 100644
index 0000000000..a264241f3a
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/LeaseContext.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+internal struct LeaseContext : IDisposable
+{
+ public bool? GlobalRejected { get; init; }
+
+ public required RateLimitLease Lease { get; init; }
+
+ public void Dispose()
+ {
+ Lease.Dispose();
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj b/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj
index b8ba30375a..80d7f22dcb 100644
--- a/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj
+++ b/src/Middleware/RateLimiting/src/Microsoft.AspNetCore.RateLimiting.csproj
@@ -5,6 +5,8 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
+ <IsTrimmable>true</IsTrimmable>
+ <IsAspNetCoreApp>true</IsAspNetCoreApp>
</PropertyGroup>
<ItemGroup>
@@ -16,4 +18,7 @@
<Compile Include="$(SharedSourceRoot)ValueStopwatch\*.cs" />
</ItemGroup>
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.RateLimiting.Tests" />
+ </ItemGroup>
</Project>
diff --git a/src/Middleware/RateLimiting/src/NoLimiter.cs b/src/Middleware/RateLimiting/src/NoLimiter.cs
deleted file mode 100644
index d3b61d1192..0000000000
--- a/src/Middleware/RateLimiting/src/NoLimiter.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Threading.RateLimiting;
-
-namespace Microsoft.AspNetCore.RateLimiting;
-internal class NoLimiter<TResource> : PartitionedRateLimiter<TResource>
-{
- public override int GetAvailablePermits(TResource resourceID)
- {
- return 1;
- }
-
- protected override RateLimitLease AcquireCore(TResource resourceID, int permitCount)
- {
- return new NoLimiterLease();
- }
-
- protected override ValueTask<RateLimitLease> WaitAsyncCore(TResource resourceID, int permitCount, CancellationToken cancellationToken)
- {
- return new ValueTask<RateLimitLease>(new NoLimiterLease());
- }
-}
-
-internal class NoLimiterLease : RateLimitLease
-{
- public override bool IsAcquired => true;
-
- public override IEnumerable<string> MetadataNames => new List<string>();
-
- public override bool TryGetMetadata(string metadataName, out object? metadata)
- {
- metadata = null;
- return false;
- }
-}
diff --git a/src/Middleware/RateLimiting/src/OnRejectedContext.cs b/src/Middleware/RateLimiting/src/OnRejectedContext.cs
new file mode 100644
index 0000000000..0570955568
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/OnRejectedContext.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+/// <summary>
+/// Holds state needed for the OnRejected callback in the RateLimitingMiddleware.
+/// </summary>
+public sealed class OnRejectedContext
+{
+ /// <summary>
+ /// Gets or sets the <see cref="HttpContext"/> that the OnRejected callback will have access to
+ /// </summary>
+ public required HttpContext HttpContext { get; init; }
+
+ /// <summary>
+ /// Gets or sets the failed <see cref="RateLimitLease"/> that the OnRejected callback will have access to
+ /// </summary>
+ public required RateLimitLease Lease { get; init; }
+}
diff --git a/src/Middleware/RateLimiting/src/PolicyNameKey.cs b/src/Middleware/RateLimiting/src/PolicyNameKey.cs
new file mode 100644
index 0000000000..d473aad38f
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/PolicyNameKey.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+internal sealed class PolicyNameKey
+{
+ public required string PolicyName { get; init; }
+
+ public override bool Equals(object? obj)
+ {
+ if (obj is PolicyNameKey key)
+ {
+ return PolicyName == key.PolicyName;
+ }
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return PolicyName.GetHashCode();
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/PublicAPI.Unshipped.txt b/src/Middleware/RateLimiting/src/PublicAPI.Unshipped.txt
index b62cec89b1..9e18f7083b 100644
--- a/src/Middleware/RateLimiting/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/RateLimiting/src/PublicAPI.Unshipped.txt
@@ -1,11 +1,39 @@
+Microsoft.AspNetCore.Builder.RateLimiterApplicationBuilderExtensions
+Microsoft.AspNetCore.Builder.RateLimiterEndpointConventionBuilderExtensions
+Microsoft.AspNetCore.Builder.RateLimiterServiceCollectionExtensions
+Microsoft.AspNetCore.RateLimiting.DisableRateLimitingAttribute
+Microsoft.AspNetCore.RateLimiting.DisableRateLimitingAttribute.DisableRateLimitingAttribute() -> void
+Microsoft.AspNetCore.RateLimiting.EnableRateLimitingAttribute
+Microsoft.AspNetCore.RateLimiting.EnableRateLimitingAttribute.EnableRateLimitingAttribute(string! policyName) -> void
+Microsoft.AspNetCore.RateLimiting.EnableRateLimitingAttribute.PolicyName.get -> string?
+Microsoft.AspNetCore.RateLimiting.IRateLimiterPolicy<TPartitionKey>
+Microsoft.AspNetCore.RateLimiting.IRateLimiterPolicy<TPartitionKey>.GetPartition(Microsoft.AspNetCore.Http.HttpContext! httpContext) -> System.Threading.RateLimiting.RateLimitPartition<TPartitionKey>
+Microsoft.AspNetCore.RateLimiting.IRateLimiterPolicy<TPartitionKey>.OnRejected.get -> System.Func<Microsoft.AspNetCore.RateLimiting.OnRejectedContext!, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask>?
+Microsoft.AspNetCore.RateLimiting.OnRejectedContext
+Microsoft.AspNetCore.RateLimiting.OnRejectedContext.HttpContext.get -> Microsoft.AspNetCore.Http.HttpContext!
+Microsoft.AspNetCore.RateLimiting.OnRejectedContext.HttpContext.init -> void
+Microsoft.AspNetCore.RateLimiting.OnRejectedContext.Lease.get -> System.Threading.RateLimiting.RateLimitLease!
+Microsoft.AspNetCore.RateLimiting.OnRejectedContext.Lease.init -> void
+Microsoft.AspNetCore.RateLimiting.OnRejectedContext.OnRejectedContext() -> void
Microsoft.AspNetCore.RateLimiting.RateLimiterOptions
-Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.DefaultRejectionStatusCode.get -> int
-Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.DefaultRejectionStatusCode.set -> void
-Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.Limiter.get -> System.Threading.RateLimiting.PartitionedRateLimiter<Microsoft.AspNetCore.Http.HttpContext!>!
-Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.Limiter.set -> void
-Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.OnRejected.get -> System.Func<Microsoft.AspNetCore.Http.HttpContext!, System.Threading.RateLimiting.RateLimitLease!, System.Threading.Tasks.Task!>!
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.AddPolicy<TPartitionKey, TPolicy>(string! policyName) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.AddPolicy<TPartitionKey>(string! policyName, Microsoft.AspNetCore.RateLimiting.IRateLimiterPolicy<TPartitionKey>! policy) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.AddPolicy<TPartitionKey>(string! policyName, System.Func<Microsoft.AspNetCore.Http.HttpContext!, System.Threading.RateLimiting.RateLimitPartition<TPartitionKey>>! partitioner) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.GlobalLimiter.get -> System.Threading.RateLimiting.PartitionedRateLimiter<Microsoft.AspNetCore.Http.HttpContext!>?
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.GlobalLimiter.set -> void
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.OnRejected.get -> System.Func<Microsoft.AspNetCore.RateLimiting.OnRejectedContext!, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask>?
Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.OnRejected.set -> void
Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.RateLimiterOptions() -> void
-Microsoft.AspNetCore.RateLimiting.RateLimitingApplicationBuilderExtensions
-static Microsoft.AspNetCore.RateLimiting.RateLimitingApplicationBuilderExtensions.UseRateLimiter(this Microsoft.AspNetCore.Builder.IApplicationBuilder! app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder!
-static Microsoft.AspNetCore.RateLimiting.RateLimitingApplicationBuilderExtensions.UseRateLimiter(this Microsoft.AspNetCore.Builder.IApplicationBuilder! app, Microsoft.AspNetCore.RateLimiting.RateLimiterOptions! options) -> Microsoft.AspNetCore.Builder.IApplicationBuilder!
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.RejectionStatusCode.get -> int
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptions.RejectionStatusCode.set -> void
+Microsoft.AspNetCore.RateLimiting.RateLimiterOptionsExtensions
+static Microsoft.AspNetCore.Builder.RateLimiterApplicationBuilderExtensions.UseRateLimiter(this Microsoft.AspNetCore.Builder.IApplicationBuilder! app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder!
+static Microsoft.AspNetCore.Builder.RateLimiterApplicationBuilderExtensions.UseRateLimiter(this Microsoft.AspNetCore.Builder.IApplicationBuilder! app, Microsoft.AspNetCore.RateLimiting.RateLimiterOptions! options) -> Microsoft.AspNetCore.Builder.IApplicationBuilder!
+static Microsoft.AspNetCore.Builder.RateLimiterEndpointConventionBuilderExtensions.DisableRateLimiting<TBuilder>(this TBuilder builder) -> TBuilder
+static Microsoft.AspNetCore.Builder.RateLimiterEndpointConventionBuilderExtensions.RequireRateLimiting<TBuilder, TPartitionKey>(this TBuilder builder, Microsoft.AspNetCore.RateLimiting.IRateLimiterPolicy<TPartitionKey>! policy) -> TBuilder
+static Microsoft.AspNetCore.Builder.RateLimiterEndpointConventionBuilderExtensions.RequireRateLimiting<TBuilder>(this TBuilder builder, string! policyName) -> TBuilder
+static Microsoft.AspNetCore.Builder.RateLimiterServiceCollectionExtensions.AddRateLimiter(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!>! configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.AspNetCore.RateLimiting.RateLimiterOptionsExtensions.AddConcurrencyLimiter(this Microsoft.AspNetCore.RateLimiting.RateLimiterOptions! options, string! policyName, System.Action<System.Threading.RateLimiting.ConcurrencyLimiterOptions!>! configureOptions) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
+static Microsoft.AspNetCore.RateLimiting.RateLimiterOptionsExtensions.AddFixedWindowLimiter(this Microsoft.AspNetCore.RateLimiting.RateLimiterOptions! options, string! policyName, System.Action<System.Threading.RateLimiting.FixedWindowRateLimiterOptions!>! configureOptions) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
+static Microsoft.AspNetCore.RateLimiting.RateLimiterOptionsExtensions.AddSlidingWindowLimiter(this Microsoft.AspNetCore.RateLimiting.RateLimiterOptions! options, string! policyName, System.Action<System.Threading.RateLimiting.SlidingWindowRateLimiterOptions!>! configureOptions) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
+static Microsoft.AspNetCore.RateLimiting.RateLimiterOptionsExtensions.AddTokenBucketLimiter(this Microsoft.AspNetCore.RateLimiting.RateLimiterOptions! options, string! policyName, System.Action<System.Threading.RateLimiting.TokenBucketRateLimiterOptions!>! configureOptions) -> Microsoft.AspNetCore.RateLimiting.RateLimiterOptions!
diff --git a/src/Middleware/RateLimiting/src/RateLimitingApplicationBuilderExtensions.cs b/src/Middleware/RateLimiting/src/RateLimiterApplicationBuilderExtensions.cs
index 7cda2ab98c..cd1ec7b826 100644
--- a/src/Middleware/RateLimiting/src/RateLimitingApplicationBuilderExtensions.cs
+++ b/src/Middleware/RateLimiting/src/RateLimiterApplicationBuilderExtensions.cs
@@ -1,15 +1,15 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.RateLimiting;
using Microsoft.Extensions.Options;
-namespace Microsoft.AspNetCore.RateLimiting;
+namespace Microsoft.AspNetCore.Builder;
/// <summary>
/// Extension methods for the RateLimiting middleware.
/// </summary>
-public static class RateLimitingApplicationBuilderExtensions
+public static class RateLimiterApplicationBuilderExtensions
{
/// <summary>
/// Enables rate limiting for the application.
@@ -31,8 +31,8 @@ public static class RateLimitingApplicationBuilderExtensions
/// <returns></returns>
public static IApplicationBuilder UseRateLimiter(this IApplicationBuilder app, RateLimiterOptions options)
{
- ArgumentNullException.ThrowIfNull(app, nameof(app));
- ArgumentNullException.ThrowIfNull(options, nameof(options));
+ ArgumentNullException.ThrowIfNull(app);
+ ArgumentNullException.ThrowIfNull(options);
return app.UseMiddleware<RateLimitingMiddleware>(Options.Create(options));
}
diff --git a/src/Middleware/RateLimiting/src/RateLimiterEndpointConventionBuilderExtensions.cs b/src/Middleware/RateLimiting/src/RateLimiterEndpointConventionBuilderExtensions.cs
new file mode 100644
index 0000000000..1a5fb0e180
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/RateLimiterEndpointConventionBuilderExtensions.cs
@@ -0,0 +1,69 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.RateLimiting;
+
+namespace Microsoft.AspNetCore.Builder;
+
+/// <summary>
+/// Rate limiter extension methods for <see cref="IEndpointConventionBuilder"/>.
+/// </summary>
+public static class RateLimiterEndpointConventionBuilderExtensions
+{
+ /// <summary>
+ /// Adds the specified rate limiting policy to the endpoint(s).
+ /// </summary>
+ /// <param name="builder">The endpoint convention builder.</param>
+ /// <param name="policyName">The name of the rate limiting policy to add to the endpoint.</param>
+ /// <returns>The original convention builder parameter.</returns>
+ public static TBuilder RequireRateLimiting<TBuilder>(this TBuilder builder, string policyName) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ ArgumentNullException.ThrowIfNull(policyName);
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(new EnableRateLimitingAttribute(policyName));
+ });
+
+ return builder;
+ }
+
+ /// <summary>
+ /// Adds the specified rate limiting policy to the endpoint(s).
+ /// </summary>
+ /// <param name="builder">The endpoint convention builder.</param>
+ /// <param name="policy">The rate limiting policy to add to the endpoint.</param>
+ /// <returns>The original convention builder parameter.</returns>
+ public static TBuilder RequireRateLimiting<TBuilder, TPartitionKey>(this TBuilder builder, IRateLimiterPolicy<TPartitionKey> policy) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ ArgumentNullException.ThrowIfNull(policy);
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(new EnableRateLimitingAttribute(new DefaultRateLimiterPolicy(RateLimiterOptions.ConvertPartitioner<TPartitionKey>(null, policy.GetPartition), policy.OnRejected)));
+ });
+ return builder;
+ }
+
+ /// <summary>
+ /// Disables rate limiting on the endpoint(s).
+ /// </summary>
+ /// <param name="builder">The endpoint convention builder.</param>
+ /// <returns>The original convention builder parameter.</returns>
+ /// <remarks>Will skip both the global limiter, and any endpoint-specific limiters that apply to the endpoint(s).</remarks>
+ public static TBuilder DisableRateLimiting<TBuilder>(this TBuilder builder) where TBuilder : IEndpointConventionBuilder
+ {
+ ArgumentNullException.ThrowIfNull(builder);
+
+ builder.Add(endpointBuilder =>
+ {
+ endpointBuilder.Metadata.Add(DisableRateLimitingAttribute.Instance);
+ });
+
+ return builder;
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/RateLimiterOptions.cs b/src/Middleware/RateLimiting/src/RateLimiterOptions.cs
index bc1ab30b7a..9872e1ca78 100644
--- a/src/Middleware/RateLimiting/src/RateLimiterOptions.cs
+++ b/src/Middleware/RateLimiting/src/RateLimiterOptions.cs
@@ -1,8 +1,10 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Threading.RateLimiting;
using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.RateLimiting;
@@ -11,30 +13,22 @@ namespace Microsoft.AspNetCore.RateLimiting;
/// </summary>
public sealed class RateLimiterOptions
{
- // TODO - Provide a default?
- private PartitionedRateLimiter<HttpContext> _limiter = new NoLimiter<HttpContext>();
- private Func<HttpContext, RateLimitLease, Task> _onRejected = (context, lease) =>
- {
- return Task.CompletedTask;
- };
+ internal Dictionary<string, DefaultRateLimiterPolicy> PolicyMap { get; }
+ = new Dictionary<string, DefaultRateLimiterPolicy>(StringComparer.Ordinal);
+
+ internal Dictionary<string, Func<IServiceProvider, DefaultRateLimiterPolicy>> UnactivatedPolicyMap { get; }
+ = new Dictionary<string, Func<IServiceProvider, DefaultRateLimiterPolicy>>(StringComparer.Ordinal);
/// <summary>
- /// Gets or sets the <see cref="PartitionedRateLimiter{TResource}"/>
+ /// Gets or sets the global <see cref="PartitionedRateLimiter{HttpContext}"/> that will be applied on all requests.
+ /// The global limiter will be executed first, followed by the endpoint-specific limiter, if one exists.
/// </summary>
- public PartitionedRateLimiter<HttpContext> Limiter
- {
- get => _limiter;
- set => _limiter = value ?? throw new ArgumentNullException(nameof(value));
- }
+ public PartitionedRateLimiter<HttpContext>? GlobalLimiter { get; set; }
/// <summary>
- /// Gets or sets a <see cref="Func{HttpContext, RateLimitLease, Task}"/> that handles requests rejected by this middleware.
+ /// Gets or sets a <see cref="Func{OnRejectedContext, CancellationToken, ValueTask}"/> that handles requests rejected by this middleware.
/// </summary>
- public Func<HttpContext, RateLimitLease, Task> OnRejected
- {
- get => _onRejected;
- set => _onRejected = value ?? throw new ArgumentNullException(nameof(value));
- }
+ public Func<OnRejectedContext, CancellationToken, ValueTask>? OnRejected { get; set; }
/// <summary>
/// Gets or sets the default status code to set on the response when a request is rejected.
@@ -44,5 +38,94 @@ public sealed class RateLimiterOptions
/// This status code will be set before <see cref="OnRejected"/> is called, so any status code set by
/// <see cref="OnRejected"/> will "win" over this default.
/// </remarks>
- public int DefaultRejectionStatusCode { get; set; } = StatusCodes.Status503ServiceUnavailable;
+ public int RejectionStatusCode { get; set; } = StatusCodes.Status503ServiceUnavailable;
+
+ /// <summary>
+ /// Adds a new rate limiting policy with the given <paramref name="policyName"/>
+ /// </summary>
+ /// <param name="policyName">The name to be associated with the given <see cref="RateLimiter"/>.</param>
+ /// <param name="partitioner">Method called every time an Acquire or WaitAsync call is made to determine what rate limiter to apply to the request.</param>
+ public RateLimiterOptions AddPolicy<TPartitionKey>(string policyName, Func<HttpContext, RateLimitPartition<TPartitionKey>> partitioner)
+ {
+ ArgumentNullException.ThrowIfNull(policyName);
+ ArgumentNullException.ThrowIfNull(partitioner);
+
+ if (PolicyMap.ContainsKey(policyName) || UnactivatedPolicyMap.ContainsKey(policyName))
+ {
+ throw new ArgumentException($"There already exists a policy with the name {policyName}.", nameof(policyName));
+ }
+
+ PolicyMap.Add(policyName, new DefaultRateLimiterPolicy(ConvertPartitioner<TPartitionKey>(policyName, partitioner), null));
+
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a new rate limiting policy with the given policyName.
+ /// </summary>
+ /// <param name="policyName">The name to be associated with the given TPolicy.</param>
+ public RateLimiterOptions AddPolicy<TPartitionKey, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TPolicy>(string policyName) where TPolicy : IRateLimiterPolicy<TPartitionKey>
+ {
+ ArgumentNullException.ThrowIfNull(policyName);
+
+ if (PolicyMap.ContainsKey(policyName) || UnactivatedPolicyMap.ContainsKey(policyName))
+ {
+ throw new ArgumentException($"There already exists a policy with the name {policyName}.", nameof(policyName));
+ }
+
+ var policyType = new PolicyTypeState(typeof(TPolicy));
+ Func<IServiceProvider, DefaultRateLimiterPolicy> policyFunc = serviceProvider =>
+ {
+ var instance = (IRateLimiterPolicy<TPartitionKey>)ActivatorUtilities.CreateInstance(serviceProvider, policyType.PolicyType);
+ return new DefaultRateLimiterPolicy(ConvertPartitioner<TPartitionKey>(policyName, instance.GetPartition), instance.OnRejected);
+ };
+
+ UnactivatedPolicyMap.Add(policyName, policyFunc);
+
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a new rate limiting policy with the given policyName.
+ /// </summary>
+ /// <param name="policyName">The name to be associated with the given <see cref="IRateLimiterPolicy{TPartitionKey}"/>.</param>
+ /// <param name="policy">The <see cref="IRateLimiterPolicy{TPartitionKey}"/> to be applied.</param>
+ public RateLimiterOptions AddPolicy<TPartitionKey>(string policyName, IRateLimiterPolicy<TPartitionKey> policy)
+ {
+ ArgumentNullException.ThrowIfNull(policyName);
+
+ if (PolicyMap.ContainsKey(policyName) || UnactivatedPolicyMap.ContainsKey(policyName))
+ {
+ throw new ArgumentException($"There already exists a policy with the name {policyName}.", nameof(policyName));
+ }
+
+ ArgumentNullException.ThrowIfNull(policy);
+
+ PolicyMap.Add(policyName, new DefaultRateLimiterPolicy(ConvertPartitioner<TPartitionKey>(policyName, policy.GetPartition), policy.OnRejected));
+
+ return this;
+ }
+
+ // Converts a Partition<TKey> to a Partition<DefaultKeyType<TKey>> to prevent accidental collisions with the keys we create in the the RateLimiterOptionsExtensions.
+ internal static Func<HttpContext, RateLimitPartition<DefaultKeyType>> ConvertPartitioner<TPartitionKey>(string? policyName, Func<HttpContext, RateLimitPartition<TPartitionKey>> partitioner)
+ {
+ return context =>
+ {
+ RateLimitPartition<TPartitionKey> partition = partitioner(context);
+ var partitionKey = new DefaultKeyType(policyName, partition.PartitionKey, partition.Factory);
+ return new RateLimitPartition<DefaultKeyType>(partitionKey, static key => ((Func<TPartitionKey, RateLimiter>)key.Factory!)((TPartitionKey)key.Key!));
+ };
+ }
+
+ // Workaround for linker bug: https://github.com/dotnet/linker/issues/1981
+ private readonly struct PolicyTypeState
+ {
+ public PolicyTypeState([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type policyType)
+ {
+ PolicyType = policyType;
+ }
+
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ public Type PolicyType { get; }
+ }
}
diff --git a/src/Middleware/RateLimiting/src/RateLimiterOptionsExtensions.cs b/src/Middleware/RateLimiting/src/RateLimiterOptionsExtensions.cs
new file mode 100644
index 0000000000..5526007281
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/RateLimiterOptionsExtensions.cs
@@ -0,0 +1,102 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+/// <summary>
+/// Extension methods for the RateLimiting middleware options.
+/// </summary>
+public static class RateLimiterOptionsExtensions
+{
+ /// <summary>
+ /// Adds a new <see cref="TokenBucketRateLimiter"/> with the given <see cref="TokenBucketRateLimiterOptions"/> to the <see cref="RateLimiterOptions"/>.
+ /// </summary>
+ /// <param name="options">The <see cref="RateLimiterOptions"/> to add a limiter to.</param>
+ /// <param name="policyName">The name that will be associated with the limiter.</param>
+ /// <param name="configureOptions">A callback to configure the <see cref="TokenBucketRateLimiterOptions"/> to be used for the limiter.</param>
+ /// <returns>This <see cref="RateLimiterOptions"/>.</returns>
+ public static RateLimiterOptions AddTokenBucketLimiter(this RateLimiterOptions options, string policyName, Action<TokenBucketRateLimiterOptions> configureOptions)
+ {
+ ArgumentNullException.ThrowIfNull(configureOptions);
+
+ var key = new PolicyNameKey() { PolicyName = policyName };
+ var tokenBucketRateLimiterOptions = new TokenBucketRateLimiterOptions();
+ configureOptions.Invoke(tokenBucketRateLimiterOptions);
+ // Saves an allocation in GetTokenBucketLimiter, which would have created a new set of options if this was true.
+ tokenBucketRateLimiterOptions.AutoReplenishment = false;
+ return options.AddPolicy(policyName, context =>
+ {
+ return RateLimitPartition.GetTokenBucketLimiter(key,
+ _ => tokenBucketRateLimiterOptions);
+ });
+ }
+
+ /// <summary>
+ /// Adds a new <see cref="FixedWindowRateLimiter"/> with the given <see cref="FixedWindowRateLimiterOptions"/> to the <see cref="RateLimiterOptions"/>.
+ /// </summary>
+ /// <param name="options">The <see cref="RateLimiterOptions"/> to add a limiter to.</param>
+ /// <param name="policyName">The name that will be associated with the limiter.</param>
+ /// <param name="configureOptions">A callback to configure the <see cref="FixedWindowRateLimiterOptions"/> to be used for the limiter.</param>
+ /// <returns>This <see cref="RateLimiterOptions"/>.</returns>
+ public static RateLimiterOptions AddFixedWindowLimiter(this RateLimiterOptions options, string policyName, Action<FixedWindowRateLimiterOptions> configureOptions)
+ {
+ ArgumentNullException.ThrowIfNull(configureOptions);
+
+ var key = new PolicyNameKey() { PolicyName = policyName };
+ var fixedWindowRateLimiterOptions = new FixedWindowRateLimiterOptions();
+ configureOptions.Invoke(fixedWindowRateLimiterOptions);
+ // Saves an allocation in GetFixedWindowLimiter, which would have created a new set of options if this was true.
+ fixedWindowRateLimiterOptions.AutoReplenishment = false;
+ return options.AddPolicy(policyName, context =>
+ {
+ return RateLimitPartition.GetFixedWindowLimiter(key,
+ _ => fixedWindowRateLimiterOptions);
+ });
+ }
+
+ /// <summary>
+ /// Adds a new <see cref="SlidingWindowRateLimiter"/> with the given <see cref="SlidingWindowRateLimiterOptions"/> to the <see cref="RateLimiterOptions"/>.
+ /// </summary>
+ /// <param name="options">The <see cref="RateLimiterOptions"/> to add a limiter to.</param>
+ /// <param name="policyName">The name that will be associated with the limiter.</param>
+ /// <param name="configureOptions">A callback to configure the <see cref="SlidingWindowRateLimiterOptions"/> to be used for the limiter.</param>
+ /// <returns>This <see cref="RateLimiterOptions"/>.</returns>
+ public static RateLimiterOptions AddSlidingWindowLimiter(this RateLimiterOptions options, string policyName, Action<SlidingWindowRateLimiterOptions> configureOptions)
+ {
+ ArgumentNullException.ThrowIfNull(configureOptions);
+
+ var key = new PolicyNameKey() { PolicyName = policyName };
+ var slidingWindowRateLimiterOptions = new SlidingWindowRateLimiterOptions();
+ configureOptions.Invoke(slidingWindowRateLimiterOptions);
+ // Saves an allocation in GetSlidingWindowLimiter, which would have created a new set of options if this was true.
+ slidingWindowRateLimiterOptions.AutoReplenishment = false;
+ return options.AddPolicy(policyName, context =>
+ {
+ return RateLimitPartition.GetSlidingWindowLimiter(key,
+ _ => slidingWindowRateLimiterOptions);
+ });
+ }
+
+ /// <summary>
+ /// Adds a new <see cref="ConcurrencyLimiter"/> with the given <see cref="ConcurrencyLimiterOptions"/> to the <see cref="RateLimiterOptions"/>.
+ /// </summary>
+ /// <param name="options">The <see cref="RateLimiterOptions"/> to add a limiter to.</param>
+ /// <param name="policyName">The name that will be associated with the limiter.</param>
+ /// <param name="configureOptions">A callback to configure the <see cref="ConcurrencyLimiterOptions"/> to be used for the limiter.</param>
+ /// <returns>This <see cref="RateLimiterOptions"/>.</returns>
+ public static RateLimiterOptions AddConcurrencyLimiter(this RateLimiterOptions options, string policyName, Action<ConcurrencyLimiterOptions> configureOptions)
+ {
+ ArgumentNullException.ThrowIfNull(configureOptions);
+
+ var key = new PolicyNameKey() { PolicyName = policyName };
+ var concurrencyLimiterOptions = new ConcurrencyLimiterOptions();
+ configureOptions.Invoke(concurrencyLimiterOptions);
+ return options.AddPolicy(policyName, context =>
+ {
+ return RateLimitPartition.GetConcurrencyLimiter(key,
+ _ => concurrencyLimiterOptions);
+ });
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs b/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs
new file mode 100644
index 0000000000..ac3c671800
--- /dev/null
+++ b/src/Middleware/RateLimiting/src/RateLimiterServiceCollectionExtensions.cs
@@ -0,0 +1,28 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.RateLimiting;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Builder;
+
+/// <summary>
+/// Extension methods for the RateLimiting middleware.
+/// </summary>
+public static class RateLimiterServiceCollectionExtensions
+{
+ /// <summary>
+ /// Add rate limiting services and configure the related options.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
+ /// <param name="configureOptions">A delegate to configure the <see cref="RateLimiterOptions"/>.</param>
+ /// <returns></returns>
+ public static IServiceCollection AddRateLimiter(this IServiceCollection services, Action<RateLimiterOptions> configureOptions)
+ {
+ ArgumentNullException.ThrowIfNull(services);
+ ArgumentNullException.ThrowIfNull(configureOptions);
+
+ services.Configure(configureOptions);
+ return services;
+ }
+}
diff --git a/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs b/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs
index a97aa7c9ee..ccd9a80294 100644
--- a/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs
+++ b/src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs
@@ -14,10 +14,13 @@ namespace Microsoft.AspNetCore.RateLimiting;
internal sealed partial class RateLimitingMiddleware
{
private readonly RequestDelegate _next;
- private readonly Func<HttpContext, RateLimitLease, Task> _onRejected;
+ private readonly Func<OnRejectedContext, CancellationToken, ValueTask>? _defaultOnRejected;
private readonly ILogger _logger;
- private readonly PartitionedRateLimiter<HttpContext> _limiter;
+ private readonly PartitionedRateLimiter<HttpContext>? _globalLimiter;
+ private readonly PartitionedRateLimiter<HttpContext> _endpointLimiter;
private readonly int _rejectionStatusCode;
+ private readonly Dictionary<string, DefaultRateLimiterPolicy> _policyMap;
+ private readonly DefaultKeyType _defaultPolicyKey = new DefaultKeyType("__defaultPolicy", new PolicyNameKey { PolicyName = "__defaultPolicyKey" });
/// <summary>
/// Creates a new <see cref="RateLimitingMiddleware"/>.
@@ -25,15 +28,28 @@ internal sealed partial class RateLimitingMiddleware
/// <param name="next">The <see cref="RequestDelegate"/> representing the next middleware in the pipeline.</param>
/// <param name="logger">The <see cref="ILogger"/> used for logging.</param>
/// <param name="options">The options for the middleware.</param>
- public RateLimitingMiddleware(RequestDelegate next, ILogger<RateLimitingMiddleware> logger, IOptions<RateLimiterOptions> options)
+ /// <param name="serviceProvider">The service provider.</param>
+ public RateLimitingMiddleware(RequestDelegate next, ILogger<RateLimitingMiddleware> logger, IOptions<RateLimiterOptions> options, IServiceProvider serviceProvider)
{
- _next = next ?? throw new ArgumentNullException(nameof(next));
+ ArgumentNullException.ThrowIfNull(next);
+ ArgumentNullException.ThrowIfNull(logger);
+ ArgumentNullException.ThrowIfNull(serviceProvider);
- _logger = logger ?? throw new ArgumentNullException(nameof(logger));
+ _next = next;
+ _logger = logger;
+ _defaultOnRejected = options.Value.OnRejected;
+ _rejectionStatusCode = options.Value.RejectionStatusCode;
+ _policyMap = new Dictionary<string, DefaultRateLimiterPolicy>(options.Value.PolicyMap);
+
+ // Activate policies passed to AddPolicy<TPartitionKey, TPolicy>
+ foreach (var unactivatedPolicy in options.Value.UnactivatedPolicyMap)
+ {
+ _policyMap.Add(unactivatedPolicy.Key, unactivatedPolicy.Value(serviceProvider));
+ }
+
+ _globalLimiter = options.Value.GlobalLimiter;
+ _endpointLimiter = CreateEndpointLimiter();
- _limiter = options.Value.Limiter;
- _onRejected = options.Value.OnRejected;
- _rejectionStatusCode = options.Value.DefaultRejectionStatusCode;
}
// TODO - EventSource?
@@ -42,37 +58,181 @@ internal sealed partial class RateLimitingMiddleware
/// </summary>
/// <param name="context">The <see cref="HttpContext"/>.</param>
/// <returns>A <see cref="Task"/> that completes when the request leaves.</returns>
- public async Task Invoke(HttpContext context)
+ public Task Invoke(HttpContext context)
{
- using var lease = await TryAcquireAsync(context);
- if (lease.IsAcquired)
+ var endpoint = context.GetEndpoint();
+ // If this endpoint has a DisableRateLimitingAttribute, don't apply any rate limits.
+ if (endpoint?.Metadata.GetMetadata<DisableRateLimitingAttribute>() is not null)
+ {
+ return _next(context);
+ }
+ var enableRateLimitingAttribute = endpoint?.Metadata.GetMetadata<EnableRateLimitingAttribute>();
+ // If this endpoint has no EnableRateLimitingAttribute & there's no global limiter, don't apply any rate limits.
+ if (enableRateLimitingAttribute is null && _globalLimiter is null)
+ {
+ return _next(context);
+ }
+ return InvokeInternal(context, enableRateLimitingAttribute);
+ }
+
+ private async Task InvokeInternal(HttpContext context, EnableRateLimitingAttribute? enableRateLimitingAttribute)
+ {
+ using var leaseContext = await TryAcquireAsync(context);
+ if (leaseContext.Lease.IsAcquired)
{
await _next(context);
}
else
{
+ var thisRequestOnRejected = _defaultOnRejected;
RateLimiterLog.RequestRejectedLimitsExceeded(_logger);
// OnRejected "wins" over DefaultRejectionStatusCode - we set DefaultRejectionStatusCode first,
// then call OnRejected in case it wants to do any further modification of the status code.
context.Response.StatusCode = _rejectionStatusCode;
- await _onRejected(context, lease);
+
+ // If this request was rejected by the endpoint limiter, use its OnRejected if available.
+ if (leaseContext.GlobalRejected == false)
+ {
+ DefaultRateLimiterPolicy? policy;
+ // Use custom policy OnRejected if available, else use OnRejected from the Options if available.
+ policy = enableRateLimitingAttribute?.Policy;
+ if (policy is not null)
+ {
+ thisRequestOnRejected = policy.OnRejected;
+ }
+ else
+ {
+ var policyName = enableRateLimitingAttribute?.PolicyName;
+ if (policyName is not null && _policyMap.TryGetValue(policyName, out policy) && policy.OnRejected is not null)
+ {
+ thisRequestOnRejected = policy.OnRejected;
+ }
+ }
+ }
+ if (thisRequestOnRejected is not null)
+ {
+ await thisRequestOnRejected(new OnRejectedContext() { HttpContext = context, Lease = leaseContext.Lease }, context.RequestAborted);
+ }
+ }
+ }
+
+ private ValueTask<LeaseContext> TryAcquireAsync(HttpContext context)
+ {
+ var leaseContext = CombinedAcquire(context);
+ if (leaseContext.Lease.IsAcquired)
+ {
+ return ValueTask.FromResult(leaseContext);
}
+
+ return CombinedWaitAsync(context, context.RequestAborted);
}
- private ValueTask<RateLimitLease> TryAcquireAsync(HttpContext context)
+ private LeaseContext CombinedAcquire(HttpContext context)
{
- var lease = _limiter.Acquire(context);
- if (lease.IsAcquired)
+ RateLimitLease? globalLease = null;
+ RateLimitLease? endpointLease = null;
+
+ try
{
- return ValueTask.FromResult(lease);
+ if (_globalLimiter is not null)
+ {
+ globalLease = _globalLimiter.AttemptAcquire(context);
+ if (!globalLease.IsAcquired)
+ {
+ return new LeaseContext() { GlobalRejected = true, Lease = globalLease };
+ }
+ }
+ endpointLease = _endpointLimiter.AttemptAcquire(context);
+ if (!endpointLease.IsAcquired)
+ {
+ globalLease?.Dispose();
+ return new LeaseContext() { GlobalRejected = false, Lease = endpointLease };
+ }
}
+ catch (Exception)
+ {
+ endpointLease?.Dispose();
+ globalLease?.Dispose();
+ throw;
+ }
+ return globalLease is null ? new LeaseContext() { Lease = endpointLease } : new LeaseContext() { Lease = new DefaultCombinedLease(globalLease, endpointLease) };
+ }
- return _limiter.WaitAsync(context, cancellationToken: context.RequestAborted);
+ private async ValueTask<LeaseContext> CombinedWaitAsync(HttpContext context, CancellationToken cancellationToken)
+ {
+ RateLimitLease? globalLease = null;
+ RateLimitLease? endpointLease = null;
+
+ try
+ {
+ if (_globalLimiter is not null)
+ {
+ globalLease = await _globalLimiter.AcquireAsync(context, cancellationToken: cancellationToken);
+ if (!globalLease.IsAcquired)
+ {
+ return new LeaseContext() { GlobalRejected = true, Lease = globalLease };
+ }
+ }
+ endpointLease = await _endpointLimiter.AcquireAsync(context, cancellationToken: cancellationToken);
+ if (!endpointLease.IsAcquired)
+ {
+ globalLease?.Dispose();
+ return new LeaseContext() { GlobalRejected = false, Lease = endpointLease };
+ }
+ }
+ catch (Exception)
+ {
+ endpointLease?.Dispose();
+ globalLease?.Dispose();
+ throw;
+ }
+
+ return globalLease is null ? new LeaseContext() { Lease = endpointLease } : new LeaseContext() { Lease = new DefaultCombinedLease(globalLease, endpointLease) };
+ }
+
+ // Create the endpoint-specific PartitionedRateLimiter
+ private PartitionedRateLimiter<HttpContext> CreateEndpointLimiter()
+ {
+ // If we have a policy for this endpoint, use its partitioner. Else use a NoLimiter.
+ return PartitionedRateLimiter.Create<HttpContext, DefaultKeyType>(context =>
+ {
+ DefaultRateLimiterPolicy? policy;
+ var enableRateLimitingAttribute = context.GetEndpoint()?.Metadata.GetMetadata<EnableRateLimitingAttribute>();
+ if (enableRateLimitingAttribute is null)
+ {
+ return RateLimitPartition.GetNoLimiter<DefaultKeyType>(_defaultPolicyKey);
+ }
+ policy = enableRateLimitingAttribute.Policy;
+ if (policy is not null)
+ {
+ return policy.GetPartition(context);
+ }
+ var name = enableRateLimitingAttribute.PolicyName;
+ if (name is not null)
+ {
+ if (_policyMap.TryGetValue(name, out policy))
+ {
+ return policy.GetPartition(context);
+ }
+ else
+ {
+ throw new InvalidOperationException($"This endpoint requires a rate limiting policy with name {name}, but no such policy exists.");
+ }
+ }
+ // Should be impossible for both name & policy to be null, but throw in that scenario just in case.
+ else
+ {
+ throw new InvalidOperationException("This endpoint requested a rate limiting policy with a null name.");
+ }
+ }, new DefaultKeyTypeEqualityComparer());
}
private static partial class RateLimiterLog
{
[LoggerMessage(1, LogLevel.Debug, "Rate limits exceeded, rejecting this request.", EventName = "RequestRejectedLimitsExceeded")]
internal static partial void RequestRejectedLimitsExceeded(ILogger logger);
+
+ [LoggerMessage(2, LogLevel.Debug, "This endpoint requires a rate limiting policy with name {PolicyName}, but no such policy exists.", EventName = "WarnMissingPolicy")]
+ internal static partial void WarnMissingPolicy(ILogger logger, string policyName);
}
}
diff --git a/src/Middleware/RateLimiting/test/RateLimiterEndpointConventionBuilderExtensionsTests.cs b/src/Middleware/RateLimiting/test/RateLimiterEndpointConventionBuilderExtensionsTests.cs
new file mode 100644
index 0000000000..a4c6003144
--- /dev/null
+++ b/src/Middleware/RateLimiting/test/RateLimiterEndpointConventionBuilderExtensionsTests.cs
@@ -0,0 +1,94 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Testing;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+
+public class RateLimiterEndpointConventionBuilderExtensionsTests : LoggedTest
+{
+ [Fact]
+ public void RequireRateLimiting_Name_MetadataAdded()
+ {
+ // Arrange
+ var testConventionBuilder = new TestEndpointConventionBuilder();
+
+ // Act
+ testConventionBuilder.RequireRateLimiting("TestPolicyName");
+
+ // Assert
+ var addEnableRateLimitingAttribute = Assert.Single(testConventionBuilder.Conventions);
+
+ var endpointModel = new TestEndpointBuilder();
+ addEnableRateLimitingAttribute(endpointModel);
+ var endpoint = endpointModel.Build();
+
+ var metadata = endpoint.Metadata.GetMetadata<EnableRateLimitingAttribute>();
+ Assert.NotNull(metadata);
+ Assert.Equal("TestPolicyName", metadata.PolicyName);
+ Assert.Null(metadata.Policy);
+ }
+
+ [Fact]
+ public void RequireRateLimiting_Policy_MetadataAdded()
+ {
+ // Arrange
+ var testConventionBuilder = new TestEndpointConventionBuilder();
+
+ // Act
+ testConventionBuilder.RequireRateLimiting<TestEndpointConventionBuilder, string>(new TestRateLimiterPolicy("myKey", 404, false));
+
+ // Assert
+ var addEnableRateLimitingAttribute = Assert.Single(testConventionBuilder.Conventions);
+
+ var endpointBuilder = new TestEndpointBuilder();
+ addEnableRateLimitingAttribute(endpointBuilder);
+ var endpoint = endpointBuilder.Build();
+
+ var metadata = endpoint.Metadata.GetMetadata<EnableRateLimitingAttribute>();
+ Assert.NotNull(metadata);
+ Assert.NotNull(metadata.Policy);
+ Assert.Null(metadata.PolicyName);
+ }
+
+ [Fact]
+ public void DisableRateLimiting_MetadataAdded()
+ {
+ // Arrange
+ var testConventionBuilder = new TestEndpointConventionBuilder();
+
+ // Act
+ testConventionBuilder.DisableRateLimiting();
+
+ // Assert
+ var addDisableRateLimitingAttribute = Assert.Single(testConventionBuilder.Conventions);
+
+ var endpointModel = new TestEndpointBuilder();
+ addDisableRateLimitingAttribute(endpointModel);
+ var endpoint = endpointModel.Build();
+
+ var metadata = endpoint.Metadata.GetMetadata<DisableRateLimitingAttribute>();
+ Assert.NotNull(metadata);
+ }
+
+ private class TestEndpointBuilder : EndpointBuilder
+ {
+ public override Endpoint Build()
+ {
+ return new Endpoint(RequestDelegate, new EndpointMetadataCollection(Metadata), DisplayName);
+ }
+ }
+
+ private class TestEndpointConventionBuilder : IEndpointConventionBuilder
+ {
+ public IList<Action<EndpointBuilder>> Conventions { get; } = new List<Action<EndpointBuilder>>();
+
+ public void Add(Action<EndpointBuilder> convention)
+ {
+ Conventions.Add(convention);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/Middleware/RateLimiting/test/RateLimitingApplicationBuilderExtensionsTests.cs b/src/Middleware/RateLimiting/test/RateLimitingApplicationBuilderExtensionsTests.cs
index 37d6d5bc4c..45afd2182a 100644
--- a/src/Middleware/RateLimiting/test/RateLimitingApplicationBuilderExtensionsTests.cs
+++ b/src/Middleware/RateLimiting/test/RateLimitingApplicationBuilderExtensionsTests.cs
@@ -14,7 +14,7 @@ public class RateLimitingApplicationBuilderExtensionsTests : LoggedTest
[Fact]
public void UseRateLimiter_ThrowsOnNullAppBuilder()
{
- Assert.Throws<ArgumentNullException>(() => RateLimitingApplicationBuilderExtensions.UseRateLimiter(null));
+ Assert.Throws<ArgumentNullException>(() => RateLimiterApplicationBuilderExtensions.UseRateLimiter(null));
}
[Fact]
@@ -29,15 +29,15 @@ public class RateLimitingApplicationBuilderExtensionsTests : LoggedTest
{
// These are the options that should get used
var options = new RateLimiterOptions();
- options.DefaultRejectionStatusCode = 429;
- options.Limiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.RejectionStatusCode = 429;
+ options.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
// These should not get used
var services = new ServiceCollection();
services.Configure<RateLimiterOptions>(options =>
{
- options.Limiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
- options.DefaultRejectionStatusCode = 404;
+ options.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.RejectionStatusCode = 404;
});
services.AddLogging();
var serviceProvider = services.BuildServiceProvider();
diff --git a/src/Middleware/RateLimiting/test/RateLimitingMiddlewareTests.cs b/src/Middleware/RateLimiting/test/RateLimitingMiddlewareTests.cs
index 903b225ed4..e095d2ffc1 100644
--- a/src/Middleware/RateLimiting/test/RateLimitingMiddlewareTests.cs
+++ b/src/Middleware/RateLimiting/test/RateLimitingMiddlewareTests.cs
@@ -1,11 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Threading.RateLimiting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
+using Moq;
namespace Microsoft.AspNetCore.RateLimiting;
@@ -15,19 +17,29 @@ public class RateLimitingMiddlewareTests : LoggedTest
public void Ctor_ThrowsExceptionsWhenNullArgs()
{
var options = CreateOptionsAccessor();
- options.Value.Limiter = new TestPartitionedRateLimiter<HttpContext>();
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>();
Assert.Throws<ArgumentNullException>(() => new RateLimitingMiddleware(
null,
new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
- options));
+ options,
+ Mock.Of<IServiceProvider>()));
Assert.Throws<ArgumentNullException>(() => new RateLimitingMiddleware(c =>
- {
- return Task.CompletedTask;
- },
- null,
- options));
+ {
+ return Task.CompletedTask;
+ },
+ null,
+ options,
+ Mock.Of<IServiceProvider>()));
+
+ Assert.Throws<ArgumentNullException>(() => new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ null));
}
[Fact]
@@ -35,14 +47,15 @@ public class RateLimitingMiddlewareTests : LoggedTest
{
var flag = false;
var options = CreateOptionsAccessor();
- options.Value.Limiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(true));
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(true));
var middleware = new RateLimitingMiddleware(c =>
- {
- flag = true;
- return Task.CompletedTask;
- },
- new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
- options);
+ {
+ flag = true;
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
await middleware.Invoke(new DefaultHttpContext());
Assert.True(flag);
@@ -53,68 +66,545 @@ public class RateLimitingMiddlewareTests : LoggedTest
{
var onRejectedInvoked = false;
var options = CreateOptionsAccessor();
- options.Value.Limiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
- options.Value.OnRejected = (httpContext, lease) =>
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.Value.OnRejected = (context, token) =>
{
onRejectedInvoked = true;
- return Task.CompletedTask;
+ return ValueTask.CompletedTask;
};
var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.True(onRejectedInvoked);
+ Assert.Equal(StatusCodes.Status503ServiceUnavailable, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task RequestRejected_WinsOverDefaultStatusCode()
+ {
+ var onRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.Value.OnRejected = (context, token) =>
+ {
+ onRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.True(onRejectedInvoked);
+ Assert.Equal(StatusCodes.Status429TooManyRequests, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task RequestAborted_ThrowsTaskCanceledException()
+ {
+ var options = CreateOptionsAccessor();
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.RequestAborted = new CancellationToken(true);
+ await Assert.ThrowsAsync<TaskCanceledException>(() => middleware.Invoke(context)).DefaultTimeout();
+ }
+
+ [Fact]
+ public async Task EndpointLimiterRequested_NoPolicy_Throws()
+ {
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+
+ var middleware = new RateLimitingMiddleware(c =>
{
return Task.CompletedTask;
},
- new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
- options);
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await Assert.ThrowsAsync<InvalidOperationException>(() => middleware.Invoke(context)).DefaultTimeout();
+ }
+
+ [Fact]
+ public async Task EndpointLimiter_Rejects()
+ {
+ var onRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+ options.Value.AddPolicy<string>(name, (context =>
+ {
+ return RateLimitPartition.Get<string>("myLimiter", (key =>
+ {
+ return new TestRateLimiter(false);
+ }));
+ }));
+ options.Value.OnRejected = (context, token) =>
+ {
+ onRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
await middleware.Invoke(context).DefaultTimeout();
Assert.True(onRejectedInvoked);
- Assert.Equal(StatusCodes.Status503ServiceUnavailable, context.Response.StatusCode);
+ Assert.Equal(StatusCodes.Status429TooManyRequests, context.Response.StatusCode);
}
[Fact]
- public async Task RequestRejected_WinsOverDefaultStatusCode()
+ public async Task EndpointLimiterConvenienceMethod_Rejects()
{
var onRejectedInvoked = false;
var options = CreateOptionsAccessor();
- options.Value.Limiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
- options.Value.OnRejected = (httpContext, lease) =>
+ var name = "myEndpoint";
+ options.Value.AddFixedWindowLimiter(name, options =>
+ {
+ options.PermitLimit = 1;
+ options.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
+ options.QueueLimit = 0;
+ options.Window = TimeSpan.Zero;
+ options.AutoReplenishment = false;
+ });
+ options.Value.OnRejected = (context, token) =>
{
onRejectedInvoked = true;
- httpContext.Response.StatusCode = 429;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(onRejectedInvoked);
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.True(onRejectedInvoked);
+ Assert.Equal(StatusCodes.Status429TooManyRequests, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task EndpointLimiterRejects_EndpointOnRejectedFires()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+ // This is the policy that should get used
+ options.Value.AddPolicy<string>(name, new TestRateLimiterPolicy("myKey", 404, false));
+ // This OnRejected should be ignored in favor of the one on the policy
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task GlobalAndEndpoint_GlobalRejects_GlobalWins()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+ // Endpoint always allows - it should not fire
+ options.Value.AddPolicy<string>(name, new TestRateLimiterPolicy("myKey", 404, true));
+ // Global never allows - it should fire
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.True(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status429TooManyRequests, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task GlobalAndEndpoint_EndpointRejects_EndpointWins()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+ // Endpoint never allows - it should fire
+ options.Value.AddPolicy<string>(name, new TestRateLimiterPolicy("myKey", 404, false));
+ // Global always allows - it should not fire
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(true));
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task GlobalAndEndpoint_BothReject_GlobalWins()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+ // Endpoint never allows - it should not fire
+ options.Value.AddPolicy<string>(name, new TestRateLimiterPolicy("myKey", 404, false));
+ // Global never allows - it should fire
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.True(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status429TooManyRequests, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task EndpointLimiterRejects_EndpointOnRejectedFires_WithIRateLimiterPolicy()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var name = "myEndpoint";
+ // This is the policy that should get used
+ options.Value.AddPolicy<string, TestRateLimiterPolicy>(name);
+ // This OnRejected should be ignored in favor of the one on the policy
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ // Configure the service provider with the args to the TestRateLimiterPolicy ctor
+ var mockServiceProvider = new Mock<IServiceProvider>();
+ mockServiceProvider
+ .Setup(sp => sp.GetService(typeof(string)))
+ .Returns("myKey");
+ mockServiceProvider
+ .Setup(sp => sp.GetService(typeof(int)))
+ .Returns(404);
+ mockServiceProvider
+ .Setup(sp => sp.GetService(typeof(bool)))
+ .Returns(false);
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ mockServiceProvider.Object);
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task EndpointLimiter_DuplicatePartitionKey_NoCollision()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var endpointName1 = "myEndpoint1";
+ var endpointName2 = "myEndpoint2";
+ var duplicateKey = "myKey";
+ // Two policies with the same partition key should not collide, because DefaultKeyType has reference equality
+ options.Value.AddPolicy<string>(endpointName1, new TestRateLimiterPolicy(duplicateKey, 404, false));
+ options.Value.AddPolicy<string>(endpointName2, new TestRateLimiterPolicy(duplicateKey, 400, false));
+ // This OnRejected should be ignored in favor of the ones on the policy
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
};
var middleware = new RateLimitingMiddleware(c =>
{
return Task.CompletedTask;
},
- new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
- options);
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
var context = new DefaultHttpContext();
+ var endpoint1 = new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(endpointName1)), "Test endpoint 1");
+ var endpoint2 = new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(endpointName2)), "Test endpoint 2");
+
+ context.SetEndpoint(endpoint1);
await middleware.Invoke(context).DefaultTimeout();
- Assert.True(onRejectedInvoked);
+ Assert.False(globalOnRejectedInvoked);
+ // This should hit endpointName1
+ Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
+
+ context.SetEndpoint(endpoint2);
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+ // This should hit endpointName2
+ Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task EndpointLimiter_DuplicatePartitionKey_Lambda_NoCollision()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ var endpointName1 = "myEndpoint1";
+ var endpointName2 = "myEndpoint2";
+ var duplicateKey = "myKey";
+ // Two policies with the same partition key should not collide, because DefaultKeyType has reference equality
+ options.Value.AddPolicy<string>(endpointName1, key =>
+ {
+ return new RateLimitPartition<string>(duplicateKey, partitionKey =>
+ {
+ return new TestRateLimiter(false);
+ });
+ });
+ options.Value.AddPolicy<string>(endpointName2, key =>
+ {
+ return new RateLimitPartition<string>(duplicateKey, partitionKey =>
+ {
+ return new TestRateLimiter(true);
+ });
+ });
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ var endpoint1 = new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(endpointName1)), "Test endpoint 1");
+ var endpoint2 = new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(endpointName2)), "Test endpoint 2");
+
+ context.SetEndpoint(endpoint1);
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.True(globalOnRejectedInvoked);
+ // This should hit endpointName1
Assert.Equal(StatusCodes.Status429TooManyRequests, context.Response.StatusCode);
+
+ globalOnRejectedInvoked = false;
+
+ context.SetEndpoint(endpoint2);
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
}
[Fact]
- public async Task RequestAborted_ThrowsTaskCanceledException()
+ public async Task DisableRateLimitingAttribute_SkipsGlobalAndEndpoint()
{
+ var globalOnRejectedInvoked = false;
var options = CreateOptionsAccessor();
- options.Value.Limiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ var name = "myEndpoint";
+ // Endpoint never allows
+ options.Value.AddPolicy<string>(name, new TestRateLimiterPolicy("myKey", 404, false));
+ // Global never allows
+ options.Value.GlobalLimiter = new TestPartitionedRateLimiter<HttpContext>(new TestRateLimiter(false));
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
var middleware = new RateLimitingMiddleware(c =>
{
return Task.CompletedTask;
},
- new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
- options);
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
var context = new DefaultHttpContext();
- context.RequestAborted = new CancellationToken(true);
- await Assert.ThrowsAsync<TaskCanceledException>(() => middleware.Invoke(context)).DefaultTimeout();
+ // DisableRateLimitingAttribute last
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(name), new DisableRateLimitingAttribute()), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
+
+ // DisableRateLimitingAttribute first
+ context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new DisableRateLimitingAttribute(), new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status200OK, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task PolicyDirectlyOnEndpoint_GetsUsed()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ // Policy will disallow
+ var policy = new TestRateLimiterPolicy("myKey", 404, false);
+ var defaultRateLimiterPolicy = new DefaultRateLimiterPolicy(RateLimiterOptions.ConvertPartitioner<string>(null, policy.GetPartition), policy.OnRejected);
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(defaultRateLimiterPolicy)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status404NotFound, context.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task MultipleEndpointPolicies_LastOneWins()
+ {
+ var globalOnRejectedInvoked = false;
+ var options = CreateOptionsAccessor();
+ // Policy will disallow
+ var policy = new TestRateLimiterPolicy("myKey1", 404, false);
+ var defaultRateLimiterPolicy = new DefaultRateLimiterPolicy(RateLimiterOptions.ConvertPartitioner<string>(null, policy.GetPartition), policy.OnRejected);
+
+ var name = "myEndpoint";
+ options.Value.AddPolicy<string>(name, new TestRateLimiterPolicy("myKey2", 403, false));
+
+ options.Value.OnRejected = (context, token) =>
+ {
+ globalOnRejectedInvoked = true;
+ context.HttpContext.Response.StatusCode = 429;
+ return ValueTask.CompletedTask;
+ };
+
+ var middleware = new RateLimitingMiddleware(c =>
+ {
+ return Task.CompletedTask;
+ },
+ new NullLoggerFactory().CreateLogger<RateLimitingMiddleware>(),
+ options,
+ Mock.Of<IServiceProvider>());
+
+ var context = new DefaultHttpContext();
+ context.SetEndpoint(new Endpoint(c => Task.CompletedTask, new EndpointMetadataCollection(new EnableRateLimitingAttribute(defaultRateLimiterPolicy), new EnableRateLimitingAttribute(name)), "Test endpoint"));
+ await middleware.Invoke(context).DefaultTimeout();
+ Assert.False(globalOnRejectedInvoked);
+
+ Assert.Equal(StatusCodes.Status403Forbidden, context.Response.StatusCode);
}
private IOptions<RateLimiterOptions> CreateOptionsAccessor() => Options.Create(new RateLimiterOptions());
diff --git a/src/Middleware/RateLimiting/test/RateLimitingOptionsTests.cs b/src/Middleware/RateLimiting/test/RateLimitingOptionsTests.cs
index 839a9d2da0..a1647ed6cf 100644
--- a/src/Middleware/RateLimiting/test/RateLimitingOptionsTests.cs
+++ b/src/Middleware/RateLimiting/test/RateLimitingOptionsTests.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Threading.RateLimiting;
+using Castle.DynamicProxy.Generators.Emitters.SimpleAST;
using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.RateLimiting;
@@ -8,16 +10,39 @@ namespace Microsoft.AspNetCore.RateLimiting;
public class RateLimitingOptionsTests
{
[Fact]
- public void ThrowsOnNullLimiter()
+ public void AddPolicy_ThrowsOnNullPolicyName()
{
var options = new RateLimiterOptions();
- Assert.Throws<ArgumentNullException>(() => options.Limiter = null);
+ Assert.Throws<ArgumentNullException>(() => options.AddPolicy<string>(null, context => RateLimitPartition.GetNoLimiter<string>("myKey")));
}
[Fact]
- public void ThrowsOnNullOnRejected()
+ public void AddPolicy_ThrowsOnNullPartitioner()
{
var options = new RateLimiterOptions();
- Assert.Throws<ArgumentNullException>(() => options.OnRejected = null);
+ Assert.Throws<ArgumentNullException>(() => options.AddPolicy<string>("myKey", partitioner: null));
+ }
+
+ [Fact]
+ public void AddPolicy_ThrowsOnNullPolicy()
+ {
+ var options = new RateLimiterOptions();
+ Assert.Throws<ArgumentNullException>(() => options.AddPolicy<string>("myKey", policy: null));
+ }
+
+ [Fact]
+ public void AddPolicy_ThrowsOnDuplicateName()
+ {
+ var options = new RateLimiterOptions();
+ options.AddPolicy<string>("myKey", context => RateLimitPartition.GetNoLimiter<string>("myKey"));
+ Assert.Throws<ArgumentException>(() => options.AddPolicy<string>("myKey", context => RateLimitPartition.GetNoLimiter<string>("yourKey")));
+ }
+
+ [Fact]
+ public void AddPolicy_Generic_ThrowsOnDuplicateName()
+ {
+ var options = new RateLimiterOptions();
+ options.AddPolicy<string>("myKey", context => RateLimitPartition.GetNoLimiter<string>("myKey"));
+ Assert.Throws<ArgumentException>(() => options.AddPolicy<string, TestRateLimiterPolicy>("myKey"));
}
}
diff --git a/src/Middleware/RateLimiting/test/TestPartitionedRateLimiter.cs b/src/Middleware/RateLimiting/test/TestPartitionedRateLimiter.cs
index 7e3017a95b..fa19f79779 100644
--- a/src/Middleware/RateLimiting/test/TestPartitionedRateLimiter.cs
+++ b/src/Middleware/RateLimiting/test/TestPartitionedRateLimiter.cs
@@ -26,12 +26,12 @@ internal class TestPartitionedRateLimiter<TResource> : PartitionedRateLimiter<TR
limiters.Add(limiter);
}
- public override int GetAvailablePermits(TResource resourceID)
+ public override RateLimiterStatistics GetStatistics(TResource resourceID)
{
throw new NotImplementedException();
}
- protected override RateLimitLease AcquireCore(TResource resourceID, int permitCount)
+ protected override RateLimitLease AttemptAcquireCore(TResource resourceID, int permitCount)
{
if (permitCount != 1)
{
@@ -40,7 +40,7 @@ internal class TestPartitionedRateLimiter<TResource> : PartitionedRateLimiter<TR
var leases = new List<RateLimitLease>();
foreach (var limiter in limiters)
{
- var lease = limiter.Acquire();
+ var lease = limiter.AttemptAcquire();
if (lease.IsAcquired)
{
leases.Add(lease);
@@ -57,7 +57,7 @@ internal class TestPartitionedRateLimiter<TResource> : PartitionedRateLimiter<TR
return new TestRateLimitLease(true, leases);
}
- protected override async ValueTask<RateLimitLease> WaitAsyncCore(TResource resourceID, int permitCount, CancellationToken cancellationToken)
+ protected override async ValueTask<RateLimitLease> AcquireAsyncCore(TResource resourceID, int permitCount, CancellationToken cancellationToken)
{
if (permitCount != 1)
{
@@ -66,7 +66,7 @@ internal class TestPartitionedRateLimiter<TResource> : PartitionedRateLimiter<TR
var leases = new List<RateLimitLease>();
foreach (var limiter in limiters)
{
- leases.Add(await limiter.WaitAsync().ConfigureAwait(false));
+ leases.Add(await limiter.AcquireAsync());
}
foreach (var lease in leases)
{
diff --git a/src/Middleware/RateLimiting/test/TestRateLimiter.cs b/src/Middleware/RateLimiting/test/TestRateLimiter.cs
index 037b2fa525..2ec0ace3ae 100644
--- a/src/Middleware/RateLimiting/test/TestRateLimiter.cs
+++ b/src/Middleware/RateLimiting/test/TestRateLimiter.cs
@@ -4,6 +4,7 @@
using System.Threading.RateLimiting;
namespace Microsoft.AspNetCore.RateLimiting;
+
internal class TestRateLimiter : RateLimiter
{
private readonly bool _alwaysAccept;
@@ -15,17 +16,17 @@ internal class TestRateLimiter : RateLimiter
public override TimeSpan? IdleDuration => throw new NotImplementedException();
- public override int GetAvailablePermits()
+ public override RateLimiterStatistics GetStatistics()
{
throw new NotImplementedException();
}
- protected override RateLimitLease AcquireCore(int permitCount)
+ protected override RateLimitLease AttemptAcquireCore(int permitCount)
{
return new TestRateLimitLease(_alwaysAccept, null);
}
- protected override ValueTask<RateLimitLease> WaitAsyncCore(int permitCount, CancellationToken cancellationToken)
+ protected override ValueTask<RateLimitLease> AcquireAsyncCore(int permitCount, CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
return new ValueTask<RateLimitLease>(new TestRateLimitLease(_alwaysAccept, null));
diff --git a/src/Middleware/RateLimiting/test/TestRateLimiterPolicy.cs b/src/Middleware/RateLimiting/test/TestRateLimiterPolicy.cs
new file mode 100644
index 0000000000..49a7cd7845
--- /dev/null
+++ b/src/Middleware/RateLimiting/test/TestRateLimiterPolicy.cs
@@ -0,0 +1,35 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.RateLimiting;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.RateLimiting;
+internal class TestRateLimiterPolicy : IRateLimiterPolicy<string>
+{
+ private readonly string _key;
+ private readonly bool _alwaysAccept;
+ private readonly Func<OnRejectedContext, CancellationToken, ValueTask> _onRejected;
+
+ public TestRateLimiterPolicy(string key, int statusCode, bool alwaysAccept)
+ {
+ _key = key;
+ _alwaysAccept = alwaysAccept;
+
+ _onRejected = (context, token) =>
+ {
+ context.HttpContext.Response.StatusCode = statusCode;
+ return ValueTask.CompletedTask;
+ };
+ }
+
+ public Func<OnRejectedContext, CancellationToken, ValueTask> OnRejected { get => _onRejected; }
+
+ public RateLimitPartition<string> GetPartition(HttpContext httpContext)
+ {
+ return RateLimitPartition.Get<string>(_key, (key =>
+ {
+ return new TestRateLimiter(_alwaysAccept);
+ }));
+ }
+}
diff --git a/src/ProjectTemplates/test/AssemblyInfo.AssemblyFixtures.cs b/src/Middleware/RequestDecompression/perf/Microbenchmarks/AssemblyInfo.cs
index 7e531ec57e..09f49228e9 100644
--- a/src/ProjectTemplates/test/AssemblyInfo.AssemblyFixtures.cs
+++ b/src/Middleware/RequestDecompression/perf/Microbenchmarks/AssemblyInfo.cs
@@ -1,7 +1,4 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Microsoft.AspNetCore.Testing;
-using Templates.Test.Helpers;
-
-[assembly: AssemblyFixture(typeof(ProjectFactoryFixture))]
+[assembly: BenchmarkDotNet.Attributes.AspNetCoreBenchmark]
diff --git a/src/Middleware/RequestDecompression/perf/Microbenchmarks/Microsoft.AspNetCore.RequestDecompression.Microbenchmarks.csproj b/src/Middleware/RequestDecompression/perf/Microbenchmarks/Microsoft.AspNetCore.RequestDecompression.Microbenchmarks.csproj
new file mode 100644
index 0000000000..f40a518712
--- /dev/null
+++ b/src/Middleware/RequestDecompression/perf/Microbenchmarks/Microsoft.AspNetCore.RequestDecompression.Microbenchmarks.csproj
@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="BenchmarkDotNet" />
+ <Reference Include="Microsoft.AspNetCore.RequestDecompression" />
+
+ <Compile Include="$(SharedSourceRoot)BenchmarkRunner\*.cs" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Middleware/RequestDecompression/perf/Microbenchmarks/RequestDecompressionMiddlewareBenchmark.cs b/src/Middleware/RequestDecompression/perf/Microbenchmarks/RequestDecompressionMiddlewareBenchmark.cs
new file mode 100644
index 0000000000..b788389859
--- /dev/null
+++ b/src/Middleware/RequestDecompression/perf/Microbenchmarks/RequestDecompressionMiddlewareBenchmark.cs
@@ -0,0 +1,92 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using BenchmarkDotNet.Attributes;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.RequestDecompression.Benchmarks;
+
+public class RequestDecompressionMiddlewareBenchmark
+{
+ private RequestDecompressionMiddleware _middleware;
+
+ [GlobalSetup]
+ public void GlobalSetup()
+ {
+ var requestDecompressionProvider = new DefaultRequestDecompressionProvider(
+ NullLogger<DefaultRequestDecompressionProvider>.Instance,
+ Options.Create(new RequestDecompressionOptions())
+ );
+
+ _middleware = new RequestDecompressionMiddleware(
+ context => Task.CompletedTask,
+ NullLogger<RequestDecompressionMiddleware>.Instance,
+ requestDecompressionProvider
+ );
+ }
+
+ [Params(true, false)]
+ public bool HasRequestSizeLimitMetadata { get; set; }
+
+ [Benchmark]
+ public async Task HandleRequest_Compressed()
+ {
+ var context = CreateHttpContext(HasRequestSizeLimitMetadata);
+
+ context.Request.Headers.ContentEncoding = "gzip";
+
+ await _middleware.Invoke(context);
+ }
+
+ [Benchmark]
+ public async Task HandleRequest_Uncompressed()
+ {
+ var context = CreateHttpContext(HasRequestSizeLimitMetadata);
+
+ await _middleware.Invoke(context);
+ }
+
+ private static DefaultHttpContext CreateHttpContext(bool hasRequestSizeLimitMetadata)
+ {
+ var features = new FeatureCollection();
+ features.Set<IHttpRequestFeature>(new HttpRequestFeature());
+ features.Set<IHttpResponseFeature>(new HttpResponseFeature());
+ features.Set<IHttpMaxRequestBodySizeFeature>(new MaxRequestBodySizeFeature());
+ features.Set<IEndpointFeature>(new EndpointFeature(hasRequestSizeLimitMetadata));
+ var context = new DefaultHttpContext(features);
+ return context;
+ }
+
+ private sealed class MaxRequestBodySizeFeature : IHttpMaxRequestBodySizeFeature
+ {
+ public bool IsReadOnly => false;
+
+ public long? MaxRequestBodySize { get; set; } = 30_000_000;
+ }
+
+ private sealed class EndpointFeature : IEndpointFeature
+ {
+ public Endpoint Endpoint { get; set; }
+
+ public EndpointFeature(bool hasRequestSizeLimitMetadata)
+ {
+ var metadataCollection = hasRequestSizeLimitMetadata
+ ? new EndpointMetadataCollection(new SizeLimitMetadata())
+ : new EndpointMetadataCollection();
+
+ Endpoint = new Endpoint(
+ requestDelegate: null,
+ metadata: metadataCollection,
+ displayName: null);
+ }
+ }
+
+ private sealed class SizeLimitMetadata : IRequestSizeLimitMetadata
+ {
+ public long? MaxRequestBodySize { get; set; } = 50_000_000;
+ }
+}
diff --git a/src/Middleware/RequestDecompression/sample/CustomDecompressionProvider.cs b/src/Middleware/RequestDecompression/sample/CustomDecompressionProvider.cs
new file mode 100644
index 0000000000..9bfa11acf2
--- /dev/null
+++ b/src/Middleware/RequestDecompression/sample/CustomDecompressionProvider.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.RequestDecompression;
+
+namespace RequestDecompressionSample;
+
+public class CustomDecompressionProvider : IDecompressionProvider
+{
+ public Stream GetDecompressionStream(Stream stream)
+ {
+ // Create a custom decompression stream wrapper here.
+ return stream;
+ }
+}
diff --git a/src/Middleware/RequestDecompression/sample/Properties/launchsettings.json b/src/Middleware/RequestDecompression/sample/Properties/launchsettings.json
new file mode 100644
index 0000000000..26a370a87f
--- /dev/null
+++ b/src/Middleware/RequestDecompression/sample/Properties/launchsettings.json
@@ -0,0 +1,27 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:6164/",
+ "sslPort": 0
+ }
+ },
+ "profiles": {
+ "RequestDecompressionSample": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "launchUrl": "http://localhost:5000/",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+ }
diff --git a/src/Middleware/RequestDecompression/sample/RequestDecompressionSample.csproj b/src/Middleware/RequestDecompression/sample/RequestDecompressionSample.csproj
new file mode 100644
index 0000000000..fec9ada308
--- /dev/null
+++ b/src/Middleware/RequestDecompression/sample/RequestDecompressionSample.csproj
@@ -0,0 +1,13 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.RequestDecompression" />
+ <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
+ <Reference Include="Microsoft.Extensions.Logging.Console" />
+ </ItemGroup>
+
+</Project> \ No newline at end of file
diff --git a/src/Middleware/RequestDecompression/sample/Startup.cs b/src/Middleware/RequestDecompression/sample/Startup.cs
new file mode 100644
index 0000000000..55d99ab8ec
--- /dev/null
+++ b/src/Middleware/RequestDecompression/sample/Startup.cs
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace RequestDecompressionSample;
+
+public class Startup
+{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddRequestDecompression(options =>
+ {
+ options.DecompressionProviders.Add("custom", new CustomDecompressionProvider());
+ });
+ }
+
+ public void Configure(IApplicationBuilder app)
+ {
+ app.UseRequestDecompression();
+ app.Map("/test", testApp =>
+ {
+ testApp.Run(async context =>
+ {
+ using var reader = new StreamReader(context.Request.Body);
+ var decompressedBody = await reader.ReadToEndAsync(context.RequestAborted);
+
+ await context.Response.WriteAsync(decompressedBody, context.RequestAborted);
+ });
+ });
+ }
+
+ public static Task Main(string[] args)
+ {
+ var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseKestrel()
+ .ConfigureLogging(factory =>
+ {
+ factory.AddConsole()
+ .SetMinimumLevel(LogLevel.Debug);
+ })
+ .UseStartup<Startup>();
+ }).Build();
+
+ return host.RunAsync();
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/BrotliDecompressionProvider.cs b/src/Middleware/RequestDecompression/src/BrotliDecompressionProvider.cs
new file mode 100644
index 0000000000..7b3b28837f
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/BrotliDecompressionProvider.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IO.Compression;
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// Brotli decompression provider.
+/// </summary>
+internal sealed class BrotliDecompressionProvider : IDecompressionProvider
+{
+ /// <inheritdoc />
+ public Stream GetDecompressionStream(Stream stream)
+ {
+ return new BrotliStream(stream, CompressionMode.Decompress, leaveOpen: true);
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/DefaultRequestDecompressionProvider.cs b/src/Middleware/RequestDecompression/src/DefaultRequestDecompressionProvider.cs
new file mode 100644
index 0000000000..3178fcc5d2
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/DefaultRequestDecompressionProvider.cs
@@ -0,0 +1,90 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Primitives;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <inheritdoc />
+internal sealed partial class DefaultRequestDecompressionProvider : IRequestDecompressionProvider
+{
+ private readonly ILogger _logger;
+ private readonly IDictionary<string, IDecompressionProvider> _providers;
+
+ public DefaultRequestDecompressionProvider(
+ ILogger<DefaultRequestDecompressionProvider> logger,
+ IOptions<RequestDecompressionOptions> options)
+ {
+ if (logger is null)
+ {
+ throw new ArgumentNullException(nameof(logger));
+ }
+
+ if (options is null)
+ {
+ throw new ArgumentNullException(nameof(options));
+ }
+
+ _logger = logger;
+ _providers = options.Value.DecompressionProviders;
+ }
+
+ /// <inheritdoc />
+ public Stream? GetDecompressionStream(HttpContext context)
+ {
+ var encodings = context.Request.Headers.ContentEncoding;
+
+ if (StringValues.IsNullOrEmpty(encodings))
+ {
+ Log.NoContentEncoding(_logger);
+ return null;
+ }
+
+ if (encodings.Count > 1)
+ {
+ Log.MultipleContentEncodingsSpecified(_logger);
+ return null;
+ }
+
+ string encodingName = encodings!;
+
+ if (_providers.TryGetValue(encodingName, out var matchingProvider))
+ {
+ Log.DecompressingWith(_logger, encodingName);
+
+ context.Request.Headers.Remove(HeaderNames.ContentEncoding);
+
+ return matchingProvider.GetDecompressionStream(context.Request.Body);
+ }
+
+ Log.NoDecompressionProvider(_logger);
+ return null;
+ }
+
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Trace, "The Content-Encoding header is empty or not specified. Skipping request decompression.", EventName = "NoContentEncoding")]
+ public static partial void NoContentEncoding(ILogger logger);
+
+ [LoggerMessage(2, LogLevel.Debug, "Request decompression is not supported for multiple Content-Encodings.", EventName = "MultipleContentEncodingsSpecified")]
+ public static partial void MultipleContentEncodingsSpecified(ILogger logger);
+
+ [LoggerMessage(3, LogLevel.Debug, "No matching request decompression provider found.", EventName = "NoDecompressionProvider")]
+ public static partial void NoDecompressionProvider(ILogger logger);
+
+ public static void DecompressingWith(ILogger logger, string contentEncoding)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ DecompressingWithCore(logger, contentEncoding.ToLowerInvariant());
+ }
+ }
+
+ [LoggerMessage(4, LogLevel.Debug, "The request will be decompressed with '{ContentEncoding}'.", EventName = "DecompressingWith", SkipEnabledCheck = true)]
+ private static partial void DecompressingWithCore(ILogger logger, string contentEncoding);
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/DeflateDecompressionProvider.cs b/src/Middleware/RequestDecompression/src/DeflateDecompressionProvider.cs
new file mode 100644
index 0000000000..6291f15b2d
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/DeflateDecompressionProvider.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IO.Compression;
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// DEFLATE decompression provider.
+/// </summary>
+internal sealed class DeflateDecompressionProvider : IDecompressionProvider
+{
+ /// <inheritdoc />
+ public Stream GetDecompressionStream(Stream stream)
+ {
+ return new DeflateStream(stream, CompressionMode.Decompress, leaveOpen: true);
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/GZipDecompressionProvider.cs b/src/Middleware/RequestDecompression/src/GZipDecompressionProvider.cs
new file mode 100644
index 0000000000..74ac6835f8
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/GZipDecompressionProvider.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IO.Compression;
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// GZip decompression provider.
+/// </summary>
+internal sealed class GZipDecompressionProvider : IDecompressionProvider
+{
+ /// <inheritdoc />
+ public Stream GetDecompressionStream(Stream stream)
+ {
+ return new GZipStream(stream, CompressionMode.Decompress, leaveOpen: true);
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/IDecompressionProvider.cs b/src/Middleware/RequestDecompression/src/IDecompressionProvider.cs
new file mode 100644
index 0000000000..f59be0fe87
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/IDecompressionProvider.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// Provides a specific decompression implementation to decompress HTTP request bodies.
+/// </summary>
+public interface IDecompressionProvider
+{
+ /// <summary>
+ /// Creates a new decompression stream.
+ /// </summary>
+ /// <param name="stream">The compressed request body stream.</param>
+ /// <returns>The decompression stream.</returns>
+ Stream GetDecompressionStream(Stream stream);
+}
diff --git a/src/Middleware/RequestDecompression/src/IRequestDecompressionProvider.cs b/src/Middleware/RequestDecompression/src/IRequestDecompressionProvider.cs
new file mode 100644
index 0000000000..6387b91a30
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/IRequestDecompressionProvider.cs
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// Used to examine requests to see if decompression should be used.
+/// </summary>
+public interface IRequestDecompressionProvider
+{
+ /// <summary>
+ /// Examines the request and selects an acceptable decompression provider, if any.
+ /// </summary>
+ /// <param name="context">The <see cref="HttpContext"/>.</param>
+ /// <returns>The decompression stream when the provider is capable of decompressing the HTTP request body, otherwise <see langword="null" />.</returns>
+ Stream? GetDecompressionStream(HttpContext context);
+}
diff --git a/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj b/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj
new file mode 100644
index 0000000000..be80f8b518
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/Microsoft.AspNetCore.RequestDecompression.csproj
@@ -0,0 +1,25 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <Description>ASP.NET Core middleware for HTTP Request decompression.</Description>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <IsAspNetCoreApp>true</IsAspNetCoreApp>
+ <GenerateDocumentationFile>true</GenerateDocumentationFile>
+ <PackageTags>aspnetcore</PackageTags>
+ <IsPackable>false</IsPackable>
+ <IsTrimmable>true</IsTrimmable>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Http" />
+ <Reference Include="Microsoft.AspNetCore.Http.Extensions" />
+ <Reference Include="Microsoft.Extensions.Logging.Abstractions" />
+ <Reference Include="Microsoft.Extensions.Options" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.RequestDecompression.Tests" />
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.RequestDecompression.Microbenchmarks" />
+ </ItemGroup>
+
+</Project> \ No newline at end of file
diff --git a/src/Middleware/RequestDecompression/src/PublicAPI.Shipped.txt b/src/Middleware/RequestDecompression/src/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..ab058de62d
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/PublicAPI.Shipped.txt
@@ -0,0 +1 @@
+#nullable enable
diff --git a/src/Middleware/RequestDecompression/src/PublicAPI.Unshipped.txt b/src/Middleware/RequestDecompression/src/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..14f9b5dc49
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/PublicAPI.Unshipped.txt
@@ -0,0 +1,13 @@
+#nullable enable
+Microsoft.AspNetCore.Builder.RequestDecompressionBuilderExtensions
+Microsoft.AspNetCore.RequestDecompression.IDecompressionProvider
+Microsoft.AspNetCore.RequestDecompression.IDecompressionProvider.GetDecompressionStream(System.IO.Stream! stream) -> System.IO.Stream!
+Microsoft.AspNetCore.RequestDecompression.IRequestDecompressionProvider
+Microsoft.AspNetCore.RequestDecompression.IRequestDecompressionProvider.GetDecompressionStream(Microsoft.AspNetCore.Http.HttpContext! context) -> System.IO.Stream?
+Microsoft.AspNetCore.RequestDecompression.RequestDecompressionOptions
+Microsoft.AspNetCore.RequestDecompression.RequestDecompressionOptions.DecompressionProviders.get -> System.Collections.Generic.IDictionary<string!, Microsoft.AspNetCore.RequestDecompression.IDecompressionProvider!>!
+Microsoft.AspNetCore.RequestDecompression.RequestDecompressionOptions.RequestDecompressionOptions() -> void
+Microsoft.Extensions.DependencyInjection.RequestDecompressionServiceExtensions
+static Microsoft.AspNetCore.Builder.RequestDecompressionBuilderExtensions.UseRequestDecompression(this Microsoft.AspNetCore.Builder.IApplicationBuilder! builder) -> Microsoft.AspNetCore.Builder.IApplicationBuilder!
+static Microsoft.Extensions.DependencyInjection.RequestDecompressionServiceExtensions.AddRequestDecompression(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.RequestDecompressionServiceExtensions.AddRequestDecompression(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.RequestDecompression.RequestDecompressionOptions!>! configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
diff --git a/src/Middleware/RequestDecompression/src/RequestDecompressionBuilderExtensions.cs b/src/Middleware/RequestDecompression/src/RequestDecompressionBuilderExtensions.cs
new file mode 100644
index 0000000000..c67d2bdfd1
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/RequestDecompressionBuilderExtensions.cs
@@ -0,0 +1,26 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.RequestDecompression;
+
+namespace Microsoft.AspNetCore.Builder;
+
+/// <summary>
+/// Extension methods for the HTTP request decompression middleware.
+/// </summary>
+public static class RequestDecompressionBuilderExtensions
+{
+ /// <summary>
+ /// Adds middleware for dynamically decompressing HTTP request bodies.
+ /// </summary>
+ /// <param name="builder">The <see cref="IApplicationBuilder"/> instance this method extends.</param>
+ public static IApplicationBuilder UseRequestDecompression(this IApplicationBuilder builder)
+ {
+ if (builder is null)
+ {
+ throw new ArgumentNullException(nameof(builder));
+ }
+
+ return builder.UseMiddleware<RequestDecompressionMiddleware>();
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/RequestDecompressionMiddleware.cs b/src/Middleware/RequestDecompression/src/RequestDecompressionMiddleware.cs
new file mode 100644
index 0000000000..253b1d2388
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/RequestDecompressionMiddleware.cs
@@ -0,0 +1,141 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// Enables HTTP request decompression.
+/// </summary>
+internal sealed partial class RequestDecompressionMiddleware
+{
+ private readonly RequestDelegate _next;
+ private readonly ILogger<RequestDecompressionMiddleware> _logger;
+ private readonly IRequestDecompressionProvider _provider;
+
+ /// <summary>
+ /// Initialize the request decompression middleware.
+ /// </summary>
+ /// <param name="next">The delegate representing the remaining middleware in the request pipeline.</param>
+ /// <param name="logger">The logger.</param>
+ /// <param name="provider">The <see cref="IRequestDecompressionProvider"/>.</param>
+ public RequestDecompressionMiddleware(
+ RequestDelegate next,
+ ILogger<RequestDecompressionMiddleware> logger,
+ IRequestDecompressionProvider provider)
+ {
+ if (next is null)
+ {
+ throw new ArgumentNullException(nameof(next));
+ }
+
+ if (logger is null)
+ {
+ throw new ArgumentNullException(nameof(logger));
+ }
+
+ if (provider is null)
+ {
+ throw new ArgumentNullException(nameof(provider));
+ }
+
+ _next = next;
+ _logger = logger;
+ _provider = provider;
+ }
+
+ /// <summary>
+ /// Invoke the middleware.
+ /// </summary>
+ /// <param name="context">The <see cref="HttpContext"/>.</param>
+ /// <returns>A task that represents the execution of this middleware.</returns>
+ public Task Invoke(HttpContext context)
+ {
+ SetMaxRequestBodySize(context);
+
+ var decompressionStream = _provider.GetDecompressionStream(context);
+ if (decompressionStream is null)
+ {
+ return _next(context);
+ }
+
+ return InvokeCore(context, decompressionStream);
+ }
+
+ private async Task InvokeCore(HttpContext context, Stream decompressionStream)
+ {
+ var request = context.Request.Body;
+ try
+ {
+ var sizeLimit =
+ context.GetEndpoint()?.Metadata?.GetMetadata<IRequestSizeLimitMetadata>()?.MaxRequestBodySize
+ ?? context.Features.Get<IHttpMaxRequestBodySizeFeature>()?.MaxRequestBodySize;
+
+ context.Request.Body = new SizeLimitedStream(decompressionStream, sizeLimit);
+ await _next(context);
+ }
+ finally
+ {
+ context.Request.Body = request;
+ await decompressionStream.DisposeAsync();
+ }
+ }
+
+ private void SetMaxRequestBodySize(HttpContext context)
+ {
+ var sizeLimitMetadata = context.GetEndpoint()?.Metadata?.GetMetadata<IRequestSizeLimitMetadata>();
+ if (sizeLimitMetadata == null)
+ {
+ Log.MetadataNotFound(_logger);
+ return;
+ }
+
+ var maxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
+ if (maxRequestBodySizeFeature == null)
+ {
+ Log.FeatureNotFound(_logger);
+ }
+ else if (maxRequestBodySizeFeature.IsReadOnly)
+ {
+ Log.FeatureIsReadOnly(_logger);
+ }
+ else
+ {
+ var maxRequestBodySize = sizeLimitMetadata.MaxRequestBodySize;
+ maxRequestBodySizeFeature.MaxRequestBodySize = maxRequestBodySize;
+
+ if (maxRequestBodySize.HasValue)
+ {
+ Log.MaxRequestBodySizeSet(_logger,
+ maxRequestBodySize.Value.ToString(CultureInfo.InvariantCulture));
+ }
+ else
+ {
+ Log.MaxRequestBodySizeDisabled(_logger);
+ }
+ }
+ }
+
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Debug, $"The endpoint does not specify the {nameof(IRequestSizeLimitMetadata)}.", EventName = "MetadataNotFound")]
+ public static partial void MetadataNotFound(ILogger logger);
+
+ [LoggerMessage(2, LogLevel.Warning, $"A request body size limit could not be applied. This server does not support the {nameof(IHttpMaxRequestBodySizeFeature)}.", EventName = "FeatureNotFound")]
+ public static partial void FeatureNotFound(ILogger logger);
+
+ [LoggerMessage(3, LogLevel.Warning, $"A request body size limit could not be applied. The {nameof(IHttpMaxRequestBodySizeFeature)} for the server is read-only.", EventName = "FeatureIsReadOnly")]
+ public static partial void FeatureIsReadOnly(ILogger logger);
+
+ [LoggerMessage(4, LogLevel.Debug, "The maximum request body size has been set to {RequestSize}.", EventName = "MaxRequestBodySizeSet")]
+ public static partial void MaxRequestBodySizeSet(ILogger logger, string requestSize);
+
+ [LoggerMessage(5, LogLevel.Debug, "The maximum request body size as been disabled.", EventName = "MaxRequestBodySizeDisabled")]
+ public static partial void MaxRequestBodySizeDisabled(ILogger logger);
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/RequestDecompressionOptions.cs b/src/Middleware/RequestDecompression/src/RequestDecompressionOptions.cs
new file mode 100644
index 0000000000..b6821e9046
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/RequestDecompressionOptions.cs
@@ -0,0 +1,20 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+/// <summary>
+/// Options for the HTTP request decompression middleware.
+/// </summary>
+public sealed class RequestDecompressionOptions
+{
+ /// <summary>
+ /// The <see cref="IDecompressionProvider"/> types to use for request decompression.
+ /// </summary>
+ public IDictionary<string, IDecompressionProvider> DecompressionProviders { get; } = new Dictionary<string, IDecompressionProvider>(StringComparer.OrdinalIgnoreCase)
+ {
+ ["br"] = new BrotliDecompressionProvider(),
+ ["deflate"] = new DeflateDecompressionProvider(),
+ ["gzip"] = new GZipDecompressionProvider()
+ };
+}
diff --git a/src/Middleware/RequestDecompression/src/RequestDecompressionServiceExtensions.cs b/src/Middleware/RequestDecompression/src/RequestDecompressionServiceExtensions.cs
new file mode 100644
index 0000000000..7996ef88a9
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/RequestDecompressionServiceExtensions.cs
@@ -0,0 +1,52 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.RequestDecompression;
+using Microsoft.Extensions.DependencyInjection.Extensions;
+
+namespace Microsoft.Extensions.DependencyInjection;
+
+/// <summary>
+/// Extension methods for the HTTP request decompression middleware.
+/// </summary>
+public static class RequestDecompressionServiceExtensions
+{
+ /// <summary>
+ /// Add request decompression services.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
+ /// <returns>The <see cref="IServiceCollection"/>.</returns>
+ public static IServiceCollection AddRequestDecompression(this IServiceCollection services)
+ {
+ if (services is null)
+ {
+ throw new ArgumentNullException(nameof(services));
+ }
+
+ services.TryAddSingleton<IRequestDecompressionProvider, DefaultRequestDecompressionProvider>();
+ return services;
+ }
+
+ /// <summary>
+ /// Add request decompression services and configure the related options.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection"/> for adding services.</param>
+ /// <param name="configureOptions">A delegate to configure the <see cref="RequestDecompressionOptions"/>.</param>
+ /// <returns>The <see cref="IServiceCollection"/>.</returns>
+ public static IServiceCollection AddRequestDecompression(this IServiceCollection services, Action<RequestDecompressionOptions> configureOptions)
+ {
+ if (services is null)
+ {
+ throw new ArgumentNullException(nameof(services));
+ }
+
+ if (configureOptions is null)
+ {
+ throw new ArgumentNullException(nameof(configureOptions));
+ }
+
+ services.Configure(configureOptions);
+ services.TryAddSingleton<IRequestDecompressionProvider, DefaultRequestDecompressionProvider>();
+ return services;
+ }
+}
diff --git a/src/Middleware/RequestDecompression/src/SizeLimitedStream.cs b/src/Middleware/RequestDecompression/src/SizeLimitedStream.cs
new file mode 100644
index 0000000000..2c53bd7307
--- /dev/null
+++ b/src/Middleware/RequestDecompression/src/SizeLimitedStream.cs
@@ -0,0 +1,94 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RequestDecompression;
+
+internal sealed class SizeLimitedStream : Stream
+{
+ private readonly Stream _innerStream;
+ private readonly long? _sizeLimit;
+
+ private long _totalBytesRead;
+
+ public SizeLimitedStream(Stream innerStream, long? sizeLimit)
+ {
+ if (innerStream is null)
+ {
+ throw new ArgumentNullException(nameof(innerStream));
+ }
+
+ _innerStream = innerStream;
+ _sizeLimit = sizeLimit;
+ }
+
+ public override bool CanRead => _innerStream.CanRead;
+
+ public override bool CanSeek => _innerStream.CanSeek;
+
+ public override bool CanWrite => _innerStream.CanWrite;
+
+ public override long Length => _innerStream.Length;
+
+ public override long Position
+ {
+ get
+ {
+ return _innerStream.Position;
+ }
+ set
+ {
+ _innerStream.Position = value;
+ }
+ }
+
+ public override void Flush()
+ {
+ _innerStream.Flush();
+ }
+
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ var bytesRead = _innerStream.Read(buffer, offset, count);
+
+ _totalBytesRead += bytesRead;
+ if (_totalBytesRead > _sizeLimit)
+ {
+ throw new InvalidOperationException("The maximum number of bytes have been read.");
+ }
+
+ return bytesRead;
+ }
+
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ return _innerStream.Seek(offset, origin);
+ }
+
+ public override void SetLength(long value)
+ {
+ _innerStream.SetLength(value);
+ }
+
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ _innerStream.Write(buffer, offset, count);
+ }
+
+ public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ return ReadAsync(buffer.AsMemory(offset, count), cancellationToken).AsTask();
+ }
+
+ public override async ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default)
+ {
+ var bytesRead = await _innerStream.ReadAsync(buffer, cancellationToken);
+
+ _totalBytesRead += bytesRead;
+ if (_totalBytesRead > _sizeLimit)
+ {
+ throw new InvalidOperationException("The maximum number of bytes have been read.");
+ }
+
+ return bytesRead;
+ }
+}
diff --git a/src/Middleware/RequestDecompression/test/DefaultRequestDecompressionProviderTests.cs b/src/Middleware/RequestDecompression/test/DefaultRequestDecompressionProviderTests.cs
new file mode 100644
index 0000000000..1f39cfef38
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/DefaultRequestDecompressionProviderTests.cs
@@ -0,0 +1,176 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging.Testing;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Net.Http.Headers;
+using Microsoft.Extensions.Primitives;
+using System.IO.Compression;
+
+namespace Microsoft.AspNetCore.RequestDecompression.Tests;
+
+public class DefaultRequestDecompressionProviderTests
+{
+ [Theory]
+ [InlineData("br", typeof(BrotliStream))]
+ [InlineData("BR", typeof(BrotliStream))]
+ [InlineData("deflate", typeof(DeflateStream))]
+ [InlineData("DEFLATE", typeof(DeflateStream))]
+ [InlineData("gzip", typeof(GZipStream))]
+ [InlineData("GZIP", typeof(GZipStream))]
+ public void GetDecompressionProvider_SupportedContentEncoding_ReturnsProvider(
+ string contentEncoding,
+ Type expectedProviderType)
+ {
+ // Arrange
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Headers.Add(HeaderNames.ContentEncoding, contentEncoding);
+
+ var (logger, sink) = GetTestLogger();
+ var options = Options.Create(new RequestDecompressionOptions());
+
+ var provider = new DefaultRequestDecompressionProvider(logger, options);
+
+ // Act
+ var matchingProvider = provider.GetDecompressionStream(httpContext);
+
+ // Assert
+ Assert.NotNull(matchingProvider);
+ Assert.IsType(expectedProviderType, matchingProvider);
+
+ var logMessages = sink.Writes.ToList();
+ AssertLog(logMessages.Single(), LogLevel.Debug,
+ $"The request will be decompressed with '{contentEncoding.ToLowerInvariant()}'.");
+
+ var contentEncodingHeader = httpContext.Request.Headers.ContentEncoding;
+ Assert.Empty(contentEncodingHeader);
+ }
+
+ [Fact]
+ public void GetDecompressionProvider_NoContentEncoding_ReturnsNull()
+ {
+ // Arrange
+ var httpContext = new DefaultHttpContext();
+
+ var (logger, sink) = GetTestLogger();
+ var options = Options.Create(new RequestDecompressionOptions());
+
+ var provider = new DefaultRequestDecompressionProvider(logger, options);
+
+ // Act
+ var matchingProvider = provider.GetDecompressionStream(httpContext);
+
+ // Assert
+ Assert.Null(matchingProvider);
+
+ var logMessages = sink.Writes.ToList();
+ AssertLog(logMessages.Single(), LogLevel.Trace,
+ "The Content-Encoding header is empty or not specified. Skipping request decompression.");
+
+ var contentEncodingHeader = httpContext.Request.Headers.ContentEncoding;
+ Assert.Empty(contentEncodingHeader);
+ }
+
+ [Fact]
+ public void GetDecompressionProvider_UnsupportedContentEncoding_ReturnsNull()
+ {
+ // Arrange
+ var contentEncoding = "custom";
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Headers.Add(HeaderNames.ContentEncoding, contentEncoding);
+
+ var (logger, sink) = GetTestLogger();
+ var options = Options.Create(new RequestDecompressionOptions());
+
+ var provider = new DefaultRequestDecompressionProvider(logger, options);
+
+ // Act
+ var matchingProvider = provider.GetDecompressionStream(httpContext);
+
+ // Assert
+ Assert.Null(matchingProvider);
+
+ var logMessages = sink.Writes.ToList();
+ AssertLog(logMessages.Single(),
+ LogLevel.Debug, "No matching request decompression provider found.");
+
+ var contentEncodingHeader = httpContext.Request.Headers.ContentEncoding;
+ Assert.Equal(contentEncoding, contentEncodingHeader);
+ }
+
+ [Fact]
+ public void GetDecompressionProvider_MultipleContentEncodings_ReturnsNull()
+ {
+ // Arrange
+ var contentEncodings = new StringValues(new[] { "br", "gzip" });
+
+ var httpContext = new DefaultHttpContext();
+ httpContext.Request.Headers.Add(HeaderNames.ContentEncoding, contentEncodings);
+
+ var (logger, sink) = GetTestLogger();
+ var options = Options.Create(new RequestDecompressionOptions());
+
+ var provider = new DefaultRequestDecompressionProvider(logger, options);
+
+ // Act
+ var matchingProvider = provider.GetDecompressionStream(httpContext);
+
+ // Assert
+ Assert.Null(matchingProvider);
+
+ var logMessages = sink.Writes.ToList();
+ AssertLog(logMessages.Single(), LogLevel.Debug,
+ "Request decompression is not supported for multiple Content-Encodings.");
+
+ var contentEncodingHeader = httpContext.Request.Headers.ContentEncoding;
+ Assert.Equal(contentEncodings, contentEncodingHeader);
+ }
+
+ [Fact]
+ public void Ctor_NullLogger_Throws()
+ {
+ // Arrange
+ var (logger, _) = GetTestLogger();
+ IOptions<RequestDecompressionOptions> options = null;
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ new DefaultRequestDecompressionProvider(logger, options);
+ });
+ }
+
+ [Fact]
+ public void Ctor_NullOptions_Throws()
+ {
+ // Arrange
+ ILogger<DefaultRequestDecompressionProvider> logger = null;
+ var options = Options.Create(new RequestDecompressionOptions());
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ new DefaultRequestDecompressionProvider(logger, options);
+ });
+ }
+
+ private static (ILogger<DefaultRequestDecompressionProvider>, TestSink) GetTestLogger()
+ {
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+ var logger = loggerFactory.CreateLogger<DefaultRequestDecompressionProvider>();
+
+ return (logger, sink);
+ }
+
+ private static void AssertLog(WriteContext log, LogLevel level, string message)
+ {
+ Assert.Equal(level, log.LogLevel);
+ Assert.Equal(message, log.State.ToString());
+ }
+}
diff --git a/src/Middleware/RequestDecompression/test/Microsoft.AspNetCore.RequestDecompression.Tests.csproj b/src/Middleware/RequestDecompression/test/Microsoft.AspNetCore.RequestDecompression.Tests.csproj
new file mode 100644
index 0000000000..21eb7830cc
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/Microsoft.AspNetCore.RequestDecompression.Tests.csproj
@@ -0,0 +1,14 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore.Http" />
+ <Reference Include="Microsoft.AspNetCore.RequestDecompression" />
+ <Reference Include="Microsoft.AspNetCore.TestHost" />
+ <Reference Include="Microsoft.Net.Http.Headers" />
+ </ItemGroup>
+
+</Project> \ No newline at end of file
diff --git a/src/Middleware/RequestDecompression/test/RequestDecompressionBuilderExtensionsTests.cs b/src/Middleware/RequestDecompression/test/RequestDecompressionBuilderExtensionsTests.cs
new file mode 100644
index 0000000000..b30aaf0122
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/RequestDecompressionBuilderExtensionsTests.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+
+namespace Microsoft.AspNetCore.RequestDecompression.Tests;
+
+public class RequestDecompressionBuilderExtensionsTests
+{
+ [Fact]
+ public void UseRequestDecompression_NullApplicationBuilder_Throws()
+ {
+ // Arrange
+ IApplicationBuilder builder = null;
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ builder.UseRequestDecompression();
+ });
+ }
+}
diff --git a/src/Middleware/RequestDecompression/test/RequestDecompressionMiddlewareTests.cs b/src/Middleware/RequestDecompression/test/RequestDecompressionMiddlewareTests.cs
new file mode 100644
index 0000000000..e28e0b6c6b
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/RequestDecompressionMiddlewareTests.cs
@@ -0,0 +1,945 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.IO.Compression;
+using System.Net.Http;
+using System.Text;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Testing;
+using Microsoft.Extensions.Primitives;
+
+namespace Microsoft.AspNetCore.RequestDecompression.Tests;
+
+public class RequestDecompressionMiddlewareTests
+{
+ private const string TestRequestBodyData = "Test Request Body Data";
+
+ private static byte[] GetUncompressedContent(string input = TestRequestBodyData)
+ {
+ return Encoding.UTF8.GetBytes(input);
+ }
+
+ private static async Task<byte[]> GetCompressedContent(
+ Func<Stream, Stream> compressorDelegate,
+ byte[] uncompressedBytes)
+ {
+ await using var uncompressedStream = new MemoryStream(uncompressedBytes);
+
+ await using var compressedStream = new MemoryStream();
+ await using (var compressor = compressorDelegate(compressedStream))
+ {
+ await uncompressedStream.CopyToAsync(compressor);
+ }
+
+ return compressedStream.ToArray();
+ }
+
+ private static async Task<byte[]> GetBrotliCompressedContent(byte[] uncompressedBytes)
+ {
+ static Stream compressorDelegate(Stream compressedContent) =>
+ new BrotliStream(compressedContent, CompressionMode.Compress);
+
+ return await GetCompressedContent(compressorDelegate, uncompressedBytes);
+ }
+
+ private static async Task<byte[]> GetDeflateCompressedContent(byte[] uncompressedBytes)
+ {
+ static Stream compressorDelegate(Stream compressedContent) =>
+ new DeflateStream(compressedContent, CompressionMode.Compress);
+
+ return await GetCompressedContent(compressorDelegate, uncompressedBytes);
+ }
+
+ private static async Task<byte[]> GetGZipCompressedContent(byte[] uncompressedBytes)
+ {
+ static Stream compressorDelegate(Stream compressedContent) =>
+ new GZipStream(compressedContent, CompressionMode.Compress);
+
+ return await GetCompressedContent(compressorDelegate, uncompressedBytes);
+ }
+
+ [Fact]
+ public async Task Request_ContentEncodingBrotli_Decompressed()
+ {
+ // Arrange
+ var contentEncoding = "br";
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetBrotliCompressedContent(uncompressedBytes);
+
+ // Act
+ var (logMessages, decompressedBytes) = await InvokeMiddleware(compressedBytes, new[] { contentEncoding });
+
+ // Assert
+ AssertDecompressedWithLog(logMessages, contentEncoding.ToLowerInvariant());
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+
+ [Fact]
+ public async Task Request_ContentEncodingDeflate_Decompressed()
+ {
+ // Arrange
+ var contentEncoding = "deflate";
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetDeflateCompressedContent(uncompressedBytes);
+
+ // Act
+ var (logMessages, decompressedBytes) = await InvokeMiddleware(compressedBytes, new[] { contentEncoding });
+
+ // Assert
+ AssertDecompressedWithLog(logMessages, contentEncoding.ToLowerInvariant());
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+
+ [Fact]
+ public async Task Request_ContentEncodingGzip_Decompressed()
+ {
+ // Arrange
+ var contentEncoding = "gzip";
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+
+ // Act
+ var (logMessages, decompressedBytes) = await InvokeMiddleware(compressedBytes, new[] { contentEncoding });
+
+ // Assert
+ AssertDecompressedWithLog(logMessages, contentEncoding.ToLowerInvariant());
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+
+ [Fact]
+ public async Task Request_NoContentEncoding_NotDecompressed()
+ {
+ // Arrange
+ var uncompressedBytes = GetUncompressedContent();
+
+ // Act
+ var (logMessages, outputBytes) = await InvokeMiddleware(uncompressedBytes);
+
+ // Assert
+ var logMessage = Assert.Single(logMessages);
+ AssertLog(logMessage, LogLevel.Trace, "The Content-Encoding header is empty or not specified. Skipping request decompression.");
+ Assert.Equal(uncompressedBytes, outputBytes);
+ }
+
+ [Fact]
+ public async Task Request_UnsupportedContentEncoding_NotDecompressed()
+ {
+ // Arrange
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+ var contentEncoding = "custom";
+
+ // Act
+ var (logMessages, outputBytes) = await InvokeMiddleware(compressedBytes, new[] { contentEncoding });
+
+ // Assert
+ AssertNoDecompressionProviderLog(logMessages);
+ Assert.Equal(compressedBytes, outputBytes);
+ }
+
+ [Fact]
+ public async Task Request_MultipleContentEncodings_NotDecompressed()
+ {
+ // Arrange
+ var uncompressedBytes = GetUncompressedContent();
+ var inputBytes = await GetGZipCompressedContent(uncompressedBytes);
+ var contentEncodings = new[] { "br", "gzip" };
+
+ // Act
+ var (logMessages, outputBytes) = await InvokeMiddleware(inputBytes, contentEncodings);
+
+ // Assert
+ var logMessage = Assert.Single(logMessages);
+ AssertLog(logMessage, LogLevel.Debug, "Request decompression is not supported for multiple Content-Encodings.");
+ Assert.Equal(inputBytes, outputBytes);
+ }
+
+ [Fact]
+ public async Task Request_MiddlewareAddedMultipleTimes_OnlyDecompressedOnce()
+ {
+ // Arrange
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+ var contentEncoding = "gzip";
+
+ var decompressedBytes = Array.Empty<byte>();
+
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddRequestDecompression();
+ services.AddSingleton<ILoggerFactory>(loggerFactory);
+ })
+ .Configure(app =>
+ {
+ app.Use((context, next) =>
+ {
+ context.Features.Set<IHttpMaxRequestBodySizeFeature>(
+ new FakeHttpMaxRequestBodySizeFeature());
+ return next(context);
+ });
+ app.UseRequestDecompression();
+ app.UseRequestDecompression();
+ app.Run(async context =>
+ {
+ await using var ms = new MemoryStream();
+ await context.Request.Body.CopyToAsync(ms, context.RequestAborted);
+ decompressedBytes = ms.ToArray();
+ });
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ using var request = new HttpRequestMessage(HttpMethod.Post, "");
+ request.Content = new ByteArrayContent(compressedBytes);
+ request.Content.Headers.ContentEncoding.Add(contentEncoding);
+
+ // Act
+ await client.SendAsync(request);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+
+ Assert.Equal(2, logMessages.Count);
+ AssertLog(logMessages.First(), LogLevel.Debug, $"The request will be decompressed with '{contentEncoding}'.");
+ AssertLog(logMessages.Skip(1).First(), LogLevel.Trace, "The Content-Encoding header is empty or not specified. Skipping request decompression.");
+
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Request_Decompressed_ContentEncodingHeaderRemoved(bool isDecompressed)
+ {
+ // Arrange
+ var contentEncoding = isDecompressed ? "gzip" : "custom";
+ var contentEncodingHeader = new StringValues();
+
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+
+ var outputBytes = Array.Empty<byte>();
+
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddRequestDecompression();
+ services.AddSingleton<ILoggerFactory>(loggerFactory);
+ })
+ .Configure(app =>
+ {
+ app.Use((context, next) =>
+ {
+ context.Features.Set<IHttpMaxRequestBodySizeFeature>(
+ new FakeHttpMaxRequestBodySizeFeature());
+ return next(context);
+ });
+ app.UseRequestDecompression();
+ app.Run(async context =>
+ {
+ contentEncodingHeader = context.Request.Headers.ContentEncoding;
+
+ await using var ms = new MemoryStream();
+ await context.Request.Body.CopyToAsync(ms, context.RequestAborted);
+ outputBytes = ms.ToArray();
+ });
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ using var request = new HttpRequestMessage(HttpMethod.Post, "");
+ request.Content = new ByteArrayContent(compressedBytes);
+ request.Content.Headers.ContentEncoding.Add(contentEncoding);
+
+ // Act
+ await client.SendAsync(request);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+
+ if (isDecompressed)
+ {
+ Assert.Empty(contentEncodingHeader);
+
+ AssertDecompressedWithLog(logMessages, contentEncoding);
+ Assert.Equal(uncompressedBytes, outputBytes);
+ }
+ else
+ {
+ Assert.Equal(contentEncoding, contentEncodingHeader);
+
+ AssertNoDecompressionProviderLog(logMessages);
+ Assert.Equal(compressedBytes, outputBytes);
+ }
+ }
+
+ [Fact]
+ public async Task Request_InvalidDataForContentEncoding_ThrowsInvalidOperationException()
+ {
+ // Arrange
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+ var contentEncoding = "br";
+
+ Exception exception = null;
+
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddRequestDecompression();
+ services.AddSingleton<ILoggerFactory>(loggerFactory);
+ })
+ .Configure(app =>
+ {
+ app.Use((context, next) =>
+ {
+ context.Features.Set<IHttpMaxRequestBodySizeFeature>(
+ new FakeHttpMaxRequestBodySizeFeature());
+ return next(context);
+ });
+ app.UseRequestDecompression();
+ app.Run(async context =>
+ {
+ exception = await Record.ExceptionAsync(async () =>
+ {
+ using var ms = new MemoryStream();
+ await context.Request.Body.CopyToAsync(ms, context.RequestAborted);
+ });
+ });
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ using var request = new HttpRequestMessage(HttpMethod.Post, "");
+ request.Content = new ByteArrayContent(compressedBytes);
+ request.Content.Headers.ContentEncoding.Add(contentEncoding);
+
+ // Act
+ await client.SendAsync(request);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+
+ AssertDecompressedWithLog(logMessages, contentEncoding.ToLowerInvariant());
+
+ Assert.NotNull(exception);
+ Assert.IsAssignableFrom<InvalidOperationException>(exception);
+ }
+
+ [Fact]
+ public async Task Options_RegisterCustomDecompressionProvider()
+ {
+ // Arrange
+ var uncompressedBytes = GetUncompressedContent();
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+ var contentEncoding = "custom";
+
+ // Act
+ var (logMessages, decompressedBytes) =
+ await InvokeMiddleware(
+ compressedBytes,
+ new[] { contentEncoding },
+ configure: (RequestDecompressionOptions options) =>
+ {
+ options.DecompressionProviders.Add(contentEncoding, new CustomDecompressionProvider());
+ });
+
+ // Assert
+ AssertDecompressedWithLog(logMessages, contentEncoding);
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Endpoint_HasRequestSizeLimit_UsedForRequest(bool exceedsLimit)
+ {
+ // Arrange
+ long attributeSizeLimit = 10;
+ long featureSizeLimit = 5;
+
+ var contentEncoding = "gzip";
+ var uncompressedBytes = new byte[attributeSizeLimit + (exceedsLimit ? 1 : 0)];
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+
+ var decompressedBytes = Array.Empty<byte>();
+ Exception exception = null;
+
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddRequestDecompression();
+ services.AddSingleton<ILoggerFactory>(loggerFactory);
+ })
+ .Configure(app =>
+ {
+ app.Use((context, next) =>
+ {
+ context.Features.Set<IEndpointFeature>(
+ GetFakeEndpointFeature(attributeSizeLimit));
+ context.Features.Set<IHttpMaxRequestBodySizeFeature>(
+ new FakeHttpMaxRequestBodySizeFeature(featureSizeLimit));
+
+ return next(context);
+ });
+ app.UseRequestDecompression();
+ app.Run(async context =>
+ {
+ await using var ms = new MemoryStream();
+
+ exception = await Record.ExceptionAsync(async () =>
+ {
+ await context.Request.Body.CopyToAsync(ms, context.RequestAborted);
+ decompressedBytes = ms.ToArray();
+ });
+
+ decompressedBytes = ms.ToArray();
+ });
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ using var request = new HttpRequestMessage(HttpMethod.Post, "");
+ request.Content = new ByteArrayContent(compressedBytes);
+ request.Content.Headers.ContentEncoding.Add(contentEncoding);
+
+ // Act
+ await client.SendAsync(request);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+ AssertDecompressedWithLog(logMessages, contentEncoding);
+
+ if (exceedsLimit)
+ {
+ Assert.NotNull(exception);
+ Assert.IsAssignableFrom<InvalidOperationException>(exception);
+ Assert.Equal("The maximum number of bytes have been read.", exception.Message);
+ }
+ else
+ {
+ Assert.Null(exception);
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Feature_HasRequestSizeLimit_UsedForRequest(bool exceedsLimit)
+ {
+ // Arrange
+ long featureSizeLimit = 10;
+
+ var contentEncoding = "gzip";
+ var uncompressedBytes = new byte[featureSizeLimit + (exceedsLimit ? 1 : 0)];
+ var compressedBytes = await GetGZipCompressedContent(uncompressedBytes);
+
+ var decompressedBytes = Array.Empty<byte>();
+ Exception exception = null;
+
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddRequestDecompression();
+ services.AddSingleton<ILoggerFactory>(loggerFactory);
+ })
+ .Configure(app =>
+ {
+ app.Use((context, next) =>
+ {
+ context.Features.Set<IHttpMaxRequestBodySizeFeature>(
+ new FakeHttpMaxRequestBodySizeFeature(featureSizeLimit));
+
+ return next(context);
+ });
+ app.UseRequestDecompression();
+ app.Run(async context =>
+ {
+ await using var ms = new MemoryStream();
+
+ exception = await Record.ExceptionAsync(async () =>
+ {
+ await context.Request.Body.CopyToAsync(ms, context.RequestAborted);
+ decompressedBytes = ms.ToArray();
+ });
+
+ decompressedBytes = ms.ToArray();
+ });
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ using var request = new HttpRequestMessage(HttpMethod.Post, "");
+ request.Content = new ByteArrayContent(compressedBytes);
+ request.Content.Headers.ContentEncoding.Add(contentEncoding);
+
+ // Act
+ await client.SendAsync(request);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+ AssertDecompressedWithLog(logMessages, contentEncoding);
+
+ if (exceedsLimit)
+ {
+ Assert.NotNull(exception);
+ Assert.IsAssignableFrom<InvalidOperationException>(exception);
+ Assert.Equal("The maximum number of bytes have been read.", exception.Message);
+ }
+ else
+ {
+ Assert.Null(exception);
+ Assert.Equal(uncompressedBytes, decompressedBytes);
+ }
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Endpoint_DoesNotHaveSizeLimitMetadata(bool isCompressed)
+ {
+ // Arrange
+ var sink = new TestSink();
+ var logger = new TestLogger<RequestDecompressionMiddleware>(
+ new TestLoggerFactory(sink, enabled: true));
+ IRequestDecompressionProvider provider = new FakeRequestDecompressionProvider(isCompressed);
+
+ var middleware = new RequestDecompressionMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = StatusCodes.Status200OK;
+ return Task.CompletedTask;
+ },
+ logger,
+ provider);
+
+ var context = new DefaultHttpContext();
+
+ IEndpointFeature endpointFeature = new FakeEndpointFeature
+ {
+ Endpoint = new Endpoint(
+ requestDelegate: null,
+ metadata: new EndpointMetadataCollection(),
+ displayName: null)
+ };
+ context.HttpContext.Features.Set(endpointFeature);
+
+ long expectedRequestSizeLimit = 100;
+ IHttpMaxRequestBodySizeFeature maxRequestBodySizeFeature =
+ new FakeHttpMaxRequestBodySizeFeature(expectedRequestSizeLimit);
+ context.HttpContext.Features.Set(maxRequestBodySizeFeature);
+
+ // Act
+ await middleware.Invoke(context);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+ AssertLog(Assert.Single(logMessages), LogLevel.Debug,
+ $"The endpoint does not specify the {nameof(IRequestSizeLimitMetadata)}.");
+
+ var actualRequestSizeLimit = maxRequestBodySizeFeature.MaxRequestBodySize;
+ Assert.Equal(expectedRequestSizeLimit, actualRequestSizeLimit);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Endpoint_DoesNotHaveBodySizeFeature(bool isCompressed)
+ {
+ // Arrange
+ var sink = new TestSink();
+ var logger = new TestLogger<RequestDecompressionMiddleware>(
+ new TestLoggerFactory(sink, enabled: true));
+ IRequestDecompressionProvider provider = new FakeRequestDecompressionProvider(isCompressed);
+
+ var middleware = new RequestDecompressionMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = StatusCodes.Status200OK;
+ return Task.CompletedTask;
+ },
+ logger,
+ provider);
+
+ var context = new DefaultHttpContext();
+
+ IEndpointFeature endpointFeature = GetFakeEndpointFeature(100);
+ context.HttpContext.Features.Set(endpointFeature);
+
+ IHttpMaxRequestBodySizeFeature maxRequestBodySizeFeature = null;
+ context.HttpContext.Features.Set(maxRequestBodySizeFeature);
+
+ // Act
+ await middleware.Invoke(context);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+ AssertLog(Assert.Single(logMessages), LogLevel.Warning,
+ $"A request body size limit could not be applied. This server does not support the {nameof(IHttpMaxRequestBodySizeFeature)}.");
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task Endpoint_BodySizeFeatureIsReadOnly(bool isCompressed)
+ {
+ // Arrange
+ var sink = new TestSink();
+ var logger = new TestLogger<RequestDecompressionMiddleware>(
+ new TestLoggerFactory(sink, enabled: true));
+ IRequestDecompressionProvider provider = new FakeRequestDecompressionProvider(isCompressed);
+
+ var middleware = new RequestDecompressionMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = StatusCodes.Status200OK;
+ return Task.CompletedTask;
+ },
+ logger,
+ provider);
+
+ var context = new DefaultHttpContext();
+
+ IEndpointFeature endpointFeature = GetFakeEndpointFeature(100);
+ context.HttpContext.Features.Set(endpointFeature);
+
+ long expectedRequestSizeLimit = 50;
+ IHttpMaxRequestBodySizeFeature maxRequestBodySizeFeature =
+ new FakeHttpMaxRequestBodySizeFeature(expectedRequestSizeLimit, isReadOnly: true);
+ context.HttpContext.Features.Set(maxRequestBodySizeFeature);
+
+ // Act
+ await middleware.Invoke(context);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+ AssertLog(Assert.Single(logMessages), LogLevel.Warning,
+ $"A request body size limit could not be applied. The {nameof(IHttpMaxRequestBodySizeFeature)} for the server is read-only.");
+
+ var actualRequestSizeLimit = maxRequestBodySizeFeature.MaxRequestBodySize;
+ Assert.Equal(expectedRequestSizeLimit, actualRequestSizeLimit);
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public async Task Endpoint_HasBodySizeFeature_SetUsingSizeLimitMetadata(bool isCompressed, bool isRequestSizeLimitDisabled)
+ {
+ // Arrange
+ var sink = new TestSink();
+ var logger = new TestLogger<RequestDecompressionMiddleware>(
+ new TestLoggerFactory(sink, enabled: true));
+ IRequestDecompressionProvider provider = new FakeRequestDecompressionProvider(isCompressed);
+
+ var middleware = new RequestDecompressionMiddleware(
+ c =>
+ {
+ c.Response.StatusCode = StatusCodes.Status200OK;
+ return Task.CompletedTask;
+ },
+ logger,
+ provider);
+
+ var context = new DefaultHttpContext();
+
+ long? expectedRequestSizeLimit = isRequestSizeLimitDisabled ? null : 100;
+ IEndpointFeature endpointFeature = GetFakeEndpointFeature(expectedRequestSizeLimit);
+ context.HttpContext.Features.Set(endpointFeature);
+
+ IHttpMaxRequestBodySizeFeature maxRequestBodySizeFeature =
+ new FakeHttpMaxRequestBodySizeFeature(50);
+ context.HttpContext.Features.Set(maxRequestBodySizeFeature);
+
+ // Act
+ await middleware.Invoke(context);
+
+ // Assert
+ var logMessages = sink.Writes.ToList();
+
+ if (isRequestSizeLimitDisabled)
+ {
+ AssertLog(Assert.Single(logMessages), LogLevel.Debug,
+ "The maximum request body size as been disabled.");
+ }
+ else
+ {
+ AssertLog(Assert.Single(logMessages), LogLevel.Debug,
+ $"The maximum request body size has been set to {expectedRequestSizeLimit.Value.ToString(CultureInfo.InvariantCulture)}.");
+ }
+
+ var actualRequestSizeLimit = maxRequestBodySizeFeature.MaxRequestBodySize;
+ Assert.Equal(expectedRequestSizeLimit, actualRequestSizeLimit);
+ }
+
+ [Fact]
+ public void Ctor_NullRequestDelegate_Throws()
+ {
+ // Arrange
+ RequestDelegate requestDelegate = null;
+ var logger = new TestLogger<RequestDecompressionMiddleware>(
+ new TestLoggerFactory(new TestSink(), enabled: true));
+ var provider = new FakeRequestDecompressionProvider();
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ new RequestDecompressionMiddleware(requestDelegate, logger, provider);
+ });
+ }
+
+ [Fact]
+ public void Ctor_NullLogger_Throws()
+ {
+ // Arrange
+ static Task requestDelegate(HttpContext context) => Task.FromResult(context);
+ ILogger<RequestDecompressionMiddleware> logger = null;
+ var provider = new FakeRequestDecompressionProvider();
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ new RequestDecompressionMiddleware(requestDelegate, logger, provider);
+ });
+ }
+
+ [Fact]
+ public void Ctor_NullRequestDecompressionProvider_Throws()
+ {
+ // Arrange
+ static Task requestDelegate(HttpContext context) => Task.FromResult(context);
+ var logger = new TestLogger<RequestDecompressionMiddleware>(
+ new TestLoggerFactory(new TestSink(), enabled: true));
+ IRequestDecompressionProvider provider = null;
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ new RequestDecompressionMiddleware(requestDelegate, logger, provider);
+ });
+ }
+
+ private class FakeRequestDecompressionProvider : IRequestDecompressionProvider
+ {
+ private readonly bool _isCompressed;
+
+ public FakeRequestDecompressionProvider(bool isCompressed = false)
+ {
+ _isCompressed = isCompressed;
+ }
+
+#nullable enable
+ public Stream? GetDecompressionStream(HttpContext context)
+ => _isCompressed
+ ? new MemoryStream()
+ : null;
+#nullable disable
+ }
+
+ private static void AssertLog(WriteContext log, LogLevel level, string message)
+ {
+ Assert.Equal(level, log.LogLevel);
+ Assert.Equal(message, log.State.ToString());
+ }
+
+ private static void AssertDecompressedWithLog(List<WriteContext> logMessages, string encoding)
+ {
+ var logMessage = Assert.Single(logMessages);
+ AssertLog(logMessage, LogLevel.Debug, $"The request will be decompressed with '{encoding}'.");
+ }
+
+ private static void AssertNoDecompressionProviderLog(List<WriteContext> logMessages)
+ {
+ var logMessage = Assert.Single(logMessages);
+ AssertLog(logMessage, LogLevel.Debug, "No matching request decompression provider found.");
+ }
+
+ private static async Task<(List<WriteContext>, byte[])> InvokeMiddleware(
+ byte[] compressedContent,
+ string[] contentEncodings = null,
+ Action<RequestDecompressionOptions> configure = null)
+ {
+ var sink = new TestSink(
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>,
+ TestSink.EnableWithTypeName<DefaultRequestDecompressionProvider>);
+ var loggerFactory = new TestLoggerFactory(sink, enabled: true);
+
+ var outputContent = Array.Empty<byte>();
+
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .ConfigureServices(services =>
+ {
+ services.AddRequestDecompression(configure ?? (_ => { }));
+ services.AddSingleton<ILoggerFactory>(loggerFactory);
+ })
+ .Configure(app =>
+ {
+ app.Use((context, next) =>
+ {
+ context.Features.Set<IHttpMaxRequestBodySizeFeature>(
+ new FakeHttpMaxRequestBodySizeFeature());
+ return next(context);
+ });
+ app.UseRequestDecompression();
+ app.Run(async context =>
+ {
+ await using var ms = new MemoryStream();
+ await context.Request.Body.CopyToAsync(ms, context.RequestAborted);
+ outputContent = ms.ToArray();
+ });
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ var client = server.CreateClient();
+
+ using var request = new HttpRequestMessage(HttpMethod.Post, "");
+ request.Content = new ByteArrayContent(compressedContent);
+
+ if (contentEncodings != null)
+ {
+ foreach (var encoding in contentEncodings)
+ {
+ request.Content.Headers.ContentEncoding.Add(encoding);
+ }
+ }
+
+ await client.SendAsync(request);
+
+ return (sink.Writes.ToList(), outputContent);
+ }
+ private class CustomDecompressionProvider : IDecompressionProvider
+ {
+ public Stream GetDecompressionStream(Stream stream)
+ {
+ return new GZipStream(stream, CompressionMode.Decompress);
+ }
+ }
+
+ private static FakeEndpointFeature GetFakeEndpointFeature(long? requestSizeLimit)
+ {
+ var requestSizeLimitMetadata = new FakeRequestSizeLimitMetadata
+ {
+ MaxRequestBodySize = requestSizeLimit
+ };
+
+ var endpointMetadata =
+ new EndpointMetadataCollection(new[] { requestSizeLimitMetadata });
+
+ return new FakeEndpointFeature
+ {
+ Endpoint = new Endpoint(
+ requestDelegate: null,
+ metadata: endpointMetadata,
+ displayName: null)
+ };
+ }
+
+ private class FakeEndpointFeature : IEndpointFeature
+ {
+ public Endpoint Endpoint { get; set; }
+ }
+
+ private class FakeRequestSizeLimitMetadata : IRequestSizeLimitMetadata
+ {
+ public long? MaxRequestBodySize { get; set; }
+ }
+
+ private class FakeHttpMaxRequestBodySizeFeature : IHttpMaxRequestBodySizeFeature
+ {
+ public FakeHttpMaxRequestBodySizeFeature(
+ long? maxRequestBodySize = null,
+ bool isReadOnly = false)
+ {
+ MaxRequestBodySize = maxRequestBodySize;
+ IsReadOnly = isReadOnly;
+ }
+
+ public bool IsReadOnly { get; }
+
+ public long? MaxRequestBodySize { get; set; }
+ }
+}
diff --git a/src/Middleware/RequestDecompression/test/RequestDecompressionOptionsTests.cs b/src/Middleware/RequestDecompression/test/RequestDecompressionOptionsTests.cs
new file mode 100644
index 0000000000..eb05050b2d
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/RequestDecompressionOptionsTests.cs
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RequestDecompression.Tests;
+
+public class RequestDecompressionOptionsTests
+{
+ [Fact]
+ public void Options_InitializedWithDefaultProviders()
+ {
+ // Arrange
+ var defaultProviderCount = 3;
+
+ // Act
+ var options = new RequestDecompressionOptions();
+
+ // Assert
+ var providers = options.DecompressionProviders;
+ Assert.Equal(defaultProviderCount, providers.Count);
+
+ var brotliProvider = Assert.Contains("br", providers);
+ Assert.IsType<BrotliDecompressionProvider>(brotliProvider);
+
+ var deflateProvider = Assert.Contains("deflate", providers);
+ Assert.IsType<DeflateDecompressionProvider>(deflateProvider);
+
+ var gzipProvider = Assert.Contains("gzip", providers);
+ Assert.IsType<GZipDecompressionProvider>(gzipProvider);
+ }
+}
diff --git a/src/Middleware/RequestDecompression/test/RequestDecompressionServiceExtensionsTests.cs b/src/Middleware/RequestDecompression/test/RequestDecompressionServiceExtensionsTests.cs
new file mode 100644
index 0000000000..00c4f9885f
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/RequestDecompressionServiceExtensionsTests.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.RequestDecompression.Tests;
+
+public class RequestDecompressionServiceExtensionsTests
+{
+ [Fact]
+ public void AddRequestDecompression_NullServiceCollection_Throws()
+ {
+ // Arrange
+ IServiceCollection serviceCollection = null;
+ var configureOptions = (RequestDecompressionOptions options) => { };
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ serviceCollection.AddRequestDecompression(configureOptions);
+ });
+ }
+
+ [Fact]
+ public void AddRequestDecompression_NullConfigureOptions_Throws()
+ {
+ // Arrange
+ var serviceCollection = new ServiceCollection();
+ Action<RequestDecompressionOptions> configureOptions = null;
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ serviceCollection.AddRequestDecompression(configureOptions);
+ });
+ }
+}
diff --git a/src/Middleware/RequestDecompression/test/SizeLimitedStreamTests.cs b/src/Middleware/RequestDecompression/test/SizeLimitedStreamTests.cs
new file mode 100644
index 0000000000..a4e086abfb
--- /dev/null
+++ b/src/Middleware/RequestDecompression/test/SizeLimitedStreamTests.cs
@@ -0,0 +1,107 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.RequestDecompression.Tests;
+
+public class SizeLimitedStreamTests
+{
+ [Fact]
+ public void Ctor_NullInnerStream_Throws()
+ {
+ // Arrange
+ Stream innerStream = null;
+
+ // Act + Assert
+ Assert.Throws<ArgumentNullException>(() =>
+ {
+ using var sizeLimitedStream = new SizeLimitedStream(innerStream, 1);
+ });
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task ReadAsync_InnerStreamExceedsSizeLimit_Throws(bool exceedsLimit)
+ {
+ // Arrange
+ var sizeLimit = 10;
+ var bytes = new byte[sizeLimit + (exceedsLimit ? 1 : 0)];
+
+ using var innerStream = new MemoryStream(bytes);
+ using var sizeLimitedStream = new SizeLimitedStream(innerStream, sizeLimit);
+
+ var buffer = new byte[bytes.Length];
+
+ // Act
+ var exception = await Record.ExceptionAsync(async () =>
+ {
+ while (await sizeLimitedStream.ReadAsync(buffer) > 0) { }
+ });
+
+ // Assert
+ AssertStreamReadingException(exception, exceedsLimit);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void Read_InnerStreamExceedsSizeLimit_Throws(bool exceedsLimit)
+ {
+ // Arrange
+ var sizeLimit = 10;
+ var bytes = new byte[sizeLimit + (exceedsLimit ? 1 : 0)];
+
+ using var innerStream = new MemoryStream(bytes);
+ using var sizeLimitedStream = new SizeLimitedStream(innerStream, sizeLimit);
+
+ var buffer = new byte[bytes.Length];
+
+ // Act
+ var exception = Record.Exception(() =>
+ {
+ while (sizeLimitedStream.Read(buffer, 0, buffer.Length) > 0) { }
+ });
+
+ // Assert
+ AssertStreamReadingException(exception, exceedsLimit);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void BeginRead_InnerStreamExceedsSizeLimit_Throws(bool exceedsLimit)
+ {
+ // Arrange
+ var sizeLimit = 10;
+ var bytes = new byte[sizeLimit + (exceedsLimit ? 1 : 0)];
+
+ using var innerStream = new MemoryStream(bytes);
+ using var sizeLimitedStream = new SizeLimitedStream(innerStream, sizeLimit);
+
+ var buffer = new byte[bytes.Length];
+
+ // Act
+ var exception = Record.Exception(() =>
+ {
+ var asyncResult = sizeLimitedStream.BeginRead(buffer, 0, buffer.Length, (o) => { }, null);
+ sizeLimitedStream.EndRead(asyncResult);
+ });
+
+ // Assert
+ AssertStreamReadingException(exception, exceedsLimit);
+ }
+
+ private static void AssertStreamReadingException(Exception exception, bool exceedsLimit)
+ {
+ if (exceedsLimit)
+ {
+ Assert.NotNull(exception);
+ Assert.IsAssignableFrom<InvalidOperationException>(exception);
+ Assert.Equal("The maximum number of bytes have been read.", exception.Message);
+ }
+ else
+ {
+ Assert.Null(exception);
+ }
+ }
+}
diff --git a/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj b/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj
index 0fab4e01b0..794dcb7acc 100644
--- a/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj
+++ b/src/Middleware/ResponseCaching.Abstractions/src/Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;cache;caching</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/ResponseCaching.Abstractions/src/PublicAPI.Shipped.txt b/src/Middleware/ResponseCaching.Abstractions/src/PublicAPI.Shipped.txt
index 738b922f00..6ff8caa3e3 100644
--- a/src/Middleware/ResponseCaching.Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/ResponseCaching.Abstractions/src/PublicAPI.Shipped.txt
@@ -1,6 +1,4 @@
#nullable enable
-~Microsoft.AspNetCore.ResponseCaching.IResponseCachingFeature.VaryByQueryKeys.get -> string[]
-~Microsoft.AspNetCore.ResponseCaching.IResponseCachingFeature.VaryByQueryKeys.set -> void
Microsoft.AspNetCore.ResponseCaching.IResponseCachingFeature
Microsoft.AspNetCore.ResponseCaching.IResponseCachingFeature.VaryByQueryKeys.get -> string![]?
Microsoft.AspNetCore.ResponseCaching.IResponseCachingFeature.VaryByQueryKeys.set -> void
diff --git a/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponse.cs b/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponse.cs
index f2385cd657..d26ff99910 100644
--- a/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponse.cs
+++ b/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponse.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class CachedResponse : IResponseCacheEntry
+internal sealed class CachedResponse : IResponseCacheEntry
{
public DateTimeOffset Created { get; set; }
diff --git a/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponseBody.cs b/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponseBody.cs
index ed52bf2c78..21cfeb80ba 100644
--- a/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponseBody.cs
+++ b/src/Middleware/ResponseCaching/src/CacheEntry/CachedResponseBody.cs
@@ -5,7 +5,7 @@ using System.IO.Pipelines;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class CachedResponseBody
+internal sealed class CachedResponseBody
{
public CachedResponseBody(List<byte[]> segments, long length)
{
diff --git a/src/Middleware/ResponseCaching/src/CacheEntry/CachedVaryByRules.cs b/src/Middleware/ResponseCaching/src/CacheEntry/CachedVaryByRules.cs
index 2c39cbeaa0..0513132b9c 100644
--- a/src/Middleware/ResponseCaching/src/CacheEntry/CachedVaryByRules.cs
+++ b/src/Middleware/ResponseCaching/src/CacheEntry/CachedVaryByRules.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class CachedVaryByRules : IResponseCacheEntry
+internal sealed class CachedVaryByRules : IResponseCacheEntry
{
public string VaryByKeyPrefix { get; set; } = default!;
diff --git a/src/Middleware/ResponseCaching/src/FastGuid.cs b/src/Middleware/ResponseCaching/src/FastGuid.cs
index c3db44dc6f..7b1c56775c 100644
--- a/src/Middleware/ResponseCaching/src/FastGuid.cs
+++ b/src/Middleware/ResponseCaching/src/FastGuid.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class FastGuid
+internal sealed class FastGuid
{
// Base32 encoding - in ascii sort order for easy text based sorting
private static readonly char[] s_encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV".ToCharArray();
diff --git a/src/Middleware/ResponseCaching/src/MemoryCachedResponse.cs b/src/Middleware/ResponseCaching/src/MemoryCachedResponse.cs
index e46eee53a7..b4609492a3 100644
--- a/src/Middleware/ResponseCaching/src/MemoryCachedResponse.cs
+++ b/src/Middleware/ResponseCaching/src/MemoryCachedResponse.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class MemoryCachedResponse
+internal sealed class MemoryCachedResponse
{
public DateTimeOffset Created { get; set; }
diff --git a/src/Middleware/ResponseCaching/src/MemoryResponseCache.cs b/src/Middleware/ResponseCaching/src/MemoryResponseCache.cs
index 49165d4a91..fc6d119152 100644
--- a/src/Middleware/ResponseCaching/src/MemoryResponseCache.cs
+++ b/src/Middleware/ResponseCaching/src/MemoryResponseCache.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Caching.Memory;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class MemoryResponseCache : IResponseCache
+internal sealed class MemoryResponseCache : IResponseCache
{
private readonly IMemoryCache _cache;
diff --git a/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj b/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj
index 73cd7526a0..850a333288 100644
--- a/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj
+++ b/src/Middleware/ResponseCaching/src/Microsoft.AspNetCore.ResponseCaching.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;cache;caching</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/ResponseCaching/src/PublicAPI.Shipped.txt b/src/Middleware/ResponseCaching/src/PublicAPI.Shipped.txt
index 5243c6ea96..7aff9ed074 100644
--- a/src/Middleware/ResponseCaching/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/ResponseCaching/src/PublicAPI.Shipped.txt
@@ -1,9 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.ResponseCaching.ResponseCachingFeature.VaryByQueryKeys.get -> string[]
-~Microsoft.AspNetCore.ResponseCaching.ResponseCachingFeature.VaryByQueryKeys.set -> void
~Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext httpContext) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPoolProvider poolProvider) -> void
-~Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPoolProvider! poolProvider) -> void
+Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPoolProvider! poolProvider) -> void
~static Microsoft.AspNetCore.Builder.ResponseCachingExtensions.UseResponseCaching(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.Extensions.DependencyInjection.ResponseCachingServicesExtensions.AddResponseCaching(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
~static Microsoft.Extensions.DependencyInjection.ResponseCachingServicesExtensions.AddResponseCaching(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions> configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
diff --git a/src/Middleware/ResponseCaching/src/PublicAPI.Unshipped.txt b/src/Middleware/ResponseCaching/src/PublicAPI.Unshipped.txt
index 9aa5c2cf0b..7dc5c58110 100644
--- a/src/Middleware/ResponseCaching/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/ResponseCaching/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPoolProvider poolProvider) -> void
-*REMOVED*~Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPoolProvider! poolProvider) -> void
-Microsoft.AspNetCore.ResponseCaching.ResponseCachingMiddleware.ResponseCachingMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCaching.ResponseCachingOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.ObjectPool.ObjectPoolProvider! poolProvider) -> void
diff --git a/src/Middleware/ResponseCaching/src/ResponseCachingContext.cs b/src/Middleware/ResponseCaching/src/ResponseCachingContext.cs
index 04e38bd8be..2e7018721b 100644
--- a/src/Middleware/ResponseCaching/src/ResponseCachingContext.cs
+++ b/src/Middleware/ResponseCaching/src/ResponseCachingContext.cs
@@ -9,7 +9,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class ResponseCachingContext
+internal sealed class ResponseCachingContext
{
private DateTimeOffset? _responseDate;
private bool _parsedResponseDate;
diff --git a/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs b/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs
index a844ae28eb..957f6faae6 100644
--- a/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs
+++ b/src/Middleware/ResponseCaching/src/ResponseCachingKeyProvider.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class ResponseCachingKeyProvider : IResponseCachingKeyProvider
+internal sealed class ResponseCachingKeyProvider : IResponseCachingKeyProvider
{
// Use the record separator for delimiting components of the cache key to avoid possible collisions
private const char KeyDelimiter = '\x1e';
@@ -202,7 +202,7 @@ internal class ResponseCachingKeyProvider : IResponseCachingKeyProvider
}
}
- private class QueryKeyComparer : IComparer<KeyValuePair<string, StringValues>>
+ private sealed class QueryKeyComparer : IComparer<KeyValuePair<string, StringValues>>
{
private readonly StringComparer _stringComparer;
diff --git a/src/Middleware/ResponseCaching/src/ResponseCachingPolicyProvider.cs b/src/Middleware/ResponseCaching/src/ResponseCachingPolicyProvider.cs
index 97c7b4f10c..3d255df752 100644
--- a/src/Middleware/ResponseCaching/src/ResponseCachingPolicyProvider.cs
+++ b/src/Middleware/ResponseCaching/src/ResponseCachingPolicyProvider.cs
@@ -7,9 +7,9 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class ResponseCachingPolicyProvider : IResponseCachingPolicyProvider
+internal sealed class ResponseCachingPolicyProvider : IResponseCachingPolicyProvider
{
- public virtual bool AttemptResponseCaching(ResponseCachingContext context)
+ public bool AttemptResponseCaching(ResponseCachingContext context)
{
var request = context.HttpContext.Request;
@@ -30,7 +30,7 @@ internal class ResponseCachingPolicyProvider : IResponseCachingPolicyProvider
return true;
}
- public virtual bool AllowCacheLookup(ResponseCachingContext context)
+ public bool AllowCacheLookup(ResponseCachingContext context)
{
var requestHeaders = context.HttpContext.Request.Headers;
var cacheControl = requestHeaders.CacheControl;
@@ -57,13 +57,13 @@ internal class ResponseCachingPolicyProvider : IResponseCachingPolicyProvider
return true;
}
- public virtual bool AllowCacheStorage(ResponseCachingContext context)
+ public bool AllowCacheStorage(ResponseCachingContext context)
{
// Check request no-store
return !HeaderUtilities.ContainsCacheDirective(context.HttpContext.Request.Headers.CacheControl, CacheControlHeaderValue.NoStoreString);
}
- public virtual bool IsResponseCacheable(ResponseCachingContext context)
+ public bool IsResponseCacheable(ResponseCachingContext context)
{
var responseCacheControlHeader = context.HttpContext.Response.Headers.CacheControl;
@@ -163,7 +163,7 @@ internal class ResponseCachingPolicyProvider : IResponseCachingPolicyProvider
return true;
}
- public virtual bool IsCachedEntryFresh(ResponseCachingContext context)
+ public bool IsCachedEntryFresh(ResponseCachingContext context)
{
var age = context.CachedEntryAge!.Value;
var cachedCacheControlHeaders = context.CachedResponseHeaders.CacheControl;
diff --git a/src/Middleware/ResponseCaching/src/Streams/ResponseCachingStream.cs b/src/Middleware/ResponseCaching/src/Streams/ResponseCachingStream.cs
index d2320bff20..92e1f0907b 100644
--- a/src/Middleware/ResponseCaching/src/Streams/ResponseCachingStream.cs
+++ b/src/Middleware/ResponseCaching/src/Streams/ResponseCachingStream.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class ResponseCachingStream : Stream
+internal sealed class ResponseCachingStream : Stream
{
private readonly Stream _innerStream;
private readonly long _maxBufferSize;
diff --git a/src/Middleware/ResponseCaching/src/Streams/SegmentWriteStream.cs b/src/Middleware/ResponseCaching/src/Streams/SegmentWriteStream.cs
index 698871e0c2..013c13431e 100644
--- a/src/Middleware/ResponseCaching/src/Streams/SegmentWriteStream.cs
+++ b/src/Middleware/ResponseCaching/src/Streams/SegmentWriteStream.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.ResponseCaching;
-internal class SegmentWriteStream : Stream
+internal sealed class SegmentWriteStream : Stream
{
private readonly List<byte[]> _segments = new List<byte[]>();
private readonly MemoryStream _bufferStream = new MemoryStream();
diff --git a/src/Middleware/ResponseCaching/src/SystemClock.cs b/src/Middleware/ResponseCaching/src/SystemClock.cs
index 6c6ee6c02d..6fc3ad49cb 100644
--- a/src/Middleware/ResponseCaching/src/SystemClock.cs
+++ b/src/Middleware/ResponseCaching/src/SystemClock.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.ResponseCaching;
/// <summary>
/// Provides access to the normal system clock.
/// </summary>
-internal class SystemClock : ISystemClock
+internal sealed class SystemClock : ISystemClock
{
/// <summary>
/// Retrieves the current system time in UTC.
diff --git a/src/Middleware/ResponseCompression/src/CompressionProviderCollection.cs b/src/Middleware/ResponseCompression/src/CompressionProviderCollection.cs
index e3de051de5..1b1f80aeb2 100644
--- a/src/Middleware/ResponseCompression/src/CompressionProviderCollection.cs
+++ b/src/Middleware/ResponseCompression/src/CompressionProviderCollection.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.ObjectModel;
+using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.ResponseCompression;
@@ -16,7 +17,8 @@ public class CompressionProviderCollection : Collection<ICompressionProvider>
/// <remarks>
/// Provider instances will be created using an <see cref="IServiceProvider" />.
/// </remarks>
- public void Add<TCompressionProvider>() where TCompressionProvider : ICompressionProvider
+ public void Add<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TCompressionProvider>()
+ where TCompressionProvider : ICompressionProvider
{
Add(typeof(TCompressionProvider));
}
@@ -28,7 +30,7 @@ public class CompressionProviderCollection : Collection<ICompressionProvider>
/// <remarks>
/// Provider instances will be created using an <see cref="IServiceProvider" />.
/// </remarks>
- public void Add(Type providerType)
+ public void Add([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type providerType)
{
if (providerType == null)
{
diff --git a/src/Middleware/ResponseCompression/src/CompressionProviderFactory.cs b/src/Middleware/ResponseCompression/src/CompressionProviderFactory.cs
index 370d01897e..d39aa9e6ae 100644
--- a/src/Middleware/ResponseCompression/src/CompressionProviderFactory.cs
+++ b/src/Middleware/ResponseCompression/src/CompressionProviderFactory.cs
@@ -1,6 +1,7 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.ResponseCompression;
@@ -9,13 +10,14 @@ namespace Microsoft.AspNetCore.ResponseCompression;
/// This is a placeholder for the CompressionProviderCollection that allows creating the given type via
/// an <see cref="IServiceProvider" />.
/// </summary>
-internal class CompressionProviderFactory : ICompressionProvider
+internal sealed class CompressionProviderFactory : ICompressionProvider
{
- public CompressionProviderFactory(Type providerType)
+ public CompressionProviderFactory([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type providerType)
{
ProviderType = providerType;
}
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
private Type ProviderType { get; }
public ICompressionProvider CreateInstance(IServiceProvider serviceProvider)
diff --git a/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj b/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj
index 67ef58a984..99aedcc08b 100644
--- a/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj
+++ b/src/Middleware/ResponseCompression/src/Microsoft.AspNetCore.ResponseCompression.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/ResponseCompression/src/PublicAPI.Shipped.txt b/src/Middleware/ResponseCompression/src/PublicAPI.Shipped.txt
index 60b71d532f..3ce3d104ee 100644
--- a/src/Middleware/ResponseCompression/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/ResponseCompression/src/PublicAPI.Shipped.txt
@@ -1,14 +1,10 @@
#nullable enable
-~Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.BrotliCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProviderOptions!>! options) -> void
-~Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.BrotliCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProviderOptions> options) -> void
+Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.BrotliCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProviderOptions!>! options) -> void
~Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.CreateStream(System.IO.Stream outputStream) -> System.IO.Stream
~Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.EncodingName.get -> string
-~Microsoft.AspNetCore.ResponseCompression.CompressionProviderCollection.Add(System.Type providerType) -> void
-~Microsoft.AspNetCore.ResponseCompression.CompressionProviderCollection.Add<TCompressionProvider>() -> void
~Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.CreateStream(System.IO.Stream outputStream) -> System.IO.Stream
~Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.EncodingName.get -> string
-~Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.GzipCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.GzipCompressionProviderOptions!>! options) -> void
-~Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.GzipCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.GzipCompressionProviderOptions> options) -> void
+Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.GzipCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.GzipCompressionProviderOptions!>! options) -> void
~Microsoft.AspNetCore.ResponseCompression.ICompressionProvider.CreateStream(System.IO.Stream outputStream) -> System.IO.Stream
~Microsoft.AspNetCore.ResponseCompression.ICompressionProvider.EncodingName.get -> string
~Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider.CheckRequestAcceptsCompression(Microsoft.AspNetCore.Http.HttpContext context) -> bool
@@ -16,14 +12,9 @@
~Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider.ShouldCompressResponse(Microsoft.AspNetCore.Http.HttpContext context) -> bool
~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionMiddleware.ResponseCompressionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.AspNetCore.ResponseCompression.IResponseCompressionProvider provider) -> void
-~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions.ExcludedMimeTypes.get -> System.Collections.Generic.IEnumerable<string>
-~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions.ExcludedMimeTypes.set -> void
-~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions.MimeTypes.get -> System.Collections.Generic.IEnumerable<string>
-~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions.MimeTypes.set -> void
~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions.Providers.get -> Microsoft.AspNetCore.ResponseCompression.CompressionProviderCollection
~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.CheckRequestAcceptsCompression(Microsoft.AspNetCore.Http.HttpContext context) -> bool
-~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.ResponseCompressionProvider(System.IServiceProvider services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions> options) -> void
-~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.ResponseCompressionProvider(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions!>! options) -> void
+Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.ResponseCompressionProvider(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions!>! options) -> void
~static Microsoft.AspNetCore.Builder.ResponseCompressionBuilderExtensions.UseResponseCompression(this Microsoft.AspNetCore.Builder.IApplicationBuilder builder) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.ResponseCompressionServicesExtensions.AddResponseCompression(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
~static Microsoft.AspNetCore.Builder.ResponseCompressionServicesExtensions.AddResponseCompression(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions> configureOptions) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
diff --git a/src/Middleware/ResponseCompression/src/PublicAPI.Unshipped.txt b/src/Middleware/ResponseCompression/src/PublicAPI.Unshipped.txt
index d0cb20b403..7dc5c58110 100644
--- a/src/Middleware/ResponseCompression/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/ResponseCompression/src/PublicAPI.Unshipped.txt
@@ -1,10 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.BrotliCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProviderOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.BrotliCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProviderOptions> options) -> void
-Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProvider.BrotliCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.BrotliCompressionProviderOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.GzipCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.GzipCompressionProviderOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.GzipCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.GzipCompressionProviderOptions> options) -> void
-Microsoft.AspNetCore.ResponseCompression.GzipCompressionProvider.GzipCompressionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.GzipCompressionProviderOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.ResponseCompressionProvider(System.IServiceProvider services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.ResponseCompressionProvider(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions!>! options) -> void
-Microsoft.AspNetCore.ResponseCompression.ResponseCompressionProvider.ResponseCompressionProvider(System.IServiceProvider! services, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.ResponseCompression.ResponseCompressionOptions!>! options) -> void
diff --git a/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs b/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs
index 731ba0fbb0..2eefdb6482 100644
--- a/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs
+++ b/src/Middleware/ResponseCompression/src/ResponseCompressionBody.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.ResponseCompression;
/// <summary>
/// Stream wrapper that create specific compression stream only if necessary.
/// </summary>
-internal class ResponseCompressionBody : Stream, IHttpResponseBodyFeature, IHttpsCompressionFeature
+internal sealed class ResponseCompressionBody : Stream, IHttpResponseBodyFeature, IHttpsCompressionFeature
{
private readonly HttpContext _context;
private readonly IResponseCompressionProvider _provider;
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/ApacheModRewriteRule.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/ApacheModRewriteRule.cs
index 6831fbc12a..fa5cb35b84 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/ApacheModRewriteRule.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/ApacheModRewriteRule.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class ApacheModRewriteRule : IRule
+internal sealed class ApacheModRewriteRule : IRule
{
public UrlMatch InitialMatch { get; }
public IList<Condition>? Conditions { get; }
@@ -18,7 +18,7 @@ internal class ApacheModRewriteRule : IRule
Actions = urlActions;
}
- public virtual void ApplyRule(RewriteContext context)
+ public void ApplyRule(RewriteContext context)
{
// 1. Figure out which section of the string to match for the initial rule.
var initMatchRes = InitialMatch.Evaluate(context.HttpContext.Request.Path, context);
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/Condition.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/Condition.cs
index c54ec09e94..048853b6f8 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/Condition.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/Condition.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class Condition
+internal sealed class Condition
{
public Condition(Pattern input, UrlMatch match, bool orNext)
{
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/ConditionPatternParser.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/ConditionPatternParser.cs
index ceaee84d62..b8bc6e31d6 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/ConditionPatternParser.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/ConditionPatternParser.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
/// Parses the "CondPattern" portion of the RewriteCond.
/// RewriteCond TestString CondPattern
/// </summary>
-internal class ConditionPatternParser
+internal sealed class ConditionPatternParser
{
private const char Not = '!';
private const char Dash = '-';
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/CookieActionFactory.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/CookieActionFactory.cs
index 7d805227ff..463053667b 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/CookieActionFactory.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/CookieActionFactory.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Rewrite.UrlActions;
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class CookieActionFactory
+internal sealed class CookieActionFactory
{
/// <summary>
/// Creates a <see cref="ChangeCookieAction" /> <see href="https://httpd.apache.org/docs/current/rewrite/flags.html#flag_co" /> for details.
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/FileParser.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/FileParser.cs
index 5eade69cdb..9f6880b398 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/FileParser.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/FileParser.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class FileParser
+internal sealed class FileParser
{
public static IList<IRule> Parse(TextReader input)
{
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/FlagParser.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/FlagParser.cs
index a8cc13eee5..59ac77affc 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/FlagParser.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/FlagParser.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class FlagParser
+internal sealed class FlagParser
{
private readonly IDictionary<string, FlagType> _ruleFlagLookup = new Dictionary<string, FlagType>(StringComparer.OrdinalIgnoreCase) {
{ "b", FlagType.EscapeBackreference},
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/Flags.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/Flags.cs
index 48b4a4b33e..562bef8c6f 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/Flags.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/Flags.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
// For more information of flags, and what flags we currently support:
// https://github.com/aspnet/BasicMiddleware/issues/66
// http://httpd.apache.org/docs/current/expr.html#vars
-internal class Flags
+internal sealed class Flags
{
public IDictionary<FlagType, string> FlagDictionary { get; }
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/ParsedModRewriteCondition.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/ParsedModRewriteCondition.cs
index 3d89508e18..cbef93857c 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/ParsedModRewriteCondition.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/ParsedModRewriteCondition.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class ParsedModRewriteInput
+internal sealed class ParsedModRewriteInput
{
public bool Invert { get; set; }
public ConditionType ConditionType { get; set; }
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/RuleBuilder.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/RuleBuilder.cs
index ffbe6d2409..4b35fde0bd 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/RuleBuilder.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/RuleBuilder.cs
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Rewrite.UrlMatches;
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class RuleBuilder
+internal sealed class RuleBuilder
{
private IList<Condition>? _conditions;
internal IList<UrlAction> _actions = new List<UrlAction>();
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/RuleRegexParser.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/RuleRegexParser.cs
index 7c3d15305a..88f7f80c25 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/RuleRegexParser.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/RuleRegexParser.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
-internal class RuleRegexParser
+internal sealed class RuleRegexParser
{
public static ParsedModRewriteInput ParseRuleRegex(string regex)
{
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/TestStringParser.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/TestStringParser.cs
index 9c296bf05d..dd0db4e8ff 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/TestStringParser.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/TestStringParser.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
/// <summary>
/// Parses the TestString segment of the mod_rewrite condition.
/// </summary>
-internal class TestStringParser
+internal sealed class TestStringParser
{
private const char Percent = '%';
private const char Dollar = '$';
diff --git a/src/Middleware/Rewrite/src/ApacheModRewrite/Tokenizer.cs b/src/Middleware/Rewrite/src/ApacheModRewrite/Tokenizer.cs
index f64af3ce45..7479bc2df1 100644
--- a/src/Middleware/Rewrite/src/ApacheModRewrite/Tokenizer.cs
+++ b/src/Middleware/Rewrite/src/ApacheModRewrite/Tokenizer.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Rewrite.ApacheModRewrite;
/// <summary>
/// Tokenizes a mod_rewrite rule, delimited by spaces.
/// </summary>
-internal class Tokenizer
+internal sealed class Tokenizer
{
private const char Space = ' ';
private const char Escape = '\\';
diff --git a/src/Middleware/Rewrite/src/BackReferenceCollection.cs b/src/Middleware/Rewrite/src/BackReferenceCollection.cs
index 7aecee1c63..8a406db5b3 100644
--- a/src/Middleware/Rewrite/src/BackReferenceCollection.cs
+++ b/src/Middleware/Rewrite/src/BackReferenceCollection.cs
@@ -5,7 +5,7 @@ using System.Text.RegularExpressions;
namespace Microsoft.AspNetCore.Rewrite;
-internal class BackReferenceCollection
+internal sealed class BackReferenceCollection
{
private readonly List<string> _backReferences = new List<string>();
diff --git a/src/Middleware/Rewrite/src/DelegateRule.cs b/src/Middleware/Rewrite/src/DelegateRule.cs
index e2db8bb837..af52413a3f 100644
--- a/src/Middleware/Rewrite/src/DelegateRule.cs
+++ b/src/Middleware/Rewrite/src/DelegateRule.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite;
-internal class DelegateRule : IRule
+internal sealed class DelegateRule : IRule
{
private readonly Action<RewriteContext> _onApplyRule;
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/ConditionCollection.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/ConditionCollection.cs
index eef26cdd57..ab88d36bd0 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/ConditionCollection.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/ConditionCollection.cs
@@ -5,7 +5,7 @@ using System.Collections;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class ConditionCollection : IEnumerable<Condition>
+internal sealed class ConditionCollection : IEnumerable<Condition>
{
private readonly List<Condition> _conditions = new List<Condition>();
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMap.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMap.cs
index 64680ce99b..99a704d5b4 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMap.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMap.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class IISRewriteMap
+internal sealed class IISRewriteMap
{
private readonly Dictionary<string, string> _map = new Dictionary<string, string>();
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMapCollection.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMapCollection.cs
index e20461a1f2..ed0fc98b4b 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMapCollection.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/IISRewriteMapCollection.cs
@@ -5,7 +5,7 @@ using System.Collections;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class IISRewriteMapCollection : IEnumerable<IISRewriteMap>
+internal sealed class IISRewriteMapCollection : IEnumerable<IISRewriteMap>
{
private readonly Dictionary<string, IISRewriteMap> _rewriteMaps = new Dictionary<string, IISRewriteMap>();
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/IISUrlRewriteRule.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/IISUrlRewriteRule.cs
index adcd86260b..d259f82344 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/IISUrlRewriteRule.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/IISUrlRewriteRule.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class IISUrlRewriteRule : IRule
+internal sealed class IISUrlRewriteRule : IRule
{
public string? Name { get; }
public UrlMatch InitialMatch { get; }
@@ -35,7 +35,7 @@ internal class IISUrlRewriteRule : IRule
Global = global;
}
- public virtual void ApplyRule(RewriteContext context)
+ public void ApplyRule(RewriteContext context)
{
// Due to the path string always having a leading slash,
// remove it from the path before regex comparison
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/InputParser.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/InputParser.cs
index 1679fa839e..b77c5d2ab5 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/InputParser.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/InputParser.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.PatternSegments;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class InputParser
+internal sealed class InputParser
{
private const char Colon = ':';
private const char OpenBrace = '{';
@@ -124,7 +124,14 @@ internal class InputParser
}
case "UrlDecode":
{
- throw new NotImplementedException("UrlDecode is not implemented because of no great library available");
+ var pattern = ParseString(context, uriMatchPart);
+ results.Add(new UrlDecodeSegment(pattern));
+
+ if (context.Current != CloseBrace)
+ {
+ throw new FormatException(Resources.FormatError_InputParserMissingCloseBrace(context.Index));
+ }
+ return;
}
case "UrlEncode":
{
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/InvalidUrlRewriteFormatException.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/InvalidUrlRewriteFormatException.cs
index ebfba998b6..731da5b76c 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/InvalidUrlRewriteFormatException.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/InvalidUrlRewriteFormatException.cs
@@ -6,7 +6,7 @@ using System.Xml.Linq;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class InvalidUrlRewriteFormatException : FormatException
+internal sealed class InvalidUrlRewriteFormatException : FormatException
{
public int LineNumber { get; }
public int LinePosition { get; }
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/UriMatchCondition.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/UriMatchCondition.cs
index ce6f8f52d3..ba7b438f0e 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/UriMatchCondition.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/UriMatchCondition.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.UrlMatches;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class UriMatchCondition : Condition
+internal sealed class UriMatchCondition : Condition
{
private static readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteFileParser.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteFileParser.cs
index 8d363f5f62..b2509109c7 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteFileParser.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteFileParser.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Rewrite.UrlMatches;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class UrlRewriteFileParser
+internal sealed class UrlRewriteFileParser
{
private InputParser _inputParser = default!;
diff --git a/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteRuleBuilder.cs b/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteRuleBuilder.cs
index e34cb31f42..ca7aa3a99d 100644
--- a/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteRuleBuilder.cs
+++ b/src/Middleware/Rewrite/src/IISUrlRewrite/UrlRewriteRuleBuilder.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.UrlMatches;
namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
-internal class UrlRewriteRuleBuilder
+internal sealed class UrlRewriteRuleBuilder
{
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
diff --git a/src/Middleware/Rewrite/src/MatchResults.cs b/src/Middleware/Rewrite/src/MatchResults.cs
index 6b63fdd167..e349986d50 100644
--- a/src/Middleware/Rewrite/src/MatchResults.cs
+++ b/src/Middleware/Rewrite/src/MatchResults.cs
@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.Rewrite;
-internal class MatchResults
+internal sealed class MatchResults
{
public static readonly MatchResults EmptySuccess = new MatchResults(success: true);
public static readonly MatchResults EmptyFailure = new MatchResults(success: false);
diff --git a/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj b/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj
index f2d2f22330..8150ba5cfd 100644
--- a/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj
+++ b/src/Middleware/Rewrite/src/Microsoft.AspNetCore.Rewrite.csproj
@@ -10,7 +10,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;urlrewrite;mod_rewrite</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
@@ -23,4 +23,8 @@
<Reference Include="Microsoft.AspNetCore.Routing" />
</ItemGroup>
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)Reroute.cs" />
+ </ItemGroup>
+
</Project>
diff --git a/src/Middleware/Rewrite/src/ParserContext.cs b/src/Middleware/Rewrite/src/ParserContext.cs
index 6444abdcb5..1ce1d200c3 100644
--- a/src/Middleware/Rewrite/src/ParserContext.cs
+++ b/src/Middleware/Rewrite/src/ParserContext.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Rewrite;
/// <summary>
/// Represents a string iterator, with captures.
/// </summary>
-internal class ParserContext
+internal sealed class ParserContext
{
public readonly string Template;
public int Index { get; set; }
diff --git a/src/Middleware/Rewrite/src/Pattern.cs b/src/Middleware/Rewrite/src/Pattern.cs
index adb394d2e8..a063939144 100644
--- a/src/Middleware/Rewrite/src/Pattern.cs
+++ b/src/Middleware/Rewrite/src/Pattern.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite;
-internal class Pattern
+internal sealed class Pattern
{
public IList<PatternSegment> PatternSegments { get; }
public Pattern(IList<PatternSegment> patternSegments)
diff --git a/src/Middleware/Rewrite/src/PatternSegments/ConditionMatchSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/ConditionMatchSegment.cs
index b40a7abeb2..8f9d6a90c5 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/ConditionMatchSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/ConditionMatchSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class ConditionMatchSegment : PatternSegment
+internal sealed class ConditionMatchSegment : PatternSegment
{
private readonly int _index;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/DateTimeSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/DateTimeSegment.cs
index b1284b5105..880eacc9eb 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/DateTimeSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/DateTimeSegment.cs
@@ -5,7 +5,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class DateTimeSegment : PatternSegment
+internal sealed class DateTimeSegment : PatternSegment
{
private readonly DateTimePortion _portion;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/HeaderSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/HeaderSegment.cs
index c15ea10e9a..0444eb8d03 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/HeaderSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/HeaderSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class HeaderSegment : PatternSegment
+internal sealed class HeaderSegment : PatternSegment
{
private readonly string _header;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/IISServerVariableSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/IISServerVariableSegment.cs
index b4023d1e48..4c1969f96e 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/IISServerVariableSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/IISServerVariableSegment.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class IISServerVariableSegment : PatternSegment
+internal sealed class IISServerVariableSegment : PatternSegment
{
private readonly string _variableName;
private readonly Func<PatternSegment> _fallbackThunk;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/IsHttpsModSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/IsHttpsModSegment.cs
index 80749069b1..6212289141 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/IsHttpsModSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/IsHttpsModSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class IsHttpsModSegment : PatternSegment
+internal sealed class IsHttpsModSegment : PatternSegment
{
// Note: Mod rewrite pattern matches on lower case "on" and "off"
// while IIS looks for capitalized "ON" and "OFF"
diff --git a/src/Middleware/Rewrite/src/PatternSegments/IsHttpsUrlSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/IsHttpsUrlSegment.cs
index 475c1a347a..0fc9ddb746 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/IsHttpsUrlSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/IsHttpsUrlSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class IsHttpsUrlSegment : PatternSegment
+internal sealed class IsHttpsUrlSegment : PatternSegment
{
// Note: Mod rewrite pattern matches on lower case "on" and "off"
// while IIS looks for capitalized "ON" and "OFF"
diff --git a/src/Middleware/Rewrite/src/PatternSegments/IsIPV6Segment.cs b/src/Middleware/Rewrite/src/PatternSegments/IsIPV6Segment.cs
index b290ad46bc..3a184b2715 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/IsIPV6Segment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/IsIPV6Segment.cs
@@ -5,7 +5,7 @@ using System.Net.Sockets;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class IsIPV6Segment : PatternSegment
+internal sealed class IsIPV6Segment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/LiteralSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/LiteralSegment.cs
index 5d5d2181cf..4a853e1bb5 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/LiteralSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/LiteralSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class LiteralSegment : PatternSegment
+internal sealed class LiteralSegment : PatternSegment
{
private readonly string _literal;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/LocalAddressSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/LocalAddressSegment.cs
index e2cfb319d3..6153a45b04 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/LocalAddressSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/LocalAddressSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class LocalAddressSegment : PatternSegment
+internal sealed class LocalAddressSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/LocalPortSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/LocalPortSegment.cs
index 147bb66bb6..28519df830 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/LocalPortSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/LocalPortSegment.cs
@@ -5,7 +5,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class LocalPortSegment : PatternSegment
+internal sealed class LocalPortSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/QueryStringSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/QueryStringSegment.cs
index 6502df947c..b740f9995a 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/QueryStringSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/QueryStringSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class QueryStringSegment : PatternSegment
+internal sealed class QueryStringSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackRefernces, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/RemoteAddressSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/RemoteAddressSegment.cs
index 034eb38136..14ba50ba2e 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/RemoteAddressSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/RemoteAddressSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class RemoteAddressSegment : PatternSegment
+internal sealed class RemoteAddressSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/RemotePortSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/RemotePortSegment.cs
index 7110d23f0e..819b77f65f 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/RemotePortSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/RemotePortSegment.cs
@@ -5,7 +5,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class RemotePortSegment : PatternSegment
+internal sealed class RemotePortSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/RequestFilenameSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/RequestFilenameSegment.cs
index 91258a0fd3..48b7b3df99 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/RequestFilenameSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/RequestFilenameSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class RequestFileNameSegment : PatternSegment
+internal sealed class RequestFileNameSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/RequestMethodSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/RequestMethodSegment.cs
index 1443a21584..5d6f78515e 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/RequestMethodSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/RequestMethodSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class RequestMethodSegment : PatternSegment
+internal sealed class RequestMethodSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/RewriteMapSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/RewriteMapSegment.cs
index 1eb511b3cc..b98be41adb 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/RewriteMapSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/RewriteMapSegment.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class RewriteMapSegment : PatternSegment
+internal sealed class RewriteMapSegment : PatternSegment
{
private readonly IISRewriteMap _rewriteMap;
private readonly Pattern _pattern;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/RuleMatchSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/RuleMatchSegment.cs
index a3d698e65e..5063930296 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/RuleMatchSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/RuleMatchSegment.cs
@@ -5,7 +5,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class RuleMatchSegment : PatternSegment
+internal sealed class RuleMatchSegment : PatternSegment
{
private readonly int _index;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/SchemeSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/SchemeSegment.cs
index 458381c6d1..284ab0cf6c 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/SchemeSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/SchemeSegment.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class SchemeSegment : PatternSegment
+internal sealed class SchemeSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/ServerProtocolSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/ServerProtocolSegment.cs
index d45e184af8..19268f090d 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/ServerProtocolSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/ServerProtocolSegment.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class ServerProtocolSegment : PatternSegment
+internal sealed class ServerProtocolSegment : PatternSegment
{
public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/PatternSegments/ToLowerSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/ToLowerSegment.cs
index 0972500864..92fcddfd25 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/ToLowerSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/ToLowerSegment.cs
@@ -5,7 +5,7 @@ using System.Text;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class ToLowerSegment : PatternSegment
+internal sealed class ToLowerSegment : PatternSegment
{
private readonly Pattern _pattern;
diff --git a/src/Middleware/Rewrite/src/PatternSegments/UrlDecodeSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/UrlDecodeSegment.cs
new file mode 100644
index 0000000000..2522bb85c5
--- /dev/null
+++ b/src/Middleware/Rewrite/src/PatternSegments/UrlDecodeSegment.cs
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text;
+
+namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
+
+internal sealed class UrlDecodeSegment: PatternSegment
+{
+ private readonly Pattern _pattern;
+
+ public UrlDecodeSegment(Pattern pattern)
+ {
+ _pattern = pattern;
+ }
+
+ public override string? Evaluate(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
+ {
+ var oldBuilder = context.Builder;
+ // PERF
+ // Because we need to be able to evaluate multiple nested patterns,
+ // we provided a new string builder and evaluate the new pattern,
+ // and restore it after evaluation.
+ context.Builder = new StringBuilder(64);
+ var pattern = _pattern.Evaluate(context, ruleBackReferences, conditionBackReferences);
+ context.Builder = oldBuilder;
+ return Uri.UnescapeDataString(pattern);
+ }
+}
diff --git a/src/Middleware/Rewrite/src/PatternSegments/UrlEncodeSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/UrlEncodeSegment.cs
index 291d3d401f..30ecc19a98 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/UrlEncodeSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/UrlEncodeSegment.cs
@@ -2,11 +2,10 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text;
-using System.Text.Encodings.Web;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class UrlEncodeSegment : PatternSegment
+internal sealed class UrlEncodeSegment : PatternSegment
{
private readonly Pattern _pattern;
@@ -25,6 +24,6 @@ internal class UrlEncodeSegment : PatternSegment
context.Builder = new StringBuilder(64);
var pattern = _pattern.Evaluate(context, ruleBackReferences, conditionBackReferences);
context.Builder = oldBuilder;
- return UrlEncoder.Default.Encode(pattern);
+ return Uri.EscapeDataString(pattern);
}
}
diff --git a/src/Middleware/Rewrite/src/PatternSegments/UrlSegment.cs b/src/Middleware/Rewrite/src/PatternSegments/UrlSegment.cs
index 40aecdf696..fa0a0bd692 100644
--- a/src/Middleware/Rewrite/src/PatternSegments/UrlSegment.cs
+++ b/src/Middleware/Rewrite/src/PatternSegments/UrlSegment.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
namespace Microsoft.AspNetCore.Rewrite.PatternSegments;
-internal class UrlSegment : PatternSegment
+internal sealed class UrlSegment : PatternSegment
{
private readonly UriMatchPart _uriMatchPart;
diff --git a/src/Middleware/Rewrite/src/PublicAPI.Shipped.txt b/src/Middleware/Rewrite/src/PublicAPI.Shipped.txt
index b53e15e07b..e882a98db7 100644
--- a/src/Middleware/Rewrite/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Rewrite/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Rewrite.RewriteMiddleware.RewriteMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Rewrite.RewriteOptions!>! options) -> void
+Microsoft.AspNetCore.Rewrite.RewriteMiddleware.RewriteMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Rewrite.RewriteOptions!>! options) -> void
Microsoft.AspNetCore.Builder.RewriteBuilderExtensions
Microsoft.AspNetCore.Rewrite.ApacheModRewriteOptionsExtensions
Microsoft.AspNetCore.Rewrite.IISUrlRewriteOptionsExtensions
diff --git a/src/Middleware/Rewrite/src/PublicAPI.Unshipped.txt b/src/Middleware/Rewrite/src/PublicAPI.Unshipped.txt
index 5d8be129f2..7dc5c58110 100644
--- a/src/Middleware/Rewrite/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/Rewrite/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Rewrite.RewriteMiddleware.RewriteMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Rewrite.RewriteOptions!>! options) -> void
-Microsoft.AspNetCore.Rewrite.RewriteMiddleware.RewriteMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnvironment, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Rewrite.RewriteOptions!>! options) -> void \ No newline at end of file
diff --git a/src/Middleware/Rewrite/src/RedirectRule.cs b/src/Middleware/Rewrite/src/RedirectRule.cs
index 52746859b9..912392e5d3 100644
--- a/src/Middleware/Rewrite/src/RedirectRule.cs
+++ b/src/Middleware/Rewrite/src/RedirectRule.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite;
-internal class RedirectRule : IRule
+internal sealed class RedirectRule : IRule
{
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
public Regex InitialMatch { get; }
@@ -31,7 +31,7 @@ internal class RedirectRule : IRule
StatusCode = statusCode;
}
- public virtual void ApplyRule(RewriteContext context)
+ public void ApplyRule(RewriteContext context)
{
var request = context.HttpContext.Request;
var path = request.Path;
@@ -65,8 +65,10 @@ internal class RedirectRule : IRule
{
var host = default(HostString);
var schemeSplit = newPath.IndexOf(Uri.SchemeDelimiter, StringComparison.Ordinal);
+ string scheme = request.Scheme;
if (schemeSplit >= 0)
{
+ scheme = newPath.Substring(0, schemeSplit);
schemeSplit += Uri.SchemeDelimiter.Length;
var pathSplit = newPath.IndexOf('/', schemeSplit);
@@ -97,7 +99,7 @@ internal class RedirectRule : IRule
}
encodedPath = host.HasValue
- ? UriHelper.BuildAbsolute(request.Scheme, host, pathBase, resolvedPath, resolvedQuery, default)
+ ? UriHelper.BuildAbsolute(scheme, host, pathBase, resolvedPath, resolvedQuery, default)
: UriHelper.BuildRelative(pathBase, resolvedPath, resolvedQuery, default);
}
diff --git a/src/Middleware/Rewrite/src/RedirectToHttpsRule.cs b/src/Middleware/Rewrite/src/RedirectToHttpsRule.cs
index c84d68fd7c..6dbaee5a7e 100644
--- a/src/Middleware/Rewrite/src/RedirectToHttpsRule.cs
+++ b/src/Middleware/Rewrite/src/RedirectToHttpsRule.cs
@@ -7,12 +7,12 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite;
-internal class RedirectToHttpsRule : IRule
+internal sealed class RedirectToHttpsRule : IRule
{
public int? SSLPort { get; set; }
public int StatusCode { get; set; }
- public virtual void ApplyRule(RewriteContext context)
+ public void ApplyRule(RewriteContext context)
{
if (!context.HttpContext.Request.IsHttps)
{
diff --git a/src/Middleware/Rewrite/src/RedirectToNonWwwRule.cs b/src/Middleware/Rewrite/src/RedirectToNonWwwRule.cs
index dc804edc0f..471b94b2a1 100644
--- a/src/Middleware/Rewrite/src/RedirectToNonWwwRule.cs
+++ b/src/Middleware/Rewrite/src/RedirectToNonWwwRule.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite;
-internal class RedirectToNonWwwRule : IRule
+internal sealed class RedirectToNonWwwRule : IRule
{
private const string WwwDot = "www.";
diff --git a/src/Middleware/Rewrite/src/RedirectToWwwRule.cs b/src/Middleware/Rewrite/src/RedirectToWwwRule.cs
index eb241fd76d..de333ec9a7 100644
--- a/src/Middleware/Rewrite/src/RedirectToWwwRule.cs
+++ b/src/Middleware/Rewrite/src/RedirectToWwwRule.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite;
-internal class RedirectToWwwRule : IRule
+internal sealed class RedirectToWwwRule : IRule
{
private const string WwwDot = "www.";
diff --git a/src/Middleware/Rewrite/src/RewriteBuilderExtensions.cs b/src/Middleware/Rewrite/src/RewriteBuilderExtensions.cs
index 1902bfbc42..f56d7ee850 100644
--- a/src/Middleware/Rewrite/src/RewriteBuilderExtensions.cs
+++ b/src/Middleware/Rewrite/src/RewriteBuilderExtensions.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Rewrite;
+using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -53,9 +54,8 @@ public static class RewriteBuilderExtensions
private static IApplicationBuilder AddRewriteMiddleware(IApplicationBuilder app, IOptions<RewriteOptions>? options)
{
- const string globalRouteBuilderKey = "__GlobalEndpointRouteBuilder";
// Only use this path if there's a global router (in the 'WebApplication' case).
- if (app.Properties.TryGetValue(globalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
+ if (app.Properties.TryGetValue(RerouteHelper.GlobalRouteBuilderKey, out var routeBuilder) && routeBuilder is not null)
{
return app.Use(next =>
{
@@ -67,15 +67,8 @@ public static class RewriteBuilderExtensions
var webHostEnv = app.ApplicationServices.GetRequiredService<IWebHostEnvironment>();
var loggerFactory = app.ApplicationServices.GetRequiredService<ILoggerFactory>();
- // start a new middleware pipeline
- var builder = app.New();
- // use the old routing pipeline if it exists so we preserve all the routes and matching logic
- // ((IApplicationBuilder)WebApplication).New() does not copy globalRouteBuilderKey automatically like it does for all other properties.
- builder.Properties[globalRouteBuilderKey] = routeBuilder;
- builder.UseRouting();
- // apply the next middleware
- builder.Run(next);
- options.Value.BranchedNext = builder.Build();
+ var newNext = RerouteHelper.Reroute(app, routeBuilder, next);
+ options.Value.BranchedNext = newNext;
return new RewriteMiddleware(next, webHostEnv, loggerFactory, options).Invoke;
});
diff --git a/src/Middleware/Rewrite/src/RewriteRule.cs b/src/Middleware/Rewrite/src/RewriteRule.cs
index c99db5cd3b..73bc0344d3 100644
--- a/src/Middleware/Rewrite/src/RewriteRule.cs
+++ b/src/Middleware/Rewrite/src/RewriteRule.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite;
-internal class RewriteRule : IRule
+internal sealed class RewriteRule : IRule
{
private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1);
public Regex InitialMatch { get; }
@@ -31,7 +31,7 @@ internal class RewriteRule : IRule
StopProcessing = stopProcessing;
}
- public virtual void ApplyRule(RewriteContext context)
+ public void ApplyRule(RewriteContext context)
{
var path = context.HttpContext.Request.Path;
Match initMatchResults;
diff --git a/src/Middleware/Rewrite/src/UrlActions/AbortAction.cs b/src/Middleware/Rewrite/src/UrlActions/AbortAction.cs
index 56261c97d4..eae8f18716 100644
--- a/src/Middleware/Rewrite/src/UrlActions/AbortAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/AbortAction.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class AbortAction : UrlAction
+internal sealed class AbortAction : UrlAction
{
public override void ApplyAction(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/UrlActions/ChangeCookieAction.cs b/src/Middleware/Rewrite/src/UrlActions/ChangeCookieAction.cs
index ad4e5a944f..a9d96d9c2b 100644
--- a/src/Middleware/Rewrite/src/UrlActions/ChangeCookieAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/ChangeCookieAction.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class ChangeCookieAction : UrlAction
+internal sealed class ChangeCookieAction : UrlAction
{
private readonly Func<DateTimeOffset> _timeSource;
private CookieOptions? _cachedOptions;
diff --git a/src/Middleware/Rewrite/src/UrlActions/CustomResponseAction.cs b/src/Middleware/Rewrite/src/UrlActions/CustomResponseAction.cs
index 7cb4a66299..4c29d034ae 100644
--- a/src/Middleware/Rewrite/src/UrlActions/CustomResponseAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/CustomResponseAction.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Rewrite.Logging;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class CustomResponseAction : UrlAction
+internal sealed class CustomResponseAction : UrlAction
{
public int StatusCode { get; }
public string? StatusReason { get; set; }
diff --git a/src/Middleware/Rewrite/src/UrlActions/ForbiddenAction.cs b/src/Middleware/Rewrite/src/UrlActions/ForbiddenAction.cs
index 64bfd7a8b6..9984cc931d 100644
--- a/src/Middleware/Rewrite/src/UrlActions/ForbiddenAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/ForbiddenAction.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class ForbiddenAction : UrlAction
+internal sealed class ForbiddenAction : UrlAction
{
public override void ApplyAction(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/UrlActions/GoneAction.cs b/src/Middleware/Rewrite/src/UrlActions/GoneAction.cs
index ad16fea6cd..fd947ae01f 100644
--- a/src/Middleware/Rewrite/src/UrlActions/GoneAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/GoneAction.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class GoneAction : UrlAction
+internal sealed class GoneAction : UrlAction
{
public override void ApplyAction(RewriteContext context, BackReferenceCollection? ruleBackReferences, BackReferenceCollection? conditionBackReferences)
{
diff --git a/src/Middleware/Rewrite/src/UrlActions/NoneAction.cs b/src/Middleware/Rewrite/src/UrlActions/NoneAction.cs
index 4623cd9ef8..8ffec63417 100644
--- a/src/Middleware/Rewrite/src/UrlActions/NoneAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/NoneAction.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class NoneAction : UrlAction
+internal sealed class NoneAction : UrlAction
{
public RuleResult Result { get; }
diff --git a/src/Middleware/Rewrite/src/UrlActions/RedirectAction.cs b/src/Middleware/Rewrite/src/UrlActions/RedirectAction.cs
index 7a7c157849..f2e3437855 100644
--- a/src/Middleware/Rewrite/src/UrlActions/RedirectAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/RedirectAction.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class RedirectAction : UrlAction
+internal sealed class RedirectAction : UrlAction
{
public int StatusCode { get; }
public bool QueryStringAppend { get; }
diff --git a/src/Middleware/Rewrite/src/UrlActions/RewriteAction.cs b/src/Middleware/Rewrite/src/UrlActions/RewriteAction.cs
index a3f5d74727..8fa0f5bbca 100644
--- a/src/Middleware/Rewrite/src/UrlActions/RewriteAction.cs
+++ b/src/Middleware/Rewrite/src/UrlActions/RewriteAction.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Http.Extensions;
namespace Microsoft.AspNetCore.Rewrite.UrlActions;
-internal class RewriteAction : UrlAction
+internal sealed class RewriteAction : UrlAction
{
public RuleResult Result { get; }
public bool QueryStringAppend { get; }
diff --git a/src/Middleware/Rewrite/src/UrlMatches/ExactMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/ExactMatch.cs
index 43f181c3ef..75eb598393 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/ExactMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/ExactMatch.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class ExactMatch : UrlMatch
+internal sealed class ExactMatch : UrlMatch
{
private readonly bool _ignoreCase;
private readonly string _stringMatch;
diff --git a/src/Middleware/Rewrite/src/UrlMatches/FileSizeMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/FileSizeMatch.cs
index cefd240b04..f494fee8f2 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/FileSizeMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/FileSizeMatch.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class FileSizeMatch : UrlMatch
+internal sealed class FileSizeMatch : UrlMatch
{
public FileSizeMatch(bool negate)
{
diff --git a/src/Middleware/Rewrite/src/UrlMatches/IntegerMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/IntegerMatch.cs
index 383ef15b39..a6acb2940b 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/IntegerMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/IntegerMatch.cs
@@ -6,7 +6,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class IntegerMatch : UrlMatch
+internal sealed class IntegerMatch : UrlMatch
{
private readonly int _value;
private readonly IntegerOperationType _operation;
diff --git a/src/Middleware/Rewrite/src/UrlMatches/IsDirectoryMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/IsDirectoryMatch.cs
index 4c8c3e1422..f191375504 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/IsDirectoryMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/IsDirectoryMatch.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class IsDirectoryMatch : UrlMatch
+internal sealed class IsDirectoryMatch : UrlMatch
{
public IsDirectoryMatch(bool negate)
{
diff --git a/src/Middleware/Rewrite/src/UrlMatches/IsFileMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/IsFileMatch.cs
index efd3848692..89b7880863 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/IsFileMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/IsFileMatch.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class IsFileMatch : UrlMatch
+internal sealed class IsFileMatch : UrlMatch
{
public IsFileMatch(bool negate)
{
diff --git a/src/Middleware/Rewrite/src/UrlMatches/RegexMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/RegexMatch.cs
index 3daf2fae01..4a5f71e669 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/RegexMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/RegexMatch.cs
@@ -5,7 +5,7 @@ using System.Text.RegularExpressions;
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class RegexMatch : UrlMatch
+internal sealed class RegexMatch : UrlMatch
{
private readonly Regex _match;
diff --git a/src/Middleware/Rewrite/src/UrlMatches/StringMatch.cs b/src/Middleware/Rewrite/src/UrlMatches/StringMatch.cs
index 1fa02adb21..0947bc0482 100644
--- a/src/Middleware/Rewrite/src/UrlMatches/StringMatch.cs
+++ b/src/Middleware/Rewrite/src/UrlMatches/StringMatch.cs
@@ -5,7 +5,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Rewrite.UrlMatches;
-internal class StringMatch : UrlMatch
+internal sealed class StringMatch : UrlMatch
{
private readonly string _value;
private readonly StringOperationType _operation;
diff --git a/src/Middleware/Rewrite/test/IISUrlRewrite/InputParserTests.cs b/src/Middleware/Rewrite/test/IISUrlRewrite/InputParserTests.cs
index 8885424fef..e73666dc1c 100644
--- a/src/Middleware/Rewrite/test/IISUrlRewrite/InputParserTests.cs
+++ b/src/Middleware/Rewrite/test/IISUrlRewrite/InputParserTests.cs
@@ -3,8 +3,10 @@
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Rewrite.IISUrlRewrite;
using Microsoft.AspNetCore.Rewrite.PatternSegments;
+using Microsoft.AspNetCore.Rewrite.Tests.IISUrlRewrite;
using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.Rewrite.Tests.UrlRewrite;
@@ -63,12 +65,41 @@ public class InputParserTests
[Theory]
[InlineData("hey/{UrlEncode:<hey>}", "hey/%3Chey%3E")]
+ [InlineData("hey/?returnUrl={UrlEncode:http://domain.com?query=résumé}", "hey/?returnUrl=http%3A%2F%2Fdomain.com%3Fquery%3Dr%C3%A9sum%C3%A9")]
public void EvaluatUriEncodeRule(string testString, string expected)
{
var middle = new InputParser().ParseInputString(testString, UriMatchPart.Path);
var result = middle.Evaluate(CreateTestRewriteContext(), CreateTestRuleBackReferences(), CreateTestCondBackReferences());
Assert.Equal(expected, result);
}
+ [Theory]
+ [InlineData("hey/{UrlDecode:%3Chey%3E}","hey/<hey>")]
+ [InlineData("{UrlDecode:http%3A%2F%2Fdomain.com%3Fquery%3Dr%C3%A9sum%C3%A9}", "http://domain.com?query=résumé")]
+ public void EvaluateUriDecodeRule(string testString, string expected)
+ {
+ var middle = new InputParser().ParseInputString(testString, UriMatchPart.Path);
+ var result = middle.Evaluate(CreateTestRewriteContext(), CreateTestRuleBackReferences(), CreateTestCondBackReferences());
+ Assert.Equal(expected, result);
+ }
+
+ [Theory]
+ [InlineData("hey/{HTTP_URL}","hey/TEST_VARIABLE")]
+ public void ParseString_WithContextContainingServerVariableString_ShouldReturnResultContainingValueOfVariable(string testString, string expected)
+ {
+ var variablesDict = new Dictionary<string, string>()
+ {
+ { "HTTP_URL", "TEST_VARIABLE"}
+ };
+ var features = new FeatureCollection(1);
+ features.Set<IServerVariablesFeature>(new TestServerVariablesFeature(variablesDict));
+
+ var rewriteContext= new RewriteContext { HttpContext = new DefaultHttpContext(features), StaticFileProvider = null, Logger = NullLogger.Instance };
+
+ var middle = new InputParser().ParseInputString(testString, UriMatchPart.Path);
+ var result = middle.Evaluate(rewriteContext, CreateTestRuleBackReferences(), CreateTestCondBackReferences());
+
+ Assert.Equal(expected, result);
+ }
[Theory]
[InlineData("{")]
diff --git a/src/Middleware/Rewrite/test/MiddlewareTests.cs b/src/Middleware/Rewrite/test/MiddlewareTests.cs
index 66601b2366..b6078a1c5a 100644
--- a/src/Middleware/Rewrite/test/MiddlewareTests.cs
+++ b/src/Middleware/Rewrite/test/MiddlewareTests.cs
@@ -329,6 +329,36 @@ public class MiddlewareTests
Assert.Equal("https://" + expectedHostPathAndQuery, response.Headers.Location.OriginalString);
}
+ [Theory]
+ [InlineData("http://example.com/test", "http://www.example.com/")]
+ [InlineData("http://example.com/test", "https://www.example.com/")]
+ [InlineData("https://example.com/test", "http://www.example.com/")]
+ [InlineData("https://example.com/test", "https://www.example.com/")]
+ public async Task CheckRedirectUsesConfiguredScheme(string hostSchemePathAndQuery, string redirectReplacement)
+ {
+ var options = new RewriteOptions().AddRedirect("test", redirectReplacement);
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseTestServer()
+ .Configure(app =>
+ {
+ app.UseRewriter(options);
+ });
+ }).Build();
+
+ await host.StartAsync();
+
+ var server = host.GetTestServer();
+ server.BaseAddress = new Uri("http://example.com");
+ var response = await server.CreateClient().GetAsync(new Uri(hostSchemePathAndQuery));
+
+ // Regardless of whether we GET with http or https, the redirect should honor
+ // the scheme specified in the configuration.
+ Assert.Equal(redirectReplacement, response.Headers.Location.OriginalString);
+ }
+
[Fact]
public async Task CheckPermanentRedirectToHttps()
{
@@ -638,7 +668,7 @@ public class MiddlewareTests
var response = await server.CreateClient().GetStringAsync("foo");
- Assert.Equal("/foo HTTP: GET from /foos", response);
+ Assert.Equal("HTTP: GET /foo from /foos", response);
}
[Fact]
diff --git a/src/Middleware/Rewrite/test/PatternSegments/UrlDecodeSegmentTests.cs b/src/Middleware/Rewrite/test/PatternSegments/UrlDecodeSegmentTests.cs
new file mode 100644
index 0000000000..2eb1d2b5c6
--- /dev/null
+++ b/src/Middleware/Rewrite/test/PatternSegments/UrlDecodeSegmentTests.cs
@@ -0,0 +1,28 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Rewrite.PatternSegments;
+
+namespace Microsoft.AspNetCore.Rewrite.Tests.PatternSegments;
+
+public class UrlDecodeSegmentTests
+{
+ [Theory]
+ [InlineData("%20", " ")]
+ [InlineData("x%26y", "x&y")]
+ [InlineData("hey", "hey")]
+ public void FromLower_AssertLowerCaseWorksAppropriately(string input, string expected)
+ {
+ // Arrange
+ var pattern = new Pattern(new List<PatternSegment>());
+ pattern.PatternSegments.Add(new LiteralSegment(input));
+ var segement = new UrlDecodeSegment(pattern);
+ var context = new RewriteContext();
+
+ // Act
+ var results = segement.Evaluate(context, null, null);
+
+ // Assert
+ Assert.Equal(expected, results);
+ }
+}
diff --git a/src/Middleware/Session/src/DistributedSession.cs b/src/Middleware/Session/src/DistributedSession.cs
index 1795694963..5b538be20b 100644
--- a/src/Middleware/Session/src/DistributedSession.cs
+++ b/src/Middleware/Session/src/DistributedSession.cs
@@ -262,12 +262,6 @@ public class DistributedSession : ISession
/// <inheritdoc />
public async Task CommitAsync(CancellationToken cancellationToken = default)
{
- if (!IsAvailable)
- {
- _logger.SessionNotAvailable();
- return;
- }
-
using (var timeout = new CancellationTokenSource(_ioTimeout))
{
var cts = CancellationTokenSource.CreateLinkedTokenSource(timeout.Token, cancellationToken);
diff --git a/src/Middleware/Session/src/EncodedKey.cs b/src/Middleware/Session/src/EncodedKey.cs
index 60d930fad3..7f9d0268ba 100644
--- a/src/Middleware/Session/src/EncodedKey.cs
+++ b/src/Middleware/Session/src/EncodedKey.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Session;
// Keys are stored in their utf-8 encoded state.
// This saves us from de-serializing and re-serializing every key on every request.
-internal class EncodedKey
+internal sealed class EncodedKey
{
private string? _keyString;
private int? _hashCode;
diff --git a/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj b/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj
index e051bef8b0..8d1d60b659 100644
--- a/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj
+++ b/src/Middleware/Session/src/Microsoft.AspNetCore.Session.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;session;sessionstate</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/Session/src/NoOpSessionStore.cs b/src/Middleware/Session/src/NoOpSessionStore.cs
index 76d5e9cd7b..dd6e339f91 100644
--- a/src/Middleware/Session/src/NoOpSessionStore.cs
+++ b/src/Middleware/Session/src/NoOpSessionStore.cs
@@ -7,7 +7,7 @@ using System.Linq;
namespace Microsoft.AspNetCore.Session;
-internal class NoOpSessionStore : IDistributedSessionStore
+internal sealed class NoOpSessionStore : IDistributedSessionStore
{
public void SetValue(EncodedKey key, byte[] value)
{
diff --git a/src/Middleware/Session/src/PublicAPI.Shipped.txt b/src/Middleware/Session/src/PublicAPI.Shipped.txt
index 7bf3ea0926..74958723ea 100644
--- a/src/Middleware/Session/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/Session/src/PublicAPI.Shipped.txt
@@ -1,6 +1,4 @@
#nullable enable
-~Microsoft.AspNetCore.Builder.SessionOptions.Cookie.get -> Microsoft.AspNetCore.Http.CookieBuilder
-~Microsoft.AspNetCore.Builder.SessionOptions.Cookie.set -> void
~Microsoft.AspNetCore.Session.DistributedSession.CommitAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.Session.DistributedSession.DistributedSession(Microsoft.Extensions.Caching.Distributed.IDistributedCache cache, string sessionKey, System.TimeSpan idleTimeout, System.TimeSpan ioTimeout, System.Func<bool> tryEstablishSession, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, bool isNewSessionKey) -> void
~Microsoft.AspNetCore.Session.DistributedSession.Id.get -> string
@@ -12,11 +10,8 @@
~Microsoft.AspNetCore.Session.DistributedSessionStore.Create(string sessionKey, System.TimeSpan idleTimeout, System.TimeSpan ioTimeout, System.Func<bool> tryEstablishSession, bool isNewSessionKey) -> Microsoft.AspNetCore.Http.ISession
~Microsoft.AspNetCore.Session.DistributedSessionStore.DistributedSessionStore(Microsoft.Extensions.Caching.Distributed.IDistributedCache cache, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
~Microsoft.AspNetCore.Session.ISessionStore.Create(string sessionKey, System.TimeSpan idleTimeout, System.TimeSpan ioTimeout, System.Func<bool> tryEstablishSession, bool isNewSessionKey) -> Microsoft.AspNetCore.Http.ISession
-~Microsoft.AspNetCore.Session.SessionFeature.Session.get -> Microsoft.AspNetCore.Http.ISession
-~Microsoft.AspNetCore.Session.SessionFeature.Session.set -> void
~Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.Session.SessionMiddleware.SessionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtectionProvider, Microsoft.AspNetCore.Session.ISessionStore sessionStore, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.SessionOptions> options) -> void
-~Microsoft.AspNetCore.Session.SessionMiddleware.SessionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.DataProtection.IDataProtectionProvider! dataProtectionProvider, Microsoft.AspNetCore.Session.ISessionStore! sessionStore, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.SessionOptions!>! options) -> void
+Microsoft.AspNetCore.Session.SessionMiddleware.SessionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.DataProtection.IDataProtectionProvider! dataProtectionProvider, Microsoft.AspNetCore.Session.ISessionStore! sessionStore, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.SessionOptions!>! options) -> void
~static Microsoft.AspNetCore.Builder.SessionMiddlewareExtensions.UseSession(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.SessionMiddlewareExtensions.UseSession(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, Microsoft.AspNetCore.Builder.SessionOptions options) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.Extensions.DependencyInjection.SessionServiceCollectionExtensions.AddSession(this Microsoft.Extensions.DependencyInjection.IServiceCollection services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
diff --git a/src/Middleware/Session/src/PublicAPI.Unshipped.txt b/src/Middleware/Session/src/PublicAPI.Unshipped.txt
index 69345f43d0..7dc5c58110 100644
--- a/src/Middleware/Session/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/Session/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Session.SessionMiddleware.SessionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtectionProvider, Microsoft.AspNetCore.Session.ISessionStore sessionStore, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.SessionOptions> options) -> void
-*REMOVED*~Microsoft.AspNetCore.Session.SessionMiddleware.SessionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.DataProtection.IDataProtectionProvider! dataProtectionProvider, Microsoft.AspNetCore.Session.ISessionStore! sessionStore, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.SessionOptions!>! options) -> void
-Microsoft.AspNetCore.Session.SessionMiddleware.SessionMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.DataProtection.IDataProtectionProvider! dataProtectionProvider, Microsoft.AspNetCore.Session.ISessionStore! sessionStore, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.SessionOptions!>! options) -> void
diff --git a/src/Middleware/Session/src/SessionMiddleware.cs b/src/Middleware/Session/src/SessionMiddleware.cs
index 16c3a33392..a81e36d11d 100644
--- a/src/Middleware/Session/src/SessionMiddleware.cs
+++ b/src/Middleware/Session/src/SessionMiddleware.cs
@@ -85,9 +85,15 @@ public class SessionMiddleware
if (string.IsNullOrWhiteSpace(sessionKey) || sessionKey.Length != SessionKeyLength)
{
// No valid cookie, new session.
- var guidBytes = new byte[16];
- RandomNumberGenerator.Fill(guidBytes);
- sessionKey = new Guid(guidBytes).ToString();
+ sessionKey = GetSessionKey();
+
+ static string GetSessionKey()
+ {
+ Span<byte> guidBytes = stackalloc byte[16];
+ RandomNumberGenerator.Fill(guidBytes);
+ return new Guid(guidBytes).ToString();
+ }
+
cookieValue = CookieProtection.Protect(_dataProtector, sessionKey);
var establisher = new SessionEstablisher(context, cookieValue, _options);
tryEstablishSession = establisher.TryEstablishSession;
@@ -124,7 +130,7 @@ public class SessionMiddleware
}
}
- private class SessionEstablisher
+ private sealed class SessionEstablisher
{
private readonly HttpContext _context;
private readonly string _cookieValue;
diff --git a/src/Middleware/Session/src/SessionOptions.cs b/src/Middleware/Session/src/SessionOptions.cs
index 396f7af01b..99e60cfb54 100644
--- a/src/Middleware/Session/src/SessionOptions.cs
+++ b/src/Middleware/Session/src/SessionOptions.cs
@@ -41,7 +41,7 @@ public class SessionOptions
/// </summary>
public TimeSpan IOTimeout { get; set; } = TimeSpan.FromMinutes(1);
- private class SessionCookieBuilder : CookieBuilder
+ private sealed class SessionCookieBuilder : CookieBuilder
{
public SessionCookieBuilder()
{
diff --git a/src/Middleware/Spa/SpaProxy/src/Microsoft.AspNetCore.SpaProxy.csproj b/src/Middleware/Spa/SpaProxy/src/Microsoft.AspNetCore.SpaProxy.csproj
index 216c4401d0..1807fe067e 100644
--- a/src/Middleware/Spa/SpaProxy/src/Microsoft.AspNetCore.SpaProxy.csproj
+++ b/src/Middleware/Spa/SpaProxy/src/Microsoft.AspNetCore.SpaProxy.csproj
@@ -3,7 +3,7 @@
<PropertyGroup>
<Description>Helpers for launching the SPA CLI proxy automatically when the application starts in ASP.NET MVC Core.</Description>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
<!-- This is ok since this assembly is not referenced by any application but it is loaded as a hosting startup
assembly for apps referencing this package-->
</PropertyGroup>
diff --git a/src/Middleware/Spa/SpaProxy/src/SpaDevelopmentServerOptions.cs b/src/Middleware/Spa/SpaProxy/src/SpaDevelopmentServerOptions.cs
index 477baefe3e..0d97b7b030 100644
--- a/src/Middleware/Spa/SpaProxy/src/SpaDevelopmentServerOptions.cs
+++ b/src/Middleware/Spa/SpaProxy/src/SpaDevelopmentServerOptions.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SpaProxy;
-internal class SpaDevelopmentServerOptions
+internal sealed class SpaDevelopmentServerOptions
{
public string ServerUrl { get; set; } = "";
diff --git a/src/Middleware/Spa/SpaProxy/src/SpaHostingStartup.cs b/src/Middleware/Spa/SpaProxy/src/SpaHostingStartup.cs
index b52b7ceb87..65ea917072 100644
--- a/src/Middleware/Spa/SpaProxy/src/SpaHostingStartup.cs
+++ b/src/Middleware/Spa/SpaProxy/src/SpaHostingStartup.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
@@ -10,7 +11,7 @@ using Microsoft.Extensions.DependencyInjection.Extensions;
namespace Microsoft.AspNetCore.SpaProxy;
-internal class SpaHostingStartup : IHostingStartup
+internal sealed class SpaHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
@@ -24,9 +25,16 @@ internal class SpaHostingStartup : IHostingStartup
.Build();
services.AddSingleton<SpaProxyLaunchManager>();
- services.Configure<SpaDevelopmentServerOptions>(configuration.GetSection("SpaProxyServer"));
+ ConfigureOptions<SpaDevelopmentServerOptions>(services, configuration.GetSection("SpaProxyServer"));
services.TryAddEnumerable(ServiceDescriptor.Singleton<IStartupFilter, SpaProxyStartupFilter>());
}
});
+
+ [UnconditionalSuppressMessageAttribute("Trimming", "IL2026", Justification = "Configuration object's public properties are preserved.")]
+ static void ConfigureOptions<[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicProperties)] T>(IServiceCollection services, IConfigurationSection section)
+ where T : class
+ {
+ services.Configure<T>(section);
+ }
}
}
diff --git a/src/Middleware/Spa/SpaProxy/src/SpaProxyLaunchManager.cs b/src/Middleware/Spa/SpaProxy/src/SpaProxyLaunchManager.cs
index 5a6f30f2b7..9b736cb832 100644
--- a/src/Middleware/Spa/SpaProxy/src/SpaProxyLaunchManager.cs
+++ b/src/Middleware/Spa/SpaProxy/src/SpaProxyLaunchManager.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.SpaProxy;
-internal class SpaProxyLaunchManager : IDisposable
+internal sealed class SpaProxyLaunchManager : IDisposable
{
private readonly SpaDevelopmentServerOptions _options;
private readonly ILogger<SpaProxyLaunchManager> _logger;
@@ -251,7 +251,7 @@ catch
{
var fileName = Guid.NewGuid().ToString("N") + ".sh";
var scriptPath = Path.Combine(AppContext.BaseDirectory, fileName);
- var stopScript = @$"function list_child_processes(){{
+ var stopScript = @$"function list_child_processes () {{
local ppid=$1;
local current_children=$(pgrep -P $ppid);
local local_child;
@@ -282,7 +282,7 @@ do
done;
rm {scriptPath};
";
- File.WriteAllText(scriptPath, stopScript);
+ File.WriteAllText(scriptPath, stopScript.ReplaceLineEndings());
var stopScriptInfo = new ProcessStartInfo("/bin/bash", scriptPath)
{
@@ -305,7 +305,7 @@ rm {scriptPath};
return Task.CompletedTask;
}
- protected virtual void Dispose(bool disposing)
+ private void Dispose(bool disposing)
{
if (!_disposedValue)
{
diff --git a/src/Middleware/Spa/SpaProxy/src/SpaProxyMiddleware.cs b/src/Middleware/Spa/SpaProxy/src/SpaProxyMiddleware.cs
index 8be0e72dcd..de4fb9ec25 100644
--- a/src/Middleware/Spa/SpaProxy/src/SpaProxyMiddleware.cs
+++ b/src/Middleware/Spa/SpaProxy/src/SpaProxyMiddleware.cs
@@ -19,7 +19,7 @@ namespace Microsoft.AspNetCore.SpaProxy;
/// 2) Ensure that the server is up and running quickly instead of waiting for the proxy to be ready to start the
/// server which causes Visual Studio to think the app failed to launch.
/// </summary>
-internal class SpaProxyMiddleware
+internal sealed class SpaProxyMiddleware
{
private readonly RequestDelegate _next;
private readonly SpaProxyLaunchManager _spaProxyLaunchManager;
diff --git a/src/Middleware/Spa/SpaProxy/src/SpaProxyStartupFilter.cs b/src/Middleware/Spa/SpaProxy/src/SpaProxyStartupFilter.cs
index d7a43ea0be..e30df95d66 100644
--- a/src/Middleware/Spa/SpaProxy/src/SpaProxyStartupFilter.cs
+++ b/src/Middleware/Spa/SpaProxy/src/SpaProxyStartupFilter.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Hosting;
namespace Microsoft.AspNetCore.SpaProxy;
-internal class SpaProxyStartupFilter : IStartupFilter
+internal sealed class SpaProxyStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/DefaultSpaBuilder.cs b/src/Middleware/Spa/SpaServices.Extensions/src/DefaultSpaBuilder.cs
index 05865e5662..f95df281bf 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/DefaultSpaBuilder.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/DefaultSpaBuilder.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Builder;
namespace Microsoft.AspNetCore.SpaServices;
-internal class DefaultSpaBuilder : ISpaBuilder
+internal sealed class DefaultSpaBuilder : ISpaBuilder
{
public IApplicationBuilder ApplicationBuilder { get; }
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj b/src/Middleware/Spa/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj
index 3ef37fdba9..0aa83bfa55 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj
@@ -3,7 +3,7 @@
<PropertyGroup>
<Description>Helpers for building single-page applications on ASP.NET MVC Core.</Description>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/Npm/NodeScriptRunner.cs b/src/Middleware/Spa/SpaServices.Extensions/src/Npm/NodeScriptRunner.cs
index 48a6a64844..00abfbb5ed 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/Npm/NodeScriptRunner.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/Npm/NodeScriptRunner.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
using System.Text.RegularExpressions;
using Microsoft.AspNetCore.NodeServices.Util;
using Microsoft.Extensions.Logging;
@@ -13,7 +14,7 @@ namespace Microsoft.AspNetCore.NodeServices.Npm;
/// Executes the <c>script</c> entries defined in a <c>package.json</c> file,
/// capturing any output written to stdio.
/// </summary>
-internal class NodeScriptRunner : IDisposable
+internal sealed class NodeScriptRunner : IDisposable
{
private Process? _npmProcess;
public EventedStreamReader StdOut { get; }
@@ -75,7 +76,8 @@ internal class NodeScriptRunner : IDisposable
if (diagnosticSource.IsEnabled("Microsoft.AspNetCore.NodeServices.Npm.NpmStarted"))
{
- diagnosticSource.Write(
+ WriteDiagnosticEvent(
+ diagnosticSource,
"Microsoft.AspNetCore.NodeServices.Npm.NpmStarted",
new
{
@@ -83,6 +85,11 @@ internal class NodeScriptRunner : IDisposable
process = _npmProcess
});
}
+
+ [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026",
+ Justification = "The values being passed into Write have the commonly used properties being preserved with DynamicDependency.")]
+ static void WriteDiagnosticEvent<TValue>(DiagnosticSource diagnosticSource, string name, TValue value)
+ => diagnosticSource.Write(name, value);
}
public void AttachToLogger(ILogger logger)
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/Proxying/ConditionalProxyMiddleware.cs b/src/Middleware/Spa/SpaServices.Extensions/src/Proxying/ConditionalProxyMiddleware.cs
index 218ffd6dfa..23209975a5 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/Proxying/ConditionalProxyMiddleware.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/Proxying/ConditionalProxyMiddleware.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.SpaServices.Extensions.Proxy;
// the project templates without waiting for 2.1 to ship. When 2.1 is ready to ship,
// merge the additional proxying features (e.g., proxying websocket connections) back
// into the SpaServices proxying code. It's all internal.
-internal class ConditionalProxyMiddleware
+internal sealed class ConditionalProxyMiddleware
{
private readonly RequestDelegate _next;
private readonly Task<Uri> _baseUriTask;
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/SpaDefaultPageMiddleware.cs b/src/Middleware/Spa/SpaServices.Extensions/src/SpaDefaultPageMiddleware.cs
index 084114c15e..4e1af89de1 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/SpaDefaultPageMiddleware.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/SpaDefaultPageMiddleware.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.SpaServices;
-internal class SpaDefaultPageMiddleware
+internal sealed class SpaDefaultPageMiddleware
{
public static void Attach(ISpaBuilder spaBuilder)
{
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/StaticFiles/DefaultSpaStaticFileProvider.cs b/src/Middleware/Spa/SpaServices.Extensions/src/StaticFiles/DefaultSpaStaticFileProvider.cs
index 4b276107a5..3350632e8c 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/StaticFiles/DefaultSpaStaticFileProvider.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/StaticFiles/DefaultSpaStaticFileProvider.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.SpaServices.StaticFiles;
/// Provides an implementation of <see cref="ISpaStaticFileProvider"/> that supplies
/// physical files at a location configured using <see cref="SpaStaticFilesOptions"/>.
/// </summary>
-internal class DefaultSpaStaticFileProvider : ISpaStaticFileProvider
+internal sealed class DefaultSpaStaticFileProvider : ISpaStaticFileProvider
{
private readonly IFileProvider? _fileProvider;
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamReader.cs b/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamReader.cs
index 7c662302c7..393e779af8 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamReader.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamReader.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.NodeServices.Util;
/// Wraps a <see cref="StreamReader"/> to expose an evented API, issuing notifications
/// when the stream emits partial lines, completed lines, or finally closes.
/// </summary>
-internal class EventedStreamReader
+internal sealed class EventedStreamReader
{
public delegate void OnReceivedChunkHandler(ArraySegment<char> chunk);
public delegate void OnReceivedLineHandler(string line);
diff --git a/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamStringReader.cs b/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamStringReader.cs
index ee71beb6e4..cbb49cd963 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamStringReader.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/src/Util/EventedStreamStringReader.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.NodeServices.Util;
/// Captures the completed-line notifications from a <see cref="EventedStreamReader"/>,
/// combining the data into a single <see cref="string"/>.
/// </summary>
-internal class EventedStreamStringReader : IDisposable
+internal sealed class EventedStreamStringReader : IDisposable
{
private readonly EventedStreamReader _eventedStreamReader;
private bool _isDisposed;
diff --git a/src/Middleware/Spa/SpaServices.Extensions/test/.npmrc b/src/Middleware/Spa/SpaServices.Extensions/test/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/Middleware/Spa/SpaServices.Extensions/test/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/Middleware/Spa/SpaServices.Extensions/test/ListLoggerFactory.cs b/src/Middleware/Spa/SpaServices.Extensions/test/ListLoggerFactory.cs
index 10fcca8023..f9188a37d8 100644
--- a/src/Middleware/Spa/SpaServices.Extensions/test/ListLoggerFactory.cs
+++ b/src/Middleware/Spa/SpaServices.Extensions/test/ListLoggerFactory.cs
@@ -46,10 +46,7 @@ public class ListLoggerFactory : ILoggerFactory
private void CheckDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(ListLoggerFactory));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(ListLoggerFactory));
}
public void AddProvider(ILoggerProvider provider)
diff --git a/src/Middleware/StaticFiles/src/DefaultFilesMiddleware.cs b/src/Middleware/StaticFiles/src/DefaultFilesMiddleware.cs
index 678b7606ba..318aacd52e 100644
--- a/src/Middleware/StaticFiles/src/DefaultFilesMiddleware.cs
+++ b/src/Middleware/StaticFiles/src/DefaultFilesMiddleware.cs
@@ -59,7 +59,7 @@ public class DefaultFilesMiddleware
/// <returns></returns>
public Task Invoke(HttpContext context)
{
- if (context.GetEndpoint() == null
+ if (context.GetEndpoint()?.RequestDelegate is null
&& Helpers.IsGetOrHeadMethod(context.Request.Method)
&& Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out var subpath))
{
diff --git a/src/Middleware/StaticFiles/src/DirectoryBrowserMiddleware.cs b/src/Middleware/StaticFiles/src/DirectoryBrowserMiddleware.cs
index b5ea2f5c75..c0929c013b 100644
--- a/src/Middleware/StaticFiles/src/DirectoryBrowserMiddleware.cs
+++ b/src/Middleware/StaticFiles/src/DirectoryBrowserMiddleware.cs
@@ -75,8 +75,8 @@ public class DirectoryBrowserMiddleware
/// <returns></returns>
public Task Invoke(HttpContext context)
{
- // Check if the URL matches any expected paths, skip if an endpoint was selected
- if (context.GetEndpoint() == null
+ // Check if the URL matches any expected paths, skip if an endpoint with a request delegate was selected
+ if (context.GetEndpoint()?.RequestDelegate is null
&& Helpers.IsGetOrHeadMethod(context.Request.Method)
&& Helpers.TryMatchPath(context, _matchUrl, forDirectory: true, subpath: out var subpath)
&& TryGetDirectoryInfo(subpath, out var contents))
diff --git a/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj b/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj
index 7b36e43f67..1b29e10b11 100644
--- a/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj
+++ b/src/Middleware/StaticFiles/src/Microsoft.AspNetCore.StaticFiles.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;staticfiles</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/StaticFiles/src/PublicAPI.Shipped.txt b/src/Middleware/StaticFiles/src/PublicAPI.Shipped.txt
index 6da62a23f1..6a9dd55b8a 100644
--- a/src/Middleware/StaticFiles/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/StaticFiles/src/PublicAPI.Shipped.txt
@@ -1,8 +1,8 @@
#nullable enable
-~Microsoft.AspNetCore.StaticFiles.DefaultFilesMiddleware.DefaultFilesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DefaultFilesOptions!>! options) -> void
-~Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
-~Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, System.Text.Encodings.Web.HtmlEncoder! encoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
-~Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.StaticFileMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StaticFileOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.StaticFiles.DefaultFilesMiddleware.DefaultFilesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DefaultFilesOptions!>! options) -> void
+Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
+Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, System.Text.Encodings.Web.HtmlEncoder! encoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
+Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.StaticFileMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StaticFileOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
Microsoft.AspNetCore.Builder.DefaultFilesExtensions
Microsoft.AspNetCore.Builder.DefaultFilesOptions
Microsoft.AspNetCore.Builder.DefaultFilesOptions.DefaultFileNames.get -> System.Collections.Generic.IList<string!>!
diff --git a/src/Middleware/StaticFiles/src/PublicAPI.Unshipped.txt b/src/Middleware/StaticFiles/src/PublicAPI.Unshipped.txt
index 188127d6f9..7dc5c58110 100644
--- a/src/Middleware/StaticFiles/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/StaticFiles/src/PublicAPI.Unshipped.txt
@@ -1,9 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.StaticFiles.DefaultFilesMiddleware.DefaultFilesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DefaultFilesOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, System.Text.Encodings.Web.HtmlEncoder! encoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.StaticFileMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StaticFileOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.StaticFiles.DefaultFilesMiddleware.DefaultFilesMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DefaultFilesOptions!>! options) -> void
-Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
-Microsoft.AspNetCore.StaticFiles.DirectoryBrowserMiddleware.DirectoryBrowserMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, System.Text.Encodings.Web.HtmlEncoder! encoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.DirectoryBrowserOptions!>! options) -> void
-Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.StaticFileMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Hosting.IWebHostEnvironment! hostingEnv, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.StaticFileOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/Middleware/StaticFiles/src/StaticFileMiddleware.cs b/src/Middleware/StaticFiles/src/StaticFileMiddleware.cs
index abccd7e95d..aa3e44193f 100644
--- a/src/Middleware/StaticFiles/src/StaticFileMiddleware.cs
+++ b/src/Middleware/StaticFiles/src/StaticFileMiddleware.cs
@@ -66,7 +66,7 @@ public class StaticFileMiddleware
/// <returns></returns>
public Task Invoke(HttpContext context)
{
- if (!ValidateNoEndpoint(context))
+ if (!ValidateNoEndpointDelegate(context))
{
_logger.EndpointMatched();
}
@@ -91,8 +91,8 @@ public class StaticFileMiddleware
return _next(context);
}
- // Return true because we only want to run if there is no endpoint.
- private static bool ValidateNoEndpoint(HttpContext context) => context.GetEndpoint() == null;
+ // Return true because we only want to run if there is no endpoint delegate.
+ private static bool ValidateNoEndpointDelegate(HttpContext context) => context.GetEndpoint()?.RequestDelegate is null;
private static bool ValidateMethod(HttpContext context)
{
diff --git a/src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs b/src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs
index e16657aa3d..ca0162e98c 100644
--- a/src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs
+++ b/src/Middleware/StaticFiles/src/StaticFilesEndpointRouteBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.StaticFiles;
@@ -35,6 +36,8 @@ public static class StaticFilesEndpointRouteBuilderExtensions
/// <c>{*path:nonfile}</c>. The order of the registered endpoint will be <c>int.MaxValue</c>.
/// </para>
/// </remarks>
+ [UnconditionalSuppressMessage("Trimmer", "IL2026",
+ Justification = "MapFallbackToFile RequireUnreferencedCode if the RequestDelegate has a Task<T> return type which is not the case here.")]
public static IEndpointConventionBuilder MapFallbackToFile(
this IEndpointRouteBuilder endpoints,
string filePath)
@@ -73,6 +76,8 @@ public static class StaticFilesEndpointRouteBuilderExtensions
/// <c>{*path:nonfile}</c>. The order of the registered endpoint will be <c>int.MaxValue</c>.
/// </para>
/// </remarks>
+ [UnconditionalSuppressMessage("Trimmer", "IL2026",
+ Justification = "MapFallbackToFile RequireUnreferencedCode if the RequestDelegate has a Task<T> return type which is not the case here.")]
public static IEndpointConventionBuilder MapFallbackToFile(
this IEndpointRouteBuilder endpoints,
string filePath,
@@ -118,9 +123,11 @@ public static class StaticFilesEndpointRouteBuilderExtensions
/// to exclude requests for static files.
/// </para>
/// </remarks>
+ [UnconditionalSuppressMessage("Trimmer", "IL2026",
+ Justification = "MapFallbackToFile RequireUnreferencedCode if the RequestDelegate has a Task<T> return type which is not the case here.")]
public static IEndpointConventionBuilder MapFallbackToFile(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
string filePath)
{
if (endpoints == null)
@@ -166,9 +173,11 @@ public static class StaticFilesEndpointRouteBuilderExtensions
/// to exclude requests for static files.
/// </para>
/// </remarks>
+ [UnconditionalSuppressMessage("Trimmer", "IL2026",
+ Justification = "MapFallbackToFile RequireUnreferencedCode if the RequestDelegate has a Task<T> return type which is not the case.")]
public static IEndpointConventionBuilder MapFallbackToFile(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
string filePath,
StaticFileOptions options)
{
diff --git a/src/Middleware/StaticFiles/test/UnitTests/DefaultFilesMiddlewareTests.cs b/src/Middleware/StaticFiles/test/UnitTests/DefaultFilesMiddlewareTests.cs
index 5f65db02a3..5e1ae00792 100644
--- a/src/Middleware/StaticFiles/test/UnitTests/DefaultFilesMiddlewareTests.cs
+++ b/src/Middleware/StaticFiles/test/UnitTests/DefaultFilesMiddlewareTests.cs
@@ -78,7 +78,7 @@ public class DefaultFilesMiddlewareTests
}
[Fact]
- public async Task Endpoint_PassesThrough()
+ public async Task Endpoint_With_RequestDelegate_PassesThrough()
{
using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, ".")))
{
@@ -107,6 +107,9 @@ public class DefaultFilesMiddlewareTests
});
app.UseEndpoints(endpoints => { });
+
+ // Echo back the current request path value
+ app.Run(context => context.Response.WriteAsync(context.Request.Path.Value));
},
services => { services.AddDirectoryBrowser(); services.AddRouting(); });
using var server = host.GetTestServer();
@@ -117,6 +120,48 @@ public class DefaultFilesMiddlewareTests
}
}
+ [Fact]
+ public async Task Endpoint_With_Null_RequestDelegate_Does_Not_PassThrough()
+ {
+ using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, ".")))
+ {
+ using var host = await StaticFilesTestServer.Create(
+ app =>
+ {
+ app.UseRouting();
+
+ app.Use(next => context =>
+ {
+ // Assign an endpoint with a null RequestDelegate, the default files should still run
+ context.SetEndpoint(new Endpoint(requestDelegate: null,
+ new EndpointMetadataCollection(),
+ "test"));
+
+ return next(context);
+ });
+
+ app.UseDefaultFiles(new DefaultFilesOptions
+ {
+ RequestPath = new PathString(""),
+ FileProvider = fileProvider
+ });
+
+ app.UseEndpoints(endpoints => { });
+
+ // Echo back the current request path value
+ app.Run(context => context.Response.WriteAsync(context.Request.Path.Value));
+ },
+ services => { services.AddDirectoryBrowser(); services.AddRouting(); });
+ using var server = host.GetTestServer();
+
+ var response = await server.CreateRequest("/SubFolder/").GetAsync();
+ var responseContent = await response.Content.ReadAsStringAsync();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("/SubFolder/default.html", responseContent); // Should be modified and be valid path to file
+ }
+ }
+
[Theory]
[InlineData("", @".", "/SubFolder/")]
[InlineData("", @"./", "/SubFolder/")]
diff --git a/src/Middleware/StaticFiles/test/UnitTests/DirectoryBrowserMiddlewareTests.cs b/src/Middleware/StaticFiles/test/UnitTests/DirectoryBrowserMiddlewareTests.cs
index d078d26e26..bf3341916b 100644
--- a/src/Middleware/StaticFiles/test/UnitTests/DirectoryBrowserMiddlewareTests.cs
+++ b/src/Middleware/StaticFiles/test/UnitTests/DirectoryBrowserMiddlewareTests.cs
@@ -95,7 +95,7 @@ public class DirectoryBrowserMiddlewareTests
}
[Fact]
- public async Task Endpoint_PassesThrough()
+ public async Task Endpoint_With_RequestDelegate_PassesThrough()
{
using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, ".")))
{
@@ -135,6 +135,45 @@ public class DirectoryBrowserMiddlewareTests
}
}
+ [Fact]
+ public async Task Endpoint_With_Null_RequestDelegate_Does_Not_PassThrough()
+ {
+ using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, ".")))
+ {
+ using var host = await StaticFilesTestServer.Create(
+ app =>
+ {
+ app.UseRouting();
+
+ app.Use(next => context =>
+ {
+ // Assign an endpoint with a null RequestDelegate, the directory browser should still run
+ context.SetEndpoint(new Endpoint(requestDelegate: null,
+ new EndpointMetadataCollection(),
+ "test"));
+
+ return next(context);
+ });
+
+ app.UseDirectoryBrowser(new DirectoryBrowserOptions
+ {
+ RequestPath = new PathString(""),
+ FileProvider = fileProvider
+ });
+
+ app.UseEndpoints(endpoints => { });
+ },
+ services => { services.AddDirectoryBrowser(); services.AddRouting(); });
+ using var server = host.GetTestServer();
+
+ var response = await server.CreateRequest("/").GetAsync();
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("text/html; charset=utf-8", response.Content.Headers.ContentType.ToString());
+ Assert.True(response.Content.Headers.ContentLength > 0);
+ Assert.Equal(response.Content.Headers.ContentLength, (await response.Content.ReadAsByteArrayAsync()).Length);
+ }
+ }
+
[Theory]
[InlineData("", @".", "/")]
[InlineData("", @".", "/SubFolder/")]
diff --git a/src/Middleware/StaticFiles/test/UnitTests/StaticFileMiddlewareTests.cs b/src/Middleware/StaticFiles/test/UnitTests/StaticFileMiddlewareTests.cs
index 0dd5fb8a96..bdb9347a86 100644
--- a/src/Middleware/StaticFiles/test/UnitTests/StaticFileMiddlewareTests.cs
+++ b/src/Middleware/StaticFiles/test/UnitTests/StaticFileMiddlewareTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Globalization;
using System.Net;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
@@ -9,6 +10,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Moq;
@@ -193,6 +195,86 @@ public class StaticFileMiddlewareTests
}
}
+ [Fact]
+ public async Task File_Served_If_Endpoint_With_Null_RequestDelegate_Is_Active()
+ {
+ using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, ".")))
+ {
+ using var host = await StaticFilesTestServer.Create(app =>
+ {
+ app.UseRouting();
+ app.Use((ctx, next) =>
+ {
+ ctx.SetEndpoint(new Endpoint(requestDelegate: null, new EndpointMetadataCollection(), "NullRequestDelegateEndpoint"));
+ return next();
+ });
+ app.UseStaticFiles(new StaticFileOptions
+ {
+ RequestPath = new PathString(),
+ FileProvider = fileProvider
+ });
+ app.UseEndpoints(endpoints => { });
+ }, services => services.AddRouting());
+ using var server = host.GetTestServer();
+ var requestUrl = "/TestDocument.txt";
+ var fileInfo = fileProvider.GetFileInfo(Path.GetFileName(requestUrl));
+ var response = await server.CreateRequest(requestUrl).GetAsync();
+ var responseContent = await response.Content.ReadAsByteArrayAsync();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("text/plain", response.Content.Headers.ContentType.ToString());
+ Assert.True(response.Content.Headers.ContentLength == fileInfo.Length);
+ Assert.Equal(response.Content.Headers.ContentLength, responseContent.Length);
+ Assert.NotNull(response.Headers.ETag);
+
+ using (var stream = fileInfo.CreateReadStream())
+ {
+ var fileContents = new byte[stream.Length];
+ stream.Read(fileContents, 0, (int)stream.Length);
+ Assert.True(responseContent.SequenceEqual(fileContents));
+ }
+ }
+ }
+
+ [Fact]
+ public async Task File_NotServed_If_Endpoint_With_RequestDelegate_Is_Active()
+ {
+ var responseText = DateTime.UtcNow.Ticks.ToString(CultureInfo.InvariantCulture);
+ RequestDelegate handler = async (ctx) =>
+ {
+ ctx.Response.ContentType = "text/customfortest+plain";
+ await ctx.Response.WriteAsync(responseText);
+ };
+
+ using (var fileProvider = new PhysicalFileProvider(Path.Combine(AppContext.BaseDirectory, ".")))
+ {
+ using var host = await StaticFilesTestServer.Create(app =>
+ {
+ app.UseRouting();
+ app.Use((ctx, next) =>
+ {
+ ctx.SetEndpoint(new Endpoint(handler, new EndpointMetadataCollection(), "RequestDelegateEndpoint"));
+ return next();
+ });
+ app.UseStaticFiles(new StaticFileOptions
+ {
+ RequestPath = new PathString(),
+ FileProvider = fileProvider
+ });
+ app.UseEndpoints(endpoints => { });
+ }, services => services.AddRouting());
+ using var server = host.GetTestServer();
+ var requestUrl = "/TestDocument.txt";
+
+ var response = await server.CreateRequest(requestUrl).GetAsync();
+ var responseContent = await response.Content.ReadAsStringAsync();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("text/customfortest+plain", response.Content.Headers.ContentType.ToString());
+ Assert.Equal(responseText, responseContent);
+ }
+ }
+
[Theory]
[MemberData(nameof(ExistingFiles))]
public async Task HeadFile_HeadersButNotBodyServed(string baseUrl, string baseDir, string requestUrl)
diff --git a/src/Middleware/WebSockets/samples/EchoApp/EchoApp.csproj b/src/Middleware/WebSockets/samples/EchoApp/EchoApp.csproj
index c92354b6f5..203f749b8c 100644
--- a/src/Middleware/WebSockets/samples/EchoApp/EchoApp.csproj
+++ b/src/Middleware/WebSockets/samples/EchoApp/EchoApp.csproj
@@ -6,6 +6,7 @@
</PropertyGroup>
<ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.AspNetCore.Diagnostics" />
<Reference Include="Microsoft.AspNetCore.Server.IISIntegration" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
@@ -14,4 +15,10 @@
<Reference Include="Microsoft.Extensions.Logging.Console" />
</ItemGroup>
+ <ItemGroup>
+ <Content Update="appsettings.json">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ </ItemGroup>
+
</Project>
diff --git a/src/Middleware/WebSockets/samples/EchoApp/Program.cs b/src/Middleware/WebSockets/samples/EchoApp/Program.cs
index 6b65ab2e76..e4860fd141 100644
--- a/src/Middleware/WebSockets/samples/EchoApp/Program.cs
+++ b/src/Middleware/WebSockets/samples/EchoApp/Program.cs
@@ -1,23 +1,89 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Net.WebSockets;
+using System.Text;
+using Microsoft.AspNetCore.Http.Features;
+
namespace EchoApp;
public class Program
{
public static Task Main(string[] args)
{
- var host = new HostBuilder()
- .ConfigureWebHost(webHostBuilder =>
+ var builder = WebApplication.CreateBuilder();
+ var app = builder.Build();
+
+ app.UseDeveloperExceptionPage();
+ app.UseWebSockets();
+
+ app.Use(async (context, next) =>
+ {
+ if (context.WebSockets.IsWebSocketRequest)
+ {
+ var webSocket = await context.WebSockets.AcceptWebSocketAsync(new WebSocketAcceptContext() { DangerousEnableCompression = true });
+ await Echo(context, webSocket, app.Logger);
+ return;
+ }
+
+ await next(context);
+ });
+
+ app.UseFileServer();
+
+ return app.RunAsync();
+ }
+
+ private static async Task Echo(HttpContext context, WebSocket webSocket, ILogger logger)
+ {
+ var buffer = new byte[1024 * 4];
+ var result = await webSocket.ReceiveAsync(buffer.AsMemory(), CancellationToken.None);
+ LogFrame(logger, webSocket, result, buffer);
+ while (result.MessageType != WebSocketMessageType.Close)
+ {
+ // If the client send "ServerClose", then they want a server-originated close to occur
+ string content = "<<binary>>";
+ if (result.MessageType == WebSocketMessageType.Text)
+ {
+ content = Encoding.UTF8.GetString(buffer, 0, result.Count);
+ if (content.Equals("ServerClose"))
+ {
+ await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing from Server", CancellationToken.None);
+ logger.LogDebug($"Sent Frame Close: {WebSocketCloseStatus.NormalClosure} Closing from Server");
+ return;
+ }
+ else if (content.Equals("ServerAbort"))
+ {
+ context.Abort();
+ }
+ }
+
+ await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
+ logger.LogDebug($"Sent Frame {result.MessageType}: Len={result.Count}, Fin={result.EndOfMessage}: {content}");
+
+ result = await webSocket.ReceiveAsync(buffer.AsMemory(), CancellationToken.None);
+ LogFrame(logger, webSocket, result, buffer);
+ }
+ await webSocket.CloseAsync(webSocket.CloseStatus.Value, webSocket.CloseStatusDescription, CancellationToken.None);
+ }
+
+ private static void LogFrame(ILogger logger, WebSocket webSocket, ValueWebSocketReceiveResult frame, byte[] buffer)
+ {
+ var close = frame.MessageType == WebSocketMessageType.Close;
+ string message;
+ if (close)
+ {
+ message = $"Close: {webSocket.CloseStatus.Value} {webSocket.CloseStatusDescription}";
+ }
+ else
+ {
+ string content = "<<binary>>";
+ if (frame.MessageType == WebSocketMessageType.Text)
{
- webHostBuilder
- .UseKestrel()
- .UseContentRoot(Directory.GetCurrentDirectory())
- .UseIISIntegration()
- .UseStartup<Startup>();
- })
- .Build();
-
- return host.RunAsync();
+ content = Encoding.UTF8.GetString(buffer, 0, frame.Count);
+ }
+ message = $"{frame.MessageType}: Len={frame.Count}, Fin={frame.EndOfMessage}: {content}";
+ }
+ logger.LogDebug("Received Frame " + message);
}
}
diff --git a/src/Middleware/WebSockets/samples/EchoApp/Properties/launchSettings.json b/src/Middleware/WebSockets/samples/EchoApp/Properties/launchSettings.json
index 860180dd50..46b3549d5a 100644
--- a/src/Middleware/WebSockets/samples/EchoApp/Properties/launchSettings.json
+++ b/src/Middleware/WebSockets/samples/EchoApp/Properties/launchSettings.json
@@ -11,7 +11,7 @@
"EchoApp": {
"commandName": "Project",
"launchBrowser": true,
- "launchUrl": "http://localhost:5000",
+ "launchUrl": "https://localhost:5001",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
diff --git a/src/Middleware/WebSockets/samples/EchoApp/Startup.cs b/src/Middleware/WebSockets/samples/EchoApp/Startup.cs
deleted file mode 100644
index 51e65ded5e..0000000000
--- a/src/Middleware/WebSockets/samples/EchoApp/Startup.cs
+++ /dev/null
@@ -1,96 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Net.WebSockets;
-using System.Text;
-
-namespace EchoApp;
-
-public class Startup
-{
- // This method gets called by the runtime. Use this method to add services to the container.
- // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddLogging(builder => builder.AddConsole());
- }
-
- // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
- public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
- {
- if (env.IsDevelopment())
- {
- app.UseDeveloperExceptionPage();
- }
-
- app.UseWebSockets();
-
- app.Use(async (context, next) =>
- {
- if (context.WebSockets.IsWebSocketRequest)
- {
- var webSocket = await context.WebSockets.AcceptWebSocketAsync();
- await Echo(context, webSocket, loggerFactory.CreateLogger("Echo"));
- }
- else
- {
- await next(context);
- }
- });
-
- app.UseFileServer();
- }
-
- private async Task Echo(HttpContext context, WebSocket webSocket, ILogger logger)
- {
- var buffer = new byte[1024 * 4];
- var result = await webSocket.ReceiveAsync(buffer.AsMemory(), CancellationToken.None);
- LogFrame(logger, webSocket, result, buffer);
- while (result.MessageType != WebSocketMessageType.Close)
- {
- // If the client send "ServerClose", then they want a server-originated close to occur
- string content = "<<binary>>";
- if (result.MessageType == WebSocketMessageType.Text)
- {
- content = Encoding.UTF8.GetString(buffer, 0, result.Count);
- if (content.Equals("ServerClose"))
- {
- await webSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closing from Server", CancellationToken.None);
- logger.LogDebug($"Sent Frame Close: {WebSocketCloseStatus.NormalClosure} Closing from Server");
- return;
- }
- else if (content.Equals("ServerAbort"))
- {
- context.Abort();
- }
- }
-
- await webSocket.SendAsync(new ArraySegment<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, CancellationToken.None);
- logger.LogDebug($"Sent Frame {result.MessageType}: Len={result.Count}, Fin={result.EndOfMessage}: {content}");
-
- result = await webSocket.ReceiveAsync(buffer.AsMemory(), CancellationToken.None);
- LogFrame(logger, webSocket, result, buffer);
- }
- await webSocket.CloseAsync(webSocket.CloseStatus.Value, webSocket.CloseStatusDescription, CancellationToken.None);
- }
-
- private static void LogFrame(ILogger logger, WebSocket webSocket, ValueWebSocketReceiveResult frame, byte[] buffer)
- {
- var close = frame.MessageType == WebSocketMessageType.Close;
- string message;
- if (close)
- {
- message = $"Close: {webSocket.CloseStatus.Value} {webSocket.CloseStatusDescription}";
- }
- else
- {
- string content = "<<binary>>";
- if (frame.MessageType == WebSocketMessageType.Text)
- {
- content = Encoding.UTF8.GetString(buffer, 0, frame.Count);
- }
- message = $"{frame.MessageType}: Len={frame.Count}, Fin={frame.EndOfMessage}: {content}";
- }
- logger.LogDebug("Received Frame " + message);
- }
-}
diff --git a/src/Middleware/WebSockets/samples/EchoApp/appsettings.json b/src/Middleware/WebSockets/samples/EchoApp/appsettings.json
new file mode 100644
index 0000000000..2b15773f26
--- /dev/null
+++ b/src/Middleware/WebSockets/samples/EchoApp/appsettings.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "Microsoft.AspNetCore": "Trace"
+ }
+ }
+}
diff --git a/src/Middleware/WebSockets/src/HandshakeHelpers.cs b/src/Middleware/WebSockets/src/HandshakeHelpers.cs
index 446236b8d5..e0047d2bcd 100644
--- a/src/Middleware/WebSockets/src/HandshakeHelpers.cs
+++ b/src/Middleware/WebSockets/src/HandshakeHelpers.cs
@@ -14,25 +14,20 @@ namespace Microsoft.AspNetCore.WebSockets;
internal static class HandshakeHelpers
{
- // "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
// This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- private static ReadOnlySpan<byte> EncodedWebSocketKey => new byte[]
- {
- (byte)'2', (byte)'5', (byte)'8', (byte)'E', (byte)'A', (byte)'F', (byte)'A', (byte)'5', (byte)'-',
- (byte)'E', (byte)'9', (byte)'1', (byte)'4', (byte)'-', (byte)'4', (byte)'7', (byte)'D', (byte)'A',
- (byte)'-', (byte)'9', (byte)'5', (byte)'C', (byte)'A', (byte)'-', (byte)'C', (byte)'5', (byte)'A',
- (byte)'B', (byte)'0', (byte)'D', (byte)'C', (byte)'8', (byte)'5', (byte)'B', (byte)'1', (byte)'1'
- };
-
- // Verify Method, Upgrade, Connection, version, key, etc..
- public static void GenerateResponseHeaders(string key, string? subProtocol, IHeaderDictionary headers)
+ private static ReadOnlySpan<byte> EncodedWebSocketKey => "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"u8;
+
+ public static void GenerateResponseHeaders(bool isHttp1, IHeaderDictionary requestHeaders, string? subProtocol, IHeaderDictionary responseHeaders)
{
- headers.Connection = HeaderNames.Upgrade;
- headers.Upgrade = Constants.Headers.UpgradeWebSocket;
- headers.SecWebSocketAccept = CreateResponseKey(key);
+ if (isHttp1)
+ {
+ responseHeaders.Connection = HeaderNames.Upgrade;
+ responseHeaders.Upgrade = Constants.Headers.UpgradeWebSocket;
+ responseHeaders.SecWebSocketAccept = CreateResponseKey(requestHeaders.SecWebSocketKey.ToString());
+ }
if (!string.IsNullOrWhiteSpace(subProtocol))
{
- headers.SecWebSocketProtocol = subProtocol;
+ responseHeaders.SecWebSocketProtocol = subProtocol;
}
}
@@ -176,7 +171,7 @@ internal static class HandshakeHelpers
builder.Append('=');
var len = (parsedOptions.ClientMaxWindowBits > 9) ? 2 : 1;
var span = builder.AppendSpan(len);
- var ret = parsedOptions.ClientMaxWindowBits.TryFormat(span, out var written);
+ var ret = parsedOptions.ClientMaxWindowBits.TryFormat(span, out var written, provider: CultureInfo.InvariantCulture);
Debug.Assert(ret);
Debug.Assert(written == len);
}
@@ -271,7 +266,7 @@ internal static class HandshakeHelpers
builder.Append('=');
var len = (parsedOptions.ServerMaxWindowBits > 9) ? 2 : 1;
var span = builder.AppendSpan(len);
- var ret = parsedOptions.ServerMaxWindowBits.TryFormat(span, out var written);
+ var ret = parsedOptions.ServerMaxWindowBits.TryFormat(span, out var written, provider: CultureInfo.InvariantCulture);
Debug.Assert(ret);
Debug.Assert(written == len);
}
diff --git a/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj b/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj
index 1443b5fae9..58c7524df4 100644
--- a/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj
+++ b/src/Middleware/WebSockets/src/Microsoft.AspNetCore.WebSockets.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Middleware/WebSockets/src/PublicAPI.Shipped.txt b/src/Middleware/WebSockets/src/PublicAPI.Shipped.txt
index 6039f29254..f6bd124a8f 100644
--- a/src/Middleware/WebSockets/src/PublicAPI.Shipped.txt
+++ b/src/Middleware/WebSockets/src/PublicAPI.Shipped.txt
@@ -1,10 +1,7 @@
#nullable enable
~Microsoft.AspNetCore.Builder.WebSocketOptions.AllowedOrigins.get -> System.Collections.Generic.IList<string>
~Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext context) -> System.Threading.Tasks.Task
-~Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.WebSocketMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WebSocketOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-~Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.WebSocketMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WebSocketOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-~override Microsoft.AspNetCore.WebSockets.ExtendedWebSocketAcceptContext.SubProtocol.get -> string
-~override Microsoft.AspNetCore.WebSockets.ExtendedWebSocketAcceptContext.SubProtocol.set -> void
+Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.WebSocketMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WebSocketOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
~static Microsoft.AspNetCore.Builder.WebSocketMiddlewareExtensions.UseWebSockets(this Microsoft.AspNetCore.Builder.IApplicationBuilder app) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.Builder.WebSocketMiddlewareExtensions.UseWebSockets(this Microsoft.AspNetCore.Builder.IApplicationBuilder app, Microsoft.AspNetCore.Builder.WebSocketOptions options) -> Microsoft.AspNetCore.Builder.IApplicationBuilder
~static Microsoft.AspNetCore.WebSockets.WebSocketsDependencyInjectionExtensions.AddWebSockets(this Microsoft.Extensions.DependencyInjection.IServiceCollection services, System.Action<Microsoft.AspNetCore.Builder.WebSocketOptions> configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection
diff --git a/src/Middleware/WebSockets/src/PublicAPI.Unshipped.txt b/src/Middleware/WebSockets/src/PublicAPI.Unshipped.txt
index e365bc9cc4..7dc5c58110 100644
--- a/src/Middleware/WebSockets/src/PublicAPI.Unshipped.txt
+++ b/src/Middleware/WebSockets/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.WebSocketMiddleware(Microsoft.AspNetCore.Http.RequestDelegate next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WebSocketOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.WebSocketMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WebSocketOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.WebSockets.WebSocketMiddleware.WebSocketMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.WebSocketOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/Middleware/WebSockets/src/WebSocketMiddleware.cs b/src/Middleware/WebSockets/src/WebSocketMiddleware.cs
index 48f24c813a..8f2bcca80e 100644
--- a/src/Middleware/WebSockets/src/WebSocketMiddleware.cs
+++ b/src/Middleware/WebSockets/src/WebSocketMiddleware.cs
@@ -62,11 +62,11 @@ public partial class WebSocketMiddleware
{
// Detect if an opaque upgrade is available. If so, add a websocket upgrade.
var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>();
- if (upgradeFeature != null && context.Features.Get<IHttpWebSocketFeature>() == null)
+ var connectFeature = context.Features.Get<IHttpExtendedConnectFeature>();
+ if ((upgradeFeature != null || connectFeature != null) && context.Features.Get<IHttpWebSocketFeature>() == null)
{
- var webSocketFeature = new UpgradeHandshake(context, upgradeFeature, _options, _logger);
+ var webSocketFeature = new WebSocketHandshake(context, upgradeFeature, connectFeature, _options, _logger);
context.Features.Set<IHttpWebSocketFeature>(webSocketFeature);
-
if (!_anyOriginAllowed)
{
// Check for Origin header
@@ -88,18 +88,21 @@ public partial class WebSocketMiddleware
return _next(context);
}
- private class UpgradeHandshake : IHttpWebSocketFeature
+ private sealed class WebSocketHandshake : IHttpWebSocketFeature
{
private readonly HttpContext _context;
- private readonly IHttpUpgradeFeature _upgradeFeature;
+ private readonly IHttpUpgradeFeature? _upgradeFeature;
+ private readonly IHttpExtendedConnectFeature? _connectFeature;
private readonly WebSocketOptions _options;
private readonly ILogger _logger;
private bool? _isWebSocketRequest;
+ private bool _isH2WebSocket;
- public UpgradeHandshake(HttpContext context, IHttpUpgradeFeature upgradeFeature, WebSocketOptions options, ILogger logger)
+ public WebSocketHandshake(HttpContext context, IHttpUpgradeFeature? upgradeFeature, IHttpExtendedConnectFeature? connectFeature, WebSocketOptions options, ILogger logger)
{
_context = context;
_upgradeFeature = upgradeFeature;
+ _connectFeature = connectFeature;
_options = options;
_logger = logger;
}
@@ -110,14 +113,19 @@ public partial class WebSocketMiddleware
{
if (_isWebSocketRequest == null)
{
- if (!_upgradeFeature.IsUpgradableRequest)
+ if (_connectFeature?.IsExtendedConnect == true)
{
- _isWebSocketRequest = false;
+ _isH2WebSocket = CheckSupportedWebSocketRequestH2(_context.Request.Method, _connectFeature.Protocol, _context.Request.Headers);
+ _isWebSocketRequest = _isH2WebSocket;
}
- else
+ else if (_upgradeFeature?.IsUpgradableRequest == true)
{
_isWebSocketRequest = CheckSupportedWebSocketRequest(_context.Request.Method, _context.Request.Headers);
}
+ else
+ {
+ _isWebSocketRequest = false;
+ }
}
return _isWebSocketRequest.Value;
}
@@ -127,7 +135,7 @@ public partial class WebSocketMiddleware
{
if (!IsWebSocketRequest)
{
- throw new InvalidOperationException("Not a WebSocket request."); // TODO: LOC
+ throw new InvalidOperationException("Not a WebSocket request.");
}
string? subProtocol = null;
@@ -154,8 +162,7 @@ public partial class WebSocketMiddleware
}
}
- var key = _context.Request.Headers.SecWebSocketKey.ToString();
- HandshakeHelpers.GenerateResponseHeaders(key, subProtocol, _context.Response.Headers);
+ HandshakeHelpers.GenerateResponseHeaders(!_isH2WebSocket, _context.Request.Headers, subProtocol, _context.Response.Headers);
WebSocketDeflateOptions? deflateOptions = null;
if (enableCompression)
@@ -187,7 +194,18 @@ public partial class WebSocketMiddleware
}
}
- Stream opaqueTransport = await _upgradeFeature.UpgradeAsync(); // Sets status code to 101
+ Stream opaqueTransport;
+ // HTTP/2
+ if (_isH2WebSocket)
+ {
+ // Send the response headers
+ opaqueTransport = await _connectFeature!.AcceptAsync();
+ }
+ // HTTP/1.1
+ else
+ {
+ opaqueTransport = await _upgradeFeature!.UpgradeAsync(); // Sets status code to 101
+ }
return WebSocket.CreateFromStream(opaqueTransport, new WebSocketCreationOptions()
{
@@ -205,17 +223,22 @@ public partial class WebSocketMiddleware
return false;
}
+ if (!CheckWebSocketVersion(requestHeaders))
+ {
+ return false;
+ }
+
var foundHeader = false;
- var values = requestHeaders.GetCommaSeparatedValues(HeaderNames.SecWebSocketVersion);
+ var values = requestHeaders.GetCommaSeparatedValues(HeaderNames.Upgrade);
foreach (var value in values)
{
- if (string.Equals(value, Constants.Headers.SupportedVersion, StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(value, Constants.Headers.UpgradeWebSocket, StringComparison.OrdinalIgnoreCase))
{
// WebSockets are long lived; so if the header values are valid we switch them out for the interned versions.
if (values.Length == 1)
{
- requestHeaders.SecWebSocketVersion = Constants.Headers.SupportedVersion;
+ requestHeaders.Upgrade = Constants.Headers.UpgradeWebSocket;
}
foundHeader = true;
break;
@@ -245,28 +268,43 @@ public partial class WebSocketMiddleware
{
return false;
}
- foundHeader = false;
- values = requestHeaders.GetCommaSeparatedValues(HeaderNames.Upgrade);
+ return HandshakeHelpers.IsRequestKeyValid(requestHeaders.SecWebSocketKey.ToString());
+ }
+
+ // https://datatracker.ietf.org/doc/html/rfc8441
+ // :method = CONNECT
+ // :protocol = websocket
+ // :scheme = https
+ // :path = /chat
+ // :authority = server.example.com
+ // sec-websocket-protocol = chat, superchat
+ // sec-websocket-extensions = permessage-deflate
+ // sec-websocket-version = 13
+ // origin = http://www.example.com
+ public static bool CheckSupportedWebSocketRequestH2(string method, string? protocol, IHeaderDictionary requestHeaders)
+ {
+ return HttpMethods.IsConnect(method)
+ && string.Equals(protocol, Constants.Headers.UpgradeWebSocket, StringComparison.OrdinalIgnoreCase)
+ && CheckWebSocketVersion(requestHeaders);
+ }
+
+ public static bool CheckWebSocketVersion(IHeaderDictionary requestHeaders)
+ {
+ var values = requestHeaders.GetCommaSeparatedValues(HeaderNames.SecWebSocketVersion);
foreach (var value in values)
{
- if (string.Equals(value, Constants.Headers.UpgradeWebSocket, StringComparison.OrdinalIgnoreCase))
+ if (string.Equals(value, Constants.Headers.SupportedVersion, StringComparison.OrdinalIgnoreCase))
{
// WebSockets are long lived; so if the header values are valid we switch them out for the interned versions.
if (values.Length == 1)
{
- requestHeaders.Upgrade = Constants.Headers.UpgradeWebSocket;
+ requestHeaders.SecWebSocketVersion = Constants.Headers.SupportedVersion;
}
- foundHeader = true;
- break;
+ return true;
}
}
- if (!foundHeader)
- {
- return false;
- }
-
- return HandshakeHelpers.IsRequestKeyValid(requestHeaders.SecWebSocketKey.ToString());
+ return false;
}
}
diff --git a/src/Middleware/WebSockets/test/UnitTests/BufferStream.cs b/src/Middleware/WebSockets/test/UnitTests/BufferStream.cs
index 5e0b9287a9..04c9d8cc31 100644
--- a/src/Middleware/WebSockets/test/UnitTests/BufferStream.cs
+++ b/src/Middleware/WebSockets/test/UnitTests/BufferStream.cs
@@ -338,9 +338,6 @@ public class BufferStream : Stream
private void CheckDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(GetType().FullName);
- }
+ ObjectDisposedException.ThrowIf(_disposed, this);
}
}
diff --git a/src/Middleware/WebSockets/test/UnitTests/Http2WebSocketTests.cs b/src/Middleware/WebSockets/test/UnitTests/Http2WebSocketTests.cs
new file mode 100644
index 0000000000..7678012594
--- /dev/null
+++ b/src/Middleware/WebSockets/test/UnitTests/Http2WebSocketTests.cs
@@ -0,0 +1,74 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNetCore.WebSockets.Tests;
+
+public class Http2WebSocketTests
+{
+ [Fact]
+ public async Task Http2Handshake_Success()
+ {
+ using var host = new HostBuilder()
+ .ConfigureWebHost(webHost =>
+ {
+ webHost.UseTestServer();
+ webHost.Configure(app =>
+ {
+ app.UseWebSockets();
+ app.Run(httpContext =>
+ {
+ Assert.True(httpContext.WebSockets.IsWebSocketRequest);
+ Assert.Equal(new[] { "p1", "p2" }, httpContext.WebSockets.WebSocketRequestedProtocols);
+ return httpContext.WebSockets.AcceptWebSocketAsync("p2");
+ });
+ });
+ }).Start();
+
+ var testServer = host.GetTestServer();
+
+ var result = await testServer.SendAsync(httpContext =>
+ {
+ httpContext.Request.Method = HttpMethods.Connect;
+ httpContext.Features.Set<IHttpExtendedConnectFeature>(new ConnectFeature()
+ {
+ IsExtendedConnect = true,
+ Protocol = "WebSocket",
+ });
+ httpContext.Request.Headers.SecWebSocketVersion = Constants.Headers.SupportedVersion;
+ httpContext.Request.Headers.SecWebSocketProtocol = "p1, p2";
+ });
+
+ Assert.Equal(StatusCodes.Status200OK, result.Response.StatusCode);
+ var headers = result.Response.Headers;
+ Assert.Equal("p2", headers.SecWebSocketProtocol);
+ Assert.False(headers.TryGetValue(HeaderNames.Connection, out var _));
+ Assert.False(headers.TryGetValue(HeaderNames.Upgrade, out var _));
+ Assert.False(headers.TryGetValue(HeaderNames.SecWebSocketAccept, out var _));
+ }
+
+ public sealed class ConnectFeature : IHttpExtendedConnectFeature
+ {
+ public bool IsExtendedConnect { get; set; }
+ public string Protocol { get; set; }
+ public Stream Stream { get; set; } = Stream.Null;
+
+ /// <inheritdoc/>
+ public ValueTask<Stream> AcceptAsync()
+ {
+ if (!IsExtendedConnect)
+ {
+ throw new InvalidOperationException("This is not an Extended CONNECT request.");
+ }
+
+ return new ValueTask<Stream>(Stream);
+ }
+ }
+}
diff --git a/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj b/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj
index a79f651ecb..d242011a0c 100644
--- a/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj
+++ b/src/Middleware/WebSockets/test/UnitTests/Microsoft.AspNetCore.WebSockets.Tests.csproj
@@ -8,6 +8,7 @@
<ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
+ <Reference Include="Microsoft.AspNetCore.TestHost" />
<Reference Include="Microsoft.AspNetCore.WebSockets" />
</ItemGroup>
diff --git a/src/Middleware/perf/ResponseCaching.Microbenchmarks/ResponseCachingBenchmark.cs b/src/Middleware/perf/ResponseCaching.Microbenchmarks/ResponseCachingBenchmark.cs
index 54bf1017ac..9dfdab1212 100644
--- a/src/Middleware/perf/ResponseCaching.Microbenchmarks/ResponseCachingBenchmark.cs
+++ b/src/Middleware/perf/ResponseCaching.Microbenchmarks/ResponseCachingBenchmark.cs
@@ -109,7 +109,7 @@ public class ResponseCachingBenchmark
await reader.CompleteAsync();
}
- private class PipeResponseBodyFeature : IHttpResponseBodyFeature
+ private sealed class PipeResponseBodyFeature : IHttpResponseBodyFeature
{
public PipeResponseBodyFeature(PipeWriter pipeWriter)
{
diff --git a/src/Middleware/tools/RazorPageGenerator/Program.cs b/src/Middleware/tools/RazorPageGenerator/Program.cs
index cd168eb104..0fcfa9993d 100644
--- a/src/Middleware/tools/RazorPageGenerator/Program.cs
+++ b/src/Middleware/tools/RazorPageGenerator/Program.cs
@@ -139,7 +139,7 @@ dotnet razorpagegenerator Microsoft.AspNetCore.Diagnostics.RazorViews c:\project
};
}
- private class SuppressChecksumOptionsFeature : RazorEngineFeatureBase, IConfigureRazorCodeGenerationOptionsFeature
+ private sealed class SuppressChecksumOptionsFeature : RazorEngineFeatureBase, IConfigureRazorCodeGenerationOptionsFeature
{
public int Order { get; set; }
@@ -154,7 +154,7 @@ dotnet razorpagegenerator Microsoft.AspNetCore.Diagnostics.RazorViews c:\project
}
}
- private class SuppressMetadataAttributesFeature : RazorEngineFeatureBase, IConfigureRazorCodeGenerationOptionsFeature
+ private sealed class SuppressMetadataAttributesFeature : RazorEngineFeatureBase, IConfigureRazorCodeGenerationOptionsFeature
{
public int Order { get; set; }
@@ -169,7 +169,7 @@ dotnet razorpagegenerator Microsoft.AspNetCore.Diagnostics.RazorViews c:\project
}
}
- private class FileSystemRazorProjectItemWrapper : RazorProjectItem
+ private sealed class FileSystemRazorProjectItemWrapper : RazorProjectItem
{
private readonly RazorProjectItem _source;
diff --git a/src/Mvc/Mvc.Abstractions/src/ModelBinding/BindingInfo.cs b/src/Mvc/Mvc.Abstractions/src/ModelBinding/BindingInfo.cs
index b5dded52a1..a112b90bd7 100644
--- a/src/Mvc/Mvc.Abstractions/src/ModelBinding/BindingInfo.cs
+++ b/src/Mvc/Mvc.Abstractions/src/ModelBinding/BindingInfo.cs
@@ -261,7 +261,7 @@ public class BindingInfo
return isBindingInfoPresent;
}
- private class CompositePropertyFilterProvider : IPropertyFilterProvider
+ private sealed class CompositePropertyFilterProvider : IPropertyFilterProvider
{
private readonly IEnumerable<IPropertyFilterProvider> _providers;
diff --git a/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelStateDictionary.cs b/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelStateDictionary.cs
index aec51a9bf0..2be3c223ff 100644
--- a/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelStateDictionary.cs
+++ b/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelStateDictionary.cs
@@ -882,7 +882,7 @@ public class ModelStateDictionary : IReadOnlyDictionary<string, ModelStateEntry?
}
[DebuggerDisplay("SubKey={SubKey}, Key={Key}, ValidationState={ValidationState}")]
- private class ModelStateNode : ModelStateEntry
+ private sealed class ModelStateNode : ModelStateEntry
{
private bool _isContainerNode = true;
diff --git a/src/Mvc/Mvc.Abstractions/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.Abstractions/src/PublicAPI.Shipped.txt
index 53bde171aa..2eec2252ff 100644
--- a/src/Mvc/Mvc.Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.Abstractions/src/PublicAPI.Shipped.txt
@@ -121,6 +121,7 @@ Microsoft.AspNetCore.Mvc.Abstractions.ParameterDescriptor.ParameterDescriptor()
Microsoft.AspNetCore.Mvc.Abstractions.ParameterDescriptor.ParameterType.get -> System.Type!
Microsoft.AspNetCore.Mvc.Abstractions.ParameterDescriptor.ParameterType.set -> void
Microsoft.AspNetCore.Mvc.ActionConstraints.ActionConstraintContext
+Microsoft.AspNetCore.Mvc.ActionConstraints.ActionSelectorCandidate.ActionSelectorCandidate() -> void
Microsoft.AspNetCore.Mvc.ActionConstraints.ActionConstraintContext.ActionConstraintContext() -> void
Microsoft.AspNetCore.Mvc.ActionConstraints.ActionConstraintContext.Candidates.get -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Mvc.ActionConstraints.ActionSelectorCandidate>!
Microsoft.AspNetCore.Mvc.ActionConstraints.ActionConstraintContext.Candidates.set -> void
@@ -401,6 +402,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.EmptyBodyBehavior.Allow = 1 -> Microsoft.A
Microsoft.AspNetCore.Mvc.ModelBinding.EmptyBodyBehavior.Default = 0 -> Microsoft.AspNetCore.Mvc.ModelBinding.EmptyBodyBehavior
Microsoft.AspNetCore.Mvc.ModelBinding.EmptyBodyBehavior.Disallow = 2 -> Microsoft.AspNetCore.Mvc.ModelBinding.EmptyBodyBehavior
Microsoft.AspNetCore.Mvc.ModelBinding.EnumGroupAndName
+Microsoft.AspNetCore.Mvc.ModelBinding.EnumGroupAndName.EnumGroupAndName() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.EnumGroupAndName.EnumGroupAndName(string! group, string! name) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.EnumGroupAndName.EnumGroupAndName(string! group, System.Func<string!>! name) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.EnumGroupAndName.Group.get -> string!
@@ -430,6 +432,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.IValueProviderFactory.CreateValueProviderA
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelBindingMessageProvider
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelBindingMessageProvider.ModelBindingMessageProvider() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity
+Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity.ModelMetadataIdentity() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity.ConstructorInfo.get -> System.Reflection.ConstructorInfo?
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity.ContainerType.get -> System.Type?
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity.Equals(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ModelMetadataIdentity other) -> bool
@@ -448,11 +451,13 @@ Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderProviderContext.ModelBinderProv
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.ModelBindingContext() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.NestedScope
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.NestedScope.NestedScope() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.NestedScope.Dispose() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.NestedScope.NestedScope(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext! context) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.OriginalModelName.get -> string!
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext.OriginalModelName.set -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult.ModelBindingResult() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult.Equals(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult other) -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult.IsModelSet.get -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingResult.Model.get -> object?
@@ -497,6 +502,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ClearValidationState(
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ContainsKey(string! key) -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Count.get -> int
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Enumerator
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateEntry!>
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Enumerator.Dispose() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Enumerator.Enumerator(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! dictionary, string! prefix) -> void
@@ -510,9 +516,11 @@ Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.GetValidationState(st
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.HasReachedMaxErrors.get -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.IsValid.get -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerable
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerable.KeyEnumerable() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerable.GetEnumerator() -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerator
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerable.KeyEnumerable(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! dictionary) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerator
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerator.KeyEnumerator() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerator.Current.get -> string!
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerator.Dispose() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.KeyEnumerator.KeyEnumerator(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! dictionary, string! prefix) -> void
@@ -528,6 +536,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ModelStateDictionary(
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ModelStateDictionary(int maxAllowedErrors) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ModelStateDictionary(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! dictionary) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.PrefixEnumerable
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.PrefixEnumerable.PrefixEnumerable() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.PrefixEnumerable.GetEnumerator() -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Enumerator
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.PrefixEnumerable.PrefixEnumerable(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! dictionary, string! prefix) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.Remove(string! key) -> bool
@@ -541,9 +550,11 @@ Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.TryAddModelException(
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.TryGetValue(string! key, out Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateEntry? value) -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValidationState.get -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelValidationState
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerable
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerable.ValueEnumerable() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerable.GetEnumerator() -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerator
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerable.ValueEnumerable(Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! dictionary) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerator
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerator.ValueEnumerator() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerator.Current.get -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateEntry!
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerator.Dispose() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary.ValueEnumerator.MoveNext() -> bool
@@ -614,6 +625,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ModelValidatorProviderContext.M
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ModelValidatorProviderContext.Results.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidatorItem!>!
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ModelValidatorProviderContext.ValidatorMetadata.get -> System.Collections.Generic.IReadOnlyList<object!>!
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationEntry
+Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationEntry.ValidationEntry() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationEntry.Key.get -> string!
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationEntry.Metadata.get -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata!
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationEntry.Model.get -> object?
@@ -663,6 +675,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderFactoryContext.ActionContext.
Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderFactoryContext.ValueProviderFactoryContext(Microsoft.AspNetCore.Mvc.ActionContext! context) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderFactoryContext.ValueProviders.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider!>!
Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult
+Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult.ValueProviderResult() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult.Culture.get -> System.Globalization.CultureInfo!
Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult.Equals(Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult other) -> bool
Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult.FirstValue.get -> string?
diff --git a/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs b/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs
index 0cf6346821..e11e56eb1b 100644
--- a/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs
+++ b/src/Mvc/Mvc.Analyzers/src/AttributesShouldNotBeAppliedToPageModelAnalyzer.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Immutable;
@@ -140,7 +140,7 @@ public class AttributesShouldNotBeAppliedToPageModelAnalyzer : DiagnosticAnalyze
return syntax?.GetLocation() ?? Location.None;
}
- private class TypeCache
+ private sealed class TypeCache
{
public TypeCache(Compilation compilation)
{
diff --git a/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCodeFixProvider.cs b/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCodeFixProvider.cs
index 6f1340c2bd..349e38b7be 100644
--- a/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCodeFixProvider.cs
+++ b/src/Mvc/Mvc.Api.Analyzers/src/ApiActionsDoNotRequireExplicitModelValidationCodeFixProvider.cs
@@ -39,7 +39,7 @@ public class ApiActionsDoNotRequireExplicitModelValidationCheckCodeFixProvider :
return Task.CompletedTask;
}
- private class MyCodeAction : CodeAction
+ private sealed class MyCodeAction : CodeAction
{
private readonly Document _document;
private readonly TextSpan _ifBlockSpan;
diff --git a/src/Mvc/Mvc.ApiExplorer/src/ApiParameterContext.cs b/src/Mvc/Mvc.ApiExplorer/src/ApiParameterContext.cs
index 85c84b70b7..9f432a571a 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/ApiParameterContext.cs
+++ b/src/Mvc/Mvc.ApiExplorer/src/ApiParameterContext.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Controllers;
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Routing.Template;
namespace Microsoft.AspNetCore.Mvc.ApiExplorer;
-internal class ApiParameterContext
+internal sealed class ApiParameterContext
{
public ApiParameterContext(
IModelMetadataProvider metadataProvider,
diff --git a/src/Mvc/Mvc.ApiExplorer/src/ApiResponseTypeProvider.cs b/src/Mvc/Mvc.ApiExplorer/src/ApiResponseTypeProvider.cs
index 1d2df05819..d1f151812a 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/ApiResponseTypeProvider.cs
+++ b/src/Mvc/Mvc.ApiExplorer/src/ApiResponseTypeProvider.cs
@@ -3,6 +3,7 @@
using System.Linq;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
@@ -10,7 +11,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace Microsoft.AspNetCore.Mvc.ApiExplorer;
-internal class ApiResponseTypeProvider
+internal sealed class ApiResponseTypeProvider
{
private readonly IModelMetadataProvider _modelMetadataProvider;
private readonly IActionResultTypeMapper _mapper;
@@ -49,7 +50,8 @@ internal class ApiResponseTypeProvider
defaultErrorType = ((ProducesErrorResponseTypeAttribute)result!).Type;
}
- var apiResponseTypes = GetApiResponseTypes(responseMetadataAttributes, runtimeReturnType, defaultErrorType);
+ var producesResponseMetadata = action.EndpointMetadata.OfType<IProducesResponseTypeMetadata>().ToList();
+ var apiResponseTypes = GetApiResponseTypes(responseMetadataAttributes, producesResponseMetadata, runtimeReturnType, defaultErrorType);
return apiResponseTypes;
}
@@ -72,6 +74,7 @@ internal class ApiResponseTypeProvider
private ICollection<ApiResponseType> GetApiResponseTypes(
IReadOnlyList<IApiResponseMetadataProvider> responseMetadataAttributes,
+ IReadOnlyList<IProducesResponseTypeMetadata> producesResponseMetadata,
Type? type,
Type defaultErrorType)
{
@@ -79,16 +82,30 @@ internal class ApiResponseTypeProvider
var responseTypeMetadataProviders = _mvcOptions.OutputFormatters.OfType<IApiResponseTypeMetadataProvider>();
var responseTypes = ReadResponseMetadata(
+ producesResponseMetadata,
+ type,
+ responseTypeMetadataProviders,
+ _modelMetadataProvider);
+
+ // Read response metadata from providers and
+ // overwrite responseTypes from the metadata based
+ // on the status code
+ var responseTypesFromProvider = ReadResponseMetadata(
responseMetadataAttributes,
type,
defaultErrorType,
contentTypes,
responseTypeMetadataProviders);
+ foreach (var responseType in responseTypesFromProvider)
+ {
+ responseTypes[responseType.Key] = responseType.Value;
+ }
+
// Set the default status only when no status has already been set explicitly
if (responseTypes.Count == 0 && type != null)
{
- responseTypes.Add(new ApiResponseType
+ responseTypes.Add(StatusCodes.Status200OK, new ApiResponseType
{
StatusCode = StatusCodes.Status200OK,
Type = type,
@@ -105,16 +122,16 @@ internal class ApiResponseTypeProvider
contentTypes.Add((string)null!);
}
- foreach (var apiResponse in responseTypes)
+ foreach (var apiResponse in responseTypes.Values)
{
CalculateResponseFormatForType(apiResponse, contentTypes, responseTypeMetadataProviders, _modelMetadataProvider);
}
- return responseTypes;
+ return responseTypes.Values;
}
// Shared with EndpointMetadataApiDescriptionProvider
- internal static List<ApiResponseType> ReadResponseMetadata(
+ internal static Dictionary<int, ApiResponseType> ReadResponseMetadata(
IReadOnlyList<IApiResponseMetadataProvider> responseMetadataAttributes,
Type? type,
Type defaultErrorType,
@@ -195,7 +212,55 @@ internal class ApiResponseTypeProvider
}
}
- return results.Values.ToList();
+ return results;
+ }
+
+ internal static Dictionary<int, ApiResponseType> ReadResponseMetadata(
+ IReadOnlyList<IProducesResponseTypeMetadata> responseMetadata,
+ Type? type,
+ IEnumerable<IApiResponseTypeMetadataProvider>? responseTypeMetadataProviders = null,
+ IModelMetadataProvider? modelMetadataProvider = null)
+ {
+ var results = new Dictionary<int, ApiResponseType>();
+
+ foreach (var metadata in responseMetadata)
+ {
+ var statusCode = metadata.StatusCode;
+
+ var apiResponseType = new ApiResponseType
+ {
+ Type = metadata.Type,
+ StatusCode = statusCode,
+ };
+
+ if (apiResponseType.Type == typeof(void))
+ {
+ if (type != null && (statusCode == StatusCodes.Status200OK || statusCode == StatusCodes.Status201Created))
+ {
+ // Allow setting the response type from the return type of the method if it has
+ // not been set explicitly by the method.
+ apiResponseType.Type = type;
+ }
+ }
+
+ var attributeContentTypes = new MediaTypeCollection();
+ if (metadata.ContentTypes != null)
+ {
+ foreach (var contentType in metadata.ContentTypes)
+ {
+ attributeContentTypes.Add(contentType);
+ }
+ }
+
+ CalculateResponseFormatForType(apiResponseType, attributeContentTypes, responseTypeMetadataProviders, modelMetadataProvider);
+
+ if (apiResponseType.Type != null)
+ {
+ results[apiResponseType.StatusCode] = apiResponseType;
+ }
+ }
+
+ return results;
}
// Shared with EndpointMetadataApiDescriptionProvider
diff --git a/src/Mvc/Mvc.ApiExplorer/src/DefaultApiDescriptionProvider.cs b/src/Mvc/Mvc.ApiExplorer/src/DefaultApiDescriptionProvider.cs
index 879c425f18..e189fdac07 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/DefaultApiDescriptionProvider.cs
+++ b/src/Mvc/Mvc.ApiExplorer/src/DefaultApiDescriptionProvider.cs
@@ -115,8 +115,6 @@ public class DefaultApiDescriptionProvider : IApiDescriptionProvider
apiDescription.ParameterDescriptions.Add(parameter);
}
- var requestMetadataAttributes = GetRequestMetadataAttributes(action);
-
var apiResponseTypes = _responseTypeProvider.GetApiResponseTypes(action);
foreach (var apiResponseType in apiResponseTypes)
{
@@ -127,7 +125,11 @@ public class DefaultApiDescriptionProvider : IApiDescriptionProvider
// could end up with duplicate data.
if (apiDescription.ParameterDescriptions.Count > 0)
{
- var contentTypes = GetDeclaredContentTypes(requestMetadataAttributes);
+ // Get the most significant accepts metadata
+ var acceptsMetadata = action.EndpointMetadata.OfType<IAcceptsMetadata>().LastOrDefault();
+ var requestMetadataAttributes = GetRequestMetadataAttributes(action);
+
+ var contentTypes = GetDeclaredContentTypes(requestMetadataAttributes, acceptsMetadata);
foreach (var parameter in apiDescription.ParameterDescriptions)
{
if (parameter.Source == BindingSource.Body)
@@ -449,11 +451,23 @@ public class DefaultApiDescriptionProvider : IApiDescriptionProvider
return results;
}
- internal static MediaTypeCollection GetDeclaredContentTypes(IReadOnlyList<IApiRequestMetadataProvider>? requestMetadataAttributes)
+ internal static MediaTypeCollection GetDeclaredContentTypes(IReadOnlyList<IApiRequestMetadataProvider>? requestMetadataAttributes, IAcceptsMetadata? acceptsMetadata)
{
+ var contentTypes = new MediaTypeCollection();
+
+ // Walking the content types from the accepts metadata first
+ // to allow any RequestMetadataProvider to see or override any accepts metadata
+ // keeping the current behavior.
+ if (acceptsMetadata != null)
+ {
+ foreach (var contentType in acceptsMetadata.ContentTypes)
+ {
+ contentTypes.Add(contentType);
+ }
+ }
+
// Walk through all 'filter' attributes in order, and allow each one to see or override
// the results of the previous ones. This is similar to the execution path for content-negotiation.
- var contentTypes = new MediaTypeCollection();
if (requestMetadataAttributes != null)
{
foreach (var metadataAttribute in requestMetadataAttributes)
@@ -495,7 +509,7 @@ public class DefaultApiDescriptionProvider : IApiDescriptionProvider
return endpointGroupName?.EndpointGroupName ?? extensionData.GroupName;
}
- private class ApiParameterDescriptionContext
+ private sealed class ApiParameterDescriptionContext
{
public ModelMetadata ModelMetadata { get; }
@@ -521,7 +535,7 @@ public class DefaultApiDescriptionProvider : IApiDescriptionProvider
}
}
- private class PseudoModelBindingVisitor
+ private sealed class PseudoModelBindingVisitor
{
public PseudoModelBindingVisitor(ApiParameterContext context, ParameterDescriptor parameter)
{
@@ -672,7 +686,7 @@ public class DefaultApiDescriptionProvider : IApiDescriptionProvider
}
}
- private class PropertyKeyEqualityComparer : IEqualityComparer<PropertyKey>
+ private sealed class PropertyKeyEqualityComparer : IEqualityComparer<PropertyKey>
{
public bool Equals(PropertyKey x, PropertyKey y)
{
diff --git a/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs b/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs
index b7241a2436..9319368440 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs
+++ b/src/Mvc/Mvc.ApiExplorer/src/EndpointMetadataApiDescriptionProvider.cs
@@ -20,7 +20,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.ApiExplorer;
-internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
+internal sealed class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
{
private readonly EndpointDataSource _endpointDataSource;
private readonly IHostEnvironment _environment;
@@ -116,20 +116,18 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
var hasBodyOrFormFileParameter = false;
- foreach (var parameter in methodInfo.GetParameters())
+ foreach (var parameter in PropertyAsParameterInfo.Flatten(methodInfo.GetParameters(), ParameterBindingMethodCache))
{
var parameterDescription = CreateApiParameterDescription(parameter, routeEndpoint.RoutePattern, disableInferredBody);
- if (parameterDescription is null)
+ if (parameterDescription is { })
{
- continue;
- }
-
- apiDescription.ParameterDescriptions.Add(parameterDescription);
+ apiDescription.ParameterDescriptions.Add(parameterDescription);
- hasBodyOrFormFileParameter |=
- parameterDescription.Source == BindingSource.Body ||
- parameterDescription.Source == BindingSource.FormFile;
+ hasBodyOrFormFileParameter |=
+ parameterDescription.Source == BindingSource.Body ||
+ parameterDescription.Source == BindingSource.FormFile;
+ }
}
// Get IAcceptsMetadata.
@@ -185,7 +183,7 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
var nullabilityContext = new NullabilityInfoContext();
var nullability = nullabilityContext.Create(parameter);
var isOptional = parameter.HasDefaultValue || nullability.ReadState != NullabilityState.NotNull || allowEmpty;
- var parameterDescriptor = CreateParameterDescriptor(parameter);
+ var parameterDescriptor = CreateParameterDescriptor(parameter, pattern);
var routeInfo = CreateParameterRouteInfo(pattern, parameter, isOptional);
return new ApiParameterDescription
@@ -201,13 +199,17 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
};
}
- private static ParameterDescriptor CreateParameterDescriptor(ParameterInfo parameter)
- => new EndpointParameterDescriptor
+ private static ParameterDescriptor CreateParameterDescriptor(ParameterInfo parameter, RoutePattern pattern)
+ {
+ var parameterName = parameter.Name ?? string.Empty;
+ var name = pattern.GetParameter(parameterName)?.Name ?? parameterName;
+ return new EndpointParameterDescriptor
{
- Name = parameter.Name ?? string.Empty,
+ Name = name,
ParameterInfo = parameter,
ParameterType = parameter.ParameterType,
};
+ }
private ApiParameterRouteInfo? CreateParameterRouteInfo(RoutePattern pattern, ParameterInfo parameter, bool isOptional)
{
@@ -252,7 +254,9 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
if (attributes.OfType<IFromRouteMetadata>().FirstOrDefault() is { } routeAttribute)
{
- return (BindingSource.Path, routeAttribute.Name ?? parameter.Name ?? string.Empty, false, parameter.ParameterType);
+ var parameterName = parameter.Name ?? string.Empty;
+ var name = pattern.GetParameter(parameterName)?.Name ?? parameterName;
+ return (BindingSource.Path, routeAttribute.Name ?? name, false, parameter.ParameterType);
}
else if (attributes.OfType<IFromQueryMetadata>().FirstOrDefault() is { } queryAttribute)
{
@@ -287,9 +291,9 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
var displayType = !parameter.ParameterType.IsPrimitive && Nullable.GetUnderlyingType(parameter.ParameterType)?.IsPrimitive != true
? typeof(string) : parameter.ParameterType;
// Path vs query cannot be determined by RequestDelegateFactory at startup currently because of the layering, but can be done here.
- if (parameter.Name is { } name && pattern.GetParameter(name) is not null)
+ if (parameter.Name is { } name && pattern.GetParameter(name) is { } routeParam)
{
- return (BindingSource.Path, name, false, displayType);
+ return (BindingSource.Path, routeParam.Name, false, displayType);
}
else
{
@@ -341,11 +345,11 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
var responseProviderMetadataTypes = ApiResponseTypeProvider.ReadResponseMetadata(
responseProviderMetadata, responseType, defaultErrorType, contentTypes);
- var producesResponseMetadataTypes = ReadResponseMetadata(producesResponseMetadata, responseType);
+ var producesResponseMetadataTypes = ApiResponseTypeProvider.ReadResponseMetadata(producesResponseMetadata, responseType);
// We favor types added via the extension methods (which implements IProducesResponseTypeMetadata)
// over those that are added via attributes.
- var responseMetadataTypes = producesResponseMetadataTypes.Values.Concat(responseProviderMetadataTypes);
+ var responseMetadataTypes = producesResponseMetadataTypes.Values.Concat(responseProviderMetadataTypes.Values);
if (responseMetadataTypes.Any())
{
@@ -393,51 +397,6 @@ internal class EndpointMetadataApiDescriptionProvider : IApiDescriptionProvider
}
}
- private static Dictionary<int, ApiResponseType> ReadResponseMetadata(
- IReadOnlyList<IProducesResponseTypeMetadata> responseMetadata,
- Type? type)
- {
- var results = new Dictionary<int, ApiResponseType>();
-
- foreach (var metadata in responseMetadata)
- {
- var statusCode = metadata.StatusCode;
-
- var apiResponseType = new ApiResponseType
- {
- Type = metadata.Type,
- StatusCode = statusCode,
- };
-
- if (apiResponseType.Type == typeof(void))
- {
- if (type != null && (statusCode == StatusCodes.Status200OK || statusCode == StatusCodes.Status201Created))
- {
- // Allow setting the response type from the return type of the method if it has
- // not been set explicitly by the method.
- apiResponseType.Type = type;
- }
- }
-
- var attributeContentTypes = new MediaTypeCollection();
- if (metadata.ContentTypes != null)
- {
- foreach (var contentType in metadata.ContentTypes)
- {
- attributeContentTypes.Add(contentType);
- }
- }
- ApiResponseTypeProvider.CalculateResponseFormatForType(apiResponseType, attributeContentTypes, responseTypeMetadataProviders: null, modelMetadataProvider: null);
-
- if (apiResponseType.Type != null)
- {
- results[apiResponseType.StatusCode] = apiResponseType;
- }
- }
-
- return results;
- }
-
private static ApiResponseType CreateDefaultApiResponseType(Type responseType)
{
var apiResponseType = new ApiResponseType
diff --git a/src/Mvc/Mvc.ApiExplorer/src/EndpointModelMetadata.cs b/src/Mvc/Mvc.ApiExplorer/src/EndpointModelMetadata.cs
index 7e115f8046..4ad1b72396 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/EndpointModelMetadata.cs
+++ b/src/Mvc/Mvc.ApiExplorer/src/EndpointModelMetadata.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
namespace Microsoft.AspNetCore.Mvc.ApiExplorer;
-internal class EndpointModelMetadata : ModelMetadata
+internal sealed class EndpointModelMetadata : ModelMetadata
{
public EndpointModelMetadata(ModelMetadataIdentity identity) : base(identity)
{
diff --git a/src/Mvc/Mvc.ApiExplorer/src/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj b/src/Mvc/Mvc.ApiExplorer/src/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj
index 4b0491eb95..b6bbde313c 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj
+++ b/src/Mvc/Mvc.ApiExplorer/src/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj
@@ -11,6 +11,7 @@
<ItemGroup>
<Compile Include="$(SharedSourceRoot)RoslynUtils\TypeHelper.cs" />
+ <Compile Include="$(SharedSourceRoot)PropertyAsParameterInfo.cs" LinkBase="Shared" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Shipped.txt
index 739c6648c0..a61035fdca 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.DefaultApiDescriptionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor, Microsoft.AspNetCore.Routing.IInlineConstraintResolver! constraintResolver, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultTypeMapper! mapper, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions) -> void
+Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.DefaultApiDescriptionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor, Microsoft.AspNetCore.Routing.IInlineConstraintResolver! constraintResolver, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultTypeMapper! mapper, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions) -> void
Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescription (forwarded, contained in Microsoft.AspNetCore.Mvc.Abstractions)
Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescription.ActionDescriptor.get -> Microsoft.AspNetCore.Mvc.Abstractions.ActionDescriptor! (forwarded, contained in Microsoft.AspNetCore.Mvc.Abstractions)
Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescription.ActionDescriptor.set -> void (forwarded, contained in Microsoft.AspNetCore.Mvc.Abstractions)
diff --git a/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Unshipped.txt
index 9d0c4fe7cd..7dc5c58110 100644
--- a/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.ApiExplorer/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.DefaultApiDescriptionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor, Microsoft.AspNetCore.Routing.IInlineConstraintResolver! constraintResolver, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultTypeMapper! mapper, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions) -> void
-Microsoft.AspNetCore.Mvc.ApiExplorer.DefaultApiDescriptionProvider.DefaultApiDescriptionProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor, Microsoft.AspNetCore.Routing.IInlineConstraintResolver! constraintResolver, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.Infrastructure.IActionResultTypeMapper! mapper, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Routing.RouteOptions!>! routeOptions) -> void
diff --git a/src/Mvc/Mvc.ApiExplorer/test/DefaultApiDescriptionProviderTest.cs b/src/Mvc/Mvc.ApiExplorer/test/DefaultApiDescriptionProviderTest.cs
index 4c474c9538..ffb431bf6c 100644
--- a/src/Mvc/Mvc.ApiExplorer/test/DefaultApiDescriptionProviderTest.cs
+++ b/src/Mvc/Mvc.ApiExplorer/test/DefaultApiDescriptionProviderTest.cs
@@ -515,6 +515,47 @@ public class DefaultApiDescriptionProviderTest
}
[Theory]
+ [InlineData(nameof(ReturnsResultOfProductWithEndpointMetadata))]
+ [InlineData(nameof(ReturnsTaskOfResultOfProductWithEndpointMetadata))]
+ public void GetApiDescription_PopulatesResponseType_ForResultOfT_WithEndpointMetadata(string methodName)
+ {
+ // Arrange
+ var action = CreateActionDescriptor(methodName);
+ action.EndpointMetadata = new List<object>() { new ProducesResponseTypeMetadata(typeof(Product), 200) };
+
+ // Act
+ var descriptions = GetApiDescriptions(action);
+
+ // Assert
+ var description = Assert.Single(descriptions);
+ var responseType = Assert.Single(description.SupportedResponseTypes);
+ Assert.Equal(typeof(Product), responseType.Type);
+ Assert.NotNull(responseType.ModelMetadata);
+ }
+
+ [Theory]
+ [InlineData(nameof(ReturnsResultOfProductWithEndpointMetadata))]
+ [InlineData(nameof(ReturnsTaskOfResultOfProductWithEndpointMetadata))]
+ public void GetApiDescription_PopulatesResponseType_ForResultOfT_WithEndpointMetadata_PreferProducesAttribute(string methodName)
+ {
+ // Arrange
+ var action = CreateActionDescriptor(methodName);
+ action.EndpointMetadata = new List<object>() { new ProducesResponseTypeMetadata(typeof(Product), 200) };
+ action.FilterDescriptors = new List<FilterDescriptor>{
+ new FilterDescriptor(new ProducesResponseTypeAttribute(typeof(Customer), 200), FilterScope.Action)
+ };
+
+ // Act
+ var descriptions = GetApiDescriptions(action);
+
+ // Assert
+ var description = Assert.Single(descriptions);
+ var responseType = Assert.Single(description.SupportedResponseTypes);
+ Assert.Equal(typeof(Customer), responseType.Type);
+ Assert.NotNull(responseType.ModelMetadata);
+ }
+
+ [Theory]
[InlineData(nameof(ReturnsActionResultOfSequenceOfProducts))]
[InlineData(nameof(ReturnsTaskOfActionResultOfSequenceOfProducts))]
public void GetApiDescription_PopulatesResponseType_ForActionResultOfSequenceOfT(string methodName)
@@ -1213,6 +1254,24 @@ public class DefaultApiDescriptionProviderTest
}
[Fact]
+ public void GetApiDescription_IncludesRequestFormats_FilteredByAcceptsMetadata()
+ {
+ // Arrange
+ var action = CreateActionDescriptor(nameof(AcceptsProduct_Body));
+ action.EndpointMetadata = new List<object>() { new XmlOnlyMetadata() };
+
+ // Act
+ var descriptions = GetApiDescriptions(action);
+
+ // Assert
+ var description = Assert.Single(descriptions);
+ Assert.Collection(
+ description.SupportedRequestFormats.OrderBy(f => f.MediaType.ToString()),
+ f => Assert.Equal("application/xml", f.MediaType.ToString()),
+ f => Assert.Equal("text/xml", f.MediaType.ToString()));
+ }
+
+ [Fact]
public void GetApiDescription_IncludesRequestFormats_FilteredByType()
{
// Arrange
@@ -1375,8 +1434,8 @@ public class DefaultApiDescriptionProviderTest
var action = CreateActionDescriptor(nameof(AcceptsFormFile));
action.FilterDescriptors = new[]
{
- new FilterDescriptor(new ConsumesAttribute("multipart/form-data"), FilterScope.Action),
- };
+ new FilterDescriptor(new ConsumesAttribute("multipart/form-data"), FilterScope.Action),
+ };
// Act
var descriptions = GetApiDescriptions(action);
@@ -2244,10 +2303,12 @@ public class DefaultApiDescriptionProviderTest
}
private ActionResult<Product> ReturnsActionResultOfProduct() => null;
+ private Http.HttpResults.Ok<Product> ReturnsResultOfProductWithEndpointMetadata() => null;
private ActionResult<IEnumerable<Product>> ReturnsActionResultOfSequenceOfProducts() => null;
private Task<ActionResult<Product>> ReturnsTaskOfActionResultOfProduct() => null;
+ private Task<Http.HttpResults.Ok<Product>> ReturnsTaskOfResultOfProductWithEndpointMetadata() => null;
private Task<ActionResult<IEnumerable<Product>>> ReturnsTaskOfActionResultOfSequenceOfProducts() => null;
@@ -2382,6 +2443,9 @@ public class DefaultApiDescriptionProviderTest
[FromHeader]
public string UserId { get; set; }
+ [FromServices]
+ public ITestService TestService { get; set; }
+
[ModelBinder]
public string Comments { get; set; }
@@ -2475,6 +2539,9 @@ public class DefaultApiDescriptionProviderTest
[FromHeader]
public string UserId { get; set; }
+ [FromServices]
+ public ITestService TestService { get; set; }
+
public string Comments { get; set; }
}
@@ -2651,4 +2718,13 @@ public class DefaultApiDescriptionProviderTest
{
public BindingSource BindingSource => BindingSource.FormFile;
}
+
+ private class XmlOnlyMetadata : Http.Metadata.IAcceptsMetadata
+ {
+ public IReadOnlyList<string> ContentTypes => new[] { "text/xml", "application/xml" };
+
+ public Type RequestType => null;
+
+ public bool IsOptional => false;
+ }
}
diff --git a/src/Mvc/Mvc.ApiExplorer/test/EndpointMetadataApiDescriptionProviderTest.cs b/src/Mvc/Mvc.ApiExplorer/test/EndpointMetadataApiDescriptionProviderTest.cs
index 5a77ef5f9b..89ccf38bcb 100644
--- a/src/Mvc/Mvc.ApiExplorer/test/EndpointMetadataApiDescriptionProviderTest.cs
+++ b/src/Mvc/Mvc.ApiExplorer/test/EndpointMetadataApiDescriptionProviderTest.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+#nullable enable
+
using System.ComponentModel;
using System.Reflection;
using System.Security.Claims;
@@ -111,8 +113,6 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.False(apiParameterDescription.IsRequired);
}
-#nullable enable
-
[Fact]
public void AddsMultipleRequestFormatsFromMetadataWithRequiredBodyParameter()
{
@@ -128,8 +128,6 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.True(apiParameterDescription.IsRequired);
}
-#nullable disable
-
[Fact]
public void AddsJsonResponseFormatWhenFromBodyInferred()
{
@@ -138,7 +136,7 @@ public class EndpointMetadataApiDescriptionProviderTest
var responseType = Assert.Single(apiDescription.SupportedResponseTypes);
Assert.Equal(200, responseType.StatusCode);
Assert.Equal(expectedType, responseType.Type);
- Assert.Equal(expectedType, responseType.ModelMetadata.ModelType);
+ Assert.Equal(expectedType, responseType.ModelMetadata?.ModelType);
var responseFormat = Assert.Single(responseType.ApiResponseFormats);
Assert.Equal("application/json", responseFormat.MediaType);
@@ -146,7 +144,7 @@ public class EndpointMetadataApiDescriptionProviderTest
}
AssertJsonResponse(GetApiDescription(() => new InferredJsonClass()), typeof(InferredJsonClass));
- AssertJsonResponse(GetApiDescription(() => (IInferredJsonInterface)null), typeof(IInferredJsonInterface));
+ AssertJsonResponse(GetApiDescription(() => (IInferredJsonInterface)null!), typeof(IInferredJsonInterface));
}
[Fact]
@@ -157,7 +155,7 @@ public class EndpointMetadataApiDescriptionProviderTest
var responseType = Assert.Single(apiDescription.SupportedResponseTypes);
Assert.Equal(200, responseType.StatusCode);
Assert.Equal(typeof(string), responseType.Type);
- Assert.Equal(typeof(string), responseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(string), responseType.ModelMetadata?.ModelType);
var responseFormat = Assert.Single(responseType.ApiResponseFormats);
Assert.Equal("text/plain", responseFormat.MediaType);
@@ -172,7 +170,7 @@ public class EndpointMetadataApiDescriptionProviderTest
var responseType = Assert.Single(apiDescription.SupportedResponseTypes);
Assert.Equal(200, responseType.StatusCode);
Assert.Equal(typeof(void), responseType.Type);
- Assert.Equal(typeof(void), responseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(void), responseType.ModelMetadata?.ModelType);
Assert.Empty(responseType.ApiResponseFormats);
}
@@ -194,7 +192,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal(201, responseType.StatusCode);
Assert.Equal(typeof(TimeSpan), responseType.Type);
- Assert.Equal(typeof(TimeSpan), responseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(TimeSpan), responseType.ModelMetadata?.ModelType);
var responseFormat = Assert.Single(responseType.ApiResponseFormats);
Assert.Equal("application/custom", responseFormat.MediaType);
@@ -214,7 +212,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal(201, createdResponseType.StatusCode);
Assert.Equal(typeof(TimeSpan), createdResponseType.Type);
- Assert.Equal(typeof(TimeSpan), createdResponseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(TimeSpan), createdResponseType.ModelMetadata?.ModelType);
var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats);
Assert.Equal("application/json", createdResponseFormat.MediaType);
@@ -223,7 +221,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal(400, badRequestResponseType.StatusCode);
Assert.Equal(typeof(InferredJsonClass), badRequestResponseType.Type);
- Assert.Equal(typeof(InferredJsonClass), badRequestResponseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(InferredJsonClass), badRequestResponseType.ModelMetadata?.ModelType);
var badRequestResponseFormat = Assert.Single(badRequestResponseType.ApiResponseFormats);
Assert.Equal("application/json", badRequestResponseFormat.MediaType);
@@ -243,7 +241,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal(201, createdResponseType.StatusCode);
Assert.Equal(typeof(InferredJsonClass), createdResponseType.Type);
- Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(InferredJsonClass), createdResponseType.ModelMetadata?.ModelType);
var createdResponseFormat = Assert.Single(createdResponseType.ApiResponseFormats);
Assert.Equal("application/json", createdResponseFormat.MediaType);
@@ -252,7 +250,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal(400, badRequestResponseType.StatusCode);
Assert.Equal(typeof(void), badRequestResponseType.Type);
- Assert.Equal(typeof(void), badRequestResponseType.ModelMetadata.ModelType);
+ Assert.Equal(typeof(void), badRequestResponseType.ModelMetadata?.ModelType);
Assert.Empty(badRequestResponseType.ApiResponseFormats);
}
@@ -415,8 +413,6 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal(42, param.DefaultValue);
}
-#nullable enable
-
[Fact]
public void AddsMultipleParameters()
{
@@ -446,6 +442,48 @@ public class EndpointMetadataApiDescriptionProviderTest
}
#nullable disable
+ [Fact]
+ public void AddsMultipleParametersFromParametersAttribute()
+ {
+ static void AssertParameters(ApiDescription apiDescription, string capturedName = "Foo")
+ {
+ Assert.Collection(
+ apiDescription.ParameterDescriptions,
+ param =>
+ {
+ Assert.Equal(capturedName, param.Name);
+ Assert.Equal(typeof(int), param.ModelMetadata.ModelType);
+ Assert.Equal(BindingSource.Path, param.Source);
+ Assert.True(param.IsRequired);
+ },
+ param =>
+ {
+ Assert.Equal("Bar", param.Name);
+ Assert.Equal(typeof(int), param.ModelMetadata.ModelType);
+ Assert.Equal(BindingSource.Query, param.Source);
+ Assert.True(param.IsRequired);
+ },
+ param =>
+ {
+ Assert.Equal("FromBody", param.Name);
+ Assert.Equal(typeof(InferredJsonClass), param.Type);
+ Assert.Equal(typeof(InferredJsonClass), param.ModelMetadata.ModelType);
+ Assert.Equal(BindingSource.Body, param.Source);
+ Assert.False(param.IsRequired);
+ }
+ );
+ }
+
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListClass req) => { }));
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListClassWithReadOnlyProperties req) => { }));
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListStruct req) => { }));
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListRecord req) => { }));
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListRecordStruct req) => { }));
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListRecordWithoutPositionalParameters req) => { }));
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListRecordWithoutAttributes req) => { }, "/{foo}"), "foo");
+ AssertParameters(GetApiDescription(([AsParameters] ArgumentListRecordWithoutAttributes req) => { }, "/{Foo}"));
+ }
+#nullable enable
[Fact]
public void TestParameterIsRequired()
@@ -486,9 +524,10 @@ public class EndpointMetadataApiDescriptionProviderTest
.FirstOrDefault();
Assert.NotNull(apiExplorerSettings);
- Assert.True(apiExplorerSettings.IgnoreApi);
+ Assert.True(apiExplorerSettings!.IgnoreApi);
}
+#nullable disable
[Fact]
public void TestParameterIsRequiredForObliviousNullabilityContext()
{
@@ -535,6 +574,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.NotNull(description);
Assert.Equal("The name.", description.Description);
}
+#nullable enable
[Fact]
public void RespectsProducesProblemExtensionMethod()
@@ -731,11 +771,12 @@ public class EndpointMetadataApiDescriptionProviderTest
});
}
+#nullable disable
[Fact]
public void HandleAcceptsMetadataWithTypeParameter()
{
// Arrange
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(null));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/api/todos", (InferredJsonClass inferredJsonClass) => "")
.Accepts(typeof(InferredJsonClass), "application/json");
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -758,6 +799,7 @@ public class EndpointMetadataApiDescriptionProviderTest
Assert.Equal("inferredJsonClass", bodyParameterDescription.Name);
Assert.False(bodyParameterDescription.IsRequired);
}
+#nullable enable
[Fact]
public void FavorsProducesMetadataOverAttribute()
@@ -790,15 +832,11 @@ public class EndpointMetadataApiDescriptionProviderTest
});
}
-#nullable enable
-
[Fact]
public void HandleDefaultIAcceptsMetadataForRequiredBodyParameter()
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/api/todos", (InferredJsonClass inferredJsonClass) => "");
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -830,9 +868,7 @@ public class EndpointMetadataApiDescriptionProviderTest
public void HandleDefaultIAcceptsMetadataForOptionalBodyParameter()
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/api/todos", (InferredJsonClass? inferredJsonClass) => "");
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -864,9 +900,7 @@ public class EndpointMetadataApiDescriptionProviderTest
public void HandleIAcceptsMetadataWithConsumesAttributeAndInferredOptionalFromBodyType()
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/api/todos", [Consumes("application/xml")] (InferredJsonClass? inferredJsonClass) => "");
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -898,9 +932,7 @@ public class EndpointMetadataApiDescriptionProviderTest
public void HandleDefaultIAcceptsMetadataForRequiredFormFileParameter()
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/file/upload", (IFormFile formFile) => "");
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -929,9 +961,7 @@ public class EndpointMetadataApiDescriptionProviderTest
public void HandleDefaultIAcceptsMetadataForOptionalFormFileParameter()
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/file/upload", (IFormFile? inferredFormFile) => "");
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -960,9 +990,7 @@ public class EndpointMetadataApiDescriptionProviderTest
public void AddsMultipartFormDataResponseFormatWhenFormFileSpecified()
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/file/upload", (IFormFile file) => Results.NoContent());
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -1050,9 +1078,7 @@ public class EndpointMetadataApiDescriptionProviderTest
static void AssertFormFileCollection(Delegate handler, string expectedName)
{
// Arrange
- var services = new ServiceCollection();
- var serviceProvider = services.BuildServiceProvider();
- var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ var builder = new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
builder.MapPost("/file/upload", handler);
var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
@@ -1077,8 +1103,6 @@ public class EndpointMetadataApiDescriptionProviderTest
}
}
-#nullable restore
-
[Fact]
public void ProducesRouteInfoOnlyForRouteParameters()
{
@@ -1170,11 +1194,11 @@ public class EndpointMetadataApiDescriptionProviderTest
var descriptionMetadata = apiDescription.ActionDescriptor.EndpointMetadata.OfType<IEndpointDescriptionMetadata>().SingleOrDefault();
Assert.NotNull(descriptionMetadata);
- Assert.Equal("A description", descriptionMetadata.Description);
+ Assert.Equal("A description", descriptionMetadata!.Description);
var summaryMetadata = apiDescription.ActionDescriptor.EndpointMetadata.OfType<IEndpointSummaryMetadata>().SingleOrDefault();
Assert.NotNull(summaryMetadata);
- Assert.Equal("A summary", summaryMetadata.Summary);
+ Assert.Equal("A summary", summaryMetadata!.Summary);
}
[Fact]
@@ -1201,11 +1225,39 @@ public class EndpointMetadataApiDescriptionProviderTest
var descriptionMetadata = apiDescription.ActionDescriptor.EndpointMetadata.OfType<IEndpointDescriptionMetadata>().SingleOrDefault();
Assert.NotNull(descriptionMetadata);
- Assert.Equal("A description", descriptionMetadata.Description);
+ Assert.Equal("A description", descriptionMetadata!.Description);
var summaryMetadata = apiDescription.ActionDescriptor.EndpointMetadata.OfType<IEndpointSummaryMetadata>().SingleOrDefault();
Assert.NotNull(summaryMetadata);
- Assert.Equal("A summary", summaryMetadata.Summary);
+ Assert.Equal("A summary", summaryMetadata!.Summary);
+ }
+
+ [Theory]
+ [InlineData("/todos/{id}", "id")]
+ [InlineData("/todos/{Id}", "Id")]
+ [InlineData("/todos/{id:minlen(2)}", "id")]
+ public void FavorsParameterCasingInRoutePattern(string pattern, string expectedName)
+ {
+ var builder = CreateBuilder();
+ builder.MapGet(pattern, (int Id) => "");
+
+ var context = new ApiDescriptionProviderContext(Array.Empty<ActionDescriptor>());
+
+ var endpointDataSource = builder.DataSources.OfType<EndpointDataSource>().Single();
+ var hostEnvironment = new HostEnvironment
+ {
+ ApplicationName = nameof(EndpointMetadataApiDescriptionProviderTest)
+ };
+ var provider = CreateEndpointMetadataApiDescriptionProvider(endpointDataSource);
+
+ // Act
+ provider.OnProvidersExecuting(context);
+
+ // Assert
+ var apiDescription = Assert.Single(context.Results);
+ var parameter = Assert.Single(apiDescription.ParameterDescriptions);
+ Assert.Equal(expectedName, parameter.Name);
+ Assert.Equal(expectedName, parameter.ParameterDescriptor.Name);
}
private static IEnumerable<string> GetSortedMediaTypes(ApiResponseType apiResponseType)
@@ -1217,9 +1269,9 @@ public class EndpointMetadataApiDescriptionProviderTest
private static IList<ApiDescription> GetApiDescriptions(
Delegate action,
- string pattern = null,
- IEnumerable<string> httpMethods = null,
- string displayName = null)
+ string? pattern = null,
+ IEnumerable<string>? httpMethods = null,
+ string? displayName = null)
{
var methodInfo = action.Method;
var attributes = methodInfo.GetCustomAttributes();
@@ -1248,9 +1300,9 @@ public class EndpointMetadataApiDescriptionProviderTest
new ServiceProviderIsService());
private static TestEndpointRouteBuilder CreateBuilder() =>
- new TestEndpointRouteBuilder(new ApplicationBuilder(new TestServiceProvider()));
+ new TestEndpointRouteBuilder(new ApplicationBuilder(TestServiceProvider.Instance));
- private static ApiDescription GetApiDescription(Delegate action, string pattern = null, string displayName = null, IEnumerable<string> httpMethods = null) =>
+ private static ApiDescription GetApiDescription(Delegate action, string? pattern = null, string? displayName = null, IEnumerable<string>? httpMethods = null) =>
Assert.Single(GetApiDescriptions(action, pattern, displayName: displayName, httpMethods: httpMethods));
private static void TestAction()
@@ -1280,10 +1332,10 @@ public class EndpointMetadataApiDescriptionProviderTest
private class HostEnvironment : IHostEnvironment
{
- public string EnvironmentName { get; set; }
- public string ApplicationName { get; set; }
- public string ContentRootPath { get; set; }
- public IFileProvider ContentRootFileProvider { get; set; }
+ public string EnvironmentName { get; set; } = null!;
+ public required string ApplicationName { get; set; }
+ public string ContentRootPath { get; set; } = null!;
+ public IFileProvider ContentRootFileProvider { get; set; } = null!;
}
private class TestEndpointRouteBuilder : IEndpointRouteBuilder
@@ -1323,13 +1375,49 @@ public class EndpointMetadataApiDescriptionProviderTest
throw new NotImplementedException();
}
+ private record ArgumentListRecord([FromRoute] int Foo, int Bar, InferredJsonClass? FromBody, HttpContext context);
+
+ private record struct ArgumentListRecordStruct([FromRoute] int Foo, int Bar, InferredJsonClass? FromBody, HttpContext context);
+
+ private record ArgumentListRecordWithoutAttributes(int Foo, int Bar, InferredJsonClass? FromBody, HttpContext context);
+
+ private record ArgumentListRecordWithoutPositionalParameters
+ {
+ [FromRoute]
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ public InferredJsonClass? FromBody { get; set; }
+ public HttpContext Context { get; set; } = null!;
+ }
+
+ private class ArgumentListClass
+ {
+ [FromRoute]
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ public InferredJsonClass? FromBody { get; set; }
+ public HttpContext Context { get; set; } = null!;
+ }
+
+ private class ArgumentListClassWithReadOnlyProperties : ArgumentListClass
+ {
+ public int ReadOnly { get; }
+ }
+
+ private struct ArgumentListStruct
+ {
+ [FromRoute]
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ public InferredJsonClass? FromBody { get; set; }
+ public HttpContext Context { get; set; }
+ }
+
private class TestServiceProvider : IServiceProvider
{
- public void Dispose()
- {
- }
+ public static TestServiceProvider Instance { get; } = new TestServiceProvider();
- public object GetService(Type serviceType)
+ public object? GetService(Type serviceType)
{
if (serviceType == typeof(IOptions<RouteHandlerOptions>))
{
diff --git a/src/Mvc/Mvc.Core/src/AcceptVerbsAttribute.cs b/src/Mvc/Mvc.Core/src/AcceptVerbsAttribute.cs
index 39a7651cb3..103a0f7288 100644
--- a/src/Mvc/Mvc.Core/src/AcceptVerbsAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/AcceptVerbsAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Routing;
@@ -46,6 +47,7 @@ public sealed class AcceptVerbsAttribute : Attribute, IActionHttpMethodProvider,
/// <summary>
/// The route template. May be null.
/// </summary>
+ [StringSyntax("Route")]
public string? Route { get; set; }
/// <inheritdoc />
diff --git a/src/Mvc/Mvc.Core/src/ActionConstraints/ActionConstraintCache.cs b/src/Mvc/Mvc.Core/src/ActionConstraints/ActionConstraintCache.cs
index 844729976b..cd437ebc13 100644
--- a/src/Mvc/Mvc.Core/src/ActionConstraints/ActionConstraintCache.cs
+++ b/src/Mvc/Mvc.Core/src/ActionConstraints/ActionConstraintCache.cs
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Mvc.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.ActionConstraints;
-internal class ActionConstraintCache
+internal sealed class ActionConstraintCache
{
private readonly IActionDescriptorCollectionProvider _collectionProvider;
private readonly IActionConstraintProvider[] _actionConstraintProviders;
@@ -163,7 +163,7 @@ internal class ActionConstraintCache
return actionConstraints;
}
- internal class InnerCache
+ internal sealed class InnerCache
{
private readonly ActionDescriptorCollection _actions;
diff --git a/src/Mvc/Mvc.Core/src/ActionConstraints/DefaultActionConstraintProvider.cs b/src/Mvc/Mvc.Core/src/ActionConstraints/DefaultActionConstraintProvider.cs
index ba7678c6b3..a1883f2762 100644
--- a/src/Mvc/Mvc.Core/src/ActionConstraints/DefaultActionConstraintProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ActionConstraints/DefaultActionConstraintProvider.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.ActionConstraints;
/// <see cref="IActionConstraintMetadata"/> implements <see cref="IActionConstraint"/> or
/// <see cref="IActionConstraintFactory"/>/
/// </remarks>
-internal class DefaultActionConstraintProvider : IActionConstraintProvider
+internal sealed class DefaultActionConstraintProvider : IActionConstraintProvider
{
/// <inheritdoc />
public int Order => -1000;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/ApiBehaviorApplicationModelProvider.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/ApiBehaviorApplicationModelProvider.cs
index d42b6b3f6e..09e0d633f3 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/ApiBehaviorApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/ApiBehaviorApplicationModelProvider.cs
@@ -23,6 +23,7 @@ internal sealed class ApiBehaviorApplicationModelProvider : IApplicationModelPro
ActionModelConventions = new List<IActionModelConvention>()
{
new ApiVisibilityConvention(),
+ new EndpointMetadataConvention(serviceProvider)
};
if (!options.SuppressMapClientErrors)
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/ApiConventionApplicationModelConvention.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/ApiConventionApplicationModelConvention.cs
index a89c06c34f..cba692149f 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/ApiConventionApplicationModelConvention.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/ApiConventionApplicationModelConvention.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/ApplicationModelFactory.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/ApplicationModelFactory.cs
index 3b38d0eda5..5d98a9b177 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/ApplicationModelFactory.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/ApplicationModelFactory.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
/// <summary>
/// A facade service for creating application models.
/// </summary>
-internal class ApplicationModelFactory
+internal sealed class ApplicationModelFactory
{
private readonly IApplicationModelProvider[] _applicationModelProviders;
private readonly IList<IApplicationModelConvention> _conventions;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/AttributeRouteModel.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/AttributeRouteModel.cs
index fcf2311a14..b07f5fe381 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/AttributeRouteModel.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/AttributeRouteModel.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Mvc.Core;
@@ -67,6 +68,7 @@ public class AttributeRouteModel
/// <summary>
/// Gets or sets the attribute route template.
/// </summary>
+ [StringSyntax("Route")]
public string? Template { get; set; }
/// <summary>
@@ -140,7 +142,7 @@ public class AttributeRouteModel
/// <param name="prefix">The prefix.</param>
/// <param name="template">The route template.</param>
/// <returns>The combined pattern.</returns>
- public static string? CombineTemplates(string? prefix, string? template)
+ public static string? CombineTemplates([StringSyntax("Route")] string? prefix, [StringSyntax("Route")] string? template)
{
var result = CombineCore(prefix, template);
return CleanTemplate(result);
@@ -154,7 +156,7 @@ public class AttributeRouteModel
/// <remarks>
/// Route templates starting with "~/" or "/" can be used to override the prefix.
/// </remarks>
- public static bool IsOverridePattern(string? template)
+ public static bool IsOverridePattern([StringSyntax("Route")] string? template)
{
return template != null &&
(template.StartsWith("~/", StringComparison.Ordinal) ||
@@ -265,7 +267,7 @@ public class AttributeRouteModel
/// <param name="values">The token values to use.</param>
/// <param name="routeTokenTransformer">The route token transformer.</param>
/// <returns>A new string with the replaced values.</returns>
- public static string ReplaceTokens(string template, IDictionary<string, string?> values, IOutboundParameterTransformer? routeTokenTransformer)
+ public static string ReplaceTokens([StringSyntax("Route")] string template, IDictionary<string, string?> values, IOutboundParameterTransformer? routeTokenTransformer)
{
var builder = new StringBuilder();
var state = TemplateParserState.Plaintext;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/AuthorizationApplicationModelProvider.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/AuthorizationApplicationModelProvider.cs
index 2cfb3d12eb..907756de33 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/AuthorizationApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/AuthorizationApplicationModelProvider.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class AuthorizationApplicationModelProvider : IApplicationModelProvider
+internal sealed class AuthorizationApplicationModelProvider : IApplicationModelProvider
{
private readonly MvcOptions _mvcOptions;
private readonly IAuthorizationPolicyProvider _policyProvider;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/ControllerActionDescriptorProvider.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/ControllerActionDescriptorProvider.cs
index d17d97e2de..7f4725bcad 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/ControllerActionDescriptorProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/ControllerActionDescriptorProvider.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc.Controllers;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class ControllerActionDescriptorProvider : IActionDescriptorProvider
+internal sealed class ControllerActionDescriptorProvider : IActionDescriptorProvider
{
private readonly ApplicationPartManager _partManager;
private readonly ApplicationModelFactory _applicationModelFactory;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs
index 4bbb84f82e..cfce701f8f 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs
@@ -15,7 +15,9 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
+#pragma warning disable CA1852 // Seal internal types
internal class DefaultApplicationModelProvider : IApplicationModelProvider
+#pragma warning restore CA1852 // Seal internal types
{
private readonly MvcOptions _mvcOptions;
private readonly IModelMetadataProvider _modelMetadataProvider;
diff --git a/src/Mvc/Mvc.Core/src/ApplicationModels/EndpointMetadataConvention.cs b/src/Mvc/Mvc.Core/src/ApplicationModels/EndpointMetadataConvention.cs
new file mode 100644
index 0000000000..b830993746
--- /dev/null
+++ b/src/Mvc/Mvc.Core/src/ApplicationModels/EndpointMetadataConvention.cs
@@ -0,0 +1,97 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.Extensions.Internal;
+
+namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
+
+internal sealed class EndpointMetadataConvention : IActionModelConvention
+{
+ private static readonly MethodInfo PopulateMetadataForEndpointMethod = typeof(EndpointMetadataConvention).GetMethod(nameof(PopulateMetadataForEndpoint), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo PopulateMetadataForParameterMethod = typeof(EndpointMetadataConvention).GetMethod(nameof(PopulateMetadataForParameter), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private readonly IServiceProvider _serviceProvider;
+
+ public EndpointMetadataConvention(IServiceProvider serviceProvider)
+ {
+ _serviceProvider = serviceProvider;
+ }
+
+ public void Apply(ActionModel action)
+ {
+ // Get metadata from parameter types
+ ApplyParametersMetadata(action);
+
+ // Get metadata from return type
+ ApplyReturnTypeMetadata(action);
+ }
+
+ private void ApplyReturnTypeMetadata(ActionModel action)
+ {
+ var returnType = action.ActionMethod.ReturnType;
+ if (AwaitableInfo.IsTypeAwaitable(returnType, out var awaitableInfo))
+ {
+ returnType = awaitableInfo.ResultType;
+ }
+
+ if (returnType is not null && typeof(IEndpointMetadataProvider).IsAssignableFrom(returnType))
+ {
+ object?[]? invokeArgs = null;
+
+ for (var i = 0; i < action.Selectors.Count; i++)
+ {
+ // Return type implements IEndpointMetadataProvider
+ var context = new EndpointMetadataContext(action.ActionMethod, action.Selectors[i].EndpointMetadata, _serviceProvider);
+ invokeArgs ??= new object[1];
+ invokeArgs[0] = context;
+ PopulateMetadataForEndpointMethod.MakeGenericMethod(returnType).Invoke(null, invokeArgs);
+ }
+ }
+ }
+
+ private void ApplyParametersMetadata(ActionModel action)
+ {
+ object?[]? invokeArgs = null;
+ var parameters = action.ActionMethod.GetParameters();
+
+ foreach (var parameter in parameters)
+ {
+ if (typeof(IEndpointParameterMetadataProvider).IsAssignableFrom(parameter.ParameterType))
+ {
+ for (var i = 0; i < action.Selectors.Count; i++)
+ {
+ // Parameter type implements IEndpointParameterMetadataProvider
+ var context = new EndpointParameterMetadataContext(parameter, action.Selectors[i].EndpointMetadata, _serviceProvider);
+ invokeArgs ??= new object[1];
+ invokeArgs[0] = context;
+ PopulateMetadataForParameterMethod.MakeGenericMethod(parameter.ParameterType).Invoke(null, invokeArgs);
+ }
+ }
+
+ if (typeof(IEndpointMetadataProvider).IsAssignableFrom(parameter.ParameterType))
+ {
+ for (var i = 0; i < action.Selectors.Count; i++)
+ {
+ // Return type implements IEndpointMetadataProvider
+ var context = new EndpointMetadataContext(action.ActionMethod, action.Selectors[i].EndpointMetadata, _serviceProvider);
+ invokeArgs ??= new object[1];
+ invokeArgs[0] = context;
+ PopulateMetadataForEndpointMethod.MakeGenericMethod(parameter.ParameterType).Invoke(null, invokeArgs);
+ }
+ }
+ }
+ }
+
+ private static void PopulateMetadataForParameter<T>(EndpointParameterMetadataContext parameterContext)
+ where T : IEndpointParameterMetadataProvider
+ {
+ T.PopulateMetadata(parameterContext);
+ }
+
+ private static void PopulateMetadataForEndpoint<T>(EndpointMetadataContext context)
+ where T : IEndpointMetadataProvider
+ {
+ T.PopulateMetadata(context);
+ }
+}
diff --git a/src/Mvc/Mvc.Core/src/ApplicationParts/RelatedAssemblyAttribute.cs b/src/Mvc/Mvc.Core/src/ApplicationParts/RelatedAssemblyAttribute.cs
index 8d00dcf37c..6de996f61b 100644
--- a/src/Mvc/Mvc.Core/src/ApplicationParts/RelatedAssemblyAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/ApplicationParts/RelatedAssemblyAttribute.cs
@@ -121,7 +121,9 @@ public sealed class RelatedAssemblyAttribute : Attribute
return relatedAssemblies;
}
+#pragma warning disable CA1852 // Seal internal types
internal class AssemblyLoadContextWrapper
+#pragma warning restore CA1852 // Seal internal types
{
private readonly AssemblyLoadContext _loadContext;
diff --git a/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs b/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs
index 1ad4fa09ad..20e4a9818e 100644
--- a/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs
+++ b/src/Mvc/Mvc.Core/src/Builder/ControllerActionEndpointConventionBuilder.cs
@@ -14,11 +14,13 @@ public sealed class ControllerActionEndpointConventionBuilder : IEndpointConvent
// The lock is shared with the data source.
private readonly object _lock;
private readonly List<Action<EndpointBuilder>> _conventions;
+ private readonly List<Action<EndpointBuilder>> _finallyConventions;
- internal ControllerActionEndpointConventionBuilder(object @lock, List<Action<EndpointBuilder>> conventions)
+ internal ControllerActionEndpointConventionBuilder(object @lock, List<Action<EndpointBuilder>> conventions, List<Action<EndpointBuilder>> finallyConventions)
{
_lock = @lock;
_conventions = conventions;
+ _finallyConventions = finallyConventions;
}
/// <summary>
@@ -39,4 +41,15 @@ public sealed class ControllerActionEndpointConventionBuilder : IEndpointConvent
_conventions.Add(convention);
}
}
+
+ /// <inheritdoc />
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ ArgumentNullException.ThrowIfNull(nameof(finalConvention));
+
+ lock (_lock)
+ {
+ _finallyConventions.Add(finalConvention);
+ };
+ }
}
diff --git a/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs b/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs
index 8663af8e9c..cfec6bb725 100644
--- a/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs
+++ b/src/Mvc/Mvc.Core/src/Builder/ControllerEndpointRouteBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Microsoft.AspNetCore.Mvc.Core;
using Microsoft.AspNetCore.Mvc.Infrastructure;
@@ -85,7 +86,7 @@ public static class ControllerEndpointRouteBuilderExtensions
public static ControllerActionEndpointConventionBuilder MapControllerRoute(
this IEndpointRouteBuilder endpoints,
string name,
- string pattern,
+ [StringSyntax("Route")] string pattern,
object? defaults = null,
object? constraints = null,
object? dataTokens = null)
@@ -134,7 +135,7 @@ public static class ControllerEndpointRouteBuilderExtensions
this IEndpointRouteBuilder endpoints,
string name,
string areaName,
- string pattern,
+ [StringSyntax("Route")] string pattern,
object? defaults = null,
object? constraints = null,
object? dataTokens = null)
@@ -263,7 +264,7 @@ public static class ControllerEndpointRouteBuilderExtensions
/// </remarks>
public static IEndpointConventionBuilder MapFallbackToController(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
string action,
string controller)
{
@@ -414,7 +415,7 @@ public static class ControllerEndpointRouteBuilderExtensions
/// </remarks>
public static IEndpointConventionBuilder MapFallbackToAreaController(
this IEndpointRouteBuilder endpoints,
- string pattern,
+ [StringSyntax("Route")] string pattern,
string action,
string controller,
string area)
@@ -475,7 +476,7 @@ public static class ControllerEndpointRouteBuilderExtensions
/// Register <typeparamref name="TTransformer"/> with the desired service lifetime in <c>ConfigureServices</c>.
/// </para>
/// </remarks>
- public static void MapDynamicControllerRoute<TTransformer>(this IEndpointRouteBuilder endpoints, string pattern)
+ public static void MapDynamicControllerRoute<TTransformer>(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern)
where TTransformer : DynamicRouteValueTransformer
{
if (endpoints == null)
@@ -505,7 +506,7 @@ public static class ControllerEndpointRouteBuilderExtensions
/// is required when using <paramref name="state" />.
/// </para>
/// </remarks>
- public static void MapDynamicControllerRoute<TTransformer>(this IEndpointRouteBuilder endpoints, string pattern, object? state)
+ public static void MapDynamicControllerRoute<TTransformer>(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, object? state)
where TTransformer : DynamicRouteValueTransformer
{
if (endpoints == null)
@@ -543,7 +544,7 @@ public static class ControllerEndpointRouteBuilderExtensions
/// is required when using <paramref name="state" />.
/// </para>
/// </remarks>
- public static void MapDynamicControllerRoute<TTransformer>(this IEndpointRouteBuilder endpoints, string pattern, object state, int order)
+ public static void MapDynamicControllerRoute<TTransformer>(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string pattern, object state, int order)
where TTransformer : DynamicRouteValueTransformer
{
if (endpoints == null)
diff --git a/src/Mvc/Mvc.Core/src/Builder/MvcApplicationBuilderExtensions.cs b/src/Mvc/Mvc.Core/src/Builder/MvcApplicationBuilderExtensions.cs
index 0cdc40a820..5930386369 100644
--- a/src/Mvc/Mvc.Core/src/Builder/MvcApplicationBuilderExtensions.cs
+++ b/src/Mvc/Mvc.Core/src/Builder/MvcApplicationBuilderExtensions.cs
@@ -101,7 +101,7 @@ public static class MvcApplicationBuilderExtensions
return app.UseRouter(routes.Build());
}
- private class EndpointRouteBuilder : IRouteBuilder
+ private sealed class EndpointRouteBuilder : IRouteBuilder
{
public EndpointRouteBuilder(IApplicationBuilder applicationBuilder)
{
diff --git a/src/Mvc/Mvc.Core/src/Builder/MvcAreaRouteBuilderExtensions.cs b/src/Mvc/Mvc.Core/src/Builder/MvcAreaRouteBuilderExtensions.cs
index 87ba6ab3f7..7461bc9b25 100644
--- a/src/Mvc/Mvc.Core/src/Builder/MvcAreaRouteBuilderExtensions.cs
+++ b/src/Mvc/Mvc.Core/src/Builder/MvcAreaRouteBuilderExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Core;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Constraints;
@@ -25,7 +26,7 @@ public static class MvcAreaRouteBuilderExtensions
this IRouteBuilder routeBuilder,
string name,
string areaName,
- string? template)
+ [StringSyntax("Route")] string? template)
{
MapAreaRoute(routeBuilder, name, areaName, template, defaults: null, constraints: null, dataTokens: null);
return routeBuilder;
@@ -49,7 +50,7 @@ public static class MvcAreaRouteBuilderExtensions
this IRouteBuilder routeBuilder,
string name,
string areaName,
- string? template,
+ [StringSyntax("Route")] string? template,
object? defaults)
{
MapAreaRoute(routeBuilder, name, areaName, template, defaults, constraints: null, dataTokens: null);
@@ -78,7 +79,7 @@ public static class MvcAreaRouteBuilderExtensions
this IRouteBuilder routeBuilder,
string name,
string areaName,
- string? template,
+ [StringSyntax("Route")] string? template,
object? defaults,
object? constraints)
{
@@ -112,7 +113,7 @@ public static class MvcAreaRouteBuilderExtensions
this IRouteBuilder routeBuilder,
string name,
string areaName,
- string? template,
+ [StringSyntax("Route")] string? template,
object? defaults,
object? constraints,
object? dataTokens)
diff --git a/src/Mvc/Mvc.Core/src/ControllerBase.cs b/src/Mvc/Mvc.Core/src/ControllerBase.cs
index d1c9a840d7..5fddac183d 100644
--- a/src/Mvc/Mvc.Core/src/ControllerBase.cs
+++ b/src/Mvc/Mvc.Core/src/ControllerBase.cs
@@ -2619,7 +2619,7 @@ public abstract class ControllerBase
public async Task<bool> TryUpdateModelAsync<TModel>(
TModel model,
string prefix,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (model == null)
@@ -2710,7 +2710,7 @@ public abstract class ControllerBase
TModel model,
string prefix,
IValueProvider valueProvider,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (model == null)
diff --git a/src/Mvc/Mvc.Core/src/Controllers/ControllerActionDescriptor.cs b/src/Mvc/Mvc.Core/src/Controllers/ControllerActionDescriptor.cs
index ba84f8389e..d8a9ee154a 100644
--- a/src/Mvc/Mvc.Core/src/Controllers/ControllerActionDescriptor.cs
+++ b/src/Mvc/Mvc.Core/src/Controllers/ControllerActionDescriptor.cs
@@ -4,6 +4,7 @@
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Internal;
@@ -36,6 +37,8 @@ public class ControllerActionDescriptor : ActionDescriptor
/// </summary>
public TypeInfo ControllerTypeInfo { get; set; } = default!;
+ internal EndpointFilterDelegate? FilterDelegate { get; set; }
+
// Cache entry so we can avoid an external cache
internal ControllerActionInvokerCacheEntry? CacheEntry { get; set; }
diff --git a/src/Mvc/Mvc.Core/src/Controllers/ControllerFactoryProvider.cs b/src/Mvc/Mvc.Core/src/Controllers/ControllerFactoryProvider.cs
index f7296ca244..eb3591f159 100644
--- a/src/Mvc/Mvc.Core/src/Controllers/ControllerFactoryProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Controllers/ControllerFactoryProvider.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Core;
namespace Microsoft.AspNetCore.Mvc.Controllers;
-internal class ControllerFactoryProvider : IControllerFactoryProvider
+internal sealed class ControllerFactoryProvider : IControllerFactoryProvider
{
private readonly IControllerActivatorProvider _activatorProvider;
private readonly Func<ControllerContext, object>? _factoryCreateController;
diff --git a/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerActivator.cs b/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerActivator.cs
index 4d154a0a7b..22a5d8cc70 100644
--- a/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerActivator.cs
+++ b/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerActivator.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers;
/// <summary>
/// <see cref="IControllerActivator"/> that uses type activation to create controllers.
/// </summary>
-internal class DefaultControllerActivator : IControllerActivator
+internal sealed class DefaultControllerActivator : IControllerActivator
{
private readonly ITypeActivatorCache _typeActivatorCache;
diff --git a/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerFactory.cs b/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerFactory.cs
index 04d2e475b4..32e1c00280 100644
--- a/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Controllers/DefaultControllerFactory.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Controllers;
/// <summary>
/// Default implementation for <see cref="IControllerFactory"/>.
/// </summary>
-internal class DefaultControllerFactory : IControllerFactory
+internal sealed class DefaultControllerFactory : IControllerFactory
{
private readonly IControllerActivator _controllerActivator;
private readonly IControllerPropertyActivator[] _propertyActivators;
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/ApiBehaviorOptionsSetup.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/ApiBehaviorOptionsSetup.cs
index 0e8520200d..38c9561235 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/ApiBehaviorOptionsSetup.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/ApiBehaviorOptionsSetup.cs
@@ -1,14 +1,14 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using Microsoft.AspNetCore.Http.Extensions;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.DependencyInjection;
-internal class ApiBehaviorOptionsSetup : IConfigureOptions<ApiBehaviorOptions>
+internal sealed class ApiBehaviorOptionsSetup : IConfigureOptions<ApiBehaviorOptions>
{
private ProblemDetailsFactory? _problemDetailsFactory;
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/ApplicationModelConventionExtensions.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/ApplicationModelConventionExtensions.cs
index ddb4b43466..2a819780d5 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/ApplicationModelConventionExtensions.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/ApplicationModelConventionExtensions.cs
@@ -150,7 +150,7 @@ public static class ApplicationModelConventionExtensions
conventions.Add(new ParameterBaseApplicationModelConvention(parameterModelConvention));
}
- private class ParameterApplicationModelConvention : IApplicationModelConvention
+ private sealed class ParameterApplicationModelConvention : IApplicationModelConvention
{
private readonly IParameterModelConvention _parameterModelConvention;
@@ -185,7 +185,7 @@ public static class ApplicationModelConventionExtensions
}
}
- private class ParameterBaseApplicationModelConvention :
+ private sealed class ParameterBaseApplicationModelConvention :
IApplicationModelConvention, IParameterModelBaseConvention
{
private readonly IParameterModelBaseConvention _parameterBaseModelConvention;
@@ -215,7 +215,7 @@ public static class ApplicationModelConventionExtensions
}
}
- private class ActionApplicationModelConvention : IApplicationModelConvention
+ private sealed class ActionApplicationModelConvention : IApplicationModelConvention
{
private readonly IActionModelConvention _actionModelConvention;
@@ -251,7 +251,7 @@ public static class ApplicationModelConventionExtensions
}
}
- private class ControllerApplicationModelConvention : IApplicationModelConvention
+ private sealed class ControllerApplicationModelConvention : IApplicationModelConvention
{
private readonly IControllerModelConvention _controllerModelConvention;
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcBuilder.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcBuilder.cs
index f767d6e3b8..16f7861535 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcBuilder.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcBuilder.cs
@@ -8,7 +8,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Allows fine grained configuration of MVC services.
/// </summary>
-internal class MvcBuilder : IMvcBuilder
+internal sealed class MvcBuilder : IMvcBuilder
{
/// <summary>
/// Initializes a new <see cref="MvcBuilder"/> instance.
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreBuilder.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreBuilder.cs
index 3ec8a5a703..088ae7ce14 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreBuilder.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreBuilder.cs
@@ -8,7 +8,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Allows fine grained configuration of essential MVC services.
/// </summary>
-internal class MvcCoreBuilder : IMvcCoreBuilder
+internal sealed class MvcCoreBuilder : IMvcCoreBuilder
{
/// <summary>
/// Initializes a new <see cref="MvcCoreBuilder"/> instance.
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreRouteOptionsSetup.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreRouteOptionsSetup.cs
index 31c8bb818e..078c69bdb5 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreRouteOptionsSetup.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreRouteOptionsSetup.cs
@@ -10,7 +10,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Sets up MVC default options for <see cref="RouteOptions"/>.
/// </summary>
-internal class MvcCoreRouteOptionsSetup : IConfigureOptions<RouteOptions>
+internal sealed class MvcCoreRouteOptionsSetup : IConfigureOptions<RouteOptions>
{
/// <summary>
/// Configures the <see cref="RouteOptions"/>.
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreServiceCollectionExtensions.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreServiceCollectionExtensions.cs
index 7aaa42d5af..f81bd4df0b 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreServiceCollectionExtensions.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcCoreServiceCollectionExtensions.cs
@@ -4,6 +4,7 @@
using System.Buffers;
using System.Linq;
using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
@@ -254,7 +255,6 @@ public static class MvcCoreServiceCollectionExtensions
services.TryAddSingleton<IActionResultExecutor<ContentResult>, ContentResultExecutor>();
services.TryAddSingleton<IActionResultExecutor<JsonResult>, SystemTextJsonResultExecutor>();
services.TryAddSingleton<IClientErrorFactory, ProblemDetailsClientErrorFactory>();
- services.TryAddSingleton<ProblemDetailsFactory, DefaultProblemDetailsFactory>();
//
// Route Handlers
@@ -281,6 +281,10 @@ public static class MvcCoreServiceCollectionExtensions
services.TryAddSingleton<MiddlewareFilterBuilder>();
// Sets ApplicationBuilder on MiddlewareFilterBuilder
services.TryAddEnumerable(ServiceDescriptor.Singleton<IStartupFilter, MiddlewareFilterBuilderStartupFilter>());
+
+ // ProblemDetails
+ services.TryAddSingleton<ProblemDetailsFactory, DefaultProblemDetailsFactory>();
+ services.TryAddEnumerable(ServiceDescriptor.Singleton<IProblemDetailsWriter, DefaultApiProblemDetailsWriter>());
}
private static void ConfigureDefaultServices(IServiceCollection services)
diff --git a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcMarkerService.cs b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcMarkerService.cs
index 2bf80fe152..b771c30252 100644
--- a/src/Mvc/Mvc.Core/src/DependencyInjection/MvcMarkerService.cs
+++ b/src/Mvc/Mvc.Core/src/DependencyInjection/MvcMarkerService.cs
@@ -7,6 +7,6 @@ namespace Microsoft.Extensions.DependencyInjection;
/// A marker class used to determine if all the MVC services were added
/// to the <see cref="IServiceCollection"/> before MVC is configured.
/// </summary>
-internal class MvcMarkerService
+internal sealed class MvcMarkerService
{
}
diff --git a/src/Mvc/Mvc.Core/src/DisableRequestSizeLimitAttribute.cs b/src/Mvc/Mvc.Core/src/DisableRequestSizeLimitAttribute.cs
index 456ccaf3fc..1128509016 100644
--- a/src/Mvc/Mvc.Core/src/DisableRequestSizeLimitAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/DisableRequestSizeLimitAttribute.cs
@@ -1,6 +1,7 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
@@ -9,8 +10,12 @@ namespace Microsoft.AspNetCore.Mvc;
/// <summary>
/// Disables the request body size limit.
/// </summary>
+/// <remarks>
+/// Disabling the request body size limit can be a security concern in regards to uncontrolled
+/// resource consumption, particularly if the request body is being buffered.
+/// </remarks>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
-public class DisableRequestSizeLimitAttribute : Attribute, IFilterFactory, IOrderedFilter
+public class DisableRequestSizeLimitAttribute : Attribute, IFilterFactory, IOrderedFilter, IRequestSizeLimitMetadata
{
/// <summary>
/// Gets the order value for determining the order of execution of filters. Filters execute in
@@ -39,4 +44,7 @@ public class DisableRequestSizeLimitAttribute : Attribute, IFilterFactory, IOrde
var filter = serviceProvider.GetRequiredService<DisableRequestSizeLimitFilter>();
return filter;
}
+
+ /// <inheritdoc />
+ long? IRequestSizeLimitMetadata.MaxRequestBodySize => null;
}
diff --git a/src/Mvc/Mvc.Core/src/Filters/ControllerActionFilter.cs b/src/Mvc/Mvc.Core/src/Filters/ControllerActionFilter.cs
index 6023d63fa3..a9ff346796 100644
--- a/src/Mvc/Mvc.Core/src/Filters/ControllerActionFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/ControllerActionFilter.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// A filter implementation which delegates to the controller for action filter interfaces.
/// </summary>
-internal class ControllerActionFilter : IAsyncActionFilter, IOrderedFilter
+internal sealed class ControllerActionFilter : IAsyncActionFilter, IOrderedFilter
{
// Controller-filter methods run farthest from the action by default.
/// <inheritdoc />
diff --git a/src/Mvc/Mvc.Core/src/Filters/ControllerResultFilter.cs b/src/Mvc/Mvc.Core/src/Filters/ControllerResultFilter.cs
index fe53df4451..9a39762f96 100644
--- a/src/Mvc/Mvc.Core/src/Filters/ControllerResultFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/ControllerResultFilter.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// A filter implementation which delegates to the controller for result filter interfaces.
/// </summary>
-internal class ControllerResultFilter : IAsyncResultFilter, IOrderedFilter
+internal sealed class ControllerResultFilter : IAsyncResultFilter, IOrderedFilter
{
// Controller-filter methods run farthest from the result by default.
/// <inheritdoc />
diff --git a/src/Mvc/Mvc.Core/src/Filters/DefaultFilterProvider.cs b/src/Mvc/Mvc.Core/src/Filters/DefaultFilterProvider.cs
index 689f7b4f91..d9e31adbf1 100644
--- a/src/Mvc/Mvc.Core/src/Filters/DefaultFilterProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/DefaultFilterProvider.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Core;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class DefaultFilterProvider : IFilterProvider
+internal sealed class DefaultFilterProvider : IFilterProvider
{
public int Order => -1000;
diff --git a/src/Mvc/Mvc.Core/src/Filters/DisableRequestSizeLimitFilter.cs b/src/Mvc/Mvc.Core/src/Filters/DisableRequestSizeLimitFilter.cs
index 236c18821a..9a8c21f631 100644
--- a/src/Mvc/Mvc.Core/src/Filters/DisableRequestSizeLimitFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/DisableRequestSizeLimitFilter.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// A filter that sets <see cref="IHttpMaxRequestBodySizeFeature.MaxRequestBodySize"/>
/// to <c>null</c>.
/// </summary>
-internal partial class DisableRequestSizeLimitFilter : IAuthorizationFilter, IRequestSizePolicy
+internal sealed partial class DisableRequestSizeLimitFilter : IAuthorizationFilter, IRequestSizePolicy
{
private readonly ILogger _logger;
diff --git a/src/Mvc/Mvc.Core/src/Filters/FilterDescriptorOrderComparer.cs b/src/Mvc/Mvc.Core/src/Filters/FilterDescriptorOrderComparer.cs
index 69142688f1..39d35a510e 100644
--- a/src/Mvc/Mvc.Core/src/Filters/FilterDescriptorOrderComparer.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/FilterDescriptorOrderComparer.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class FilterDescriptorOrderComparer : IComparer<FilterDescriptor>
+internal sealed class FilterDescriptorOrderComparer : IComparer<FilterDescriptor>
{
public static FilterDescriptorOrderComparer Comparer { get; } = new FilterDescriptorOrderComparer();
diff --git a/src/Mvc/Mvc.Core/src/Filters/IOutputCacheFilter.cs b/src/Mvc/Mvc.Core/src/Filters/IOutputCacheFilter.cs
new file mode 100644
index 0000000000..d852233e48
--- /dev/null
+++ b/src/Mvc/Mvc.Core/src/Filters/IOutputCacheFilter.cs
@@ -0,0 +1,11 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Mvc.Filters;
+
+/// <summary>
+/// A filter which sets the appropriate headers related to Output caching.
+/// </summary>
+internal interface IOutputCacheFilter : IFilterMetadata
+{
+}
diff --git a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilter.cs b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilter.cs
index f3e57cf43a..34f33e92be 100644
--- a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilter.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Http;
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// A filter which executes a user configured middleware pipeline.
/// </summary>
-internal class MiddlewareFilter : IAsyncResourceFilter
+internal sealed class MiddlewareFilter : IAsyncResourceFilter
{
private readonly RequestDelegate _middlewarePipeline;
diff --git a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilder.cs b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilder.cs
index 852bca39da..46a656ae77 100644
--- a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilder.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilder.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// Builds a middleware pipeline after receiving the pipeline from a pipeline provider
/// </summary>
-internal class MiddlewareFilterBuilder
+internal sealed class MiddlewareFilterBuilder
{
// 'GetOrAdd' call on the dictionary is not thread safe and we might end up creating the pipeline more than
// once. To prevent this Lazy<> is used. In the worst case multiple Lazy<> objects are created for multiple
diff --git a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilderStartupFilter.cs b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilderStartupFilter.cs
index b7f8eab3a4..91b3580185 100644
--- a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilderStartupFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterBuilderStartupFilter.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Builder;
@@ -7,7 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class MiddlewareFilterBuilderStartupFilter : IStartupFilter
+internal sealed class MiddlewareFilterBuilderStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
diff --git a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterConfigurationProvider.cs b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterConfigurationProvider.cs
index 803a014e3c..e17ecbc0af 100644
--- a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterConfigurationProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterConfigurationProvider.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// Calls into user provided 'Configure' methods for configuring a middleware pipeline. The semantics of finding
/// the 'Configure' methods is similar to the application Startup class.
/// </summary>
-internal class MiddlewareFilterConfigurationProvider
+internal sealed class MiddlewareFilterConfigurationProvider
{
public static Action<IApplicationBuilder> CreateConfigureDelegate(Type configurationType)
{
@@ -76,7 +76,7 @@ internal class MiddlewareFilterConfigurationProvider
return !modelType.IsAbstract && modelType.GetConstructor(Type.EmptyTypes) != null;
}
- private class ConfigureBuilder
+ private sealed class ConfigureBuilder
{
public ConfigureBuilder(MethodInfo configure)
{
diff --git a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterFeature.cs b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterFeature.cs
index 2c25fe1bcc..bfd607759b 100644
--- a/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterFeature.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/MiddlewareFilterFeature.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class MiddlewareFilterFeature : IMiddlewareFilterFeature
+internal sealed class MiddlewareFilterFeature : IMiddlewareFilterFeature
{
public ResourceExecutingContext? ResourceExecutingContext { get; set; }
diff --git a/src/Mvc/Mvc.Core/src/Filters/OutputCacheFilter.cs b/src/Mvc/Mvc.Core/src/Filters/OutputCacheFilter.cs
new file mode 100644
index 0000000000..08beb1bf29
--- /dev/null
+++ b/src/Mvc/Mvc.Core/src/Filters/OutputCacheFilter.cs
@@ -0,0 +1,56 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc.Core;
+using Microsoft.AspNetCore.OutputCaching;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Mvc.Filters;
+
+/// <summary>
+/// An <see cref="IActionFilter"/> which sets the appropriate headers related to output caching.
+/// </summary>
+internal partial class OutputCacheFilter : IActionFilter
+{
+ private readonly ILogger _logger;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="OutputCacheFilter"/>
+ /// </summary>
+ /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param>
+ public OutputCacheFilter(ILoggerFactory loggerFactory)
+ {
+ _logger = loggerFactory.CreateLogger(GetType());
+ }
+
+ public void OnActionExecuting(ActionExecutingContext context)
+ {
+ ArgumentNullException.ThrowIfNull(context);
+
+ // If there are more filters which can override the values written by this filter,
+ // then skip execution of this filter.
+ var effectivePolicy = context.FindEffectivePolicy<IOutputCacheFilter>();
+ if (effectivePolicy != null && effectivePolicy != this)
+ {
+ Log.NotMostEffectiveFilter(_logger, GetType(), effectivePolicy.GetType(), typeof(IOutputCacheFilter));
+ return;
+ }
+
+ var outputCachingFeature = context.HttpContext.Features.Get<IOutputCacheFeature>();
+ if (outputCachingFeature == null)
+ {
+ throw new InvalidOperationException(
+ Resources.FormatOutputCacheAttribute_Requires_OutputCachingMiddleware(nameof(OutputCacheAttribute)));
+ }
+ }
+
+ public void OnActionExecuted(ActionExecutedContext context)
+ {
+ }
+
+ private static partial class Log
+ {
+ [LoggerMessage(1, LogLevel.Debug, "Execution of filter {OverriddenFilter} is preempted by filter {OverridingFilter} which is the most effective filter implementing policy {FilterPolicy}.", EventName = "NotMostEffectiveFilter")]
+ public static partial void NotMostEffectiveFilter(ILogger logger, Type overriddenFilter, Type overridingFilter, Type filterPolicy);
+ }
+}
diff --git a/src/Mvc/Mvc.Core/src/Filters/RequestFormLimitsFilter.cs b/src/Mvc/Mvc.Core/src/Filters/RequestFormLimitsFilter.cs
index 82fce9b7f4..5cc245688b 100644
--- a/src/Mvc/Mvc.Core/src/Filters/RequestFormLimitsFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/RequestFormLimitsFilter.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// A filter that configures <see cref="FormOptions"/> for the current request.
/// </summary>
-internal partial class RequestFormLimitsFilter : IAuthorizationFilter, IRequestFormLimitsPolicy
+internal sealed partial class RequestFormLimitsFilter : IAuthorizationFilter, IRequestFormLimitsPolicy
{
private readonly ILogger _logger;
diff --git a/src/Mvc/Mvc.Core/src/Filters/RequestSizeLimitFilter.cs b/src/Mvc/Mvc.Core/src/Filters/RequestSizeLimitFilter.cs
index abb87f9e34..06c441d636 100644
--- a/src/Mvc/Mvc.Core/src/Filters/RequestSizeLimitFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/RequestSizeLimitFilter.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// A filter that sets the <see cref="IHttpMaxRequestBodySizeFeature.MaxRequestBodySize"/>
/// to the specified <see cref="Bytes"/>.
/// </summary>
-internal partial class RequestSizeLimitFilter : IAuthorizationFilter, IRequestSizePolicy
+internal sealed partial class RequestSizeLimitFilter : IAuthorizationFilter, IRequestSizePolicy
{
private readonly ILogger _logger;
diff --git a/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilter.cs b/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilter.cs
index fa892a9175..b60d10d9e1 100644
--- a/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilter.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// An <see cref="IActionFilter"/> which sets the appropriate headers related to response caching.
/// </summary>
-internal partial class ResponseCacheFilter : IActionFilter, IResponseCacheFilter
+internal sealed partial class ResponseCacheFilter : IActionFilter, IResponseCacheFilter
{
private readonly ResponseCacheFilterExecutor _executor;
private readonly ILogger _logger;
diff --git a/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilterExecutor.cs b/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilterExecutor.cs
index 3048683021..a46755969d 100644
--- a/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilterExecutor.cs
+++ b/src/Mvc/Mvc.Core/src/Filters/ResponseCacheFilterExecutor.cs
@@ -8,7 +8,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class ResponseCacheFilterExecutor
+internal sealed class ResponseCacheFilterExecutor
{
private readonly CacheProfile _cacheProfile;
private int? _cacheDuration;
diff --git a/src/Mvc/Mvc.Core/src/ForbidResult.cs b/src/Mvc/Mvc.Core/src/ForbidResult.cs
index 536fcfca37..ae99bdac04 100644
--- a/src/Mvc/Mvc.Core/src/ForbidResult.cs
+++ b/src/Mvc/Mvc.Core/src/ForbidResult.cs
@@ -124,7 +124,7 @@ public partial class ForbidResult : ActionResult
}
}
- [LoggerMessage(1, LogLevel.Information, $"Executing {nameof(ForbidResult)} with authentication schemes ({{Schemes}}).", EventName = "ForbidResultExecuting", SkipEnabledCheck = true)]
+ [LoggerMessage(1, LogLevel.Information, $"Executing {nameof(ForbidResult)} with authentication schemes ({{Schemes}}).", EventName = "ForbidResultExecuting", SkipEnabledCheck = true)]
private static partial void ForbidResultExecuting(ILogger logger, string[] schemes);
}
}
diff --git a/src/Mvc/Mvc.Core/src/Formatters/HttpNoContentOutputFormatter.cs b/src/Mvc/Mvc.Core/src/Formatters/HttpNoContentOutputFormatter.cs
index 76019a7812..39f43a890b 100644
--- a/src/Mvc/Mvc.Core/src/Formatters/HttpNoContentOutputFormatter.cs
+++ b/src/Mvc/Mvc.Core/src/Formatters/HttpNoContentOutputFormatter.cs
@@ -34,7 +34,6 @@ public class HttpNoContentOutputFormatter : IOutputFormatter
public Task WriteAsync(OutputFormatterWriteContext context)
{
var response = context.HttpContext.Response;
- response.ContentLength = 0;
if (response.StatusCode == StatusCodes.Status200OK)
{
diff --git a/src/Mvc/Mvc.Core/src/Formatters/TextOutputFormatter.cs b/src/Mvc/Mvc.Core/src/Formatters/TextOutputFormatter.cs
index 4bca0413db..709acb78b0 100644
--- a/src/Mvc/Mvc.Core/src/Formatters/TextOutputFormatter.cs
+++ b/src/Mvc/Mvc.Core/src/Formatters/TextOutputFormatter.cs
@@ -4,6 +4,7 @@
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Core;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
@@ -132,8 +133,18 @@ public abstract class TextOutputFormatter : OutputFormatter
}
else
{
- var response = context.HttpContext.Response;
- response.StatusCode = StatusCodes.Status406NotAcceptable;
+ const int statusCode = StatusCodes.Status406NotAcceptable;
+ context.HttpContext.Response.StatusCode = statusCode;
+
+ if (context.HttpContext.RequestServices.GetService<IProblemDetailsService>() is { } problemDetailsService)
+ {
+ return problemDetailsService.WriteAsync(new ()
+ {
+ HttpContext = context.HttpContext,
+ ProblemDetails = { Status = statusCode }
+ }).AsTask();
+ }
+
return Task.CompletedTask;
}
diff --git a/src/Mvc/Mvc.Core/src/FromServicesAttribute.cs b/src/Mvc/Mvc.Core/src/FromServicesAttribute.cs
index 128d4742a8..77ecb5b993 100644
--- a/src/Mvc/Mvc.Core/src/FromServicesAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/FromServicesAttribute.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace Microsoft.AspNetCore.Mvc;
/// <summary>
-/// Specifies that an action parameter should be bound using the request services.
+/// Specifies that a parameter or property should be bound using the request services.
/// </summary>
/// <example>
/// In this example an implementation of IProductModelRequestService is registered as a service.
@@ -22,7 +22,7 @@ namespace Microsoft.AspNetCore.Mvc;
/// }
/// </code>
/// </example>
-[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
+[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FromServicesAttribute : Attribute, IBindingSourceMetadata, IFromServiceMetadata
{
/// <inheritdoc />
diff --git a/src/Mvc/Mvc.Core/src/HttpDeleteAttribute.cs b/src/Mvc/Mvc.Core/src/HttpDeleteAttribute.cs
index 26ad66cfb7..fabac03baf 100644
--- a/src/Mvc/Mvc.Core/src/HttpDeleteAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpDeleteAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpDeleteAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpDeleteAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpDeleteAttribute(string template)
+ public HttpDeleteAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/HttpGetAttribute.cs b/src/Mvc/Mvc.Core/src/HttpGetAttribute.cs
index 60c695bdb8..95e860c742 100644
--- a/src/Mvc/Mvc.Core/src/HttpGetAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpGetAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpGetAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpGetAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpGetAttribute(string template)
+ public HttpGetAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/HttpHeadAttribute.cs b/src/Mvc/Mvc.Core/src/HttpHeadAttribute.cs
index 007da20dff..63be84cc0a 100644
--- a/src/Mvc/Mvc.Core/src/HttpHeadAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpHeadAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpHeadAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpHeadAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpHeadAttribute(string template)
+ public HttpHeadAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/HttpOptionsAttribute.cs b/src/Mvc/Mvc.Core/src/HttpOptionsAttribute.cs
index ed726cb4f1..347ea1d1e0 100644
--- a/src/Mvc/Mvc.Core/src/HttpOptionsAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpOptionsAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpOptionsAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpOptionsAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpOptionsAttribute(string template)
+ public HttpOptionsAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/HttpPatchAttribute.cs b/src/Mvc/Mvc.Core/src/HttpPatchAttribute.cs
index 35e56ae71d..4d59e23337 100644
--- a/src/Mvc/Mvc.Core/src/HttpPatchAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpPatchAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpPatchAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpPatchAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpPatchAttribute(string template)
+ public HttpPatchAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/HttpPostAttribute.cs b/src/Mvc/Mvc.Core/src/HttpPostAttribute.cs
index fc371e859d..39a184ee8b 100644
--- a/src/Mvc/Mvc.Core/src/HttpPostAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpPostAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpPostAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpPostAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpPostAttribute(string template)
+ public HttpPostAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/HttpPutAttribute.cs b/src/Mvc/Mvc.Core/src/HttpPutAttribute.cs
index 5be7132e34..e09694f628 100644
--- a/src/Mvc/Mvc.Core/src/HttpPutAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/HttpPutAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -24,7 +25,7 @@ public class HttpPutAttribute : HttpMethodAttribute
/// Creates a new <see cref="HttpPutAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public HttpPutAttribute(string template)
+ public HttpPutAttribute([StringSyntax("Route")] string template)
: base(_supportedMethods, template)
{
if (template == null)
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionContextAccessor.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionContextAccessor.cs
index ae8b8190ac..5a8213ef9c 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionContextAccessor.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionContextAccessor.cs
@@ -24,7 +24,7 @@ public class ActionContextAccessor : IActionContextAccessor
set { _storage.Value = value; }
}
- private class NullActionContextAccessor : IActionContextAccessor
+ private sealed class NullActionContextAccessor : IActionContextAccessor
{
public ActionContext? ActionContext
{
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionInvokerFactory.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionInvokerFactory.cs
index 795f6dc353..51959b2ee5 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionInvokerFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionInvokerFactory.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc.Abstractions;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ActionInvokerFactory : IActionInvokerFactory
+internal sealed class ActionInvokerFactory : IActionInvokerFactory
{
private readonly IActionInvokerProvider[] _actionInvokerProviders;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionMethodExecutor.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionMethodExecutor.cs
index d5bf5465a5..57c63674fa 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionMethodExecutor.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionMethodExecutor.cs
@@ -4,8 +4,9 @@
#nullable enable
using System.Diagnostics;
-using Microsoft.AspNetCore.Mvc.Core;
+using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Internal;
+using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
@@ -19,14 +20,17 @@ internal abstract class ActionMethodExecutor
new SyncObjectResultExecutor(),
// Executors for async methods
- new AwaitableResultExecutor(),
new TaskResultExecutor(),
+ new AwaitableResultExecutor(),
new TaskOfIActionResultExecutor(),
new TaskOfActionResultExecutor(),
new AwaitableObjectResultExecutor(),
};
+ public static EmptyResult EmptyResultInstance { get; } = new();
+
public abstract ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
@@ -34,6 +38,8 @@ internal abstract class ActionMethodExecutor
protected abstract bool CanExecute(ObjectMethodExecutor executor);
+ public abstract ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext);
+
public static ActionMethodExecutor GetExecutor(ObjectMethodExecutor executor)
{
for (var i = 0; i < Executors.Length; i++)
@@ -48,17 +54,65 @@ internal abstract class ActionMethodExecutor
throw new Exception();
}
+ public static ActionMethodExecutor GetFilterExecutor(ControllerActionDescriptor actionDescriptor) =>
+ new FilterActionMethodExecutor(actionDescriptor);
+
+ private sealed class FilterActionMethodExecutor : ActionMethodExecutor
+ {
+ private readonly ControllerActionDescriptor _controllerActionDescriptor;
+
+ public FilterActionMethodExecutor(ControllerActionDescriptor controllerActionDescriptor)
+ {
+ _controllerActionDescriptor = controllerActionDescriptor;
+ }
+
+ public override async ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
+ IActionResultTypeMapper mapper,
+ ObjectMethodExecutor executor,
+ object controller,
+ object?[]? arguments)
+ {
+ var context = new ControllerEndpointFilterInvocationContext(_controllerActionDescriptor, actionContext, executor, mapper, controller, arguments);
+ var result = await _controllerActionDescriptor.FilterDelegate!(context);
+ return ConvertToActionResult(mapper, result, executor.IsMethodAsync ? executor.AsyncResultType! : executor.MethodReturnType);
+ }
+
+ public override ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ // This is never called
+ throw new NotSupportedException();
+ }
+
+ protected override bool CanExecute(ObjectMethodExecutor executor)
+ {
+ // This is never called
+ throw new NotSupportedException();
+ }
+ }
+
// void LogMessage(..)
- private class VoidResultExecutor : ActionMethodExecutor
+ private sealed class VoidResultExecutor : ActionMethodExecutor
{
public override ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
object?[]? arguments)
{
executor.Execute(controller, arguments);
- return new ValueTask<IActionResult>(new EmptyResult());
+ return new(EmptyResultInstance);
+ }
+
+ public override ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+
+ executor.Execute(controller, arguments);
+ return new(EmptyResultInstance);
}
protected override bool CanExecute(ObjectMethodExecutor executor)
@@ -67,9 +121,10 @@ internal abstract class ActionMethodExecutor
// IActionResult Post(..)
// CreatedAtResult Put(..)
- private class SyncActionResultExecutor : ActionMethodExecutor
+ private sealed class SyncActionResultExecutor : ActionMethodExecutor
{
public override ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
@@ -78,7 +133,19 @@ internal abstract class ActionMethodExecutor
var actionResult = (IActionResult)executor.Execute(controller, arguments)!;
EnsureActionResultNotNull(executor, actionResult);
- return new ValueTask<IActionResult>(actionResult);
+ return new(actionResult);
+ }
+
+ public override ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+
+ var actionResult = (IActionResult)executor.Execute(controller, arguments)!;
+ EnsureActionResultNotNull(executor, actionResult);
+
+ return new(actionResult);
}
protected override bool CanExecute(ObjectMethodExecutor executor)
@@ -87,9 +154,10 @@ internal abstract class ActionMethodExecutor
// Person GetPerson(..)
// object Index(..)
- private class SyncObjectResultExecutor : ActionMethodExecutor
+ private sealed class SyncObjectResultExecutor : ActionMethodExecutor
{
public override ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
@@ -98,7 +166,20 @@ internal abstract class ActionMethodExecutor
// Sync method returning arbitrary object
var returnValue = executor.Execute(controller, arguments);
var actionResult = ConvertToActionResult(mapper, returnValue, executor.MethodReturnType);
- return new ValueTask<IActionResult>(actionResult);
+ return new(actionResult);
+ }
+
+ public override ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+ var mapper = invocationContext.Mapper;
+
+ // Sync method returning arbitrary object
+ var returnValue = executor.Execute(controller, arguments);
+ var actionResult = ConvertToActionResult(mapper, returnValue, executor.MethodReturnType);
+ return new(actionResult);
}
// Catch-all for sync methods
@@ -106,16 +187,27 @@ internal abstract class ActionMethodExecutor
}
// Task SaveState(..)
- private class TaskResultExecutor : ActionMethodExecutor
+ private sealed class TaskResultExecutor : ActionMethodExecutor
{
public override async ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
object?[]? arguments)
{
await (Task)executor.Execute(controller, arguments)!;
- return new EmptyResult();
+ return EmptyResultInstance;
+ }
+
+ public override async ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+
+ await (Task)executor.Execute(controller, arguments)!;
+ return EmptyResultInstance;
}
protected override bool CanExecute(ObjectMethodExecutor executor) => executor.MethodReturnType == typeof(Task);
@@ -123,16 +215,27 @@ internal abstract class ActionMethodExecutor
// CustomAsync PerformActionAsync(..)
// Custom task-like type with no return value.
- private class AwaitableResultExecutor : ActionMethodExecutor
+ private sealed class AwaitableResultExecutor : ActionMethodExecutor
{
public override async ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
object?[]? arguments)
{
await executor.ExecuteAsync(controller, arguments);
- return new EmptyResult();
+ return EmptyResultInstance;
+ }
+
+ public override async ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+
+ await executor.ExecuteAsync(controller, arguments);
+ return EmptyResultInstance;
}
protected override bool CanExecute(ObjectMethodExecutor executor)
@@ -143,9 +246,10 @@ internal abstract class ActionMethodExecutor
}
// Task<IActionResult> Post(..)
- private class TaskOfIActionResultExecutor : ActionMethodExecutor
+ private sealed class TaskOfIActionResultExecutor : ActionMethodExecutor
{
public override async ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
@@ -160,15 +264,31 @@ internal abstract class ActionMethodExecutor
return actionResult;
}
+ public override async ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+
+ // Async method returning Task<IActionResult>
+ // Avoid extra allocations by calling Execute rather than ExecuteAsync and casting to Task<IActionResult>.
+ var returnValue = executor.Execute(controller, arguments);
+ var actionResult = await (Task<IActionResult>)returnValue!;
+ EnsureActionResultNotNull(executor, actionResult);
+
+ return actionResult;
+ }
+
protected override bool CanExecute(ObjectMethodExecutor executor)
=> typeof(Task<IActionResult>).IsAssignableFrom(executor.MethodReturnType);
}
// Task<PhysicalFileResult> DownloadFile(..)
// ValueTask<ViewResult> GetViewsAsync(..)
- private class TaskOfActionResultExecutor : ActionMethodExecutor
+ private sealed class TaskOfActionResultExecutor : ActionMethodExecutor
{
public override async ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
@@ -181,6 +301,19 @@ internal abstract class ActionMethodExecutor
return actionResult;
}
+ public override async ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+
+ // Async method returning awaitable-of-IActionResult (e.g., Task<ViewResult>)
+ // We have to use ExecuteAsync because we don't know the awaitable's type at compile time.
+ var actionResult = (IActionResult)await executor.ExecuteAsync(controller, arguments);
+ EnsureActionResultNotNull(executor, actionResult);
+ return actionResult;
+ }
+
protected override bool CanExecute(ObjectMethodExecutor executor)
{
// Async method returning awaitable-of - IActionResult(e.g., Task<ViewResult>)
@@ -190,9 +323,10 @@ internal abstract class ActionMethodExecutor
// Task<object> GetPerson(..)
// Task<Customer> GetCustomerAsync(..)
- private class AwaitableObjectResultExecutor : ActionMethodExecutor
+ private sealed class AwaitableObjectResultExecutor : ActionMethodExecutor
{
public override async ValueTask<IActionResult> Execute(
+ ActionContext actionContext,
IActionResultTypeMapper mapper,
ObjectMethodExecutor executor,
object controller,
@@ -204,6 +338,18 @@ internal abstract class ActionMethodExecutor
return actionResult;
}
+ public override async ValueTask<object?> Execute(ControllerEndpointFilterInvocationContext invocationContext)
+ {
+ var executor = invocationContext.Executor;
+ var controller = invocationContext.Controller;
+ var arguments = (object[])invocationContext.Arguments;
+ var mapper = invocationContext.Mapper;
+
+ var returnValue = await executor.ExecuteAsync(controller, arguments);
+ var actionResult = ConvertToActionResult(mapper, returnValue, executor.AsyncResultType!);
+ return actionResult;
+ }
+
protected override bool CanExecute(ObjectMethodExecutor executor) => true;
}
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultTypeMapper.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultTypeMapper.cs
index 79d012c251..2727fd6e1e 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultTypeMapper.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionResultTypeMapper.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ActionResultTypeMapper : IActionResultTypeMapper
+internal sealed class ActionResultTypeMapper : IActionResultTypeMapper
{
public Type GetResultDataType(Type returnType)
{
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelectionTable.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelectionTable.cs
index 6ed9843a55..2179aec246 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelectionTable.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelectionTable.cs
@@ -34,7 +34,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
// Both of these actions match "Index" case-insensitively, but there exist two known canonical casings,
// so we will create an entry for "Index" and an entry for "index". Both of these entries match **both**
// actions.
-internal class ActionSelectionTable<TItem>
+internal sealed class ActionSelectionTable<TItem>
{
private ActionSelectionTable(
int version,
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelector.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelector.cs
index 002003c5d1..8526c3a572 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelector.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ActionSelector.cs
@@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
/// <summary>
/// A default <see cref="IActionSelector"/> implementation.
/// </summary>
-internal partial class ActionSelector : IActionSelector
+internal sealed partial class ActionSelector : IActionSelector
{
private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
private readonly ActionConstraintCache _actionConstraintCache;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ClientErrorResultFilter.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ClientErrorResultFilter.cs
index ad32d18f77..07328df794 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ClientErrorResultFilter.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ClientErrorResultFilter.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal partial class ClientErrorResultFilter : IAlwaysRunResultFilter, IOrderedFilter
+internal sealed partial class ClientErrorResultFilter : IAlwaysRunResultFilter, IOrderedFilter
{
internal const int FilterOrder = -2000;
private readonly IClientErrorFactory _clientErrorFactory;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvoker.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvoker.cs
index d4b5b94a4b..85926ea101 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvoker.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvoker.cs
@@ -15,7 +15,9 @@ using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
+#pragma warning disable CA1852 // Seal internal types
internal partial class ControllerActionInvoker : ResourceInvoker, IActionInvoker
+#pragma warning restore CA1852 // Seal internal types
{
private readonly ControllerActionInvokerCacheEntry _cacheEntry;
private readonly ControllerContext _controllerContext;
@@ -388,7 +390,7 @@ internal partial class ControllerActionInvoker : ResourceInvoker, IActionInvoker
var actionMethodExecutor = _cacheEntry.ActionMethodExecutor;
var orderedArguments = PrepareArguments(_arguments, objectMethodExecutor);
- var actionResultValueTask = actionMethodExecutor.Execute(_mapper, objectMethodExecutor, _instance!, orderedArguments);
+ var actionResultValueTask = actionMethodExecutor.Execute(ControllerContext, _mapper, objectMethodExecutor, _instance!, orderedArguments);
if (actionResultValueTask.IsCompletedSuccessfully)
{
_result = actionResultValueTask.Result;
@@ -426,7 +428,7 @@ internal partial class ControllerActionInvoker : ResourceInvoker, IActionInvoker
controller);
Log.ActionMethodExecuting(logger, controllerContext, orderedArguments);
var stopwatch = ValueStopwatch.StartNew();
- var actionResultValueTask = actionMethodExecutor.Execute(invoker._mapper, objectMethodExecutor, controller!, orderedArguments);
+ var actionResultValueTask = actionMethodExecutor.Execute(controllerContext, invoker._mapper, objectMethodExecutor, controller!, orderedArguments);
if (actionResultValueTask.IsCompletedSuccessfully)
{
result = actionResultValueTask.Result;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCache.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCache.cs
index e731cb60d0..da2830c746 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCache.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCache.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ControllerActionInvokerCache
+internal sealed class ControllerActionInvokerCache
{
private readonly ParameterBinder _parameterBinder;
private readonly IModelBinderFactory _modelBinderFactory;
@@ -69,6 +69,9 @@ internal class ControllerActionInvokerCache
_mvcOptions);
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterExecutor = actionDescriptor.FilterDelegate is not null
+ ? ActionMethodExecutor.GetFilterExecutor(actionDescriptor)
+ : null;
cacheEntry = new ControllerActionInvokerCacheEntry(
filterFactoryResult.CacheableFilters,
@@ -76,6 +79,7 @@ internal class ControllerActionInvokerCache
controllerReleaser,
propertyBinderFactory,
objectMethodExecutor,
+ filterExecutor ?? actionMethodExecutor,
actionMethodExecutor);
actionDescriptor.CacheEntry = cacheEntry;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCacheEntry.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCacheEntry.cs
index a964b329ac..43490a965d 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCacheEntry.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerCacheEntry.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ControllerActionInvokerCacheEntry
+internal sealed class ControllerActionInvokerCacheEntry
{
internal ControllerActionInvokerCacheEntry(
FilterItem[] cachedFilters,
@@ -15,7 +15,8 @@ internal class ControllerActionInvokerCacheEntry
Func<ControllerContext, object, ValueTask>? controllerReleaser,
ControllerBinderDelegate? controllerBinderDelegate,
ObjectMethodExecutor objectMethodExecutor,
- ActionMethodExecutor actionMethodExecutor)
+ ActionMethodExecutor actionMethodExecutor,
+ ActionMethodExecutor innerActionMethodExecutor)
{
ControllerFactory = controllerFactory;
ControllerReleaser = controllerReleaser;
@@ -23,6 +24,7 @@ internal class ControllerActionInvokerCacheEntry
CachedFilters = cachedFilters;
ObjectMethodExecutor = objectMethodExecutor;
ActionMethodExecutor = actionMethodExecutor;
+ InnerActionMethodExecutor = innerActionMethodExecutor;
}
public FilterItem[] CachedFilters { get; }
@@ -35,5 +37,9 @@ internal class ControllerActionInvokerCacheEntry
internal ObjectMethodExecutor ObjectMethodExecutor { get; }
+ // This includes the execution of the filter delegate (if there's a filter)
internal ActionMethodExecutor ActionMethodExecutor { get; }
+
+ // This is called inside of the filter delegate
+ internal ActionMethodExecutor InnerActionMethodExecutor { get; }
}
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerProvider.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerProvider.cs
index 8bb78adb66..0da5397b8a 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerActionInvokerProvider.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ControllerActionInvokerProvider : IActionInvokerProvider
+internal sealed class ControllerActionInvokerProvider : IActionInvokerProvider
{
private readonly ControllerActionInvokerCache _controllerActionInvokerCache;
private readonly IReadOnlyList<IValueProviderFactory> _valueProviderFactories;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ControllerEndpointFilterInvocationContext.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerEndpointFilterInvocationContext.cs
new file mode 100644
index 0000000000..c93c24ef44
--- /dev/null
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ControllerEndpointFilterInvocationContext.cs
@@ -0,0 +1,48 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#nullable enable
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Controllers;
+using Microsoft.Extensions.Internal;
+
+namespace Microsoft.AspNetCore.Mvc.Infrastructure;
+
+internal class ControllerEndpointFilterInvocationContext : EndpointFilterInvocationContext
+{
+ public ControllerEndpointFilterInvocationContext(
+ ControllerActionDescriptor actionDescriptor,
+ ActionContext actionContext,
+ ObjectMethodExecutor executor,
+ IActionResultTypeMapper mapper,
+ object controller,
+ object?[]? arguments)
+ {
+ ActionDescriptor = actionDescriptor;
+ ActionContext = actionContext;
+ Mapper = mapper;
+ Executor = executor;
+ Controller = controller;
+ Arguments = arguments ?? Array.Empty<object?>();
+ }
+
+ public object Controller { get; }
+
+ internal IActionResultTypeMapper Mapper { get; }
+
+ internal ActionContext ActionContext { get; }
+
+ internal ObjectMethodExecutor Executor { get; }
+
+ internal ControllerActionDescriptor ActionDescriptor { get; }
+
+ public override HttpContext HttpContext => ActionContext.HttpContext;
+
+ public override IList<object?> Arguments { get; }
+
+ public override T GetArgument<T>(int index)
+ {
+ return (T)Arguments[index]!;
+ }
+}
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/CopyOnWriteList.cs b/src/Mvc/Mvc.Core/src/Infrastructure/CopyOnWriteList.cs
index 0f864f68e4..82d26cc259 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/CopyOnWriteList.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/CopyOnWriteList.cs
@@ -7,7 +7,7 @@ using System.Collections;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class CopyOnWriteList<T> : IList<T>
+internal sealed class CopyOnWriteList<T> : IList<T>
{
private readonly IReadOnlyList<T> _source;
private List<T>? _copy;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/DefaultActionDescriptorCollectionProvider.cs b/src/Mvc/Mvc.Core/src/Infrastructure/DefaultActionDescriptorCollectionProvider.cs
index 28747cdad1..de89829664 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/DefaultActionDescriptorCollectionProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/DefaultActionDescriptorCollectionProvider.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal partial class DefaultActionDescriptorCollectionProvider : ActionDescriptorCollectionProvider
+internal sealed partial class DefaultActionDescriptorCollectionProvider : ActionDescriptorCollectionProvider
{
private readonly IActionDescriptorProvider[] _actionDescriptorProviders;
private readonly IActionDescriptorChangeProvider[] _actionDescriptorChangeProviders;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/DefaultApiProblemDetailsWriter.cs b/src/Mvc/Mvc.Core/src/Infrastructure/DefaultApiProblemDetailsWriter.cs
new file mode 100644
index 0000000000..f480c38635
--- /dev/null
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/DefaultApiProblemDetailsWriter.cs
@@ -0,0 +1,90 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Mvc.Infrastructure;
+
+internal sealed class DefaultApiProblemDetailsWriter : IProblemDetailsWriter
+{
+ private readonly OutputFormatterSelector _formatterSelector;
+ private readonly IHttpResponseStreamWriterFactory _writerFactory;
+ private readonly ProblemDetailsFactory _problemDetailsFactory;
+ private readonly ApiBehaviorOptions _apiBehaviorOptions;
+
+ private static readonly MediaTypeCollection _problemContentTypes = new()
+ {
+ "application/problem+json",
+ "application/problem+xml"
+ };
+
+ public DefaultApiProblemDetailsWriter(
+ OutputFormatterSelector formatterSelector,
+ IHttpResponseStreamWriterFactory writerFactory,
+ ProblemDetailsFactory problemDetailsFactory,
+ IOptions<ApiBehaviorOptions> apiBehaviorOptions)
+ {
+ _formatterSelector = formatterSelector;
+ _writerFactory = writerFactory;
+ _problemDetailsFactory = problemDetailsFactory;
+ _apiBehaviorOptions = apiBehaviorOptions.Value;
+ }
+
+ public bool CanWrite(ProblemDetailsContext context)
+ {
+ var controllerAttribute = context.AdditionalMetadata?.GetMetadata<ControllerAttribute>() ??
+ context.HttpContext.GetEndpoint()?.Metadata.GetMetadata<ControllerAttribute>();
+
+ return controllerAttribute != null;
+ }
+
+ public ValueTask WriteAsync(ProblemDetailsContext context)
+ {
+ var apiControllerAttribute = context.AdditionalMetadata?.GetMetadata<IApiBehaviorMetadata>() ??
+ context.HttpContext.GetEndpoint()?.Metadata.GetMetadata<IApiBehaviorMetadata>();
+
+ if (apiControllerAttribute is null || _apiBehaviorOptions.SuppressMapClientErrors)
+ {
+ // In this case we don't want to write
+ return ValueTask.CompletedTask;
+ }
+
+ // Recreating the problem details to get all customizations
+ // from the factory
+ var problemDetails = _problemDetailsFactory.CreateProblemDetails(
+ context.HttpContext,
+ context.ProblemDetails.Status ?? context.HttpContext.Response.StatusCode,
+ context.ProblemDetails.Title,
+ context.ProblemDetails.Type,
+ context.ProblemDetails.Detail,
+ context.ProblemDetails.Instance);
+
+ if (context.ProblemDetails?.Extensions is not null)
+ {
+ foreach (var extension in context.ProblemDetails.Extensions)
+ {
+ problemDetails.Extensions[extension.Key] = extension.Value;
+ }
+ }
+
+ var formatterContext = new OutputFormatterWriteContext(
+ context.HttpContext,
+ _writerFactory.CreateWriter,
+ typeof(ProblemDetails),
+ problemDetails);
+
+ var selectedFormatter = _formatterSelector.SelectFormatter(
+ formatterContext,
+ Array.Empty<IOutputFormatter>(),
+ _problemContentTypes);
+
+ if (selectedFormatter == null)
+ {
+ return ValueTask.CompletedTask;
+ }
+
+ return new ValueTask(selectedFormatter.WriteAsync(formatterContext));
+ }
+}
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/DefaultProblemDetailsFactory.cs b/src/Mvc/Mvc.Core/src/Infrastructure/DefaultProblemDetailsFactory.cs
index f77eed19ec..c08e86de6b 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/DefaultProblemDetailsFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/DefaultProblemDetailsFactory.cs
@@ -13,10 +13,14 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
internal sealed class DefaultProblemDetailsFactory : ProblemDetailsFactory
{
private readonly ApiBehaviorOptions _options;
+ private readonly Action<ProblemDetailsContext>? _configure;
- public DefaultProblemDetailsFactory(IOptions<ApiBehaviorOptions> options)
+ public DefaultProblemDetailsFactory(
+ IOptions<ApiBehaviorOptions> options,
+ IOptions<ProblemDetailsOptions>? problemDetailsOptions = null)
{
_options = options?.Value ?? throw new ArgumentNullException(nameof(options));
+ _configure = problemDetailsOptions?.Value?.CustomizeProblemDetails;
}
public override ProblemDetails CreateProblemDetails(
@@ -93,5 +97,7 @@ internal sealed class DefaultProblemDetailsFactory : ProblemDetailsFactory
{
problemDetails.Extensions["traceId"] = traceId;
}
+
+ _configure?.Invoke(new() { HttpContext = httpContext!, ProblemDetails = problemDetails });
}
}
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpRequestStreamReaderFactory.cs b/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpRequestStreamReaderFactory.cs
index 97824d2326..9c33798e14 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpRequestStreamReaderFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpRequestStreamReaderFactory.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
/// <summary>
/// An <see cref="IHttpRequestStreamReaderFactory"/> that uses pooled buffers.
/// </summary>
-internal class MemoryPoolHttpRequestStreamReaderFactory : IHttpRequestStreamReaderFactory
+internal sealed class MemoryPoolHttpRequestStreamReaderFactory : IHttpRequestStreamReaderFactory
{
/// <summary>
/// The default size of created char buffers.
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpResponseStreamWriterFactory.cs b/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpResponseStreamWriterFactory.cs
index 9a8543011a..111970dbcd 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpResponseStreamWriterFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/MemoryPoolHttpResponseStreamWriterFactory.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
/// <summary>
/// An <see cref="IHttpResponseStreamWriterFactory"/> that uses pooled buffers.
/// </summary>
-internal class MemoryPoolHttpResponseStreamWriterFactory : IHttpResponseStreamWriterFactory
+internal sealed class MemoryPoolHttpResponseStreamWriterFactory : IHttpResponseStreamWriterFactory
{
/// <summary>
/// The default size of buffers <see cref="HttpResponseStreamWriter"/>s will allocate.
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ModelStateInvalidFilterFactory.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ModelStateInvalidFilterFactory.cs
index dbc13893ca..fc6713ae62 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ModelStateInvalidFilterFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ModelStateInvalidFilterFactory.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ModelStateInvalidFilterFactory : IFilterFactory, IOrderedFilter
+internal sealed class ModelStateInvalidFilterFactory : IFilterFactory, IOrderedFilter
{
public int Order => ModelStateInvalidFilter.FilterOrder;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/MvcCoreMvcOptionsSetup.cs b/src/Mvc/Mvc.Core/src/Infrastructure/MvcCoreMvcOptionsSetup.cs
index 82affa44c7..5ae0d2c910 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/MvcCoreMvcOptionsSetup.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/MvcCoreMvcOptionsSetup.cs
@@ -20,7 +20,7 @@ namespace Microsoft.AspNetCore.Mvc;
/// <summary>
/// Sets up default options for <see cref="MvcOptions"/>.
/// </summary>
-internal class MvcCoreMvcOptionsSetup : IConfigureOptions<MvcOptions>, IPostConfigureOptions<MvcOptions>
+internal sealed class MvcCoreMvcOptionsSetup : IConfigureOptions<MvcOptions>, IPostConfigureOptions<MvcOptions>
{
private readonly IHttpRequestStreamReaderFactory _readerFactory;
private readonly ILoggerFactory _loggerFactory;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/NonDisposableStream.cs b/src/Mvc/Mvc.Core/src/Infrastructure/NonDisposableStream.cs
index 5c0083226c..4c6db17889 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/NonDisposableStream.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/NonDisposableStream.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
/// This Stream is present so that the inner stream is not closed
/// even when Close() or Dispose() is called.
/// </summary>
-internal class NonDisposableStream : Stream
+internal sealed class NonDisposableStream : Stream
{
private readonly Stream _innerStream;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ObjectResultExecutor.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ObjectResultExecutor.cs
index 1c4ddb95ab..d8bab1ab8e 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ObjectResultExecutor.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ObjectResultExecutor.cs
@@ -6,6 +6,7 @@ using System.Globalization;
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@@ -109,12 +110,24 @@ public partial class ObjectResultExecutor : IActionResultExecutor<ObjectResult>
formatterContext,
(IList<IOutputFormatter>)result.Formatters ?? Array.Empty<IOutputFormatter>(),
result.ContentTypes);
+
if (selectedFormatter == null)
{
// No formatter supports this.
Log.NoFormatter(Logger, formatterContext, result.ContentTypes);
- context.HttpContext.Response.StatusCode = StatusCodes.Status406NotAcceptable;
+ const int statusCode = StatusCodes.Status406NotAcceptable;
+ context.HttpContext.Response.StatusCode = statusCode;
+
+ if (context.HttpContext.RequestServices.GetService<IProblemDetailsService>() is { } problemDetailsService)
+ {
+ return problemDetailsService.WriteAsync(new()
+ {
+ HttpContext = context.HttpContext,
+ ProblemDetails = { Status = statusCode }
+ }).AsTask();
+ }
+
return Task.CompletedTask;
}
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProvider.cs b/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProvider.cs
index a0300e01ff..bb67c67e9c 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProvider.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class OrderedEndpointsSequenceProvider
+internal sealed class OrderedEndpointsSequenceProvider
{
// In traditional conventional routing setup, the routes defined by a user have a order
// defined by how they are added into the list. We would like to maintain the same order when building
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProviderCache.cs b/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProviderCache.cs
index 65463e126e..2f8a363f98 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProviderCache.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/OrderedEndpointsSequenceProviderCache.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class OrderedEndpointsSequenceProviderCache
+internal sealed class OrderedEndpointsSequenceProviderCache
{
private readonly ConcurrentDictionary<IEndpointRouteBuilder, OrderedEndpointsSequenceProvider> _sequenceProviderCache = new();
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ProblemDetailsClientErrorFactory.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ProblemDetailsClientErrorFactory.cs
index 01f3814413..75bfeae220 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ProblemDetailsClientErrorFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ProblemDetailsClientErrorFactory.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ProblemDetailsClientErrorFactory : IClientErrorFactory
+internal sealed class ProblemDetailsClientErrorFactory : IClientErrorFactory
{
private readonly ProblemDetailsFactory _problemDetailsFactory;
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/StringArrayComparer.cs b/src/Mvc/Mvc.Core/src/Infrastructure/StringArrayComparer.cs
index d167f9606c..465c0ecbbd 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/StringArrayComparer.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/StringArrayComparer.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class StringArrayComparer : IEqualityComparer<string[]>
+internal sealed class StringArrayComparer : IEqualityComparer<string[]>
{
public static readonly StringArrayComparer Ordinal = new StringArrayComparer(StringComparer.Ordinal);
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/TypeActivatorCache.cs b/src/Mvc/Mvc.Core/src/Infrastructure/TypeActivatorCache.cs
index 88d2f1d2a1..861ba505c5 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/TypeActivatorCache.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/TypeActivatorCache.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.Infrastructure;
/// Caches <see cref="ObjectFactory"/> instances produced by
/// <see cref="ActivatorUtilities.CreateFactory(Type, Type[])"/>.
/// </summary>
-internal class TypeActivatorCache : ITypeActivatorCache
+internal sealed class TypeActivatorCache : ITypeActivatorCache
{
private readonly Func<Type, ObjectFactory> _createFactory =
(type) => ActivatorUtilities.CreateFactory(type, Type.EmptyTypes);
diff --git a/src/Mvc/Mvc.Core/src/Infrastructure/ValidationProblemDetailsJsonConverter.cs b/src/Mvc/Mvc.Core/src/Infrastructure/ValidationProblemDetailsJsonConverter.cs
index 442ecffdb5..080ab39603 100644
--- a/src/Mvc/Mvc.Core/src/Infrastructure/ValidationProblemDetailsJsonConverter.cs
+++ b/src/Mvc/Mvc.Core/src/Infrastructure/ValidationProblemDetailsJsonConverter.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ValidationProblemDetailsJsonConverter : JsonConverter<ValidationProblemDetails>
+internal sealed class ValidationProblemDetailsJsonConverter : JsonConverter<ValidationProblemDetails>
{
public override ValidationProblemDetails Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
diff --git a/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj b/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj
index 9d9b2ac58e..304b7408ab 100644
--- a/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj
+++ b/src/Mvc/Mvc.Core/src/Microsoft.AspNetCore.Mvc.Core.csproj
@@ -28,9 +28,7 @@ Microsoft.AspNetCore.Mvc.RouteAttribute</Description>
<Compile Include="$(SharedSourceRoot)SecurityHelper\**\*.cs" />
<Compile Include="$(SharedSourceRoot)ResponseContentTypeHelper.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)ResultsHelpers\*.cs" LinkBase="Shared" />
- <Compile Include="$(SharedSourceRoot)ProblemDetailsDefaults.cs" LinkBase="Shared"/>
- <Compile Include="$(SharedSourceRoot)ProblemDetailsJsonConverter.cs" LinkBase="Shared"/>
- <Compile Include="$(SharedSourceRoot)HttpValidationProblemDetailsJsonConverter.cs" LinkBase="Shared" />
+ <Compile Include="$(SharedSourceRoot)ProblemDetails\*.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)MediaType\ReadOnlyMediaTypeHeaderValue.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)MediaType\HttpTokenParsingRule.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)RoutingMetadata\AcceptsMetadata.cs" LinkBase="Shared" />
@@ -48,6 +46,7 @@ Microsoft.AspNetCore.Mvc.RouteAttribute</Description>
<Reference Include="Microsoft.AspNetCore.Http" />
<Reference Include="Microsoft.AspNetCore.Http.Extensions" />
<Reference Include="Microsoft.AspNetCore.ResponseCaching.Abstractions" />
+ <Reference Include="Microsoft.AspNetCore.OutputCaching" />
<Reference Include="Microsoft.AspNetCore.Routing.Abstractions" />
<Reference Include="Microsoft.AspNetCore.Routing" />
<Reference Include="Microsoft.Extensions.DependencyInjection" />
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/BodyModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/BodyModelBinder.cs
index 5ce406fbc8..2460b32ac7 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/BodyModelBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/BodyModelBinder.cs
@@ -207,7 +207,7 @@ public partial class BodyModelBinder : IModelBinder
return policy == InputFormatterExceptionPolicy.AllExceptions;
}
- private partial class Log
+ private sealed partial class Log
{
public static void InputFormatterSelected(ILogger logger, IInputFormatter inputFormatter, InputFormatterContext formatterContext)
{
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CollectionModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CollectionModelBinder.cs
index 116c6f6c66..fc84bfe42d 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CollectionModelBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/CollectionModelBinder.cs
@@ -10,8 +10,8 @@ using System.Linq.Expressions;
using Microsoft.AspNetCore.Mvc.Core;
using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
-using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Internal;
+using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.Binders;
@@ -127,10 +127,10 @@ public partial class CollectionModelBinder<TElement> : ICollectionModelBinder
Logger.FoundNoValueInRequest(bindingContext);
// If we failed to find data for a top-level model, then generate a
- // default 'empty' model (or use existing Model) and return it.
+ // default 'empty' model (or use existing Model when not null or a default value is available) and return it.
if (bindingContext.IsTopLevelObject)
{
- if (model == null)
+ if (model == null && !bindingContext.ModelMetadata.HasDefaultValue)
{
model = CreateEmptyCollection(bindingContext.ModelType);
}
@@ -273,16 +273,10 @@ public partial class CollectionModelBinder<TElement> : ICollectionModelBinder
var boundCollection = new List<TElement?>();
var elementMetadata = bindingContext.ModelMetadata.ElementMetadata!;
+ var valueProvider = bindingContext.ValueProvider;
foreach (var value in values)
{
- bindingContext.ValueProvider = new CompositeValueProvider
- {
- // our temporary provider goes at the front of the list
- new ElementalValueProvider(bindingContext.ModelName, value, values.Culture),
- bindingContext.ValueProvider
- };
-
// Enter new scope to change ModelMetadata and isolate element binding operations.
using (bindingContext.EnterNestedScope(
elementMetadata,
@@ -290,6 +284,13 @@ public partial class CollectionModelBinder<TElement> : ICollectionModelBinder
modelName: bindingContext.ModelName,
model: null))
{
+ bindingContext.ValueProvider = new CompositeValueProvider
+ {
+ // our temporary provider goes at the front of the list
+ new ElementalValueProvider(bindingContext.ModelName, value, values.Culture),
+ valueProvider
+ };
+
await ElementBinder.BindModelAsync(bindingContext);
if (bindingContext.Result.IsModelSet)
@@ -414,7 +415,7 @@ public partial class CollectionModelBinder<TElement> : ICollectionModelBinder
}
// Internal for testing.
- internal record CollectionResult(IEnumerable<TElement?> Model)
+ internal sealed record CollectionResult(IEnumerable<TElement?> Model)
{
public IValidationStrategy? ValidationStrategy { get; init; }
}
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormCollectionModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormCollectionModelBinder.cs
index db1fd8ab5c..75839bfe5e 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormCollectionModelBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormCollectionModelBinder.cs
@@ -59,7 +59,7 @@ public class FormCollectionModelBinder : IModelBinder
_logger.DoneAttemptingToBindModel(bindingContext);
}
- private class EmptyFormCollection : IFormCollection
+ private sealed class EmptyFormCollection : IFormCollection
{
public StringValues this[string key] => StringValues.Empty;
@@ -91,7 +91,7 @@ public class FormCollectionModelBinder : IModelBinder
}
}
- private class EmptyFormFileCollection : List<IFormFile>, IFormFileCollection
+ private sealed class EmptyFormFileCollection : List<IFormFile>, IFormFileCollection
{
public IFormFile? this[string name] => null;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormFileModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormFileModelBinder.cs
index ce6596db81..601096a6d1 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormFileModelBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/FormFileModelBinder.cs
@@ -173,7 +173,7 @@ public partial class FormFileModelBinder : IModelBinder
}
}
- private class FileCollection : ReadOnlyCollection<IFormFile>, IFormFileCollection
+ private sealed class FileCollection : ReadOnlyCollection<IFormFile>, IFormFileCollection
{
public FileCollection(List<IFormFile> list)
: base(list)
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/HeaderModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/HeaderModelBinder.cs
index 7f34ef2e54..1b81ede943 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/HeaderModelBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/HeaderModelBinder.cs
@@ -195,7 +195,7 @@ public class HeaderModelBinder : IModelBinder
return collection;
}
- private class HeaderValueProvider : IValueProvider
+ private sealed class HeaderValueProvider : IValueProvider
{
private readonly string[] _values;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/TryParseModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/TryParseModelBinder.cs
index 5bb24d38f4..2339d786c0 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/TryParseModelBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/TryParseModelBinder.cs
@@ -132,7 +132,7 @@ internal sealed class TryParseModelBinder : IModelBinder
// AddModelError(bindingContext, new FormatException());
// }
// return model;
-
+
var parsedValue = Expression.Variable(modelType, "parsedValue");
var modelValue = Expression.Variable(typeof(object), "model");
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/DefaultPropertyFilterProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/DefaultPropertyFilterProvider.cs
index 95324dc180..d30748e7de 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/DefaultPropertyFilterProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/DefaultPropertyFilterProvider.cs
@@ -27,7 +27,7 @@ public class DefaultPropertyFilterProvider<TModel> : IPropertyFilterProvider
/// Expressions which can be used to generate property filter which can filter model
/// properties.
/// </summary>
- public virtual IEnumerable<Expression<Func<TModel, object>>>? PropertyIncludeExpressions => null;
+ public virtual IEnumerable<Expression<Func<TModel, object?>>>? PropertyIncludeExpressions => null;
/// <inheritdoc />
public virtual Func<ModelMetadata, bool> PropertyFilter
@@ -45,7 +45,7 @@ public class DefaultPropertyFilterProvider<TModel> : IPropertyFilterProvider
}
private static Func<ModelMetadata, bool> GetPropertyFilterFromExpression(
- IEnumerable<Expression<Func<TModel, object>>> includeExpressions)
+ IEnumerable<Expression<Func<TModel, object?>>> includeExpressions)
{
var expression = ModelBindingHelper.GetPropertyFilterExpression(includeExpressions.ToArray());
return expression.Compile();
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/ElementalValueProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/ElementalValueProvider.cs
index ff16855df9..59579df0bc 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/ElementalValueProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/ElementalValueProvider.cs
@@ -7,7 +7,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Mvc.ModelBinding;
-internal class ElementalValueProvider : IValueProvider
+internal sealed class ElementalValueProvider : IValueProvider
{
public ElementalValueProvider(string key, string? value, CultureInfo culture)
{
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/EmptyModelMetadataProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/EmptyModelMetadataProvider.cs
index 243969a6db..d903dc9b10 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/EmptyModelMetadataProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/EmptyModelMetadataProvider.cs
@@ -23,7 +23,7 @@ public class EmptyModelMetadataProvider : DefaultModelMetadataProvider
{
}
- private class OptionsAccessor : IOptions<MvcOptions>
+ private sealed class OptionsAccessor : IOptions<MvcOptions>
{
public MvcOptions Value { get; } = new MvcOptions();
}
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/FormValueHelper.cs b/src/Mvc/Mvc.Core/src/ModelBinding/FormValueHelper.cs
new file mode 100644
index 0000000000..b556aa2215
--- /dev/null
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/FormValueHelper.cs
@@ -0,0 +1,9 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Mvc.ModelBinding;
+
+internal static class FormValueHelper
+{
+ public const string CultureInvariantFieldName = "__Invariant";
+}
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/FormValueProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/FormValueProvider.cs
index 1ca941c979..6c1d918549 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/FormValueProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/FormValueProvider.cs
@@ -14,6 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding;
public class FormValueProvider : BindingSourceValueProvider, IEnumerableValueProvider
{
private readonly IFormCollection _values;
+ private readonly HashSet<string?>? _invariantValueKeys;
private PrefixContainer? _prefixContainer;
/// <summary>
@@ -39,6 +40,12 @@ public class FormValueProvider : BindingSourceValueProvider, IEnumerableValuePro
}
_values = values;
+
+ if (_values.TryGetValue(FormValueHelper.CultureInvariantFieldName, out var invariantKeys) && invariantKeys.Count > 0)
+ {
+ _invariantValueKeys = new(invariantKeys, StringComparer.OrdinalIgnoreCase);
+ }
+
Culture = culture;
}
@@ -104,7 +111,8 @@ public class FormValueProvider : BindingSourceValueProvider, IEnumerableValuePro
}
else
{
- return new ValueProviderResult(values, Culture);
+ var culture = _invariantValueKeys?.Contains(key) == true ? CultureInfo.InvariantCulture : Culture;
+ return new ValueProviderResult(values, culture);
}
}
}
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/JQueryFormValueProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/JQueryFormValueProvider.cs
index 26bd1f3386..875b67e2b3 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/JQueryFormValueProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/JQueryFormValueProvider.cs
@@ -13,6 +13,8 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding;
/// </summary>
public class JQueryFormValueProvider : JQueryValueProvider
{
+ private readonly HashSet<string?>? _invariantValueKeys;
+
/// <summary>
/// Initializes a new instance of the <see cref="JQueryFormValueProvider"/> class.
/// </summary>
@@ -25,5 +27,22 @@ public class JQueryFormValueProvider : JQueryValueProvider
CultureInfo? culture)
: base(bindingSource, values, culture)
{
+ if (values.TryGetValue(FormValueHelper.CultureInvariantFieldName, out var invariantKeys) && invariantKeys.Count > 0)
+ {
+ _invariantValueKeys = new(invariantKeys, StringComparer.OrdinalIgnoreCase);
+ }
+ }
+
+ /// <inheritdoc/>
+ public override ValueProviderResult GetValue(string key)
+ {
+ var result = base.GetValue(key);
+
+ if (result.Length > 0 && _invariantValueKeys?.Contains(key) == true)
+ {
+ return new(result.Values, CultureInfo.InvariantCulture);
+ }
+
+ return result;
}
}
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs
index 9caa19b7d5..376c57a2e8 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
/// <summary>
/// A default implementation of <see cref="IBindingMetadataProvider"/>.
/// </summary>
-internal class DefaultBindingMetadataProvider : IBindingMetadataProvider
+internal sealed class DefaultBindingMetadataProvider : IBindingMetadataProvider
{
public void CreateBindingMetadata(BindingMetadataProviderContext context)
{
@@ -168,7 +168,7 @@ internal class DefaultBindingMetadataProvider : IBindingMetadataProvider
}
}
- private class CompositePropertyFilterProvider : IPropertyFilterProvider
+ private sealed class CompositePropertyFilterProvider : IPropertyFilterProvider
{
private readonly IEnumerable<IPropertyFilterProvider> _providers;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultCompositeMetadataDetailsProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultCompositeMetadataDetailsProvider.cs
index eb871c7318..2dc812bb5d 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultCompositeMetadataDetailsProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultCompositeMetadataDetailsProvider.cs
@@ -10,7 +10,9 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
/// <summary>
/// A default implementation of <see cref="ICompositeMetadataDetailsProvider"/>.
/// </summary>
+#pragma warning disable CA1852 // Seal internal types
internal class DefaultCompositeMetadataDetailsProvider : ICompositeMetadataDetailsProvider
+#pragma warning restore CA1852 // Seal internal types
{
private readonly IEnumerable<IMetadataDetailsProvider> _providers;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultValidationMetadataProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultValidationMetadataProvider.cs
index b3033869fa..a8d7ac914e 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultValidationMetadataProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultValidationMetadataProvider.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
/// <summary>
/// A default implementation of <see cref="IValidationMetadataProvider"/>.
/// </summary>
-internal class DefaultValidationMetadataProvider : IValidationMetadataProvider
+internal sealed class DefaultValidationMetadataProvider : IValidationMetadataProvider
{
/// <inheritdoc />
public void CreateValidationMetadata(ValidationMetadataProviderContext context)
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs
index 466541a5b2..3da846c077 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
-internal class HasValidatorsValidationMetadataProvider : IValidationMetadataProvider
+internal sealed class HasValidatorsValidationMetadataProvider : IValidationMetadataProvider
{
private readonly bool _hasOnlyMetadataBasedValidators;
private readonly IMetadataBasedModelValidatorProvider[]? _validatorProviders;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/ModelBinderFactory.cs b/src/Mvc/Mvc.Core/src/ModelBinding/ModelBinderFactory.cs
index 30754d9dcf..41bb86d513 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/ModelBinderFactory.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/ModelBinderFactory.cs
@@ -200,7 +200,7 @@ public partial class ModelBinderFactory : IModelBinderFactory
return _cache.TryGetValue(new Key(metadata, cacheToken), out binder);
}
- private class DefaultModelBinderProviderContext : ModelBinderProviderContext
+ private sealed class DefaultModelBinderProviderContext : ModelBinderProviderContext
{
private readonly ModelBinderFactory _factory;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs b/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs
index 236a243d7b..34dc03f9c3 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs
@@ -82,7 +82,7 @@ internal static class ModelBindingHelper
IModelBinderFactory modelBinderFactory,
IValueProvider valueProvider,
IObjectModelValidator objectModelValidator,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (includeExpressions == null)
@@ -363,7 +363,7 @@ internal static class ModelBindingHelper
/// <param name="expressions">Expressions identifying the properties to allow for binding.</param>
/// <returns>An expression which can be used with <see cref="IPropertyFilterProvider"/>.</returns>
public static Expression<Func<ModelMetadata, bool>> GetPropertyFilterExpression<TModel>(
- Expression<Func<TModel, object>>[] expressions)
+ Expression<Func<TModel, object?>>[] expressions)
{
if (expressions.Length == 0)
{
@@ -385,7 +385,7 @@ internal static class ModelBindingHelper
}
private static Expression<Func<ModelMetadata, bool>> GetPredicateExpression<TModel>(
- Expression<Func<TModel, object>> expression)
+ Expression<Func<TModel, object?>> expression)
{
var propertyName = GetPropertyName(expression.Body);
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/NoOpBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/NoOpBinder.cs
index e7a288bf0a..1b31f6e855 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/NoOpBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/NoOpBinder.cs
@@ -5,7 +5,7 @@
namespace Microsoft.AspNetCore.Mvc.ModelBinding;
-internal class NoOpBinder : IModelBinder
+internal sealed class NoOpBinder : IModelBinder
{
public static readonly IModelBinder Instance = new NoOpBinder();
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/PlaceholderBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/PlaceholderBinder.cs
index 990425b8f5..1087bcab6d 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/PlaceholderBinder.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/PlaceholderBinder.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding;
//
// When a cycle is detected by a call to Create(...), we create an instance of this class and return it
// to break the cycle. Later when the 'real' binder is created we set Inner to point to that.
-internal class PlaceholderBinder : IModelBinder
+internal sealed class PlaceholderBinder : IModelBinder
{
public IModelBinder? Inner { get; set; }
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultCollectionValidationStrategy.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultCollectionValidationStrategy.cs
index 41bbd984b6..67587d8bab 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultCollectionValidationStrategy.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultCollectionValidationStrategy.cs
@@ -37,7 +37,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
/// <see cref="ModelMetadata.ElementMetadata"/>. The indices of the elements in the collection are used to
/// compute the model prefix keys.
/// </remarks>
-internal class DefaultCollectionValidationStrategy : IValidationStrategy
+internal sealed class DefaultCollectionValidationStrategy : IValidationStrategy
{
private static readonly MethodInfo _getEnumerator = typeof(DefaultCollectionValidationStrategy)
.GetMethod(nameof(GetEnumerator), BindingFlags.Static | BindingFlags.NonPublic)!;
@@ -86,7 +86,7 @@ internal class DefaultCollectionValidationStrategy : IValidationStrategy
return (model as IEnumerable<T>)?.GetEnumerator() ?? ((IEnumerable)model).GetEnumerator();
}
- private class Enumerator : IEnumerator<ValidationEntry>
+ private sealed class Enumerator : IEnumerator<ValidationEntry>
{
private readonly string _key;
private readonly ModelMetadata _metadata;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs
index cf5d96b05d..239c07adfc 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
/// <summary>
/// The default implementation of <see cref="IValidationStrategy"/> for a complex object.
/// </summary>
-internal class DefaultComplexObjectValidationStrategy : IValidationStrategy
+internal sealed class DefaultComplexObjectValidationStrategy : IValidationStrategy
{
/// <summary>
/// Gets an instance of <see cref="DefaultComplexObjectValidationStrategy"/>.
@@ -31,7 +31,7 @@ internal class DefaultComplexObjectValidationStrategy : IValidationStrategy
return new Enumerator(metadata, key, model);
}
- private class Enumerator : IEnumerator<ValidationEntry>
+ private sealed class Enumerator : IEnumerator<ValidationEntry>
{
private readonly string _key;
private readonly object _model;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultModelValidatorProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultModelValidatorProvider.cs
index a6a76dfbdb..4aa7b45b77 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultModelValidatorProvider.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultModelValidatorProvider.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
/// The <see cref="DefaultModelValidatorProvider"/> provides validators from <see cref="IModelValidator"/>
/// instances in <see cref="ModelBinding.ModelMetadata.ValidatorMetadata"/>.
/// </remarks>
-internal class DefaultModelValidatorProvider : IMetadataBasedModelValidatorProvider
+internal sealed class DefaultModelValidatorProvider : IMetadataBasedModelValidatorProvider
{
/// <inheritdoc />
public void CreateValidators(ModelValidatorProviderContext context)
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultObjectValidator.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultObjectValidator.cs
index daeffad70c..ff75bd8bde 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultObjectValidator.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultObjectValidator.cs
@@ -8,7 +8,9 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
/// <summary>
/// The default implementation of <see cref="IObjectModelValidator"/>.
/// </summary>
+#pragma warning disable CA1852 // Seal internal types
internal class DefaultObjectValidator : ObjectModelValidator
+#pragma warning restore CA1852 // Seal internal types
{
private readonly MvcOptions _mvcOptions;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ExplicitIndexCollectionValidationStrategy.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ExplicitIndexCollectionValidationStrategy.cs
index 0391c51052..908cebfda2 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ExplicitIndexCollectionValidationStrategy.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ExplicitIndexCollectionValidationStrategy.cs
@@ -27,7 +27,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
/// <see cref="ModelMetadata.ElementMetadata"/>. The keys captured during model binding are mapped to the elements
/// in the collection to compute the model prefix keys.
/// </remarks>
-internal class ExplicitIndexCollectionValidationStrategy : IValidationStrategy
+internal sealed class ExplicitIndexCollectionValidationStrategy : IValidationStrategy
{
/// <summary>
/// Creates a new <see cref="ExplicitIndexCollectionValidationStrategy"/>.
@@ -58,7 +58,7 @@ internal class ExplicitIndexCollectionValidationStrategy : IValidationStrategy
return new Enumerator(metadata.ElementMetadata!, key, ElementKeys, enumerator);
}
- private class Enumerator : IEnumerator<ValidationEntry>
+ private sealed class Enumerator : IEnumerator<ValidationEntry>
{
private readonly string _key;
private readonly ModelMetadata _metadata;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ShortFormDictionaryValidationStrategy.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ShortFormDictionaryValidationStrategy.cs
index 813e2a0ca7..5d2d9a8f54 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ShortFormDictionaryValidationStrategy.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ShortFormDictionaryValidationStrategy.cs
@@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
/// Using this key format, the enumerator enumerates model objects of type <typeparamref name="TValue"/>. The
/// keys of the dictionary are not validated as they must be simple types.
/// </remarks>
-internal class ShortFormDictionaryValidationStrategy<TKey, TValue> : IValidationStrategy
+internal sealed class ShortFormDictionaryValidationStrategy<TKey, TValue> : IValidationStrategy
where TKey : notnull
{
private readonly ModelMetadata _valueMetadata;
@@ -63,7 +63,7 @@ internal class ShortFormDictionaryValidationStrategy<TKey, TValue> : IValidation
return new Enumerator(_valueMetadata, KeyMappings, (IDictionary<TKey, TValue>)model);
}
- private class Enumerator : IEnumerator<ValidationEntry>
+ private sealed class Enumerator : IEnumerator<ValidationEntry>
{
private readonly ModelMetadata _metadata;
private readonly IDictionary<TKey, TValue> _model;
diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationStack.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationStack.cs
index dd55d5fcce..23393f1957 100644
--- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationStack.cs
+++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationStack.cs
@@ -7,7 +7,9 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
+#pragma warning disable CA1852 // Seal internal types
internal class ValidationStack
+#pragma warning restore CA1852 // Seal internal types
{
public int Count => HashSet?.Count ?? List.Count;
diff --git a/src/Mvc/Mvc.Core/src/Properties/AssemblyInfo.cs b/src/Mvc/Mvc.Core/src/Properties/AssemblyInfo.cs
index bd724d5ea7..a821225367 100644
--- a/src/Mvc/Mvc.Core/src/Properties/AssemblyInfo.cs
+++ b/src/Mvc/Mvc.Core/src/Properties/AssemblyInfo.cs
@@ -6,9 +6,7 @@ using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Formatters;
[assembly: TypeForwardedTo(typeof(InputFormatterException))]
-#pragma warning disable RS0016 // Suppress PublicAPI analyzer
[assembly: TypeForwardedTo(typeof(ProblemDetails))]
-#pragma warning restore RS0016
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Mvc.ApiExplorer, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")]
diff --git a/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt
index 6db0756253..53c83cd826 100644
--- a/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.Core/src/PublicAPI.Shipped.txt
@@ -1,17 +1,17 @@
#nullable enable
-~Microsoft.AspNetCore.Mvc.Formatters.FormatFilter.FormatFilter(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-~Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>
-~Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>.ConfigureCompatibilityOptions(Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Infrastructure.MvcCompatibilityOptions!>! compatibilityOptions) -> void
-~Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector.DefaultOutputFormatterSelector(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-~Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ObjectResultExecutor(Microsoft.AspNetCore.Mvc.Infrastructure.OutputFormatterSelector! formatterSelector, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions) -> void
+Microsoft.AspNetCore.Mvc.Formatters.FormatFilter.FormatFilter(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>
+Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>.ConfigureCompatibilityOptions(Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Infrastructure.MvcCompatibilityOptions!>! compatibilityOptions) -> void
+Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector.DefaultOutputFormatterSelector(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ObjectResultExecutor(Microsoft.AspNetCore.Mvc.Infrastructure.OutputFormatterSelector! formatterSelector, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions) -> void
~Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.BindModelAsync(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext bindingContext) -> System.Threading.Tasks.Task
~Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.ComplexTypeModelBinder(System.Collections.Generic.IDictionary<Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder> propertyBinders, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
~Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.ComplexTypeModelBinder(System.Collections.Generic.IDictionary<Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder> propertyBinders, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory, bool allowValidatingTopLevelNodes) -> void
~Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinderProvider.GetBinder(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderProviderContext context) -> Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder
-~Microsoft.AspNetCore.Mvc.ModelBinding.DefaultPropertyFilterProvider<TModel>
-~Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadataProvider.DefaultModelMetadataProvider(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ICompositeMetadataDetailsProvider! detailsProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor) -> void
-~Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory.ModelBinderFactory(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! metadataProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, System.IServiceProvider! serviceProvider) -> void
-~Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.ParameterBinder(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinderFactory! modelBinderFactory, Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IObjectModelValidator! validator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Mvc.ModelBinding.DefaultPropertyFilterProvider<TModel>
+Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadataProvider.DefaultModelMetadataProvider(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ICompositeMetadataDetailsProvider! detailsProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor) -> void
+Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory.ModelBinderFactory(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! metadataProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, System.IServiceProvider! serviceProvider) -> void
+Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.ParameterBinder(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinderFactory! modelBinderFactory, Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IObjectModelValidator! validator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
~virtual Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.BindProperty(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext bindingContext) -> System.Threading.Tasks.Task
~virtual Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CanBindProperty(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext bindingContext, Microsoft.AspNetCore.Mvc.ModelBinding.ModelMetadata propertyMetadata) -> bool
~virtual Microsoft.AspNetCore.Mvc.ModelBinding.Binders.ComplexTypeModelBinder.CreateModel(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBindingContext bindingContext) -> object
@@ -728,6 +728,7 @@ Microsoft.AspNetCore.Mvc.Diagnostics.BeforeResultFilterOnResultExecutionEventDat
Microsoft.AspNetCore.Mvc.Diagnostics.BeforeResultFilterOnResultExecutionEventData.ResultExecutingContext.get -> Microsoft.AspNetCore.Mvc.Filters.ResultExecutingContext!
Microsoft.AspNetCore.Mvc.Diagnostics.EventData
Microsoft.AspNetCore.Mvc.Diagnostics.EventData.Enumerator
+Microsoft.AspNetCore.Mvc.Diagnostics.EventData.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Mvc.Diagnostics.EventData.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, object!>
Microsoft.AspNetCore.Mvc.Diagnostics.EventData.Enumerator.Dispose() -> void
Microsoft.AspNetCore.Mvc.Diagnostics.EventData.Enumerator.MoveNext() -> bool
@@ -824,6 +825,7 @@ Microsoft.AspNetCore.Mvc.Formatters.InputFormatterException.InputFormatterExcept
Microsoft.AspNetCore.Mvc.Formatters.InputFormatterException.InputFormatterException(string! message) -> void (forwarded, contained in Microsoft.AspNetCore.Mvc.Abstractions)
Microsoft.AspNetCore.Mvc.Formatters.InputFormatterException.InputFormatterException(string! message, System.Exception! innerException) -> void (forwarded, contained in Microsoft.AspNetCore.Mvc.Abstractions)
Microsoft.AspNetCore.Mvc.Formatters.MediaType
+Microsoft.AspNetCore.Mvc.Formatters.MediaType.MediaType() -> void
Microsoft.AspNetCore.Mvc.Formatters.MediaType.Charset.get -> Microsoft.Extensions.Primitives.StringSegment
Microsoft.AspNetCore.Mvc.Formatters.MediaType.Encoding.get -> System.Text.Encoding?
Microsoft.AspNetCore.Mvc.Formatters.MediaType.GetParameter(Microsoft.Extensions.Primitives.StringSegment parameterName) -> Microsoft.Extensions.Primitives.StringSegment
@@ -846,6 +848,7 @@ Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection.Insert(int index, Micros
Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection.MediaTypeCollection() -> void
Microsoft.AspNetCore.Mvc.Formatters.MediaTypeCollection.Remove(Microsoft.Net.Http.Headers.MediaTypeHeaderValue! item) -> bool
Microsoft.AspNetCore.Mvc.Formatters.MediaTypeSegmentWithQuality
+Microsoft.AspNetCore.Mvc.Formatters.MediaTypeSegmentWithQuality.MediaTypeSegmentWithQuality() -> void
Microsoft.AspNetCore.Mvc.Formatters.MediaTypeSegmentWithQuality.MediaType.get -> Microsoft.Extensions.Primitives.StringSegment
Microsoft.AspNetCore.Mvc.Formatters.MediaTypeSegmentWithQuality.MediaTypeSegmentWithQuality(Microsoft.Extensions.Primitives.StringSegment mediaType, double quality) -> void
Microsoft.AspNetCore.Mvc.Formatters.MediaTypeSegmentWithQuality.Quality.get -> double
@@ -1526,6 +1529,7 @@ Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Model.get ->
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Model.set -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.ModelState.get -> Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary!
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.StateManager
+Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.StateManager.StateManager() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.StateManager.Dispose() -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.StateManager.StateManager(Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor! visitor, object? newModel) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ValidationVisitor.Strategy.get -> Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IValidationStrategy?
diff --git a/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt
index 80b80b3520..c2c8fdf41a 100644
--- a/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.Core/src/PublicAPI.Unshipped.txt
@@ -1,8 +1,26 @@
#nullable enable
*REMOVED*virtual Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>.PostConfigure(string! name, TOptions! options) -> void
+Microsoft.AspNetCore.Builder.ControllerActionEndpointConventionBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finalConvention) -> void
Microsoft.AspNetCore.Mvc.ApiBehaviorOptions.DisableImplicitFromServicesParameters.get -> bool
Microsoft.AspNetCore.Mvc.ApiBehaviorOptions.DisableImplicitFromServicesParameters.set -> void
Microsoft.AspNetCore.Mvc.ApplicationModels.InferParameterBindingInfoConvention.InferParameterBindingInfoConvention(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.Extensions.DependencyInjection.IServiceProviderIsService! serviceProviderIsService) -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.ControllerBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider! valueProvider, params System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+*REMOVED*Microsoft.AspNetCore.Mvc.ControllerBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, params System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Mvc.ControllerBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider! valueProvider, params System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Mvc.ControllerBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, params System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Mvc.ProblemDetails (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Detail.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Extensions.get -> System.Collections.Generic.IDictionary<string!, object?>! (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Instance.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.ProblemDetails() -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Status.get -> int? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Status.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Title.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Title.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Type.get -> string? (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
+Microsoft.AspNetCore.Mvc.ProblemDetails.Type.set -> void (forwarded, contained in Microsoft.AspNetCore.Http.Abstractions)
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.TryParseModelBinderProvider
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.TryParseModelBinderProvider.GetBinder(Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderProviderContext! context) -> Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinder?
Microsoft.AspNetCore.Mvc.ModelBinding.Binders.TryParseModelBinderProvider.TryParseModelBinderProvider() -> void
@@ -13,19 +31,8 @@ Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.SystemTextJsonValidationMetadataP
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.SystemTextJsonValidationMetadataProvider.SystemTextJsonValidationMetadataProvider(System.Text.Json.JsonNamingPolicy! namingPolicy) -> void
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ValidationMetadata.ValidationModelName.get -> string?
Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ValidationMetadata.ValidationModelName.set -> void
+override Microsoft.AspNetCore.Mvc.ModelBinding.JQueryFormValueProvider.GetValue(string! key) -> Microsoft.AspNetCore.Mvc.ModelBinding.ValueProviderResult
virtual Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>.PostConfigure(string? name, TOptions! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.Formatters.FormatFilter.FormatFilter(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.Mvc.Formatters.FormatFilter.FormatFilter(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>.ConfigureCompatibilityOptions(Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Infrastructure.MvcCompatibilityOptions!>! compatibilityOptions) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector.DefaultOutputFormatterSelector(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ObjectResultExecutor(Microsoft.AspNetCore.Mvc.Infrastructure.OutputFormatterSelector! formatterSelector, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions) -> void
-Microsoft.AspNetCore.Mvc.Infrastructure.ConfigureCompatibilityOptions<TOptions>.ConfigureCompatibilityOptions(Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Infrastructure.MvcCompatibilityOptions!>! compatibilityOptions) -> void
-Microsoft.AspNetCore.Mvc.Infrastructure.DefaultOutputFormatterSelector.DefaultOutputFormatterSelector(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor.ObjectResultExecutor(Microsoft.AspNetCore.Mvc.Infrastructure.OutputFormatterSelector! formatterSelector, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadataProvider.DefaultModelMetadataProvider(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ICompositeMetadataDetailsProvider! detailsProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory.ModelBinderFactory(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! metadataProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, System.IServiceProvider! serviceProvider) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.ParameterBinder(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinderFactory! modelBinderFactory, Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IObjectModelValidator! validator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.DefaultModelMetadataProvider.DefaultModelMetadataProvider(Microsoft.AspNetCore.Mvc.ModelBinding.Metadata.ICompositeMetadataDetailsProvider! detailsProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! optionsAccessor) -> void
-Microsoft.AspNetCore.Mvc.ModelBinding.ModelBinderFactory.ModelBinderFactory(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! metadataProvider, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! options, System.IServiceProvider! serviceProvider) -> void
-Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.ParameterBinder(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ModelBinding.IModelBinderFactory! modelBinderFactory, Microsoft.AspNetCore.Mvc.ModelBinding.Validation.IObjectModelValidator! validator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
static Microsoft.AspNetCore.Mvc.ControllerBase.Empty.get -> Microsoft.AspNetCore.Mvc.EmptyResult!
+*REMOVED*virtual Microsoft.AspNetCore.Mvc.ModelBinding.DefaultPropertyFilterProvider<TModel>.PropertyIncludeExpressions.get -> System.Collections.Generic.IEnumerable<System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>!>?
+virtual Microsoft.AspNetCore.Mvc.ModelBinding.DefaultPropertyFilterProvider<TModel>.PropertyIncludeExpressions.get -> System.Collections.Generic.IEnumerable<System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>!>?
diff --git a/src/Mvc/Mvc.Core/src/RequestSizeLimitAttribute.cs b/src/Mvc/Mvc.Core/src/RequestSizeLimitAttribute.cs
index 15c69a6131..63b79fb23c 100644
--- a/src/Mvc/Mvc.Core/src/RequestSizeLimitAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/RequestSizeLimitAttribute.cs
@@ -1,6 +1,7 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
@@ -10,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc;
/// Sets the request body size limit to the specified size.
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
-public class RequestSizeLimitAttribute : Attribute, IFilterFactory, IOrderedFilter
+public class RequestSizeLimitAttribute : Attribute, IFilterFactory, IOrderedFilter, IRequestSizeLimitMetadata
{
private readonly long _bytes;
@@ -51,4 +52,7 @@ public class RequestSizeLimitAttribute : Attribute, IFilterFactory, IOrderedFilt
filter.Bytes = _bytes;
return filter;
}
+
+ /// <inheritdoc />
+ long? IRequestSizeLimitMetadata.MaxRequestBodySize => _bytes;
}
diff --git a/src/Mvc/Mvc.Core/src/Resources.resx b/src/Mvc/Mvc.Core/src/Resources.resx
index 206a2f420b..3427c5ab3f 100644
--- a/src/Mvc/Mvc.Core/src/Resources.resx
+++ b/src/Mvc/Mvc.Core/src/Resources.resx
@@ -510,7 +510,10 @@
<data name="GetContentTypes_WildcardsNotSupported" xml:space="preserve">
<value>Could not parse '{0}'. Content types with wildcards are not supported.</value>
</data>
+ <data name="OutputCacheAttribute_Requires_OutputCachingMiddleware" xml:space="preserve">
+ <value>'{0}' requires the output cache middleware.</value>
+ </data>
<data name="TryParseModelBinder_InvalidType" xml:space="preserve">
<value>The type '{0}' does not contain a TryParse method and the binder '{1}' cannot be used.</value>
</data>
-</root> \ No newline at end of file
+</root>
diff --git a/src/Mvc/Mvc.Core/src/RouteAttribute.cs b/src/Mvc/Mvc.Core/src/RouteAttribute.cs
index 2371ed7a57..fa90ef17c8 100644
--- a/src/Mvc/Mvc.Core/src/RouteAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/RouteAttribute.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc;
@@ -17,12 +18,13 @@ public class RouteAttribute : Attribute, IRouteTemplateProvider
/// Creates a new <see cref="RouteAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
- public RouteAttribute(string template)
+ public RouteAttribute([StringSyntax("Route")] string template)
{
Template = template ?? throw new ArgumentNullException(nameof(template));
}
/// <inheritdoc />
+ [StringSyntax("Route")]
public string Template { get; }
/// <summary>
diff --git a/src/Mvc/Mvc.Core/src/Routing/ActionConstraintMatcherPolicy.cs b/src/Mvc/Mvc.Core/src/Routing/ActionConstraintMatcherPolicy.cs
index 9cfa9661ce..149bcfe271 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ActionConstraintMatcherPolicy.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ActionConstraintMatcherPolicy.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.Routing;
// This is a bridge that allows us to execute IActionConstraint instance when
// used with Matcher.
-internal class ActionConstraintMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
+internal sealed class ActionConstraintMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
{
// We need to be able to run IActionConstraints on Endpoints that aren't associated
// with an action. This is a sentinel value we use when the endpoint isn't from MVC.
diff --git a/src/Mvc/Mvc.Core/src/Routing/ActionEndpointDataSourceBase.cs b/src/Mvc/Mvc.Core/src/Routing/ActionEndpointDataSourceBase.cs
index 9d04bc583a..d141b85ad8 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ActionEndpointDataSourceBase.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ActionEndpointDataSourceBase.cs
@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Routing.Patterns;
using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.Routing;
@@ -22,6 +23,7 @@ internal abstract class ActionEndpointDataSourceBase : EndpointDataSource, IDisp
// Protected for READS and WRITES.
protected readonly List<Action<EndpointBuilder>> Conventions;
+ protected readonly List<Action<EndpointBuilder>> FinallyConventions;
private List<Endpoint>? _endpoints;
private CancellationTokenSource? _cancellationTokenSource;
@@ -33,6 +35,7 @@ internal abstract class ActionEndpointDataSourceBase : EndpointDataSource, IDisp
_actions = actions;
Conventions = new List<Action<EndpointBuilder>>();
+ FinallyConventions = new List<Action<EndpointBuilder>>();
}
public override IReadOnlyList<Endpoint> Endpoints
@@ -46,8 +49,25 @@ internal abstract class ActionEndpointDataSourceBase : EndpointDataSource, IDisp
}
}
+ public override IReadOnlyList<Endpoint> GetGroupedEndpoints(RouteGroupContext context)
+ {
+ return CreateEndpoints(
+ context.Prefix,
+ _actions.ActionDescriptors.Items,
+ Conventions,
+ context.Conventions,
+ FinallyConventions,
+ context.FinallyConventions);
+ }
+
// Will be called with the lock.
- protected abstract List<Endpoint> CreateEndpoints(IReadOnlyList<ActionDescriptor> actions, IReadOnlyList<Action<EndpointBuilder>> conventions);
+ protected abstract List<Endpoint> CreateEndpoints(
+ RoutePattern? groupPrefix,
+ IReadOnlyList<ActionDescriptor> actions,
+ IReadOnlyList<Action<EndpointBuilder>> conventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupConventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions);
protected void Subscribe()
{
@@ -97,11 +117,13 @@ internal abstract class ActionEndpointDataSourceBase : EndpointDataSource, IDisp
{
lock (Lock)
{
- var endpoints = CreateEndpoints(_actions.ActionDescriptors.Items, Conventions);
-
- // See comments in DefaultActionDescriptorCollectionProvider. These steps are done
- // in a specific order to ensure callers always see a consistent state.
-
+ var endpoints = CreateEndpoints(
+ groupPrefix: null,
+ _actions.ActionDescriptors.Items,
+ conventions: Conventions,
+ groupConventions: Array.Empty<Action<EndpointBuilder>>(),
+ finallyConventions: FinallyConventions,
+ groupFinallyConventions: Array.Empty<Action<EndpointBuilder>>());
// Step 1 - capture old token
var oldCancellationTokenSource = _cancellationTokenSource;
diff --git a/src/Mvc/Mvc.Core/src/Routing/ActionEndpointFactory.cs b/src/Mvc/Mvc.Core/src/Routing/ActionEndpointFactory.cs
index 2e13eb5938..8e5fcf61a6 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ActionEndpointFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ActionEndpointFactory.cs
@@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
+using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing;
@@ -15,13 +16,16 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class ActionEndpointFactory
+internal sealed class ActionEndpointFactory
{
private readonly RoutePatternTransformer _routePatternTransformer;
private readonly RequestDelegate _requestDelegate;
private readonly IRequestDelegateFactory[] _requestDelegateFactories;
+ private readonly IServiceProvider _serviceProvider;
- public ActionEndpointFactory(RoutePatternTransformer routePatternTransformer, IEnumerable<IRequestDelegateFactory> requestDelegateFactories)
+ public ActionEndpointFactory(RoutePatternTransformer routePatternTransformer,
+ IEnumerable<IRequestDelegateFactory> requestDelegateFactories,
+ IServiceProvider serviceProvider)
{
if (routePatternTransformer == null)
{
@@ -31,6 +35,7 @@ internal class ActionEndpointFactory
_routePatternTransformer = routePatternTransformer;
_requestDelegate = CreateRequestDelegate();
_requestDelegateFactories = requestDelegateFactories.ToArray();
+ _serviceProvider = serviceProvider;
}
public void AddEndpoints(
@@ -39,32 +44,20 @@ internal class ActionEndpointFactory
ActionDescriptor action,
IReadOnlyList<ConventionalRouteEntry> routes,
IReadOnlyList<Action<EndpointBuilder>> conventions,
- bool createInertEndpoints)
+ IReadOnlyList<Action<EndpointBuilder>> groupConventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions,
+ bool createInertEndpoints,
+ RoutePattern? groupPrefix = null)
{
- if (endpoints == null)
- {
- throw new ArgumentNullException(nameof(endpoints));
- }
-
- if (routeNames == null)
- {
- throw new ArgumentNullException(nameof(routeNames));
- }
-
- if (action == null)
- {
- throw new ArgumentNullException(nameof(action));
- }
-
- if (routes == null)
- {
- throw new ArgumentNullException(nameof(routes));
- }
-
- if (conventions == null)
- {
- throw new ArgumentNullException(nameof(conventions));
- }
+ ArgumentNullException.ThrowIfNull(nameof(endpoints));
+ ArgumentNullException.ThrowIfNull(nameof(routeNames));
+ ArgumentNullException.ThrowIfNull(nameof(action));
+ ArgumentNullException.ThrowIfNull(nameof(routes));
+ ArgumentNullException.ThrowIfNull(nameof(conventions));
+ ArgumentNullException.ThrowIfNull(nameof(groupConventions));
+ ArgumentNullException.ThrowIfNull(nameof(finallyConventions));
+ ArgumentNullException.ThrowIfNull(nameof(groupFinallyConventions));
if (createInertEndpoints)
{
@@ -81,8 +74,12 @@ internal class ActionEndpointFactory
dataTokens: null,
suppressLinkGeneration: false,
suppressPathMatching: false,
- conventions,
- Array.Empty<Action<EndpointBuilder>>());
+ groupConventions: groupConventions,
+ conventions: conventions,
+ perRouteConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: groupFinallyConventions,
+ finallyConventions: finallyConventions,
+ perRouteFinallyConventions: Array.Empty<Action<EndpointBuilder>>());
endpoints.Add(builder.Build());
}
@@ -102,6 +99,8 @@ internal class ActionEndpointFactory
continue;
}
+ updatedRoutePattern = RoutePatternFactory.Combine(groupPrefix, updatedRoutePattern);
+
var requestDelegate = CreateRequestDelegate(action, route.DataTokens) ?? _requestDelegate;
// We suppress link generation for each conventionally routed endpoint. We generate a single endpoint per-route
@@ -118,8 +117,12 @@ internal class ActionEndpointFactory
route.DataTokens,
suppressLinkGeneration: true,
suppressPathMatching: false,
- conventions,
- route.Conventions);
+ groupConventions: groupConventions,
+ conventions: conventions,
+ perRouteConventions: route.Conventions,
+ groupFinallyConventions: groupFinallyConventions,
+ finallyConventions: finallyConventions,
+ perRouteFinallyConventions: route.FinallyConventions);
endpoints.Add(builder.Build());
}
}
@@ -145,6 +148,8 @@ internal class ActionEndpointFactory
"To fix this error, choose a different parameter name.");
}
+ updatedRoutePattern = RoutePatternFactory.Combine(groupPrefix, updatedRoutePattern);
+
var builder = new RouteEndpointBuilder(requestDelegate, updatedRoutePattern, action.AttributeRouteInfo.Order)
{
DisplayName = action.DisplayName,
@@ -157,8 +162,12 @@ internal class ActionEndpointFactory
dataTokens: null,
action.AttributeRouteInfo.SuppressLinkGeneration,
action.AttributeRouteInfo.SuppressPathMatching,
- conventions,
- perRouteConventions: Array.Empty<Action<EndpointBuilder>>());
+ groupConventions: groupConventions,
+ conventions: conventions,
+ perRouteConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: groupFinallyConventions,
+ finallyConventions: finallyConventions,
+ perRouteFinallyConventions: Array.Empty<Action<EndpointBuilder>>());
endpoints.Add(builder.Build());
}
}
@@ -168,7 +177,11 @@ internal class ActionEndpointFactory
HashSet<string> routeNames,
HashSet<string> keys,
ConventionalRouteEntry route,
- IReadOnlyList<Action<EndpointBuilder>> conventions)
+ IReadOnlyList<Action<EndpointBuilder>> groupConventions,
+ IReadOnlyList<Action<EndpointBuilder>> conventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ RoutePattern? groupPrefix = null)
{
if (endpoints == null)
{
@@ -212,13 +225,15 @@ internal class ActionEndpointFactory
throw new InvalidOperationException("Failed to create a conventional route for pattern: " + route.Pattern);
}
+ pattern = RoutePatternFactory.Combine(groupPrefix, pattern);
+
var builder = new RouteEndpointBuilder(context => Task.CompletedTask, pattern, route.Order)
{
DisplayName = "Route: " + route.Pattern.RawText,
Metadata =
- {
- new SuppressMatchingMetadata(),
- },
+ {
+ new SuppressMatchingMetadata(),
+ },
};
if (route.RouteName != null)
@@ -236,6 +251,11 @@ internal class ActionEndpointFactory
builder.Metadata.Add(new EndpointNameMetadata(route.RouteName));
}
+ for (var i = 0; i < groupConventions.Count; i++)
+ {
+ groupConventions[i](builder);
+ }
+
for (var i = 0; i < conventions.Count; i++)
{
conventions[i](builder);
@@ -246,6 +266,21 @@ internal class ActionEndpointFactory
route.Conventions[i](builder);
}
+ foreach (var routeFinallyConvention in route.FinallyConventions)
+ {
+ routeFinallyConvention(builder);
+ }
+
+ foreach (var finallyConvention in finallyConventions)
+ {
+ finallyConvention(builder);
+ }
+
+ foreach (var groupFinallyConvention in groupFinallyConventions)
+ {
+ groupFinallyConvention(builder);
+ }
+
endpoints.Add((RouteEndpoint)builder.Build());
}
@@ -301,7 +336,7 @@ internal class ActionEndpointFactory
return (attributeRoutePattern, resolvedRequiredValues ?? action.RouteValues);
}
- private static void AddActionDataToBuilder(
+ private void AddActionDataToBuilder(
EndpointBuilder builder,
HashSet<string> routeNames,
ActionDescriptor action,
@@ -309,9 +344,22 @@ internal class ActionEndpointFactory
RouteValueDictionary? dataTokens,
bool suppressLinkGeneration,
bool suppressPathMatching,
+ IReadOnlyList<Action<EndpointBuilder>> groupConventions,
IReadOnlyList<Action<EndpointBuilder>> conventions,
- IReadOnlyList<Action<EndpointBuilder>> perRouteConventions)
+ IReadOnlyList<Action<EndpointBuilder>> perRouteConventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> perRouteFinallyConventions)
{
+ // REVIEW: The RouteEndpointDataSource adds HttpMethodMetadata before running group conventions
+ // do we need to do the same here?
+
+ // Group metadata has the lowest precedence.
+ for (var i = 0; i < groupConventions.Count; i++)
+ {
+ groupConventions[i](builder);
+ }
+
// Add action metadata first so it has a low precedence
if (action.EndpointMetadata != null)
{
@@ -406,6 +454,45 @@ internal class ActionEndpointFactory
{
perRouteConventions[i](builder);
}
+
+ if (builder.FilterFactories.Count > 0 && action is ControllerActionDescriptor cad)
+ {
+ var routeHandlerFilters = builder.FilterFactories;
+
+ EndpointFilterDelegate del = static invocationContext =>
+ {
+ // By the time this is called, we have the cache entry
+ var controllerInvocationContext = (ControllerEndpointFilterInvocationContext)invocationContext;
+ return controllerInvocationContext.ActionDescriptor.CacheEntry!.InnerActionMethodExecutor.Execute(controllerInvocationContext);
+ };
+
+ var context = new EndpointFilterFactoryContext(cad.MethodInfo, builder.Metadata, _serviceProvider);
+
+ var initialFilteredInvocation = del;
+
+ for (var i = routeHandlerFilters.Count - 1; i >= 0; i--)
+ {
+ var filterFactory = routeHandlerFilters[i];
+ del = filterFactory(context, del);
+ }
+
+ cad.FilterDelegate = ReferenceEquals(del, initialFilteredInvocation) ? null : del;
+ }
+
+ foreach (var perRouteFinallyConvention in perRouteFinallyConventions)
+ {
+ perRouteFinallyConvention(builder);
+ }
+
+ foreach (var finallyConvention in finallyConventions)
+ {
+ finallyConvention(builder);
+ }
+
+ foreach (var groupFinallyConvention in groupFinallyConventions)
+ {
+ groupFinallyConvention(builder);
+ }
}
private RequestDelegate? CreateRequestDelegate(ActionDescriptor action, RouteValueDictionary? dataTokens = null)
@@ -455,7 +542,7 @@ internal class ActionEndpointFactory
};
}
- private class InertEndpointBuilder : EndpointBuilder
+ private sealed class InertEndpointBuilder : EndpointBuilder
{
public override Endpoint Build()
{
diff --git a/src/Mvc/Mvc.Core/src/Routing/AttributeRoute.cs b/src/Mvc/Mvc.Core/src/Routing/AttributeRoute.cs
index d14bc5f37d..4bfa31e7ec 100644
--- a/src/Mvc/Mvc.Core/src/Routing/AttributeRoute.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/AttributeRoute.cs
@@ -12,7 +12,7 @@ using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class AttributeRoute : IRouter
+internal sealed class AttributeRoute : IRouter
{
private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;
private readonly IServiceProvider _services;
@@ -237,7 +237,7 @@ internal class AttributeRoute : IRouter
return routeInfo;
}
- private class RouteInfo
+ private sealed class RouteInfo
{
public ActionDescriptor ActionDescriptor { get; init; } = default!;
@@ -254,7 +254,7 @@ internal class AttributeRoute : IRouter
public bool SuppressLinkGeneration { get; set; }
}
- private class RouteInfoEqualityComparer : IEqualityComparer<RouteInfo>
+ private sealed class RouteInfoEqualityComparer : IEqualityComparer<RouteInfo>
{
public static readonly RouteInfoEqualityComparer Instance = new();
@@ -296,7 +296,7 @@ internal class AttributeRoute : IRouter
}
// Used only to hook up link generation, and it doesn't need to do anything.
- private class NullRouter : IRouter
+ private sealed class NullRouter : IRouter
{
public static readonly NullRouter Instance = new NullRouter();
diff --git a/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSource.cs b/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSource.cs
index 542e1da33f..ea589941c4 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSource.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSource.cs
@@ -7,10 +7,11 @@ using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Routing.Patterns;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class ControllerActionEndpointDataSource : ActionEndpointDataSourceBase
+internal sealed class ControllerActionEndpointDataSource : ActionEndpointDataSourceBase
{
private readonly ActionEndpointFactory _endpointFactory;
private readonly OrderedEndpointsSequenceProvider _orderSequence;
@@ -30,7 +31,7 @@ internal class ControllerActionEndpointDataSource : ActionEndpointDataSourceBase
_routes = new List<ConventionalRouteEntry>();
- DefaultBuilder = new ControllerActionEndpointConventionBuilder(Lock, Conventions);
+ DefaultBuilder = new ControllerActionEndpointConventionBuilder(Lock, Conventions, FinallyConventions);
// IMPORTANT: this needs to be the last thing we do in the constructor.
// Change notifications can happen immediately!
@@ -55,12 +56,19 @@ internal class ControllerActionEndpointDataSource : ActionEndpointDataSourceBase
lock (Lock)
{
var conventions = new List<Action<EndpointBuilder>>();
- _routes.Add(new ConventionalRouteEntry(routeName, pattern, defaults, constraints, dataTokens, _orderSequence.GetNext(), conventions));
- return new ControllerActionEndpointConventionBuilder(Lock, conventions);
+ var finallyConventions = new List<Action<EndpointBuilder>>();
+ _routes.Add(new ConventionalRouteEntry(routeName, pattern, defaults, constraints, dataTokens, _orderSequence.GetNext(), conventions, finallyConventions));
+ return new ControllerActionEndpointConventionBuilder(Lock, conventions, finallyConventions);
}
}
- protected override List<Endpoint> CreateEndpoints(IReadOnlyList<ActionDescriptor> actions, IReadOnlyList<Action<EndpointBuilder>> conventions)
+ protected override List<Endpoint> CreateEndpoints(
+ RoutePattern? groupPrefix,
+ IReadOnlyList<ActionDescriptor> actions,
+ IReadOnlyList<Action<EndpointBuilder>> conventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupConventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions)
{
var endpoints = new List<Endpoint>();
var keys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
@@ -80,7 +88,16 @@ internal class ControllerActionEndpointDataSource : ActionEndpointDataSourceBase
{
if (actions[i] is ControllerActionDescriptor action)
{
- _endpointFactory.AddEndpoints(endpoints, routeNames, action, _routes, conventions, CreateInertEndpoints);
+ _endpointFactory.AddEndpoints(endpoints,
+ routeNames,
+ action,
+ _routes,
+ conventions: conventions,
+ groupConventions: groupConventions,
+ finallyConventions: finallyConventions,
+ groupFinallyConventions: groupFinallyConventions,
+ CreateInertEndpoints,
+ groupPrefix: groupPrefix);
if (_routes.Count > 0)
{
@@ -99,7 +116,16 @@ internal class ControllerActionEndpointDataSource : ActionEndpointDataSourceBase
for (var i = 0; i < _routes.Count; i++)
{
var route = _routes[i];
- _endpointFactory.AddConventionalLinkGenerationRoute(endpoints, routeNames, keys, route, conventions);
+ _endpointFactory.AddConventionalLinkGenerationRoute(
+ endpoints,
+ routeNames,
+ keys,
+ route,
+ groupConventions: groupConventions,
+ conventions: conventions,
+ finallyConventions: finallyConventions,
+ groupFinallyConventions: groupFinallyConventions,
+ groupPrefix: groupPrefix);
}
return endpoints;
diff --git a/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceFactory.cs b/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceFactory.cs
index c397b2e964..7253e16735 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceFactory.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
-internal class ControllerActionEndpointDataSourceFactory
+internal sealed class ControllerActionEndpointDataSourceFactory
{
private readonly ControllerActionEndpointDataSourceIdProvider _dataSourceIdProvider;
private readonly IActionDescriptorCollectionProvider _actions;
diff --git a/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceIdProvider.cs b/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceIdProvider.cs
index adb7248219..b8bcb626a8 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceIdProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ControllerActionEndpointDataSourceIdProvider.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class ControllerActionEndpointDataSourceIdProvider
+internal sealed class ControllerActionEndpointDataSourceIdProvider
{
private int _nextId = 1;
diff --git a/src/Mvc/Mvc.Core/src/Routing/ControllerEndpointDataSourceIdMetadata.cs b/src/Mvc/Mvc.Core/src/Routing/ControllerEndpointDataSourceIdMetadata.cs
index 4e872ef0d7..b042cb5978 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ControllerEndpointDataSourceIdMetadata.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ControllerEndpointDataSourceIdMetadata.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class ControllerEndpointDataSourceIdMetadata
+internal sealed class ControllerEndpointDataSourceIdMetadata
{
public ControllerEndpointDataSourceIdMetadata(int id)
{
diff --git a/src/Mvc/Mvc.Core/src/Routing/ControllerRequestDelegateFactory.cs b/src/Mvc/Mvc.Core/src/Routing/ControllerRequestDelegateFactory.cs
index 1d0da44d96..2e52948978 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ControllerRequestDelegateFactory.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ControllerRequestDelegateFactory.cs
@@ -14,7 +14,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class ControllerRequestDelegateFactory : IRequestDelegateFactory
+internal sealed class ControllerRequestDelegateFactory : IRequestDelegateFactory
{
private readonly ControllerActionInvokerCache _controllerActionInvokerCache;
private readonly IReadOnlyList<IValueProviderFactory> _valueProviderFactories;
diff --git a/src/Mvc/Mvc.Core/src/Routing/ConventionalRouteEntry.cs b/src/Mvc/Mvc.Core/src/Routing/ConventionalRouteEntry.cs
index 8bd18bd31f..a812882aa6 100644
--- a/src/Mvc/Mvc.Core/src/Routing/ConventionalRouteEntry.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/ConventionalRouteEntry.cs
@@ -15,6 +15,7 @@ internal readonly struct ConventionalRouteEntry
public readonly RouteValueDictionary? DataTokens;
public readonly int Order;
public readonly IReadOnlyList<Action<EndpointBuilder>> Conventions;
+ public readonly IReadOnlyList<Action<EndpointBuilder>> FinallyConventions;
public ConventionalRouteEntry(
string routeName,
@@ -23,12 +24,14 @@ internal readonly struct ConventionalRouteEntry
IDictionary<string, object?>? constraints,
RouteValueDictionary? dataTokens,
int order,
- List<Action<EndpointBuilder>> conventions)
+ List<Action<EndpointBuilder>> conventions,
+ List<Action<EndpointBuilder>> finallyConventions)
{
RouteName = routeName;
DataTokens = dataTokens;
Order = order;
Conventions = conventions;
+ FinallyConventions = finallyConventions;
try
{
diff --git a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointMatcherPolicy.cs b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointMatcherPolicy.cs
index 9c47e421c3..87ba4bdd23 100644
--- a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointMatcherPolicy.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointMatcherPolicy.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class DynamicControllerEndpointMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
+internal sealed class DynamicControllerEndpointMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
{
private readonly DynamicControllerEndpointSelectorCache _selectorCache;
private readonly EndpointMetadataComparer _comparer;
diff --git a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelector.cs b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelector.cs
index dcbe630bbc..1d041461ff 100644
--- a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelector.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelector.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class DynamicControllerEndpointSelector : IDisposable
+internal sealed class DynamicControllerEndpointSelector : IDisposable
{
private readonly DataSourceDependentCache<ActionSelectionTable<Endpoint>> _cache;
diff --git a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelectorCache.cs b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelectorCache.cs
index 8613841468..aee4b811cb 100644
--- a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelectorCache.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerEndpointSelectorCache.cs
@@ -7,7 +7,9 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.Routing;
+#pragma warning disable CA1852 // Seal internal types
internal class DynamicControllerEndpointSelectorCache
+#pragma warning restore CA1852 // Seal internal types
{
private readonly ConcurrentDictionary<int, EndpointDataSource> _dataSourceCache = new();
private readonly ConcurrentDictionary<int, DynamicControllerEndpointSelector> _endpointSelectorCache = new();
diff --git a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerMetadata.cs b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerMetadata.cs
index df7f3bf512..a37fb08aaa 100644
--- a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerMetadata.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerMetadata.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class DynamicControllerMetadata : IDynamicEndpointMetadata
+internal sealed class DynamicControllerMetadata : IDynamicEndpointMetadata
{
public DynamicControllerMetadata(RouteValueDictionary values)
{
diff --git a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerRouteValueTransformerMetadata.cs b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerRouteValueTransformerMetadata.cs
index 780e89669f..bbe072da79 100644
--- a/src/Mvc/Mvc.Core/src/Routing/DynamicControllerRouteValueTransformerMetadata.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/DynamicControllerRouteValueTransformerMetadata.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class DynamicControllerRouteValueTransformerMetadata : IDynamicEndpointMetadata
+internal sealed class DynamicControllerRouteValueTransformerMetadata : IDynamicEndpointMetadata
{
public DynamicControllerRouteValueTransformerMetadata(Type selectorType, object? state)
{
diff --git a/src/Mvc/Mvc.Core/src/Routing/EndpointRoutingUrlHelper.cs b/src/Mvc/Mvc.Core/src/Routing/EndpointRoutingUrlHelper.cs
index 56b4556096..1546cf167e 100644
--- a/src/Mvc/Mvc.Core/src/Routing/EndpointRoutingUrlHelper.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/EndpointRoutingUrlHelper.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.Routing;
/// An implementation of <see cref="IUrlHelper"/> that uses <see cref="LinkGenerator"/> to build URLs
/// for ASP.NET MVC within an application.
/// </summary>
-internal class EndpointRoutingUrlHelper : UrlHelperBase
+internal sealed class EndpointRoutingUrlHelper : UrlHelperBase
{
private readonly ILogger<EndpointRoutingUrlHelper> _logger;
private readonly LinkGenerator _linkGenerator;
diff --git a/src/Mvc/Mvc.Core/src/Routing/HttpMethodAttribute.cs b/src/Mvc/Mvc.Core/src/Routing/HttpMethodAttribute.cs
index ba6bd24b7d..8da7644822 100644
--- a/src/Mvc/Mvc.Core/src/Routing/HttpMethodAttribute.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/HttpMethodAttribute.cs
@@ -32,7 +32,7 @@ public abstract class HttpMethodAttribute : Attribute, IActionHttpMethodProvider
/// </summary>
/// <param name="httpMethods">The set of supported methods. May not be null.</param>
/// <param name="template">The route template.</param>
- public HttpMethodAttribute(IEnumerable<string> httpMethods, string? template)
+ public HttpMethodAttribute(IEnumerable<string> httpMethods, [StringSyntax("Route")] string? template)
{
if (httpMethods == null)
{
@@ -47,6 +47,7 @@ public abstract class HttpMethodAttribute : Attribute, IActionHttpMethodProvider
public IEnumerable<string> HttpMethods => _httpMethods;
/// <inheritdoc />
+ [StringSyntax("Route")]
public string? Template { get; }
/// <summary>
diff --git a/src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs b/src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs
index 8a7f59541e..4ee801acba 100644
--- a/src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/IRouteTemplateProvider.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
+
namespace Microsoft.AspNetCore.Mvc.Routing;
/// <summary>
@@ -11,6 +13,7 @@ public interface IRouteTemplateProvider
/// <summary>
/// The route template. May be <see langword="null"/>.
/// </summary>
+ [StringSyntax("Route")]
string? Template { get; }
/// <summary>
diff --git a/src/Mvc/Mvc.Core/src/Routing/KnownRouteValueConstraint.cs b/src/Mvc/Mvc.Core/src/Routing/KnownRouteValueConstraint.cs
index 5fd972549c..5bcb3dbd2a 100644
--- a/src/Mvc/Mvc.Core/src/Routing/KnownRouteValueConstraint.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/KnownRouteValueConstraint.cs
@@ -127,7 +127,7 @@ public class KnownRouteValueConstraint : IRouteConstraint
return valuesCollection.Items;
}
- private class RouteValuesCollection
+ private sealed class RouteValuesCollection
{
public RouteValuesCollection(int version, string[] items)
{
diff --git a/src/Mvc/Mvc.Core/src/Routing/MvcAttributeRouteHandler.cs b/src/Mvc/Mvc.Core/src/Routing/MvcAttributeRouteHandler.cs
index ae8be2e987..9c788cef2d 100644
--- a/src/Mvc/Mvc.Core/src/Routing/MvcAttributeRouteHandler.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/MvcAttributeRouteHandler.cs
@@ -10,7 +10,7 @@ using Resources = Microsoft.AspNetCore.Mvc.Core.Resources;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class MvcAttributeRouteHandler : IRouter
+internal sealed class MvcAttributeRouteHandler : IRouter
{
private readonly IActionInvokerFactory _actionInvokerFactory;
private readonly IActionSelector _actionSelector;
diff --git a/src/Mvc/Mvc.Core/src/Routing/MvcRouteHandler.cs b/src/Mvc/Mvc.Core/src/Routing/MvcRouteHandler.cs
index 507a077e5e..b2cecc9a54 100644
--- a/src/Mvc/Mvc.Core/src/Routing/MvcRouteHandler.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/MvcRouteHandler.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class MvcRouteHandler : IRouter
+internal sealed class MvcRouteHandler : IRouter
{
private readonly IActionInvokerFactory _actionInvokerFactory;
private readonly IActionSelector _actionSelector;
diff --git a/src/Mvc/Mvc.Core/src/Routing/NullRouter.cs b/src/Mvc/Mvc.Core/src/Routing/NullRouter.cs
index 208e587955..4d7a1f8cd6 100644
--- a/src/Mvc/Mvc.Core/src/Routing/NullRouter.cs
+++ b/src/Mvc/Mvc.Core/src/Routing/NullRouter.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.Routing;
-internal class NullRouter : IRouter
+internal sealed class NullRouter : IRouter
{
public static readonly IRouter Instance = new NullRouter();
diff --git a/src/Mvc/Mvc.Core/test/ApplicationModels/ApiBehaviorApplicationModelProviderTest.cs b/src/Mvc/Mvc.Core/test/ApplicationModels/ApiBehaviorApplicationModelProviderTest.cs
index 16117d17db..c4dddb5d71 100644
--- a/src/Mvc/Mvc.Core/test/ApplicationModels/ApiBehaviorApplicationModelProviderTest.cs
+++ b/src/Mvc/Mvc.Core/test/ApplicationModels/ApiBehaviorApplicationModelProviderTest.cs
@@ -3,10 +3,8 @@
using System.Reflection;
using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.ModelBinding;
-using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options;
using Moq;
@@ -53,6 +51,7 @@ public class ApiBehaviorApplicationModelProviderTest
var actionModel = new ActionModel(method, Array.Empty<object>())
{
Controller = controllerModel,
+ Selectors = { new SelectorModel { AttributeRouteModel = new AttributeRouteModel() } },
};
controllerModel.Actions.Add(actionModel);
@@ -77,6 +76,8 @@ public class ApiBehaviorApplicationModelProviderTest
Assert.NotEmpty(actionModel.Filters.OfType<ModelStateInvalidFilterFactory>());
Assert.NotEmpty(actionModel.Filters.OfType<ClientErrorResultFilterFactory>());
Assert.Equal(BindingSource.Body, parameterModel.BindingInfo.BindingSource);
+ Assert.NotEmpty(actionModel.Selectors);
+ Assert.Empty(actionModel.Selectors[0].EndpointMetadata);
}
[Fact]
@@ -93,6 +94,7 @@ public class ApiBehaviorApplicationModelProviderTest
var actionModel = new ActionModel(method, Array.Empty<object>())
{
Controller = controllerModel,
+ Selectors = { new SelectorModel { AttributeRouteModel = new AttributeRouteModel() } },
};
controllerModel.Actions.Add(actionModel);
@@ -117,6 +119,8 @@ public class ApiBehaviorApplicationModelProviderTest
Assert.NotEmpty(actionModel.Filters.OfType<ModelStateInvalidFilterFactory>());
Assert.NotEmpty(actionModel.Filters.OfType<ClientErrorResultFilterFactory>());
Assert.Equal(BindingSource.Body, parameterModel.BindingInfo.BindingSource);
+ Assert.NotEmpty(actionModel.Selectors);
+ Assert.Empty(actionModel.Selectors[0].EndpointMetadata);
}
[Fact]
@@ -129,6 +133,7 @@ public class ApiBehaviorApplicationModelProviderTest
Assert.Collection(
provider.ActionModelConventions,
c => Assert.IsType<ApiVisibilityConvention>(c),
+ c => Assert.IsType<EndpointMetadataConvention>(c),
c => Assert.IsType<ClientErrorResultFilterConvention>(c),
c => Assert.IsType<InvalidModelStateFilterConvention>(c),
c => Assert.IsType<ConsumesConstraintForFormFileParameterConvention>(c),
diff --git a/src/Mvc/Mvc.Core/test/ApplicationModels/ControllerActionDescriptorProviderTests.cs b/src/Mvc/Mvc.Core/test/ApplicationModels/ControllerActionDescriptorProviderTests.cs
index 2a65b88122..6098de9d0f 100644
--- a/src/Mvc/Mvc.Core/test/ApplicationModels/ControllerActionDescriptorProviderTests.cs
+++ b/src/Mvc/Mvc.Core/test/ApplicationModels/ControllerActionDescriptorProviderTests.cs
@@ -755,42 +755,27 @@ public class ControllerActionDescriptorProviderTests
// Arrange
var sameNameType = typeof(SameNameDifferentTemplatesController).GetTypeInfo();
var provider = GetProvider(sameNameType);
-
var assemblyName = sameNameType.Assembly.GetName().Name;
- var expectedMessage =
- "The following errors occurred with attribute routing information:"
- + Environment.NewLine + Environment.NewLine +
- "Error 1:" + Environment.NewLine +
- "Attribute routes with the same name 'Products' must have the same template:"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.Get ({assemblyName})' - Template: 'Products'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.Get ({assemblyName})' - Template: 'Products/{{id}}'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.Put ({assemblyName})' - Template: 'Products/{{id}}'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.Post ({assemblyName})' - Template: 'Products'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.Delete ({assemblyName})' - Template: 'Products/{{id}}'"
- + Environment.NewLine + Environment.NewLine +
- "Error 2:" + Environment.NewLine +
- "Attribute routes with the same name 'Items' must have the same template:"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.GetItems ({assemblyName})' - Template: 'Items/{{id}}'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.PostItems ({assemblyName})' - Template: 'Items'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.PutItems ({assemblyName})' - Template: 'Items/{{id}}'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.DeleteItems ({assemblyName})' - Template: 'Items/{{id}}'"
- + Environment.NewLine +
- $"Action: '{sameNameType.FullName}.PatchItems ({assemblyName})' - Template: 'Items'";
// Act
var ex = Assert.Throws<InvalidOperationException>(() => { provider.GetDescriptors(); });
// Assert
- Assert.Equal(expectedMessage, ex.Message);
+ Assert.Contains("The following errors occurred with attribute routing information:", ex.Message);
+ Assert.Contains("Error 1:", ex.Message);
+ Assert.Contains("Attribute routes with the same name 'Products' must have the same template:", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.Get ({assemblyName})' - Template: 'Products'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.Get ({assemblyName})' - Template: 'Products/{{id}}'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.Put ({assemblyName})' - Template: 'Products/{{id}}'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.Post ({assemblyName})' - Template: 'Products'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.Delete ({assemblyName})' - Template: 'Products/{{id}}'", ex.Message);
+ Assert.Contains("Error 2:", ex.Message);
+ Assert.Contains("Attribute routes with the same name 'Items' must have the same template:", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.GetItems ({assemblyName})' - Template: 'Items/{{id}}'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.PostItems ({assemblyName})' - Template: 'Items'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.PutItems ({assemblyName})' - Template: 'Items/{{id}}'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.DeleteItems ({assemblyName})' - Template: 'Items/{{id}}'", ex.Message);
+ Assert.Contains($"Action: '{sameNameType.FullName}.PatchItems ({assemblyName})' - Template: 'Items'", ex.Message);
}
[Fact]
diff --git a/src/Mvc/Mvc.Core/test/ApplicationModels/DefaultApplicationModelProviderTest.cs b/src/Mvc/Mvc.Core/test/ApplicationModels/DefaultApplicationModelProviderTest.cs
index e910a21f19..3912588804 100644
--- a/src/Mvc/Mvc.Core/test/ApplicationModels/DefaultApplicationModelProviderTest.cs
+++ b/src/Mvc/Mvc.Core/test/ApplicationModels/DefaultApplicationModelProviderTest.cs
@@ -94,6 +94,15 @@ public class DefaultApplicationModelProviderTest
},
property =>
{
+ Assert.Equal(nameof(ModelBinderController.Service), property.PropertyName);
+ Assert.Equal(BindingSource.Services, property.BindingInfo.BindingSource);
+ Assert.Same(controllerModel, property.Controller);
+
+ var attribute = Assert.Single(property.Attributes);
+ Assert.IsType<FromServicesAttribute>(attribute); ;
+ },
+ property =>
+ {
Assert.Equal(nameof(ModelBinderController.Unbound), property.PropertyName);
Assert.Null(property.BindingInfo);
Assert.Same(controllerModel, property.Controller);
@@ -104,7 +113,7 @@ public class DefaultApplicationModelProviderTest
public void OnProvidersExecuting_ReadsBindingSourceForPropertiesFromModelMetadata()
{
// Arrange
- var detailsProvider = new BindingSourceMetadataProvider(typeof(string), BindingSource.Services);
+ var detailsProvider = new BindingSourceMetadataProvider(typeof(string), BindingSource.Special);
var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(new[] { detailsProvider });
var typeInfo = typeof(ModelBinderController).GetTypeInfo();
var provider = new TestApplicationModelProvider(new MvcOptions(), modelMetadataProvider);
@@ -137,9 +146,18 @@ public class DefaultApplicationModelProviderTest
},
property =>
{
- Assert.Equal(nameof(ModelBinderController.Unbound), property.PropertyName);
+ Assert.Equal(nameof(ModelBinderController.Service), property.PropertyName);
Assert.Equal(BindingSource.Services, property.BindingInfo.BindingSource);
Assert.Same(controllerModel, property.Controller);
+
+ var attribute = Assert.Single(property.Attributes);
+ Assert.IsType<FromServicesAttribute>(attribute);
+ },
+ property =>
+ {
+ Assert.Equal(nameof(ModelBinderController.Unbound), property.PropertyName);
+ Assert.Equal(BindingSource.Special, property.BindingInfo.BindingSource);
+ Assert.Same(controllerModel, property.Controller);
});
}
@@ -1743,6 +1761,9 @@ public class DefaultApplicationModelProviderTest
{
}
+ public interface ITestService
+ { }
+
public class ModelBinderController
{
[FromQuery]
@@ -1750,6 +1771,9 @@ public class DefaultApplicationModelProviderTest
public string Unbound { get; set; }
+ [FromServices]
+ public ITestService Service { get; set; }
+
public IFormFile FormFile { get; set; }
public IActionResult PostAction([FromQuery] string fromQuery, IFormFileCollection formFileCollection, string unbound) => null;
diff --git a/src/Mvc/Mvc.Core/test/ApplicationModels/EndpointMetadataConventionTest.cs b/src/Mvc/Mvc.Core/test/ApplicationModels/EndpointMetadataConventionTest.cs
new file mode 100644
index 0000000000..37be61a23f
--- /dev/null
+++ b/src/Mvc/Mvc.Core/test/ApplicationModels/EndpointMetadataConventionTest.cs
@@ -0,0 +1,386 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Metadata;
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using Moq;
+
+namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
+
+public class EndpointMetadataConventionTest
+{
+ [Theory]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithMetadataInValueTaskOfResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithMetadataInValueTaskOfActionResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithMetadataInTaskOfResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithMetadataInTaskOfActionResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithMetadataInResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithMetadataInActionResult))]
+ public void Apply_DiscoversEndpointMetadata_FromReturnTypeImplementingIEndpointMetadataProvider(
+ Type controllerType,
+ string actionName)
+ {
+ // Arrange
+ var action = GetActionModel(controllerType, actionName);
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.Contains(action.Selectors[0].EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.ReturnType });
+ }
+
+ [Fact]
+ public void Apply_DiscoversEndpointMetadata_ForAllSelectors_FromReturnTypeImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.MultipleSelectorsActionWithMetadataInActionResult));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ foreach (var selector in action.Selectors)
+ {
+ Assert.Contains(selector.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.ReturnType });
+ }
+ }
+
+ [Fact]
+ public void Apply_DiscoversMetadata_FromParametersImplementingIEndpointParameterMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.ActionWithParameterMetadata));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.Contains(action.Selectors[0].EndpointMetadata, m => m is ParameterNameMetadata { Name: "param1" });
+ }
+
+ [Fact]
+ public void Apply_DiscoversEndpointMetadata_ForAllSelectors_FromParametersImplementingIEndpointParameterMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.MultipleSelectorsActionWithParameterMetadata));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ foreach (var selector in action.Selectors)
+ {
+ Assert.Contains(selector.EndpointMetadata, m => m is ParameterNameMetadata { Name: "param1" });
+ }
+ }
+
+ [Fact]
+ public void Apply_DiscoversMetadata_FromParametersImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.ActionWithParameterMetadata));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.Contains(action.Selectors[0].EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Parameter });
+ }
+
+ [Fact]
+ public void Apply_DiscoversEndpointMetadata_ForAllSelectors_FromParametersImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.MultipleSelectorsActionWithParameterMetadata));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ foreach (var selector in action.Selectors)
+ {
+ Assert.Contains(selector.EndpointMetadata, m => m is CustomEndpointMetadata { Source: MetadataSource.Parameter });
+ }
+ }
+
+ [Fact]
+ public void Apply_DiscoversMetadata_CorrectOrder()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.ActionWithParameterMetadata));
+ action.Selectors[0].EndpointMetadata.Add(new CustomEndpointMetadata() { Source = MetadataSource.Caller });
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.Collection(
+ action.Selectors[0].EndpointMetadata,
+ m => Assert.True(m is CustomEndpointMetadata { Source: MetadataSource.Caller }),
+ m => Assert.True(m is ParameterNameMetadata { Name: "param1" }),
+ m => Assert.True(m is CustomEndpointMetadata { Source: MetadataSource.Parameter }));
+ }
+
+ [Theory]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithNoAcceptsMetadataInValueTaskOfResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithNoAcceptsMetadataInValueTaskOfActionResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithNoAcceptsMetadataInTaskOfResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithNoAcceptsMetadataInTaskOfActionResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithNoAcceptsMetadataInResult))]
+ [InlineData(typeof(TestController), nameof(TestController.ActionWithNoAcceptsMetadataInActionResult))]
+ public void Apply_AllowsRemovalOfMetadata_ByReturnTypeImplementingIEndpointMetadataProvider(
+ Type controllerType,
+ string actionName)
+ {
+ // Arrange
+ var action = GetActionModel(controllerType, actionName);
+ action.Selectors[0].EndpointMetadata.Add(new ConsumesAttribute("application/json"));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.DoesNotContain(action.Selectors[0].EndpointMetadata, m => m is IAcceptsMetadata);
+ }
+
+ [Fact]
+ public void Apply_AllowsRemovalOfMetadata_ByParameterTypeImplementingIEndpointMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.ActionWithRemovalFromParameterEndpointMetadata));
+ action.Selectors[0].EndpointMetadata.Add(new ConsumesAttribute("application/json"));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.DoesNotContain(action.Selectors[0].EndpointMetadata, m => m is IAcceptsMetadata);
+ }
+
+ [Fact]
+ public void Apply_AllowsRemovalOfMetadata_ByParameterTypeImplementingIEndpointParameterMetadataProvider()
+ {
+ // Arrange
+ var action = GetActionModel(typeof(TestController), nameof(TestController.ActionWithRemovalFromParameterMetadata));
+ action.Selectors[0].EndpointMetadata.Add(new ConsumesAttribute("application/json"));
+ var convention = GetConvention();
+
+ //Act
+ convention.Apply(action);
+
+ // Assert
+ Assert.DoesNotContain(action.Selectors[0].EndpointMetadata, m => m is IAcceptsMetadata);
+ }
+
+ private static EndpointMetadataConvention GetConvention(IServiceProvider services = null)
+ {
+ services ??= Mock.Of<IServiceProvider>();
+ return new EndpointMetadataConvention(services);
+ }
+
+ private static ApplicationModelProviderContext GetContext(Type type)
+ {
+ var context = new ApplicationModelProviderContext(new[] { type.GetTypeInfo() });
+ var mvcOptions = Options.Create(new MvcOptions());
+ var convention = new DefaultApplicationModelProvider(mvcOptions, new EmptyModelMetadataProvider());
+ convention.OnProvidersExecuting(context);
+
+ return context;
+ }
+
+ private static ActionModel GetActionModel(
+ Type controllerType,
+ string actionName)
+ {
+ var context = GetContext(controllerType);
+ var controller = Assert.Single(context.Result.Controllers);
+ return Assert.Single(controller.Actions, m => m.ActionName == actionName);
+ }
+
+ private class TestController
+ {
+ public ActionResult ActionWithParameterMetadata(AddsCustomParameterMetadata param1) => null;
+ public ActionResult ActionWithRemovalFromParameterMetadata(RemovesAcceptsParameterMetadata param1) => null;
+ public ActionResult ActionWithRemovalFromParameterEndpointMetadata(RemovesAcceptsParameterEndpointMetadata param1) => null;
+
+ [HttpGet("selector1")]
+ [HttpGet("selector2")]
+ public ActionResult MultipleSelectorsActionWithParameterMetadata(AddsCustomParameterMetadata param1) => null;
+
+ public AddsCustomEndpointMetadataResult ActionWithMetadataInResult() => null;
+
+ public ValueTask<AddsCustomEndpointMetadataResult> ActionWithMetadataInValueTaskOfResult()
+ => ValueTask.FromResult<AddsCustomEndpointMetadataResult>(null);
+
+ public Task<AddsCustomEndpointMetadataResult> ActionWithMetadataInTaskOfResult()
+ => Task.FromResult<AddsCustomEndpointMetadataResult>(null);
+
+ [HttpGet("selector1")]
+ [HttpGet("selector2")]
+ public AddsCustomEndpointMetadataActionResult MultipleSelectorsActionWithMetadataInActionResult() => null;
+
+ public AddsCustomEndpointMetadataActionResult ActionWithMetadataInActionResult() => null;
+
+ public ValueTask<AddsCustomEndpointMetadataActionResult> ActionWithMetadataInValueTaskOfActionResult()
+ => ValueTask.FromResult<AddsCustomEndpointMetadataActionResult>(null);
+
+ public Task<AddsCustomEndpointMetadataActionResult> ActionWithMetadataInTaskOfActionResult()
+ => Task.FromResult<AddsCustomEndpointMetadataActionResult>(null);
+
+ public RemovesAcceptsMetadataResult ActionWithNoAcceptsMetadataInResult() => null;
+
+ public ValueTask<RemovesAcceptsMetadataResult> ActionWithNoAcceptsMetadataInValueTaskOfResult()
+ => ValueTask.FromResult<RemovesAcceptsMetadataResult>(null);
+
+ public Task<RemovesAcceptsMetadataResult> ActionWithNoAcceptsMetadataInTaskOfResult()
+ => Task.FromResult<RemovesAcceptsMetadataResult>(null);
+
+ public RemovesAcceptsMetadataActionResult ActionWithNoAcceptsMetadataInActionResult() => null;
+
+ public ValueTask<RemovesAcceptsMetadataActionResult> ActionWithNoAcceptsMetadataInValueTaskOfActionResult()
+ => ValueTask.FromResult<RemovesAcceptsMetadataActionResult>(null);
+
+ public Task<RemovesAcceptsMetadataActionResult> ActionWithNoAcceptsMetadataInTaskOfActionResult()
+ => Task.FromResult<RemovesAcceptsMetadataActionResult>(null);
+ }
+
+ private class CustomEndpointMetadata
+ {
+ public string Data { get; init; }
+
+ public MetadataSource Source { get; init; }
+ }
+ private enum MetadataSource
+ {
+ Caller,
+ Parameter,
+ ReturnType
+ }
+
+ private class ParameterNameMetadata
+ {
+ public string Name { get; init; }
+ }
+
+ private class AddsCustomParameterMetadata : IEndpointParameterMetadataProvider, IEndpointMetadataProvider
+ {
+ public static void PopulateMetadata(EndpointParameterMetadataContext parameterContext)
+ {
+ parameterContext.EndpointMetadata?.Add(new ParameterNameMetadata { Name = parameterContext.Parameter?.Name });
+ }
+
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata?.Add(new CustomEndpointMetadata { Source = MetadataSource.Parameter });
+ }
+ }
+
+ private class AddsCustomEndpointMetadataResult : IEndpointMetadataProvider, IResult
+ {
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata?.Add(new CustomEndpointMetadata { Source = MetadataSource.ReturnType });
+ }
+
+ public Task ExecuteAsync(HttpContext httpContext) => throw new NotImplementedException();
+ }
+
+ private class AddsCustomEndpointMetadataActionResult : IEndpointMetadataProvider, IActionResult
+ {
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ context.EndpointMetadata?.Add(new CustomEndpointMetadata { Source = MetadataSource.ReturnType });
+ }
+ public Task ExecuteResultAsync(ActionContext context) => throw new NotImplementedException();
+ }
+
+ private class RemovesAcceptsMetadataResult : IEndpointMetadataProvider, IResult
+ {
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ if (context.EndpointMetadata is not null)
+ {
+ for (int i = context.EndpointMetadata.Count - 1; i >= 0; i--)
+ {
+ var metadata = context.EndpointMetadata[i];
+ if (metadata is IAcceptsMetadata)
+ {
+ context.EndpointMetadata.RemoveAt(i);
+ }
+ }
+ }
+ }
+
+ public Task ExecuteAsync(HttpContext httpContext) => throw new NotImplementedException();
+ }
+
+ private class RemovesAcceptsMetadataActionResult : IEndpointMetadataProvider, IActionResult
+ {
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ if (context.EndpointMetadata is not null)
+ {
+ for (int i = context.EndpointMetadata.Count - 1; i >= 0; i--)
+ {
+ var metadata = context.EndpointMetadata[i];
+ if (metadata is IAcceptsMetadata)
+ {
+ context.EndpointMetadata.RemoveAt(i);
+ }
+ }
+ }
+ }
+
+ public Task ExecuteResultAsync(ActionContext context) => throw new NotImplementedException();
+ }
+
+ private class RemovesAcceptsParameterMetadata : IEndpointParameterMetadataProvider
+ {
+ public static void PopulateMetadata(EndpointParameterMetadataContext parameterContext)
+ {
+ if (parameterContext.EndpointMetadata is not null)
+ {
+ for (int i = parameterContext.EndpointMetadata.Count - 1; i >= 0; i--)
+ {
+ var metadata = parameterContext.EndpointMetadata[i];
+ if (metadata is IAcceptsMetadata)
+ {
+ parameterContext.EndpointMetadata.RemoveAt(i);
+ }
+ }
+ }
+ }
+ }
+
+ private class RemovesAcceptsParameterEndpointMetadata : IEndpointMetadataProvider
+ {
+ public static void PopulateMetadata(EndpointMetadataContext context)
+ {
+ if (context.EndpointMetadata is not null)
+ {
+ for (int i = context.EndpointMetadata.Count - 1; i >= 0; i--)
+ {
+ var metadata = context.EndpointMetadata[i];
+ if (metadata is IAcceptsMetadata)
+ {
+ context.EndpointMetadata.RemoveAt(i);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs b/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs
index deeda17dd2..3b6020a52d 100644
--- a/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs
+++ b/src/Mvc/Mvc.Core/test/ControllerBaseTest.cs
@@ -2728,8 +2728,7 @@ public class ControllerBaseTest
[Theory]
[InlineData("")]
[InlineData("prefix")]
- public async Task
- TryUpdateModel_IncludeExpressionWithValueProviderOverload_UsesPassedArguments(string prefix)
+ public async Task TryUpdateModel_IncludeExpressionWithValueProviderOverload_UsesPassedArguments(string prefix)
{
// Arrange
var valueProvider = new Mock<IValueProvider>();
@@ -2758,6 +2757,57 @@ public class ControllerBaseTest
Assert.NotEqual(0, binder.BindModelCount);
}
+#nullable enable
+ [Fact]
+ public async Task TryUpdateModel_SupportsNullableExpressions()
+ {
+ // Arrange
+ var valueProvider = new Mock<IValueProvider>();
+ valueProvider.Setup(v => v.ContainsPrefix(""))
+ .Returns(true);
+
+ StubModelBinder CreateBinder() => new StubModelBinder(context =>
+ {
+ Assert.Same(
+ valueProvider.Object,
+ Assert.IsType<CompositeValueProvider>(context.ValueProvider)[0]);
+
+ Assert.NotNull(context.PropertyFilter);
+
+ bool InvokePropertyFilter(string propertyName)
+ {
+ var modelMetadata = context.ModelMetadata.Properties[propertyName];
+ Assert.NotNull(modelMetadata);
+ return context.PropertyFilter!(modelMetadata!);
+ }
+
+ Assert.True(InvokePropertyFilter("Include"));
+ Assert.False(InvokePropertyFilter("Exclude"));
+ });
+
+ var binder1 = CreateBinder();
+ var controller1 = GetController(binder1, valueProvider.Object);
+ var model1 = new MyNullableModel();
+
+ // Act
+ await controller1.TryUpdateModelAsync(model1, prefix: "", m => m.Include);
+
+ // Assert
+ Assert.NotEqual(0, binder1.BindModelCount);
+
+ // Arrange (IModelBinder overload)
+ var binder2 = CreateBinder();
+ var controller2 = GetController(binder2, valueProvider.Object);
+ var model2 = new MyNullableModel();
+
+ // Act (IModelBinder overload)
+ await controller2.TryUpdateModelAsync(model2, prefix: "", m => m.Include);
+
+ // Assert (IModelBinder overload)
+ Assert.NotEqual(0, binder2.BindModelCount);
+ }
+#nullable restore
+
[Fact]
public async Task TryUpdateModelNonGeneric_PropertyFilterWithValueProviderOverload_UsesPassedArguments()
{
@@ -3114,6 +3164,15 @@ public class ControllerBaseTest
public string Property3 { get; set; }
}
+#nullable enable
+ private class MyNullableModel
+ {
+ public string? Include { get; set; }
+
+ public string? Exclude { get; set; }
+ }
+#nullable restore
+
private class TryValidateModelModel
{
public int IntegerProperty { get; set; }
diff --git a/src/Mvc/Mvc.Core/test/DependencyInjection/ApiBehaviorOptionsSetupTest.cs b/src/Mvc/Mvc.Core/test/DependencyInjection/ApiBehaviorOptionsSetupTest.cs
index 4cec9eb27f..d1e7be8778 100644
--- a/src/Mvc/Mvc.Core/test/DependencyInjection/ApiBehaviorOptionsSetupTest.cs
+++ b/src/Mvc/Mvc.Core/test/DependencyInjection/ApiBehaviorOptionsSetupTest.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
@@ -16,7 +16,7 @@ public class ApiBehaviorOptionsSetupTest
public void Configure_AddsClientErrorMappings()
{
// Arrange
- var expected = new[] { 400, 401, 403, 404, 406, 409, 415, 422, 500, };
+ var expected = new[] { 400, 401, 403, 404, 405, 406, 409, 415, 422, 500, };
var optionsSetup = new ApiBehaviorOptionsSetup();
var options = new ApiBehaviorOptions();
diff --git a/src/Mvc/Mvc.Core/test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs b/src/Mvc/Mvc.Core/test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs
index b3eb866ea8..d105879e82 100644
--- a/src/Mvc/Mvc.Core/test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs
+++ b/src/Mvc/Mvc.Core/test/DependencyInjection/MvcCoreServiceCollectionExtensionsTest.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
@@ -323,6 +324,13 @@ public class MvcCoreServiceCollectionExtensionsTest
typeof(DynamicControllerEndpointMatcherPolicy),
}
},
+ {
+ typeof(IProblemDetailsWriter),
+ new Type[]
+ {
+ typeof(DefaultApiProblemDetailsWriter),
+ }
+ },
};
}
}
diff --git a/src/Mvc/Mvc.Core/test/Filters/MiddlewareFilterTest.cs b/src/Mvc/Mvc.Core/test/Filters/MiddlewareFilterTest.cs
index a8cd80a3de..ee74ec0b72 100644
--- a/src/Mvc/Mvc.Core/test/Filters/MiddlewareFilterTest.cs
+++ b/src/Mvc/Mvc.Core/test/Filters/MiddlewareFilterTest.cs
@@ -441,13 +441,15 @@ public class MiddlewareFilterTest
MockControllerFactory controllerFactory)
{
var objectMethodExecutor = CreateExecutor(actionDescriptor);
+ var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
return new ControllerActionInvokerCacheEntry(
new FilterItem[0],
controllerFactory.CreateController,
controllerFactory.ReleaseControllerAsync,
null,
objectMethodExecutor,
- ActionMethodExecutor.GetExecutor(objectMethodExecutor));
+ actionMethodExecutor,
+ actionMethodExecutor);
}
}
diff --git a/src/Mvc/Mvc.Core/test/Formatters/NoContentFormatterTests.cs b/src/Mvc/Mvc.Core/test/Formatters/NoContentFormatterTests.cs
index d6a208fd80..fa0bc819ad 100644
--- a/src/Mvc/Mvc.Core/test/Formatters/NoContentFormatterTests.cs
+++ b/src/Mvc/Mvc.Core/test/Formatters/NoContentFormatterTests.cs
@@ -131,6 +131,26 @@ public class NoContentFormatterTests
}
[Fact]
+ public async Task WriteAsync_DoesNotHaveContentLengthSet()
+ {
+ // Arrange
+ var context = new OutputFormatterWriteContext(
+ new DefaultHttpContext(),
+ new TestHttpResponseStreamWriterFactory().CreateWriter,
+ typeof(string),
+ @object: null);
+
+ var formatter = new HttpNoContentOutputFormatter();
+
+ // Act
+ await formatter.WriteAsync(context);
+
+ // Assert
+ // No Content responses shouldn't have a Content-Length.
+ Assert.Null(context.HttpContext.Response.ContentLength);
+ }
+
+ [Fact]
public async Task WriteAsync_ContextStatusCodeSet_WritesSameStatusCode()
{
// Arrange
diff --git a/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs b/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs
index 4d5fa4d01b..45ecc1c5c1 100644
--- a/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs
+++ b/src/Mvc/Mvc.Core/test/Formatters/SystemTextJsonInputFormatterTest.cs
@@ -133,7 +133,6 @@ public class SystemTextJsonInputFormatterTest : JsonInputFormatterTestBase
[InlineData("{\"a\":{\"b\"}}", "$.a", "'}' is invalid after a property name. Expected a ':'. Path: $.a | LineNumber: 0 | BytePositionInLine: 9.")]
[InlineData("{\"age\":\"x\"}", "$.age", "The JSON value could not be converted to System.Decimal. Path: $.age | LineNumber: 0 | BytePositionInLine: 10.")]
[InlineData("{\"login\":1}", "$.login", "The JSON value could not be converted to Microsoft.AspNetCore.Mvc.Formatters.SystemTextJsonInputFormatterTest+UserLogin. Path: $.login | LineNumber: 0 | BytePositionInLine: 10.")]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/40661")]
public async Task ReadAsync_WithAllowInputFormatterExceptionMessages_RegistersJsonInputExceptionsAsInputFormatterException(
string content,
string modelStateKey,
diff --git a/src/Mvc/Mvc.Core/test/Formatters/TextOutputFormatterTests.cs b/src/Mvc/Mvc.Core/test/Formatters/TextOutputFormatterTests.cs
index 426e286cb8..fb4b1b3448 100644
--- a/src/Mvc/Mvc.Core/test/Formatters/TextOutputFormatterTests.cs
+++ b/src/Mvc/Mvc.Core/test/Formatters/TextOutputFormatterTests.cs
@@ -3,6 +3,7 @@
using System.Text;
using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
using Moq;
@@ -215,7 +216,7 @@ public class TextOutputFormatterTests
formatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/json"));
var context = new OutputFormatterWriteContext(
- new DefaultHttpContext(),
+ new DefaultHttpContext() { RequestServices = new ServiceCollection().BuildServiceProvider() },
new TestHttpResponseStreamWriterFactory().CreateWriter,
objectType: null,
@object: null)
diff --git a/src/Mvc/Mvc.Core/test/Infrastructure/ActionMethodExecutorTest.cs b/src/Mvc/Mvc.Core/test/Infrastructure/ActionMethodExecutorTest.cs
index 0339b40d4d..5b3019425a 100644
--- a/src/Mvc/Mvc.Core/test/Infrastructure/ActionMethodExecutorTest.cs
+++ b/src/Mvc/Mvc.Core/test/Infrastructure/ActionMethodExecutorTest.cs
@@ -1,275 +1,452 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Reflection;
using Microsoft.Extensions.Internal;
+using System.Runtime.CompilerServices;
namespace Microsoft.AspNetCore.Mvc.Infrastructure;
public class ActionMethodExecutorTest
{
- [Fact]
- public void ActionMethodExecutor_ExecutesVoidActions()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesVoidActions(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.VoidAction));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("VoidResultExecutor", actionMethodExecutor.GetType().Name);
Assert.True(controller.Executed);
Assert.IsType<EmptyResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturningIActionResult()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturningIActionResult(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnIActionResult));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("SyncActionResultExecutor", actionMethodExecutor.GetType().Name);
Assert.True(valueTask.IsCompleted);
Assert.IsType<ContentResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturningSubTypeOfActionResult()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturningSubTypeOfActionResult(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsIActionResultSubType));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("SyncActionResultExecutor", actionMethodExecutor.GetType().Name);
Assert.IsType<ContentResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturningActionResultOfT()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturningActionResultOfT(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsActionResultOfT));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
var result = Assert.IsType<ObjectResult>(valueTask.Result);
+
+ Assert.Equal("SyncObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.NotNull(result.Value);
Assert.IsType<TestModel>(result.Value);
Assert.Equal(typeof(TestModel), result.DeclaredType);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturningModelAsModel()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturningModelAsModel(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsModelAsModel));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
var result = Assert.IsType<ObjectResult>(valueTask.Result);
+
+ Assert.Equal("SyncObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.NotNull(result.Value);
Assert.IsType<TestModel>(result.Value);
Assert.Equal(typeof(TestModel), result.DeclaredType);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturningModelAsObject()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturningModelAsObject(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnModelAsObject));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
var result = Assert.IsType<ObjectResult>(valueTask.Result);
+
+ Assert.Equal("SyncObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.NotNull(result.Value);
Assert.IsType<TestModel>(result.Value);
Assert.Equal(typeof(object), result.DeclaredType);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturningActionResultAsObject()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturningActionResultAsObject(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsIActionResultSubType));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("SyncActionResultExecutor", actionMethodExecutor.GetType().Name);
Assert.IsType<ContentResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsReturnTask()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturnTask(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsTask));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
+
+ // Act
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
+
+ // Assert
+ Assert.Equal("TaskResultExecutor", actionMethodExecutor.GetType().Name);
+ Assert.True(controller.Executed);
+ Assert.IsType<EmptyResult>(valueTask.Result);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsReturnAwaitable(bool withFilter)
+ {
+ // Arrange
+ var mapper = new ActionResultTypeMapper();
+ var controller = new TestController();
+ var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsAwaitable));
+ var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("AwaitableResultExecutor", actionMethodExecutor.GetType().Name);
Assert.True(controller.Executed);
Assert.IsType<EmptyResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutorExecutesActionsAsynchronouslyReturningIActionResult()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutorExecutesActionsAsynchronouslyReturningIActionResult(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnIActionResultAsync));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("TaskOfIActionResultExecutor", actionMethodExecutor.GetType().Name);
Assert.IsType<StatusCodeResult>(valueTask.Result);
}
- [Fact]
- public async Task ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningActionResultSubType()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningActionResultSubType(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
- var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnIActionResultAsync));
+ var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnActionResultAsync));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
await valueTask;
- Assert.IsType<StatusCodeResult>(valueTask.Result);
+ Assert.Equal("TaskOfActionResultExecutor", actionMethodExecutor.GetType().Name);
+ Assert.IsType<ViewResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningModel()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningModel(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsModelAsModelAsync));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
var result = Assert.IsType<ObjectResult>(valueTask.Result);
+
+ Assert.Equal("AwaitableObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.NotNull(result.Value);
Assert.IsType<TestModel>(result.Value);
Assert.Equal(typeof(TestModel), result.DeclaredType);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningModelAsObject()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningModelAsObject(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsModelAsObjectAsync));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
var result = Assert.IsType<ObjectResult>(valueTask.Result);
+
+ Assert.Equal("AwaitableObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.NotNull(result.Value);
Assert.IsType<TestModel>(result.Value);
Assert.Equal(typeof(object), result.DeclaredType);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningIActionResultAsObject()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningIActionResultAsObject(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnIActionResultAsObjectAsync));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
+ Assert.Equal("AwaitableObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.IsType<OkResult>(valueTask.Result);
}
- [Fact]
- public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningActionResultOfT()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void ActionMethodExecutor_ExecutesActionsAsynchronouslyReturningActionResultOfT(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnActionResultOFTAsync));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act
- var valueTask = actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>());
+ var valueTask = Execute(actionMethodExecutor, filterContext, withFilter);
// Assert
var result = Assert.IsType<ObjectResult>(valueTask.Result);
+
+ Assert.Equal("AwaitableObjectResultExecutor", actionMethodExecutor.GetType().Name);
Assert.NotNull(result.Value);
Assert.IsType<TestModel>(result.Value);
Assert.Equal(typeof(TestModel), result.DeclaredType);
}
- [Fact]
- public void ActionMethodExecutor_ThrowsIfIConvertFromIActionResult_ReturnsNull()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task ActionMethodExecutor_ThrowsIfIConvertFromIActionResult_ReturnsNull(bool withFilter)
{
// Arrange
var mapper = new ActionResultTypeMapper();
var controller = new TestController();
var objectMethodExecutor = GetExecutor(nameof(TestController.ReturnsCustomConvertibleFromIActionResult));
var actionMethodExecutor = ActionMethodExecutor.GetExecutor(objectMethodExecutor);
+ var filterContext = new ControllerEndpointFilterInvocationContext(new Controllers.ControllerActionDescriptor(),
+ new ActionContext(),
+ objectMethodExecutor,
+ mapper,
+ controller,
+ Array.Empty<object>());
// Act & Assert
- var ex = Assert.Throws<InvalidOperationException>(
- () => actionMethodExecutor.Execute(mapper, objectMethodExecutor, controller, Array.Empty<object>()));
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => Execute(actionMethodExecutor, filterContext, withFilter).AsTask());
Assert.Equal($"Cannot return null from an action method with a return type of '{typeof(CustomConvertibleFromAction)}'.", ex.Message);
}
+ private async ValueTask<IActionResult> Execute(ActionMethodExecutor actionMethodExecutor,
+ ControllerEndpointFilterInvocationContext context,
+ bool withFilter)
+ {
+ if (withFilter)
+ {
+ return (IActionResult)await actionMethodExecutor.Execute(context);
+ }
+ return await actionMethodExecutor.Execute(context.ActionContext, context.Mapper, context.Executor, context.Controller, (object[])context.Arguments);
+ }
+
private static ObjectMethodExecutor GetExecutor(string methodName)
{
var type = typeof(TestController);
@@ -304,8 +481,16 @@ public class ActionMethodExecutorTest
return Task.CompletedTask;
}
+ public YieldAwaitable ReturnsAwaitable()
+ {
+ Executed = true;
+ return Task.Yield();
+ }
+
public Task<IActionResult> ReturnIActionResultAsync() => Task.FromResult((IActionResult)new StatusCodeResult(201));
+ public Task<ViewResult> ReturnActionResultAsync() => Task.FromResult(new ViewResult { StatusCode = 200 });
+
public Task<StatusCodeResult> ReturnsIActionResultSubTypeAsync() => Task.FromResult(new StatusCodeResult(200));
public Task<TestModel> ReturnsModelAsModelAsync() => Task.FromResult(new TestModel());
diff --git a/src/Mvc/Mvc.Core/test/Infrastructure/ControllerActionInvokerTest.cs b/src/Mvc/Mvc.Core/test/Infrastructure/ControllerActionInvokerTest.cs
index 1f28d1ed98..dc1972fc58 100644
--- a/src/Mvc/Mvc.Core/test/Infrastructure/ControllerActionInvokerTest.cs
+++ b/src/Mvc/Mvc.Core/test/Infrastructure/ControllerActionInvokerTest.cs
@@ -1333,6 +1333,7 @@ public class ControllerActionInvokerTest : CommonResourceInvokerTest
(_, __) => default,
(_, __, ___) => Task.CompletedTask,
objectMethodExecutor,
+ controllerMethodExecutor,
controllerMethodExecutor);
var invoker = new ControllerActionInvoker(
@@ -1663,6 +1664,7 @@ public class ControllerActionInvokerTest : CommonResourceInvokerTest
return Task.CompletedTask;
},
objectMethodExecutor,
+ actionMethodExecutor,
actionMethodExecutor);
var actionContext = new ActionContext(httpContext, routeData, actionDescriptor);
diff --git a/src/Mvc/Mvc.Core/test/Infrastructure/DefaultApiProblemDetailsWriterTest.cs b/src/Mvc/Mvc.Core/test/Infrastructure/DefaultApiProblemDetailsWriterTest.cs
new file mode 100644
index 0000000000..e918bcf5c4
--- /dev/null
+++ b/src/Mvc/Mvc.Core/test/Infrastructure/DefaultApiProblemDetailsWriterTest.cs
@@ -0,0 +1,210 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Json;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
+using Moq;
+
+namespace Microsoft.AspNetCore.Mvc.Infrastructure;
+
+public class DefaultApiProblemDetailsWriterTest
+{
+
+ [Fact]
+ public async Task WriteAsync_Works()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream);
+
+ var expectedProblem = new ProblemDetails()
+ {
+ Detail = "Custom Bad Request",
+ Instance = "Custom Bad Request",
+ Status = StatusCodes.Status400BadRequest,
+ Type = "https://tools.ietf.org/html/rfc7231#section-6.5.1-custom",
+ Title = "Custom Bad Request",
+ };
+ var problemDetailsContext = new ProblemDetailsContext()
+ {
+ HttpContext = context,
+ ProblemDetails = expectedProblem
+ };
+
+ //Act
+ await writer.WriteAsync(problemDetailsContext);
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Equal(expectedProblem.Status, problemDetails.Status);
+ Assert.Equal(expectedProblem.Type, problemDetails.Type);
+ Assert.Equal(expectedProblem.Title, problemDetails.Title);
+ Assert.Equal(expectedProblem.Detail, problemDetails.Detail);
+ Assert.Equal(expectedProblem.Instance, problemDetails.Instance);
+ }
+
+ [Fact]
+ public async Task WriteAsync_AddExtensions()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream);
+ var expectedProblem = new ProblemDetails();
+ expectedProblem.Extensions["Extension1"] = "Extension1-Value";
+ expectedProblem.Extensions["Extension2"] = "Extension2-Value";
+
+ var problemDetailsContext = new ProblemDetailsContext()
+ {
+ HttpContext = context,
+ ProblemDetails = expectedProblem
+ };
+
+ //Act
+ await writer.WriteAsync(problemDetailsContext);
+
+ //Assert
+ stream.Position = 0;
+ var problemDetails = await JsonSerializer.DeserializeAsync<ProblemDetails>(stream);
+ Assert.NotNull(problemDetails);
+ Assert.Contains("Extension1", problemDetails.Extensions);
+ Assert.Contains("Extension2", problemDetails.Extensions);
+ }
+
+ [Fact]
+ public void CanWrite_ReturnsFalse_WhenNotController()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, metadata: EndpointMetadataCollection.Empty);
+
+ //Act
+ var result = writer.CanWrite(new() { HttpContext = context });
+
+ //Assert
+ Assert.False(result);
+ }
+
+ [Fact]
+ public void CanWrite_ReturnsTrue_WhenController()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, metadata: new EndpointMetadataCollection(new ControllerAttribute()));
+
+ //Act
+ var result = writer.CanWrite(new() { HttpContext = context });
+
+ //Assert
+ Assert.True(result);
+ }
+
+ [Fact]
+ public async Task WriteAsync_Skip_WhenNotApiController()
+ {
+ // Arrange
+ var writer = GetWriter();
+ var stream = new MemoryStream();
+ var context = CreateContext(stream, metadata: new EndpointMetadataCollection(new ControllerAttribute()));
+
+ //Act
+ await writer.WriteAsync(new() { HttpContext = context });
+
+ //Assert
+ Assert.Equal(0, stream.Position);
+ Assert.Equal(0, stream.Length);
+ }
+
+ [Fact]
+ public async Task WriteAsync_Skip_WhenSuppressMapClientErrors()
+ {
+ // Arrange
+ var writer = GetWriter(options: new ApiBehaviorOptions() { SuppressMapClientErrors = true });
+ var stream = new MemoryStream();
+ var context = CreateContext(stream);
+
+ //Act
+ await writer.WriteAsync(new() { HttpContext = context });
+
+ //Assert
+ Assert.Equal(0, stream.Position);
+ Assert.Equal(0, stream.Length);
+ }
+
+ [Fact]
+ public async Task WriteAsync_Skip_WhenNoFormatter()
+ {
+ // Arrange
+ var formatter = new Mock<IOutputFormatter>();
+ formatter.Setup(f => f.CanWriteResult(It.IsAny<OutputFormatterWriteContext>())).Returns(false);
+ var writer = GetWriter(formatter: formatter.Object);
+ var stream = new MemoryStream();
+ var context = CreateContext(stream);
+
+ //Act
+ await writer.WriteAsync(new() { HttpContext = context });
+
+ //Assert
+ Assert.Equal(0, stream.Position);
+ Assert.Equal(0, stream.Length);
+ }
+
+ private static HttpContext CreateContext(Stream body, int statusCode = StatusCodes.Status400BadRequest, EndpointMetadataCollection metadata = null)
+ {
+ metadata ??= new EndpointMetadataCollection(new ApiControllerAttribute(), new ControllerAttribute());
+
+ var context = new DefaultHttpContext()
+ {
+ Response = { Body = body, StatusCode = statusCode },
+ RequestServices = CreateServices()
+ };
+ context.SetEndpoint(new Endpoint(null, metadata, string.Empty));
+
+ return context;
+ }
+
+ private static IServiceProvider CreateServices()
+ {
+ var services = new ServiceCollection();
+ services.AddTransient(typeof(ILogger<>), typeof(NullLogger<>));
+ services.AddSingleton<ILoggerFactory>(NullLoggerFactory.Instance);
+
+ return services.BuildServiceProvider();
+ }
+
+ private static DefaultApiProblemDetailsWriter GetWriter(ApiBehaviorOptions options = null, IOutputFormatter formatter = null)
+ {
+ options ??= new ApiBehaviorOptions();
+ formatter ??= new TestFormatter();
+
+ var mvcOptions = Options.Create(new MvcOptions());
+ mvcOptions.Value.OutputFormatters.Add(formatter);
+
+ return new DefaultApiProblemDetailsWriter(
+ new DefaultOutputFormatterSelector(mvcOptions, NullLoggerFactory.Instance),
+ new TestHttpResponseStreamWriterFactory(),
+ new DefaultProblemDetailsFactory(Options.Create(options), null),
+ Options.Create(options));
+ }
+
+ private class TestFormatter : IOutputFormatter
+ {
+ public bool CanWriteResult(OutputFormatterCanWriteContext context) => true;
+
+ public Task WriteAsync(OutputFormatterWriteContext context)
+ {
+ return context.HttpContext.Response.WriteAsJsonAsync(context.Object);
+ }
+ }
+
+}
diff --git a/src/Mvc/Mvc.Core/test/Infrastructure/ObjectResultExecutorTest.cs b/src/Mvc/Mvc.Core/test/Infrastructure/ObjectResultExecutorTest.cs
index 8850174cf9..be2724e73f 100644
--- a/src/Mvc/Mvc.Core/test/Infrastructure/ObjectResultExecutorTest.cs
+++ b/src/Mvc/Mvc.Core/test/Infrastructure/ObjectResultExecutorTest.cs
@@ -94,7 +94,7 @@ public class ObjectResultExecutorTest
// Arrange
var executor = CreateExecutor();
- var httpContext = new DefaultHttpContext();
+ var httpContext = GetHttpContext();
var actionContext = new ActionContext() { HttpContext = httpContext };
httpContext.Request.Headers.Accept = "application/xml"; // This will not be used
httpContext.Response.ContentType = "application/json";
@@ -258,7 +258,7 @@ public class ObjectResultExecutorTest
var actionContext = new ActionContext()
{
- HttpContext = new DefaultHttpContext(),
+ HttpContext = GetHttpContext(),
};
var result = new ObjectResult("input");
diff --git a/src/Mvc/Mvc.Core/test/Infrastructure/ProblemDetalsClientErrorFactoryTest.cs b/src/Mvc/Mvc.Core/test/Infrastructure/ProblemDetalsClientErrorFactoryTest.cs
index 8cfa50c3fb..692b1f9dec 100644
--- a/src/Mvc/Mvc.Core/test/Infrastructure/ProblemDetalsClientErrorFactoryTest.cs
+++ b/src/Mvc/Mvc.Core/test/Infrastructure/ProblemDetalsClientErrorFactoryTest.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
diff --git a/src/Mvc/Mvc.Core/test/ModelBinding/Binders/CollectionModelBinderTest.cs b/src/Mvc/Mvc.Core/test/ModelBinding/Binders/CollectionModelBinderTest.cs
index 601fff8d10..c795244491 100644
--- a/src/Mvc/Mvc.Core/test/ModelBinding/Binders/CollectionModelBinderTest.cs
+++ b/src/Mvc/Mvc.Core/test/ModelBinding/Binders/CollectionModelBinderTest.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Collections.Generic;
using System.Globalization;
using System.Reflection;
using Microsoft.AspNetCore.Http;
@@ -205,7 +206,28 @@ public class CollectionModelBinderTest
Assert.Empty(boundCollection.Model);
}
+ [Fact]
+ public async Task BindSimpleCollection_RawValueWithNull_ReturnsListWithoutNull()
+ {
+ // Arrange
+ var binder = new CollectionModelBinder<int>(CreateIntBinder(), NullLoggerFactory.Instance);
+ var valueProvider = new SimpleValueProvider
+ {
+ { "someName", "420" },
+ };
+ var context = GetModelBindingContext(valueProvider);
+ var valueProviderResult = new ValueProviderResult(new[] { null, "42", "", "100", null, "200" });
+
+ // Act
+ var boundCollection = await binder.BindSimpleCollection(context, valueProviderResult);
+
+ // Assert
+ Assert.NotNull(boundCollection.Model);
+ Assert.Equal(new[] { 420, 42, 100, 420, 200 }, boundCollection.Model);
+ }
+
private IActionResult ActionWithListParameter(List<string> parameter) => null;
+ private IActionResult ActionWithListParameterDefaultValue(List<string> parameter = null) => null;
[Theory]
[InlineData(false, false)]
@@ -285,6 +307,43 @@ public class CollectionModelBinderTest
Assert.Equal("A value for the 'fieldName' parameter or property was not provided.", error.ErrorMessage);
}
+ // Setup like CollectionModelBinder_CreatesEmptyCollection_IfIsTopLevelObject except
+ // Model has a default value.
+ [Fact]
+ public async Task CollectionModelBinder_DoesNotCreateEmptyCollection_IfModelHasDefaultValue()
+ {
+ // Arrange
+ var binder = new CollectionModelBinder<string>(
+ new StubModelBinder(result: ModelBindingResult.Failed()),
+ NullLoggerFactory.Instance,
+ allowValidatingTopLevelNodes: true);
+
+ var bindingContext = CreateContext();
+ bindingContext.IsTopLevelObject = true;
+
+ // Lack of prefix and non-empty model name both ignored.
+ bindingContext.ModelName = "modelName";
+
+ var metadataProvider = new TestModelMetadataProvider();
+ var parameter = typeof(CollectionModelBinderTest)
+ .GetMethod(nameof(ActionWithListParameterDefaultValue), BindingFlags.Instance | BindingFlags.NonPublic)
+ .GetParameters()[0];
+ metadataProvider
+ .ForParameter(parameter)
+ .BindingDetails(b => b.IsBindingRequired = false);
+ bindingContext.ModelMetadata = metadataProvider.GetMetadataForParameter(parameter);
+
+ bindingContext.ValueProvider = new TestValueProvider(new Dictionary<string, object>());
+
+ // Act
+ await binder.BindModelAsync(bindingContext);
+
+ // Assert
+ Assert.Null(bindingContext.Result.Model);
+ Assert.True(bindingContext.Result.IsModelSet);
+ Assert.Equal(0, bindingContext.ModelState.ErrorCount);
+ }
+
// Setup like CollectionModelBinder_CreatesEmptyCollection_IfIsTopLevelObject except
// Model already has a value.
[Fact]
diff --git a/src/Mvc/Mvc.Core/test/ModelBinding/FormValueProviderTest.cs b/src/Mvc/Mvc.Core/test/ModelBinding/FormValueProviderTest.cs
index 14e87425b0..d025c4c963 100644
--- a/src/Mvc/Mvc.Core/test/ModelBinding/FormValueProviderTest.cs
+++ b/src/Mvc/Mvc.Core/test/ModelBinding/FormValueProviderTest.cs
@@ -9,6 +9,31 @@ namespace Microsoft.AspNetCore.Mvc.ModelBinding;
public class FormValueProviderTest : EnumerableValueProviderTest
{
+ [Fact]
+ public void GetValue_ReturnsInvariantCulture_IfInvariantEntryExists()
+ {
+ // Arrange
+ var culture = new CultureInfo("fr-FR");
+ var invariantCultureKey = "prefix.name";
+ var currentCultureKey = "some";
+ var values = new Dictionary<string, StringValues>(BackingStore)
+ {
+ { FormValueHelper.CultureInvariantFieldName, new(invariantCultureKey) },
+ };
+ var valueProvider = GetEnumerableValueProvider(BindingSource.Query, values, culture);
+
+ // Act
+ var invariantCultureResult = valueProvider.GetValue(invariantCultureKey);
+ var currentCultureResult = valueProvider.GetValue(currentCultureKey);
+
+ // Assert
+ Assert.Equal(CultureInfo.InvariantCulture, invariantCultureResult.Culture);
+ Assert.Equal(BackingStore[invariantCultureKey], invariantCultureResult.Values);
+
+ Assert.Equal(culture, currentCultureResult.Culture);
+ Assert.Equal(BackingStore[currentCultureKey], currentCultureResult.Values);
+ }
+
protected override IEnumerableValueProvider GetEnumerableValueProvider(
BindingSource bindingSource,
Dictionary<string, StringValues> values,
diff --git a/src/Mvc/Mvc.Core/test/ModelBinding/JQueryFormValueProviderTest.cs b/src/Mvc/Mvc.Core/test/ModelBinding/JQueryFormValueProviderTest.cs
index 42bdafa0ab..0add14a6df 100644
--- a/src/Mvc/Mvc.Core/test/ModelBinding/JQueryFormValueProviderTest.cs
+++ b/src/Mvc/Mvc.Core/test/ModelBinding/JQueryFormValueProviderTest.cs
@@ -46,4 +46,29 @@ public class JQueryFormValueProviderTest : EnumerableValueProviderTest
// Assert
Assert.Equal("some-value", (string)result);
}
+
+ [Fact]
+ public void GetValue_ReturnsInvariantCulture_IfInvariantEntryExists()
+ {
+ // Arrange
+ var culture = new CultureInfo("fr-FR");
+ var invariantCultureKey = "prefix.name";
+ var currentCultureKey = "some";
+ var values = new Dictionary<string, StringValues>(BackingStore)
+ {
+ { FormValueHelper.CultureInvariantFieldName, new(invariantCultureKey) },
+ };
+ var valueProvider = GetEnumerableValueProvider(BindingSource.Query, values, culture);
+
+ // Act
+ var invariantCultureResult = valueProvider.GetValue(invariantCultureKey);
+ var currentCultureResult = valueProvider.GetValue(currentCultureKey);
+
+ // Assert
+ Assert.Equal(CultureInfo.InvariantCulture, invariantCultureResult.Culture);
+ Assert.Equal(BackingStore[invariantCultureKey], invariantCultureResult.Values);
+
+ Assert.Equal(culture, currentCultureResult.Culture);
+ Assert.Equal(BackingStore[currentCultureKey], currentCultureResult.Values);
+ }
}
diff --git a/src/Mvc/Mvc.Core/test/Routing/ActionEndpointDataSourceBaseTest.cs b/src/Mvc/Mvc.Core/test/Routing/ActionEndpointDataSourceBaseTest.cs
index 8cfbca80b4..b8168b4941 100644
--- a/src/Mvc/Mvc.Core/test/Routing/ActionEndpointDataSourceBaseTest.cs
+++ b/src/Mvc/Mvc.Core/test/Routing/ActionEndpointDataSourceBaseTest.cs
@@ -146,7 +146,7 @@ public abstract class ActionEndpointDataSourceBaseTest
var serviceProvider = services.BuildServiceProvider();
- var endpointFactory = new ActionEndpointFactory(serviceProvider.GetRequiredService<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(serviceProvider.GetRequiredService<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>(), serviceProvider);
return CreateDataSource(actions, endpointFactory);
}
diff --git a/src/Mvc/Mvc.Core/test/Routing/ActionEndpointFactoryTest.cs b/src/Mvc/Mvc.Core/test/Routing/ActionEndpointFactoryTest.cs
index 4d893e84ea..94d2ab4f3d 100644
--- a/src/Mvc/Mvc.Core/test/Routing/ActionEndpointFactoryTest.cs
+++ b/src/Mvc/Mvc.Core/test/Routing/ActionEndpointFactoryTest.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Components.Routing;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Routing;
@@ -25,7 +26,7 @@ public class ActionEndpointFactoryTest
});
Services = serviceCollection.BuildServiceProvider();
- Factory = new ActionEndpointFactory(Services.GetRequiredService<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>());
+ Factory = new ActionEndpointFactory(Services.GetRequiredService<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>(), Services);
}
internal ActionEndpointFactory Factory { get; }
@@ -266,10 +267,19 @@ public class ActionEndpointFactoryTest
requestDelegateFactory.Setup(m => m.CreateRequestDelegate(action, It.IsAny<RouteValueDictionary>())).Returns(del);
// Act
- var factory = new ActionEndpointFactory(Services.GetRequiredService<RoutePatternTransformer>(), new[] { requestDelegateFactory.Object });
+ var factory = new ActionEndpointFactory(Services.GetRequiredService<RoutePatternTransformer>(), new[] { requestDelegateFactory.Object }, Services);
var endpoints = new List<Endpoint>();
- factory.AddEndpoints(endpoints, new HashSet<string>(), action, Array.Empty<ConventionalRouteEntry>(), Array.Empty<Action<EndpointBuilder>>(), createInertEndpoints: false);
+ factory.AddEndpoints(
+ endpoints,
+ new HashSet<string>(),
+ action,
+ Array.Empty<ConventionalRouteEntry>(),
+ conventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupConventions: Array.Empty<Action<EndpointBuilder>>(),
+ finallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ createInertEndpoints: false);
var endpoint = Assert.IsType<RouteEndpoint>(Assert.Single(endpoints));
@@ -366,13 +376,22 @@ public class ActionEndpointFactoryTest
private RouteEndpoint CreateAttributeRoutedEndpoint(ActionDescriptor action)
{
var endpoints = new List<Endpoint>();
- Factory.AddEndpoints(endpoints, new HashSet<string>(), action, Array.Empty<ConventionalRouteEntry>(), Array.Empty<Action<EndpointBuilder>>(), createInertEndpoints: false);
+ Factory.AddEndpoints(
+ endpoints,
+ new HashSet<string>(),
+ action,
+ Array.Empty<ConventionalRouteEntry>(),
+ conventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupConventions: Array.Empty<Action<EndpointBuilder>>(),
+ finallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ createInertEndpoints: false);
return Assert.IsType<RouteEndpoint>(Assert.Single(endpoints));
}
private RouteEndpoint CreateConventionalRoutedEndpoint(ActionDescriptor action, string template)
{
- return CreateConventionalRoutedEndpoint(action, new ConventionalRouteEntry(routeName: null, template, null, null, null, order: 0, new List<Action<EndpointBuilder>>()));
+ return CreateConventionalRoutedEndpoint(action, new ConventionalRouteEntry(routeName: null, template, null, null, null, order: 0, new List<Action<EndpointBuilder>>(), new List<Action<EndpointBuilder>>()));
}
private RouteEndpoint CreateConventionalRoutedEndpoint(ActionDescriptor action, ConventionalRouteEntry route)
@@ -380,7 +399,16 @@ public class ActionEndpointFactoryTest
Assert.NotNull(action.RouteValues);
var endpoints = new List<Endpoint>();
- Factory.AddEndpoints(endpoints, new HashSet<string>(), action, new[] { route, }, Array.Empty<Action<EndpointBuilder>>(), createInertEndpoints: false);
+ Factory.AddEndpoints(
+ endpoints,
+ new HashSet<string>(),
+ action,
+ new[] { route, },
+ conventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupConventions: Array.Empty<Action<EndpointBuilder>>(),
+ finallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ createInertEndpoints: false);
var endpoint = Assert.IsType<RouteEndpoint>(Assert.Single(endpoints));
// This should be true for all conventional-routed actions.
@@ -397,7 +425,16 @@ public class ActionEndpointFactoryTest
private IReadOnlyList<Endpoint> CreateConventionalRoutedEndpoints(ActionDescriptor action, IReadOnlyList<ConventionalRouteEntry> routes, bool createInertEndpoints = false)
{
var endpoints = new List<Endpoint>();
- Factory.AddEndpoints(endpoints, new HashSet<string>(), action, routes, Array.Empty<Action<EndpointBuilder>>(), createInertEndpoints);
+ Factory.AddEndpoints(
+ endpoints,
+ new HashSet<string>(),
+ action,
+ routes,
+ conventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupConventions: Array.Empty<Action<EndpointBuilder>>(),
+ finallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ createInertEndpoints);
return endpoints.ToList();
}
@@ -408,10 +445,12 @@ public class ActionEndpointFactoryTest
IDictionary<string, object> constraints = null,
RouteValueDictionary dataTokens = null,
int order = 0,
- List<Action<EndpointBuilder>> conventions = null)
+ List<Action<EndpointBuilder>> conventions = null,
+ List<Action<EndpointBuilder>> finallyConventions = null)
{
conventions ??= new List<Action<EndpointBuilder>>();
- return new ConventionalRouteEntry(routeName, pattern, defaults, constraints, dataTokens, order, conventions);
+ finallyConventions ??= new List<Action<EndpointBuilder>>();
+ return new ConventionalRouteEntry(routeName, pattern, defaults, constraints, dataTokens, order, conventions, finallyConventions);
}
private ActionDescriptor CreateActionDescriptor(
diff --git a/src/Mvc/Mvc.Core/test/Routing/ControllerActionEndpointDataSourceTest.cs b/src/Mvc/Mvc.Core/test/Routing/ControllerActionEndpointDataSourceTest.cs
index ccc3972fec..bbc121cbff 100644
--- a/src/Mvc/Mvc.Core/test/Routing/ControllerActionEndpointDataSourceTest.cs
+++ b/src/Mvc/Mvc.Core/test/Routing/ControllerActionEndpointDataSourceTest.cs
@@ -1,10 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Routing.Patterns;
using Moq;
namespace Microsoft.AspNetCore.Mvc.Routing;
@@ -373,6 +375,174 @@ public class ControllerActionEndpointDataSourceTest : ActionEndpointDataSourceBa
});
}
+ [Fact]
+ public void GroupedEndpoints_AppliesConventions_RouteSpecificMetadata()
+ {
+ // Arrange
+ var actions = new List<ActionDescriptor>
+ {
+ new ControllerActionDescriptor
+ {
+ AttributeRouteInfo = new AttributeRouteInfo()
+ {
+ Template = "/test",
+ },
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Test" },
+ { "controller", "Test" },
+ },
+ EndpointMetadata = new[] { "A" },
+ },
+ new ControllerActionDescriptor
+ {
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Index" },
+ { "controller", "Home" },
+ },
+ }
+ };
+
+ var mockDescriptorProvider = new Mock<IActionDescriptorCollectionProvider>();
+ mockDescriptorProvider.Setup(m => m.ActionDescriptors).Returns(new ActionDescriptorCollection(actions, 0));
+
+ var dataSource = (ControllerActionEndpointDataSource)CreateDataSource(mockDescriptorProvider.Object);
+ dataSource.AddRoute("1", "/1/{controller}/{action}/{id?}", null, null, null).Add(b => b.Metadata.Add("A"));
+ dataSource.AddRoute("2", "/2/{controller}/{action}/{id?}", null, null, null).Add(b => b.Metadata.Add("B"));
+
+ dataSource.DefaultBuilder.Add((b) =>
+ {
+ b.Metadata.Add("Hi there");
+ });
+
+ // Act
+ var groupConventions = new List<Action<EndpointBuilder>>()
+ {
+ b => b.Metadata.Add(new GroupMetadata()),
+ b => b.Metadata.Add("group")
+ };
+ var sp = Mock.Of<IServiceProvider>();
+ var groupPattern = RoutePatternFactory.Parse("/group1");
+ var endpoints = dataSource.GetGroupedEndpoints(new RouteGroupContext
+ {
+ Prefix = groupPattern,
+ Conventions = groupConventions,
+ ApplicationServices = sp
+ });
+
+ // Assert
+ Assert.Collection(
+ endpoints.OfType<RouteEndpoint>().Where(e => !SupportsLinkGeneration(e)).OrderBy(e => e.RoutePattern.RawText),
+ e =>
+ {
+ Assert.Equal("/group1/1/{controller}/{action}/{id?}", e.RoutePattern.RawText);
+ Assert.Same(actions[1], e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "group", "Hi there", "A" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ },
+ e =>
+ {
+ Assert.Equal("/group1/2/{controller}/{action}/{id?}", e.RoutePattern.RawText);
+ Assert.Same(actions[1], e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "group", "Hi there", "B" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ });
+
+ Assert.Collection(
+ endpoints.OfType<RouteEndpoint>().Where(e => SupportsLinkGeneration(e)).OrderBy(e => e.RoutePattern.RawText),
+ e =>
+ {
+ Assert.Equal("/group1/1/{controller}/{action}/{id?}", e.RoutePattern.RawText);
+ Assert.Null(e.Metadata.GetMetadata<ActionDescriptor>());
+ // Group conventions are applied first, then endpoint specific metadata, then normal conventions, then per route conventions
+ Assert.Equal(new[] { "group", "Hi there", "A" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ },
+ e =>
+ {
+ Assert.Equal("/group1/2/{controller}/{action}/{id?}", e.RoutePattern.RawText);
+ Assert.Null(e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "group", "Hi there", "B" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ },
+ e =>
+ {
+ Assert.Equal("/group1/test", e.RoutePattern.RawText);
+ Assert.Same(actions[0], e.Metadata.GetMetadata<ActionDescriptor>());
+ // Group conventions are applied first, then endpoint specific metadata, then normal conventions
+ Assert.Equal(new[] { "group", "A", "Hi there" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ });
+ }
+
+ [Fact]
+ public void Endpoints_AppliesFinallyConventions_InFIFOOrder_Last()
+ {
+ // Arrange
+ var actions = new List<ActionDescriptor>
+ {
+ new ControllerActionDescriptor
+ {
+ AttributeRouteInfo = new AttributeRouteInfo()
+ {
+ Template = "/test",
+ },
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Test" },
+ { "controller", "Test" },
+ },
+ },
+ new ControllerActionDescriptor
+ {
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Index" },
+ { "controller", "Home" },
+ },
+ }
+ };
+
+ var mockDescriptorProvider = new Mock<IActionDescriptorCollectionProvider>();
+ mockDescriptorProvider.Setup(m => m.ActionDescriptors).Returns(new ActionDescriptorCollection(actions, 0));
+
+ var dataSource = (ControllerActionEndpointDataSource)CreateDataSource(mockDescriptorProvider.Object);
+ var builder1 = dataSource.AddRoute("1", "/1/{controller}/{action}/{id?}", null, null, null);
+ builder1.Finally(b => b.Metadata.Add("A1"));
+ builder1.Finally(b => b.Metadata.Add("A2"));
+ var builder2 = dataSource.AddRoute("2", "/2/{controller}/{action}/{id?}", null, null, null);
+ builder2.Finally(b => b.Metadata.Add("B1"));
+ builder2.Finally(b => b.Metadata.Add("B2"));
+
+ dataSource.DefaultBuilder.Finally(b => b.Metadata.Add("C1"));
+ dataSource.DefaultBuilder.Finally(b => b.Metadata.Add("C2"));
+
+ // Act
+ var endpoints = dataSource.Endpoints;
+
+ // Assert
+ Assert.Collection(
+ endpoints.OfType<RouteEndpoint>().Where(e => SupportsLinkGeneration(e)).OrderBy(e => e.RoutePattern.RawText),
+ e =>
+ {
+ Assert.Equal("/1/{controller}/{action}/{id?}", e.RoutePattern.RawText);
+ Assert.Equal(new[] { "A1", "A2", "C1", "C2" }, e.Metadata.GetOrderedMetadata<string>());
+ },
+ e =>
+ {
+ Assert.Equal("/2/{controller}/{action}/{id?}", e.RoutePattern.RawText);
+ Assert.Equal(new[] { "B1", "B2", "C1", "C2" }, e.Metadata.GetOrderedMetadata<string>());
+ },
+ e =>
+ {
+ Assert.Equal("/test", e.RoutePattern.RawText);
+ Assert.Equal(new[] { "C1", "C2" }, e.Metadata.GetOrderedMetadata<string>()); ;
+ });
+ }
+
+ private class GroupMetadata { }
+
private static bool SupportsLinkGeneration(RouteEndpoint endpoint)
{
return !(endpoint.Metadata.GetMetadata<ISuppressLinkGenerationMetadata>()?.SuppressLinkGeneration == true);
diff --git a/src/Mvc/Mvc.Cors/src/CorsApplicationModelProvider.cs b/src/Mvc/Mvc.Cors/src/CorsApplicationModelProvider.cs
index 981be91e5b..616fd38611 100644
--- a/src/Mvc/Mvc.Cors/src/CorsApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.Cors/src/CorsApplicationModelProvider.cs
@@ -5,12 +5,11 @@ using System.Linq;
using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Mvc.ActionConstraints;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
-using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Cors;
-internal class CorsApplicationModelProvider : IApplicationModelProvider
+internal sealed class CorsApplicationModelProvider : IApplicationModelProvider
{
private readonly MvcOptions _mvcOptions;
@@ -38,12 +37,7 @@ internal class CorsApplicationModelProvider : IApplicationModelProvider
throw new ArgumentNullException(nameof(context));
}
- if (_mvcOptions.EnableEndpointRouting)
- {
- // When doing endpoint routing, translate IEnableCorsAttribute to an HttpMethodMetadata with CORS enabled.
- ConfigureCorsEndpointMetadata(context.Result);
- }
- else
+ if (!_mvcOptions.EnableEndpointRouting)
{
ConfigureCorsFilters(context);
}
@@ -117,38 +111,4 @@ internal class CorsApplicationModelProvider : IApplicationModelProvider
}
}
- private static void ConfigureCorsEndpointMetadata(ApplicationModel applicationModel)
- {
- foreach (var controller in applicationModel.Controllers)
- {
- var corsOnController = controller.Attributes.OfType<IDisableCorsAttribute>().Any() ||
- controller.Attributes.OfType<IEnableCorsAttribute>().Any();
-
- foreach (var action in controller.Actions)
- {
- var corsOnAction = action.Attributes.OfType<IDisableCorsAttribute>().Any() ||
- action.Attributes.OfType<IEnableCorsAttribute>().Any();
-
- if (!corsOnController && !corsOnAction)
- {
- // No CORS here.
- continue;
- }
-
- foreach (var selector in action.Selectors)
- {
- var metadata = selector.EndpointMetadata;
- // Read interface .Count once rather than per iteration
- var metadataCount = metadata.Count;
- for (var i = 0; i < metadataCount; i++)
- {
- if (metadata[i] is HttpMethodMetadata httpMethodMetadata)
- {
- metadata[i] = new HttpMethodMetadata(httpMethodMetadata.HttpMethods, acceptCorsPreflight: true);
- }
- }
- }
- }
- }
- }
}
diff --git a/src/Mvc/Mvc.Cors/src/CorsAuthorizationFilterFactory.cs b/src/Mvc/Mvc.Cors/src/CorsAuthorizationFilterFactory.cs
index 49c940ca35..8f4618696e 100644
--- a/src/Mvc/Mvc.Cors/src/CorsAuthorizationFilterFactory.cs
+++ b/src/Mvc/Mvc.Cors/src/CorsAuthorizationFilterFactory.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Cors;
/// <summary>
/// A filter factory which creates a new instance of <see cref="CorsAuthorizationFilter"/>.
/// </summary>
-internal class CorsAuthorizationFilterFactory : IFilterFactory, IOrderedFilter
+internal sealed class CorsAuthorizationFilterFactory : IFilterFactory, IOrderedFilter
{
private readonly string? _policyName;
diff --git a/src/Mvc/Mvc.Cors/src/CorsHttpMethodActionConstraint.cs b/src/Mvc/Mvc.Cors/src/CorsHttpMethodActionConstraint.cs
index 4f18a1f1f1..3046960560 100644
--- a/src/Mvc/Mvc.Cors/src/CorsHttpMethodActionConstraint.cs
+++ b/src/Mvc/Mvc.Cors/src/CorsHttpMethodActionConstraint.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.Cors;
-internal class CorsHttpMethodActionConstraint : HttpMethodActionConstraint
+internal sealed class CorsHttpMethodActionConstraint : HttpMethodActionConstraint
{
private readonly string OriginHeader = "Origin";
private readonly string AccessControlRequestMethod = "Access-Control-Request-Method";
diff --git a/src/Mvc/Mvc.Cors/src/DisableCorsAuthorizationFilter.cs b/src/Mvc/Mvc.Cors/src/DisableCorsAuthorizationFilter.cs
index 6a1f017da3..114ddc7058 100644
--- a/src/Mvc/Mvc.Cors/src/DisableCorsAuthorizationFilter.cs
+++ b/src/Mvc/Mvc.Cors/src/DisableCorsAuthorizationFilter.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.Cors;
/// <summary>
/// An <see cref="ICorsAuthorizationFilter"/> which ensures that an action does not run for a pre-flight request.
/// </summary>
-internal class DisableCorsAuthorizationFilter : ICorsAuthorizationFilter
+internal sealed class DisableCorsAuthorizationFilter : ICorsAuthorizationFilter
{
/// <inheritdoc />
// Since clients' preflight requests would not have data to authenticate requests, this
diff --git a/src/Mvc/Mvc.Cors/test/CorsApplicationModelProviderTest.cs b/src/Mvc/Mvc.Cors/test/CorsApplicationModelProviderTest.cs
index 5f745deede..eac7b69aed 100644
--- a/src/Mvc/Mvc.Cors/test/CorsApplicationModelProviderTest.cs
+++ b/src/Mvc/Mvc.Cors/test/CorsApplicationModelProviderTest.cs
@@ -20,52 +20,6 @@ public class CorsApplicationModelProviderTest
private readonly IOptions<MvcOptions> OptionsWithoutEndpointRouting = Options.Create(new MvcOptions { EnableEndpointRouting = false });
[Fact]
- public void OnProvidersExecuting_SetsEndpointMetadata_IfCorsAttributeIsPresentOnController()
- {
- // Arrange
- var corsProvider = new CorsApplicationModelProvider(Options.Create(new MvcOptions()));
- var context = GetProviderContext(typeof(CorsController));
-
- // Act
- corsProvider.OnProvidersExecuting(context);
-
- // Assert
- var model = Assert.Single(context.Result.Controllers);
- Assert.Empty(model.Filters);
-
- var action = Assert.Single(model.Actions);
- var selector = Assert.Single(action.Selectors);
- var constraint = Assert.Single(selector.ActionConstraints, c => c is HttpMethodActionConstraint);
- Assert.IsNotType<CorsHttpMethodActionConstraint>(constraint);
-
- var httpMethodMetadata = Assert.Single(selector.EndpointMetadata.OfType<HttpMethodMetadata>());
- Assert.True(httpMethodMetadata.AcceptCorsPreflight);
- }
-
- [Fact]
- public void OnProvidersExecuting_SetsEndpointMetadata_IfCorsAttributeIsPresentOnAction()
- {
- // Arrange
- var corsProvider = new CorsApplicationModelProvider(Options.Create(new MvcOptions()));
- var context = GetProviderContext(typeof(DisableCorsActionController));
-
- // Act
- corsProvider.OnProvidersExecuting(context);
-
- // Assert
- var model = Assert.Single(context.Result.Controllers);
- Assert.Empty(model.Filters);
-
- var action = Assert.Single(model.Actions);
- var selector = Assert.Single(action.Selectors);
- var constraint = Assert.Single(selector.ActionConstraints, c => c is HttpMethodActionConstraint);
- Assert.IsNotType<CorsHttpMethodActionConstraint>(constraint);
-
- var httpMethodMetadata = Assert.Single(selector.EndpointMetadata.OfType<HttpMethodMetadata>());
- Assert.True(httpMethodMetadata.AcceptCorsPreflight);
- }
-
- [Fact]
public void OnProvidersExecuting_WithoutGlobalAuthorizationFilter_EnableCorsAttributeAddsCorsAuthorizationFilterFactory()
{
// Arrange
diff --git a/src/Mvc/Mvc.DataAnnotations/src/CompareAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/CompareAttributeAdapter.cs
index 92f1d80c6d..43cbaff5ed 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/CompareAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/CompareAttributeAdapter.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class CompareAttributeAdapter : AttributeAdapterBase<CompareAttribute>
+internal sealed class CompareAttributeAdapter : AttributeAdapterBase<CompareAttribute>
{
private readonly string _otherProperty;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsClientModelValidatorProvider.cs b/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsClientModelValidatorProvider.cs
index 87c5542b1f..5a34f268c8 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsClientModelValidatorProvider.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsClientModelValidatorProvider.cs
@@ -15,7 +15,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// The logic to support <see cref="IClientModelValidator"/>
/// is implemented in <see cref="ValidationAttributeAdapter{TAttribute}"/>.
/// </summary>
-internal class DataAnnotationsClientModelValidatorProvider : IClientModelValidatorProvider
+internal sealed class DataAnnotationsClientModelValidatorProvider : IClientModelValidatorProvider
{
private readonly IOptions<MvcDataAnnotationsLocalizationOptions> _options;
private readonly IStringLocalizerFactory? _stringLocalizerFactory;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsMetadataProvider.cs b/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsMetadataProvider.cs
index 4df2df5a19..2cd4722677 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsMetadataProvider.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsMetadataProvider.cs
@@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// An implementation of <see cref="IBindingMetadataProvider"/> and <see cref="IDisplayMetadataProvider"/> for
/// the System.ComponentModel.DataAnnotations attribute classes.
/// </summary>
-internal class DataAnnotationsMetadataProvider :
+internal sealed class DataAnnotationsMetadataProvider :
IBindingMetadataProvider,
IDisplayMetadataProvider,
IValidationMetadataProvider
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsModelValidator.cs b/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsModelValidator.cs
index 3d45006dcc..b45ad4c57b 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsModelValidator.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DataAnnotationsModelValidator.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// <summary>
/// Validates based on the given <see cref="ValidationAttribute"/>.
/// </summary>
-internal class DataAnnotationsModelValidator : IModelValidator
+internal sealed class DataAnnotationsModelValidator : IModelValidator
{
private static readonly object _emptyValidationContextInstance = new object();
private readonly IStringLocalizer? _stringLocalizer;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DataTypeAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/DataTypeAttributeAdapter.cs
index 97698aa235..ee8859030d 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DataTypeAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DataTypeAttributeAdapter.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// A validation adapter that is used to map <see cref="DataTypeAttribute"/>'s to a single client side validation
/// rule.
/// </summary>
-internal class DataTypeAttributeAdapter : AttributeAdapterBase<DataTypeAttribute>
+internal sealed class DataTypeAttributeAdapter : AttributeAdapterBase<DataTypeAttribute>
{
public DataTypeAttributeAdapter(DataTypeAttribute attribute, string ruleName, IStringLocalizer? stringLocalizer)
: base(attribute, stringLocalizer)
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DefaultClientModelValidatorProvider.cs b/src/Mvc/Mvc.DataAnnotations/src/DefaultClientModelValidatorProvider.cs
index e822f70b12..2fc5e5f270 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DefaultClientModelValidatorProvider.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DefaultClientModelValidatorProvider.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// The <see cref="DefaultClientModelValidatorProvider"/> provides validators from
/// <see cref="IClientModelValidator"/> instances in <see cref="ModelBinding.ModelMetadata.ValidatorMetadata"/>.
/// </remarks>
-internal class DefaultClientModelValidatorProvider : IClientModelValidatorProvider
+internal sealed class DefaultClientModelValidatorProvider : IClientModelValidatorProvider
{
/// <inheritdoc />
public void CreateValidators(ClientValidatorProviderContext context)
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsLocalizationOptionsSetup.cs b/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsLocalizationOptionsSetup.cs
index c56a6e2868..dadd338dad 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsLocalizationOptionsSetup.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsLocalizationOptionsSetup.cs
@@ -9,7 +9,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Sets up default options for <see cref="MvcDataAnnotationsLocalizationOptions"/>.
/// </summary>
-internal class MvcDataAnnotationsLocalizationOptionsSetup : IConfigureOptions<MvcDataAnnotationsLocalizationOptions>
+internal sealed class MvcDataAnnotationsLocalizationOptionsSetup : IConfigureOptions<MvcDataAnnotationsLocalizationOptions>
{
/// <inheritdoc />
public void Configure(MvcDataAnnotationsLocalizationOptions options)
diff --git a/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsMvcOptionsSetup.cs b/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsMvcOptionsSetup.cs
index 04402fc456..7d172b19d3 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsMvcOptionsSetup.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/DependencyInjection/MvcDataAnnotationsMvcOptionsSetup.cs
@@ -11,7 +11,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Sets up default options for <see cref="MvcOptions"/>.
/// </summary>
-internal class MvcDataAnnotationsMvcOptionsSetup : IConfigureOptions<MvcOptions>
+internal sealed class MvcDataAnnotationsMvcOptionsSetup : IConfigureOptions<MvcOptions>
{
private readonly IStringLocalizerFactory? _stringLocalizerFactory;
private readonly IValidationAttributeAdapterProvider _validationAttributeAdapterProvider;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/FileExtensionsAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/FileExtensionsAttributeAdapter.cs
index 21a131977e..d64750d547 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/FileExtensionsAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/FileExtensionsAttributeAdapter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class FileExtensionsAttributeAdapter : AttributeAdapterBase<FileExtensionsAttribute>
+internal sealed class FileExtensionsAttributeAdapter : AttributeAdapterBase<FileExtensionsAttribute>
{
private readonly string _extensions;
private readonly string _formattedExtensions;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/MaxLengthAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/MaxLengthAttributeAdapter.cs
index f608397259..ec6f7ef719 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/MaxLengthAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/MaxLengthAttributeAdapter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class MaxLengthAttributeAdapter : AttributeAdapterBase<MaxLengthAttribute>
+internal sealed class MaxLengthAttributeAdapter : AttributeAdapterBase<MaxLengthAttribute>
{
private readonly string _max;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/MinLengthAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/MinLengthAttributeAdapter.cs
index 5585322b3e..dedb5d47ab 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/MinLengthAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/MinLengthAttributeAdapter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class MinLengthAttributeAdapter : AttributeAdapterBase<MinLengthAttribute>
+internal sealed class MinLengthAttributeAdapter : AttributeAdapterBase<MinLengthAttribute>
{
private readonly string _min;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidator.cs b/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidator.cs
index 113f21e98e..812e642c7b 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidator.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidator.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// An implementation of <see cref="IClientModelValidator"/> that provides the rule for validating
/// numeric types.
/// </summary>
-internal class NumericClientModelValidator : IClientModelValidator
+internal sealed class NumericClientModelValidator : IClientModelValidator
{
/// <inheritdoc />
public void AddValidation(ClientModelValidationContext context)
diff --git a/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidatorProvider.cs b/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidatorProvider.cs
index 467a8a1147..4c102b50c2 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidatorProvider.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/NumericClientModelValidatorProvider.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
/// An implementation of <see cref="IClientModelValidatorProvider"/> which provides client validators
/// for specific numeric types.
/// </summary>
-internal class NumericClientModelValidatorProvider : IClientModelValidatorProvider
+internal sealed class NumericClientModelValidatorProvider : IClientModelValidatorProvider
{
/// <inheritdoc />
public void CreateValidators(ClientValidatorProviderContext context)
diff --git a/src/Mvc/Mvc.DataAnnotations/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.DataAnnotations/src/PublicAPI.Shipped.txt
index bd875afb08..e0613ca3a5 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.DataAnnotations/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Mvc.DataAnnotations.AttributeAdapterBase<TAttribute>
-~Microsoft.AspNetCore.Mvc.DataAnnotations.ValidationAttributeAdapter<TAttribute>
+Microsoft.AspNetCore.Mvc.DataAnnotations.AttributeAdapterBase<TAttribute>
+Microsoft.AspNetCore.Mvc.DataAnnotations.ValidationAttributeAdapter<TAttribute>
abstract Microsoft.AspNetCore.Mvc.DataAnnotations.AttributeAdapterBase<TAttribute>.GetErrorMessage(Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ModelValidationContextBase! validationContext) -> string!
abstract Microsoft.AspNetCore.Mvc.DataAnnotations.ValidationAttributeAdapter<TAttribute>.AddValidation(Microsoft.AspNetCore.Mvc.ModelBinding.Validation.ClientModelValidationContext! context) -> void
abstract Microsoft.AspNetCore.Mvc.DataAnnotations.ValidationProviderAttribute.GetValidationAttributes() -> System.Collections.Generic.IEnumerable<System.ComponentModel.DataAnnotations.ValidationAttribute!>!
diff --git a/src/Mvc/Mvc.DataAnnotations/src/RangeAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/RangeAttributeAdapter.cs
index 63e8788eec..31ddd8c34c 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/RangeAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/RangeAttributeAdapter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class RangeAttributeAdapter : AttributeAdapterBase<RangeAttribute>
+internal sealed class RangeAttributeAdapter : AttributeAdapterBase<RangeAttribute>
{
private readonly string _max;
private readonly string _min;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/RegularExpressionAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/RegularExpressionAttributeAdapter.cs
index 36845c57a8..823a734016 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/RegularExpressionAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/RegularExpressionAttributeAdapter.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class RegularExpressionAttributeAdapter : AttributeAdapterBase<RegularExpressionAttribute>
+internal sealed class RegularExpressionAttributeAdapter : AttributeAdapterBase<RegularExpressionAttribute>
{
public RegularExpressionAttributeAdapter(RegularExpressionAttribute attribute, IStringLocalizer? stringLocalizer)
: base(attribute, stringLocalizer)
diff --git a/src/Mvc/Mvc.DataAnnotations/src/StringLengthAttributeAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/StringLengthAttributeAdapter.cs
index 61e2de237e..554425ae0c 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/StringLengthAttributeAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/StringLengthAttributeAdapter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Localization;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class StringLengthAttributeAdapter : AttributeAdapterBase<StringLengthAttribute>
+internal sealed class StringLengthAttributeAdapter : AttributeAdapterBase<StringLengthAttribute>
{
private readonly string _max;
private readonly string _min;
diff --git a/src/Mvc/Mvc.DataAnnotations/src/ValidatableObjectAdapter.cs b/src/Mvc/Mvc.DataAnnotations/src/ValidatableObjectAdapter.cs
index 89111d283b..565ad8f3d0 100644
--- a/src/Mvc/Mvc.DataAnnotations/src/ValidatableObjectAdapter.cs
+++ b/src/Mvc/Mvc.DataAnnotations/src/ValidatableObjectAdapter.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Mvc.ModelBinding.Validation;
namespace Microsoft.AspNetCore.Mvc.DataAnnotations;
-internal class ValidatableObjectAdapter : IModelValidator
+internal sealed class ValidatableObjectAdapter : IModelValidator
{
public IEnumerable<ModelValidationResult> Validate(ModelValidationContext context)
{
diff --git a/src/Mvc/Mvc.Formatters.Xml/src/ProblemDetailsWrapperProviderFactory.cs b/src/Mvc/Mvc.Formatters.Xml/src/ProblemDetailsWrapperProviderFactory.cs
index fc2918566d..f71fe0d319 100644
--- a/src/Mvc/Mvc.Formatters.Xml/src/ProblemDetailsWrapperProviderFactory.cs
+++ b/src/Mvc/Mvc.Formatters.Xml/src/ProblemDetailsWrapperProviderFactory.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.Formatters.Xml;
-internal class ProblemDetailsWrapperProviderFactory : IWrapperProviderFactory
+internal sealed class ProblemDetailsWrapperProviderFactory : IWrapperProviderFactory
{
public IWrapperProvider? GetProvider(WrapperProviderContext context)
{
@@ -20,7 +20,7 @@ internal class ProblemDetailsWrapperProviderFactory : IWrapperProviderFactory
return null;
}
- private class WrapperProvider : IWrapperProvider
+ private sealed class WrapperProvider : IWrapperProvider
{
public WrapperProvider(Type wrappingType, Func<object?, object?> wrapDelegate)
{
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/BsonTempDataSerializer.cs b/src/Mvc/Mvc.NewtonsoftJson/src/BsonTempDataSerializer.cs
index 998d3ec1f3..99104e2b06 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/BsonTempDataSerializer.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/BsonTempDataSerializer.cs
@@ -13,7 +13,7 @@ using Newtonsoft.Json.Linq;
namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson;
-internal class BsonTempDataSerializer : TempDataSerializer
+internal sealed class BsonTempDataSerializer : TempDataSerializer
{
private readonly JsonSerializer _jsonSerializer =
JsonSerializer.Create(JsonSerializerSettingsProvider.CreateSerializerSettings());
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/DependencyInjection/NewtonsoftJsonMvcOptionsSetup.cs b/src/Mvc/Mvc.NewtonsoftJson/src/DependencyInjection/NewtonsoftJsonMvcOptionsSetup.cs
index 6279aa0c01..9d70cff85e 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/DependencyInjection/NewtonsoftJsonMvcOptionsSetup.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/DependencyInjection/NewtonsoftJsonMvcOptionsSetup.cs
@@ -17,7 +17,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Sets up JSON formatter options for <see cref="MvcOptions"/>.
/// </summary>
-internal class NewtonsoftJsonMvcOptionsSetup : IConfigureOptions<MvcOptions>
+internal sealed class NewtonsoftJsonMvcOptionsSetup : IConfigureOptions<MvcOptions>
{
private readonly ILoggerFactory _loggerFactory;
private readonly MvcNewtonsoftJsonOptions _jsonOptions;
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/JsonArrayPool.cs b/src/Mvc/Mvc.NewtonsoftJson/src/JsonArrayPool.cs
index 951d56d439..b1d2149152 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/JsonArrayPool.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/JsonArrayPool.cs
@@ -6,7 +6,7 @@ using Newtonsoft.Json;
namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson;
-internal class JsonArrayPool<T> : IArrayPool<T>
+internal sealed class JsonArrayPool<T> : IArrayPool<T>
{
private readonly ArrayPool<T> _inner;
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/JsonSerializerObjectPolicy.cs b/src/Mvc/Mvc.NewtonsoftJson/src/JsonSerializerObjectPolicy.cs
index 9d54e64da6..8d0918986e 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/JsonSerializerObjectPolicy.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/JsonSerializerObjectPolicy.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson;
/// <summary>
/// <see cref="IPooledObjectPolicy{T}"/> for <see cref="JsonSerializer"/>.
/// </summary>
-internal class JsonSerializerObjectPolicy : IPooledObjectPolicy<JsonSerializer>
+internal sealed class JsonSerializerObjectPolicy : IPooledObjectPolicy<JsonSerializer>
{
private readonly JsonSerializerSettings _serializerSettings;
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonHelper.cs b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonHelper.cs
index 069cff2d9f..61d0c970cb 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonHelper.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonHelper.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson;
/// <summary>
/// Newtonsoft.Json based implementation of <see cref="IJsonHelper"/>.
/// </summary>
-internal class NewtonsoftJsonHelper : IJsonHelper
+internal sealed class NewtonsoftJsonHelper : IJsonHelper
{
// Perf: JsonSerializers are relatively expensive to create, and are thread safe. Cache the serializer
private readonly JsonSerializer _defaultSettingsJsonSerializer;
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonResultExecutor.cs b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonResultExecutor.cs
index 179e382b26..ac1b085298 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonResultExecutor.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/NewtonsoftJsonResultExecutor.cs
@@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Mvc.NewtonsoftJson;
/// <summary>
/// Executes a <see cref="JsonResult"/> to write to the response.
/// </summary>
-internal partial class NewtonsoftJsonResultExecutor : IActionResultExecutor<JsonResult>
+internal sealed partial class NewtonsoftJsonResultExecutor : IActionResultExecutor<JsonResult>
{
private static readonly string DefaultContentType = new MediaTypeHeaderValue("application/json")
{
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.NewtonsoftJson/src/PublicAPI.Shipped.txt
index 08c862ea41..f0d57ee8af 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~static Microsoft.AspNetCore.Mvc.JsonPatchExtensions.ApplyTo<T>(this Microsoft.AspNetCore.JsonPatch.JsonPatchDocument<T!>! patchDoc, T! objectToApplyTo, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! modelState) -> void
-~static Microsoft.AspNetCore.Mvc.JsonPatchExtensions.ApplyTo<T>(this Microsoft.AspNetCore.JsonPatch.JsonPatchDocument<T!>! patchDoc, T! objectToApplyTo, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! modelState, string! prefix) -> void
+static Microsoft.AspNetCore.Mvc.JsonPatchExtensions.ApplyTo<T>(this Microsoft.AspNetCore.JsonPatch.JsonPatchDocument<T!>! patchDoc, T! objectToApplyTo, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! modelState) -> void
+static Microsoft.AspNetCore.Mvc.JsonPatchExtensions.ApplyTo<T>(this Microsoft.AspNetCore.JsonPatch.JsonPatchDocument<T!>! patchDoc, T! objectToApplyTo, Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary! modelState, string! prefix) -> void
Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter
Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter.NewtonsoftJsonInputFormatter(Microsoft.Extensions.Logging.ILogger! logger, Newtonsoft.Json.JsonSerializerSettings! serializerSettings, System.Buffers.ArrayPool<char>! charPool, Microsoft.Extensions.ObjectPool.ObjectPoolProvider! objectPoolProvider, Microsoft.AspNetCore.Mvc.MvcOptions! options, Microsoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions! jsonOptions) -> void
Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonInputFormatter.SerializerSettings.get -> Newtonsoft.Json.JsonSerializerSettings!
diff --git a/src/Mvc/Mvc.NewtonsoftJson/src/ValidationProblemDetailsConverter.cs b/src/Mvc/Mvc.NewtonsoftJson/src/ValidationProblemDetailsConverter.cs
index 6db2e3d2c6..2b72fc1a47 100644
--- a/src/Mvc/Mvc.NewtonsoftJson/src/ValidationProblemDetailsConverter.cs
+++ b/src/Mvc/Mvc.NewtonsoftJson/src/ValidationProblemDetailsConverter.cs
@@ -46,7 +46,7 @@ public sealed class ValidationProblemDetailsConverter : JsonConverter
serializer.Serialize(writer, annotatedProblemDetails);
}
- private class AnnotatedValidationProblemDetails : AnnotatedProblemDetails
+ private sealed class AnnotatedValidationProblemDetails : AnnotatedProblemDetails
{
/// <remarks>
/// Required for JSON.NET deserialization.
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs
index 2595b0f380..16f29faf2c 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CSharpCompiler.cs
@@ -16,7 +16,9 @@ using DependencyContextCompilationOptions = Microsoft.Extensions.DependencyModel
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+#pragma warning disable CA1852 // Seal internal types
internal class CSharpCompiler
+#pragma warning restore CA1852 // Seal internal types
{
private readonly RazorReferenceManager _referenceManager;
private readonly IWebHostEnvironment _hostingEnvironment;
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedException.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedException.cs
index 7b374678f4..3e459b5592 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedException.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedException.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Diagnostics;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
-internal class CompilationFailedException : Exception, ICompilationException
+internal sealed class CompilationFailedException : Exception, ICompilationException
{
public CompilationFailedException(
IEnumerable<CompilationFailure> compilationFailures)
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedExceptionFactory.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedExceptionFactory.cs
index e243ad4896..2a44958603 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedExceptionFactory.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/CompilationFailedExceptionFactory.cs
@@ -118,8 +118,8 @@ internal static class CompilationFailedExceptionFactory
{
var mappedLineSpan = diagnostic.Location.GetMappedLineSpan();
return new DiagnosticMessage(
- diagnostic.GetMessage(),
- CSharpDiagnosticFormatter.Instance.Format(diagnostic),
+ diagnostic.GetMessage(CultureInfo.CurrentCulture),
+ CSharpDiagnosticFormatter.Instance.Format(diagnostic, CultureInfo.CurrentCulture),
mappedLineSpan.Path,
mappedLineSpan.StartLinePosition.Line + 1,
mappedLineSpan.StartLinePosition.Character + 1,
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs
index 0691a1d59f..3cd6213b9d 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/DependencyInjection/MvcRazorRuntimeCompilationOptionsSetup.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
-internal class MvcRazorRuntimeCompilationOptionsSetup : IConfigureOptions<MvcRazorRuntimeCompilationOptions>
+internal sealed class MvcRazorRuntimeCompilationOptionsSetup : IConfigureOptions<MvcRazorRuntimeCompilationOptions>
{
private readonly IWebHostEnvironment _hostingEnvironment;
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/PageActionDescriptorChangeProvider.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/PageActionDescriptorChangeProvider.cs
index 2a7861a217..623f60048b 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/PageActionDescriptorChangeProvider.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/PageActionDescriptorChangeProvider.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
-internal class PageActionDescriptorChangeProvider : IActionDescriptorChangeProvider
+internal sealed class PageActionDescriptorChangeProvider : IActionDescriptorChangeProvider
{
private readonly RuntimeCompilationFileProvider _fileProvider;
private readonly string[] _searchPatterns;
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorProjectPageRouteModelProvider.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorProjectPageRouteModelProvider.cs
index dc2fc081c6..07bc493e7b 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorProjectPageRouteModelProvider.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorProjectPageRouteModelProvider.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
-internal class RazorProjectPageRouteModelProvider : IPageRouteModelProvider
+internal sealed class RazorProjectPageRouteModelProvider : IPageRouteModelProvider
{
private const string AreaRootDirectory = "/Areas";
private readonly RazorProjectFileSystem _razorFileSystem;
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorReferenceManager.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorReferenceManager.cs
index 8dbc5592fe..6e077cbe71 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorReferenceManager.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RazorReferenceManager.cs
@@ -9,7 +9,9 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+#pragma warning disable CA1852 // Seal internal types
internal class RazorReferenceManager
+#pragma warning restore CA1852 // Seal internal types
{
private readonly ApplicationPartManager _partManager;
private readonly MvcRazorRuntimeCompilationOptions _options;
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeCompilationFileProvider.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeCompilationFileProvider.cs
index 9ad4881727..4595924145 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeCompilationFileProvider.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeCompilationFileProvider.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
-internal class RuntimeCompilationFileProvider
+internal sealed class RuntimeCompilationFileProvider
{
private readonly MvcRazorRuntimeCompilationOptions _options;
private IFileProvider? _compositeFileProvider;
diff --git a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeViewCompiler.cs b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeViewCompiler.cs
index 91291d889c..596a766082 100644
--- a/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeViewCompiler.cs
+++ b/src/Mvc/Mvc.Razor.RuntimeCompilation/src/RuntimeViewCompiler.cs
@@ -19,7 +19,9 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation;
+#pragma warning disable CA1852 // Seal internal types
internal partial class RuntimeViewCompiler : IViewCompiler
+#pragma warning restore CA1852 // Seal internal types
{
private readonly object _cacheLock = new object();
private readonly Dictionary<string, CompiledViewDescriptor> _precompiledViews;
@@ -415,7 +417,7 @@ internal partial class RuntimeViewCompiler : IViewCompiler
return normalizedPath;
}
- private class ViewCompilerWorkItem
+ private sealed class ViewCompilerWorkItem
{
public bool SupportsCompilation { get; set; } = default!;
diff --git a/src/Mvc/Mvc.Razor/src/Compilation/DefaultRazorPageFactoryProvider.cs b/src/Mvc/Mvc.Razor/src/Compilation/DefaultRazorPageFactoryProvider.cs
index 8b5e09f275..1fc5dfa2b6 100644
--- a/src/Mvc/Mvc.Razor/src/Compilation/DefaultRazorPageFactoryProvider.cs
+++ b/src/Mvc/Mvc.Razor/src/Compilation/DefaultRazorPageFactoryProvider.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Compilation;
/// Represents a <see cref="IRazorPageFactoryProvider"/> that creates <see cref="RazorPage"/> instances
/// from razor files in the file system.
/// </summary>
-internal class DefaultRazorPageFactoryProvider : IRazorPageFactoryProvider
+internal sealed class DefaultRazorPageFactoryProvider : IRazorPageFactoryProvider
{
private readonly IViewCompilerProvider _viewCompilerProvider;
diff --git a/src/Mvc/Mvc.Razor/src/Compilation/DefaultViewCompiler.cs b/src/Mvc/Mvc.Razor/src/Compilation/DefaultViewCompiler.cs
index 69f057f1fe..7b19aa7b63 100644
--- a/src/Mvc/Mvc.Razor/src/Compilation/DefaultViewCompiler.cs
+++ b/src/Mvc/Mvc.Razor/src/Compilation/DefaultViewCompiler.cs
@@ -13,8 +13,10 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Compilation;
/// <summary>
/// Caches the result of runtime compilation of Razor files for the duration of the application lifetime.
/// </summary>
+#pragma warning disable CA1852 // Seal internal types
// This name is hardcoded in RazorRuntimeCompilationMvcCoreBuilderExtensions. Make sure it's updated if this is ever renamed.
internal partial class DefaultViewCompiler : IViewCompiler
+#pragma warning restore CA1852 // Seal internal types
{
private readonly ApplicationPartManager _applicationPartManager;
private readonly ConcurrentDictionary<string, string> _normalizedPathCache;
diff --git a/src/Mvc/Mvc.Razor/src/DependencyInjection/MvcRazorMvcViewOptionsSetup.cs b/src/Mvc/Mvc.Razor/src/DependencyInjection/MvcRazorMvcViewOptionsSetup.cs
index 76c1f81714..c98c4f4560 100644
--- a/src/Mvc/Mvc.Razor/src/DependencyInjection/MvcRazorMvcViewOptionsSetup.cs
+++ b/src/Mvc/Mvc.Razor/src/DependencyInjection/MvcRazorMvcViewOptionsSetup.cs
@@ -10,7 +10,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Configures <see cref="MvcViewOptions"/> to use <see cref="RazorViewEngine"/>.
/// </summary>
-internal class MvcRazorMvcViewOptionsSetup : IConfigureOptions<MvcViewOptions>
+internal sealed class MvcRazorMvcViewOptionsSetup : IConfigureOptions<MvcViewOptions>
{
private readonly IRazorViewEngine _razorViewEngine;
diff --git a/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultFileVersionProvider.cs b/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultFileVersionProvider.cs
index a1a50eff0a..54f59e6679 100644
--- a/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultFileVersionProvider.cs
+++ b/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultFileVersionProvider.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
/// <summary>
/// Provides version hash for a specified file.
/// </summary>
-internal class DefaultFileVersionProvider : IFileVersionProvider
+internal sealed class DefaultFileVersionProvider : IFileVersionProvider
{
private const string VersionKey = "v";
diff --git a/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultTagHelperActivator.cs b/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultTagHelperActivator.cs
index 9e6530ab5e..dac3a77944 100644
--- a/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultTagHelperActivator.cs
+++ b/src/Mvc/Mvc.Razor/src/Infrastructure/DefaultTagHelperActivator.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.Infrastructure;
/// <summary>
/// Default implementation of <see cref="ITagHelperActivator"/>.
/// </summary>
-internal class DefaultTagHelperActivator : ITagHelperActivator
+internal sealed class DefaultTagHelperActivator : ITagHelperActivator
{
/// <inheritdoc />
public TTagHelper Create<TTagHelper>(ViewContext context)
diff --git a/src/Mvc/Mvc.Razor/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.Razor/src/PublicAPI.Shipped.txt
index 2457573ca3..e1e2f99e0b 100644
--- a/src/Mvc/Mvc.Razor/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.Razor/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.RazorViewEngine(Microsoft.AspNetCore.Mvc.Razor.IRazorPageFactoryProvider! pageFactory, Microsoft.AspNetCore.Mvc.Razor.IRazorPageActivator! pageActivator, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
+Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.RazorViewEngine(Microsoft.AspNetCore.Mvc.Razor.IRazorPageFactoryProvider! pageFactory, Microsoft.AspNetCore.Mvc.Razor.IRazorPageActivator! pageActivator, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
abstract Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.BeginContext(int position, int length, bool isLiteral) -> void
abstract Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.EndContext() -> void
abstract Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.EnsureRenderedBodyOrSections() -> void
@@ -148,11 +148,13 @@ Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.TempData.get -> Microsoft.AspNetCor
Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.ViewBag.get -> dynamic!
Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.WriteAttributeValue(string! prefix, int prefixOffset, object? value, int valueOffset, int valueLength, bool isLiteral) -> void
Microsoft.AspNetCore.Mvc.Razor.RazorPageFactoryResult
+Microsoft.AspNetCore.Mvc.Razor.RazorPageFactoryResult.RazorPageFactoryResult() -> void
Microsoft.AspNetCore.Mvc.Razor.RazorPageFactoryResult.RazorPageFactory.get -> System.Func<Microsoft.AspNetCore.Mvc.Razor.IRazorPage!>?
Microsoft.AspNetCore.Mvc.Razor.RazorPageFactoryResult.RazorPageFactoryResult(Microsoft.AspNetCore.Mvc.Razor.Compilation.CompiledViewDescriptor! viewDescriptor, System.Func<Microsoft.AspNetCore.Mvc.Razor.IRazorPage!>? razorPageFactory) -> void
Microsoft.AspNetCore.Mvc.Razor.RazorPageFactoryResult.Success.get -> bool
Microsoft.AspNetCore.Mvc.Razor.RazorPageFactoryResult.ViewDescriptor.get -> Microsoft.AspNetCore.Mvc.Razor.Compilation.CompiledViewDescriptor?
Microsoft.AspNetCore.Mvc.Razor.RazorPageResult
+Microsoft.AspNetCore.Mvc.Razor.RazorPageResult.RazorPageResult() -> void
Microsoft.AspNetCore.Mvc.Razor.RazorPageResult.Name.get -> string!
Microsoft.AspNetCore.Mvc.Razor.RazorPageResult.Page.get -> Microsoft.AspNetCore.Mvc.Razor.IRazorPage?
Microsoft.AspNetCore.Mvc.Razor.RazorPageResult.RazorPageResult(string! name, Microsoft.AspNetCore.Mvc.Razor.IRazorPage! page) -> void
diff --git a/src/Mvc/Mvc.Razor/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.Razor/src/PublicAPI.Unshipped.txt
index bd49abfdb0..5b615e3dde 100644
--- a/src/Mvc/Mvc.Razor/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.Razor/src/PublicAPI.Unshipped.txt
@@ -1,5 +1,3 @@
#nullable enable
*REMOVED*Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>.Model.get -> TModel?
Microsoft.AspNetCore.Mvc.Razor.RazorPage<TModel>.Model.get -> TModel
-*REMOVED*~Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.RazorViewEngine(Microsoft.AspNetCore.Mvc.Razor.IRazorPageFactoryProvider! pageFactory, Microsoft.AspNetCore.Mvc.Razor.IRazorPageActivator! pageActivator, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
-Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.RazorViewEngine(Microsoft.AspNetCore.Mvc.Razor.IRazorPageFactoryProvider! pageFactory, Microsoft.AspNetCore.Mvc.Razor.IRazorPageActivator! pageActivator, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions!>! optionsAccessor, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Diagnostics.DiagnosticListener! diagnosticListener) -> void
diff --git a/src/Mvc/Mvc.Razor/src/RazorPagePropertyActivator.cs b/src/Mvc/Mvc.Razor/src/RazorPagePropertyActivator.cs
index da01d2467a..c4062bcb67 100644
--- a/src/Mvc/Mvc.Razor/src/RazorPagePropertyActivator.cs
+++ b/src/Mvc/Mvc.Razor/src/RazorPagePropertyActivator.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Mvc.Razor;
-internal class RazorPagePropertyActivator
+internal sealed class RazorPagePropertyActivator
{
private readonly IModelMetadataProvider _metadataProvider;
private readonly Func<IModelMetadataProvider, ModelStateDictionary, ViewDataDictionary> _rootFactory;
@@ -127,7 +127,7 @@ internal class RazorPagePropertyActivator
return new PropertyActivator<ViewContext>(property, valueAccessor);
}
- public class PropertyValueAccessors
+ public sealed class PropertyValueAccessors
{
public Func<ViewContext, object> UrlHelperAccessor { get; init; } = default!;
diff --git a/src/Mvc/Mvc.Razor/src/RazorViewEngineOptionsSetup.cs b/src/Mvc/Mvc.Razor/src/RazorViewEngineOptionsSetup.cs
index 4967ef5b14..98d8d75767 100644
--- a/src/Mvc/Mvc.Razor/src/RazorViewEngineOptionsSetup.cs
+++ b/src/Mvc/Mvc.Razor/src/RazorViewEngineOptionsSetup.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Razor;
-internal class RazorViewEngineOptionsSetup : IConfigureOptions<RazorViewEngineOptions>
+internal sealed class RazorViewEngineOptionsSetup : IConfigureOptions<RazorViewEngineOptions>
{
public void Configure(RazorViewEngineOptions options)
{
diff --git a/src/Mvc/Mvc.Razor/src/ServiceBasedTagHelperActivator.cs b/src/Mvc/Mvc.Razor/src/ServiceBasedTagHelperActivator.cs
index d21aaccf43..e508eb6a15 100644
--- a/src/Mvc/Mvc.Razor/src/ServiceBasedTagHelperActivator.cs
+++ b/src/Mvc/Mvc.Razor/src/ServiceBasedTagHelperActivator.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor;
/// A <see cref="ITagHelperActivator"/> that retrieves tag helpers as services from the request's
/// <see cref="IServiceProvider"/>.
/// </summary>
-internal class ServiceBasedTagHelperActivator : ITagHelperActivator
+internal sealed class ServiceBasedTagHelperActivator : ITagHelperActivator
{
/// <inheritdoc />
public TTagHelper Create<TTagHelper>(ViewContext context) where TTagHelper : ITagHelper
diff --git a/src/Mvc/Mvc.Razor/src/TagHelperComponentManager.cs b/src/Mvc/Mvc.Razor/src/TagHelperComponentManager.cs
index 96697f53b9..a115c508f9 100644
--- a/src/Mvc/Mvc.Razor/src/TagHelperComponentManager.cs
+++ b/src/Mvc/Mvc.Razor/src/TagHelperComponentManager.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor;
/// <summary>
/// The default implementation of the <see cref="ITagHelperComponentManager"/>.
/// </summary>
-internal class TagHelperComponentManager : ITagHelperComponentManager
+internal sealed class TagHelperComponentManager : ITagHelperComponentManager
{
/// <summary>
/// Creates a new <see cref="TagHelperComponentManager"/>.
diff --git a/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentPropertyActivator.cs b/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentPropertyActivator.cs
index 9e06186a4c..f1152eb89a 100644
--- a/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentPropertyActivator.cs
+++ b/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentPropertyActivator.cs
@@ -13,17 +13,12 @@ namespace Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
/// <summary>
/// Default implementation of <see cref="ITagHelperComponentPropertyActivator"/>.
/// </summary>
-internal class TagHelperComponentPropertyActivator : ITagHelperComponentPropertyActivator
+internal sealed class TagHelperComponentPropertyActivator : ITagHelperComponentPropertyActivator
{
- private readonly ConcurrentDictionary<Type, PropertyActivator<ViewContext>[]> _propertiesToActivate;
+ private readonly ConcurrentDictionary<Type, PropertyActivator<ViewContext>[]> _propertiesToActivate = new();
private readonly Func<Type, PropertyActivator<ViewContext>[]> _getPropertiesToActivate = GetPropertiesToActivate;
private static readonly Func<PropertyInfo, PropertyActivator<ViewContext>> _createActivateInfo = CreateActivateInfo;
- public TagHelperComponentPropertyActivator()
- {
- _propertiesToActivate = new ConcurrentDictionary<Type, PropertyActivator<ViewContext>[]>();
- }
-
internal void ClearCache()
{
_propertiesToActivate.Clear();
@@ -32,10 +27,7 @@ internal class TagHelperComponentPropertyActivator : ITagHelperComponentProperty
/// <inheritdoc />
public void Activate(ViewContext context, ITagHelperComponent tagHelperComponent)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(context);
var propertiesToActivate = _propertiesToActivate.GetOrAdd(
tagHelperComponent.GetType(),
diff --git a/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentTagHelper.cs b/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentTagHelper.cs
index 58567bdad4..48ea2f9f8b 100644
--- a/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentTagHelper.cs
+++ b/src/Mvc/Mvc.Razor/src/TagHelpers/TagHelperComponentTagHelper.cs
@@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor.TagHelpers;
public abstract partial class TagHelperComponentTagHelper : TagHelper
{
private readonly ILogger _logger;
- private readonly IEnumerable<ITagHelperComponent> _components;
+ private readonly ITagHelperComponent[] _components;
/// <summary>
/// Creates a new <see cref="TagHelperComponentTagHelper"/> and orders the
@@ -33,15 +33,8 @@ public abstract partial class TagHelperComponentTagHelper : TagHelper
ITagHelperComponentManager manager,
ILoggerFactory loggerFactory)
{
- if (manager == null)
- {
- throw new ArgumentNullException(nameof(manager));
- }
-
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(manager);
+ ArgumentNullException.ThrowIfNull(loggerFactory);
_components = manager.Components.OrderBy(p => p.Order).ToArray();
_logger = loggerFactory.CreateLogger(GetType());
@@ -69,8 +62,9 @@ public abstract partial class TagHelperComponentTagHelper : TagHelper
PropertyActivator = serviceProvider.GetRequiredService<ITagHelperComponentPropertyActivator>();
}
- foreach (var component in _components)
+ for (var i = 0; i < _components.Length; i++)
{
+ var component = _components[i];
PropertyActivator.Activate(ViewContext, component);
component.Init(context);
if (_logger.IsEnabled(LogLevel.Debug))
@@ -83,8 +77,9 @@ public abstract partial class TagHelperComponentTagHelper : TagHelper
/// <inheritdoc />
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
- foreach (var component in _components)
+ for (var i = 0; i < _components.Length; i++)
{
+ var component = _components[i];
await component.ProcessAsync(context, output);
if (_logger.IsEnabled(LogLevel.Debug))
{
@@ -95,10 +90,10 @@ public abstract partial class TagHelperComponentTagHelper : TagHelper
private static partial class Log
{
- [LoggerMessage(2, LogLevel.Debug, "Tag helper component '{ComponentName}' initialized.", EventName = "TagHelperComponentInitialized")]
+ [LoggerMessage(2, LogLevel.Debug, "Tag helper component '{ComponentName}' initialized.", EventName = "TagHelperComponentInitialized", SkipEnabledCheck = true)]
public static partial void TagHelperComponentInitialized(ILogger logger, string componentName);
- [LoggerMessage(3, LogLevel.Debug, "Tag helper component '{ComponentName}' processed.", EventName = "TagHelperComponentProcessed")]
+ [LoggerMessage(3, LogLevel.Debug, "Tag helper component '{ComponentName}' processed.", EventName = "TagHelperComponentProcessed", SkipEnabledCheck = true)]
public static partial void TagHelperComponentProcessed(ILogger logger, string componentName);
}
}
diff --git a/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs b/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs
index a0139c4c94..732a51a1e3 100644
--- a/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs
+++ b/src/Mvc/Mvc.Razor/src/TagHelpers/UrlResolutionTagHelper.cs
@@ -52,31 +52,31 @@ public class UrlResolutionTagHelper : TagHelper
private static readonly char[] ValidAttributeWhitespaceChars =
new[] { '\t', '\n', '\u000C', '\r', ' ' };
private static readonly Dictionary<string, string[]> ElementAttributeLookups =
- new Dictionary<string, string[]>(StringComparer.OrdinalIgnoreCase)
+ new(StringComparer.OrdinalIgnoreCase)
{
- { "a", new[] { "href" } },
- { "applet", new[] { "archive" } },
- { "area", new[] { "href" } },
- { "audio", new[] { "src" } },
- { "base", new[] { "href" } },
- { "blockquote", new[] { "cite" } },
- { "button", new[] { "formaction" } },
- { "del", new[] { "cite" } },
- { "embed", new[] { "src" } },
- { "form", new[] { "action" } },
- { "html", new[] { "manifest" } },
- { "iframe", new[] { "src" } },
- { "img", new[] { "src", "srcset" } },
- { "input", new[] { "src", "formaction" } },
- { "ins", new[] { "cite" } },
- { "link", new[] { "href" } },
- { "menuitem", new[] { "icon" } },
- { "object", new[] { "archive", "data" } },
- { "q", new[] { "cite" } },
- { "script", new[] { "src" } },
- { "source", new[] { "src", "srcset" } },
- { "track", new[] { "src" } },
- { "video", new[] { "poster", "src" } },
+ { "a", new[] { "href" } },
+ { "applet", new[] { "archive" } },
+ { "area", new[] { "href" } },
+ { "audio", new[] { "src" } },
+ { "base", new[] { "href" } },
+ { "blockquote", new[] { "cite" } },
+ { "button", new[] { "formaction" } },
+ { "del", new[] { "cite" } },
+ { "embed", new[] { "src" } },
+ { "form", new[] { "action" } },
+ { "html", new[] { "manifest" } },
+ { "iframe", new[] { "src" } },
+ { "img", new[] { "src", "srcset" } },
+ { "input", new[] { "src", "formaction" } },
+ { "ins", new[] { "cite" } },
+ { "link", new[] { "href" } },
+ { "menuitem", new[] { "icon" } },
+ { "object", new[] { "archive", "data" } },
+ { "q", new[] { "cite" } },
+ { "script", new[] { "src" } },
+ { "source", new[] { "src", "srcset" } },
+ { "track", new[] { "src" } },
+ { "video", new[] { "poster", "src" } },
};
/// <summary>
@@ -113,15 +113,8 @@ public class UrlResolutionTagHelper : TagHelper
/// <inheritdoc />
public override void Process(TagHelperContext context, TagHelperOutput output)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
+ ArgumentNullException.ThrowIfNull(context);
+ ArgumentNullException.ThrowIfNull(output);
if (output.TagName == null)
{
@@ -149,15 +142,8 @@ public class UrlResolutionTagHelper : TagHelper
/// <param name="output">The <see cref="TagHelperOutput"/>.</param>
protected void ProcessUrlAttribute(string attributeName, TagHelperOutput output)
{
- if (attributeName == null)
- {
- throw new ArgumentNullException(nameof(attributeName));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
+ ArgumentNullException.ThrowIfNull(attributeName);
+ ArgumentNullException.ThrowIfNull(output);
var attributes = output.Attributes;
// Read interface .Count once rather than per iteration
@@ -170,8 +156,7 @@ public class UrlResolutionTagHelper : TagHelper
continue;
}
- var stringValue = attribute.Value as string;
- if (stringValue != null)
+ if (attribute.Value is string stringValue)
{
if (TryResolveUrl(stringValue, resolvedUrl: out string? resolvedUrl))
{
@@ -183,8 +168,7 @@ public class UrlResolutionTagHelper : TagHelper
}
else
{
- var htmlContent = attribute.Value as IHtmlContent;
- if (htmlContent != null)
+ if (attribute.Value is IHtmlContent htmlContent)
{
var htmlString = htmlContent as HtmlString;
if (htmlString != null)
@@ -343,7 +327,7 @@ public class UrlResolutionTagHelper : TagHelper
return ValidAttributeWhitespaceChars.AsSpan().IndexOf(ch) != -1;
}
- private class EncodeFirstSegmentContent : IHtmlContent
+ private sealed class EncodeFirstSegmentContent : IHtmlContent
{
private readonly string _firstSegment;
private readonly int _firstSegmentLength;
diff --git a/src/Mvc/Mvc.Razor/src/ViewLocationCacheResult.cs b/src/Mvc/Mvc.Razor/src/ViewLocationCacheResult.cs
index 13a782b041..94922c99f9 100644
--- a/src/Mvc/Mvc.Razor/src/ViewLocationCacheResult.cs
+++ b/src/Mvc/Mvc.Razor/src/ViewLocationCacheResult.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Mvc.Razor;
/// <summary>
/// Result of view location cache lookup.
/// </summary>
-internal class ViewLocationCacheResult
+internal sealed class ViewLocationCacheResult
{
/// <summary>
/// Initializes a new instance of <see cref="ViewLocationCacheResult"/>
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AuthorizationPageApplicationModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AuthorizationPageApplicationModelProvider.cs
index 23a97e2bf2..ab30e37b1c 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AuthorizationPageApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AuthorizationPageApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class AuthorizationPageApplicationModelProvider : IPageApplicationModelProvider
+internal sealed class AuthorizationPageApplicationModelProvider : IPageApplicationModelProvider
{
private readonly IAuthorizationPolicyProvider _policyProvider;
private readonly MvcOptions _mvcOptions;
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AutoValidateAntiforgeryPageApplicationModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AutoValidateAntiforgeryPageApplicationModelProvider.cs
index f1979fa0a6..6dce65edeb 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AutoValidateAntiforgeryPageApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/AutoValidateAntiforgeryPageApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class AutoValidateAntiforgeryPageApplicationModelProvider : IPageApplicationModelProvider
+internal sealed class AutoValidateAntiforgeryPageApplicationModelProvider : IPageApplicationModelProvider
{
// The order is set to execute after the DefaultPageApplicationModelProvider.
public int Order => -1000 + 10;
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/CompiledPageRouteModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/CompiledPageRouteModelProvider.cs
index 808b421628..6d89bdc26f 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/CompiledPageRouteModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/CompiledPageRouteModelProvider.cs
@@ -11,7 +11,9 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
+#pragma warning disable CA1852 // Seal internal types
internal class CompiledPageRouteModelProvider : IPageRouteModelProvider
+#pragma warning restore CA1852 // Seal internal types
{
private const string RazorPageDocumentKind = "mvc.1.0.razor-page";
private const string RouteTemplateKey = "RouteTemplate";
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs
index 1d99017be5..1e98ca0851 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelPartsProvider.cs
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class DefaultPageApplicationModelPartsProvider : IPageApplicationModelPartsProvider
+internal sealed class DefaultPageApplicationModelPartsProvider : IPageApplicationModelPartsProvider
{
private readonly IModelMetadataProvider _modelMetadataProvider;
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelProvider.cs
index 7ca9a7eb8a..c217a6b2ed 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/DefaultPageApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -13,7 +13,7 @@ using Resources = Microsoft.AspNetCore.Mvc.RazorPages.Resources;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class DefaultPageApplicationModelProvider : IPageApplicationModelProvider
+internal sealed class DefaultPageApplicationModelProvider : IPageApplicationModelProvider
{
private const string ModelPropertyName = "Model";
private readonly PageHandlerPageFilter _pageHandlerPageFilter = new PageHandlerPageFilter();
@@ -60,7 +60,7 @@ internal class DefaultPageApplicationModelProvider : IPageApplicationModelProvid
/// <param name="actionDescriptor">The <see cref="PageActionDescriptor"/>.</param>
/// <param name="pageTypeInfo">The <see cref="TypeInfo"/>.</param>
/// <returns>A <see cref="PageApplicationModel"/> for the given <see cref="TypeInfo"/>.</returns>
- protected virtual PageApplicationModel CreateModel(
+ private PageApplicationModel CreateModel(
PageActionDescriptor actionDescriptor,
TypeInfo pageTypeInfo)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/PageConventionCollection.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/PageConventionCollection.cs
index 55bf497b95..978f324c10 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/PageConventionCollection.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/PageConventionCollection.cs
@@ -316,7 +316,7 @@ public class PageConventionCollection : Collection<IPageConvention>
return convention;
}
- private class PageRouteModelConvention : IPageRouteModelConvention
+ private sealed class PageRouteModelConvention : IPageRouteModelConvention
{
private readonly string? _areaName;
private readonly string _path;
@@ -344,7 +344,7 @@ public class PageConventionCollection : Collection<IPageConvention>
}
}
- private class FolderRouteModelConvention : IPageRouteModelConvention
+ private sealed class FolderRouteModelConvention : IPageRouteModelConvention
{
private readonly string? _areaName;
private readonly string _folderPath;
@@ -372,7 +372,7 @@ public class PageConventionCollection : Collection<IPageConvention>
}
}
- private class PageApplicationModelConvention : IPageApplicationModelConvention
+ private sealed class PageApplicationModelConvention : IPageApplicationModelConvention
{
private readonly string? _areaName;
private readonly string _path;
@@ -400,7 +400,7 @@ public class PageConventionCollection : Collection<IPageConvention>
}
}
- private class FolderApplicationModelConvention : IPageApplicationModelConvention
+ private sealed class FolderApplicationModelConvention : IPageApplicationModelConvention
{
private readonly string? _areaName;
private readonly string _folderPath;
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ResponseCacheFilterApplicationModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ResponseCacheFilterApplicationModelProvider.cs
index f07162c788..1b54d7dae3 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ResponseCacheFilterApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ResponseCacheFilterApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq;
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class ResponseCacheFilterApplicationModelProvider : IPageApplicationModelProvider
+internal sealed class ResponseCacheFilterApplicationModelProvider : IPageApplicationModelProvider
{
private readonly MvcOptions _mvcOptions;
private readonly ILoggerFactory _loggerFactory;
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/TempDataFilterPageApplicationModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/TempDataFilterPageApplicationModelProvider.cs
index 22a3b9f5e3..0ec338253c 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/TempDataFilterPageApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/TempDataFilterPageApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Filters;
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class TempDataFilterPageApplicationModelProvider : IPageApplicationModelProvider
+internal sealed class TempDataFilterPageApplicationModelProvider : IPageApplicationModelProvider
{
private readonly TempDataSerializer _tempDataSerializer;
diff --git a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ViewDataAttributePageApplicationModelProvider.cs b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ViewDataAttributePageApplicationModelProvider.cs
index 19fe772c45..4b54a1af73 100644
--- a/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ViewDataAttributePageApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/ApplicationModels/ViewDataAttributePageApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Filters;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
namespace Microsoft.AspNetCore.Mvc.ApplicationModels;
-internal class ViewDataAttributePageApplicationModelProvider : IPageApplicationModelProvider
+internal sealed class ViewDataAttributePageApplicationModelProvider : IPageApplicationModelProvider
{
/// <inheritdoc />
/// <remarks>This order ensures that <see cref="ViewDataAttributePageApplicationModelProvider"/> runs after the <see cref="DefaultPageApplicationModelProvider"/>.</remarks>
diff --git a/src/Mvc/Mvc.RazorPages/src/Builder/PageActionEndpointConventionBuilder.cs b/src/Mvc/Mvc.RazorPages/src/Builder/PageActionEndpointConventionBuilder.cs
index 2001305c36..a60499c6fb 100644
--- a/src/Mvc/Mvc.RazorPages/src/Builder/PageActionEndpointConventionBuilder.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Builder/PageActionEndpointConventionBuilder.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Builder;
@@ -14,11 +14,13 @@ public sealed class PageActionEndpointConventionBuilder : IEndpointConventionBui
// The lock is shared with the data source.
private readonly object _lock;
private readonly List<Action<EndpointBuilder>> _conventions;
+ private readonly List<Action<EndpointBuilder>> _finallyConventions;
- internal PageActionEndpointConventionBuilder(object @lock, List<Action<EndpointBuilder>> conventions)
+ internal PageActionEndpointConventionBuilder(object @lock, List<Action<EndpointBuilder>> conventions, List<Action<EndpointBuilder>> finallyConventions)
{
_lock = @lock;
_conventions = conventions;
+ _finallyConventions = finallyConventions;
}
/// <summary>
@@ -39,4 +41,15 @@ public sealed class PageActionEndpointConventionBuilder : IEndpointConventionBui
_conventions.Add(convention);
}
}
+
+ /// <inheritdoc/>
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ ArgumentNullException.ThrowIfNull(nameof(finalConvention));
+
+ lock (_lock)
+ {
+ _finallyConventions.Add(finalConvention);
+ };
+ }
}
diff --git a/src/Mvc/Mvc.RazorPages/src/DependencyInjection/PageConventionCollectionExtensions.cs b/src/Mvc/Mvc.RazorPages/src/DependencyInjection/PageConventionCollectionExtensions.cs
index 0d277a042c..231b99586f 100644
--- a/src/Mvc/Mvc.RazorPages/src/DependencyInjection/PageConventionCollectionExtensions.cs
+++ b/src/Mvc/Mvc.RazorPages/src/DependencyInjection/PageConventionCollectionExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.ApplicationModels;
using Microsoft.AspNetCore.Mvc.Authorization;
@@ -466,7 +467,7 @@ public static class PageConventionCollectionExtensions
/// <param name="pageName">The page name.</param>
/// <param name="route">The route to associate with the page.</param>
/// <returns>The <see cref="PageConventionCollection"/>.</returns>
- public static PageConventionCollection AddPageRoute(this PageConventionCollection conventions, string pageName, string route)
+ public static PageConventionCollection AddPageRoute(this PageConventionCollection conventions, string pageName, [StringSyntax("Route")] string route)
{
if (conventions == null)
{
@@ -511,7 +512,7 @@ public static class PageConventionCollectionExtensions
this PageConventionCollection conventions,
string areaName,
string pageName,
- string route)
+ [StringSyntax("Route")] string route)
{
if (conventions == null)
{
@@ -558,7 +559,7 @@ public static class PageConventionCollectionExtensions
};
}
- private class ParameterModelBaseConventionAdapter : IPageConvention, IParameterModelBaseConvention
+ private sealed class ParameterModelBaseConventionAdapter : IPageConvention, IParameterModelBaseConvention
{
private readonly IParameterModelBaseConvention _convention;
diff --git a/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesOptionsSetup.cs b/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesOptionsSetup.cs
index 5e5f319681..481cb2a0a5 100644
--- a/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesOptionsSetup.cs
+++ b/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesOptionsSetup.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.DependencyInjection;
-internal class RazorPagesOptionsSetup : IConfigureOptions<RazorPagesOptions>
+internal sealed class RazorPagesOptionsSetup : IConfigureOptions<RazorPagesOptions>
{
private readonly IServiceProvider _serviceProvider;
diff --git a/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesRazorViewEngineOptionsSetup.cs b/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesRazorViewEngineOptionsSetup.cs
index fe747a3fed..549204603d 100644
--- a/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesRazorViewEngineOptionsSetup.cs
+++ b/src/Mvc/Mvc.RazorPages/src/DependencyInjection/RazorPagesRazorViewEngineOptionsSetup.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.Extensions.DependencyInjection;
-internal class RazorPagesRazorViewEngineOptionsSetup : IConfigureOptions<RazorViewEngineOptions>
+internal sealed class RazorPagesRazorViewEngineOptionsSetup : IConfigureOptions<RazorViewEngineOptions>
{
private readonly RazorPagesOptions _pagesOptions;
diff --git a/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerPageFilter.cs b/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerPageFilter.cs
index 3c46b41f97..c968d32987 100644
--- a/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerPageFilter.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerPageFilter.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class PageHandlerPageFilter : IAsyncPageFilter, IOrderedFilter
+internal sealed class PageHandlerPageFilter : IAsyncPageFilter, IOrderedFilter
{
/// <remarks>
/// Filters on handlers run furthest from the action.
diff --git a/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerResultFIlter.cs b/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerResultFIlter.cs
index 121a6ddfc4..79c4752b6d 100644
--- a/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerResultFIlter.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Filters/PageHandlerResultFIlter.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class PageHandlerResultFilter : IAsyncResultFilter, IOrderedFilter
+internal sealed class PageHandlerResultFilter : IAsyncResultFilter, IOrderedFilter
{
/// <remarks>
/// Filters on handlers run furthest from the action.
diff --git a/src/Mvc/Mvc.RazorPages/src/Filters/PageResponseCacheFilter.cs b/src/Mvc/Mvc.RazorPages/src/Filters/PageResponseCacheFilter.cs
index 18805952fd..47c8991c39 100644
--- a/src/Mvc/Mvc.RazorPages/src/Filters/PageResponseCacheFilter.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Filters/PageResponseCacheFilter.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.Filters;
/// <summary>
/// A <see cref="IPageFilter"/> which sets the appropriate headers related to response caching.
/// </summary>
-internal class PageResponseCacheFilter : IPageFilter, IResponseCacheFilter
+internal sealed class PageResponseCacheFilter : IPageFilter, IResponseCacheFilter
{
private readonly ResponseCacheFilterExecutor _executor;
private readonly ILogger _logger;
diff --git a/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilter.cs b/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilter.cs
index da0c6bcddb..8f05e7a35c 100644
--- a/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilter.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilter.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.ViewFeatures;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class PageSaveTempDataPropertyFilter : SaveTempDataPropertyFilterBase, IPageFilter
+internal sealed class PageSaveTempDataPropertyFilter : SaveTempDataPropertyFilterBase, IPageFilter
{
public PageSaveTempDataPropertyFilter(ITempDataDictionaryFactory factory)
: base(factory)
diff --git a/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilterFactory.cs b/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilterFactory.cs
index bbdd729f79..da1157fc9a 100644
--- a/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilterFactory.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Filters/PageSaveTempDataPropertyFilterFactory.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class PageSaveTempDataPropertyFilterFactory : IFilterFactory
+internal sealed class PageSaveTempDataPropertyFilterFactory : IFilterFactory
{
public PageSaveTempDataPropertyFilterFactory(IReadOnlyList<LifecycleProperty> properties)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/Filters/PageViewDataAttributeFilterFactory.cs b/src/Mvc/Mvc.RazorPages/src/Filters/PageViewDataAttributeFilterFactory.cs
index db8ef0f116..b10b73a758 100644
--- a/src/Mvc/Mvc.RazorPages/src/Filters/PageViewDataAttributeFilterFactory.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Filters/PageViewDataAttributeFilterFactory.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
namespace Microsoft.AspNetCore.Mvc.Filters;
-internal class PageViewDataAttributeFilterFactory : IFilterFactory
+internal sealed class PageViewDataAttributeFilterFactory : IFilterFactory
{
public PageViewDataAttributeFilterFactory(IReadOnlyList<LifecycleProperty> properties)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageActivatorProvider.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageActivatorProvider.cs
index fa50e43e6f..a4f2f88f9d 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageActivatorProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageActivatorProvider.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
/// <summary>
/// <see cref="IPageActivatorProvider"/> that uses type activation to create Pages.
/// </summary>
-internal class DefaultPageActivatorProvider : IPageActivatorProvider
+internal sealed class DefaultPageActivatorProvider : IPageActivatorProvider
{
private readonly Action<PageContext, ViewContext, object> _disposer = Dispose;
private readonly Func<PageContext, ViewContext, object, ValueTask> _asyncDisposer = AsyncDispose;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageFactoryProvider.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageFactoryProvider.cs
index 2bb95d70bd..6ed1fbec4b 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageFactoryProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageFactoryProvider.cs
@@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DefaultPageFactoryProvider : IPageFactoryProvider
+internal sealed class DefaultPageFactoryProvider : IPageFactoryProvider
{
private readonly IPageActivatorProvider _pageActivator;
private readonly IModelMetadataProvider _modelMetadataProvider;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageHandlerMethodSelector.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageHandlerMethodSelector.cs
index f34ee3bed1..90d8b2d3eb 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageHandlerMethodSelector.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageHandlerMethodSelector.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DefaultPageHandlerMethodSelector : IPageHandlerMethodSelector
+internal sealed class DefaultPageHandlerMethodSelector : IPageHandlerMethodSelector
{
private const string Handler = "handler";
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageLoader.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageLoader.cs
index e54aa20256..0ddaf3042a 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageLoader.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageLoader.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DefaultPageLoader : PageLoader
+internal sealed class DefaultPageLoader : PageLoader
{
private readonly IViewCompilerProvider _viewCompilerProvider;
private readonly CompiledPageActionDescriptorFactory _compiledPageActionDescriptorFactory;
@@ -87,6 +87,9 @@ internal class DefaultPageLoader : PageLoader
}
},
},
+ groupConventions: Array.Empty<Action<EndpointBuilder>>(),
+ finallyConventions: Array.Empty<Action<EndpointBuilder>>(),
+ groupFinallyConventions: Array.Empty<Action<EndpointBuilder>>(),
createInertEndpoints: false);
// In some test scenarios there's no route so the endpoint isn't created. This is fine because
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelActivatorProvider.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelActivatorProvider.cs
index a8dfcf2967..ebf471a2bc 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelActivatorProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelActivatorProvider.cs
@@ -9,14 +9,14 @@ namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
/// <summary>
/// <see cref="IPageActivatorProvider"/> that uses type activation to create Razor Page instances.
/// </summary>
-internal class DefaultPageModelActivatorProvider : IPageModelActivatorProvider
+internal sealed class DefaultPageModelActivatorProvider : IPageModelActivatorProvider
{
private readonly Action<PageContext, object> _disposer = Dispose;
private readonly Func<PageContext, object, ValueTask> _asyncDisposer = DisposeAsync;
private readonly Func<PageContext, object, ValueTask> _syncAsyncDisposer = SyncDisposeAsync;
/// <inheritdoc />
- public virtual Func<PageContext, object> CreateActivator(CompiledPageActionDescriptor actionDescriptor)
+ public Func<PageContext, object> CreateActivator(CompiledPageActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
{
@@ -36,7 +36,7 @@ internal class DefaultPageModelActivatorProvider : IPageModelActivatorProvider
return (context) => factory(context.HttpContext.RequestServices, Array.Empty<object>());
}
- public virtual Action<PageContext, object>? CreateReleaser(CompiledPageActionDescriptor actionDescriptor)
+ public Action<PageContext, object>? CreateReleaser(CompiledPageActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
{
@@ -51,7 +51,7 @@ internal class DefaultPageModelActivatorProvider : IPageModelActivatorProvider
return null;
}
- public virtual Func<PageContext, object, ValueTask>? CreateAsyncReleaser(CompiledPageActionDescriptor actionDescriptor)
+ public Func<PageContext, object, ValueTask>? CreateAsyncReleaser(CompiledPageActionDescriptor actionDescriptor)
{
if (actionDescriptor == null)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelFactoryProvider.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelFactoryProvider.cs
index 5b0f0b71e0..928a5a77c3 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelFactoryProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DefaultPageModelFactoryProvider.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DefaultPageModelFactoryProvider : IPageModelFactoryProvider
+internal sealed class DefaultPageModelFactoryProvider : IPageModelFactoryProvider
{
private static readonly Func<PropertyInfo, PropertyActivator<PageContext>> _createActivateInfo =
CreateActivateInfo;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointMatcherPolicy.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointMatcherPolicy.cs
index 0ed65f3f93..fc826bb737 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointMatcherPolicy.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointMatcherPolicy.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DynamicPageEndpointMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
+internal sealed class DynamicPageEndpointMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
{
private readonly DynamicPageEndpointSelectorCache _selectorCache;
private readonly PageLoader _loader;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelector.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelector.cs
index 9417cb46d9..fd90a5b562 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelector.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelector.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DynamicPageEndpointSelector : IDisposable
+internal sealed class DynamicPageEndpointSelector : IDisposable
{
private readonly EndpointDataSource _dataSource;
private readonly DataSourceDependentCache<ActionSelectionTable<Endpoint>> _cache;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelectorCache.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelectorCache.cs
index afb2d327b5..0bc8079449 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelectorCache.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageEndpointSelectorCache.cs
@@ -8,7 +8,9 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
+#pragma warning disable CA1852 // Seal internal types
internal class DynamicPageEndpointSelectorCache
+#pragma warning restore CA1852 // Seal internal types
{
private readonly ConcurrentDictionary<int, EndpointDataSource> _dataSourceCache = new();
private readonly ConcurrentDictionary<int, DynamicPageEndpointSelector> _endpointSelectorCache = new();
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageMetadata.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageMetadata.cs
index b7d5ea08c5..f579fffb31 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageMetadata.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageMetadata.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DynamicPageMetadata : IDynamicEndpointMetadata
+internal sealed class DynamicPageMetadata : IDynamicEndpointMetadata
{
public DynamicPageMetadata(RouteValueDictionary values)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageRouteValueTransformerMetadata.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageRouteValueTransformerMetadata.cs
index 92500acca7..fa4fe32565 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageRouteValueTransformerMetadata.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/DynamicPageRouteValueTransformerMetadata.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Routing;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class DynamicPageRouteValueTransformerMetadata : IDynamicEndpointMetadata
+internal sealed class DynamicPageRouteValueTransformerMetadata : IDynamicEndpointMetadata
{
public DynamicPageRouteValueTransformerMetadata(Type selectorType, object? state)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/ExecutorFactory.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/ExecutorFactory.cs
index a4d9ac3048..a40adba372 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/ExecutorFactory.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/ExecutorFactory.cs
@@ -143,7 +143,7 @@ internal static class ExecutorFactory
}
}
- private class VoidHandlerMethod : HandlerMethod
+ private sealed class VoidHandlerMethod : HandlerMethod
{
private readonly Action<object, object?[]?> _thunk;
@@ -169,7 +169,7 @@ internal static class ExecutorFactory
}
}
- private class ActionResultHandlerMethod : HandlerMethod
+ private sealed class ActionResultHandlerMethod : HandlerMethod
{
private readonly Func<object, object?[]?, IActionResult?> _thunk;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSource.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSource.cs
index 3e51b5d948..0ce96cdbcf 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSource.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSource.cs
@@ -7,10 +7,11 @@ using Microsoft.AspNetCore.Mvc.Abstractions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Routing.Patterns;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class PageActionEndpointDataSource : ActionEndpointDataSourceBase
+internal sealed class PageActionEndpointDataSource : ActionEndpointDataSourceBase
{
private readonly ActionEndpointFactory _endpointFactory;
private readonly OrderedEndpointsSequenceProvider _orderSequence;
@@ -25,7 +26,7 @@ internal class PageActionEndpointDataSource : ActionEndpointDataSourceBase
DataSourceId = dataSourceIdProvider.CreateId();
_endpointFactory = endpointFactory;
_orderSequence = orderedEndpoints;
- DefaultBuilder = new PageActionEndpointConventionBuilder(Lock, Conventions);
+ DefaultBuilder = new PageActionEndpointConventionBuilder(Lock, Conventions, FinallyConventions);
// IMPORTANT: this needs to be the last thing we do in the constructor.
// Change notifications can happen immediately!
@@ -40,7 +41,13 @@ internal class PageActionEndpointDataSource : ActionEndpointDataSourceBase
// selection. Set to true by builder methods that do dynamic/fallback selection.
public bool CreateInertEndpoints { get; set; }
- protected override List<Endpoint> CreateEndpoints(IReadOnlyList<ActionDescriptor> actions, IReadOnlyList<Action<EndpointBuilder>> conventions)
+ protected override List<Endpoint> CreateEndpoints(
+ RoutePattern? groupPrefix,
+ IReadOnlyList<ActionDescriptor> actions,
+ IReadOnlyList<Action<EndpointBuilder>> conventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupConventions,
+ IReadOnlyList<Action<EndpointBuilder>> finallyConventions,
+ IReadOnlyList<Action<EndpointBuilder>> groupFinallyConventions)
{
var endpoints = new List<Endpoint>();
var routeNames = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
@@ -48,7 +55,16 @@ internal class PageActionEndpointDataSource : ActionEndpointDataSourceBase
{
if (actions[i] is PageActionDescriptor action)
{
- _endpointFactory.AddEndpoints(endpoints, routeNames, action, Array.Empty<ConventionalRouteEntry>(), conventions, CreateInertEndpoints);
+ _endpointFactory.AddEndpoints(endpoints,
+ routeNames,
+ action,
+ Array.Empty<ConventionalRouteEntry>(),
+ conventions: conventions,
+ groupConventions: groupConventions,
+ finallyConventions: finallyConventions,
+ groupFinallyConventions: groupFinallyConventions,
+ CreateInertEndpoints,
+ groupPrefix);
}
}
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs
index ebfebd6e3e..b882f1029f 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceFactory.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.Routing;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class PageActionEndpointDataSourceFactory
+internal sealed class PageActionEndpointDataSourceFactory
{
private readonly PageActionEndpointDataSourceIdProvider _dataSourceIdProvider;
private readonly IActionDescriptorCollectionProvider _actions;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceIdProvider.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceIdProvider.cs
index ce4bc56a9d..bcf263282c 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceIdProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionEndpointDataSourceIdProvider.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class PageActionEndpointDataSourceIdProvider
+internal sealed class PageActionEndpointDataSourceIdProvider
{
private int _nextId = 1;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvoker.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvoker.cs
index 0f1ce0e82c..4d011f46ae 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvoker.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvoker.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class PageActionInvoker : ResourceInvoker, IActionInvoker
+internal sealed class PageActionInvoker : ResourceInvoker, IActionInvoker
{
private readonly IPageHandlerMethodSelector _selector;
private readonly PageContext _pageContext;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvokerProvider.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvokerProvider.cs
index 90c7de652c..2e899465b4 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvokerProvider.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageActionInvokerProvider.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class PageActionInvokerProvider : IActionInvokerProvider
+internal sealed class PageActionInvokerProvider : IActionInvokerProvider
{
private readonly PageLoader _pageLoader;
private readonly PageActionInvokerCache _pageActionInvokerCache;
diff --git a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageEndpointDataSourceIdMetadata.cs b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageEndpointDataSourceIdMetadata.cs
index a700241956..de7d77e939 100644
--- a/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageEndpointDataSourceIdMetadata.cs
+++ b/src/Mvc/Mvc.RazorPages/src/Infrastructure/PageEndpointDataSourceIdMetadata.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
-internal class PageEndpointDataSourceIdMetadata
+internal sealed class PageEndpointDataSourceIdMetadata
{
public PageEndpointDataSourceIdMetadata(int id)
{
diff --git a/src/Mvc/Mvc.RazorPages/src/PageBase.cs b/src/Mvc/Mvc.RazorPages/src/PageBase.cs
index e6a57f7348..24c116012f 100644
--- a/src/Mvc/Mvc.RazorPages/src/PageBase.cs
+++ b/src/Mvc/Mvc.RazorPages/src/PageBase.cs
@@ -1397,7 +1397,7 @@ public abstract class PageBase : RazorPageBase
public async Task<bool> TryUpdateModelAsync<TModel>(
TModel model,
string prefix,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (model == null)
@@ -1486,7 +1486,7 @@ public abstract class PageBase : RazorPageBase
TModel model,
string prefix,
IValueProvider valueProvider,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (model == null)
diff --git a/src/Mvc/Mvc.RazorPages/src/PageModel.cs b/src/Mvc/Mvc.RazorPages/src/PageModel.cs
index e9876a78a5..a7f37c85af 100644
--- a/src/Mvc/Mvc.RazorPages/src/PageModel.cs
+++ b/src/Mvc/Mvc.RazorPages/src/PageModel.cs
@@ -286,7 +286,7 @@ public abstract class PageModel : IAsyncPageFilter, IPageFilter
protected internal async Task<bool> TryUpdateModelAsync<TModel>(
TModel model,
string name,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (model == null)
@@ -375,7 +375,7 @@ public abstract class PageModel : IAsyncPageFilter, IPageFilter
TModel model,
string name,
IValueProvider valueProvider,
- params Expression<Func<TModel, object>>[] includeExpressions)
+ params Expression<Func<TModel, object?>>[] includeExpressions)
where TModel : class
{
if (model == null)
diff --git a/src/Mvc/Mvc.RazorPages/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.RazorPages/src/PublicAPI.Shipped.txt
index 9c807f7cfd..8102a701f7 100644
--- a/src/Mvc/Mvc.RazorPages/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.RazorPages/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.CompiledPageActionDescriptorProvider.CompiledPageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageApplicationModelProvider!>! applicationModelProviders, Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager! applicationPartManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pageOptions) -> void
-~Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider.PageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptionsAccessor, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pagesOptionsAccessor) -> void
+Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.CompiledPageActionDescriptorProvider.CompiledPageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageApplicationModelProvider!>! applicationModelProviders, Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager! applicationPartManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pageOptions) -> void
+Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider.PageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptionsAccessor, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pagesOptionsAccessor) -> void
abstract Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageLoader.LoadAsync(Microsoft.AspNetCore.Mvc.RazorPages.PageActionDescriptor! actionDescriptor) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Mvc.RazorPages.CompiledPageActionDescriptor!>!
const Microsoft.AspNetCore.Mvc.Diagnostics.AfterHandlerMethodEventData.EventName = "Microsoft.AspNetCore.Mvc.AfterHandlerMethod" -> string!
const Microsoft.AspNetCore.Mvc.Diagnostics.AfterPageFilterOnPageHandlerExecutedEventData.EventName = "Microsoft.AspNetCore.Mvc.AfterOnPageHandlerExecuted" -> string!
diff --git a/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt
index ec27502669..012e19690a 100644
--- a/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.RazorPages/src/PublicAPI.Unshipped.txt
@@ -1,5 +1,10 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.CompiledPageActionDescriptorProvider.CompiledPageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageApplicationModelProvider!>! applicationModelProviders, Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager! applicationPartManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pageOptions) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider.PageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptionsAccessor, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pagesOptionsAccessor) -> void
-Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.CompiledPageActionDescriptorProvider.CompiledPageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageApplicationModelProvider!>! applicationModelProviders, Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartManager! applicationPartManager, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pageOptions) -> void
-Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure.PageActionDescriptorProvider.PageActionDescriptorProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationModels.IPageRouteModelProvider!>! pageRouteModelProviders, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcOptions!>! mvcOptionsAccessor, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.RazorPages.RazorPagesOptions!>! pagesOptionsAccessor) -> void
+*REMOVED*Microsoft.AspNetCore.Mvc.RazorPages.PageBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider! valueProvider, params System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+*REMOVED*Microsoft.AspNetCore.Mvc.RazorPages.PageBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, params System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+*REMOVED*Microsoft.AspNetCore.Mvc.RazorPages.PageModel.TryUpdateModelAsync<TModel>(TModel! model, string! name, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider! valueProvider, params System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+*REMOVED*Microsoft.AspNetCore.Mvc.RazorPages.PageModel.TryUpdateModelAsync<TModel>(TModel! model, string! name, params System.Linq.Expressions.Expression<System.Func<TModel!, object!>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Builder.PageActionEndpointConventionBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finalConvention) -> void
+Microsoft.AspNetCore.Mvc.RazorPages.PageBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider! valueProvider, params System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Mvc.RazorPages.PageBase.TryUpdateModelAsync<TModel>(TModel! model, string! prefix, params System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Mvc.RazorPages.PageModel.TryUpdateModelAsync<TModel>(TModel! model, string! name, Microsoft.AspNetCore.Mvc.ModelBinding.IValueProvider! valueProvider, params System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
+Microsoft.AspNetCore.Mvc.RazorPages.PageModel.TryUpdateModelAsync<TModel>(TModel! model, string! name, params System.Linq.Expressions.Expression<System.Func<TModel!, object?>!>![]! includeExpressions) -> System.Threading.Tasks.Task<bool>!
diff --git a/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs b/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs
index 9a603ca1af..41c8e15ca1 100644
--- a/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs
+++ b/src/Mvc/Mvc.RazorPages/test/ApplicationModels/DefaultPageApplicationModelProviderTest.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Reflection;
@@ -353,6 +353,14 @@ public class DefaultPageApplicationModelProviderTest
Assert.Equal(name, property.PropertyName);
Assert.NotNull(property.BindingInfo);
Assert.Equal(BindingSource.Query, property.BindingInfo.BindingSource);
+ },
+ property =>
+ {
+ var name = nameof(TestPageModel.TestService);
+ Assert.Equal(modelType.GetProperty(name), property.PropertyInfo);
+ Assert.Equal(name, property.PropertyName);
+ Assert.NotNull(property.BindingInfo);
+ Assert.Equal(BindingSource.Services, property.BindingInfo.BindingSource);
});
}
@@ -1058,6 +1066,9 @@ public class DefaultPageApplicationModelProviderTest
public override Task ExecuteAsync() => throw new NotImplementedException();
}
+ public interface ITestService
+ { }
+
[PageModel]
private class TestPageModel
{
@@ -1066,6 +1077,9 @@ public class DefaultPageApplicationModelProviderTest
[FromQuery]
public string Property2 { get; set; }
+ [FromServices]
+ public ITestService TestService { get; set; }
+
public void OnGetUser() { }
}
diff --git a/src/Mvc/Mvc.RazorPages/test/Infrastructure/DefaultPageLoaderTest.cs b/src/Mvc/Mvc.RazorPages/test/Infrastructure/DefaultPageLoaderTest.cs
index 483cab8c52..166884b5eb 100644
--- a/src/Mvc/Mvc.RazorPages/test/Infrastructure/DefaultPageLoaderTest.cs
+++ b/src/Mvc/Mvc.RazorPages/test/Infrastructure/DefaultPageLoaderTest.cs
@@ -35,7 +35,7 @@ public class DefaultPageLoaderTest
var compilerProvider = GetCompilerProvider();
var mvcOptions = Options.Create(new MvcOptions());
- var endpointFactory = new ActionEndpointFactory(Mock.Of<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(Mock.Of<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>(), Mock.Of<IServiceProvider>());
var provider1 = new Mock<IPageApplicationModelProvider>();
var provider2 = new Mock<IPageApplicationModelProvider>();
@@ -118,7 +118,7 @@ public class DefaultPageLoaderTest
var compilerProvider = GetCompilerProvider();
var mvcOptions = Options.Create(new MvcOptions());
- var endpointFactory = new ActionEndpointFactory(transformer.Object, Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(transformer.Object, Enumerable.Empty<IRequestDelegateFactory>(), Mock.Of<IServiceProvider>());
var provider = new Mock<IPageApplicationModelProvider>();
@@ -158,7 +158,7 @@ public class DefaultPageLoaderTest
var descriptor = new PageActionDescriptor();
var compilerProvider = GetCompilerProvider();
var mvcOptions = Options.Create(new MvcOptions());
- var endpointFactory = new ActionEndpointFactory(Mock.Of<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(Mock.Of<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>(), Mock.Of<IServiceProvider>());
var provider1 = new Mock<IPageApplicationModelProvider>();
provider1.SetupGet(p => p.Order).Returns(10);
@@ -235,7 +235,7 @@ public class DefaultPageLoaderTest
var compilerProvider = GetCompilerProvider();
var mvcOptions = Options.Create(new MvcOptions());
- var endpointFactory = new ActionEndpointFactory(transformer.Object, Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(transformer.Object, Enumerable.Empty<IRequestDelegateFactory>(), Mock.Of<IServiceProvider>());
var provider = new Mock<IPageApplicationModelProvider>();
@@ -297,7 +297,7 @@ public class DefaultPageLoaderTest
var compilerProvider = GetCompilerProvider();
var mvcOptions = Options.Create(new MvcOptions());
- var endpointFactory = new ActionEndpointFactory(transformer.Object, Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(transformer.Object, Enumerable.Empty<IRequestDelegateFactory>(), Mock.Of<IServiceProvider>());
var provider = new Mock<IPageApplicationModelProvider>();
@@ -334,7 +334,7 @@ public class DefaultPageLoaderTest
{
// Arrange
var mvcOptions = Options.Create(new MvcOptions());
- var endpointFactory = new ActionEndpointFactory(Mock.Of<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>());
+ var endpointFactory = new ActionEndpointFactory(Mock.Of<RoutePatternTransformer>(), Enumerable.Empty<IRequestDelegateFactory>(), Mock.Of<IServiceProvider>());
var loader = new DefaultPageLoader(
new[] { Mock.Of<IPageApplicationModelProvider>() },
Mock.Of<IViewCompilerProvider>(),
diff --git a/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageActionEndpointDataSourceTest.cs b/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageActionEndpointDataSourceTest.cs
index 4bcf50dfda..daf73d747f 100644
--- a/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageActionEndpointDataSourceTest.cs
+++ b/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageActionEndpointDataSourceTest.cs
@@ -1,10 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc.Abstractions;
+using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Microsoft.AspNetCore.Routing;
+using Microsoft.AspNetCore.Routing.Patterns;
using Moq;
namespace Microsoft.AspNetCore.Mvc.RazorPages.Infrastructure;
@@ -42,6 +45,7 @@ public class PageActionEndpointDataSourceTest : ActionEndpointDataSourceBaseTest
// Assert
Assert.Empty(endpoints);
}
+
[Fact]
public void Endpoints_AppliesConventions()
{
@@ -86,6 +90,176 @@ public class PageActionEndpointDataSourceTest : ActionEndpointDataSourceBaseTest
});
}
+ [Fact]
+ public void GroupedEndpoints_AppliesConventions_RouteSpecificMetadata()
+ {
+ // Arrange
+ var actions = new List<ActionDescriptor>
+ {
+ new PageActionDescriptor
+ {
+ AttributeRouteInfo = new AttributeRouteInfo()
+ {
+ Template = "/test",
+ },
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Test" },
+ { "controller", "Test" },
+ },
+ EndpointMetadata = new List<object>() { "A" }
+ },
+ new PageActionDescriptor
+ {
+ AttributeRouteInfo = new AttributeRouteInfo()
+ {
+ Template = "/test2",
+ },
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Test" },
+ { "controller", "Test" },
+ },
+ EndpointMetadata = new List<object>() { "B" }
+ },
+ };
+
+ var mockDescriptorProvider = new Mock<IActionDescriptorCollectionProvider>();
+ mockDescriptorProvider.Setup(m => m.ActionDescriptors).Returns(new ActionDescriptorCollection(actions, 0));
+
+ var dataSource = (PageActionEndpointDataSource)CreateDataSource(mockDescriptorProvider.Object);
+
+ dataSource.DefaultBuilder.Add((b) =>
+ {
+ b.Metadata.Add("Hi there");
+ });
+
+ // Act
+ var groupConventions = new List<Action<EndpointBuilder>>()
+ {
+ b => b.Metadata.Add(new GroupMetadata()),
+ b => b.Metadata.Add("group")
+ };
+ var sp = Mock.Of<IServiceProvider>();
+ var groupPattern = RoutePatternFactory.Parse("/group1");
+ var endpoints = dataSource.GetGroupedEndpoints(new RouteGroupContext
+ {
+ Prefix = groupPattern,
+ Conventions = groupConventions,
+ ApplicationServices = sp
+ });
+
+ // Assert
+ Assert.Collection(
+ endpoints.OfType<RouteEndpoint>().OrderBy(e => e.RoutePattern.RawText),
+ e =>
+ {
+ Assert.Equal("/group1/test", e.RoutePattern.RawText);
+ Assert.Same(actions[0], e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "group", "A", "Hi there" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ },
+ e =>
+ {
+ Assert.Equal("/group1/test2", e.RoutePattern.RawText);
+ Assert.Same(actions[1], e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "group", "B", "Hi there" }, e.Metadata.GetOrderedMetadata<string>());
+ Assert.NotNull(e.Metadata.GetMetadata<GroupMetadata>());
+ });
+ }
+
+ [Fact]
+ public void Endpoints_AppliesFinallyConventions_InFIFOOrder_Last()
+ {
+ // Arrange
+ var actions = new List<ActionDescriptor>
+ {
+ new PageActionDescriptor
+ {
+ AttributeRouteInfo = new AttributeRouteInfo()
+ {
+ Template = "/test",
+ },
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Test" },
+ { "controller", "Test" },
+ },
+ },
+ };
+
+ var mockDescriptorProvider = new Mock<IActionDescriptorCollectionProvider>();
+ mockDescriptorProvider.Setup(m => m.ActionDescriptors).Returns(new ActionDescriptorCollection(actions, 0));
+
+ var dataSource = (PageActionEndpointDataSource)CreateDataSource(mockDescriptorProvider.Object);
+
+ dataSource.DefaultBuilder.Finally((b) => b.Metadata.Add("A1"));
+ dataSource.DefaultBuilder.Finally((b) => b.Metadata.Add("A2"));
+
+ // Act
+ var endpoints = dataSource.Endpoints;
+
+ // Assert
+ Assert.Collection(
+ endpoints.OfType<RouteEndpoint>().OrderBy(e => e.RoutePattern.RawText),
+ e =>
+ {
+ Assert.Equal("/test", e.RoutePattern.RawText);
+ Assert.Same(actions[0], e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "A1", "A2" }, e.Metadata.GetOrderedMetadata<string>());
+ });
+ }
+
+ [Fact]
+ public void Endpoints_FinallyConvention_CanObserveMetadata()
+ {
+ // Arrange
+ var actions = new List<ActionDescriptor>
+ {
+ new PageActionDescriptor
+ {
+ AttributeRouteInfo = new AttributeRouteInfo()
+ {
+ Template = "/test",
+ },
+ RouteValues = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
+ {
+ { "action", "Test" },
+ { "controller", "Test" },
+ },
+ EndpointMetadata = new List<object>() { "initial-metadata" }
+ },
+ };
+
+ var mockDescriptorProvider = new Mock<IActionDescriptorCollectionProvider>();
+ mockDescriptorProvider.Setup(m => m.ActionDescriptors).Returns(new ActionDescriptorCollection(actions, 0));
+
+ var dataSource = (PageActionEndpointDataSource)CreateDataSource(mockDescriptorProvider.Object);
+
+ dataSource.DefaultBuilder.Finally((b) =>
+ {
+ if (b.Metadata.Any(md => md is string smd && smd == "initial-metadata"))
+ {
+ b.Metadata.Add("initial-metadata-observed");
+ }
+ });
+
+ // Act
+ var endpoints = dataSource.Endpoints;
+
+ // Assert
+ Assert.Collection(
+ endpoints.OfType<RouteEndpoint>().OrderBy(e => e.RoutePattern.RawText),
+ e =>
+ {
+ Assert.Equal("/test", e.RoutePattern.RawText);
+ Assert.Same(actions[0], e.Metadata.GetMetadata<ActionDescriptor>());
+ Assert.Equal(new[] { "initial-metadata", "initial-metadata-observed" }, e.Metadata.GetOrderedMetadata<string>());
+ });
+ }
+
+ private class GroupMetadata { }
+
private protected override ActionEndpointDataSourceBase CreateDataSource(IActionDescriptorCollectionProvider actions, ActionEndpointFactory endpointFactory)
{
return new PageActionEndpointDataSource(new PageActionEndpointDataSourceIdProvider(), actions, endpointFactory, new OrderedEndpointsSequenceProvider());
diff --git a/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageBinderFactoryTest.cs b/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageBinderFactoryTest.cs
index 9c67e6856c..44146dd568 100644
--- a/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageBinderFactoryTest.cs
+++ b/src/Mvc/Mvc.RazorPages/test/Infrastructure/PageBinderFactoryTest.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.ComponentModel.DataAnnotations;
@@ -838,6 +838,9 @@ public class PageBinderFactoryTest
}
}
+ private interface ITestService
+ { }
+
private class PageModelWithNoBoundProperties : PageModel
{
}
@@ -855,6 +858,9 @@ public class PageBinderFactoryTest
[FromQuery]
protected string FromQuery { get; set; }
+ [FromServices]
+ protected ITestService FromService { get; set; }
+
[FromRoute]
public static int FromRoute { get; set; }
@@ -869,6 +875,9 @@ public class PageBinderFactoryTest
[FromQuery]
protected string FromQuery { get; set; }
+ [FromServices]
+ protected ITestService FromService { get; set; }
+
[FromRoute]
public static int FromRoute { get; set; }
}
@@ -898,6 +907,9 @@ public class PageBinderFactoryTest
[FromForm]
public string PropertyWithNoValue { get; set; }
+ [FromServices]
+ public ITestService FromService { get; set; }
+
public override Task ExecuteAsync() => Task.FromResult(0);
}
@@ -911,6 +923,10 @@ public class PageBinderFactoryTest
[FromForm]
public string PropertyWithNoValue { get; set; }
+
+ [FromServices]
+ public ITestService FromService { get; set; }
+
}
private class PageModelWithDefaultValue
diff --git a/src/Mvc/Mvc.TagHelpers/src/CacheTagHelper.cs b/src/Mvc/Mvc.TagHelpers/src/CacheTagHelper.cs
index 520b7ed48d..86443ea525 100644
--- a/src/Mvc/Mvc.TagHelpers/src/CacheTagHelper.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/CacheTagHelper.cs
@@ -60,15 +60,8 @@ public class CacheTagHelper : CacheTagHelperBase
/// <inheritdoc />
public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
-
- if (output == null)
- {
- throw new ArgumentNullException(nameof(output));
- }
+ ArgumentNullException.ThrowIfNull(context);
+ ArgumentNullException.ThrowIfNull(output);
IHtmlContent content;
if (Enabled)
@@ -219,7 +212,7 @@ public class CacheTagHelper : CacheTagHelperBase
}
}
- private class CharBufferTextWriter : TextWriter
+ private sealed class CharBufferTextWriter : TextWriter
{
public CharBufferTextWriter()
{
@@ -246,7 +239,7 @@ public class CacheTagHelper : CacheTagHelperBase
}
}
- private class CharBufferHtmlContent : IHtmlContent
+ private sealed class CharBufferHtmlContent : IHtmlContent
{
private readonly PagedCharBuffer _buffer;
diff --git a/src/Mvc/Mvc.TagHelpers/src/CurrentValues.cs b/src/Mvc/Mvc.TagHelpers/src/CurrentValues.cs
index 481b2dcd12..ac6bca83d7 100644
--- a/src/Mvc/Mvc.TagHelpers/src/CurrentValues.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/CurrentValues.cs
@@ -5,7 +5,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Mvc.TagHelpers;
-internal class CurrentValues
+internal sealed class CurrentValues
{
public CurrentValues(ICollection<string> values)
{
diff --git a/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingDirectory.cs b/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingDirectory.cs
index 2f296a37ed..61431dfc16 100644
--- a/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingDirectory.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingDirectory.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
namespace Microsoft.AspNetCore.Mvc.TagHelpers;
-internal class FileProviderGlobbingDirectory : DirectoryInfoBase
+internal sealed class FileProviderGlobbingDirectory : DirectoryInfoBase
{
private const char DirectorySeparatorChar = '/';
private readonly IFileProvider _fileProvider;
@@ -19,10 +19,7 @@ internal class FileProviderGlobbingDirectory : DirectoryInfoBase
IFileInfo fileInfo,
FileProviderGlobbingDirectory parent)
{
- if (fileProvider == null)
- {
- throw new ArgumentNullException(nameof(fileProvider));
- }
+ ArgumentNullException.ThrowIfNull(fileProvider);
_fileProvider = fileProvider;
_fileInfo = fileInfo;
diff --git a/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingFile.cs b/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingFile.cs
index 0dd2c8599e..1c822baa8f 100644
--- a/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingFile.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/FileProviderGlobbingFile.cs
@@ -6,21 +6,14 @@ using Microsoft.Extensions.FileSystemGlobbing.Abstractions;
namespace Microsoft.AspNetCore.Mvc.TagHelpers;
-internal class FileProviderGlobbingFile : FileInfoBase
+internal sealed class FileProviderGlobbingFile : FileInfoBase
{
private const char DirectorySeparatorChar = '/';
public FileProviderGlobbingFile(IFileInfo fileInfo, DirectoryInfoBase parent)
{
- if (fileInfo == null)
- {
- throw new ArgumentNullException(nameof(fileInfo));
- }
-
- if (parent == null)
- {
- throw new ArgumentNullException(nameof(parent));
- }
+ ArgumentNullException.ThrowIfNull(fileInfo);
+ ArgumentNullException.ThrowIfNull(parent);
Name = fileInfo.Name;
ParentDirectory = parent;
diff --git a/src/Mvc/Mvc.TagHelpers/src/GlobbingUrlBuilder.cs b/src/Mvc/Mvc.TagHelpers/src/GlobbingUrlBuilder.cs
index 957d177c1c..126941841f 100644
--- a/src/Mvc/Mvc.TagHelpers/src/GlobbingUrlBuilder.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/GlobbingUrlBuilder.cs
@@ -31,15 +31,8 @@ public class GlobbingUrlBuilder
/// <param name="requestPathBase">The request path base.</param>
public GlobbingUrlBuilder(IFileProvider fileProvider, IMemoryCache cache, PathString requestPathBase)
{
- if (fileProvider == null)
- {
- throw new ArgumentNullException(nameof(fileProvider));
- }
-
- if (cache == null)
- {
- throw new ArgumentNullException(nameof(cache));
- }
+ ArgumentNullException.ThrowIfNull(fileProvider);
+ ArgumentNullException.ThrowIfNull(cache);
FileProvider = fileProvider;
Cache = cache;
@@ -176,7 +169,7 @@ public class GlobbingUrlBuilder
return (matchedUrls, sizeInBytes);
}
- private class PathComparer : IComparer<string>
+ private sealed class PathComparer : IComparer<string>
{
public int Compare(string x, string y)
{
@@ -310,15 +303,8 @@ public class GlobbingUrlBuilder
private static bool IsWhiteSpace(string value, int index)
{
- for (var i = 0; i < ValidAttributeWhitespaceChars.Length; i++)
- {
- if (value[index] == ValidAttributeWhitespaceChars[i])
- {
- return true;
- }
- }
-
- return false;
+ var ch = value[index];
+ return ValidAttributeWhitespaceChars.AsSpan().IndexOf(ch) != -1;
}
private static StringSegment Trim(StringSegment value)
diff --git a/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs b/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs
index c98b295afb..2c975e7b94 100644
--- a/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/InputTagHelper.cs
@@ -20,46 +20,46 @@ public class InputTagHelper : TagHelper
// Mapping from datatype names and data annotation hints to values for the <input/> element's "type" attribute.
private static readonly Dictionary<string, string> _defaultInputTypes =
- new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase)
- {
- { "HiddenInput", InputType.Hidden.ToString().ToLowerInvariant() },
- { "Password", InputType.Password.ToString().ToLowerInvariant() },
- { "Text", InputType.Text.ToString().ToLowerInvariant() },
- { "PhoneNumber", "tel" },
- { "Url", "url" },
- { "EmailAddress", "email" },
- { "Date", "date" },
- { "DateTime", "datetime-local" },
- { "DateTime-local", "datetime-local" },
- { nameof(DateTimeOffset), "text" },
- { "Time", "time" },
- { "Week", "week" },
- { "Month", "month" },
- { nameof(Byte), "number" },
- { nameof(SByte), "number" },
- { nameof(Int16), "number" },
- { nameof(UInt16), "number" },
- { nameof(Int32), "number" },
- { nameof(UInt32), "number" },
- { nameof(Int64), "number" },
- { nameof(UInt64), "number" },
- { nameof(Single), InputType.Text.ToString().ToLowerInvariant() },
- { nameof(Double), InputType.Text.ToString().ToLowerInvariant() },
- { nameof(Boolean), InputType.CheckBox.ToString().ToLowerInvariant() },
- { nameof(Decimal), InputType.Text.ToString().ToLowerInvariant() },
- { nameof(String), InputType.Text.ToString().ToLowerInvariant() },
- { nameof(IFormFile), "file" },
- { TemplateRenderer.IEnumerableOfIFormFileName, "file" },
+ new(StringComparer.OrdinalIgnoreCase)
+ {
+ { "HiddenInput", InputType.Hidden.ToString().ToLowerInvariant() },
+ { "Password", InputType.Password.ToString().ToLowerInvariant() },
+ { "Text", InputType.Text.ToString().ToLowerInvariant() },
+ { "PhoneNumber", "tel" },
+ { "Url", "url" },
+ { "EmailAddress", "email" },
+ { "Date", "date" },
+ { "DateTime", "datetime-local" },
+ { "DateTime-local", "datetime-local" },
+ { nameof(DateTimeOffset), "text" },
+ { "Time", "time" },
+ { "Week", "week" },
+ { "Month", "month" },
+ { nameof(Byte), "number" },
+ { nameof(SByte), "number" },
+ { nameof(Int16), "number" },
+ { nameof(UInt16), "number" },
+ { nameof(Int32), "number" },
+ { nameof(UInt32), "number" },
+ { nameof(Int64), "number" },
+ { nameof(UInt64), "number" },
+ { nameof(Single), InputType.Text.ToString().ToLowerInvariant() },
+ { nameof(Double), InputType.Text.ToString().ToLowerInvariant() },
+ { nameof(Boolean), InputType.CheckBox.ToString().ToLowerInvariant() },
+ { nameof(Decimal), InputType.Text.ToString().ToLowerInvariant() },
+ { nameof(String), InputType.Text.ToString().ToLowerInvariant() },
+ { nameof(IFormFile), "file" },
+ { TemplateRenderer.IEnumerableOfIFormFileName, "file" },
};
// Mapping from <input/> element's type to RFC 3339 date and time formats.
private static readonly Dictionary<string, string> _rfc3339Formats =
- new Dictionary<string, string>(StringComparer.Ordinal)
+ new(StringComparer.Ordinal)
{
- { "date", "{0:yyyy-MM-dd}" },
- { "datetime", @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}" },
- { "datetime-local", @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}" },
- { "time", @"{0:HH\:mm\:ss.fff}" },
+ { "date", "{0:yyyy-MM-dd}" },
+ { "datetime", @"{0:yyyy-MM-ddTHH\:mm\:ss.fffK}" },
+ { "datetime-local", @"{0:yyyy-MM-ddTHH\:mm\:ss.fff}" },
+ { "time", @"{0:HH\:mm\:ss.fff}" },
};
/// <summary>
@@ -243,8 +243,18 @@ public class InputTagHelper : TagHelper
if (tagBuilder != null)
{
- // This TagBuilder contains the one <input/> element of interest.
+ // This TagBuilder contains the primary <input/> element of interest.
output.MergeAttributes(tagBuilder);
+
+ if (tagBuilder.Attributes.TryGetValue("name", out var fullName) &&
+ ViewContext.FormContext.InvariantField(fullName))
+ {
+ // If the value attribute used culture-invariant formatting, output a hidden
+ // <input/> element so the form submission includes an entry indicating such.
+ // This lets the model binding logic decide which CultureInfo to use when parsing form entries.
+ GenerateInvariantCultureMetadata(fullName, output.PostElement);
+ }
+
if (tagBuilder.HasInnerHtml)
{
// Since this is not the "checkbox" special-case, no guarantee that output is a self-closing
@@ -410,6 +420,14 @@ public class InputTagHelper : TagHelper
htmlAttributes);
}
+ private static void GenerateInvariantCultureMetadata(string propertyName, TagHelperContent builder)
+ => builder
+ .AppendHtml("<input name=\"")
+ .Append(FormValueHelper.CultureInvariantFieldName)
+ .AppendHtml("\" type=\"hidden\" value=\"")
+ .Append(propertyName)
+ .AppendHtml("\" />");
+
// Imitate Generator.GenerateHidden() using Generator.GenerateTextBox(). This adds support for asp-format that
// is not available in Generator.GenerateHidden().
private TagBuilder GenerateHidden(ModelExplorer modelExplorer, IDictionary<string, object> htmlAttributes)
diff --git a/src/Mvc/Mvc.TagHelpers/src/ModeAttributesOfT.cs b/src/Mvc/Mvc.TagHelpers/src/ModeAttributesOfT.cs
index 9c26f9f759..7c790ae787 100644
--- a/src/Mvc/Mvc.TagHelpers/src/ModeAttributesOfT.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/ModeAttributesOfT.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Mvc.TagHelpers;
/// A mapping of a <see cref="AspNetCore.Razor.TagHelpers.ITagHelper"/> mode to its required attributes.
/// </summary>
/// <typeparam name="TMode">The type representing the <see cref="AspNetCore.Razor.TagHelpers.ITagHelper"/>'s mode.</typeparam>
-internal class ModeAttributes<TMode>
+internal sealed class ModeAttributes<TMode>
{
/// <summary>
/// Initializes a new instance of <see cref="ModeAttributes{TMode}"/>.
diff --git a/src/Mvc/Mvc.TagHelpers/src/PersistComponentStateTagHelper.cs b/src/Mvc/Mvc.TagHelpers/src/PersistComponentStateTagHelper.cs
index a6211d8c63..c8ef81be83 100644
--- a/src/Mvc/Mvc.TagHelpers/src/PersistComponentStateTagHelper.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/PersistComponentStateTagHelper.cs
@@ -92,7 +92,7 @@ public class PersistComponentStateTagHelper : TagHelper
}
}
- private class ComponentStateHtmlContent : IHtmlContent
+ private sealed class ComponentStateHtmlContent : IHtmlContent
{
private PrerenderComponentApplicationStore _store;
diff --git a/src/Mvc/Mvc.TagHelpers/src/TagHelperOutputExtensions.cs b/src/Mvc/Mvc.TagHelpers/src/TagHelperOutputExtensions.cs
index 3ff0d85d12..8acb3ee4fa 100644
--- a/src/Mvc/Mvc.TagHelpers/src/TagHelperOutputExtensions.cs
+++ b/src/Mvc/Mvc.TagHelpers/src/TagHelperOutputExtensions.cs
@@ -41,20 +41,9 @@ public static class TagHelperOutputExtensions
string attributeName,
TagHelperContext context)
{
- if (tagHelperOutput == null)
- {
- throw new ArgumentNullException(nameof(tagHelperOutput));
- }
-
- if (attributeName == null)
- {
- throw new ArgumentNullException(nameof(attributeName));
- }
-
- if (context == null)
- {
- throw new ArgumentNullException(nameof(context));
- }
+ ArgumentNullException.ThrowIfNull(tagHelperOutput);
+ ArgumentNullException.ThrowIfNull(attributeName);
+ ArgumentNullException.ThrowIfNull(context);
if (!tagHelperOutput.Attributes.ContainsName(attributeName))
{
@@ -95,15 +84,8 @@ public static class TagHelperOutputExtensions
/// are not overridden; "class" attributes are merged with spaces.</remarks>
public static void MergeAttributes(this TagHelperOutput tagHelperOutput, TagBuilder tagBuilder)
{
- if (tagHelperOutput == null)
- {
- throw new ArgumentNullException(nameof(tagHelperOutput));
- }
-
- if (tagBuilder == null)
- {
- throw new ArgumentNullException(nameof(tagBuilder));
- }
+ ArgumentNullException.ThrowIfNull(tagHelperOutput);
+ ArgumentNullException.ThrowIfNull(tagBuilder);
foreach (var attribute in tagBuilder.Attributes)
{
@@ -136,15 +118,8 @@ public static class TagHelperOutputExtensions
this TagHelperOutput tagHelperOutput,
IEnumerable<TagHelperAttribute> attributes)
{
- if (tagHelperOutput == null)
- {
- throw new ArgumentNullException(nameof(tagHelperOutput));
- }
-
- if (attributes == null)
- {
- throw new ArgumentNullException(nameof(attributes));
- }
+ ArgumentNullException.ThrowIfNull(tagHelperOutput);
+ ArgumentNullException.ThrowIfNull(attributes);
foreach (var attribute in attributes.ToArray())
{
@@ -164,10 +139,7 @@ public static class TagHelperOutputExtensions
string classValue,
HtmlEncoder htmlEncoder)
{
- if (tagHelperOutput == null)
- {
- throw new ArgumentNullException(nameof(tagHelperOutput));
- }
+ ArgumentNullException.ThrowIfNull(tagHelperOutput);
if (string.IsNullOrEmpty(classValue))
{
@@ -226,10 +198,7 @@ public static class TagHelperOutputExtensions
string classValue,
HtmlEncoder htmlEncoder)
{
- if (tagHelperOutput == null)
- {
- throw new ArgumentNullException(nameof(tagHelperOutput));
- }
+ ArgumentNullException.ThrowIfNull(tagHelperOutput);
var encodedSpaceChars = SpaceChars.Where(x => !x.Equals('\u0020')).Select(x => htmlEncoder.Encode(x.ToString())).ToArray();
@@ -254,7 +223,7 @@ public static class TagHelperOutputExtensions
if (string.Equals(currentClassValue, encodedClassValue, StringComparison.Ordinal))
{
- tagHelperOutput.Attributes.Remove(tagHelperOutput.Attributes["class"]);
+ tagHelperOutput.Attributes.Remove(classAttribute);
return;
}
@@ -276,12 +245,12 @@ public static class TagHelperOutputExtensions
if (listOfClasses.Count > 0)
{
- var joinedClasses = new HtmlString(string.Join(" ", listOfClasses));
+ var joinedClasses = new HtmlString(string.Join(' ', listOfClasses));
tagHelperOutput.Attributes.SetAttribute(classAttribute.Name, joinedClasses);
}
else
{
- tagHelperOutput.Attributes.Remove(tagHelperOutput.Attributes["class"]);
+ tagHelperOutput.Attributes.Remove(classAttribute);
}
}
@@ -368,7 +337,7 @@ public static class TagHelperOutputExtensions
return -1;
}
- private class ClassAttributeHtmlContent : IHtmlContent
+ private sealed class ClassAttributeHtmlContent : IHtmlContent
{
private readonly object _left;
private readonly string _right;
@@ -381,15 +350,8 @@ public static class TagHelperOutputExtensions
public void WriteTo(TextWriter writer, HtmlEncoder encoder)
{
- if (writer == null)
- {
- throw new ArgumentNullException(nameof(writer));
- }
-
- if (encoder == null)
- {
- throw new ArgumentNullException(nameof(encoder));
- }
+ ArgumentNullException.ThrowIfNull(writer);
+ ArgumentNullException.ThrowIfNull(encoder);
// Write out "{left} {right}" in the common nothing-empty case.
var wroteLeft = false;
diff --git a/src/Mvc/Mvc.TagHelpers/test/InputTagHelperTest.cs b/src/Mvc/Mvc.TagHelpers/test/InputTagHelperTest.cs
index 38900c3f2c..3de975a818 100644
--- a/src/Mvc/Mvc.TagHelpers/test/InputTagHelperTest.cs
+++ b/src/Mvc/Mvc.TagHelpers/test/InputTagHelperTest.cs
@@ -833,6 +833,75 @@ public class InputTagHelperTest
Assert.Equal(expectedTagName, output.TagName);
}
+ [Theory]
+ [InlineData("SomeProperty", "SomeProperty", true)]
+ [InlineData("SomeProperty", "[0].SomeProperty", true)]
+ [InlineData("SomeProperty", "[0].SomeProperty", false)]
+ public void Process_GeneratesInvariantCultureMetadataInput_WhenValueUsesInvariantFormatting(string propertyName, string nameAttributeValue, bool usesInvariantFormatting)
+ {
+ // Arrange
+ var metadataProvider = new EmptyModelMetadataProvider();
+ var htmlGenerator = new Mock<IHtmlGenerator>(MockBehavior.Strict);
+ var model = false;
+ var modelExplorer = metadataProvider.GetModelExplorerForType(typeof(bool), model);
+ var modelExpression = new ModelExpression(name: string.Empty, modelExplorer: modelExplorer);
+ var viewContext = TestableHtmlGenerator.GetViewContext(model, htmlGenerator.Object, metadataProvider);
+ var tagHelper = new InputTagHelper(htmlGenerator.Object)
+ {
+ For = modelExpression,
+ InputTypeName = "text",
+ Name = propertyName,
+ ViewContext = viewContext,
+ };
+
+ var tagBuilder = new TagBuilder("input")
+ {
+ TagRenderMode = TagRenderMode.SelfClosing,
+ Attributes =
+ {
+ { "name", nameAttributeValue },
+ },
+ };
+
+ htmlGenerator
+ .Setup(mock => mock.GenerateTextBox(
+ tagHelper.ViewContext,
+ tagHelper.For.ModelExplorer,
+ tagHelper.For.Name,
+ modelExplorer.Model,
+ null, // format
+ It.IsAny<object>())) // htmlAttributes
+ .Returns(tagBuilder)
+ .Callback(() => viewContext.FormContext.InvariantField(tagBuilder.Attributes["name"], usesInvariantFormatting))
+ .Verifiable();
+
+ var expectedPostElement = usesInvariantFormatting
+ ? $"<input name=\"__Invariant\" type=\"hidden\" value=\"{tagBuilder.Attributes["name"]}\" />"
+ : string.Empty;
+
+ var attributes = new TagHelperAttributeList
+ {
+ { "name", propertyName },
+ { "type", "text" },
+ };
+ var context = new TagHelperContext(attributes, new Dictionary<object, object>(), "test");
+ var output = new TagHelperOutput(
+ "input",
+ new TagHelperAttributeList(),
+ getChildContentAsync: (useCachedResult, encoder) => Task.FromResult<TagHelperContent>(result: null))
+ {
+ TagMode = TagMode.SelfClosing,
+ };
+
+ // Act
+ tagHelper.Process(context, output);
+
+ // Assert
+ htmlGenerator.Verify();
+
+ Assert.Equal(expectedPostElement, output.PostElement.GetContent());
+ }
+
[Fact]
public async Task ProcessAsync_GenerateCheckBox_WithHiddenInputRenderModeNone()
{
diff --git a/src/Mvc/Mvc.Testing/src/DeferredHostBuilder.cs b/src/Mvc/Mvc.Testing/src/DeferredHostBuilder.cs
index f1f6c89219..e6139166a1 100644
--- a/src/Mvc/Mvc.Testing/src/DeferredHostBuilder.cs
+++ b/src/Mvc/Mvc.Testing/src/DeferredHostBuilder.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.Mvc.Testing;
// This host builder captures calls to the IHostBuilder then replays them in the call to ConfigureHostBuilder
-internal class DeferredHostBuilder : IHostBuilder
+internal sealed class DeferredHostBuilder : IHostBuilder
{
public IDictionary<object, object> Properties { get; } = new Dictionary<object, object>();
@@ -115,7 +115,7 @@ internal class DeferredHostBuilder : IHostBuilder
_hostFactory = hostFactory;
}
- private class DeferredHost : IHost, IAsyncDisposable
+ private sealed class DeferredHost : IHost, IAsyncDisposable
{
private readonly IHost _host;
private readonly TaskCompletionSource _hostStartedTcs;
diff --git a/src/Mvc/Mvc.Testing/src/Handlers/RedirectHandler.cs b/src/Mvc/Mvc.Testing/src/Handlers/RedirectHandler.cs
index 714bbfb318..06f72a0cef 100644
--- a/src/Mvc/Mvc.Testing/src/Handlers/RedirectHandler.cs
+++ b/src/Mvc/Mvc.Testing/src/Handlers/RedirectHandler.cs
@@ -144,9 +144,7 @@ public class RedirectHandler : DelegatingHandler
{
if (!location.IsAbsoluteUri && response.RequestMessage.RequestUri is Uri requestUri)
{
- location = new Uri(
- new Uri(requestUri.GetLeftPart(UriPartial.Authority)),
- location);
+ location = new Uri(requestUri, location);
}
redirect.RequestUri = location;
diff --git a/src/Mvc/Mvc.Testing/src/Microsoft.AspNetCore.Mvc.Testing.targets b/src/Mvc/Mvc.Testing/src/Microsoft.AspNetCore.Mvc.Testing.targets
index 51d08a822b..b65b055985 100644
--- a/src/Mvc/Mvc.Testing/src/Microsoft.AspNetCore.Mvc.Testing.targets
+++ b/src/Mvc/Mvc.Testing/src/Microsoft.AspNetCore.Mvc.Testing.targets
@@ -31,7 +31,7 @@
<Target Name="_AddContentRootForProjectReferences" BeforeTargets="PrepareResources" DependsOnTargets="_ResolveMvcTestProjectReferences">
<ItemGroup Condition="'@(_ContentRootProjectReferences->Count())' != '0'">
<_ManifestProjects Include="%(_ContentRootProjectReferences.FusionName)">
- <ContentRoot>$([System.IO.Path]::GetDirectoryName(%(_ContentRootProjectReferences.MSBuildSourceProjectFile)))</ContentRoot>
+ <ContentRoot>$([System.IO.Path]::GetDirectoryName('%(_ContentRootProjectReferences.MSBuildSourceProjectFile)'))</ContentRoot>
</_ManifestProjects>
</ItemGroup>
@@ -46,7 +46,7 @@
</ItemGroup>
</Target>
- <Target Name="_GeneratePublishTestManifest" BeforeTargets="Publish" DependsOnTargets="_ResolveMvcTestProjectReferences">
+ <Target Name="_GeneratePublishTestManifest" Condition="$(IsPublishable) == 'true'" BeforeTargets="Publish" DependsOnTargets="_ResolveMvcTestProjectReferences">
<ItemGroup>
<_PublishManifestProjects Include="%(_ContentRootProjectReferences.FusionName)">
<ContentRoot>~</ContentRoot>
diff --git a/src/Mvc/Mvc.Testing/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.Testing/src/PublicAPI.Shipped.txt
index 73a3d39234..1fc4c320ac 100644
--- a/src/Mvc/Mvc.Testing/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.Testing/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory<TEntryPoint>
+Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory<TEntryPoint>
Microsoft.AspNetCore.Mvc.Testing.Handlers.CookieContainerHandler
Microsoft.AspNetCore.Mvc.Testing.Handlers.CookieContainerHandler.Container.get -> System.Net.CookieContainer!
Microsoft.AspNetCore.Mvc.Testing.Handlers.CookieContainerHandler.CookieContainerHandler() -> void
diff --git a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs
index 8a62d53121..4d458ed837 100644
--- a/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs
+++ b/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs
@@ -603,7 +603,7 @@ public class WebApplicationFactory<TEntryPoint> : IDisposable, IAsyncDisposable
GC.SuppressFinalize(this);
}
- private class DelegatedWebApplicationFactory : WebApplicationFactory<TEntryPoint>
+ private sealed class DelegatedWebApplicationFactory : WebApplicationFactory<TEntryPoint>
{
private readonly Func<IWebHostBuilder, TestServer> _createServer;
private readonly Func<IHostBuilder, IHost> _createHost;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/AntiforgeryExtensions.cs b/src/Mvc/Mvc.ViewFeatures/src/AntiforgeryExtensions.cs
index 4bbed321bd..cda0eb567e 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/AntiforgeryExtensions.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/AntiforgeryExtensions.cs
@@ -44,7 +44,7 @@ public static class AntiforgeryExtensions
return new InputContent(tokenSet);
}
- private class InputContent : IHtmlContent
+ private sealed class InputContent : IHtmlContent
{
private readonly string _fieldName;
private readonly string _requestToken;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/AttributeDictionary.cs b/src/Mvc/Mvc.ViewFeatures/src/AttributeDictionary.cs
index 2a29947e6c..7381351190 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/AttributeDictionary.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/AttributeDictionary.cs
@@ -384,7 +384,7 @@ public class AttributeDictionary : IDictionary<string, string?>, IReadOnlyDictio
}
}
- private class KeyCollection : ICollection<string>
+ private sealed class KeyCollection : ICollection<string>
{
private readonly AttributeDictionary _attributes;
@@ -497,7 +497,7 @@ public class AttributeDictionary : IDictionary<string, string?>, IReadOnlyDictio
}
}
- private class ValueCollection : ICollection<string?>
+ private sealed class ValueCollection : ICollection<string?>
{
private readonly AttributeDictionary _attributes;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ArrayPoolBufferSource.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ArrayPoolBufferSource.cs
index fdbfdb26aa..b28052933e 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ArrayPoolBufferSource.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ArrayPoolBufferSource.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Buffers;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
-internal class ArrayPoolBufferSource : ICharBufferSource
+internal sealed class ArrayPoolBufferSource : ICharBufferSource
{
private readonly ArrayPool<char> _pool;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/CharArrayBufferSource.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/CharArrayBufferSource.cs
index bfb08a18a6..45d0a56016 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/CharArrayBufferSource.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/CharArrayBufferSource.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
-internal class CharArrayBufferSource : ICharBufferSource
+internal sealed class CharArrayBufferSource : ICharBufferSource
{
public static readonly CharArrayBufferSource Instance = new CharArrayBufferSource();
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/MemoryPoolViewBufferScope.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/MemoryPoolViewBufferScope.cs
index 7baf590be0..f3fce33228 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/MemoryPoolViewBufferScope.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/MemoryPoolViewBufferScope.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
/// <summary>
/// A <see cref="IViewBufferScope"/> that uses pooled memory.
/// </summary>
-internal class MemoryPoolViewBufferScope : IViewBufferScope, IDisposable
+internal sealed class MemoryPoolViewBufferScope : IViewBufferScope, IDisposable
{
public const int MinimumSize = 16;
private readonly ArrayPool<ViewBufferValue> _viewBufferPool;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs
index 617da0e201..2d2fe5e9a5 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedBufferedTextWriter.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Buffers;
@@ -8,7 +8,7 @@ using System.Text;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
-internal class PagedBufferedTextWriter : TextWriter
+internal sealed class PagedBufferedTextWriter : TextWriter
{
private readonly TextWriter _inner;
private readonly PagedCharBuffer _charBuffer;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedCharBuffer.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedCharBuffer.cs
index 01e8443a1c..c4b76c2e60 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedCharBuffer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/PagedCharBuffer.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
-internal class PagedCharBuffer : IDisposable
+internal sealed class PagedCharBuffer : IDisposable
{
public const int PageSize = 1024;
private int _charIndex;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBuffer.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBuffer.cs
index 089dd03231..19df452286 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBuffer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBuffer.cs
@@ -385,7 +385,7 @@ internal sealed class ViewBuffer : IHtmlContentBuilder
Clear();
}
- private class EncodingWrapper : IHtmlContent
+ private sealed class EncodingWrapper : IHtmlContent
{
private readonly string _unencoded;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferPage.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferPage.cs
index 74fa311817..e688bf5147 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferPage.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferPage.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Runtime.CompilerServices;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
-internal class ViewBufferPage
+internal sealed class ViewBufferPage
{
public ViewBufferPage(ViewBufferValue[] buffer)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferTextWriter.cs b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferTextWriter.cs
index d528dcab02..67059c8982 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferTextWriter.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Buffers/ViewBufferTextWriter.cs
@@ -17,7 +17,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
/// the writer and switches to writing to the unbuffered writer for all further write operations.
/// </para>
/// </summary>
-internal class ViewBufferTextWriter : TextWriter
+internal sealed class ViewBufferTextWriter : TextWriter
{
private readonly TextWriter _inner;
private readonly HtmlEncoder _htmlEncoder;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/DefaultEditorTemplates.cs b/src/Mvc/Mvc.ViewFeatures/src/DefaultEditorTemplates.cs
index 1d117de4d4..7129c282a8 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/DefaultEditorTemplates.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/DefaultEditorTemplates.cs
@@ -460,7 +460,7 @@ internal static class DefaultEditorTemplates
htmlAttributes: htmlAttributes);
}
- private class HasContentTextWriter : TextWriter
+ private sealed class HasContentTextWriter : TextWriter
{
public bool HasContent { get; private set; }
@@ -489,7 +489,7 @@ internal static class DefaultEditorTemplates
// An HTML encoder which passes through all input data. Does no encoding.
// Copied from Microsoft.AspNetCore.Razor.TagHelpers.NullHtmlEncoder.
- private class PassThroughHtmlEncoder : HtmlEncoder
+ private sealed class PassThroughHtmlEncoder : HtmlEncoder
{
private PassThroughHtmlEncoder()
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/DefaultHtmlGenerator.cs b/src/Mvc/Mvc.ViewFeatures/src/DefaultHtmlGenerator.cs
index ce1675bbdd..f1ebb42a3d 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/DefaultHtmlGenerator.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/DefaultHtmlGenerator.cs
@@ -40,6 +40,7 @@ public class DefaultHtmlGenerator : IHtmlGenerator
private readonly IUrlHelperFactory _urlHelperFactory;
private readonly HtmlEncoder _htmlEncoder;
private readonly ValidationHtmlAttributeProvider _validationAttributeProvider;
+ private readonly FormInputRenderMode _formInputRenderMode;
/// <summary>
/// Initializes a new instance of the <see cref="DefaultHtmlGenerator"/> class.
@@ -94,6 +95,7 @@ public class DefaultHtmlGenerator : IHtmlGenerator
_urlHelperFactory = urlHelperFactory;
_htmlEncoder = htmlEncoder;
_validationAttributeProvider = validationAttributeProvider;
+ _formInputRenderMode = optionsAccessor.Value.HtmlHelperOptions.FormInputRenderMode;
// Underscores are fine characters in id's.
IdAttributeDotReplacement = optionsAccessor.Value.HtmlHelperOptions.IdAttributeDotReplacement;
@@ -134,7 +136,12 @@ public class DefaultHtmlGenerator : IHtmlGenerator
/// <inheritdoc />
public string FormatValue(object value, string format)
{
- return ViewDataDictionary.FormatValue(value, format);
+ return ViewDataDictionary.FormatValue(value, format, CultureInfo.CurrentCulture);
+ }
+
+ private static string FormatValue(object value, string format, IFormatProvider formatProvider)
+ {
+ return ViewDataDictionary.FormatValue(value, format, formatProvider);
}
/// <inheritdoc />
@@ -1282,7 +1289,18 @@ public class DefaultHtmlGenerator : IHtmlGenerator
AddMaxLengthAttribute(viewContext.ViewData, tagBuilder, modelExplorer, expression);
}
- var valueParameter = FormatValue(value, format);
+ CultureInfo culture;
+ if (ShouldUseInvariantFormattingForInputType(suppliedTypeString, viewContext.Html5DateRenderingMode))
+ {
+ culture = CultureInfo.InvariantCulture;
+ viewContext.FormContext.InvariantField(fullName, true);
+ }
+ else
+ {
+ culture = CultureInfo.CurrentCulture;
+ }
+
+ var valueParameter = FormatValue(value, format, culture);
var usedModelState = false;
switch (inputType)
{
@@ -1329,29 +1347,16 @@ public class DefaultHtmlGenerator : IHtmlGenerator
case InputType.Text:
default:
- var attributeValue = (string)GetModelStateValue(viewContext, fullName, typeof(string));
- if (attributeValue == null)
- {
- attributeValue = useViewData ? EvalString(viewContext, expression, format) : valueParameter;
- }
-
- var addValue = true;
- object typeAttributeValue;
- if (htmlAttributes != null && htmlAttributes.TryGetValue("type", out typeAttributeValue))
+ if (string.Equals(suppliedTypeString, "file", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(suppliedTypeString, "image", StringComparison.OrdinalIgnoreCase))
{
- var typeAttributeString = typeAttributeValue.ToString();
- if (string.Equals(typeAttributeString, "file", StringComparison.OrdinalIgnoreCase) ||
- string.Equals(typeAttributeString, "image", StringComparison.OrdinalIgnoreCase))
- {
- // 'value' attribute is not needed for 'file' and 'image' input types.
- addValue = false;
- }
+ // 'value' attribute is not needed for 'file' and 'image' input types.
+ break;
}
- if (addValue)
- {
- tagBuilder.MergeAttribute("value", attributeValue, replaceExisting: isExplicitValue);
- }
+ var attributeValue = (string)GetModelStateValue(viewContext, fullName, typeof(string));
+ attributeValue ??= useViewData ? EvalString(viewContext, expression, format) : valueParameter;
+ tagBuilder.MergeAttribute("value", attributeValue, replaceExisting: isExplicitValue);
break;
}
@@ -1556,6 +1561,38 @@ public class DefaultHtmlGenerator : IHtmlGenerator
}
}
+ private bool ShouldUseInvariantFormattingForInputType(string inputType, Html5DateRenderingMode dateRenderingMode)
+ {
+ if (_formInputRenderMode == FormInputRenderMode.DetectCultureFromInputType)
+ {
+ var isNumberInput =
+ string.Equals(inputType, "number", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(inputType, "range", StringComparison.OrdinalIgnoreCase);
+
+ if (isNumberInput)
+ {
+ return true;
+ }
+
+ if (dateRenderingMode != Html5DateRenderingMode.CurrentCulture)
+ {
+ var isDateInput =
+ string.Equals(inputType, "date", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(inputType, "datetime-local", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(inputType, "month", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(inputType, "time", StringComparison.OrdinalIgnoreCase) ||
+ string.Equals(inputType, "week", StringComparison.OrdinalIgnoreCase);
+
+ if (isDateInput)
+ {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
private static IEnumerable<SelectListItem> GetSelectListItems(
ViewContext viewContext,
string expression)
diff --git a/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/MvcViewOptionsSetup.cs b/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/MvcViewOptionsSetup.cs
index ca50127079..66a4d07f1a 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/MvcViewOptionsSetup.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/MvcViewOptionsSetup.cs
@@ -11,7 +11,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Sets up default options for <see cref="MvcViewOptions"/>.
/// </summary>
-internal class MvcViewOptionsSetup : IConfigureOptions<MvcViewOptions>
+internal sealed class MvcViewOptionsSetup : IConfigureOptions<MvcViewOptions>
{
private readonly IOptions<MvcDataAnnotationsLocalizationOptions> _dataAnnotationsLocalizationOptions;
private readonly IValidationAttributeAdapterProvider _validationAttributeAdapterProvider;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/TempDataMvcOptionsSetup.cs b/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/TempDataMvcOptionsSetup.cs
index 409249e32e..2e909fecf1 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/TempDataMvcOptionsSetup.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/DependencyInjection/TempDataMvcOptionsSetup.cs
@@ -10,7 +10,7 @@ namespace Microsoft.Extensions.DependencyInjection;
/// <summary>
/// Sets up default options for <see cref="MvcOptions"/>.
/// </summary>
-internal class TempDataMvcOptionsSetup : IConfigureOptions<MvcOptions>
+internal sealed class TempDataMvcOptionsSetup : IConfigureOptions<MvcOptions>
{
public void Configure(MvcOptions options)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/DynamicViewData.cs b/src/Mvc/Mvc.ViewFeatures/src/DynamicViewData.cs
index 2bf425075b..766fea2a66 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/DynamicViewData.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/DynamicViewData.cs
@@ -5,7 +5,7 @@ using System.Dynamic;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class DynamicViewData : DynamicObject
+internal sealed class DynamicViewData : DynamicObject
{
private readonly Func<ViewDataDictionary> _viewDataFunc;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/AutoValidateAntiforgeryTokenAuthorizationFilter.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/AutoValidateAntiforgeryTokenAuthorizationFilter.cs
index c2ef307164..a8c0563336 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/AutoValidateAntiforgeryTokenAuthorizationFilter.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/AutoValidateAntiforgeryTokenAuthorizationFilter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class AutoValidateAntiforgeryTokenAuthorizationFilter : ValidateAntiforgeryTokenAuthorizationFilter
+internal sealed class AutoValidateAntiforgeryTokenAuthorizationFilter : ValidateAntiforgeryTokenAuthorizationFilter
{
public AutoValidateAntiforgeryTokenAuthorizationFilter(IAntiforgery antiforgery, ILoggerFactory loggerFactory)
: base(antiforgery, loggerFactory)
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilter.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilter.cs
index 5b2c0ef846..0d2c379636 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilter.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilter.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Filters;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class ControllerSaveTempDataPropertyFilter : SaveTempDataPropertyFilterBase, IActionFilter
+internal sealed class ControllerSaveTempDataPropertyFilter : SaveTempDataPropertyFilterBase, IActionFilter
{
public ControllerSaveTempDataPropertyFilter(ITempDataDictionaryFactory factory)
: base(factory)
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilterFactory.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilterFactory.cs
index 641f05e712..436d377795 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilterFactory.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerSaveTempDataPropertyFilterFactory.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Filters;
@@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class ControllerSaveTempDataPropertyFilterFactory : IFilterFactory
+internal sealed class ControllerSaveTempDataPropertyFilterFactory : IFilterFactory
{
public ControllerSaveTempDataPropertyFilterFactory(IReadOnlyList<LifecycleProperty> properties)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilter.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilter.cs
index 481e0c9b91..ece34dc501 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilter.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilter.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.Filters;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class ControllerViewDataAttributeFilter : IActionFilter, IViewDataValuesProviderFeature
+internal sealed class ControllerViewDataAttributeFilter : IActionFilter, IViewDataValuesProviderFeature
{
public ControllerViewDataAttributeFilter(IReadOnlyList<LifecycleProperty> properties)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilterFactory.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilterFactory.cs
index 19b7f1c090..913ff96fb2 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilterFactory.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/ControllerViewDataAttributeFilterFactory.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.Filters;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class ControllerViewDataAttributeFilterFactory : IFilterFactory
+internal sealed class ControllerViewDataAttributeFilterFactory : IFilterFactory
{
public ControllerViewDataAttributeFilterFactory(IReadOnlyList<LifecycleProperty> properties)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/SaveTempDataFilter.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/SaveTempDataFilter.cs
index fa7f1119fb..2da398ae0e 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/SaveTempDataFilter.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/SaveTempDataFilter.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
/// <summary>
/// A filter that saves temp data.
/// </summary>
-internal class SaveTempDataFilter : IResourceFilter, IResultFilter
+internal sealed class SaveTempDataFilter : IResourceFilter, IResultFilter
{
private static readonly Func<object, Task> OnStartingCallback = (state) => OnStarting((HttpContext)state);
// Internal for unit testing
@@ -148,7 +148,7 @@ internal class SaveTempDataFilter : IResourceFilter, IResultFilter
tempData.Save();
}
- internal class SaveTempDataContext
+ internal sealed class SaveTempDataContext
{
public bool RequestHasUnhandledException { get; set; }
public bool TempDataSaved { get; set; }
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/TempDataApplicationModelProvider.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/TempDataApplicationModelProvider.cs
index 49d6f50258..84e0cae3c9 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/TempDataApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/TempDataApplicationModelProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.ApplicationModels;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class TempDataApplicationModelProvider : IApplicationModelProvider
+internal sealed class TempDataApplicationModelProvider : IApplicationModelProvider
{
private readonly TempDataSerializer _tempDataSerializer;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Filters/ViewDataAttributeApplicationModelProvider.cs b/src/Mvc/Mvc.ViewFeatures/src/Filters/ViewDataAttributeApplicationModelProvider.cs
index 59186bbb5e..86632f4d39 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Filters/ViewDataAttributeApplicationModelProvider.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Filters/ViewDataAttributeApplicationModelProvider.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.ApplicationModels;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Filters;
-internal class ViewDataAttributeApplicationModelProvider : IApplicationModelProvider
+internal sealed class ViewDataAttributeApplicationModelProvider : IApplicationModelProvider
{
/// <inheritdoc />
/// <remarks>This order ensures that <see cref="ViewDataAttributeApplicationModelProvider"/> runs after the <see cref="DefaultApplicationModelProvider"/>.</remarks>
diff --git a/src/Mvc/Mvc.ViewFeatures/src/FormContext.cs b/src/Mvc/Mvc.ViewFeatures/src/FormContext.cs
index 31083e19be..d6f78f1e27 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/FormContext.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/FormContext.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Html;
+using System.Globalization;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
@@ -15,6 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
public class FormContext
{
private Dictionary<string, bool> _renderedFields;
+ private Dictionary<string, bool> _invariantFields;
private Dictionary<string, object> _formData;
private IList<IHtmlContent> _endOfFormContent;
@@ -108,6 +110,19 @@ public class FormContext
}
/// <summary>
+ /// Gets a dictionary mapping full HTML field names to indications that corresponding value was formatted
+ /// using <see cref="CultureInfo.InvariantCulture"/>.
+ /// </summary>
+ private Dictionary<string, bool> InvariantFields
+ {
+ get
+ {
+ _invariantFields ??= new(StringComparer.Ordinal);
+ return _invariantFields;
+ }
+ }
+
+ /// <summary>
/// Returns an indication based on <see cref="RenderedFields"/> that the given <paramref name="fieldName"/> has
/// been rendered in this &lt;form&gt;.
/// </summary>
@@ -143,4 +158,20 @@ public class FormContext
RenderedFields[fieldName] = value;
}
+
+ internal bool InvariantField(string fieldName)
+ {
+ ArgumentNullException.ThrowIfNull(fieldName);
+
+ InvariantFields.TryGetValue(fieldName, out var result);
+
+ return result;
+ }
+
+ internal void InvariantField(string fieldName, bool value)
+ {
+ ArgumentNullException.ThrowIfNull(fieldName);
+
+ InvariantFields[fieldName] = value;
+ }
}
diff --git a/src/Mvc/Mvc.ViewFeatures/src/HtmlHelperOptions.cs b/src/Mvc/Mvc.ViewFeatures/src/HtmlHelperOptions.cs
index 5e013aef71..d4ce05f281 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/HtmlHelperOptions.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/HtmlHelperOptions.cs
@@ -60,4 +60,14 @@ public class HtmlHelperOptions
/// Gets or sets the way hidden inputs are rendered for checkbox tag helpers and html helpers.
/// </summary>
public CheckBoxHiddenInputRenderMode CheckBoxHiddenInputRenderMode { get; set; } = CheckBoxHiddenInputRenderMode.EndOfForm;
+
+ /// <summary>
+ /// Gets or sets a value that determines how form &lt;input/&gt; elements are rendered.
+ /// </summary>
+ /// <remarks>
+ /// Some form elements (e.g., &lt;input type="text"/&gt;) require culture-specific formatting and parsing because their values are
+ /// directly entered by the user. However, other inputs (e.g., &lt;input type="number"/&gt;) use culture-invariant
+ /// formatting both in the HTML source and in the form request.
+ /// </remarks>
+ public FormInputRenderMode FormInputRenderMode { get; set; }
}
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/DefaultTempDataSerializer.cs b/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/DefaultTempDataSerializer.cs
index ca22edcc92..db8290bbad 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/DefaultTempDataSerializer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/DefaultTempDataSerializer.cs
@@ -6,7 +6,7 @@ using System.Text.Json;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure;
-internal class DefaultTempDataSerializer : TempDataSerializer
+internal sealed class DefaultTempDataSerializer : TempDataSerializer
{
public override IDictionary<string, object> Deserialize(byte[] value)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/HttpNavigationManager.cs b/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/HttpNavigationManager.cs
index d2615bb822..bf66af4b1d 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/HttpNavigationManager.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Infrastructure/HttpNavigationManager.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Components;
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Components.Routing;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class HttpNavigationManager : NavigationManager, IHostEnvironmentNavigationManager
+internal sealed class HttpNavigationManager : NavigationManager, IHostEnvironmentNavigationManager
{
void IHostEnvironmentNavigationManager.Initialize(string baseUri, string uri) => Initialize(baseUri, uri);
diff --git a/src/Mvc/Mvc.ViewFeatures/src/LambdaExpressionComparer.cs b/src/Mvc/Mvc.ViewFeatures/src/LambdaExpressionComparer.cs
index 61331cf180..f0574847b5 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/LambdaExpressionComparer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/LambdaExpressionComparer.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Linq.Expressions;
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
// This comparer is tightly coupled with the logic of ExpressionHelper.GetExpressionText.
// It is not designed to accurately compare any two arbitrary LambdaExpressions.
-internal class LambdaExpressionComparer : IEqualityComparer<LambdaExpression>
+internal sealed class LambdaExpressionComparer : IEqualityComparer<LambdaExpression>
{
public static readonly LambdaExpressionComparer Instance = new LambdaExpressionComparer();
diff --git a/src/Mvc/Mvc.ViewFeatures/src/MemberExpressionCacheKeyComparer.cs b/src/Mvc/Mvc.ViewFeatures/src/MemberExpressionCacheKeyComparer.cs
index 874ec53100..ac2c84b60d 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/MemberExpressionCacheKeyComparer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/MemberExpressionCacheKeyComparer.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class MemberExpressionCacheKeyComparer : IEqualityComparer<MemberExpressionCacheKey>
+internal sealed class MemberExpressionCacheKeyComparer : IEqualityComparer<MemberExpressionCacheKey>
{
public static readonly MemberExpressionCacheKeyComparer Instance = new MemberExpressionCacheKeyComparer();
diff --git a/src/Mvc/Mvc.ViewFeatures/src/NameAndIdProvider.cs b/src/Mvc/Mvc.ViewFeatures/src/NameAndIdProvider.cs
index ef6d92c6e1..dd19ee60ba 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/NameAndIdProvider.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/NameAndIdProvider.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Mvc.Rendering;
@@ -189,7 +189,7 @@ internal static class NameAndIdProvider
return previousNameAndId.OutputFullName;
}
- private class PreviousNameAndId
+ private sealed class PreviousNameAndId
{
// Cached ambient input for NameAndIdProvider.GetFullHtmlFieldName(). TemplateInfo.HtmlFieldPrefix may
// change during the lifetime of a ViewContext.
diff --git a/src/Mvc/Mvc.ViewFeatures/src/NullView.cs b/src/Mvc/Mvc.ViewFeatures/src/NullView.cs
index d06ec262ea..3d8c32783f 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/NullView.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/NullView.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Mvc.ViewEngines;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class NullView : IView
+internal sealed class NullView : IView
{
public static readonly NullView Instance = new NullView();
diff --git a/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Shipped.txt b/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Shipped.txt
index 90ce44d676..caf420cc56 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Shipped.txt
+++ b/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Shipped.txt
@@ -181,7 +181,7 @@
~Microsoft.AspNetCore.Mvc.ViewComponents.ViewComponentDescriptorCollection.ViewComponentDescriptorCollection(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ViewComponents.ViewComponentDescriptor> items, int version) -> void
~Microsoft.AspNetCore.Mvc.ViewComponents.ViewComponentFeature.ViewComponents.get -> System.Collections.Generic.IList<System.Reflection.TypeInfo>
~Microsoft.AspNetCore.Mvc.ViewComponents.ViewComponentFeatureProvider.PopulateFeature(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPart> parts, Microsoft.AspNetCore.Mvc.ViewComponents.ViewComponentFeature feature) -> void
-~Microsoft.AspNetCore.Mvc.ViewEngines.CompositeViewEngine.CompositeViewEngine(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! optionsAccessor) -> void
+Microsoft.AspNetCore.Mvc.ViewEngines.CompositeViewEngine.CompositeViewEngine(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! optionsAccessor) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.IViewBufferScope.CreateWriter(System.IO.TextWriter writer) -> System.IO.TextWriter
~Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.IViewBufferScope.GetPage(int pageSize) -> Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferValue[]
~Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.IViewBufferScope.ReturnSegment(Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferValue[] segment) -> void
@@ -330,7 +330,7 @@
~Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpressionProvider.CreateModelExpression<TModel>(Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<TModel> viewData, string expression) -> Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpression
~Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpressionProvider.GetExpressionText<TModel, TValue>(System.Linq.Expressions.Expression<System.Func<TModel, TValue>> expression) -> string
~Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExpressionProvider.ModelExpressionProvider(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider modelMetadataProvider) -> void
-~Microsoft.AspNetCore.Mvc.ViewFeatures.PartialViewResultExecutor.PartialViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
+Microsoft.AspNetCore.Mvc.ViewFeatures.PartialViewResultExecutor.PartialViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.SessionStateTempDataProvider.SessionStateTempDataProvider(Microsoft.AspNetCore.Mvc.ViewFeatures.Infrastructure.TempDataSerializer tempDataSerializer) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.TempDataDictionaryFactory.GetTempData(Microsoft.AspNetCore.Http.HttpContext context) -> Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionary
~Microsoft.AspNetCore.Mvc.ViewFeatures.TempDataDictionaryFactory.TempDataDictionaryFactory(Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataProvider provider) -> void
@@ -342,7 +342,7 @@
~Microsoft.AspNetCore.Mvc.ViewFeatures.TemplateInfo.HtmlFieldPrefix.set -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.TemplateInfo.TemplateInfo(Microsoft.AspNetCore.Mvc.ViewFeatures.TemplateInfo original) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.TemplateInfo.Visited(Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExplorer modelExplorer) -> bool
-~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewComponentResultExecutor.ViewComponentResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! mvcHelperOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataDictionaryFactory, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory) -> void
+Microsoft.AspNetCore.Mvc.ViewFeatures.ViewComponentResultExecutor.ViewComponentResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! mvcHelperOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataDictionaryFactory, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionaryControllerPropertyActivator.Activate(Microsoft.AspNetCore.Mvc.ControllerContext actionContext, object controller) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionaryControllerPropertyActivator.GetActivatorDelegate(Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor actionDescriptor) -> System.Action<Microsoft.AspNetCore.Mvc.ControllerContext, object>
~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionaryControllerPropertyActivator.ViewDataDictionaryControllerPropertyActivator(Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider modelMetadataProvider) -> void
@@ -353,8 +353,8 @@
~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataInfo.ViewDataInfo(object container, object value) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataInfo.ViewDataInfo(object container, System.Reflection.PropertyInfo propertyInfo) -> void
~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataInfo.ViewDataInfo(object container, System.Reflection.PropertyInfo propertyInfo, System.Func<object> valueAccessor) -> void
-~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ViewExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
-~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
+Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ViewExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
+Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
~override Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultValidationHtmlAttributeProvider.AddValidationAttributes(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext, Microsoft.AspNetCore.Mvc.ViewFeatures.ModelExplorer modelExplorer, System.Collections.Generic.IDictionary<string, string> attributes) -> void
~override Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelper<TModel>.Contextualize(Microsoft.AspNetCore.Mvc.Rendering.ViewContext viewContext) -> void
~static Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionaryExtensions.AddModelError<TModel>(this Microsoft.AspNetCore.Mvc.ModelBinding.ModelStateDictionary modelState, System.Linq.Expressions.Expression<System.Func<TModel, object>> expression, string errorMessage) -> void
@@ -932,6 +932,7 @@ Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.ContainsKey(string! ke
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.CopyTo(System.Collections.Generic.KeyValuePair<string!, string?>[]! array, int arrayIndex) -> void
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Count.get -> int
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Enumerator
+Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Enumerator.Current.get -> System.Collections.Generic.KeyValuePair<string!, string?>
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Enumerator.Dispose() -> void
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Enumerator.Enumerator(Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary! attributes) -> void
@@ -948,6 +949,7 @@ Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.TryGetValue(string! ke
Microsoft.AspNetCore.Mvc.ViewFeatures.AttributeDictionary.Values.get -> System.Collections.Generic.ICollection<string?>!
Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.IViewBufferScope
Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferValue
+Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers.ViewBufferValue.ViewBufferValue() -> void
Microsoft.AspNetCore.Mvc.ViewFeatures.CookieTempDataProvider
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator
Microsoft.AspNetCore.Mvc.ViewFeatures.DefaultHtmlGenerator.AllowRenderingMaxLengthAttribute.get -> bool
diff --git a/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt b/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt
index 439b441393..adb19c0812 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt
+++ b/src/Mvc/Mvc.ViewFeatures/src/PublicAPI.Unshipped.txt
@@ -1,13 +1,8 @@
#nullable enable
*REMOVED*Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<TModel>.Model.get -> TModel?
+Microsoft.AspNetCore.Mvc.Rendering.FormInputRenderMode
+Microsoft.AspNetCore.Mvc.Rendering.FormInputRenderMode.AlwaysUseCurrentCulture = 1 -> Microsoft.AspNetCore.Mvc.Rendering.FormInputRenderMode
+Microsoft.AspNetCore.Mvc.Rendering.FormInputRenderMode.DetectCultureFromInputType = 0 -> Microsoft.AspNetCore.Mvc.Rendering.FormInputRenderMode
+Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelperOptions.FormInputRenderMode.get -> Microsoft.AspNetCore.Mvc.Rendering.FormInputRenderMode
+Microsoft.AspNetCore.Mvc.ViewFeatures.HtmlHelperOptions.FormInputRenderMode.set -> void
Microsoft.AspNetCore.Mvc.ViewFeatures.ViewDataDictionary<TModel>.Model.get -> TModel
-*REMOVED*~Microsoft.AspNetCore.Mvc.ViewEngines.CompositeViewEngine.CompositeViewEngine(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! optionsAccessor) -> void
-Microsoft.AspNetCore.Mvc.ViewEngines.CompositeViewEngine.CompositeViewEngine(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! optionsAccessor) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ViewFeatures.PartialViewResultExecutor.PartialViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
-Microsoft.AspNetCore.Mvc.ViewFeatures.PartialViewResultExecutor.PartialViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewComponentResultExecutor.ViewComponentResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! mvcHelperOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataDictionaryFactory, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory) -> void
-Microsoft.AspNetCore.Mvc.ViewFeatures.ViewComponentResultExecutor.ViewComponentResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! mvcHelperOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, System.Text.Encodings.Web.HtmlEncoder! htmlEncoder, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataDictionaryFactory, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ViewExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
-*REMOVED*~Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
-Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.ViewExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
-Microsoft.AspNetCore.Mvc.ViewFeatures.ViewResultExecutor.ViewResultExecutor(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Mvc.MvcViewOptions!>! viewOptions, Microsoft.AspNetCore.Mvc.Infrastructure.IHttpResponseStreamWriterFactory! writerFactory, Microsoft.AspNetCore.Mvc.ViewEngines.ICompositeViewEngine! viewEngine, Microsoft.AspNetCore.Mvc.ViewFeatures.ITempDataDictionaryFactory! tempDataFactory, System.Diagnostics.DiagnosticListener! diagnosticListener, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.Mvc.ModelBinding.IModelMetadataProvider! modelMetadataProvider) -> void
diff --git a/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/PrerenderingErrorBoundaryLogger.cs b/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/PrerenderingErrorBoundaryLogger.cs
index 89f3bc4bfc..f85fc811f3 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/PrerenderingErrorBoundaryLogger.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/PrerenderingErrorBoundaryLogger.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class PrerenderingErrorBoundaryLogger : IErrorBoundaryLogger
+internal sealed class PrerenderingErrorBoundaryLogger : IErrorBoundaryLogger
{
private static readonly Action<ILogger, string, Exception> _exceptionCaughtByErrorBoundary = LoggerMessage.Define<string>(
LogLevel.Warning,
diff --git a/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/StaticComponentRenderer.cs b/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/StaticComponentRenderer.cs
index 204af65183..fbee4a8cbe 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/StaticComponentRenderer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/StaticComponentRenderer.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class StaticComponentRenderer
+internal sealed class StaticComponentRenderer
{
private Task _initialized;
private readonly HtmlRenderer _renderer;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/UnsupportedJavaScriptRuntime.cs b/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/UnsupportedJavaScriptRuntime.cs
index 42ffd37bb5..4f8388b059 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/UnsupportedJavaScriptRuntime.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/RazorComponents/UnsupportedJavaScriptRuntime.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.JSInterop;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class UnsupportedJavaScriptRuntime : IJSRuntime
+internal sealed class UnsupportedJavaScriptRuntime : IJSRuntime
{
public ValueTask<TValue> InvokeAsync<TValue>(string identifier, CancellationToken cancellationToken, object[] args)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Rendering/FormInputRenderMode.cs b/src/Mvc/Mvc.ViewFeatures/src/Rendering/FormInputRenderMode.cs
new file mode 100644
index 0000000000..6d48f96c1c
--- /dev/null
+++ b/src/Mvc/Mvc.ViewFeatures/src/Rendering/FormInputRenderMode.cs
@@ -0,0 +1,25 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+
+namespace Microsoft.AspNetCore.Mvc.Rendering;
+
+/// <summary>
+/// Used for configuring how form inputs should be rendered with respect to
+/// the current locale.
+/// </summary>
+public enum FormInputRenderMode
+{
+ /// <summary>
+ /// When appropriate, use <see cref="CultureInfo.InvariantCulture"/> to format HTML input element values.
+ /// Generate a hidden HTML form input for each value that uses culture-invariant formatting
+ /// so model binding logic can parse with the correct culture.
+ /// </summary>
+ DetectCultureFromInputType = 0,
+
+ /// <summary>
+ /// Always use <see cref="CultureInfo.CurrentCulture"/> to format input element values.
+ /// </summary>
+ AlwaysUseCurrentCulture = 1,
+}
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Rendering/SystemTextJsonHelper.cs b/src/Mvc/Mvc.ViewFeatures/src/Rendering/SystemTextJsonHelper.cs
index 3dc53e37b3..3f8dadcc2e 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Rendering/SystemTextJsonHelper.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Rendering/SystemTextJsonHelper.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Text.Encodings.Web;
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Mvc.Rendering;
-internal class SystemTextJsonHelper : IJsonHelper
+internal sealed class SystemTextJsonHelper : IJsonHelper
{
private readonly JsonSerializerOptions _htmlSafeJsonSerializerOptions;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/Rendering/TagBuilder.cs b/src/Mvc/Mvc.ViewFeatures/src/Rendering/TagBuilder.cs
index d0bdaf70f6..8312366c09 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/Rendering/TagBuilder.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/Rendering/TagBuilder.cs
@@ -424,7 +424,7 @@ public class TagBuilder : IHtmlContent
}
}
- private class RenderTagHtmlContent : IHtmlContent
+ private sealed class RenderTagHtmlContent : IHtmlContent
{
private readonly TagBuilder _tagBuilder;
private readonly TagRenderMode _tagRenderMode;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ServerComponentInvocationSequence.cs b/src/Mvc/Mvc.ViewFeatures/src/ServerComponentInvocationSequence.cs
index 27d25ac993..03bc515a40 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ServerComponentInvocationSequence.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ServerComponentInvocationSequence.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Security.Cryptography;
@@ -6,7 +6,7 @@ using System.Security.Cryptography;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
// Used to produce a monotonically increasing sequence starting at 0 that is unique for the scope of the top-level page/view/component being rendered.
-internal class ServerComponentInvocationSequence
+internal sealed class ServerComponentInvocationSequence
{
private int _sequence;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ServerComponentSerializer.cs b/src/Mvc/Mvc.ViewFeatures/src/ServerComponentSerializer.cs
index 677264a1b7..817219124c 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ServerComponentSerializer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ServerComponentSerializer.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Html;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
// See the details of the component serialization protocol in ServerComponentDeserializer.cs on the Components solution.
-internal class ServerComponentSerializer
+internal sealed class ServerComponentSerializer
{
public const int PreambleBufferSize = 3;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/TemplateBuilder.cs b/src/Mvc/Mvc.ViewFeatures/src/TemplateBuilder.cs
index 5d80a8f2de..f0306adfda 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/TemplateBuilder.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/TemplateBuilder.cs
@@ -11,7 +11,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class TemplateBuilder
+internal sealed class TemplateBuilder
{
private readonly IViewEngine _viewEngine;
private readonly IViewBufferScope _bufferScope;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/TemplateRenderer.cs b/src/Mvc/Mvc.ViewFeatures/src/TemplateRenderer.cs
index c02cf6b33f..89193735a2 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/TemplateRenderer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/TemplateRenderer.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
-internal class TemplateRenderer
+internal sealed class TemplateRenderer
{
private const string DisplayTemplateViewPath = "DisplayTemplates";
private const string EditorTemplateViewPath = "EditorTemplates";
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentActivator.cs b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentActivator.cs
index 4ab977c453..b6c5e4da63 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentActivator.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentActivator.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents;
/// <see cref="ViewComponentContext"/> to a public property of a view component marked
/// with <see cref="ViewComponentContextAttribute"/>.
/// </remarks>
-internal class DefaultViewComponentActivator : IViewComponentActivator
+internal sealed class DefaultViewComponentActivator : IViewComponentActivator
{
private readonly ITypeActivatorCache _typeActivatorCache;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvoker.cs b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvoker.cs
index e48ed6a820..10279954b4 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvoker.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvoker.cs
@@ -16,7 +16,7 @@ namespace Microsoft.AspNetCore.Mvc.ViewComponents;
/// <summary>
/// Default implementation for <see cref="IViewComponentInvoker"/>.
/// </summary>
-internal partial class DefaultViewComponentInvoker : IViewComponentInvoker
+internal sealed partial class DefaultViewComponentInvoker : IViewComponentInvoker
{
private readonly IViewComponentFactory _viewComponentFactory;
private readonly ViewComponentInvokerCache _viewComponentInvokerCache;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvokerFactory.cs b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvokerFactory.cs
index 4f9f3e54aa..062a9e40ab 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvokerFactory.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentInvokerFactory.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Mvc.ViewComponents;
-internal class DefaultViewComponentInvokerFactory : IViewComponentInvokerFactory
+internal sealed class DefaultViewComponentInvokerFactory : IViewComponentInvokerFactory
{
private readonly IViewComponentFactory _viewComponentFactory;
private readonly ViewComponentInvokerCache _viewComponentInvokerCache;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentSelector.cs b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentSelector.cs
index 91a4e15d22..6d3892a59e 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentSelector.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/DefaultViewComponentSelector.cs
@@ -50,7 +50,7 @@ public class DefaultViewComponentSelector : IViewComponentSelector
}
}
- private class ViewComponentDescriptorCache
+ private sealed class ViewComponentDescriptorCache
{
private readonly ILookup<string, ViewComponentDescriptor> _lookupByShortName;
private readonly ILookup<string, ViewComponentDescriptor> _lookupByFullName;
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/ViewComponentInvokerCache.cs b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/ViewComponentInvokerCache.cs
index 1bff7a0320..d0b77dfc54 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/ViewComponentInvokerCache.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ViewComponents/ViewComponentInvokerCache.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Concurrent;
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Mvc.ViewComponents;
-internal class ViewComponentInvokerCache
+internal sealed class ViewComponentInvokerCache
{
private readonly IViewComponentDescriptorCollectionProvider _collectionProvider;
@@ -66,7 +66,7 @@ internal class ViewComponentInvokerCache
return executor;
}
- private class InnerCache
+ private sealed class InnerCache
{
public InnerCache(int version)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/src/ViewDataDictionary.cs b/src/Mvc/Mvc.ViewFeatures/src/ViewDataDictionary.cs
index c9b3357a56..054575b0f4 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/ViewDataDictionary.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/ViewDataDictionary.cs
@@ -391,11 +391,11 @@ public class ViewDataDictionary : IDictionary<string, object?>
public string? Eval(string? expression, string? format)
{
var value = Eval(expression);
- return FormatValue(value, format);
+ return FormatValue(value, format, CultureInfo.CurrentCulture);
}
/// <summary>
- /// Formats the given <paramref name="value"/> using given <paramref name="format"/>.
+ /// Formats the given <paramref name="value"/> using the given <paramref name="format"/>.
/// </summary>
/// <param name="value">The value to format.</param>
/// <param name="format">
@@ -403,6 +403,9 @@ public class ViewDataDictionary : IDictionary<string, object?>
/// </param>
/// <returns>The formatted <see cref="string"/>.</returns>
public static string? FormatValue(object? value, string? format)
+ => FormatValue(value, format, CultureInfo.CurrentCulture);
+
+ internal static string? FormatValue(object? value, string? format, IFormatProvider formatProvider)
{
if (value == null)
{
@@ -411,11 +414,11 @@ public class ViewDataDictionary : IDictionary<string, object?>
if (string.IsNullOrEmpty(format))
{
- return Convert.ToString(value, CultureInfo.CurrentCulture);
+ return Convert.ToString(value, formatProvider);
}
else
{
- return string.Format(CultureInfo.CurrentCulture, format, value);
+ return string.Format(formatProvider, format, value);
}
}
diff --git a/src/Mvc/Mvc.ViewFeatures/src/WebAssemblyComponentSerializer.cs b/src/Mvc/Mvc.ViewFeatures/src/WebAssemblyComponentSerializer.cs
index d3c65401e0..cb69a462ed 100644
--- a/src/Mvc/Mvc.ViewFeatures/src/WebAssemblyComponentSerializer.cs
+++ b/src/Mvc/Mvc.ViewFeatures/src/WebAssemblyComponentSerializer.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
// See the details of the component serialization protocol in WebAssemblyComponentDeserializer.cs on the Components solution.
-internal class WebAssemblyComponentSerializer
+internal sealed class WebAssemblyComponentSerializer
{
public static WebAssemblyComponentMarker SerializeInvocation(Type type, ParameterView parameters, bool prerendered)
{
diff --git a/src/Mvc/Mvc.ViewFeatures/test/DefaultHtmlGeneratorTest.cs b/src/Mvc/Mvc.ViewFeatures/test/DefaultHtmlGeneratorTest.cs
index c923a7a016..02bc8e5a02 100644
--- a/src/Mvc/Mvc.ViewFeatures/test/DefaultHtmlGeneratorTest.cs
+++ b/src/Mvc/Mvc.ViewFeatures/test/DefaultHtmlGeneratorTest.cs
@@ -327,6 +327,89 @@ public class DefaultHtmlGeneratorTest
Assert.Equal(expectedValue, int.Parse(attribute.Value, CultureInfo.InvariantCulture));
}
+ // type, shouldUseInvariantFormatting, dateRenderingMode
+ public static TheoryData<string, Html5DateRenderingMode, bool> GenerateTextBox_InvariantFormattingData
+ {
+ get
+ {
+ return new TheoryData<string, Html5DateRenderingMode, bool>
+ {
+ {"text", Html5DateRenderingMode.Rfc3339, false },
+ {"number", Html5DateRenderingMode.Rfc3339, true },
+ {"range", Html5DateRenderingMode.Rfc3339, true },
+ {"date", Html5DateRenderingMode.Rfc3339, true },
+ {"datetime-local", Html5DateRenderingMode.Rfc3339, true },
+ {"month", Html5DateRenderingMode.Rfc3339, true },
+ {"time", Html5DateRenderingMode.Rfc3339, true },
+ {"week", Html5DateRenderingMode.Rfc3339 , true },
+ {"date", Html5DateRenderingMode.CurrentCulture, false },
+ {"datetime-local", Html5DateRenderingMode.CurrentCulture, false },
+ {"month", Html5DateRenderingMode.CurrentCulture, false },
+ {"time", Html5DateRenderingMode.CurrentCulture, false },
+ {"week", Html5DateRenderingMode.CurrentCulture, false },
+ };
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(GenerateTextBox_InvariantFormattingData))]
+ public void GenerateTextBox_UsesCultureInvariantFormatting_ForAppropriateTypes(string type, Html5DateRenderingMode dateRenderingMode, bool shouldUseInvariantFormatting)
+ {
+ // Arrange
+ var metadataProvider = new TestModelMetadataProvider();
+ var htmlHelperOptions = new HtmlHelperOptions()
+ {
+ Html5DateRenderingMode = dateRenderingMode,
+ };
+ var htmlGenerator = GetGenerator(metadataProvider, new() { HtmlHelperOptions = htmlHelperOptions });
+ var viewContext = GetViewContext<Model>(model: null, metadataProvider, htmlHelperOptions);
+ var expression = nameof(Model.Name);
+ var modelMetadata = metadataProvider.GetMetadataForProperty(typeof(Model), expression);
+ var modelExplorer = new ModelExplorer(metadataProvider, modelMetadata, null);
+ var htmlAttributes = new Dictionary<string, object>
+ {
+ { "name", "testElement" },
+ { "type", type },
+ };
+
+ // Act
+ _ = htmlGenerator.GenerateTextBox(viewContext, modelExplorer, expression, null, null, htmlAttributes);
+
+ // Assert
+ var didForceInvariantFormatting = viewContext.FormContext.InvariantField(expression);
+ Assert.Equal(shouldUseInvariantFormatting, didForceInvariantFormatting);
+ }
+
+ [Theory]
+ [MemberData(nameof(GenerateTextBox_InvariantFormattingData))]
+ public void GenerateTextBox_AlwaysUsesCultureSpecificFormatting_WhenOptionIsSet(string type, Html5DateRenderingMode dateRenderingMode, bool shouldUseInvariantFormatting)
+ {
+ // Arrange
+ var metadataProvider = new TestModelMetadataProvider();
+ var htmlHelperOptions = new HtmlHelperOptions()
+ {
+ Html5DateRenderingMode = dateRenderingMode,
+ FormInputRenderMode = FormInputRenderMode.AlwaysUseCurrentCulture,
+ };
+ var htmlGenerator = GetGenerator(metadataProvider, new() { HtmlHelperOptions = htmlHelperOptions });
+ var viewContext = GetViewContext<Model>(model: null, metadataProvider, htmlHelperOptions);
+ var expression = nameof(Model.Name);
+ var modelMetadata = metadataProvider.GetMetadataForProperty(typeof(Model), expression);
+ var modelExplorer = new ModelExplorer(metadataProvider, modelMetadata, null);
+ var htmlAttributes = new Dictionary<string, object>
+ {
+ { "name", "testElement" },
+ { "type", type },
+ };
+
+ // Act
+ _ = htmlGenerator.GenerateTextBox(viewContext, modelExplorer, expression, null, null, htmlAttributes);
+
+ // Assert
+ var didForceInvariantFormatting = viewContext.FormContext.InvariantField(expression);
+ Assert.False(didForceInvariantFormatting);
+ }
+
[Theory]
[InlineData(nameof(ModelWithMaxLengthMetadata.FieldWithMaxLength))]
[InlineData(nameof(ModelWithMaxLengthMetadata.FieldWithStringLength))]
@@ -916,10 +999,10 @@ public class DefaultHtmlGeneratorTest
}
// GetCurrentValues uses only the IModelMetadataProvider passed to the DefaultHtmlGenerator constructor.
- private static IHtmlGenerator GetGenerator(IModelMetadataProvider metadataProvider)
+ private static IHtmlGenerator GetGenerator(IModelMetadataProvider metadataProvider, MvcViewOptions options = default)
{
var mvcViewOptionsAccessor = new Mock<IOptions<MvcViewOptions>>();
- mvcViewOptionsAccessor.SetupGet(accessor => accessor.Value).Returns(new MvcViewOptions());
+ mvcViewOptionsAccessor.SetupGet(accessor => accessor.Value).Returns(options ?? new MvcViewOptions());
var htmlEncoder = Mock.Of<HtmlEncoder>();
var antiforgery = new Mock<IAntiforgery>();
@@ -945,7 +1028,7 @@ public class DefaultHtmlGeneratorTest
}
// GetCurrentValues uses only the ModelStateDictionary and ViewDataDictionary from the passed ViewContext.
- private static ViewContext GetViewContext<TModel>(TModel model, IModelMetadataProvider metadataProvider)
+ private static ViewContext GetViewContext<TModel>(TModel model, IModelMetadataProvider metadataProvider, HtmlHelperOptions options = default)
{
var actionContext = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
var viewData = new ViewDataDictionary<TModel>(metadataProvider, actionContext.ModelState)
@@ -959,7 +1042,7 @@ public class DefaultHtmlGeneratorTest
viewData,
Mock.Of<ITempDataDictionary>(),
TextWriter.Null,
- new HtmlHelperOptions());
+ options ?? new HtmlHelperOptions());
}
public enum RegularEnum
diff --git a/src/Mvc/Mvc.slnf b/src/Mvc/Mvc.slnf
index 1dee0bc428..25a8b28c74 100644
--- a/src/Mvc/Mvc.slnf
+++ b/src/Mvc/Mvc.slnf
@@ -46,6 +46,7 @@
"src\\Middleware\\HttpOverrides\\src\\Microsoft.AspNetCore.HttpOverrides.csproj",
"src\\Middleware\\Localization.Routing\\src\\Microsoft.AspNetCore.Localization.Routing.csproj",
"src\\Middleware\\Localization\\src\\Microsoft.AspNetCore.Localization.csproj",
+ "src\\Middleware\\OutputCaching\\src\\Microsoft.AspNetCore.OutputCaching.csproj",
"src\\Middleware\\ResponseCaching.Abstractions\\src\\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj",
"src\\Middleware\\ResponseCaching\\src\\Microsoft.AspNetCore.ResponseCaching.csproj",
"src\\Middleware\\Session\\src\\Microsoft.AspNetCore.Session.csproj",
@@ -147,4 +148,4 @@
"src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj"
]
}
-} \ No newline at end of file
+}
diff --git a/src/Mvc/Mvc/src/MvcServiceCollectionExtensions.cs b/src/Mvc/Mvc/src/MvcServiceCollectionExtensions.cs
index c367acb5e2..243228b4cb 100644
--- a/src/Mvc/Mvc/src/MvcServiceCollectionExtensions.cs
+++ b/src/Mvc/Mvc/src/MvcServiceCollectionExtensions.cs
@@ -355,7 +355,7 @@ public static class MvcServiceCollectionExtensions
}
[DebuggerDisplay("{Name}")]
- private class FrameworkAssemblyPart : AssemblyPart, ICompilationReferencesProvider
+ private sealed class FrameworkAssemblyPart : AssemblyPart, ICompilationReferencesProvider
{
public FrameworkAssemblyPart(Assembly assembly)
: base(assembly)
diff --git a/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ActionSelectorBenchmark.cs b/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ActionSelectorBenchmark.cs
index bf4dc73ae2..b336ec0d12 100644
--- a/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ActionSelectorBenchmark.cs
+++ b/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ActionSelectorBenchmark.cs
@@ -231,7 +231,7 @@ public class ActionSelectorBenchmark
NullLoggerFactory.Instance);
}
- private class MockActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
+ private sealed class MockActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
{
public MockActionDescriptorCollectionProvider(ActionDescriptor[] actions)
{
@@ -241,7 +241,7 @@ public class ActionSelectorBenchmark
public ActionDescriptorCollection ActionDescriptors { get; }
}
- private class MockRouter : IRouter
+ private sealed class MockRouter : IRouter
{
public static readonly IRouter Instance = new MockRouter();
diff --git a/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ControllerActionEndpointDatasourceBenchmark.cs b/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ControllerActionEndpointDatasourceBenchmark.cs
index 28f30eb087..8161987ad5 100644
--- a/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ControllerActionEndpointDatasourceBenchmark.cs
+++ b/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/ControllerActionEndpointDatasourceBenchmark.cs
@@ -107,13 +107,21 @@ public class ControllerActionEndpointDataSourceBenchmark
var dataSource = new ControllerActionEndpointDataSource(
new ControllerActionEndpointDataSourceIdProvider(),
actionDescriptorCollectionProvider,
- new ActionEndpointFactory(new MockRoutePatternTransformer(), Enumerable.Empty<IRequestDelegateFactory>()),
+ new ActionEndpointFactory(new MockRoutePatternTransformer(), Enumerable.Empty<IRequestDelegateFactory>(), new MockServiceProvider()),
new OrderedEndpointsSequenceProvider());
return dataSource;
}
- private class MockRoutePatternTransformer : RoutePatternTransformer
+ private sealed class MockServiceProvider : IServiceProvider
+ {
+ public object GetService(Type serviceType)
+ {
+ return null;
+ }
+ }
+
+ private sealed class MockRoutePatternTransformer : RoutePatternTransformer
{
public override RoutePattern SubstituteRequiredValues(RoutePattern original, object requiredValues)
{
@@ -121,7 +129,7 @@ public class ControllerActionEndpointDataSourceBenchmark
}
}
- private class MockActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
+ private sealed class MockActionDescriptorCollectionProvider : IActionDescriptorCollectionProvider
{
public MockActionDescriptorCollectionProvider(List<ActionDescriptor> actionDescriptors)
{
@@ -131,7 +139,7 @@ public class ControllerActionEndpointDataSourceBenchmark
public ActionDescriptorCollection ActionDescriptors { get; }
}
- private class MockParameterPolicyFactory : ParameterPolicyFactory
+ private sealed class MockParameterPolicyFactory : ParameterPolicyFactory
{
public override IParameterPolicy Create(RoutePatternParameterPart parameter, string inlineText)
{
diff --git a/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/RuntimePerformanceBenchmarkBase.cs b/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/RuntimePerformanceBenchmarkBase.cs
index ad4d1a0993..ea85942b36 100644
--- a/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/RuntimePerformanceBenchmarkBase.cs
+++ b/src/Mvc/perf/Microbenchmarks/Microsoft.AspNetCore.Mvc/RuntimePerformanceBenchmarkBase.cs
@@ -26,7 +26,7 @@ namespace Microsoft.AspNetCore.Mvc.Microbenchmarks;
public class RuntimePerformanceBenchmarkBase
{
- private class NullLoggerFactory : ILoggerFactory, ILogger
+ private sealed class NullLoggerFactory : ILoggerFactory, ILogger
{
void ILoggerFactory.AddProvider(ILoggerProvider provider) { }
ILogger ILoggerFactory.CreateLogger(string categoryName) => this;
@@ -36,7 +36,7 @@ public class RuntimePerformanceBenchmarkBase
void ILogger.Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { }
}
- private class BenchmarkViewExecutor : ViewExecutor
+ private sealed class BenchmarkViewExecutor : ViewExecutor
{
public BenchmarkViewExecutor(IOptions<MvcViewOptions> viewOptions, IHttpResponseStreamWriterFactory writerFactory, ICompositeViewEngine viewEngine, ITempDataDictionaryFactory tempDataFactory, DiagnosticListener diagnosticListener, IModelMetadataProvider modelMetadataProvider)
: base(viewOptions, writerFactory, viewEngine, tempDataFactory, diagnosticListener, modelMetadataProvider)
@@ -68,7 +68,7 @@ public class RuntimePerformanceBenchmarkBase
}
}
- private class BenchmarkHostingEnvironment : IWebHostEnvironment
+ private sealed class BenchmarkHostingEnvironment : IWebHostEnvironment
{
public BenchmarkHostingEnvironment()
{
diff --git a/src/Mvc/perf/benchmarkapps/NuGet.config b/src/Mvc/perf/benchmarkapps/NuGet.config
index 25afec6f1b..2739120bf2 100644
--- a/src/Mvc/perf/benchmarkapps/NuGet.config
+++ b/src/Mvc/perf/benchmarkapps/NuGet.config
@@ -2,6 +2,6 @@
<configuration>
<packageSources>
<clear />
- <add key="NuGet.org" value="https://api.nuget.org/v3/index.json" />
+ <add key="dotnet-public" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public/nuget/v3/index.json" />
</packageSources>
</configuration>
diff --git a/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj b/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj
index b677481776..6c3cf21a5a 100644
--- a/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj
+++ b/src/Mvc/samples/MvcSandbox/MvcSandbox.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<PreserveCompilationContext>true</PreserveCompilationContext>
diff --git a/src/Mvc/samples/MvcSandbox/Startup.cs b/src/Mvc/samples/MvcSandbox/Startup.cs
index 27910a3b0b..2708a0c0b4 100644
--- a/src/Mvc/samples/MvcSandbox/Startup.cs
+++ b/src/Mvc/samples/MvcSandbox/Startup.cs
@@ -19,11 +19,24 @@ public class Startup
app.UseStaticFiles();
app.UseRouting();
+
+ static void ConfigureEndpoints(IEndpointRouteBuilder endpoints)
+ {
+ endpoints.MapGet("/MapGet", () => "MapGet");
+
+ endpoints.MapControllers();
+ endpoints.MapControllerRoute(
+ Guid.NewGuid().ToString(),
+ "{controller=Home}/{action=Index}/{id?}");
+
+ endpoints.MapRazorPages();
+ }
+
app.UseEndpoints(builder =>
{
- builder.MapControllers();
- builder.MapDefaultControllerRoute();
- builder.MapRazorPages();
+ ConfigureEndpoints(builder);
+ var group = builder.MapGroup("/group");
+ ConfigureEndpoints(group);
});
}
diff --git a/src/Mvc/shared/Mvc.Core.TestCommon/CommonFilterTest.cs b/src/Mvc/shared/Mvc.Core.TestCommon/CommonFilterTest.cs
index ce07ed4a5d..ce45961273 100644
--- a/src/Mvc/shared/Mvc.Core.TestCommon/CommonFilterTest.cs
+++ b/src/Mvc/shared/Mvc.Core.TestCommon/CommonFilterTest.cs
@@ -226,7 +226,7 @@ public class CommonFilterTest
return new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
}
- private class NoOpResult : IActionResult
+ private sealed class NoOpResult : IActionResult
{
public Task ExecuteResultAsync(ActionContext context)
{
diff --git a/src/Mvc/shared/Mvc.Core.TestCommon/TestModelMetadataProvider.cs b/src/Mvc/shared/Mvc.Core.TestCommon/TestModelMetadataProvider.cs
index 4f3ba4ef77..e1c66d1b12 100644
--- a/src/Mvc/shared/Mvc.Core.TestCommon/TestModelMetadataProvider.cs
+++ b/src/Mvc/shared/Mvc.Core.TestCommon/TestModelMetadataProvider.cs
@@ -141,7 +141,7 @@ public class TestModelMetadataProvider : DefaultModelMetadataProvider
return ForProperty(typeof(TContainer), propertyName);
}
- private class TestModelMetadataDetailsProvider :
+ private sealed class TestModelMetadataDetailsProvider :
IBindingMetadataProvider,
IDisplayMetadataProvider,
IValidationMetadataProvider
@@ -182,7 +182,7 @@ public class TestModelMetadataProvider : DefaultModelMetadataProvider
IMetadataBuilder ValidationDetails(Action<ValidationMetadata> action);
}
- private class MetadataBuilder : IMetadataBuilder
+ private sealed class MetadataBuilder : IMetadataBuilder
{
private readonly List<Action<BindingMetadata>> _bindingActions = new List<Action<BindingMetadata>>();
private readonly List<Action<DisplayMetadata>> _displayActions = new List<Action<DisplayMetadata>>();
diff --git a/src/Mvc/shared/Mvc.Views.TestCommon/TestFileChangeToken.cs b/src/Mvc/shared/Mvc.Views.TestCommon/TestFileChangeToken.cs
index 1cb2a76d7c..52a2019896 100644
--- a/src/Mvc/shared/Mvc.Views.TestCommon/TestFileChangeToken.cs
+++ b/src/Mvc/shared/Mvc.Views.TestCommon/TestFileChangeToken.cs
@@ -21,7 +21,7 @@ public class TestFileChangeToken : IChangeToken
return new NullDisposable();
}
- private class NullDisposable : IDisposable
+ private sealed class NullDisposable : IDisposable
{
public void Dispose()
{
diff --git a/src/Mvc/shared/Mvc.Views.TestCommon/TestFileProvider.cs b/src/Mvc/shared/Mvc.Views.TestCommon/TestFileProvider.cs
index 1849d55487..a4e8fd125d 100644
--- a/src/Mvc/shared/Mvc.Views.TestCommon/TestFileProvider.cs
+++ b/src/Mvc/shared/Mvc.Views.TestCommon/TestFileProvider.cs
@@ -121,7 +121,7 @@ public class TestFileProvider : IFileProvider
return filePath;
}
- private class NotFoundFileInfo : IFileInfo
+ private sealed class NotFoundFileInfo : IFileInfo
{
public bool Exists
{
diff --git a/src/Mvc/test/Mvc.FunctionalTests/ControllerEndpointFiltersTest.cs b/src/Mvc/test/Mvc.FunctionalTests/ControllerEndpointFiltersTest.cs
new file mode 100644
index 0000000000..fa8a03c76e
--- /dev/null
+++ b/src/Mvc/test/Mvc.FunctionalTests/ControllerEndpointFiltersTest.cs
@@ -0,0 +1,76 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Http;
+using System.Net.Http.Json;
+using System.Text.Json;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Testing;
+using RoutingWebSite;
+
+namespace Microsoft.AspNetCore.Mvc.FunctionalTests;
+
+public class ControllerEndpointFiltersTest : IClassFixture<MvcTestFixture<StartupForEndpointFilters>>
+{
+ public ControllerEndpointFiltersTest(MvcTestFixture<StartupForEndpointFilters> fixture)
+ {
+ Factory = fixture.Factories.FirstOrDefault() ?? fixture.WithWebHostBuilder(ConfigureWebHostBuilder);
+ }
+
+ private static void ConfigureWebHostBuilder(IWebHostBuilder builder) => builder.UseStartup<StartupForEndpointFilters>();
+
+ public WebApplicationFactory<StartupForEndpointFilters> Factory { get; }
+
+ [Fact]
+ public async Task CanApplyEndpointFilterToController()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("Items/Index");
+ var content = await response.Content.ReadFromJsonAsync<Dictionary<string, object>>();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.True(content.TryGetValue(nameof(IEndpointFilter), out var endpointFilterCalled));
+ Assert.True(((JsonElement)endpointFilterCalled).GetBoolean());
+ }
+
+ [Fact]
+ public async Task CanCaptureMethodInfoFromControllerAction()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("Items/Index");
+ var content = await response.Content.ReadFromJsonAsync<Dictionary<string, object>>();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.True(content.TryGetValue(nameof(EndpointFilterFactoryContext.MethodInfo.Name), out var methodInfo));
+ Assert.Equal("Index", ((JsonElement)methodInfo).GetString());
+ }
+
+ [Fact]
+ public async Task CanInterceptActionResultViaFilter()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("Items/IndexWithSelectiveFilter");
+ var content = await response.Content.ReadAsStringAsync();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("Intercepted", content);
+ }
+
+ [Fact]
+ public async Task CanAccessArgumentsFromAction()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("Items/IndexWithArgument/foobar");
+ var content = await response.Content.ReadFromJsonAsync<Dictionary<string, object>>();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.True(content.TryGetValue(nameof(EndpointFilterInvocationContext.Arguments), out var argument));
+ Assert.Equal("foobar", ((JsonElement)argument).GetString());
+ }
+}
diff --git a/src/Mvc/test/Mvc.FunctionalTests/CustomValueProviderTest.cs b/src/Mvc/test/Mvc.FunctionalTests/CustomValueProviderTest.cs
new file mode 100644
index 0000000000..c4fd51c23a
--- /dev/null
+++ b/src/Mvc/test/Mvc.FunctionalTests/CustomValueProviderTest.cs
@@ -0,0 +1,93 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Http;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Mvc.FunctionalTests;
+
+public class CustomValueProviderTest : IClassFixture<MvcTestFixture<BasicWebSite.StartupWithCustomValueProvider>>
+{
+ private IServiceCollection _serviceCollection;
+
+ public CustomValueProviderTest(MvcTestFixture<BasicWebSite.StartupWithCustomValueProvider> fixture)
+ {
+ var factory = fixture.Factories.FirstOrDefault() ?? fixture.WithWebHostBuilder(b => b.UseStartup<BasicWebSite.StartupWithCustomValueProvider>());
+ factory = factory.WithWebHostBuilder(b => b.ConfigureTestServices(serviceCollection => _serviceCollection = serviceCollection));
+
+ Client = factory.CreateDefaultClient();
+ }
+
+ public HttpClient Client { get; }
+
+ [Fact]
+ public async Task CustomValueProvider_DisplayName()
+ {
+ // Arrange
+ var url = "http://localhost/CustomValueProvider/CustomValueProviderDisplayName";
+ var request = new HttpRequestMessage(HttpMethod.Get, url);
+
+ // Act
+ var response = await Client.SendAsync(request);
+ var content = await response.Content.ReadAsStringAsync();
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("text/plain", response.Content.Headers.ContentType.MediaType);
+ Assert.Equal("BasicWebSite.Controllers.CustomValueProviderController.CustomValueProviderDisplayName (BasicWebSite)", content);
+ }
+
+ [Fact]
+ public async Task CustomValueProvider_IntValues()
+ {
+ // Arrange
+ var url = "http://localhost/CustomValueProvider/CustomValueProviderIntValues";
+ var request = new HttpRequestMessage(HttpMethod.Get, url);
+
+ // Act
+ var response = await Client.SendAsync(request);
+ var content = await response.Content.ReadAsStringAsync();
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);
+ Assert.Equal("[42,100,200]", content);
+ }
+
+ [Fact]
+ public async Task CustomValueProvider_NullableIntValues()
+ {
+ // Arrange
+ var url = "http://localhost/CustomValueProvider/CustomValueProviderNullableIntValues";
+ var request = new HttpRequestMessage(HttpMethod.Get, url);
+
+ // Act
+ var response = await Client.SendAsync(request);
+ var content = await response.Content.ReadAsStringAsync();
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);
+ Assert.Equal("[null,42,null,100,null,200]", content);
+ }
+
+ [Fact]
+ public async Task CustomValueProvider_StringValues()
+ {
+ // Arrange
+ var url = "http://localhost/CustomValueProvider/CustomValueProviderStringValues";
+ var request = new HttpRequestMessage(HttpMethod.Get, url);
+
+ // Act
+ var response = await Client.SendAsync(request);
+ var content = await response.Content.ReadAsStringAsync();
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);
+ Assert.Equal(@"[null,""foo"",null,""bar"",null,""baz""]", content);
+ }
+}
diff --git a/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationTest.cs b/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationTest.cs
index 426fca79e0..56590f1c50 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationTest.cs
+++ b/src/Mvc/test/Mvc.FunctionalTests/HtmlGenerationTest.cs
@@ -111,7 +111,7 @@ public class HtmlGenerationTest :
responseContent = responseContent.Trim();
if (antiforgeryPath == null)
{
- Assert.Equal(expectedContent.Trim(), responseContent, ignoreLineEndingDifferences: true);
+ ResourceFile.UpdateOrVerify(_resourcesAssembly, outputFile, expectedContent, responseContent);
}
else
{
diff --git a/src/Mvc/test/Mvc.FunctionalTests/RequestServicesTestBase.cs b/src/Mvc/test/Mvc.FunctionalTests/RequestServicesTestBase.cs
index 794fb8f94a..51dd3eee89 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/RequestServicesTestBase.cs
+++ b/src/Mvc/test/Mvc.FunctionalTests/RequestServicesTestBase.cs
@@ -31,6 +31,7 @@ public abstract class RequestServicesTestBase<TStartup> : IClassFixture<MvcTestF
[InlineData("http://localhost/RequestScopedService/FromView")]
[InlineData("http://localhost/RequestScopedService/FromViewComponent")]
[InlineData("http://localhost/RequestScopedService/FromActionArgument")]
+ [InlineData("http://localhost/RequestScopedService/FromProperty")]
public async Task RequestServices(string url)
{
for (var i = 0; i < 2; i++)
diff --git a/src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsTest.cs b/src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsTest.cs
new file mode 100644
index 0000000000..f9bab6bd2d
--- /dev/null
+++ b/src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsTest.cs
@@ -0,0 +1,54 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Http;
+using System.Net.Http.Json;
+using System.Text.Json;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Testing;
+using RoutingWebSite;
+
+namespace Microsoft.AspNetCore.Mvc.FunctionalTests;
+
+public class RoutingGroupsTests : IClassFixture<MvcTestFixture<StartupForGroups>>
+{
+ public RoutingGroupsTests(MvcTestFixture<StartupForGroups> fixture)
+ {
+ Factory = fixture.Factories.FirstOrDefault() ?? fixture.WithWebHostBuilder(ConfigureWebHostBuilder);
+ }
+
+ private static void ConfigureWebHostBuilder(IWebHostBuilder builder) => builder.UseStartup<StartupForGroups>();
+
+ public WebApplicationFactory<StartupForGroups> Factory { get; }
+
+ [Fact]
+ public async Task MatchesControllerGroup()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("controllers/contoso/Blog/ShowPosts");
+ var content = await response.Content.ReadFromJsonAsync<RouteInfo>();
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ Assert.True(content.RouteValues.TryGetValue("org", out var org));
+ Assert.Equal("contoso", org);
+ }
+
+ [Fact]
+ public async Task MatchesPagesGroupAndGeneratesValidLink()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("pages/PageWithLinks");
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+
+ var document = await response.GetHtmlDocumentAsync();
+ var editLink = document.RequiredQuerySelector("#editlink");
+ Assert.Equal("/pages/Edit/10", editLink.GetAttribute("href"));
+ // TODO: Investigate why the #contactlink to the controller is empty.
+ }
+
+ private record RouteInfo(string RouteName, IDictionary<string, string> RouteValues, string Link);
+}
diff --git a/src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsWithMetadataTest.cs b/src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsWithMetadataTest.cs
new file mode 100644
index 0000000000..03b26ccee7
--- /dev/null
+++ b/src/Mvc/test/Mvc.FunctionalTests/RoutingGroupsWithMetadataTest.cs
@@ -0,0 +1,37 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Http.Json;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc.Testing;
+using RoutingWebSite;
+
+namespace Microsoft.AspNetCore.Mvc.FunctionalTests;
+
+public class RoutingGroupsWithMetadataTests : IClassFixture<MvcTestFixture<StartupForRouteGroupsWithMetadata>>
+{
+ public RoutingGroupsWithMetadataTests(MvcTestFixture<StartupForRouteGroupsWithMetadata> fixture)
+ {
+ Factory = fixture.Factories.FirstOrDefault() ?? fixture.WithWebHostBuilder(ConfigureWebHostBuilder);
+ }
+
+ private static void ConfigureWebHostBuilder(IWebHostBuilder builder) => builder.UseStartup<StartupForRouteGroupsWithMetadata>();
+
+ public WebApplicationFactory<StartupForRouteGroupsWithMetadata> Factory { get; }
+
+ [Fact]
+ public async Task OrderedGroupMetadataForControllers()
+ {
+ using var client = Factory.CreateClient();
+
+ var response = await client.GetAsync("group1/metadata");
+
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+
+ var content = await response.Content.ReadFromJsonAsync<string[]>();
+
+ Assert.Equal(new[] { "A", "C", "B" }, content);
+ }
+}
diff --git a/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureTests.cs b/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureTests.cs
index 68a0c8fdbf..6590277224 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureTests.cs
+++ b/src/Mvc/test/Mvc.FunctionalTests/TestingInfrastructureTests.cs
@@ -110,6 +110,19 @@ public class TestingInfrastructureTests : IClassFixture<WebApplicationFactory<Ba
}
[Fact]
+ public async Task TestingInfrastructure_RedirectHandlerHandlesRelativeLocation()
+ {
+ // Act
+ var request = new HttpRequestMessage(HttpMethod.Get, "Testing/RedirectHandler/Relative/");
+ var client = Factory.CreateDefaultClient(
+ new RedirectHandler());
+ var response = await client.SendAsync(request);
+
+ // Assert
+ Assert.Equal(HttpStatusCode.OK, response.StatusCode);
+ }
+
+ [Fact]
public async Task TestingInfrastructure_RedirectHandlerFollowsStatusCode303()
{
// Act
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Customer.Index.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Customer.Index.html
index a61f895061..ebb12b5a39 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Customer.Index.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Customer.Index.html
@@ -3,7 +3,7 @@
<form action="/Customer/HtmlGeneration_Customer" method="post">
<div>
<label class="order" for="Number">Number</label>
- <input type="number" class="form-control input-validation-error" data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." id="Number" name="Number" value="" />
+ <input type="number" class="form-control input-validation-error" data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." id="Number" name="Number" value="" /><input name="__Invariant" type="hidden" value="Number" />
<span class="field-validation-error" data-valmsg-for="Number" data-valmsg-replace="true">The value &#x27;&#x27; is invalid.</span>
</div>
<div>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Customer.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Customer.html
index ec748e6ea5..2afebd6327 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Customer.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Customer.html
@@ -3,7 +3,7 @@
<form action="/Customer/HtmlGeneration_Customer" method="post">
<div>
<label class="order" for="Number">Number</label>
- <input type="number" class="form-control" data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." id="Number" name="Number" value="" />
+ <input type="number" class="form-control" data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." id="Number" name="Number" value="" /><input name="__Invariant" type="hidden" value="Number" />
<span class="field-validation-valid" data-valmsg-for="Number" data-valmsg-replace="true"></span>
</div>
<div>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.EmployeeList.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.EmployeeList.html
index edc86e3450..a932989760 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.EmployeeList.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.EmployeeList.html
@@ -4,7 +4,7 @@
<div>
<label for="z0__Number">Number</label>
<input data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." disabled="disabled" id="z0__Number" name="[0].Number" readonly="readonly" type="text" value="0" />
- <input type="number" class="form-control" id="z0__Number" name="[0].Number" value="0" />
+ <input type="number" class="form-control" id="z0__Number" name="[0].Number" value="0" /><input name="__Invariant" type="hidden" value="[0].Number" />
</div>
<div>
<label class="employee" for="z0__Name">Name</label>
@@ -35,7 +35,7 @@ EmployeeName_0</textarea>
<div>
<label for="z1__Number">Number</label>
<input data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." disabled="disabled" id="z1__Number" name="[1].Number" readonly="readonly" type="text" value="1" />
- <input type="number" class="form-control" id="z1__Number" name="[1].Number" value="1" />
+ <input type="number" class="form-control" id="z1__Number" name="[1].Number" value="1" /><input name="__Invariant" type="hidden" value="[1].Number" />
</div>
<div>
<label class="employee" for="z1__Name">Name</label>
@@ -66,7 +66,7 @@ EmployeeName_1</textarea>
<div>
<label for="z2__Number">Number</label>
<input data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." disabled="disabled" id="z2__Number" name="[2].Number" readonly="readonly" type="text" value="2" />
- <input type="number" class="form-control" id="z2__Number" name="[2].Number" value="2" />
+ <input type="number" class="form-control" id="z2__Number" name="[2].Number" value="2" /><input name="__Invariant" type="hidden" value="[2].Number" />
</div>
<div>
<label class="employee" for="z2__Name">Name</label>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.Encoded.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.Encoded.html
index 4ec3df1116..23dd048b6e 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.Encoded.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.Encoded.html
@@ -1,4 +1,4 @@
-<html>
+<html>
<head>
<meta charset="utf-8" />
<title></title>
@@ -11,7 +11,7 @@
</div>
<div>
<label class="order" for="HtmlEncode[[ShippingDateTime]]">HtmlEncode[[ShippingDateTime]]</label>
- <input type="HtmlEncode[[datetime-local]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The ShippingDateTime field is required.]]" id="HtmlEncode[[ShippingDateTime]]" name="HtmlEncode[[ShippingDateTime]]" value="HtmlEncode[[0001-01-01T00:00:00.000]]" />
+ <input type="HtmlEncode[[datetime-local]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The ShippingDateTime field is required.]]" id="HtmlEncode[[ShippingDateTime]]" name="HtmlEncode[[ShippingDateTime]]" value="HtmlEncode[[0001-01-01T00:00:00.000]]" /><input name="HtmlEncode[[__Invariant]]" type="hidden" value="HtmlEncode[[ShippingDateTime]]" />
</div>
<div>
<label class="order" for="HtmlEncode[[Products]]">HtmlEncode[[Products]]</label>
@@ -32,7 +32,7 @@
</tr>
<tr>
<td>
- <input type="HtmlEncode[[number]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_0__Number]]" name="HtmlEncode[[ProductDetails[0].Number]]" value="HtmlEncode[[0]]" />
+ <input type="HtmlEncode[[number]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_0__Number]]" name="HtmlEncode[[ProductDetails[0].Number]]" value="HtmlEncode[[0]]" /><input name="HtmlEncode[[__Invariant]]" type="hidden" value="HtmlEncode[[ProductDetails[0].Number]]" />
<span class="text-danger HtmlEncode[[field-validation-valid]]" style="" data-valmsg-for="HtmlEncode[[ProductDetails[0].Number]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</td>
<td>
@@ -42,7 +42,7 @@
</tr>
<tr>
<td>
- <input type="HtmlEncode[[number]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_1__Number]]" name="HtmlEncode[[ProductDetails[1].Number]]" value="HtmlEncode[[1]]" />
+ <input type="HtmlEncode[[number]]" data-val="HtmlEncode[[true]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[ProductDetails_1__Number]]" name="HtmlEncode[[ProductDetails[1].Number]]" value="HtmlEncode[[1]]" /><input name="HtmlEncode[[__Invariant]]" type="hidden" value="HtmlEncode[[ProductDetails[1].Number]]" />
<span class="text-danger HtmlEncode[[field-validation-valid]]" style="" data-valmsg-for="HtmlEncode[[ProductDetails[1].Number]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</td>
<td>
@@ -79,7 +79,7 @@
</div>
<div>
<label class="order" for="HtmlEncode[[Customer_Number]]">HtmlEncode[[Number]]</label>
- <input type="HtmlEncode[[number]]" class="form-control" data-val="HtmlEncode[[true]]" data-val-range="HtmlEncode[[The field Number must be between 1 and 100.]]" data-val-range-max="HtmlEncode[[100]]" data-val-range-min="HtmlEncode[[1]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[Customer_Number]]" name="HtmlEncode[[Customer.Number]]" value="HtmlEncode[[1]]" />
+ <input type="HtmlEncode[[number]]" class="form-control" data-val="HtmlEncode[[true]]" data-val-range="HtmlEncode[[The field Number must be between 1 and 100.]]" data-val-range-max="HtmlEncode[[100]]" data-val-range-min="HtmlEncode[[1]]" data-val-required="HtmlEncode[[The Number field is required.]]" id="HtmlEncode[[Customer_Number]]" name="HtmlEncode[[Customer.Number]]" value="HtmlEncode[[1]]" /><input name="HtmlEncode[[__Invariant]]" type="hidden" value="HtmlEncode[[Customer.Number]]" />
<span class="HtmlEncode[[field-validation-valid]]" data-valmsg-for="HtmlEncode[[Customer.Number]]" data-valmsg-replace="HtmlEncode[[true]]"></span>
</div>
<div>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.html
index 54a6af28f8..b0916d47c0 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Order.html
@@ -11,7 +11,7 @@
</div>
<div>
<label class="order" for="ShippingDateTime">ShippingDateTime</label>
- <input type="datetime-local" data-val="true" data-val-required="The ShippingDateTime field is required." id="ShippingDateTime" name="ShippingDateTime" value="0001-01-01T00:00:00.000" />
+ <input type="datetime-local" data-val="true" data-val-required="The ShippingDateTime field is required." id="ShippingDateTime" name="ShippingDateTime" value="0001-01-01T00:00:00.000" /><input name="__Invariant" type="hidden" value="ShippingDateTime" />
</div>
<div>
<label class="order" for="Products">Products</label>
@@ -32,7 +32,7 @@
</tr>
<tr>
<td>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="ProductDetails_0__Number" name="ProductDetails[0].Number" value="0" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="ProductDetails_0__Number" name="ProductDetails[0].Number" value="0" /><input name="__Invariant" type="hidden" value="ProductDetails[0].Number" />
<span class="text-danger field-validation-valid" style="" data-valmsg-for="ProductDetails[0].Number" data-valmsg-replace="true"></span>
</td>
<td>
@@ -42,7 +42,7 @@
</tr>
<tr>
<td>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="ProductDetails_1__Number" name="ProductDetails[1].Number" value="1" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="ProductDetails_1__Number" name="ProductDetails[1].Number" value="1" /><input name="__Invariant" type="hidden" value="ProductDetails[1].Number" />
<span class="text-danger field-validation-valid" style="" data-valmsg-for="ProductDetails[1].Number" data-valmsg-replace="true"></span>
</td>
<td>
@@ -79,7 +79,7 @@
</div>
<div>
<label class="order" for="Customer_Number">Number</label>
- <input type="number" class="form-control" data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." id="Customer_Number" name="Customer.Number" value="1" />
+ <input type="number" class="form-control" data-val="true" data-val-range="The field Number must be between 1 and 100." data-val-range-max="100" data-val-range-min="1" data-val-required="The Number field is required." id="Customer_Number" name="Customer.Number" value="1" /><input name="__Invariant" type="hidden" value="Customer.Number" />
<span class="field-validation-valid" data-valmsg-for="Customer.Number" data-valmsg-replace="true"></span>
</div>
<div>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Product.Encoded.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Product.Encoded.html
index 68230861ed..477d075a74 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Product.Encoded.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Product.Encoded.html
@@ -1,4 +1,4 @@
-<html>
+<html>
<head>
<meta charset="utf-8" />
<title></title>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductList.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductList.html
index 9ad0850e70..1434da7d17 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductList.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductList.html
@@ -10,7 +10,7 @@
<div>
<label class="product" for="z0__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z0__Number" name="[0].Number" value="0" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z0__Number" name="[0].Number" value="0" /><input name="__Invariant" type="hidden" value="[0].Number" />
</div>
<div>
<label class="product" for="z0__ProductName">ProductName</label>
@@ -27,7 +27,7 @@
<div>
<label class="product" for="z1__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z1__Number" name="[1].Number" value="1" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z1__Number" name="[1].Number" value="1" /><input name="__Invariant" type="hidden" value="[1].Number" />
</div>
<div>
<label class="product" for="z1__ProductName">ProductName</label>
@@ -44,7 +44,7 @@
<div>
<label class="product" for="z2__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z2__Number" name="[2].Number" value="2" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z2__Number" name="[2].Number" value="2" /><input name="__Invariant" type="hidden" value="[2].Number" />
</div>
<div>
<label class="product" for="z2__ProductName">ProductName</label>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpers.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpers.html
index ae21e4e251..3a1b89dc46 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpers.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpers.html
@@ -11,7 +11,7 @@
<div>
<label class="product" for="z0__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z0__Number" name="[0].Number" value="0" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z0__Number" name="[0].Number" value="0" /><input name="__Invariant" type="hidden" value="[0].Number" />
</div>
<div>
<label class="product" for="z0__ProductName">ProductName</label>
@@ -29,7 +29,7 @@
<div>
<label class="product" for="z1__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z1__Number" name="[1].Number" value="1" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z1__Number" name="[1].Number" value="1" /><input name="__Invariant" type="hidden" value="[1].Number" />
</div>
<div>
<label class="product" for="z1__ProductName">ProductName</label>
@@ -47,7 +47,7 @@
<div>
<label class="product" for="z2__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z2__Number" name="[2].Number" value="2" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z2__Number" name="[2].Number" value="2" /><input name="__Invariant" type="hidden" value="[2].Number" />
</div>
<div>
<label class="product" for="z2__ProductName">ProductName</label>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpersWithNullModel.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpersWithNullModel.html
index 64eaaeffda..9363027c26 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpersWithNullModel.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.ProductListUsingTagHelpersWithNullModel.html
@@ -11,7 +11,7 @@
<div>
<label class="product" for="z0__Number">Number</label>
- <input type="number" data-val="true" data-val-required="The Number field is required." id="z0__Number" name="[0].Number" value="" />
+ <input type="number" data-val="true" data-val-required="The Number field is required." id="z0__Number" name="[0].Number" value="" /><input name="__Invariant" type="hidden" value="[0].Number" />
</div>
<div>
<label class="product" for="z0__ProductName">ProductName</label>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Warehouse.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Warehouse.html
index d86cdb95db..43fb90465d 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Warehouse.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/HtmlGenerationWebSite.HtmlGeneration_Home.Warehouse.html
@@ -6,7 +6,7 @@
</div>
<div>
<label for="Employee_OfficeNumber">OfficeNumber</label>
- <input type="number" id="Employee_OfficeNumber" name="Employee.OfficeNumber" value="Number_1" />
+ <input type="number" id="Employee_OfficeNumber" name="Employee.OfficeNumber" value="Number_1" /><input name="__Invariant" type="hidden" value="Employee.OfficeNumber" />
</div>
<div>
<label for="Employee_Address">Address</label>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.Invalid.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.Invalid.html
index 77ad4a0012..0827ba9e0c 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.Invalid.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.Invalid.html
@@ -23,7 +23,7 @@
<div class="form-group">
<label class="control-label col-md-2" for="Age">Age</label>
<div class="col-md-10">
- <input class="form-control input-validation-error" type="number" data-val="true" data-val-range="The field Age must be between 10 and 100." data-val-range-max="100" data-val-range-min="10" data-val-required="The Age field is required." id="Age" name="Age" value="1000" />
+ <input class="form-control input-validation-error" type="number" data-val="true" data-val-range="The field Age must be between 10 and 100." data-val-range-max="100" data-val-range-min="10" data-val-required="The Age field is required." id="Age" name="Age" value="1000" /><input name="__Invariant" type="hidden" value="Age" />
<span class="field-validation-error" data-valmsg-for="Age" data-valmsg-replace="true">The field Age must be between 10 and 100.</span>
</div>
</div>
@@ -53,14 +53,14 @@
<div class="form-group">
<label class="control-label col-md-2" for="JoinDate">JoinDate</label>
<div class="col-md-10">
- <input class="form-control input-validation-error" type="date" data-val="true" data-val-required="The JoinDate field is required." id="JoinDate" name="JoinDate" value="" />
+ <input class="form-control input-validation-error" type="date" data-val="true" data-val-required="The JoinDate field is required." id="JoinDate" name="JoinDate" value="" /><input name="__Invariant" type="hidden" value="JoinDate" />
<span class="field-validation-error" data-valmsg-for="JoinDate" data-valmsg-replace="true">The JoinDate field is required.</span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Salary">Salary</label>
<div class="col-md-10">
- <input class="form-control input-validation-error" type="number" id="Salary" name="Salary" value="z" />
+ <input class="form-control input-validation-error" type="number" id="Salary" name="Salary" value="z" /><input name="__Invariant" type="hidden" value="Salary" />
<span class="field-validation-error" data-valmsg-for="Salary" data-valmsg-replace="true">The value &#x27;z&#x27; is not valid for Salary.</span>
</div>
</div>
diff --git a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.html b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.html
index 441241eb84..b52a0e1539 100644
--- a/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.html
+++ b/src/Mvc/test/Mvc.FunctionalTests/compiler/resources/TagHelpersWebSite.Employee.Create.html
@@ -21,7 +21,7 @@
<div class="form-group">
<label class="control-label col-md-2" for="Age">Age</label>
<div class="col-md-10">
- <input class="form-control" type="number" data-val="true" data-val-range="The field Age must be between 10 and 100." data-val-range-max="100" data-val-range-min="10" data-val-required="The Age field is required." id="Age" name="Age" value="" />
+ <input class="form-control" type="number" data-val="true" data-val-range="The field Age must be between 10 and 100." data-val-range-max="100" data-val-range-min="10" data-val-required="The Age field is required." id="Age" name="Age" value="" /><input name="__Invariant" type="hidden" value="Age" />
<span class="field-validation-valid" data-valmsg-for="Age" data-valmsg-replace="true"></span>
</div>
</div>
@@ -51,14 +51,14 @@
<div class="form-group">
<label class="control-label col-md-2" for="JoinDate">JoinDate</label>
<div class="col-md-10">
- <input class="form-control" type="date" data-val="true" data-val-required="The JoinDate field is required." id="JoinDate" name="JoinDate" value="" />
+ <input class="form-control" type="date" data-val="true" data-val-required="The JoinDate field is required." id="JoinDate" name="JoinDate" value="" /><input name="__Invariant" type="hidden" value="JoinDate" />
<span class="field-validation-valid" data-valmsg-for="JoinDate" data-valmsg-replace="true"></span>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2" for="Salary">Salary</label>
<div class="col-md-10">
- <input class="form-control" type="number" id="Salary" name="Salary" value="" />
+ <input class="form-control" type="number" id="Salary" name="Salary" value="" /><input name="__Invariant" type="hidden" value="Salary" />
<span class="field-validation-valid" data-valmsg-for="Salary" data-valmsg-replace="true"></span>
</div>
</div>
diff --git a/src/Mvc/test/Mvc.IntegrationTests/ServicesModelBinderIntegrationTest.cs b/src/Mvc/test/Mvc.IntegrationTests/ServicesModelBinderIntegrationTest.cs
index 3dfb12f23e..67dbcd358f 100644
--- a/src/Mvc/test/Mvc.IntegrationTests/ServicesModelBinderIntegrationTest.cs
+++ b/src/Mvc/test/Mvc.IntegrationTests/ServicesModelBinderIntegrationTest.cs
@@ -332,6 +332,7 @@ public class ServicesModelBinderIntegrationTest
private class Person
{
+ [FromServices]
public ITypeActivatorCache Service { get; set; }
}
@@ -348,8 +349,7 @@ public class ServicesModelBinderIntegrationTest
// Similar to a custom IBindingSourceMetadata implementation or [ModelBinder] subclass on a custom service.
var metadataProvider = new TestModelMetadataProvider();
metadataProvider
- .ForProperty<Person>(nameof(Person.Service))
- .BindingDetails(binding => binding.BindingSource = BindingSource.Services);
+ .ForProperty<Person>(nameof(Person.Service));
var testContext = ModelBindingTestHelper.GetTestContext(metadataProvider: metadataProvider);
var modelState = testContext.ModelState;
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Controllers/CustomValueProviderController.cs b/src/Mvc/test/WebSites/BasicWebSite/Controllers/CustomValueProviderController.cs
new file mode 100644
index 0000000000..d62337f519
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/Controllers/CustomValueProviderController.cs
@@ -0,0 +1,26 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.ComponentModel;
+using Microsoft.AspNetCore.Mvc;
+
+namespace BasicWebSite.Controllers;
+
+public class CustomValueProviderController : Controller
+{
+ [HttpGet]
+ public string CustomValueProviderDisplayName(string customValueProviderDisplayName)
+ => customValueProviderDisplayName;
+
+ [HttpGet]
+ public int[] CustomValueProviderIntValues(int[] customValueProviderIntValues)
+ => customValueProviderIntValues;
+
+ [HttpGet]
+ public int?[] CustomValueProviderNullableIntValues(int?[] customValueProviderNullableIntValues)
+ => customValueProviderNullableIntValues;
+
+ [HttpGet]
+ public string[] CustomValueProviderStringValues(string[] customValueProviderStringValues)
+ => customValueProviderStringValues;
+}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Controllers/RequestScopedServiceController.cs b/src/Mvc/test/WebSites/BasicWebSite/Controllers/RequestScopedServiceController.cs
index e88bf983b9..6c70dad43b 100644
--- a/src/Mvc/test/WebSites/BasicWebSite/Controllers/RequestScopedServiceController.cs
+++ b/src/Mvc/test/WebSites/BasicWebSite/Controllers/RequestScopedServiceController.cs
@@ -45,4 +45,13 @@ public class RequestScopedServiceController : Controller
{
return requestIdService.RequestId;
}
+
+ [FromServices]
+ public RequestIdService RequestIdService { get; set; }
+
+ [HttpGet]
+ public string FromProperty()
+ {
+ return RequestIdService.RequestId;
+ }
}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/Controllers/TestingController.cs b/src/Mvc/test/WebSites/BasicWebSite/Controllers/TestingController.cs
index 5d18f5af9f..379ec96e64 100644
--- a/src/Mvc/test/WebSites/BasicWebSite/Controllers/TestingController.cs
+++ b/src/Mvc/test/WebSites/BasicWebSite/Controllers/TestingController.cs
@@ -77,10 +77,19 @@ public class TestingController : Controller
}
}
+ [HttpGet("Testing/RedirectHandler/Relative/")]
+ public IActionResult RedirectHandlerRelative()
+ {
+ return Redirect("Ok");
+ }
+
+ [HttpGet("Testing/RedirectHandler/Relative/Ok")]
+ public IActionResult RedirectHandlerRelativeOk() => Ok();
+
[HttpGet("Testing/RedirectHandler/Redirect303")]
public IActionResult RedirectHandlerStatusCode303()
{
- return new RedirectUsingStatusCode("Testing/Builder", HttpStatusCode.SeeOther);
+ return new RedirectUsingStatusCode("/Testing/Builder", HttpStatusCode.SeeOther);
}
public class RedirectUsingStatusCode : ActionResult
diff --git a/src/Mvc/test/WebSites/BasicWebSite/StartupWithCustomValueProvider.cs b/src/Mvc/test/WebSites/BasicWebSite/StartupWithCustomValueProvider.cs
new file mode 100644
index 0000000000..dbdda780eb
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/StartupWithCustomValueProvider.cs
@@ -0,0 +1,27 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using BasicWebSite.ValueProviders;
+
+namespace BasicWebSite;
+
+public class StartupWithCustomValueProvider
+{
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services
+ .AddMvc(o =>
+ {
+ o.ValueProviderFactories.Add(new CustomValueProviderFactory());
+ });
+ }
+
+ public void Configure(IApplicationBuilder app)
+ {
+ app.UseDeveloperExceptionPage();
+
+ app.UseRouting();
+
+ app.UseEndpoints((endpoints) => endpoints.MapDefaultControllerRoute());
+ }
+}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/ValueProviders/CustomValueProviderFactory.cs b/src/Mvc/test/WebSites/BasicWebSite/ValueProviders/CustomValueProviderFactory.cs
new file mode 100644
index 0000000000..8b259d2e50
--- /dev/null
+++ b/src/Mvc/test/WebSites/BasicWebSite/ValueProviders/CustomValueProviderFactory.cs
@@ -0,0 +1,45 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc.ModelBinding;
+using Microsoft.Extensions.Primitives;
+
+namespace BasicWebSite.ValueProviders;
+
+public class CustomValueProviderFactory : IValueProviderFactory
+{
+ public Task CreateValueProviderAsync(ValueProviderFactoryContext context)
+ {
+ context.ValueProviders.Add(new CustomValueProvider(context));
+ return Task.CompletedTask;
+ }
+
+ private class CustomValueProvider : IValueProvider
+ {
+ private static readonly Dictionary<string, Func<ValueProviderFactoryContext, StringValues>> Values = new()
+ {
+ { "customValueProviderDisplayName", context => context.ActionContext.ActionDescriptor.DisplayName },
+ { "customValueProviderIntValues", _ => new []{ null, "42", "100", null, "200" } },
+ { "customValueProviderNullableIntValues", _ => new []{ null, "42", "", "100", null, "200" } },
+ { "customValueProviderStringValues", _ => new []{ null, "foo", "", "bar", null, "baz" } },
+ };
+
+ private readonly ValueProviderFactoryContext _context;
+
+ public CustomValueProvider(ValueProviderFactoryContext context)
+ {
+ _context = context;
+ }
+
+ public bool ContainsPrefix(string prefix) => Values.ContainsKey(prefix);
+
+ public ValueProviderResult GetValue(string key)
+ {
+ if (Values.TryGetValue(key, out var fn))
+ {
+ return new ValueProviderResult(fn(_context));
+ }
+ return ValueProviderResult.None;
+ }
+ }
+}
diff --git a/src/Mvc/test/WebSites/BasicWebSite/_bower.json b/src/Mvc/test/WebSites/BasicWebSite/_bower.json
index 7f3bcb8b86..236422a3be 100644
--- a/src/Mvc/test/WebSites/BasicWebSite/_bower.json
+++ b/src/Mvc/test/WebSites/BasicWebSite/_bower.json
@@ -3,7 +3,7 @@
"description": "Web site demonstrating various validations.",
"private": true,
"dependencies": {
- "jquery-validation-unobtrusive": "3.2.6"
+ "jquery-validation-unobtrusive": "4.0.0"
},
"exportsOverride": {
"jquery-validation-unobtrusive": {
diff --git a/src/Mvc/test/WebSites/BasicWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Mvc/test/WebSites/BasicWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Mvc/test/WebSites/BasicWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Mvc/test/WebSites/BasicWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Mvc/test/WebSites/GenericHostWebSite/Controllers/TestingController.cs b/src/Mvc/test/WebSites/GenericHostWebSite/Controllers/TestingController.cs
index 32706ec874..f569935377 100644
--- a/src/Mvc/test/WebSites/GenericHostWebSite/Controllers/TestingController.cs
+++ b/src/Mvc/test/WebSites/GenericHostWebSite/Controllers/TestingController.cs
@@ -63,10 +63,19 @@ public class TestingController : Controller
}
}
+ [HttpGet("Testing/RedirectHandler/Relative/")]
+ public IActionResult RedirectHandlerRelative()
+ {
+ return Redirect("Ok");
+ }
+
+ [HttpGet("Testing/RedirectHandler/Relative/Ok")]
+ public IActionResult RedirectHandlerRelativeOk() => Ok();
+
[HttpGet("Testing/RedirectHandler/Redirect303")]
public IActionResult RedirectHandlerStatusCode303()
{
- return new RedirectUsingStatusCode("Testing/Builder", HttpStatusCode.SeeOther);
+ return new RedirectUsingStatusCode("/Testing/Builder", HttpStatusCode.SeeOther);
}
public class RedirectUsingStatusCode : ActionResult
diff --git a/src/Mvc/test/WebSites/GenericHostWebSite/_bower.json b/src/Mvc/test/WebSites/GenericHostWebSite/_bower.json
index 984cfb20bf..98efbceb0b 100644
--- a/src/Mvc/test/WebSites/GenericHostWebSite/_bower.json
+++ b/src/Mvc/test/WebSites/GenericHostWebSite/_bower.json
@@ -3,7 +3,7 @@
"description": "Web site demonstrating various validations.",
"private": true,
"dependencies": {
- "jquery-validation-unobtrusive": "3.2.6"
+ "jquery-validation-unobtrusive": "4.0.0"
},
"exportsOverride": {
"jquery-validation-unobtrusive": {
diff --git a/src/Mvc/test/WebSites/GenericHostWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Mvc/test/WebSites/GenericHostWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Mvc/test/WebSites/GenericHostWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Mvc/test/WebSites/GenericHostWebSite/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/Controllers/ConventionalControllerWithMetadata.cs b/src/Mvc/test/WebSites/RoutingWebSite/Controllers/ConventionalControllerWithMetadata.cs
new file mode 100644
index 0000000000..5dcc521bbf
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/Controllers/ConventionalControllerWithMetadata.cs
@@ -0,0 +1,16 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc;
+using Mvc.RoutingWebSite.Infrastructure;
+
+namespace Mvc.RoutingWebSite.Controllers;
+
+public class ConventionalControllerWithMetadata : Controller
+{
+ [Metadata("C")]
+ public IActionResult GetMetadata()
+ {
+ return Ok(HttpContext.GetEndpoint().Metadata.GetOrderedMetadata<MetadataAttribute>().Select(m => m.Value));
+ }
+}
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/Controllers/ItemsController.cs b/src/Mvc/test/WebSites/RoutingWebSite/Controllers/ItemsController.cs
new file mode 100644
index 0000000000..5156a01901
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/Controllers/ItemsController.cs
@@ -0,0 +1,26 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc;
+
+namespace RoutingWebSite;
+
+[Route("Items/[action]")]
+public class ItemsController : Controller
+{
+ public ActionResult<Dictionary<object, object>> Index()
+ {
+ return Ok(HttpContext.Items);
+ }
+
+ public string IndexWithSelectiveFilter()
+ {
+ return "Default response";
+ }
+
+ [Route("{arg}")]
+ public ActionResult<Dictionary<object, object>> IndexWithArgument(string arg)
+ {
+ return Ok(HttpContext.Items);
+ }
+}
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/ManualControllerFeatureProvider.cs b/src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/ManualControllerFeatureProvider.cs
new file mode 100644
index 0000000000..7d21b35053
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/ManualControllerFeatureProvider.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Controllers;
+
+namespace Mvc.RoutingWebSite.Infrastructure;
+
+internal class ManualControllerFeatureProvider : IApplicationFeatureProvider<ControllerFeature>
+{
+ private readonly Action<ControllerFeature> _action;
+ public ManualControllerFeatureProvider(Action<ControllerFeature> action)
+ {
+ _action = action;
+ }
+
+ public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
+ {
+ _action(feature);
+ }
+}
+
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/MetadataAttribute.cs b/src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/MetadataAttribute.cs
new file mode 100644
index 0000000000..7fd9caef58
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/Infrastructure/MetadataAttribute.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Mvc.RoutingWebSite.Infrastructure;
+
+internal class MetadataAttribute : Attribute
+{
+ public string Value { get; set; }
+
+ public MetadataAttribute(string value)
+ {
+ Value = value;
+ }
+}
+
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/StartupForEndpointFilters.cs b/src/Mvc/test/WebSites/RoutingWebSite/StartupForEndpointFilters.cs
new file mode 100644
index 0000000000..268c19d75f
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/StartupForEndpointFilters.cs
@@ -0,0 +1,57 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+
+namespace RoutingWebSite;
+
+public class StartupForEndpointFilters
+{
+ // Set up application services
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddMvc().AddNewtonsoftJson();
+
+ // Used by some controllers defined in this project.
+ services.Configure<RouteOptions>(options => options.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer));
+ services.AddScoped<TestResponseGenerator>();
+ // This is used by test response generator
+ services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
+ }
+
+ public virtual void Configure(IApplicationBuilder app)
+ {
+ app.UseRouting();
+ app.UseEndpoints(builder =>
+ {
+ builder.MapControllers().AddEndpointFilterFactory((context, next) =>
+ {
+ return async ic =>
+ {
+ ic.HttpContext.Items[nameof(IEndpointFilter)] = true;
+ ic.HttpContext.Items[nameof(EndpointFilterFactoryContext.MethodInfo.Name)] = context.MethodInfo.Name;
+ var result = await next(ic);
+ if (context.MethodInfo.Name == "IndexWithSelectiveFilter")
+ {
+ return "Intercepted";
+ }
+ return result;
+ };
+ }).AddEndpointFilterFactory((context, next) =>
+ {
+ if (context.MethodInfo.GetParameters().Length >= 1 && context.MethodInfo.GetParameters()[0].ParameterType == typeof(string))
+ {
+ return ic =>
+ {
+ var firstArg = ic.GetArgument<string>(0);
+ ic.HttpContext.Items[nameof(EndpointFilterInvocationContext.Arguments)] = firstArg;
+ return next(ic);
+ };
+ }
+
+ return ic => next(ic);
+ });
+ });
+ }
+}
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/StartupForGroups.cs b/src/Mvc/test/WebSites/RoutingWebSite/StartupForGroups.cs
new file mode 100644
index 0000000000..24eb14cb90
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/StartupForGroups.cs
@@ -0,0 +1,35 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Infrastructure;
+
+namespace RoutingWebSite;
+
+public class StartupForGroups
+{
+ // Set up application services
+ public void ConfigureServices(IServiceCollection services)
+ {
+ services.AddMvc().AddNewtonsoftJson();
+
+ // Used by some controllers defined in this project.
+ services.Configure<RouteOptions>(options => options.ConstraintMap["slugify"] = typeof(SlugifyParameterTransformer));
+ services.AddScoped<TestResponseGenerator>();
+ // This is used by test response generator
+ services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
+ }
+
+ public virtual void Configure(IApplicationBuilder app)
+ {
+ app.UseRouting();
+ app.UseEndpoints(endpoints =>
+ {
+ var pagesGroup = endpoints.MapGroup("/pages");
+ pagesGroup.MapRazorPages();
+
+ var controllerGroup = endpoints.MapGroup("/controllers/{org}");
+ controllerGroup.MapControllers();
+ });
+ }
+}
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/StartupForRouteGroupsWithMetadata.cs b/src/Mvc/test/WebSites/RoutingWebSite/StartupForRouteGroupsWithMetadata.cs
new file mode 100644
index 0000000000..336705f908
--- /dev/null
+++ b/src/Mvc/test/WebSites/RoutingWebSite/StartupForRouteGroupsWithMetadata.cs
@@ -0,0 +1,51 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Reflection;
+using Microsoft.AspNetCore.Mvc.ApplicationParts;
+using Microsoft.AspNetCore.Mvc.Controllers;
+using Mvc.RoutingWebSite.Controllers;
+using Mvc.RoutingWebSite.Infrastructure;
+
+namespace RoutingWebSite;
+
+public class StartupForRouteGroupsWithMetadata
+{
+ // Set up application services
+ public void ConfigureServices(IServiceCollection services)
+ {
+ var builder = services.AddControllers();
+
+ // Remove the default controller feature provider so we don't find all of the controllers
+ // in this app, we do this because adding controllers to multple groups with the same name
+ // does not work.
+ var old = builder.PartManager.FeatureProviders.OfType<IApplicationFeatureProvider<ControllerFeature>>().FirstOrDefault();
+ builder.PartManager.FeatureProviders.Remove(old);
+ builder.PartManager.FeatureProviders.Add(
+ new ManualControllerFeatureProvider(f =>
+ {
+ f.Controllers.Add(typeof(ItemsController).GetTypeInfo());
+ f.Controllers.Add(typeof(ConventionalControllerWithMetadata).GetTypeInfo());
+ }));
+ }
+
+ public virtual void Configure(IApplicationBuilder app)
+ {
+ app.UseRouting();
+ app.UseEndpoints(builder =>
+ {
+ // Map all controllers (defined in the
+ builder.MapControllers();
+
+ builder.MapGroup("/group1")
+ .WithMetadata(new MetadataAttribute("A"))
+ .MapControllerRoute("route1", "/metadata", new
+ {
+ controller = nameof(ConventionalControllerWithMetadata),
+ action = nameof(ConventionalControllerWithMetadata.GetMetadata)
+ })
+ .WithMetadata(new MetadataAttribute("B"));
+ });
+ }
+}
+
diff --git a/src/Mvc/test/WebSites/RoutingWebSite/TestParameterTransformer.cs b/src/Mvc/test/WebSites/RoutingWebSite/TestParameterTransformer.cs
index bb78306045..2bafe4a6e5 100644
--- a/src/Mvc/test/WebSites/RoutingWebSite/TestParameterTransformer.cs
+++ b/src/Mvc/test/WebSites/RoutingWebSite/TestParameterTransformer.cs
@@ -10,6 +10,6 @@ public class SlugifyParameterTransformer : IOutboundParameterTransformer
public string TransformOutbound(object value)
{
// Slugify value
- return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2", RegexOptions.None, TimeSpan.FromMilliseconds(100)).ToLowerInvariant();
+ return value == null ? null : Regex.Replace(value.ToString(), "([a-z])([A-Z])", "$1-$2", RegexOptions.None, TimeSpan.FromSeconds(10)).ToLowerInvariant();
}
}
diff --git a/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/Program.cs b/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/Program.cs
index 768b1dc7fb..eed2be0302 100644
--- a/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/Program.cs
+++ b/src/Mvc/test/WebSites/SimpleWebSiteWithWebApplicationBuilder/Program.cs
@@ -11,6 +11,9 @@ builder.Services.AddControllers();
var app = builder.Build();
+// just to make sure that it does not cause exceptions
+app.Urls.Add("http://localhost:8080");
+
app.MapControllers();
app.MapGet("/", () => "Hello World");
diff --git a/src/ObjectPool/src/DisposableObjectPool.cs b/src/ObjectPool/src/DisposableObjectPool.cs
index 47dbfe191e..bf92fce539 100644
--- a/src/ObjectPool/src/DisposableObjectPool.cs
+++ b/src/ObjectPool/src/DisposableObjectPool.cs
@@ -46,24 +46,24 @@ internal sealed class DisposableObjectPool<T> : DefaultObjectPool<T>, IDisposabl
private bool ReturnCore(T obj)
{
- bool returnedTooPool = false;
+ bool returnedToPool = false;
if (_isDefaultPolicy || (_fastPolicy?.Return(obj) ?? _policy.Return(obj)))
{
if (_firstItem == null && Interlocked.CompareExchange(ref _firstItem, obj, null) == null)
{
- returnedTooPool = true;
+ returnedToPool = true;
}
else
{
var items = _items;
- for (var i = 0; i < items.Length && !(returnedTooPool = Interlocked.CompareExchange(ref items[i].Element, obj, null) == null); i++)
+ for (var i = 0; i < items.Length && !(returnedToPool = Interlocked.CompareExchange(ref items[i].Element, obj, null) == null); i++)
{
}
}
}
- return returnedTooPool;
+ return returnedToPool;
}
public void Dispose()
diff --git a/src/ObjectPool/src/LeakTrackingObjectPool.cs b/src/ObjectPool/src/LeakTrackingObjectPool.cs
index 578fd9b62a..f3b478e781 100644
--- a/src/ObjectPool/src/LeakTrackingObjectPool.cs
+++ b/src/ObjectPool/src/LeakTrackingObjectPool.cs
@@ -16,6 +16,8 @@ namespace Microsoft.Extensions.ObjectPool;
/// </para>
/// </summary>
/// <typeparam name="T">The type of object which is being pooled.</typeparam>
+[Obsolete("LeakTrackingObjectPool<T> was only intended for internal use in diagnostic builds of .NET. " +
+ "It never functioned in publicly shipped .NET versions and may be removed in a future release.")]
public class LeakTrackingObjectPool<T> : ObjectPool<T> where T : class
{
private readonly ConditionalWeakTable<T, Tracker> _trackers = new ConditionalWeakTable<T, Tracker>();
@@ -55,7 +57,7 @@ public class LeakTrackingObjectPool<T> : ObjectPool<T> where T : class
_inner.Return(obj);
}
- private class Tracker : IDisposable
+ private sealed class Tracker : IDisposable
{
private readonly string _stack;
private bool _disposed;
diff --git a/src/ObjectPool/src/LeakTrackingObjectPoolProvider.cs b/src/ObjectPool/src/LeakTrackingObjectPoolProvider.cs
index 561ca00e7d..9482dbbadc 100644
--- a/src/ObjectPool/src/LeakTrackingObjectPoolProvider.cs
+++ b/src/ObjectPool/src/LeakTrackingObjectPoolProvider.cs
@@ -9,6 +9,8 @@ namespace Microsoft.Extensions.ObjectPool;
/// An <see cref="ObjectPoolProvider"/> that produces instances of
/// <see cref="LeakTrackingObjectPool{T}"/>.
/// </summary>
+[Obsolete("LeakTrackingObjectPoolProvider was only intended for internal use in diagnostic builds of .NET. " +
+ "It never functioned in publicly shipped .NET versions and may be removed in a future release.")]
public class LeakTrackingObjectPoolProvider : ObjectPoolProvider
{
private readonly ObjectPoolProvider _inner;
diff --git a/src/ObjectPool/src/PublicAPI.Shipped.txt b/src/ObjectPool/src/PublicAPI.Shipped.txt
index f75e28855a..397e098fe6 100644
--- a/src/ObjectPool/src/PublicAPI.Shipped.txt
+++ b/src/ObjectPool/src/PublicAPI.Shipped.txt
@@ -1,8 +1,8 @@
#nullable enable
-~Microsoft.Extensions.ObjectPool.DefaultObjectPool<T>
-~Microsoft.Extensions.ObjectPool.DefaultPooledObjectPolicy<T>
-~Microsoft.Extensions.ObjectPool.LeakTrackingObjectPool<T>
-~Microsoft.Extensions.ObjectPool.ObjectPool<T>
+Microsoft.Extensions.ObjectPool.DefaultObjectPool<T>
+Microsoft.Extensions.ObjectPool.DefaultPooledObjectPolicy<T>
+Microsoft.Extensions.ObjectPool.LeakTrackingObjectPool<T>
+Microsoft.Extensions.ObjectPool.ObjectPool<T>
abstract Microsoft.Extensions.ObjectPool.ObjectPool<T>.Get() -> T!
abstract Microsoft.Extensions.ObjectPool.ObjectPool<T>.Return(T! obj) -> void
abstract Microsoft.Extensions.ObjectPool.ObjectPoolProvider.Create<T>(Microsoft.Extensions.ObjectPool.IPooledObjectPolicy<T!>! policy) -> Microsoft.Extensions.ObjectPool.ObjectPool<T!>!
diff --git a/src/OpenApi/build.sh b/src/OpenApi/build.sh
index 491835c0cb..491835c0cb 100644..100755
--- a/src/OpenApi/build.sh
+++ b/src/OpenApi/build.sh
diff --git a/src/OpenApi/src/Microsoft.AspNetCore.OpenApi.csproj b/src/OpenApi/src/Microsoft.AspNetCore.OpenApi.csproj
index 91cc823072..34a81cb704 100644
--- a/src/OpenApi/src/Microsoft.AspNetCore.OpenApi.csproj
+++ b/src/OpenApi/src/Microsoft.AspNetCore.OpenApi.csproj
@@ -17,6 +17,7 @@
<ItemGroup>
<Compile Include="$(SharedSourceRoot)RoslynUtils\TypeHelper.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)ObjectMethodExecutor\**\*.cs" LinkBase="Shared" />
+ <Compile Include="$(SharedSourceRoot)PropertyAsParameterInfo.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)ParameterBindingMethodCache.cs" LinkBase="Shared" />
<Compile Include="$(SharedSourceRoot)TypeNameHelper\TypeNameHelper.cs" LinkBase="Shared" />
</ItemGroup>
diff --git a/src/OpenApi/src/OpenApiEndpointConventionBuilderExtensions.cs b/src/OpenApi/src/OpenApiEndpointConventionBuilderExtensions.cs
new file mode 100644
index 0000000000..72f1dc8fe1
--- /dev/null
+++ b/src/OpenApi/src/OpenApiEndpointConventionBuilderExtensions.cs
@@ -0,0 +1,107 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using System.Reflection;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.OpenApi;
+using Microsoft.AspNetCore.Routing;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.OpenApi.Models;
+
+namespace Microsoft.AspNetCore.Builder;
+
+/// <summary>
+/// Extension methods for annotating OpenAPI descriptions on an <see cref="Endpoint" />.
+/// </summary>
+public static class OpenApiEndpointConventionBuilderExtensions
+{
+ /// <summary>
+ /// Adds an OpenAPI annotation to <see cref="Endpoint.Metadata" /> associated
+ /// with the current endpoint.
+ /// </summary>
+ /// <param name="builder">The <see cref="IEndpointConventionBuilder"/>.</param>
+ /// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
+ public static TBuilder WithOpenApi<TBuilder>(this TBuilder builder) where TBuilder : IEndpointConventionBuilder
+ {
+ builder.Finally(builder => AddAndConfigureOperationForEndpoint(builder));
+ return builder;
+ }
+
+ /// <summary>
+ /// Adds an OpenAPI annotation to <see cref="Endpoint.Metadata" /> associated
+ /// with the current endpoint and modifies it with the given <paramref name="configureOperation"/>.
+ /// </summary>
+ /// <param name="builder">The <see cref="IEndpointConventionBuilder"/>.</param>
+ /// <param name="configureOperation">An <see cref="Func{T, TResult}"/> that returns a new OpenAPI annotation given a generated operation.</param>
+ /// <returns>A <see cref="IEndpointConventionBuilder"/> that can be used to further customize the endpoint.</returns>
+ public static TBuilder WithOpenApi<TBuilder>(this TBuilder builder, Func<OpenApiOperation, OpenApiOperation> configureOperation)
+ where TBuilder : IEndpointConventionBuilder
+ {
+ builder.Finally(endpointBuilder => AddAndConfigureOperationForEndpoint(endpointBuilder, configureOperation));
+ return builder;
+ }
+
+ private static void AddAndConfigureOperationForEndpoint(EndpointBuilder endpointBuilder, Func<OpenApiOperation, OpenApiOperation>? configure = null)
+ {
+ foreach (var item in endpointBuilder.Metadata)
+ {
+ if (item is OpenApiOperation existingOperation)
+ {
+ if (configure is not null)
+ {
+ var configuredOperation = configure(existingOperation);
+
+ if (!ReferenceEquals(configuredOperation, existingOperation))
+ {
+ endpointBuilder.Metadata.Remove(existingOperation);
+
+ // The only way configureOperation could be null here is if configureOperation violated it's signature and returned null.
+ // We could throw or something, removing the previous metadata seems fine.
+ if (configuredOperation is not null)
+ {
+ endpointBuilder.Metadata.Add(configuredOperation);
+ }
+ }
+ }
+
+ return;
+ }
+ }
+
+ // We cannot generate an OpenApiOperation without routeEndpointBuilder.RoutePattern.
+ if (endpointBuilder is not RouteEndpointBuilder routeEndpointBuilder)
+ {
+ return;
+ }
+
+ var pattern = routeEndpointBuilder.RoutePattern;
+ var metadata = new EndpointMetadataCollection(routeEndpointBuilder.Metadata);
+ var methodInfo = metadata.OfType<MethodInfo>().SingleOrDefault();
+
+ if (methodInfo is null)
+ {
+ return;
+ }
+
+ var applicationServices = routeEndpointBuilder.ApplicationServices;
+ var hostEnvironment = applicationServices.GetService<IHostEnvironment>();
+ var serviceProviderIsService = applicationServices.GetService<IServiceProviderIsService>();
+ var generator = new OpenApiGenerator(hostEnvironment, serviceProviderIsService);
+ var newOperation = generator.GetOpenApiOperation(methodInfo, metadata, pattern);
+
+ if (newOperation is not null)
+ {
+ if (configure is not null)
+ {
+ newOperation = configure(newOperation);
+ }
+
+ if (newOperation is not null)
+ {
+ routeEndpointBuilder.Metadata.Add(newOperation);
+ }
+ }
+ }
+}
diff --git a/src/OpenApi/src/OpenApiGenerator.cs b/src/OpenApi/src/OpenApiGenerator.cs
index e8f2f59d5b..5d527443e8 100644
--- a/src/OpenApi/src/OpenApiGenerator.cs
+++ b/src/OpenApi/src/OpenApiGenerator.cs
@@ -24,7 +24,7 @@ namespace Microsoft.AspNetCore.OpenApi;
/// <summary>
/// Defines a set of methods for generating OpenAPI definitions for endpoints.
/// </summary>
-internal class OpenApiGenerator
+internal sealed class OpenApiGenerator
{
private readonly IHostEnvironment? _environment;
private readonly IServiceProviderIsService? _serviceProviderIsService;
@@ -142,7 +142,7 @@ internal class OpenApiGenerator
if (discoveredTypeAnnotation is not null)
{
GenerateDefaultContent(discoveredContentTypeAnnotation, discoveredTypeAnnotation);
- eligibileAnnotations.Add(statusCode, (discoveredTypeAnnotation, discoveredContentTypeAnnotation));
+ eligibileAnnotations[statusCode] = (discoveredTypeAnnotation, discoveredContentTypeAnnotation);
}
}
@@ -182,7 +182,7 @@ internal class OpenApiGenerator
: discoveredTypeAnnotation;
GenerateDefaultContent(discoveredContentTypeAnnotation, discoveredTypeAnnotation);
- eligibileAnnotations.Add(statusCode, (discoveredTypeAnnotation, discoveredContentTypeAnnotation));
+ eligibileAnnotations[statusCode] = (discoveredTypeAnnotation, discoveredContentTypeAnnotation);
}
if (eligibileAnnotations.Count == 0)
@@ -193,23 +193,41 @@ internal class OpenApiGenerator
foreach (var annotation in eligibileAnnotations)
{
var statusCode = annotation.Key.ToString(CultureInfo.InvariantCulture);
- var (type, contentTypes) = annotation.Value;
+ var (_, contentTypes) = annotation.Value;
var responseContent = new Dictionary<string, OpenApiMediaType>();
foreach (var contentType in contentTypes)
{
- responseContent[contentType] = new OpenApiMediaType
- {
- Schema = new OpenApiSchema { Type = SchemaGenerator.GetOpenApiSchemaType(type) }
- };
+ responseContent[contentType] = new OpenApiMediaType();
}
- responses[statusCode] = new OpenApiResponse { Content = responseContent };
+ responses[statusCode] = new OpenApiResponse
+ {
+ Content = responseContent,
+ Description = GetResponseDescription(statusCode)
+ };
}
-
return responses;
}
+ private static string GetResponseDescription(string statusCode)
+ {
+ if (statusCode.Length != 3)
+ {
+ return string.Empty;
+ }
+ var first = statusCode[0];
+ return first switch
+ {
+ '1' => "Information",
+ '2' => "Success",
+ '3' => "Redirection",
+ '4' => "Client error",
+ '5' => "Server error",
+ _ => string.Empty,
+ };
+ }
+
private static void GenerateDefaultContent(MediaTypeCollection discoveredContentTypeAnnotation, Type? discoveredTypeAnnotation)
{
if (discoveredContentTypeAnnotation.Count == 0)
@@ -250,7 +268,8 @@ internal class OpenApiGenerator
var hasFormOrBodyParameter = false;
ParameterInfo? requestBodyParameter = null;
- foreach (var parameter in methodInfo.GetParameters())
+ var parameters = PropertyAsParameterInfo.Flatten(methodInfo.GetParameters(), ParameterBindingMethodCache);
+ foreach (var parameter in parameters)
{
var (bodyOrFormParameter, _) = GetOpenApiParameterLocation(parameter, pattern, false);
hasFormOrBodyParameter |= bodyOrFormParameter;
@@ -263,30 +282,22 @@ internal class OpenApiGenerator
var acceptsMetadata = metadata.GetMetadata<IAcceptsMetadata>();
var requestBodyContent = new Dictionary<string, OpenApiMediaType>();
- var isRequired = false;
if (acceptsMetadata is not null)
{
foreach (var contentType in acceptsMetadata.ContentTypes)
{
- requestBodyContent[contentType] = new OpenApiMediaType
- {
- Schema = new OpenApiSchema
- {
- Type = SchemaGenerator.GetOpenApiSchemaType(acceptsMetadata.RequestType ?? requestBodyParameter?.ParameterType)
- }
- };
+ requestBodyContent[contentType] = new OpenApiMediaType();
}
- isRequired = !acceptsMetadata.IsOptional;
- }
- if (!hasFormOrBodyParameter)
- {
- return new OpenApiRequestBody()
+ if (!hasFormOrBodyParameter)
{
- Required = isRequired,
- Content = requestBodyContent
- };
+ return new OpenApiRequestBody()
+ {
+ Required = !acceptsMetadata.IsOptional,
+ Content = requestBodyContent
+ };
+ }
}
if (requestBodyParameter is not null)
@@ -297,23 +308,11 @@ internal class OpenApiGenerator
var hasFormAttribute = requestBodyParameter.GetCustomAttributes().OfType<IFromFormMetadata>().FirstOrDefault() != null;
if (isFormType || hasFormAttribute)
{
- requestBodyContent["multipart/form-data"] = new OpenApiMediaType
- {
- Schema = new OpenApiSchema
- {
- Type = SchemaGenerator.GetOpenApiSchemaType(requestBodyParameter.ParameterType)
- }
- };
+ requestBodyContent["multipart/form-data"] = new OpenApiMediaType();
}
else
{
- requestBodyContent["application/json"] = new OpenApiMediaType
- {
- Schema = new OpenApiSchema
- {
- Type = SchemaGenerator.GetOpenApiSchemaType(requestBodyParameter.ParameterType)
- }
- };
+ requestBodyContent["application/json"] = new OpenApiMediaType();
}
}
@@ -336,7 +335,23 @@ internal class OpenApiGenerator
private List<OpenApiTag> GetOperationTags(MethodInfo methodInfo, EndpointMetadataCollection metadata)
{
- var tags = metadata.GetMetadata<ITagsMetadata>();
+ var metadataList = metadata.GetOrderedMetadata<ITagsMetadata>();
+
+ if (metadataList.Count > 0)
+ {
+ var tags = new List<OpenApiTag>();
+
+ foreach (var metadataItem in metadataList)
+ {
+ foreach (var tag in metadataItem.Tags)
+ {
+ tags.Add(new OpenApiTag() { Name = tag });
+ }
+ }
+
+ return tags;
+ }
+
string controllerName;
if (methodInfo.DeclaringType is not null && !TypeHelper.IsCompilerGeneratedType(methodInfo.DeclaringType))
@@ -350,37 +365,38 @@ internal class OpenApiGenerator
controllerName = _environment?.ApplicationName ?? string.Empty;
}
- return tags is not null
- ? tags.Tags.Select(tag => new OpenApiTag() { Name = tag }).ToList()
- : new List<OpenApiTag>() { new OpenApiTag() { Name = controllerName } };
+ return new List<OpenApiTag>() { new OpenApiTag() { Name = controllerName } };
}
private List<OpenApiParameter> GetOpenApiParameters(MethodInfo methodInfo, EndpointMetadataCollection metadata, RoutePattern pattern, bool disableInferredBody)
{
- var parameters = methodInfo.GetParameters();
+ var parameters = PropertyAsParameterInfo.Flatten(methodInfo.GetParameters(), ParameterBindingMethodCache);
var openApiParameters = new List<OpenApiParameter>();
foreach (var parameter in parameters)
{
- var (isBodyOrFormParameter, parameterLocation) = GetOpenApiParameterLocation(parameter, pattern, disableInferredBody);
+ if (parameter.Name is null)
+ {
+ throw new InvalidOperationException($"Encountered a parameter of type '{parameter.ParameterType}' without a name. Parameters must have a name.");
+ }
- // If the parameter isn't something that would be populated in RequestBody
- // or doesn't have a valid ParameterLocation, then it must be a service
- // parameter that we can ignore.
- if (!isBodyOrFormParameter && parameterLocation is null)
+ var (_, parameterLocation) = GetOpenApiParameterLocation(parameter, pattern, disableInferredBody);
+
+ // if the parameter doesn't have a valid location
+ // then we should ignore it
+ if (parameterLocation is null)
{
continue;
}
-
var nullabilityContext = new NullabilityInfoContext();
var nullability = nullabilityContext.Create(parameter);
var isOptional = parameter.HasDefaultValue || nullability.ReadState != NullabilityState.NotNull;
+ var name = pattern.GetParameter(parameter.Name) is { } routeParameter ? routeParameter.Name : parameter.Name;
var openApiParameter = new OpenApiParameter()
{
- Name = parameter.Name,
+ Name = name,
In = parameterLocation,
Content = GetOpenApiParameterContent(metadata),
- Schema = new OpenApiSchema { Type = SchemaGenerator.GetOpenApiSchemaType(parameter.ParameterType) },
Required = !isOptional
};
diff --git a/src/OpenApi/src/OpenApiRouteHandlerBuilderExtensions.cs b/src/OpenApi/src/OpenApiRouteHandlerBuilderExtensions.cs
deleted file mode 100644
index 878ecc2bdf..0000000000
--- a/src/OpenApi/src/OpenApiRouteHandlerBuilderExtensions.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Linq;
-using System.Reflection;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Http;
-using Microsoft.AspNetCore.Routing;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Hosting;
-using Microsoft.OpenApi.Models;
-
-namespace Microsoft.AspNetCore.OpenApi;
-
-/// <summary>
-/// Extension methods for annotating OpenAPI descriptions on an <see cref="Endpoint" />.
-/// </summary>
-public static class OpenApiRouteHandlerBuilderExtensions
-{
- /// <summary>
- /// Adds an OpenAPI annotation to <see cref="Endpoint.Metadata" /> associated
- /// with the current endpoint.
- /// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
- /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder WithOpenApi(this RouteHandlerBuilder builder)
- {
- builder.Add(endpointBuilder =>
- {
- if (endpointBuilder is RouteEndpointBuilder routeEndpointBuilder)
- {
- var openApiOperation = GetOperationForEndpoint(routeEndpointBuilder);
- if (openApiOperation != null)
- {
- routeEndpointBuilder.Metadata.Add(openApiOperation);
- }
- };
- });
- return builder;
- }
-
- /// <summary>
- /// Adds an OpenAPI annotation to <see cref="Endpoint.Metadata" /> associated
- /// with the current endpoint and modifies it with the given <paramref name="configureOperation"/>.
- /// </summary>
- /// <param name="builder">The <see cref="RouteHandlerBuilder"/>.</param>
- /// <param name="configureOperation">An <see cref="Func{T, TResult}"/> that returns a new OpenAPI annotation given a generated operation.</param>
- /// <returns>A <see cref="RouteHandlerBuilder"/> that can be used to further customize the endpoint.</returns>
- public static RouteHandlerBuilder WithOpenApi(this RouteHandlerBuilder builder, Func<OpenApiOperation, OpenApiOperation> configureOperation)
- {
- builder.Add(endpointBuilder =>
- {
- if (endpointBuilder is RouteEndpointBuilder routeEndpointBuilder)
- {
- var openApiOperation = GetOperationForEndpoint(routeEndpointBuilder);
- if (openApiOperation != null)
- {
- routeEndpointBuilder.Metadata.Add(configureOperation(openApiOperation));
- }
- };
- });
- return builder;
- }
-
- private static OpenApiOperation? GetOperationForEndpoint(RouteEndpointBuilder routeEndpointBuilder)
- {
- var pattern = routeEndpointBuilder.RoutePattern;
- var metadata = new EndpointMetadataCollection(routeEndpointBuilder.Metadata);
- var methodInfo = metadata.OfType<MethodInfo>().SingleOrDefault();
- var serviceProvider = routeEndpointBuilder.ServiceProvider;
-
- if (methodInfo == null || serviceProvider == null)
- {
- return null;
- }
-
- var hostEnvironment = serviceProvider.GetService<IHostEnvironment>();
- var serviceProviderIsService = serviceProvider.GetService<IServiceProviderIsService>();
- var generator = new OpenApiGenerator(hostEnvironment, serviceProviderIsService);
- return generator.GetOpenApiOperation(methodInfo, metadata, pattern);
- }
-}
diff --git a/src/OpenApi/src/PublicAPI.Unshipped.txt b/src/OpenApi/src/PublicAPI.Unshipped.txt
index d83debd1c5..ca80deee67 100644
--- a/src/OpenApi/src/PublicAPI.Unshipped.txt
+++ b/src/OpenApi/src/PublicAPI.Unshipped.txt
@@ -1,4 +1,4 @@
#nullable enable
-Microsoft.AspNetCore.OpenApi.OpenApiRouteHandlerBuilderExtensions
-static Microsoft.AspNetCore.OpenApi.OpenApiRouteHandlerBuilderExtensions.WithOpenApi(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
-static Microsoft.AspNetCore.OpenApi.OpenApiRouteHandlerBuilderExtensions.WithOpenApi(this Microsoft.AspNetCore.Builder.RouteHandlerBuilder! builder, System.Func<Microsoft.OpenApi.Models.OpenApiOperation!, Microsoft.OpenApi.Models.OpenApiOperation!>! configureOperation) -> Microsoft.AspNetCore.Builder.RouteHandlerBuilder!
+Microsoft.AspNetCore.Builder.OpenApiEndpointConventionBuilderExtensions
+static Microsoft.AspNetCore.Builder.OpenApiEndpointConventionBuilderExtensions.WithOpenApi<TBuilder>(this TBuilder builder) -> TBuilder
+static Microsoft.AspNetCore.Builder.OpenApiEndpointConventionBuilderExtensions.WithOpenApi<TBuilder>(this TBuilder builder, System.Func<Microsoft.OpenApi.Models.OpenApiOperation!, Microsoft.OpenApi.Models.OpenApiOperation!>! configureOperation) -> TBuilder
diff --git a/src/OpenApi/src/SchemaGenerator.cs b/src/OpenApi/src/SchemaGenerator.cs
deleted file mode 100644
index 3eeb16fe4e..0000000000
--- a/src/OpenApi/src/SchemaGenerator.cs
+++ /dev/null
@@ -1,44 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.OpenApi;
-
-internal static class SchemaGenerator
-{
- internal static string GetOpenApiSchemaType(Type? inputType)
- {
- if (inputType == null)
- {
- throw new ArgumentNullException(nameof(inputType));
- }
-
- var type = Nullable.GetUnderlyingType(inputType) ?? inputType;
-
- if (typeof(string).IsAssignableFrom(type) || typeof(DateTime).IsAssignableTo(type))
- {
- return "string";
- }
- else if (typeof(bool).IsAssignableFrom(type))
- {
- return "boolean";
- }
- else if (typeof(int).IsAssignableFrom(type)
- || typeof(double).IsAssignableFrom(type)
- || typeof(float).IsAssignableFrom(type))
- {
- return "number";
- }
- else if (typeof(long).IsAssignableFrom(type))
- {
- return "integer";
- }
- else if (type.IsArray)
- {
- return "array";
- }
- else
- {
- return "object";
- }
- }
-}
diff --git a/src/OpenApi/test/OpenApiGeneratorTests.cs b/src/OpenApi/test/OpenApiGeneratorTests.cs
index 459966c62f..cdd95ba37e 100644
--- a/src/OpenApi/test/OpenApiGeneratorTests.cs
+++ b/src/OpenApi/test/OpenApiGeneratorTests.cs
@@ -1,8 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Buffers;
+using System.Linq.Expressions;
using System.Reflection;
using System.Security.Claims;
+using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Metadata;
using Microsoft.AspNetCore.Mvc;
@@ -50,13 +53,39 @@ public class OpenApiOperationGeneratorTests
}
[Fact]
+ public void UsesTagsFromMultipleCallsToWithTags()
+ {
+ var testBuilder = new TestEndpointConventionBuilder();
+ var routeHandlerBuilder = new RouteHandlerBuilder(new[] { testBuilder });
+
+ routeHandlerBuilder
+ .WithTags("A")
+ .WithTags("B");
+
+ var operation = GetOpenApiOperation(() => { }, additionalMetadata: testBuilder.Metadata.ToArray());
+
+ Assert.Collection(operation.Tags,
+ tag => Assert.Equal("A", tag.Name),
+ tag => Assert.Equal("B", tag.Name));
+ }
+
+ [Fact]
+ public void ThrowsInvalidOperationExceptionGivenUnnamedParameter()
+ {
+ var unnamedParameter = Expression.Parameter(typeof(int));
+ var lambda = Expression.Lambda(Expression.Block(), unnamedParameter);
+ var ex = Assert.Throws<InvalidOperationException>(() => GetOpenApiOperation(lambda.Compile()));
+ Assert.Equal("Encountered a parameter of type 'System.Runtime.CompilerServices.Closure' without a name. Parameters must have a name.", ex.Message);
+ }
+
+ [Fact]
public void AddsRequestFormatFromMetadata()
{
static void AssertCustomRequestFormat(OpenApiOperation operation)
{
- var request = Assert.Single(operation.Parameters);
- var content = Assert.Single(request.Content);
- Assert.Equal("application/custom", content.Key);
+ Assert.Empty(operation.Parameters);
+ var content = operation.RequestBody.Content.Keys.FirstOrDefault();
+ Assert.Equal("application/custom", content);
}
AssertCustomRequestFormat(GetOpenApiOperation(
@@ -72,10 +101,11 @@ public class OpenApiOperationGeneratorTests
var operation = GetOpenApiOperation(
[Consumes("application/custom0", "application/custom1")] (InferredJsonClass fromBody) => { });
- var request = Assert.Single(operation.Parameters);
+ Assert.Empty(operation.Parameters);
- Assert.Equal(2, request.Content.Count);
- Assert.Equal(new[] { "application/custom0", "application/custom1" }, request.Content.Keys);
+ var content = operation.RequestBody.Content;
+ Assert.Equal(2, content.Count);
+ Assert.Equal(new[] { "application/custom0", "application/custom1" }, content.Keys);
}
[Fact]
@@ -85,11 +115,11 @@ public class OpenApiOperationGeneratorTests
[Consumes(typeof(InferredJsonClass), "application/custom0", "application/custom1", IsOptional = true)] () => { });
var request = operation.RequestBody;
Assert.NotNull(request);
-
Assert.Equal(2, request.Content.Count);
+ Assert.Empty(operation.Parameters);
- Assert.Equal("object", request.Content.First().Value.Schema.Type);
- Assert.Equal("object", request.Content.Last().Value.Schema.Type);
+ Assert.Equal("application/custom0", request.Content.First().Key);
+ Assert.Equal("application/custom1", request.Content.Last().Key);
Assert.False(request.Required);
}
@@ -104,8 +134,10 @@ public class OpenApiOperationGeneratorTests
var request = operation.RequestBody;
Assert.NotNull(request);
- Assert.Equal("object", request.Content.First().Value.Schema.Type);
+ Assert.Equal("application/custom0", request.Content.First().Key);
+ Assert.Equal("application/custom1", request.Content.Last().Key);
Assert.True(request.Required);
+ Assert.Empty(operation.Parameters);
}
#nullable disable
@@ -118,7 +150,6 @@ public class OpenApiOperationGeneratorTests
var response = Assert.Single(operation.Responses);
Assert.Equal("200", response.Key);
var formats = Assert.Single(response.Value.Content);
- Assert.Equal(expectedType, formats.Value.Schema.Type);
Assert.Equal("application/json", formats.Key);
}
@@ -135,7 +166,6 @@ public class OpenApiOperationGeneratorTests
var response = Assert.Single(operation.Responses);
Assert.Equal("200", response.Key);
var formats = Assert.Single(response.Value.Content);
- Assert.Equal("string", formats.Value.Schema.Type);
Assert.Equal("text/plain", formats.Key);
}
@@ -159,8 +189,8 @@ public class OpenApiOperationGeneratorTests
{
var operation = GetOpenApiOperation(
[ProducesResponseType(typeof(TimeSpan), StatusCodes.Status201Created)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- () => new InferredJsonClass());
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ () => new InferredJsonClass());
var responses = operation.Responses;
@@ -170,14 +200,13 @@ public class OpenApiOperationGeneratorTests
var content = Assert.Single(createdResponseType.Content);
Assert.NotNull(createdResponseType);
- Assert.Equal("object", content.Value.Schema.Type);
- Assert.Equal("application/json", createdResponseType.Content.Keys.First());
+ Assert.Equal("application/json", content.Key);
var badRequestResponseType = responses["400"];
Assert.NotNull(badRequestResponseType);
- Assert.Equal("object", badRequestResponseType.Content.Values.First().Schema.Type);
- Assert.Equal("application/json", badRequestResponseType.Content.Keys.First());
+ var badRequestContent = Assert.Single(badRequestResponseType.Content);
+ Assert.Equal("application/json", badRequestContent.Key);
}
[Fact]
@@ -185,8 +214,8 @@ public class OpenApiOperationGeneratorTests
{
var operation = GetOpenApiOperation(
[ProducesResponseType(typeof(InferredJsonClass), StatusCodes.Status201Created)]
- [ProducesResponseType(StatusCodes.Status400BadRequest)]
- () => Results.Ok(new InferredJsonClass()));
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ () => Results.Ok(new InferredJsonClass()));
Assert.Equal(2, operation.Responses.Count);
@@ -194,7 +223,6 @@ public class OpenApiOperationGeneratorTests
var createdResponseContent = Assert.Single(createdResponseType.Content);
Assert.NotNull(createdResponseType);
- Assert.Equal("object", createdResponseContent.Value.Schema.Type);
Assert.Equal("application/json", createdResponseContent.Key);
var badRequestResponseType = operation.Responses["400"];
@@ -204,12 +232,95 @@ public class OpenApiOperationGeneratorTests
}
[Fact]
+ public void DefaultResponseDescriptionIsCorrect()
+ {
+ var operation = GetOpenApiOperation(
+ [ProducesResponseType(typeof(TimeSpan), StatusCodes.Status201Created)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ () => new InferredJsonClass());
+
+ Assert.Equal(2, operation.Responses.Count);
+
+ var successResponse = operation.Responses["201"];
+ Assert.Equal("Success", successResponse.Description);
+
+ var clientErrorResponse = operation.Responses["400"];
+ Assert.Equal("Client error", clientErrorResponse.Description);
+ }
+
+ [Fact]
+ public void DefaultResponseDescriptionIsCorrectForTwoSimilarResponses()
+ {
+ var operation = GetOpenApiOperation(
+ [ProducesResponseType(StatusCodes.Status100Continue)]
+ [ProducesResponseType(StatusCodes.Status101SwitchingProtocols)]
+ () => new InferredJsonClass());
+
+ Assert.Equal(2, operation.Responses.Count);
+
+ var continueResponse = operation.Responses["100"];
+ Assert.Equal("Information", continueResponse.Description);
+
+ var switchingProtocolsResponse = operation.Responses["101"];
+ Assert.Equal("Information", switchingProtocolsResponse.Description);
+ }
+
+ [Fact]
+ public void AllDefaultResponseDescriptions()
+ {
+ var operation = GetOpenApiOperation(
+ [ProducesResponseType(StatusCodes.Status100Continue)]
+ [ProducesResponseType(typeof(TimeSpan), StatusCodes.Status201Created)]
+ [ProducesResponseType(StatusCodes.Status300MultipleChoices)]
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
+ [ProducesResponseType(StatusCodes.Status500InternalServerError)]
+ () => new InferredJsonClass());
+
+ Assert.Equal(5, operation.Responses.Count);
+
+ var continueResponse = operation.Responses["100"];
+ Assert.Equal("Information", continueResponse.Description);
+
+ var createdResponse = operation.Responses["201"];
+ Assert.Equal("Success", createdResponse.Description);
+
+ var multipleChoicesResponse = operation.Responses["300"];
+ Assert.Equal("Redirection", multipleChoicesResponse.Description);
+
+ var badRequestResponse = operation.Responses["400"];
+ Assert.Equal("Client error", badRequestResponse.Description);
+
+ var InternalServerErrorResponse = operation.Responses["500"];
+ Assert.Equal("Server error", InternalServerErrorResponse.Description);
+ }
+
+ [Fact]
+ public void UnregisteredStatusCodeDescriptions()
+ {
+ var operation = GetOpenApiOperation(
+ [ProducesResponseType(46)]
+ [ProducesResponseType(654)]
+ [ProducesResponseType(1111)]
+ () => new InferredJsonClass());
+
+ Assert.Equal(3, operation.Responses.Count);
+
+ var unregisteredResponse1 = operation.Responses["46"];
+ Assert.Equal("", unregisteredResponse1.Description);
+
+ var unregisteredResponse2 = operation.Responses["654"];
+ Assert.Equal("", unregisteredResponse2.Description);
+
+ var unregisteredResponse3 = operation.Responses["1111"];
+ Assert.Equal("", unregisteredResponse3.Description);
+ }
+
+ [Fact]
public void AddsFromRouteParameterAsPath()
{
static void AssertPathParameter(OpenApiOperation operation)
{
var param = Assert.Single(operation.Parameters);
- Assert.Equal("number", param.Schema.Type);
Assert.Equal(ParameterLocation.Path, param.In);
}
@@ -223,7 +334,6 @@ public class OpenApiOperationGeneratorTests
static void AssertPathParameter(OpenApiOperation operation)
{
var param = Assert.Single(operation.Parameters);
- Assert.Equal("object", param.Schema.Type);
Assert.Equal(ParameterLocation.Path, param.In);
}
AssertPathParameter(GetOpenApiOperation((TryParseStringRecord foo) => { }, pattern: "/{foo}"));
@@ -235,7 +345,6 @@ public class OpenApiOperationGeneratorTests
static void AssertPathParameter(OpenApiOperation operation)
{
var param = Assert.Single(operation.Parameters);
- Assert.Equal("number", param.Schema.Type);
Assert.Equal(ParameterLocation.Path, param.In);
}
@@ -249,7 +358,6 @@ public class OpenApiOperationGeneratorTests
static void AssertPathParameter(OpenApiOperation operation)
{
var param = Assert.Single(operation.Parameters);
- Assert.Equal("object", param.Schema.Type);
Assert.Equal(ParameterLocation.Path, param.In);
}
AssertPathParameter(GetOpenApiOperation((TryParseStringRecordStruct foo) => { }, pattern: "/{foo}"));
@@ -261,43 +369,24 @@ public class OpenApiOperationGeneratorTests
static void AssertQueryParameter(OpenApiOperation operation, string type)
{
var param = Assert.Single(operation.Parameters); ;
- Assert.Equal(type, param.Schema.Type);
Assert.Equal(ParameterLocation.Query, param.In);
}
- AssertQueryParameter(GetOpenApiOperation((int foo) => { }, "/"), "number");
- AssertQueryParameter(GetOpenApiOperation(([FromQuery] int foo) => { }), "number");
+ AssertQueryParameter(GetOpenApiOperation((int foo) => { }, "/"), "integer");
+ AssertQueryParameter(GetOpenApiOperation(([FromQuery] int foo) => { }), "integer");
AssertQueryParameter(GetOpenApiOperation(([FromQuery] TryParseStringRecordStruct foo) => { }), "object");
AssertQueryParameter(GetOpenApiOperation((int[] foo) => { }, "/"), "array");
AssertQueryParameter(GetOpenApiOperation((string[] foo) => { }, "/"), "array");
- AssertQueryParameter(GetOpenApiOperation((StringValues foo) => { }, "/"), "object");
+ AssertQueryParameter(GetOpenApiOperation((StringValues foo) => { }, "/"), "array");
AssertQueryParameter(GetOpenApiOperation((TryParseStringRecordStruct[] foo) => { }, "/"), "array");
}
- [Theory]
- [InlineData("Put")]
- [InlineData("Post")]
- public void BodyIsInferredForArraysInsteadOfQuerySomeHttpMethods(string httpMethod)
- {
- static void AssertBody(OpenApiOperation operation, string expectedType)
- {
- var requestBody = operation.RequestBody;
- var content = Assert.Single(requestBody.Content);
- Assert.Equal(expectedType, content.Value.Schema.Type);
- }
-
- AssertBody(GetOpenApiOperation((int[] foo) => { }, "/", httpMethods: new[] { httpMethod }), "array");
- AssertBody(GetOpenApiOperation((string[] foo) => { }, "/", httpMethods: new[] { httpMethod }), "array");
- AssertBody(GetOpenApiOperation((TryParseStringRecordStruct[] foo) => { }, "/", httpMethods: new[] { httpMethod }), "array");
- }
-
[Fact]
public void AddsFromHeaderParameterAsHeader()
{
var operation = GetOpenApiOperation(([FromHeader] int foo) => { });
var param = Assert.Single(operation.Parameters);
- Assert.Equal("number", param.Schema.Type);
Assert.Equal(ParameterLocation.Header, param.In);
}
@@ -321,11 +410,12 @@ public class OpenApiOperationGeneratorTests
{
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
- Assert.Equal(expectedType, content.Value.Schema.Type);
+ Assert.Equal("application/json", content.Key);
+ Assert.Empty(operation.Parameters);
}
AssertBodyParameter(GetOpenApiOperation((InferredJsonClass foo) => { }), "foo", "object");
- AssertBodyParameter(GetOpenApiOperation(([FromBody] int bar) => { }), "bar", "number");
+ AssertBodyParameter(GetOpenApiOperation(([FromBody] int bar) => { }), "bar", "integer");
}
#nullable enable
@@ -334,28 +424,58 @@ public class OpenApiOperationGeneratorTests
public void AddsMultipleParameters()
{
var operation = GetOpenApiOperation(([FromRoute] int foo, int bar, InferredJsonClass fromBody) => { });
- Assert.Equal(3, operation.Parameters.Count);
+ Assert.Equal(2, operation.Parameters.Count);
var fooParam = operation.Parameters[0];
Assert.Equal("foo", fooParam.Name);
- Assert.Equal("number", fooParam.Schema.Type);
Assert.Equal(ParameterLocation.Path, fooParam.In);
Assert.True(fooParam.Required);
var barParam = operation.Parameters[1];
Assert.Equal("bar", barParam.Name);
- Assert.Equal("number", barParam.Schema.Type);
Assert.Equal(ParameterLocation.Query, barParam.In);
Assert.True(barParam.Required);
var fromBodyParam = operation.RequestBody;
- Assert.Equal("object", fromBodyParam.Content.First().Value.Schema.Type);
+ var fromBodyContent = Assert.Single(fromBodyParam.Content);
+ Assert.Equal("application/json", fromBodyContent.Key);
Assert.True(fromBodyParam.Required);
}
-
#nullable disable
[Fact]
+ public void AddsMultipleParametersFromParametersAttribute()
+ {
+ static void AssertParameters(OpenApiOperation operation, string capturedName = "Foo")
+ {
+ Assert.Collection(
+ operation.Parameters,
+ param =>
+ {
+ Assert.Equal(capturedName, param.Name);
+ Assert.Equal(ParameterLocation.Path, param.In);
+ Assert.True(param.Required);
+ },
+ param =>
+ {
+ Assert.Equal("Bar", param.Name);
+ Assert.Equal(ParameterLocation.Query, param.In);
+ Assert.True(param.Required);
+ }
+ );
+ }
+
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListClass req) => { }));
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListClassWithReadOnlyProperties req) => { }));
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListStruct req) => { }));
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListRecord req) => { }));
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListRecordStruct req) => { }));
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListRecordWithoutPositionalParameters req) => { }));
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListRecordWithoutAttributes req) => { }, "/{foo}"), "foo");
+ AssertParameters(GetOpenApiOperation(([AsParameters] ArgumentListRecordWithoutAttributes req) => { }, "/{Foo}"));
+ }
+
+ [Fact]
public void TestParameterIsRequired()
{
var operation = GetOpenApiOperation(([FromRoute] int foo, int? bar) => { });
@@ -363,13 +483,11 @@ public class OpenApiOperationGeneratorTests
var fooParam = operation.Parameters[0];
Assert.Equal("foo", fooParam.Name);
- Assert.Equal("number", fooParam.Schema.Type);
Assert.Equal(ParameterLocation.Path, fooParam.In);
Assert.True(fooParam.Required);
var barParam = operation.Parameters[1];
Assert.Equal("bar", barParam.Name);
- Assert.Equal("number", barParam.Schema.Type);
Assert.Equal(ParameterLocation.Query, barParam.In);
Assert.False(barParam.Required);
}
@@ -383,12 +501,10 @@ public class OpenApiOperationGeneratorTests
Assert.Equal(2, operation.Parameters.Count);
var fooParam = operation.Parameters[0];
- Assert.Equal("string", fooParam.Schema.Type);
Assert.Equal(ParameterLocation.Query, fooParam.In);
Assert.False(fooParam.Required);
var barParam = operation.Parameters[1];
- Assert.Equal("number", barParam.Schema.Type);
Assert.Equal(ParameterLocation.Query, barParam.In);
Assert.True(barParam.Required);
}
@@ -404,7 +520,7 @@ public class OpenApiOperationGeneratorTests
// Assert
var responses = Assert.Single(operation.Responses);
var content = Assert.Single(responses.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
+ Assert.Equal("application/json+problem", content.Key);
}
[Fact]
@@ -421,7 +537,7 @@ public class OpenApiOperationGeneratorTests
var responses = Assert.Single(operation.Responses);
var content = Assert.Single(responses.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
+ Assert.Equal("application/json", content.Key);
}
[Fact]
@@ -458,28 +574,24 @@ public class OpenApiOperationGeneratorTests
responseType =>
{
var content = Assert.Single(responseType.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.Equal("200", responseType.Key);
Assert.Equal("application/json", content.Key);
},
responseType =>
{
var content = Assert.Single(responseType.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.Equal("400", responseType.Key);
Assert.Equal("application/problem+json", content.Key);
},
responseType =>
{
var content = Assert.Single(responseType.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.Equal("404", responseType.Key);
Assert.Equal("application/problem+json", content.Key);
},
responseType =>
{
var content = Assert.Single(responseType.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.Equal("409", responseType.Key);
Assert.Equal("application/problem+json", content.Key);
});
@@ -504,21 +616,19 @@ public class OpenApiOperationGeneratorTests
responseType =>
{
var content = Assert.Single(responseType.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.Equal("200", responseType.Key);
Assert.Equal("application/json", content.Key);
},
responseType =>
{
var content = Assert.Single(responseType.Value.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.Equal("201", responseType.Key);
Assert.Equal("application/json", content.Key);
});
}
[Fact]
- public void HandleAcceptsMetadata()
+ public void HandleAcceptsMetadataWithNoParams()
{
// Arrange
var operation = GetOpenApiOperation(() => "",
@@ -530,6 +640,7 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
// Assert
+ Assert.Empty(operation.Parameters);
Assert.Collection(
requestBody.Content,
parameter =>
@@ -555,8 +666,8 @@ public class OpenApiOperationGeneratorTests
// Assert
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.False(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
#nullable enable
@@ -571,8 +682,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("application/json", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.True(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -585,8 +696,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("application/json", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.False(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -599,8 +710,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("application/xml", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.False(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -613,8 +724,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("multipart/form-data", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.True(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -627,8 +738,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("multipart/form-data", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.False(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -641,8 +752,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("multipart/form-data", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.True(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -661,6 +772,8 @@ public class OpenApiOperationGeneratorTests
var requestFormat1 = content["application/custom1"];
Assert.NotNull(requestFormat1);
+
+ Assert.Empty(operation.Parameters);
}
[Fact]
@@ -672,11 +785,13 @@ public class OpenApiOperationGeneratorTests
Assert.NotNull(operation1.RequestBody);
var fromFileParam0 = operation0.RequestBody;
- Assert.Equal("object", fromFileParam0.Content.Values.Single().Schema.Type);
+ var fromFileParam0ContentType = Assert.Single(fromFileParam0.Content.Values);
+ Assert.Equal("multipart/form-data", fromFileParam0.Content.Keys.SingleOrDefault());
Assert.True(fromFileParam0.Required);
var fromFileParam1 = operation1.RequestBody;
- Assert.Equal("object", fromFileParam1.Content.Values.Single().Schema.Type);
+ var fromFileParam1ContentType = Assert.Single(fromFileParam1.Content.Values);
+ Assert.Equal("multipart/form-data", fromFileParam1.Content.Keys.SingleOrDefault());
Assert.False(fromFileParam1.Required);
}
@@ -687,8 +802,8 @@ public class OpenApiOperationGeneratorTests
{
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
- Assert.Equal(expectedType, content.Value.Schema.Type);
Assert.Equal("multipart/form-data", content.Key);
+ Assert.Empty(operation.Parameters);
}
AssertFormFileParameter(GetOpenApiOperation((IFormFile file) => { }), "object", "file");
@@ -710,8 +825,8 @@ public class OpenApiOperationGeneratorTests
var requestBody = operation.RequestBody;
var content = Assert.Single(requestBody.Content);
Assert.Equal("multipart/form-data", content.Key);
- Assert.Equal("object", content.Value.Schema.Type);
Assert.True(requestBody.Required);
+ Assert.Empty(operation.Parameters);
}
}
@@ -728,6 +843,64 @@ public class OpenApiOperationGeneratorTests
Assert.Equal("A summary", operation.Summary);
}
+ // Test case for https://github.com/dotnet/aspnetcore/issues/41622
+ [Fact]
+ public void HandlesEndpointWithMultipleResponses()
+ {
+ var operation = GetOpenApiOperation(() => TypedResults.Ok(new InferredJsonClass()),
+ additionalMetadata: new[]
+ {
+ // Metadata added by the `IEndpointMetadataProvider` on `TypedResults.Ok`
+ new ProducesResponseTypeMetadata(StatusCodes.Status200OK),
+ // Metadata added by the `Produces<Type>` extension method
+ new ProducesResponseTypeMetadata(typeof(InferredJsonClass), StatusCodes.Status200OK, "application/json"),
+ });
+
+ var response = Assert.Single(operation.Responses);
+ var content = Assert.Single(response.Value.Content);
+ Assert.Equal("200", response.Key);
+ Assert.Equal("application/json", content.Key);
+
+ }
+
+ [Fact]
+ public void OnlyAddParametersWithCorrectLocations()
+ {
+ var operation = GetOpenApiOperation(([FromBody] int fromBody, [FromRoute] int fromRoute, [FromServices] int fromServices) => { });
+
+ Assert.Single(operation.Parameters);
+ }
+
+ [Theory]
+ [InlineData("/todos/{id}", "id")]
+ [InlineData("/todos/{Id}", "Id")]
+ [InlineData("/todos/{id:minlen(2)}", "id")]
+ public void FavorsParameterCasingInRoutePattern(string pattern, string expectedName)
+ {
+ var operation = GetOpenApiOperation((int Id) => "", pattern);
+
+ var param = Assert.Single(operation.Parameters);
+ Assert.Equal(expectedName, param.Name);
+ }
+
+ [Fact]
+ public void HandlesEndpointWithNoRequestBodyOrParams()
+ {
+ var operationWithNoParams = GetOpenApiOperation(() => "", "/");
+
+ Assert.Empty(operationWithNoParams.Parameters);
+ Assert.Null(operationWithNoParams.RequestBody);
+ }
+
+ [Fact]
+ public void HandlesEndpointWithNoRequestBody()
+ {
+ var operationWithNoBodyParams = GetOpenApiOperation((int id) => "", "/", httpMethods: new[] { "PUT" });
+
+ Assert.Single(operationWithNoBodyParams.Parameters);
+ Assert.Null(operationWithNoBodyParams.RequestBody);
+ }
+
private static OpenApiOperation GetOpenApiOperation(
Delegate action,
string pattern = null,
@@ -801,4 +974,55 @@ public class OpenApiOperationGeneratorTests
public static bool TryParse(string value, out BindAsyncRecord result) =>
throw new NotImplementedException();
}
+
+ private record ArgumentListRecord([FromRoute] int Foo, int Bar, InferredJsonClass FromBody, HttpContext context);
+
+ private record struct ArgumentListRecordStruct([FromRoute] int Foo, int Bar, InferredJsonClass FromBody, HttpContext context);
+
+ private record ArgumentListRecordWithoutAttributes(int Foo, int Bar, InferredJsonClass FromBody, HttpContext context);
+
+ private record ArgumentListRecordWithoutPositionalParameters
+ {
+ [FromRoute]
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ public InferredJsonClass FromBody { get; set; }
+ public HttpContext Context { get; set; }
+ }
+
+ private class ArgumentListClass
+ {
+ [FromRoute]
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ public InferredJsonClass FromBody { get; set; }
+ public HttpContext Context { get; set; }
+ }
+
+ private class ArgumentListClassWithReadOnlyProperties : ArgumentListClass
+ {
+ public int ReadOnly { get; }
+ }
+
+ private struct ArgumentListStruct
+ {
+ [FromRoute]
+ public int Foo { get; set; }
+ public int Bar { get; set; }
+ public InferredJsonClass FromBody { get; set; }
+ public HttpContext Context { get; set; }
+ }
+
+ private class TestEndpointConventionBuilder : EndpointBuilder, IEndpointConventionBuilder
+ {
+ public void Add(Action<EndpointBuilder> convention)
+ {
+ convention(this);
+ }
+
+ public override Endpoint Build()
+ {
+ throw new NotImplementedException();
+ }
+ }
}
diff --git a/src/OpenApi/test/OpenApiRouteHandlerBuilderExtensionTests.cs b/src/OpenApi/test/OpenApiRouteHandlerBuilderExtensionTests.cs
index 97be66d20a..df983faea6 100644
--- a/src/OpenApi/test/OpenApiRouteHandlerBuilderExtensionTests.cs
+++ b/src/OpenApi/test/OpenApiRouteHandlerBuilderExtensionTests.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -58,8 +59,190 @@ public class OpenApiRouteHandlerBuilderExtensionTests
Assert.Empty(operation.Responses);
}
- private ModelEndpointDataSource GetBuilderEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder)
+ [Fact]
+ public void WithOpenApi_CanSetSchemaInOperationWithOverride()
+ {
+ var hostEnvironment = new HostEnvironment() { ApplicationName = nameof(OpenApiOperationGeneratorTests) };
+ var serviceProviderIsService = new ServiceProviderIsService();
+ var serviceProvider = new ServiceCollection()
+ .AddSingleton<IServiceProviderIsService>(serviceProviderIsService)
+ .AddSingleton<IHostEnvironment>(hostEnvironment)
+ .BuildServiceProvider();
+
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ string GetString(string id) => "Foo";
+ _ = builder.MapDelete("/{id}", GetString)
+ .WithOpenApi(generatedOperation => {
+ generatedOperation.Parameters[0].Schema = new() { Type = "number" };
+ return generatedOperation;
+ });
+
+ var dataSource = GetBuilderEndpointDataSource(builder);
+ // Trigger Endpoint build by calling getter.
+ var endpoint = Assert.Single(dataSource.Endpoints);
+
+ var operation = endpoint.Metadata.GetMetadata<OpenApiOperation>();
+ Assert.NotNull(operation);
+ var parameter = Assert.Single(operation.Parameters);
+ Assert.Equal("number", parameter.Schema.Type);
+ }
+
+ [Fact]
+ public void WithOpenApi_WorksWithMapGroup()
+ {
+ var hostEnvironment = new HostEnvironment() { ApplicationName = nameof(OpenApiOperationGeneratorTests) };
+ var serviceProviderIsService = new ServiceProviderIsService();
+ var serviceProvider = new ServiceCollection()
+ .AddSingleton<IServiceProviderIsService>(serviceProviderIsService)
+ .AddSingleton<IHostEnvironment>(hostEnvironment)
+ .BuildServiceProvider();
+
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ string GetString() => "Foo";
+ var myGroup = builder.MapGroup("/group");
+
+ myGroup.MapDelete("/a", GetString);
+
+ // The order WithOpenApi() is relative to the MapDelete() methods does not matter.
+ myGroup.WithOpenApi();
+
+ myGroup.MapDelete("/b", GetString);
+
+ // The RotueGroupBuilder adds a single EndpointDataSource.
+ var groupDataSource = Assert.Single(builder.DataSources);
+
+ Assert.Collection(groupDataSource.Endpoints,
+ e => Assert.NotNull(e.Metadata.GetMetadata<OpenApiOperation>()),
+ e => Assert.NotNull(e.Metadata.GetMetadata<OpenApiOperation>()));
+ }
+
+ [Fact]
+ public void WithOpenApi_WorksWithMapGroupAndEndpointAnnotations()
+ {
+ var hostEnvironment = new HostEnvironment() { ApplicationName = nameof(OpenApiOperationGeneratorTests) };
+ var serviceProviderIsService = new ServiceProviderIsService();
+ var serviceProvider = new ServiceCollection()
+ .AddSingleton<IServiceProviderIsService>(serviceProviderIsService)
+ .AddSingleton<IHostEnvironment>(hostEnvironment)
+ .BuildServiceProvider();
+
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ string GetString() => "Foo";
+ var myGroup = builder.MapGroup("/group");
+ myGroup.WithOpenApi();
+ myGroup.MapDelete("/a", GetString).Produces<string>(201);
+
+ // The RotueGroupBuilder adds a single EndpointDataSource.
+ var groupDataSource = Assert.Single(builder.DataSources);
+ var endpoint = Assert.Single(groupDataSource.Endpoints);
+ var operation = endpoint.Metadata.GetMetadata<OpenApiOperation>();
+ Assert.NotNull(operation);
+ Assert.Equal("201", operation.Responses.Keys.SingleOrDefault());
+ }
+
+ [Fact]
+ public void WithOpenApi_WorksWithGroupAndSpecificEndpoint()
+ {
+ var hostEnvironment = new HostEnvironment() { ApplicationName = nameof(OpenApiOperationGeneratorTests) };
+ var serviceProviderIsService = new ServiceProviderIsService();
+ var serviceProvider = new ServiceCollection()
+ .AddSingleton<IServiceProviderIsService>(serviceProviderIsService)
+ .AddSingleton<IHostEnvironment>(hostEnvironment)
+ .BuildServiceProvider();
+
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ string GetString() => "Foo";
+ var myGroup = builder.MapGroup("/group");
+ myGroup.WithOpenApi(o =>
+ {
+ o.Summary = "Set from outer group";
+ return o;
+ });
+ myGroup.MapDelete("/a", GetString).WithOpenApi(o =>
+ {
+ o.Summary = "Set from endpoint";
+ return o;
+ });
+
+ // The RotueGroupBuilder adds a single EndpointDataSource.
+ var groupDataSource = Assert.Single(builder.DataSources);
+ var endpoint = Assert.Single(groupDataSource.Endpoints);
+ var operation = endpoint.Metadata.GetMetadata<OpenApiOperation>();
+ Assert.NotNull(operation);
+ Assert.Equal("Set from outer group", operation.Summary);
+ }
+
+ [Fact]
+ public void WithOpenApi_GroupMetadataCanExamineAndExtendMoreLocalMetadata()
+ {
+ var hostEnvironment = new HostEnvironment() { ApplicationName = nameof(OpenApiOperationGeneratorTests) };
+ var serviceProviderIsService = new ServiceProviderIsService();
+ var serviceProvider = new ServiceCollection()
+ .AddSingleton<IServiceProviderIsService>(serviceProviderIsService)
+ .AddSingleton<IHostEnvironment>(hostEnvironment)
+ .BuildServiceProvider();
+
+ var builder = new DefaultEndpointRouteBuilder(new ApplicationBuilder(serviceProvider));
+ string GetString() => "Foo";
+
+ static void WithLocalSummary(RouteHandlerBuilder builder)
+ {
+ builder.WithOpenApi(operation =>
+ {
+ operation.Summary = $"| Local Summary | 200 Status Response Content-Type: {operation.Responses["200"].Content.Keys.Single()}";
+ return operation;
+ });
+ }
+
+ WithLocalSummary(builder.MapDelete("/root", GetString));
+
+ var outerGroup = builder.MapGroup("/outer");
+ var innerGroup = outerGroup.MapGroup("/inner");
+
+ WithLocalSummary(outerGroup.MapDelete("/outer-a", GetString));
+
+ // The order WithOpenApi() is relative to the MapDelete() methods does not matter.
+ outerGroup.WithOpenApi(operation =>
+ {
+ operation.Summary = $"Outer Group Summary {operation.Summary}";
+ return operation;
+ });
+
+ WithLocalSummary(outerGroup.MapDelete("/outer-b", GetString));
+ WithLocalSummary(innerGroup.MapDelete("/inner-a", GetString));
+
+ innerGroup.WithOpenApi(operation =>
+ {
+ operation.Summary = $"| Inner Group Summary {operation.Summary}";
+ return operation;
+ });
+
+ WithLocalSummary(innerGroup.MapDelete("/inner-b", GetString));
+
+ var summaries = builder.DataSources
+ .SelectMany(ds => ds.Endpoints)
+ .ToDictionary(
+ e => ((RouteEndpoint)e).RoutePattern.RawText,
+ e => e.Metadata.GetMetadata<OpenApiOperation>().Summary);
+
+ Assert.Equal(5, summaries.Count);
+
+ Assert.Equal("| Local Summary | 200 Status Response Content-Type: text/plain",
+ summaries["/root"]);
+
+ Assert.Equal("Outer Group Summary | Local Summary | 200 Status Response Content-Type: text/plain",
+ summaries["/outer/outer-a"]);
+ Assert.Equal("Outer Group Summary | Local Summary | 200 Status Response Content-Type: text/plain",
+ summaries["/outer/outer-b"]);
+
+ Assert.Equal("Outer Group Summary | Inner Group Summary | Local Summary | 200 Status Response Content-Type: text/plain",
+ summaries["/outer/inner/inner-a"]);
+ Assert.Equal("Outer Group Summary | Inner Group Summary | Local Summary | 200 Status Response Content-Type: text/plain",
+ summaries["/outer/inner/inner-b"]);
+ }
+
+ private RouteEndpointDataSource GetBuilderEndpointDataSource(IEndpointRouteBuilder endpointRouteBuilder)
{
- return Assert.IsType<ModelEndpointDataSource>(Assert.Single(endpointRouteBuilder.DataSources));
+ return Assert.IsType<RouteEndpointDataSource>(Assert.Single(endpointRouteBuilder.DataSources));
}
}
diff --git a/src/ProjectTemplates/ProjectTemplates.slnf b/src/ProjectTemplates/ProjectTemplates.slnf
index 7cc22b113c..01e659f88a 100644
--- a/src/ProjectTemplates/ProjectTemplates.slnf
+++ b/src/ProjectTemplates/ProjectTemplates.slnf
@@ -62,12 +62,15 @@
"src\\Mvc\\Mvc.TagHelpers\\src\\Microsoft.AspNetCore.Mvc.TagHelpers.csproj",
"src\\Mvc\\Mvc.ViewFeatures\\src\\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj",
"src\\Mvc\\Mvc\\src\\Microsoft.AspNetCore.Mvc.csproj",
- "src\\ProjectTemplates\\BlazorTemplates.Tests\\BlazorTemplates.Tests.csproj",
"src\\ProjectTemplates\\Web.Client.ItemTemplates\\Microsoft.DotNet.Web.Client.ItemTemplates.csproj",
"src\\ProjectTemplates\\Web.ItemTemplates\\Microsoft.DotNet.Web.ItemTemplates.csproj",
"src\\ProjectTemplates\\Web.ProjectTemplates\\Microsoft.DotNet.Web.ProjectTemplates.csproj",
- "src\\ProjectTemplates\\test\\ProjectTemplates.Tests.csproj",
- "src\\ProjectTemplates\\testassets\\DotNetToolsInstaller\\DotNetToolsInstaller.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.Server.Tests\\Templates.Blazor.Server.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.Tests\\Templates.Blazor.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.WebAssembly.Tests\\Templates.Blazor.WebAssembly.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.WebAssembly.Auth.Tests\\Templates.Blazor.WebAssembly.Auth.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Mvc.Tests\\Templates.Mvc.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Tests\\Templates.Tests.csproj",
"src\\Razor\\Razor.Runtime\\src\\Microsoft.AspNetCore.Razor.Runtime.csproj",
"src\\Razor\\Razor\\src\\Microsoft.AspNetCore.Razor.csproj",
"src\\Security\\Authentication\\Cookies\\src\\Microsoft.AspNetCore.Authentication.Cookies.csproj",
@@ -93,4 +96,4 @@
"src\\submodules\\spa-templates\\src\\Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj"
]
}
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/ProjectTemplatesNoDeps.slnf b/src/ProjectTemplates/ProjectTemplatesNoDeps.slnf
index 45cb6be613..bc9522a2b4 100644
--- a/src/ProjectTemplates/ProjectTemplatesNoDeps.slnf
+++ b/src/ProjectTemplates/ProjectTemplatesNoDeps.slnf
@@ -2,12 +2,16 @@
"solution": {
"path": "..\\..\\AspNetCore.sln",
"projects": [
- "src\\ProjectTemplates\\BlazorTemplates.Tests\\BlazorTemplates.Tests.csproj",
"src\\ProjectTemplates\\Web.Client.ItemTemplates\\Microsoft.DotNet.Web.Client.ItemTemplates.csproj",
"src\\ProjectTemplates\\Web.ItemTemplates\\Microsoft.DotNet.Web.ItemTemplates.csproj",
"src\\ProjectTemplates\\Web.ProjectTemplates\\Microsoft.DotNet.Web.ProjectTemplates.csproj",
"src\\submodules\\spa-templates\\src\\Microsoft.DotNet.Web.Spa.ProjectTemplates.csproj",
- "src\\ProjectTemplates\\test\\ProjectTemplates.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.Server.Tests\\Templates.Blazor.Server.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.Tests\\Templates.Blazor.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.WebAssembly.Tests\\Templates.Blazor.WebAssembly.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Blazor.WebAssembly.Auth.Tests\\Templates.Blazor.WebAssembly.Auth.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Mvc.Tests\\Templates.Mvc.Tests.csproj",
+ "src\\ProjectTemplates\\test\\Templates.Tests\\Templates.Tests.csproj",
"src\\Shared\\BrowserTesting\\src\\Microsoft.AspNetCore.BrowserTesting.csproj"
]
}
diff --git a/src/ProjectTemplates/README.md b/src/ProjectTemplates/README.md
index dc1615b5cb..5b4b2e9016 100644
--- a/src/ProjectTemplates/README.md
+++ b/src/ProjectTemplates/README.md
@@ -6,16 +6,25 @@ These are project templates which are used in .NET Core for creating ASP.NET Cor
The following contains a description of each sub-directory in the `ProjectTemplates` directory.
-- `BlazorTemplates.Tests`: Contains the source files for the Blazor template tests, these are currently split out due to not being Helix ready yet.
- `Shared`: Contains a collection of shared constants and helper methods/classes including the infrastructure for managing dotnet processes to create, build, run template tests.
- `Web.Client.ItemTemplates`: Contains the Web Client-Side File templates, includes things like less, scss, and typescript
- `Web.ItemTemplates`: Contains the Web File templates, includes things like: protobuf, razor component, razor page, view import and start pages
- `Web.ProjectTemplates`: Contains the ASP.NET Core Web Template pack, including Blazor Server, WASM, Empty, Grpc, Razor Class Library, RazorPages, MVC, WebApi.
- `migrations`: Contains migration related scripts.
- `scripts`: Contains a collection of scripts that help running tests locally that avoid having to install the templates to the machine.
-- `test`: Contains the end to end template tests.
+- `test`: Contains the template tests.
+ - `Templates.Blazor.Tests`: Contains the Blazor template tests. These are currently split out due to not being Helix ready yet.
- `testassets`: Contains assets used by the tests, like a dotnet tools installer
+## Submitting pull requests
+
+You can submit changes for templates in this repo by submitting a pull request. If you make changes to any
+`content/*/.template.config/template.json` files, build locally (see below) and include any
+`content/*/.template.config/localize/` changes in your pull request. (Your build may update the strings in those
+files for later localization.)
+
+## Building locally
+
### Build
Some projects in this repository (like SignalR Java Client) require JDK installation and configuration of `JAVA_HOME` environment variable.
@@ -36,7 +45,7 @@ To build the ProjectTemplates, use one of:
### Test
-#### Running ProjectTemplate tests:
+#### Running ProjectTemplate tests
To run ProjectTemplate tests, first ensure the ASP.NET localhost development certificate is installed and trusted.
Otherwise, you'll get a test error "Certificate error: Navigation blocked".
@@ -62,6 +71,101 @@ Then, use one of:
previous step, it is NOT advised that you install templates created on your local machine using just
`dotnet new -i [nupkgPath]`.
+#### Conditional tests & skipping test platforms
+
+Individual test methods can be decorated with attributes to configure them to not run ("skip running") on certain platforms. The `[ConditionalFact]` and `[ConditionalTheory]` attributes must be used on tests using the skip attributes in order for them to actually be skipped:
+
+``` csharp
+[ConditionalFact]
+[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+[SkipOnHelix("cert failure", Queues = "All.OSX;" + HelixConstants.Windows10Arm64)]
+public async Task MvcTemplate_SingleFileExe()
+{
+```
+
+An entire test project can be configured to skip specific platforms using the `<SkipHelixQueues>` property in the project's .csproj file, e.g.:
+
+```xml
+<SkipHelixQueues>
+ $(HelixQueueArmDebian11);
+</SkipHelixQueues>
+```
+
+Tests that are skipped should have details, or better yet link to an issue, explaining why they're being skipped, either as a string argument to the attribute or a code comment.
+
+#### Test timeouts
+
+When tests are run as part of the CI infrastructure, a number of different timeouts can impact whether tests pass or not.
+
+##### Helix job timeout
+
+When queuing test jobs to the Helix infrastructure, a timeout value is passed that the entire Helix job must complete within, i.e. that job running on a single queue. This default value is set in [eng\targets\Helix.props](eng/targets/Helix.props):
+
+```xml
+<HelixTimeout>00:45:00</HelixTimeout>
+```
+
+This value is printed by the Helix runner at the beginning of the console log, formatted in seconds, e.g.:
+
+```log
+Console log: 'ProjectTemplates.Tests--net7.0' from job b2f6fbe0-4dbe-45fa-a123-9a8c876d5923 (ubuntu.1804.armarch.open) using docker image mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-helix-arm64v8-20211001171229-97d8652 on ddvsotx2l137
+running $HELIX_CORRELATION_PAYLOAD/scripts/71557bd7f20e49fbbaa81cc79bd57fd6/execute.sh in /home/helixbot/work/C08609D9/w/B3D709E1/e max 2700 seconds
+```
+
+Note that some test projects might override this value in their project file and that some Helix queues are slower than others, so the same test job might complete within the timeout on one queue but exceed the timeout on another (the ARM queues are particularly prone to being slower than their AMD/Intel counterparts).
+
+##### Helix runner timeout
+
+The [Helix test runner](eng/tools/HelixTestRunner) launches the actual process that runs tests within a Helix job and when doing so configures its own timeout that is 5 minutes less than the Helix job timeout, e.g. if the Helix job timeout is 45 minutes, the Helix test runner process timeout will be 40 minutes.
+
+If this timeout is exceeded, the Helix test runner will capture a dump of the test process before terminating it and printing a message in the console log, e.g.:
+
+```log
+2022-05-12T00:27:28.8279660Z Non-quarantined tests exceeded configured timeout: 40m.
+```
+
+##### Helix runner `dotnet test` timeout
+
+When running in Helix, a test hang timeout, e.g. `dotnet test --blame-hang-timeout 15m` , is configured in [eng\tools\HelixTestRunner\TestRunner.cs](eng/tools/HelixTestRunner/TestRunner.cs)
+
+```csharp
+public async Task<int> RunTestsAsync()
+{
+ ...
+ var commonTestArgs = $"test {Options.Target} --diag:{diagLog} --logger xunit --logger \"console;verbosity=normal\" " +
+ "--blame-crash --blame-hang-timeout 15m";
+```
+
+This timeout applies to each individual `[Fact]` or `[Theory]`. Note that for `[Theory]` this timeout is **not** reset for each instance of the theory, i.e. the entire `[Theory]` must run within the specified timeout.
+
+If this timeout is triggered, a message will be printed to the `vstest.datacollector.[date-time-stamp].log` file for the test run, e.g.:
+
+```
+19:54:18.888, 4653892436493, datacollector.dll, The specified inactivity time of 15 minutes has elapsed. Collecting hang dumps from testhost and its child processes
+```
+
+**Note:** It's a good idea to spread the number of cases for `[Theory]` tests across different test methods if the test method takes more than a few seconds to complete as this will help to keep the total `[Theory]` runtime less than the configured timeout, e.g.:
+
+``` csharp
+[ConditionalTheory]
+[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+[InlineData("IndividualB2C", null)]
+[InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain })]
+[InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+[InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+public Task MvcTemplate_IdentityWeb_IndividualB2C_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
+
+[ConditionalTheory]
+[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+[InlineData("SingleOrg", null)]
+[InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain })]
+[InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+[InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+[InlineData("SingleOrg", new[] { ArgConstants.CallsGraph })]
+[InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph })]
+public Task MvcTemplate_IdentityWeb_SingleOrg_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
+```
+
## More Information
For more information, see the [ASP.NET Core README](../../README.md).
diff --git a/src/ProjectTemplates/Shared/ArgConstants.cs b/src/ProjectTemplates/Shared/ArgConstants.cs
new file mode 100644
index 0000000000..f68cd1ce4a
--- /dev/null
+++ b/src/ProjectTemplates/Shared/ArgConstants.cs
@@ -0,0 +1,28 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Templates.Test.Helpers;
+
+internal static class ArgConstants
+{
+ public const string UseProgramMain = "--use-program-main";
+ public const string UseMinimalApis = "--use-minimal-apis";
+ public const string Hosted = "--hosted";
+ public const string Pwa = "--pwa";
+ public const string CallsGraph = "--calls-graph";
+ public const string CalledApiUrl = "--called-api-url";
+ public const string CalledApiUrlGraphMicrosoftCom = "--called-api-url \"https://graph.microsoft.com\"";
+ public const string CalledApiScopes = "--called-api-scopes";
+ public const string CalledApiScopesUserReadWrite = $"{CalledApiScopes} user.readwrite";
+ public const string NoOpenApi = "--no-openapi";
+ public const string Auth = "-au";
+ public const string ClientId = "--client-id";
+ public const string Domain = "--domain";
+ public const string DefaultScope = "--default-scope";
+ public const string AppIdUri = "--app-id-uri";
+ public const string AppIdClientId = "--api-client-id";
+ public const string TenantId = "--tenant-id";
+ public const string AadB2cInstance = "--aad-b2c-instance";
+ public const string UseLocalDb = "-uld";
+ public const string NoHttps = "--no-https";
+}
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs b/src/ProjectTemplates/Shared/AssemblyInfo.AssemblyFixtures.cs
index 461f795a1c..b89b6eee90 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/AssemblyInfo.AssemblyFixtures.cs
+++ b/src/ProjectTemplates/Shared/AssemblyInfo.AssemblyFixtures.cs
@@ -2,9 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Testing;
-using ProjectTemplates.Tests.Infrastructure;
-using Templates.Test;
using Templates.Test.Helpers;
+using Xunit;
[assembly: AssemblyFixture(typeof(ProjectFactoryFixture))]
-
+[assembly: CollectionBehavior(DisableTestParallelization = true)]
diff --git a/src/ProjectTemplates/test/BlazorTemplateTest.cs b/src/ProjectTemplates/Shared/BlazorTemplateTest.cs
index 246a502883..745df0197d 100644
--- a/src/ProjectTemplates/test/BlazorTemplateTest.cs
+++ b/src/ProjectTemplates/Shared/BlazorTemplateTest.cs
@@ -15,7 +15,7 @@ using Templates.Test.Helpers;
using Xunit;
using Xunit.Abstractions;
-namespace Templates.Test;
+namespace Templates.Blazor.Test;
public abstract class BlazorTemplateTest : LoggedTest
{
@@ -41,12 +41,12 @@ public abstract class BlazorTemplateTest : LoggedTest
public abstract string ProjectType { get; }
- protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false)
+ protected async Task<Project> CreateBuildPublishAsync(string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false)
{
// Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");
- var project = await ProjectFactory.GetOrCreateProject(projectName, Output);
+ var project = await ProjectFactory.CreateProject(Output);
if (targetFramework != null)
{
project.TargetFramework = targetFramework;
@@ -55,6 +55,21 @@ public abstract class BlazorTemplateTest : LoggedTest
var createResult = await project.RunDotNetNewAsync(ProjectType, auth: auth, args: args, errorOnRestoreError: false);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ if (serverProject || auth is null)
+ {
+ // External auth mechanisms (which is any auth at all for Blazor WASM) require https to work and thus don't honor the --no-https flag
+ var requiresHttps = string.Equals(auth, "IndividualB2C", StringComparison.OrdinalIgnoreCase)
+ || string.Equals(auth, "SingleOrg", StringComparison.OrdinalIgnoreCase)
+ || (!serverProject && auth is not null);
+ var noHttps = args?.Contains(ArgConstants.NoHttps) ?? false;
+ var expectedLaunchProfileNames = requiresHttps
+ ? new[] { "https", "IIS Express" }
+ : noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+ }
+
if (!onlyCreate)
{
var targetProject = project;
@@ -88,4 +103,13 @@ public abstract class BlazorTemplateTest : LoggedTest
return subProject;
}
+
+ protected static string ReadFile(string basePath, string path)
+ {
+ var fullPath = Path.Combine(basePath, path);
+ var doesExist = File.Exists(fullPath);
+
+ Assert.True(doesExist, $"Expected file to exist, but it doesn't: {path}");
+ return File.ReadAllText(Path.Combine(basePath, path));
+ }
}
diff --git a/src/ProjectTemplates/Shared/ProcessResult.cs b/src/ProjectTemplates/Shared/ProcessResult.cs
index 2b7ab555a9..aa683ff548 100644
--- a/src/ProjectTemplates/Shared/ProcessResult.cs
+++ b/src/ProjectTemplates/Shared/ProcessResult.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Internal;
namespace Templates.Test.Helpers;
-internal class ProcessResult
+internal sealed class ProcessResult
{
public ProcessResult(ProcessEx process)
{
diff --git a/src/ProjectTemplates/Shared/Project.cs b/src/ProjectTemplates/Shared/Project.cs
index 7ff112b619..0fe3631e56 100644
--- a/src/ProjectTemplates/Shared/Project.cs
+++ b/src/ProjectTemplates/Shared/Project.cs
@@ -7,6 +7,7 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
+using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Internal;
@@ -108,38 +109,24 @@ public class Project : IDisposable
argString += $" -o {TemplateOutputDir}";
- // Only run one instance of 'dotnet new' at once, as a workaround for
- // https://github.com/aspnet/templating/issues/63
-
- await DotNetNewLock.WaitAsync();
- try
+ if (Directory.Exists(TemplateOutputDir))
{
- Output.WriteLine("Acquired DotNetNewLock");
-
- if (Directory.Exists(TemplateOutputDir))
- {
- Output.WriteLine($"Template directory already exists, deleting contents of {TemplateOutputDir}");
- Directory.Delete(TemplateOutputDir, recursive: true);
- }
-
- using var execution = ProcessEx.Run(Output, AppContext.BaseDirectory, DotNetMuxer.MuxerPathOrDefault(), argString, environmentVariables);
- await execution.Exited;
+ Output.WriteLine($"Template directory already exists, deleting contents of {TemplateOutputDir}");
+ Directory.Delete(TemplateOutputDir, recursive: true);
+ }
- var result = new ProcessResult(execution);
+ using var execution = ProcessEx.Run(Output, AppContext.BaseDirectory, DotNetMuxer.MuxerPathOrDefault(), argString, environmentVariables);
+ await execution.Exited;
- // Because dotnet new automatically restores but silently ignores restore errors, need to handle restore errors explicitly
- if (errorOnRestoreError && (execution.Output.Contains("Restore failed.") || execution.Error.Contains("Restore failed.")))
- {
- result.ExitCode = -1;
- }
+ var result = new ProcessResult(execution);
- return result;
- }
- finally
+ // Because dotnet new automatically restores but silently ignores restore errors, need to handle restore errors explicitly
+ if (errorOnRestoreError && (execution.Output.Contains("Restore failed.") || execution.Error.Contains("Restore failed.")))
{
- DotNetNewLock.Release();
- Output.WriteLine("Released DotNetNewLock");
+ result.ExitCode = -1;
}
+
+ return result;
}
internal async Task<ProcessResult> RunDotNetPublishAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, bool noRestore = true)
@@ -151,23 +138,41 @@ public class Project : IDisposable
var restoreArgs = noRestore ? "--no-restore" : null;
- using var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"publish {restoreArgs} -c Release /bl {additionalArgs}", packageOptions);
- await result.Exited;
- CaptureBinLogOnFailure(result);
- return new ProcessResult(result);
+ using var execution = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"publish {restoreArgs} -c Release /bl {additionalArgs}", packageOptions);
+ await execution.Exited;
+
+ var result = new ProcessResult(execution);
+
+ // Fail if there were build warnings
+ if (execution.Output.Contains(": warning") || execution.Error.Contains(": warning"))
+ {
+ result.ExitCode = -1;
+ }
+
+ CaptureBinLogOnFailure(execution);
+ return result;
}
- internal async Task<ProcessResult> RunDotNetBuildAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null)
+ internal async Task<ProcessResult> RunDotNetBuildAsync(IDictionary<string, string> packageOptions = null, string additionalArgs = null, bool errorOnBuildWarning = true)
{
Output.WriteLine("Building ASP.NET Core application...");
// Avoid restoring as part of build or publish. These projects should have already restored as part of running dotnet new. Explicitly disabling restore
// should avoid any global contention and we can execute a build or publish in a lock-free way
- using var result = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"build --no-restore -c Debug /bl {additionalArgs}", packageOptions);
- await result.Exited;
- CaptureBinLogOnFailure(result);
- return new ProcessResult(result);
+ using var execution = ProcessEx.Run(Output, TemplateOutputDir, DotNetMuxer.MuxerPathOrDefault(), $"build --no-restore -c Debug /bl {additionalArgs}", packageOptions);
+ await execution.Exited;
+
+ var result = new ProcessResult(execution);
+
+ // Fail if there were build warnings
+ if (errorOnBuildWarning && (execution.Output.Contains(": warning") || execution.Error.Contains(": warning")))
+ {
+ result.ExitCode = -1;
+ }
+
+ CaptureBinLogOnFailure(execution);
+ return result;
}
internal AspNetProcess StartBuiltProjectAsync(bool hasListeningUri = true, ILogger logger = null)
@@ -205,62 +210,38 @@ public class Project : IDisposable
{
var args = $"--verbose --no-build migrations add {migrationName}";
- // Only run one instance of 'dotnet new' at once, as a workaround for
- // https://github.com/aspnet/templating/issues/63
- await DotNetNewLock.WaitAsync();
- try
+ var command = DotNetMuxer.MuxerPathOrDefault();
+ if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
{
- Output.WriteLine("Acquired DotNetNewLock");
- var command = DotNetMuxer.MuxerPathOrDefault();
- if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
- {
- args = $"\"{DotNetEfFullPath}\" " + args;
- }
- else
- {
- command = "dotnet-ef";
- }
-
- using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args);
- await result.Exited;
- return new ProcessResult(result);
+ args = $"\"{DotNetEfFullPath}\" " + args;
}
- finally
+ else
{
- DotNetNewLock.Release();
- Output.WriteLine("Released DotNetNewLock");
+ command = "dotnet-ef";
}
+
+ using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args);
+ await result.Exited;
+ return new ProcessResult(result);
}
internal async Task<ProcessResult> RunDotNetEfUpdateDatabaseAsync()
{
var args = "--verbose --no-build database update";
- // Only run one instance of 'dotnet new' at once, as a workaround for
- // https://github.com/aspnet/templating/issues/63
- await DotNetNewLock.WaitAsync();
- try
+ var command = DotNetMuxer.MuxerPathOrDefault();
+ if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
{
- Output.WriteLine("Acquired DotNetNewLock");
- var command = DotNetMuxer.MuxerPathOrDefault();
- if (string.IsNullOrEmpty(Environment.GetEnvironmentVariable("DotNetEfFullPath")))
- {
- args = $"\"{DotNetEfFullPath}\" " + args;
- }
- else
- {
- command = "dotnet-ef";
- }
-
- using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args);
- await result.Exited;
- return new ProcessResult(result);
+ args = $"\"{DotNetEfFullPath}\" " + args;
}
- finally
+ else
{
- DotNetNewLock.Release();
- Output.WriteLine("Released DotNetNewLock");
+ command = "dotnet-ef";
}
+
+ using var result = ProcessEx.Run(Output, TemplateOutputDir, command, args);
+ await result.Exited;
+ return new ProcessResult(result);
}
// If this fails, you should generate new migrations via migrations/updateMigrations.cmd
@@ -308,6 +289,63 @@ public class Project : IDisposable
}
}
+ public async Task<Project> VerifyLaunchSettings(string[] expectedLaunchProfileNames)
+ {
+ var launchSettingsFiles = Directory.EnumerateFiles(TemplateOutputDir, "launchSettings.json", SearchOption.AllDirectories);
+
+ foreach (var filePath in launchSettingsFiles)
+ {
+ using var launchSettingsFile = File.OpenRead(filePath);
+ using var launchSettings = await JsonDocument.ParseAsync(launchSettingsFile);
+
+ var profiles = launchSettings.RootElement.GetProperty("profiles");
+ var profilesEnumerator = profiles.EnumerateObject().GetEnumerator();
+
+ foreach (var expectedProfileName in expectedLaunchProfileNames)
+ {
+ Assert.True(profilesEnumerator.MoveNext());
+
+ var actualProfile = profilesEnumerator.Current;
+
+ // Launch profile names are case sensitive
+ Assert.Equal(expectedProfileName, actualProfile.Name, StringComparer.Ordinal);
+
+ if (actualProfile.Value.GetProperty("commandName").GetString() == "Project")
+ {
+ var applicationUrl = actualProfile.Value.GetProperty("applicationUrl");
+ if (string.Equals(expectedProfileName, "http", StringComparison.Ordinal))
+ {
+ Assert.DoesNotContain("https://", applicationUrl.GetString());
+ }
+
+ if (string.Equals(expectedProfileName, "https", StringComparison.Ordinal))
+ {
+ Assert.StartsWith("https://", applicationUrl.GetString());
+ }
+ }
+ }
+
+ // Check there are no more launch profiles defined
+ Assert.False(profilesEnumerator.MoveNext());
+
+ if (launchSettings.RootElement.TryGetProperty("iisSettings", out var iisSettings)
+ && iisSettings.TryGetProperty("iisExpress", out var iisExpressSettings))
+ {
+ var iisSslPort = iisExpressSettings.GetProperty("sslPort").GetInt32();
+ if (expectedLaunchProfileNames.Contains("https"))
+ {
+ Assert.True(iisSslPort >= 44300 && iisSslPort <= 44399, $"IIS Express port was expected to be >= 44300 and <= 44399 but was {iisSslPort} in file {filePath}");
+ }
+ else
+ {
+ Assert.Equal(0, iisSslPort);
+ }
+ }
+ }
+
+ return this;
+ }
+
public string ReadFile(string path)
{
AssertFileExists(path, shouldExist: true);
@@ -316,25 +354,15 @@ public class Project : IDisposable
internal async Task<ProcessEx> RunDotNetNewRawAsync(string arguments)
{
- await DotNetNewLock.WaitAsync();
- try
- {
- Output.WriteLine("Acquired DotNetNewLock");
- var result = ProcessEx.Run(
- Output,
- AppContext.BaseDirectory,
- DotNetMuxer.MuxerPathOrDefault(),
- arguments +
- $" --debug:disable-sdk-templates --debug:custom-hive \"{TemplatePackageInstaller.CustomHivePath}\"" +
- $" -o {TemplateOutputDir}");
- await result.Exited;
- return result;
- }
- finally
- {
- DotNetNewLock.Release();
- Output.WriteLine("Released DotNetNewLock");
- }
+ var result = ProcessEx.Run(
+ Output,
+ AppContext.BaseDirectory,
+ DotNetMuxer.MuxerPathOrDefault(),
+ arguments +
+ $" --debug:disable-sdk-templates --debug:custom-hive \"{TemplatePackageInstaller.CustomHivePath}\"" +
+ $" -o {TemplateOutputDir}");
+ await result.Exited;
+ return result;
}
public void Dispose()
@@ -368,7 +396,7 @@ public class Project : IDisposable
}
}
- private class OrderedLock
+ private sealed class OrderedLock
{
private bool _nodeLockTaken;
private bool _dotNetLockTaken;
@@ -438,7 +466,7 @@ public class Project : IDisposable
if (result.ExitCode != 0 && !string.IsNullOrEmpty(ArtifactsLogDir))
{
var sourceFile = Path.Combine(TemplateOutputDir, "msbuild.binlog");
- Assert.True(File.Exists(sourceFile), $"Log for '{ProjectName}' not found in '{sourceFile}'.");
+ Assert.True(File.Exists(sourceFile), $"Log for '{ProjectName}' not found in '{sourceFile}'. Execution output: {result.Output}");
var destination = Path.Combine(ArtifactsLogDir, ProjectName + ".binlog");
File.Move(sourceFile, destination, overwrite: true); // binlog will exist on retries
}
diff --git a/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs b/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs
index e43772a9a2..0de11acd78 100644
--- a/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs
+++ b/src/ProjectTemplates/Shared/ProjectFactoryFixture.cs
@@ -14,6 +14,7 @@ namespace Templates.Test.Helpers;
public class ProjectFactoryFixture : IDisposable
{
+ private const string LetterChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
private readonly ConcurrentDictionary<string, Project> _projects = new ConcurrentDictionary<string, Project>();
public IMessageSink DiagnosticsMessageSink { get; }
@@ -23,35 +24,42 @@ public class ProjectFactoryFixture : IDisposable
DiagnosticsMessageSink = diagnosticsMessageSink;
}
- public async Task<Project> GetOrCreateProject(string projectKey, ITestOutputHelper output)
+ public async Task<Project> CreateProject(ITestOutputHelper output)
{
await TemplatePackageInstaller.EnsureTemplatingEngineInitializedAsync(output);
- // Different tests may have different output helpers, so need to fix up the output to write to the correct log
- if (_projects.TryGetValue(projectKey, out var project))
+
+ var project = CreateProjectImpl(output);
+
+ var projectKey = Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant();
+ if (!_projects.TryAdd(projectKey, project))
{
- project.Output = output;
- return project;
+ throw new InvalidOperationException($"Project key collision in {nameof(ProjectFactoryFixture)}.{nameof(CreateProject)}!");
}
- return _projects.GetOrAdd(
- projectKey,
- (key, outputHelper) =>
- {
- var project = new Project
- {
- Output = outputHelper,
- DiagnosticsMessageSink = DiagnosticsMessageSink,
- ProjectGuid = Path.GetRandomFileName().Replace(".", string.Empty)
- };
- project.ProjectName = $"AspNet.{project.ProjectGuid}";
-
- var assemblyPath = GetType().Assembly;
- var basePath = GetTemplateFolderBasePath(assemblyPath);
- project.TemplateOutputDir = Path.Combine(basePath, project.ProjectName);
- return project;
- },
- output);
+
+ return project;
}
+ private Project CreateProjectImpl(ITestOutputHelper output)
+ {
+ var project = new Project
+ {
+ Output = output,
+ DiagnosticsMessageSink = DiagnosticsMessageSink,
+ // Ensure first character is a letter to avoid random insertions of '_' into template namespace
+ // declarations (i.e. make it more stable for testing)
+ ProjectGuid = GetRandomLetter() + Path.GetRandomFileName().Replace(".", string.Empty)
+ };
+ project.ProjectName = $"AspNet.{project.ProjectGuid}";
+
+ var assemblyPath = GetType().Assembly;
+ var basePath = GetTemplateFolderBasePath(assemblyPath);
+ project.TemplateOutputDir = Path.Combine(basePath, project.ProjectName);
+
+ return project;
+ }
+
+ private static char GetRandomLetter() => LetterChars[Random.Shared.Next(LetterChars.Length - 1)];
+
private static string GetTemplateFolderBasePath(Assembly assembly) =>
(string.IsNullOrEmpty(Environment.GetEnvironmentVariable("HELIX_DIR")))
? assembly.GetCustomAttributes<AssemblyMetadataAttribute>()
diff --git a/src/ProjectTemplates/Shared/TemplatePackageInstaller.cs b/src/ProjectTemplates/Shared/TemplatePackageInstaller.cs
index e8d5ef5c84..d81d360c5b 100644
--- a/src/ProjectTemplates/Shared/TemplatePackageInstaller.cs
+++ b/src/ProjectTemplates/Shared/TemplatePackageInstaller.cs
@@ -34,6 +34,7 @@ internal static class TemplatePackageInstaller
"Microsoft.DotNet.Web.ProjectTemplates.5.0",
"Microsoft.DotNet.Web.ProjectTemplates.6.0",
"Microsoft.DotNet.Web.ProjectTemplates.7.0",
+ "Microsoft.DotNet.Web.ProjectTemplates.8.0",
"Microsoft.DotNet.Web.Spa.ProjectTemplates.2.1",
"Microsoft.DotNet.Web.Spa.ProjectTemplates.2.2",
"Microsoft.DotNet.Web.Spa.ProjectTemplates.3.0",
@@ -41,6 +42,7 @@ internal static class TemplatePackageInstaller
"Microsoft.DotNet.Web.Spa.ProjectTemplates.5.0",
"Microsoft.DotNet.Web.Spa.ProjectTemplates.6.0",
"Microsoft.DotNet.Web.Spa.ProjectTemplates.7.0",
+ "Microsoft.DotNet.Web.Spa.ProjectTemplates.8.0",
"Microsoft.DotNet.Web.Spa.ProjectTemplates",
"Microsoft.AspNetCore.Blazor.Templates",
};
@@ -53,24 +55,14 @@ internal static class TemplatePackageInstaller
public static async Task EnsureTemplatingEngineInitializedAsync(ITestOutputHelper output)
{
- await ProcessLock.DotNetNewLock.WaitAsync();
- try
+ if (!_haveReinstalledTemplatePackages)
{
- output.WriteLine("Acquired DotNetNewLock");
- if (!_haveReinstalledTemplatePackages)
+ if (Directory.Exists(CustomHivePath))
{
- if (Directory.Exists(CustomHivePath))
- {
- Directory.Delete(CustomHivePath, recursive: true);
- }
- await InstallTemplatePackages(output);
- _haveReinstalledTemplatePackages = true;
+ Directory.Delete(CustomHivePath, recursive: true);
}
- }
- finally
- {
- ProcessLock.DotNetNewLock.Release();
- output.WriteLine("Released DotNetNewLock");
+ await InstallTemplatePackages(output);
+ _haveReinstalledTemplatePackages = true;
}
}
@@ -120,7 +112,7 @@ internal static class TemplatePackageInstaller
foreach (var packagePath in builtPackages)
{
output.WriteLine($"Installing templates package {packagePath}...");
- var result = await RunDotNetNew(output, $"--install \"{packagePath}\"");
+ var result = await RunDotNetNew(output, $"install \"{packagePath}\"");
Assert.True(result.ExitCode == 0, result.GetFormattedOutput());
}
diff --git a/src/ProjectTemplates/Shared/TestOutputLogger.cs b/src/ProjectTemplates/Shared/TestOutputLogger.cs
index e68f86f73a..56088d1dd3 100644
--- a/src/ProjectTemplates/Shared/TestOutputLogger.cs
+++ b/src/ProjectTemplates/Shared/TestOutputLogger.cs
@@ -7,7 +7,7 @@ using Xunit.Abstractions;
namespace Templates.Test.Helpers;
-internal class TestOutputLogger : ITestOutputHelper
+internal sealed class TestOutputLogger : ITestOutputHelper
{
private readonly ILogger _logger;
diff --git a/src/ProjectTemplates/THIRD-PARTY-NOTICES b/src/ProjectTemplates/THIRD-PARTY-NOTICES
index 40f4f30769..f999afb53a 100644
--- a/src/ProjectTemplates/THIRD-PARTY-NOTICES
+++ b/src/ProjectTemplates/THIRD-PARTY-NOTICES
@@ -129,18 +129,9 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-License notice for jQuery 3.5.1
+License notice for jQuery 3.6.0
-------------------------------
-Copyright JS Foundation and other contributors, https://js.foundation/
-
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -161,13 +152,6 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
-
License notice for jQuery Validation v1.17.0
--------------------------------------------
The MIT License (MIT)
diff --git a/src/ProjectTemplates/TestInfrastructure/PrepareForTest.targets b/src/ProjectTemplates/TestInfrastructure/PrepareForTest.targets
index 70c0c0d8e5..63a85fe564 100644
--- a/src/ProjectTemplates/TestInfrastructure/PrepareForTest.targets
+++ b/src/ProjectTemplates/TestInfrastructure/PrepareForTest.targets
@@ -1,8 +1,12 @@
<Project>
+ <PropertyGroup>
+ <TestPackageRestorePath>$([MSBuild]::NormalizeDirectory('$(RepoRoot)', '.packages', '$(RestoreFolderName)'))</TestPackageRestorePath>
+ </PropertyGroup>
+
<ItemGroup>
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
<_Parameter1>DotNetEfFullPath</_Parameter1>
- <_Parameter2>$([MSBuild]::EnsureTrailingSlash('$(NuGetPackageRoot)'))dotnet-ef/$(DotnetEfVersion)/tools/netcoreapp3.1/any/dotnet-ef.dll</_Parameter2>
+ <_Parameter2>$([MSBuild]::EnsureTrailingSlash('$(NuGetPackageRoot)'))dotnet-ef/$(DotnetEfVersion)/tools/net6.0/any/dotnet-ef.dll</_Parameter2>
</AssemblyAttribute>
<AssemblyAttribute Include="System.Reflection.AssemblyMetadataAttribute">
<_Parameter1>TestPackageRestorePath</_Parameter1>
@@ -61,22 +65,15 @@
<Delete Files="@(_ExistingFilesFromLastRun)" ContinueOnError="true" />
- <Removedir Directories="$(TestTemplateCreationFolder)" Condition="Exists('$(TestTemplateCreationFolder)')" ContinueOnError="true">
+ <RemoveDir Directories="$(TestTemplateCreationFolder)" Condition="Exists('$(TestTemplateCreationFolder)')" ContinueOnError="true">
<Output TaskParameter="RemovedDirectories" ItemName="_CleanedUpDirectories" />
- </Removedir>
- <Removedir Directories="$(TestPackageRestorePath)" Condition="Exists('$(TestPackageRestorePath)')" ContinueOnError="true">
+ </RemoveDir>
+ <RemoveDir Directories="$(TestPackageRestorePath)" Condition="Exists('$(TestPackageRestorePath)')" ContinueOnError="true">
<Output TaskParameter="RemovedDirectories" ItemName="_CleanedUpDirectories" />
- </Removedir>
+ </RemoveDir>
<Message Importance="high" Text="Removed directory %(_CleanedUpDirectories.Identity)" />
- <MakeDir Directories="$(TestTemplateCreationFolder)">
- <Output TaskParameter="DirectoriesCreated" ItemName="_CreatedDirectories" />
- </MakeDir>
- <MakeDir Directories="$(TestPackageRestorePath)">
- <Output TaskParameter="DirectoriesCreated" ItemName="_CreatedDirectories" />
- </MakeDir>
-
<Message Importance="high" Text="Created directory %(_CreatedDirectories.Identity)" />
<GenerateFileFromTemplate
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.cs.json
index 292e2d4e1d..ef7a423548 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.cs.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "Šablona stylů LESS",
+ "description": "LESS je jazyk kompilovaný do šablon stylů CSS.",
+ "postActions/openInEditor/description": "Otevře soubor styleSheet1.less v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.de.json
index 292e2d4e1d..b0bfe36ca7 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.de.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "LESS Stylesheet",
+ "description": "LESS ist eine Sprache, die in CSS kompiliert wird",
+ "postActions/openInEditor/description": "Öffnet styleSheet1.less im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.es.json
index 292e2d4e1d..9de474e975 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.es.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "Hoja de estilos LESS",
+ "description": "LESS es un lenguaje que se compila en CSS",
+ "postActions/openInEditor/description": "Abre styleSheet1.less en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.fr.json
index 292e2d4e1d..63b851584f 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.fr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "Feuille de style LESS",
+ "description": "LESS est un langage compilé en CSS",
+ "postActions/openInEditor/description": "Ouvre styleSheet1.less dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.it.json
index 292e2d4e1d..871ba291e5 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.it.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "Foglio di stile LESS",
+ "description": "LESS è un linguaggio che viene compilato in CSS.",
+ "postActions/openInEditor/description": "Apre styleSheet1.less nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ja.json
index 292e2d4e1d..b3bccfbf5e 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ja.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "LESS スタイル シート",
+ "description": "LESS は CSS にコンパイルされる言語です",
+ "postActions/openInEditor/description": "エディターで styleSheet1.less を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ko.json
index 292e2d4e1d..d5b5c4de4e 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ko.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "LESS 스타일 시트",
+ "description": "LESS는 CSS로 컴파일되는 언어입니다.",
+ "postActions/openInEditor/description": "편집기에서 styleSheet1.less를 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pl.json
index 292e2d4e1d..c3a1d05e04 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pl.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "Arkusz stylów języka LESS",
+ "description": "LESS to język kompilowany na język CSS.",
+ "postActions/openInEditor/description": "Otwiera plik styleSheet1.less w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pt-BR.json
index 292e2d4e1d..88394ef8b7 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.pt-BR.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "Folha de Estilo LESS",
+ "description": "LESS é uma linguagem que compila em CSS",
+ "postActions/openInEditor/description": "Abre styleSheet1.less no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ru.json
index 292e2d4e1d..e874d82a14 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.ru.json
@@ -1,6 +1,6 @@
-{
- "author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Таблица стилей LESS",
+ "description": "LESS – это язык, компилируемый в CSS",
+ "postActions/openInEditor/description": "Открывает styleSheet1.less в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.tr.json
index 292e2d4e1d..ea8e78f1e2 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.tr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "LESS Stil Sayfası",
+ "description": "LESS, CSS ile derlenen bir dildir",
+ "postActions/openInEditor/description": "Düzenleyicide styleSheet1.less dosyasını açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hans.json
index 292e2d4e1d..e76d67e434 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "LESS 样式表",
+ "description": "LESS 是可编译为 CSS 的一种语言",
+ "postActions/openInEditor/description": "在编辑器中打开 styleSheet1.less"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hant.json
index 292e2d4e1d..5aaf31184b 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Less/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "LESS Style Sheet",
- "description": "LESS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.less in the editor"
+ "name": "LESS 樣式表",
+ "description": "LESS 是編譯成 CSS 的語言。",
+ "postActions/openInEditor/description": "在編輯器中開啟 styleSheet1.less"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.cs.json
index a5eee1f7e5..852994fe32 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.cs.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "Šablona stylů SCSS (SASS)",
+ "description": "SCSS je jazyk kompilovaný do šablon stylů CSS.",
+ "postActions/openInEditor/description": "Otevře soubor styleSheet1.scss v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.de.json
index a5eee1f7e5..a521eaff21 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.de.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "SCSS-Stylesheet (Sass)",
+ "description": "SCSS ist eine Sprache, die in CSS kompiliert wird",
+ "postActions/openInEditor/description": "Öffnet styleSheet1.scss im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.es.json
index a5eee1f7e5..0934bd27fb 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.es.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "Hoja de estilos SCSS (SASS)",
+ "description": "SCSS es un lenguaje que se compila en CSS",
+ "postActions/openInEditor/description": "Abre styleSheet1.scss en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.fr.json
index a5eee1f7e5..d618703a03 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.fr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "Feuille de style SCSS (SASS)",
+ "description": "SCSS est un langage qui se compile en CSS",
+ "postActions/openInEditor/description": "Ouvre styleSheet1.scss dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.it.json
index a5eee1f7e5..53fd3c1874 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.it.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "Foglio di stile SCSS (SASS)",
+ "description": "SCSS è un linguaggio che viene compilato in CSS",
+ "postActions/openInEditor/description": "Apre styleSheet1.scss nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ja.json
index a5eee1f7e5..d69a2bef26 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ja.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "SCSS スタイル シート (SASS)",
+ "description": "SCSS は CSS にコンパイルされる言語です。",
+ "postActions/openInEditor/description": "エディターで styleSheet1.scss を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ko.json
index a5eee1f7e5..a64bdca168 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ko.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "SCSS 스타일시트(SASS)",
+ "description": "SCSS는 CSS로 컴파일되는 언어입니다.",
+ "postActions/openInEditor/description": "편집기에서 styleSheet1.scss를 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pl.json
index a5eee1f7e5..06f9b21e98 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pl.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "Arkusz stylów SCSS (SASS)",
+ "description": "SCSS to język kompilowany na język CSS.",
+ "postActions/openInEditor/description": "Otwiera plik styleSheet1.scss w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pt-BR.json
index a5eee1f7e5..e98b02a662 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.pt-BR.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "Folha de estilo SCSS (SASS)",
+ "description": "SCSS é uma linguagem que compila em CSS",
+ "postActions/openInEditor/description": "Abre styleSheet1.scss no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ru.json
index a5eee1f7e5..01866b1846 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.ru.json
@@ -1,6 +1,6 @@
-{
- "author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Таблица стилей SCSS (Sass)",
+ "description": "SCSS – это язык, компилируемый в CSS",
+ "postActions/openInEditor/description": "Открывает styleSheet1.scss в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.tr.json
index a5eee1f7e5..34bf5f72f3 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.tr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "SCSS Stil Sayfası (SASS)",
+ "description": "SCSS, CSS'de derlenen bir dildir",
+ "postActions/openInEditor/description": "StyleSheet1.scss’i düzenleyicide açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hans.json
index a5eee1f7e5..c0a285de14 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "SCSS 样式表(SASS)",
+ "description": "SCSS 是可编译为 CSS 的一种语言",
+ "postActions/openInEditor/description": "在编辑器中打开 styleSheet1.scss"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hant.json
index a5eee1f7e5..a2da0b4620 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/Scss/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "SCSS Style Sheet (SASS)",
- "description": "SCSS is a language that compiles into CSS",
- "postActions/openInEditor/description": "Opens styleSheet1.scss in the editor"
+ "name": "SCSS 樣式表 (SASS)",
+ "description": "SCSS 是編譯成 CSS 的語言",
+ "postActions/openInEditor/description": "在編輯器中開啟 styleSheet1.scss"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.cs.json
index ac58bc2a22..3274c2369f 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.cs.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "Soubor TypeScriptu",
+ "description": "Prázdný zdrojový soubor TypeScriptu",
+ "postActions/openInEditor/description": "Otevře soubor file1.ts v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.de.json
index ac58bc2a22..9b7aec0810 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.de.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "TypeScript-Datei",
+ "description": "Eine leere TypeScript-Quelldatei",
+ "postActions/openInEditor/description": "Öffnet file1.ts im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.es.json
index ac58bc2a22..fa404bfdf1 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.es.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "Archivo TypeScript",
+ "description": "Archivo de origen de TypeScript en blanco",
+ "postActions/openInEditor/description": "Abre file1.ts en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.fr.json
index ac58bc2a22..5ba39e0f09 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.fr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "Fichier TypeScript",
+ "description": "Fichier source TypeScript vide",
+ "postActions/openInEditor/description": "Ouvre file1.ts dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.it.json
index ac58bc2a22..03c3d95825 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.it.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "File TypeScript",
+ "description": "File di origine TypeScript vuoto",
+ "postActions/openInEditor/description": "Apre file1.ts nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ja.json
index ac58bc2a22..af85490305 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ja.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "TypeScript ファイル",
+ "description": "空の TypeScript ソース ファイル",
+ "postActions/openInEditor/description": "エディターで file1.ts を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ko.json
index ac58bc2a22..e92d7202c2 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ko.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "TypeScript 파일",
+ "description": "빈 TypeScript 소스 파일",
+ "postActions/openInEditor/description": "편집기에서 file1.ts를 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pl.json
index ac58bc2a22..15107f62d1 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pl.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "Plik TypeScript",
+ "description": "Pusty plik źródłowy TypeScript",
+ "postActions/openInEditor/description": "Otwiera plik1.ts w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pt-BR.json
index ac58bc2a22..e2c6890268 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.pt-BR.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "Arquivo TypeScript",
+ "description": "Um arquivo fonte do TypeScript em branco",
+ "postActions/openInEditor/description": "Abre file1.ts no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ru.json
index ac58bc2a22..dbc907f267 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.ru.json
@@ -1,6 +1,6 @@
-{
- "author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Файл TypeScript",
+ "description": "Пустой исходный файл TypeScript",
+ "postActions/openInEditor/description": "Открывает file1.ts в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.tr.json
index ac58bc2a22..c56908da06 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.tr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "TypeScript dosyası",
+ "description": "Boş bir TypeScript kaynak dosyası",
+ "postActions/openInEditor/description": "File1.ts dosyasını düzenleyicide açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hans.json
index ac58bc2a22..21b1120508 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "TypeScript 文件",
+ "description": "空白 TypeScript 源文件",
+ "postActions/openInEditor/description": "在编辑器中打开 file1.ts"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hant.json
index ac58bc2a22..eb7d9dbd4f 100644
--- a/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.Client.ItemTemplates/content/TypeScript/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "TypeScript file",
- "description": "A blank TypeScript source file",
- "postActions/openInEditor/description": "Opens file1.ts in the editor"
+ "name": "TypeScript 檔案",
+ "description": "空白的 TypeScript 原始程式檔",
+ "postActions/openInEditor/description": "在編輯器中開啟 file1.ts"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.cs.json
index 13d79b81d9..d20543643e 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.cs.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Soubor vyrovnávací paměti protokolu",
+ "description": "Soubor vyrovnávací paměti protokolu pro popis zpráv a služeb pro gRPC",
+ "symbols/namespace/description": "obor názvů pro vygenerovaný kód",
+ "postActions/openInEditor/description": "Otevře soubor protobuf.proto v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.de.json
index 13d79b81d9..3db1c194ed 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.de.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Protokollpufferdatei",
+ "description": "Eine Protokollpufferdatei zum Beschreiben von Nachrichten und Diensten für gRPC.",
+ "symbols/namespace/description": "Namespace für den generierten Code",
+ "postActions/openInEditor/description": "Öffnet protobuf.proto im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.es.json
index 13d79b81d9..25b148a805 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.es.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Archivo de búfer de protocolo",
+ "description": "Archivo de búfer de protocolo para describir mensajes y servicios para gRPC.",
+ "symbols/namespace/description": "espacio de nombres para el código generado",
+ "postActions/openInEditor/description": "Abre protobuf.proto en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.fr.json
index 13d79b81d9..ba1df56ca4 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.fr.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Fichier tampon de protocole",
+ "description": "Fichier tampon de protocole pour la description des messages et des services pour gRPC.",
+ "symbols/namespace/description": "espace de noms pour le code généré",
+ "postActions/openInEditor/description": "Ouvre protobuf.proto dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.it.json
index 13d79b81d9..cf9cb24a9d 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.it.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "File buffer del protocollo",
+ "description": "File di buffer del protocollo per descrivere messaggi e servizi per gRPC.",
+ "symbols/namespace/description": "spazio dei nomi per il codice generato",
+ "postActions/openInEditor/description": "Apre protobuf.proto nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ja.json
index 13d79b81d9..a568015c89 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ja.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "プロトコル バッファー ファイル",
+ "description": "gRPC 用のメッセージとサービスを記述するためのプロトコル バッファー ファイル。",
+ "symbols/namespace/description": "生成されたコードの名前空間",
+ "postActions/openInEditor/description": "エディターで protobuf.proto を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ko.json
index 13d79b81d9..f8b90f323b 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ko.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "프로토콜 버퍼 파일",
+ "description": "gRPC의 메시지 및 서비스를 설명하는 프로토콜 버퍼 파일입니다.",
+ "symbols/namespace/description": "생성된 코드의 네임스페이스",
+ "postActions/openInEditor/description": "편집기에서 protobuf.proto를 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pl.json
index 13d79b81d9..5a6025c679 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pl.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Plik buforu protokołu",
+ "description": "Plik buforu protokołu służący do opisywania komunikatów i usług na potrzeby systemu gRPC.",
+ "symbols/namespace/description": "przestrzeń nazw wygenerowanego kodu.",
+ "postActions/openInEditor/description": "Otwiera plik protobuf.proto w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pt-BR.json
index 13d79b81d9..26e438d18c 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.pt-BR.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Arquivo de Buffer de Protocolo",
+ "description": "Um arquivo de buffer de protocolo para descrever mensagens e serviços para gRPC.",
+ "symbols/namespace/description": "namespace do código gerado",
+ "postActions/openInEditor/description": "Abre protobuf.proto no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ru.json
index 13d79b81d9..0323c6b347 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.ru.json
@@ -1,7 +1,7 @@
-{
- "author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Файл буфера протокола",
+ "description": "Файл буфера протокола для описания сообщений и служб для gRPC.",
+ "symbols/namespace/description": "пространство имен для созданного кода",
+ "postActions/openInEditor/description": "Открывает protobuf.proto в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.tr.json
index 13d79b81d9..eb077934a2 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.tr.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "Protokol Arabelleği Dosyası",
+ "description": "gRPC için iletileri ve hizmetleri açıklamak için bir protokol arabelleği dosyası.",
+ "symbols/namespace/description": "oluşturulan kod için ad alanı",
+ "postActions/openInEditor/description": "Düzenleyicide protobuf.proto dosyasını açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json
index 13d79b81d9..d0bc499cdc 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "协议缓冲区文件",
+ "description": "一个协议缓冲区文件,它用于描述 gRPC 的消息和服务。",
+ "symbols/namespace/description": "生成的代码的命名空间",
+ "postActions/openInEditor/description": "在编辑器中打开 protobuf.proto"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hant.json
index 13d79b81d9..fdba7a011b 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/Protobuf/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
- "name": "Protocol Buffer File",
- "description": "A protocol buffer file for describing messages and services for gRPC.",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens protobuf.proto in the editor"
+ "name": "通訊協定緩衝區檔案",
+ "description": "用來描述 gRPC 訊息和服務的通訊協定緩衝區檔案。",
+ "symbols/namespace/description": "適用於產生之程式碼的命名空間",
+ "postActions/openInEditor/description": "在編輯器中開啟 protobuf.proto"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.cs.json
index 173ab06e59..40e5e585a9 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.cs.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Komponenta Razor",
+ "description": "Opětovně použitelná komponenta uživatelského rozhraní implementovaná pomocí Razoru",
+ "postActions/openInEditor/description": "Otevře soubor Component1.razor v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.de.json
index 173ab06e59..6c443a74e1 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.de.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Razor Komponente",
+ "description": "Eine mit Razor implementierte, wiederverwendbare Benutzeroberflächenkomponente.",
+ "postActions/openInEditor/description": "Öffnet Component1.razor im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.es.json
index 173ab06e59..687457d2cb 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.es.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Componente Razor",
+ "description": "Componente de interfaz de usuario reutilizable implementado con Razor",
+ "postActions/openInEditor/description": "Abre Component1.razor en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.fr.json
index 173ab06e59..8798cedfbc 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.fr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Composant Razor",
+ "description": "Composant d'interface utilisateur réutilisable implémenté avec Razor",
+ "postActions/openInEditor/description": "Ouvre Component1.razor dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.it.json
index 173ab06e59..530175949b 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.it.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Componente Razor",
+ "description": "Componente riutilizzabile dell'interfaccia utente implementato con Razor",
+ "postActions/openInEditor/description": "Apre Component1.razor nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ja.json
index 173ab06e59..d666e25f50 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ja.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Razor コンポーネント",
+ "description": "Razor で実装された再利用可能な UI コンポーネント",
+ "postActions/openInEditor/description": "エディターで Component1.razor を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ko.json
index 173ab06e59..5bf5dba4e0 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ko.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Razor 구성 요소",
+ "description": "Razor로 구현된 재사용 가능한 UI 구성 요소",
+ "postActions/openInEditor/description": "편집기에서 Component1.razor를 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pl.json
index 173ab06e59..67b208a0f8 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pl.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Składnik Razor",
+ "description": "Składnik interfejsu użytkownika wielokrotnego użytku implementowany przy użyciu składni Razor",
+ "postActions/openInEditor/description": "Otwiera plik Component1.razor w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pt-BR.json
index 173ab06e59..5a2e3fa5d5 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.pt-BR.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Componente Razor",
+ "description": "Um componente de interface do usuário reutilizável implementado com o Razor",
+ "postActions/openInEditor/description": "Abre Component1.razor no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ru.json
index 173ab06e59..7383877e73 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.ru.json
@@ -1,6 +1,6 @@
-{
- "author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Компонент Razor",
+ "description": "Компонент пользовательского интерфейса для повторного использования, реализованный с помощью Razor",
+ "postActions/openInEditor/description": "Открывает Component1.razor в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.tr.json
index 173ab06e59..32a9ecec99 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.tr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Razor Bileşeni",
+ "description": "Razor ile birlikte uygulanan yeniden kullanılabilir bir kullanıcı arabirimi bileşeni",
+ "postActions/openInEditor/description": "Component1.razor'ı düzenleyicide açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json
index 173ab06e59..810ee15dae 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Razor 组件",
+ "description": "使用 Razor 实现的可重用 UI 组件",
+ "postActions/openInEditor/description": "在编辑器中打开 Component1.razor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hant.json
index 173ab06e59..229686374c 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorComponent/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Component",
- "description": "A reusable UI component implemented with Razor",
- "postActions/openInEditor/description": "Opens Component1.razor in the editor"
+ "name": "Razor 元件",
+ "description": "透過 Razor 實作且可重複使用的 UI 元件",
+ "postActions/openInEditor/description": "在編輯器中開啟 Component1.razor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.cs.json
index 64b64fabef..98ec45bace 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.cs.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Stránka Razor",
+ "description": "Stránka Razor s modelem stránky nebo bez něj",
+ "symbols/namespace/description": "obor názvů pro vygenerovaný kód",
+ "symbols/no-pagemodel/description": "vytvoření stránky bez PageModel",
+ "symbols/no-pagemodel/displayName": "Vyloučit PageModel",
+ "postActions/openInEditor/description": "Otevře soubor Index.cshtml v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.de.json
index 64b64fabef..120e3addb8 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.de.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Razor Seite",
+ "description": "Eine Razor Seite mit oder ohne Seitenmodell",
+ "symbols/namespace/description": "Namespace für den generierten Code",
+ "symbols/no-pagemodel/description": "Seite ohne PageModel erstellen",
+ "symbols/no-pagemodel/displayName": "Seitenmodell ausschließen",
+ "postActions/openInEditor/description": "Öffnet Index.cshtml im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.es.json
index 64b64fabef..ef6b39a2e9 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.es.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Página de Razor",
+ "description": "Una página de Razor con o sin un modelo de página",
+ "symbols/namespace/description": "espacio de nombres para el código generado",
+ "symbols/no-pagemodel/description": "crear una página sin PageModel",
+ "symbols/no-pagemodel/displayName": "Excluir PageModel",
+ "postActions/openInEditor/description": "Abre Index.cshtml en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.fr.json
index 64b64fabef..4cdd72def9 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.fr.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
+ "name": "Page Razor",
+ "description": "Une page Razor avec ou sans modèle de page",
+ "symbols/namespace/description": "espace de noms pour le code généré",
+ "symbols/no-pagemodel/description": "créer une page sans PageModel",
"symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "postActions/openInEditor/description": "Ouvre Index.cshtml dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.it.json
index 64b64fabef..2e4b7a8d2b 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.it.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Pagina Razor",
+ "description": "Pagina Razor con o senza un modello di pagina",
+ "symbols/namespace/description": "spazio dei nomi per il codice generato",
+ "symbols/no-pagemodel/description": "crea una pagina senza PageModel",
+ "symbols/no-pagemodel/displayName": "Escludi PageModel",
+ "postActions/openInEditor/description": "Apre Index.cshtml nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ja.json
index 64b64fabef..a01c613507 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ja.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Razor ページ",
+ "description": "ページ モデルのある/ない Razor ページ",
+ "symbols/namespace/description": "生成されたコードの名前空間",
+ "symbols/no-pagemodel/description": "PageModel なしでページを作成する",
+ "symbols/no-pagemodel/displayName": "PageModel を除外する",
+ "postActions/openInEditor/description": "エディターで Index.cshtml を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ko.json
index 64b64fabef..ec450e866b 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ko.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Razor 페이지",
+ "description": "페이지 모델이 있거나 없는 Razor 페이지",
+ "symbols/namespace/description": "생성된 코드의 네임스페이스",
+ "symbols/no-pagemodel/description": "PageModel 없이 페이지 만들기",
+ "symbols/no-pagemodel/displayName": "PageModel 제외",
+ "postActions/openInEditor/description": "편집기에서 Index.cshtml을 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pl.json
index 64b64fabef..5cf2704d57 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pl.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Strona Razor",
+ "description": "Strona Razor z modelem strony lub bez",
+ "symbols/namespace/description": "przestrzeń nazw wygenerowanego kodu.",
+ "symbols/no-pagemodel/description": "tworzenie strony bez modelu PageModel",
+ "symbols/no-pagemodel/displayName": "Wyklucz moduł PageModel",
+ "postActions/openInEditor/description": "Otwiera plik Index.cshtml w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pt-BR.json
index 64b64fabef..12e41c4e40 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.pt-BR.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Página Razor",
+ "description": "Uma página Razor com ou sem um modelo de página",
+ "symbols/namespace/description": "namespace do código gerado",
+ "symbols/no-pagemodel/description": "criar página sem um PageModel",
+ "symbols/no-pagemodel/displayName": "Excluir PageModel",
+ "postActions/openInEditor/description": "Abre Index.cshtml no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ru.json
index 64b64fabef..225732f057 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.ru.json
@@ -1,9 +1,9 @@
-{
- "author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Страница Razor",
+ "description": "Страница Razor со страничной моделью или без нее",
+ "symbols/namespace/description": "пространство имен для созданного кода",
+ "symbols/no-pagemodel/description": "создать страницу без PageModel",
+ "symbols/no-pagemodel/displayName": "Исключить PageModel",
+ "postActions/openInEditor/description": "Открывает Index.cshtml в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.tr.json
index 64b64fabef..0c0f45ec48 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.tr.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Razor Sayfası",
+ "description": "Sayfa modeli olan veya olmayan bir Razor sayfası",
+ "symbols/namespace/description": "oluşturulan kod için ad alanı",
+ "symbols/no-pagemodel/description": "PageModel olmadan sayfa oluşturma",
+ "symbols/no-pagemodel/displayName": "PageModel'i Dışla",
+ "postActions/openInEditor/description": "Düzenleyicide Index.cshtml’yi açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json
index 64b64fabef..81fc3f23c2 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Razor 页面",
+ "description": "带或不带页面模型的 Razor 页面",
+ "symbols/namespace/description": "生成的代码的命名空间",
+ "symbols/no-pagemodel/description": "创建不带 PageModel 的页面",
+ "symbols/no-pagemodel/displayName": "排除 PageModel",
+ "postActions/openInEditor/description": "在编辑器中打开 Index.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hant.json
index 64b64fabef..3c7242e5d2 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/RazorPage/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,9 +1,9 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Page",
- "description": "A Razor page with or without a page model",
- "symbols/namespace/description": "namespace for the generated code",
- "symbols/no-pagemodel/description": "create page without a PageModel",
- "symbols/no-pagemodel/displayName": "Exclude PageModel",
- "postActions/openInEditor/description": "Opens Index.cshtml in the editor"
+ "name": "Razor 頁面",
+ "description": "具有或不含頁面模型的 Razor 頁面。",
+ "symbols/namespace/description": "適用於產生之程式碼的命名空間",
+ "symbols/no-pagemodel/description": "建立不含 PageModel 的頁面",
+ "symbols/no-pagemodel/displayName": "排除 PageModel",
+ "postActions/openInEditor/description": "在編輯器中開啟 Index.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.cs.json
index bc11b8d35c..24cae74d83 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.cs.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Stránka importu zobrazení MVC",
+ "symbols/namespace/description": "obor názvů pro vygenerovaný kód",
+ "postActions/openInEditor/description": "Otevře soubor _ViewImports.cshtml v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.de.json
index bc11b8d35c..20b86bd852 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.de.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Eine MVC View Importseite",
+ "symbols/namespace/description": "Namespace für den generierten Code",
+ "postActions/openInEditor/description": "Öffnet _ViewImports.cshtml im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.es.json
index bc11b8d35c..d8ca9b964f 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.es.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Una página de importación de vista de MVC",
+ "symbols/namespace/description": "espacio de nombres para el código generado",
+ "postActions/openInEditor/description": "Abre _ViewImports.cshtml en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.fr.json
index bc11b8d35c..1a8622ba11 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.fr.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Page d’importation d’affichage MVC",
+ "symbols/namespace/description": "espace de noms pour le code généré",
+ "postActions/openInEditor/description": "Ouvre _ViewImports.cshtml dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.it.json
index bc11b8d35c..aa26358134 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.it.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Pagina di importazione di una visualizzazione MVC",
+ "symbols/namespace/description": "spazio dei nomi per il codice generato",
+ "postActions/openInEditor/description": "Apre _ViewImports.cshtml nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ja.json
index bc11b8d35c..ff967114e9 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ja.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "MVC ビュー インポート ページ",
+ "symbols/namespace/description": "生成されたコードの名前空間",
+ "postActions/openInEditor/description": "エディターで _ViewImports.cshtml を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ko.json
index bc11b8d35c..ac3592a119 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ko.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "MVC 보기 가져오기 페이지",
+ "symbols/namespace/description": "생성된 코드의 네임스페이스",
+ "postActions/openInEditor/description": "편집기에서 _ViewImports.cshtml을 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pl.json
index bc11b8d35c..6f883ba222 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pl.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Strona importowania widoku MVC",
+ "symbols/namespace/description": "przestrzeń nazw wygenerowanego kodu.",
+ "postActions/openInEditor/description": "Otwiera plik _ViewImports.cshtml w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pt-BR.json
index bc11b8d35c..134e47723d 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.pt-BR.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Uma página de importação de visualização MVC",
+ "symbols/namespace/description": "namespace do código gerado",
+ "postActions/openInEditor/description": "Abre _ViewImports.cshtml no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ru.json
index bc11b8d35c..ea89715fdf 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.ru.json
@@ -1,7 +1,7 @@
-{
- "author": "Microsoft",
+{
+ "author": "Майкрософт",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "Страница импорта представления MVC",
+ "symbols/namespace/description": "пространство имен для созданного кода",
+ "postActions/openInEditor/description": "Открывает _ViewImports.cshtml в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.tr.json
index bc11b8d35c..ae33630d13 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.tr.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "MVC Görünümü İçeri Aktarma Sayfası",
+ "symbols/namespace/description": "oluşturulan kod için ad alanı",
+ "postActions/openInEditor/description": "Düzenleyicide _ViewImports.cshtml dosyasını açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json
index bc11b8d35c..c2f6bc2b74 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "MVC 视图导入页",
+ "symbols/namespace/description": "生成的代码的命名空间",
+ "postActions/openInEditor/description": "在编辑器中打开 _ViewImports.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hant.json
index bc11b8d35c..b8f00b45c7 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewImports/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,7 +1,7 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewImports",
- "description": "An MVC View Import Page",
- "symbols/namespace/description": "namespace for the generated code",
- "postActions/openInEditor/description": "Opens _ViewImports.cshtml in the editor"
+ "description": "MVC 檢視匯入頁面",
+ "symbols/namespace/description": "適用於產生之程式碼的命名空間",
+ "postActions/openInEditor/description": "在編輯器中開啟 _ViewImports.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.cs.json
index 300248ef32..6bcfe6f2e9 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.cs.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Stránka MVC ViewStart",
+ "postActions/openInEditor/description": "Otevře soubor _ViewStart.cshtml v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.de.json
index 300248ef32..8c4513d85a 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.de.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Eine MVC ViewStartseite",
+ "postActions/openInEditor/description": "Öffnet _ViewStart.cshtml im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.es.json
index 300248ef32..e7e3760969 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.es.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
- "name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "name": "MVC de ViewStart",
+ "description": "Una página MVC de ViewStart",
+ "postActions/openInEditor/description": "Abre _ViewStart.cshtml en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.fr.json
index 300248ef32..b990617b60 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.fr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Page ViewStart MVC",
+ "postActions/openInEditor/description": "Ouvre _ViewStart.cshtml dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.it.json
index 300248ef32..1b61c6b0e8 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.it.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Pagina ViewStart di MVC",
+ "postActions/openInEditor/description": "Apre _ViewStart.cshtml nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ja.json
index 300248ef32..7c57a1948e 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ja.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "MVC ViewStart ページ",
+ "postActions/openInEditor/description": "エディターで _ViewStart.cshtml を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ko.json
index 300248ef32..e0f41ad553 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ko.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "MVC ViewStart 페이지",
+ "postActions/openInEditor/description": "편집기에서 ViewStart.cshtml을 엽니다(_V)"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pl.json
index 300248ef32..f3b59e5e03 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pl.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Strona MVC ViewStart",
+ "postActions/openInEditor/description": "Otwiera plik _ViewStart.cshtml w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pt-BR.json
index 300248ef32..a138cf5207 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.pt-BR.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Uma página MVC ViewStart",
+ "postActions/openInEditor/description": "Abre _ViewStart.cshtml no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ru.json
index 300248ef32..a33df6527f 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.ru.json
@@ -1,6 +1,6 @@
-{
- "author": "Microsoft",
+{
+ "author": "Майкрософт",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "Страница MVC ViewStart",
+ "postActions/openInEditor/description": "Открывает _ViewStart.cshtml в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.tr.json
index 300248ef32..e655d378cc 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.tr.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "MVC ViewStart Sayfası",
+ "postActions/openInEditor/description": "_ViewStart.cshtml’yi düzenleyicide açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json
index 300248ef32..2bb7fb5005 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "MVC ViewStart 页面",
+ "postActions/openInEditor/description": "在编辑器中打开 _ViewStart.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hant.json
index 300248ef32..31f96af7db 100644
--- a/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ItemTemplates/content/ViewStart/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,6 +1,6 @@
-{
+{
"author": "Microsoft",
"name": "MVC ViewStart",
- "description": "An MVC ViewStart Page",
- "postActions/openInEditor/description": "Opens _ViewStart.cshtml in the editor"
+ "description": "MVC ViewStart 頁面",
+ "postActions/openInEditor/description": "在編輯器中開啟 _ViewStart.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/EmptyBlazorServerWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/EmptyBlazorServerWeb-CSharp.csproj.in
new file mode 100644
index 0000000000..d3a39c6503
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/EmptyBlazorServerWeb-CSharp.csproj.in
@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>${DefaultNetCoreTargetFramework}</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <NoDefaultLaunchSettingsFile Condition="'$(ExcludeLaunchSettings)' == 'True'">True</NoDefaultLaunchSettingsFile>
+ <RootNamespace Condition="'$(name)' != '$(name{-VALUE-FORMS-}safe_namespace)'">EmptyBlazorServerWeb_CSharp</RootNamespace>
+ </PropertyGroup>
+
+</Project>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Client.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Client.csproj.in
new file mode 100644
index 0000000000..4b41335026
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Client.csproj.in
@@ -0,0 +1,33 @@
+<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
+
+ <PropertyGroup>
+ <TargetFramework>${DefaultNetCoreTargetFramework}</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <!--#if PWA -->
+ <ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
+ <!--#endif -->
+ <!--#if Hosted -->
+ <AssemblyName Condition="'$(name)' != '$(name{-VALUE-FORMS-}safe_namespace)'">`$(AssemblyName.Replace(' ', '_'))</AssemblyName>
+ <!--#endif -->
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="${MicrosoftAspNetCoreComponentsWebAssemblyVersion}" />
+ <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="${MicrosoftAspNetCoreComponentsWebAssemblyDevServerVersion}" PrivateAssets="all" />
+ <PackageReference Include="Microsoft.Extensions.Http" Version="${MicrosoftExtensionsHttpVersion}" Condition="'$(Hosted)' == 'true'" />
+ </ItemGroup>
+
+ <!--#if Hosted -->
+ <ItemGroup>
+ <ProjectReference Include="..\Shared\EmptyComponentsWebAssembly-CSharp.Shared.csproj" />
+ </ItemGroup>
+
+ <!--#endif -->
+ <!--#if PWA -->
+ <ItemGroup>
+ <ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
+ </ItemGroup>
+
+ <!--#endif -->
+</Project>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Server.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Server.csproj.in
new file mode 100644
index 0000000000..f54a03b7f4
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Server.csproj.in
@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>${DefaultNetCoreTargetFramework}</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ <NoDefaultLaunchSettingsFile Condition="'$(ExcludeLaunchSettings)' == 'True'">True</NoDefaultLaunchSettingsFile>
+ <RootNamespace Condition="'$(name)' != '$(name{-VALUE-FORMS-}safe_namespace)'">EmptyComponentsWebAssembly-CSharp.Server</RootNamespace>
+ <AssemblyName Condition="'$(name)' != '$(name{-VALUE-FORMS-}safe_namespace)'">`$(AssemblyName.Replace(' ', '_'))</AssemblyName>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="${MicrosoftAspNetCoreComponentsWebAssemblyServerVersion}" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\Client\EmptyComponentsWebAssembly-CSharp.Client.csproj" />
+ <ProjectReference Include="..\Shared\EmptyComponentsWebAssembly-CSharp.Shared.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Shared.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Shared.csproj.in
new file mode 100644
index 0000000000..ba1c0026e9
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/EmptyComponentsWebAssembly-CSharp.Shared.csproj.in
@@ -0,0 +1,12 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>${DefaultNetCoreTargetFramework}</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <SupportedPlatform Include="browser" />
+ </ItemGroup>
+</Project>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj b/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
index 2dc4136434..8528b64842 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
+++ b/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj
@@ -31,8 +31,6 @@
<ItemGroup>
<!-- These projects product packages that the templates depend on. See GenerateContent.targets -->
- <PackageVersionVariableReference Include="$(RepoRoot)src\Azure\AzureAD\Authentication.AzureAD.UI\src\Microsoft.AspNetCore.Authentication.AzureAD.UI.csproj" />
- <PackageVersionVariableReference Include="$(RepoRoot)src\Azure\AzureAD\Authentication.AzureADB2C.UI\src\Microsoft.AspNetCore.Authentication.AzureADB2C.UI.csproj" />
<PackageVersionVariableReference Include="$(RepoRoot)src\Components\Components\src\Microsoft.AspNetCore.Components.csproj" />
<PackageVersionVariableReference Include="$(RepoRoot)src\Components\Web\src\Microsoft.AspNetCore.Components.Web.csproj" />
<PackageVersionVariableReference Include="$(RepoRoot)src\Identity\EntityFrameworkCore\src\Microsoft.AspNetCore.Identity.EntityFrameworkCore.csproj" />
@@ -56,6 +54,7 @@
<GeneratedContent Include="EmptyWeb-FSharp.fsproj.in" OutputPath="content/EmptyWeb-FSharp/Company.WebApplication1.fsproj" />
<GeneratedContent Include="GrpcService-CSharp.csproj.in" OutputPath="content/GrpcService-CSharp/GrpcService-CSharp.csproj" />
<GeneratedContent Include="BlazorServerWeb-CSharp.csproj.in" OutputPath="content/BlazorServerWeb-CSharp/BlazorServerWeb-CSharp.csproj" />
+ <GeneratedContent Include="EmptyBlazorServerWeb-CSharp.csproj.in" OutputPath="content/EmptyBlazorServerWeb-CSharp/EmptyBlazorServerWeb-CSharp.csproj" />
<GeneratedContent Include="RazorPagesWeb-CSharp.csproj.in" OutputPath="content/RazorPagesWeb-CSharp/Company.WebApplication1.csproj" />
<GeneratedContent Include="RazorClassLibrary-CSharp.csproj.in" OutputPath="content/RazorClassLibrary-CSharp/Company.RazorClassLibrary1.csproj" />
<GeneratedContent Include="StarterWeb-CSharp.csproj.in" OutputPath="content/StarterWeb-CSharp/Company.WebApplication1.csproj" />
@@ -67,6 +66,9 @@
<GeneratedContent Include="ComponentsWebAssembly-CSharp.Client.csproj.in" OutputPath="content/ComponentsWebAssembly-CSharp/Client/ComponentsWebAssembly-CSharp.Client.csproj" />
<GeneratedContent Include="ComponentsWebAssembly-CSharp.Shared.csproj.in" OutputPath="content/ComponentsWebAssembly-CSharp/Shared/ComponentsWebAssembly-CSharp.Shared.csproj" />
<GeneratedContent Include="ComponentsWebAssembly-CSharp.Server.csproj.in" OutputPath="content/ComponentsWebAssembly-CSharp/Server/ComponentsWebAssembly-CSharp.Server.csproj" />
+ <GeneratedContent Include="EmptyComponentsWebAssembly-CSharp.Client.csproj.in" OutputPath="content/EmptyComponentsWebAssembly-CSharp/Client/EmptyComponentsWebAssembly-CSharp.Client.csproj" />
+ <GeneratedContent Include="EmptyComponentsWebAssembly-CSharp.Shared.csproj.in" OutputPath="content/EmptyComponentsWebAssembly-CSharp/Shared/EmptyComponentsWebAssembly-CSharp.Shared.csproj" />
+ <GeneratedContent Include="EmptyComponentsWebAssembly-CSharp.Server.csproj.in" OutputPath="content/EmptyComponentsWebAssembly-CSharp/Server/EmptyComponentsWebAssembly-CSharp.Server.csproj" />
</ItemGroup>
</Project>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/ide.host.json
index 947fd0caa5..7b14a445fa 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/ide.host.json
@@ -1,52 +1,13 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 600,
"icon": "ide/icon.png",
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "CloudExisting"
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "Local"
- },
- {
- "auth": "SingleOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "SSO"
- },
- {
- "auth": "MultiOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "MultiOrg"
- },
- {
- "auth": "Windows",
- "authenticationType": "WindowsAuth"
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"symbolInfo": [
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
],
"disableHttpsSymbol": "NoHttps",
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json
index 93b827b9d7..6eaa000e5f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplikace Blazor Server",
+ "description": "Šablona projektu pro vytvoření aplikace Blazor Server, která běží na straně serveru uvnitř aplikace ASP.NET Core a zpracovává interakce uživatele přes připojení SignalR. Tato šablona se dá využít pro webové aplikace s propracovanými dynamickými uživatelskými rozhraními (UI).",
+ "symbols/auth/choices/None/description": "Bez ověřování",
+ "symbols/auth/choices/Individual/description": "Ověřování Individual",
+ "symbols/auth/choices/IndividualB2C/description": "Ověřování Individual pomocí Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Ověřování organizace pro jednoho tenanta",
+ "symbols/auth/choices/MultiOrg/description": "Ověřování organizace pro více tenantů",
+ "symbols/auth/choices/Windows/description": "Integrované ověřování Windows",
+ "symbols/auth/description": "Typ ověřování, který se má použít",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C, ke které se chcete připojit (používá se s ověřováním IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID zásad přihlašování a registrace pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Zpětné volání globálního odhlášení (používá se s ověřováním IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID zásad resetování hesla pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID zásad úprav profilu pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory, ke které se chcete připojit (používá se s ověřováním SingleOrg nebo MultiOrg).",
+ "symbols/ClientId/description": "ID klienta pro tento projekt (používá se s ověřováním IndividualB2C, SingleOrg nebo MultiOrg).",
+ "symbols/Domain/description": "Doména pro tenanta adresáře (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/TenantId/description": "TenantId adresáře, ke kterému se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/CallbackPath/description": "Cesta žádosti v rámci základní cesty aplikace k identifikátoru URI pro přesměrování (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Určuje, jestli se této aplikaci povolí přístup ke čtení adresáře (platí jenom pro ověřování SingleOrg nebo MultiOrg).",
+ "symbols/UserSecretsId/description": "ID, které se má použít pro tajné kódy (používá se s ověřováním OrgReadAccess nebo Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají IndividualB2C, SingleOrg ani MultiOrg.",
+ "symbols/UseLocalDB/description": "Určuje, jestli se má použít LocalDB namísto SQLite. Tato možnost platí jenom v případě, že je zadáno --auth Individual nebo --auth IndividualB2C.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/CalledApiUrl/description": "Adresa URL rozhraní API, která se má volat z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Určuje, jestli webová aplikace volá Microsoft Graph. Tato možnost platí pouze v případě, že je zadáno --auth SingleOrg nebo --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Obory, které se mají požádat o volání rozhraní API z webové aplikace Tato možnost platí jenom v případě, že je zadaná možnost --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C.",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json
index 93b827b9d7..4124c20ba3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
"name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
+ "description": "Eine Projektvorlage für das Erstellen einer Blazor Server-App, die serverseitig innerhalb einer ASP.NET Core-App ausgeführt wird und die Benutzerinteraktionen über eine SignalR-Verbindung verarbeitet. Diese Vorlage kann für Web-Apps mit umfangreichen dynamischen Benutzeroberflächen verwendet werden.",
+ "symbols/auth/choices/None/description": "Keine Authentifizierung",
+ "symbols/auth/choices/Individual/description": "Individuelle Authentifizierung",
+ "symbols/auth/choices/IndividualB2C/description": "Individuelle Authentifizierung mit Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Organisationsauthentifizierung für einen einzelnen Mandanten",
+ "symbols/auth/choices/MultiOrg/description": "Organisationsauthentifizierung für mehrere Mandanten",
+ "symbols/auth/choices/Windows/description": "Windows-Authentifizierung",
+ "symbols/auth/description": "Der zu verwendende Authentifizierungstyp",
+ "symbols/AAdB2CInstance/description": "Die Azure Active Directory B2C-Instanz, mit der eine Verbindung hergestellt werden soll (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/SignUpSignInPolicyId/description": "Die Anmelde und Registrierungsrichtlinien ID für dieses Projekt (mit IndividualB2C Authentifizierung verwenden).",
+ "symbols/SignedOutCallbackPath/description": "Der Rückruf für die globale Abmeldung (mit individueller B2C Authentifizierung verwenden).",
+ "symbols/ResetPasswordPolicyId/description": "Die Richtlinien ID zum Zurücksetzen des Kennworts für dieses Projekt (mit individueller B2C Authentifizierung verwenden).",
+ "symbols/EditProfilePolicyId/description": "Die Bearbeitungsprofil-Richtlinien-ID für dieses Projekt (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/AADInstance/description": "Die Azure Active Directory-Instanz, mit der eine Verbindung hergestellt werden soll (mit SingleOrg oder MultiOrg Authentifizierung verwenden).",
+ "symbols/ClientId/description": "Die Client ID für dieses Projekt (mit IndividualB2C, SingleOrg oder MultiOrg Authentifizierung verwenden).",
+ "symbols/Domain/description": "Die Domäne für den Verzeichnismandanten (mit SingleOrg oder IndividualB2C Authentifizierung verwenden).",
+ "symbols/TenantId/description": "Die TenantId ID des Verzeichnisses, mit dem eine Verbindung hergestellt werden soll (mit SingleOrg Authentifizierung verwenden).",
+ "symbols/CallbackPath/description": "Der Anforderungspfad innerhalb des Basispfads der Anwendung des Umleitungs-URI (mit SingleOrg- oder IndividualB2C-Authentifizierung verwenden).",
+ "symbols/OrgReadAccess/description": "Ob dieser Anwendung Lesezugriff auf das Verzeichnis gewährt werden soll oder nicht (gilt nur für SingleOrg- oder MultiOrg-Authentifizierung).",
+ "symbols/UserSecretsId/description": "Die für Geheimnisse zu verwendende ID (Verwendung mit OrgReadAccess oder Einzelauthentifizierung).",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS-Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "symbols/UseLocalDB/description": "Ob LocalDB anstelle von SQLite verwendet werden soll. Diese Option gilt nur, wenn --auth Individual oder --auth IndividualB2C angegeben ist.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/CalledApiUrl/description": "URL der API, die von der Web-App aufgerufen werden soll. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/CallsMicrosoftGraph/description": "Gibt an, ob die Web-App Microsoft Graph aufruft. Diese Option gilt nur, wenn --auth SingleOrg oder --auth MultiOrg angegeben ist.",
+ "symbols/CalledApiScopes/description": "Anzufordernde Bereiche zum Aufrufen der API von der Web-App. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json
index 24cfab2ca6..34042fafad 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json
@@ -23,10 +23,10 @@
"symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
"symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
"symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
"symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
"symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
"symbols/Framework/description": "The target framework for the project.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
@@ -34,8 +34,9 @@
"symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
"symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
"symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json
index 93b827b9d7..ad64c59ad8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicación Blazor Server",
+ "description": "Plantilla de proyecto para crear una aplicación Blazor Server que se ejecuta del lado servidor dentro de una aplicación de ASP.NET Core y controla las interacciones de los usuarios a través de una conexión de SignalR. Esta plantilla se puede usar para las aplicaciones web con interfaces de usuario dinámicas enriquecidas.",
+ "symbols/auth/choices/None/description": "Sin autenticación",
+ "symbols/auth/choices/Individual/description": "Autenticación individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticación individual con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticación organizacional para un único inquilino",
+ "symbols/auth/choices/MultiOrg/description": "Autenticación organizacional para varios inquilinos",
+ "symbols/auth/choices/Windows/description": "Autenticación de Windows",
+ "symbols/auth/description": "El tipo de autenticación que se va a usar",
+ "symbols/AAdB2CInstance/description": "Instancia de Azure Active Directory B2C a la que conectarse (se usa con la autenticación IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Id. de la directiva de inicio de sesión y registro para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Devolución de llamada de cierre de sesión global (se usa con la autenticación IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Id. de directiva de restablecimiento de contraseña para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Id. de la directiva de perfil de edición para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/AADInstance/description": "Instancia de Azure Active Directory a la que se va a conectar (se usa con la autenticación SingleOrg o MultiOrg).",
+ "symbols/ClientId/description": "Id. de cliente de este proyecto (se usa con la autenticación IndividualB2C, SingleOrg o MultiOrg).",
+ "symbols/Domain/description": "Dominio del inquilino de directorio (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/TenantId/description": "Id. de TenantId del directorio al que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/CallbackPath/description": "Ruta de acceso de solicitud dentro de la ruta de acceso base de la aplicación del URI de redireccionamiento (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indica si se va a permitir o no el acceso de lectura de esta aplicación al directorio (solo se aplica a la autenticación SingleOrg o MultiOrg).",
+ "symbols/UserSecretsId/description": "Id. que se va a usar para los secretos (se usa con OrgReadAccess o con la autenticación individual).",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Ya sea para desactivar HTTPS. Esta opción solo se aplica si no se utilizan IndividualB2C, SingleOrg o MultiOrg para --auth.",
+ "symbols/UseLocalDB/description": "Indica si se va a usar LocalDB en lugar de SQLite. Esta opción solo se aplica si se especifica --auth Individual o --auth IndividualB2C.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/CalledApiUrl/description": "Dirección URL de la API a la que se va a llamar desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica si la aplicación web llama a Microsoft Graph. Esta opción solo se aplica si se especifica --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ámbitos para solicitar llamar a la API desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json
index 93b827b9d7..64bdaad016 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Application Blazor Server",
+ "description": "Modèle de projet permettant de créer une application Blazor Server qui s'exécute côté serveur dans une application ASP.NET Core, et qui gère les interactions utilisateur via une connexion SignalR. Vous pouvez utiliser ce modèle pour les applications web ayant des IU (interfaces utilisateur) dynamiques riches.",
+ "symbols/auth/choices/None/description": "Aucune authentification",
+ "symbols/auth/choices/Individual/description": "Authentification individuelle",
+ "symbols/auth/choices/IndividualB2C/description": "Authentification individuelle avec Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Authentification organisationnelle pour un seul locataire",
+ "symbols/auth/choices/MultiOrg/description": "Authentification organisationnelle pour plusieurs locataires",
+ "symbols/auth/choices/Windows/description": "Authentification Windows",
+ "symbols/auth/description": "Type d’authentification à utiliser",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C à laquelle se connecter (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID de stratégie de connexion et d’inscription pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Rappel de déconnexion global (utilisé avec l’authentification IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID de stratégie de réinitialisation de mot de passe pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID de stratégie de modification de profil pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory à laquelle se connecter (à utiliser avec l’authentification SingleOrg ou MultiOrg).",
+ "symbols/ClientId/description": "ID client de ce projet (à utiliser avec l’authentification IndividualB2C, SingleOrg ou MultiOrg).",
+ "symbols/Domain/description": "Domaine du locataire d’annuaire (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/TenantId/description": "ID TenantId du répertoire auquel se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/CallbackPath/description": "Chemin de la demande dans le chemin de base de l’application de l’URI de redirection (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indique si cette application doit autoriser ou non l’accès en lecture à l’annuaire (s’applique uniquement à l’authentification SingleOrg ou MultiOrg).",
+ "symbols/UserSecretsId/description": "ID à utiliser pour les secrets (à utiliser avec OrgReadAccess ou l’authentification individuelle).",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https est ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "symbols/UseLocalDB/description": "Indique s’il faut utiliser localDB au lieu de SQLite. Cette option s’applique uniquement si --auth Individual ou --auth IndividualB2C est spécifié.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/CalledApiUrl/description": "URL de l’API à appeler à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/CallsMicrosoftGraph/description": "Spécifie si l’application web appelle Microsoft Graph. Cette option s’applique uniquement si --auth SingleOrg ou --auth MultiOrg est spécifié.",
+ "symbols/CalledApiScopes/description": "Étendues pour demander à appeler l’API à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json
index 93b827b9d7..78a1eac337 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "App Blazor Server",
+ "description": "Modello di progetto per la creazione di un'app Blazor Server che viene eseguita lato server all'interno di un'app ASP.NET Core e gestisce le interazioni utente in una connessione SignalR. Questo modello può essere usato per app Web con interfacce utente dinamiche.",
+ "symbols/auth/choices/None/description": "Nessuna autenticazione",
+ "symbols/auth/choices/Individual/description": "Autenticazione singola",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticazione singola con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticazione organizzativa per un singolo tenant",
+ "symbols/auth/choices/MultiOrg/description": "Autenticazione dell'organizzazione per più tenant",
+ "symbols/auth/choices/Windows/description": "Autenticazione di Windows",
+ "symbols/auth/description": "Tipo di autenticazione da usare.",
+ "symbols/AAdB2CInstance/description": "Istanza di Azure Active Directory B2C a cui connettersi (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID dei criteri di accesso e iscrizione per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Callback di disconnessione globale (usare con l'autenticazione IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID dei criteri di reimpostazione della password per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID dei criteri del profilo di modifica per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/AADInstance/description": "Istanza di Azure Active Directory a cui connettersi (usare con l'autenticazione SingleOrg o MultiOrg).",
+ "symbols/ClientId/description": "ID client per questo progetto (usare con l'autenticazione IndividualB2C, SingleOrg o MultiOrg).",
+ "symbols/Domain/description": "Il dominio per il tenant della directory (da usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/TenantId/description": "ID TenantId della directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/CallbackPath/description": "Percorso della richiesta all'interno del percorso di base dell'applicazione dell'URI di reindirizzamento (usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indica se consentire o meno a questa applicazione l'accesso in lettura alla directory (si applica solo all'autenticazione SingleOrg o MultiOrg).",
+ "symbols/UserSecretsId/description": "ID da usare per i segreti (usare con OrgReadAccess o l'autenticazione singola).",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si utilizza IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "symbols/UseLocalDB/description": "Indica se usare LocalDB invece di SQLite. Questa opzione si applica solo se è specificato --auth Individual o --auth IndividualB2C.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/CalledApiUrl/description": "URL dell'API da chiamare dall'app Web. Questa opzione si applica solo se si specifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Specifica se l'app Web chiama Microsoft Graph. Questa opzione si applica solo se è specificato --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ambiti per richiedere di chiamare l'API dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json
index 93b827b9d7..8d80e7a170 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Blazor Server アプリ",
+ "description": "ASP.NET Core アプリ内のサーバー側で実行され、SignalR 接続を介してユーザー操作を処理する Blazor Server アプリを作成するためのプロジェクト テンプレート。このテンプレートは、高度でダイナミックなユーザー インターフェイス (UI) を備えた Web アプリに使用できます。",
+ "symbols/auth/choices/None/description": "認証なし",
+ "symbols/auth/choices/Individual/description": "個別の認証",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C を使用した個別の認証",
+ "symbols/auth/choices/SingleOrg/description": "単一テナントの組織認証",
+ "symbols/auth/choices/MultiOrg/description": "複数のテナントの組織認証",
+ "symbols/auth/choices/Windows/description": "Windows 認証",
+ "symbols/auth/description": "使用する認証の種類",
+ "symbols/AAdB2CInstance/description": "接続先の Azure Active Directory B2C インスタンス (IndividualB2C 認証で使用)。",
+ "symbols/SignUpSignInPolicyId/description": "このプロジェクトのサインインおよびサインアップのポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/SignedOutCallbackPath/description": "グローバル サインアウト コールバック (IndividualB2C 認証で使用)。",
+ "symbols/ResetPasswordPolicyId/description": "このプロジェクトのパスワードのリセット ポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/EditProfilePolicyId/description": "このプロジェクトの編集プロファイル ポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/AADInstance/description": "接続先の Azure Active Directory インスタンス (SingleOrg または MultiOrg 認証で使用)。",
+ "symbols/ClientId/description": "このプロジェクトのクライアント ID (IndividualB2C、SingleOrg、または MultiOrg 認証で使用)。",
+ "symbols/Domain/description": "ディレクトリ テナントのドメイン (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/TenantId/description": "接続先のディレクトリの TenantId ID (SingleOrg 認証で使用)。",
+ "symbols/CallbackPath/description": "リダイレクト URI のアプリケーションのベース パス内の要求パス (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/OrgReadAccess/description": "このアプリケーションにディレクトリへの読み取りアクセスを許可するかどうか (SingleOrg または MultiOrg 認証にのみ適用されます)。",
+ "symbols/UserSecretsId/description": "シークレットで使用する ID (OrgReadAccess または個別の認証で使用)。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、no-https パラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、no-https は無視されます)。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "symbols/UseLocalDB/description": "SQLite の代わりに LocalDB を使用するかどうか。このオプションは、--auth Individual または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/CalledApiUrl/description": "Web アプリから呼び出す API の URL。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/CallsMicrosoftGraph/description": "Web アプリが Microsoft Graph を呼び出すかどうかを指定します。このオプションは、--auth SingleOrg または --auth MultiOrg が指定されている場合にのみ適用されます。",
+ "symbols/CalledApiScopes/description": "Web アプリから API を呼び出す要求へのスコープ。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json
index 93b827b9d7..3d20a9b69b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "블레이저 서버 앱",
+ "description": "ASP.NET Core 앱 내에서 서버 쪽을 실행하고 SignalR 연결을 통해 사용자 상호 작용을 처리하는 Blazor Server 앱을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿을 사용하여 다양한 동적 UI(사용자 인터페이스)가 포함된 웹앱을 만들 수 있습니다.",
+ "symbols/auth/choices/None/description": "인증 없음",
+ "symbols/auth/choices/Individual/description": "개별 인증",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C를 사용한 개별 인증",
+ "symbols/auth/choices/SingleOrg/description": "단일 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/MultiOrg/description": "여러 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/Windows/description": "Windows 인증",
+ "symbols/auth/description": "사용할 인증 유형",
+ "symbols/AAdB2CInstance/description": "연결할 Azure Active Directory B2C 인스턴스(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignUpSignInPolicyId/description": "이 프로젝트의 로그인 및 등록 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignedOutCallbackPath/description": "전역 로그아웃 콜백입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/ResetPasswordPolicyId/description": "이 프로젝트의 암호 초기화 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/EditProfilePolicyId/description": "이 프로젝트의 편집 프로필 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/AADInstance/description": "연결할 Azure Active Directory 인스턴스입니다(SingleOrg 또는 MultiOrg 인증과 함께 사용).",
+ "symbols/ClientId/description": "이 프로젝트의 클라이언트 ID입니다(IndividualB2C, SingleOrg 또는 MultiOrg 인증과 함께 사용).",
+ "symbols/Domain/description": "디렉터리 테넌트의 도메인입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/TenantId/description": "연결할 디렉터리의 TenantId ID입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/CallbackPath/description": "리디렉션 URI의 애플리케이션 기본 경로 내의 요청 경로(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/OrgReadAccess/description": "이 애플리케이션이 디렉터리에 대한 읽기 액세스를 허용할지 여부(SingleOrg 또는 MultiOrg 인증에만 적용됨).",
+ "symbols/UserSecretsId/description": "비밀에 사용할 ID입니다(OrgReadAccess 또는 개별 인증과 함께 사용).",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 개별B2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/UseLocalDB/description": "SQLite 대신 LocalDB를 사용할지 여부입니다. 이 옵션은 --auth Individual 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/CalledApiUrl/description": "웹앱에서 호출할 API의 URL입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/CallsMicrosoftGraph/description": "웹앱이 Microsoft Graph를 호출하는지 여부를 지정합니다. 이 옵션은 --auth SingleOrg 또는 --auth MultiOrg가 지정된 경우에만 적용됩니다.",
+ "symbols/CalledApiScopes/description": "웹앱에서 API 호출을 요청할 범위입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json
index 93b827b9d7..65a4575315 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplikacja Blazor Server",
+ "description": "Szablon projektu służący do tworzenia aplikacji Blazor Server działającej po stronie serwera wewnątrz aplikacji platformy ASP.NET Core i obsługującej interakcje z użytkownikami za pośrednictwem połączenia SignalR. Ten szablon może być używany dla aplikacji internetowych z rozbudowanymi, dynamicznymi interfejsami użytkowników.",
+ "symbols/auth/choices/None/description": "Bez uwierzytelniania",
+ "symbols/auth/choices/Individual/description": "Uwierzytelnianie indywidualne",
+ "symbols/auth/choices/IndividualB2C/description": "Indywidualne uwierzytelnianie za pomocą usługi Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Uwierzytelnianie organizacyjne dla pojedynczej dzierżawy",
+ "symbols/auth/choices/MultiOrg/description": "Uwierzytelnianie organizacyjne dla wielu dzierżaw",
+ "symbols/auth/choices/Windows/description": "Uwierzytelnianie systemu Windows",
+ "symbols/auth/description": "Typ uwierzytelniania, który ma zostać użyty.",
+ "symbols/AAdB2CInstance/description": "Wystąpienie usługi Azure Active Directory B2C do nawiązania połączenia (użyj z uwierzytelnianym IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Identyfikator zasad logowania i rejestracji dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Globalne wywołanie zwrotne wylogowania (używane z uwierzytelnianym IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Identyfikator zasad resetowania haseł dla tego projektu (użyj z uwierzytelnianiem IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Identyfikator zasad edycji profilu dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/AADInstance/description": "Wystąpienie usługi Azure Active Directory do nawiązania połączenia (użyj z uwierzytelnianym singleOrg lub MultiOrg).",
+ "symbols/ClientId/description": "Identyfikator klienta dla tego projektu (użyj uwierzytelniania IndividualB2C, SingleOrg lub MultiOrg).",
+ "symbols/Domain/description": "Domena dzierżawy katalogu (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/TenantId/description": "Identyfikator TenantId katalogu, z którym ma zostać nawiązane połączenie (użyj uwierzytelniania SingleOrg).",
+ "symbols/CallbackPath/description": "Ścieżka żądania w ścieżce podstawowej aplikacji identyfikatora URI przekierowania (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Określa, czy zezwolić tej aplikacji na dostęp do odczytu do katalogu (dotyczy tylko uwierzytelniania SingleOrg lub MultiOrg).",
+ "symbols/UserSecretsId/description": "Identyfikator do użycia na potrzeby wpisów tajnych (używany z funkcją OrgReadAccess lub indywidualnym uwierzytelnianiem).",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy elementy IndividualB2C, SingleOrg lub MultiOrg nie są używane dla uwierzytelniania --auth.",
+ "symbols/UseLocalDB/description": "Określa, czy używać bazy danych LocalDB zamiast oprogramowania SQLite. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth Individual lub --auth IndividualB2C.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/CalledApiUrl/description": "Adres URL interfejsu API do wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Określa, czy aplikacja internetowa wywołuje program Microsoft Graph. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg lub --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Zakresy do żądania wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C.",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 93b827b9d7..7ea6fbeaf8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicativo Blazor Server",
+ "description": "Um modelo de projeto para criar um aplicativo Blazor Server que é executado do lado do servidor em um aplicativo ASP.NET Core e manipula as interações com o usuário em uma conexão SignalR. Esse modelo pode ser usado para aplicativos Web com UIs (interfaces do usuário) completas e dinâmicas.",
+ "symbols/auth/choices/None/description": "Sem autenticação",
+ "symbols/auth/choices/Individual/description": "Autenticação individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticação individual com Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticação organizacional para um único locatário",
+ "symbols/auth/choices/MultiOrg/description": "Autenticação organizacional para vários locatários",
+ "symbols/auth/choices/Windows/description": "autenticação do Windows",
+ "symbols/auth/description": "O tipo de autenticação a ser usado",
+ "symbols/AAdB2CInstance/description": "A instância do Azure Active Directory B2C à qual se conectar (use com autenticação IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "O ID da política de login e inscrição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "O retorno de chamada de saída global (use com autenticação IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "O ID da política de redefinição de senha para este projeto (use com autenticação IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "O ID de política de perfil de edição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/AADInstance/description": "A instância do Azure Active Directory à qual se conectar (use com autenticação SingleOrg ou MultiOrg).",
+ "symbols/ClientId/description": "O ID do cliente para este projeto (use com autenticação IndividualB2C, SingleOrg ou MultiOrg).",
+ "symbols/Domain/description": "O domínio para o locatário do diretório (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/TenantId/description": "O ID TenantId do diretório ao qual se conectar (use com autenticação SingleOrg).",
+ "symbols/CallbackPath/description": "O caminho de solicitação no caminho base do aplicativo do URI de redirecionamento (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Se deve ou não permitir o acesso de leitura deste aplicativo ao diretório (aplica-se apenas à autenticação SingleOrg ou MultiOrg).",
+ "symbols/UserSecretsId/description": "O ID a ser usado para segredos (use com OrgReadAccess ou Autenticação individual).",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção só se aplica se IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "symbols/UseLocalDB/description": "Se deve usar LocalDB em vez de SQLite. Esta opção só se aplica se --auth Individual ou --auth IndividualB2C for especificado.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/CalledApiUrl/description": "URL da API para chamar do aplicativo Web. Esta opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C for especificado.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica se o aplicativo Web chama o Microsoft Graph. Esta opção só se aplica se --auth SingleOrg ou --auth MultiOrg for especificado.",
+ "symbols/CalledApiScopes/description": "Escopos a serem solicitados para chamar a API do aplicativo Web. Esta opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C for especificado.",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json
index 93b827b9d7..37a30e8c2d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,41 +1,41 @@
-{
- "author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Приложение Blazor Server",
+ "description": "Шаблон проекта для создания серверного приложения Blazor Server, которое запускается на стороне сервера в приложении ASP.NET Core и обрабатывает взаимодействие с пользователем через подключение SignalR. Этот шаблон можно использовать для веб-приложений с полнофункциональными динамическими пользовательскими интерфейсами.",
+ "symbols/auth/choices/None/description": "Без проверки подлинности",
+ "symbols/auth/choices/Individual/description": "Индивидуальная проверка подлинности",
+ "symbols/auth/choices/IndividualB2C/description": "Индивидуальная проверка подлинности в Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Проверка подлинности в организации для одного клиента",
+ "symbols/auth/choices/MultiOrg/description": "Проверка подлинности в организации для нескольких клиентов",
+ "symbols/auth/choices/Windows/description": "Проверка подлинности Windows",
+ "symbols/auth/description": "Тип используемой проверки подлинности",
+ "symbols/AAdB2CInstance/description": "Экземпляр Azure Active Directory B2C, к которому нужно подключиться (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Идентификатор политики входа и регистрации для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Глобальный обратный вызов для выхода (используется с проверкой подлинности IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Идентификатор политики сброса паролей для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Идентификатор политики изменения профиля для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/AADInstance/description": "Экземпляр Azure Active Directory, к которому нужно подключиться (используется с проверкой подлинности SingleOrg или MultiOrg).",
+ "symbols/ClientId/description": "Идентификатор клиента для этого проекта (используется с проверкой подлинности IndividualB2C, SingleOrg или MultiOrg).",
+ "symbols/Domain/description": "Домен для клиента каталога (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/TenantId/description": "Идентификатор TenantId каталога, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/CallbackPath/description": "Путь запроса в базовом пути приложения к URI перенаправления (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Следует ли предоставлять этому приложению доступ на чтение к каталогу (применяется только к проверке подлинности SingleOrg или MultiOrg).",
+ "symbols/UserSecretsId/description": "Идентификатор, используемый для секретов (используется с проверкой подлинности OrgReadAccess или Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются IndividualB2C, SingleOrg или MultiOrg.",
+ "symbols/UseLocalDB/description": "Следует ли использовать LocalDB вместо SQLite. Этот параметр применяется, только если указывается --auth Individual или --auth IndividualB2C.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/CalledApiUrl/description": "URL-адрес API для вызова из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Указывает, вызывает ли веб-приложение Microsoft Graph. Этот параметр применяется, только если указывается --auth SingleOrg или --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Области для запроса вызова API из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C.",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json
index 93b827b9d7..ce20e1a591 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Blazor Server Uygulaması",
+ "description": "Bir ASP.NET Core uygulaması içinde sunucu tarafında çalışan ve bir SignalR bağlantısı üzerinden kullanıcı etkileşimlerini işleyen bir Blazor Server uygulaması oluşturmaya yönelik proje şablonu. Bu şablon, zengin dinamik kullanıcı arabirimlerine (UI) sahip web uygulamaları için kullanılabilir.",
+ "symbols/auth/choices/None/description": "Kimlik doğrulaması yok",
+ "symbols/auth/choices/Individual/description": "Bireysel kimlik doğrulaması",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C ile bireysel kimlik doğrulaması",
+ "symbols/auth/choices/SingleOrg/description": "Tek bir kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/MultiOrg/description": "Birden çok kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/Windows/description": "Windows kimlik doğrulaması",
+ "symbols/auth/description": "Kullanılacak kimlik doğrulaması türü",
+ "symbols/AAdB2CInstance/description": "Bağlanılacak Azure Active Directory B2C örneği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignUpSignInPolicyId/description": "Bu proje için oturum açma ve kaydolma ilkesi kimliği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignedOutCallbackPath/description": "Genel oturum kapatma geri araması (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/ResetPasswordPolicyId/description": "Bu proje için parola ilkesi sıfırlama kimliği (IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/EditProfilePolicyId/description": "Bu proje için düzenleme profil ilkesi kimliği (IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/AADInstance/description": "Bağlanılacak Azure Active Directory örneği (SingleOrg veya MultiOrg kimlik doğrulaması ile kullanın).",
+ "symbols/ClientId/description": "Bu proje için İstemci Kimliği (IndividualB2C, SingleOrg veya MultiOrg kimlik doğrulaması ile kullanın).",
+ "symbols/Domain/description": "Dizin kiracısı için etki alanı (SingleOrg veya IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/TenantId/description": "Bağlanılacak dizinin TenantId kimliği (SingleOrg kimlik doğrulamasıyla kullanın).",
+ "symbols/CallbackPath/description": "Yeniden yönlendirme URI'sinin uygulama temel dizini yolu içindeki istek yolu (SingleOrg veya IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/OrgReadAccess/description": "Bu uygulamanın dizin okuma erişimine izin verilip verilmeyeceği (yalnızca SingleOrg veya MultiOrg kimlik doğrulaması için geçerlidir).",
+ "symbols/UserSecretsId/description": "Gizli diziler için kullanılan kimlik (OrgReadAccess veya Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "symbols/UseLocalDB/description": "SQLite yerine LocalDB'nin kullanılıp kullanılmayacağı. Bu seçenek yalnızca --auth Individual veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/CalledApiUrl/description": "Web uygulamasından çağrılan API URL'si. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/CallsMicrosoftGraph/description": "Web uygulamasının Microsoft Graph çağırıp çağırmadığını belirtir. Bu seçenek yalnızca --auth SingleOrg veya --auth MultiOrg belirtilirse geçerlidir.",
+ "symbols/CalledApiScopes/description": "Web uygulamasından API çağırma istek kapsamları. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 93b827b9d7..0a6e880b7d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Blazor Server 应用",
+ "description": "用于创建 Blazor Server 应用的项目模板,该应用会在 ASP.NET Core 应用内运行服务器端并对通过 SignalR 连接进行用户交互进行处理。此模板可用于具有丰富动态用户界面(UI)的 Web 应用。",
+ "symbols/auth/choices/None/description": "无身份验证",
+ "symbols/auth/choices/Individual/description": "个人身份验证",
+ "symbols/auth/choices/IndividualB2C/description": "使用 Azure AD B2C 进行个人身份验证",
+ "symbols/auth/choices/SingleOrg/description": "单个租户的组织身份验证",
+ "symbols/auth/choices/MultiOrg/description": "多个租户的组织身份验证",
+ "symbols/auth/choices/Windows/description": "Windows 身份验证",
+ "symbols/auth/description": "要使用的身份验证类型",
+ "symbols/AAdB2CInstance/description": "要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignedOutCallbackPath/description": "全局注销回调(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/ResetPasswordPolicyId/description": "此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/EditProfilePolicyId/description": "此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/AADInstance/description": "要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。",
+ "symbols/ClientId/description": "此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。",
+ "symbols/Domain/description": "目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/TenantId/description": "要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。",
+ "symbols/CallbackPath/description": "重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/OrgReadAccess/description": "是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。",
+ "symbols/UserSecretsId/description": "用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/CalledApiUrl/description": "要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。",
+ "symbols/CalledApiScopes/description": "请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 93b827b9d7..7806e06b80 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor Server App",
- "description": "A project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Blazor Server 應用程式",
+ "description": "用來建立 Blazor Server 應用程式的專案範本,該應用程式會在 ASP.NET Core 應用程式內執行伺服器端,並透過 SignalR 連線處理使用者互動。Web 應用程式具有豐富且動態的使用者介面 (UI) 時,此範本最適用。",
+ "symbols/auth/choices/None/description": "沒有驗證",
+ "symbols/auth/choices/Individual/description": "個別驗證",
+ "symbols/auth/choices/IndividualB2C/description": "具有 Azure AD B2C 的個別驗證",
+ "symbols/auth/choices/SingleOrg/description": "單一租用戶的組織驗證",
+ "symbols/auth/choices/MultiOrg/description": "多個租用戶的組織驗證",
+ "symbols/auth/choices/Windows/description": "Windows 驗證",
+ "symbols/auth/description": "要使用的驗證類型。",
+ "symbols/AAdB2CInstance/description": "要連線的 Azure Active Directory B2C 執行個體 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此專案的登入和註冊原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignedOutCallbackPath/description": "全域登出回呼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/ResetPasswordPolicyId/description": "此專案的重設密碼原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/EditProfilePolicyId/description": "此專案的編輯設定檔原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/AADInstance/description": "要連線到的 Azure Active Directory 執行個體 (搭配 SingleOrg 或 MultiOrg 驗證使用)。",
+ "symbols/ClientId/description": "此專案的用戶端識別碼 (搭配 IndividualB2C、SingleOrg 或 MultiOrg 驗證使用)。",
+ "symbols/Domain/description": "目錄租用戶的網域 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/TenantId/description": "要連線到目錄的 TenantId 識別碼 (搭配 SingleOrg 驗證使用)。",
+ "symbols/CallbackPath/description": "重新導向 URI 的應用程式基底路徑內的要求路徑 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/OrgReadAccess/description": "是否要允許此應用程式讀取存取目錄 (只適用於 SingleOrg 或 MultiOrg 驗證)。",
+ "symbols/UserSecretsId/description": "用於祕密的識別碼 (搭配 OrgReadAccess 或個別驗證使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而非 SQLite。只有在已指定 --auth Individual 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/CalledApiUrl/description": "要從 Web 應用程式呼叫的 API URL。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 應用程式呼叫是否 Microsoft Graph。只有在已指定 --auth SingleOrg 或 --auth MultiOrg 時,才適用此選項。",
+ "symbols/CalledApiScopes/description": "要求從 Web 應用程式呼叫 API 的範圍。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/template.json
index 0189a641b7..b67b8d60e6 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/.template.config/template.json
@@ -341,7 +341,7 @@
"kestrelHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"kestrelHttpsPortGenerated": {
"type": "generated",
@@ -381,7 +381,7 @@
"iisHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"iisHttpsPortGenerated": {
"type": "generated",
@@ -434,13 +434,21 @@
},
"RequiresHttps": {
"type": "computed",
- "value": "(OrganizationalAuth || IndividualAuth || !NoHttps)"
+ "value": "(OrganizationalAuth || IndividualB2CAuth)"
+ },
+ "HasHttpProfile": {
+ "type": "computed",
+ "value": "(!RequiresHttps)"
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(RequiresHttps || !NoHttps)"
},
"NoHttps": {
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ "description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
},
"UseLocalDB": {
"type": "parameter",
@@ -510,7 +518,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecast.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecast.cs
index 5badb0fae4..56e3847ab0 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecast.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecast.cs
@@ -2,7 +2,7 @@ namespace BlazorServerWeb_CSharp.Data;
public class WeatherForecast
{
- public DateTime Date { get; set; }
+ public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecastService.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecastService.cs
index 3b0a57f218..91116981e8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecastService.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Data/WeatherForecastService.cs
@@ -7,7 +7,7 @@ public class WeatherForecastService
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
- public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
+ public Task<WeatherForecast[]> GetForecastAsync(DateOnly startDate)
{
return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/FetchData.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/FetchData.razor
index e33ba100f0..47c4f0814a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/FetchData.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/FetchData.razor
@@ -42,6 +42,6 @@ else
protected override async Task OnInitializedAsync()
{
- forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
+ forecasts = await ForecastService.GetForecastAsync(DateOnly.FromDateTime(DateTime.Now));
}
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/_Host.cshtml b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/_Host.cshtml
index 132aad8a77..5c1b296fe3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/_Host.cshtml
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Pages/_Host.cshtml
@@ -12,6 +12,7 @@
<link rel="stylesheet" href="css/bootstrap/bootstrap.min.css" />
<link href="css/site.css" rel="stylesheet" />
<link href="BlazorServerWeb-CSharp.styles.css" rel="stylesheet" />
+ <link rel="icon" type="image/png" href="favicon.png"/>
<component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
</head>
<body>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.Main.cs
index 92eb45d80a..cc3c8ab895 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.Main.cs
@@ -37,7 +37,7 @@ using BlazorServerWeb_CSharp.Areas.Identity;
#endif
using BlazorServerWeb_CSharp.Data;
-namespace Company.WebApplication1;
+namespace BlazorServerWeb_CSharp;
public class Program
{
@@ -138,7 +138,7 @@ public class Program
#endif
{
app.UseExceptionHandler("/Error");
- #if (RequiresHttps)
+ #if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
@@ -153,8 +153,7 @@ public class Program
app.UseRouting();
- #if (OrganizationalAuth || IndividualAuth || WindowsAuth)
- app.UseAuthentication();
+ #if (IndividualAuth)
app.UseAuthorization();
#endif
@@ -166,4 +165,4 @@ public class Program
app.Run();
}
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.cs
index 85a5791cd3..8056669b00 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Program.cs
@@ -132,7 +132,7 @@ if (!app.Environment.IsDevelopment())
#endif
{
app.UseExceptionHandler("/Error");
-#if (RequiresHttps)
+#if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
@@ -147,8 +147,7 @@ app.UseStaticFiles();
app.UseRouting();
-#if (OrganizationalAuth || IndividualAuth || WindowsAuth)
-app.UseAuthentication();
+#if (IndividualAuth)
app.UseAuthorization();
#endif
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Properties/launchSettings.json
index 81462d5587..b89f441308 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Properties/launchSettings.json
@@ -9,7 +9,7 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(RequiresHttps)
+ //#if (HasHttpsProfile)
"sslPort": 44300
//#else
"sslPort": 0
@@ -17,19 +17,28 @@
}
},
"profiles": {
- "BlazorServerWeb-CSharp": {
+ //#if (HasHttpProfile)
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(RequiresHttps)
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#else
"applicationUrl": "http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsMicrosoftGraph.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsMicrosoftGraph.razor
index 1841384590..f2ab37be8b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsMicrosoftGraph.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsMicrosoftGraph.razor
@@ -7,7 +7,7 @@
</div>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsWebApi.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsWebApi.razor
index f96019ff4b..b8ea03372d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsWebApi.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.CallsWebApi.razor
@@ -7,7 +7,7 @@
</div>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.NoGraphOrApi.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.NoGraphOrApi.razor
index 64f16a6366..abbaa52b1b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.NoGraphOrApi.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.NoGraphOrApi.razor
@@ -7,7 +7,7 @@
</div>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.razor.css b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.razor.css
index acc5f9f819..604b7a1a10 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.razor.css
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/Shared/NavMenu.razor.css
@@ -59,4 +59,10 @@
/* Never collapse the sidebar for wide screens */
display: block;
}
+
+ .nav-scrollable {
+ /* Allow sidebar to scroll for tall menus */
+ height: calc(100vh - 3.5rem);
+ overflow-y: auto;
+ }
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css
index 1f4b8cf316..96b05836a6 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/css/site.css
@@ -18,6 +18,10 @@ a, .btn-link {
border-color: #1861ac;
}
+.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
+ box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
+}
+
.content {
padding-top: 1.1rem;
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.ico b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.ico
deleted file mode 100644
index 63e859b476..0000000000
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.png b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.png
new file mode 100644
index 0000000000..8422b59695
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/BlazorServerWeb-CSharp/wwwroot/favicon.png
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json
index e4ec39bc5e..e2d3ace980 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/ide.host.json
@@ -1,50 +1,24 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 610,
"icon": "icon.png",
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "Local"
- },
- {
- "auth": "SingleOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "SSO",
- "provisionServerSymbol": "Hosted",
- "callbackPath": "/authentication/login-callback",
- "additionalReplyUriPorts": [ 5001 ]
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"disableHttpsSymbol": "NoHttps",
"symbolInfo": [
{
"id": "Hosted",
- "isVisible": "true"
+ "isVisible": true,
+ "persistenceScope": "templateGroup"
},
{
"id": "PWA",
- "isVisible": "true"
+ "isVisible": true,
+ "persistenceScope": "templateGroup"
},
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
]
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json
index 7e31298e01..d0b43ebaef 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Aplikace Blazor WebAssembly",
+ "description": "Šablona projektu pro vytvoření aplikace Blazor, která běží ve WebAssembly a dá se volitelně hostovat v aplikaci ASP.NET. Tato šablona se dá použít pro webové aplikace s propracovanými dynamickými uživatelskými rozhraními (UI).",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/Hosted/displayName": "_Hostováno pomocí ASP.NET Core",
+ "symbols/Hosted/description": "Pokud je tato možnost zadaná, zahrnuje hostitele ASP.NET Core pro aplikaci Blazor WebAssembly.",
+ "symbols/auth/choices/None/description": "Bez ověřování",
+ "symbols/auth/choices/Individual/description": "Ověřování Individual",
+ "symbols/auth/choices/IndividualB2C/description": "Ověřování Individual pomocí Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Ověřování organizace pro jednoho tenanta",
+ "symbols/auth/description": "Typ ověřování, který se má použít",
+ "symbols/Authority/description": "Autorita poskytovatele OIDC (používá se se samostatným ověřováním Individual).",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C, ke které se chcete připojit (používá se s ověřováním IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID zásad přihlašování a registrace pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory, ke které se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/ClientId/description": "ID klienta pro tento projekt (v samostatných scénářích se používá s ověřováním IndividualB2C, SingleOrg nebo Individual).",
+ "symbols/Domain/description": "Doména pro tenanta adresáře (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/AppIDUri/description": "Identifikátor URI ID aplikace pro serverové rozhraní API, které chceme volat (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/APIClientId/description": "ID klienta pro rozhraní API, které server hostuje (používá se s IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "Rozsah rozhraní API, který musí klient požádat o zřízení přístupového tokenu. (použijte s IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "TenantId adresáře, ke kterému se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/OrgReadAccess/description": "Určuje, jestli se této aplikaci povolí přístup ke čtení adresáře (platí jenom pro ověřování SingleOrg).",
+ "symbols/UserSecretsId/description": "ID, které se má použít pro tajné kódy (používá se s ověřováním OrgReadAccess nebo Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/PWA/displayName": "_Progresivní webová aplikace",
+ "symbols/PWA/description": "Pokud je tato možnost zadaná, vytvoří progresivní webovou aplikaci (PWA), která podporuje instalaci a offline použití.",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají Individual, IndividualB2C, SingleOrg ani MultiOrg.",
+ "symbols/UseLocalDB/description": "Určuje, jestli se má použít LocalDB namísto SQLite. Tato možnost platí jenom v případě, že je zadáno --auth Individual nebo --auth IndividualB2C.",
+ "symbols/CalledApiUrl/description": "Adresa URL rozhraní API, která se má volat z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C a také je zadán hostitel ASP.NET Core.",
+ "symbols/CallsMicrosoftGraph/description": "Určuje, jestli webová aplikace volá Microsoft Graph. Tato možnost platí pouze v případě, že je zadáno --auth SingleOrg nebo --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Obory, které se mají požádat žádat o volání rozhraní API z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C a také je zadán hostitel ASP.NET Core.",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore",
+ "postActions/restoreClient/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restoreClient/manualInstructions/default/text": "Spustit „dotnet restore“",
+ "postActions/open-file/description": "Otevře soubor Readme.txt v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json
index 7e31298e01..a6a8915fd4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "Blazor-WebAssembly App",
+ "description": "Eine Projektvorlage zum Erstellen einer Blazor-App, die auf WebAssembly ausgeführt und optional durch eine ASP.NET Core-App gehostet wird. Diese Vorlage kann für Web-Apps mit umfangreichen dynamischen Benutzeroberflächen verwendet werden.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/Hosted/displayName": "ASP.NET Core _gehostet",
+ "symbols/Hosted/description": "Enthält, falls angegeben, einen ASP.NET Core Host für die Blazor WebAssembly App.",
+ "symbols/auth/choices/None/description": "Keine Authentifizierung",
+ "symbols/auth/choices/Individual/description": "Individuelle Authentifizierung",
+ "symbols/auth/choices/IndividualB2C/description": "Individuelle Authentifizierung mit Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Organisationsauthentifizierung für einen einzelnen Mandanten",
+ "symbols/auth/description": "Der zu verwendende Authentifizierungstyp",
+ "symbols/Authority/description": "Die Autorität des OIDC Anbieters (Verwendung mit eigenständiger individueller Authentifizierung).",
+ "symbols/AAdB2CInstance/description": "Die Azure Active Directory B2C-Instanz, mit der eine Verbindung hergestellt werden soll (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/SignUpSignInPolicyId/description": "Die Anmelde und Registrierungsrichtlinien ID für dieses Projekt (mit IndividualB2C Authentifizierung verwenden).",
+ "symbols/AADInstance/description": "Die Azure Active Directory-Instanz, mit der eine Verbindung hergestellt werden soll (mit SingleOrg-Authentifizierung verwenden).",
+ "symbols/ClientId/description": "Die Client-ID für dieses Projekt (Verwendung mit IndividualB2C, SingleOrg oder Individual Auth in eigenständigen Szenarien).",
+ "symbols/Domain/description": "Die Domäne für den Verzeichnismandanten (mit SingleOrg oder IndividualB2C Authentifizierung verwenden).",
+ "symbols/AppIDUri/description": "Der App ID URI für die Server-API, die wir aufrufen möchten (mit SingleOrg- oder IndividualB2C-Authentifizierung verwenden).",
+ "symbols/APIClientId/description": "Die Client ID für die API, die der Server hostet (mit IndividualB2C, SingleOrg verwenden).",
+ "symbols/DefaultScope/description": "Der API Bereich, den der Client anfordern muss, um ein Zugriffstoken bereitzustellen. (Verwendung mit IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "Die TenantId ID des Verzeichnisses, mit dem eine Verbindung hergestellt werden soll (mit SingleOrg Authentifizierung verwenden).",
+ "symbols/OrgReadAccess/description": "Ob dieser Anwendung Lesezugriff auf das Verzeichnis gewährt werden soll oder nicht (gilt nur für SingleOrg).",
+ "symbols/UserSecretsId/description": "Die für Geheimnisse zu verwendende ID (Verwendung mit OrgReadAccess oder Einzelauthentifizierung).",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/PWA/displayName": "_Progressive Webanwendung",
+ "symbols/PWA/description": "Wenn angegeben, wird eine Progressive Web Application (PWA) erstellt, die die Installation und Offlineverwendung unterstützt.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn Individual, IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "symbols/UseLocalDB/description": "Ob LocalDB anstelle von SQLite verwendet werden soll. Diese Option gilt nur, wenn --auth Individual oder --auth IndividualB2C angegeben ist.",
+ "symbols/CalledApiUrl/description": "URL der API, die von der Web-App aufgerufen werden soll. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C ohne und ASP.NET Core-Host angegeben ist.",
+ "symbols/CallsMicrosoftGraph/description": "Gibt an, ob die Web-App Microsoft Graph aufruft. Diese Option gilt nur, wenn --auth SingleOrg oder --auth MultiOrg angegeben ist.",
+ "symbols/CalledApiScopes/description": "Anzufordernde Bereiche zum Aufrufen der API von der Web-App. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C ohne und ASP.NET Core-Host angegeben ist.",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen",
+ "postActions/restoreClient/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restoreClient/manualInstructions/default/text": "Führen Sie 'dotnet restore' aus",
+ "postActions/open-file/description": "Öffnet Readme.txt im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json
index 530197158d..24cc221cce 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json
@@ -36,11 +36,12 @@
"symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
"symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
"symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
"postActions/restoreClient/description": "Restore NuGet packages required by this project.",
"postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
"postActions/open-file/description": "Opens Readme.txt in the editor"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json
index 7e31298e01..5adb2833ee 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Aplicación Blazor para WebAssembly",
+ "description": "Plantilla de proyecto para crear una aplicación Blazor que se ejecuta en WebAssembly y que se hospeda de forma opcional en una aplicación de ASP.NET Core. Esta plantilla se puede usar para las aplicaciones web con interfaces de usuario dinámicas enriquecidas (IU).",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/Hosted/displayName": "ASP.NET Core _hospedado",
+ "symbols/Hosted/description": "Si se especifica, incluye un host de ASP.NET Core para la aplicación Blazor WebAssembly.",
+ "symbols/auth/choices/None/description": "Sin autenticación",
+ "symbols/auth/choices/Individual/description": "Autenticación individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticación individual con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticación organizacional para un único inquilino",
+ "symbols/auth/description": "El tipo de autenticación que se va a usar",
+ "symbols/Authority/description": "Autoridad del proveedor de OIDC (se usa con la autenticación individual independiente).",
+ "symbols/AAdB2CInstance/description": "Instancia de Azure Active Directory B2C a la que conectarse (se usa con la autenticación IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Id. de la directiva de inicio de sesión y registro para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/AADInstance/description": "Instancia de Azure Active Directory a la que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/ClientId/description": "Id. de cliente de este proyecto (se usa con IndividualB2C, SingleOrg o autenticación individual en escenarios independientes).",
+ "symbols/Domain/description": "Dominio del inquilino de directorio (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/AppIDUri/description": "Uri de id. de aplicación para la API de servidor a la que queremos llamar (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/APIClientId/description": "Id. de cliente de la API que hospeda el servidor (se usa con IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "Ámbito de API que el cliente debe solicitar para aprovisionar un token de acceso. (Se usa con IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "Id. de TenantId del directorio al que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/OrgReadAccess/description": "Indica si se va a permitir o no el acceso de lectura de esta aplicación al directorio (solo se aplica a SingleOrg).",
+ "symbols/UserSecretsId/description": "Id. que se va a usar para los secretos (se usa con OrgReadAccess o con la autenticación individual).",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/PWA/displayName": "_Aplicación web progresiva",
+ "symbols/PWA/description": "Si se especifica, produce una aplicación web progresiva (PWA) compatible con la instalación y el uso sin conexión.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS. Esta opción solo se aplica si Individual, IndividualB2C, SingleOrg o MultiOrg no se usan para --auth.",
+ "symbols/UseLocalDB/description": "Indica si se va a usar LocalDB en lugar de SQLite. Esta opción solo se aplica si se especifica --auth Individual o --auth IndividualB2C.",
+ "symbols/CalledApiUrl/description": "Dirección URL de la API a la que se va a llamar desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C sin y se especifica ASP.NET host core.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica si la aplicación web llama a Microsoft Graph. Esta opción solo se aplica si se especifica --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ámbitos para solicitar llamar a la API desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C sin y se especifica el host ASP.NET Core.",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\"",
+ "postActions/restoreClient/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restoreClient/manualInstructions/default/text": "Ejecutar \"dotnet restore\"",
+ "postActions/open-file/description": "Abre Readme.txt en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json
index 7e31298e01..20343c67b2 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Application WebAssembly Blazor",
+ "description": "Modèle de projet permettant de créer une application Blazor qui s'exécute sur WebAssembly et qui est éventuellement hébergée par une application ASP.NET Core. Vous pouvez utiliser ce modèle pour les applications web ayant des IU (interfaces utilisateur) dynamiques riches.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/Hosted/displayName": "ASP.NET core _Hosted",
+ "symbols/Hosted/description": "S’il est spécifié, inclut un hôte ASP.NET Core pour l’application Blazor WebAssembly.",
+ "symbols/auth/choices/None/description": "Aucune authentification",
+ "symbols/auth/choices/Individual/description": "Authentification individuelle",
+ "symbols/auth/choices/IndividualB2C/description": "Authentification individuelle avec Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Authentification organisationnelle pour un seul locataire",
+ "symbols/auth/description": "Type d’authentification à utiliser",
+ "symbols/Authority/description": "Autorité du fournisseur OIDC (à utiliser avec l’authentification individuelle autonome).",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C à laquelle se connecter (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID de stratégie de connexion et d’inscription pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory à laquelle se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/ClientId/description": "ID client de ce projet (utilisé avec IndividualB2C, SingleOrg ou l’authentification individuelle dans les scénarios autonomes).",
+ "symbols/Domain/description": "Domaine du locataire d’annuaire (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/AppIDUri/description": "URI d’ID d’application pour l’API serveur que nous voulons appeler (à utiliser avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/APIClientId/description": "ID client de l’API hébergée par le serveur (à utiliser avec IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "Étendue d’API dont le client a besoin pour configurer un jeton d’accès. (à utiliser avec IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "ID TenantId du répertoire auquel se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/OrgReadAccess/description": "Indique si cette application doit ou non autoriser l’accès en lecture au répertoire (s’applique uniquement à SingleOrg).",
+ "symbols/UserSecretsId/description": "ID à utiliser pour les secrets (à utiliser avec OrgReadAccess ou l’authentification individuelle).",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/PWA/displayName": "_Application web progressive",
+ "symbols/PWA/description": "Si ce paramètre est spécifié, produit une application web progressive (PWA) qui prend en charge l’installation et l’utilisation hors connexion.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si Individual, IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "symbols/UseLocalDB/description": "Indique s’il faut utiliser localDB au lieu de SQLite. Cette option s’applique uniquement si --auth Individual ou --auth IndividualB2C est spécifié.",
+ "symbols/CalledApiUrl/description": "URL de l’API à appeler à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sans et ASP.NET’hôte principal est spécifié.",
+ "symbols/CallsMicrosoftGraph/description": "Spécifie si l’application web appelle Microsoft Graph. Cette option s’applique uniquement si --auth SingleOrg ou --auth MultiOrg est spécifié.",
+ "symbols/CalledApiScopes/description": "Étendues où demander l’appel de l’API à partir de l’application web. Cette option s’applique uniquement si l’hôte --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sans et ASP.NET Core est spécifié.",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »",
+ "postActions/restoreClient/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restoreClient/manualInstructions/default/text": "Exécuter « dotnet restore »",
+ "postActions/open-file/description": "Ouvre Readme.txt dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json
index 7e31298e01..138d430fd0 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "App WebAssembly Blazor",
+ "description": "Modello di progetto per la creazione di un'app Blazor eseguita in WebAssembly e ospitata facoltativamente da un'app ASP.NET Core. Questo modello può essere usato per app Web con interfacce utente dinamiche.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "Se specificato, include un host ASP.NET Core per l'app Blazor WebAssembly.",
+ "symbols/auth/choices/None/description": "Nessuna autenticazione",
+ "symbols/auth/choices/Individual/description": "Autenticazione singola",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticazione singola con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticazione organizzativa per un singolo tenant",
+ "symbols/auth/description": "Tipo di autenticazione da usare.",
+ "symbols/Authority/description": "Autorità del provider OIDC (usare con l'autenticazione individuale autonoma).",
+ "symbols/AAdB2CInstance/description": "Istanza di Azure Active Directory B2C a cui connettersi (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID dei criteri di accesso e iscrizione per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/AADInstance/description": "Istanza di Azure Active Directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/ClientId/description": "ID client per questo progetto (usare con IndividualB2C, SingleOrg o Autenticazione individuale in scenari autonomi).",
+ "symbols/Domain/description": "Il dominio per il tenant della directory (da usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/AppIDUri/description": "URI ID app per l'API server che si vuole chiamare (usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/APIClientId/description": "ID client per l'API ospitata dal server (usare con IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "Ambito API che il client deve richiedere per effettuare il provisioning di un token di accesso (usare con IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "ID TenantId della directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/OrgReadAccess/description": "Indica se consentire o meno a questa applicazione l'accesso in lettura alla directory (si applica solo a SingleOrg).",
+ "symbols/UserSecretsId/description": "ID da usare per i segreti (usare con OrgReadAccess o l'autenticazione singola).",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/PWA/displayName": "Applicazione Web _Progressive",
+ "symbols/PWA/description": "Se specificato, produce un'applicazione Web progressiva (PWA) che supporta l'installazione e l'uso offline.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se Individual, IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "symbols/UseLocalDB/description": "Indica se usare LocalDB invece di SQLite. Questa opzione si applica solo se è specificato --auth Individual o --auth IndividualB2C.",
+ "symbols/CalledApiUrl/description": "URL dell'API da chiamare dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C without e host ASP.NET Core.",
+ "symbols/CallsMicrosoftGraph/description": "Specifica se l'app Web chiama Microsoft Graph. Questa opzione si applica solo se è specificato --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ambiti per richiedere di chiamare l'API dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C without e host ASP.NET Core.",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'",
+ "postActions/restoreClient/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restoreClient/manualInstructions/default/text": "Esegui 'dotnet restore'",
+ "postActions/open-file/description": "Apre Readme.txt nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json
index 7e31298e01..0758032465 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Blazor WebAssembly アプリ",
+ "description": "WebAssembly 上で実行され、オプションで ASP.NET Core アプリによってホストされる Blazor アプリを作成するためのプロジェクト テンプレート。このテンプレートは、機能豊富で動的なユーザー インターフェイス (UI) を備えた Web アプリに使用できます。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "指定した場合、Blazor WebAssembly アプリの ASP.NET Core ホストが含まれます。",
+ "symbols/auth/choices/None/description": "認証なし",
+ "symbols/auth/choices/Individual/description": "個別の認証",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C を使用した個別の認証",
+ "symbols/auth/choices/SingleOrg/description": "単一テナントの組織認証",
+ "symbols/auth/description": "使用する認証の種類",
+ "symbols/Authority/description": "OIDC プロバイダーの権限 (個別のスタンドアロン認証で使用)。",
+ "symbols/AAdB2CInstance/description": "接続先の Azure Active Directory B2C インスタンス (IndividualB2C 認証で使用)。",
+ "symbols/SignUpSignInPolicyId/description": "このプロジェクトのサインインおよびサインアップのポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/AADInstance/description": "接続先の Azure Active Directory インスタンス (SingleOrg 認証で使用)。",
+ "symbols/ClientId/description": "このプロジェクトのクライアント ID (スタンドアロン シナリオでは、IndividualB2C、SingleOrg、または個別の認証で使用します)。",
+ "symbols/Domain/description": "ディレクトリ テナントのドメイン (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/AppIDUri/description": "呼び出すサーバー API のアプリ ID URI (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/APIClientId/description": "サーバーがホストする API のクライアント ID (IndividualB2C、SingleOrg で使用)。",
+ "symbols/DefaultScope/description": "アクセス トークンのプロビジョニングするためにクライアントが要求する必要がある API スコープ。(IndividualB2C、SingleOrg で使用)。",
+ "symbols/TenantId/description": "接続先のディレクトリの TenantId ID (SingleOrg 認証で使用)。",
+ "symbols/OrgReadAccess/description": "このアプリケーションにディレクトリへの読み取りアクセスを許可するかどうか (SingleOrg にのみ適用されます)。",
+ "symbols/UserSecretsId/description": "シークレットで使用する ID (OrgReadAccess または個別の認証で使用)。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/PWA/displayName": "プログレッシブ Web アプリケーション(_P)",
+ "symbols/PWA/description": "指定した場合、インストールとオフラインでの使用をサポートするプログレッシブ Web アプリケーション (PWA) が生成されます。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、Individual、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "symbols/UseLocalDB/description": "SQLite の代わりに LocalDB を使用するかどうか。このオプションは、--auth Individual または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/CalledApiUrl/description": "Web アプリから呼び出す API の URL。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C で、ASP.NET Core ホストが指定されていない場合にのみ適用されます。",
+ "symbols/CallsMicrosoftGraph/description": "Web アプリが Microsoft Graph を呼び出すかどうかを指定します。このオプションは、--auth SingleOrg または --auth MultiOrg が指定されている場合にのみ適用されます。",
+ "symbols/CalledApiScopes/description": "Web アプリから API を呼び出すために要求するスコープ。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C で、ASP.NET Core ホストが指定されていない場合にのみ適用されます。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する",
+ "postActions/restoreClient/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restoreClient/manualInstructions/default/text": "'dotnet restore' を実行する",
+ "postActions/open-file/description": "エディターで Readme.txt を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json
index 7e31298e01..e4a423425a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Blazor WebAssembly 앱",
+ "description": "WebAssembly에서 실행되고 ASP.NET Core 앱에서 선택적으로 호스트되는 Blazor 앱을 만들기 위한 프로젝트 템플릿입니다. 이 템플릿은 다양한 동적 UI(사용자 인터페이스)를 포함하는 웹앱에 사용할 수 있습니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/Hosted/displayName": "ASP.NET Core 호스팅(_H)",
+ "symbols/Hosted/description": "지정된 경우 Blazor WebAssembly 앱에 대한 ASP.NET Core 호스트를 포함합니다.",
+ "symbols/auth/choices/None/description": "인증 없음",
+ "symbols/auth/choices/Individual/description": "개별 인증",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C를 사용한 개별 인증",
+ "symbols/auth/choices/SingleOrg/description": "단일 테넌트에 대한 조직 인증",
+ "symbols/auth/description": "사용할 인증 유형",
+ "symbols/Authority/description": "OIDC 제공자의 권한(독립형 개별 인증과 함께 사용).",
+ "symbols/AAdB2CInstance/description": "연결할 Azure Active Directory B2C 인스턴스(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignUpSignInPolicyId/description": "이 프로젝트의 로그인 및 등록 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/AADInstance/description": "연결할 Azure Active Directory 인스턴스입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/ClientId/description": "이 프로젝트의 클라이언트 ID입니다(독립형 시나리오에서 IndividualB2C, SingleOrg 또는 Individual auth와 함께 사용).",
+ "symbols/Domain/description": "디렉터리 테넌트의 도메인입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/AppIDUri/description": "호출하려는 서버 API의 앱 ID Uri입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/APIClientId/description": "서버가 호스팅하는 API의 클라이언트 ID입니다(IndividualB2C, SingleOrg와 함께 사용).",
+ "symbols/DefaultScope/description": "클라이언트가 액세스 토큰을 프로비전하기 위해 요청해야 하는 API 범위입니다. (IndividualB2C, SingleOrg와 함께 사용).",
+ "symbols/TenantId/description": "연결할 디렉터리의 TenantId ID입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/OrgReadAccess/description": "이 애플리케이션이 디렉터리에 대한 읽기 액세스를 허용할지 여부(SingleOrg에만 적용됨).",
+ "symbols/UserSecretsId/description": "비밀에 사용할 ID입니다(OrgReadAccess 또는 개별 인증과 함께 사용).",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/PWA/displayName": "프로그레시브 웹 애플리케이션(_P)",
+ "symbols/PWA/description": "지정된 경우 설치 및 오프라인 사용을 지원하는 PWA(프로그레시브 웹 응용 프로그램)를 생성합니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 Individual, IndividualB2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/UseLocalDB/description": "SQLite 대신 LocalDB를 사용할지 여부입니다. 이 옵션은 --auth Individual 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/CalledApiUrl/description": "웹앱에서 호출할 API의 URL입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C without and ASP.NET Core 호스트가 지정된 경우에만 적용됩니다.",
+ "symbols/CallsMicrosoftGraph/description": "웹앱이 Microsoft Graph를 호출하는지 여부를 지정합니다. 이 옵션은 --auth SingleOrg 또는 --auth MultiOrg가 지정된 경우에만 적용됩니다.",
+ "symbols/CalledApiScopes/description": "웹앱에서 API 호출을 요청할 범위입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C without and ASP.NET Core 호스트가 지정된 경우에만 적용됩니다.",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행",
+ "postActions/restoreClient/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restoreClient/manualInstructions/default/text": "'dotnet restore' 실행",
+ "postActions/open-file/description": "편집기에서 Readme.txt를 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json
index 7e31298e01..ac759e1ce4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Aplikacja zestawu WebAssembly platformy Blazor",
+ "description": "Szablon projektu służący do tworzenia aplikacji platformy Blazor, która działa w formacie WebAssembly i jest opcjonalnie hostowana przez aplikację platformy ASP.NET Core. Tego szablonu można używać dla aplikacji internetowych z rozbudowanymi dynamicznymi interfejsami użytkownika.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "Jeśli zostanie określony, zawiera hosta platformy ASP.NET Core dla aplikacji Zestaw WebAssembly platformy Blazor.",
+ "symbols/auth/choices/None/description": "Bez uwierzytelniania",
+ "symbols/auth/choices/Individual/description": "Uwierzytelnianie indywidualne",
+ "symbols/auth/choices/IndividualB2C/description": "Indywidualne uwierzytelnianie za pomocą usługi Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Uwierzytelnianie organizacyjne dla pojedynczej dzierżawy",
+ "symbols/auth/description": "Typ uwierzytelniania, który ma zostać użyty.",
+ "symbols/Authority/description": "Urząd dostawcy OIDC (użyj z autonomicznym indywidualnym uwierzytelnianym).",
+ "symbols/AAdB2CInstance/description": "Wystąpienie usługi Azure Active Directory B2C do nawiązania połączenia (użyj z uwierzytelnianym IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Identyfikator zasad logowania i rejestracji dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/AADInstance/description": "Wystąpienie usługi Azure Active Directory do nawiązania połączenia (użyj z uwierzytelnianym SingleOrg ).",
+ "symbols/ClientId/description": "Identyfikator klienta dla tego projektu (używany z uwierzytelnianiem IndividualB2C, SingleOrg lub Individual w scenariuszach autonomicznych).",
+ "symbols/Domain/description": "Domena dzierżawy katalogu (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/AppIDUri/description": "Identyfikator URI identyfikatora aplikacji dla interfejsu API serwera, który chcemy wywołać (użyj z uwierzytelnianym SingleOrg lub IndividualB2C).",
+ "symbols/APIClientId/description": "Identyfikator klienta dla interfejsu API hostowanego przez serwer (używany z elementem IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "Zakres interfejsu API, który klient musi zażądać w celu aprowizacji tokenu dostępu. (użyj z uwierzytelnianiem singleB2C, SingleOrg).",
+ "symbols/TenantId/description": "Identyfikator TenantId katalogu, z którym ma zostać nawiązane połączenie (użyj uwierzytelniania SingleOrg).",
+ "symbols/OrgReadAccess/description": "Określa, czy zezwolić tej aplikacji na dostęp do odczytu do katalogu (dotyczy tylko uwierzytelniania SingleOrg).",
+ "symbols/UserSecretsId/description": "Identyfikator do użycia na potrzeby wpisów tajnych (używany z funkcją OrgReadAccess lub indywidualnym uwierzytelnianiem).",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany (parametr no-https zostanie zignorowany, jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth, parametr no-https zostanie zignorowana).",
+ "symbols/PWA/displayName": "_Progresywna aplikacja internetowa",
+ "symbols/PWA/description": "Jeśli zostanie określony, tworzy progresywną aplikację internetową (PWA) obsługującą instalację i używanie w trybie offline.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy dla uwierzytelniania --auth nie są używane elementy Individual, IndividualB2C, SingleOrg lub MultiOrg.",
+ "symbols/UseLocalDB/description": "Określa, czy używać bazy danych LocalDB zamiast oprogramowania SQLite. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth Individual lub --auth IndividualB2C.",
+ "symbols/CalledApiUrl/description": "Adres URL interfejsu API do wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C bez hosta platformy ASP.NET Core.",
+ "symbols/CallsMicrosoftGraph/description": "Określa, czy aplikacja internetowa wywołuje program Microsoft Graph. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg lub --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Zakresy do żądania wywołania interfejsu API z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C bez hosta platformy ASP.NET Core.",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\"",
+ "postActions/restoreClient/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restoreClient/manualInstructions/default/text": "Uruchom polecenie „dotnet restore”",
+ "postActions/open-file/description": "Otwiera plik Readme.txt w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 7e31298e01..38142304b2 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Aplicativo Blazor WebAssembly",
+ "description": "Um modelo de projeto para criar um aplicativo Blazor que é executado no WebAssembly e, opcionalmente, é hospedado por um aplicativo ASP.NET Core. Esse modelo pode ser usado para aplicativos Web com IUs (interfaces do usuário) completas e dinâmicas.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "Se especificado, inclui um host ASP.NET Core para o aplicativo Blazor WebAssembly.",
+ "symbols/auth/choices/None/description": "Sem autenticação",
+ "symbols/auth/choices/Individual/description": "Autenticação individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticação individual com Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticação organizacional para um único locatário",
+ "symbols/auth/description": "O tipo de autenticação a ser usado",
+ "symbols/Authority/description": "A autoridade do provedor OIDC (use com autenticação individual autônoma).",
+ "symbols/AAdB2CInstance/description": "A instância do Azure Active Directory B2C à qual se conectar (use com autenticação IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "O ID da política de login e inscrição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/AADInstance/description": "A instância do Azure Active Directory à qual se conectar (use com autenticação SingleOrg).",
+ "symbols/ClientId/description": "O ID do cliente para este projeto (use com autenticação IndividualB2C, SingleOrg ou Individual em cenários autônomos).",
+ "symbols/Domain/description": "O domínio para o locatário do diretório (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/AppIDUri/description": "O App ID Uri para a API do servidor que queremos chamar (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/APIClientId/description": "O ID do cliente para a API que o servidor hospeda (use com IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "O escopo da API que o cliente precisa solicitar para provisionar um token de acesso. (use com IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "O ID TenantId do diretório ao qual se conectar (use com autenticação SingleOrg).",
+ "symbols/OrgReadAccess/description": "Se deve ou não permitir que este aplicativo tenha acesso de leitura ao diretório (aplica-se apenas a SingleOrg).",
+ "symbols/UserSecretsId/description": "O ID a ser usado para segredos (use com OrgReadAccess ou Autenticação individual).",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/PWA/displayName": "_Aplicativo da Web Progressivo",
+ "symbols/PWA/description": "Se especificado, produz um Progressive Web Application (PWA) com suporte para instalação e uso offline.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção se aplica somente se Individual, IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "symbols/UseLocalDB/description": "Se deve usar LocalDB em vez de SQLite. Esta opção só se aplica se --auth Individual ou --auth IndividualB2C for especificado.",
+ "symbols/CalledApiUrl/description": "URL da API para chamar do aplicativo Web. Essa opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sem um host ASP.NET Core for especificado.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica se o aplicativo Web chama o Microsoft Graph. Esta opção só se aplica se --auth SingleOrg ou --auth MultiOrg for especificado.",
+ "symbols/CalledApiScopes/description": "Escopos a serem solicitados para chamar a API do aplicativo Web. Essa opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C sem um host ASP.NET Core for especificado.",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'",
+ "postActions/restoreClient/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restoreClient/manualInstructions/default/text": "Executa 'dotnet restore'",
+ "postActions/open-file/description": "Abre Readme.txt no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json
index 7e31298e01..a415452150 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,46 +1,46 @@
-{
- "author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Приложение WebAssembly Blazor",
+ "description": "Шаблон проекта для создания приложения Blazor, которое запускается в WebAssembly и может размещаться в приложении ASP.NET Core. Этот шаблон можно использовать для веб-приложений с расширенными динамическими пользовательскими интерфейсами (UI).",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/Hosted/displayName": "_Размещение на ASP.NET Core",
+ "symbols/Hosted/description": "Если указывается, включает узел ASP.NET Core для приложения Blazor WebAssembly.",
+ "symbols/auth/choices/None/description": "Без проверки подлинности",
+ "symbols/auth/choices/Individual/description": "Индивидуальная проверка подлинности",
+ "symbols/auth/choices/IndividualB2C/description": "Индивидуальная проверка подлинности в Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Проверка подлинности в организации для одного клиента",
+ "symbols/auth/description": "Тип используемой проверки подлинности",
+ "symbols/Authority/description": "Полномочия поставщика OIDC (используются с автономной проверкой подлинности Individual).",
+ "symbols/AAdB2CInstance/description": "Экземпляр Azure Active Directory B2C, к которому нужно подключиться (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Идентификатор политики входа и регистрации для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/AADInstance/description": "Экземпляр Azure Active Directory, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/ClientId/description": "Идентификатор клиента для этого проекта (используется с проверкой подлинности IndividualB2C, SingleOrg или Individual в автономных сценариях).",
+ "symbols/Domain/description": "Домен для клиента каталога (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/AppIDUri/description": "URI идентификатора приложения для API сервера, который требуется вызвать (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/APIClientId/description": "Идентификатор клиента для API, размещенного на сервере (используется с IndividualB2C, SingleOrg).",
+ "symbols/DefaultScope/description": "Область API, необходимая клиенту для запроса на подготовку маркера доступа (используется с IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "Идентификатор TenantId каталога, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/OrgReadAccess/description": "Следует ли предоставлять этому приложению доступ на чтение к каталогу (применяется только к SingleOrg).",
+ "symbols/UserSecretsId/description": "Идентификатор, используемый для секретов (используется с проверкой подлинности OrgReadAccess или Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/PWA/displayName": "_Прогрессивное веб-приложение",
+ "symbols/PWA/description": "Если указывается, используется для создания прогрессивного веб-приложения (PWA), поддерживающего установку и автономное использование.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются Individual, IndividualB2C, SingleOrg или MultiOrg.",
+ "symbols/UseLocalDB/description": "Следует ли использовать LocalDB вместо SQLite. Этот параметр применяется, только если указывается --auth Individual или --auth IndividualB2C.",
+ "symbols/CalledApiUrl/description": "URL-адрес API для вызова из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C без узла ASP.NET Core.",
+ "symbols/CallsMicrosoftGraph/description": "Указывает, вызывает ли веб-приложение Microsoft Graph. Этот параметр применяется, только если указывается --auth SingleOrg или --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Области для запроса вызова API из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C без узла ASP.NET Core.",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\"",
+ "postActions/restoreClient/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restoreClient/manualInstructions/default/text": "Выполнить команду \"dotnet restore\"",
+ "postActions/open-file/description": "Открывает Readme.txt в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json
index 7e31298e01..f0a81d27a5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Blazor WebAssembly Uygulaması",
+ "description": "WebAssembly üzerinde çalışan ve isteğe bağlı olarak bir ASP.NET Core uygulamasında barındırılan Blazor uygulaması oluşturmaya yönelik proje şablonu. Bu şablon, zengin dinamik kullanıcı arabirimlerine (UI) sahip web uygulamaları için kullanılabilir.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/Hosted/displayName": "ASP.NET Core tarafından _Barındırılan",
+ "symbols/Hosted/description": "Belirtilmişse Blazor WebAssembly uygulaması için ASP.NET Core konağı içerir.",
+ "symbols/auth/choices/None/description": "Kimlik doğrulaması yok",
+ "symbols/auth/choices/Individual/description": "Bireysel kimlik doğrulaması",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C ile bireysel kimlik doğrulaması",
+ "symbols/auth/choices/SingleOrg/description": "Tek bir kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/description": "Kullanılacak kimlik doğrulaması türü",
+ "symbols/Authority/description": "OIDC sağlayıcısının yetkisi (tek başına Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/AAdB2CInstance/description": "Bağlanılacak Azure Active Directory B2C örneği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignUpSignInPolicyId/description": "Bu proje için oturum açma ve kaydolma ilkesi kimliği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/AADInstance/description": "Bağlanılacak Azure Active Directory örneği (SingleOrg kimlik doğrulaması ile kullanın).",
+ "symbols/ClientId/description": "Bu projenin İstemci Kimliği (tek başına senaryolarda IndividualB2C, SingleOrg veya Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/Domain/description": "Dizin kiracısı için etki alanı (SingleOrg veya IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/AppIDUri/description": "Çağrılmak istenen sunucu API'sinin Uygulama Kimliği Uri'si (SingleOrg veya IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/APIClientId/description": "Sunucunun barındırmış olduğu API için İstemci Kimliği (IndividualB2C, SingleOrg ile kullanın).",
+ "symbols/DefaultScope/description": "İstemcinin erişim belirteci sağlamak amacıyla istekte bulunmak için ihtiyacı olan API kapsamı. (IndividualB2C, SingleOrg ile kullanın).",
+ "symbols/TenantId/description": "Bağlanılacak dizinin TenantId kimliği (SingleOrg kimlik doğrulamasıyla kullanın).",
+ "symbols/OrgReadAccess/description": "Bu uygulamanın dizin okuma erişimine izin verilip verilmeyeceği (yalnızca SingleOrg için geçerlidir).",
+ "symbols/UserSecretsId/description": "Gizli diziler için kullanılan kimlik (OrgReadAccess veya Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/PWA/displayName": "_Aşamalı Web Uygulaması",
+ "symbols/PWA/description": "Belirtilmişse, yükleme ve çevrimdışı kullanımı destekleyen bir Aşamalı Web Uygulaması (PWA) oluşturur.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca Bireysel, IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "symbols/UseLocalDB/description": "SQLite yerine LocalDB'nin kullanılıp kullanılmayacağı. Bu seçenek yalnızca --auth Individual veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/CalledApiUrl/description": "Web uygulamasından çağrılan API URL'si. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C without ve ASP.NET Core konağı belirtilirse geçerlidir.",
+ "symbols/CallsMicrosoftGraph/description": "Web uygulamasının Microsoft Graph çağırıp çağırmadığını belirtir. Bu seçenek yalnızca --auth SingleOrg veya --auth MultiOrg belirtilirse geçerlidir.",
+ "symbols/CalledApiScopes/description": "Web uygulamasından API çağırma istek kapsamları. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C without ve ASP.NET Core konağı belirtilirse geçerlidir.",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır",
+ "postActions/restoreClient/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restoreClient/manualInstructions/default/text": "'dotnet restore' çalıştır",
+ "postActions/open-file/description": "Benioku.txt dosyasını düzenleyicide açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 7e31298e01..1d7454996f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Blazor WebAssembly 应用",
+ "description": "用于创建 Blazor 应用的项目模板,该应用在 WebAssembly 上运行且可选择由 ASP.NET Core 应用托管。此模板可用于具有丰富动态用户界面(UI)的 Web 应用。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/Hosted/displayName": "ASP.NET Core 托管(_H)",
+ "symbols/Hosted/description": "如果指定,则包括 Blazor WebAssembly 应用的 ASP.NET Core 主机。",
+ "symbols/auth/choices/None/description": "无身份验证",
+ "symbols/auth/choices/Individual/description": "个人身份验证",
+ "symbols/auth/choices/IndividualB2C/description": "使用 Azure AD B2C 进行个人身份验证",
+ "symbols/auth/choices/SingleOrg/description": "单个租户的组织身份验证",
+ "symbols/auth/description": "要使用的身份验证类型",
+ "symbols/Authority/description": "OIDC 提供程序的颁发机构(与独立个人身份验证一起使用)。",
+ "symbols/AAdB2CInstance/description": "要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/AADInstance/description": "要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。",
+ "symbols/ClientId/description": "此项目的客户端 ID (在独立方案中与 IndividualB2C、SingleOrg 或个人身份验证一起使用)。",
+ "symbols/Domain/description": "目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/AppIDUri/description": "要调用的服务器 API 的应用 ID URI (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/APIClientId/description": "服务器托管的 API 的客户端 ID (与 IndividualB2C、SingleOrg 一起使用)。",
+ "symbols/DefaultScope/description": "客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。",
+ "symbols/TenantId/description": "要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。",
+ "symbols/OrgReadAccess/description": "是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg)。",
+ "symbols/UserSecretsId/description": "用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/PWA/displayName": "渐进式 Web 应用程序(_P)",
+ "symbols/PWA/description": "如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/CalledApiUrl/description": "要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。",
+ "symbols/CalledApiScopes/description": "请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或不带 ASP.NET Core 主机的 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\"",
+ "postActions/restoreClient/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restoreClient/manualInstructions/default/text": "运行 “dotnet restore”",
+ "postActions/open-file/description": "在编辑器中打开 Readme.txt"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 7e31298e01..e7692647fe 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,46 +1,46 @@
-{
+{
"author": "Microsoft",
- "name": "Blazor WebAssembly App",
- "description": "A project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template can be used for web apps with rich dynamic user interfaces (UIs).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/Hosted/displayName": "ASP.NET Core Hosted",
- "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/Authority/description": "The authority of the OIDC provider (use with standalone Individual auth).",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or Individual auth in standalone scenarios).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/AppIDUri/description": "The App ID Uri for the server API we want to call (use with SingleOrg or IndividualB2C auth).",
- "symbols/APIClientId/description": "The Client ID for the API that the server hosts (use with IndividualB2C, SingleOrg).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/PWA/displayName": "Progressive Web Application",
- "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C without and ASP.NET Core host is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
- "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/open-file/description": "Opens Readme.txt in the editor"
+ "name": "Blazor WebAssembly 應用程式",
+ "description": "此專案範本可用於建立在 WebAssembly 上執行的 Blazor 應用程式,並可選擇是否要裝載在 ASP.NET Core 應用程式上。此範本可供搭載豐富動態使用者介面 (UI) 的 Web 應用程式使用。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/Hosted/displayName": "ASP.NET Core 託管(_H)",
+ "symbols/Hosted/description": "若指定,會包含 Blazor WebAssembly 應用程式的 ASP.NET Core 主機。",
+ "symbols/auth/choices/None/description": "沒有驗證",
+ "symbols/auth/choices/Individual/description": "個別驗證",
+ "symbols/auth/choices/IndividualB2C/description": "具有 Azure AD B2C 的個別驗證",
+ "symbols/auth/choices/SingleOrg/description": "單一租用戶的組織驗證",
+ "symbols/auth/description": "要使用的驗證類型。",
+ "symbols/Authority/description": "OIDC 提供者的授權(搭配獨立個別驗證使用)。",
+ "symbols/AAdB2CInstance/description": "要連線的 Azure Active Directory B2C 執行個體 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此專案的登入和註冊原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/AADInstance/description": "要連線到的 Azure Active Directory 執行個體 (搭配 SingleOrg 驗證使用)。",
+ "symbols/ClientId/description": "此專案的用戶端識別碼 (搭配獨立案例中的 IndividualB2C、SingleOrg 或 Individual 驗證使用)。",
+ "symbols/Domain/description": "目錄租用戶的網域 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/AppIDUri/description": "要呼叫的伺服器 API App ID URI (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/APIClientId/description": "伺服器裝載之 API 的用戶端識別碼 (搭配 IndividualB2C、SingleOrg 使用)。",
+ "symbols/DefaultScope/description": "用戶端佈建存取權杖所需的 API 範圍。(搭配 IndividualB2C、SingleOrg 使用)。",
+ "symbols/TenantId/description": "要連線到目錄的 TenantId 識別碼 (搭配 SingleOrg 驗證使用)。",
+ "symbols/OrgReadAccess/description": "是否要允許此應用程式讀取存取目錄 (只適用於 SingleOrg)。",
+ "symbols/UserSecretsId/description": "用於祕密的識別碼 (搭配 OrgReadAccess 或個別驗證使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/PWA/displayName": "漸進式 Web 應用程式(_P)",
+ "symbols/PWA/description": "若指定,會產生漸進式 Web 應用程式 (PWA) 支援安裝與離線使用。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 Individual、IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而非 SQLite。只有在已指定 --auth Individual 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/CalledApiUrl/description": "要從 Web 應用程式呼叫的 API URL。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時 (不含 ASP.NET Core 主機),才適用此選項。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 應用程式呼叫是否 Microsoft Graph。只有在已指定 --auth SingleOrg 或 --auth MultiOrg 時,才適用此選項。",
+ "symbols/CalledApiScopes/description": "要求從 Web 應用程式呼叫 API 的範圍。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時 (不含 ASP.NET Core 主機),才適用此選項。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'",
+ "postActions/restoreClient/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restoreClient/manualInstructions/default/text": "執行 'dotnet restore'",
+ "postActions/open-file/description": "在編輯器中開啟 Readme.txt"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/template.json
index 101f868b87..a311fe7dbb 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/.template.config/template.json
@@ -293,6 +293,13 @@
"Client/Shared/NavMenu.NoGraphOrApi.razor",
"Client/Shared/NavMenu.CallsMicrosoftGraph.razor"
]
+ },
+ {
+ "condition": "(ExcludeLaunchSettings)",
+ "exclude": [
+ "Client/Properties/launchSettings.json",
+ "Server/Properties/launchSettings.json"
+ ]
}
]
}
@@ -559,7 +566,15 @@
},
"RequiresHttps": {
"type": "computed",
- "value": "(OrganizationalAuth || IndividualAuth || !NoHttps)"
+ "value": "(OrganizationalAuth || IndividualAuth)"
+ },
+ "HasHttpProfile": {
+ "type": "computed",
+ "value": "(!RequiresHttps)"
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(RequiresHttps || !NoHttps)"
},
"NoHttps": {
"type": "parameter",
@@ -616,7 +631,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Pages/FetchData.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Pages/FetchData.razor
index 8065ddd2f1..c69ec4459b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Pages/FetchData.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Pages/FetchData.razor
@@ -72,7 +72,7 @@ else
public class WeatherForecast
{
- public DateTime Date { get; set; }
+ public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.Main.cs
index 8b870e5dc9..18be2444cb 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Program.Main.cs
@@ -9,7 +9,11 @@ using ComponentsWebAssembly_CSharp.Client;
using ComponentsWebAssembly_CSharp;
#endif
-namespace Company.WebApplication1;
+#if (Hosted)
+namespace ComponentsWebAssembly_CSharp.Client;
+#else
+namespace ComponentsWebAssembly_CSharp;
+#endif
public class Program
{
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json
index d6acc5dbf6..39b9dda30b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json
@@ -9,7 +9,7 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(RequiresHttps)
+ //#if (HasHttpsProfile)
"sslPort": 44300
//#else
"sslPort": 0
@@ -17,20 +17,30 @@
}
},
"profiles": {
- "ComponentsWebAssembly-CSharp": {
+ //#if (HasHttpProfile)
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
- //#if(RequiresHttps)
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#else
"applicationUrl": "http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualLocalAuth.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualLocalAuth.razor
index ce8bd5070a..2e2f46ef02 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualLocalAuth.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualLocalAuth.razor
@@ -1,14 +1,12 @@
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
-
@inject NavigationManager Navigation
-@inject SignOutSessionStateManager SignOutManager
<AuthorizeView>
@*#if (Hosted)
<Authorized>
<a href="authentication/profile">Hello, @context.User.Identity?.Name!</a>
- <button class="nav-link btn btn-link" @onclick="BeginSignOut">Log out</button>
+ <button class="nav-link btn btn-link" @onclick="BeginLogOut">Log out</button>
</Authorized>
<NotAuthorized>
<a href="authentication/register">Register</a>
@@ -17,7 +15,7 @@
#else
<Authorized>
Hello, @context.User.Identity?.Name!
- <button class="nav-link btn btn-link" @onclick="BeginSignOut">Log out</button>
+ <button class="nav-link btn btn-link" @onclick="BeginLogOut">Log out</button>
</Authorized>
<NotAuthorized>
<a href="authentication/login">Log in</a>
@@ -26,9 +24,8 @@
</AuthorizeView>
@code{
- private async Task BeginSignOut(MouseEventArgs args)
+ private void BeginLogOut()
{
- await SignOutManager.SetSignOutState();
- Navigation.NavigateTo("authentication/logout");
+ Navigation.NavigateToLogout("authentication/logout");
}
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualMsalAuth.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualMsalAuth.razor
index 7ebea5d348..e543b5213e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualMsalAuth.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/LoginDisplay.IndividualMsalAuth.razor
@@ -1,13 +1,11 @@
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
-
@inject NavigationManager Navigation
-@inject SignOutSessionStateManager SignOutManager
<AuthorizeView>
<Authorized>
Hello, @context.User.Identity?.Name!
- <button class="nav-link btn btn-link" @onclick="BeginLogout">Log out</button>
+ <button class="nav-link btn btn-link" @onclick="BeginLogOut">Log out</button>
</Authorized>
<NotAuthorized>
<a href="authentication/login">Log in</a>
@@ -15,9 +13,8 @@
</AuthorizeView>
@code{
- private async Task BeginLogout(MouseEventArgs args)
+ public void BeginLogOut()
{
- await SignOutManager.SetSignOutState();
- Navigation.NavigateTo("authentication/logout");
+ Navigation.NavigateToLogout("authentication/logout");
}
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsMicrosoftGraph.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsMicrosoftGraph.razor
index 429950805b..502cb65cc3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsMicrosoftGraph.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsMicrosoftGraph.razor
@@ -7,7 +7,7 @@
</div>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsWebApi.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsWebApi.razor
index b15bedf508..1ea1d96371 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsWebApi.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.CallsWebApi.razor
@@ -7,7 +7,7 @@
</div>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.NoGraphOrApi.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.NoGraphOrApi.razor
index ae2e40bee1..afe037f31b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.NoGraphOrApi.razor
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.NoGraphOrApi.razor
@@ -7,7 +7,7 @@
</div>
</div>
-<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
+<div class="@NavMenuCssClass nav-scrollable" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.razor.css b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.razor.css
index acc5f9f819..604b7a1a10 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.razor.css
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/Shared/NavMenu.razor.css
@@ -59,4 +59,10 @@
/* Never collapse the sidebar for wide screens */
display: block;
}
+
+ .nav-scrollable {
+ /* Allow sidebar to scroll for tall menus */
+ height: calc(100vh - 3.5rem);
+ overflow-y: auto;
+ }
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css
index 9cd148f7d5..8034dcc4c4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css
@@ -1,4 +1,4 @@
-@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
+@import url('open-iconic/font/css/open-iconic-bootstrap.min.css');
html, body {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
@@ -18,6 +18,10 @@ a, .btn-link {
border-color: #1861ac;
}
+.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
+ box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
+}
+
.content {
padding-top: 1.1rem;
}
@@ -62,3 +66,36 @@ a, .btn-link {
.blazor-error-boundary::after {
content: "An error has occurred."
}
+
+.loading-progress {
+ position: relative;
+ display: block;
+ width: 8rem;
+ height: 8rem;
+ margin: 20vh auto 1rem auto;
+}
+
+ .loading-progress circle {
+ fill: none;
+ stroke: #e0e0e0;
+ stroke-width: 0.6rem;
+ transform-origin: 50% 50%;
+ transform: rotate(-90deg);
+ }
+
+ .loading-progress circle:last-child {
+ stroke: #1b6ec2;
+ stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%;
+ transition: stroke-dasharray 0.05s ease-in-out;
+ }
+
+.loading-progress-text {
+ position: absolute;
+ text-align: center;
+ font-weight: bold;
+ inset: calc(20vh + 3.25rem) 0 auto 0.2rem;
+}
+
+ .loading-progress-text:after {
+ content: var(--blazor-load-percentage-text, "Loading");
+ }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.ico b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.ico
deleted file mode 100644
index 63e859b476..0000000000
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.ico
+++ /dev/null
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.png b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.png
new file mode 100644
index 0000000000..8422b59695
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/favicon.png
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/index.html b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/index.html
index fe965c6249..4d7c7088ad 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/index.html
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Client/wwwroot/index.html
@@ -8,6 +8,7 @@
<base href="/" />
<link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
<link href="css/app.css" rel="stylesheet" />
+ <link rel="icon" type="image/png" href="favicon.png" />
<!--#if (Hosted) -->
<link href="ComponentsWebAssembly-CSharp.Client.styles.css" rel="stylesheet" />
<!--#else -->
@@ -21,7 +22,13 @@
</head>
<body>
- <div id="app">Loading...</div>
+ <div id="app">
+ <svg class="loading-progress">
+ <circle r="40%" cx="50%" cy="50%" />
+ <circle r="40%" cx="50%" cy="50%" />
+ </svg>
+ <div class="loading-progress-text"></div>
+ </div>
<div id="blazor-error-ui">
An unhandled error has occurred.
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Controllers/WeatherForecastController.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Controllers/WeatherForecastController.cs
index 1be736c1ce..52fab2ac5d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Controllers/WeatherForecastController.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Controllers/WeatherForecastController.cs
@@ -62,7 +62,7 @@ public class WeatherForecastController : ControllerBase
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
- Date = DateTime.Now.AddDays(index),
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
@@ -86,7 +86,7 @@ public class WeatherForecastController : ControllerBase
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
- Date = DateTime.Now.AddDays(index),
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
@@ -103,7 +103,7 @@ public class WeatherForecastController : ControllerBase
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
- Date = DateTime.Now.AddDays(index),
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.Main.cs
index 31835439cd..cc52a2ed54 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.Main.cs
@@ -19,7 +19,7 @@ using ComponentsWebAssembly_CSharp.Server.Data;
using ComponentsWebAssembly_CSharp.Server.Models;
#endif
-namespace Company.WebApplication1;
+namespace ComponentsWebAssembly_CSharp;
public class Program
{
@@ -90,13 +90,13 @@ public class Program
else
{
app.UseExceptionHandler("/Error");
- #if (RequiresHttps)
+ #if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
#endif
}
- #if (RequiresHttps)
+ #if (HasHttpsProfile)
app.UseHttpsRedirection();
#endif
@@ -108,9 +108,6 @@ public class Program
#if (IndividualLocalAuth)
app.UseIdentityServer();
#endif
- #if (OrganizationalAuth || IndividualAuth)
- app.UseAuthentication();
- #endif
#if (!NoAuth)
app.UseAuthorization();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.cs
index d886c5f161..3a44aefeb9 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Program.cs
@@ -84,13 +84,13 @@ if (app.Environment.IsDevelopment())
else
{
app.UseExceptionHandler("/Error");
-#if (RequiresHttps)
+#if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
#endif
}
-#if (RequiresHttps)
+#if (HasHttpsProfile)
app.UseHttpsRedirection();
#endif
@@ -102,9 +102,6 @@ app.UseRouting();
#if (IndividualLocalAuth)
app.UseIdentityServer();
#endif
-#if (OrganizationalAuth || IndividualAuth)
-app.UseAuthentication();
-#endif
#if (!NoAuth)
app.UseAuthorization();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json
index 51e281813a..06376499a9 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json
@@ -4,7 +4,7 @@
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(RequiresHttps)
+ //#if (HasHttpsProfile)
"sslPort": 44300
//#else
"sslPort": 0
@@ -12,20 +12,30 @@
}
},
"profiles": {
- "ComponentsWebAssembly-CSharp.Server": {
+ //#if (HasHttpProfile)
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
- //#if(RequiresHttps)
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#else
"applicationUrl": "http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Shared/WeatherForecast.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Shared/WeatherForecast.cs
index 7ea4cac0e5..2af562f8db 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Shared/WeatherForecast.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/ComponentsWebAssembly-CSharp/Shared/WeatherForecast.cs
@@ -2,7 +2,7 @@ namespace ComponentsWebAssembly_CSharp.Shared;
public class WeatherForecast
{
- public DateTime Date { get; set; }
+ public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..d97858472b
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,35 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "Framework": {
+ "longName": "framework"
+ },
+ "skipRestore": {
+ "longName": "no-restore",
+ "shortName": ""
+ },
+ "kestrelHttpPort": {
+ "isHidden": true
+ },
+ "kestrelHttpsPort": {
+ "isHidden": true
+ },
+ "iisHttpPort": {
+ "isHidden": true
+ },
+ "iisHttpsPort": {
+ "isHidden": true
+ },
+ "ExcludeLaunchSettings": {
+ "longName": "exclude-launch-settings",
+ "shortName": ""
+ },
+ "NoHttps": {
+ "longName": "no-https",
+ "shortName": ""
+ }
+ },
+ "usageExamples": [
+ ""
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide.host.json
new file mode 100644
index 0000000000..b4a57789d6
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide.host.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "http://json.schemastore.org/ide.host",
+ "order": 650,
+ "icon": "ide/icon.png",
+ "disableHttpsSymbol": "NoHttps",
+ "supportsDocker": true,
+ "tags": [
+ {
+ "type": "projectType",
+ "add": [ "Blazor", "Cloud", "Web" ],
+ "remove": [ "*" ]
+ },
+ {
+ "type": "platform",
+ "add": [ "Linux", "macOS", "Windows" ]
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide/icon.png b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide/icon.png
new file mode 100644
index 0000000000..8422b59695
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/ide/icon.png
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json
new file mode 100644
index 0000000000..87c8daef9c
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.cs.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Prázdná aplikace Blazor Server",
+ "description": "Prázdná šablona projektu pro vytvoření aplikace Blazor Server, která běží na straně serveru v aplikaci ASP.NET Core a zpracovává interakce uživatelů přes připojení SignalR. Tato šablona nic neobsahuje.",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužívá parametr no-https.",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužívá parametr no-https.",
+ "symbols/HasHttpProfile/description": "Vždy mějte profil protokolu HTTP.",
+ "symbols/NoHttps/description": "Určuje, jestli se má vypnout protokol HTTPS.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json
new file mode 100644
index 0000000000..c3efcd546a
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.de.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor Server App Leer",
+ "description": "Eine leere Projektvorlage zum Erstellen einer Blazor-Server-App, die serverseitig in einer ASP.NET Core App ausgeführt wird und Benutzerinteraktionen über eine SignalR Verbindung verarbeitet. Diese Vorlage enthält keinen Inhalt.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird.",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird.",
+ "symbols/HasHttpProfile/description": "Immer HTTP Profil haben.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
+ "symbols/Framework/choices/net7.0/description": "Target net7.0",
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json
new file mode 100644
index 0000000000..1951a6ed34
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.en.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor Server App Empty",
+ "description": "An empty project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template does not have any content in it.",
+ "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
+ "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used.",
+ "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used.",
+ "symbols/HasHttpProfile/description": "Always have HTTP profile.",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS.",
+ "symbols/Framework/description": "The target framework for the project.",
+ "symbols/Framework/choices/net7.0/description": "Target net7.0",
+ "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
+ "postActions/restore/description": "Restore NuGet packages required by this project.",
+ "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json
new file mode 100644
index 0000000000..5528593488
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.es.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Aplicación Blazor Server vacía",
+ "description": "Plantilla de proyecto vacía para crear una aplicación de servidor Blazor que se ejecuta en el lado servidor dentro de una aplicación ASP.NET Core y controla las interacciones del usuario a través de una conexión de SignalR. Esta plantilla no tiene contenido.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https.",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https.",
+ "symbols/HasHttpProfile/description": "Siempre tiene un perfil HTTP.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json
new file mode 100644
index 0000000000..812c928807
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.fr.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Application Blazor Server vide",
+ "description": "Modèle de projet vide pour la création d’une application serveur Blazor qui s’exécute côté serveur à l’intérieur d’une application ASP.NET Core et gère les interactions utilisateur sur une connexion SignalR. Ce modèle ne contient aucun contenu.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé.",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé.",
+ "symbols/HasHttpProfile/description": "Toujours avoir un profil HTTP.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json
new file mode 100644
index 0000000000..e8fbbf3b18
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.it.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "App Blazor Server vuota",
+ "description": "Modello di progetto vuoto per la creazione di un'app Blazor server che esegue il lato server all'interno di un'app ASP.NET Core e gestisce le interazioni utente tramite una connessione SignalR. Questo modello non presenta contenuto.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato.",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato.",
+ "symbols/HasHttpProfile/description": "Avere sempre un profilo HTTP.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json
new file mode 100644
index 0000000000..b1eea578c4
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ja.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor Server アプリが空です",
+ "description": "ASP.NET Core アプリ内のサーバー側で実行され、SignalR 接続を介してユーザー操作を処理する Blazor Server アプリを作成するための空のプロジェクト テンプレート。このテンプレートは、その中にコンテンツがありません。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json の HTTPS エンドポイントに使用するポート番号。このオプションは、パラメーター no-https を使用しない場合にのみ適用されます。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json の IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、パラメーター no-https を使用しない場合にのみ適用されます。",
+ "symbols/HasHttpProfile/description": "HTTP プロファイルが常にあります。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json
new file mode 100644
index 0000000000..8ff486420f
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ko.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor 서버 앱이 비어 있습니다.",
+ "description": "ASP.NET Core 앱 내에서 서버 쪽을 실행하고 SignalR 연결을 통해 사용자 상호 작용을 처리하는 Blazor 서버 앱을 만들기 위한 빈 프로젝트 템플릿입니다. 이 템플릿에는 내용이 없습니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/HasHttpProfile/description": "항상 HTTP 프로필이 있어야 합니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json
new file mode 100644
index 0000000000..64a8fbe46b
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pl.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Pusta aplikacja modelu hostowania Blazor Server",
+ "description": "Pusty szablon projektu służący do tworzenia aplikacji serwera Blazor, która działa po stronie serwera w aplikacji platformy ASP.NET Core i obsługuje interakcje użytkownika za pomocą połączenia usługi SignalR. Ten szablon nie zawiera żadnej zawartości.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany.",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany.",
+ "symbols/HasHttpProfile/description": "Zawsze masz profil HTTP.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
new file mode 100644
index 0000000000..a351494c42
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Aplicativo Blazor Server Vazio",
+ "description": "Um modelo de projeto vazio para criar um aplicativo de servidor Blazor que é executado no lado do servidor dentro de um aplicativo ASP.NET Core e manipula as interações do usuário em uma conexão SignalR. Este modelo não tem nenhum conteúdo nele.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Esta opção só é aplicável quando o parâmetro no-https não é usado.",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Esta opção só é aplicável quando o parâmetro no-https não é usado.",
+ "symbols/HasHttpProfile/description": "Sempre ter perfil HTTP.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json
new file mode 100644
index 0000000000..99e8624da0
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.ru.json
@@ -0,0 +1,17 @@
+{
+ "author": "Майкрософт",
+ "name": "Пустое приложение Blazor Server",
+ "description": "Пустой шаблон проекта для создания приложения Blazor Server, которое запускается на стороне сервера в приложении ASP.NET Core и обрабатывает взаимодействие с пользователем через подключение SignalR. В этом шаблоне нет содержимого.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется.",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется.",
+ "symbols/HasHttpProfile/description": "Всегда имеет профиль HTTP.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json
new file mode 100644
index 0000000000..2dff9938ac
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.tr.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor Server Uygulaması Boş",
+ "description": "Boş bir ASP.NET Core uygulaması içinde sunucu tarafında çalışan ve bir SignalR bağlantısı üzerinden kullanıcı etkileşimlerini işleyen bir Blazor Server uygulaması oluşturmaya yönelik proje şablonu. Bu şablonda içerik yok.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içindeki HTTPS uç noktası için bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir.",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içindeki IIS Express HTTPS uç noktası için bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir.",
+ "symbols/HasHttpProfile/description": "Her zaman HTTP profili vardır.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
new file mode 100644
index 0000000000..94a82f3ad8
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor Server 应用空",
+ "description": "用于创建 Blazor 服务器应用的空项目模板,该应用在 ASP.NET Core 应用内运行服务器端,并通过 SignalR 连接处理用户交互。此模板中没有任何内容。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用。",
+ "symbols/HasHttpProfile/description": "始终具有 HTTP 配置文件。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
new file mode 100644
index 0000000000..b62a53d8c4
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -0,0 +1,17 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor Server 應用程式空白",
+ "description": "建立 Blazor Server 應用程式的空白專案範本,該應用程式會在 ASP.NET Core 應用程式內執行伺服器端,並透過 SignalR 連線處理使用者互動。此範本沒有任何內容。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中用於 HTTPS 端點的連接埠號碼。只有在未使用 no-https 參數時,才適用此選項。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中用於 IIS Express HTTPS 端點的連接埠號碼。只有在未使用 no-https 參數時,才適用此選項。",
+ "symbols/HasHttpProfile/description": "永遠有 HTTP 設定檔。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/template.json
new file mode 100644
index 0000000000..577fe64633
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/.template.config/template.json
@@ -0,0 +1,198 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [
+ "Web",
+ "Blazor",
+ "Empty"
+ ],
+ "name": "Blazor Server App Empty",
+ "generatorVersions": "[1.0.0.0-*)",
+ "description": "An empty project template for creating a Blazor server app that runs server-side inside an ASP.NET Core app and handles user interactions over a SignalR connection. This template does not have any content in it.",
+ "groupIdentity": "Microsoft.Web.Blazor.Server.Empty",
+ "precedence": "9000",
+ "identity": "Microsoft.Web.Blazor.Server.Empty.CSharp.7.0",
+ "shortName": "blazorserver-empty",
+ "thirdPartyNotices": "https://aka.ms/aspnetcore/7.0-third-party-notices",
+ "tags": {
+ "language": "C#",
+ "type": "project"
+ },
+ "sourceName": "EmptyBlazorServerWeb-CSharp",
+ "preferNameDirectory": true,
+ "sources": [
+ {
+ "source": "./",
+ "target": "./",
+ "exclude": [
+ ".template.config/**"
+ ],
+ "copyOnly": [
+ "wwwroot/**"
+ ],
+ "modifiers": [
+ {
+ "condition": "(ExcludeLaunchSettings)",
+ "exclude": [
+ "Properties/launchSettings.json"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "ExcludeLaunchSettings": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to exclude launchSettings.json from the generated template."
+ },
+ "kestrelHttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTP endpoint in launchSettings.json."
+ },
+ "kestrelHttpPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 5000,
+ "high": 5300
+ }
+ },
+ "kestrelHttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "kestrelHttpPort",
+ "fallbackVariableName": "kestrelHttpPortGenerated"
+ },
+ "replaces": "5000"
+ },
+ "kestrelHttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used."
+ },
+ "kestrelHttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 7000,
+ "high": 7300
+ }
+ },
+ "kestrelHttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "kestrelHttpsPort",
+ "fallbackVariableName": "kestrelHttpsPortGenerated"
+ },
+ "replaces": "5001"
+ },
+ "iisHttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json."
+ },
+ "iisHttpPortGenerated": {
+ "type": "generated",
+ "generator": "port"
+ },
+ "iisHttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "iisHttpPort",
+ "fallbackVariableName": "iisHttpPortGenerated"
+ },
+ "replaces": "8080"
+ },
+ "iisHttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used."
+ },
+ "iisHttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 44300,
+ "high": 44399
+ }
+ },
+ "iisHttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "iisHttpsPort",
+ "fallbackVariableName": "iisHttpsPortGenerated"
+ },
+ "replaces": "44300"
+ },
+ "HasHttpProfile": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "true",
+ "description": "Always have HTTP profile."
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(!NoHttps)"
+ },
+ "NoHttps": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to turn off HTTPS."
+ },
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "net7.0",
+ "description": "Target net7.0"
+ }
+ ],
+ "replaces": "net7.0",
+ "defaultValue": "net7.0"
+ },
+ "copyrightYear": {
+ "type": "generated",
+ "generator": "now",
+ "replaces": "copyrightYear",
+ "parameters": {
+ "format": "yyyy"
+ }
+ },
+ "skipRestore": {
+ "type": "parameter",
+ "datatype": "bool",
+ "description": "If specified, skips the automatic restore of the project on create.",
+ "defaultValue": "false"
+ }
+ },
+ "primaryOutputs": [
+ {
+ "path": "EmptyBlazorServerWeb-CSharp.csproj"
+ }
+ ],
+ "defaultName": "EmptyBlazorApp",
+ "postActions": [
+ {
+ "id": "restore",
+ "condition": "(!skipRestore)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/App.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/App.razor
new file mode 100644
index 0000000000..6fd3ed1b5a
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/App.razor
@@ -0,0 +1,12 @@
+<Router AppAssembly="@typeof(App).Assembly">
+ <Found Context="routeData">
+ <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
+ <FocusOnNavigate RouteData="@routeData" Selector="h1" />
+ </Found>
+ <NotFound>
+ <PageTitle>Not found</PageTitle>
+ <LayoutView Layout="@typeof(MainLayout)">
+ <p role="alert">Sorry, there's nothing at this address.</p>
+ </LayoutView>
+ </NotFound>
+</Router>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/MainLayout.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/MainLayout.razor
new file mode 100644
index 0000000000..a5af3489ae
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/MainLayout.razor
@@ -0,0 +1,3 @@
+@inherits LayoutComponentBase
+
+<main> @Body </main>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/Index.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/Index.razor
new file mode 100644
index 0000000000..cba3252e00
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/Index.razor
@@ -0,0 +1,3 @@
+@page "/"
+
+<h1>Hello, world!</h1>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/_Host.cshtml b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/_Host.cshtml
new file mode 100644
index 0000000000..5dd2752eea
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Pages/_Host.cshtml
@@ -0,0 +1,30 @@
+@page "/"
+@using Microsoft.AspNetCore.Components.Web
+@namespace EmptyBlazorServerWeb_CSharp.Pages
+@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
+
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8" />
+ <base href="~/" />
+ <link href="css/site.css" rel="stylesheet" />
+ <component type="typeof(HeadOutlet)" render-mode="ServerPrerendered" />
+</head>
+<body>
+ <component type="typeof(App)" render-mode="ServerPrerendered" />
+
+ <div id="blazor-error-ui">
+ <environment include="Staging,Production">
+ An error has occurred. This application may no longer respond until reloaded.
+ </environment>
+ <environment include="Development">
+ An unhandled exception has occurred. See browser dev tools for details.
+ </environment>
+ <a href="" class="reload">Reload</a>
+ <a class="dismiss">🗙</a>
+ </div>
+
+ <script src="_framework/blazor.server.js"></script>
+</body>
+</html>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Program.cs
new file mode 100644
index 0000000000..a03e57e09d
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Program.cs
@@ -0,0 +1,27 @@
+using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Web;
+
+var builder = WebApplication.CreateBuilder(args);
+builder.Services.AddRazorPages();
+builder.Services.AddServerSideBlazor();
+
+var app = builder.Build();
+
+#if (HasHttpsProfile)
+if (!app.Environment.IsDevelopment())
+{
+ // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+ app.UseHsts();
+}
+
+app.UseHttpsRedirection();
+#endif
+
+app.UseStaticFiles();
+
+app.UseRouting();
+
+app.MapBlazorHub();
+app.MapFallbackToPage("/_Host");
+
+app.Run();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Properties/launchSettings.json
new file mode 100644
index 0000000000..fad0d512b6
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/Properties/launchSettings.json
@@ -0,0 +1,43 @@
+{
+ "iisSettings": {
+ "iisExpress": {
+ "applicationUrl": "http://localhost:8080",
+ //#if (HasHttpsProfile)
+ "sslPort": 44300
+ //#else
+ "sslPort": 0
+ //#endif
+ }
+ },
+ "profiles": {
+ //#if(HasHttpProfile)
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ //#if(HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/_Imports.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/_Imports.razor
new file mode 100644
index 0000000000..73a335442d
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/_Imports.razor
@@ -0,0 +1,4 @@
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using Microsoft.JSInterop
+@using EmptyBlazorServerWeb_CSharp
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.Development.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.Development.json
new file mode 100644
index 0000000000..770d3e9314
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.Development.json
@@ -0,0 +1,9 @@
+{
+ "DetailedErrors": true,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.json
new file mode 100644
index 0000000000..10f68b8c8b
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/wwwroot/css/site.css
new file mode 100644
index 0000000000..08e7f0bec9
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyBlazorServerWeb-CSharp/wwwroot/css/site.css
@@ -0,0 +1,28 @@
+#blazor-error-ui {
+ background: lightyellow;
+ bottom: 0;
+ box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
+ display: none;
+ left: 0;
+ padding: 0.6rem 1.25rem 0.7rem 1.25rem;
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+}
+
+ #blazor-error-ui .dismiss {
+ cursor: pointer;
+ position: absolute;
+ right: 3.5rem;
+ top: 0.5rem;
+ }
+
+.blazor-error-boundary {
+ background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
+ padding: 1rem 1rem 1rem 3.7rem;
+ color: white;
+}
+
+ .blazor-error-boundary::after {
+ content: "An error has occurred."
+ }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/dotnetcli.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/dotnetcli.host.json
new file mode 100644
index 0000000000..f650ca83fa
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/dotnetcli.host.json
@@ -0,0 +1,42 @@
+{
+ "$schema": "http://json.schemastore.org/dotnetcli.host",
+ "symbolInfo": {
+ "skipRestore": {
+ "longName": "no-restore",
+ "shortName": ""
+ },
+ "Hosted": {
+ "longName": "hosted"
+ },
+ "PWA": {
+ "longName": "pwa"
+ },
+ "Framework": {
+ "longName": "framework"
+ },
+ "kestrelHttpPort": {
+ "isHidden": true
+ },
+ "kestrelHttpsPort": {
+ "isHidden": true
+ },
+ "iisHttpPort": {
+ "isHidden": true
+ },
+ "iisHttpsPort": {
+ "isHidden": true
+ },
+ "ExcludeLaunchSettings": {
+ "longName": "exclude-launch-settings",
+ "shortName": ""
+ },
+ "NoHttps": {
+ "longName": "no-https",
+ "shortName": ""
+ },
+ "CalledApiUrl": {
+ "longName": "called-api-url",
+ "shortName": ""
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide.host.json
new file mode 100644
index 0000000000..6ce3d71024
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide.host.json
@@ -0,0 +1,29 @@
+{
+ "$schema": "http://json.schemastore.org/ide.host",
+ "order": 660,
+ "icon": "ide/icon.png",
+ "disableHttpsSymbol": "NoHttps",
+ "symbolInfo": [
+ {
+ "id": "Hosted",
+ "isVisible": "true",
+ "persistenceScope": "templateGroup"
+ },
+ {
+ "id": "PWA",
+ "isVisible": "true",
+ "persistenceScope": "templateGroup"
+ }
+ ],
+ "tags": [
+ {
+ "type": "projectType",
+ "add": [ "Blazor", "Cloud", "Web" ],
+ "remove": [ "*" ]
+ },
+ {
+ "type": "platform",
+ "add": [ "Linux", "macOS", "Windows" ]
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide/icon.png b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide/icon.png
new file mode 100644
index 0000000000..8422b59695
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/ide/icon.png
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json
new file mode 100644
index 0000000000..fb8fb98d94
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.cs.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Aplikace Blazor WebAssembly je prázdná.",
+ "description": "Prázdná šablona projektu pro vytvoření aplikace Blazor, která běží na WebAssembly a je volitelně hostovaná aplikací ASP.NET Core. Tato šablona neobsahuje žádný obsah.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/Hosted/displayName": "_Hostováno pomocí ASP.NET Core",
+ "symbols/Hosted/description": "Pokud je tato možnost zadaná, zahrnuje hostitele ASP.NET Core pro aplikaci Blazor WebAssembly.",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužívá parametr no-https.",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužívá parametr no-https.",
+ "symbols/PWA/displayName": "_Progresivní webová aplikace",
+ "symbols/PWA/description": "Pokud je tato možnost zadaná, vytvoří progresivní webovou aplikaci (PWA), která podporuje instalaci a offline použití.",
+ "symbols/HasHttpProfile/description": "Vždy mějte profil protokolu HTTP.",
+ "symbols/NoHttps/description": "Určuje, jestli se má vypnout protokol HTTPS.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore",
+ "postActions/restoreClient/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restoreClient/manualInstructions/default/text": "Spustit „dotnet restore“"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json
new file mode 100644
index 0000000000..0bffad48b9
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.de.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly App leer",
+ "description": "Eine leere Projektvorlage zum Erstellen einer Blazor-App, die auf WebAssembly ausgeführt und optional von einer ASP.NET Core App gehostet wird. Diese Vorlage enthält keinen Inhalt.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
+ "symbols/Framework/choices/net7.0/description": "Target net7.0",
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/Hosted/displayName": "ASP.NET Core _gehostet",
+ "symbols/Hosted/description": "Enthält, falls angegeben, einen ASP.NET Core Host für die Blazor WebAssembly App.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird.",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird.",
+ "symbols/PWA/displayName": "_Progressive Webanwendung",
+ "symbols/PWA/description": "Wenn angegeben, wird eine Progressive Web Application (PWA) erstellt, die die Installation und Offlineverwendung unterstützt.",
+ "symbols/HasHttpProfile/description": "Immer HTTP Profil haben.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen",
+ "postActions/restoreClient/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restoreClient/manualInstructions/default/text": "Führen Sie 'dotnet restore' aus"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json
new file mode 100644
index 0000000000..cd69b8df84
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.en.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly App Empty",
+ "description": "An empty project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template does not have any content in it.",
+ "symbols/Framework/description": "The target framework for the project.",
+ "symbols/Framework/choices/net7.0/description": "Target net7.0",
+ "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app.",
+ "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
+ "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used.",
+ "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used.",
+ "symbols/PWA/displayName": "_Progressive Web Application",
+ "symbols/PWA/description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use.",
+ "symbols/HasHttpProfile/description": "Always have HTTP profile.",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS.",
+ "postActions/restore/description": "Restore NuGet packages required by this project.",
+ "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
+ "postActions/restoreClient/description": "Restore NuGet packages required by this project.",
+ "postActions/restoreClient/manualInstructions/default/text": "Run 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json
new file mode 100644
index 0000000000..c05fb63955
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.es.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Aplicación Blazor WebAssembly vacía",
+ "description": "Plantilla de proyecto vacía para crear una aplicación Blazor que se ejecuta en WebAssembly y que, opcionalmente, está hospedada por una aplicación ASP.NET Core. Esta plantilla no contiene ningún contenido.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/Hosted/displayName": "ASP.NET Core _hospedado",
+ "symbols/Hosted/description": "Si se especifica, incluye un host de ASP.NET Core para la aplicación Blazor WebAssembly.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https.",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https.",
+ "symbols/PWA/displayName": "_Aplicación web progresiva",
+ "symbols/PWA/description": "Si se especifica, produce una aplicación web progresiva (PWA) compatible con la instalación y el uso sin conexión.",
+ "symbols/HasHttpProfile/description": "Siempre tiene un perfil HTTP.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\"",
+ "postActions/restoreClient/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restoreClient/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json
new file mode 100644
index 0000000000..4b13bfc3d4
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.fr.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Application Blazor WebAssembly vide",
+ "description": "Modèle de projet vide pour la création d’une application Blazor qui s’exécute sur WebAssembly et qui est éventuellement hébergée par une application ASP.NET Core. Ce modèle ne contient aucun contenu.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/Hosted/displayName": "ASP.NET core _Hosted",
+ "symbols/Hosted/description": "S’il est spécifié, inclut un hôte ASP.NET Core pour l’application Blazor WebAssembly.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé.",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé.",
+ "symbols/PWA/displayName": "_Application web progressive",
+ "symbols/PWA/description": "Si ce paramètre est spécifié, produit une application web progressive (PWA) qui prend en charge l’installation et l’utilisation hors connexion.",
+ "symbols/HasHttpProfile/description": "Toujours avoir un profil HTTP.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »",
+ "postActions/restoreClient/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restoreClient/manualInstructions/default/text": "Exécuter « dotnet restore »"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json
new file mode 100644
index 0000000000..ee0db710c8
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.it.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "App WebAssembly Blazor vuota",
+ "description": "Modello di progetto vuoto per la creazione di un'app Blazor eseguita in WebAssembly e ospitata facoltativamente da un'app ASP.NET Core. Questo modello non presenta alcun contenuto.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "Se specificato, include un host ASP.NET Core per l'app Blazor WebAssembly.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato.",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato.",
+ "symbols/PWA/displayName": "Applicazione Web _Progressive",
+ "symbols/PWA/description": "Se specificato, produce un'applicazione Web progressiva (PWA) che supporta l'installazione e l'uso offline.",
+ "symbols/HasHttpProfile/description": "Avere sempre un profilo HTTP.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'",
+ "postActions/restoreClient/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restoreClient/manualInstructions/default/text": "Esegui 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json
new file mode 100644
index 0000000000..895bc47f31
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ja.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly アプリが空です",
+ "description": "WebAssembly 上で実行し、必要に応じて ASP.NET Core アプリによってホストされる Blazor アプリを作成するための空のプロジェクト テンプレート。このテンプレートにはコンテンツがありません。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "指定した場合、Blazor WebAssembly アプリの ASP.NET Core ホストが含まれます。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json の HTTPS エンドポイントに使用するポート番号。このオプションは、パラメーター no-https を使用しない場合にのみ適用されます。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json の IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、パラメーター no-https を使用しない場合にのみ適用されます。",
+ "symbols/PWA/displayName": "プログレッシブ Web アプリケーション(_P)",
+ "symbols/PWA/description": "指定した場合、インストールとオフラインでの使用をサポートするプログレッシブ Web アプリケーション (PWA) が生成されます。",
+ "symbols/HasHttpProfile/description": "HTTP プロファイルが常にあります。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する",
+ "postActions/restoreClient/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restoreClient/manualInstructions/default/text": "'dotnet restore' を実行する"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json
new file mode 100644
index 0000000000..e0e27683e2
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ko.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly 앱이 비어 있습니다.",
+ "description": "WebAssembly에서 실행되고 선택적으로 ASP.NET Core 앱에서 호스팅되는 Blazor 앱을 만들기 위한 빈 프로젝트 템플릿입니다. 이 템플릿에는 내용이 없습니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/Hosted/displayName": "ASP.NET Core 호스팅(_H)",
+ "symbols/Hosted/description": "지정된 경우 Blazor WebAssembly 앱에 대한 ASP.NET Core 호스트를 포함합니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/PWA/displayName": "프로그레시브 웹 애플리케이션(_P)",
+ "symbols/PWA/description": "지정된 경우 설치 및 오프라인 사용을 지원하는 PWA(프로그레시브 웹 응용 프로그램)를 생성합니다.",
+ "symbols/HasHttpProfile/description": "항상 HTTP 프로필이 있어야 합니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행",
+ "postActions/restoreClient/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restoreClient/manualInstructions/default/text": "'dotnet restore' 실행"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json
new file mode 100644
index 0000000000..145c00c6bc
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pl.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Aplikacja zestawu WebAssembly platformy Blazor",
+ "description": "Pusty szablon projektu służący do tworzenia aplikacji platformy Blazor, która działa w ramach zestawu WebAssembly i jest opcjonalnie hostowana przez aplikację platformy ASP.NET Core. Ten szablon nie zawiera żadnej zawartości.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "Jeśli zostanie określony, zawiera hosta platformy ASP.NET Core dla aplikacji Zestaw WebAssembly platformy Blazor.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany.",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany.",
+ "symbols/PWA/displayName": "_Progresywna aplikacja internetowa",
+ "symbols/PWA/description": "Jeśli zostanie określony, tworzy progresywną aplikację internetową (PWA) obsługującą instalację i używanie w trybie offline.",
+ "symbols/HasHttpProfile/description": "Zawsze masz profil HTTP.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\"",
+ "postActions/restoreClient/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restoreClient/manualInstructions/default/text": "Uruchom polecenie „dotnet restore”"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json
new file mode 100644
index 0000000000..c7a8931917
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Aplicativo Blazor WebAssembly Vazio",
+ "description": "Um modelo de projeto vazio para criar um aplicativo Blazor executado no WebAssembly e opcionalmente hospedado por um aplicativo ASP.NET Core. Este modelo não tem nenhum conteúdo nele.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/Hosted/displayName": "ASP.NET Core _Hosted",
+ "symbols/Hosted/description": "Se especificado, inclui um host ASP.NET Core para o aplicativo Blazor WebAssembly.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Esta opção só é aplicável quando o parâmetro no-https não é usado.",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Esta opção só é aplicável quando o parâmetro no-https não é usado.",
+ "symbols/PWA/displayName": "_Aplicativo da Web Progressivo",
+ "symbols/PWA/description": "Se especificado, produz um Progressive Web Application (PWA) com suporte para instalação e uso offline.",
+ "symbols/HasHttpProfile/description": "Sempre ter perfil HTTP.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'",
+ "postActions/restoreClient/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restoreClient/manualInstructions/default/text": "Executa 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json
new file mode 100644
index 0000000000..639f0fba03
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.ru.json
@@ -0,0 +1,23 @@
+{
+ "author": "Майкрософт",
+ "name": "Пустое приложение Blazor WebAssembly",
+ "description": "Пустой шаблон проекта для создания приложения Blazor, которое запускается в WebAssembly и может размещаться в приложении ASP.NET Core. В этом шаблоне нет содержимого.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/Hosted/displayName": "_Размещение на ASP.NET Core",
+ "symbols/Hosted/description": "Если указывается, включает узел ASP.NET Core для приложения Blazor WebAssembly.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется.",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется.",
+ "symbols/PWA/displayName": "_Прогрессивное веб-приложение",
+ "symbols/PWA/description": "Если указывается, используется для создания прогрессивного веб-приложения (PWA), поддерживающего установку и автономное использование.",
+ "symbols/HasHttpProfile/description": "Всегда имеет профиль HTTP.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\"",
+ "postActions/restoreClient/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restoreClient/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json
new file mode 100644
index 0000000000..b82e00e55e
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.tr.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly Uygulaması Boş",
+ "description": "WebAssembly üzerinde çalışan ve isteğe bağlı olarak bir ASP.NET Core uygulaması tarafından barındırılan bir Blazor uygulaması oluşturmaya yönelik boş bir proje şablonu. Bu şablonda içerik yok.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/Hosted/displayName": "ASP.NET Core tarafından _Barındırılan",
+ "symbols/Hosted/description": "Belirtilmişse Blazor WebAssembly uygulaması için ASP.NET Core konağı içerir.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içindeki HTTPS uç noktası için bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir.",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içindeki IIS Express HTTPS uç noktası için bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir.",
+ "symbols/PWA/displayName": "_Aşamalı Web Uygulaması",
+ "symbols/PWA/description": "Belirtilmişse, yükleme ve çevrimdışı kullanımı destekleyen bir Aşamalı Web Uygulaması (PWA) oluşturur.",
+ "symbols/HasHttpProfile/description": "Her zaman HTTP profili vardır.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır",
+ "postActions/restoreClient/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restoreClient/manualInstructions/default/text": "'dotnet restore' çalıştır"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json
new file mode 100644
index 0000000000..bf3180a713
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly 应用空",
+ "description": "用于创建 Blazor 应用的空项目模板,该应用在 WebAssembly 上运行,并可选择由 ASP.NET Core 应用托管。此模板中没有任何内容。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/Hosted/displayName": "ASP.NET Core 托管(_H)",
+ "symbols/Hosted/description": "如果指定,则包括 Blazor WebAssembly 应用的 ASP.NET Core 主机。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用。",
+ "symbols/PWA/displayName": "渐进式 Web 应用程序(_P)",
+ "symbols/PWA/description": "如果指定,则生成支持安装和脱机使用的渐进式 Web 应用程序(PWA)。",
+ "symbols/HasHttpProfile/description": "始终具有 HTTP 配置文件。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\"",
+ "postActions/restoreClient/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restoreClient/manualInstructions/default/text": "运行 “dotnet restore”"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json
new file mode 100644
index 0000000000..8d1a15749e
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -0,0 +1,23 @@
+{
+ "author": "Microsoft",
+ "name": "Blazor WebAssembly 應用程式空白",
+ "description": "建立 Blazor 應用程式的空白專案範本,可在 WebAssembly 上執行,而且可選擇性地由 ASP.NET Core 應用程式裝載。此範本中沒有任何內容。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/Hosted/displayName": "ASP.NET Core 託管(_H)",
+ "symbols/Hosted/description": "若指定,會包含 Blazor WebAssembly 應用程式的 ASP.NET Core 主機。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中用於 HTTPS 端點的連接埠號碼。只有在未使用 no-https 參數時,才適用此選項。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中用於 IIS Express HTTPS 端點的連接埠號碼。只有在未使用 no-https 參數時,才適用此選項。",
+ "symbols/PWA/displayName": "漸進式 Web 應用程式(_P)",
+ "symbols/PWA/description": "若指定,會產生漸進式 Web 應用程式 (PWA) 支援安裝與離線使用。",
+ "symbols/HasHttpProfile/description": "永遠有 HTTP 設定檔。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'",
+ "postActions/restoreClient/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restoreClient/manualInstructions/default/text": "執行 'dotnet restore'"
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/template.json
new file mode 100644
index 0000000000..91499117ce
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/.template.config/template.json
@@ -0,0 +1,276 @@
+{
+ "$schema": "http://json.schemastore.org/template",
+ "author": "Microsoft",
+ "classifications": [
+ "Web",
+ "Blazor",
+ "WebAssembly",
+ "PWA",
+ "Empty"
+ ],
+ "name": "Blazor WebAssembly App Empty",
+ "defaultName": "BlazorApp-empty",
+ "description": "An empty project template for creating a Blazor app that runs on WebAssembly and is optionally hosted by an ASP.NET Core app. This template does not have any content in it.",
+ "groupIdentity": "Microsoft.Web.Blazor.Wasm.Empty",
+ "precedence": "9000",
+ "identity": "Microsoft.Web.Blazor.Wasm.Empty.CSharp.7.0",
+ "thirdPartyNotices": "https://aka.ms/aspnetcore/7.0-third-party-notices",
+ "preferNameDirectory": true,
+ "primaryOutputs": [
+ {
+ "condition": "(Hosted && (HostIdentifier == \"dotnetcli\" || HostIdentifier == \"dotnetcli-preview\"))",
+ "path": "EmptyComponentsWebAssembly-CSharp.sln"
+ },
+ {
+ "condition": "(Hosted && HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "path": "Server/EmptyComponentsWebAssembly-CSharp.Server.csproj"
+ },
+ {
+ "condition": "(!Hosted)",
+ "path": "EmptyComponentsWebAssembly-CSharp.csproj"
+ },
+ {
+ "condition": "(Hosted && HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "path": "Client/EmptyComponentsWebAssembly-CSharp.Client.csproj"
+ },
+ {
+ "condition": "(Hosted && HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "path": "Shared/EmptyComponentsWebAssembly-CSharp.Shared.csproj"
+ }
+ ],
+ "shortName": "blazorwasm-empty",
+ "sourceName": "EmptyComponentsWebAssembly-CSharp",
+ "sources": [
+ {
+ "source": "./",
+ "target": "./",
+ "exclude": [
+ ".template.config/**"
+ ],
+ "copyOnly": [
+ "**/wwwroot/css/**"
+ ],
+ "modifiers": [
+ {
+ "condition": "(ExcludeLaunchSettings)",
+ "exclude": [
+ "Client/Properties/launchSettings.json",
+ "Server/Properties/launchSettings.json"
+ ]
+ },
+ {
+ "condition": "(!Hosted)",
+ "exclude": [
+ "Server/**",
+ "Shared/**",
+ "*.sln"
+ ],
+ "rename": {
+ ".Client.csproj": ".csproj",
+ "Client": "."
+ }
+ },
+ {
+ "condition": "(Hosted && HostIdentifier != \"dotnetcli\" && HostIdentifier != \"dotnetcli-preview\")",
+ "exclude": [
+ "*.sln"
+ ]
+ },
+ {
+ "condition": "(!PWA)",
+ "exclude": [
+ "Client/wwwroot/service-worker*.js",
+ "Client/wwwroot/manifest.json",
+ "Client/wwwroot/icon-512.png"
+ ]
+ }
+ ]
+ }
+ ],
+ "symbols": {
+ "Framework": {
+ "type": "parameter",
+ "description": "The target framework for the project.",
+ "datatype": "choice",
+ "choices": [
+ {
+ "choice": "net7.0",
+ "description": "Target net7.0"
+ }
+ ],
+ "replaces": "net7.0",
+ "defaultValue": "net7.0"
+ },
+ "HostIdentifier": {
+ "type": "bind",
+ "binding": "HostIdentifier"
+ },
+ "skipRestore": {
+ "type": "parameter",
+ "datatype": "bool",
+ "description": "If specified, skips the automatic restore of the project on create.",
+ "defaultValue": "false"
+ },
+ "Hosted": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "displayName": "ASP.NET Core _Hosted",
+ "description": "If specified, includes an ASP.NET Core host for the Blazor WebAssembly app."
+ },
+ "ExcludeLaunchSettings": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to exclude launchSettings.json from the generated template."
+ },
+ "kestrelHttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTP endpoint in launchSettings.json."
+ },
+ "kestrelHttpPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 5000,
+ "high": 5300
+ }
+ },
+ "kestrelHttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "kestrelHttpPort",
+ "fallbackVariableName": "kestrelHttpPortGenerated"
+ },
+ "replaces": "5000"
+ },
+ "kestrelHttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used."
+ },
+ "kestrelHttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 7000,
+ "high": 7300
+ }
+ },
+ "kestrelHttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "kestrelHttpsPort",
+ "fallbackVariableName": "kestrelHttpsPortGenerated"
+ },
+ "replaces": "5001"
+ },
+ "iisHttpPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json."
+ },
+ "iisHttpPortGenerated": {
+ "type": "generated",
+ "generator": "port"
+ },
+ "iisHttpPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "iisHttpPort",
+ "fallbackVariableName": "iisHttpPortGenerated"
+ },
+ "replaces": "8080"
+ },
+ "iisHttpsPort": {
+ "type": "parameter",
+ "datatype": "integer",
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used."
+ },
+ "iisHttpsPortGenerated": {
+ "type": "generated",
+ "generator": "port",
+ "parameters": {
+ "low": 44300,
+ "high": 44399
+ }
+ },
+ "iisHttpsPortReplacer": {
+ "type": "generated",
+ "generator": "coalesce",
+ "parameters": {
+ "sourceVariableName": "iisHttpsPort",
+ "fallbackVariableName": "iisHttpsPortGenerated"
+ },
+ "replaces": "44300"
+ },
+ "PWA": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "displayName": "_Progressive Web Application",
+ "description": "If specified, produces a Progressive Web Application (PWA) supporting installation and offline use."
+ },
+ "HasHttpProfile": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "true",
+ "description": "Always have HTTP profile."
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(!NoHttps)"
+ },
+ "NoHttps": {
+ "type": "parameter",
+ "datatype": "bool",
+ "defaultValue": "false",
+ "description": "Whether to turn off HTTPS."
+ },
+ "copyrightYear": {
+ "type": "generated",
+ "generator": "now",
+ "replaces": "copyrightYear",
+ "parameters": {
+ "format": "yyyy"
+ }
+ }
+ },
+ "tags": {
+ "language": "C#",
+ "type": "project"
+ },
+ "postActions": [
+ {
+ "id": "restore",
+ "condition": "(!skipRestore && Hosted)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ },
+ {
+ "id": "restoreClient",
+ "condition": "(!skipRestore && !Hosted)",
+ "description": "Restore NuGet packages required by this project.",
+ "manualInstructions": [
+ {
+ "text": "Run 'dotnet restore'"
+ }
+ ],
+ "args": {
+ "files": [ "EmptyComponentsWebAssembly-CSharp.Client.csproj" ]
+ },
+ "actionId": "210D431B-A78B-4D2F-B762-4ED3E3EA9025",
+ "continueOnError": true
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/App.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/App.razor
new file mode 100644
index 0000000000..6fd3ed1b5a
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/App.razor
@@ -0,0 +1,12 @@
+<Router AppAssembly="@typeof(App).Assembly">
+ <Found Context="routeData">
+ <RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
+ <FocusOnNavigate RouteData="@routeData" Selector="h1" />
+ </Found>
+ <NotFound>
+ <PageTitle>Not found</PageTitle>
+ <LayoutView Layout="@typeof(MainLayout)">
+ <p role="alert">Sorry, there's nothing at this address.</p>
+ </LayoutView>
+ </NotFound>
+</Router>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/MainLayout.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/MainLayout.razor
new file mode 100644
index 0000000000..a5af3489ae
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/MainLayout.razor
@@ -0,0 +1,3 @@
+@inherits LayoutComponentBase
+
+<main> @Body </main>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Pages/Index.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Pages/Index.razor
new file mode 100644
index 0000000000..cba3252e00
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Pages/Index.razor
@@ -0,0 +1,3 @@
+@page "/"
+
+<h1>Hello, world!</h1>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Program.cs
new file mode 100644
index 0000000000..e5be5e452d
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Program.cs
@@ -0,0 +1,22 @@
+using Microsoft.AspNetCore.Components.Web;
+using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
+#if (Hosted)
+using EmptyComponentsWebAssembly_CSharp.Client;
+#else
+using EmptyComponentsWebAssembly_CSharp;
+#endif
+
+var builder = WebAssemblyHostBuilder.CreateDefault(args);
+builder.RootComponents.Add<App>("#app");
+builder.RootComponents.Add<HeadOutlet>("head::after");
+
+#if (!Hosted)
+builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
+#else
+builder.Services.AddHttpClient("EmptyComponentsWebAssembly_CSharp.ServerAPI", client => client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress));
+
+// Supply HttpClient instances that include access tokens when making requests to the server project
+builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>().CreateClient("EmptyComponentsWebAssembly_CSharp.ServerAPI"));
+#endif
+
+await builder.Build().RunAsync();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json
new file mode 100644
index 0000000000..ae527fca2e
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/Properties/launchSettings.json
@@ -0,0 +1,46 @@
+{
+ "iisSettings": {
+ "iisExpress": {
+ "applicationUrl": "http://localhost:8080",
+ //#if(HasHttpsProfile)
+ "sslPort": 44300
+ //#else
+ "sslPort": 0
+ //#endif
+ }
+ },
+ "profiles": {
+ //#if (HasHttpProfile)
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/_Imports.razor b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/_Imports.razor
new file mode 100644
index 0000000000..31cd28c457
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/_Imports.razor
@@ -0,0 +1,11 @@
+@using System.Net.Http
+@using System.Net.Http.Json
+@using Microsoft.AspNetCore.Components.Routing
+@using Microsoft.AspNetCore.Components.Web
+@using Microsoft.AspNetCore.Components.WebAssembly.Http
+@using Microsoft.JSInterop
+@*#if (!Hosted)
+@using EmptyComponentsWebAssembly_CSharp
+#else
+@using EmptyComponentsWebAssembly_CSharp.Client
+#endif*@
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css
new file mode 100644
index 0000000000..3afadc202e
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/css/app.css
@@ -0,0 +1,28 @@
+#blazor-error-ui {
+ background: lightyellow;
+ bottom: 0;
+ box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
+ display: none;
+ left: 0;
+ padding: 0.6rem 1.25rem 0.7rem 1.25rem;
+ position: fixed;
+ width: 100%;
+ z-index: 1000;
+}
+
+ #blazor-error-ui .dismiss {
+ cursor: pointer;
+ position: absolute;
+ right: 0.75rem;
+ top: 0.5rem;
+ }
+
+.blazor-error-boundary {
+ background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121;
+ padding: 1rem 1rem 1rem 3.7rem;
+ color: white;
+}
+
+ .blazor-error-boundary::after {
+ content: "An error has occurred."
+ }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/icon-512.png b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/icon-512.png
new file mode 100644
index 0000000000..c2dd4842dc
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/icon-512.png
Binary files differ
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/index.html b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/index.html
new file mode 100644
index 0000000000..1cb32df1f8
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/index.html
@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta charset="utf-8" />
+ <base href="/" />
+ <link href="css/app.css" rel="stylesheet" />
+ <!--#if PWA -->
+ <link href="manifest.json" rel="manifest" />
+ <!--#endif -->
+</head>
+
+<body>
+ <div id="app">Loading...</div>
+
+ <div id="blazor-error-ui">
+ An unhandled error has occurred.
+ <a href="" class="reload">Reload</a>
+ <a class="dismiss">🗙</a>
+ </div>
+ <script src="_framework/blazor.webassembly.js"></script>
+ <!--#if PWA -->
+ <script>navigator.serviceWorker.register('service-worker.js');</script>
+ <!--#endif -->
+</body>
+
+</html>
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/manifest.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/manifest.json
new file mode 100644
index 0000000000..9548c2f65e
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/manifest.json
@@ -0,0 +1,16 @@
+{
+ "name": "EmptyComponentsWebAssembly-CSharp",
+ "short_name": "EmptyComponentsWebAssembly-CSharp",
+ "start_url": "./",
+ "display": "standalone",
+ "background_color": "#ffffff",
+ "theme_color": "#03173d",
+ "prefer_related_applications": false,
+ "icons": [
+ {
+ "src": "icon-512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ]
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.js b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.js
new file mode 100644
index 0000000000..fe614daee0
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.js
@@ -0,0 +1,4 @@
+// In development, always fetch from the network and do not enable offline support.
+// This is because caching would make development more difficult (changes would not
+// be reflected on the first load after each change).
+self.addEventListener('fetch', () => { });
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.published.js b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.published.js
new file mode 100644
index 0000000000..6b234d18f2
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Client/wwwroot/service-worker.published.js
@@ -0,0 +1,47 @@
+// Caution! Be sure you understand the caveats before publishing an application with
+// offline support. See https://aka.ms/blazor-offline-considerations
+
+self.importScripts('./service-worker-assets.js');
+self.addEventListener('install', event => event.waitUntil(onInstall(event)));
+self.addEventListener('activate', event => event.waitUntil(onActivate(event)));
+self.addEventListener('fetch', event => event.respondWith(onFetch(event)));
+
+const cacheNamePrefix = 'offline-cache-';
+const cacheName = `${cacheNamePrefix}${self.assetsManifest.version}`;
+const offlineAssetsInclude = [ /\.dll$/, /\.pdb$/, /\.wasm/, /\.html/, /\.js$/, /\.json$/, /\.css$/, /\.woff$/, /\.png$/, /\.jpe?g$/, /\.gif$/, /\.ico$/, /\.blat$/, /\.dat$/ ];
+const offlineAssetsExclude = [ /^service-worker\.js$/ ];
+
+async function onInstall(event) {
+ console.info('Service worker: Install');
+
+ // Fetch and cache all matching items from the assets manifest
+ const assetsRequests = self.assetsManifest.assets
+ .filter(asset => offlineAssetsInclude.some(pattern => pattern.test(asset.url)))
+ .filter(asset => !offlineAssetsExclude.some(pattern => pattern.test(asset.url)))
+ .map(asset => new Request(asset.url, { integrity: asset.hash, cache: 'no-cache' }));
+ await caches.open(cacheName).then(cache => cache.addAll(assetsRequests));
+}
+
+async function onActivate(event) {
+ console.info('Service worker: Activate');
+
+ // Delete unused caches
+ const cacheKeys = await caches.keys();
+ await Promise.all(cacheKeys
+ .filter(key => key.startsWith(cacheNamePrefix) && key !== cacheName)
+ .map(key => caches.delete(key)));
+}
+
+async function onFetch(event) {
+ let cachedResponse = null;
+ if (event.request.method === 'GET') {
+ // For all navigation requests, try to serve index.html from cache
+ const shouldServeIndexHtml = event.request.mode === 'navigate';
+
+ const request = shouldServeIndexHtml ? 'index.html' : event.request;
+ const cache = await caches.open(cacheName);
+ cachedResponse = await cache.match(request);
+ }
+
+ return cachedResponse || fetch(event.request);
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/EmptyComponentsWebAssembly-CSharp.sln b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/EmptyComponentsWebAssembly-CSharp.sln
new file mode 100644
index 0000000000..f30f423de2
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/EmptyComponentsWebAssembly-CSharp.sln
@@ -0,0 +1,64 @@
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.0.0
+MinimumVisualStudioVersion = 16.0.0.0
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EmptyComponentsWebAssembly-CSharp.Server", "Server\EmptyComponentsWebAssembly-CSharp.Server.csproj", "{650B3CE7-2E93-4CC4-9F46-466686815EAA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EmptyComponentsWebAssembly-CSharp.Client", "Client\EmptyComponentsWebAssembly-CSharp.Client.csproj", "{5990939C-7E7B-4CFA-86FF-44CA5756498A}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EmptyComponentsWebAssembly-CSharp.Shared", "Shared\EmptyComponentsWebAssembly-CSharp.Shared.csproj", "{0AFFA7FD-4E37-4636-AB91-3753E746DB98}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
+ Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Debug|x64.Build.0 = Debug|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Debug|x86.Build.0 = Debug|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Release|x64.ActiveCfg = Release|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Release|x64.Build.0 = Release|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Release|x86.ActiveCfg = Release|Any CPU
+ {5990939C-7E7B-4CFA-86FF-44CA5756498A}.Release|x86.Build.0 = Release|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Debug|x64.Build.0 = Debug|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Debug|x86.Build.0 = Debug|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Release|x64.ActiveCfg = Release|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Release|x64.Build.0 = Release|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Release|x86.ActiveCfg = Release|Any CPU
+ {650B3CE7-2E93-4CC4-9F46-466686815EAA}.Release|x86.Build.0 = Release|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Debug|x64.Build.0 = Debug|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Debug|x86.Build.0 = Debug|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Release|x64.ActiveCfg = Release|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Release|x64.Build.0 = Release|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Release|x86.ActiveCfg = Release|Any CPU
+ {0AFFA7FD-4E37-4636-AB91-3753E746DB98}.Release|x86.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {4C26868E-5E7C-458D-82E3-040509D0C71F}
+ EndGlobalSection
+EndGlobal
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Program.cs
new file mode 100644
index 0000000000..a8e63acaf0
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Program.cs
@@ -0,0 +1,33 @@
+using Microsoft.AspNetCore.ResponseCompression;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services.AddControllersWithViews();
+builder.Services.AddRazorPages();
+
+var app = builder.Build();
+
+// Configure the HTTP request pipeline.
+if (app.Environment.IsDevelopment())
+{
+ app.UseWebAssemblyDebugging();
+}
+#if (HasHttpsProfile)
+else
+{
+ // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+ app.UseHsts();
+}
+
+app.UseHttpsRedirection();
+#endif
+app.UseBlazorFrameworkFiles();
+app.UseStaticFiles();
+
+app.UseRouting();
+
+app.MapRazorPages();
+app.MapControllers();
+app.MapFallbackToFile("index.html");
+
+app.Run();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json
new file mode 100644
index 0000000000..084a9762a2
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/Properties/launchSettings.json
@@ -0,0 +1,44 @@
+{
+ "iisExpress": {
+ "applicationUrl": "http://localhost:8080",
+ //#if (HasHttpsProfile)
+ "sslPort": 44300
+ //#else
+ "sslPort": 0
+ //#endif
+ },
+ "profiles": {
+ //#if (HasHttpProfile)
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.Development.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.Development.json
new file mode 100644
index 0000000000..0c208ae918
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.json
new file mode 100644
index 0000000000..10f68b8c8b
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Server/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Shared/SharedClass.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Shared/SharedClass.cs
new file mode 100644
index 0000000000..bb016a89ad
--- /dev/null
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyComponentsWebAssembly-CSharp/Shared/SharedClass.cs
@@ -0,0 +1 @@
+/* Shared classes can be referenced by both the Client and Server */
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/ide.host.json
index f30c4753e2..8cee32047e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/ide.host.json
@@ -1,29 +1,14 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 100,
"icon": "ide/Empty.png",
"supportsDocker": true,
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"symbolInfo": [
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
],
"disableHttpsSymbol": "NoHttps"
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.cs.json
index 95327d453e..8aa9597162 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core (prázdné)",
+ "description": "Prázdná šablona projektu pro vytvoření aplikace ASP.NET Core. V této šabloně není žádný obsah.",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají Individual, IndividualB2C, SingleOrg ani MultiOrg.",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.de.json
index 95327d453e..f21d455680 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core leer",
+ "description": "Eine leere Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung. Diese Vorlage umfasst keine Inhalte.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn Individual, IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.en.json
index 764a457bb1..c387db66e8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.en.json
@@ -11,8 +11,9 @@
"symbols/Framework/choices/net7.0/description": "Target net7.0",
"symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
"symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.es.json
index 95327d453e..fa39aa6344 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core vacío",
+ "description": "Una plantilla de proyecto vacía para crear una aplicación ASP.NET Core. Esta plantilla no incluye ningún contenido.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS. Esta opción solo se aplica si Individual, IndividualB2C, SingleOrg o MultiOrg no se usan para --auth.",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.fr.json
index 95327d453e..b1e871e547 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core vide",
+ "description": "Modèle de projet vide pour la création d'une application ASP.NET Core. Ce modèle n'a aucun contenu.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si Individual, IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.it.json
index 95327d453e..c1e841d589 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET core vuoto",
+ "description": "Modello di progetto vuoto per la creazione di un'applicazione ASP.NET Core. Questo modello non include alcun contenuto.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se Individual, IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ja.json
index 95327d453e..bd68175fa8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core (空)",
+ "description": "ASP.NET Core アプリケーションを作成するための空のプロジェクト テンプレートです。このテンプレートにはコンテンツが一切含まれていません。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、Individual、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ko.json
index 95327d453e..6a6568c81a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 비어 있음",
+ "description": "ASP.NET Core 애플리케이션을 만들기 위한 빈 프로젝트 템플릿입니다. 이 템플릿에는 내용이 없습니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 Individual, IndividualB2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pl.json
index 95327d453e..6ceb624175 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core — puste",
+ "description": "Pusty szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core. Ten szablon nie ma żadnej zawartości.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany (parametr no-https zostanie zignorowany, jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth, parametr no-https zostanie zignorowana).",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy dla uwierzytelniania --auth nie są używane elementy Individual, IndividualB2C, SingleOrg lub MultiOrg.",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 95327d453e..f3dffffb82 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Vazio",
+ "description": "Um modelo de projeto vazio para a criação de um aplicativo ASP.NET Core. Esse modelo não tem nenhum conteúdo.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção se aplica somente se Individual, IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ru.json
index 95327d453e..648dd0e488 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,18 +1,18 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Пустой шаблон ASP.NET Core",
+ "description": "Пустой шаблон проекта для создания приложения ASP.NET Core. Этот шаблон не имеет содержимого.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются Individual, IndividualB2C, SingleOrg или MultiOrg.",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.tr.json
index 95327d453e..4c5227bab8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Boş",
+ "description": "ASP.NET Core uygulaması oluşturmaya yönelik boş bir proje şablonu. Bu şablonda içerik yoktur.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca Bireysel, IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 95327d453e..1a0fdda7ff 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 空",
+ "description": "用于创建 ASP.NET Core 应用程序的空项目模板。此模板中没有任何内容。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 95327d453e..db89aa54d1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,18 +1,18 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "空的 ASP.NET Core",
+ "description": "可用於建立 ASP.NET Core 應用程式的空白專案範本。此範本不含任何內容。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 Individual、IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json
index 9accfeb934..3b20b60fb2 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/.template.config/template.json
@@ -166,6 +166,10 @@
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
},
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(!NoHttps)"
+ },
"NoHttps": {
"type": "parameter",
"datatype": "bool",
@@ -176,7 +180,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json
index e341bf4f8f..4ec0a09b44 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-CSharp/Properties/launchSettings.json
@@ -9,27 +9,34 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(NoHttps)
- "sslPort": 0
- //#else
+ //#if (HasHttpsProfile)
"sslPort": 44300
+ //#else
+ "sslPort": 0
//#endif
}
},
"profiles": {
- "Company.WebApplication1": {
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(NoHttps)
"applicationUrl": "http://localhost:5000",
- //#else
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/ide.host.json
index dfafbe9e52..017d2f070d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/ide.host.json
@@ -1,24 +1,7 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 101,
"icon": "ide/Empty.png",
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- }
- ],
"supportsDocker": true,
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"disableHttpsSymbol": "NoHttps"
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.cs.json
index f0366911c0..a055a96e57 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.cs.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core (prázdné)",
+ "description": "Prázdná šablona projektu pro vytvoření aplikace ASP.NET Core. V této šabloně není žádný obsah.",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají Individual, IndividualB2C, SingleOrg ani MultiOrg.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.de.json
index f0366911c0..eab716bc6d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.de.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core leer",
+ "description": "Eine leere Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung. Diese Vorlage umfasst keine Inhalte.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn Individual, IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.es.json
index f0366911c0..2de9b7532d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.es.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core vacío",
+ "description": "Una plantilla de proyecto vacía para crear una aplicación ASP.NET Core. Esta plantilla no incluye ningún contenido.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS. Esta opción solo se aplica si Individual, IndividualB2C, SingleOrg o MultiOrg no se usan para --auth.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.fr.json
index f0366911c0..62d38067f4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.fr.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core vide",
+ "description": "Modèle de projet vide pour la création d'une application ASP.NET Core. Ce modèle n'a aucun contenu.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si Individual, IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.it.json
index f0366911c0..3c25673cdd 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.it.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET core vuoto",
+ "description": "Modello di progetto vuoto per la creazione di un'applicazione ASP.NET Core. Questo modello non include alcun contenuto.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se Individual, IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ja.json
index f0366911c0..7758157077 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ja.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core (空)",
+ "description": "ASP.NET Core アプリケーションを作成するための空のプロジェクト テンプレートです。このテンプレートにはコンテンツが一切含まれていません。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、Individual、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ko.json
index f0366911c0..fa5625ec6e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ko.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 비어 있음",
+ "description": "ASP.NET Core 애플리케이션을 만들기 위한 빈 프로젝트 템플릿입니다. 이 템플릿에는 내용이 없습니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 Individual, IndividualB2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pl.json
index f0366911c0..1f51e77ba0 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pl.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core — puste",
+ "description": "Pusty szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core. Ten szablon nie ma żadnej zawartości.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany (parametr no-https zostanie zignorowany, jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth, parametr no-https zostanie zignorowana).",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy dla uwierzytelniania --auth nie są używane elementy Individual, IndividualB2C, SingleOrg lub MultiOrg.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json
index f0366911c0..b4e8792203 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Vazio",
+ "description": "Um modelo de projeto vazio para a criação de um aplicativo ASP.NET Core. Esse modelo não tem nenhum conteúdo.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção se aplica somente se Individual, IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ru.json
index f0366911c0..098b347d83 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.ru.json
@@ -1,16 +1,16 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Пустой шаблон ASP.NET Core",
+ "description": "Пустой шаблон проекта для создания приложения ASP.NET Core. Этот шаблон не имеет содержимого.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются Individual, IndividualB2C, SingleOrg или MultiOrg.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.tr.json
index f0366911c0..822f81f961 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.tr.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Boş",
+ "description": "ASP.NET Core uygulaması oluşturmaya yönelik boş bir proje şablonu. Bu şablonda içerik yoktur.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca Bireysel, IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json
index f0366911c0..5c08f45bfb 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 空",
+ "description": "用于创建 ASP.NET Core 应用程序的空项目模板。此模板中没有任何内容。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json
index f0366911c0..221365eaf5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Empty",
- "description": "An empty project template for creating an ASP.NET Core application. This template does not have any content in it.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "空的 ASP.NET Core",
+ "description": "可用於建立 ASP.NET Core 應用程式的空白專案範本。此範本不含任何內容。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 Individual、IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json
index 24de700436..166af6a0cc 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/.template.config/template.json
@@ -147,6 +147,10 @@
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
},
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(!NoHttps)"
+ },
"NoHttps": {
"type": "parameter",
"datatype": "bool",
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json
index 8ac0e66ef4..344ad9e5c3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/EmptyWeb-FSharp/Properties/launchSettings.json
@@ -4,27 +4,34 @@
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(NoHttps)
- "sslPort": 0
- //#else
+ //#if (HasHttpsProfile)
"sslPort": 44300
+ //#else
+ "sslPort": 0
//#endif
}
},
"profiles": {
- "Company.WebApplication1": {
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(NoHttps)
"applicationUrl": "http://localhost:5000",
- //#else
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/ide.host.json
index 5c3a869512..77451b983c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/ide.host.json
@@ -1,12 +1,14 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 500,
"icon": "ide/gRPC.png",
"supportsDocker": true,
"symbolInfo": [
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
]
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.cs.json
index eec915b973..d4a0641073 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Služba ASP.NET Core gRPC",
+ "description": "Šablona projektu pro vytvoření služby gRPC ASP.NET Core",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.de.json
index eec915b973..c7b94dc09b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core-gRPC-Dienst",
+ "description": "Eine Projektvorlage für das Erstellen eines gRPC-ASP.NET Core-Diensts.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.en.json
index a1f2262d3d..9adf380f37 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.en.json
@@ -8,8 +8,9 @@
"symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
"symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
"symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.es.json
index eec915b973..cdf3b921c1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Servicio gRPC de ASP.NET Core",
+ "description": "Plantilla de proyecto para crear un servicio gRPC de ASP.NET Core.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.fr.json
index eec915b973..a130e15d96 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Service gRPC ASP.NET Core",
+ "description": "Modèle de projet pour la création d'un service gRPC ASP.NET Core.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.it.json
index eec915b973..83a78afb12 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Servizio gRPC ASP.NET Core",
+ "description": "Modello di progetto per la creazione di un servizio ASP.NET Core gRPC.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ja.json
index eec915b973..14fb1a5f09 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core gRPC サービス",
+ "description": "gRPC ASP.NET Core サービスを作成するためのプロジェクト テンプレート。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ko.json
index eec915b973..334501086a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core gRPC 서비스",
+ "description": "gRPC ASP.NET Core 서비스를 만들기 위한 프로젝트 템플릿입니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pl.json
index eec915b973..70d76be0c1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Usługa gRPC platformy ASP.NET Core",
+ "description": "Szablon projektu służący do tworzenia usługi gRPC platformy ASP.NET Core.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany (parametr no-https zostanie zignorowany, jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth).",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pt-BR.json
index eec915b973..c684589bc4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Serviço gRPC do ASP.NET Core",
+ "description": "Um modelo de projeto para criar um serviço gRPC ASP.NET Core.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ru.json
index eec915b973..bf063f906c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,15 +1,15 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Служба gRPC ASP.NET Core",
+ "description": "Шаблон проекта для создания службы gRPC ASP.NET Core.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.tr.json
index eec915b973..5457fd7a9d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core gRPC Hizmeti",
+ "description": "gRPC ASP.NET Core hizmeti oluşturmaya yönelik proje şablonu.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index eec915b973..e4391d395e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core gRPC 服务",
+ "description": "用于创建 gRPC ASP.NET Core 服务的项目模板。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index eec915b973..4d7f0fd62d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,15 +1,15 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core gRPC Service",
- "description": "A project template for creating a gRPC ASP.NET Core service.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core gRPC 服務",
+ "description": "用來建立 gRPC ASP.NET Core 服務的專案範本。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/template.json
index 9b1f90bc5b..0641a71422 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/.template.config/template.json
@@ -122,7 +122,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Program.Main.cs
index ec1af1a7e9..04fc97d104 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Program.Main.cs
@@ -1,6 +1,6 @@
using GrpcService_CSharp.Services;
-namespace Company.WebApplication1;
+namespace GrpcService_CSharp;
public class Program
{
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Properties/launchSettings.json
index e27b596327..01dd5f0d40 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/GrpcService-CSharp/Properties/launchSettings.json
@@ -1,10 +1,19 @@
{
"profiles": {
- "GrpcService-CSharp": {
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
- "applicationUrl": "http://localhost:5000;https://localhost:5001",
+ "applicationUrl": "http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": false,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/ide.host.json
index 431a939c49..ddedfbd61a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/ide.host.json
@@ -1,11 +1,12 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 700,
"icon": "ide/RazorClassLibrary.ico",
"symbolInfo": [
{
"id": "SupportPagesAndViews",
- "isVisible": "true"
+ "isVisible": true,
+ "persistenceScope": "templateGroup"
}
]
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.cs.json
index 1888d9ed69..47e7a168ad 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Knihovna tříd Razor",
+ "description": "Projekt pro vytvoření knihovny tříd Razor určené pro .NET Standard",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/SupportPagesAndViews/displayName": "Stránky podpory a zobrazení",
+ "symbols/SupportPagesAndViews/description": "Určuje, jestli se kromě komponent má podporovat přidávání dalších stránek a zobrazení Razor do této knihovny.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore",
+ "postActions/openInEditor/description": "Otevře soubor areas/MyFeature/Pages/Page1.cshtml v editoru."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.de.json
index 1888d9ed69..90d0b9294f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "Razor Klassenbibliothek",
+ "description": "Ein Projekt zum Erstellen einer Razor Klassenbibliothek, die auf .NET Standard abzielt",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/SupportPagesAndViews/displayName": "Seiten und Ansichten unterstützen",
+ "symbols/SupportPagesAndViews/description": "Ob das Hinzufügen herkömmlicher Razor Seiten und Ansichten zusätzlich zu Komponenten zu dieser Bibliothek unterstützt werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen",
+ "postActions/openInEditor/description": "Öffnet Areas/MyFeature/Pages/Page1.cshtml im Editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.es.json
index 1888d9ed69..ab8a499fac 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Biblioteca de clases de Razor",
+ "description": "Proyecto para crear una biblioteca de clases de Razor para .NET Standard",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/SupportPagesAndViews/displayName": "Páginas y vistas de soporte técnico",
+ "symbols/SupportPagesAndViews/description": "Indica si se admite la adición de vistas y Razor Pages tradicionales además de componentes a esta biblioteca.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\"",
+ "postActions/openInEditor/description": "Abre Areas/MyFeature/Pages/Page1.cshtml en el editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.fr.json
index 1888d9ed69..7520a2e6a6 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Bibliothèque de classes Razor",
+ "description": "Projet de création d'une bibliothèque de classes Razor qui cible .NET Standard",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/SupportPagesAndViews/displayName": "Prendre en charge les pages et les vues",
+ "symbols/SupportPagesAndViews/description": "Indique si l'ajout de pages et de vues Razor classiques en plus des composants de cette bibliothèque doit être pris en charge.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »",
+ "postActions/openInEditor/description": "Ouvre Areas/MyFeature/Pages/Page1.cshtml dans l’éditeur"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.it.json
index 1888d9ed69..f34794678c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Libreria di classi Razor",
+ "description": "Progetto per la creazione di una libreria di classi Razor destinata a .NET Standard",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/SupportPagesAndViews/displayName": "Supporta pagine e visualizzazioni",
+ "symbols/SupportPagesAndViews/description": "Indica se supportare l'aggiunta di pagine e visualizzazioni Razor tradizionali oltre ai componenti di questa libreria",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'",
+ "postActions/openInEditor/description": "Apre Areas/MyFeature/Pages/Page1.cshtml nell'editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ja.json
index 1888d9ed69..172e850cbf 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Razor クラス ライブラリ",
+ "description": ".NET Standard を対象とする Razor クラス ライブラリを作成するためのプロジェクト",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/SupportPagesAndViews/displayName": "サポート ページとビュー",
+ "symbols/SupportPagesAndViews/description": "このライブラリに対して、コンポーネントだけでなく、従来の Razor ページとビューの追加をサポートするかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する",
+ "postActions/openInEditor/description": "エディターで Areas/MyFeature/Pages/Page1.cshtml を開きます"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ko.json
index 1888d9ed69..8ea5c9c6ac 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Razor 클래스 라이브러리",
+ "description": ".NET Standard를 대상으로 하는 Razor 클래스 라이브러리를 만드는 데 사용되는 프로젝트",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/SupportPagesAndViews/displayName": "지원 페이지 및 보기",
+ "symbols/SupportPagesAndViews/description": "이 라이브러리에 구성 요소 외에 기존 Razor 페이지 및 보기 추가를 지원할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행",
+ "postActions/openInEditor/description": "편집기에서 Areas/MyFeature/Pages/Page1.cshtml을 엽니다."
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pl.json
index 1888d9ed69..a637d26b8a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Biblioteka klas Razor",
+ "description": "Projekt służący do tworzenia biblioteki klas Razor przeznaczonej dla platformy .NET Standard",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/SupportPagesAndViews/displayName": "Strony i widoki pomocy technicznej",
+ "symbols/SupportPagesAndViews/description": "Określa, czy ma być obsługiwane dodawanie tradycyjnych stron i widoków Razor do składników w tej bibliotece.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\"",
+ "postActions/openInEditor/description": "Otwiera plik Areas/MyFeature/Pages/Page1.cshtml w edytorze"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 1888d9ed69..562ff853e1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Biblioteca de Classes Razor",
+ "description": "Um projeto para criar uma biblioteca de classes Razor direcionada ao .NET Standard",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/SupportPagesAndViews/displayName": "Páginas e visualizações de suporte",
+ "symbols/SupportPagesAndViews/description": "Se deve dar suporte à adição de páginas e exibições tradicionais do Razor, além de componentes, a esta biblioteca.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'",
+ "postActions/openInEditor/description": "Abre Areas/MyFeature/Pages/Page1.cshtml no editor"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ru.json
index 1888d9ed69..70b30f907b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,13 +1,13 @@
-{
- "author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+{
+ "author": "Майкрософт",
+ "name": "Библиотека классов Razor",
+ "description": "Проект для создания библиотеки классов Razor, предназначенной для .NET Standard",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/SupportPagesAndViews/displayName": "Поддержка страниц и представлений",
+ "symbols/SupportPagesAndViews/description": "Следует ли поддерживать добавление традиционных страниц и представлений Razor в дополнение к компонентам в этой библиотеке.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\"",
+ "postActions/openInEditor/description": "Открывает Areas/MyFeature/Pages/Page1.cshtml в редакторе"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.tr.json
index 1888d9ed69..6911a5b9d8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Razor Sınıf Kitaplığı",
+ "description": ".NET Standard’ı hedefleyen bir Razor sınıf kitaplığı oluşturmaya yönelik proje",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/SupportPagesAndViews/displayName": "Destek sayfaları ve görünümleri",
+ "symbols/SupportPagesAndViews/description": "Bu kitaplığa yönelik bileşenlere ek olarak, geleneksel Razor sayfaları ve görünümleri eklemenin desteklenip desteklenmeyeceği.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır",
+ "postActions/openInEditor/description": "Düzenleyicide Areas/MyFeature/Pages/Page1.cshtml dosyasını açar"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 1888d9ed69..6d0c45b336 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Razor 类库",
+ "description": "用于创建目标为 .NET Standard 的 Razor 类库的项目",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/SupportPagesAndViews/displayName": "支持页面和视图",
+ "symbols/SupportPagesAndViews/description": "是否支持将除组件之外的传统 Razor 页面和视图添加到此库。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\"",
+ "postActions/openInEditor/description": "在编辑器中打开 Areas/MyFeature/Pages/Page1.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 1888d9ed69..00c1334d2c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorClassLibrary-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Razor Class Library",
- "description": "A project for creating a Razor class library that targets .NET Standard",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/SupportPagesAndViews/displayName": "Support pages and views",
- "symbols/SupportPagesAndViews/description": "Whether to support adding traditional Razor pages and Views in addition to components to this library.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'",
- "postActions/openInEditor/description": "Opens Areas/MyFeature/Pages/Page1.cshtml in the editor"
+ "name": "Razor 類別庫",
+ "description": "用於建立以 .NET Standard 為目標之 Razor 類別庫的專案",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/SupportPagesAndViews/displayName": "支援頁面及檢視",
+ "symbols/SupportPagesAndViews/description": "除了元件之外,是否支援將傳統 Razor 頁面及檢視新增至此程式庫。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'",
+ "postActions/openInEditor/description": "在編輯器中開啟 Areas/MyFeature/Pages/Page1.cshtml"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/ide.host.json
index 0dc542e09b..2cad4092ab 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/ide.host.json
@@ -1,53 +1,14 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 400,
"icon": "ide/WebApplication.png",
"supportsDocker": true,
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "CloudExisting"
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "Local"
- },
- {
- "auth": "SingleOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "SSO"
- },
- {
- "auth": "MultiOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "MultiOrg"
- },
- {
- "auth": "Windows",
- "authenticationType": "WindowsAuth"
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"symbolInfo": [
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
],
"disableHttpsSymbol": "NoHttps"
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.cs.json
index 815f7d8cab..a5fcca4dc3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Webová aplikace ASP.NET Core",
+ "description": "Šablona projektu pro vytvoření aplikace ASP.NET Core s ukázkou obsahu ASP.NET Core Razor Pages",
+ "symbols/auth/choices/None/description": "Bez ověřování",
+ "symbols/auth/choices/Individual/description": "Ověřování Individual",
+ "symbols/auth/choices/IndividualB2C/description": "Ověřování Individual pomocí Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Ověřování organizace pro jednoho tenanta",
+ "symbols/auth/choices/MultiOrg/description": "Ověřování organizace pro více tenantů",
+ "symbols/auth/choices/Windows/description": "Integrované ověřování Windows",
+ "symbols/auth/description": "Typ ověřování, který se má použít",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C, ke které se chcete připojit (používá se s ověřováním IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID zásad přihlašování a registrace pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Zpětné volání globálního odhlášení (používá se s ověřováním IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID zásad resetování hesla pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID zásad úprav profilu pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory, ke které se chcete připojit (používá se s ověřováním SingleOrg nebo MultiOrg).",
+ "symbols/ClientId/description": "ID klienta pro tento projekt (používá se s ověřováním IndividualB2C, SingleOrg nebo MultiOrg).",
+ "symbols/Domain/description": "Doména pro tenanta adresáře (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/TenantId/description": "TenantId adresáře, ke kterému se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/CallbackPath/description": "Cesta žádosti v rámci základní cesty aplikace k identifikátoru URI pro přesměrování (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Určuje, jestli se této aplikaci povolí přístup ke čtení adresáře (platí jenom pro ověřování SingleOrg nebo MultiOrg).",
+ "symbols/UserSecretsId/description": "ID, které se má použít pro tajné kódy (používá se s ověřováním OrgReadAccess nebo Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má ve vygenerované šabloně vyloučit soubor launchSettings.json.",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají IndividualB2C, SingleOrg ani MultiOrg.",
+ "symbols/UseLocalDB/description": "Určuje, jestli se má použít LocalDB namísto SQLite. Tato možnost platí jenom v případě, že je zadáno --auth Individual nebo --auth IndividualB2C.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/CalledApiUrl/description": "Adresa URL rozhraní API, která se má volat z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Určuje, jestli webová aplikace volá Microsoft Graph. Tato možnost platí pouze v případě, že je zadáno --auth SingleOrg nebo --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Obory, které se mají požádat o volání rozhraní API z webové aplikace Tato možnost platí jenom v případě, že je zadaná možnost --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.de.json
index 815f7d8cab..e7bc43eb64 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
+ "description": "Eine Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung mit Beispielinhalten für ASP.NET Core Razor Pages",
+ "symbols/auth/choices/None/description": "Keine Authentifizierung",
+ "symbols/auth/choices/Individual/description": "Individuelle Authentifizierung",
+ "symbols/auth/choices/IndividualB2C/description": "Individuelle Authentifizierung mit Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Organisationsauthentifizierung für einen einzelnen Mandanten",
+ "symbols/auth/choices/MultiOrg/description": "Organisationsauthentifizierung für mehrere Mandanten",
+ "symbols/auth/choices/Windows/description": "Windows-Authentifizierung",
+ "symbols/auth/description": "Der zu verwendende Authentifizierungstyp",
+ "symbols/AAdB2CInstance/description": "Die Azure Active Directory B2C-Instanz, mit der eine Verbindung hergestellt werden soll (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/SignUpSignInPolicyId/description": "Die Anmelde und Registrierungsrichtlinien ID für dieses Projekt (mit IndividualB2C Authentifizierung verwenden).",
+ "symbols/SignedOutCallbackPath/description": "Der Rückruf für die globale Abmeldung (mit individueller B2C Authentifizierung verwenden).",
+ "symbols/ResetPasswordPolicyId/description": "Die Richtlinien ID zum Zurücksetzen des Kennworts für dieses Projekt (mit individueller B2C Authentifizierung verwenden).",
+ "symbols/EditProfilePolicyId/description": "Die Bearbeitungsprofil-Richtlinien-ID für dieses Projekt (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/AADInstance/description": "Die Azure Active Directory-Instanz, mit der eine Verbindung hergestellt werden soll (mit SingleOrg oder MultiOrg Authentifizierung verwenden).",
+ "symbols/ClientId/description": "Die Client ID für dieses Projekt (mit IndividualB2C, SingleOrg oder MultiOrg Authentifizierung verwenden).",
+ "symbols/Domain/description": "Die Domäne für den Verzeichnismandanten (mit SingleOrg oder IndividualB2C Authentifizierung verwenden).",
+ "symbols/TenantId/description": "Die TenantId ID des Verzeichnisses, mit dem eine Verbindung hergestellt werden soll (mit SingleOrg Authentifizierung verwenden).",
+ "symbols/CallbackPath/description": "Der Anforderungspfad innerhalb des Basispfads der Anwendung des Umleitungs-URI (mit SingleOrg- oder IndividualB2C-Authentifizierung verwenden).",
+ "symbols/OrgReadAccess/description": "Ob dieser Anwendung Lesezugriff auf das Verzeichnis gewährt werden soll oder nicht (gilt nur für SingleOrg- oder MultiOrg-Authentifizierung).",
+ "symbols/UserSecretsId/description": "Die für Geheimnisse zu verwendende ID (Verwendung mit OrgReadAccess oder Einzelauthentifizierung).",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json in der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS-Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "symbols/UseLocalDB/description": "Ob LocalDB anstelle von SQLite verwendet werden soll. Diese Option gilt nur, wenn --auth Individual oder --auth IndividualB2C angegeben ist.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/CalledApiUrl/description": "URL der API, die von der Web-App aufgerufen werden soll. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/CallsMicrosoftGraph/description": "Gibt an, ob die Web-App Microsoft Graph aufruft. Diese Option gilt nur, wenn --auth SingleOrg oder --auth MultiOrg angegeben ist.",
+ "symbols/CalledApiScopes/description": "Anzufordernde Bereiche zum Aufrufen der API von der Web-App. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.en.json
index d9e25f82e1..cdf37104e4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.en.json
@@ -24,18 +24,19 @@
"symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
"symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
"symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
"symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
"symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
"symbols/Framework/description": "The target framework for the project.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
"symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
"symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
"symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.es.json
index 815f7d8cab..bb953bd20c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicación web de ASP.NET Core",
+ "description": "Una plantilla de proyecto para crear una aplicación ASP.NET Core con contenido de Razor Pages de ASP.NET Core de ejemplo.",
+ "symbols/auth/choices/None/description": "Sin autenticación",
+ "symbols/auth/choices/Individual/description": "Autenticación individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticación individual con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticación organizacional para un único inquilino",
+ "symbols/auth/choices/MultiOrg/description": "Autenticación organizacional para varios inquilinos",
+ "symbols/auth/choices/Windows/description": "Autenticación de Windows",
+ "symbols/auth/description": "El tipo de autenticación que se va a usar",
+ "symbols/AAdB2CInstance/description": "Instancia de Azure Active Directory B2C a la que conectarse (se usa con la autenticación IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Id. de la directiva de inicio de sesión y registro para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Devolución de llamada de cierre de sesión global (se usa con la autenticación IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Id. de directiva de restablecimiento de contraseña para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Id. de la directiva de perfil de edición para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/AADInstance/description": "Instancia de Azure Active Directory a la que se va a conectar (se usa con la autenticación SingleOrg o MultiOrg).",
+ "symbols/ClientId/description": "Id. de cliente de este proyecto (se usa con la autenticación IndividualB2C, SingleOrg o MultiOrg).",
+ "symbols/Domain/description": "Dominio del inquilino de directorio (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/TenantId/description": "Id. de TenantId del directorio al que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/CallbackPath/description": "Ruta de acceso de solicitud dentro de la ruta de acceso base de la aplicación del URI de redireccionamiento (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indica si se va a permitir o no el acceso de lectura de esta aplicación al directorio (solo se aplica a la autenticación SingleOrg o MultiOrg).",
+ "symbols/UserSecretsId/description": "Id. que se va a usar para los secretos (se usa con OrgReadAccess o con la autenticación individual).",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json en la plantilla generada.",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Ya sea para desactivar HTTPS. Esta opción solo se aplica si no se utilizan IndividualB2C, SingleOrg o MultiOrg para --auth.",
+ "symbols/UseLocalDB/description": "Indica si se va a usar LocalDB en lugar de SQLite. Esta opción solo se aplica si se especifica --auth Individual o --auth IndividualB2C.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/CalledApiUrl/description": "Dirección URL de la API a la que se va a llamar desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica si la aplicación web llama a Microsoft Graph. Esta opción solo se aplica si se especifica --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ámbitos para solicitar llamar a la API desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.fr.json
index 815f7d8cab..29d77d9e3b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Application web ASP.NET Core",
+ "description": "Modèle de projet pour la création d’une application ASP.NET Core avec un exemple de contenu ASP.NET Core Razor Pages",
+ "symbols/auth/choices/None/description": "Aucune authentification",
+ "symbols/auth/choices/Individual/description": "Authentification individuelle",
+ "symbols/auth/choices/IndividualB2C/description": "Authentification individuelle avec Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Authentification organisationnelle pour un seul locataire",
+ "symbols/auth/choices/MultiOrg/description": "Authentification organisationnelle pour plusieurs locataires",
+ "symbols/auth/choices/Windows/description": "Authentification Windows",
+ "symbols/auth/description": "Type d’authentification à utiliser",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C à laquelle se connecter (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID de stratégie de connexion et d’inscription pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Rappel de déconnexion global (utilisé avec l’authentification IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID de stratégie de réinitialisation de mot de passe pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID de stratégie de modification de profil pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory à laquelle se connecter (à utiliser avec l’authentification SingleOrg ou MultiOrg).",
+ "symbols/ClientId/description": "ID client de ce projet (à utiliser avec l’authentification IndividualB2C, SingleOrg ou MultiOrg).",
+ "symbols/Domain/description": "Domaine du locataire d’annuaire (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/TenantId/description": "ID TenantId du répertoire auquel se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/CallbackPath/description": "Chemin de la demande dans le chemin de base de l’application de l’URI de redirection (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indique si cette application doit autoriser ou non l’accès en lecture à l’annuaire (s’applique uniquement à l’authentification SingleOrg ou MultiOrg).",
+ "symbols/UserSecretsId/description": "ID à utiliser pour les secrets (à utiliser avec OrgReadAccess ou l’authentification individuelle).",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json dans le modèle généré.",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https est ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "symbols/UseLocalDB/description": "Indique s’il faut utiliser localDB au lieu de SQLite. Cette option s’applique uniquement si --auth Individual ou --auth IndividualB2C est spécifié.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/CalledApiUrl/description": "URL de l’API à appeler à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/CallsMicrosoftGraph/description": "Spécifie si l’application web appelle Microsoft Graph. Cette option s’applique uniquement si --auth SingleOrg ou --auth MultiOrg est spécifié.",
+ "symbols/CalledApiScopes/description": "Étendues pour demander à appeler l’API à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.it.json
index 815f7d8cab..24341fb0ae 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "App Web ASP.NET Core",
+ "description": "Modello di progetto per la creazione di un'applicazione ASP.NET Core con contenuto Razor Pages ASP.NET Core di esempio.",
+ "symbols/auth/choices/None/description": "Nessuna autenticazione",
+ "symbols/auth/choices/Individual/description": "Autenticazione singola",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticazione singola con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticazione organizzativa per un singolo tenant",
+ "symbols/auth/choices/MultiOrg/description": "Autenticazione dell'organizzazione per più tenant",
+ "symbols/auth/choices/Windows/description": "Autenticazione di Windows",
+ "symbols/auth/description": "Tipo di autenticazione da usare.",
+ "symbols/AAdB2CInstance/description": "Istanza di Azure Active Directory B2C a cui connettersi (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID dei criteri di accesso e iscrizione per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Callback di disconnessione globale (usare con l'autenticazione IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID dei criteri di reimpostazione della password per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID dei criteri del profilo di modifica per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/AADInstance/description": "Istanza di Azure Active Directory a cui connettersi (usare con l'autenticazione SingleOrg o MultiOrg).",
+ "symbols/ClientId/description": "ID client per questo progetto (usare con l'autenticazione IndividualB2C, SingleOrg o MultiOrg).",
+ "symbols/Domain/description": "Il dominio per il tenant della directory (da usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/TenantId/description": "ID TenantId della directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/CallbackPath/description": "Percorso della richiesta all'interno del percorso di base dell'applicazione dell'URI di reindirizzamento (usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indica se consentire o meno a questa applicazione l'accesso in lettura alla directory (si applica solo all'autenticazione SingleOrg o MultiOrg).",
+ "symbols/UserSecretsId/description": "ID da usare per i segreti (usare con OrgReadAccess o l'autenticazione singola).",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si utilizza IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "symbols/UseLocalDB/description": "Indica se usare LocalDB invece di SQLite. Questa opzione si applica solo se è specificato --auth Individual o --auth IndividualB2C.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/CalledApiUrl/description": "URL dell'API da chiamare dall'app Web. Questa opzione si applica solo se si specifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Specifica se l'app Web chiama Microsoft Graph. Questa opzione si applica solo se è specificato --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ambiti per richiedere di chiamare l'API dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ja.json
index 815f7d8cab..0ad8b840a3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web アプリ",
+ "description": "ASP.NET Core アプリケーションを、サンプルの ASP.NET Core Razor Pages コンテンツで作成するためのプロジェクト テンプレートです",
+ "symbols/auth/choices/None/description": "認証なし",
+ "symbols/auth/choices/Individual/description": "個別の認証",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C を使用した個別の認証",
+ "symbols/auth/choices/SingleOrg/description": "単一テナントの組織認証",
+ "symbols/auth/choices/MultiOrg/description": "複数のテナントの組織認証",
+ "symbols/auth/choices/Windows/description": "Windows 認証",
+ "symbols/auth/description": "使用する認証の種類",
+ "symbols/AAdB2CInstance/description": "接続先の Azure Active Directory B2C インスタンス (IndividualB2C 認証で使用)。",
+ "symbols/SignUpSignInPolicyId/description": "このプロジェクトのサインインおよびサインアップのポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/SignedOutCallbackPath/description": "グローバル サインアウト コールバック (IndividualB2C 認証で使用)。",
+ "symbols/ResetPasswordPolicyId/description": "このプロジェクトのパスワードのリセット ポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/EditProfilePolicyId/description": "このプロジェクトの編集プロファイル ポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/AADInstance/description": "接続先の Azure Active Directory インスタンス (SingleOrg または MultiOrg 認証で使用)。",
+ "symbols/ClientId/description": "このプロジェクトのクライアント ID (IndividualB2C、SingleOrg、または MultiOrg 認証で使用)。",
+ "symbols/Domain/description": "ディレクトリ テナントのドメイン (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/TenantId/description": "接続先のディレクトリの TenantId ID (SingleOrg 認証で使用)。",
+ "symbols/CallbackPath/description": "リダイレクト URI のアプリケーションのベース パス内の要求パス (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/OrgReadAccess/description": "このアプリケーションにディレクトリへの読み取りアクセスを許可するかどうか (SingleOrg または MultiOrg 認証にのみ適用されます)。",
+ "symbols/UserSecretsId/description": "シークレットで使用する ID (OrgReadAccess または個別の認証で使用)。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートで launchSettings.json を除外するかどうか。",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、no-https パラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、no-https は無視されます)。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "symbols/UseLocalDB/description": "SQLite の代わりに LocalDB を使用するかどうか。このオプションは、--auth Individual または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/CalledApiUrl/description": "Web アプリから呼び出す API の URL。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/CallsMicrosoftGraph/description": "Web アプリが Microsoft Graph を呼び出すかどうかを指定します。このオプションは、--auth SingleOrg または --auth MultiOrg が指定されている場合にのみ適用されます。",
+ "symbols/CalledApiScopes/description": "Web アプリから API を呼び出す要求へのスコープ。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ko.json
index 815f7d8cab..baf436b85a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 웹앱",
+ "description": "예제 ASP.NET Core Razor Pages 콘텐츠를 사용하여 ASP.NET Core 애플리케이션을 만들기 위한 프로젝트 템플릿",
+ "symbols/auth/choices/None/description": "인증 없음",
+ "symbols/auth/choices/Individual/description": "개별 인증",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C를 사용한 개별 인증",
+ "symbols/auth/choices/SingleOrg/description": "단일 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/MultiOrg/description": "여러 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/Windows/description": "Windows 인증",
+ "symbols/auth/description": "사용할 인증 유형",
+ "symbols/AAdB2CInstance/description": "연결할 Azure Active Directory B2C 인스턴스(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignUpSignInPolicyId/description": "이 프로젝트의 로그인 및 등록 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignedOutCallbackPath/description": "전역 로그아웃 콜백입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/ResetPasswordPolicyId/description": "이 프로젝트의 암호 초기화 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/EditProfilePolicyId/description": "이 프로젝트의 편집 프로필 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/AADInstance/description": "연결할 Azure Active Directory 인스턴스입니다(SingleOrg 또는 MultiOrg 인증과 함께 사용).",
+ "symbols/ClientId/description": "이 프로젝트의 클라이언트 ID입니다(IndividualB2C, SingleOrg 또는 MultiOrg 인증과 함께 사용).",
+ "symbols/Domain/description": "디렉터리 테넌트의 도메인입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/TenantId/description": "연결할 디렉터리의 TenantId ID입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/CallbackPath/description": "리디렉션 URI의 애플리케이션 기본 경로 내의 요청 경로(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/OrgReadAccess/description": "이 애플리케이션이 디렉터리에 대한 읽기 액세스를 허용할지 여부(SingleOrg 또는 MultiOrg 인증에만 적용됨).",
+ "symbols/UserSecretsId/description": "비밀에 사용할 ID입니다(OrgReadAccess 또는 개별 인증과 함께 사용).",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 개별B2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/UseLocalDB/description": "SQLite 대신 LocalDB를 사용할지 여부입니다. 이 옵션은 --auth Individual 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/CalledApiUrl/description": "웹앱에서 호출할 API의 URL입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/CallsMicrosoftGraph/description": "웹앱이 Microsoft Graph를 호출하는지 여부를 지정합니다. 이 옵션은 --auth SingleOrg 또는 --auth MultiOrg가 지정된 경우에만 적용됩니다.",
+ "symbols/CalledApiScopes/description": "웹앱에서 API 호출을 요청할 범위입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pl.json
index 815f7d8cab..fde412dfaa 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplikacja internetowa platformy ASP.NET Core",
+ "description": "Szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core z przykładową zawartością platformy Razor Pages na platformie ASP.NET Core Razor.",
+ "symbols/auth/choices/None/description": "Bez uwierzytelniania",
+ "symbols/auth/choices/Individual/description": "Uwierzytelnianie indywidualne",
+ "symbols/auth/choices/IndividualB2C/description": "Indywidualne uwierzytelnianie za pomocą usługi Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Uwierzytelnianie organizacyjne dla pojedynczej dzierżawy",
+ "symbols/auth/choices/MultiOrg/description": "Uwierzytelnianie organizacyjne dla wielu dzierżaw",
+ "symbols/auth/choices/Windows/description": "Uwierzytelnianie systemu Windows",
+ "symbols/auth/description": "Typ uwierzytelniania, który ma zostać użyty.",
+ "symbols/AAdB2CInstance/description": "Wystąpienie usługi Azure Active Directory B2C do nawiązania połączenia (użyj z uwierzytelnianym IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Identyfikator zasad logowania i rejestracji dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Globalne wywołanie zwrotne wylogowania (używane z uwierzytelnianym IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Identyfikator zasad resetowania haseł dla tego projektu (użyj z uwierzytelnianiem IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Identyfikator zasad edycji profilu dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/AADInstance/description": "Wystąpienie usługi Azure Active Directory do nawiązania połączenia (użyj z uwierzytelnianym singleOrg lub MultiOrg).",
+ "symbols/ClientId/description": "Identyfikator klienta dla tego projektu (użyj uwierzytelniania IndividualB2C, SingleOrg lub MultiOrg).",
+ "symbols/Domain/description": "Domena dzierżawy katalogu (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/TenantId/description": "Identyfikator TenantId katalogu, z którym ma zostać nawiązane połączenie (użyj uwierzytelniania SingleOrg).",
+ "symbols/CallbackPath/description": "Ścieżka żądania w ścieżce podstawowej aplikacji identyfikatora URI przekierowania (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Określa, czy zezwolić tej aplikacji na dostęp do odczytu do katalogu (dotyczy tylko uwierzytelniania SingleOrg lub MultiOrg).",
+ "symbols/UserSecretsId/description": "Identyfikator do użycia na potrzeby wpisów tajnych (używany z funkcją OrgReadAccess lub indywidualnym uwierzytelnianiem).",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json w wygenerowanym szablonie.",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy elementy IndividualB2C, SingleOrg lub MultiOrg nie są używane dla uwierzytelniania --auth.",
+ "symbols/UseLocalDB/description": "Określa, czy używać bazy danych LocalDB zamiast oprogramowania SQLite. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth Individual lub --auth IndividualB2C.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/CalledApiUrl/description": "Adres URL interfejsu API do wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Określa, czy aplikacja internetowa wywołuje program Microsoft Graph. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg lub --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Zakresy do żądania wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 815f7d8cab..42c5fe2578 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicativo Web ASP.NET Core",
+ "description": "Um modelo de projeto para criar um aplicativo ASP.NET Core com conteúdo de exemplo ASP.NET Core Razor Pages",
+ "symbols/auth/choices/None/description": "Sem autenticação",
+ "symbols/auth/choices/Individual/description": "Autenticação individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticação individual com Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticação organizacional para um único locatário",
+ "symbols/auth/choices/MultiOrg/description": "Autenticação organizacional para vários locatários",
+ "symbols/auth/choices/Windows/description": "autenticação do Windows",
+ "symbols/auth/description": "O tipo de autenticação a ser usado",
+ "symbols/AAdB2CInstance/description": "A instância do Azure Active Directory B2C à qual se conectar (use com autenticação IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "O ID da política de login e inscrição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "O retorno de chamada de saída global (use com autenticação IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "O ID da política de redefinição de senha para este projeto (use com autenticação IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "O ID de política de perfil de edição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/AADInstance/description": "A instância do Azure Active Directory à qual se conectar (use com autenticação SingleOrg ou MultiOrg).",
+ "symbols/ClientId/description": "O ID do cliente para este projeto (use com autenticação IndividualB2C, SingleOrg ou MultiOrg).",
+ "symbols/Domain/description": "O domínio para o locatário do diretório (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/TenantId/description": "O ID TenantId do diretório ao qual se conectar (use com autenticação SingleOrg).",
+ "symbols/CallbackPath/description": "O caminho de solicitação no caminho base do aplicativo do URI de redirecionamento (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Se deve ou não permitir o acesso de leitura deste aplicativo ao diretório (aplica-se apenas à autenticação SingleOrg ou MultiOrg).",
+ "symbols/UserSecretsId/description": "O ID a ser usado para segredos (use com OrgReadAccess ou Autenticação individual).",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json no modelo gerado.",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção só se aplica se IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "symbols/UseLocalDB/description": "Se deve usar LocalDB em vez de SQLite. Esta opção só se aplica se --auth Individual ou --auth IndividualB2C for especificado.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/CalledApiUrl/description": "URL da API para chamar do aplicativo Web. Esta opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C for especificado.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica se o aplicativo Web chama o Microsoft Graph. Esta opção só se aplica se --auth SingleOrg ou --auth MultiOrg for especificado.",
+ "symbols/CalledApiScopes/description": "Escopos a serem solicitados para chamar a API do aplicativo Web. Esta opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C for especificado.",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ru.json
index 815f7d8cab..020c1b57ed 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,41 +1,41 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Веб-приложение ASP.NET Core",
+ "description": "Шаблон проекта для создания приложения ASP.NET Core с образцом содержимого ASP.NET Core Razor Pages",
+ "symbols/auth/choices/None/description": "Без проверки подлинности",
+ "symbols/auth/choices/Individual/description": "Индивидуальная проверка подлинности",
+ "symbols/auth/choices/IndividualB2C/description": "Индивидуальная проверка подлинности в Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Проверка подлинности в организации для одного клиента",
+ "symbols/auth/choices/MultiOrg/description": "Проверка подлинности в организации для нескольких клиентов",
+ "symbols/auth/choices/Windows/description": "Проверка подлинности Windows",
+ "symbols/auth/description": "Тип используемой проверки подлинности",
+ "symbols/AAdB2CInstance/description": "Экземпляр Azure Active Directory B2C, к которому нужно подключиться (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Идентификатор политики входа и регистрации для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Глобальный обратный вызов для выхода (используется с проверкой подлинности IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Идентификатор политики сброса паролей для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Идентификатор политики изменения профиля для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/AADInstance/description": "Экземпляр Azure Active Directory, к которому нужно подключиться (используется с проверкой подлинности SingleOrg или MultiOrg).",
+ "symbols/ClientId/description": "Идентификатор клиента для этого проекта (используется с проверкой подлинности IndividualB2C, SingleOrg или MultiOrg).",
+ "symbols/Domain/description": "Домен для клиента каталога (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/TenantId/description": "Идентификатор TenantId каталога, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/CallbackPath/description": "Путь запроса в базовом пути приложения к URI перенаправления (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Следует ли предоставлять этому приложению доступ на чтение к каталогу (применяется только к проверке подлинности SingleOrg или MultiOrg).",
+ "symbols/UserSecretsId/description": "Идентификатор, используемый для секретов (используется с проверкой подлинности OrgReadAccess или Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются IndividualB2C, SingleOrg или MultiOrg.",
+ "symbols/UseLocalDB/description": "Следует ли использовать LocalDB вместо SQLite. Этот параметр применяется, только если указывается --auth Individual или --auth IndividualB2C.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/CalledApiUrl/description": "URL-адрес API для вызова из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Указывает, вызывает ли веб-приложение Microsoft Graph. Этот параметр применяется, только если указывается --auth SingleOrg или --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Области для запроса вызова API из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.tr.json
index 815f7d8cab..6b21192979 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web Uygulaması",
+ "description": "ASP.NET Core Razor Sayfalar içeriği örneğiyle ASP.NET Core uygulaması oluşturmak için proje şablonu",
+ "symbols/auth/choices/None/description": "Kimlik doğrulaması yok",
+ "symbols/auth/choices/Individual/description": "Bireysel kimlik doğrulaması",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C ile bireysel kimlik doğrulaması",
+ "symbols/auth/choices/SingleOrg/description": "Tek bir kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/MultiOrg/description": "Birden çok kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/Windows/description": "Windows kimlik doğrulaması",
+ "symbols/auth/description": "Kullanılacak kimlik doğrulaması türü",
+ "symbols/AAdB2CInstance/description": "Bağlanılacak Azure Active Directory B2C örneği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignUpSignInPolicyId/description": "Bu proje için oturum açma ve kaydolma ilkesi kimliği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignedOutCallbackPath/description": "Genel oturum kapatma geri araması (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/ResetPasswordPolicyId/description": "Bu proje için parola ilkesi sıfırlama kimliği (IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/EditProfilePolicyId/description": "Bu proje için düzenleme profil ilkesi kimliği (IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/AADInstance/description": "Bağlanılacak Azure Active Directory örneği (SingleOrg veya MultiOrg kimlik doğrulaması ile kullanın).",
+ "symbols/ClientId/description": "Bu proje için İstemci Kimliği (IndividualB2C, SingleOrg veya MultiOrg kimlik doğrulaması ile kullanın).",
+ "symbols/Domain/description": "Dizin kiracısı için etki alanı (SingleOrg veya IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/TenantId/description": "Bağlanılacak dizinin TenantId kimliği (SingleOrg kimlik doğrulamasıyla kullanın).",
+ "symbols/CallbackPath/description": "Yeniden yönlendirme URI'sinin uygulama temel dizini yolu içindeki istek yolu (SingleOrg veya IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/OrgReadAccess/description": "Bu uygulamanın dizin okuma erişimine izin verilip verilmeyeceği (yalnızca SingleOrg veya MultiOrg kimlik doğrulaması için geçerlidir).",
+ "symbols/UserSecretsId/description": "Gizli diziler için kullanılan kimlik (OrgReadAccess veya Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablonda dışlanıp dışlanmayacağı.",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "symbols/UseLocalDB/description": "SQLite yerine LocalDB'nin kullanılıp kullanılmayacağı. Bu seçenek yalnızca --auth Individual veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/CalledApiUrl/description": "Web uygulamasından çağrılan API URL'si. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/CallsMicrosoftGraph/description": "Web uygulamasının Microsoft Graph çağırıp çağırmadığını belirtir. Bu seçenek yalnızca --auth SingleOrg veya --auth MultiOrg belirtilirse geçerlidir.",
+ "symbols/CalledApiScopes/description": "Web uygulamasından API çağırma istek kapsamları. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 815f7d8cab..c0c1761e4f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web 应用",
+ "description": "用于创建包含示例 ASP.NET Core Razor Pages 内容的 ASP.NET Core 应用程序的项目模板",
+ "symbols/auth/choices/None/description": "无身份验证",
+ "symbols/auth/choices/Individual/description": "个人身份验证",
+ "symbols/auth/choices/IndividualB2C/description": "使用 Azure AD B2C 进行个人身份验证",
+ "symbols/auth/choices/SingleOrg/description": "单个租户的组织身份验证",
+ "symbols/auth/choices/MultiOrg/description": "多个租户的组织身份验证",
+ "symbols/auth/choices/Windows/description": "Windows 身份验证",
+ "symbols/auth/description": "要使用的身份验证类型",
+ "symbols/AAdB2CInstance/description": "要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignedOutCallbackPath/description": "全局注销回调(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/ResetPasswordPolicyId/description": "此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/EditProfilePolicyId/description": "此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/AADInstance/description": "要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。",
+ "symbols/ClientId/description": "此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。",
+ "symbols/Domain/description": "目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/TenantId/description": "要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。",
+ "symbols/CallbackPath/description": "重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/OrgReadAccess/description": "是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。",
+ "symbols/UserSecretsId/description": "用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否在生成的模板中排除 launchSettings.json。",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/CalledApiUrl/description": "要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。",
+ "symbols/CalledApiScopes/description": "请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 815f7d8cab..2d7263faf5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core Razor Pages content",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web 應用程式",
+ "description": "建立 ASP.NET 核心應用程式的專案範本,同時附上範例 ASP.NET Razor 頁面內容。",
+ "symbols/auth/choices/None/description": "沒有驗證",
+ "symbols/auth/choices/Individual/description": "個別驗證",
+ "symbols/auth/choices/IndividualB2C/description": "具有 Azure AD B2C 的個別驗證",
+ "symbols/auth/choices/SingleOrg/description": "單一租用戶的組織驗證",
+ "symbols/auth/choices/MultiOrg/description": "多個租用戶的組織驗證",
+ "symbols/auth/choices/Windows/description": "Windows 驗證",
+ "symbols/auth/description": "要使用的驗證類型。",
+ "symbols/AAdB2CInstance/description": "要連線的 Azure Active Directory B2C 執行個體 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此專案的登入和註冊原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignedOutCallbackPath/description": "全域登出回呼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/ResetPasswordPolicyId/description": "此專案的重設密碼原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/EditProfilePolicyId/description": "此專案的編輯設定檔原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/AADInstance/description": "要連線到的 Azure Active Directory 執行個體 (搭配 SingleOrg 或 MultiOrg 驗證使用)。",
+ "symbols/ClientId/description": "此專案的用戶端識別碼 (搭配 IndividualB2C、SingleOrg 或 MultiOrg 驗證使用)。",
+ "symbols/Domain/description": "目錄租用戶的網域 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/TenantId/description": "要連線到目錄的 TenantId 識別碼 (搭配 SingleOrg 驗證使用)。",
+ "symbols/CallbackPath/description": "重新導向 URI 的應用程式基底路徑內的要求路徑 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/OrgReadAccess/description": "是否要允許此應用程式讀取存取目錄 (只適用於 SingleOrg 或 MultiOrg 驗證)。",
+ "symbols/UserSecretsId/description": "用於祕密的識別碼 (搭配 OrgReadAccess 或個別驗證使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否要在產生的範本中排除 launchSettings.json。",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而非 SQLite。只有在已指定 --auth Individual 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/CalledApiUrl/description": "要從 Web 應用程式呼叫的 API URL。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 應用程式呼叫是否 Microsoft Graph。只有在已指定 --auth SingleOrg 或 --auth MultiOrg 時,才適用此選項。",
+ "symbols/CalledApiScopes/description": "要求從 Web 應用程式呼叫 API 的範圍。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json
index 3f42794ce9..ba365e1b8d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/.template.config/template.json
@@ -263,7 +263,7 @@
"kestrelHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"kestrelHttpsPortGenerated": {
"type": "generated",
@@ -303,7 +303,7 @@
"iisHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"iisHttpsPortGenerated": {
"type": "generated",
@@ -356,13 +356,21 @@
},
"RequiresHttps": {
"type": "computed",
- "value": "(OrganizationalAuth || IndividualAuth || !NoHttps)"
+ "value": "(OrganizationalAuth || IndividualB2CAuth)"
+ },
+ "HasHttpProfile": {
+ "type": "computed",
+ "value": "(!RequiresHttps)"
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(RequiresHttps || !NoHttps)"
},
"NoHttps": {
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ "description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
},
"UseLocalDB": {
"type": "parameter",
@@ -426,7 +434,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.Main.cs
index 3a1a1d68cc..dd471686ce 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.Main.cs
@@ -127,7 +127,7 @@ public class Program
#endif
{
app.UseExceptionHandler("/Error");
- #if (RequiresHttps)
+ #if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
@@ -140,9 +140,6 @@ public class Program
app.UseRouting();
- #if (OrganizationalAuth || IndividualAuth || WindowsAuth)
- app.UseAuthentication();
- #endif
app.UseAuthorization();
app.MapRazorPages();
@@ -152,4 +149,4 @@ public class Program
app.Run();
}
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.cs
index 683cff6879..936ac75914 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Program.cs
@@ -121,7 +121,7 @@ if (!app.Environment.IsDevelopment())
#endif
{
app.UseExceptionHandler("/Error");
-#if (RequiresHttps)
+#if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
@@ -134,9 +134,6 @@ app.UseStaticFiles();
app.UseRouting();
-#if (OrganizationalAuth || IndividualAuth || WindowsAuth)
-app.UseAuthentication();
-#endif
app.UseAuthorization();
app.MapRazorPages();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Properties/launchSettings.json
index 316f54a0fe..b89f441308 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/Properties/launchSettings.json
@@ -1,4 +1,4 @@
-{
+{
"iisSettings": {
//#if (WindowsAuth)
"windowsAuthentication": true,
@@ -9,7 +9,7 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(RequiresHttps)
+ //#if (HasHttpsProfile)
"sslPort": 44300
//#else
"sslPort": 0
@@ -17,19 +17,28 @@
}
},
"profiles": {
- "Company.WebApplication1": {
+ //#if (HasHttpProfile)
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(RequiresHttps)
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#else
"applicationUrl": "http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/css/site.css
index f27e5ad205..f8d98fcb77 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/css/site.css
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/css/site.css
@@ -8,6 +8,10 @@ html {
}
}
+.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
+ box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
+}
+
html {
position: relative;
min-height: 100%;
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
index 0bdc1962b6..984713a496 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
@@ -1,12 +1,23 @@
-Copyright (c) .NET Foundation. All rights reserved.
+The MIT License (MIT)
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-these files except in compliance with the License. You may obtain a copy of the
-License at
+Copyright (c) .NET Foundation and Contributors
-http://www.apache.org/licenses/LICENSE-2.0
+All rights reserved.
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 73f5298394..009306070a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,7 +1,10 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index 553d427471..d8d803c65e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive});
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt
index e4e5e00ef0..599bdf2c72 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright JS Foundation and other contributors, https://js.foundation/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/RazorPagesWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GAMhC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAIjDC,EAAW,SAAmBF,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB6B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOrC,GAGCyC,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQvB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCwB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa9B,GAMrB,IAAI+B,IAAW/B,GAAO,WAAYA,GAAOA,EAAI+B,OAC5C3B,EAAOmB,EAAQvB,GAEhB,OAAKD,EAAYC,KAASE,EAAUF,KAIpB,UAATI,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAO/B,GArWhEyB,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOnD,EAAMG,KAAMT,OAKpB0D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGrD,EAAMG,KAAMT,MAIb2D,EAAM,EAAI3D,KAAM2D,EAAM3D,KAAKqD,QAAWrD,KAAM2D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAO/D,KAAKwD,cAAeK,GAM5C,OAHAC,EAAIE,WAAahE,KAGV8D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMjE,KAAMkE,IAG3BC,IAAK,SAAUD,GACd,OAAOlE,KAAK4D,UAAWb,EAAOoB,IAAKnE,KAAM,SAAUoE,EAAMlC,GACxD,OAAOgC,EAASzD,KAAM2D,EAAMlC,EAAGkC,OAIjC9D,MAAO,WACN,OAAON,KAAK4D,UAAWtD,EAAMK,MAAOX,KAAMqE,aAG3CC,MAAO,WACN,OAAOtE,KAAKuE,GAAI,IAGjBC,KAAM,WACL,OAAOxE,KAAKuE,IAAK,IAGlBE,KAAM,WACL,OAAOzE,KAAK4D,UAAWb,EAAO2B,KAAM1E,KAAM,SAAU2E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO5E,KAAK4D,UAAWb,EAAO2B,KAAM1E,KAAM,SAAU2E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM7E,KAAKqD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO7E,KAAK4D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE7E,KAAM8E,IAAQ,KAG5DC,IAAK,WACJ,OAAO/E,KAAKgE,YAAchE,KAAKwD,eAKhC5C,KAAMA,EACNoE,KAAM9E,EAAI8E,KACVC,OAAQ/E,EAAI+E,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBnE,EAAYmE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASxF,KACTkC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAItG,MAAOsG,IAGlBC,KAAM,aAENX,cAAe,SAAUpE,GACxB,IAAIgF,EAAOC,EAIX,SAAMjF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BgF,EAAQnG,EAAUmB,KASK,mBADvBiF,EAAOvF,EAAOP,KAAM6F,EAAO,gBAAmBA,EAAM9C,cACftC,EAAWT,KAAM8F,KAAWpF,IAGlEqF,cAAe,SAAUlF,GACxB,IAAI8D,EAEJ,IAAMA,KAAQ9D,EACb,OAAO,EAER,OAAO,GAKRmF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU3C,EAAK4C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa9B,IAEjB,IADA+B,EAAS/B,EAAI+B,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAASzD,KAAMa,EAAKY,GAAKA,EAAGZ,EAAKY,IACrC,WAIF,IAAMA,KAAKZ,EACV,IAAgD,IAA3C4C,EAASzD,KAAMa,EAAKY,GAAKA,EAAGZ,EAAKY,IACrC,MAKH,OAAOZ,GAIRoF,UAAW,SAAUxG,EAAKyG,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAPzG,IACCkD,EAAahD,OAAQF,IACzB6C,EAAOgB,MAAOD,EACE,iBAAR5D,EACP,CAAEA,GAAQA,GAGXU,EAAKH,KAAMqD,EAAK5D,IAIX4D,GAGR8C,QAAS,SAAUxC,EAAMlE,EAAKgC,GAC7B,OAAc,MAAPhC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKkE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQnG,KAAMiD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAIlD,KAAMsG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAIlD,KAAMsG,GAMb,OAAO3G,EAAMuD,IAIdqD,KAAM,EAIN/F,QAASA,IAGa,mBAAXgG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAanH,EAAKkH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC3F,SAAUC,EAAInC,GACbtE,EAAY,WAAasE,EAAO,KAAQA,EAAKoC,gBAmB9C,IAAIC,EAWJ,SAAY1H,GACZ,IAAImC,EACHd,EACAsG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAvI,EACAwI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe3I,EAAOH,SACtB+I,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRlH,EAAS,GAAOC,eAChBf,EAAM,GACNmJ,EAAMnJ,EAAImJ,IACVC,EAAapJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU0I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOhL,MAAO,GAAM,MAEtC,OAAOiL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGvL,MAAO,GAAI,GAAM,KAC1BuL,EAAGE,WAAYF,EAAGxI,OAAS,GAAItC,SAAU,IAAO,IAI3C,KAAO8K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC1L,EAAKD,MACFT,EAAMI,EAAMG,KAAMiI,EAAa6D,YACjC7D,EAAa6D,YAMdrM,EAAKwI,EAAa6D,WAAWlJ,QAAS9B,SACrC,MAAQiL,GACT5L,EAAO,CAAED,MAAOT,EAAImD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW3I,MAAO6E,EAAQlF,EAAMG,KAAMgM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC1L,EAAW0B,EAAUA,EAAQ1B,SAAW,EAKzC,GAHAoF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAbzB,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOoF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWrD,EAEhByI,GAAiB,CAIrB,GAAkB,KAAb9G,IAAqBsL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbtL,EAAiB,CACrB,KAAO6C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQ/F,KAAMwD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQ/F,KAAMwD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAjM,EAAKD,MAAOgG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAASzL,EAAQkM,wBACzCrK,EAAQqK,uBAGR,OADA1M,EAAKD,MAAOgG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKvF,EAAQmM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAbzB,GAAqD,WAAnC0B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb1B,IACF2I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY7B,EAAQsM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAhN,EAAKD,MAAOgG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKpN,KAAMsN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK3O,EAASyC,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIxO,EAAMuO,EAAMnH,MAAO,KACtBpF,EAAIhC,EAAImD,OAET,MAAQnB,IACPwF,EAAKiH,WAAYzO,EAAKgC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE5H,UAAiC,IAAf6H,EAAE7H,UACnC4H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNd,EAAUqG,GAAOrG,QAAU,GAO3BwG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,EAAKqL,aACpBrH,GAAYhE,EAAK6I,eAAiB7I,GAAOsL,gBAK1C,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOrC,GAA6B,IAAjBqC,EAAIV,UAAmBU,EAAIyN,kBAMnDtH,GADAxI,EAAWqC,GACQyN,gBACnBrH,GAAkBT,EAAOhI,GAQpB8I,GAAgB9I,IAClBgQ,EAAYhQ,EAASiQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC5K,EAAQsM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa9C,EAASyC,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDjC,EAAQuI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BnB,EAAQiM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa9C,EAASsQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxCjC,EAAQkM,uBAAyBrC,EAAQuC,KAAM5N,EAAS0N,wBAMxDlM,EAAQ+O,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBlG,EAASwQ,oBAAsBxQ,EAASwQ,kBAAmBtK,GAAUzC,SAIzEjC,EAAQ+O,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAInP,EAAQiM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BrP,EAAQmM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK7C,UACTmP,EAAI9P,KAAMwD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAInP,EAAQkM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELlH,EAAQmM,IAAMtC,EAAQuC,KAAM5N,EAASiO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU1H,KAAM,SAAW6I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU1H,KAAM,MAAQ6I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU1H,KAAM,OAQjB+P,EAAQ/Q,EAASyC,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU1H,KAAM,MAAQ6I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU1H,KAAM,YAMX2N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU1H,KAAM,YAKjB2N,EAAGV,iBAAkB,QACrBvF,EAAU1H,KAAM,iBAGjB0N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQ/Q,EAASyC,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU1H,KAAM,OAAS6I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU1H,KAAM,WAAY,aAK7BwH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU1H,KAAM,WAAY,aAK7B2N,EAAGV,iBAAkB,QACrBvF,EAAU1H,KAAM,YAIXQ,EAAQyP,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBnN,EAAQ8P,kBAAoBnK,EAAQtG,KAAM8N,EAAI,KAI9CxH,EAAQtG,KAAM8N,EAAI,aAClBhG,EAAc3H,KAAM,KAAMgJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE5H,SAAiB4H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI9P,YAClC6P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGhI,EAAQmQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKvJ,GAAYuJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKxJ,GAAYwJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJpH,EAASoH,EAAWkB,GAAMtI,EAASoH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKvJ,GAAY,EACvBwJ,GAAKxJ,EAAW,EAEhB4R,GAAO,EACPH,EAAM,EACNpJ,EACEpH,EAASoH,EAAWkB,GAAMtI,EAASoH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK9I,GAGR6H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERhD,EAAQyP,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQtG,KAAM2D,EAAMwN,GAG9B,GAAK9N,GAAO1C,EAAQ8P,mBAInB9M,EAAKxE,UAAuC,KAA3BwE,EAAKxE,SAAS2B,SAC/B,OAAOuC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMhS,EAAU,KAAM,CAAEwE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAarD,GAC5CuI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUxE,GACtCuI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMlC,EAAOP,KAAMiH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAf,EAAQuI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAItG,MAAO,0CAA4CsG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB9G,EAAQ+Q,iBACxBlK,GAAa7G,EAAQgR,YAAczL,EAAQrG,MAAO,GAClDqG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWtR,KAAMsB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJX,EAAW6C,EAAK7C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB6C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb7C,GAA+B,IAAbA,EAC7B,OAAO6C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMvM,MAAO,EAAG,IAGxBqK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIvM,MAAO,EAAG,IAGnBuM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASpS,QAAS,IAAKoS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIvM,MAAO,EAAG0S,GAClCnG,EAAO,GAAMoG,EAAS3S,MAAO,EAAG0S,IAI1BnG,EAAMvM,MAAO,EAAG,MAIzB+P,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOzS,QAASwS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAOzS,QAASwS,GAChC,OAAbD,EAAoBC,GAASC,EAAOhT,OAAQ+S,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMhJ,QAASwS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOhT,MAAO,EAAG+S,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKpB,MAAO,EAAG,GAC3BoT,EAA+B,SAArBhS,EAAKpB,OAAQ,GACvBqT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKT,SAEL,OAAO,EAKT0S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKT,YAAoBuN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKT,aACHuN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWvT,eAAgBqT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM5T,EAAS6L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASvD,QAASyB,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASnU,QAASkU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK7C,UAC7C,OAAO,KAKTiE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOlV,EAAOmV,UAAYnV,EAAOmV,SAASD,KAC9C,OAAOA,GAAQA,EAAK3U,MAAO,KAAQ8D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASxE,EAASyV,iBACrBzV,EAAS0V,UAAY1V,EAAS0V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK7C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR2S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa3O,KAAMsB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK7C,UAAkBuV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK7C,UAAkBuV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK7C,UAAkBuV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAazW,KAAMwD,GACdkT,GACJnT,EAAIvD,KAAMsB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ1B,SAAW,CAAE0B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAK/W,KAAQqX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa5W,EAAS6L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvCjT,EAAKD,MAAOgG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCvD,EAASuX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU1B,SAC1BgX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOf,MAAO,KAAM+V,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACEpW,MAAO,EAAG4B,EAAI,GACdxB,OAAQ,CAAEwG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOpW,MAAO4B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOpW,MAAOwE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASvW,KAAMgU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOvY,MAAO,GAGtCqY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMrY,MAAOuM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOlM,KAAQ8V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO9V,KAAM,CACZsG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMrY,MAAOoU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO9V,KAAM,CACZsG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMrY,MAAOoU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASxM,MAAO,IA4ZzCwH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYnY,KAAMiY,GAElBC,EAAgBlY,KAAMiY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWrD,GAAYqD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBrN,IACtCuI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWrD,EAAUiU,GAAQ,CAChDlN,EAAQ/F,KAAMwD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUjU,KAAMwD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI5I,KAAMkG,IAM/B0S,EAAajC,GAAUiC,GAIxBzY,EAAKD,MAAOgG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIvM,MAAO,IAC5B+C,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ1B,UAAkB8G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS1C,MAAOoW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA9V,EAAKD,MAAOgG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRvF,EAAQgR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E1E,EAAQ+Q,mBAAqBjK,EAG7BC,IAIA/G,EAAQmQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBvR,EAASyC,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjEpG,EAAQuI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK1H,GAILgD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK7C,SACtC,GAAuB,IAAlB6C,EAAK7C,SAAiB,CAC1B,GAAKyY,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ9T,KAAMwD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE5Y,UAAkB4Y,IAAM/V,GAC9BsQ,EAAQ9T,KAAMuZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAEvB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG/D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKtT,EAAYkZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU9Z,KAAM2D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUhZ,SACPwB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCvD,EAAQJ,KAAM8Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK7C,SACxBwB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK7C,aAIdwB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM7E,KAAKqD,OACXmX,EAAOxa,KAER,GAAyB,iBAAbgD,EACX,OAAOhD,KAAK4D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKlC,MAChC,OAAO,KAQX,IAFA8D,EAAM9D,KAAK4D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOhD,KAAK4D,UAAW0W,EAAQta,KAAMgD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOhD,KAAK4D,UAAW0W,EAAQta,KAAMgD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRta,KAIoB,iBAAbgD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOhD,KAQR,GAHAmV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BhD,KAAKwD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAO/D,KAAM+C,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ1B,SAAW0B,EAAQgK,eAAiBhK,EAAUrD,GACjE,IAIIya,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT5B,EAAYrB,KAAM6M,IACtB7M,KAAM6M,GAAS5J,EAAS4J,IAIxB7M,KAAK8R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO7M,KAYP,OARAoE,EAAOxE,EAASuN,eAAgBN,EAAO,OAKtC7M,KAAM,GAAMoE,EACZpE,KAAKqD,OAAS,GAERrD,KAcH,OAAKgD,EAASzB,UACpBvB,KAAM,GAAMgD,EACZhD,KAAKqD,OAAS,EACPrD,MAIIqB,EAAY2B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUhD,QAIhCsD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQnD,GAGrB,IAAIgb,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAItN,UACpC,OAAOsN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQxF,MAC7Bmb,EAAID,EAAQ7X,OAEb,OAAOrD,KAAKqQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUxI,KAAMkb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAInb,KAAKqD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM7O,KAAMkC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAItN,SAAW,KAAQ2Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAItN,UACHwB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ9T,KAAMiO,GACd,MAMJ,OAAO7O,KAAK4D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJvD,EAAQJ,KAAMsC,EAAQqB,GAAQpE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBoE,EAAKb,OAASa,EAAM,GAAMA,GAZjBpE,KAAM,IAAOA,KAAM,GAAI2C,WAAe3C,KAAKsE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOjD,KAAK4D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAO/D,KAAK0D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOhD,KAAKub,IAAiB,MAAZvY,EAChBhD,KAAKgE,WAAahE,KAAKgE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO3S,SAAkB2S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT3b,EAAUiE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKnE,KAAMkD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK9E,OAAQ,KACjB0C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd1U,KAAKqD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHhc,KAAK4D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS7F,EAAcqb,EAASxV,EAAMyV,SAC1CD,EAAOjc,KAAMyG,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS7F,EAAcqb,EAASxV,EAAM2V,MACjDH,EAAOjc,KAAMyG,EAAOqV,EAASC,GAQ7BD,EAAQ5b,WAAOkF,EAAW,CAAEqB,GAAQ5G,MAAOmc,IAM3C,MAAQvV,GAITsV,EAAO7b,WAAOkF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc5c,MAAOwc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM1c,KAAMuc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B5F,EAAY4F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK3I,KAAMqG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKxd,MAIR2d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIvd,MAKR8U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDvJ,MAMR4d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTnd,MAERmM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVnd,MAERqd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQjU,MAAQiU,EAAKjU,QAAUiU,GAC9C+I,EAAM1c,KAAM2T,GACN2I,GACLM,KAGKxd,MAIRwd,KAAM,WAEL,OADAhD,EAAKsD,SAAU9d,KAAMqE,WACdrE,MAIRod,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BrE,MAERqe,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK7B,EAAYkd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGvC,MAAOX,KAAMqE,WAChCqa,GAAYrd,EAAYqd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtBze,KACAkD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOnf,KACVuU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQ/N,MAAOwe,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLxb,EAAYwb,GAGXqC,EACJrC,EAAKpc,KACJie,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKpc,KACJie,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC7f,EAAO8f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAY0d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAYwd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAYyd,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUrb,GAClB,OAAc,MAAPA,EAAcyB,EAAOmC,OAAQ5D,EAAKqb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAUze,OAASoe,OAAWvY,EAAY7F,KAAMqE,WAChErE,MAMRoe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKvd,KAAM2d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB7f,EAAMG,KAAM4D,WAG5B+b,EAASrd,EAAOgb,WAGhBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMlC,KACvBmgB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAa/C,EAAMG,KAAM4D,WAAc6C,IAC5D+Y,GACTG,EAAOb,YAAaW,EAAiBC,KAMzC,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAOxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAO5D,QACtEyD,GAGsB,YAAnBG,EAAOlC,SACX7c,EAAY8e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAOvD,OAKhB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAO5D,QAGzD,OAAO4D,EAAOzD,aAOhB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CxgB,EAAOygB,SAAWzgB,EAAOygB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9ErF,EAAOygB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCpG,EAAO8f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRjhB,EAASkhB,oBAAqB,mBAAoBD,GAClD9gB,EAAO+gB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBnG,MAGR+C,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa3f,EAAU,CAAEmD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBjd,EAASqhB,YACa,YAAxBrhB,EAASqhB,aAA6BrhB,EAAS8P,gBAAgBwR,SAGjEnhB,EAAO8f,WAAY9c,EAAO4X,QAK1B/a,EAASmQ,iBAAkB,mBAAoB8Q,GAG/C9gB,EAAOgQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAEN/f,EAAY6F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAGzC,KAAMoD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK9gB,KAAMsC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EACjBpa,EACAA,EAAMzG,KAAMoD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAM/C,OAAKkT,EACGvd,EAIH0d,EACGre,EAAGzC,KAAMoD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM3gB,UAAqC,IAAnB2gB,EAAM3gB,YAAsB2gB,EAAM3gB,UAMlE,SAAS4gB,IACRniB,KAAK8F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOliB,KAAK8F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM3gB,SACV2gB,EAAOliB,KAAK8F,SAAYoB,EAMxB9G,OAAOiiB,eAAgBH,EAAOliB,KAAK8F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQjO,KAAKiO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNlO,KAAKiO,MAAOiU,GAGZA,EAAOliB,KAAK8F,UAAaoc,EAAOliB,KAAK8F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElClH,KAAK0D,IAAKwe,EAAOhU,IASzBlO,KAAKuiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOliB,KAAK8F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM3gB,SACV2gB,EAAOliB,KAAK8F,cAAYD,SAEjBqc,EAAOliB,KAAK8F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOliB,KAAK8F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK7C,SAI/B,GAHA6D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOpE,KAAM,GACbyO,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKlO,KAAKqD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK7C,WAAmBohB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRvE,QAAS,WAClBuE,EAAO2c,EAAW3c,EAAK9E,MAAO,IAC9ByiB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJlO,KAAKiE,KAAM,WACjB2e,EAASL,IAAKviB,KAAMkO,KAIfiT,EAAQnhB,KAAM,SAAUkH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDxiB,KAAKiE,KAAM,WAGV2e,EAASL,IAAKviB,KAAMkO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOlO,KAAKiE,KAAM,WACjB2e,EAASjF,OAAQ3d,KAAMkO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM1c,KAAM4hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAGzC,KAAM2D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOtd,KAAM,GAAK0B,QAGjBmE,IAAT2c,EACNxiB,KACAA,KAAKiE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOtd,KAAM0B,EAAM8gB,GAGtCzf,EAAOygB,YAAaxjB,KAAM0B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAASrjB,KAAM0B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO1B,KAAKiE,KAAM,WACjBlB,EAAOsgB,QAASrjB,KAAM0B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO1B,KAAKsd,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAMJ,GACxB,IAAIoP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW7R,KACXkC,EAAIlC,KAAKqD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXJ,EAAMI,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAASrb,MAGxB,IAAIwiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB9P,EAAS8P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK7C,WAClBwB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUrlB,MAAM,IAExBylB,KAAM,WACL,OAAOJ,GAAUrlB,OAElB0lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQle,KAAKslB,OAAStlB,KAAKylB,OAG5BzlB,KAAKiE,KAAM,WACZogB,GAAoBrkB,MACxB+C,EAAQ/C,MAAOslB,OAEfviB,EAAQ/C,MAAOylB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADc/lB,EAASmmB,yBACRrjB,YAAa9C,EAASyC,cAAe,SACpDsO,GAAQ/Q,EAASyC,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBvP,EAAQ4kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBxP,EAAQ8kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBxP,EAAQ+kB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfplB,EAAQ+kB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK7C,SAAW,CAAE6C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM9mB,KAAMqC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ1mB,KAAMwD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQxmB,KAAMwD,GAMlB,OAAOqjB,EAIR,IACCI,GAAY,OACZC,GAAc,iDACdC,GAAiB,sBAElB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY9jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOxE,EAASyV,cACf,MAAQ8S,KATQC,KAAqC,UAAT1mB,GAY/C,SAAS2mB,GAAIjkB,EAAMkkB,EAAOtlB,EAAUwf,EAAMtf,EAAIqlB,GAC7C,IAAIC,EAAQ9mB,EAGZ,GAAsB,iBAAV4mB,EAAqB,CAShC,IAAM5mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEyiB,EACbD,GAAIjkB,EAAM1C,EAAMsB,EAAUwf,EAAM8F,EAAO5mB,GAAQ6mB,GAEhD,OAAOnkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK+kB,QACC,IAAM/kB,EACZ,OAAOkB,EAeR,OAZa,IAARmkB,IACJC,EAAStlB,GACTA,EAAK,SAAUulB,GAId,OADA1lB,IAAS2lB,IAAKD,GACPD,EAAO7nB,MAAOX,KAAMqE,aAIzB8C,KAAOqhB,EAAOrhB,OAAUqhB,EAAOrhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAO0lB,MAAMlN,IAAKvb,KAAMsoB,EAAOplB,EAAIsf,EAAMxf,KA+a3C,SAAS2lB,GAAgBpa,EAAI7M,EAAMwmB,GAG5BA,GAQNvF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAO0lB,MAAMlN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU+Z,GAClB,IAAIG,EAAUtV,EACbuV,EAAQlG,EAASjf,IAAK1D,KAAM0B,GAE7B,GAAyB,EAAlB+mB,EAAMK,WAAmB9oB,KAAM0B,IAKrC,GAAMmnB,EAAMxlB,QAiCEN,EAAO0lB,MAAMvJ,QAASxd,IAAU,IAAKqnB,cAClDN,EAAMO,uBAfN,GAdAH,EAAQvoB,EAAMG,KAAM4D,WACpBse,EAASJ,IAAKviB,KAAM0B,EAAMmnB,GAK1BD,EAAWV,EAAYloB,KAAM0B,GAC7B1B,KAAM0B,KAEDmnB,KADLvV,EAASqP,EAASjf,IAAK1D,KAAM0B,KACJknB,EACxBjG,EAASJ,IAAKviB,KAAM0B,GAAM,GAE1B4R,EAAS,GAELuV,IAAUvV,EAKd,OAFAmV,EAAMQ,2BACNR,EAAMS,iBACC5V,EAAOpM,WAeL2hB,EAAMxlB,SAGjBsf,EAASJ,IAAKviB,KAAM0B,EAAM,CACzBwF,MAAOnE,EAAO0lB,MAAMU,QAInBpmB,EAAOmC,OAAQ2jB,EAAO,GAAK9lB,EAAOqmB,MAAM9lB,WACxCulB,EAAMvoB,MAAO,GACbN,QAKFyoB,EAAMQ,qCAzE0BpjB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAO0lB,MAAMlN,IAAKhN,EAAI7M,EAAMsmB,IA5a/BjlB,EAAO0lB,MAAQ,CAEdjpB,OAAQ,GAER+b,IAAK,SAAUnX,EAAMkkB,EAAO5Z,EAAS8T,EAAMxf,GAE1C,IAAIqmB,EAAaC,EAAa5Y,EAC7B6Y,EAAQC,EAAGC,EACXvK,EAASwK,EAAUhoB,EAAMioB,EAAYC,EACrCC,EAAWlH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADA2a,EAAc3a,GACQA,QACtB1L,EAAWqmB,EAAYrmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfoiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASnpB,OAAO0pB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUvd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAO0lB,MAAMuB,YAAcxd,EAAE9K,KACpEqB,EAAO0lB,MAAMwB,SAAStpB,MAAOyD,EAAMC,gBAAcwB,IAMpD2jB,GADAlB,GAAUA,GAAS,IAAKzb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQmmB,IAEP9nB,EAAOkoB,GADPlZ,EAAMqX,GAAe7a,KAAMob,EAAOkB,KAAS,IACpB,GACvBG,GAAejZ,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ6J,aAAe7J,EAAQgL,WAAcxoB,EAGjEwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAG1C+nB,EAAY1mB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNkoB,SAAUA,EACVpH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWma,EAAW/b,KAAM,MAC1Byb,IAGKK,EAAWH,EAAQ7nB,OAC1BgoB,EAAWH,EAAQ7nB,GAAS,IACnByoB,cAAgB,EAGnBjL,EAAQkL,QACiD,IAA9DlL,EAAQkL,MAAM3pB,KAAM2D,EAAMoe,EAAMmH,EAAYL,IAEvCllB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM4nB,IAK3BpK,EAAQ3D,MACZ2D,EAAQ3D,IAAI9a,KAAM2D,EAAMqlB,GAElBA,EAAU/a,QAAQvH,OACvBsiB,EAAU/a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJ0mB,EAASzkB,OAAQykB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS9oB,KAAM6oB,GAIhB1mB,EAAO0lB,MAAMjpB,OAAQkC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMkkB,EAAO5Z,EAAS1L,EAAUqnB,GAEjD,IAAIvlB,EAAGwlB,EAAW5Z,EACjB6Y,EAAQC,EAAGC,EACXvK,EAASwK,EAAUhoB,EAAMioB,EAAYC,EACrCC,EAAWlH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMylB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKzb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQmmB,IAMP,GAJA9nB,EAAOkoB,GADPlZ,EAAMqX,GAAe7a,KAAMob,EAAOkB,KAAS,IACpB,GACvBG,GAAejZ,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAE1CgoB,EAAWH,EADX7nB,GAASsB,EAAWkc,EAAQ6J,aAAe7J,EAAQgL,WAAcxoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY6f,EAAW/b,KAAM,iBAAoB,WAG9D0c,EAAYxlB,EAAI4kB,EAASrmB,OACzB,MAAQyB,IACP2kB,EAAYC,EAAU5kB,IAEfulB,GAAeT,IAAaH,EAAUG,UACzClb,GAAWA,EAAQvH,OAASsiB,EAAUtiB,MACtCuJ,IAAOA,EAAIlD,KAAMic,EAAUja,YAC3BxM,GAAYA,IAAaymB,EAAUzmB,WACxB,OAAbA,IAAqBymB,EAAUzmB,YAChC0mB,EAASzkB,OAAQH,EAAG,GAEf2kB,EAAUzmB,UACd0mB,EAASS,gBAELjL,EAAQvB,QACZuB,EAAQvB,OAAOld,KAAM2D,EAAMqlB,IAOzBa,IAAcZ,EAASrmB,SACrB6b,EAAQqL,WACkD,IAA/DrL,EAAQqL,SAAS9pB,KAAM2D,EAAMulB,EAAYE,EAASE,SAElDhnB,EAAOynB,YAAapmB,EAAM1C,EAAMmoB,EAASE,eAGnCR,EAAQ7nB,SA1Cf,IAAMA,KAAQ6nB,EACbxmB,EAAO0lB,MAAM9K,OAAQvZ,EAAM1C,EAAO4mB,EAAOkB,GAAK9a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe+iB,IAC1B5G,EAAShF,OAAQvZ,EAAM,mBAIzB6lB,SAAU,SAAUQ,GAEnB,IAAIvoB,EAAG4C,EAAGhB,EAAK4Q,EAAS+U,EAAWiB,EAClCnW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BolB,EAAQ1lB,EAAO0lB,MAAMkC,IAAKF,GAE1Bf,GACE/G,EAASjf,IAAK1D,KAAM,WAAcI,OAAO0pB,OAAQ,OAC/CrB,EAAM/mB,OAAU,GACpBwd,EAAUnc,EAAO0lB,MAAMvJ,QAASuJ,EAAM/mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMkU,EAENvmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAumB,EAAMmC,eAAiB5qB,MAGlBkf,EAAQ2L,cAA2D,IAA5C3L,EAAQ2L,YAAYpqB,KAAMT,KAAMyoB,GAA5D,CAKAiC,EAAe3nB,EAAO0lB,MAAMiB,SAASjpB,KAAMT,KAAMyoB,EAAOiB,GAGxDxnB,EAAI,EACJ,OAAUwS,EAAUgW,EAAcxoB,QAAYumB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBrW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAU2kB,EAAY/U,EAAQgV,SAAU5kB,QACtC2jB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAUja,YACnCiZ,EAAMwC,WAAWzd,KAAMic,EAAUja,aAEjCiZ,EAAMgB,UAAYA,EAClBhB,EAAMjG,KAAOiH,EAAUjH,UAKV3c,KAHb/B,IAAUf,EAAO0lB,MAAMvJ,QAASuK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU/a,SAAU/N,MAAO+T,EAAQtQ,KAAMmQ,MAGT,KAAzBkU,EAAMnV,OAASxP,KACrB2kB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK9J,EAAQgM,cACZhM,EAAQgM,aAAazqB,KAAMT,KAAMyoB,GAG3BA,EAAMnV,SAGdoW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAIxnB,EAAGunB,EAAWzX,EAAKmZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBtb,EAAM4Z,EAAMjjB,OAGb,GAAK2kB,GAIJtb,EAAItN,YAOc,UAAfknB,EAAM/mB,MAAoC,GAAhB+mB,EAAM1S,QAEnC,KAAQlH,IAAQ7O,KAAM6O,EAAMA,EAAIlM,YAAc3C,KAI7C,GAAsB,IAAjB6O,EAAItN,WAAoC,UAAfknB,EAAM/mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFAgf,EAAkB,GAClBC,EAAmB,GACblpB,EAAI,EAAGA,EAAIioB,EAAejoB,SAME2D,IAA5BulB,EAFLpZ,GAHAyX,EAAYC,EAAUxnB,IAGNc,SAAW,OAG1BooB,EAAkBpZ,GAAQyX,EAAU5e,cACC,EAApC9H,EAAQiP,EAAKhS,MAAOqb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKhS,KAAM,KAAM,CAAE6O,IAAQxL,QAErC+nB,EAAkBpZ,IACtBmZ,EAAgBvqB,KAAM6oB,GAGnB0B,EAAgB9nB,QACpBqnB,EAAa9pB,KAAM,CAAEwD,KAAMyK,EAAK6a,SAAUyB,IAY9C,OALAtc,EAAM7O,KACDmqB,EAAgBT,EAASrmB,QAC7BqnB,EAAa9pB,KAAM,CAAEwD,KAAMyK,EAAK6a,SAAUA,EAASppB,MAAO6pB,KAGpDO,GAGRW,QAAS,SAAUjmB,EAAMkmB,GACxBlrB,OAAOiiB,eAAgBtf,EAAOqmB,MAAM9lB,UAAW8B,EAAM,CACpDmmB,YAAY,EACZjJ,cAAc,EAEd5e,IAAKrC,EAAYiqB,GAChB,WACC,GAAKtrB,KAAKwrB,cACR,OAAOF,EAAMtrB,KAAKwrB,gBAGrB,WACC,GAAKxrB,KAAKwrB,cACR,OAAOxrB,KAAKwrB,cAAepmB,IAI/Bmd,IAAK,SAAUrb,GACd9G,OAAOiiB,eAAgBriB,KAAMoF,EAAM,CAClCmmB,YAAY,EACZjJ,cAAc,EACdmJ,UAAU,EACVvkB,MAAOA,QAMXyjB,IAAK,SAAUa,GACd,OAAOA,EAAezoB,EAAO+C,SAC5B0lB,EACA,IAAIzoB,EAAOqmB,MAAOoC,IAGpBtM,QAAS,CACRwM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU5H,GAIhB,IAAIjU,EAAKvO,MAAQwiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGqd,OAASxf,EAAUmC,EAAI,UAG1Boa,GAAgBpa,EAAI,QAASyZ,KAIvB,GAERmB,QAAS,SAAU3G,GAIlB,IAAIjU,EAAKvO,MAAQwiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGqd,OAASxf,EAAUmC,EAAI,UAE1Boa,GAAgBpa,EAAI,UAId,GAKRkY,SAAU,SAAUgC,GACnB,IAAIjjB,EAASijB,EAAMjjB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOomB,OAASxf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBqmB,aAAc,CACbX,aAAc,SAAUzC,QAID5iB,IAAjB4iB,EAAMnV,QAAwBmV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMnV,YA8F7CvQ,EAAOynB,YAAc,SAAUpmB,EAAM1C,EAAMqoB,GAGrC3lB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMqoB,IAIlChnB,EAAOqmB,MAAQ,SAAUznB,EAAKoqB,GAG7B,KAAQ/rB,gBAAgB+C,EAAOqmB,OAC9B,OAAO,IAAIrmB,EAAOqmB,MAAOznB,EAAKoqB,GAI1BpqB,GAAOA,EAAID,MACf1B,KAAKwrB,cAAgB7pB,EACrB3B,KAAK0B,KAAOC,EAAID,KAIhB1B,KAAKgsB,mBAAqBrqB,EAAIsqB,uBACHpmB,IAAzBlE,EAAIsqB,mBAGgB,IAApBtqB,EAAImqB,YACL9D,GACAC,GAKDjoB,KAAKwF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOjE,SACxCI,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELxF,KAAK+qB,cAAgBppB,EAAIopB,cACzB/qB,KAAKksB,cAAgBvqB,EAAIuqB,eAIzBlsB,KAAK0B,KAAOC,EAIRoqB,GACJhpB,EAAOmC,OAAQlF,KAAM+rB,GAItB/rB,KAAKmsB,UAAYxqB,GAAOA,EAAIwqB,WAAa1jB,KAAK2jB,MAG9CpsB,KAAM+C,EAAO+C,UAAY,GAK1B/C,EAAOqmB,MAAM9lB,UAAY,CACxBE,YAAaT,EAAOqmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAI1c,EAAIxM,KAAKwrB,cAEbxrB,KAAKgsB,mBAAqBhE,GAErBxb,IAAMxM,KAAKqsB,aACf7f,EAAE0c,kBAGJF,gBAAiB,WAChB,IAAIxc,EAAIxM,KAAKwrB,cAEbxrB,KAAK8qB,qBAAuB9C,GAEvBxb,IAAMxM,KAAKqsB,aACf7f,EAAEwc,mBAGJC,yBAA0B,WACzB,IAAIzc,EAAIxM,KAAKwrB,cAEbxrB,KAAKgrB,8BAAgChD,GAEhCxb,IAAMxM,KAAKqsB,aACf7f,EAAEyc,2BAGHjpB,KAAKgpB,oBAKPjmB,EAAOkB,KAAM,CACZqoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRnrB,MAAM,EACNorB,UAAU,EACVjf,KAAK,EACLkf,SAAS,EACTrX,QAAQ,EACRsX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EAETC,MAAO,SAAUxF,GAChB,IAAI1S,EAAS0S,EAAM1S,OAGnB,OAAoB,MAAf0S,EAAMwF,OAAiBpG,GAAUra,KAAMib,EAAM/mB,MACxB,MAAlB+mB,EAAM0E,SAAmB1E,EAAM0E,SAAW1E,EAAM2E,SAIlD3E,EAAMwF,YAAoBpoB,IAAXkQ,GAAwB+R,GAAYta,KAAMib,EAAM/mB,MACtD,EAATqU,EACG,EAGM,EAATA,EACG,EAGM,EAATA,EACG,EAGD,EAGD0S,EAAMwF,QAEZlrB,EAAO0lB,MAAM4C,SAEhBtoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW8Y,KAAM,YAAc,SAAUxsB,EAAMqnB,GACpEhmB,EAAO0lB,MAAMvJ,QAASxd,GAAS,CAG9B0oB,MAAO,WAQN,OAHAzB,GAAgB3oB,KAAM0B,EAAMwmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB3oB,KAAM0B,IAGf,GAGRqnB,aAAcA,KAYhBhmB,EAAOkB,KAAM,CACZkqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB5nB,EAAO0lB,MAAMvJ,QAASqP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAI3kB,EAEH0qB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTxuB,MAMgC+C,EAAOyF,SANvCxI,KAMyDwuB,MAClE/F,EAAM/mB,KAAO+nB,EAAUG,SACvB9lB,EAAM2lB,EAAU/a,QAAQ/N,MAAOX,KAAMqE,WACrCokB,EAAM/mB,KAAOipB,GAEP7mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBmjB,GAAI,SAAUC,EAAOtlB,EAAUwf,EAAMtf,GACpC,OAAOmlB,GAAIroB,KAAMsoB,EAAOtlB,EAAUwf,EAAMtf,IAEzCqlB,IAAK,SAAUD,EAAOtlB,EAAUwf,EAAMtf,GACrC,OAAOmlB,GAAIroB,KAAMsoB,EAAOtlB,EAAUwf,EAAMtf,EAAI,IAE7CwlB,IAAK,SAAUJ,EAAOtlB,EAAUE,GAC/B,IAAIumB,EAAW/nB,EACf,GAAK4mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClB1mB,EAAQulB,EAAMsC,gBAAiBlC,IAC9Be,EAAUja,UACTia,EAAUG,SAAW,IAAMH,EAAUja,UACrCia,EAAUG,SACXH,EAAUzmB,SACVymB,EAAU/a,SAEJ1O,KAER,GAAsB,iBAAVsoB,EAAqB,CAGhC,IAAM5mB,KAAQ4mB,EACbtoB,KAAK0oB,IAAKhnB,EAAMsB,EAAUslB,EAAO5mB,IAElC,OAAO1B,KAWR,OATkB,IAAbgD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK+kB,IAECjoB,KAAKiE,KAAM,WACjBlB,EAAO0lB,MAAM9K,OAAQ3d,KAAMsoB,EAAOplB,EAAIF,QAMzC,IAKCyrB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBxqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQxa,SAAkBwa,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASyqB,GAAezqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAAS0qB,GAAe1qB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKpB,MAAO,EAAG,GAClC8D,EAAK1C,KAAO0C,EAAK1C,KAAKpB,MAAO,GAE7B8D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAAS2qB,GAAgBptB,EAAKqtB,GAC7B,IAAI9sB,EAAGiZ,EAAGzZ,EAAgButB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKztB,SAAV,CAKA,GAAKohB,EAASD,QAAS/gB,KAEtB4nB,EADW5G,EAASjf,IAAK/B,GACP4nB,QAKjB,IAAM7nB,KAFNihB,EAAShF,OAAQqR,EAAM,iBAETzF,EACb,IAAMrnB,EAAI,EAAGiZ,EAAIoO,EAAQ7nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAO0lB,MAAMlN,IAAKyT,EAAMttB,EAAM6nB,EAAQ7nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBstB,EAAWrM,EAASzB,OAAQxf,GAC5ButB,EAAWnsB,EAAOmC,OAAQ,GAAI+pB,GAE9BrM,EAASL,IAAKyM,EAAME,KAkBtB,SAASC,GAAUC,EAAY7a,EAAMrQ,EAAUojB,GAG9C/S,EAAOhU,EAAMgU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAASiI,EAAYrtB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAIiU,EAAW/rB,OACfisB,EAAWnU,EAAI,EACfjU,EAAQqN,EAAM,GACdgb,EAAkBluB,EAAY6F,GAG/B,GAAKqoB,GACG,EAAJpU,GAA0B,iBAAVjU,IAChB9F,EAAQ4kB,YAAc0I,GAASlhB,KAAMtG,GACxC,OAAOkoB,EAAWnrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO4U,EAAW7qB,GAAI8W,GACrBkU,IACJhb,EAAM,GAAMrN,EAAMzG,KAAMT,KAAMqb,EAAOb,EAAKgV,SAE3CL,GAAU3U,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM6a,EAAY,GAAIniB,eAAe,EAAOmiB,EAAY9H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA+H,GADAjI,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYoH,KAC/BxrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMotB,IACVttB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BqtB,GAIJtsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAASzD,KAAM2uB,EAAYltB,GAAKF,EAAME,GAGvC,GAAKmtB,EAOJ,IANAptB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAAS0H,IAGf5sB,EAAI,EAAGA,EAAImtB,EAAYntB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAO0sB,WAAaztB,EAAKH,UAC7BkB,EAAO0sB,SAAUztB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAAS0oB,GAAc,IAAM3sB,EAAMC,IAQnE,OAAOmtB,EAGR,SAASzR,GAAQvZ,EAAMpB,EAAU0sB,GAKhC,IAJA,IAAI1tB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCwtB,GAA8B,IAAlB1tB,EAAKT,UACtBwB,EAAO4sB,UAAWjJ,GAAQ1kB,IAGtBA,EAAKW,aACJ+sB,GAAYxL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU6H,GACxB,OAAOA,GAGRjqB,MAAO,SAAUnB,EAAMwrB,EAAeC,GACrC,IAAI3tB,EAAGiZ,EAAG2U,EAAaC,EApINpuB,EAAKqtB,EACnB5iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB+J,EAAS9L,GAAY9f,GAGtB,KAAMhD,EAAQ8kB,gBAAsC,IAAlB9hB,EAAK7C,UAAoC,KAAlB6C,EAAK7C,UAC3DwB,EAAO8W,SAAUzV,IAMnB,IAHA2rB,EAAerJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFb2U,EAAcpJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLmuB,EAAa5tB,GAjJH8sB,EAiJQe,EAAc7tB,QAhJzCkK,EAGc,WAHdA,EAAW4iB,EAAK5iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDstB,EAAKtZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC4iB,EAAKrV,aAAehY,EAAIgY,cA6IxB,GAAKiW,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAepJ,GAAQtiB,GACrC2rB,EAAeA,GAAgBrJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAI2U,EAAYzsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C6sB,GAAgBe,EAAa5tB,GAAK6tB,EAAc7tB,SAGjD6sB,GAAgB3qB,EAAMmB,GAWxB,OAL2B,GAD3BwqB,EAAerJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAeoJ,GAAeC,GAAUtJ,GAAQtiB,EAAM,WAIhDmB,GAGRoqB,UAAW,SAAU9rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAO0lB,MAAMvJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK+G,OACT,IAAM7nB,KAAQ8gB,EAAK+G,OACbrK,EAASxd,GACbqB,EAAO0lB,MAAM9K,OAAQvZ,EAAM1C,GAI3BqB,EAAOynB,YAAapmB,EAAM1C,EAAM8gB,EAAKuH,QAOxC3lB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB+qB,OAAQ,SAAUjtB,GACjB,OAAO2a,GAAQ3d,KAAMgD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ3d,KAAMgD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQnhB,KAAM,SAAUkH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMtC,MACbA,KAAK6V,QAAQ5R,KAAM,WACK,IAAlBjE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKqS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B6sB,OAAQ,WACP,OAAOf,GAAUnvB,KAAMqE,UAAW,SAAUD,GACpB,IAAlBpE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CqtB,GAAoB5uB,KAAMoE,GAChC1B,YAAa0B,MAKvB+rB,QAAS,WACR,OAAOhB,GAAUnvB,KAAMqE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBpE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIiE,EAASopB,GAAoB5uB,KAAMoE,GACvCoB,EAAO4qB,aAAchsB,EAAMoB,EAAO8M,gBAKrC+d,OAAQ,WACP,OAAOlB,GAAUnvB,KAAMqE,UAAW,SAAUD,GACtCpE,KAAK2C,YACT3C,KAAK2C,WAAWytB,aAAchsB,EAAMpE,SAKvCswB,MAAO,WACN,OAAOnB,GAAUnvB,KAAMqE,UAAW,SAAUD,GACtCpE,KAAK2C,YACT3C,KAAK2C,WAAWytB,aAAchsB,EAAMpE,KAAKgP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOpE,KAAMkC,IAAeA,IACd,IAAlBkC,EAAK7C,WAGTwB,EAAO4sB,UAAWjJ,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOrS,MAGRuF,MAAO,SAAUqqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD7vB,KAAKmE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOvF,KAAM4vB,EAAeC,MAI5CL,KAAM,SAAUtoB,GACf,OAAOia,EAAQnhB,KAAM,SAAUkH,GAC9B,IAAI9C,EAAOpE,KAAM,IAAO,GACvBkC,EAAI,EACJiZ,EAAInb,KAAKqD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK7C,SAChC,OAAO6C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBunB,GAAajhB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOpE,KAAMkC,IAAO,IAGVX,WACTwB,EAAO4sB,UAAWjJ,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJpE,KAAK6V,QAAQqa,OAAQhpB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BktB,YAAa,WACZ,IAAIjJ,EAAU,GAGd,OAAO6H,GAAUnvB,KAAMqE,UAAW,SAAUD,GAC3C,IAAI8P,EAASlU,KAAK2C,WAEbI,EAAO6D,QAAS5G,KAAMsnB,GAAY,IACtCvkB,EAAO4sB,UAAWjJ,GAAQ1mB,OACrBkU,GACJA,EAAOsc,aAAcpsB,EAAMpE,QAK3BsnB,MAILvkB,EAAOkB,KAAM,CACZwsB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUxrB,EAAMyrB,GAClB9tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACNgtB,EAAS/tB,EAAQC,GACjBwB,EAAOssB,EAAOztB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOxE,KAAOA,KAAKuF,OAAO,GACxCxC,EAAQ+tB,EAAQ5uB,IAAO2uB,GAAYhtB,GAInCjD,EAAKD,MAAOmD,EAAKD,EAAMH,OAGxB,OAAO1D,KAAK4D,UAAWE,MAGzB,IAAIitB,GAAY,IAAIjnB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDkN,GAAY,SAAU5sB,GAKxB,IAAI6oB,EAAO7oB,EAAK6I,cAAc4C,YAM9B,OAJMod,GAASA,EAAKgE,SACnBhE,EAAOltB,GAGDktB,EAAKiE,iBAAkB9sB,IAG5B+sB,GAAO,SAAU/sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACRgsB,EAAM,GAGP,IAAMhsB,KAAQD,EACbisB,EAAKhsB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAASzD,KAAM2D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAASgsB,EAAKhsB,GAG3B,OAAOtB,GAIJutB,GAAY,IAAIvnB,OAAQma,GAAUrW,KAAM,KAAO,KA8HnD,SAAS0jB,GAAQltB,EAAMgB,EAAMmsB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU5tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCAiN,EAAWA,GAAYP,GAAW5sB,MAQpB,MAFbN,EAAMytB,EAASI,iBAAkBvsB,IAAUmsB,EAAUnsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBhE,EAAQwwB,kBAAoBb,GAAUvjB,KAAM1J,IAASutB,GAAU7jB,KAAMpI,KAG1EosB,EAAQlN,EAAMkN,MACdC,EAAWnN,EAAMmN,SACjBC,EAAWpN,EAAMoN,SAGjBpN,EAAMmN,SAAWnN,EAAMoN,SAAWpN,EAAMkN,MAAQ1tB,EAChDA,EAAMytB,EAASC,MAGflN,EAAMkN,MAAQA,EACdlN,EAAMmN,SAAWA,EACjBnN,EAAMoN,SAAWA,SAIJ7rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS+tB,GAAcC,EAAaC,GAGnC,MAAO,CACNruB,IAAK,WACJ,IAAKouB,IASL,OAAS9xB,KAAK0D,IAAMquB,GAASpxB,MAAOX,KAAMqE,kBALlCrE,KAAK0D,OAxLhB,WAIC,SAASsuB,IAGR,GAAMrM,EAAN,CAIAsM,EAAU3N,MAAM4N,QAAU,+EAE1BvM,EAAIrB,MAAM4N,QACT,4HAGDxiB,GAAgBhN,YAAauvB,GAAYvvB,YAAaijB,GAEtD,IAAIwM,EAAWpyB,EAAOmxB,iBAAkBvL,GACxCyM,EAAoC,OAAjBD,EAASriB,IAG5BuiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD5M,EAAIrB,MAAMkO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD7L,EAAIrB,MAAMqO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoB3M,EAAIkN,YAAc,GAEzDnjB,GAAgB9M,YAAaqvB,GAI7BtM,EAAM,MAGP,SAAS2M,EAAoBQ,GAC5B,OAAO/sB,KAAKgtB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYryB,EAASyC,cAAe,OACpCsjB,EAAM/lB,EAASyC,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM4O,eAAiB,cAC3BvN,EAAIM,WAAW,GAAO3B,MAAM4O,eAAiB,GAC7C9xB,EAAQ+xB,gBAA+C,gBAA7BxN,EAAIrB,MAAM4O,eAEpCnwB,EAAOmC,OAAQ9D,EAAS,CACvBgyB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAQRY,qBAAsB,WACrB,IAAIC,EAAOlN,EAAImN,EAASC,EAoBxB,OAnBgC,MAA3BV,IACJQ,EAAQ7zB,EAASyC,cAAe,SAChCkkB,EAAK3mB,EAASyC,cAAe,MAC7BqxB,EAAU9zB,EAASyC,cAAe,OAElCoxB,EAAMnP,MAAM4N,QAAU,kCACtB3L,EAAGjC,MAAMsP,OAAS,MAClBF,EAAQpP,MAAMsP,OAAS,MAEvBlkB,GACEhN,YAAa+wB,GACb/wB,YAAa6jB,GACb7jB,YAAagxB,GAEfC,EAAU5zB,EAAOmxB,iBAAkB3K,GACnC0M,EAAuD,EAA7BY,SAAUF,EAAQC,QAE5ClkB,GAAgB9M,YAAa6wB,IAEvBR,MApHV,GAmMA,IAAIa,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAan0B,EAASyC,cAAe,OAAQiiB,MAC7C0P,GAAc,GAkBf,SAASC,GAAe7uB,GACvB,IAAI8uB,EAAQnxB,EAAOoxB,SAAU/uB,IAAU4uB,GAAa5uB,GAEpD,OAAK8uB,IAGA9uB,KAAQ2uB,GACL3uB,EAED4uB,GAAa5uB,GAxBrB,SAAyBA,GAGxB,IAAIgvB,EAAUhvB,EAAM,GAAI0c,cAAgB1c,EAAK9E,MAAO,GACnD4B,EAAI4xB,GAAYzwB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO0uB,GAAa5xB,GAAMkyB,KACbL,GACZ,OAAO3uB,EAeoBivB,CAAgBjvB,IAAUA,GAIxD,IAKCkvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAE7B,SAAU,WAAY8B,WAAY,SAAUlQ,QAAS,SACjEmQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBlwB,EAAOuC,EAAO4tB,GAIzC,IAAI/tB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKgvB,IAAK,EAAGhuB,EAAS,IAAQ+tB,GAAY,KAAU/tB,EAAS,IAAO,MACpEG,EAGF,SAAS8tB,GAAoB5wB,EAAM6wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAInzB,EAAkB,UAAd+yB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQjzB,EAAI,EAAGA,GAAK,EAGN,WAARgzB,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM8wB,EAAMjR,GAAW/hB,IAAK,EAAMkzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMkzB,IAIjD,WAARF,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,MAtBvEG,GAASxyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMkzB,GAGhD,YAARF,EACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,GAItEE,GAASvyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASxvB,KAAKgvB,IAAK,EAAGhvB,KAAKyvB,KAC1BpxB,EAAM,SAAW6wB,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,IACjE+0B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBrxB,EAAM6wB,EAAWK,GAG3C,IAAIF,EAASpE,GAAW5sB,GAKvB+wB,IADmB/zB,EAAQgyB,qBAAuBkC,IAEE,eAAnDvyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,GACvCM,EAAmBP,EAEnBhzB,EAAMmvB,GAAQltB,EAAM6wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,GAIzE,GAAKywB,GAAUvjB,KAAMrL,GAAQ,CAC5B,IAAMmzB,EACL,OAAOnzB,EAERA,EAAM,OAyCP,QAlCQf,EAAQgyB,qBAAuB+B,IAMrC/zB,EAAQoyB,wBAA0BpnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC6wB,WAAY7wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOgxB,KAG1DhxB,EAAKwxB,iBAAiBvyB,SAEtB8xB,EAAiE,eAAnDpyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,IAKpDM,EAAmBC,KAAcvxB,KAEhCjC,EAAMiC,EAAMuxB,MAKdxzB,EAAM6wB,WAAY7wB,IAAS,GAI1B6yB,GACC5wB,EACA6wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAjzB,GAEE,KA+SL,SAAS0zB,GAAOzxB,EAAMe,EAASsd,EAAM1d,EAAK+wB,GACzC,OAAO,IAAID,GAAMvyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAK+wB,GA7S5D/yB,EAAOmC,OAAQ,CAId6wB,SAAU,CACTC,QAAS,CACRtyB,IAAK,SAAUU,EAAMmtB,GACpB,GAAKA,EAAW,CAGf,IAAIztB,EAAMwtB,GAAQltB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACV+Q,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV7P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOouB,GAGnC,GAAMlxB,GAA0B,IAAlBA,EAAK7C,UAAoC,IAAlB6C,EAAK7C,UAAmB6C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd4T,EAAWpV,EAAW3c,GACtBgyB,EAAe7C,GAAY/mB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM8S,IACLhyB,EAAO6uB,GAAekD,IAIvB5T,EAAQxgB,EAAOgzB,SAAU3wB,IAAUrC,EAAOgzB,SAAUoB,QAGrCtxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOkxB,IAEzBxxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB01B,IAC1BlwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWiS,GAAa,GAAK,OAI7D/1B,EAAQ+xB,iBAA6B,KAAVjsB,GAAiD,IAAjC9B,EAAKvE,QAAS,gBAC9DyjB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOouB,MAE7B8B,EACJ9S,EAAM+S,YAAajyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMkwB,EAAOF,GACjC,IAAIjzB,EAAKwB,EAAK4f,EACb4T,EAAWpV,EAAW3c,GA6BvB,OA5BgBmvB,GAAY/mB,KAAMpI,KAMjCA,EAAO6uB,GAAekD,KAIvB5T,EAAQxgB,EAAOgzB,SAAU3wB,IAAUrC,EAAOgzB,SAAUoB,KAGtC,QAAS5T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMkxB,SAIjBzvB,IAAR1D,IACJA,EAAMmvB,GAAQltB,EAAMgB,EAAMgwB,IAId,WAARjzB,GAAoBiD,KAAQsvB,KAChCvyB,EAAMuyB,GAAoBtvB,IAIZ,KAAVkwB,GAAgBA,GACpB3xB,EAAMqvB,WAAY7wB,IACD,IAAVmzB,GAAkBgC,SAAU3zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI0tB,GACjDlyB,EAAOgzB,SAAUd,GAAc,CAC9BvxB,IAAK,SAAUU,EAAMmtB,EAAU+D,GAC9B,GAAK/D,EAIJ,OAAO+C,GAAa9mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKwxB,iBAAiBvyB,QAAWe,EAAKmzB,wBAAwB/F,MAIhEiE,GAAkBrxB,EAAM6wB,EAAWK,GAHnCnE,GAAM/sB,EAAMowB,GAAS,WACpB,OAAOiB,GAAkBrxB,EAAM6wB,EAAWK,MAM/C/S,IAAK,SAAUne,EAAM8C,EAAOouB,GAC3B,IAAIvuB,EACHquB,EAASpE,GAAW5sB,GAIpBozB,GAAsBp2B,EAAQmyB,iBACT,aAApB6B,EAAOzC,SAIRwC,GADkBqC,GAAsBlC,IAEY,eAAnDvyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,GACvCN,EAAWQ,EACVN,GACC5wB,EACA6wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAY/uB,KAAKyvB,KAChBpxB,EAAM,SAAW6wB,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,IACjE0yB,WAAYoC,EAAQH,IACpBD,GAAoB5wB,EAAM6wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAc/tB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO2Q,GAAc/tB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM6wB,IAGpBJ,GAAmBzwB,EAAM8C,EAAO4tB,OAK1C/xB,EAAOgzB,SAASxD,WAAaV,GAAczwB,EAAQkyB,mBAClD,SAAUlvB,EAAMmtB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQltB,EAAM,gBAClCA,EAAKmzB,wBAAwBE,KAC5BtG,GAAM/sB,EAAM,CAAEmuB,WAAY,GAAK,WAC9B,OAAOnuB,EAAKmzB,wBAAwBE,QAElC,OAMR10B,EAAOkB,KAAM,CACZyzB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB/0B,EAAOgzB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU7wB,GAOjB,IANA,IAAIhF,EAAI,EACP81B,EAAW,GAGXC,EAAyB,iBAAV/wB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd81B,EAAUH,EAAS5T,GAAW/hB,GAAM41B,GACnCG,EAAO/1B,IAAO+1B,EAAO/1B,EAAI,IAAO+1B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ90B,EAAOgzB,SAAU8B,EAASC,GAASvV,IAAMsS,MAI3C9xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQnhB,KAAM,SAAUoE,EAAMgB,EAAM8B,GAC1C,IAAIkuB,EAAQvwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAgwB,EAASpE,GAAW5sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOkzB,GAGxD,OAAOjxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO8yB,MAAQA,IAETvyB,UAAY,CACjBE,YAAaqyB,GACb1yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAK+wB,EAAQ7Q,GACjDjlB,KAAKoE,KAAOA,EACZpE,KAAKyiB,KAAOA,EACZziB,KAAK81B,OAASA,GAAU/yB,EAAO+yB,OAAOrP,SACtCzmB,KAAKmF,QAAUA,EACfnF,KAAKiU,MAAQjU,KAAKosB,IAAMpsB,KAAK6O,MAC7B7O,KAAK+E,IAAMA,EACX/E,KAAKilB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQsS,GAAMqC,UAAWl4B,KAAKyiB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK1D,MACX61B,GAAMqC,UAAUzR,SAAS/iB,IAAK1D,OAEhCm4B,IAAK,SAAUC,GACd,IAAIC,EACH9U,EAAQsS,GAAMqC,UAAWl4B,KAAKyiB,MAoB/B,OAlBKziB,KAAKmF,QAAQmzB,SACjBt4B,KAAKu4B,IAAMF,EAAQt1B,EAAO+yB,OAAQ91B,KAAK81B,QACtCsC,EAASp4B,KAAKmF,QAAQmzB,SAAWF,EAAS,EAAG,EAAGp4B,KAAKmF,QAAQmzB,UAG9Dt4B,KAAKu4B,IAAMF,EAAQD,EAEpBp4B,KAAKosB,KAAQpsB,KAAK+E,IAAM/E,KAAKiU,OAAUokB,EAAQr4B,KAAKiU,MAE/CjU,KAAKmF,QAAQqzB,MACjBx4B,KAAKmF,QAAQqzB,KAAK/3B,KAAMT,KAAKoE,KAAMpE,KAAKosB,IAAKpsB,MAGzCujB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKviB,MAEX61B,GAAMqC,UAAUzR,SAASlE,IAAKviB,MAExBA,QAIOmD,KAAKG,UAAYuyB,GAAMvyB,WAEvCuyB,GAAMqC,UAAY,CACjBzR,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK7C,UACa,MAA5BojB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO01B,GAAGD,KAAM7T,EAAMlC,MAC1B1f,EAAO01B,GAAGD,KAAM7T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK7C,WACrBwB,EAAOgzB,SAAUpR,EAAMlC,OAC4B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO2P,GAAetP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMyH,IAFjCrpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMyH,IAAMzH,EAAMM,UAU5CyT,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDpW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK7C,UAAYojB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMyH,OAKpCrpB,EAAO+yB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM9yB,KAAKgzB,IAAKF,EAAI9yB,KAAKizB,IAAO,GAExCvS,SAAU,SAGX1jB,EAAO01B,GAAK5C,GAAMvyB,UAAUH,KAG5BJ,EAAO01B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAkrBHvoB,GAEHwoB,GAnrBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBt5B,EAAS25B,QAAoBx5B,EAAOy5B,sBACxCz5B,EAAOy5B,sBAAuBF,IAE9Bv5B,EAAO8f,WAAYyZ,GAAUv2B,EAAO01B,GAAGgB,UAGxC12B,EAAO01B,GAAGiB,QAKZ,SAASC,KAIR,OAHA55B,EAAO8f,WAAY,WAClBoZ,QAAQpzB,IAEAozB,GAAQxwB,KAAK2jB,MAIvB,SAASwN,GAAOl4B,EAAMm4B,GACrB,IAAI5L,EACH/rB,EAAI,EACJuM,EAAQ,CAAEmlB,OAAQlyB,GAKnB,IADAm4B,EAAeA,EAAe,EAAI,EAC1B33B,EAAI,EAAGA,GAAK,EAAI23B,EAEvBprB,EAAO,UADPwf,EAAQhK,GAAW/hB,KACSuM,EAAO,UAAYwf,GAAUvsB,EAO1D,OAJKm4B,IACJprB,EAAMunB,QAAUvnB,EAAM+iB,MAAQ9vB,GAGxB+M,EAGR,SAASqrB,GAAa5yB,EAAOub,EAAMsX,GAKlC,IAJA,IAAIpV,EACHyK,GAAe4K,GAAUC,SAAUxX,IAAU,IAAK/hB,OAAQs5B,GAAUC,SAAU,MAC9E5e,EAAQ,EACRhY,EAAS+rB,EAAW/rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQyK,EAAY/T,GAAQ5a,KAAMs5B,EAAWtX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASqV,GAAW51B,EAAM81B,EAAY/0B,GACrC,IAAImO,EACH6mB,EACA9e,EAAQ,EACRhY,EAAS22B,GAAUI,WAAW/2B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bub,EAAKt1B,OAEbs1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B1Z,EAAYla,KAAKgvB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHnY,EAAY8Z,EAAUzB,UAAY,GAEzCjd,EAAQ,EACRhY,EAAS02B,EAAUQ,OAAOl3B,OAEnBgY,EAAQhY,EAAQgY,IACvB0e,EAAUQ,OAAQlf,GAAQ8c,IAAKC,GAMhC,OAHAha,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW3B,EAASnY,IAG5CmY,EAAU,GAAK/0B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW,EAAG,IAI5C3b,EAASmB,YAAanb,EAAM,CAAE21B,KACvB,IAERA,EAAY3b,EAASzB,QAAS,CAC7BvY,KAAMA,EACN2nB,MAAOhpB,EAAOmC,OAAQ,GAAIg1B,GAC1BM,KAAMz3B,EAAOmC,QAAQ,EAAM,CAC1Bu1B,cAAe,GACf3E,OAAQ/yB,EAAO+yB,OAAOrP,UACpBthB,GACHu1B,mBAAoBR,EACpBS,gBAAiBx1B,EACjBm1B,UAAWrB,IAASU,KACpBrB,SAAUnzB,EAAQmzB,SAClBiC,OAAQ,GACRT,YAAa,SAAUrX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO8yB,MAAOzxB,EAAM21B,EAAUS,KAAM/X,EAAM1d,EACpDg1B,EAAUS,KAAKC,cAAehY,IAAUsX,EAAUS,KAAK1E,QAEzD,OADAiE,EAAUQ,OAAO35B,KAAM+jB,GAChBA,GAERlB,KAAM,SAAUmX,GACf,IAAIvf,EAAQ,EAIXhY,EAASu3B,EAAUb,EAAUQ,OAAOl3B,OAAS,EAC9C,GAAK82B,EACJ,OAAOn6B,KAGR,IADAm6B,GAAU,EACF9e,EAAQhY,EAAQgY,IACvB0e,EAAUQ,OAAQlf,GAAQ8c,IAAK,GAUhC,OANKyC,GACJxc,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW,EAAG,IAC3C3b,EAASmB,YAAanb,EAAM,CAAE21B,EAAWa,KAEzCxc,EAASuB,WAAYvb,EAAM,CAAE21B,EAAWa,IAElC56B,QAGT+rB,EAAQgO,EAAUhO,MAInB,KA/HD,SAAqBA,EAAO0O,GAC3B,IAAIpf,EAAOjW,EAAM0wB,EAAQ5uB,EAAOqc,EAGhC,IAAMlI,KAAS0Q,EAed,GAbA+J,EAAS2E,EADTr1B,EAAO2c,EAAW1G,IAElBnU,EAAQ6kB,EAAO1Q,GACV1V,MAAMC,QAASsB,KACnB4uB,EAAS5uB,EAAO,GAChBA,EAAQ6kB,EAAO1Q,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACd2mB,EAAO3mB,GAAS8B,SACT6kB,EAAO1Q,KAGfkI,EAAQxgB,EAAOgzB,SAAU3wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMwU,OAAQ7wB,UACf6kB,EAAO3mB,GAIC8B,EACNmU,KAAS0Q,IAChBA,EAAO1Q,GAAUnU,EAAOmU,GACxBof,EAAepf,GAAUya,QAI3B2E,EAAer1B,GAAS0wB,EA6F1B+E,CAAY9O,EAAOgO,EAAUS,KAAKC,eAE1Bpf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS0mB,GAAUI,WAAY/e,GAAQ5a,KAAMs5B,EAAW31B,EAAM2nB,EAAOgO,EAAUS,MAM9E,OAJKn5B,EAAYiS,EAAOmQ,QACvB1gB,EAAOygB,YAAauW,EAAU31B,KAAM21B,EAAUS,KAAKld,OAAQmG,KAC1DnQ,EAAOmQ,KAAKqX,KAAMxnB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK4nB,EAAO+N,GAAaC,GAE3B14B,EAAY04B,EAAUS,KAAKvmB,QAC/B8lB,EAAUS,KAAKvmB,MAAMxT,KAAM2D,EAAM21B,GAIlCA,EACEpb,SAAUob,EAAUS,KAAK7b,UACzB/V,KAAMmxB,EAAUS,KAAK5xB,KAAMmxB,EAAUS,KAAKO,UAC1Cne,KAAMmd,EAAUS,KAAK5d,MACrBuB,OAAQ4b,EAAUS,KAAKrc,QAEzBpb,EAAO01B,GAAGuC,MACTj4B,EAAOmC,OAAQw0B,EAAM,CACpBt1B,KAAMA,EACN62B,KAAMlB,EACNzc,MAAOyc,EAAUS,KAAKld,SAIjByc,EAGRh3B,EAAOi3B,UAAYj3B,EAAOmC,OAAQ80B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAUzY,EAAMvb,GACtB,IAAIyd,EAAQ3kB,KAAK85B,YAAarX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITwW,QAAS,SAAUpP,EAAO7nB,GACpB7C,EAAY0qB,IAChB7nB,EAAW6nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMlf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAAS0oB,EAAM1oB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOsJ,EAAO1Q,GACd2e,GAAUC,SAAUxX,GAASuX,GAAUC,SAAUxX,IAAU,GAC3DuX,GAAUC,SAAUxX,GAAO9Q,QAASzN,IAItCk2B,WAAY,CA3Wb,SAA2Bh2B,EAAM2nB,EAAOyO,GACvC,IAAI/X,EAAMvb,EAAOwe,EAAQnC,EAAO6X,EAASC,EAAWC,EAAgB/W,EACnEgX,EAAQ,UAAWxP,GAAS,WAAYA,EACxCkP,EAAOj7B,KACPuuB,EAAO,GACPjK,EAAQlgB,EAAKkgB,MACbiV,EAASn1B,EAAK7C,UAAY8iB,GAAoBjgB,GAC9Co3B,EAAW7Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BA+X,EAAKld,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBq3B,WACVlY,EAAMkY,SAAW,EACjBL,EAAU7X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMkY,UACXL,MAIH7X,EAAMkY,WAENR,EAAK9c,OAAQ,WAGZ8c,EAAK9c,OAAQ,WACZoF,EAAMkY,WACA14B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFuO,EAEb,GADA7kB,EAAQ6kB,EAAOtJ,GACV2W,GAAS5rB,KAAMtG,GAAU,CAG7B,UAFO6kB,EAAOtJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYqyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVryB,IAAoBs0B,QAAiC31B,IAArB21B,EAAU/Y,GAK9C,SAJA8W,GAAS,EAOXhL,EAAM9L,GAAS+Y,GAAYA,EAAU/Y,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA4Y,GAAat4B,EAAOyD,cAAeulB,MAChBhpB,EAAOyD,cAAe+nB,GA8DzC,IAAM9L,KAzDD8Y,GAA2B,IAAlBn3B,EAAK7C,WAMlBi5B,EAAKkB,SAAW,CAAEpX,EAAMoX,SAAUpX,EAAMqX,UAAWrX,EAAMsX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASjX,WAErC+W,EAAiB3Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBk3B,EACJ/W,EAAU+W,GAIVjW,GAAU,CAAEjhB,IAAQ,GACpBk3B,EAAiBl3B,EAAKkgB,MAAMC,SAAW+W,EACvC/W,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlB+W,IACrB,SAAhCv4B,EAAOyhB,IAAKpgB,EAAM,WAGhBi3B,IACLJ,EAAKryB,KAAM,WACV0b,EAAMC,QAAU+W,IAEM,MAAlBA,IACJ/W,EAAUD,EAAMC,QAChB+W,EAA6B,SAAZ/W,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdiW,EAAKkB,WACTpX,EAAMoX,SAAW,SACjBT,EAAK9c,OAAQ,WACZmG,EAAMoX,SAAWlB,EAAKkB,SAAU,GAChCpX,EAAMqX,UAAYnB,EAAKkB,SAAU,GACjCpX,EAAMsX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACE9M,EAGP8M,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW7Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAAS+W,IAInD5V,IACJ8V,EAASjC,QAAUA,GAIfA,GACJlU,GAAU,CAAEjhB,IAAQ,GAKrB62B,EAAKryB,KAAM,WASV,IAAM6Z,KAJA8W,GACLlU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTmqB,EACbxrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM8L,EAAM9L,OAMnC4Y,EAAYvB,GAAaP,EAASiC,EAAU/Y,GAAS,EAAGA,EAAMwY,GACtDxY,KAAQ+Y,IACfA,EAAU/Y,GAAS4Y,EAAUpnB,MACxBslB,IACJ8B,EAAUt2B,IAAMs2B,EAAUpnB,MAC1BonB,EAAUpnB,MAAQ,MAuMrB4nB,UAAW,SAAU33B,EAAUisB,GACzBA,EACJ6J,GAAUI,WAAWzoB,QAASzN,GAE9B81B,GAAUI,WAAWx5B,KAAMsD,MAK9BnB,EAAO+4B,MAAQ,SAAUA,EAAOhG,EAAQ5yB,GACvC,IAAIi2B,EAAM2C,GAA0B,iBAAVA,EAAqB/4B,EAAOmC,OAAQ,GAAI42B,GAAU,CAC3Ef,SAAU73B,IAAOA,GAAM4yB,GACtBz0B,EAAYy6B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ5yB,GAAM4yB,GAAUA,IAAWz0B,EAAYy0B,IAAYA,GAoC5D,OAhCK/yB,EAAO01B,GAAG/P,IACdyQ,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYv1B,EAAO01B,GAAGsD,OAC9B5C,EAAIb,SAAWv1B,EAAO01B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWv1B,EAAO01B,GAAGsD,OAAOtV,UAMjB,MAAb0S,EAAI7b,QAA+B,IAAd6b,EAAI7b,QAC7B6b,EAAI7b,MAAQ,MAIb6b,EAAI/H,IAAM+H,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT15B,EAAY83B,EAAI/H,MACpB+H,EAAI/H,IAAI3wB,KAAMT,MAGVm5B,EAAI7b,OACRva,EAAOsgB,QAASrjB,KAAMm5B,EAAI7b,QAIrB6b,GAGRp2B,EAAOG,GAAGgC,OAAQ,CACjB82B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ5xB,GAGpC,OAAOlE,KAAKqQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMm3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ5xB,IAElDg4B,QAAS,SAAUzZ,EAAMqZ,EAAOhG,EAAQ5xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC0Z,EAASp5B,EAAO+4B,MAAOA,EAAOhG,EAAQ5xB,GACtCk4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWh6B,KAAM+C,EAAOmC,OAAQ,GAAIud,GAAQ0Z,IAGlDtmB,GAAS8M,EAASjf,IAAK1D,KAAM,YACjCi7B,EAAKxX,MAAM,IAKd,OAFC2Y,EAAYC,OAASD,EAEfvmB,IAA0B,IAAjBsmB,EAAO7e,MACtBtd,KAAKiE,KAAMm4B,GACXp8B,KAAKsd,MAAO6e,EAAO7e,MAAO8e,IAE5B3Y,KAAM,SAAU/hB,EAAMiiB,EAAYiX,GACjC,IAAI0B,EAAY,SAAU/Y,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMmX,IAYP,MATqB,iBAATl5B,IACXk5B,EAAUjX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ3jB,KAAKsd,MAAO5b,GAAQ,KAAM,IAGpB1B,KAAKiE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B66B,EAASx5B,EAAOw5B,OAChB/Z,EAAOG,EAASjf,IAAK1D,MAEtB,GAAKqb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC6Y,EAAW9Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ4V,GAAK7rB,KAAM6N,IACtDihB,EAAW9Z,EAAMnH,IAKpB,IAAMA,EAAQkhB,EAAOl5B,OAAQgY,KACvBkhB,EAAQlhB,GAAQjX,OAASpE,MACnB,MAAR0B,GAAgB66B,EAAQlhB,GAAQiC,QAAU5b,IAE5C66B,EAAQlhB,GAAQ4f,KAAKxX,KAAMmX,GAC3BvX,GAAU,EACVkZ,EAAOt3B,OAAQoW,EAAO,KAOnBgI,GAAYuX,GAChB73B,EAAOsgB,QAASrjB,KAAM0B,MAIzB26B,OAAQ,SAAU36B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET1B,KAAKiE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK1D,MACrBsd,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB66B,EAASx5B,EAAOw5B,OAChBl5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK6Z,QAAS,EAGdt5B,EAAOua,MAAOtd,KAAM0B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKhjB,KAAMT,MAAM,GAIlBqb,EAAQkhB,EAAOl5B,OAAQgY,KACvBkhB,EAAQlhB,GAAQjX,OAASpE,MAAQu8B,EAAQlhB,GAAQiC,QAAU5b,IAC/D66B,EAAQlhB,GAAQ4f,KAAKxX,MAAM,GAC3B8Y,EAAOt3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQghB,QACrC/e,EAAOjC,GAAQghB,OAAO57B,KAAMT,aAKvBwiB,EAAK6Z,YAKft5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIo3B,EAAQz5B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU02B,EAAOhG,EAAQ5xB,GAC5C,OAAgB,MAAT43B,GAAkC,kBAAVA,EAC9BU,EAAM77B,MAAOX,KAAMqE,WACnBrE,KAAKk8B,QAAStC,GAAOx0B,GAAM,GAAQ02B,EAAOhG,EAAQ5xB,MAKrDnB,EAAOkB,KAAM,CACZw4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU5wB,EAAM2mB,GAClBhpB,EAAOG,GAAIkC,GAAS,SAAU02B,EAAOhG,EAAQ5xB,GAC5C,OAAOlE,KAAKk8B,QAASnQ,EAAO+P,EAAOhG,EAAQ5xB,MAI7CnB,EAAOw5B,OAAS,GAChBx5B,EAAO01B,GAAGiB,KAAO,WAChB,IAAIsB,EACH94B,EAAI,EACJq6B,EAASx5B,EAAOw5B,OAIjB,IAFAtD,GAAQxwB,KAAK2jB,MAELlqB,EAAIq6B,EAAOl5B,OAAQnB,KAC1B84B,EAAQuB,EAAQr6B,OAGCq6B,EAAQr6B,KAAQ84B,GAChCuB,EAAOt3B,OAAQ/C,IAAK,GAIhBq6B,EAAOl5B,QACZN,EAAO01B,GAAGhV,OAEXwV,QAAQpzB,GAGT9C,EAAO01B,GAAGuC,MAAQ,SAAUA,GAC3Bj4B,EAAOw5B,OAAO37B,KAAMo6B,GACpBj4B,EAAO01B,GAAGxkB,SAGXlR,EAAO01B,GAAGgB,SAAW,GACrB12B,EAAO01B,GAAGxkB,MAAQ,WACZilB,KAILA,IAAa,EACbI,OAGDv2B,EAAO01B,GAAGhV,KAAO,WAChByV,GAAa,MAGdn2B,EAAO01B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNvW,SAAU,KAMX1jB,EAAOG,GAAG+5B,MAAQ,SAAUC,EAAMx7B,GAIjC,OAHAw7B,EAAOn6B,EAAO01B,IAAK11B,EAAO01B,GAAGsD,OAAQmB,IAAiBA,EACtDx7B,EAAOA,GAAQ,KAER1B,KAAKsd,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI4Z,EAAUp9B,EAAO8f,WAAYvT,EAAM4wB,GACvC3Z,EAAME,KAAO,WACZ1jB,EAAOq9B,aAAcD,OAOnBxsB,GAAQ/Q,EAASyC,cAAe,SAEnC82B,GADSv5B,EAASyC,cAAe,UACpBK,YAAa9C,EAASyC,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbN,EAAQi8B,QAA0B,KAAhB1sB,GAAMzJ,MAIxB9F,EAAQk8B,YAAcnE,GAAIxjB,UAI1BhF,GAAQ/Q,EAASyC,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbN,EAAQm8B,WAA6B,MAAhB5sB,GAAMzJ,MAI5B,IAAIs2B,GACH7uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQnhB,KAAM+C,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Do6B,WAAY,SAAUr4B,GACrB,OAAOpF,KAAKiE,KAAM,WACjBlB,EAAO06B,WAAYz9B,KAAMoF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRma,EAAQt5B,EAAK7C,SAGd,GAAe,IAAVm8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBt5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVw2B,GAAgB36B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO46B,UAAWv4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASo4B,QAAW33B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO06B,WAAYr5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC65B,UAAW,CACVj8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM9F,EAAQm8B,YAAwB,UAAVr2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXu2B,WAAY,SAAUr5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ07B,EAAY12B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK2hB,GAA+B,IAAlBx5B,EAAK7C,SACtB,MAAU6D,EAAOw4B,EAAW17B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bo4B,GAAW,CACVjb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO06B,WAAYr5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAIy4B,EAASlvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAKimB,EACR+T,EAAgB14B,EAAKoC,cAYtB,OAVMI,IAGLmiB,EAASpb,GAAYmvB,GACrBnvB,GAAYmvB,GAAkBh6B,EAC9BA,EAAqC,MAA/B+5B,EAAQz5B,EAAMgB,EAAMwC,GACzBk2B,EACA,KACDnvB,GAAYmvB,GAAkB/T,GAExBjmB,KAOT,IAAIi6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkB/2B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASswB,GAAU95B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS47B,GAAgBj3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQnhB,KAAM+C,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1D+6B,WAAY,SAAUh5B,GACrB,OAAOpF,KAAKiE,KAAM,kBACVjE,KAAM+C,EAAOs7B,QAASj5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRma,EAAQt5B,EAAK7C,SAGd,GAAe,IAAVm8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB36B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOs7B,QAASj5B,IAAUA,EACjCme,EAAQxgB,EAAOm1B,UAAW9yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd8yB,UAAW,CACV1iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIk6B,EAAWv7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKk6B,EACGzK,SAAUyK,EAAU,IAI3BP,GAAWvwB,KAAMpJ,EAAKgI,WACtB4xB,GAAWxwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX8oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLp9B,EAAQk8B,cACbv6B,EAAOm1B,UAAUviB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOs7B,QAASr+B,KAAKwH,eAAkBxH,OA4BxC+C,EAAOG,GAAGgC,OAAQ,CACjBu5B,SAAU,SAAUv3B,GACnB,IAAIw3B,EAASt6B,EAAMyK,EAAK8vB,EAAUC,EAAO95B,EAAG+5B,EAC3C38B,EAAI,EAEL,GAAKb,EAAY6F,GAChB,OAAOlH,KAAKiE,KAAM,SAAUa,GAC3B/B,EAAQ/C,MAAOy+B,SAAUv3B,EAAMzG,KAAMT,KAAM8E,EAAGo5B,GAAUl+B,UAM1D,IAFA0+B,EAAUP,GAAgBj3B,IAEb7D,OACZ,MAAUe,EAAOpE,KAAMkC,KAItB,GAHAy8B,EAAWT,GAAU95B,GACrByK,EAAwB,IAAlBzK,EAAK7C,UAAoB,IAAM08B,GAAkBU,GAAa,IAEzD,CACV75B,EAAI,EACJ,MAAU85B,EAAQF,EAAS55B,KACrB+J,EAAIhO,QAAS,IAAM+9B,EAAQ,KAAQ,IACvC/vB,GAAO+vB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBpvB,KAE9BzK,EAAK5B,aAAc,QAASq8B,GAMhC,OAAO7+B,MAGR8+B,YAAa,SAAU53B,GACtB,IAAIw3B,EAASt6B,EAAMyK,EAAK8vB,EAAUC,EAAO95B,EAAG+5B,EAC3C38B,EAAI,EAEL,GAAKb,EAAY6F,GAChB,OAAOlH,KAAKiE,KAAM,SAAUa,GAC3B/B,EAAQ/C,MAAO8+B,YAAa53B,EAAMzG,KAAMT,KAAM8E,EAAGo5B,GAAUl+B,UAI7D,IAAMqE,UAAUhB,OACf,OAAOrD,KAAK8R,KAAM,QAAS,IAK5B,IAFA4sB,EAAUP,GAAgBj3B,IAEb7D,OACZ,MAAUe,EAAOpE,KAAMkC,KAMtB,GALAy8B,EAAWT,GAAU95B,GAGrByK,EAAwB,IAAlBzK,EAAK7C,UAAoB,IAAM08B,GAAkBU,GAAa,IAEzD,CACV75B,EAAI,EACJ,MAAU85B,EAAQF,EAAS55B,KAG1B,OAA4C,EAApC+J,EAAIhO,QAAS,IAAM+9B,EAAQ,KAClC/vB,EAAMA,EAAI5I,QAAS,IAAM24B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBpvB,KAE9BzK,EAAK5B,aAAc,QAASq8B,GAMhC,OAAO7+B,MAGR++B,YAAa,SAAU73B,EAAO83B,GAC7B,IAAIt9B,SAAcwF,EACjB+3B,EAAwB,WAATv9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb83B,GAA0BC,EAC9BD,EAAWh/B,KAAKy+B,SAAUv3B,GAAUlH,KAAK8+B,YAAa53B,GAGzD7F,EAAY6F,GACTlH,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAO++B,YACd73B,EAAMzG,KAAMT,KAAMkC,EAAGg8B,GAAUl+B,MAAQg/B,GACvCA,KAKIh/B,KAAKiE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM0kB,EAExB,GAAKD,EAAe,CAGnB/8B,EAAI,EACJsY,EAAOzX,EAAQ/C,MACfk/B,EAAaf,GAAgBj3B,GAE7B,MAAU+I,EAAYivB,EAAYh9B,KAG5BsY,EAAK2kB,SAAUlvB,GACnBuK,EAAKskB,YAAa7uB,GAElBuK,EAAKikB,SAAUxuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYiuB,GAAUl+B,QAIrB2iB,EAASJ,IAAKviB,KAAM,gBAAiBiQ,GAOjCjQ,KAAKwC,cACTxC,KAAKwC,aAAc,QAClByN,IAAuB,IAAV/I,EACb,GACAyb,EAASjf,IAAK1D,KAAM,kBAAqB,QAO9Cm/B,SAAU,SAAUn8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOpE,KAAMkC,KACtB,GAAuB,IAAlBkC,EAAK7C,WACoE,GAA3E,IAAM08B,GAAkBC,GAAU95B,IAAW,KAAMvD,QAASoP,GAC7D,OAAO,EAIV,OAAO,KAOT,IAAImvB,GAAU,MAEdr8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKyrB,EACfnrB,EAAOpE,KAAM,GAEd,OAAMqE,UAAUhB,QA0BhBksB,EAAkBluB,EAAY6F,GAEvBlH,KAAKiE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBnC,KAAKuB,WAWE,OANXY,EADIotB,EACEroB,EAAMzG,KAAMT,KAAMkC,EAAGa,EAAQ/C,MAAOmC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOs8B,SAAUr/B,KAAK0B,OAAUqB,EAAOs8B,SAAUr/B,KAAKoM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKviB,KAAMmC,EAAK,WAC3DnC,KAAKkH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOs8B,SAAUj7B,EAAK1C,OAC7BqB,EAAOs8B,SAAUj7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASm5B,GAAS,IAIhB,MAAPt7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdm6B,SAAU,CACTlZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA87B,GAAkBl7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACb2S,EAAoB,eAAdnkB,EAAK1C,KACX6jB,EAASgD,EAAM,KAAO,GACtBwM,EAAMxM,EAAMlN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR0Z,EAGAxM,EAAMlN,EAAQ,EAIXnZ,EAAI6yB,EAAK7yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBomB,EACJ,OAAOrhB,EAIRqe,EAAO3kB,KAAMsG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIo4B,EAAWnZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOs8B,SAASlZ,OAAOziB,IAAKyiB,GAAUZ,MAEtD+Z,GAAY,GAUd,OAHMA,IACLl7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOs8B,SAAUr/B,MAAS,CACzBuiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D9F,EAAQi8B,UACbt6B,EAAOs8B,SAAUr/B,MAAO0D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D9F,EAAQm+B,QAAU,cAAex/B,EAGjC,IAAIy/B,GAAc,kCACjBC,GAA0B,SAAUjzB,GACnCA,EAAEwc,mBAGJjmB,EAAOmC,OAAQnC,EAAO0lB,MAAO,CAE5BU,QAAS,SAAUV,EAAOjG,EAAMpe,EAAMs7B,GAErC,IAAIx9B,EAAG2M,EAAK6B,EAAKivB,EAAYC,EAAQ7V,EAAQ7K,EAAS2gB,EACrDC,EAAY,CAAE17B,GAAQxE,GACtB8B,EAAOV,EAAOP,KAAMgoB,EAAO,QAAWA,EAAM/mB,KAAO+mB,EACnDkB,EAAa3oB,EAAOP,KAAMgoB,EAAO,aAAgBA,EAAMjZ,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMgxB,EAAcnvB,EAAMtM,EAAOA,GAAQxE,EAGlB,IAAlBwE,EAAK7C,UAAoC,IAAlB6C,EAAK7C,WAK5Bi+B,GAAYhyB,KAAM9L,EAAOqB,EAAO0lB,MAAMuB,cAIf,EAAvBtoB,EAAKb,QAAS,OAIlBa,GADAioB,EAAajoB,EAAK4F,MAAO,MACP8G,QAClBub,EAAW3kB,QAEZ46B,EAASl+B,EAAKb,QAAS,KAAQ,GAAK,KAAOa,GAG3C+mB,EAAQA,EAAO1lB,EAAO+C,SACrB2iB,EACA,IAAI1lB,EAAOqmB,MAAO1nB,EAAuB,iBAAV+mB,GAAsBA,IAGhDK,UAAY4W,EAAe,EAAI,EACrCjX,EAAMjZ,UAAYma,EAAW/b,KAAM,KACnC6a,EAAMwC,WAAaxC,EAAMjZ,UACxB,IAAI1F,OAAQ,UAAY6f,EAAW/b,KAAM,iBAAoB,WAC7D,KAGD6a,EAAMnV,YAASzN,EACT4iB,EAAMjjB,SACXijB,EAAMjjB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAEiG,GACF1lB,EAAO2D,UAAW8b,EAAM,CAAEiG,IAG3BvJ,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GACpCg+B,IAAgBxgB,EAAQiK,UAAmD,IAAxCjK,EAAQiK,QAAQxoB,MAAOyD,EAAMoe,IAAtE,CAMA,IAAMkd,IAAiBxgB,EAAQyM,WAAanqB,EAAU4C,GAAS,CAM9D,IAJAu7B,EAAazgB,EAAQ6J,cAAgBrnB,EAC/B89B,GAAYhyB,KAAMmyB,EAAaj+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBm9B,EAAUl/B,KAAMiO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBrN,IACpCkgC,EAAUl/B,KAAM8P,EAAIb,aAAea,EAAIqvB,cAAgBhgC,GAKzDmC,EAAI,EACJ,OAAU2M,EAAMixB,EAAW59B,QAAYumB,EAAMqC,uBAC5C+U,EAAchxB,EACd4Z,EAAM/mB,KAAW,EAAJQ,EACZy9B,EACAzgB,EAAQgL,UAAYxoB,GAGrBqoB,GACEpH,EAASjf,IAAKmL,EAAK,WAAczO,OAAO0pB,OAAQ,OAC9CrB,EAAM/mB,OACTihB,EAASjf,IAAKmL,EAAK,YAEnBkb,EAAOppB,MAAOkO,EAAK2T,IAIpBuH,EAAS6V,GAAU/wB,EAAK+wB,KACT7V,EAAOppB,OAASshB,EAAYpT,KAC1C4Z,EAAMnV,OAASyW,EAAOppB,MAAOkO,EAAK2T,IACZ,IAAjBiG,EAAMnV,QACVmV,EAAMS,kBA8CT,OA1CAT,EAAM/mB,KAAOA,EAGPg+B,GAAiBjX,EAAMuD,sBAEpB9M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS9lB,MAAOm/B,EAAUz2B,MAAOmZ,KACzCP,EAAY7d,IAIPw7B,GAAUv+B,EAAY+C,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMw7B,MAGXx7B,EAAMw7B,GAAW,MAIlB78B,EAAO0lB,MAAMuB,UAAYtoB,EAEpB+mB,EAAMqC,wBACV+U,EAAY9vB,iBAAkBrO,EAAM+9B,IAGrCr7B,EAAM1C,KAED+mB,EAAMqC,wBACV+U,EAAY/e,oBAAqBpf,EAAM+9B,IAGxC18B,EAAO0lB,MAAMuB,eAAYnkB,EAEpB6K,IACJtM,EAAMw7B,GAAWlvB,IAMd+X,EAAMnV,SAKd0sB,SAAU,SAAUt+B,EAAM0C,EAAMqkB,GAC/B,IAAIjc,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOqmB,MACXX,EACA,CACC/mB,KAAMA,EACN2qB,aAAa,IAIftpB,EAAO0lB,MAAMU,QAAS3c,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjBikB,QAAS,SAAUznB,EAAM8gB,GACxB,OAAOxiB,KAAKiE,KAAM,WACjBlB,EAAO0lB,MAAMU,QAASznB,EAAM8gB,EAAMxiB,SAGpCigC,eAAgB,SAAUv+B,EAAM8gB,GAC/B,IAAIpe,EAAOpE,KAAM,GACjB,GAAKoE,EACJ,OAAOrB,EAAO0lB,MAAMU,QAASznB,EAAM8gB,EAAMpe,GAAM,MAc5ChD,EAAQm+B,SACbx8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW8Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAIjc,EAAU,SAAU+Z,GACvB1lB,EAAO0lB,MAAMuX,SAAUrV,EAAKlC,EAAMjjB,OAAQzC,EAAO0lB,MAAMkC,IAAKlC,KAG7D1lB,EAAO0lB,MAAMvJ,QAASyL,GAAQ,CAC7BP,MAAO,WAIN,IAAInoB,EAAMjC,KAAKiN,eAAiBjN,KAAKJ,UAAYI,KAChDkgC,EAAWvd,EAASxB,OAAQlf,EAAK0oB,GAE5BuV,GACLj+B,EAAI8N,iBAAkBwe,EAAM7f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAK0oB,GAAOuV,GAAY,GAAM,IAEhD3V,SAAU,WACT,IAAItoB,EAAMjC,KAAKiN,eAAiBjN,KAAKJ,UAAYI,KAChDkgC,EAAWvd,EAASxB,OAAQlf,EAAK0oB,GAAQ,EAEpCuV,EAKLvd,EAASxB,OAAQlf,EAAK0oB,EAAKuV,IAJ3Bj+B,EAAI6e,oBAAqByN,EAAM7f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAK0oB,QAS3B,IAAIzV,GAAWnV,EAAOmV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAK2jB,OAErB+T,GAAS,KAKbp9B,EAAOq9B,SAAW,SAAU5d,GAC3B,IAAI3O,EACJ,IAAM2O,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM9T,EAAOsgC,WAAcC,gBAAiB9d,EAAM,YACvD,MAAQhW,GACTqH,OAAMhO,EAMP,OAHMgO,IAAOA,EAAIxG,qBAAsB,eAAgBhK,QACtDN,EAAOoD,MAAO,gBAAkBqc,GAE1B3O,GAIR,IACC0sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa9I,EAAQv2B,EAAKs/B,EAAarlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAAStE,GAGnByB,EAAOkB,KAAM3C,EAAK,SAAUY,EAAGia,GACzBykB,GAAeL,GAAS/yB,KAAMqqB,GAGlCtc,EAAKsc,EAAQ1b,GAKbwkB,GACC9I,EAAS,KAAqB,iBAAN1b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACAykB,EACArlB,UAKG,GAAMqlB,GAAiC,WAAlB/9B,EAAQvB,GAUnCia,EAAKsc,EAAQv2B,QAPb,IAAM8D,KAAQ9D,EACbq/B,GAAa9I,EAAS,IAAMzyB,EAAO,IAAK9D,EAAK8D,GAAQw7B,EAAarlB,GAYrExY,EAAO89B,MAAQ,SAAU13B,EAAGy3B,GAC3B,IAAI/I,EACHiJ,EAAI,GACJvlB,EAAM,SAAUrN,EAAK6yB,GAGpB,IAAI75B,EAAQ7F,EAAY0/B,GACvBA,IACAA,EAEDD,EAAGA,EAAEz9B,QAAW29B,mBAAoB9yB,GAAQ,IAC3C8yB,mBAA6B,MAAT95B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKvb,KAAKoF,KAAMpF,KAAKkH,cAOtB,IAAM2wB,KAAU1uB,EACfw3B,GAAa9I,EAAQ1uB,EAAG0uB,GAAU+I,EAAarlB,GAKjD,OAAOulB,EAAElzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjB+7B,UAAW,WACV,OAAOl+B,EAAO89B,MAAO7gC,KAAKkhC,mBAE3BA,eAAgB,WACf,OAAOlhC,KAAKmE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAMziB,KAAM,YAClC,OAAO6R,EAAW9O,EAAO2D,UAAWmL,GAAa7R,OAEjDqQ,OAAQ,WACR,IAAI3O,EAAO1B,KAAK0B,KAGhB,OAAO1B,KAAKoF,OAASrC,EAAQ/C,MAAOia,GAAI,cACvCymB,GAAalzB,KAAMxN,KAAKoM,YAAeq0B,GAAgBjzB,KAAM9L,KAC3D1B,KAAK0V,UAAYkQ,GAAepY,KAAM9L,MAEzCyC,IAAK,SAAUoD,EAAInD,GACnB,IAAIjC,EAAMY,EAAQ/C,MAAOmC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASu6B,GAAO,WAIhD,CAAEp7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASu6B,GAAO,WAClD98B,SAKN,IACCy9B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZpH,GAAa,GAObqH,GAAa,GAGbC,GAAW,KAAKhhC,OAAQ,KAGxBihC,GAAe/hC,EAASyC,cAAe,KAIxC,SAASu/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoB9jB,GAED,iBAAvB8jB,IACX9jB,EAAO8jB,EACPA,EAAqB,KAGtB,IAAIC,EACH7/B,EAAI,EACJ8/B,EAAYF,EAAmBt6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK5a,EAAY2c,GAGhB,MAAU+jB,EAAWC,EAAW9/B,KAGR,MAAlB6/B,EAAU,IACdA,EAAWA,EAASzhC,MAAO,IAAO,KAChCuhC,EAAWE,GAAaF,EAAWE,IAAc,IAAKpwB,QAASqM,KAI/D6jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKnhC,KAAMod,IAQnE,SAASikB,GAA+BJ,EAAW18B,EAASw1B,EAAiBuH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAIpsB,EAcJ,OAbAwsB,EAAWJ,IAAa,EACxBh/B,EAAOkB,KAAM49B,EAAWE,IAAc,GAAI,SAAU/kB,EAAGslB,GACtD,IAAIC,EAAsBD,EAAoBn9B,EAASw1B,EAAiBuH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACDzsB,EAAW4sB,QADf,GAHNp9B,EAAQ68B,UAAUrwB,QAAS4wB,GAC3BF,EAASE,IACF,KAKF5sB,EAGR,OAAO0sB,EAASl9B,EAAQ68B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYh9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRg9B,EAAc1/B,EAAO2/B,aAAaD,aAAe,GAElD,IAAMv0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPu0B,EAAav0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/EPm8B,GAAapsB,KAAOL,GAASK,KAgP9BxS,EAAOmC,OAAQ,CAGdy9B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK5tB,GAASK,KACd7T,KAAM,MACNqhC,QAvRgB,4DAuRQv1B,KAAM0H,GAAS8tB,UACvCxjC,QAAQ,EACRyjC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRlI,IAAKwG,GACLp/B,KAAM,aACNktB,KAAM,YACN3b,IAAK,4BACLwvB,KAAM,qCAGPtoB,SAAU,CACTlH,IAAK,UACL2b,KAAM,SACN6T,KAAM,YAGPC,eAAgB,CACfzvB,IAAK,cACLvR,KAAM,eACN+gC,KAAM,gBAKPE,WAAY,CAGXC,SAAU/3B,OAGVg4B,aAAa,EAGbC,YAAa1gB,KAAKC,MAGlB0gB,WAAY5gC,EAAOq9B,UAOpBqC,YAAa,CACZK,KAAK,EACL7/B,SAAS,IAOX2gC,UAAW,SAAUp+B,EAAQq+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYh9B,EAAQzC,EAAO2/B,cAAgBmB,GAGvDrB,GAAYz/B,EAAO2/B,aAAcl9B,IAGnCs+B,cAAelC,GAA6BxH,IAC5C2J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK39B,GAGA,iBAAR29B,IACX39B,EAAU29B,EACVA,OAAMj9B,GAIPV,EAAUA,GAAW,GAErB,IAAI8+B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGAzjB,EAGA0jB,EAGAriC,EAGAsiC,EAGA1D,EAAI/9B,EAAO6gC,UAAW,GAAIz+B,GAG1Bs/B,EAAkB3D,EAAE79B,SAAW69B,EAG/B4D,EAAqB5D,EAAE79B,UACpBwhC,EAAgBljC,UAAYkjC,EAAgBlhC,QAC7CR,EAAQ0hC,GACR1hC,EAAO0lB,MAGTrK,EAAWrb,EAAOgb,WAClB4mB,EAAmB5hC,EAAO+Z,UAAW,eAGrC8nB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPjhB,WAAY,EAGZ+jB,kBAAmB,SAAU92B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMujB,EAAkB,CACvBA,EAAkB,GAClB,MAAUv3B,EAAQy0B,GAASp0B,KAAMi3B,GAChCC,EAAiBv3B,EAAO,GAAIrF,cAAgB,MACzC48B,EAAiBv3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD9G,OAAQmM,EAAO,IAGpBA,EAAQu3B,EAAiBl2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cq3B,sBAAuB,WACtB,OAAOpkB,EAAYsjB,EAAwB,MAI5Ce,iBAAkB,SAAU9/B,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO0/B,EAAqB1/B,EAAKoC,eAChCs9B,EAAqB1/B,EAAKoC,gBAAmBpC,EAC9Cy/B,EAAgBz/B,GAAS8B,GAEnBlH,MAIRmlC,iBAAkB,SAAUzjC,GAI3B,OAHkB,MAAbmf,IACJigB,EAAEsE,SAAW1jC,GAEP1B,MAIR4kC,WAAY,SAAUzgC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJqhB,EAAM/jB,OAAQha,EAAK+9B,EAAMmD,cAIzB,IAAMtjC,KAAQoC,EACbygC,EAAY7iC,GAAS,CAAE6iC,EAAY7iC,GAAQoC,EAAKpC,IAInD,OAAO/B,MAIRslC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB58B,EAAM,EAAG48B,GACFxlC,OAoBV,GAfAoe,EAASzB,QAASulB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO5tB,GAASK,MAAS,IAC5CtP,QAASu7B,GAAWtsB,GAAS8tB,SAAW,MAG1ClC,EAAEp/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQo/B,EAAEpkB,QAAUokB,EAAEp/B,KAGzDo/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMv6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB6kB,EAAE2E,YAAsB,CAC5BnB,EAAY1kC,EAASyC,cAAe,KAKpC,IACCiiC,EAAU/uB,KAAOurB,EAAEgC,IAInBwB,EAAU/uB,KAAO+uB,EAAU/uB,KAC3BurB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQl5B,GAITs0B,EAAE2E,aAAc,GAalB,GARK3E,EAAEte,MAAQse,EAAEmC,aAAiC,iBAAXnC,EAAEte,OACxCse,EAAEte,KAAOzf,EAAO89B,MAAOC,EAAEte,KAAMse,EAAEF,cAIlCqB,GAA+B7H,GAAY0G,EAAG37B,EAAS+8B,GAGlDrhB,EACJ,OAAOqhB,EA8ER,IAAMhgC,KAzENqiC,EAAcxhC,EAAO0lB,OAASqY,EAAEthC,SAGQ,GAApBuD,EAAO4/B,UAC1B5/B,EAAO0lB,MAAMU,QAAS,aAIvB2X,EAAEp/B,KAAOo/B,EAAEp/B,KAAKogB,cAGhBgf,EAAE6E,YAAcpE,GAAW/zB,KAAMszB,EAAEp/B,MAKnCwiC,EAAWpD,EAAEgC,IAAI78B,QAASm7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAEte,MAAQse,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKtiC,QAAS,uCACjCigC,EAAEte,KAAOse,EAAEte,KAAKvc,QAASk7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAIxiC,MAAO4jC,EAAS7gC,QAG5By9B,EAAEte,OAAUse,EAAEmC,aAAiC,iBAAXnC,EAAEte,QAC1C0hB,IAAc/D,GAAO3yB,KAAM02B,GAAa,IAAM,KAAQpD,EAAEte,YAGjDse,EAAEte,OAIO,IAAZse,EAAE7yB,QACNi2B,EAAWA,EAASj+B,QAASo7B,GAAY,MACzCmD,GAAarE,GAAO3yB,KAAM02B,GAAa,IAAM,KAAQ,KAAStiC,GAAMuF,OACnEq9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD7iC,EAAO6/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBniC,EAAO6/B,aAAcsB,IAE9DnhC,EAAO8/B,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBniC,EAAO8/B,KAAMqB,MAKnDpD,EAAEte,MAAQse,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBh+B,EAAQg+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBhjC,EAAG4+B,EAAE+E,QAAS3jC,IAIvC,GAAK4+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWrlC,KAAMgkC,EAAiBvC,EAAOpB,IAAiBjgB,GAG9D,OAAOqhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBppB,IAAKulB,EAAE/F,UACxBmH,EAAMt5B,KAAMk4B,EAAEiF,SACd7D,EAAMtlB,KAAMkkB,EAAE36B,OAGd89B,EAAYhC,GAA+BR,GAAYX,EAAG37B,EAAS+8B,GAK5D,CASN,GARAA,EAAMjhB,WAAa,EAGdsjB,GACJG,EAAmBvb,QAAS,WAAY,CAAE+Y,EAAOpB,IAI7CjgB,EACJ,OAAOqhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE3D,UACjBkH,EAAetkC,EAAO8f,WAAY,WACjCqiB,EAAMoD,MAAO,YACXxE,EAAE3D,UAGN,IACCtc,GAAY,EACZojB,EAAU+B,KAAMnB,EAAgBj8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAMy8B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS5/B,EAAOigC,EAAUC,EACxCd,EAAaU,EAGTplB,IAILA,GAAY,EAGPwjB,GACJtkC,EAAOq9B,aAAciH,GAKtBJ,OAAYp+B,EAGZs+B,EAAwB0B,GAAW,GAGnC3D,EAAMjhB,WAAsB,EAATokB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI5kC,EAAM6kC,EAAeC,EAC5BzrB,EAAW+lB,EAAE/lB,SACbinB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU5zB,aACEvI,IAAPygC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM5kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAM84B,GAAO,CACtDtE,EAAUrwB,QAASjQ,GACnB,MAMH,GAAKsgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMtgC,KAAQwkC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY7hC,EAAO,IAAMsgC,EAAW,IAAQ,CACrEuE,EAAgB7kC,EAChB,MAEK8kC,IACLA,EAAgB9kC,GAKlB6kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUrwB,QAAS40B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IAAwD,EAA3CpjC,EAAO6D,QAAS,SAAUk6B,EAAEkB,aAC9ClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA5iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMl2B,EAAKsK,EAC9BuoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU1hC,QAGzB,GAAK0hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKp/B,eAAkBs5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU5zB,QAGpB,MAAQu4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCprB,GAAQmrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtC/mB,EAAO2rB,EACPA,EAAU3E,EAAU5zB,QAKnB,GAAiB,MAAZu4B,EAEJA,EAAU3rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS2rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYvoB,EAAO,IAAM2rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA7yB,EAAMg2B,EAAMp/B,MAAO,MACT,KAAQq/B,IAGjBC,EAAOrD,EAAYvoB,EAAO,IAAMtK,EAAK,KACpC6yB,EAAY,KAAO7yB,EAAK,KACb,EAGG,IAATk2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUj2B,EAAK,GACfsxB,EAAUrwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATk2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ55B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAOygC,EAAOp6B,EAAI,sBAAwBwO,EAAO,OAAS2rB,IASjE,MAAO,CAAEzoB,MAAO,UAAWsE,KAAM4jB,GA+cpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCjiC,EAAO6/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCjiC,EAAO8/B,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEp/B,KACxB6jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASloB,MACtB6nB,EAAUK,EAAS5jB,KAEnB2jB,IADAhgC,EAAQigC,EAASjgC,UAMlBA,EAAQo/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJ/nB,EAASmB,YAAaklB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9D9jB,EAASuB,WAAY8kB,EAAiB,CAAEvC,EAAOqD,EAAYp/B,IAI5D+7B,EAAM0C,WAAYA,GAClBA,OAAa/+B,EAER0+B,GACJG,EAAmBvb,QAASgd,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU5/B,IAIpCw+B,EAAiB7mB,SAAU2mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmBvb,QAAS,eAAgB,CAAE+Y,EAAOpB,MAG3C/9B,EAAO4/B,QAChB5/B,EAAO0lB,MAAMU,QAAS,cAKzB,OAAO+Y,GAGR8E,QAAS,SAAUlE,EAAKtgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKo/B,EAAKtgB,EAAMte,EAAU,SAGzC+iC,UAAW,SAAUnE,EAAK5+B,GACzB,OAAOnB,EAAOW,IAAKo/B,OAAKj9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUomB,EAAKtgB,EAAMte,EAAUxC,GAUjD,OAPKL,EAAYmhB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOihC,KAAMjhC,EAAOmC,OAAQ,CAClC49B,IAAKA,EACLphC,KAAMgb,EACNqlB,SAAUrgC,EACV8gB,KAAMA,EACNujB,QAAS7hC,GACPnB,EAAO2C,cAAeo9B,IAASA,OAIpC//B,EAAO+gC,cAAe,SAAUhD,GAC/B,IAAI5+B,EACJ,IAAMA,KAAK4+B,EAAE+E,QACa,iBAApB3jC,EAAEsF,gBACNs5B,EAAEqC,YAAcrC,EAAE+E,QAAS3jC,IAAO,MAMrCa,EAAO0sB,SAAW,SAAUqT,EAAK39B,EAASlD,GACzC,OAAOc,EAAOihC,KAAM,CACnBlB,IAAKA,EAGLphC,KAAM,MACNqgC,SAAU,SACV9zB,OAAO,EACPi1B,OAAO,EACP1jC,QAAQ,EAKR+jC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBrjC,EAAO0D,WAAY2/B,EAAUjhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBiiC,QAAS,SAAU3X,GAClB,IAAIjI,EAyBJ,OAvBKvnB,KAAM,KACLqB,EAAYmuB,KAChBA,EAAOA,EAAK/uB,KAAMT,KAAM,KAIzBunB,EAAOxkB,EAAQysB,EAAMxvB,KAAM,GAAIiN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDvF,KAAM,GAAI2C,YACd4kB,EAAK6I,aAAcpwB,KAAM,IAG1BunB,EAAKpjB,IAAK,WACT,IAAIC,EAAOpE,KAEX,MAAQoE,EAAKgjC,kBACZhjC,EAAOA,EAAKgjC,kBAGb,OAAOhjC,IACJ8rB,OAAQlwB,OAGNA,MAGRqnC,UAAW,SAAU7X,GACpB,OAAKnuB,EAAYmuB,GACTxvB,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAOqnC,UAAW7X,EAAK/uB,KAAMT,KAAMkC,MAItClC,KAAKiE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQ/C,MAClB+a,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASosB,QAAS3X,GAGlBhV,EAAK0V,OAAQV,MAKhBjI,KAAM,SAAUiI,GACf,IAAI8X,EAAiBjmC,EAAYmuB,GAEjC,OAAOxvB,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAOmnC,QAASG,EAAiB9X,EAAK/uB,KAAMT,KAAMkC,GAAMstB,MAIlE+X,OAAQ,SAAUvkC,GAIjB,OAHAhD,KAAKkU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQ/C,MAAOuwB,YAAavwB,KAAKuM,cAE3BvM,QAKT+C,EAAO6O,KAAKhI,QAAQ2vB,OAAS,SAAUn1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ49B,QAASpjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ49B,QAAU,SAAUpjC,GACvC,SAAWA,EAAKyuB,aAAezuB,EAAKqjC,cAAgBrjC,EAAKwxB,iBAAiBvyB,SAM3EN,EAAO2/B,aAAagF,IAAM,WACzB,IACC,OAAO,IAAI3nC,EAAO4nC,eACjB,MAAQn7B,MAGX,IAAIo7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAehlC,EAAO2/B,aAAagF,MAEpCtmC,EAAQ4mC,OAASD,IAAkB,oBAAqBA,GACxD3mC,EAAQ4iC,KAAO+D,KAAiBA,GAEhChlC,EAAOghC,cAAe,SAAU5+B,GAC/B,IAAIjB,EAAU+jC,EAGd,GAAK7mC,EAAQ4mC,MAAQD,KAAiB5iC,EAAQsgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS9K,GACxB,IAAI74B,EACHwlC,EAAMviC,EAAQuiC,MAWf,GATAA,EAAIQ,KACH/iC,EAAQzD,KACRyD,EAAQ29B,IACR39B,EAAQ+9B,MACR/9B,EAAQgjC,SACRhjC,EAAQmR,UAIJnR,EAAQijC,UACZ,IAAMlmC,KAAKiD,EAAQijC,UAClBV,EAAKxlC,GAAMiD,EAAQijC,UAAWlmC,GAmBhC,IAAMA,KAdDiD,EAAQigC,UAAYsC,EAAIvC,kBAC5BuC,EAAIvC,iBAAkBhgC,EAAQigC,UAQzBjgC,EAAQsgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV6B,EAAIxC,iBAAkBhjC,EAAG2jC,EAAS3jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAW+jC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAT/mC,EACJgmC,EAAIpC,QACgB,UAAT5jC,EAKgB,iBAAfgmC,EAAIrC,OACftK,EAAU,EAAG,SAEbA,EAGC2M,EAAIrC,OACJqC,EAAInC,YAINxK,EACC6M,GAAkBF,EAAIrC,SAAYqC,EAAIrC,OACtCqC,EAAInC,WAK+B,UAAjCmC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAItB,UACd,CAAE9jC,KAAMolC,EAAIiB,cACbjB,EAAIzC,4BAQTyC,EAAIW,OAASnkC,IACb+jC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYtkC,EAAU,cAKnC2B,IAAhB6hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAIzmB,YAMRlhB,EAAO8f,WAAY,WACb3b,GACJ+jC,OAQL/jC,EAAWA,EAAU,SAErB,IAGCwjC,EAAI1B,KAAM7gC,EAAQwgC,YAAcxgC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKT84B,MAAO,WACDphC,GACJA,QAWLnB,EAAO+gC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAE/lB,SAAS3Y,QAAS,KAKtBW,EAAO6gC,UAAW,CACjBR,QAAS,CACRhhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETmhC,WAAY,CACX2D,cAAe,SAAU5kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAO+gC,cAAe,SAAU,SAAUhD,QACxBj7B,IAAZi7B,EAAE7yB,QACN6yB,EAAE7yB,OAAQ,GAEN6yB,EAAE2E,cACN3E,EAAEp/B,KAAO,SAKXqB,EAAOghC,cAAe,SAAU,SAAUjD,GAIxC,IAAI1+B,EAAQ8B,EADb,GAAK48B,EAAE2E,aAAe3E,EAAE+H,YAEvB,MAAO,CACN7C,KAAM,SAAUhpB,EAAG+d,GAClB34B,EAASW,EAAQ,YACf+O,KAAMgvB,EAAE+H,aAAe,IACvBpmB,KAAM,CAAEqmB,QAAShI,EAAEiI,cAAepnC,IAAKm/B,EAAEgC,MACzCza,GAAI,aAAcnkB,EAAW,SAAU8kC,GACvC5mC,EAAOub,SACPzZ,EAAW,KACN8kC,GACJjO,EAAuB,UAAbiO,EAAItnC,KAAmB,IAAM,IAAKsnC,EAAItnC,QAKnD9B,EAAS6C,KAAKC,YAAaN,EAAQ,KAEpCkjC,MAAO,WACDphC,GACJA,QAUL,IAqGKshB,GArGDyjB,GAAe,GAClBC,GAAS,oBAGVnmC,EAAO6gC,UAAW,CACjBuF,MAAO,WACPC,cAAe,WACd,IAAIllC,EAAW+kC,GAAa5/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADAnH,KAAMkE,IAAa,EACZA,KAKTnB,EAAO+gC,cAAe,aAAc,SAAUhD,EAAGuI,EAAkBnH,GAElE,IAAIoH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ3I,EAAEqI,QAAqBD,GAAO17B,KAAMszB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAEte,MAE6C,KADnDse,EAAEqC,aAAe,IACjBtiC,QAAS,sCACXqoC,GAAO17B,KAAMszB,EAAEte,OAAU,QAI5B,GAAKinB,GAAiC,UAArB3I,EAAEkB,UAAW,GA8D7B,OA3DAsH,EAAexI,EAAEsI,cAAgB/nC,EAAYy/B,EAAEsI,eAC9CtI,EAAEsI,gBACFtI,EAAEsI,cAGEK,EACJ3I,EAAG2I,GAAa3I,EAAG2I,GAAWxjC,QAASijC,GAAQ,KAAOI,IAC/B,IAAZxI,EAAEqI,QACbrI,EAAEgC,MAAS3C,GAAO3yB,KAAMszB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEqI,MAAQ,IAAMG,GAIjExI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMiG,GACLzmC,EAAOoD,MAAOmjC,EAAe,mBAEvBE,EAAmB,IAI3B1I,EAAEkB,UAAW,GAAM,OAGnBuH,EAAcxpC,EAAQupC,GACtBvpC,EAAQupC,GAAiB,WACxBE,EAAoBnlC,WAIrB69B,EAAM/jB,OAAQ,gBAGQtY,IAAhB0jC,EACJxmC,EAAQhD,GAASq+B,WAAYkL,GAI7BvpC,EAAQupC,GAAiBC,EAIrBzI,EAAGwI,KAGPxI,EAAEsI,cAAgBC,EAAiBD,cAGnCH,GAAaroC,KAAM0oC,IAIfE,GAAqBnoC,EAAYkoC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc1jC,IAI5B,WAYTzE,EAAQsoC,qBACHlkB,GAAO5lB,EAAS+pC,eAAeD,mBAAoB,IAAKlkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS2mC,GAC3C,MAAqB,iBAATpnB,EACJ,IAEgB,kBAAZvf,IACX2mC,EAAc3mC,EACdA,GAAU,GAKLA,IAIA7B,EAAQsoC,qBAMZ9yB,GALA3T,EAAUrD,EAAS+pC,eAAeD,mBAAoB,KAKvCrnC,cAAe,SACzBkT,KAAO3V,EAASsV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUrD,GAKZwnB,GAAWwiB,GAAe,IAD1BC,EAASxvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAewnC,EAAQ,MAGzCA,EAAS1iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI8lC,EAAOt9B,cAlChC,IAAIqK,EAAMizB,EAAQziB,GAyCnBrkB,EAAOG,GAAGwoB,KAAO,SAAUoX,EAAKgH,EAAQ5lC,GACvC,IAAIlB,EAAUtB,EAAM0kC,EACnB5rB,EAAOxa,KACP0oB,EAAMoa,EAAIjiC,QAAS,KAsDpB,OApDY,EAAP6nB,IACJ1lB,EAAWi7B,GAAkB6E,EAAIxiC,MAAOooB,IACxCoa,EAAMA,EAAIxiC,MAAO,EAAGooB,IAIhBrnB,EAAYyoC,IAGhB5lC,EAAW4lC,EACXA,OAASjkC,GAGEikC,GAA4B,iBAAXA,IAC5BpoC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOihC,KAAM,CACZlB,IAAKA,EAKLphC,KAAMA,GAAQ,MACdqgC,SAAU,OACVvf,KAAMsnB,IACHlhC,KAAM,SAAU+/B,GAGnBvC,EAAW/hC,UAEXmW,EAAKgV,KAAMxsB,EAIVD,EAAQ,SAAUmtB,OAAQntB,EAAO2X,UAAWiuB,IAAiBp4B,KAAMvN,GAGnE2lC,KAKExqB,OAAQja,GAAY,SAAUg+B,EAAOmD,GACxC7qB,EAAKvW,KAAM,WACVC,EAASvD,MAAOX,KAAMomC,GAAY,CAAElE,EAAMyG,aAActD,EAAQnD,QAK5DliC,MAMR+C,EAAO6O,KAAKhI,QAAQmgC,SAAW,SAAU3lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOw5B,OAAQ,SAAUr5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOinC,OAAS,CACfC,UAAW,SAAU7lC,EAAMe,EAASjD,GACnC,IAAIgoC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD5X,EAAW5vB,EAAOyhB,IAAKpgB,EAAM,YAC7BomC,EAAUznC,EAAQqB,GAClB2nB,EAAQ,GAGS,WAAb4G,IACJvuB,EAAKkgB,MAAMqO,SAAW,YAGvB2X,EAAYE,EAAQR,SACpBI,EAAYrnC,EAAOyhB,IAAKpgB,EAAM,OAC9BmmC,EAAaxnC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbuuB,GAAwC,UAAbA,KACA,GAA9CyX,EAAYG,GAAa1pC,QAAS,SAMpCwpC,GADAH,EAAcM,EAAQ7X,YACD7iB,IACrBq6B,EAAUD,EAAYzS,OAGtB4S,EAASrX,WAAYoX,IAAe,EACpCD,EAAUnX,WAAYuX,IAAgB,GAGlClpC,EAAY8D,KAGhBA,EAAUA,EAAQ1E,KAAM2D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIolC,KAGjC,MAAfnlC,EAAQ2K,MACZic,EAAMjc,IAAQ3K,EAAQ2K,IAAMw6B,EAAUx6B,IAAQu6B,GAE1B,MAAhBllC,EAAQsyB,OACZ1L,EAAM0L,KAAStyB,EAAQsyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWhlC,EACfA,EAAQslC,MAAMhqC,KAAM2D,EAAM2nB,IAGA,iBAAdA,EAAMjc,MACjBic,EAAMjc,KAAO,MAEa,iBAAfic,EAAM0L,OACjB1L,EAAM0L,MAAQ,MAEf+S,EAAQhmB,IAAKuH,MAKhBhpB,EAAOG,GAAGgC,OAAQ,CAGjB8kC,OAAQ,SAAU7kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNnF,KACAA,KAAKiE,KAAM,SAAU/B,GACpBa,EAAOinC,OAAOC,UAAWjqC,KAAMmF,EAASjD,KAI3C,IAAIwoC,EAAMC,EACTvmC,EAAOpE,KAAM,GAEd,OAAMoE,EAQAA,EAAKwxB,iBAAiBvyB,QAK5BqnC,EAAOtmC,EAAKmzB,wBACZoT,EAAMvmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK46B,EAAK56B,IAAM66B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAE/6B,IAAK,EAAG2nB,KAAM,QATxB,GAuBD9E,SAAU,WACT,GAAM3yB,KAAM,GAAZ,CAIA,IAAI8qC,EAAcd,EAAQ/nC,EACzBmC,EAAOpE,KAAM,GACb+qC,EAAe,CAAEj7B,IAAK,EAAG2nB,KAAM,GAGhC,GAAwC,UAAnC10B,EAAOyhB,IAAKpgB,EAAM,YAGtB4lC,EAAS5lC,EAAKmzB,4BAER,CACNyS,EAAShqC,KAAKgqC,SAId/nC,EAAMmC,EAAK6I,cACX69B,EAAe1mC,EAAK0mC,cAAgB7oC,EAAIyN,gBACxC,MAAQo7B,IACLA,IAAiB7oC,EAAIujB,MAAQslB,IAAiB7oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKsmB,EAAc,YAE1BA,EAAeA,EAAanoC,WAExBmoC,GAAgBA,IAAiB1mC,GAAkC,IAA1B0mC,EAAavpC,YAG1DwpC,EAAehoC,EAAQ+nC,GAAed,UACzBl6B,KAAO/M,EAAOyhB,IAAKsmB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ10B,EAAOyhB,IAAKsmB,EAAc,mBAAmB,IAKpE,MAAO,CACNh7B,IAAKk6B,EAAOl6B,IAAMi7B,EAAaj7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEqzB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO10B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E0mC,aAAc,WACb,OAAO9qC,KAAKmE,IAAK,WAChB,IAAI2mC,EAAe9qC,KAAK8qC,aAExB,MAAQA,GAA2D,WAA3C/nC,EAAOyhB,IAAKsmB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBp7B,QAM1B3M,EAAOkB,KAAM,CAAE00B,WAAY,cAAeD,UAAW,eAAiB,SAAUhc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQnhB,KAAM,SAAUoE,EAAMsY,EAAQva,GAG5C,IAAIwoC,EAOJ,GANKnpC,EAAU4C,GACdumC,EAAMvmC,EACuB,IAAlBA,EAAK7C,WAChBopC,EAAMvmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOwoC,EAAMA,EAAKloB,GAASre,EAAMsY,GAG7BiuB,EACJA,EAAIK,SACFl7B,EAAY66B,EAAIE,YAAV1oC,EACP2N,EAAM3N,EAAMwoC,EAAIC,aAIjBxmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOgzB,SAAUtT,GAASoP,GAAczwB,EAAQiyB,cAC/C,SAAUjvB,EAAMmtB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQltB,EAAMqe,GAGlBsO,GAAUvjB,KAAM+jB,GACtBxuB,EAAQqB,GAAOuuB,WAAYlQ,GAAS,KACpC8O,MAQLxuB,EAAOkB,KAAM,CAAEgnC,OAAQ,SAAUC,MAAO,SAAW,SAAU9lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CAAE0zB,QAAS,QAAUvyB,EAAM2W,QAASra,EAAMypC,GAAI,QAAU/lC,GACpE,SAAUgmC,EAAcC,GAGxBtoC,EAAOG,GAAImoC,GAAa,SAAU3T,EAAQxwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAY+nC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVxwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQnhB,KAAM,SAAUoE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCinC,EAASxqC,QAAS,SACxBuD,EAAM,QAAUgB,GAChBhB,EAAKxE,SAAS8P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK7C,UACTU,EAAMmC,EAAKsL,gBAIJ3J,KAAKgvB,IACX3wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM4zB,GAGxBvyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOouB,IAChC5zB,EAAM0f,EAAYsW,OAAS7xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOlD,KAAKqoB,GAAI3mB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB41B,KAAM,SAAUxS,EAAO9F,EAAMtf,GAC5B,OAAOlD,KAAKqoB,GAAIC,EAAO,KAAM9F,EAAMtf,IAEpCooC,OAAQ,SAAUhjB,EAAOplB,GACxB,OAAOlD,KAAK0oB,IAAKJ,EAAO,KAAMplB,IAG/BqoC,SAAU,SAAUvoC,EAAUslB,EAAO9F,EAAMtf,GAC1C,OAAOlD,KAAKqoB,GAAIC,EAAOtlB,EAAUwf,EAAMtf,IAExCsoC,WAAY,SAAUxoC,EAAUslB,EAAOplB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBrD,KAAK0oB,IAAK1lB,EAAU,MACpBhD,KAAK0oB,IAAKJ,EAAOtlB,GAAY,KAAME,IAGrCuoC,MAAO,SAAUC,EAAQC,GACxB,OAAO3rC,KAAKmuB,WAAYud,GAAStd,WAAYud,GAASD,MAIxD3oC,EAAOkB,KAAM,wLAEgDqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBrD,KAAKqoB,GAAIjjB,EAAM,KAAMod,EAAMtf,GAC3BlD,KAAKmpB,QAAS/jB,MASlB,IAAI2E,GAAQ,qCAMZhH,EAAO6oC,MAAQ,SAAU1oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMq3B,EAUf,GARwB,iBAAZ3oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKArP,EAAY6B,GAalB,OARAqR,EAAOjU,EAAMG,KAAM4D,UAAW,IAC9BunC,EAAQ,WACP,OAAO1oC,EAAGvC,MAAOsC,GAAWjD,KAAMuU,EAAK7T,OAAQJ,EAAMG,KAAM4D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElCykC,GAGR7oC,EAAO8oC,UAAY,SAAUC,GACvBA,EACJ/oC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOgpC,UAAY/oB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO1B,WAAaA,EACpB0B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOqpB,IAAM3jB,KAAK2jB,IAElBrpB,EAAOipC,UAAY,SAAU1qC,GAK5B,IAAII,EAAOqB,EAAOrB,KAAMJ,GACxB,OAAkB,WAATI,GAA8B,WAATA,KAK5BuqC,MAAO3qC,EAAM0xB,WAAY1xB,KAG5ByB,EAAOmpC,KAAO,SAAU5pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXoiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOppC,IAOT,IAGCspC,GAAUtsC,EAAOgD,OAGjBupC,GAAKvsC,EAAOwsC,EAwBb,OAtBAxpC,EAAOypC,WAAa,SAAU/mC,GAS7B,OARK1F,EAAOwsC,IAAMxpC,IACjBhD,EAAOwsC,EAAID,IAGP7mC,GAAQ1F,EAAOgD,SAAWA,IAC9BhD,EAAOgD,OAASspC,IAGVtpC,GAMiB,oBAAb9C,IACXF,EAAOgD,OAAShD,EAAOwsC,EAAIxpC,GAMrBA","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/ide.host.json
index 995a75bea9..edf5a4c65b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/ide.host.json
@@ -1,53 +1,14 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 410,
"icon": "ide/WebApplication.png",
"supportsDocker": true,
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "CloudExisting"
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "Local"
- },
- {
- "auth": "SingleOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "SSO"
- },
- {
- "auth": "MultiOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "MultiOrg"
- },
- {
- "auth": "Windows",
- "authenticationType": "WindowsAuth"
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"symbolInfo": [
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
],
"disableHttpsSymbol": "NoHttps"
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.cs.json
index 9a7972bc95..84560c5568 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Webová aplikace ASP.NET Core (Model-View-Controller)",
+ "description": "Šablona projektu pro vytvoření aplikace ASP.NET Core s ukázkovými zobrazeními a kontrolery ASP.NET Core MVC. Tato šablona se dá použít i pro služby RESTful HTTP.",
+ "symbols/auth/choices/None/description": "Bez ověřování",
+ "symbols/auth/choices/Individual/description": "Ověřování Individual",
+ "symbols/auth/choices/IndividualB2C/description": "Ověřování Individual pomocí Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Ověřování organizace pro jednoho tenanta",
+ "symbols/auth/choices/MultiOrg/description": "Ověřování organizace pro více tenantů",
+ "symbols/auth/choices/Windows/description": "Integrované ověřování Windows",
+ "symbols/auth/description": "Typ ověřování, který se má použít",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C, ke které se chcete připojit (používá se s ověřováním IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID zásad přihlašování a registrace pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Zpětné volání globálního odhlášení (používá se s ověřováním IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID zásad resetování hesla pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID zásad úprav profilu pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory, ke které se chcete připojit (používá se s ověřováním SingleOrg nebo MultiOrg).",
+ "symbols/ClientId/description": "ID klienta pro tento projekt (používá se s ověřováním IndividualB2C, SingleOrg nebo MultiOrg).",
+ "symbols/Domain/description": "Doména pro tenanta adresáře (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/TenantId/description": "TenantId adresáře, ke kterému se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/CallbackPath/description": "Cesta žádosti v rámci základní cesty aplikace k identifikátoru URI pro přesměrování (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Určuje, jestli se této aplikaci povolí přístup ke čtení adresáře (platí jenom pro ověřování SingleOrg nebo MultiOrg).",
+ "symbols/UserSecretsId/description": "ID, které se má použít pro tajné kódy (používá se s ověřováním OrgReadAccess nebo Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají IndividualB2C, SingleOrg ani MultiOrg.",
+ "symbols/UseLocalDB/description": "Určuje, jestli se má použít LocalDB namísto SQLite. Tato možnost platí jenom v případě, že je zadáno --auth Individual nebo --auth IndividualB2C.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/CalledApiUrl/description": "Adresa URL rozhraní API, která se má volat z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Určuje, jestli webová aplikace volá Microsoft Graph. Tato možnost platí pouze v případě, že je zadáno --auth SingleOrg nebo --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Obory, které se mají požádat o volání rozhraní API z webové aplikace Tato možnost platí jenom v případě, že je zadaná možnost --auth SingleOrg, --auth MultiOrg nebo --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.de.json
index 9a7972bc95..ecde667992 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core-Web-App (Model View Controller)",
+ "description": "Eine Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung mit Beispielen für ASP.NET Core-MVC-Ansichten und -Controller. Diese Vorlage kann auch für RESTful HTTP-Dienste verwendet werden.",
+ "symbols/auth/choices/None/description": "Keine Authentifizierung",
+ "symbols/auth/choices/Individual/description": "Individuelle Authentifizierung",
+ "symbols/auth/choices/IndividualB2C/description": "Individuelle Authentifizierung mit Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Organisationsauthentifizierung für einen einzelnen Mandanten",
+ "symbols/auth/choices/MultiOrg/description": "Organisationsauthentifizierung für mehrere Mandanten",
+ "symbols/auth/choices/Windows/description": "Windows-Authentifizierung",
+ "symbols/auth/description": "Der zu verwendende Authentifizierungstyp",
+ "symbols/AAdB2CInstance/description": "Die Azure Active Directory B2C-Instanz, mit der eine Verbindung hergestellt werden soll (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/SignUpSignInPolicyId/description": "Die Anmelde und Registrierungsrichtlinien ID für dieses Projekt (mit IndividualB2C Authentifizierung verwenden).",
+ "symbols/SignedOutCallbackPath/description": "Der Rückruf für die globale Abmeldung (mit individueller B2C Authentifizierung verwenden).",
+ "symbols/ResetPasswordPolicyId/description": "Die Richtlinien ID zum Zurücksetzen des Kennworts für dieses Projekt (mit individueller B2C Authentifizierung verwenden).",
+ "symbols/EditProfilePolicyId/description": "Die Bearbeitungsprofil-Richtlinien-ID für dieses Projekt (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/AADInstance/description": "Die Azure Active Directory-Instanz, mit der eine Verbindung hergestellt werden soll (mit SingleOrg oder MultiOrg Authentifizierung verwenden).",
+ "symbols/ClientId/description": "Die Client ID für dieses Projekt (mit IndividualB2C, SingleOrg oder MultiOrg Authentifizierung verwenden).",
+ "symbols/Domain/description": "Die Domäne für den Verzeichnismandanten (mit SingleOrg oder IndividualB2C Authentifizierung verwenden).",
+ "symbols/TenantId/description": "Die TenantId ID des Verzeichnisses, mit dem eine Verbindung hergestellt werden soll (mit SingleOrg Authentifizierung verwenden).",
+ "symbols/CallbackPath/description": "Der Anforderungspfad innerhalb des Basispfads der Anwendung des Umleitungs-URI (mit SingleOrg- oder IndividualB2C-Authentifizierung verwenden).",
+ "symbols/OrgReadAccess/description": "Ob dieser Anwendung Lesezugriff auf das Verzeichnis gewährt werden soll oder nicht (gilt nur für SingleOrg- oder MultiOrg-Authentifizierung).",
+ "symbols/UserSecretsId/description": "Die für Geheimnisse zu verwendende ID (Verwendung mit OrgReadAccess oder Einzelauthentifizierung).",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS-Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "symbols/UseLocalDB/description": "Ob LocalDB anstelle von SQLite verwendet werden soll. Diese Option gilt nur, wenn --auth Individual oder --auth IndividualB2C angegeben ist.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/CalledApiUrl/description": "URL der API, die von der Web-App aufgerufen werden soll. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/CallsMicrosoftGraph/description": "Gibt an, ob die Web-App Microsoft Graph aufruft. Diese Option gilt nur, wenn --auth SingleOrg oder --auth MultiOrg angegeben ist.",
+ "symbols/CalledApiScopes/description": "Anzufordernde Bereiche zum Aufrufen der API von der Web-App. Diese Option gilt nur, wenn --auth SingleOrg, --auth MultiOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.en.json
index 4f01b0e182..2b0f9ba5f7 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.en.json
@@ -23,10 +23,10 @@
"symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
"symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
"symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
"symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
"symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
"symbols/Framework/description": "The target framework for the project.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
@@ -34,8 +34,9 @@
"symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
"symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
"symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.es.json
index 9a7972bc95..0dcd3db8f8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicación web de ASP.NET Core (Modelo-Vista-Controlador)",
+ "description": "Una plantilla de proyecto para crear una aplicación ASP.NET Core con controladores y vistas de ASP.NET Core MVC de ejemplo. Esta plantilla también puede usarse para servicios RESTful HTTP.",
+ "symbols/auth/choices/None/description": "Sin autenticación",
+ "symbols/auth/choices/Individual/description": "Autenticación individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticación individual con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticación organizacional para un único inquilino",
+ "symbols/auth/choices/MultiOrg/description": "Autenticación organizacional para varios inquilinos",
+ "symbols/auth/choices/Windows/description": "Autenticación de Windows",
+ "symbols/auth/description": "El tipo de autenticación que se va a usar",
+ "symbols/AAdB2CInstance/description": "Instancia de Azure Active Directory B2C a la que conectarse (se usa con la autenticación IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Id. de la directiva de inicio de sesión y registro para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Devolución de llamada de cierre de sesión global (se usa con la autenticación IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Id. de directiva de restablecimiento de contraseña para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Id. de la directiva de perfil de edición para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/AADInstance/description": "Instancia de Azure Active Directory a la que se va a conectar (se usa con la autenticación SingleOrg o MultiOrg).",
+ "symbols/ClientId/description": "Id. de cliente de este proyecto (se usa con la autenticación IndividualB2C, SingleOrg o MultiOrg).",
+ "symbols/Domain/description": "Dominio del inquilino de directorio (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/TenantId/description": "Id. de TenantId del directorio al que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/CallbackPath/description": "Ruta de acceso de solicitud dentro de la ruta de acceso base de la aplicación del URI de redireccionamiento (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indica si se va a permitir o no el acceso de lectura de esta aplicación al directorio (solo se aplica a la autenticación SingleOrg o MultiOrg).",
+ "symbols/UserSecretsId/description": "Id. que se va a usar para los secretos (se usa con OrgReadAccess o con la autenticación individual).",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Ya sea para desactivar HTTPS. Esta opción solo se aplica si no se utilizan IndividualB2C, SingleOrg o MultiOrg para la autenticación.",
+ "symbols/UseLocalDB/description": "Indica si se va a usar LocalDB en lugar de SQLite. Esta opción solo se aplica si se especifica --auth Individual o --auth IndividualB2C.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/CalledApiUrl/description": "Dirección URL de la API a la que se va a llamar desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica si la aplicación web llama a Microsoft Graph. Esta opción solo se aplica si se especifica --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ámbitos para solicitar llamar a la API desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.fr.json
index 9a7972bc95..9edac9a030 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Application web ASP.NET Core (modèle-vue-contrôleur)",
+ "description": "Modèle de projet permettant de créer une application ASP.NET Core avec des exemples de vues et de contrôleurs ASP.NET Core MVC. Vous pouvez également utiliser ce modèle pour les services HTTP RESTful.",
+ "symbols/auth/choices/None/description": "Aucune authentification",
+ "symbols/auth/choices/Individual/description": "Authentification individuelle",
+ "symbols/auth/choices/IndividualB2C/description": "Authentification individuelle avec Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Authentification organisationnelle pour un seul locataire",
+ "symbols/auth/choices/MultiOrg/description": "Authentification organisationnelle pour plusieurs locataires",
+ "symbols/auth/choices/Windows/description": "Authentification Windows",
+ "symbols/auth/description": "Type d’authentification à utiliser",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C à laquelle se connecter (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID de stratégie de connexion et d’inscription pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Rappel de déconnexion global (utilisé avec l’authentification IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID de stratégie de réinitialisation de mot de passe pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID de stratégie de modification de profil pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory à laquelle se connecter (à utiliser avec l’authentification SingleOrg ou MultiOrg).",
+ "symbols/ClientId/description": "ID client de ce projet (à utiliser avec l’authentification IndividualB2C, SingleOrg ou MultiOrg).",
+ "symbols/Domain/description": "Domaine du locataire d’annuaire (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/TenantId/description": "ID TenantId du répertoire auquel se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/CallbackPath/description": "Chemin de la demande dans le chemin de base de l’application de l’URI de redirection (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indique si cette application doit autoriser ou non l’accès en lecture à l’annuaire (s’applique uniquement à l’authentification SingleOrg ou MultiOrg).",
+ "symbols/UserSecretsId/description": "ID à utiliser pour les secrets (à utiliser avec OrgReadAccess ou l’authentification individuelle).",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https est ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "symbols/UseLocalDB/description": "Indique s’il faut utiliser localDB au lieu de SQLite. Cette option s’applique uniquement si --auth Individual ou --auth IndividualB2C est spécifié.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/CalledApiUrl/description": "URL de l’API à appeler à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/CallsMicrosoftGraph/description": "Spécifie si l’application web appelle Microsoft Graph. Cette option s’applique uniquement si --auth SingleOrg ou --auth MultiOrg est spécifié.",
+ "symbols/CalledApiScopes/description": "Étendues pour demander à appeler l’API à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.it.json
index 9a7972bc95..633250863a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "App Web ASP.NET Core (Model-View-Controller)",
+ "description": "Modello di progetto per la creazione di un'applicazione ASP.NET Core con viste e controller ASP.NET Core MVC di esempio. È possibile usare questo modello anche per i servizi HTTP RESTful.",
+ "symbols/auth/choices/None/description": "Nessuna autenticazione",
+ "symbols/auth/choices/Individual/description": "Autenticazione singola",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticazione singola con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticazione organizzativa per un singolo tenant",
+ "symbols/auth/choices/MultiOrg/description": "Autenticazione dell'organizzazione per più tenant",
+ "symbols/auth/choices/Windows/description": "Autenticazione di Windows",
+ "symbols/auth/description": "Tipo di autenticazione da usare.",
+ "symbols/AAdB2CInstance/description": "Istanza di Azure Active Directory B2C a cui connettersi (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID dei criteri di accesso e iscrizione per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Callback di disconnessione globale (usare con l'autenticazione IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "ID dei criteri di reimpostazione della password per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "ID dei criteri del profilo di modifica per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/AADInstance/description": "Istanza di Azure Active Directory a cui connettersi (usare con l'autenticazione SingleOrg o MultiOrg).",
+ "symbols/ClientId/description": "ID client per questo progetto (usare con l'autenticazione IndividualB2C, SingleOrg o MultiOrg).",
+ "symbols/Domain/description": "Il dominio per il tenant della directory (da usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/TenantId/description": "ID TenantId della directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/CallbackPath/description": "Percorso della richiesta all'interno del percorso di base dell'applicazione dell'URI di reindirizzamento (usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Indica se consentire o meno a questa applicazione l'accesso in lettura alla directory (si applica solo all'autenticazione SingleOrg o MultiOrg).",
+ "symbols/UserSecretsId/description": "ID da usare per i segreti (usare con OrgReadAccess o l'autenticazione singola).",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si utilizza IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "symbols/UseLocalDB/description": "Indica se usare LocalDB invece di SQLite. Questa opzione si applica solo se è specificato --auth Individual o --auth IndividualB2C.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/CalledApiUrl/description": "URL dell'API da chiamare dall'app Web. Questa opzione si applica solo se si specifica --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Specifica se l'app Web chiama Microsoft Graph. Questa opzione si applica solo se è specificato --auth SingleOrg o --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Ambiti per richiedere di chiamare l'API dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg, --auth MultiOrg o --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ja.json
index 9a7972bc95..2819fcb995 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web アプリ (Model-View-Controller)",
+ "description": "ASP.NET Core MVC のサンプル ビューとコントローラーで ASP.NET Core アプリケーションを作成するためのプロジェクト テンプレートです。このテンプレートは RESTful HTTP サービスでも使用できます。",
+ "symbols/auth/choices/None/description": "認証なし",
+ "symbols/auth/choices/Individual/description": "個別の認証",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C を使用した個別の認証",
+ "symbols/auth/choices/SingleOrg/description": "単一テナントの組織認証",
+ "symbols/auth/choices/MultiOrg/description": "複数のテナントの組織認証",
+ "symbols/auth/choices/Windows/description": "Windows 認証",
+ "symbols/auth/description": "使用する認証の種類",
+ "symbols/AAdB2CInstance/description": "接続先の Azure Active Directory B2C インスタンス (IndividualB2C 認証で使用)。",
+ "symbols/SignUpSignInPolicyId/description": "このプロジェクトのサインインおよびサインアップのポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/SignedOutCallbackPath/description": "グローバル サインアウト コールバック (IndividualB2C 認証で使用)。",
+ "symbols/ResetPasswordPolicyId/description": "このプロジェクトのパスワードのリセット ポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/EditProfilePolicyId/description": "このプロジェクトの編集プロファイル ポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/AADInstance/description": "接続先の Azure Active Directory インスタンス (SingleOrg または MultiOrg 認証で使用)。",
+ "symbols/ClientId/description": "このプロジェクトのクライアント ID (IndividualB2C、SingleOrg、または MultiOrg 認証で使用)。",
+ "symbols/Domain/description": "ディレクトリ テナントのドメイン (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/TenantId/description": "接続先のディレクトリの TenantId ID (SingleOrg 認証で使用)。",
+ "symbols/CallbackPath/description": "リダイレクト URI のアプリケーションのベース パス内の要求パス (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/OrgReadAccess/description": "このアプリケーションにディレクトリへの読み取りアクセスを許可するかどうか (SingleOrg または MultiOrg 認証にのみ適用されます)。",
+ "symbols/UserSecretsId/description": "シークレットで使用する ID (OrgReadAccess または個別の認証で使用)。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、no-https パラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、no-https は無視されます)。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "symbols/UseLocalDB/description": "SQLite の代わりに LocalDB を使用するかどうか。このオプションは、--auth Individual または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/CalledApiUrl/description": "Web アプリから呼び出す API の URL。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/CallsMicrosoftGraph/description": "Web アプリが Microsoft Graph を呼び出すかどうかを指定します。このオプションは、--auth SingleOrg または --auth MultiOrg が指定されている場合にのみ適用されます。",
+ "symbols/CalledApiScopes/description": "Web アプリから API を呼び出す要求へのスコープ。このオプションは、--auth SingleOrg、--auth MultiOrg、または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ko.json
index 9a7972bc95..057ba7d0cf 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 웹앱(Model-View-Controller)",
+ "description": "예제 ASP.NET Core MVC 뷰 및 컨트롤러를 사용하여 ASP.NET Core 애플리케이션을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿은 RESTful HTTP 서비스에도 사용할 수 있습니다.",
+ "symbols/auth/choices/None/description": "인증 없음",
+ "symbols/auth/choices/Individual/description": "개별 인증",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C를 사용한 개별 인증",
+ "symbols/auth/choices/SingleOrg/description": "단일 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/MultiOrg/description": "여러 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/Windows/description": "Windows 인증",
+ "symbols/auth/description": "사용할 인증 유형",
+ "symbols/AAdB2CInstance/description": "연결할 Azure Active Directory B2C 인스턴스(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignUpSignInPolicyId/description": "이 프로젝트의 로그인 및 등록 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignedOutCallbackPath/description": "전역 로그아웃 콜백입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/ResetPasswordPolicyId/description": "이 프로젝트의 암호 초기화 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/EditProfilePolicyId/description": "이 프로젝트의 편집 프로필 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/AADInstance/description": "연결할 Azure Active Directory 인스턴스입니다(SingleOrg 또는 MultiOrg 인증과 함께 사용).",
+ "symbols/ClientId/description": "이 프로젝트의 클라이언트 ID입니다(IndividualB2C, SingleOrg 또는 MultiOrg 인증과 함께 사용).",
+ "symbols/Domain/description": "디렉터리 테넌트의 도메인입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/TenantId/description": "연결할 디렉터리의 TenantId ID입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/CallbackPath/description": "리디렉션 URI의 애플리케이션 기본 경로 내의 요청 경로(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/OrgReadAccess/description": "이 애플리케이션이 디렉터리에 대한 읽기 액세스를 허용할지 여부(SingleOrg 또는 MultiOrg 인증에만 적용됨).",
+ "symbols/UserSecretsId/description": "비밀에 사용할 ID입니다(OrgReadAccess 또는 개별 인증과 함께 사용).",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 개별B2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/UseLocalDB/description": "SQLite 대신 LocalDB를 사용할지 여부입니다. 이 옵션은 --auth Individual 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/CalledApiUrl/description": "웹앱에서 호출할 API의 URL입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/CallsMicrosoftGraph/description": "웹앱이 Microsoft Graph를 호출하는지 여부를 지정합니다. 이 옵션은 --auth SingleOrg 또는 --auth MultiOrg가 지정된 경우에만 적용됩니다.",
+ "symbols/CalledApiScopes/description": "웹앱에서 API 호출을 요청할 범위입니다. 이 옵션은 --auth SingleOrg, --auth MultiOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pl.json
index 9a7972bc95..3d2da182f1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplikacja internetowa ASP.NET Core (Model-View-Controller)",
+ "description": "Szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core z przykładowymi widokami i kontrolerami platformy ASP.NET Core MVC. Tego szablonu można także użyć dla usług HTTP RESTful.",
+ "symbols/auth/choices/None/description": "Bez uwierzytelniania",
+ "symbols/auth/choices/Individual/description": "Uwierzytelnianie indywidualne",
+ "symbols/auth/choices/IndividualB2C/description": "Indywidualne uwierzytelnianie za pomocą usługi Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Uwierzytelnianie organizacyjne dla pojedynczej dzierżawy",
+ "symbols/auth/choices/MultiOrg/description": "Uwierzytelnianie organizacyjne dla wielu dzierżaw",
+ "symbols/auth/choices/Windows/description": "Uwierzytelnianie systemu Windows",
+ "symbols/auth/description": "Typ uwierzytelniania, który ma zostać użyty.",
+ "symbols/AAdB2CInstance/description": "Wystąpienie usługi Azure Active Directory B2C do nawiązania połączenia (użyj z uwierzytelnianym IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Identyfikator zasad logowania i rejestracji dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Globalne wywołanie zwrotne wylogowania (używane z uwierzytelnianym IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Identyfikator zasad resetowania haseł dla tego projektu (użyj z uwierzytelnianiem IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Identyfikator zasad edycji profilu dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/AADInstance/description": "Wystąpienie usługi Azure Active Directory do nawiązania połączenia (użyj z uwierzytelnianym singleOrg lub MultiOrg).",
+ "symbols/ClientId/description": "Identyfikator klienta dla tego projektu (użyj uwierzytelniania IndividualB2C, SingleOrg lub MultiOrg).",
+ "symbols/Domain/description": "Domena dzierżawy katalogu (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/TenantId/description": "Identyfikator TenantId katalogu, z którym ma zostać nawiązane połączenie (użyj uwierzytelniania SingleOrg).",
+ "symbols/CallbackPath/description": "Ścieżka żądania w ścieżce podstawowej aplikacji identyfikatora URI przekierowania (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Określa, czy zezwolić tej aplikacji na dostęp do odczytu do katalogu (dotyczy tylko uwierzytelniania SingleOrg lub MultiOrg).",
+ "symbols/UserSecretsId/description": "Identyfikator do użycia na potrzeby wpisów tajnych (używany z funkcją OrgReadAccess lub indywidualnym uwierzytelnianiem).",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy elementy IndividualB2C, SingleOrg lub MultiOrg nie są używane dla uwierzytelniania --auth.",
+ "symbols/UseLocalDB/description": "Określa, czy używać bazy danych LocalDB zamiast oprogramowania SQLite. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth Individual lub --auth IndividualB2C.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/CalledApiUrl/description": "Adres URL interfejsu API do wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Określa, czy aplikacja internetowa wywołuje program Microsoft Graph. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg lub --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Zakresy do żądania wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg, --auth MultiOrg lub --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 9a7972bc95..940a2d24b5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicativo Web do ASP.NET Core (Model-View-Controller)",
+ "description": "Um modelo de projeto para criar um aplicativo ASP.NET Core com Controladores e Exibições do ASP.NET Core MVC de exemplo. Esse modelo também pode ser usado para serviços HTTP RESTful.",
+ "symbols/auth/choices/None/description": "Sem autenticação",
+ "symbols/auth/choices/Individual/description": "Autenticação individual",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticação individual com Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticação organizacional para um único locatário",
+ "symbols/auth/choices/MultiOrg/description": "Autenticação organizacional para vários locatários",
+ "symbols/auth/choices/Windows/description": "autenticação do Windows",
+ "symbols/auth/description": "O tipo de autenticação a ser usado",
+ "symbols/AAdB2CInstance/description": "A instância do Azure Active Directory B2C à qual se conectar (use com autenticação IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "O ID da política de login e inscrição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "O retorno de chamada de saída global (use com autenticação IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "O ID da política de redefinição de senha para este projeto (use com autenticação IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "O ID de política de perfil de edição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/AADInstance/description": "A instância do Azure Active Directory à qual se conectar (use com autenticação SingleOrg ou MultiOrg).",
+ "symbols/ClientId/description": "O ID do cliente para este projeto (use com autenticação IndividualB2C, SingleOrg ou MultiOrg).",
+ "symbols/Domain/description": "O domínio para o locatário do diretório (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/TenantId/description": "O ID TenantId do diretório ao qual se conectar (use com autenticação SingleOrg).",
+ "symbols/CallbackPath/description": "O caminho de solicitação no caminho base do aplicativo do URI de redirecionamento (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Se deve ou não permitir o acesso de leitura deste aplicativo ao diretório (aplica-se apenas à autenticação SingleOrg ou MultiOrg).",
+ "symbols/UserSecretsId/description": "O ID a ser usado para segredos (use com OrgReadAccess ou Autenticação individual).",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção só se aplica se IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "symbols/UseLocalDB/description": "Se deve usar LocalDB em vez de SQLite. Esta opção só se aplica se --auth Individual ou --auth IndividualB2C for especificado.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/CalledApiUrl/description": "URL da API para chamar do aplicativo Web. Esta opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C for especificado.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica se o aplicativo Web chama o Microsoft Graph. Esta opção só se aplica se --auth SingleOrg ou --auth MultiOrg for especificado.",
+ "symbols/CalledApiScopes/description": "Escopos a serem solicitados para chamar a API do aplicativo Web. Esta opção só se aplica se --auth SingleOrg, --auth MultiOrg ou --auth IndividualB2C for especificado.",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ru.json
index 9a7972bc95..a9d425541e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,41 +1,41 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Веб-приложение ASP.NET Core (модель-представление-контроллер)",
+ "description": "Шаблон проекта для создания приложения ASP.NET Core с образцом представлений MVC и контроллеров ASP.NET Core. Этот шаблон можно также использовать для служб HTTP RESTful.",
+ "symbols/auth/choices/None/description": "Без проверки подлинности",
+ "symbols/auth/choices/Individual/description": "Индивидуальная проверка подлинности",
+ "symbols/auth/choices/IndividualB2C/description": "Индивидуальная проверка подлинности в Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Проверка подлинности в организации для одного клиента",
+ "symbols/auth/choices/MultiOrg/description": "Проверка подлинности в организации для нескольких клиентов",
+ "symbols/auth/choices/Windows/description": "Проверка подлинности Windows",
+ "symbols/auth/description": "Тип используемой проверки подлинности",
+ "symbols/AAdB2CInstance/description": "Экземпляр Azure Active Directory B2C, к которому нужно подключиться (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Идентификатор политики входа и регистрации для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignedOutCallbackPath/description": "Глобальный обратный вызов для выхода (используется с проверкой подлинности IndividualB2C).",
+ "symbols/ResetPasswordPolicyId/description": "Идентификатор политики сброса паролей для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/EditProfilePolicyId/description": "Идентификатор политики изменения профиля для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/AADInstance/description": "Экземпляр Azure Active Directory, к которому нужно подключиться (используется с проверкой подлинности SingleOrg или MultiOrg).",
+ "symbols/ClientId/description": "Идентификатор клиента для этого проекта (используется с проверкой подлинности IndividualB2C, SingleOrg или MultiOrg).",
+ "symbols/Domain/description": "Домен для клиента каталога (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/TenantId/description": "Идентификатор TenantId каталога, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/CallbackPath/description": "Путь запроса в базовом пути приложения к URI перенаправления (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/OrgReadAccess/description": "Следует ли предоставлять этому приложению доступ на чтение к каталогу (применяется только к проверке подлинности SingleOrg или MultiOrg).",
+ "symbols/UserSecretsId/description": "Идентификатор, используемый для секретов (используется с проверкой подлинности OrgReadAccess или Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются IndividualB2C, SingleOrg или MultiOrg.",
+ "symbols/UseLocalDB/description": "Следует ли использовать LocalDB вместо SQLite. Этот параметр применяется, только если указывается --auth Individual или --auth IndividualB2C.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/CalledApiUrl/description": "URL-адрес API для вызова из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Указывает, вызывает ли веб-приложение Microsoft Graph. Этот параметр применяется, только если указывается --auth SingleOrg или --auth MultiOrg.",
+ "symbols/CalledApiScopes/description": "Области для запроса вызова API из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg, --auth MultiOrg или --auth IndividualB2C.",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.tr.json
index 9a7972bc95..294e57e541 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web Uygulaması (Model-Görünüm-Denetleyici)",
+ "description": "Örnek ASP.NET Core MVC Görünümleri ve Denetleyicileri içeren bir ASP.NET Core uygulaması oluşturmaya yönelik proje şablonu. Bu şablon aynı zamanda RESTful HTTP hizmetleri için de kullanılabilir.",
+ "symbols/auth/choices/None/description": "Kimlik doğrulaması yok",
+ "symbols/auth/choices/Individual/description": "Bireysel kimlik doğrulaması",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C ile bireysel kimlik doğrulaması",
+ "symbols/auth/choices/SingleOrg/description": "Tek bir kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/MultiOrg/description": "Birden çok kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/Windows/description": "Windows kimlik doğrulaması",
+ "symbols/auth/description": "Kullanılacak kimlik doğrulaması türü",
+ "symbols/AAdB2CInstance/description": "Bağlanılacak Azure Active Directory B2C örneği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignUpSignInPolicyId/description": "Bu proje için oturum açma ve kaydolma ilkesi kimliği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignedOutCallbackPath/description": "Genel oturum kapatma geri araması (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/ResetPasswordPolicyId/description": "Bu proje için parola ilkesi sıfırlama kimliği (IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/EditProfilePolicyId/description": "Bu proje için düzenleme profil ilkesi kimliği (IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/AADInstance/description": "Bağlanılacak Azure Active Directory örneği (SingleOrg veya MultiOrg kimlik doğrulaması ile kullanın).",
+ "symbols/ClientId/description": "Bu proje için İstemci Kimliği (IndividualB2C, SingleOrg veya MultiOrg kimlik doğrulaması ile kullanın).",
+ "symbols/Domain/description": "Dizin kiracısı için etki alanı (SingleOrg veya IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/TenantId/description": "Bağlanılacak dizinin TenantId kimliği (SingleOrg kimlik doğrulamasıyla kullanın).",
+ "symbols/CallbackPath/description": "Yeniden yönlendirme URI'sinin uygulama temel dizini yolu içindeki istek yolu (SingleOrg veya IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/OrgReadAccess/description": "Bu uygulamanın dizin okuma erişimine izin verilip verilmeyeceği (yalnızca SingleOrg veya MultiOrg kimlik doğrulaması için geçerlidir).",
+ "symbols/UserSecretsId/description": "Gizli diziler için kullanılan kimlik (OrgReadAccess veya Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "symbols/UseLocalDB/description": "SQLite yerine LocalDB'nin kullanılıp kullanılmayacağı. Bu seçenek yalnızca --auth Individual veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/CalledApiUrl/description": "Web uygulamasından çağrılan API URL'si. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/CallsMicrosoftGraph/description": "Web uygulamasının Microsoft Graph çağırıp çağırmadığını belirtir. Bu seçenek yalnızca --auth SingleOrg veya --auth MultiOrg belirtilirse geçerlidir.",
+ "symbols/CalledApiScopes/description": "Web uygulamasından API çağırma istek kapsamları. Bu seçenek yalnızca --auth SingleOrg, --auth MultiOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 9a7972bc95..64eca82a00 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web 应用(模型-视图-控制器)",
+ "description": "用于创建包含示例 ASP.NET Core MVC 视图和控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 RESTful HTTP 服务。",
+ "symbols/auth/choices/None/description": "无身份验证",
+ "symbols/auth/choices/Individual/description": "个人身份验证",
+ "symbols/auth/choices/IndividualB2C/description": "使用 Azure AD B2C 进行个人身份验证",
+ "symbols/auth/choices/SingleOrg/description": "单个租户的组织身份验证",
+ "symbols/auth/choices/MultiOrg/description": "多个租户的组织身份验证",
+ "symbols/auth/choices/Windows/description": "Windows 身份验证",
+ "symbols/auth/description": "要使用的身份验证类型",
+ "symbols/AAdB2CInstance/description": "要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignedOutCallbackPath/description": "全局注销回调(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/ResetPasswordPolicyId/description": "此项目的重置密码策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/EditProfilePolicyId/description": "此项目的编辑配置文件策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/AADInstance/description": "要连接到的 Azure Active Directory 实例(与 SingleOrg 或 MultiOrg 身份验证一起使用)。",
+ "symbols/ClientId/description": "此项目的客户端 ID (与 IndividualB2C、SingleOrg 或 MultiOrg 身份验证一起使用)。",
+ "symbols/Domain/description": "目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/TenantId/description": "要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。",
+ "symbols/CallbackPath/description": "重定向 URI 的应用程序基路径内的请求路径(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/OrgReadAccess/description": "是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 或 MultiOrg 身份验证)。",
+ "symbols/UserSecretsId/description": "用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/CalledApiUrl/description": "要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 或 --auth MultiOrg 时,此选项才适用。",
+ "symbols/CalledApiScopes/description": "请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 9a7972bc95..2f869e94ef 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,41 +1,41 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/Individual/description": "Individual authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/MultiOrg/description": "Organizational authentication for multiple tenants",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/SignedOutCallbackPath/description": "The global signout callback (use with IndividualB2C auth).",
- "symbols/ResetPasswordPolicyId/description": "The reset password policy ID for this project (use with IndividualB2C auth).",
- "symbols/EditProfilePolicyId/description": "The edit profile policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg or MultiOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with IndividualB2C, SingleOrg or MultiOrg auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/CallbackPath/description": "The request path within the application's base path of the redirect URI (use with SingleOrg or IndividualB2C auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg or MultiOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg or --auth MultiOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg, --auth MultiOrg or --auth IndividualB2C is specified.",
- "symbols/UseProgramMain/displayName": "Use an Program class and Main method.",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web 應用程式 (Model-View-Controller)",
+ "description": "用於建立 ASP.NET Core 應用程式的專案範本,附有 ASP.NET Core MVC 的檢視及控制器範例。此範本也可用於 RESTful HTTP 服務。",
+ "symbols/auth/choices/None/description": "沒有驗證",
+ "symbols/auth/choices/Individual/description": "個別驗證",
+ "symbols/auth/choices/IndividualB2C/description": "具有 Azure AD B2C 的個別驗證",
+ "symbols/auth/choices/SingleOrg/description": "單一租用戶的組織驗證",
+ "symbols/auth/choices/MultiOrg/description": "多個租用戶的組織驗證",
+ "symbols/auth/choices/Windows/description": "Windows 驗證",
+ "symbols/auth/description": "要使用的驗證類型。",
+ "symbols/AAdB2CInstance/description": "要連線的 Azure Active Directory B2C 執行個體 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此專案的登入和註冊原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignedOutCallbackPath/description": "全域登出回呼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/ResetPasswordPolicyId/description": "此專案的重設密碼原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/EditProfilePolicyId/description": "此專案的編輯設定檔原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/AADInstance/description": "要連線到的 Azure Active Directory 執行個體 (搭配 SingleOrg 或 MultiOrg 驗證使用)。",
+ "symbols/ClientId/description": "此專案的用戶端識別碼 (搭配 IndividualB2C、SingleOrg 或 MultiOrg 驗證使用)。",
+ "symbols/Domain/description": "目錄租用戶的網域 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/TenantId/description": "要連線到目錄的 TenantId 識別碼 (搭配 SingleOrg 驗證使用)。",
+ "symbols/CallbackPath/description": "重新導向 URI 的應用程式基底路徑內的要求路徑 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/OrgReadAccess/description": "是否要允許此應用程式讀取存取目錄 (只適用於 SingleOrg 或 MultiOrg 驗證)。",
+ "symbols/UserSecretsId/description": "用於祕密的識別碼 (搭配 OrgReadAccess 或個別驗證使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而非 SQLite。只有在已指定 --auth Individual 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/CalledApiUrl/description": "要從 Web 應用程式呼叫的 API URL。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 應用程式呼叫是否 Microsoft Graph。只有在已指定 --auth SingleOrg 或 --auth MultiOrg 時,才適用此選項。",
+ "symbols/CalledApiScopes/description": "要求從 Web 應用程式呼叫 API 的範圍。只有在已指定 --auth SingleOrg、--auth MultiOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/template.json
index a2af2cbbf6..033195b6b8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/.template.config/template.json
@@ -253,7 +253,7 @@
"kestrelHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"kestrelHttpsPortGenerated": {
"type": "generated",
@@ -293,7 +293,7 @@
"iisHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"iisHttpsPortGenerated": {
"type": "generated",
@@ -346,13 +346,21 @@
},
"RequiresHttps": {
"type": "computed",
- "value": "(OrganizationalAuth || IndividualAuth || !NoHttps)"
+ "value": "(OrganizationalAuth || IndividualB2CAuth)"
+ },
+ "HasHttpProfile": {
+ "type": "computed",
+ "value": "(!RequiresHttps)"
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(RequiresHttps || !NoHttps)"
},
"NoHttps": {
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ "description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
},
"UseLocalDB": {
"type": "parameter",
@@ -422,7 +430,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.Main.cs
index 5fda9092d0..4cd34b1c9a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.Main.cs
@@ -129,7 +129,7 @@ public class Program
#endif
{
app.UseExceptionHandler("/Home/Error");
- #if (RequiresHttps)
+ #if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
@@ -142,9 +142,6 @@ public class Program
app.UseRouting();
- #if (OrganizationalAuth || IndividualAuth || WindowsAuth)
- app.UseAuthentication();
- #endif
app.UseAuthorization();
app.MapControllerRoute(
@@ -156,4 +153,4 @@ public class Program
app.Run();
}
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.cs
index b4d8bdfc7a..8d79c7c943 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Program.cs
@@ -123,7 +123,7 @@ if (!app.Environment.IsDevelopment())
#endif
{
app.UseExceptionHandler("/Home/Error");
-#if (RequiresHttps)
+#if (HasHttpsProfile)
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
@@ -136,9 +136,6 @@ app.UseStaticFiles();
app.UseRouting();
-#if (OrganizationalAuth || IndividualAuth || WindowsAuth)
-app.UseAuthentication();
-#endif
app.UseAuthorization();
app.MapControllerRoute(
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Properties/launchSettings.json
index 316f54a0fe..0490f0dc76 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/Properties/launchSettings.json
@@ -9,7 +9,7 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(RequiresHttps)
+ //#if (HasHttpsProfile)
"sslPort": 44300
//#else
"sslPort": 0
@@ -17,19 +17,28 @@
}
},
"profiles": {
- "Company.WebApplication1": {
+ //#if (HasHttpProfile)
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(RequiresHttps)
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#else
"applicationUrl": "http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/css/site.css b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/css/site.css
index f27e5ad205..f8d98fcb77 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/css/site.css
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/css/site.css
@@ -8,6 +8,10 @@ html {
}
}
+.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus {
+ box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb;
+}
+
html {
position: relative;
min-height: 100%;
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
index 0bdc1962b6..984713a496 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
@@ -1,12 +1,23 @@
-Copyright (c) .NET Foundation. All rights reserved.
+The MIT License (MIT)
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-these files except in compliance with the License. You may obtain a copy of the
-License at
+Copyright (c) .NET Foundation and Contributors
-http://www.apache.org/licenses/LICENSE-2.0
+All rights reserved.
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 73f5298394..009306070a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,7 +1,10 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index 553d427471..d8d803c65e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive});
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt
index e4e5e00ef0..599bdf2c72 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright JS Foundation and other contributors, https://js.foundation/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-CSharp/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAC1B,mBAAbD,EAAIE,MAIVC,EAAW,SAAmBH,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB8B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOtC,GAGC0C,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQxB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCyB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa/B,GAMrB,IAAIgC,IAAWhC,GAAO,WAAYA,GAAOA,EAAIgC,OAC5C3B,EAAOmB,EAAQxB,GAEhB,OAAKD,EAAYC,KAASG,EAAUH,KAIpB,UAATK,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAOhC,GArWhE0B,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOpD,EAAMG,KAAMT,OAKpB2D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGtD,EAAMG,KAAMT,MAIb4D,EAAM,EAAI5D,KAAM4D,EAAM5D,KAAKsD,QAAWtD,KAAM4D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAOhE,KAAKyD,cAAeK,GAM5C,OAHAC,EAAIE,WAAajE,KAGV+D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMlE,KAAMmE,IAG3BC,IAAK,SAAUD,GACd,OAAOnE,KAAK6D,UAAWb,EAAOoB,IAAKpE,KAAM,SAAUqE,EAAMlC,GACxD,OAAOgC,EAAS1D,KAAM4D,EAAMlC,EAAGkC,OAIjC/D,MAAO,WACN,OAAON,KAAK6D,UAAWvD,EAAMK,MAAOX,KAAMsE,aAG3CC,MAAO,WACN,OAAOvE,KAAKwE,GAAI,IAGjBC,KAAM,WACL,OAAOzE,KAAKwE,IAAK,IAGlBE,KAAM,WACL,OAAO1E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO7E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM9E,KAAKsD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO9E,KAAK6D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE9E,KAAM+E,IAAQ,KAG5DC,IAAK,WACJ,OAAOhF,KAAKiE,YAAcjE,KAAKyD,eAKhC7C,KAAMA,EACNqE,KAAM/E,EAAI+E,KACVC,OAAQhF,EAAIgF,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBpE,EAAYoE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASzF,KACTmC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAIvG,MAAOuG,IAGlBC,KAAM,aAENX,cAAe,SAAUrE,GACxB,IAAIiF,EAAOC,EAIX,SAAMlF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BiF,EAAQpG,EAAUmB,KASK,mBADvBkF,EAAOxF,EAAOP,KAAM8F,EAAO,gBAAmBA,EAAM9C,cACfvC,EAAWT,KAAM+F,KAAWrF,IAGlEsF,cAAe,SAAUnF,GACxB,IAAI+D,EAEJ,IAAMA,KAAQ/D,EACb,OAAO,EAER,OAAO,GAKRoF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU5C,EAAK6C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa/B,IAEjB,IADAgC,EAAShC,EAAIgC,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,WAIF,IAAMA,KAAKb,EACV,IAAgD,IAA3C6C,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,MAKH,OAAOb,GAIRqF,UAAW,SAAUzG,EAAK0G,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAP1G,IACCmD,EAAajD,OAAQF,IACzB8C,EAAOgB,MAAOD,EACE,iBAAR7D,EACN,CAAEA,GAAQA,GAGZU,EAAKH,KAAMsD,EAAK7D,IAIX6D,GAGR8C,QAAS,SAAUxC,EAAMnE,EAAKiC,GAC7B,OAAc,MAAPjC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKmE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQpG,KAAMkD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,GAMb,OAAO5G,EAAMwD,IAIdqD,KAAM,EAINhG,QAASA,IAGa,mBAAXiG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAapH,EAAKmH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC1F,SAAUC,EAAInC,GACbvE,EAAY,WAAauE,EAAO,KAAQA,EAAKoC,gBAmB/C,IAAIC,EAWJ,SAAY3H,GACZ,IAAIoC,EACHf,EACAuG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxI,EACAyI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe5I,EAAOH,SACtBgJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRnH,EAAS,GAAOC,eAChBf,EAAM,GACNoJ,EAAMpJ,EAAIoJ,IACVC,EAAarJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU2I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOjL,MAAO,GAAM,MAEtC,OAAOkL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGxL,MAAO,GAAI,GAAM,KAC1BwL,EAAGE,WAAYF,EAAGxI,OAAS,GAAIvC,SAAU,IAAO,IAI3C,KAAO+K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC3L,EAAKD,MACFT,EAAMI,EAAMG,KAAMkI,EAAa6D,YACjC7D,EAAa6D,YAMdtM,EAAKyI,EAAa6D,WAAWlJ,QAAS/B,SACrC,MAAQkL,GACT7L,EAAO,CAAED,MAAOT,EAAIoD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW5I,MAAO8E,EAAQnF,EAAMG,KAAMiM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC3L,EAAW2B,EAAUA,EAAQ3B,SAAW,EAKzC,GAHAqF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAb1B,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOqF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWtD,EAEhB0I,GAAiB,CAIrB,GAAkB,KAAb/G,IAAqBuL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbvL,EAAiB,CACrB,KAAO8C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQhG,KAAMyD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQhG,KAAMyD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAlM,EAAKD,MAAOiG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAAS1L,EAAQmM,wBACzCrK,EAAQqK,uBAGR,OADA3M,EAAKD,MAAOiG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKxF,EAAQoM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAb1B,GAAqD,WAAnC2B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb3B,IACF4I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY9B,EAAQuM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAjN,EAAKD,MAAOiG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKrN,KAAMuN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK5O,EAAS0C,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIzO,EAAMwO,EAAMnH,MAAO,KACtBpF,EAAIjC,EAAIoD,OAET,MAAQnB,IACPwF,EAAKiH,WAAY1O,EAAKiC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE7H,UAAiC,IAAf8H,EAAE9H,UACnC6H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNf,EAAUsG,GAAOtG,QAAU,GAO3ByG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,GAAQA,EAAKqL,aAC5BrH,EAAUhE,IAAUA,EAAK6I,eAAiB7I,GAAOsL,gBAKlD,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOtC,GAA6B,IAAjBsC,EAAIX,UAAmBW,EAAIyN,kBAMnDtH,GADAzI,EAAWsC,GACQyN,gBACnBrH,GAAkBT,EAAOjI,GAQpB+I,GAAgB/I,IAClBiQ,EAAYjQ,EAASkQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC7K,EAAQuM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa/C,EAAS0C,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDlC,EAAQwI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BpB,EAAQkM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa/C,EAASuQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxClC,EAAQmM,uBAAyBrC,EAAQuC,KAAM7N,EAAS2N,wBAMxDnM,EAAQgP,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBnG,EAASyQ,oBAAsBzQ,EAASyQ,kBAAmBtK,GAAUzC,SAIzElC,EAAQgP,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAIpP,EAAQkM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BtP,EAAQoM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK9C,UACToP,EAAI/P,KAAMyD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAIpP,EAAQmM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELnH,EAAQoM,IAAMtC,EAAQuC,KAAM7N,EAASkO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU3H,KAAM,SAAW8I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU3H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU3H,KAAM,OAQjBgQ,EAAQhR,EAAS0C,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU3H,KAAM,MAAQ8I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU3H,KAAM,YAMX4N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU3H,KAAM,YAKjB4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,iBAGjB2N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQhR,EAAS0C,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,OAAS8I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,WAAY,aAK7ByH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU3H,KAAM,WAAY,aAK7B4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,YAIXQ,EAAQ0P,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBpN,EAAQ+P,kBAAoBnK,EAAQvG,KAAM+N,EAAI,KAI9CxH,EAAQvG,KAAM+N,EAAI,aAClBhG,EAAc5H,KAAM,KAAMiJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE7H,SAAiB6H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI/P,YAClC8P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGjI,EAAQoQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKxJ,GAAYwJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKzJ,GAAYyJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJrH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKxJ,GAAY,EACvByJ,GAAKzJ,EAAW,EAEhB6R,GAAO,EACPH,EAAM,EACNpJ,EACErH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK/I,GAGR8H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERjD,EAAQ0P,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQvG,KAAM4D,EAAMwN,GAG9B,GAAK9N,GAAO3C,EAAQ+P,mBAInB9M,EAAKzE,UAAuC,KAA3ByE,EAAKzE,SAAS2B,SAC/B,OAAOwC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMjS,EAAU,KAAM,CAAEyE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAatD,GAC5CwI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUzE,GACtCwI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMnC,EAAOP,KAAMkH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAhB,EAAQwI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAIvG,MAAO,0CAA4CuG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB/G,EAAQgR,iBACxBlK,GAAa9G,EAAQiR,YAAczL,EAAQtG,MAAO,GAClDsG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWvR,KAAMuB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJZ,EAAW8C,EAAK9C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB8C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb9C,GAA+B,IAAbA,EAC7B,OAAO8C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMxM,MAAO,EAAG,IAGxBsK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIxM,MAAO,EAAG,IAGnBwM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASrS,QAAS,IAAKqS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIxM,MAAO,EAAG2S,GAClCnG,EAAO,GAAMoG,EAAS5S,MAAO,EAAG2S,IAI1BnG,EAAMxM,MAAO,EAAG,MAIzBgQ,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,GAASC,EAAOjT,OAAQgT,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMjJ,QAASyS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOjT,MAAO,EAAGgT,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKrB,MAAO,EAAG,GAC3BqT,EAA+B,SAArBhS,EAAKrB,OAAQ,GACvBsT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,SAEL,OAAO,EAKT2S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKV,YAAoBwN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,aACHwN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWxT,eAAgBsT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM7T,EAAS8L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASxD,QAAS0B,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASpU,QAASmU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK9C,UAC7C,OAAO,KAKTkE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,KAC9C,OAAOA,GAAQA,EAAK5U,MAAO,KAAQ+D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASzE,EAAS0V,iBACrB1V,EAAS2V,UAAY3V,EAAS2V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK9C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR4S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa5O,KAAMuB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK9C,UAAkBwV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAa1W,KAAMyD,GACdkT,GACJnT,EAAIxD,KAAMuB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ3B,SAAW,CAAE2B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAKhX,KAAQsX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa7W,EAAS8L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvClT,EAAKD,MAAOiG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCxD,EAASwX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU3B,SAC1BiX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOhB,MAAO,KAAMgW,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACErW,MAAO,EAAG6B,EAAI,GACdzB,OAAQ,CAAEyG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOrW,MAAO6B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOrW,MAAOyE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASxW,KAAMiU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOxY,MAAO,GAGtCsY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMtY,MAAOwM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOnM,KAAQ+V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASzM,MAAO,IA4ZzCyH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYpY,KAAMkY,GAElBC,EAAgBnY,KAAMkY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWtD,GAAYsD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBtN,IACtCwI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWtD,EAAUkU,GAAQ,CAChDlN,EAAQhG,KAAMyD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUlU,KAAMyD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI7I,KAAMmG,IAM/B0S,EAAajC,GAAUiC,GAIxB1Y,EAAKD,MAAOiG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIxM,MAAO,IAC5BgD,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ3B,UAAkB+G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS3C,MAAOqW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA/V,EAAKD,MAAOiG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRxF,EAAQiR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E3E,EAAQgR,mBAAqBjK,EAG7BC,IAIAhH,EAAQoQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBxR,EAAS0C,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjErG,EAAQwI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK3H,GAILiD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK9C,SACtC,GAAuB,IAAlB8C,EAAK9C,SAAiB,CAC1B,GAAK0Y,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ/T,KAAMyD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE7Y,UAAkB6Y,IAAM/V,GAC9BsQ,EAAQ/T,KAAMwZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAExB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG9D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKvT,EAAYmZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU/Z,KAAM4D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUjZ,SACPyB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCxD,EAAQJ,KAAM+Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK9C,SACxByB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK9C,aAIdyB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM9E,KAAKsD,OACXmX,EAAOza,KAER,GAAyB,iBAAbiD,EACX,OAAOjD,KAAK6D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKnC,MAChC,OAAO,KAQX,IAFA+D,EAAM/D,KAAK6D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRva,KAIoB,iBAAbiD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOjD,KAQR,GAHAoV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BjD,KAAKyD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAOhE,KAAMgD,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ3B,SAAW2B,EAAQgK,eAAiBhK,EAAUtD,GACjE,IAII0a,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT7B,EAAYrB,KAAM8M,IACtB9M,KAAM8M,GAAS5J,EAAS4J,IAIxB9M,KAAK+R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO9M,KAYP,OARAqE,EAAOzE,EAASwN,eAAgBN,EAAO,OAKtC9M,KAAM,GAAMqE,EACZrE,KAAKsD,OAAS,GAERtD,KAcH,OAAKiD,EAAS1B,UACpBvB,KAAM,GAAMiD,EACZjD,KAAKsD,OAAS,EACPtD,MAIIqB,EAAY4B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUjD,QAIhCuD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQpD,GAGrB,IAAIib,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAIvN,UACpC,OAAOuN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQzF,MAC7Bob,EAAID,EAAQ7X,OAEb,OAAOtD,KAAKsQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUzI,KAAMmb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAIpb,KAAKsD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM9O,KAAMmC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAIvN,SAAW,KAAQ4Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAIvN,UACHyB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ/T,KAAMkO,GACd,MAMJ,OAAO9O,KAAK6D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJxD,EAAQJ,KAAMuC,EAAQqB,GAAQrE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBqE,EAAKb,OAASa,EAAM,GAAMA,GAZjBrE,KAAM,IAAOA,KAAM,GAAI4C,WAAe5C,KAAKuE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOlD,KAAK6D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAOhE,KAAK2D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOjD,KAAKwb,IAAiB,MAAZvY,EAChBjD,KAAKiE,WAAajE,KAAKiE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO5S,SAAkB4S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT5b,EAAUkE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKpE,KAAMmD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK/E,OAAQ,KACjB2C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd3U,KAAKsD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHjc,KAAK6D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS9F,EAAcsb,EAASxV,EAAMyV,SAC1CD,EAAOlc,KAAM0G,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS9F,EAAcsb,EAASxV,EAAM2V,MACjDH,EAAOlc,KAAM0G,EAAOqV,EAASC,GAQ7BD,EAAQ7b,WAAOmF,EAAW,CAAEqB,GAAQ7G,MAAOoc,IAM3C,MAAQvV,GAITsV,EAAO9b,WAAOmF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc7c,MAAOyc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM3c,KAAMwc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B7F,EAAY6F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK5I,KAAMsG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKzd,MAIR4d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIxd,MAKR+U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDxJ,MAMR6d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTpd,MAERoM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVpd,MAERsd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQlU,MAAQkU,EAAKlU,QAAUkU,GAC9C+I,EAAM3c,KAAM4T,GACN2I,GACLM,KAGKzd,MAIRyd,KAAM,WAEL,OADAhD,EAAKsD,SAAU/d,KAAMsE,WACdtE,MAIRqd,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BtE,MAERse,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK9B,EAAYmd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGxC,MAAOX,KAAMsE,WAChCqa,GAAYtd,EAAYsd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtB1e,KACAmD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOpf,KACVwU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQhO,MAAOye,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLzb,EAAYyb,GAGXqC,EACJrC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY2d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAYyd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY0d,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUtb,GAClB,OAAc,MAAPA,EAAc0B,EAAOmC,OAAQ7D,EAAKsb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAU1e,OAASqe,OAAWvY,EAAY9F,KAAMsE,WAChEtE,MAMRqe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKxd,KAAM4d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB9f,EAAMG,KAAM6D,WAG5B+b,EAAUrd,EAAOgb,WAGjBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMnC,KACvBogB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAahD,EAAMG,KAAM6D,WAAc6C,IAC5D+Y,GACTG,EAAQb,YAAaW,EAAiBC,KAM1C,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAQxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAQ5D,QACxEyD,GAGuB,YAApBG,EAAQlC,SACZ9c,EAAY+e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAQvD,OAKjB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAQ5D,QAG1D,OAAO4D,EAAQzD,aAOjB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9EtF,EAAO0gB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCrG,EAAO+f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRlhB,EAASmhB,oBAAqB,mBAAoBD,GAClD/gB,EAAOghB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBpG,MAGRgD,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa5f,EAAU,CAAEoD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBld,EAASshB,YACa,YAAxBthB,EAASshB,aAA6BthB,EAAS+P,gBAAgBwR,SAGjEphB,EAAO+f,WAAY9c,EAAO4X,QAK1Bhb,EAASoQ,iBAAkB,mBAAoB8Q,GAG/C/gB,EAAOiQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAENhgB,EAAY8F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAG1C,KAAMqD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK/gB,KAAMuC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EAChBpa,EACAA,EAAM1G,KAAMqD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAMhD,OAAKkT,EACGvd,EAIH0d,EACGre,EAAG1C,KAAMqD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM5gB,UAAqC,IAAnB4gB,EAAM5gB,YAAsB4gB,EAAM5gB,UAMlE,SAAS6gB,IACRpiB,KAAK+F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOniB,KAAK+F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,SAAYoB,EAMxB/G,OAAOkiB,eAAgBH,EAAOniB,KAAK+F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQlO,KAAKkO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNnO,KAAKkO,MAAOiU,GAGZA,EAAOniB,KAAK+F,UAAaoc,EAAOniB,KAAK+F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElCnH,KAAK2D,IAAKwe,EAAOhU,IASzBnO,KAAKwiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOniB,KAAK+F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,cAAYD,SAEjBqc,EAAOniB,KAAK+F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOniB,KAAK+F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK9C,SAI/B,GAHA8D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOrE,KAAM,GACb0O,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKnO,KAAKsD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK9C,WAAmBqhB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRxE,QAAS,WAClBwE,EAAO2c,EAAW3c,EAAK/E,MAAO,IAC9B0iB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJnO,KAAKkE,KAAM,WACjB2e,EAASL,IAAKxiB,KAAMmO,KAIfiT,EAAQphB,KAAM,SAAUmH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDziB,KAAKkE,KAAM,WAGV2e,EAASL,IAAKxiB,KAAMmO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOnO,KAAKkE,KAAM,WACjB2e,EAASjF,OAAQ5d,KAAMmO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM3c,KAAM6hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAG1C,KAAM4D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOvd,KAAM,GAAK2B,QAGjBmE,IAAT2c,EACNziB,KACAA,KAAKkE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOvd,KAAM2B,EAAM8gB,GAGtCzf,EAAOygB,YAAazjB,KAAM2B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAAStjB,KAAM2B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO3B,KAAKkE,KAAM,WACjBlB,EAAOsgB,QAAStjB,KAAM2B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO3B,KAAKud,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAML,GACxB,IAAIqP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW9R,KACXmC,EAAInC,KAAKsD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXL,EAAMK,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAAStb,MAGxB,IAAIyiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB/P,EAAS+P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK9C,WAClByB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUtlB,MAAM,IAExB0lB,KAAM,WACL,OAAOJ,GAAUtlB,OAElB2lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQne,KAAKulB,OAASvlB,KAAK0lB,OAG5B1lB,KAAKkE,KAAM,WACZogB,GAAoBtkB,MACxBgD,EAAQhD,MAAOulB,OAEfviB,EAAQhD,MAAO0lB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADchmB,EAASomB,yBACRrjB,YAAa/C,EAAS0C,cAAe,SACpDsO,GAAQhR,EAAS0C,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBxP,EAAQ6kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBzP,EAAQ+kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBzP,EAAQglB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfrlB,EAAQglB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK9C,SAAW,CAAE8C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM/mB,KAAMsC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ3mB,KAAMyD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQzmB,KAAMyD,GAMlB,OAAOqjB,EAIR,IAAII,GAAiB,sBAErB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY5jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOzE,EAAS0V,cACf,MAAQ4S,KATQC,KAAqC,UAATxmB,GAY/C,SAASymB,GAAI/jB,EAAMgkB,EAAOplB,EAAUwf,EAAMtf,EAAImlB,GAC7C,IAAIC,EAAQ5mB,EAGZ,GAAsB,iBAAV0mB,EAAqB,CAShC,IAAM1mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEuiB,EACbD,GAAI/jB,EAAM1C,EAAMsB,EAAUwf,EAAM4F,EAAO1mB,GAAQ2mB,GAEhD,OAAOjkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK6kB,QACC,IAAM7kB,EACZ,OAAOkB,EAeR,OAZa,IAARikB,IACJC,EAASplB,GACTA,EAAK,SAAUqlB,GAId,OADAxlB,IAASylB,IAAKD,GACPD,EAAO5nB,MAAOX,KAAMsE,aAIzB8C,KAAOmhB,EAAOnhB,OAAUmhB,EAAOnhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAOwlB,MAAMhN,IAAKxb,KAAMqoB,EAAOllB,EAAIsf,EAAMxf,KA+a3C,SAASylB,GAAgBla,EAAI7M,EAAMsmB,GAG5BA,GAQNrF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU6Z,GAClB,IAAIG,EAAUpV,EACbqV,EAAQhG,EAASjf,IAAK3D,KAAM2B,GAE7B,GAAyB,EAAlB6mB,EAAMK,WAAmB7oB,KAAM2B,IAKrC,GAAMinB,EAAMtlB,QAuCEN,EAAOwlB,MAAMrJ,QAASxd,IAAU,IAAKmnB,cAClDN,EAAMO,uBArBN,GAdAH,EAAQtoB,EAAMG,KAAM6D,WACpBse,EAASJ,IAAKxiB,KAAM2B,EAAMinB,GAK1BD,EAAWV,EAAYjoB,KAAM2B,GAC7B3B,KAAM2B,KAEDinB,KADLrV,EAASqP,EAASjf,IAAK3D,KAAM2B,KACJgnB,EACxB/F,EAASJ,IAAKxiB,KAAM2B,GAAM,GAE1B4R,EAAS,GAELqV,IAAUrV,EAWd,OARAiV,EAAMQ,2BACNR,EAAMS,iBAOC1V,GAAUA,EAAOpM,WAefyhB,EAAMtlB,SAGjBsf,EAASJ,IAAKxiB,KAAM2B,EAAM,CACzBwF,MAAOnE,EAAOwlB,MAAMU,QAInBlmB,EAAOmC,OAAQyjB,EAAO,GAAK5lB,EAAOmmB,MAAM5lB,WACxCqlB,EAAMtoB,MAAO,GACbN,QAKFwoB,EAAMQ,qCA/E0BljB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAMomB,IA5a/B/kB,EAAOwlB,MAAQ,CAEdhpB,OAAQ,GAERgc,IAAK,SAAUnX,EAAMgkB,EAAO1Z,EAAS8T,EAAMxf,GAE1C,IAAImmB,EAAaC,EAAa1Y,EAC7B2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADAya,EAAcza,GACQA,QACtB1L,EAAWmmB,EAAYnmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfkiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASlpB,OAAOypB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUrd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAOwlB,MAAMuB,YAActd,EAAE9K,KACpEqB,EAAOwlB,MAAMwB,SAASrpB,MAAO0D,EAAMC,gBAAcwB,IAMpDyjB,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAEP5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,EAGjEwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1C6nB,EAAYxmB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNgoB,SAAUA,EACVlH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWia,EAAW7b,KAAM,MAC1Bub,IAGKK,EAAWH,EAAQ3nB,OAC1B8nB,EAAWH,EAAQ3nB,GAAS,IACnBuoB,cAAgB,EAGnB/K,EAAQgL,QACiD,IAA9DhL,EAAQgL,MAAM1pB,KAAM4D,EAAMoe,EAAMiH,EAAYL,IAEvChlB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM0nB,IAK3BlK,EAAQ3D,MACZ2D,EAAQ3D,IAAI/a,KAAM4D,EAAMmlB,GAElBA,EAAU7a,QAAQvH,OACvBoiB,EAAU7a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJwmB,EAASvkB,OAAQukB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS7oB,KAAM4oB,GAIhBxmB,EAAOwlB,MAAMhpB,OAAQmC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMgkB,EAAO1Z,EAAS1L,EAAUmnB,GAEjD,IAAIrlB,EAAGslB,EAAW1Z,EACjB2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMulB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAMP,GAJA5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAE1C8nB,EAAWH,EADX3nB,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAG9Dwc,EAAYtlB,EAAI0kB,EAASnmB,OACzB,MAAQyB,IACPykB,EAAYC,EAAU1kB,IAEfqlB,GAAeT,IAAaH,EAAUG,UACzChb,GAAWA,EAAQvH,OAASoiB,EAAUpiB,MACtCuJ,IAAOA,EAAIlD,KAAM+b,EAAU/Z,YAC3BxM,GAAYA,IAAaumB,EAAUvmB,WACxB,OAAbA,IAAqBumB,EAAUvmB,YAChCwmB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAUvmB,UACdwmB,EAASS,gBAEL/K,EAAQvB,QACZuB,EAAQvB,OAAOnd,KAAM4D,EAAMmlB,IAOzBa,IAAcZ,EAASnmB,SACrB6b,EAAQmL,WACkD,IAA/DnL,EAAQmL,SAAS7pB,KAAM4D,EAAMqlB,EAAYE,EAASE,SAElD9mB,EAAOunB,YAAalmB,EAAM1C,EAAMioB,EAASE,eAGnCR,EAAQ3nB,SA1Cf,IAAMA,KAAQ2nB,EACbtmB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,EAAO0mB,EAAOkB,GAAK5a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe6iB,IAC1B1G,EAAShF,OAAQvZ,EAAM,mBAIzB2lB,SAAU,SAAUQ,GAEnB,IAAIroB,EAAG4C,EAAGhB,EAAK4Q,EAAS6U,EAAWiB,EAClCjW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BklB,EAAQxlB,EAAOwlB,MAAMkC,IAAKF,GAE1Bf,GACC7G,EAASjf,IAAK3D,KAAM,WAAcI,OAAOypB,OAAQ,OAC/CrB,EAAM7mB,OAAU,GACnBwd,EAAUnc,EAAOwlB,MAAMrJ,QAASqJ,EAAM7mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMgU,EAENrmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAqmB,EAAMmC,eAAiB3qB,MAGlBmf,EAAQyL,cAA2D,IAA5CzL,EAAQyL,YAAYnqB,KAAMT,KAAMwoB,GAA5D,CAKAiC,EAAeznB,EAAOwlB,MAAMiB,SAAShpB,KAAMT,KAAMwoB,EAAOiB,GAGxDtnB,EAAI,EACJ,OAAUwS,EAAU8V,EAActoB,QAAYqmB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBnW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAUykB,EAAY7U,EAAQ8U,SAAU1kB,QACtCyjB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAU/Z,YACnC+Y,EAAMwC,WAAWvd,KAAM+b,EAAU/Z,aAEjC+Y,EAAMgB,UAAYA,EAClBhB,EAAM/F,KAAO+G,EAAU/G,UAKV3c,KAHb/B,IAAUf,EAAOwlB,MAAMrJ,QAASqK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU7a,SAAUhO,MAAOgU,EAAQtQ,KAAMmQ,MAGT,KAAzBgU,EAAMjV,OAASxP,KACrBykB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK5J,EAAQ8L,cACZ9L,EAAQ8L,aAAaxqB,KAAMT,KAAMwoB,GAG3BA,EAAMjV,SAGdkW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAItnB,EAAGqnB,EAAWvX,EAAKiZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBpb,EAAM0Z,EAAM/iB,OAGb,GAAKykB,GAIJpb,EAAIvN,YAOc,UAAfinB,EAAM7mB,MAAoC,GAAhB6mB,EAAMxS,QAEnC,KAAQlH,IAAQ9O,KAAM8O,EAAMA,EAAIlM,YAAc5C,KAI7C,GAAsB,IAAjB8O,EAAIvN,WAAoC,UAAfinB,EAAM7mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFA8e,EAAkB,GAClBC,EAAmB,GACbhpB,EAAI,EAAGA,EAAI+nB,EAAe/nB,SAME2D,IAA5BqlB,EAFLlZ,GAHAuX,EAAYC,EAAUtnB,IAGNc,SAAW,OAG1BkoB,EAAkBlZ,GAAQuX,EAAU1e,cACC,EAApC9H,EAAQiP,EAAKjS,MAAOsb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKjS,KAAM,KAAM,CAAE8O,IAAQxL,QAErC6nB,EAAkBlZ,IACtBiZ,EAAgBtqB,KAAM4oB,GAGnB0B,EAAgB5nB,QACpBmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUyB,IAY9C,OALApc,EAAM9O,KACDkqB,EAAgBT,EAASnmB,QAC7BmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUA,EAASnpB,MAAO4pB,KAGpDO,GAGRW,QAAS,SAAU/lB,EAAMgmB,GACxBjrB,OAAOkiB,eAAgBtf,EAAOmmB,MAAM5lB,UAAW8B,EAAM,CACpDimB,YAAY,EACZ/I,cAAc,EAEd5e,IAAKtC,EAAYgqB,GAChB,WACC,GAAKrrB,KAAKurB,cACT,OAAOF,EAAMrrB,KAAKurB,gBAGpB,WACC,GAAKvrB,KAAKurB,cACT,OAAOvrB,KAAKurB,cAAelmB,IAI9Bmd,IAAK,SAAUrb,GACd/G,OAAOkiB,eAAgBtiB,KAAMqF,EAAM,CAClCimB,YAAY,EACZ/I,cAAc,EACdiJ,UAAU,EACVrkB,MAAOA,QAMXujB,IAAK,SAAUa,GACd,OAAOA,EAAevoB,EAAO+C,SAC5BwlB,EACA,IAAIvoB,EAAOmmB,MAAOoC,IAGpBpM,QAAS,CACRsM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU1H,GAIhB,IAAIjU,EAAKxO,MAAQyiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAG1Bka,GAAgBla,EAAI,QAASuZ,KAIvB,GAERmB,QAAS,SAAUzG,GAIlB,IAAIjU,EAAKxO,MAAQyiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAE1Bka,GAAgBla,EAAI,UAId,GAKRkY,SAAU,SAAU8B,GACnB,IAAI/iB,EAAS+iB,EAAM/iB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOkmB,OAAStf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBmmB,aAAc,CACbX,aAAc,SAAUzC,QAID1iB,IAAjB0iB,EAAMjV,QAAwBiV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMjV,YAoG7CvQ,EAAOunB,YAAc,SAAUlmB,EAAM1C,EAAMmoB,GAGrCzlB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMmoB,IAIlC9mB,EAAOmmB,MAAQ,SAAUvnB,EAAKkqB,GAG7B,KAAQ9rB,gBAAgBgD,EAAOmmB,OAC9B,OAAO,IAAInmB,EAAOmmB,MAAOvnB,EAAKkqB,GAI1BlqB,GAAOA,EAAID,MACf3B,KAAKurB,cAAgB3pB,EACrB5B,KAAK2B,KAAOC,EAAID,KAIhB3B,KAAK+rB,mBAAqBnqB,EAAIoqB,uBACHlmB,IAAzBlE,EAAIoqB,mBAGgB,IAApBpqB,EAAIiqB,YACL9D,GACAC,GAKDhoB,KAAKyF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOlE,SACxCK,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELzF,KAAK8qB,cAAgBlpB,EAAIkpB,cACzB9qB,KAAKisB,cAAgBrqB,EAAIqqB,eAIzBjsB,KAAK2B,KAAOC,EAIRkqB,GACJ9oB,EAAOmC,OAAQnF,KAAM8rB,GAItB9rB,KAAKksB,UAAYtqB,GAAOA,EAAIsqB,WAAaxjB,KAAKyjB,MAG9CnsB,KAAMgD,EAAO+C,UAAY,GAK1B/C,EAAOmmB,MAAM5lB,UAAY,CACxBE,YAAaT,EAAOmmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAIxc,EAAIzM,KAAKurB,cAEbvrB,KAAK+rB,mBAAqBhE,GAErBtb,IAAMzM,KAAKosB,aACf3f,EAAEwc,kBAGJF,gBAAiB,WAChB,IAAItc,EAAIzM,KAAKurB,cAEbvrB,KAAK6qB,qBAAuB9C,GAEvBtb,IAAMzM,KAAKosB,aACf3f,EAAEsc,mBAGJC,yBAA0B,WACzB,IAAIvc,EAAIzM,KAAKurB,cAEbvrB,KAAK+qB,8BAAgChD,GAEhCtb,IAAMzM,KAAKosB,aACf3f,EAAEuc,2BAGHhpB,KAAK+oB,oBAKP/lB,EAAOkB,KAAM,CACZmoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRjrB,MAAM,EACNkrB,UAAU,EACV/e,KAAK,EACLgf,SAAS,EACTnX,QAAQ,EACRoX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,GACLhrB,EAAOwlB,MAAM4C,SAEhBpoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUtsB,EAAMmnB,GACpE9lB,EAAOwlB,MAAMrJ,QAASxd,GAAS,CAG9BwoB,MAAO,WAQN,OAHAzB,GAAgB1oB,KAAM2B,EAAMsmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB1oB,KAAM2B,IAGf,GAKR+kB,SAAU,WACT,OAAO,GAGRoC,aAAcA,KAYhB9lB,EAAOkB,KAAM,CACZgqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB1nB,EAAOwlB,MAAMrJ,QAASmP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAIzkB,EAEHwqB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTvuB,MAMgCgD,EAAOyF,SANvCzI,KAMyDuuB,MAClE/F,EAAM7mB,KAAO6nB,EAAUG,SACvB5lB,EAAMylB,EAAU7a,QAAQhO,MAAOX,KAAMsE,WACrCkkB,EAAM7mB,KAAO+oB,GAEP3mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBijB,GAAI,SAAUC,EAAOplB,EAAUwf,EAAMtf,GACpC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,IAEzCmlB,IAAK,SAAUD,EAAOplB,EAAUwf,EAAMtf,GACrC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,EAAI,IAE7CslB,IAAK,SAAUJ,EAAOplB,EAAUE,GAC/B,IAAIqmB,EAAW7nB,EACf,GAAK0mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClBxmB,EAAQqlB,EAAMsC,gBAAiBlC,IAC9Be,EAAU/Z,UACT+Z,EAAUG,SAAW,IAAMH,EAAU/Z,UACrC+Z,EAAUG,SACXH,EAAUvmB,SACVumB,EAAU7a,SAEJ3O,KAER,GAAsB,iBAAVqoB,EAAqB,CAGhC,IAAM1mB,KAAQ0mB,EACbroB,KAAKyoB,IAAK9mB,EAAMsB,EAAUolB,EAAO1mB,IAElC,OAAO3B,KAWR,OATkB,IAAbiD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK6kB,IAEChoB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAM5K,OAAQ5d,KAAMqoB,EAAOllB,EAAIF,QAMzC,IAKCurB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBtqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQza,SAAkBya,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASuqB,GAAevqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAASwqB,GAAexqB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKrB,MAAO,EAAG,GAClC+D,EAAK1C,KAAO0C,EAAK1C,KAAKrB,MAAO,GAE7B+D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAASyqB,GAAgBltB,EAAKmtB,GAC7B,IAAI5sB,EAAGiZ,EAAGzZ,EAAgBqtB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKxtB,SAAV,CAKA,GAAKqhB,EAASD,QAAS/gB,KAEtB0nB,EADW1G,EAASjf,IAAK/B,GACP0nB,QAKjB,IAAM3nB,KAFNihB,EAAShF,OAAQmR,EAAM,iBAETzF,EACb,IAAMnnB,EAAI,EAAGiZ,EAAIkO,EAAQ3nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAOwlB,MAAMhN,IAAKuT,EAAMptB,EAAM2nB,EAAQ3nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBotB,EAAWnM,EAASzB,OAAQxf,GAC5BqtB,EAAWjsB,EAAOmC,OAAQ,GAAI6pB,GAE9BnM,EAASL,IAAKuM,EAAME,KAkBtB,SAASC,GAAUC,EAAY3a,EAAMrQ,EAAUojB,GAG9C/S,EAAOjU,EAAMiU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAAS+H,EAAYntB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAI+T,EAAW7rB,OACf+rB,EAAWjU,EAAI,EACfjU,EAAQqN,EAAM,GACd8a,EAAkBjuB,EAAY8F,GAG/B,GAAKmoB,GACG,EAAJlU,GAA0B,iBAAVjU,IAChB/F,EAAQ6kB,YAAcwI,GAAShhB,KAAMtG,GACxC,OAAOgoB,EAAWjrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO0U,EAAW3qB,GAAI8W,GACrBgU,IACJ9a,EAAM,GAAMrN,EAAM1G,KAAMT,KAAMsb,EAAOb,EAAK8U,SAE3CL,GAAUzU,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM2a,EAAY,GAAIjiB,eAAe,EAAOiiB,EAAY5H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA6H,GADA/H,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYkH,KAC/BtrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMktB,IACVptB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BmtB,GAIJpsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAAS1D,KAAM0uB,EAAYhtB,GAAKF,EAAME,GAGvC,GAAKitB,EAOJ,IANAltB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAASwH,IAGf1sB,EAAI,EAAGA,EAAIitB,EAAYjtB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAOwsB,WAAavtB,EAAKH,UAC7BkB,EAAOwsB,SAAUvtB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAASwoB,GAAc,IAAMzsB,EAAMC,IAQnE,OAAOitB,EAGR,SAASvR,GAAQvZ,EAAMpB,EAAUwsB,GAKhC,IAJA,IAAIxtB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCstB,GAA8B,IAAlBxtB,EAAKV,UACtByB,EAAO0sB,UAAW/I,GAAQ1kB,IAGtBA,EAAKW,aACJ6sB,GAAYtL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU2H,GACxB,OAAOA,GAGR/pB,MAAO,SAAUnB,EAAMsrB,EAAeC,GACrC,IAAIztB,EAAGiZ,EAAGyU,EAAaC,EApINluB,EAAKmtB,EACnB1iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB6J,EAAS5L,GAAY9f,GAGtB,KAAMjD,EAAQ+kB,gBAAsC,IAAlB9hB,EAAK9C,UAAoC,KAAlB8C,EAAK9C,UAC3DyB,EAAO8W,SAAUzV,IAMnB,IAHAyrB,EAAenJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFbyU,EAAclJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLiuB,EAAa1tB,GAjJH4sB,EAiJQe,EAAc3tB,QAhJzCkK,EAGc,WAHdA,EAAW0iB,EAAK1iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDotB,EAAKpZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC0iB,EAAKnV,aAAehY,EAAIgY,cA6IxB,GAAK+V,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQtiB,GACrCyrB,EAAeA,GAAgBnJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAIyU,EAAYvsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C2sB,GAAgBe,EAAa1tB,GAAK2tB,EAAc3tB,SAGjD2sB,GAAgBzqB,EAAMmB,GAWxB,OAL2B,GAD3BsqB,EAAenJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAekJ,GAAeC,GAAUpJ,GAAQtiB,EAAM,WAIhDmB,GAGRkqB,UAAW,SAAU5rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAOwlB,MAAMrJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK6G,OACT,IAAM3nB,KAAQ8gB,EAAK6G,OACbnK,EAASxd,GACbqB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,GAI3BqB,EAAOunB,YAAalmB,EAAM1C,EAAM8gB,EAAKqH,QAOxCzlB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB6qB,OAAQ,SAAU/sB,GACjB,OAAO2a,GAAQ5d,KAAMiD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ5d,KAAMiD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMvC,MACbA,KAAK8V,QAAQ5R,KAAM,WACK,IAAlBlE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKsS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B2sB,OAAQ,WACP,OAAOf,GAAUlvB,KAAMsE,UAAW,SAAUD,GACpB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CotB,GAAoB3uB,KAAMqE,GAChC1B,YAAa0B,MAKvB6rB,QAAS,WACR,OAAOhB,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIkE,EAASkpB,GAAoB3uB,KAAMqE,GACvCoB,EAAO0qB,aAAc9rB,EAAMoB,EAAO8M,gBAKrC6d,OAAQ,WACP,OAAOlB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,SAKvCqwB,MAAO,WACN,OAAOnB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,KAAKiP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOrE,KAAMmC,IAAeA,IACd,IAAlBkC,EAAK9C,WAGTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOtS,MAGRwF,MAAO,SAAUmqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD5vB,KAAKoE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOxF,KAAM2vB,EAAeC,MAI5CL,KAAM,SAAUpoB,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,IAAI9C,EAAOrE,KAAM,IAAO,GACvBmC,EAAI,EACJiZ,EAAIpb,KAAKsD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK9C,SAChC,OAAO8C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBqnB,GAAa/gB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOrE,KAAMmC,IAAO,IAGVZ,WACTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJrE,KAAK8V,QAAQma,OAAQ9oB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BgtB,YAAa,WACZ,IAAI/I,EAAU,GAGd,OAAO2H,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,IAAI8P,EAASnU,KAAK4C,WAEbI,EAAO6D,QAAS7G,KAAMunB,GAAY,IACtCvkB,EAAO0sB,UAAW/I,GAAQ3mB,OACrBmU,GACJA,EAAOoc,aAAclsB,EAAMrE,QAK3BunB,MAILvkB,EAAOkB,KAAM,CACZssB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUtrB,EAAMurB,GAClB5tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACN8sB,EAAS7tB,EAAQC,GACjBwB,EAAOosB,EAAOvtB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOzE,KAAOA,KAAKwF,OAAO,GACxCxC,EAAQ6tB,EAAQ1uB,IAAOyuB,GAAY9sB,GAInClD,EAAKD,MAAOoD,EAAKD,EAAMH,OAGxB,OAAO3D,KAAK6D,UAAWE,MAGzB,IAAI+sB,GAAY,IAAI/mB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDgN,GAAY,SAAU1sB,GAKxB,IAAI2oB,EAAO3oB,EAAK6I,cAAc4C,YAM9B,OAJMkd,GAASA,EAAKgE,SACnBhE,EAAOjtB,GAGDitB,EAAKiE,iBAAkB5sB,IAG5B6sB,GAAO,SAAU7sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACR8rB,EAAM,GAGP,IAAM9rB,KAAQD,EACb+rB,EAAK9rB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAAS1D,KAAM4D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAAS8rB,EAAK9rB,GAG3B,OAAOtB,GAIJqtB,GAAY,IAAIrnB,OAAQma,GAAUrW,KAAM,KAAO,KAiJnD,SAASwjB,GAAQhtB,EAAMgB,EAAMisB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU1tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCA+M,EAAWA,GAAYP,GAAW1sB,MAQpB,MAFbN,EAAMutB,EAASI,iBAAkBrsB,IAAUisB,EAAUjsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBjE,EAAQuwB,kBAAoBb,GAAUrjB,KAAM1J,IAASqtB,GAAU3jB,KAAMpI,KAG1EksB,EAAQhN,EAAMgN,MACdC,EAAWjN,EAAMiN,SACjBC,EAAWlN,EAAMkN,SAGjBlN,EAAMiN,SAAWjN,EAAMkN,SAAWlN,EAAMgN,MAAQxtB,EAChDA,EAAMutB,EAASC,MAGfhN,EAAMgN,MAAQA,EACdhN,EAAMiN,SAAWA,EACjBjN,EAAMkN,SAAWA,SAIJ3rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS6tB,GAAcC,EAAaC,GAGnC,MAAO,CACNnuB,IAAK,WACJ,IAAKkuB,IASL,OAAS7xB,KAAK2D,IAAMmuB,GAASnxB,MAAOX,KAAMsE,kBALlCtE,KAAK2D,OA3MhB,WAIC,SAASouB,IAGR,GAAMnM,EAAN,CAIAoM,EAAUzN,MAAM0N,QAAU,+EAE1BrM,EAAIrB,MAAM0N,QACT,4HAGDtiB,GAAgBhN,YAAaqvB,GAAYrvB,YAAaijB,GAEtD,IAAIsM,EAAWnyB,EAAOkxB,iBAAkBrL,GACxCuM,EAAoC,OAAjBD,EAASniB,IAG5BqiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD1M,EAAIrB,MAAMgO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD3L,EAAIrB,MAAMmO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoBzM,EAAIgN,YAAc,GAEzDjjB,GAAgB9M,YAAamvB,GAI7BpM,EAAM,MAGP,SAASyM,EAAoBQ,GAC5B,OAAO7sB,KAAK8sB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYpyB,EAAS0C,cAAe,OACpCsjB,EAAMhmB,EAAS0C,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM0O,eAAiB,cAC3BrN,EAAIM,WAAW,GAAO3B,MAAM0O,eAAiB,GAC7C7xB,EAAQ8xB,gBAA+C,gBAA7BtN,EAAIrB,MAAM0O,eAEpCjwB,EAAOmC,OAAQ/D,EAAS,CACvB+xB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAYRY,qBAAsB,WACrB,IAAIC,EAAOhN,EAAIiN,EAASC,EAmCxB,OAlCgC,MAA3BV,IACJQ,EAAQ5zB,EAAS0C,cAAe,SAChCkkB,EAAK5mB,EAAS0C,cAAe,MAC7BmxB,EAAU7zB,EAAS0C,cAAe,OAElCkxB,EAAMjP,MAAM0N,QAAU,2DACtBzL,EAAGjC,MAAM0N,QAAU,mBAKnBzL,EAAGjC,MAAMoP,OAAS,MAClBF,EAAQlP,MAAMoP,OAAS,MAQvBF,EAAQlP,MAAMC,QAAU,QAExB7U,GACEhN,YAAa6wB,GACb7wB,YAAa6jB,GACb7jB,YAAa8wB,GAEfC,EAAU3zB,EAAOkxB,iBAAkBzK,GACnCwM,EAA4BY,SAAUF,EAAQC,OAAQ,IACrDC,SAAUF,EAAQG,eAAgB,IAClCD,SAAUF,EAAQI,kBAAmB,MAAWtN,EAAGuN,aAEpDpkB,GAAgB9M,YAAa2wB,IAEvBR,MAvIV,GAsNA,IAAIgB,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAar0B,EAAS0C,cAAe,OAAQiiB,MAC7C2P,GAAc,GAkBf,SAASC,GAAe9uB,GACvB,IAAI+uB,EAAQpxB,EAAOqxB,SAAUhvB,IAAU6uB,GAAa7uB,GAEpD,OAAK+uB,IAGA/uB,KAAQ4uB,GACL5uB,EAED6uB,GAAa7uB,GAxBrB,SAAyBA,GAGxB,IAAIivB,EAAUjvB,EAAM,GAAI0c,cAAgB1c,EAAK/E,MAAO,GACnD6B,EAAI6xB,GAAY1wB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO2uB,GAAa7xB,GAAMmyB,KACbL,GACZ,OAAO5uB,EAeoBkvB,CAAgBlvB,IAAUA,GAIxD,IAKCmvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAEhC,SAAU,WAAYiC,WAAY,SAAUnQ,QAAS,SACjEoQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBnwB,EAAOuC,EAAO6tB,GAIzC,IAAIhuB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKivB,IAAK,EAAGjuB,EAAS,IAAQguB,GAAY,KAAUhuB,EAAS,IAAO,MACpEG,EAGF,SAAS+tB,GAAoB7wB,EAAM8wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAIpzB,EAAkB,UAAdgzB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQlzB,EAAI,EAAGA,GAAK,EAGN,WAARizB,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM+wB,EAAMlR,GAAW/hB,IAAK,EAAMmzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,IAIjD,WAARF,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,MAtBvEG,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,GAGhD,YAARF,EACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,GAItEE,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASzvB,KAAKivB,IAAK,EAAGjvB,KAAK0vB,KAC1BrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEi1B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBtxB,EAAM8wB,EAAWK,GAG3C,IAAIF,EAASvE,GAAW1sB,GAKvBgxB,IADmBj0B,EAAQ+xB,qBAAuBqC,IAEE,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCM,EAAmBP,EAEnBjzB,EAAMivB,GAAQhtB,EAAM8wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,GAIzE,GAAKwwB,GAAUrjB,KAAMrL,GAAQ,CAC5B,IAAMozB,EACL,OAAOpzB,EAERA,EAAM,OAyCP,QAlCQhB,EAAQ+xB,qBAAuBkC,IAMrCj0B,EAAQmyB,wBAA0BlnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC2wB,WAAY3wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOixB,KAG1DjxB,EAAKyxB,iBAAiBxyB,SAEtB+xB,EAAiE,eAAnDryB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,IAKpDM,EAAmBC,KAAcxxB,KAEhCjC,EAAMiC,EAAMwxB,MAKdzzB,EAAM2wB,WAAY3wB,IAAS,GAI1B8yB,GACC7wB,EACA8wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAlzB,GAEE,KA+SL,SAAS2zB,GAAO1xB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GACzC,OAAO,IAAID,GAAMxyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GA7S5DhzB,EAAOmC,OAAQ,CAId8wB,SAAU,CACTC,QAAS,CACRvyB,IAAK,SAAUU,EAAMitB,GACpB,GAAKA,EAAW,CAGf,IAAIvtB,EAAMstB,GAAQhtB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACVgR,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV9P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOquB,GAGnC,GAAMnxB,GAA0B,IAAlBA,EAAK9C,UAAoC,IAAlB8C,EAAK9C,UAAmB8C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd6T,EAAWrV,EAAW3c,GACtBiyB,EAAe7C,GAAYhnB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM+S,IACLjyB,EAAO8uB,GAAekD,IAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,QAGrCvxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOmxB,IAEzBzxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB21B,IAC1BnwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWkS,GAAa,GAAK,OAI7Dj2B,EAAQ8xB,iBAA6B,KAAV/rB,GAAiD,IAAjC9B,EAAKxE,QAAS,gBAC9D0jB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOquB,MAE7B8B,EACJ/S,EAAMgT,YAAalyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMmwB,EAAOF,GACjC,IAAIlzB,EAAKwB,EAAK4f,EACb6T,EAAWrV,EAAW3c,GA6BvB,OA5BgBovB,GAAYhnB,KAAMpI,KAMjCA,EAAO8uB,GAAekD,KAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,KAGtC,QAAS7T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMmxB,SAIjB1vB,IAAR1D,IACJA,EAAMivB,GAAQhtB,EAAMgB,EAAMiwB,IAId,WAARlzB,GAAoBiD,KAAQuvB,KAChCxyB,EAAMwyB,GAAoBvvB,IAIZ,KAAVmwB,GAAgBA,GACpB5xB,EAAMmvB,WAAY3wB,IACD,IAAVozB,GAAkBgC,SAAU5zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI2tB,GACjDnyB,EAAOizB,SAAUd,GAAc,CAC9BxxB,IAAK,SAAUU,EAAMitB,EAAUkE,GAC9B,GAAKlE,EAIJ,OAAOkD,GAAa/mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKyxB,iBAAiBxyB,QAAWe,EAAKozB,wBAAwBlG,MAIjEoE,GAAkBtxB,EAAM8wB,EAAWK,GAHnCtE,GAAM7sB,EAAMqwB,GAAS,WACpB,OAAOiB,GAAkBtxB,EAAM8wB,EAAWK,MAM9ChT,IAAK,SAAUne,EAAM8C,EAAOquB,GAC3B,IAAIxuB,EACHsuB,EAASvE,GAAW1sB,GAIpBqzB,GAAsBt2B,EAAQkyB,iBACT,aAApBgC,EAAO5C,SAIR2C,GADkBqC,GAAsBlC,IAEY,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCN,EAAWQ,EACVN,GACC7wB,EACA8wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAYhvB,KAAK0vB,KAChBrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEyyB,WAAYuC,EAAQH,IACpBD,GAAoB7wB,EAAM8wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAchuB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO4Q,GAAchuB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM8wB,IAGpBJ,GAAmB1wB,EAAM8C,EAAO6tB,OAK1ChyB,EAAOizB,SAAS3D,WAAaV,GAAcxwB,EAAQiyB,mBAClD,SAAUhvB,EAAMitB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQhtB,EAAM,gBAClCA,EAAKozB,wBAAwBE,KAC5BzG,GAAM7sB,EAAM,CAAEiuB,WAAY,GAAK,WAC9B,OAAOjuB,EAAKozB,wBAAwBE,QAEnC,OAMP30B,EAAOkB,KAAM,CACZ0zB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBh1B,EAAOizB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU9wB,GAOjB,IANA,IAAIhF,EAAI,EACP+1B,EAAW,GAGXC,EAAyB,iBAAVhxB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd+1B,EAAUH,EAAS7T,GAAW/hB,GAAM61B,GACnCG,EAAOh2B,IAAOg2B,EAAOh2B,EAAI,IAAOg2B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ/0B,EAAOizB,SAAU8B,EAASC,GAASxV,IAAMuS,MAI3C/xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQphB,KAAM,SAAUqE,EAAMgB,EAAM8B,GAC1C,IAAImuB,EAAQxwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAiwB,EAASvE,GAAW1sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOmzB,GAGxD,OAAOlxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO+yB,MAAQA,IAETxyB,UAAY,CACjBE,YAAasyB,GACb3yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,EAAQ9Q,GACjDllB,KAAKqE,KAAOA,EACZrE,KAAK0iB,KAAOA,EACZ1iB,KAAKg2B,OAASA,GAAUhzB,EAAOgzB,OAAOtP,SACtC1mB,KAAKoF,QAAUA,EACfpF,KAAKkU,MAAQlU,KAAKmsB,IAAMnsB,KAAK8O,MAC7B9O,KAAKgF,IAAMA,EACXhF,KAAKklB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK3D,MACX+1B,GAAMqC,UAAU1R,SAAS/iB,IAAK3D,OAEhCq4B,IAAK,SAAUC,GACd,IAAIC,EACH/U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAoB/B,OAlBK1iB,KAAKoF,QAAQozB,SACjBx4B,KAAKy4B,IAAMF,EAAQv1B,EAAOgzB,OAAQh2B,KAAKg2B,QACtCsC,EAASt4B,KAAKoF,QAAQozB,SAAWF,EAAS,EAAG,EAAGt4B,KAAKoF,QAAQozB,UAG9Dx4B,KAAKy4B,IAAMF,EAAQD,EAEpBt4B,KAAKmsB,KAAQnsB,KAAKgF,IAAMhF,KAAKkU,OAAUqkB,EAAQv4B,KAAKkU,MAE/ClU,KAAKoF,QAAQszB,MACjB14B,KAAKoF,QAAQszB,KAAKj4B,KAAMT,KAAKqE,KAAMrE,KAAKmsB,IAAKnsB,MAGzCwjB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKxiB,MAEX+1B,GAAMqC,UAAU1R,SAASlE,IAAKxiB,MAExBA,QAIOoD,KAAKG,UAAYwyB,GAAMxyB,WAEvCwyB,GAAMqC,UAAY,CACjB1R,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK9C,UACa,MAA5BqjB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAC1B1f,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK9C,WACtByB,EAAOizB,SAAUrR,EAAMlC,OAC6B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO4P,GAAevP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,IAFjCnpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMuH,IAAMvH,EAAMM,UAU5C0T,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDrW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK9C,UAAYqjB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,OAKpCnpB,EAAOgzB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM/yB,KAAKizB,IAAKF,EAAI/yB,KAAKkzB,IAAO,GAExCxS,SAAU,SAGX1jB,EAAO21B,GAAK5C,GAAMxyB,UAAUH,KAG5BJ,EAAO21B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAmrBHxoB,GAEHyoB,GAprBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBx5B,EAAS65B,QAAoB15B,EAAO25B,sBACxC35B,EAAO25B,sBAAuBF,IAE9Bz5B,EAAO+f,WAAY0Z,GAAUx2B,EAAO21B,GAAGgB,UAGxC32B,EAAO21B,GAAGiB,QAKZ,SAASC,KAIR,OAHA95B,EAAO+f,WAAY,WAClBqZ,QAAQrzB,IAEAqzB,GAAQzwB,KAAKyjB,MAIvB,SAAS2N,GAAOn4B,EAAMo4B,GACrB,IAAI/L,EACH7rB,EAAI,EACJuM,EAAQ,CAAEilB,OAAQhyB,GAKnB,IADAo4B,EAAeA,EAAe,EAAI,EAC1B53B,EAAI,EAAGA,GAAK,EAAI43B,EAEvBrrB,EAAO,UADPsf,EAAQ9J,GAAW/hB,KACSuM,EAAO,UAAYsf,GAAUrsB,EAO1D,OAJKo4B,IACJrrB,EAAMwnB,QAAUxnB,EAAM6iB,MAAQ5vB,GAGxB+M,EAGR,SAASsrB,GAAa7yB,EAAOub,EAAMuX,GAKlC,IAJA,IAAIrV,EACHuK,GAAe+K,GAAUC,SAAUzX,IAAU,IAAKhiB,OAAQw5B,GAAUC,SAAU,MAC9E7e,EAAQ,EACRhY,EAAS6rB,EAAW7rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQuK,EAAY7T,GAAQ7a,KAAMw5B,EAAWvX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASsV,GAAW71B,EAAM+1B,EAAYh1B,GACrC,IAAImO,EACH8mB,EACA/e,EAAQ,EACRhY,EAAS42B,GAAUI,WAAWh3B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bwb,EAAKv1B,OAEbu1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B3Z,EAAYla,KAAKivB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHpY,EAAY+Z,EAAUzB,UAAY,GAEzCld,EAAQ,EACRhY,EAAS22B,EAAUQ,OAAOn3B,OAEnBgY,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAKC,GAMhC,OAHAja,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW3B,EAASpY,IAG5CoY,EAAU,GAAKh1B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAI5C5b,EAASmB,YAAanb,EAAM,CAAE41B,KACvB,IAERA,EAAY5b,EAASzB,QAAS,CAC7BvY,KAAMA,EACNynB,MAAO9oB,EAAOmC,OAAQ,GAAIi1B,GAC1BM,KAAM13B,EAAOmC,QAAQ,EAAM,CAC1Bw1B,cAAe,GACf3E,OAAQhzB,EAAOgzB,OAAOtP,UACpBthB,GACHw1B,mBAAoBR,EACpBS,gBAAiBz1B,EACjBo1B,UAAWrB,IAASU,KACpBrB,SAAUpzB,EAAQozB,SAClBiC,OAAQ,GACRT,YAAa,SAAUtX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO+yB,MAAO1xB,EAAM41B,EAAUS,KAAMhY,EAAM1d,EACrDi1B,EAAUS,KAAKC,cAAejY,IAAUuX,EAAUS,KAAK1E,QAExD,OADAiE,EAAUQ,OAAO75B,KAAMgkB,GAChBA,GAERlB,KAAM,SAAUoX,GACf,IAAIxf,EAAQ,EAIXhY,EAASw3B,EAAUb,EAAUQ,OAAOn3B,OAAS,EAC9C,GAAK+2B,EACJ,OAAOr6B,KAGR,IADAq6B,GAAU,EACF/e,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAK,GAUhC,OANKyC,GACJzc,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAC3C5b,EAASmB,YAAanb,EAAM,CAAE41B,EAAWa,KAEzCzc,EAASuB,WAAYvb,EAAM,CAAE41B,EAAWa,IAElC96B,QAGT8rB,EAAQmO,EAAUnO,MAInB,KA/HD,SAAqBA,EAAO6O,GAC3B,IAAIrf,EAAOjW,EAAM2wB,EAAQ7uB,EAAOqc,EAGhC,IAAMlI,KAASwQ,EAed,GAbAkK,EAAS2E,EADTt1B,EAAO2c,EAAW1G,IAElBnU,EAAQ2kB,EAAOxQ,GACV1V,MAAMC,QAASsB,KACnB6uB,EAAS7uB,EAAO,GAChBA,EAAQ2kB,EAAOxQ,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACdymB,EAAOzmB,GAAS8B,SACT2kB,EAAOxQ,KAGfkI,EAAQxgB,EAAOizB,SAAU5wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMyU,OAAQ9wB,UACf2kB,EAAOzmB,GAIC8B,EACNmU,KAASwQ,IAChBA,EAAOxQ,GAAUnU,EAAOmU,GACxBqf,EAAerf,GAAU0a,QAI3B2E,EAAet1B,GAAS2wB,EA6F1B+E,CAAYjP,EAAOmO,EAAUS,KAAKC,eAE1Brf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS2mB,GAAUI,WAAYhf,GAAQ7a,KAAMw5B,EAAW51B,EAAMynB,EAAOmO,EAAUS,MAM9E,OAJKr5B,EAAYkS,EAAOmQ,QACvB1gB,EAAOygB,YAAawW,EAAU51B,KAAM41B,EAAUS,KAAKnd,OAAQmG,KAC1DnQ,EAAOmQ,KAAKsX,KAAMznB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK0nB,EAAOkO,GAAaC,GAE3B54B,EAAY44B,EAAUS,KAAKxmB,QAC/B+lB,EAAUS,KAAKxmB,MAAMzT,KAAM4D,EAAM41B,GAIlCA,EACErb,SAAUqb,EAAUS,KAAK9b,UACzB/V,KAAMoxB,EAAUS,KAAK7xB,KAAMoxB,EAAUS,KAAKO,UAC1Cpe,KAAMod,EAAUS,KAAK7d,MACrBuB,OAAQ6b,EAAUS,KAAKtc,QAEzBpb,EAAO21B,GAAGuC,MACTl4B,EAAOmC,OAAQy0B,EAAM,CACpBv1B,KAAMA,EACN82B,KAAMlB,EACN1c,MAAO0c,EAAUS,KAAKnd,SAIjB0c,EAGRj3B,EAAOk3B,UAAYl3B,EAAOmC,OAAQ+0B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAU1Y,EAAMvb,GACtB,IAAIyd,EAAQ5kB,KAAKg6B,YAAatX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITyW,QAAS,SAAUvP,EAAO3nB,GACpB9C,EAAYyqB,IAChB3nB,EAAW2nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMhf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAASwoB,EAAMxoB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOoJ,EAAOxQ,GACd4e,GAAUC,SAAUzX,GAASwX,GAAUC,SAAUzX,IAAU,GAC3DwX,GAAUC,SAAUzX,GAAO9Q,QAASzN,IAItCm2B,WAAY,CA3Wb,SAA2Bj2B,EAAMynB,EAAO4O,GACvC,IAAIhY,EAAMvb,EAAOwe,EAAQnC,EAAO8X,EAASC,EAAWC,EAAgBhX,EACnEiX,EAAQ,UAAW3P,GAAS,WAAYA,EACxCqP,EAAOn7B,KACPsuB,EAAO,GACP/J,EAAQlgB,EAAKkgB,MACbkV,EAASp1B,EAAK9C,UAAY+iB,GAAoBjgB,GAC9Cq3B,EAAW9Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BAgY,EAAKnd,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBs3B,WACVnY,EAAMmY,SAAW,EACjBL,EAAU9X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMmY,UACXL,MAIH9X,EAAMmY,WAENR,EAAK/c,OAAQ,WAGZ+c,EAAK/c,OAAQ,WACZoF,EAAMmY,WACA34B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFqO,EAEb,GADA3kB,EAAQ2kB,EAAOpJ,GACV4W,GAAS7rB,KAAMtG,GAAU,CAG7B,UAFO2kB,EAAOpJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYsyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVtyB,IAAoBu0B,QAAiC51B,IAArB41B,EAAUhZ,GAK9C,SAJA+W,GAAS,EAOXnL,EAAM5L,GAASgZ,GAAYA,EAAUhZ,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA6Y,GAAav4B,EAAOyD,cAAeqlB,MAChB9oB,EAAOyD,cAAe6nB,GA8DzC,IAAM5L,KAzDD+Y,GAA2B,IAAlBp3B,EAAK9C,WAMlBm5B,EAAKkB,SAAW,CAAErX,EAAMqX,SAAUrX,EAAMsX,UAAWtX,EAAMuX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASlX,WAErCgX,EAAiB5Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBm3B,EACJhX,EAAUgX,GAIVlW,GAAU,CAAEjhB,IAAQ,GACpBm3B,EAAiBn3B,EAAKkgB,MAAMC,SAAWgX,EACvChX,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlBgX,IACrB,SAAhCx4B,EAAOyhB,IAAKpgB,EAAM,WAGhBk3B,IACLJ,EAAKtyB,KAAM,WACV0b,EAAMC,QAAUgX,IAEM,MAAlBA,IACJhX,EAAUD,EAAMC,QAChBgX,EAA6B,SAAZhX,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdkW,EAAKkB,WACTrX,EAAMqX,SAAW,SACjBT,EAAK/c,OAAQ,WACZmG,EAAMqX,SAAWlB,EAAKkB,SAAU,GAChCrX,EAAMsX,UAAYnB,EAAKkB,SAAU,GACjCrX,EAAMuX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACEjN,EAGPiN,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW9Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAASgX,IAInD7V,IACJ+V,EAASjC,QAAUA,GAIfA,GACJnU,GAAU,CAAEjhB,IAAQ,GAKrB82B,EAAKtyB,KAAM,WASV,IAAM6Z,KAJA+W,GACLnU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTiqB,EACbtrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM4L,EAAM5L,OAMnC6Y,EAAYvB,GAAaP,EAASiC,EAAUhZ,GAAS,EAAGA,EAAMyY,GACtDzY,KAAQgZ,IACfA,EAAUhZ,GAAS6Y,EAAUrnB,MACxBulB,IACJ8B,EAAUv2B,IAAMu2B,EAAUrnB,MAC1BqnB,EAAUrnB,MAAQ,MAuMrB6nB,UAAW,SAAU53B,EAAU+rB,GACzBA,EACJgK,GAAUI,WAAW1oB,QAASzN,GAE9B+1B,GAAUI,WAAW15B,KAAMuD,MAK9BnB,EAAOg5B,MAAQ,SAAUA,EAAOhG,EAAQ7yB,GACvC,IAAIk2B,EAAM2C,GAA0B,iBAAVA,EAAqBh5B,EAAOmC,OAAQ,GAAI62B,GAAU,CAC3Ef,SAAU93B,IAAOA,GAAM6yB,GACtB30B,EAAY26B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ7yB,GAAM6yB,GAAUA,IAAW30B,EAAY20B,IAAYA,GAoC5D,OAhCKhzB,EAAO21B,GAAGlQ,IACd4Q,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYx1B,EAAO21B,GAAGsD,OAC9B5C,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAOvV,UAMjB,MAAb2S,EAAI9b,QAA+B,IAAd8b,EAAI9b,QAC7B8b,EAAI9b,MAAQ,MAIb8b,EAAIlI,IAAMkI,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT55B,EAAYg4B,EAAIlI,MACpBkI,EAAIlI,IAAI1wB,KAAMT,MAGVq5B,EAAI9b,OACRva,EAAOsgB,QAAStjB,KAAMq5B,EAAI9b,QAIrB8b,GAGRr2B,EAAOG,GAAGgC,OAAQ,CACjB+2B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ7xB,GAGpC,OAAOnE,KAAKsQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMo3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ7xB,IAElDi4B,QAAS,SAAU1Z,EAAMsZ,EAAOhG,EAAQ7xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC2Z,EAASr5B,EAAOg5B,MAAOA,EAAOhG,EAAQ7xB,GACtCm4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWl6B,KAAMgD,EAAOmC,OAAQ,GAAIud,GAAQ2Z,IAGlDvmB,GAAS8M,EAASjf,IAAK3D,KAAM,YACjCm7B,EAAKzX,MAAM,IAMd,OAFA4Y,EAAYC,OAASD,EAEdxmB,IAA0B,IAAjBumB,EAAO9e,MACtBvd,KAAKkE,KAAMo4B,GACXt8B,KAAKud,MAAO8e,EAAO9e,MAAO+e,IAE5B5Y,KAAM,SAAU/hB,EAAMiiB,EAAYkX,GACjC,IAAI0B,EAAY,SAAUhZ,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMoX,IAYP,MATqB,iBAATn5B,IACXm5B,EAAUlX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ5jB,KAAKud,MAAO5b,GAAQ,KAAM,IAGpB3B,KAAKkE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B86B,EAASz5B,EAAOy5B,OAChBha,EAAOG,EAASjf,IAAK3D,MAEtB,GAAKsb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC8Y,EAAW/Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ6V,GAAK9rB,KAAM6N,IACtDkhB,EAAW/Z,EAAMnH,IAKpB,IAAMA,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MACnB,MAAR2B,GAAgB86B,EAAQnhB,GAAQiC,QAAU5b,IAE5C86B,EAAQnhB,GAAQ6f,KAAKzX,KAAMoX,GAC3BxX,GAAU,EACVmZ,EAAOv3B,OAAQoW,EAAO,KAOnBgI,GAAYwX,GAChB93B,EAAOsgB,QAAStjB,KAAM2B,MAIzB46B,OAAQ,SAAU56B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET3B,KAAKkE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK3D,MACrBud,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB86B,EAASz5B,EAAOy5B,OAChBn5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK8Z,QAAS,EAGdv5B,EAAOua,MAAOvd,KAAM2B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKjjB,KAAMT,MAAM,GAIlBsb,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MAAQy8B,EAAQnhB,GAAQiC,QAAU5b,IAC/D86B,EAAQnhB,GAAQ6f,KAAKzX,MAAM,GAC3B+Y,EAAOv3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQihB,QACrChf,EAAOjC,GAAQihB,OAAO97B,KAAMT,aAKvByiB,EAAK8Z,YAKfv5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIq3B,EAAQ15B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAgB,MAAT63B,GAAkC,kBAAVA,EAC9BU,EAAM/7B,MAAOX,KAAMsE,WACnBtE,KAAKo8B,QAAStC,GAAOz0B,GAAM,GAAQ22B,EAAOhG,EAAQ7xB,MAKrDnB,EAAOkB,KAAM,CACZy4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU7wB,EAAMymB,GAClB9oB,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAOnE,KAAKo8B,QAAStQ,EAAOkQ,EAAOhG,EAAQ7xB,MAI7CnB,EAAOy5B,OAAS,GAChBz5B,EAAO21B,GAAGiB,KAAO,WAChB,IAAIsB,EACH/4B,EAAI,EACJs6B,EAASz5B,EAAOy5B,OAIjB,IAFAtD,GAAQzwB,KAAKyjB,MAELhqB,EAAIs6B,EAAOn5B,OAAQnB,KAC1B+4B,EAAQuB,EAAQt6B,OAGCs6B,EAAQt6B,KAAQ+4B,GAChCuB,EAAOv3B,OAAQ/C,IAAK,GAIhBs6B,EAAOn5B,QACZN,EAAO21B,GAAGjV,OAEXyV,QAAQrzB,GAGT9C,EAAO21B,GAAGuC,MAAQ,SAAUA,GAC3Bl4B,EAAOy5B,OAAO77B,KAAMs6B,GACpBl4B,EAAO21B,GAAGzkB,SAGXlR,EAAO21B,GAAGgB,SAAW,GACrB32B,EAAO21B,GAAGzkB,MAAQ,WACZklB,KAILA,IAAa,EACbI,OAGDx2B,EAAO21B,GAAGjV,KAAO,WAChB0V,GAAa,MAGdp2B,EAAO21B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNxW,SAAU,KAMX1jB,EAAOG,GAAGg6B,MAAQ,SAAUC,EAAMz7B,GAIjC,OAHAy7B,EAAOp6B,EAAO21B,IAAK31B,EAAO21B,GAAGsD,OAAQmB,IAAiBA,EACtDz7B,EAAOA,GAAQ,KAER3B,KAAKud,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI6Z,EAAUt9B,EAAO+f,WAAYvT,EAAM6wB,GACvC5Z,EAAME,KAAO,WACZ3jB,EAAOu9B,aAAcD,OAOnBzsB,GAAQhR,EAAS0C,cAAe,SAEnC+2B,GADSz5B,EAAS0C,cAAe,UACpBK,YAAa/C,EAAS0C,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbP,EAAQm8B,QAA0B,KAAhB3sB,GAAMzJ,MAIxB/F,EAAQo8B,YAAcnE,GAAIzjB,UAI1BhF,GAAQhR,EAAS0C,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbP,EAAQq8B,WAA6B,MAAhB7sB,GAAMzJ,MAI5B,IAAIu2B,GACH9uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dq6B,WAAY,SAAUt4B,GACrB,OAAOrF,KAAKkE,KAAM,WACjBlB,EAAO26B,WAAY39B,KAAMqF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBv5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVy2B,GAAgB56B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO66B,UAAWx4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASq4B,QAAW53B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO26B,WAAYt5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC85B,UAAW,CACVl8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM/F,EAAQq8B,YAAwB,UAAVt2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXw2B,WAAY,SAAUt5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ27B,EAAY32B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK4hB,GAA+B,IAAlBz5B,EAAK9C,SACtB,MAAU8D,EAAOy4B,EAAW37B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bq4B,GAAW,CACVlb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO26B,WAAYt5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAI04B,EAASnvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAK+lB,EACRkU,EAAgB34B,EAAKoC,cAYtB,OAVMI,IAGLiiB,EAASlb,GAAYovB,GACrBpvB,GAAYovB,GAAkBj6B,EAC9BA,EAAqC,MAA/Bg6B,EAAQ15B,EAAMgB,EAAMwC,GACzBm2B,EACA,KACDpvB,GAAYovB,GAAkBlU,GAExB/lB,KAOT,IAAIk6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkBh3B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASuwB,GAAU/5B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS67B,GAAgBl3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dg7B,WAAY,SAAUj5B,GACrB,OAAOrF,KAAKkE,KAAM,kBACVlE,KAAMgD,EAAOu7B,QAASl5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB56B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOu7B,QAASl5B,IAAUA,EACjCme,EAAQxgB,EAAOo1B,UAAW/yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd+yB,UAAW,CACV3iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIm6B,EAAWx7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKm6B,EACG5K,SAAU4K,EAAU,IAI3BP,GAAWxwB,KAAMpJ,EAAKgI,WACtB6xB,GAAWzwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX+oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLt9B,EAAQo8B,cACbx6B,EAAOo1B,UAAUxiB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOu7B,QAASv+B,KAAKyH,eAAkBzH,OA4BxCgD,EAAOG,GAAGgC,OAAQ,CACjBw5B,SAAU,SAAUx3B,GACnB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAO2+B,SAAUx3B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAM1D,IAFA4+B,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAItB,GAHA08B,EAAWT,GAAU/5B,GACrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KACrB+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAAQ,IACvChwB,GAAOgwB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRg/B,YAAa,SAAU73B,GACtB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAOg/B,YAAa73B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAI7D,IAAMsE,UAAUhB,OACf,OAAOtD,KAAK+R,KAAM,QAAS,IAK5B,IAFA6sB,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAMtB,GALA08B,EAAWT,GAAU/5B,GAGrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KAG1B,OAA4C,EAApC+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAClChwB,EAAMA,EAAI5I,QAAS,IAAM44B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRi/B,YAAa,SAAU93B,EAAO+3B,GAC7B,IAAIv9B,SAAcwF,EACjBg4B,EAAwB,WAATx9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb+3B,GAA0BC,EAC9BD,EAAWl/B,KAAK2+B,SAAUx3B,GAAUnH,KAAKg/B,YAAa73B,GAGzD9F,EAAY8F,GACTnH,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOi/B,YACd93B,EAAM1G,KAAMT,KAAMmC,EAAGi8B,GAAUp+B,MAAQk/B,GACvCA,KAKIl/B,KAAKkE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM2kB,EAExB,GAAKD,EAAe,CAGnBh9B,EAAI,EACJsY,EAAOzX,EAAQhD,MACfo/B,EAAaf,GAAgBl3B,GAE7B,MAAU+I,EAAYkvB,EAAYj9B,KAG5BsY,EAAK4kB,SAAUnvB,GACnBuK,EAAKukB,YAAa9uB,GAElBuK,EAAKkkB,SAAUzuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYkuB,GAAUp+B,QAIrB4iB,EAASJ,IAAKxiB,KAAM,gBAAiBkQ,GAOjClQ,KAAKyC,cACTzC,KAAKyC,aAAc,QAClByN,IAAuB,IAAV/I,EACZ,GACAyb,EAASjf,IAAK3D,KAAM,kBAAqB,QAO/Cq/B,SAAU,SAAUp8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOrE,KAAMmC,KACtB,GAAuB,IAAlBkC,EAAK9C,WACoE,GAA3E,IAAM48B,GAAkBC,GAAU/5B,IAAW,KAAMxD,QAASqP,GAC9D,OAAO,EAIT,OAAO,KAOT,IAAIovB,GAAU,MAEdt8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKurB,EACfjrB,EAAOrE,KAAM,GAEd,OAAMsE,UAAUhB,QA0BhBgsB,EAAkBjuB,EAAY8F,GAEvBnH,KAAKkE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBpC,KAAKuB,WAWE,OANXa,EADIktB,EACEnoB,EAAM1G,KAAMT,KAAMmC,EAAGa,EAAQhD,MAAOoC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOu8B,SAAUv/B,KAAK2B,OAAUqB,EAAOu8B,SAAUv/B,KAAKqM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKxiB,KAAMoC,EAAK,WAC3DpC,KAAKmH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOu8B,SAAUl7B,EAAK1C,OAC7BqB,EAAOu8B,SAAUl7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASo5B,GAAS,IAIhB,MAAPv7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdo6B,SAAU,CACTnZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA+7B,GAAkBn7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACbyS,EAAoB,eAAdjkB,EAAK1C,KACX6jB,EAAS8C,EAAM,KAAO,GACtB2M,EAAM3M,EAAMhN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR2Z,EAGA3M,EAAMhN,EAAQ,EAIXnZ,EAAI8yB,EAAK9yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBkmB,EACJ,OAAOnhB,EAIRqe,EAAO5kB,KAAMuG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIq4B,EAAWpZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOu8B,SAASnZ,OAAOziB,IAAKyiB,GAAUZ,MAEtDga,GAAY,GAUd,OAHMA,IACLn7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOu8B,SAAUv/B,MAAS,CACzBwiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D/F,EAAQm8B,UACbv6B,EAAOu8B,SAAUv/B,MAAO2D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D/F,EAAQq+B,QAAU,cAAe1/B,EAGjC,IAAI2/B,GAAc,kCACjBC,GAA0B,SAAUlzB,GACnCA,EAAEsc,mBAGJ/lB,EAAOmC,OAAQnC,EAAOwlB,MAAO,CAE5BU,QAAS,SAAUV,EAAO/F,EAAMpe,EAAMu7B,GAErC,IAAIz9B,EAAG2M,EAAK6B,EAAKkvB,EAAYC,EAAQhW,EAAQ3K,EAAS4gB,EACrDC,EAAY,CAAE37B,GAAQzE,GACtB+B,EAAOX,EAAOP,KAAM+nB,EAAO,QAAWA,EAAM7mB,KAAO6mB,EACnDkB,EAAa1oB,EAAOP,KAAM+nB,EAAO,aAAgBA,EAAM/Y,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMixB,EAAcpvB,EAAMtM,EAAOA,GAAQzE,EAGlB,IAAlByE,EAAK9C,UAAoC,IAAlB8C,EAAK9C,WAK5Bm+B,GAAYjyB,KAAM9L,EAAOqB,EAAOwlB,MAAMuB,cAIf,EAAvBpoB,EAAKd,QAAS,OAIlBc,GADA+nB,EAAa/nB,EAAK4F,MAAO,MACP8G,QAClBqb,EAAWzkB,QAEZ66B,EAASn+B,EAAKd,QAAS,KAAQ,GAAK,KAAOc,GAG3C6mB,EAAQA,EAAOxlB,EAAO+C,SACrByiB,EACA,IAAIxlB,EAAOmmB,MAAOxnB,EAAuB,iBAAV6mB,GAAsBA,IAGhDK,UAAY+W,EAAe,EAAI,EACrCpX,EAAM/Y,UAAYia,EAAW7b,KAAM,KACnC2a,EAAMwC,WAAaxC,EAAM/Y,UACxB,IAAI1F,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAC7D,KAGD2a,EAAMjV,YAASzN,EACT0iB,EAAM/iB,SACX+iB,EAAM/iB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAE+F,GACFxlB,EAAO2D,UAAW8b,EAAM,CAAE+F,IAG3BrJ,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GACpCi+B,IAAgBzgB,EAAQ+J,UAAmD,IAAxC/J,EAAQ+J,QAAQvoB,MAAO0D,EAAMoe,IAAtE,CAMA,IAAMmd,IAAiBzgB,EAAQuM,WAAajqB,EAAU4C,GAAS,CAM9D,IAJAw7B,EAAa1gB,EAAQ2J,cAAgBnnB,EAC/B+9B,GAAYjyB,KAAMoyB,EAAal+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBo9B,EAAUp/B,KAAMkO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBtN,IACpCogC,EAAUp/B,KAAM+P,EAAIb,aAAea,EAAIsvB,cAAgBlgC,GAKzDoC,EAAI,EACJ,OAAU2M,EAAMkxB,EAAW79B,QAAYqmB,EAAMqC,uBAC5CkV,EAAcjxB,EACd0Z,EAAM7mB,KAAW,EAAJQ,EACZ09B,EACA1gB,EAAQ8K,UAAYtoB,GAGrBmoB,GAAWlH,EAASjf,IAAKmL,EAAK,WAAc1O,OAAOypB,OAAQ,OAAUrB,EAAM7mB,OAC1EihB,EAASjf,IAAKmL,EAAK,YAEnBgb,EAAOnpB,MAAOmO,EAAK2T,IAIpBqH,EAASgW,GAAUhxB,EAAKgxB,KACThW,EAAOnpB,OAASuhB,EAAYpT,KAC1C0Z,EAAMjV,OAASuW,EAAOnpB,MAAOmO,EAAK2T,IACZ,IAAjB+F,EAAMjV,QACViV,EAAMS,kBA8CT,OA1CAT,EAAM7mB,KAAOA,EAGPi+B,GAAiBpX,EAAMuD,sBAEpB5M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS/lB,MAAOq/B,EAAU12B,MAAOmZ,KACzCP,EAAY7d,IAIPy7B,GAAUz+B,EAAYgD,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMy7B,MAGXz7B,EAAMy7B,GAAW,MAIlB98B,EAAOwlB,MAAMuB,UAAYpoB,EAEpB6mB,EAAMqC,wBACVkV,EAAY/vB,iBAAkBrO,EAAMg+B,IAGrCt7B,EAAM1C,KAED6mB,EAAMqC,wBACVkV,EAAYhf,oBAAqBpf,EAAMg+B,IAGxC38B,EAAOwlB,MAAMuB,eAAYjkB,EAEpB6K,IACJtM,EAAMy7B,GAAWnvB,IAMd6X,EAAMjV,SAKd2sB,SAAU,SAAUv+B,EAAM0C,EAAMmkB,GAC/B,IAAI/b,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOmmB,MACXX,EACA,CACC7mB,KAAMA,EACNyqB,aAAa,IAIfppB,EAAOwlB,MAAMU,QAASzc,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjB+jB,QAAS,SAAUvnB,EAAM8gB,GACxB,OAAOziB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMziB,SAGpCmgC,eAAgB,SAAUx+B,EAAM8gB,GAC/B,IAAIpe,EAAOrE,KAAM,GACjB,GAAKqE,EACJ,OAAOrB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMpe,GAAM,MAc5CjD,EAAQq+B,SACbz8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAI/b,EAAU,SAAU6Z,GACvBxlB,EAAOwlB,MAAM0X,SAAUxV,EAAKlC,EAAM/iB,OAAQzC,EAAOwlB,MAAMkC,IAAKlC,KAG7DxlB,EAAOwlB,MAAMrJ,QAASuL,GAAQ,CAC7BP,MAAO,WAIN,IAAIjoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAE5B0V,GACLl+B,EAAI8N,iBAAkBse,EAAM3f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAKwoB,GAAO0V,GAAY,GAAM,IAEhD9V,SAAU,WACT,IAAIpoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAAQ,EAEpC0V,EAKLxd,EAASxB,OAAQlf,EAAKwoB,EAAK0V,IAJ3Bl+B,EAAI6e,oBAAqBuN,EAAM3f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAKwoB,QAS3B,IAAIvV,GAAWpV,EAAOoV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAKyjB,OAErBkU,GAAS,KAKbr9B,EAAOs9B,SAAW,SAAU7d,GAC3B,IAAI3O,EAAKysB,EACT,IAAM9d,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM/T,EAAOygC,WAAcC,gBAAiBhe,EAAM,YACvD,MAAQhW,IAYV,OAVA8zB,EAAkBzsB,GAAOA,EAAIxG,qBAAsB,eAAiB,GAC9DwG,IAAOysB,GACZv9B,EAAOoD,MAAO,iBACbm6B,EACCv9B,EAAOoB,IAAKm8B,EAAgB/zB,WAAY,SAAUgC,GACjD,OAAOA,EAAG8D,cACPzE,KAAM,MACV4U,IAGI3O,GAIR,IACC4sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa/I,EAAQz2B,EAAKy/B,EAAavlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAASvE,GAGnB0B,EAAOkB,KAAM5C,EAAK,SAAUa,EAAGia,GACzB2kB,GAAeL,GAASjzB,KAAMsqB,GAGlCvc,EAAKuc,EAAQ3b,GAKb0kB,GACC/I,EAAS,KAAqB,iBAAN3b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACA2kB,EACAvlB,UAKG,GAAMulB,GAAiC,WAAlBj+B,EAAQxB,GAUnCka,EAAKuc,EAAQz2B,QAPb,IAAM+D,KAAQ/D,EACbw/B,GAAa/I,EAAS,IAAM1yB,EAAO,IAAK/D,EAAK+D,GAAQ07B,EAAavlB,GAYrExY,EAAOg+B,MAAQ,SAAU53B,EAAG23B,GAC3B,IAAIhJ,EACHkJ,EAAI,GACJzlB,EAAM,SAAUrN,EAAK+yB,GAGpB,IAAI/5B,EAAQ9F,EAAY6/B,GACvBA,IACAA,EAEDD,EAAGA,EAAE39B,QAAW69B,mBAAoBhzB,GAAQ,IAC3CgzB,mBAA6B,MAATh6B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKxb,KAAKqF,KAAMrF,KAAKmH,cAOtB,IAAM4wB,KAAU3uB,EACf03B,GAAa/I,EAAQ3uB,EAAG2uB,GAAUgJ,EAAavlB,GAKjD,OAAOylB,EAAEpzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjBi8B,UAAW,WACV,OAAOp+B,EAAOg+B,MAAOhhC,KAAKqhC,mBAE3BA,eAAgB,WACf,OAAOrhC,KAAKoE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAM1iB,KAAM,YAClC,OAAO8R,EAAW9O,EAAO2D,UAAWmL,GAAa9R,OAC9CsQ,OAAQ,WACX,IAAI3O,EAAO3B,KAAK2B,KAGhB,OAAO3B,KAAKqF,OAASrC,EAAQhD,MAAOka,GAAI,cACvC2mB,GAAapzB,KAAMzN,KAAKqM,YAAeu0B,GAAgBnzB,KAAM9L,KAC3D3B,KAAK2V,UAAYkQ,GAAepY,KAAM9L,MACtCyC,IAAK,SAAUoD,EAAInD,GACtB,IAAIjC,EAAMY,EAAQhD,MAAOoC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAIhD,CAAEt7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAClDh9B,SAKN,IACC29B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZrH,GAAa,GAObsH,GAAa,GAGbC,GAAW,KAAKnhC,OAAQ,KAGxBohC,GAAeliC,EAAS0C,cAAe,KAKxC,SAASy/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBhkB,GAED,iBAAvBgkB,IACXhkB,EAAOgkB,EACPA,EAAqB,KAGtB,IAAIC,EACH//B,EAAI,EACJggC,EAAYF,EAAmBx6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK7a,EAAY4c,GAGhB,MAAUikB,EAAWC,EAAWhgC,KAGR,MAAlB+/B,EAAU,IACdA,EAAWA,EAAS5hC,MAAO,IAAO,KAChC0hC,EAAWE,GAAaF,EAAWE,IAAc,IAAKtwB,QAASqM,KAI/D+jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKthC,KAAMqd,IAQnE,SAASmkB,GAA+BJ,EAAW58B,EAASy1B,EAAiBwH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAItsB,EAcJ,OAbA0sB,EAAWJ,IAAa,EACxBl/B,EAAOkB,KAAM89B,EAAWE,IAAc,GAAI,SAAUjlB,EAAGwlB,GACtD,IAAIC,EAAsBD,EAAoBr9B,EAASy1B,EAAiBwH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACD3sB,EAAW8sB,QADf,GAHNt9B,EAAQ+8B,UAAUvwB,QAAS8wB,GAC3BF,EAASE,IACF,KAKF9sB,EAGR,OAAO4sB,EAASp9B,EAAQ+8B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYl9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRk9B,EAAc5/B,EAAO6/B,aAAaD,aAAe,GAElD,IAAMz0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPy0B,EAAaz0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/ERq8B,GAAatsB,KAAOL,GAASK,KAgP7BxS,EAAOmC,OAAQ,CAGd29B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK9tB,GAASK,KACd7T,KAAM,MACNuhC,QAxRgB,4DAwRQz1B,KAAM0H,GAASguB,UACvC3jC,QAAQ,EACR4jC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRnI,IAAKyG,GACLt/B,KAAM,aACNgtB,KAAM,YACNzb,IAAK,4BACL0vB,KAAM,qCAGPxoB,SAAU,CACTlH,IAAK,UACLyb,KAAM,SACNiU,KAAM,YAGPC,eAAgB,CACf3vB,IAAK,cACLvR,KAAM,eACNihC,KAAM,gBAKPE,WAAY,CAGXC,SAAUj4B,OAGVk4B,aAAa,EAGbC,YAAa5gB,KAAKC,MAGlB4gB,WAAY9gC,EAAOs9B,UAOpBsC,YAAa,CACZK,KAAK,EACL//B,SAAS,IAOX6gC,UAAW,SAAUt+B,EAAQu+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYl9B,EAAQzC,EAAO6/B,cAAgBmB,GAGvDrB,GAAY3/B,EAAO6/B,aAAcp9B,IAGnCw+B,cAAelC,GAA6BzH,IAC5C4J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK79B,GAGA,iBAAR69B,IACX79B,EAAU69B,EACVA,OAAMn9B,GAIPV,EAAUA,GAAW,GAErB,IAAIg/B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGA3jB,EAGA4jB,EAGAviC,EAGAwiC,EAGA1D,EAAIj+B,EAAO+gC,UAAW,GAAI3+B,GAG1Bw/B,EAAkB3D,EAAE/9B,SAAW+9B,EAG/B4D,EAAqB5D,EAAE/9B,UACpB0hC,EAAgBrjC,UAAYqjC,EAAgBphC,QAC9CR,EAAQ4hC,GACR5hC,EAAOwlB,MAGRnK,EAAWrb,EAAOgb,WAClB8mB,EAAmB9hC,EAAO+Z,UAAW,eAGrCgoB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPnhB,WAAY,EAGZikB,kBAAmB,SAAUh3B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMyjB,EAAkB,CACvBA,EAAkB,GAClB,MAAUz3B,EAAQ20B,GAASt0B,KAAMm3B,GAChCC,EAAiBz3B,EAAO,GAAIrF,cAAgB,MACzC88B,EAAiBz3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD/G,OAAQoM,EAAO,IAGpBA,EAAQy3B,EAAiBp2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cu3B,sBAAuB,WACtB,OAAOtkB,EAAYwjB,EAAwB,MAI5Ce,iBAAkB,SAAUhgC,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO4/B,EAAqB5/B,EAAKoC,eAChCw9B,EAAqB5/B,EAAKoC,gBAAmBpC,EAC9C2/B,EAAgB3/B,GAAS8B,GAEnBnH,MAIRslC,iBAAkB,SAAU3jC,GAI3B,OAHkB,MAAbmf,IACJmgB,EAAEsE,SAAW5jC,GAEP3B,MAIR+kC,WAAY,SAAU3gC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJuhB,EAAMjkB,OAAQha,EAAKi+B,EAAMmD,cAIzB,IAAMxjC,KAAQoC,EACb2gC,EAAY/iC,GAAS,CAAE+iC,EAAY/iC,GAAQoC,EAAKpC,IAInD,OAAOhC,MAIRylC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB98B,EAAM,EAAG88B,GACF3lC,OAoBV,GAfAqe,EAASzB,QAASylB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO9tB,GAASK,MAAS,IAC5CtP,QAASy7B,GAAWxsB,GAASguB,SAAW,MAG1ClC,EAAEt/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQs/B,EAAEtkB,QAAUskB,EAAEt/B,KAGzDs/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMz6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB+kB,EAAE2E,YAAsB,CAC5BnB,EAAY7kC,EAAS0C,cAAe,KAKpC,IACCmiC,EAAUjvB,KAAOyrB,EAAEgC,IAInBwB,EAAUjvB,KAAOivB,EAAUjvB,KAC3ByrB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQp5B,GAITw0B,EAAE2E,aAAc,GAalB,GARK3E,EAAExe,MAAQwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,OACxCwe,EAAExe,KAAOzf,EAAOg+B,MAAOC,EAAExe,KAAMwe,EAAEF,cAIlCqB,GAA+B9H,GAAY2G,EAAG77B,EAASi9B,GAGlDvhB,EACJ,OAAOuhB,EA8ER,IAAMlgC,KAzENuiC,EAAc1hC,EAAOwlB,OAASyY,EAAEzhC,SAGQ,GAApBwD,EAAO8/B,UAC1B9/B,EAAOwlB,MAAMU,QAAS,aAIvB+X,EAAEt/B,KAAOs/B,EAAEt/B,KAAKogB,cAGhBkf,EAAE6E,YAAcpE,GAAWj0B,KAAMwzB,EAAEt/B,MAKnC0iC,EAAWpD,EAAEgC,IAAI/8B,QAASq7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAExe,MAAQwe,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKziC,QAAS,uCACjCogC,EAAExe,KAAOwe,EAAExe,KAAKvc,QAASo7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAI3iC,MAAO+jC,EAAS/gC,QAG5B29B,EAAExe,OAAUwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,QAC1C4hB,IAAchE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQpD,EAAExe,YAGjDwe,EAAExe,OAIO,IAAZwe,EAAE/yB,QACNm2B,EAAWA,EAASn+B,QAASs7B,GAAY,MACzCmD,GAAatE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQ,KAASxiC,GAAMuF,OACnEu9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD/iC,EAAO+/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBriC,EAAO+/B,aAAcsB,IAE9DrhC,EAAOggC,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBriC,EAAOggC,KAAMqB,MAKnDpD,EAAExe,MAAQwe,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBl+B,EAAQk+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBljC,EAAG8+B,EAAE+E,QAAS7jC,IAIvC,GAAK8+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWxlC,KAAMmkC,EAAiBvC,EAAOpB,IAAiBngB,GAG9D,OAAOuhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBtpB,IAAKylB,EAAEhG,UACxBoH,EAAMx5B,KAAMo4B,EAAEiF,SACd7D,EAAMxlB,KAAMokB,EAAE76B,OAGdg+B,EAAYhC,GAA+BR,GAAYX,EAAG77B,EAASi9B,GAK5D,CASN,GARAA,EAAMnhB,WAAa,EAGdwjB,GACJG,EAAmB3b,QAAS,WAAY,CAAEmZ,EAAOpB,IAI7CngB,EACJ,OAAOuhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE5D,UACjBmH,EAAezkC,EAAO+f,WAAY,WACjCuiB,EAAMoD,MAAO,YACXxE,EAAE5D,UAGN,IACCvc,GAAY,EACZsjB,EAAU+B,KAAMnB,EAAgBn8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAM28B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS9/B,EAAOmgC,EAAUC,EACxCd,EAAaU,EAGTtlB,IAILA,GAAY,EAGP0jB,GACJzkC,EAAOu9B,aAAckH,GAKtBJ,OAAYt+B,EAGZw+B,EAAwB0B,GAAW,GAGnC3D,EAAMnhB,WAAsB,EAATskB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI9kC,EAAM+kC,EAAeC,EAC5B3rB,EAAWimB,EAAEjmB,SACbmnB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU9zB,aACEvI,IAAP2gC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM9kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAMg5B,GAAO,CACtDtE,EAAUvwB,QAASjQ,GACnB,MAMH,GAAKwgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMxgC,KAAQ0kC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY/hC,EAAO,IAAMwgC,EAAW,IAAQ,CACrEuE,EAAgB/kC,EAChB,MAEKglC,IACLA,EAAgBhlC,GAKlB+kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUvwB,QAAS80B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IACsC,EAA3CtjC,EAAO6D,QAAS,SAAUo6B,EAAEkB,YAC5Bn/B,EAAO6D,QAAS,OAAQo6B,EAAEkB,WAAc,IACxClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA9iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMp2B,EAAKsK,EAC9ByoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU7hC,QAGzB,GAAK6hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKt/B,eAAkBw5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU9zB,QAGpB,MAAQy4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCtrB,GAAQqrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtCjnB,EAAO6rB,EACPA,EAAU3E,EAAU9zB,QAKnB,GAAiB,MAAZy4B,EAEJA,EAAU7rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS6rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYzoB,EAAO,IAAM6rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA/yB,EAAMk2B,EAAMt/B,MAAO,MACT,KAAQu/B,IAGjBC,EAAOrD,EAAYzoB,EAAO,IAAMtK,EAAK,KACpC+yB,EAAY,KAAO/yB,EAAK,KACb,EAGG,IAATo2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUn2B,EAAK,GACfwxB,EAAUvwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATo2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ95B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAO2gC,EAAOt6B,EAAI,sBAAwBwO,EAAO,OAAS6rB,IASjE,MAAO,CAAE3oB,MAAO,UAAWsE,KAAM8jB,GAidpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCniC,EAAO+/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCniC,EAAOggC,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEt/B,KACxB+jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASpoB,MACtB+nB,EAAUK,EAAS9jB,KAEnB6jB,IADAlgC,EAAQmgC,EAASngC,UAMlBA,EAAQs/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJjoB,EAASmB,YAAaolB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9DhkB,EAASuB,WAAYglB,EAAiB,CAAEvC,EAAOqD,EAAYt/B,IAI5Di8B,EAAM0C,WAAYA,GAClBA,OAAaj/B,EAER4+B,GACJG,EAAmB3b,QAASod,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU9/B,IAIpC0+B,EAAiB/mB,SAAU6mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmB3b,QAAS,eAAgB,CAAEmZ,EAAOpB,MAG3Cj+B,EAAO8/B,QAChB9/B,EAAOwlB,MAAMU,QAAS,cAKzB,OAAOmZ,GAGR8E,QAAS,SAAUlE,EAAKxgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKs/B,EAAKxgB,EAAMte,EAAU,SAGzCijC,UAAW,SAAUnE,EAAK9+B,GACzB,OAAOnB,EAAOW,IAAKs/B,OAAKn9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUsmB,EAAKxgB,EAAMte,EAAUxC,GAUjD,OAPKN,EAAYohB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOmhC,KAAMnhC,EAAOmC,OAAQ,CAClC89B,IAAKA,EACLthC,KAAMgb,EACNulB,SAAUvgC,EACV8gB,KAAMA,EACNyjB,QAAS/hC,GACPnB,EAAO2C,cAAes9B,IAASA,OAIpCjgC,EAAOihC,cAAe,SAAUhD,GAC/B,IAAI9+B,EACJ,IAAMA,KAAK8+B,EAAE+E,QACa,iBAApB7jC,EAAEsF,gBACNw5B,EAAEqC,YAAcrC,EAAE+E,QAAS7jC,IAAO,MAMrCa,EAAOwsB,SAAW,SAAUyT,EAAK79B,EAASlD,GACzC,OAAOc,EAAOmhC,KAAM,CACnBlB,IAAKA,EAGLthC,KAAM,MACNugC,SAAU,SACVh0B,OAAO,EACPm1B,OAAO,EACP7jC,QAAQ,EAKRkkC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBvjC,EAAO0D,WAAY6/B,EAAUnhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBmiC,QAAS,SAAU/X,GAClB,IAAI/H,EAyBJ,OAvBKxnB,KAAM,KACLqB,EAAYkuB,KAChBA,EAAOA,EAAK9uB,KAAMT,KAAM,KAIzBwnB,EAAOxkB,EAAQusB,EAAMvvB,KAAM,GAAIkN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDxF,KAAM,GAAI4C,YACd4kB,EAAK2I,aAAcnwB,KAAM,IAG1BwnB,EAAKpjB,IAAK,WACT,IAAIC,EAAOrE,KAEX,MAAQqE,EAAKkjC,kBACZljC,EAAOA,EAAKkjC,kBAGb,OAAOljC,IACJ4rB,OAAQjwB,OAGNA,MAGRwnC,UAAW,SAAUjY,GACpB,OAAKluB,EAAYkuB,GACTvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOwnC,UAAWjY,EAAK9uB,KAAMT,KAAMmC,MAItCnC,KAAKkE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQhD,MAClBgb,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASssB,QAAS/X,GAGlB9U,EAAKwV,OAAQV,MAKhB/H,KAAM,SAAU+H,GACf,IAAIkY,EAAiBpmC,EAAYkuB,GAEjC,OAAOvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOsnC,QAASG,EAAiBlY,EAAK9uB,KAAMT,KAAMmC,GAAMotB,MAIlEmY,OAAQ,SAAUzkC,GAIjB,OAHAjD,KAAKmU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQhD,MAAOswB,YAAatwB,KAAKwM,cAE3BxM,QAKTgD,EAAO6O,KAAKhI,QAAQ4vB,OAAS,SAAUp1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ89B,QAAStjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ89B,QAAU,SAAUtjC,GACvC,SAAWA,EAAKuuB,aAAevuB,EAAK0vB,cAAgB1vB,EAAKyxB,iBAAiBxyB,SAM3EN,EAAO6/B,aAAa+E,IAAM,WACzB,IACC,OAAO,IAAI7nC,EAAO8nC,eACjB,MAAQp7B,MAGX,IAAIq7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAejlC,EAAO6/B,aAAa+E,MAEpCxmC,EAAQ8mC,OAASD,IAAkB,oBAAqBA,GACxD7mC,EAAQ+iC,KAAO8D,KAAiBA,GAEhCjlC,EAAOkhC,cAAe,SAAU9+B,GAC/B,IAAIjB,EAAUgkC,EAGd,GAAK/mC,EAAQ8mC,MAAQD,KAAiB7iC,EAAQwgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS/K,GACxB,IAAI94B,EACHylC,EAAMxiC,EAAQwiC,MAWf,GATAA,EAAIQ,KACHhjC,EAAQzD,KACRyD,EAAQ69B,IACR79B,EAAQi+B,MACRj+B,EAAQijC,SACRjjC,EAAQmR,UAIJnR,EAAQkjC,UACZ,IAAMnmC,KAAKiD,EAAQkjC,UAClBV,EAAKzlC,GAAMiD,EAAQkjC,UAAWnmC,GAmBhC,IAAMA,KAdDiD,EAAQmgC,UAAYqC,EAAItC,kBAC5BsC,EAAItC,iBAAkBlgC,EAAQmgC,UAQzBngC,EAAQwgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV4B,EAAIvC,iBAAkBljC,EAAG6jC,EAAS7jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAWgkC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAThnC,EACJimC,EAAInC,QACgB,UAAT9jC,EAKgB,iBAAfimC,EAAIpC,OACfvK,EAAU,EAAG,SAEbA,EAGC2M,EAAIpC,OACJoC,EAAIlC,YAINzK,EACC6M,GAAkBF,EAAIpC,SAAYoC,EAAIpC,OACtCoC,EAAIlC,WAK+B,UAAjCkC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAIrB,UACd,CAAEhkC,KAAMqlC,EAAIiB,cACbjB,EAAIxC,4BAQTwC,EAAIW,OAASpkC,IACbgkC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYvkC,EAAU,cAKnC2B,IAAhB8hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAI1mB,YAMRnhB,EAAO+f,WAAY,WACb3b,GACJgkC,OAQLhkC,EAAWA,EAAU,SAErB,IAGCyjC,EAAIzB,KAAM/gC,EAAQ0gC,YAAc1gC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKTg5B,MAAO,WACDthC,GACJA,QAWLnB,EAAOihC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAEjmB,SAAS3Y,QAAS,KAKtBW,EAAO+gC,UAAW,CACjBR,QAAS,CACRlhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETqhC,WAAY,CACX2D,cAAe,SAAU9kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAOihC,cAAe,SAAU,SAAUhD,QACxBn7B,IAAZm7B,EAAE/yB,QACN+yB,EAAE/yB,OAAQ,GAEN+yB,EAAE2E,cACN3E,EAAEt/B,KAAO,SAKXqB,EAAOkhC,cAAe,SAAU,SAAUjD,GAIxC,IAAI5+B,EAAQ8B,EADb,GAAK88B,EAAE2E,aAAe3E,EAAE8H,YAEvB,MAAO,CACN5C,KAAM,SAAUlpB,EAAGge,GAClB54B,EAASW,EAAQ,YACf+O,KAAMkvB,EAAE8H,aAAe,IACvBrmB,KAAM,CAAEsmB,QAAS/H,EAAEgI,cAAernC,IAAKq/B,EAAEgC,MACzC7a,GAAI,aAAcjkB,EAAW,SAAU+kC,GACvC7mC,EAAOub,SACPzZ,EAAW,KACN+kC,GACJjO,EAAuB,UAAbiO,EAAIvnC,KAAmB,IAAM,IAAKunC,EAAIvnC,QAKnD/B,EAAS8C,KAAKC,YAAaN,EAAQ,KAEpCojC,MAAO,WACDthC,GACJA,QAUL,IAqGKshB,GArGD0jB,GAAe,GAClBC,GAAS,oBAGVpmC,EAAO+gC,UAAW,CACjBsF,MAAO,WACPC,cAAe,WACd,IAAInlC,EAAWglC,GAAa7/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADApH,KAAMmE,IAAa,EACZA,KAKTnB,EAAOihC,cAAe,aAAc,SAAUhD,EAAGsI,EAAkBlH,GAElE,IAAImH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ1I,EAAEoI,QAAqBD,GAAO37B,KAAMwzB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAExe,MAE6C,KADnDwe,EAAEqC,aAAe,IACjBziC,QAAS,sCACXuoC,GAAO37B,KAAMwzB,EAAExe,OAAU,QAI5B,GAAKknB,GAAiC,UAArB1I,EAAEkB,UAAW,GA8D7B,OA3DAqH,EAAevI,EAAEqI,cAAgBjoC,EAAY4/B,EAAEqI,eAC9CrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWzjC,QAASkjC,GAAQ,KAAOI,IAC/B,IAAZvI,EAAEoI,QACbpI,EAAEgC,MAAS5C,GAAO5yB,KAAMwzB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMgG,GACL1mC,EAAOoD,MAAOojC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEkB,UAAW,GAAM,OAGnBsH,EAAc1pC,EAAQypC,GACtBzpC,EAAQypC,GAAiB,WACxBE,EAAoBplC,WAIrB+9B,EAAMjkB,OAAQ,gBAGQtY,IAAhB2jC,EACJzmC,EAAQjD,GAASu+B,WAAYkL,GAI7BzpC,EAAQypC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAavoC,KAAM4oC,IAIfE,GAAqBroC,EAAYooC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc3jC,IAI5B,WAYT1E,EAAQwoC,qBACHnkB,GAAO7lB,EAASiqC,eAAeD,mBAAoB,IAAKnkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS4mC,GAC3C,MAAqB,iBAATrnB,EACJ,IAEgB,kBAAZvf,IACX4mC,EAAc5mC,EACdA,GAAU,GAKLA,IAIA9B,EAAQwoC,qBAMZ/yB,GALA3T,EAAUtD,EAASiqC,eAAeD,mBAAoB,KAKvCtnC,cAAe,SACzBkT,KAAO5V,EAASuV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUtD,GAKZynB,GAAWyiB,GAAe,IAD1BC,EAASzvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAeynC,EAAQ,MAGzCA,EAAS3iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI+lC,EAAOv9B,cAlChC,IAAIqK,EAAMkzB,EAAQ1iB,GAyCnBrkB,EAAOG,GAAGsoB,KAAO,SAAUwX,EAAK+G,EAAQ7lC,GACvC,IAAIlB,EAAUtB,EAAM4kC,EACnB9rB,EAAOza,KACPyoB,EAAMwa,EAAIpiC,QAAS,KAsDpB,OApDY,EAAP4nB,IACJxlB,EAAWk7B,GAAkB8E,EAAI3iC,MAAOmoB,IACxCwa,EAAMA,EAAI3iC,MAAO,EAAGmoB,IAIhBpnB,EAAY2oC,IAGhB7lC,EAAW6lC,EACXA,OAASlkC,GAGEkkC,GAA4B,iBAAXA,IAC5BroC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOmhC,KAAM,CACZlB,IAAKA,EAKLthC,KAAMA,GAAQ,MACdugC,SAAU,OACVzf,KAAMunB,IACHnhC,KAAM,SAAUggC,GAGnBtC,EAAWjiC,UAEXmW,EAAK8U,KAAMtsB,EAIVD,EAAQ,SAAUitB,OAAQjtB,EAAO2X,UAAWkuB,IAAiBr4B,KAAMvN,GAGnE4lC,KAKEzqB,OAAQja,GAAY,SAAUk+B,EAAOmD,GACxC/qB,EAAKvW,KAAM,WACVC,EAASxD,MAAOX,KAAMumC,GAAY,CAAElE,EAAMwG,aAAcrD,EAAQnD,QAK5DriC,MAMRgD,EAAO6O,KAAKhI,QAAQogC,SAAW,SAAU5lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOy5B,OAAQ,SAAUt5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOknC,OAAS,CACfC,UAAW,SAAU9lC,EAAMe,EAASjD,GACnC,IAAIioC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD/X,EAAW1vB,EAAOyhB,IAAKpgB,EAAM,YAC7BqmC,EAAU1nC,EAAQqB,GAClBynB,EAAQ,GAGS,WAAb4G,IACJruB,EAAKkgB,MAAMmO,SAAW,YAGvB8X,EAAYE,EAAQR,SACpBI,EAAYtnC,EAAOyhB,IAAKpgB,EAAM,OAC9BomC,EAAaznC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbquB,GAAwC,UAAbA,KACA,GAA9C4X,EAAYG,GAAa5pC,QAAS,SAMpC0pC,GADAH,EAAcM,EAAQhY,YACD3iB,IACrBs6B,EAAUD,EAAYzS,OAGtB4S,EAASxX,WAAYuX,IAAe,EACpCD,EAAUtX,WAAY0X,IAAgB,GAGlCppC,EAAY+D,KAGhBA,EAAUA,EAAQ3E,KAAM4D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIqlC,KAGjC,MAAfplC,EAAQ2K,MACZ+b,EAAM/b,IAAQ3K,EAAQ2K,IAAMy6B,EAAUz6B,IAAQw6B,GAE1B,MAAhBnlC,EAAQuyB,OACZ7L,EAAM6L,KAASvyB,EAAQuyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWjlC,EACfA,EAAQulC,MAAMlqC,KAAM4D,EAAMynB,GAG1B4e,EAAQjmB,IAAKqH,KAKhB9oB,EAAOG,GAAGgC,OAAQ,CAGjB+kC,OAAQ,SAAU9kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNpF,KACAA,KAAKkE,KAAM,SAAU/B,GACpBa,EAAOknC,OAAOC,UAAWnqC,KAAMoF,EAASjD,KAI3C,IAAIyoC,EAAMC,EACTxmC,EAAOrE,KAAM,GAEd,OAAMqE,EAQAA,EAAKyxB,iBAAiBxyB,QAK5BsnC,EAAOvmC,EAAKozB,wBACZoT,EAAMxmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK66B,EAAK76B,IAAM86B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAEh7B,IAAK,EAAG4nB,KAAM,QATxB,GAuBDjF,SAAU,WACT,GAAM1yB,KAAM,GAAZ,CAIA,IAAIgrC,EAAcd,EAAQhoC,EACzBmC,EAAOrE,KAAM,GACbirC,EAAe,CAAEl7B,IAAK,EAAG4nB,KAAM,GAGhC,GAAwC,UAAnC30B,EAAOyhB,IAAKpgB,EAAM,YAGtB6lC,EAAS7lC,EAAKozB,4BAER,CACNyS,EAASlqC,KAAKkqC,SAIdhoC,EAAMmC,EAAK6I,cACX89B,EAAe3mC,EAAK2mC,cAAgB9oC,EAAIyN,gBACxC,MAAQq7B,IACLA,IAAiB9oC,EAAIujB,MAAQulB,IAAiB9oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKumB,EAAc,YAE1BA,EAAeA,EAAapoC,WAExBooC,GAAgBA,IAAiB3mC,GAAkC,IAA1B2mC,EAAazpC,YAG1D0pC,EAAejoC,EAAQgoC,GAAed,UACzBn6B,KAAO/M,EAAOyhB,IAAKumB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ30B,EAAOyhB,IAAKumB,EAAc,mBAAmB,IAKpE,MAAO,CACNj7B,IAAKm6B,EAAOn6B,IAAMk7B,EAAal7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEszB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO30B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E2mC,aAAc,WACb,OAAOhrC,KAAKoE,IAAK,WAChB,IAAI4mC,EAAehrC,KAAKgrC,aAExB,MAAQA,GAA2D,WAA3ChoC,EAAOyhB,IAAKumB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBr7B,QAM1B3M,EAAOkB,KAAM,CAAE20B,WAAY,cAAeD,UAAW,eAAiB,SAAUjc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQphB,KAAM,SAAUqE,EAAMsY,EAAQva,GAG5C,IAAIyoC,EAOJ,GANKppC,EAAU4C,GACdwmC,EAAMxmC,EACuB,IAAlBA,EAAK9C,WAChBspC,EAAMxmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOyoC,EAAMA,EAAKnoB,GAASre,EAAMsY,GAG7BkuB,EACJA,EAAIK,SACFn7B,EAAY86B,EAAIE,YAAV3oC,EACP2N,EAAM3N,EAAMyoC,EAAIC,aAIjBzmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOizB,SAAUvT,GAASkP,GAAcxwB,EAAQgyB,cAC/C,SAAU/uB,EAAMitB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQhtB,EAAMqe,GAGlBoO,GAAUrjB,KAAM6jB,GACtBtuB,EAAQqB,GAAOquB,WAAYhQ,GAAS,KACpC4O,MAQLtuB,EAAOkB,KAAM,CAAEinC,OAAQ,SAAUC,MAAO,SAAW,SAAU/lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CACZ2zB,QAAS,QAAUxyB,EACnB2W,QAASra,EACT0pC,GAAI,QAAUhmC,GACZ,SAAUimC,EAAcC,GAG1BvoC,EAAOG,GAAIooC,GAAa,SAAU3T,EAAQzwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAYgoC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVzwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQphB,KAAM,SAAUqE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCknC,EAAS1qC,QAAS,SACxBwD,EAAM,QAAUgB,GAChBhB,EAAKzE,SAAS+P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK9C,UACTW,EAAMmC,EAAKsL,gBAIJ3J,KAAKivB,IACX5wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM6zB,GAGxBxyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOquB,IAChC7zB,EAAM0f,EAAYuW,OAAS9xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOnD,KAAKooB,GAAIzmB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB61B,KAAM,SAAU3S,EAAO5F,EAAMtf,GAC5B,OAAOnD,KAAKooB,GAAIC,EAAO,KAAM5F,EAAMtf,IAEpCqoC,OAAQ,SAAUnjB,EAAOllB,GACxB,OAAOnD,KAAKyoB,IAAKJ,EAAO,KAAMllB,IAG/BsoC,SAAU,SAAUxoC,EAAUolB,EAAO5F,EAAMtf,GAC1C,OAAOnD,KAAKooB,GAAIC,EAAOplB,EAAUwf,EAAMtf,IAExCuoC,WAAY,SAAUzoC,EAAUolB,EAAOllB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBtD,KAAKyoB,IAAKxlB,EAAU,MACpBjD,KAAKyoB,IAAKJ,EAAOplB,GAAY,KAAME,IAGrCwoC,MAAO,SAAUC,EAAQC,GACxB,OAAO7rC,KAAKkuB,WAAY0d,GAASzd,WAAY0d,GAASD,MAIxD5oC,EAAOkB,KACN,wLAE4DqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBtD,KAAKooB,GAAI/iB,EAAM,KAAMod,EAAMtf,GAC3BnD,KAAKkpB,QAAS7jB,MAUlB,IAAI2E,GAAQ,qCAMZhH,EAAO8oC,MAAQ,SAAU3oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMs3B,EAUf,GARwB,iBAAZ5oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKAtP,EAAY8B,GAalB,OARAqR,EAAOlU,EAAMG,KAAM6D,UAAW,IAC9BwnC,EAAQ,WACP,OAAO3oC,EAAGxC,MAAOuC,GAAWlD,KAAMwU,EAAK9T,OAAQJ,EAAMG,KAAM6D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElC0kC,GAGR9oC,EAAO+oC,UAAY,SAAUC,GACvBA,EACJhpC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOipC,UAAYhpB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO3B,WAAaA,EACpB2B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOmpB,IAAMzjB,KAAKyjB,IAElBnpB,EAAOkpC,UAAY,SAAU5qC,GAK5B,IAAIK,EAAOqB,EAAOrB,KAAML,GACxB,OAAkB,WAATK,GAA8B,WAATA,KAK5BwqC,MAAO7qC,EAAMyxB,WAAYzxB,KAG5B0B,EAAOopC,KAAO,SAAU7pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXqiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOrpC,IAOT,IAGCupC,GAAUxsC,EAAOiD,OAGjBwpC,GAAKzsC,EAAO0sC,EAwBb,OAtBAzpC,EAAO0pC,WAAa,SAAUhnC,GAS7B,OARK3F,EAAO0sC,IAAMzpC,IACjBjD,EAAO0sC,EAAID,IAGP9mC,GAAQ3F,EAAOiD,SAAWA,IAC9BjD,EAAOiD,OAASupC,IAGVvpC,GAMiB,oBAAb/C,IACXF,EAAOiD,OAASjD,EAAO0sC,EAAIzpC,GAMrBA","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.cs.json
index 50978f60d7..a581642252 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.cs.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Webová aplikace ASP.NET Core (Model-View-Controller)",
+ "description": "Šablona projektu pro vytvoření aplikace ASP.NET Core s ukázkovými zobrazeními a kontrolery ASP.NET Core MVC. Tato šablona se dá použít i pro služby RESTful HTTP.",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualAuth nebo OrganizationalAuth).",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají Individual, IndividualB2C, SingleOrg ani MultiOrg.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.de.json
index 50978f60d7..35cd7961a4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.de.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core-Web-App (Model View Controller)",
+ "description": "Eine Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung mit Beispielen für ASP.NET Core-MVC-Ansichten und -Controller. Diese Vorlage kann auch für RESTful HTTP-Dienste verwendet werden.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualAuth oder OrganizationalAuth verwendet wird).",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn Individual, IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.es.json
index 50978f60d7..d8f4925c79 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.es.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicación web de ASP.NET Core (Modelo-Vista-Controlador)",
+ "description": "Una plantilla de proyecto para crear una aplicación ASP.NET Core con controladores y vistas de ASP.NET Core MVC de ejemplo. Esta plantilla también puede usarse para servicios RESTful HTTP.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualAuth o OrganizationalAuth).",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS. Esta opción solo se aplica si Individual, IndividualB2C, SingleOrg o MultiOrg no se usan para --auth.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.fr.json
index 50978f60d7..48fec90514 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.fr.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Application web ASP.NET Core (modèle-vue-contrôleur)",
+ "description": "Modèle de projet permettant de créer une application ASP.NET Core avec des exemples de vues et de contrôleurs ASP.NET Core MVC. Vous pouvez également utiliser ce modèle pour les services HTTP RESTful.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualAuth ou OrganizationalAuth est utilisé).",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si Individual, IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.it.json
index 50978f60d7..04312f0de2 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.it.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "App Web ASP.NET Core (Model-View-Controller)",
+ "description": "Modello di progetto per la creazione di un'applicazione ASP.NET Core con viste e controller ASP.NET Core MVC di esempio. È possibile usare questo modello anche per i servizi HTTP RESTful.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualAuth o OrganizationalAuth).",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se Individual, IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ja.json
index 50978f60d7..cec8472472 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ja.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web アプリ (Model-View-Controller)",
+ "description": "ASP.NET Core MVC のサンプル ビューとコントローラーで ASP.NET Core アプリケーションを作成するためのプロジェクト テンプレートです。このテンプレートは RESTful HTTP サービスでも使用できます。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualAuth または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、Individual、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ko.json
index 50978f60d7..4692fb8f70 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ko.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 웹앱(Model-View-Controller)",
+ "description": "예제 ASP.NET Core MVC 뷰 및 컨트롤러를 사용하여 ASP.NET Core 애플리케이션을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿은 RESTful HTTP 서비스에도 사용할 수 있습니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualAuth 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 Individual, IndividualB2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pl.json
index 50978f60d7..19db7dac94 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pl.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplikacja internetowa ASP.NET Core (Model-View-Controller)",
+ "description": "Szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core z przykładowymi widokami i kontrolerami platformy ASP.NET Core MVC. Tego szablonu można także użyć dla usług HTTP RESTful.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy parametr no-https nie jest używany (parametr no-https zostanie zignorowany, jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualAuth lub OrganizationalAuth, parametr no-https zostanie zignorowana).",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy dla uwierzytelniania --auth nie są używane elementy Individual, IndividualB2C, SingleOrg lub MultiOrg.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json
index 50978f60d7..a0fad98496 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Aplicativo Web do ASP.NET Core (Model-View-Controller)",
+ "description": "Um modelo de projeto para criar um aplicativo ASP.NET Core com Controladores e Exibições do ASP.NET Core MVC de exemplo. Esse modelo também pode ser usado para serviços HTTP RESTful.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualAuth ou OrganizationalAuth for usado).",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção se aplica somente se Individual, IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ru.json
index 50978f60d7..8d3fc51827 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.ru.json
@@ -1,16 +1,16 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Веб-приложение ASP.NET Core (модель-представление-контроллер)",
+ "description": "Шаблон проекта для создания приложения ASP.NET Core с образцом представлений MVC и контроллеров ASP.NET Core. Этот шаблон можно также использовать для служб HTTP RESTful.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualAuth или OrganizationalAuth no-https игнорируется).",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются Individual, IndividualB2C, SingleOrg или MultiOrg.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.tr.json
index 50978f60d7..6fca7b1466 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.tr.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web Uygulaması (Model-Görünüm-Denetleyici)",
+ "description": "Örnek ASP.NET Core MVC Görünümleri ve Denetleyicileri içeren bir ASP.NET Core uygulaması oluşturmaya yönelik proje şablonu. Bu şablon aynı zamanda RESTful HTTP hizmetleri için de kullanılabilir.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualAuth veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca Bireysel, IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json
index 50978f60d7..968c06971d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web 应用(模型-视图-控制器)",
+ "description": "用于创建包含示例 ASP.NET Core MVC 视图和控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 RESTful HTTP 服务。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualAuth 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 Individual、IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json
index 50978f60d7..84a18792ad 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web App (Model-View-Controller)",
- "description": "A project template for creating an ASP.NET Core application with example ASP.NET Core MVC Views and Controllers. This template can also be used for RESTful HTTP services.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web 應用程式 (Model-View-Controller)",
+ "description": "用於建立 ASP.NET Core 應用程式的專案範本,附有 ASP.NET Core MVC 的檢視及控制器範例。此範本也可用於 RESTful HTTP 服務。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualAuth 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 Individual、IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/template.json
index 9a55aab042..4ced401569 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/.template.config/template.json
@@ -152,6 +152,10 @@
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
},
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(!NoHttps)"
+ },
"NoHttps": {
"type": "parameter",
"datatype": "bool",
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs
index 07d261f447..6b16bfdf2f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Program.fs
@@ -36,7 +36,7 @@ module Program =
if not (builder.Environment.IsDevelopment()) then
app.UseExceptionHandler("/Home/Error")
-#if !NoHttps
+#if HasHttpsProfile
app.UseHsts() |> ignore // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHttpsRedirection()
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Properties/launchSettings.json
index e341bf4f8f..4ec0a09b44 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/Properties/launchSettings.json
@@ -9,27 +9,34 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(NoHttps)
- "sslPort": 0
- //#else
+ //#if (HasHttpsProfile)
"sslPort": 44300
+ //#else
+ "sslPort": 0
//#endif
}
},
"profiles": {
- "Company.WebApplication1": {
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(NoHttps)
"applicationUrl": "http://localhost:5000",
- //#else
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
"applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
index 0bdc1962b6..984713a496 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/LICENSE.txt
@@ -1,12 +1,23 @@
-Copyright (c) .NET Foundation. All rights reserved.
+The MIT License (MIT)
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-these files except in compliance with the License. You may obtain a copy of the
-License at
+Copyright (c) .NET Foundation and Contributors
-http://www.apache.org/licenses/LICENSE-2.0
+All rights reserved.
-Unless required by applicable law or agreed to in writing, software distributed
-under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
-CONDITIONS OF ANY KIND, either express or implied. See the License for the
-specific language governing permissions and limitations under the License.
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 73f5298394..009306070a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,7 +1,10 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index 553d427471..d8d803c65e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-// Unobtrusive validation support library for jQuery and jQuery Validate
-// Copyright (c) .NET Foundation. All rights reserved.
-// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
-// @version v3.2.11
-!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,.\/:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function u(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=f.unobtrusive.options||{},u=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),u("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),u("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),u("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var m,f=a.validator,v="unobtrusiveValidation";return f.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=u(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){f.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=u(this);a&&a.attachValidation()})}},m=f.unobtrusive.adapters,m.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},m.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},m.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},m.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},f.addMethod("__dummy__",function(a,e,n){return!0}),f.addMethod("regex",function(a,e,n){var t;return!!this.optional(e)||(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),f.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),f.methods.extension?(m.addSingleVal("accept","mimtype"),m.addSingleVal("extension","extension")):m.addSingleVal("extension","extension","accept"),m.addSingleVal("regex","pattern"),m.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),m.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),m.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),m.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),m.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||e(a,"required",!0)}),m.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),m.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),m.add("fileextensions",["extensions"],function(a){e(a,"extension",a.params.extensions)}),a(function(){f.unobtrusive.parse(document)}),f.unobtrusive});
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/LICENSE.txt b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/LICENSE.txt
index e4e5e00ef0..599bdf2c72 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright JS Foundation and other contributors, https://js.foundation/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.js b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.map b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/StarterWeb-FSharp/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/cs-CZ/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/cs/strings.json
index 746e19f9fc..95d2cae505 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/cs-CZ/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/cs/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "Webové rozhraní API pro ASP.NET Core",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Povolit podporu _OpenAPI",
"parameter.DisableOpenAPI.description": "Povolení podpory OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Používání kontrolérů (pokud chcete používat minimální rozhraní API, zrušte zaškrtnutí)",
- "parameter.UseMinimalAPIs.description": "Určuje, jestli se místo kontrolérů mají používat minimální rozhraní API."
+ "parameter.UseMinimalAPIs.description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/de-DE/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/de/strings.json
index 27d30199bc..4139d71506 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/de-DE/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/de/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "ASP.NET Core-Web-API",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "_OpenAPI-Unterstützung aktivieren",
"parameter.DisableOpenAPI.description": "Aktiviert OpenAPI-Unterstützung (Swagger)",
"parameter.UseMinimalAPIs.name": "Controller verwenden (deaktivieren, um minimale APIs zu verwenden)",
- "parameter.UseMinimalAPIs.description": "Gibt an, ob minimale APIs anstelle von Controllern verwendet werden sollen."
+ "parameter.UseMinimalAPIs.description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/en/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/en/strings.json
index a81d06e5c8..cf78f94276 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/en/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/en/strings.json
@@ -1,7 +1,12 @@
{
"version": "1.0.0.0",
+ "_version.comment": "{Locked}",
"strings": {
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers."
+ "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
+ "parameter.DisableOpenAPI.name": "Enable _OpenAPI support",
+ "parameter.DisableOpenAPI.description": "Enables OpenAPI (Swagger) support",
+ "parameter.UseMinimalAPIs.name": "Use controllers (uncheck to use minimal APIs)",
+ "parameter.UseMinimalAPIs.description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/es-ES/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/es/strings.json
index 7967b75e05..43cbf54e50 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/es-ES/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/es/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "ASP.NET Core Web API",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Habilitar compatibilidad con _OpenAPI",
"parameter.DisableOpenAPI.description": "Habilitar la compatibilidad con OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Usar controladores (desactivar para usar API mínimas)",
- "parameter.UseMinimalAPIs.description": "Indica si se deben usar API minimas en lugar de controladores."
+ "parameter.UseMinimalAPIs.description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/fr-FR/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/fr/strings.json
index fdb68ea369..d5886618c2 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/fr-FR/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/fr/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "API web ASP.NET Core",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Activer la prise en charge d'_OpenAPI",
"parameter.DisableOpenAPI.description": "Active la prise en charge d'OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Utiliser des contrôleurs (décocher pour utiliser un minimum d'API)",
- "parameter.UseMinimalAPIs.description": "S'il faut utiliser des API minimales au lieu de contrôleurs."
+ "parameter.UseMinimalAPIs.description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ide.host.json
index 6b45461ce4..db87a76505 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ide.host.json
@@ -1,39 +1,8 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 200,
"icon": "ide/WebAPI.png",
"supportsDocker": true,
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- },
- {
- "auth": "Individual",
- "authenticationType": "IndividualAuth",
- "b2cAuthenticationOptions": "CloudExisting"
- },
- {
- "auth": "SingleOrg",
- "authenticationType": "OrgAuth",
- "orgAuthenticationOptions": "SSO"
- },
- {
- "auth": "Windows",
- "authenticationType": "WindowsAuth"
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"symbolInfo": [
{
"id": "DisableOpenAPI",
@@ -47,7 +16,8 @@
},
"invertBoolean": true,
"isVisible": true,
- "defaultValue": true
+ "defaultValue": "true",
+ "persistenceScope": "templateGroup"
},
{
"id": "UseMinimalAPIs",
@@ -57,11 +27,14 @@
},
"invertBoolean": true,
"isVisible": true,
- "defaultValue": true
+ "defaultValue": "true",
+ "persistenceScope": "templateGroup"
},
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
],
"disableHttpsSymbol": "NoHttps"
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/it-IT/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/it/strings.json
index 9945ffaec5..849cf1791f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/it-IT/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/it/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "API Web ASP.NET Core",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Abilita supporto _OpenAPI",
"parameter.DisableOpenAPI.description": "Abilita supporto OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Usa i controller (deseleziona per usare il numero minimo di API)",
- "parameter.UseMinimalAPIs.description": "Indica se usare le API minimal invece dei controller."
+ "parameter.UseMinimalAPIs.description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ja-JP/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ja/strings.json
index f399c2bffe..b2fa2e055b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ja-JP/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ja/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "ASP.NET Core Web API",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "OpenAPI サポートを有効にする(_O)",
"parameter.DisableOpenAPI.description": "OpenAPI (Swagger) サポートを有効にする",
"parameter.UseMinimalAPIs.name": "コントローラーを使用する (最小限の API を使用する場合はオフにします)",
- "parameter.UseMinimalAPIs.description": "コントローラーの代わりに最小限の API を使用するかどうか。"
+ "parameter.UseMinimalAPIs.description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。"
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ko-KR/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ko/strings.json
index 3c9bfeaf58..4da41cdddc 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ko-KR/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ko/strings.json
@@ -1,11 +1,11 @@
-{
+{
"version": "1.0.0.0",
"strings": {
- "name": "ASP.NET Core Web API",
+ "name": "ASP.NET Core 웹 API",
"description": "RESTful HTTP 서비스용 예제 컨트롤러를 사용하여 ASP.NET Core 애플리케이션을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿은 ASP.NET Core MVC 뷰 및 컨트롤러에도 사용할 수 있습니다.",
"parameter.DisableOpenAPI.name": "OpenAPI 지원 사용(_O)",
"parameter.DisableOpenAPI.description": "OpenAPI(Swagger) 지원 사용",
"parameter.UseMinimalAPIs.name": "컨트롤러 사용(최소 API 사용 선택 취소)",
- "parameter.UseMinimalAPIs.description": "컨트롤러 대신 최소 API를 사용할지 여부"
+ "parameter.UseMinimalAPIs.description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.cs.json
index f82adc667d..991e774d6c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Webové rozhraní API pro ASP.NET Core",
+ "description": "Šablona projektu pro vytvoření aplikace ASP.NET Core s ukázkovým kontrolerem pro službu RESTful HTTP. Tato šablona se dá použít i pro zobrazení a kontrolery ASP.NET Core MVC.",
+ "symbols/auth/choices/None/description": "Bez ověřování",
+ "symbols/auth/choices/IndividualB2C/description": "Ověřování Individual pomocí Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Ověřování organizace pro jednoho tenanta",
+ "symbols/auth/choices/Windows/description": "Integrované ověřování Windows",
+ "symbols/auth/description": "Typ ověřování, který se má použít",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C, ke které se chcete připojit (používá se s ověřováním IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID zásad přihlašování a registrace pro tento projekt (používá se s ověřováním IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory, ke které se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/ClientId/description": "ID klienta pro tento projekt (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/Domain/description": "Doména pro tenanta adresáře (používá se s ověřováním SingleOrg nebo IndividualB2C).",
+ "symbols/DefaultScope/description": "Rozsah rozhraní API, který musí klient požádat o zřízení přístupového tokenu. (použijte s IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "TenantId adresáře, ke kterému se chcete připojit (používá se s ověřováním SingleOrg).",
+ "symbols/OrgReadAccess/description": "Určuje, jestli se této aplikaci povolí přístup ke čtení adresáře (platí jenom pro ověřování SingleOrg).",
+ "symbols/UserSecretsId/description": "ID, které se má použít pro tajné kódy (používá se s ověřováním OrgReadAccess nebo Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má ve vygenerované šabloně vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json. Tato možnost se dá použít jenom v případě, že se nepoužije parametr no-https (no-https se bude ignorovat, pokud se použije IndividualB2C nebo OrganizationalAuth).",
+ "symbols/NoHttps/description": "Určuje, jestli se má protokol HTTPS vypnout. Tato možnost platí jenom v případě, že se pro --auth nepoužívají IndividualB2C, SingleOrg ani MultiOrg.",
+ "symbols/UseLocalDB/description": "Určuje, jestli se má použít LocalDB namísto SQLite. Tato možnost platí jenom v případě, že je zadáno --auth Individual nebo --auth IndividualB2C.",
+ "symbols/UseMinimalAPIs/description": "Určuje, jestli se místo kontrolérů mají používat minimální rozhraní API.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/CalledApiUrl/description": "Adresa URL rozhraní API, která se má volat z webové aplikace. Tato možnost platí jenom v případě, že je zadáno --auth SingleOrg nebo --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Určuje, jestli webová aplikace volá Microsoft Graph. Tato možnost platí pouze v případě, že je zadáno --auth SingleOrg.",
+ "symbols/CalledApiScopes/description": "Obory, které se mají požádat o volání rozhraní API z webové aplikace Tato možnost platí jenom v případě, že je zadaná možnost --auth SingleOrg nebo --auth IndividualB2C.",
+ "symbols/DisableOpenAPI/description": "Zakázání podpory OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.de.json
index f82adc667d..3b15881e11 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core-Web-API",
+ "description": "Eine Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung mit einem Beispielcontroller für einen RESTful HTTP-Dienst. Diese Vorlage kann auch für ASP.NET Core-MVC-Ansichten und -Controller verwendet werden.",
+ "symbols/auth/choices/None/description": "Keine Authentifizierung",
+ "symbols/auth/choices/IndividualB2C/description": "Individuelle Authentifizierung mit Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Organisationsauthentifizierung für einen einzelnen Mandanten",
+ "symbols/auth/choices/Windows/description": "Windows-Authentifizierung",
+ "symbols/auth/description": "Der zu verwendende Authentifizierungstyp",
+ "symbols/AAdB2CInstance/description": "Die Azure Active Directory B2C-Instanz, mit der eine Verbindung hergestellt werden soll (mit IndividualB2C-Authentifizierung verwenden).",
+ "symbols/SignUpSignInPolicyId/description": "Die Anmelde und Registrierungsrichtlinien ID für dieses Projekt (mit IndividualB2C Authentifizierung verwenden).",
+ "symbols/AADInstance/description": "Die Azure Active Directory-Instanz, mit der eine Verbindung hergestellt werden soll (mit SingleOrg-Authentifizierung verwenden).",
+ "symbols/ClientId/description": "Die Client ID für dieses Projekt (mit SingleOrg- oder IndividualB2C-Authentifizierung verwenden).",
+ "symbols/Domain/description": "Die Domäne für den Verzeichnismandanten (mit SingleOrg oder IndividualB2C Authentifizierung verwenden).",
+ "symbols/DefaultScope/description": "Der API Bereich, den der Client anfordern muss, um ein Zugriffstoken bereitzustellen. (Verwendung mit IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "Die TenantId ID des Verzeichnisses, mit dem eine Verbindung hergestellt werden soll (mit SingleOrg Authentifizierung verwenden).",
+ "symbols/OrgReadAccess/description": "Ob dieser Anwendung Lesezugriff auf das Verzeichnis gewährt werden soll oder nicht (gilt nur für SingleOrg-Authentifizierung).",
+ "symbols/UserSecretsId/description": "Die für Geheimnisse zu verwendende ID (Verwendung mit OrgReadAccess oder Einzelauthentifizierung).",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json in der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS-Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express HTTPS Endpunkt in launchSettings.json verwendet werden soll. Diese Option ist nur anwendbar, wenn der Parameter no-https nicht verwendet wird (no-https wird ignoriert, wenn entweder IndividualB2C oder OrganizationalAuth verwendet wird).",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll. Diese Option gilt nur, wenn IndividualB2C, SingleOrg oder MultiOrg nicht für --auth verwendet werden.",
+ "symbols/UseLocalDB/description": "Ob LocalDB anstelle von SQLite verwendet werden soll. Diese Option gilt nur, wenn --auth Individual oder --auth IndividualB2C angegeben ist.",
+ "symbols/UseMinimalAPIs/description": "Ob minimale APIs anstelle von Controllern verwendet werden sollen.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/CalledApiUrl/description": "URL der API, die von der Web-App aufgerufen werden soll. Diese Option gilt nur, wenn --auth SingleOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/CallsMicrosoftGraph/description": "Gibt an, ob die Web App Microsoft Graph aufruft. Diese Option gilt nur, wenn --auth SingleOrg angegeben ist.",
+ "symbols/CalledApiScopes/description": "Anzufordernde Bereiche zum Aufrufen der API von der Web-App. Diese Option gilt nur, wenn --auth SingleOrg oder --auth IndividualB2C angegeben ist.",
+ "symbols/DisableOpenAPI/description": "Deaktivieren Sie die OpenAPI (Swagger) Unterstützung",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.en.json
index 34a1dd0167..85a25d4733 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.en.json
@@ -18,10 +18,10 @@
"symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
"symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
"symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
"symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used).",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
"symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
"symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
"symbols/Framework/description": "The target framework for the project.",
@@ -31,8 +31,9 @@
"symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
"symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
"symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.es.json
index f82adc667d..bc589afbe5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "Una plantilla de proyecto para crear una aplicación ASP.NET Core con un controlador de ejemplo para un servicio RESTful HTTP. Esta plantilla también puede usarse para controladores y vistas de ASP.NET Core MVC.",
+ "symbols/auth/choices/None/description": "Sin autenticación",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticación individual con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticación organizacional para un único inquilino",
+ "symbols/auth/choices/Windows/description": "Autenticación de Windows",
+ "symbols/auth/description": "El tipo de autenticación que se va a usar",
+ "symbols/AAdB2CInstance/description": "Instancia de Azure Active Directory B2C a la que conectarse (se usa con la autenticación IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Id. de la directiva de inicio de sesión y registro para este proyecto (se usa con la autenticación IndividualB2C).",
+ "symbols/AADInstance/description": "Instancia de Azure Active Directory a la que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/ClientId/description": "Id. de cliente de este proyecto (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/Domain/description": "Dominio del inquilino de directorio (se usa con la autenticación SingleOrg o IndividualB2C).",
+ "symbols/DefaultScope/description": "Ámbito de API que el cliente debe solicitar para aprovisionar un token de acceso. (Se usa con IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "Id. de TenantId del directorio al que se va a conectar (se usa con la autenticación SingleOrg).",
+ "symbols/OrgReadAccess/description": "Indica si se va a permitir o no el acceso de lectura de esta aplicación al directorio (solo se aplica a la autenticación SingleOrg).",
+ "symbols/UserSecretsId/description": "Id. que se va a usar para los secretos (se usa con OrgReadAccess o con la autenticación individual).",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json en la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json. Esta opción solo es aplicable cuando no se usa el parámetro no-https (no-https se omitirá si se usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Ya sea para desactivar HTTPS. Esta opción solo se aplica si no se utilizan IndividualB2C, SingleOrg o MultiOrg para --auth.",
+ "symbols/UseLocalDB/description": "Indica si se va a usar LocalDB en lugar de SQLite. Esta opción solo se aplica si se especifica --auth Individual o --auth IndividualB2C.",
+ "symbols/UseMinimalAPIs/description": "Indica si se deben usar API mínimas en lugar de controladores.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/CalledApiUrl/description": "Dirección URL de la API a la que se va a llamar desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica si la aplicación web llama a Microsoft Graph. Esta opción solo se aplica si se especifica --auth SingleOrg.",
+ "symbols/CalledApiScopes/description": "Ámbitos para solicitar llamar a la API desde la aplicación web. Esta opción solo se aplica si se especifica --auth SingleOrg o --auth IndividualB2C.",
+ "symbols/DisableOpenAPI/description": "Deshabilitar la compatibilidad con OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.fr.json
index f82adc667d..a07f889236 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "API web ASP.NET Core",
+ "description": "Modèle de projet permettant de créer une application ASP.NET Core avec un exemple de contrôleur pour un service HTTP RESTful. Vous pouvez également utiliser ce modèle pour les vues et contrôleurs ASP.NET Core MVC.",
+ "symbols/auth/choices/None/description": "Aucune authentification",
+ "symbols/auth/choices/IndividualB2C/description": "Authentification individuelle avec Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Authentification organisationnelle pour un seul locataire",
+ "symbols/auth/choices/Windows/description": "Authentification Windows",
+ "symbols/auth/description": "Type d’authentification à utiliser",
+ "symbols/AAdB2CInstance/description": "Instance Azure Active Directory B2C à laquelle se connecter (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID de stratégie de connexion et d’inscription pour ce projet (à utiliser avec l’authentification IndividualB2C).",
+ "symbols/AADInstance/description": "Instance Azure Active Directory à laquelle se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/ClientId/description": "ID client de ce projet (utilisé avec SingleOrg ou l’authentification IndividualB2C).",
+ "symbols/Domain/description": "Domaine du locataire d’annuaire (utilisé avec l’authentification SingleOrg ou IndividualB2C).",
+ "symbols/DefaultScope/description": "Étendue d’API dont le client a besoin pour configurer un jeton d’accès. (à utiliser avec IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "ID TenantId du répertoire auquel se connecter (à utiliser avec l’authentification SingleOrg).",
+ "symbols/OrgReadAccess/description": "Indique si cette application doit ou non autoriser l’accès en lecture au répertoire (s’applique uniquement à l’authentification SingleOrg).",
+ "symbols/UserSecretsId/description": "ID à utiliser pour les secrets (à utiliser avec OrgReadAccess ou l’authentification individuelle).",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json dans le modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https est ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json. Cette option s’applique uniquement lorsque le paramètre no-https n’est pas utilisé (no-https sera ignoré si IndividualB2C ou OrganizationalAuth est utilisé).",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS. Cette option s’applique uniquement si IndividualB2C, SingleOrg ou MultiOrg ne sont pas utilisés pour --auth.",
+ "symbols/UseLocalDB/description": "Indique s’il faut utiliser localDB au lieu de SQLite. Cette option s’applique uniquement si --auth Individual ou --auth IndividualB2C est spécifié.",
+ "symbols/UseMinimalAPIs/description": "Indique s’il faut utiliser des API minimales au lieu de contrôleurs.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/CalledApiUrl/description": "URL de l’API à appeler à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/CallsMicrosoftGraph/description": "Spécifie si l’application web appelle Microsoft Graph. Cette option s’applique uniquement si --auth SingleOrg est spécifié.",
+ "symbols/CalledApiScopes/description": "Étendues pour demander à appeler l’API à partir de l’application web. Cette option s’applique uniquement si --auth SingleOrg ou --auth IndividualB2C est spécifié.",
+ "symbols/DisableOpenAPI/description": "Désactiver la prise en charge d’OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.it.json
index f82adc667d..e9176ec18a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "API Web ASP.NET Core",
+ "description": "Modello di progetto per la creazione di un'applicazione ASP.NET Core con un controller di esempio per un servizio HTTP RESTful. È possibile usare questo modello anche per i controller e le viste di ASP.NET Core MVC.",
+ "symbols/auth/choices/None/description": "Nessuna autenticazione",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticazione singola con Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticazione organizzativa per un singolo tenant",
+ "symbols/auth/choices/Windows/description": "Autenticazione di Windows",
+ "symbols/auth/description": "Tipo di autenticazione da usare.",
+ "symbols/AAdB2CInstance/description": "Istanza di Azure Active Directory B2C a cui connettersi (usare con l'autenticazione IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "ID dei criteri di accesso e iscrizione per questo progetto (usare con l'autenticazione IndividualB2C).",
+ "symbols/AADInstance/description": "Istanza di Azure Active Directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/ClientId/description": "ID client per questo progetto (usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/Domain/description": "Il dominio per il tenant della directory (da usare con l'autenticazione SingleOrg o IndividualB2C).",
+ "symbols/DefaultScope/description": "Ambito API che il client deve richiedere per effettuare il provisioning di un token di accesso (usare con IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "ID TenantId della directory a cui connettersi (usare con l'autenticazione SingleOrg).",
+ "symbols/OrgReadAccess/description": "Indica se consentire o meno a questa applicazione l'accesso in lettura alla directory (si applica solo all’autenticazione SingleOrg).",
+ "symbols/UserSecretsId/description": "ID da usare per i segreti (usare con OrgReadAccess o l'autenticazione singola).",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si utilizza IndividualB2C o OrganizationalAuth).",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json. Questa opzione è applicabile solo quando il parametro no-https non viene usato (no-https verrà ignorato se si usa IndividualB2C o OrganizationalAuth).",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS. Questa opzione si applica solo se IndividualB2C, SingleOrg o MultiOrg non vengono usati per --auth.",
+ "symbols/UseLocalDB/description": "Indica se usare LocalDB invece di SQLite. Questa opzione si applica solo se è specificato --auth Individual o --auth IndividualB2C.",
+ "symbols/UseMinimalAPIs/description": "Indica se usare API minime anziché controller.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/CalledApiUrl/description": "URL dell'API da chiamare dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg o --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Specifica se l'app Web chiama Microsoft Graph. Questa opzione si applica solo se è specificato --auth SingleOrg.",
+ "symbols/CalledApiScopes/description": "Ambiti per richiedere di chiamare l'API dall'app Web. Questa opzione si applica solo se è specificato --auth SingleOrg o --auth IndividualB2C.",
+ "symbols/DisableOpenAPI/description": "Disabilita il supporto di OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ja.json
index f82adc667d..b5baea47d3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "RESTful HTTP サービスのサンプル コントローラーで ASP.NET Core アプリケーションを作成するためのプロジェクト テンプレートです。このテンプレートは ASP.NET Core MVC のビューとコントローラーでも使用できます。",
+ "symbols/auth/choices/None/description": "認証なし",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C を使用した個別の認証",
+ "symbols/auth/choices/SingleOrg/description": "単一テナントの組織認証",
+ "symbols/auth/choices/Windows/description": "Windows 認証",
+ "symbols/auth/description": "使用する認証の種類",
+ "symbols/AAdB2CInstance/description": "接続先の Azure Active Directory B2C インスタンス (IndividualB2C 認証で使用)。",
+ "symbols/SignUpSignInPolicyId/description": "このプロジェクトのサインインおよびサインアップのポリシー ID (IndividualB2C 認証で使用)。",
+ "symbols/AADInstance/description": "接続先の Azure Active Directory インスタンス (SingleOrg 認証で使用)。",
+ "symbols/ClientId/description": "このプロジェクトのクライアント ID (IndividualB2C または IndividualB2C 認証で使用)。",
+ "symbols/Domain/description": "ディレクトリ テナントのドメイン (SingleOrg または IndividualB2C 認証で使用)。",
+ "symbols/DefaultScope/description": "アクセス トークンのプロビジョニングするためにクライアントが要求する必要がある API スコープ。(IndividualB2C、SingleOrg で使用)。",
+ "symbols/TenantId/description": "接続先のディレクトリの TenantId ID (SingleOrg 認証で使用)。",
+ "symbols/OrgReadAccess/description": "このアプリケーションにディレクトリへの読み取りアクセスを許可するかどうか (SingleOrg 認証にのみ適用されます)。",
+ "symbols/UserSecretsId/description": "シークレットで使用する ID (OrgReadAccess または個別の認証で使用)。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートで launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json で HTTPS エンドポイントに使用するポート番号。このオプションは、HTTPS 以外のパラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、HTTPS 以外は無視されます)。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json で IIS Express HTTPS エンドポイントに使用するポート番号。このオプションは、no-https パラメーターが使用されていない場合にのみ適用されます (IndividualB2C または OrganizationalAuth が使用されている場合は、no-https は無視されます)。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。このオプションは、IndividualB2C、SingleOrg、または MultiOrg が --auth に使用されていない場合にのみ適用されます。",
+ "symbols/UseLocalDB/description": "SQLite の代わりに LocalDB を使用するかどうか。このオプションは、--auth Individual または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/UseMinimalAPIs/description": "コントローラーの代わりに最小限の API を使用するかどうか。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/CalledApiUrl/description": "Web アプリから呼び出す API の URL。このオプションは、--auth SingleOrg または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/CallsMicrosoftGraph/description": "Web アプリが Microsoft Graph を呼び出すかどうかを指定します。このオプションは、--auth SingleOrg が指定されている場合にのみ適用されます。",
+ "symbols/CalledApiScopes/description": "Web アプリから API を呼び出す要求へのスコープ。このオプションは、--auth SingleOrg または --auth IndividualB2C が指定されている場合にのみ適用されます。",
+ "symbols/DisableOpenAPI/description": "OpenAPI (Swagger) サポートを無効にする",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ko.json
index f82adc667d..fa990b626b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 웹 API",
+ "description": "RESTful HTTP 서비스용 예제 컨트롤러를 사용하여 ASP.NET Core 애플리케이션을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿은 ASP.NET Core MVC 뷰 및 컨트롤러에도 사용할 수 있습니다.",
+ "symbols/auth/choices/None/description": "인증 없음",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C를 사용한 개별 인증",
+ "symbols/auth/choices/SingleOrg/description": "단일 테넌트에 대한 조직 인증",
+ "symbols/auth/choices/Windows/description": "Windows 인증",
+ "symbols/auth/description": "사용할 인증 유형",
+ "symbols/AAdB2CInstance/description": "연결할 Azure Active Directory B2C 인스턴스(IndividualB2C 인증과 함께 사용).",
+ "symbols/SignUpSignInPolicyId/description": "이 프로젝트의 로그인 및 등록 정책 ID입니다(IndividualB2C 인증과 함께 사용).",
+ "symbols/AADInstance/description": "연결할 Azure Active Directory 인스턴스입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/ClientId/description": "이 프로젝트의 클라이언트 ID입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/Domain/description": "디렉터리 테넌트의 도메인입니다(SingleOrg 또는 IndividualB2C 인증과 함께 사용).",
+ "symbols/DefaultScope/description": "클라이언트가 액세스 토큰을 프로비전하기 위해 요청해야 하는 API 범위입니다. (IndividualB2C, SingleOrg와 함께 사용).",
+ "symbols/TenantId/description": "연결할 디렉터리의 TenantId ID입니다(SingleOrg 인증과 함께 사용).",
+ "symbols/OrgReadAccess/description": "이 애플리케이션이 디렉터리에 대한 읽기 액세스를 허용할지 여부(SingleOrg 인증에만 적용됨).",
+ "symbols/UserSecretsId/description": "비밀에 사용할 ID입니다(OrgReadAccess 또는 개별 인증과 함께 사용).",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express 엔드포인트에 사용할 포트 번호입니다. 이 옵션은 매개 변수 no-https가 사용되지 않은 경우에만 적용됩니다(IndividualB2C 또는 OrganizationalAuth가 사용되는 경우 no-https는 무시됨).",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다. 이 옵션은 개별B2C, SingleOrg 또는 MultiOrg가 --auth에 사용되지 않는 경우에만 적용됩니다.",
+ "symbols/UseLocalDB/description": "SQLite 대신 LocalDB를 사용할지 여부입니다. 이 옵션은 --auth Individual 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/UseMinimalAPIs/description": "컨트롤러 대신 최소 API를 사용할지 여부입니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/CalledApiUrl/description": "웹앱에서 호출할 API의 URL입니다. 이 옵션은 --auth SingleOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/CallsMicrosoftGraph/description": "웹앱이 Microsoft Graph를 호출하는지 여부를 지정합니다. 이 옵션은 --auth SingleOrg가 지정된 경우에만 적용됩니다.",
+ "symbols/CalledApiScopes/description": "웹앱에서 API 호출을 요청할 범위입니다. 이 옵션은 --auth SingleOrg 또는 --auth IndividualB2C가 지정된 경우에만 적용됩니다.",
+ "symbols/DisableOpenAPI/description": "OpenAPI(Swagger) 지원 비활성화",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pl.json
index f82adc667d..17247518fb 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Internetowy interfejs API platformy ASP.NET Core",
+ "description": "Szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core z przykładowym kontrolerem obsługującym usługę HTTP RESTful. Tego szablonu można także użyć dla widoków i kontrolerów platformy ASP.NET Core MVC.",
+ "symbols/auth/choices/None/description": "Bez uwierzytelniania",
+ "symbols/auth/choices/IndividualB2C/description": "Indywidualne uwierzytelnianie za pomocą usługi Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Uwierzytelnianie organizacyjne dla pojedynczej dzierżawy",
+ "symbols/auth/choices/Windows/description": "Uwierzytelnianie systemu Windows",
+ "symbols/auth/description": "Typ uwierzytelniania, który ma zostać użyty.",
+ "symbols/AAdB2CInstance/description": "Wystąpienie usługi Azure Active Directory B2C do nawiązania połączenia (użyj z uwierzytelnianym IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Identyfikator zasad logowania i rejestracji dla tego projektu (użyj uwierzytelniania IndividualB2C).",
+ "symbols/AADInstance/description": "Wystąpienie usługi Azure Active Directory do nawiązania połączenia (użyj z uwierzytelnianym SingleOrg ).",
+ "symbols/ClientId/description": "Identyfikator klienta dla tego projektu (użyj z uwierzytelnianym SingleOrg lub IndividualB2C).",
+ "symbols/Domain/description": "Domena dzierżawy katalogu (użyj uwierzytelniania SingleOrg lub IndividualB2C).",
+ "symbols/DefaultScope/description": "Zakres interfejsu API, który klient musi zażądać w celu aprowizacji tokenu dostępu. (użyj z uwierzytelnianiem singleB2C, SingleOrg).",
+ "symbols/TenantId/description": "Identyfikator TenantId katalogu, z którym ma zostać nawiązane połączenie (użyj uwierzytelniania SingleOrg).",
+ "symbols/OrgReadAccess/description": "Określa, czy zezwolić tej aplikacji na dostęp do odczytu do katalogu (dotyczy tylko uwierzytelniania SingleOrg).",
+ "symbols/UserSecretsId/description": "Identyfikator do użycia na potrzeby wpisów tajnych (używany z funkcją OrgReadAccess lub indywidualnym uwierzytelnianiem).",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json w wygenerowanym szablonie.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS usług IIS Express w pliku launchSettings.json. Ta opcja ma zastosowanie tylko wtedy, gdy nie jest używany parametr no-https (jeśli zostanie użyte uwierzytelnianie IndividualB2C lub OrganizationalAuth, parametr no-https zostanie zignorowany).",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS. Ta opcja ma zastosowanie tylko wtedy, gdy elementy IndividualB2C, SingleOrg lub MultiOrg nie są używane dla uwierzytelniania --auth.",
+ "symbols/UseLocalDB/description": "Określa, czy używać bazy danych LocalDB zamiast oprogramowania SQLite. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth Individual lub --auth IndividualB2C.",
+ "symbols/UseMinimalAPIs/description": "Określa, czy używać minimalnej ilości interfejsów API zamiast kontrolerów.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/CalledApiUrl/description": "Adres URL interfejsu API do wywołania z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg lub --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Określa, czy aplikacja internetowa wywołuje program Microsoft Graph. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg.",
+ "symbols/CalledApiScopes/description": "Zakresy do żądania wywołania interfejsu API z aplikacji internetowej. Ta opcja ma zastosowanie tylko wtedy, gdy określono uwierzytelnianie --auth SingleOrg lub --auth IndividualB2C.",
+ "symbols/DisableOpenAPI/description": "Włącz obsługę interfejsu OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pt-BR.json
index f82adc667d..6075296003 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "API Web do ASP.NET Core",
+ "description": "Um modelo de projeto para criar um aplicativo ASP.NET Core com um Controlador de exemplo para um serviço HTTP RESTful. Esse modelo também pode ser usado para Controladores e Exibições do ASP.NET Core MVC.",
+ "symbols/auth/choices/None/description": "Sem autenticação",
+ "symbols/auth/choices/IndividualB2C/description": "Autenticação individual com Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Autenticação organizacional para um único locatário",
+ "symbols/auth/choices/Windows/description": "autenticação do Windows",
+ "symbols/auth/description": "O tipo de autenticação a ser usado",
+ "symbols/AAdB2CInstance/description": "A instância do Azure Active Directory B2C à qual se conectar (use com autenticação IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "O ID da política de login e inscrição para este projeto (use com autenticação IndividualB2C).",
+ "symbols/AADInstance/description": "A instância do Azure Active Directory à qual se conectar (use com autenticação SingleOrg).",
+ "symbols/ClientId/description": "O ID do cliente para este projeto (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/Domain/description": "O domínio para o locatário do diretório (use com autenticação SingleOrg ou IndividualB2C).",
+ "symbols/DefaultScope/description": "O escopo da API que o cliente precisa solicitar para provisionar um token de acesso. (use com IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "O ID TenantId do diretório ao qual se conectar (use com autenticação SingleOrg).",
+ "symbols/OrgReadAccess/description": "Se deve ou não permitir que este aplicativo tenha acesso de leitura ao diretório (aplica-se apenas à autenticação SingleOrg).",
+ "symbols/UserSecretsId/description": "O ID a ser usado para segredos (use com OrgReadAccess ou Autenticação individual).",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json no modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json. Essa opção só é aplicável quando o parâmetro no-https não é usado (no-https será ignorado se IndividualB2C ou OrganizationalAuth for usado).",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado. Essa opção só se aplica se IndividualB2C, SingleOrg ou MultiOrg não forem usados para --auth.",
+ "symbols/UseLocalDB/description": "Se deve usar LocalDB em vez de SQLite. Esta opção só se aplica se --auth Individual ou --auth IndividualB2C for especificado.",
+ "symbols/UseMinimalAPIs/description": "Se deve usar APIs mínimas em vez de controladores.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/CalledApiUrl/description": "URL da API para chamar do aplicativo Web. Essa opção se aplica somente se --auth SingleOrg ou --auth IndividualB2C for especificado.",
+ "symbols/CallsMicrosoftGraph/description": "Especifica se o aplicativo Web chama o Microsoft Graph. Esta opção só se aplica se --auth SingleOrg for especificado.",
+ "symbols/CalledApiScopes/description": "Escopos a serem solicitados para chamar a API do aplicativo Web. Essa opção se aplica somente se --auth SingleOrg ou --auth IndividualB2C for especificado.",
+ "symbols/DisableOpenAPI/description": "Desabilitar suporte a OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ru.json
index f82adc667d..6ca193b80b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,38 +1,38 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Веб-API ASP.NET Core",
+ "description": "Шаблон проекта для создания приложения ASP.NET Core с образцом контроллера для службы HTTP RESTful. Этот шаблон можно также использовать для представлений MVC и контроллеров ASP.NET Core.",
+ "symbols/auth/choices/None/description": "Без проверки подлинности",
+ "symbols/auth/choices/IndividualB2C/description": "Индивидуальная проверка подлинности в Azure AD B2C",
+ "symbols/auth/choices/SingleOrg/description": "Проверка подлинности в организации для одного клиента",
+ "symbols/auth/choices/Windows/description": "Проверка подлинности Windows",
+ "symbols/auth/description": "Тип используемой проверки подлинности",
+ "symbols/AAdB2CInstance/description": "Экземпляр Azure Active Directory B2C, к которому нужно подключиться (используется с проверкой подлинности IndividualB2C).",
+ "symbols/SignUpSignInPolicyId/description": "Идентификатор политики входа и регистрации для этого проекта (используется с проверкой подлинности IndividualB2C).",
+ "symbols/AADInstance/description": "Экземпляр Azure Active Directory, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/ClientId/description": "Идентификатор клиента для этого проекта (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/Domain/description": "Домен для клиента каталога (используется с проверкой подлинности SingleOrg или IndividualB2C).",
+ "symbols/DefaultScope/description": "Область API, необходимая клиенту для запроса на подготовку маркера доступа (используется с IndividualB2C, SingleOrg).",
+ "symbols/TenantId/description": "Идентификатор TenantId каталога, к которому нужно подключиться (используется с проверкой подлинности SingleOrg).",
+ "symbols/OrgReadAccess/description": "Следует ли предоставлять этому приложению доступ на чтение к каталогу (применяется только к проверке подлинности SingleOrg).",
+ "symbols/UserSecretsId/description": "Идентификатор, используемый для секретов (используется с проверкой подлинности OrgReadAccess или Individual).",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json. Этот параметр применим только в том случае, если no-https не используется (при использовании IndividualB2C или OrganizationalAuth no-https игнорируется).",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS. Этот параметр применяется, только если для --auth не используются IndividualB2C, SingleOrg или MultiOrg.",
+ "symbols/UseLocalDB/description": "Следует ли использовать LocalDB вместо SQLite. Этот параметр применяется, только если указывается --auth Individual или --auth IndividualB2C.",
+ "symbols/UseMinimalAPIs/description": "Следует ли использовать минимальные API вместо контроллеров.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/CalledApiUrl/description": "URL-адрес API для вызова из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg или --auth IndividualB2C.",
+ "symbols/CallsMicrosoftGraph/description": "Указывает, вызывает ли веб-приложение Microsoft Graph. Этот параметр применяется, только если указывается --auth SingleOrg.",
+ "symbols/CalledApiScopes/description": "Области для запроса вызова API из веб-приложения. Этот параметр применяется, только если указывается --auth SingleOrg или --auth IndividualB2C.",
+ "symbols/DisableOpenAPI/description": "Отключение поддержки OpenAPI (Swagger)",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.tr.json
index f82adc667d..64cf7860da 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web API'si",
+ "description": "RESTful HTTP hizmetine ait örnek bir Denetleyici içeren bir ASP.NET Core uygulaması oluşturmaya yönelik proje şablonu. Bu şablon aynı zamanda ASP.NET Core MVC Görünümleri ve Denetleyicileri için de kullanılabilir.",
+ "symbols/auth/choices/None/description": "Kimlik doğrulaması yok",
+ "symbols/auth/choices/IndividualB2C/description": "Azure AD B2C ile bireysel kimlik doğrulaması",
+ "symbols/auth/choices/SingleOrg/description": "Tek bir kiracı için kuruluş kimlik doğrulaması",
+ "symbols/auth/choices/Windows/description": "Windows kimlik doğrulaması",
+ "symbols/auth/description": "Kullanılacak kimlik doğrulaması türü",
+ "symbols/AAdB2CInstance/description": "Bağlanılacak Azure Active Directory B2C örneği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/SignUpSignInPolicyId/description": "Bu proje için oturum açma ve kaydolma ilkesi kimliği (IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/AADInstance/description": "Bağlanılacak Azure Active Directory örneği (SingleOrg kimlik doğrulaması ile kullanın).",
+ "symbols/ClientId/description": "Bu proje için İstemci Kimliği (SingleOrg veya IndividualB2C kimlik doğrulaması ile kullanın).",
+ "symbols/Domain/description": "Dizin kiracısı için etki alanı (SingleOrg veya IndividualB2C kimlik doğrulamasıyla kullanın).",
+ "symbols/DefaultScope/description": "İstemcinin erişim belirteci sağlamak amacıyla istekte bulunmak için ihtiyacı olan API kapsamı. (IndividualB2C, SingleOrg ile kullanın).",
+ "symbols/TenantId/description": "Bağlanılacak dizinin TenantId kimliği (SingleOrg kimlik doğrulamasıyla kullanın).",
+ "symbols/OrgReadAccess/description": "Bu uygulamanın dizin okuma erişimine izin verilip verilmeyeceği (yalnızca SingleOrg kimlik doğrulaması için geçerlidir).",
+ "symbols/UserSecretsId/description": "Gizli diziler için kullanılan kimlik (OrgReadAccess veya Bireysel kimlik doğrulaması ile kullanın).",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablonda dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası. Bu seçenek yalnızca no-https parametresi kullanılmazsa uygulanabilir (IndividualB2C veya OrganizationalAuth kullanılırsa no-https yoksayılır).",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı. Bu seçenek yalnızca IndividualB2C, SingleOrg veya MultiOrg -- auth için kullanılmazsa geçerlidir.",
+ "symbols/UseLocalDB/description": "SQLite yerine LocalDB'nin kullanılıp kullanılmayacağı. Bu seçenek yalnızca --auth Individual veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/UseMinimalAPIs/description": "Denetleyiciler yerine minimal API’lerin kullanılıp kullanılmayacağı.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/CalledApiUrl/description": "Web uygulamasından çağrılan API URL'si. Bu seçenek yalnızca --auth SingleOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/CallsMicrosoftGraph/description": "Web uygulamasının Microsoft Graph çağırıp çağırmadığını belirtir. Bu seçenek yalnızca --auth SingleOrg belirtilirse geçerlidir.",
+ "symbols/CalledApiScopes/description": "Web uygulamasından API çağırma istek kapsamları. Bu seçenek yalnızca --auth SingleOrg veya --auth IndividualB2C belirtilirse geçerlidir.",
+ "symbols/DisableOpenAPI/description": "OpenAPI (Swagger) desteğini devre dışı bırak",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index f82adc667d..42928e58ba 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "用于创建包含 RESTful HTTP 服务示例控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 ASP.NET Core MVC 视图和控制器。",
+ "symbols/auth/choices/None/description": "无身份验证",
+ "symbols/auth/choices/IndividualB2C/description": "使用 Azure AD B2C 进行个人身份验证",
+ "symbols/auth/choices/SingleOrg/description": "单个租户的组织身份验证",
+ "symbols/auth/choices/Windows/description": "Windows 身份验证",
+ "symbols/auth/description": "要使用的身份验证类型",
+ "symbols/AAdB2CInstance/description": "要连接到的 Azure Active Directory B2C 实例(与 IndividualB2C 身份验证一起使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此项目的登录和注册策略 ID (与 IndividualB2C 身份验证一起使用)。",
+ "symbols/AADInstance/description": "要连接到的 Azure Active Directory 实例(与 SingleOrg 身份验证一起使用)。",
+ "symbols/ClientId/description": "此项目的客户端 ID (与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/Domain/description": "目录租户的域(与 SingleOrg 或 IndividualB2C 身份验证一起使用)。",
+ "symbols/DefaultScope/description": "客户端预配访问令牌需要请求的 API 范围。(与 IndividualB2C、SingleOrg 一起使用)。",
+ "symbols/TenantId/description": "要连接到的目录的 TenantId ID (与 SingleOrg 身份验证一起使用)。",
+ "symbols/OrgReadAccess/description": "是否允许此应用程序对目录进行读取访问(仅适用于 SingleOrg 身份验证)。",
+ "symbols/UserSecretsId/description": "用于机密的 ID (与 OrgReadAccess 或个人身份验证一起使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否在生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。仅当不使用参数 no-https 时,此选项才适用(如果使用 IndividualB2C 或 OrganizationalAuth,则将忽略 no-https)。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。仅当 IndividualB2C、SingleOrg 或 MultiOrg 不用于 --auth 时,此选项才适用。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而不是 SQLite。仅当指定了 --auth Individual 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/UseMinimalAPIs/description": "是否使用最小 API 而不是控制器。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/CalledApiUrl/description": "要从 Web 应用调用的 API 的 URL。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 应用是否调用 Microsoft Graph。仅当指定了 --auth SingleOrg 时,此选项才适用。",
+ "symbols/CalledApiScopes/description": "请求从 Web 应用调用 API 的范围。仅当指定了 --auth SingleOrg 或 --auth IndividualB2C 时,此选项才适用。",
+ "symbols/DisableOpenAPI/description": "禁用 OpenAI (Swagger)支持",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index f82adc667d..27f3f4b8b3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,38 +1,38 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/auth/choices/None/description": "No authentication",
- "symbols/auth/choices/IndividualB2C/description": "Individual authentication with Azure AD B2C",
- "symbols/auth/choices/SingleOrg/description": "Organizational authentication for a single tenant",
- "symbols/auth/choices/Windows/description": "Windows authentication",
- "symbols/auth/description": "The type of authentication to use",
- "symbols/AAdB2CInstance/description": "The Azure Active Directory B2C instance to connect to (use with IndividualB2C auth).",
- "symbols/SignUpSignInPolicyId/description": "The sign-in and sign-up policy ID for this project (use with IndividualB2C auth).",
- "symbols/AADInstance/description": "The Azure Active Directory instance to connect to (use with SingleOrg auth).",
- "symbols/ClientId/description": "The Client ID for this project (use with SingleOrg or IndividualB2C auth).",
- "symbols/Domain/description": "The domain for the directory tenant (use with SingleOrg or IndividualB2C auth).",
- "symbols/DefaultScope/description": "The API scope the client needs to request to provision an access token. (use with IndividualB2C, SingleOrg).",
- "symbols/TenantId/description": "The TenantId ID of the directory to connect to (use with SingleOrg auth).",
- "symbols/OrgReadAccess/description": "Whether or not to allow this application read access to the directory (only applies to SingleOrg auth).",
- "symbols/UserSecretsId/description": "The ID to use for secrets (use with OrgReadAccess or Individual auth).",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json in the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "symbols/UseLocalDB/description": "Whether to use LocalDB instead of SQLite. This option only applies if --auth Individual or --auth IndividualB2C is specified.",
- "symbols/UseMinimalAPIs/description": "Whether to use minimal APIs instead of controllers.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/CalledApiUrl/description": "URL of the API to call from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/CallsMicrosoftGraph/description": "Specifies if the web app calls Microsoft Graph. This option only applies if --auth SingleOrg is specified.",
- "symbols/CalledApiScopes/description": "Scopes to request to call the API from the web app. This option only applies if --auth SingleOrg or --auth IndividualB2C is specified.",
- "symbols/DisableOpenAPI/description": "Disable OpenAPI (Swagger) support",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "用於建立 ASP.NET Core 應用程式的專案範本,附有 RESTful HTTP 服務的控制器範例。此範本也可用於 ASP.NET Core MVC 的檢視及控制器。",
+ "symbols/auth/choices/None/description": "沒有驗證",
+ "symbols/auth/choices/IndividualB2C/description": "具有 Azure AD B2C 的個別驗證",
+ "symbols/auth/choices/SingleOrg/description": "單一租用戶的組織驗證",
+ "symbols/auth/choices/Windows/description": "Windows 驗證",
+ "symbols/auth/description": "要使用的驗證類型。",
+ "symbols/AAdB2CInstance/description": "要連線的 Azure Active Directory B2C 執行個體 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/SignUpSignInPolicyId/description": "此專案的登入和註冊原則識別碼 (搭配 IndividualB2C 驗證使用)。",
+ "symbols/AADInstance/description": "要連線到的 Azure Active Directory 執行個體 (搭配 SingleOrg 驗證使用)。",
+ "symbols/ClientId/description": "此專案的用戶端識別碼 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/Domain/description": "目錄租用戶的網域 (搭配 SingleOrg 或 IndividualB2C 驗證使用)。",
+ "symbols/DefaultScope/description": "用戶端佈建存取權杖所需的 API 範圍。(搭配 IndividualB2C、SingleOrg 使用)。",
+ "symbols/TenantId/description": "要連線到目錄的 TenantId 識別碼 (搭配 SingleOrg 驗證使用)。",
+ "symbols/OrgReadAccess/description": "是否要允許此應用程式讀取存取目錄 (只適用於 SingleOrg 驗證)。",
+ "symbols/UserSecretsId/description": "用於祕密的識別碼 (搭配 OrgReadAccess 或個別驗證使用)。",
+ "symbols/ExcludeLaunchSettings/description": "是否要在產生的範本中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。只有在未使用參數 no-https 時,才適用用此選項 (如果使用 IndividualB2C 或 OrganizationalAuth,則會忽略 no-https)。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。只有當 IndividualB2C、SingleOrg 或 MultiOrg 未用於 --auth 時,才適用此選項。",
+ "symbols/UseLocalDB/description": "是否使用 LocalDB 而非 SQLite。只有在已指定 --auth Individual 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/UseMinimalAPIs/description": "是否要使用最小 API 而不是控制器。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/CalledApiUrl/description": "要從 Web 應用程式呼叫的 API URL。只有在已指定 --auth SingleOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/CallsMicrosoftGraph/description": "指定 Web 應用程式呼叫是否 Microsoft Graph。只有在已指定 --auth SingleOrg 時,才適用此選項。",
+ "symbols/CalledApiScopes/description": "要求從 Web 應用程式呼叫 API 的範圍。只有在已指定 --auth SingleOrg 或 --auth IndividualB2C 時,才適用此選項。",
+ "symbols/DisableOpenAPI/description": "停用 OpenAPI (Swagger) 支援",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pl-PL/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pl/strings.json
index b343560037..fb2f218fab 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pl-PL/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pl/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "Internetowy interfejs API platformy ASP.NET Core",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Włącz obsługę interfejsu _OpenAPI",
"parameter.DisableOpenAPI.description": "Włącza obsługę interfejsu OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Użyj kontrolerów (usuń zaznaczenie, aby używać minimalnej ilości interfejsów API)",
- "parameter.UseMinimalAPIs.description": "Określa, czy używać minimalnej ilości interfejsów API zamiast kontrolerów."
+ "parameter.UseMinimalAPIs.description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pt-BR/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pt-BR/strings.json
index 2c07afece2..67a528e203 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pt-BR/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/pt-BR/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "API Web do ASP.NET Core",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Habilitar o suporte a _OpenAPI",
"parameter.DisableOpenAPI.description": "Habilita o suporte a OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Usar controladores (desmarque para usar APIs mínimas)",
- "parameter.UseMinimalAPIs.description": "Se usar APIs mínimas em vez de controladores."
+ "parameter.UseMinimalAPIs.description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ru-RU/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ru/strings.json
index bb529502b9..52601f794b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ru-RU/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/ru/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "Веб-API ASP.NET Core",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "Включить поддержку _OpenAPI",
"parameter.DisableOpenAPI.description": "Включает поддержку OpenAPI (Swagger)",
"parameter.UseMinimalAPIs.name": "Использовать контроллеры (снимите флажок, чтобы использовать минимальные API)",
- "parameter.UseMinimalAPIs.description": "Использование минимальных API вместо контроллеров."
+ "parameter.UseMinimalAPIs.description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/template.json
index e153789e02..ef6d471062 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/template.json
@@ -44,9 +44,11 @@
]
},
{
- "condition": "(UseProgramMain && !UseMinimalAPIs)",
+ "condition": "(UseProgramMain)",
"exclude": [
- "Program.cs"
+ "Program.cs",
+ "Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs",
+ "Program.MinimalAPIs.WindowsOrNoAuth.cs"
],
"rename": {
"Program.Main.cs": "Program.cs"
@@ -55,13 +57,17 @@
{
"condition": "(UseMinimalAPIs)",
"exclude": [
- "Controllers/WeatherForecastController.cs",
- "Program.cs",
+ "Controllers/WeatherForecastController.cs"
+ ]
+ },
+ {
+ "condition": "(UseMinimalAPIs && !UseProgramMain)",
+ "exclude": [
"WeatherForecast.cs"
]
},
{
- "condition": "(UseMinimalAPIs && (NoAuth || WindowsAuth))",
+ "condition": "(!UseProgramMain && UseMinimalAPIs && (NoAuth || WindowsAuth))",
"rename": {
"Program.MinimalAPIs.WindowsOrNoAuth.cs": "Program.cs"
},
@@ -70,7 +76,7 @@
]
},
{
- "condition": "(UseMinimalAPIs && (IndividualAuth || OrganizationalAuth))",
+ "condition": "(!UseProgramMain && UseMinimalAPIs && (IndividualAuth || OrganizationalAuth))",
"rename": {
"Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs": "Program.cs"
},
@@ -203,7 +209,7 @@
"kestrelHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"kestrelHttpsPortGenerated": {
"type": "generated",
@@ -243,7 +249,7 @@
"iisHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualB2C or OrganizationalAuth is used)."
},
"iisHttpsPortGenerated": {
"type": "generated",
@@ -288,13 +294,21 @@
},
"RequiresHttps": {
"type": "computed",
- "value": "(OrganizationalAuth || IndividualAuth || !NoHttps)"
+ "value": "(OrganizationalAuth || IndividualB2CAuth)"
+ },
+ "HasHttpProfile": {
+ "type": "computed",
+ "value": "(!RequiresHttps)"
+ },
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(RequiresHttps || !NoHttps)"
},
"NoHttps": {
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ "description": "Whether to turn off HTTPS. This option only applies if IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
},
"UseLocalDB": {
"type": "parameter",
@@ -384,7 +398,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/tr-TR/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/tr/strings.json
index 8583f13373..55a9e3cf64 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/tr-TR/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/tr/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "ASP.NET Core Web API'si",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "_OpenAPI desteğini etkinleştir",
"parameter.DisableOpenAPI.description": "OpenAPI (Swagger) desteğini etkinleştirir",
"parameter.UseMinimalAPIs.name": "Denetleyicileri kullan (minimal API’leri kullanmak için onay işaretini kaldırın)",
- "parameter.UseMinimalAPIs.description": "Denetleyiciler yerine minimal API’lerin kullanılıp kullanılmayacağını belirtir."
+ "parameter.UseMinimalAPIs.description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir."
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-CN/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-Hans/strings.json
index 066bf6c699..50932dbfde 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-CN/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-Hans/strings.json
@@ -1,11 +1,11 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "ASP.NET Core Web API",
"description": "用于创建包含 RESTful HTTP 服务示例控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 ASP.NET Core MVC 视图和控制器。",
"parameter.DisableOpenAPI.name": "启用 OpenAPI 支持(_O)",
- "parameter.DisableOpenAPI.description": "启用 OpenAPI (Swagger)支持",
+ "parameter.DisableOpenAPI.description": "启用 OpenAI (Swagger)支持",
"parameter.UseMinimalAPIs.name": "使用控制器(取消选中以使用最小 API)",
- "parameter.UseMinimalAPIs.description": "是否使用最小 API 而不是控制器。"
+ "parameter.UseMinimalAPIs.description": "是否生成显式程序类和主方法,而不是顶级语句。"
}
-}
+} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-TW/strings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-Hant/strings.json
index b4faea763f..e2f5a6dbb9 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-TW/strings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/.template.config/zh-Hant/strings.json
@@ -1,4 +1,4 @@
-{
+{
"version": "1.0.0.0",
"strings": {
"name": "ASP.NET Core Web API",
@@ -6,6 +6,6 @@
"parameter.DisableOpenAPI.name": "啟用 OpenAPI 支援(_O)",
"parameter.DisableOpenAPI.description": "啟用 OpenAPI (Swagger) 支援",
"parameter.UseMinimalAPIs.name": "使用控制器 (取消勾選以使用最低 API)",
- "parameter.UseMinimalAPIs.description": "是否要使用迷你 API 而不是控制器。"
+ "parameter.UseMinimalAPIs.description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。"
}
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Controllers/WeatherForecastController.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Controllers/WeatherForecastController.cs
index 545e1ba936..1db80ec1fa 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Controllers/WeatherForecastController.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Controllers/WeatherForecastController.cs
@@ -65,7 +65,7 @@ public class WeatherForecastController : ControllerBase
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
- Date = DateTime.Now.AddDays(index),
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
@@ -93,7 +93,7 @@ public class WeatherForecastController : ControllerBase
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
- Date = DateTime.Now.AddDays(index),
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
@@ -114,7 +114,7 @@ public class WeatherForecastController : ControllerBase
{
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
- Date = DateTime.Now.AddDays(index),
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.Main.cs
index a0c9ad67e8..b74c5afce1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.Main.cs
@@ -10,8 +10,9 @@ using Graph = Microsoft.Graph;
#endif
#if (OrganizationalAuth || IndividualB2CAuth)
using Microsoft.Identity.Web;
+using Microsoft.Identity.Web.Resource;
#endif
-#if (OrganizationalAuth || IndividualB2CAuth || GenerateGraph || WindowsAuth)
+#if (OrganizationalAuth || IndividualB2CAuth || GenerateGraph || WindowsAuth || EnableOpenAPI)
#endif
namespace Company.WebApplication1;
@@ -20,76 +21,167 @@ public class Program
{
public static void Main(string[] args)
{
- var builder = WebApplication.CreateBuilder(args);
-
- // Add services to the container.
- #if (OrganizationalAuth)
- builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
- #if (GenerateApiOrGraph)
- .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))
- .EnableTokenAcquisitionToCallDownstreamApi()
- #if (GenerateApi)
- .AddDownstreamWebApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
- #endif
- #if (GenerateGraph)
- .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi"))
- #endif
- .AddInMemoryTokenCaches();
- #else
- .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
- #endif
- #elif (IndividualB2CAuth)
- builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
- #if (GenerateApi)
- .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"))
- .EnableTokenAcquisitionToCallDownstreamApi()
- .AddDownstreamWebApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
- .AddInMemoryTokenCaches();
- #else
- .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"));
- #endif
- #endif
-
- builder.Services.AddControllers();
- #if (EnableOpenAPI)
- // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
- builder.Services.AddEndpointsApiExplorer();
- builder.Services.AddSwaggerGen();
- #endif
- #if (WindowsAuth)
-
- builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
- .AddNegotiate();
-
- builder.Services.AddAuthorization(options =>
- {
- // By default, all incoming requests will be authorized according to the default policy.
- options.FallbackPolicy = options.DefaultPolicy;
- });
- #endif
+ var builder = WebApplication.CreateBuilder(args);
- var app = builder.Build();
+ // Add services to the container.
+ #if (OrganizationalAuth)
+ builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+ #if (GenerateApiOrGraph)
+ .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"))
+ .EnableTokenAcquisitionToCallDownstreamApi()
+ #if (GenerateApi)
+ .AddDownstreamWebApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
+ #endif
+ #if (GenerateGraph)
+ .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi"))
+ #endif
+ .AddInMemoryTokenCaches();
+ #else
+ .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd"));
+ #endif
+ #elif (IndividualB2CAuth)
+ builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
+ #if (GenerateApi)
+ .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"))
+ .EnableTokenAcquisitionToCallDownstreamApi()
+ .AddDownstreamWebApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
+ .AddInMemoryTokenCaches();
+ #else
+ .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAdB2C"));
+ #endif
+ #endif
+ #if (UseMinimalAPIs)
+ builder.Services.AddAuthorization();
+ #endif
- // Configure the HTTP request pipeline.
- #if (EnableOpenAPI)
- if (app.Environment.IsDevelopment())
- {
- app.UseSwagger();
- app.UseSwaggerUI();
- }
- #endif
- #if (RequiresHttps)
+ #if (UseControllers)
+ builder.Services.AddControllers();
+ #endif
+ #if (EnableOpenAPI)
+ // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
+ builder.Services.AddEndpointsApiExplorer();
+ builder.Services.AddSwaggerGen();
+ #endif
+ #if (WindowsAuth)
+
+ builder.Services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
+ .AddNegotiate();
+
+ builder.Services.AddAuthorization(options =>
+ {
+ // By default, all incoming requests will be authorized according to the default policy.
+ options.FallbackPolicy = options.DefaultPolicy;
+ });
+ #endif
+
+ var app = builder.Build();
+
+ // Configure the HTTP request pipeline.
+ #if (EnableOpenAPI)
+ if (app.Environment.IsDevelopment())
+ {
+ app.UseSwagger();
+ app.UseSwaggerUI();
+ }
+ #endif
+ #if (HasHttpsProfile)
+
+ app.UseHttpsRedirection();
+ #endif
+
+ app.UseAuthorization();
+
+ #if (UseMinimalAPIs)
+ #if (OrganizationalAuth || IndividualB2CAuth)
+ var scopeRequiredByApi = app.Configuration["AzureAd:Scopes"] ?? "";
+ #endif
+ var summaries = new[]
+ {
+ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+ };
+
+ #if (GenerateApi)
+ app.MapGet("/weatherforecast", async (HttpContext httpContext, IDownstreamWebApi downstreamWebApi) =>
+ {
+ httpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
+
+ using var response = await downstreamWebApi.CallWebApiForUserAsync("DownstreamApi").ConfigureAwait(false);
+ if (response.StatusCode == System.Net.HttpStatusCode.OK)
+ {
+ var apiResult = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
+ // Do something
+ }
+ else
+ {
+ var error = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
+ throw new HttpRequestException($"Invalid status code in the HttpResponseMessage: {response.StatusCode}: {error}");
+ }
+
+ var forecast = Enumerable.Range(1, 5).Select(index =>
+ new WeatherForecast
+ {
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ TemperatureC = Random.Shared.Next(-20, 55),
+ Summary = summaries[Random.Shared.Next(summaries.Length)]
+ })
+ .ToArray();
+
+ return forecast;
+ #elif (GenerateGraph)
+ app.MapGet("/weatherforecast", async (HttpContext httpContext, Graph.GraphServiceClient graphServiceClient) =>
+ {
+ httpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
+
+ var user = await graphServiceClient.Me.Request().GetAsync();
+
+ var forecast = Enumerable.Range(1, 5).Select(index =>
+ new WeatherForecast
+ {
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ TemperatureC = Random.Shared.Next(-20, 55),
+ Summary = summaries[Random.Shared.Next(summaries.Length)]
+ })
+ .ToArray();
- app.UseHttpsRedirection();
- #endif
+ return forecast;
+ #else
+ app.MapGet("/weatherforecast", (HttpContext httpContext) =>
+ {
+ #if (OrganizationalAuth || IndividualB2CAuth)
+ httpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
- #if (OrganizationalAuth || IndividualAuth || WindowsAuth)
- app.UseAuthentication();
- #endif
- app.UseAuthorization();
+ #endif
+ var forecast = Enumerable.Range(1, 5).Select(index =>
+ new WeatherForecast
+ {
+ Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ TemperatureC = Random.Shared.Next(-20, 55),
+ Summary = summaries[Random.Shared.Next(summaries.Length)]
+ })
+ .ToArray();
+ return forecast;
+ #endif
+ #if (EnableOpenAPI && !NoAuth)
+ })
+ .WithName("GetWeatherForecast")
+ .WithOpenApi()
+ .RequireAuthorization();
+ #elif (EnableOpenAPI && NoAuth)
+ })
+ .WithName("GetWeatherForecast")
+ .WithOpenApi();
+ #elif (!EnableOpenAPI && !NoAuth)
+ })
+ .RequireAuthorization();
+ #else
+ });
+ #endif
+ #endif
+ #if (UseControllers)
- app.MapControllers();
+ app.MapControllers();
+ #endif
- app.Run();
+ app.Run();
}
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs
index b6ec2e136e..d767b12fd0 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.OrgOrIndividualB2CAuth.cs
@@ -3,9 +3,6 @@ using System.Net.Http;
#endif
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
-#if (EnableOpenAPI)
-using Microsoft.AspNetCore.OpenApi;
-#endif
#if (GenerateGraph)
using Graph = Microsoft.Graph;
#endif
@@ -59,22 +56,19 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI();
}
#endif
-#if (RequiresHttps)
+#if (HasHttpsProfile)
app.UseHttpsRedirection();
#endif
-app.UseAuthentication();
-app.UseAuthorization();
-
-var scopeRequiredByApi = app.Configuration["AzureAd:Scopes"];
+var scopeRequiredByApi = app.Configuration["AzureAd:Scopes"] ?? "";
var summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
#if (GenerateApi)
-app.MapGet("/weatherforecast", (HttpContext httpContext, IDownstreamWebApi downstreamWebApi) =>
+app.MapGet("/weatherforecast", async (HttpContext httpContext, IDownstreamWebApi downstreamWebApi) =>
{
httpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
@@ -93,32 +87,30 @@ app.MapGet("/weatherforecast", (HttpContext httpContext, IDownstreamWebApi downs
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
- DateTime.Now.AddDays(index),
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
-})
-#elseif (GenerateGraph)
-app.MapGet("/weahterforecast", (HttpContext httpContext, GraphServiceClient graphServiceClient) =>
+#elif (GenerateGraph)
+app.MapGet("/weatherforecast", async (HttpContext httpContext, Graph.GraphServiceClient graphServiceClient) =>
{
httpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
- var user = await _graphServiceClient.Me.Request().GetAsync();
+ var user = await graphServiceClient.Me.Request().GetAsync();
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
- DateTime.Now.AddDays(index),
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
-})
#else
app.MapGet("/weatherforecast", (HttpContext httpContext) =>
{
@@ -127,7 +119,7 @@ app.MapGet("/weatherforecast", (HttpContext httpContext) =>
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
- DateTime.Now.AddDays(index),
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
@@ -146,7 +138,7 @@ app.MapGet("/weatherforecast", (HttpContext httpContext) =>
app.Run();
-record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
+record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.WindowsOrNoAuth.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.WindowsOrNoAuth.cs
index 1ef820c6fb..179e1c6479 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.WindowsOrNoAuth.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.MinimalAPIs.WindowsOrNoAuth.cs
@@ -1,7 +1,3 @@
-#if (EnableOpenAPI)
-using Microsoft.AspNetCore.OpenApi;
-
-#endif
#if (WindowsAuth)
using Microsoft.AspNetCore.Authentication.Negotiate;
@@ -35,13 +31,10 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI();
}
#endif
-#if (RequiresHttps)
+#if (HasHttpsProfile)
app.UseHttpsRedirection();
#endif
-#if (WindowsAuth)
-app.UseAuthentication();
-#endif
var summaries = new[]
{
@@ -53,7 +46,7 @@ app.MapGet("/weatherforecast", () =>
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
- DateTime.Now.AddDays(index),
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
@@ -69,7 +62,7 @@ app.MapGet("/weatherforecast", () =>
app.Run();
-record WeatherForecast(DateTime Date, int TemperatureC, string? Summary)
+record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.cs
index 2ce30ac64f..28d3caf754 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Program.cs
@@ -72,14 +72,11 @@ if (app.Environment.IsDevelopment())
app.UseSwaggerUI();
}
#endif
-#if (RequiresHttps)
+#if (HasHttpsProfile)
app.UseHttpsRedirection();
#endif
-#if (OrganizationalAuth || IndividualAuth || WindowsAuth)
-app.UseAuthentication();
-#endif
app.UseAuthorization();
app.MapControllers();
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Properties/launchSettings.json
index 2ab450749e..56c43e2c08 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/Properties/launchSettings.json
@@ -10,7 +10,7 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(RequiresHttps)
+ //#if (HasHttpsProfile)
"sslPort": 44300
//#else
"sslPort": 0
@@ -18,28 +18,42 @@
}
},
"profiles": {
- "Company.WebApplication1": {
+ //#if (HasHttpProfile)
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
- //#if(EnableOpenAPI)
+ //#if (EnableOpenAPI)
"launchUrl": "swagger",
//#else
"launchUrl": "weatherforecast",
//#endif
- //#if(RequiresHttps)
- "applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#else
"applicationUrl": "http://localhost:5000",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#endif
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ //#if (EnableOpenAPI)
+ "launchUrl": "swagger",
+ //#else
+ "launchUrl": "weatherforecast",
//#endif
+ "applicationUrl": "https://localhost:5001;http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
- //#if(EnableOpenAPI)
+ //#if (EnableOpenAPI)
"launchUrl": "swagger",
//#else
"launchUrl": "weatherforecast",
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/WeatherForecast.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/WeatherForecast.cs
index 79d043e074..f185c909af 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/WeatherForecast.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-CSharp/WeatherForecast.cs
@@ -2,7 +2,7 @@ namespace Company.WebApplication1;
public class WeatherForecast
{
- public DateTime Date { get; set; }
+ public DateOnly Date { get; set; }
public int TemperatureC { get; set; }
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/ide.host.json
index 0ff0890738..24b0310e33 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/ide.host.json
@@ -1,24 +1,7 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 201,
"icon": "ide/WebAPI.png",
"supportsDocker": true,
- "supportedAuthentications": [
- {
- "auth": "None",
- "authenticationType": "NoAuth",
- "allowUnsecured": true
- }
- ],
- "ports": [
- {
- "name": "HttpPort",
- "useHttps": false
- },
- {
- "name": "HttpsPort",
- "useHttps": true
- }
- ],
"disableHttpsSymbol": "NoHttps"
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.cs.json
index 10dfdafb04..6136bca8b3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.cs.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Webové rozhraní API pro ASP.NET Core",
+ "description": "Šablona projektu pro vytvoření aplikace ASP.NET Core s ukázkovým kontrolerem pro službu RESTful HTTP. Tato šablona se dá použít i pro zobrazení a kontrolery ASP.NET Core MVC.",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/kestrelHttpPort/description": "Číslo portu, který se má použít pro koncový bod HTTP v souboru launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Číslo portu, který se má použít pro koncový bod HTTPS v souboru launchSettings.json.",
+ "symbols/iisHttpPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTP v souboru launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Číslo portu, který se má použít pro koncový bod IIS Express HTTPS v souboru launchSettings.json.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/NoHttps/description": "Určuje, jestli se má vypnout protokol HTTPS.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.de.json
index 10dfdafb04..f71534552d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.de.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "ASP.NET Core-Web-API",
+ "description": "Eine Projektvorlage zum Erstellen einer ASP.NET Core-Anwendung mit einem Beispielcontroller für einen RESTful HTTP-Dienst. Diese Vorlage kann auch für ASP.NET Core-MVC-Ansichten und -Controller verwendet werden.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/kestrelHttpPort/description": "Portnummer, die für den HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/kestrelHttpsPort/description": "Portnummer, die für den HTTPS Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpPort/description": "Portnummer, die für den IIS Express HTTP Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/iisHttpsPort/description": "Portnummer, die für den IIS Express-HTTPS-Endpunkt in launchSettings.json verwendet werden soll.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/NoHttps/description": "Ob HTTPS deaktiviert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.en.json
index 10dfdafb04..6506f52fae 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.en.json
@@ -4,13 +4,13 @@
"description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
"symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
"symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
+ "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json.",
"symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
+ "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json.",
"symbols/Framework/description": "The target framework for the project.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
"symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
+ "symbols/NoHttps/description": "Whether to turn off HTTPS.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.es.json
index 10dfdafb04..7d620a18da 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.es.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "Una plantilla de proyecto para crear una aplicación ASP.NET Core con un controlador de ejemplo para un servicio RESTful HTTP. Esta plantilla también puede usarse para controladores y vistas de ASP.NET Core MVC.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/kestrelHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP en launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS en launchSettings.json.",
+ "symbols/iisHttpPort/description": "Número de puerto que se va a usar para el punto de conexión HTTP de IIS Express en launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número de puerto que se va a usar para el punto de conexión HTTPS de IIS Express en launchSettings.json.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/NoHttps/description": "Si se va a desactivar HTTPS.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.fr.json
index 10dfdafb04..65eab02b60 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.fr.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "API web ASP.NET Core",
+ "description": "Modèle de projet permettant de créer une application ASP.NET Core avec un exemple de contrôleur pour un service HTTP RESTful. Vous pouvez également utiliser ce modèle pour les vues et contrôleurs ASP.NET Core MVC.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/kestrelHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP dans launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS dans launchSettings.json.",
+ "symbols/iisHttpPort/description": "Numéro de port à utiliser pour le point de terminaison HTTP IIS Express dans launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numéro de port à utiliser pour le point de terminaison HTTPS IIS Express dans launchSettings.json.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/NoHttps/description": "Indique s’il faut désactiver HTTPS.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.it.json
index 10dfdafb04..299bf1c0f7 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.it.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "API Web ASP.NET Core",
+ "description": "Modello di progetto per la creazione di un'applicazione ASP.NET Core con un controller di esempio per un servizio HTTP RESTful. È possibile usare questo modello anche per i controller e le viste di ASP.NET Core MVC.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/kestrelHttpPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numero di porta da usare per l'endpoint HTTP in launchSettings.json.",
+ "symbols/iisHttpPort/description": "Numero di porta da usare per l'endpoint HTTP IIS Express in launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numero di porta da usare per l'endpoint HTTPS IIS Express in launchSettings.json.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/NoHttps/description": "Indica se disattivare HTTPS.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ja.json
index 10dfdafb04..3c5e891ae5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ja.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "RESTful HTTP サービスのサンプル コントローラーで ASP.NET Core アプリケーションを作成するためのプロジェクト テンプレートです。このテンプレートは ASP.NET Core MVC のビューとコントローラーでも使用できます。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json の HTTP エンドポイントに使用するポート番号。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json の HTTPS エンドポイントに使用するポート番号。",
+ "symbols/iisHttpPort/description": "launchSettings.json の IIS Express HTTP エンドポイントに使用するポート番号。",
+ "symbols/iisHttpsPort/description": "launchSettings.json の IIS Express HTTPS エンドポイントに使用するポート番号。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/NoHttps/description": "HTTPS をオフにするかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ko.json
index 10dfdafb04..49b304a0b9 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ko.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core 웹 API",
+ "description": "RESTful HTTP 서비스용 예제 컨트롤러를 사용하여 ASP.NET Core 애플리케이션을 만드는 데 사용되는 프로젝트 템플릿입니다. 이 템플릿은 ASP.NET Core MVC 뷰 및 컨트롤러에도 사용할 수 있습니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json의 HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json의 HTTPS 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpPort/description": "launchSettings.json의 IIS Express HTTP 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/iisHttpsPort/description": "launchSettings.json의 IIS Express HTTPS 엔드포인트에 사용할 포트 번호입니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/NoHttps/description": "HTTPS를 끌지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pl.json
index 10dfdafb04..d488cf54c3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pl.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Internetowy interfejs API platformy ASP.NET Core",
+ "description": "Szablon projektu służący do tworzenia aplikacji platformy ASP.NET Core z przykładowym kontrolerem obsługującym usługę HTTP RESTful. Tego szablonu można także użyć dla widoków i kontrolerów platformy ASP.NET Core MVC.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/kestrelHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP w pliku launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS w pliku launchSettings.json.",
+ "symbols/iisHttpPort/description": "Numer portu do użycia dla punktu końcowego HTTP usług IIS Express w pliku launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Numer portu do użycia dla punktu końcowego HTTPS programu IIS Express w pliku launchSettings.json.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/NoHttps/description": "Określa, czy wyłączyć protokół HTTPS.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pt-BR.json
index 10dfdafb04..3d7b28bc53 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "API Web do ASP.NET Core",
+ "description": "Um modelo de projeto para criar um aplicativo ASP.NET Core com um Controlador de exemplo para um serviço HTTP RESTful. Esse modelo também pode ser usado para Controladores e Exibições do ASP.NET Core MVC.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/kestrelHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP em launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS em launchSettings.json.",
+ "symbols/iisHttpPort/description": "Número da porta a ser usada para o ponto de extremidade HTTP do IIS Express em launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Número da porta a ser usada para o ponto de extremidade HTTPS do IIS Express em launchSettings.json.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/NoHttps/description": "Se o HTTPS deve ser desativado.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ru.json
index 10dfdafb04..0d7e4203dd 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.ru.json
@@ -1,16 +1,16 @@
-{
- "author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+{
+ "author": "Майкрософт",
+ "name": "Веб-API ASP.NET Core",
+ "description": "Шаблон проекта для создания приложения ASP.NET Core с образцом контроллера для службы HTTP RESTful. Этот шаблон можно также использовать для представлений MVC и контроллеров ASP.NET Core.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/kestrelHttpPort/description": "Номер порта, используемый для конечной точки HTTP в launchSettings.json.",
+ "symbols/kestrelHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS в launchSettings.json.",
+ "symbols/iisHttpPort/description": "Номер порта, используемый для конечной точки HTTP IIS Express в launchSettings.json.",
+ "symbols/iisHttpsPort/description": "Номер порта, используемый для конечной точки HTTPS IIS Express в launchSettings.json.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/NoHttps/description": "Следует ли отключить HTTPS.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.tr.json
index 10dfdafb04..617e1d7bf3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.tr.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
- "name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ASP.NET Core Web API'si",
+ "description": "RESTful HTTP hizmetine ait örnek bir Denetleyici içeren bir ASP.NET Core uygulaması oluşturmaya yönelik proje şablonu. Bu şablon aynı zamanda ASP.NET Core MVC Görünümleri ve Denetleyicileri için de kullanılabilir.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/kestrelHttpPort/description": "launchSettings.json içinde HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json içinde HTTPS uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpPort/description": "launchSettings.json içinde IIS Express HTTP uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/iisHttpsPort/description": "launchSettings.json içinde IIS Express HTTPS uç noktası için kullanılacak bağlantı noktası numarası.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/NoHttps/description": "HTTPS'nin kapatılıp kapatılmayacağı.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json
index 10dfdafb04..ee0214b37f 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "用于创建包含 RESTful HTTP 服务示例控制器的 ASP.NET Core 应用程序的项目模板。此模板还可以用于 ASP.NET Core MVC 视图和控制器。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "要用于 launchSettings.json 中 HTTP 终结点的端口号。",
+ "symbols/kestrelHttpsPort/description": "要用于 launchSettings.json 中 HTTPS 终结点的端口号。",
+ "symbols/iisHttpPort/description": "要用于 launchSettings.json 中 IIS Express HTTP 终结点的端口号。",
+ "symbols/iisHttpsPort/description": "要用于 launchSettings.json 中 IIS Express HTTPS 终结点的端口号。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/NoHttps/description": "是否禁用 HTTPS。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hant.json
index 10dfdafb04..9b84bb8213 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,16 +1,16 @@
-{
+{
"author": "Microsoft",
"name": "ASP.NET Core Web API",
- "description": "A project template for creating an ASP.NET Core application with an example Controller for a RESTful HTTP service. This template can also be used for ASP.NET Core MVC Views and Controllers.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/kestrelHttpPort/description": "Port number to use for the HTTP endpoint in launchSettings.json.",
- "symbols/kestrelHttpsPort/description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/iisHttpPort/description": "Port number to use for the IIS Express HTTP endpoint in launchSettings.json.",
- "symbols/iisHttpsPort/description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used).",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/NoHttps/description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "用於建立 ASP.NET Core 應用程式的專案範本,附有 RESTful HTTP 服務的控制器範例。此範本也可用於 ASP.NET Core MVC 的檢視及控制器。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/kestrelHttpPort/description": "launchSettings.json 中 HTTP 端點要使用的連接埠號碼。",
+ "symbols/kestrelHttpsPort/description": "launchSettings.json 中 HTTPS 端點要使用的連接埠號碼。",
+ "symbols/iisHttpPort/description": "launchSettings.json 中 IIS Express HTTP 端點要使用的連接埠號碼。",
+ "symbols/iisHttpsPort/description": "launchSettings.json 中 IIS Express HTTPS 端點要使用的連接埠號碼。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/NoHttps/description": "是否要關閉 HTTPS。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/template.json
index 0ae13400e2..5df347165d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/.template.config/template.json
@@ -61,7 +61,7 @@
"kestrelHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the HTTPS endpoint in launchSettings.json."
},
"kestrelHttpsPortGenerated": {
"type": "generated",
@@ -101,7 +101,7 @@
"iisHttpsPort": {
"type": "parameter",
"datatype": "integer",
- "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json. This option is only applicable when the parameter no-https is not used (no-https will be ignored if either IndividualAuth or OrganizationalAuth is used)."
+ "description": "Port number to use for the IIS Express HTTPS endpoint in launchSettings.json."
},
"iisHttpsPortGenerated": {
"type": "generated",
@@ -147,11 +147,15 @@
"description": "If specified, skips the automatic restore of the project on create.",
"defaultValue": "false"
},
+ "HasHttpsProfile": {
+ "type": "computed",
+ "value": "(!NoHttps)"
+ },
"NoHttps": {
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "description": "Whether to turn off HTTPS. This option only applies if Individual, IndividualB2C, SingleOrg, or MultiOrg aren't used for --auth."
+ "description": "Whether to turn off HTTPS."
}
},
"primaryOutputs": [
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs
index 0593d5111b..c6106e9333 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Program.fs
@@ -28,7 +28,7 @@ module Program =
let app = builder.Build()
-#if !NoHttps
+#if HasHttpsProfile
app.UseHttpsRedirection()
#endif
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Properties/launchSettings.json b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Properties/launchSettings.json
index e974bfdb61..645f69a938 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Properties/launchSettings.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/WebApi-FSharp/Properties/launchSettings.json
@@ -10,28 +10,36 @@
//#endif
"iisExpress": {
"applicationUrl": "http://localhost:8080",
- //#if(NoHttps)
- "sslPort": 0
- //#else
+ //#if (HasHttpsProfile)
"sslPort": 44300
+ //#else
+ "sslPort": 0
//#endif
}
},
"profiles": {
- "Company.WebApplication1": {
+ "http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "weatherforecast",
- //#if(NoHttps)
"applicationUrl": "http://localhost:5000",
- //#else
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ //#if (HasHttpsProfile)
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "weatherforecast",
"applicationUrl": "https://localhost:5001;http://localhost:5000",
- //#endif
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
+ //#endif
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/ide.host.json
index 59f260a583..d95c484e94 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/ide.host.json
@@ -1,12 +1,14 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 300,
"icon": "ide/Worker.png",
"supportsDocker": true,
"symbolInfo": [
{
"id": "UseProgramMain",
- "isVisible": true
+ "isVisible": true,
+ "persistenceScope": "shared",
+ "persistenceScopeName": "Microsoft"
}
]
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.cs.json
index 23507879a5..29750e73fb 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.cs.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Služba pracovního procesu",
+ "description": "Šablona prázdného projektu pro vytvoření služby Worker Service",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "symbols/UseProgramMain/displayName": "Nepoužívat _příkazy nejvyšší úrovně",
+ "symbols/UseProgramMain/description": "Určuje, jestli se má místo příkazů nejvyšší úrovně generovat explicitní třída Program a metoda Main.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.de.json
index 23507879a5..d95e32436e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.de.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "Workerdienst",
+ "description": "Eine leere Projektvorlage zum Erstellen eines Workerdiensts.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "symbols/UseProgramMain/displayName": "Keine Anweisungen_der obersten Ebene verwenden",
+ "symbols/UseProgramMain/description": "Gibt an, ob anstelle von Anweisungen der obersten Ebene eine explizite Programmklasse und eine Main-Methode generiert werden soll.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.en.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.en.json
index 859e306470..178995fcff 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.en.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.en.json
@@ -6,8 +6,9 @@
"symbols/Framework/description": "The target framework for the project.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
"symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Do not use top-level statements",
+ "symbols/UseProgramMain/displayName": "Do not use _top-level statements",
+ "_symbols/UseProgramMain/displayName.comment": "Use '_' as accelerator key when translating.",
"symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
"postActions/restore/description": "Restore NuGet packages required by this project.",
"postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
-} \ No newline at end of file
+}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.es.json
index 23507879a5..2068be4dd1 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.es.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
"name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "Una plantilla de proyecto vacía para crear un servicio Worker.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "symbols/UseProgramMain/displayName": "No usar instrucciones de _nivel superior",
+ "symbols/UseProgramMain/description": "Indica si se debe generar una clase Program explícita y un método Main en lugar de instrucciones de nivel superior.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.fr.json
index 23507879a5..9228c8c63b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.fr.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Service Worker",
+ "description": "Modèle de projet vide pour la création d'un service Worker.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "symbols/UseProgramMain/displayName": "N’utilisez pas _d’instructions de niveau supérieur.",
+ "symbols/UseProgramMain/description": "Indique s’il faut générer une classe Programme explicite et une méthode Main au lieu d’instructions de niveau supérieur.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.it.json
index 23507879a5..d962942420 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.it.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Servizio del ruolo di lavoro",
+ "description": "Modello di progetto vuoto per la creazione di un'istanza di Worker Service.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "symbols/UseProgramMain/displayName": "Non usare_istruzioni di primo livello",
+ "symbols/UseProgramMain/description": "Indica se generare una classe Program esplicita e un metodo Main anziché istruzioni di primo livello.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ja.json
index 23507879a5..93b3acbdab 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ja.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ワーカー サービス",
+ "description": "Worker Service を作成するための空のプロジェクト テンプレート。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "symbols/UseProgramMain/displayName": "最上位レベルのステートメントを使用しない(_T)",
+ "symbols/UseProgramMain/description": "最上位レベルのステートメントではなく、明示的な Program クラスと Main メソッドを生成するかどうか。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ko.json
index 23507879a5..d03226bfb0 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ko.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "작업자 서비스",
+ "description": "Worker Service를 만드는 데 사용하는 빈 프로젝트 템플릿입니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "symbols/UseProgramMain/displayName": "최상위 문 사용 안 함(_T)",
+ "symbols/UseProgramMain/description": "최상위 문 대신 명시적 Program 클래스 및 Main 메서드를 생성할지 여부입니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pl.json
index 23507879a5..cffa3d8ec4 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pl.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Usługa robocza",
+ "description": "Szablon pustego projektu służący do tworzenia usługi procesu roboczego.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "symbols/UseProgramMain/displayName": "Nie używaj ins_trukcji najwyższego poziomu",
+ "symbols/UseProgramMain/description": "Określa, czy wygenerować jawną klasę Program i metodę Main zamiast instrukcji najwyższego poziomu.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pt-BR.json
index 23507879a5..5284e2eb1c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Serviço de Trabalho",
+ "description": "Um modelo de projeto vazio para criar um worker service.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "symbols/UseProgramMain/displayName": "Não use ins_truções de nível superior",
+ "symbols/UseProgramMain/description": "Se deve gerar uma classe de Programa explícita e um método principal em vez de instruções de nível superior.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ru.json
index 23507879a5..e1d274726b 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.ru.json
@@ -1,13 +1,13 @@
-{
- "author": "Microsoft",
+{
+ "author": "Майкрософт",
"name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "Шаблон пустого проекта для создания службы Worker Service.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "symbols/UseProgramMain/displayName": "Не использовать _операторы верхнего уровня",
+ "symbols/UseProgramMain/description": "Следует ли создавать явный класс Program и метод Main вместо операторов верхнего уровня.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.tr.json
index 23507879a5..ddc87de7a5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.tr.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Çalışan Hizmeti",
+ "description": "Çalışan hizmeti oluşturmaya yönelik boş proje şablonu.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "symbols/UseProgramMain/displayName": "_Üst düzey deyimler kullanmayın",
+ "symbols/UseProgramMain/description": "Üst düzey deyimler yerine açık bir Program sınıfı ve Ana yöntem oluşturup oluşturulmayacağını belirtir.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json
index 23507879a5..ab998374f3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "辅助角色服务",
+ "description": "用于创建 worker service 的空项目模板。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "symbols/UseProgramMain/displayName": "不使用顶级语句(_T)",
+ "symbols/UseProgramMain/description": "是否生成显式程序类和主方法,而不是顶级语句。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hant.json
index 23507879a5..d5e6c2bc72 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,13 +1,13 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "symbols/UseProgramMain/displayName": "Use a Program class with a Main method",
- "symbols/UseProgramMain/description": "Whether to generate an explicit Program class and Main method instead of top-level statements.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "背景工作服務",
+ "description": "用於建立 Worker Service 的空白專案範本。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "symbols/UseProgramMain/displayName": "不要使用最上層陳述式(_T)",
+ "symbols/UseProgramMain/description": "是否要產生明確的 Program 類別和 Main 方法,而非最上層語句。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/template.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/template.json
index 5246a00539..fd3dadb0a5 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/template.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/.template.config/template.json
@@ -87,7 +87,7 @@
"type": "parameter",
"datatype": "bool",
"defaultValue": "false",
- "displayName": "Do not use top-level statements",
+ "displayName": "Do not use _top-level statements",
"description": "Whether to generate an explicit Program class and Main method instead of top-level statements."
}
},
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/Program.Main.cs b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/Program.Main.cs
index d69747f38d..10fac97af3 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/Program.Main.cs
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-CSharp/Program.Main.cs
@@ -1,6 +1,4 @@
-using Company.Application1;
-
-namespace Company.WebApplication1;
+namespace Company.Application1;
public class Program
{
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/ide.host.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/ide.host.json
index 13a025d034..fd74c67d5a 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/ide.host.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/ide.host.json
@@ -1,6 +1,6 @@
{
- "$schema": "http://json.schemastore.org/vs-2017.3.host",
+ "$schema": "http://json.schemastore.org/ide.host",
"order": 300,
"icon": "ide/Worker.png",
- "supportsDocker": true,
+ "supportsDocker": true
}
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.cs.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.cs.json
index 018f87d2e8..4f12749510 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.cs.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.cs.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Služba pracovního procesu",
+ "description": "Šablona prázdného projektu pro vytvoření služby Worker Service",
+ "symbols/ExcludeLaunchSettings/description": "Určuje, jestli se má z vygenerované šablony vyloučit soubor launchSettings.json.",
+ "symbols/Framework/description": "Cílová architektura pro projekt",
+ "symbols/Framework/choices/net7.0/description": "Cílový net7.0",
+ "symbols/skipRestore/description": "Pokud se tato možnost zadá, přeskočí automatické obnovení projektu při vytvoření.",
+ "postActions/restore/description": "Obnoví balíčky NuGet vyžadované tímto projektem.",
+ "postActions/restore/manualInstructions/default/text": "Spustit dotnet restore"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.de.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.de.json
index 018f87d2e8..e1c4c9b49d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.de.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.de.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
+ "name": "Workerdienst",
+ "description": "Eine leere Projektvorlage zum Erstellen eines Workerdiensts.",
+ "symbols/ExcludeLaunchSettings/description": "Ob launchSettings.json aus der generierten Vorlage ausgeschlossen werden soll.",
+ "symbols/Framework/description": "Das Zielframework für das Projekt.",
"symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "symbols/skipRestore/description": "Wenn angegeben, wird die automatische Wiederherstellung des Projekts beim Erstellen übersprungen.",
+ "postActions/restore/description": "„NuGet-Pakete“ wiederherstellen, die für dieses Projekt erforderlich sind.",
+ "postActions/restore/manualInstructions/default/text": "„dotnet restore“ ausführen"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.es.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.es.json
index 018f87d2e8..9b12e19175 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.es.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.es.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
"name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "Una plantilla de proyecto vacía para crear un servicio Worker.",
+ "symbols/ExcludeLaunchSettings/description": "Indica si se va a excluir launchSettings.json de la plantilla generada.",
+ "symbols/Framework/description": "Marco de destino del proyecto.",
+ "symbols/Framework/choices/net7.0/description": "Objetivo net7.0",
+ "symbols/skipRestore/description": "Si se especifica, se omite la restauración automática del proyecto durante la creación.",
+ "postActions/restore/description": "Restaure los paquetes NuGet necesarios para este proyecto.",
+ "postActions/restore/manualInstructions/default/text": "Ejecutar \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.fr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.fr.json
index 018f87d2e8..a11a43b6dd 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.fr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.fr.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Service Worker",
+ "description": "Modèle de projet vide pour la création d'un service Worker.",
+ "symbols/ExcludeLaunchSettings/description": "Indique s’il faut exclure launchSettings.json du modèle généré.",
+ "symbols/Framework/description": "Framework cible du projet.",
+ "symbols/Framework/choices/net7.0/description": "Cible net7.0",
+ "symbols/skipRestore/description": "S’il est spécifié, ignore la restauration automatique du projet lors de la création.",
+ "postActions/restore/description": "Restaurez les packages NuGet requis par ce projet.",
+ "postActions/restore/manualInstructions/default/text": "Exécuter « dotnet restore »"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.it.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.it.json
index 018f87d2e8..9efb989881 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.it.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.it.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Servizio del ruolo di lavoro",
+ "description": "Modello di progetto vuoto per la creazione di un'istanza di Worker Service.",
+ "symbols/ExcludeLaunchSettings/description": "Indica se escludere launchSettings.json dal modello generato.",
+ "symbols/Framework/description": "Il framework di destinazione per il progetto.",
+ "symbols/Framework/choices/net7.0/description": "Destinazione net7.0",
+ "symbols/skipRestore/description": "Se specificato, ignora il ripristino automatico del progetto durante la creazione.",
+ "postActions/restore/description": "Ripristina i pacchetti NuGet richiesti da questo progetto.",
+ "postActions/restore/manualInstructions/default/text": "Esegui 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ja.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ja.json
index 018f87d2e8..0d42321e3e 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ja.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ja.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "ワーカー サービス",
+ "description": "Worker Service を作成するための空のプロジェクト テンプレート。",
+ "symbols/ExcludeLaunchSettings/description": "生成されたテンプレートから launchSettings.json を除外するかどうか。",
+ "symbols/Framework/description": "プロジェクトのターゲット フレームワークです。",
+ "symbols/Framework/choices/net7.0/description": "ターゲット net7.0",
+ "symbols/skipRestore/description": "指定した場合、作成時にプロジェクトの自動復元がスキップされます。",
+ "postActions/restore/description": "このプロジェクトに必要な NuGet パッケージを復元します。",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' を実行する"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ko.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ko.json
index 018f87d2e8..1ec30c1086 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ko.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ko.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "작업자 서비스",
+ "description": "Worker Service를 만드는 데 사용하는 빈 프로젝트 템플릿입니다.",
+ "symbols/ExcludeLaunchSettings/description": "생성된 템플릿에서 launchSettings.json을 제외할지 여부입니다.",
+ "symbols/Framework/description": "프로젝트에 대한 대상 프레임워크입니다.",
+ "symbols/Framework/choices/net7.0/description": "대상 net7.0",
+ "symbols/skipRestore/description": "지정된 경우, 프로젝트 생성 시 자동 복원을 건너뜁니다.",
+ "postActions/restore/description": "이 프로젝트에 필요한 NuGet 패키지를 복원합니다.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' 실행"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pl.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pl.json
index 018f87d2e8..f9a32c6fef 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pl.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pl.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Usługa robocza",
+ "description": "Szablon pustego projektu służący do tworzenia usługi procesu roboczego.",
+ "symbols/ExcludeLaunchSettings/description": "Określa, czy wykluczyć plik launchSettings.json z wygenerowanego szablonu.",
+ "symbols/Framework/description": "Platforma docelowa dla tego projektu.",
+ "symbols/Framework/choices/net7.0/description": "Docelowe środowisko net7.0",
+ "symbols/skipRestore/description": "Jeśli ta opcja jest określona, pomija automatyczne przywracanie projektu podczas tworzenia.",
+ "postActions/restore/description": "Przywróć pakiety NuGet wymagane przez ten projekt.",
+ "postActions/restore/manualInstructions/default/text": "Uruchom polecenie \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pt-BR.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pt-BR.json
index 018f87d2e8..14c471994d 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pt-BR.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.pt-BR.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Serviço de Trabalho",
+ "description": "Um modelo de projeto vazio para criar um worker service.",
+ "symbols/ExcludeLaunchSettings/description": "Se deve excluir launchSettings.json do modelo gerado.",
+ "symbols/Framework/description": "A estrutura de destino do projeto.",
+ "symbols/Framework/choices/net7.0/description": "Alvo .NET7.0",
+ "symbols/skipRestore/description": "Se especificado, ignora a restauração automática do projeto sendo criado.",
+ "postActions/restore/description": "Restaure os pacotes NuGet exigidos por este projeto.",
+ "postActions/restore/manualInstructions/default/text": "Executar 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ru.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ru.json
index 018f87d2e8..c77334d2bd 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ru.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.ru.json
@@ -1,11 +1,11 @@
-{
- "author": "Microsoft",
+{
+ "author": "Майкрософт",
"name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "description": "Шаблон пустого проекта для создания службы Worker Service.",
+ "symbols/ExcludeLaunchSettings/description": "Следует ли исключить launchSettings.json из созданного шаблона.",
+ "symbols/Framework/description": "Целевая платформа для проекта.",
+ "symbols/Framework/choices/net7.0/description": "Целевая версия net7.0",
+ "symbols/skipRestore/description": "Если установлено, автоматическое восстановление проекта при создании пропускается.",
+ "postActions/restore/description": "Восстановление пакетов NuGet, необходимых для этого проекта.",
+ "postActions/restore/manualInstructions/default/text": "Выполнить команду \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.tr.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.tr.json
index 018f87d2e8..d0b6b53c84 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.tr.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.tr.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "Çalışan Hizmeti",
+ "description": "Çalışan hizmeti oluşturmaya yönelik boş proje şablonu.",
+ "symbols/ExcludeLaunchSettings/description": "launchSettings.json öğesinin oluşturulan şablondan dışlanıp dışlanmayacağı.",
+ "symbols/Framework/description": "Projenin hedef çerçevesi.",
+ "symbols/Framework/choices/net7.0/description": "Hedef net7.0",
+ "symbols/skipRestore/description": "Belirtilirse, oluşturma sırasında projenin otomatik geri yüklenmesini atlar.",
+ "postActions/restore/description": "Bu projenin gerektirdiği NuGet paketlerini geri yükleyin.",
+ "postActions/restore/manualInstructions/default/text": "'dotnet restore' çalıştır"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json
index 018f87d2e8..ab217cb05c 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hans.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "辅助角色服务",
+ "description": "用于创建 worker service 的空项目模板。",
+ "symbols/ExcludeLaunchSettings/description": "是否从生成的模板中排除 launchSettings.json。",
+ "symbols/Framework/description": "项目的目标框架。",
+ "symbols/Framework/choices/net7.0/description": "目标 net7.0",
+ "symbols/skipRestore/description": "如果指定,则在创建时跳过项目的自动还原。",
+ "postActions/restore/description": "还原此项目所需的 NuGet 包。",
+ "postActions/restore/manualInstructions/default/text": "运行 \"dotnet restore\""
} \ No newline at end of file
diff --git a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hant.json b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hant.json
index 018f87d2e8..b8718216c8 100644
--- a/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hant.json
+++ b/src/ProjectTemplates/Web.ProjectTemplates/content/Worker-FSharp/.template.config/localize/templatestrings.zh-Hant.json
@@ -1,11 +1,11 @@
-{
+{
"author": "Microsoft",
- "name": "Worker Service",
- "description": "An empty project template for creating a worker service.",
- "symbols/ExcludeLaunchSettings/description": "Whether to exclude launchSettings.json from the generated template.",
- "symbols/Framework/description": "The target framework for the project.",
- "symbols/Framework/choices/net7.0/description": "Target net7.0",
- "symbols/skipRestore/description": "If specified, skips the automatic restore of the project on create.",
- "postActions/restore/description": "Restore NuGet packages required by this project.",
- "postActions/restore/manualInstructions/default/text": "Run 'dotnet restore'"
+ "name": "背景工作服務",
+ "description": "用於建立 Worker Service 的空白專案範本。",
+ "symbols/ExcludeLaunchSettings/description": "是否要從產生的範本排除 launchSettings.json。",
+ "symbols/Framework/description": "專案的目標 Framework。",
+ "symbols/Framework/choices/net7.0/description": "目標 net7.0",
+ "symbols/skipRestore/description": "若指定,會在建立時跳過專案的自動還原。",
+ "postActions/restore/description": "還原此專案所需的 NuGet 套件。",
+ "postActions/restore/manualInstructions/default/text": "執行 'dotnet restore'"
} \ No newline at end of file
diff --git a/src/ProjectTemplates/scripts/.gitignore b/src/ProjectTemplates/scripts/.gitignore
index 60f1c8f0fd..e45d4e1638 100644
--- a/src/ProjectTemplates/scripts/.gitignore
+++ b/src/ProjectTemplates/scripts/.gitignore
@@ -1,17 +1,2 @@
package-lock.json
-tmp/
-CustomHive/
-angular/
-blazorserver/
-blazorwasm/
-mvc/
-mvcorgauth/
-razor/
-react/
-reactredux/
-web/
-webapp/
-webapi/
-webapimin/
-worker/
-grpc/ \ No newline at end of file
+**/
diff --git a/src/ProjectTemplates/scripts/Run-WebApiProgamMainMinimal-Locally.ps1 b/src/ProjectTemplates/scripts/Run-WebApiProgamMainMinimal-Locally.ps1
new file mode 100644
index 0000000000..e4c2eb0f36
--- /dev/null
+++ b/src/ProjectTemplates/scripts/Run-WebApiProgamMainMinimal-Locally.ps1
@@ -0,0 +1,12 @@
+#!/usr/bin/env pwsh
+#requires -version 4
+
+[CmdletBinding(PositionalBinding = $false)]
+param()
+
+Set-StrictMode -Version 2
+$ErrorActionPreference = 'Stop'
+
+. $PSScriptRoot\Test-Template.ps1
+
+Test-Template "webapi" "webapi --use-program-main --use-minimal-apis" "Microsoft.DotNet.Web.ProjectTemplates.7.0.7.0.0-dev.nupkg" $false
diff --git a/src/ProjectTemplates/scripts/Test-Template.ps1 b/src/ProjectTemplates/scripts/Test-Template.ps1
index 1774b47735..a12b07b79a 100644
--- a/src/ProjectTemplates/scripts/Test-Template.ps1
+++ b/src/ProjectTemplates/scripts/Test-Template.ps1
@@ -21,7 +21,7 @@ function Test-Template($templateName, $templateArgs, $templateNupkg, $isBlazorWa
Pop-Location
}
- Run-DotnetNew "--install", "$PSScriptRoot/../../../artifacts/packages/Debug/Shipping/$templateNupkg"
+ Run-DotnetNew "install", "$PSScriptRoot/../../../artifacts/packages/Debug/Shipping/$templateNupkg"
New-Item -ErrorAction Ignore -Path $tmpDir -ItemType Directory
Push-Location $tmpDir
@@ -47,10 +47,10 @@ function Test-Template($templateName, $templateArgs, $templateNupkg, $isBlazorWa
foreach ($projPath in $proj) {
$projContent = Get-Content -Path $projPath -Raw
if ($isBlazorWasmHosted) {
- $importPath = "$PSScriptRoot/../test/bin/Debug/net7.0/TestTemplates"
+ $importPath = "$PSScriptRoot/../test/Templates.Tests/bin/Debug/net7.0/TestTemplates"
}
else {
- $importPath = "$PSScriptRoot/../test/bin/Debug/net7.0/TestTemplates"
+ $importPath = "$PSScriptRoot/../test/Templates.Tests/bin/Debug/net7.0/TestTemplates"
}
$projContent = $projContent -replace ('(?:<Project Sdk="Microsoft.NET.(?<SdkSuffix>Sdk\.\w+)">)', ('<Project Sdk="Microsoft.NET.${SdkSuffix}">
<Import Project="' + $importPath + '/Directory.Build.props" />
@@ -65,7 +65,7 @@ function Test-Template($templateName, $templateArgs, $templateNupkg, $isBlazorWa
Push-Location Server
}
if ($templateArgs -match '-au') {
- dotnet.exe ef migrations add mvc
+ dotnet.exe ef migrations add Initial
}
dotnet.exe publish --configuration Release
Set-Location .\bin\Release\net7.0\publish
diff --git a/src/ProjectTemplates/test/BlazorServerTemplateTest.cs b/src/ProjectTemplates/test/BlazorServerTemplateTest.cs
deleted file mode 100644
index 92120b20fb..0000000000
--- a/src/ProjectTemplates/test/BlazorServerTemplateTest.cs
+++ /dev/null
@@ -1,52 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Testing;
-using Templates.Test.Helpers;
-using Xunit;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Templates.Test;
-
-public class BlazorServerTemplateTest : BlazorTemplateTest
-{
- public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory)
- : base(projectFactory)
- {
- }
-
- public override string ProjectType { get; } = "blazorserver";
-
- [Fact]
- public Task BlazorServerTemplateWorks_NoAuth() => CreateBuildPublishAsync("blazorservernoauth");
-
- [Fact]
- public Task BlazorServerTemplateWorks_ProgamMainNoAuth() => CreateBuildPublishAsync("blazorservernoauth", args: new [] { "--use-program-main" });
-
- [Theory]
- [InlineData(true, null)]
- [InlineData(true, new string[] { "--use-program-main" })]
- [InlineData(false, null)]
- [InlineData(false, new string[] { "--use-program-main" })]
- [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")]
- public Task BlazorServerTemplateWorks_IndividualAuth(bool useLocalDB, string[] args) => CreateBuildPublishAsync("blazorserverindividual" + (useLocalDB ? "uld" : "", args: args));
-
- [Theory]
- [InlineData("IndividualB2C", null)]
- [InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("IndividualB2C", new string[] { "--use-program-main", "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", null)]
- [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--use-program-main --called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--calls-graph" })]
- [InlineData("SingleOrg", new string[] { "--use-program-main --calls-graph" })]
- public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish(string auth, string[] args)
- => CreateBuildPublishAsync("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), auth, args);
-
-}
diff --git a/src/ProjectTemplates/test/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/test/BlazorWasmTemplateTest.cs
deleted file mode 100644
index aad7638674..0000000000
--- a/src/ProjectTemplates/test/BlazorWasmTemplateTest.cs
+++ /dev/null
@@ -1,253 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Text.Json;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Testing;
-using Newtonsoft.Json.Linq;
-using Templates.Test.Helpers;
-using Xunit;
-using Xunit.Abstractions;
-using Xunit.Sdk;
-
-namespace Templates.Test;
-
-public class BlazorWasmTemplateTest : BlazorTemplateTest
-{
- public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory)
- : base(projectFactory) { }
-
- public override string ProjectType { get; } = "blazorwasm";
-
- [Fact]
- public async Task BlazorWasmStandaloneTemplateCanCreateBuildPublish()
- {
- var project = await CreateBuildPublishAsync("blazorstandalone");
-
- // The service worker assets manifest isn't generated for non-PWA projects
- var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
- Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js");
- }
-
- [Fact]
- public Task BlazorWasmHostedTemplateCanCreateBuildPublish() => CreateBuildPublishAsync("blazorhosted", args: new[] { "--hosted" }, serverProject: true);
-
- [Fact]
- public Task BlazorWasmHostedTemplateWithProgamMainCanCreateBuildPublish() => CreateBuildPublishAsync("blazorhosted", args: new[] { "--use-program-main", "--hosted" }, serverProject: true);
-
- [Fact]
- public Task BlazorWasmStandalonePwaTemplateCanCreateBuildPublish() => CreateBuildPublishAsync("blazorstandalonepwa", args: new[] { "--pwa" });
-
- [Fact]
- public async Task BlazorWasmHostedPwaTemplateCanCreateBuildPublish()
- {
- var project = await CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true);
-
- var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
-
- ValidatePublishedServiceWorker(serverProject);
- }
-
- private void ValidatePublishedServiceWorker(Project project)
- {
- var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
-
- // When publishing the PWA template, we generate an assets manifest
- // and move service-worker.published.js to overwrite service-worker.js
- Assert.False(File.Exists(Path.Combine(publishDir, "service-worker.published.js")), "service-worker.published.js should not be published");
- Assert.True(File.Exists(Path.Combine(publishDir, "service-worker.js")), "service-worker.js should be published");
- Assert.True(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "service-worker-assets.js should be published");
-
- // We automatically append the SWAM version as a comment in the published service worker file
- var serviceWorkerAssetsManifestContents = ReadFile(publishDir, "service-worker-assets.js");
- var serviceWorkerContents = ReadFile(publishDir, "service-worker.js");
-
- // Parse the "version": "..." value from the SWAM, and check it's in the service worker
- var serviceWorkerAssetsManifestVersionMatch = new Regex(@"^\s*\""version\"":\s*(\""[^\""]+\"")", RegexOptions.Multiline)
- .Match(serviceWorkerAssetsManifestContents);
- Assert.True(serviceWorkerAssetsManifestVersionMatch.Success);
- var serviceWorkerAssetsManifestVersionJson = serviceWorkerAssetsManifestVersionMatch.Groups[1].Captures[0].Value;
- var serviceWorkerAssetsManifestVersion = JsonSerializer.Deserialize<string>(serviceWorkerAssetsManifestVersionJson);
- Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal));
- }
-
- [ConditionalFact]
- [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
- // LocalDB doesn't work on non Windows platforms
- [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
- public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB()
- => BlazorWasmHostedTemplate_IndividualAuth_Works(true);
-
- [ConditionalFact]
- [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
- public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB()
- => BlazorWasmHostedTemplate_IndividualAuth_Works(false);
-
- private async Task<Project> CreateBuildPublishIndividualAuthProject(bool useLocalDb)
- {
- // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
- Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");
-
- var project = await CreateBuildPublishAsync("blazorhostedindividual" + (useLocalDb ? "uld" : ""),
- args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" });
-
- var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
-
- var serverProjectFileContents = ReadFile(serverProject.TemplateOutputDir, $"{serverProject.ProjectName}.csproj");
- if (!useLocalDb)
- {
- Assert.Contains(".db", serverProjectFileContents);
- }
-
- var appSettings = ReadFile(serverProject.TemplateOutputDir, "appsettings.json");
- var element = JsonSerializer.Deserialize<JsonElement>(appSettings);
- var clientsProperty = element.GetProperty("IdentityServer").EnumerateObject().Single().Value.EnumerateObject().Single();
- var replacedSection = element.GetRawText().Replace(clientsProperty.Name, serverProject.ProjectName.Replace(".Server", ".Client"));
- var appSettingsPath = Path.Combine(serverProject.TemplateOutputDir, "appsettings.json");
- File.WriteAllText(appSettingsPath, replacedSection);
-
- var publishResult = await serverProject.RunDotNetPublishAsync();
- Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult));
-
- // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
- // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
- // later, while the opposite is not true.
-
- var buildResult = await serverProject.RunDotNetBuildAsync();
- Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult));
-
- var migrationsResult = await serverProject.RunDotNetEfCreateMigrationAsync("blazorwasm");
- Assert.True(0 == migrationsResult.ExitCode, ErrorMessages.GetFailedProcessMessage("run EF migrations", serverProject, migrationsResult));
- serverProject.AssertEmptyMigration("blazorwasm");
-
- return project;
- }
-
- private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(bool useLocalDb)
- {
- var project = await CreateBuildPublishIndividualAuthProject(useLocalDb: useLocalDb);
-
- var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
- }
-
- [Fact]
- public async Task BlazorWasmStandaloneTemplate_IndividualAuth_CreateBuildPublish()
- {
- var project = await CreateBuildPublishAsync("blazorstandaloneindividual", args: new[] {
- "-au",
- "Individual",
- "--authority",
- "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
- "--client-id",
- "sample-client-id"
- });
- }
-
- public static TheoryData<TemplateInstance> TemplateData => new TheoryData<TemplateInstance>
- {
- new TemplateInstance(
- "blazorwasmhostedaadb2c", "-ho",
- "-au", "IndividualB2C",
- "--aad-b2c-instance", "example.b2clogin.com",
- "-ssp", "b2c_1_siupin",
- "--client-id", "clientId",
- "--domain", "my-domain",
- "--default-scope", "full",
- "--app-id-uri", "ApiUri",
- "--api-client-id", "1234123413241324"),
- new TemplateInstance(
- "blazorwasmhostedaad", "-ho",
- "-au", "SingleOrg",
- "--domain", "my-domain",
- "--tenant-id", "tenantId",
- "--client-id", "clientId",
- "--default-scope", "full",
- "--app-id-uri", "ApiUri",
- "--api-client-id", "1234123413241324"),
- new TemplateInstance(
- "blazorwasmhostedaadgraph", "-ho",
- "-au", "SingleOrg",
- "--calls-graph",
- "--domain", "my-domain",
- "--tenant-id", "tenantId",
- "--client-id", "clientId",
- "--default-scope", "full",
- "--app-id-uri", "ApiUri",
- "--api-client-id", "1234123413241324"),
- new TemplateInstance(
- "blazorwasmhostedaadapi", "-ho",
- "-au", "SingleOrg",
- "--called-api-url", "\"https://graph.microsoft.com\"",
- "--called-api-scopes", "user.readwrite",
- "--domain", "my-domain",
- "--tenant-id", "tenantId",
- "--client-id", "clientId",
- "--default-scope", "full",
- "--app-id-uri", "ApiUri",
- "--api-client-id", "1234123413241324"),
- new TemplateInstance(
- "blazorwasmstandaloneaadb2c",
- "-au", "IndividualB2C",
- "--aad-b2c-instance", "example.b2clogin.com",
- "-ssp", "b2c_1_siupin",
- "--client-id", "clientId",
- "--domain", "my-domain"),
- new TemplateInstance(
- "blazorwasmstandaloneaad",
- "-au", "SingleOrg",
- "--domain", "my-domain",
- "--tenant-id", "tenantId",
- "--client-id", "clientId"),
- };
-
- public class TemplateInstance
- {
- public TemplateInstance(string name, params string[] arguments)
- {
- Name = name;
- Arguments = arguments;
- }
-
- public string Name { get; }
- public string[] Arguments { get; }
- }
-
- [Theory]
- [MemberData(nameof(TemplateData))]
- public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_Works(TemplateInstance instance)
- => CreateBuildPublishAsync(instance.Name, args: instance.Arguments, targetFramework: "netstandard2.1");
-
- private string ReadFile(string basePath, string path)
- {
- var fullPath = Path.Combine(basePath, path);
- var doesExist = File.Exists(fullPath);
-
- Assert.True(doesExist, $"Expected file to exist, but it doesn't: {path}");
- return File.ReadAllText(Path.Combine(basePath, path));
- }
-
- private void UpdatePublishedSettings(Project serverProject)
- {
- // Hijack here the config file to use the development key during publish.
- var appSettings = JObject.Parse(File.ReadAllText(Path.Combine(serverProject.TemplateOutputDir, "appsettings.json")));
- var appSettingsDevelopment = JObject.Parse(File.ReadAllText(Path.Combine(serverProject.TemplateOutputDir, "appsettings.Development.json")));
- ((JObject)appSettings["IdentityServer"]).Merge(appSettingsDevelopment["IdentityServer"]);
- ((JObject)appSettings["IdentityServer"]).Merge(new
- {
- IdentityServer = new
- {
- Key = new
- {
- FilePath = "./tempkey.json"
- }
- }
- });
- var testAppSettings = appSettings.ToString();
- File.WriteAllText(Path.Combine(serverProject.TemplatePublishDir, "appsettings.json"), testAppSettings);
- }
-}
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/.gitattributes b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/.gitattributes
index 300e504f3e..300e504f3e 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/.gitattributes
+++ b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/.gitattributes
diff --git a/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/BlazorServerTemplateTest.cs
new file mode 100644
index 0000000000..4d805e4326
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/BlazorServerTemplateTest.cs
@@ -0,0 +1,93 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Templates.Test.Helpers;
+using Xunit;
+using Xunit.Abstractions;
+using Xunit.Sdk;
+
+namespace Templates.Blazor.Test;
+
+public class BlazorServerTemplateTest : BlazorTemplateTest
+{
+ public BlazorServerTemplateTest(ProjectFactoryFixture projectFactory)
+ : base(projectFactory)
+ {
+ }
+
+ public override string ProjectType { get; } = "blazorserver";
+
+ [Fact]
+ public Task BlazorServerTemplateWorks_NoAuth() => CreateBuildPublishAsync();
+
+ [Fact]
+ public Task BlazorServerTemplate_NoHttps_Works_NoAuth() => CreateBuildPublishAsync(args: new[] { ArgConstants.NoHttps });
+
+ [Fact]
+ public Task BlazorServerTemplateWorks_ProgamMainNoAuth() => CreateBuildPublishAsync(args: new[] { ArgConstants.UseProgramMain });
+
+ [Fact]
+ public Task BlazorServerTemplate_NoHttps_Works_ProgamMainNoAuth() => CreateBuildPublishAsync(args: new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps});
+
+ [ConditionalTheory]
+ [InlineData("Individual", null)]
+ [InlineData("Individual", new [] { ArgConstants.UseProgramMain })]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")]
+ public Task BlazorServerTemplateWorks_IndividualAuth(string auth, string[] args) => CreateBuildPublishAsync(auth, args: args);
+
+ [ConditionalTheory]
+ [InlineData("Individual", new[] { ArgConstants.NoHttps })]
+ [InlineData("Individual", new [] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")]
+ public Task BlazorServerTemplateWorks_IndividualAuth_NoHttps(string auth, string[] args) => CreateBuildPublishAsync(auth, args: args);
+
+ [ConditionalTheory]
+ [InlineData("Individual", new [] { ArgConstants.UseLocalDb })]
+ [InlineData("Individual", new [] { ArgConstants.UseProgramMain, ArgConstants.UseLocalDb })]
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX, SkipReason = "No LocalDb on non-Windows")]
+ public Task BlazorServerTemplateWorks_IndividualAuth_LocalDb(string auth, string[] args) => CreateBuildPublishAsync(auth, args: args);
+
+ [ConditionalTheory]
+ [InlineData("Individual", new[] { ArgConstants.UseLocalDb, ArgConstants.NoHttps })]
+ [InlineData("Individual", new[] { ArgConstants.UseProgramMain, ArgConstants.UseLocalDb, ArgConstants.NoHttps })]
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX, SkipReason = "No LocalDb on non-Windows")]
+ public Task BlazorServerTemplateWorks_IndividualAuth_NoHttps_LocalDb(string auth, string[] args) => CreateBuildPublishAsync(auth, args: args);
+
+ [Theory]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish_IndividualB2C(string auth, string[] args) => CreateBuildPublishAsync(auth, args);
+
+ [Theory]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish_IndividualB2C_NoHttps(string auth, string[] args) => CreateBuildPublishAsync(auth, args);
+
+ [Theory]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CallsGraph })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph })]
+ public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish_SingleOrg(string auth, string[] args) => CreateBuildPublishAsync(auth, args);
+
+ [Theory]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish_SingleOrg_NoHttps(string auth, string[] args) => CreateBuildPublishAsync(auth, args);
+}
diff --git a/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/EmptyBlazorServerTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/EmptyBlazorServerTemplateTest.cs
new file mode 100644
index 0000000000..7886d95a03
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/EmptyBlazorServerTemplateTest.cs
@@ -0,0 +1,31 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Templates.Test.Helpers;
+using Xunit;
+using Xunit.Abstractions;
+using Xunit.Sdk;
+
+namespace Templates.Blazor.Test;
+
+public class EmptyBlazorServerTemplateTest : BlazorTemplateTest
+{
+ public EmptyBlazorServerTemplateTest(ProjectFactoryFixture projectFactory)
+ : base(projectFactory)
+ {
+ }
+
+ public override string ProjectType { get; } = "blazorserver-empty";
+
+ [Fact]
+ public Task EmptyBlazorServerTemplateWorks() => CreateBuildPublishAsync();
+
+ [Fact]
+ public Task EmptyBlazorServerTemplate_NoHttps_Works() => CreateBuildPublishAsync(args: new[] { ArgConstants.NoHttps });
+}
diff --git a/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/Templates.Blazor.Server.Tests.csproj b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/Templates.Blazor.Server.Tests.csproj
new file mode 100644
index 0000000000..cd2998c778
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.Server.Tests/Templates.Blazor.Server.Tests.csproj
@@ -0,0 +1,68 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <!-- Shared testing infrastructure for running E2E tests using selenium -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="$(SharedSourceRoot)E2ETesting\E2ETesting.props" />
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <TestGroupName>ProjectTemplates.Blazor.Server.Tests</TestGroupName>
+ <DefineConstants>$(DefineConstants);XPLAT</DefineConstants>
+
+ <RunTemplateTests Condition="'$(RunTemplateTests)' == ''">true</RunTemplateTests>
+ <SkipTests Condition="'$(RunTemplateTests)' != 'true'">true</SkipTests>
+
+ <BaseOutputPath />
+ <OutputPath />
+
+ <!-- Properties that affect test runs -->
+ <!-- TestTemplateCreationFolder is the folder where the templates will be created. Will point out to $(OutputDir)$(TestTemplateCreationFolder) -->
+ <TestTemplateCreationFolder>TestTemplates\</TestTemplateCreationFolder>
+ <RestoreFolderName>Server</RestoreFolderName>
+ <TestDependsOnAspNetPackages>true</TestDependsOnAspNetPackages>
+ <SkipHelixQueues>
+ $(HelixQueueArmDebian11);
+ </SkipHelixQueues>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)CertificateGeneration\**\*.cs" LinkBase="shared\CertificateGeneration" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="shared\Process" />
+ <Compile Include="..\..\Shared\**" LinkBase="Helpers" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <!-- We need the actual templates in the output directory for tests to verify file encodings. -->
+ <Content Include="..\..\Web.ProjectTemplates\**" LinkBase="Assets\Web.ProjectTemplates" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <HelixContent Include="$(OutputPath)$(TargetFramework)Assets\**" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="AngleSharp" />
+ <Reference Include="System.Net.Http" />
+ <ProjectReference Include="$(RepoRoot)src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+
+ <ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
+ <ProjectReference Include="$(RepoRoot)src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj" />
+ <ProjectReference Include="../../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+ </ItemGroup>
+
+ <PropertyGroup>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == '' AND '$(ContinuousIntegrationBuild)' == 'true'">true</PreserveExistingLogsInOutput>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == ''">false</PreserveExistingLogsInOutput>
+ </PropertyGroup>
+
+ <!-- Shared testing infrastructure for running E2E tests -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="..\..\TestInfrastructure\PrepareForTest.targets" />
+</Project>
diff --git a/src/ProjectTemplates/test/.gitattributes b/src/ProjectTemplates/test/Templates.Blazor.Tests/.gitattributes
index 300e504f3e..300e504f3e 100644
--- a/src/ProjectTemplates/test/.gitattributes
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/.gitattributes
diff --git a/src/ProjectTemplates/test/Templates.Blazor.Tests/.npmrc b/src/ProjectTemplates/test/Templates.Blazor.Tests/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorServerTemplateTest.cs
index 1a04fd77aa..5681de7306 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorServerTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorServerTemplateTest.cs
@@ -29,7 +29,7 @@ public class BlazorServerTemplateTest : BlazorTemplateTest
[InlineData(BrowserKind.Chromium)]
public async Task BlazorServerTemplateWorks_NoAuth(BrowserKind browserKind)
{
- var project = await CreateBuildPublishAsync("blazorservernoauth" + browserKind);
+ var project = await CreateBuildPublishAsync();
await using var browser = BrowserManager.IsAvailable(browserKind) ?
await BrowserManager.GetBrowserInstance(browserKind, BrowserContextInfo) :
@@ -83,9 +83,9 @@ public class BlazorServerTemplateTest : BlazorTemplateTest
[Theory(Skip = "https://github.com/dotnet/aspnetcore/issues/30882")]
[MemberData(nameof(BlazorServerTemplateWorks_IndividualAuthData))]
[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/30825", Queues = "All.OSX")]
- public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind, bool useLocalDB)
+ public async Task BlazorServerTemplateWorks_IndividualAuth(BrowserKind browserKind)
{
- var project = await CreateBuildPublishAsync("blazorserverindividual" + browserKind + (useLocalDB ? "uld" : ""));
+ var project = await CreateBuildPublishAsync();
var browser = !BrowserManager.IsAvailable(browserKind) ?
null :
@@ -182,10 +182,10 @@ public class BlazorServerTemplateTest : BlazorTemplateTest
[Theory(Skip = "https://github.com/dotnet/aspnetcore/issues/30882")]
[InlineData("IndividualB2C", null)]
- [InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
+ [InlineData("IndividualB2C", new [] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
[InlineData("SingleOrg", null)]
- [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--calls-graph" })]
+ [InlineData("SingleOrg", new [] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
+ [InlineData("SingleOrg", new [] { "--calls-graph" })]
public Task BlazorServerTemplate_IdentityWeb_BuildAndPublish(string auth, string[] args)
- => CreateBuildPublishAsync("blazorserveridweb" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), auth, args);
+ => CreateBuildPublishAsync(auth, args);
}
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs
index ef2af1f071..8ea4077007 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorTemplateTest.cs
@@ -24,12 +24,12 @@ public abstract class BlazorTemplateTest : BrowserTestBase
public abstract string ProjectType { get; }
- protected async Task<Project> CreateBuildPublishAsync(string projectName, string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false)
+ protected async Task<Project> CreateBuildPublishAsync(string auth = null, string[] args = null, string targetFramework = null, bool serverProject = false, bool onlyCreate = false)
{
// Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");
- var project = await ProjectFactory.GetOrCreateProject(projectName, Output);
+ var project = await ProjectFactory.CreateProject(Output);
if (targetFramework != null)
{
project.TargetFramework = targetFramework;
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWasmTemplateTest.cs
index 75107526b6..a19b659670 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorWasmTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/BlazorWasmTemplateTest.cs
@@ -27,7 +27,7 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
[InlineData(BrowserKind.Chromium)]
public async Task BlazorWasmStandaloneTemplate_Works(BrowserKind browserKind)
{
- var project = await CreateBuildPublishAsync("blazorstandalone" + browserKind);
+ var project = await CreateBuildPublishAsync();
// The service worker assets manifest isn't generated for non-PWA projects
var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
@@ -63,7 +63,7 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
[InlineData(BrowserKind.Chromium)]
public async Task BlazorWasmHostedTemplate_Works(BrowserKind browserKind)
{
- var project = await CreateBuildPublishAsync("blazorhosted" + BrowserKind.Chromium, args: new[] { "--hosted" }, serverProject: true);
+ var project = await CreateBuildPublishAsync(args: new[] { "--hosted" }, serverProject: true);
var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
@@ -111,7 +111,7 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
[InlineData(BrowserKind.Chromium)]
public async Task BlazorWasmStandalonePwaTemplate_Works(BrowserKind browserKind)
{
- var project = await CreateBuildPublishAsync("blazorstandalonepwa", args: new[] { "--pwa" });
+ var project = await CreateBuildPublishAsync(args: new[] { "--pwa" });
await BuildAndRunTest(project.ProjectName, project, browserKind);
@@ -146,7 +146,7 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
[InlineData(BrowserKind.Chromium)]
public async Task BlazorWasmHostedPwaTemplate_Works(BrowserKind browserKind)
{
- var project = await CreateBuildPublishAsync("blazorhostedpwa", args: new[] { "--hosted", "--pwa" }, serverProject: true);
+ var project = await CreateBuildPublishAsync(args: new[] { "--hosted", "--pwa" }, serverProject: true);
var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
@@ -226,13 +226,12 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB(BrowserKind browserKind)
=> BlazorWasmHostedTemplate_IndividualAuth_Works(browserKind, false);
- private async Task<Project> CreateBuildPublishIndividualAuthProject(BrowserKind browserKind, bool useLocalDb)
+ private async Task<Project> CreateBuildPublishIndividualAuthProject(bool useLocalDb)
{
// Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");
- var project = await CreateBuildPublishAsync("blazorhostedindividual" + browserKind + (useLocalDb ? "uld" : ""),
- args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" });
+ var project = await CreateBuildPublishAsync(args: new[] { "--hosted", "-au", "Individual", useLocalDb ? "-uld" : "" });
var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
@@ -274,7 +273,7 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(BrowserKind browserKind, bool useLocalDb)
{
- var project = await CreateBuildPublishIndividualAuthProject(browserKind, useLocalDb: useLocalDb);
+ var project = await CreateBuildPublishIndividualAuthProject(useLocalDb: useLocalDb);
var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
@@ -376,7 +375,7 @@ public class BlazorWasmTemplateTest : BlazorTemplateTest
[Theory(Skip = "https://github.com/dotnet/aspnetcore/issues/37782")]
[MemberData(nameof(TemplateData))]
public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_Works(TemplateInstance instance)
- => CreateBuildPublishAsync(instance.Name, args: instance.Arguments, targetFramework: "netstandard2.1");
+ => CreateBuildPublishAsync(args: instance.Arguments, targetFramework: "netstandard2.1");
protected async Task BuildAndRunTest(string appName, Project project, BrowserKind browserKind, bool usesAuth = false)
{
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/PlaywrightFixture.cs b/src/ProjectTemplates/test/Templates.Blazor.Tests/PlaywrightFixture.cs
index 2e1c84602b..2e1c84602b 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/PlaywrightFixture.cs
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/PlaywrightFixture.cs
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplates.Tests.csproj b/src/ProjectTemplates/test/Templates.Blazor.Tests/Templates.Blazor.Tests.csproj
index 4b4058a7e8..d2447a390f 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/BlazorTemplates.Tests.csproj
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/Templates.Blazor.Tests.csproj
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <TestGroupName>ProjectTemplates.E2ETests</TestGroupName>
+ <TestGroupName>ProjectTemplates.Blazor.E2ETests</TestGroupName>
<DefineConstants>$(DefineConstants);XPLAT</DefineConstants>
<RunTemplateTests Condition="'$(RunTemplateTests)' == ''">true</RunTemplateTests>
@@ -15,7 +15,7 @@
<!-- Properties that affect test runs -->
<!-- TestTemplateCreationFolder is the folder where the templates will be created. Will point out to $(OutputDir)$(TestTemplateCreationFolder) -->
<TestTemplateCreationFolder>TestTemplates\</TestTemplateCreationFolder>
- <TestPackageRestorePath>$([MSBuild]::EnsureTrailingSlash('$(RepoRoot)'))obj\template-restore\</TestPackageRestorePath>
+ <RestoreFolderName>Blazor</RestoreFolderName>
<TestDependsOnAspNetPackages>true</TestDependsOnAspNetPackages>
<TestDependsOnMssql>true</TestDependsOnMssql>
<TestDependsOnPlaywright>true</TestDependsOnPlaywright>
@@ -29,7 +29,7 @@
<ItemGroup>
<EmbeddedResource Include="template-baselines.json" />
<Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="shared\Process" />
- <Compile Include="..\Shared\**" LinkBase="Helpers" />
+ <Compile Include="..\..\Shared\**" LinkBase="Helpers" />
</ItemGroup>
<ItemGroup>
@@ -56,18 +56,14 @@
<ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
<ProjectReference Include="$(RepoRoot)src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj" />
- <ProjectReference Include="../testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj"
- Private="false"
- ReferenceOutputAssembly="false"
- SkipGetTargetFrameworkProperties="true" />
- <ProjectReference Include="../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
+ <ProjectReference Include="..\..\Web.ProjectTemplates\Microsoft.DotNet.Web.ProjectTemplates.csproj"
Private="false"
ReferenceOutputAssembly="false"
SkipGetTargetFrameworkProperties="true" />
</ItemGroup>
<!-- Shared testing infrastructure for running E2E template tests -->
- <Import Project="..\TestInfrastructure\PrepareForTest.targets" />
+ <Import Project="..\..\TestInfrastructure\PrepareForTest.targets" />
<Target Name="PublishAssets" AfterTargets="Publish">
<ItemGroup>
@@ -75,6 +71,4 @@
</ItemGroup>
<Copy SourceFiles="@(_PublishFiles)" DestinationFolder="$(PublishDir)\.playwright\%(_PublishFiles.RecursiveDir)\" />
</Target>
-
-
</Project>
diff --git a/src/ProjectTemplates/test/package.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/package.json
index add79d4bdf..cf27e57550 100644
--- a/src/ProjectTemplates/test/package.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/package.json
@@ -6,7 +6,7 @@
"private": true,
"scripts": {
"selenium-standalone": "selenium-standalone",
- "prepare": "selenium-standalone install --config ../../Shared/E2ETesting/selenium-config.json"
+ "prepare": "selenium-standalone install --config ../../../Shared/E2ETesting/selenium-config.json"
},
"author": "",
"license": "MIT",
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.json
index 146abcf626..146abcf626 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.linux.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.linux.json
index e416652ffe..e416652ffe 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.linux.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.linux.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.osx.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.osx.json
index 137e7e9581..137e7e9581 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.osx.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.osx.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.win.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.win.json
index 2c63c08510..2c63c08510 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.ci.win.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.ci.win.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.debug.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.debug.json
index 6899a11ae8..6899a11ae8 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.debug.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.debug.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.json
index f97e60263b..f97e60263b 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.linux.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.linux.json
index 2c63c08510..2c63c08510 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.linux.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.linux.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.osx.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.osx.json
index 2c63c08510..2c63c08510 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.osx.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.osx.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.win.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.win.json
index 2c63c08510..2c63c08510 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/playwrightSettings.win.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/playwrightSettings.win.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/template-baselines.json b/src/ProjectTemplates/test/Templates.Blazor.Tests/template-baselines.json
index 681f0019dd..681f0019dd 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/template-baselines.json
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/template-baselines.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/yarn.lock b/src/ProjectTemplates/test/Templates.Blazor.Tests/yarn.lock
index 25dae07962..8a1d841904 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/yarn.lock
+++ b/src/ProjectTemplates/test/Templates.Blazor.Tests/yarn.lock
@@ -29,17 +29,22 @@
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
+"@types/json-buffer@~3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64"
+ integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==
+
"@types/keyv@*":
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41"
- integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+ integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
dependencies:
"@types/node" "*"
"@types/node@*":
- version "17.0.21"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
- integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
+ integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
"@types/responselike@*", "@types/responselike@^1.0.0":
version "1.0.0"
@@ -96,7 +101,7 @@ cacheable-request@^7.0.2:
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
dependencies:
mimic-response "^1.0.0"
@@ -105,6 +110,14 @@ commander@^7.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+compress-brotli@^1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
+ integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==
+ dependencies:
+ "@types/json-buffer" "~3.0.0"
+ json-buffer "~3.0.1"
+
cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -169,9 +182,9 @@ get-stream@^5.1.0:
pump "^3.0.0"
got@^11.8.2:
- version "11.8.3"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770"
- integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==
+ version "11.8.5"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
+ integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
dependencies:
"@sindresorhus/is" "^4.0.0"
"@szmarczak/http-timer" "^4.0.5"
@@ -223,7 +236,7 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-json-buffer@3.0.1:
+json-buffer@3.0.1, json-buffer@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
@@ -238,10 +251,11 @@ jsonfile@^6.0.1:
graceful-fs "^4.1.6"
keyv@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.1.1.tgz#02c538bfdbd2a9308cc932d4096f05ae42bfa06a"
- integrity sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.2.tgz#e839df676a0c7ee594c8835e7c1c83742558e5c2"
+ integrity sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==
dependencies:
+ compress-brotli "^1.3.8"
json-buffer "3.0.1"
lodash.mapvalues@^4.6.0:
@@ -292,7 +306,7 @@ normalize-url@^6.0.1:
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
@@ -425,7 +439,7 @@ which@^2.0.1, which@^2.0.2:
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
yauzl@^2.10.0:
version "2.10.0"
diff --git a/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/BlazorWasmTemplateAuthTest.cs b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/BlazorWasmTemplateAuthTest.cs
new file mode 100644
index 0000000000..87754aab90
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/BlazorWasmTemplateAuthTest.cs
@@ -0,0 +1,316 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Newtonsoft.Json.Linq;
+using Templates.Test.Helpers;
+using Xunit;
+using Xunit.Abstractions;
+using Xunit.Sdk;
+
+namespace Templates.Blazor.Test;
+
+public class BlazorWasmTemplateAuthTest : BlazorTemplateTest
+{
+ public BlazorWasmTemplateAuthTest(ProjectFactoryFixture projectFactory)
+ : base(projectFactory) { }
+
+ public override string ProjectType { get; } = "blazorwasm";
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ // LocalDB doesn't work on non Windows platforms
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(true, false, false);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ // LocalDB doesn't work on non Windows platforms
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_NoHttps_Works_WithLocalDB()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(true, false, true);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(false, false, false);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_NoHttps_Works_WithOutLocalDB()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(false, false, false);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ // LocalDB doesn't work on non Windows platforms
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithLocalDB_ProgramMain()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(true, true, false);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ // LocalDB doesn't work on non Windows platforms
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_NoHttps_Works_WithLocalDB_ProgramMain()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(true, true, true);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_Works_WithOutLocalDB_ProgramMain()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(false, true, false);
+
+ [ConditionalFact]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/34554", Queues = "Windows.10.Arm64v8.Open")]
+ public Task BlazorWasmHostedTemplate_IndividualAuth_NoHttps_Works_WithOutLocalDB_ProgramMain()
+ => BlazorWasmHostedTemplate_IndividualAuth_Works(false, true, true);
+
+ private async Task<Project> CreateBuildPublishIndividualAuthProject(bool useLocalDb, bool useProgramMain = false, bool noHttps = false)
+ {
+ // Additional arguments are needed. See: https://github.com/dotnet/aspnetcore/issues/24278
+ Environment.SetEnvironmentVariable("EnableDefaultScopedCssItems", "true");
+
+ var args = new[] { ArgConstants.Hosted, useLocalDb ? "-uld" : "", useProgramMain ? ArgConstants.UseProgramMain : "", noHttps ? ArgConstants.NoHttps : "" };
+ var project = await CreateBuildPublishAsync("Individual", args: args);
+
+ var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
+
+ var serverProjectFileContents = ReadFile(serverProject.TemplateOutputDir, $"{serverProject.ProjectName}.csproj");
+ if (!useLocalDb)
+ {
+ Assert.Contains(".db", serverProjectFileContents);
+ }
+
+ var appSettings = ReadFile(serverProject.TemplateOutputDir, "appsettings.json");
+ var element = JsonSerializer.Deserialize<JsonElement>(appSettings);
+ var clientsProperty = element.GetProperty("IdentityServer").EnumerateObject().Single().Value.EnumerateObject().Single();
+ var replacedSection = element.GetRawText().Replace(clientsProperty.Name, serverProject.ProjectName.Replace(".Server", ".Client"));
+ var appSettingsPath = Path.Combine(serverProject.TemplateOutputDir, "appsettings.json");
+ File.WriteAllText(appSettingsPath, replacedSection);
+
+ var publishResult = await serverProject.RunDotNetPublishAsync();
+ Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", serverProject, publishResult));
+
+ // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
+ // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
+ // later, while the opposite is not true.
+
+ var buildResult = await serverProject.RunDotNetBuildAsync();
+ Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", serverProject, buildResult));
+
+ var migrationsResult = await serverProject.RunDotNetEfCreateMigrationAsync("blazorwasm");
+ Assert.True(0 == migrationsResult.ExitCode, ErrorMessages.GetFailedProcessMessage("run EF migrations", serverProject, migrationsResult));
+ serverProject.AssertEmptyMigration("blazorwasm");
+
+ return project;
+ }
+
+ private async Task BlazorWasmHostedTemplate_IndividualAuth_Works(bool useLocalDb, bool useProgramMain, bool noHttps)
+ {
+ var project = await CreateBuildPublishIndividualAuthProject(useLocalDb: useLocalDb, useProgramMain: useProgramMain, noHttps: noHttps);
+
+ var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
+ }
+
+ [Fact]
+ public async Task BlazorWasmStandaloneTemplate_IndividualAuth_CreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync("Individual", args: new[] {
+ "--authority",
+ "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
+ ArgConstants.ClientId,
+ "sample-client-id"
+ });
+ }
+
+ [Fact]
+ public async Task BlazorWasmStandaloneTemplate_NoHttps_IndividualAuth_CreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync("Individual", args: new[] {
+ "--authority",
+ "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration",
+ ArgConstants.ClientId,
+ "sample-client-id",
+ ArgConstants.NoHttps
+ });
+ }
+
+ public static TheoryData<TemplateInstance> TemplateDataIndividualB2C => new TheoryData<TemplateInstance>
+ {
+ new TemplateInstance("blazorwasmhostedaadb2c", "IndividualB2C",
+ ArgConstants.Hosted,
+ ArgConstants.AadB2cInstance, "example.b2clogin.com",
+ "-ssp", "b2c_1_siupin",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324"),
+ new TemplateInstance("blazorwasmhostedaadb2c_program_main", "IndividualB2C",
+ ArgConstants.Hosted,
+ ArgConstants.AadB2cInstance, "example.b2clogin.com",
+ "-ssp", "b2c_1_siupin",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324",
+ ArgConstants.UseProgramMain),
+ new TemplateInstance("blazorwasmstandaloneaadb2c", "IndividualB2C",
+ ArgConstants.AadB2cInstance, "example.b2clogin.com",
+ "-ssp", "b2c_1_siupin",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.Domain, "my-domain"),
+ new TemplateInstance("blazorwasmstandaloneaadb2c_program_main", "IndividualB2C",
+ ArgConstants.AadB2cInstance, "example.b2clogin.com",
+ "-ssp", "b2c_1_siupin",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.UseProgramMain),
+ };
+
+ public static TheoryData<TemplateInstance> TemplateDataSingleOrg => new TheoryData<TemplateInstance>
+ {
+ new TemplateInstance("blazorwasmhostedaad", "SingleOrg",
+ ArgConstants.Hosted,
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324"),
+ new TemplateInstance("blazorwasmhostedaadgraph", "SingleOrg",
+ ArgConstants.Hosted,
+ ArgConstants.CallsGraph,
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324"),
+ new TemplateInstance("blazorwasmhostedaadapi", "SingleOrg",
+ ArgConstants.Hosted,
+ ArgConstants.CalledApiUrl, "\"https://graph.microsoft.com\"",
+ ArgConstants.CalledApiScopes, "user.readwrite",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324"),
+ new TemplateInstance("blazorwasmstandaloneaad", "SingleOrg",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId"),
+ };
+
+ public static TheoryData<TemplateInstance> TemplateDataSingleOrgProgramMain => new TheoryData<TemplateInstance>
+ {
+ new TemplateInstance("blazorwasmhostedaad_program_main", "SingleOrg",
+ ArgConstants.Hosted,
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324",
+ ArgConstants.UseProgramMain),
+ new TemplateInstance("blazorwasmhostedaadgraph_program_main", "SingleOrg",
+ ArgConstants.Hosted,
+ ArgConstants.CallsGraph,
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324",
+ ArgConstants.UseProgramMain),
+ new TemplateInstance("blazorwasmhostedaadapi_program_main", "SingleOrg",
+ ArgConstants.Hosted,
+ ArgConstants.CalledApiUrl, "\"https://graph.microsoft.com\"",
+ ArgConstants.CalledApiScopes, "user.readwrite",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.DefaultScope, "full",
+ ArgConstants.AppIdUri, "ApiUri",
+ ArgConstants.AppIdClientId, "1234123413241324",
+ ArgConstants.UseProgramMain),
+ new TemplateInstance("blazorwasmstandaloneaad_program_main", "SingleOrg",
+ ArgConstants.Domain, "my-domain",
+ ArgConstants.TenantId, "tenantId",
+ ArgConstants.ClientId, "clientId",
+ ArgConstants.UseProgramMain),
+ };
+
+ public class TemplateInstance
+ {
+ public TemplateInstance(string name, string auth, params string[] arguments)
+ {
+ Name = name;
+ Auth = auth;
+ Arguments = arguments;
+ }
+
+ public string Name { get; }
+ public string Auth { get; }
+ public string[] Arguments { get; }
+ }
+
+ [ConditionalTheory]
+ [MemberData(nameof(TemplateDataIndividualB2C))]
+ public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_IndividualB2C_Works(TemplateInstance instance)
+ => CreateBuildPublishAsync(auth: instance.Auth, args: instance.Arguments, targetFramework: "netstandard2.1");
+
+ [ConditionalTheory]
+ [MemberData(nameof(TemplateDataIndividualB2C))]
+ public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_IndividualB2C_NoHttps_Works(TemplateInstance instance)
+ => CreateBuildPublishAsync(auth: instance.Auth, args: instance.Arguments.Union(new[] { ArgConstants.NoHttps }).ToArray(), targetFramework: "netstandard2.1");
+
+ [ConditionalTheory]
+ [MemberData(nameof(TemplateDataSingleOrg))]
+ public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_SingleOrg_Works(TemplateInstance instance)
+ => CreateBuildPublishAsync(auth: instance.Auth, args: instance.Arguments, targetFramework: "netstandard2.1");
+
+ [ConditionalTheory]
+ [MemberData(nameof(TemplateDataSingleOrg))]
+ public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_SingleOrg_NoHttps_Works(TemplateInstance instance)
+ => CreateBuildPublishAsync(auth: instance.Auth, args: instance.Arguments.Union(new[] { ArgConstants.NoHttps }).ToArray(), targetFramework: "netstandard2.1");
+
+ [ConditionalTheory]
+ [MemberData(nameof(TemplateDataSingleOrgProgramMain))]
+ public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_SingleOrg_ProgramMain_Works(TemplateInstance instance)
+ => CreateBuildPublishAsync(auth: instance.Auth, args: instance.Arguments, targetFramework: "netstandard2.1");
+
+ [ConditionalTheory]
+ [MemberData(nameof(TemplateDataSingleOrgProgramMain))]
+ public Task BlazorWasmHostedTemplate_AzureActiveDirectoryTemplate_SingleOrg_NoHttps_ProgramMain_Works(TemplateInstance instance)
+ => CreateBuildPublishAsync(auth: instance.Auth, args: instance.Arguments.Union(new[] { ArgConstants.NoHttps }).ToArray(), targetFramework: "netstandard2.1");
+
+ private static void UpdatePublishedSettings(Project serverProject)
+ {
+ // Hijack here the config file to use the development key during publish.
+ var appSettings = JObject.Parse(File.ReadAllText(Path.Combine(serverProject.TemplateOutputDir, "appsettings.json")));
+ var appSettingsDevelopment = JObject.Parse(File.ReadAllText(Path.Combine(serverProject.TemplateOutputDir, "appsettings.Development.json")));
+ ((JObject)appSettings["IdentityServer"]).Merge(appSettingsDevelopment["IdentityServer"]);
+ ((JObject)appSettings["IdentityServer"]).Merge(new
+ {
+ IdentityServer = new
+ {
+ Key = new
+ {
+ FilePath = "./tempkey.json"
+ }
+ }
+ });
+ var testAppSettings = appSettings.ToString();
+ File.WriteAllText(Path.Combine(serverProject.TemplatePublishDir, "appsettings.json"), testAppSettings);
+ }
+}
diff --git a/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/Templates.Blazor.WebAssembly.Auth.Tests.csproj b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/Templates.Blazor.WebAssembly.Auth.Tests.csproj
new file mode 100644
index 0000000000..aabee17ed2
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Auth.Tests/Templates.Blazor.WebAssembly.Auth.Tests.csproj
@@ -0,0 +1,68 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <!-- Shared testing infrastructure for running E2E tests using selenium -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="$(SharedSourceRoot)E2ETesting\E2ETesting.props" />
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <TestGroupName>ProjectTemplates.Blazor.WebAssembly.Auth.Tests</TestGroupName>
+ <DefineConstants>$(DefineConstants);XPLAT</DefineConstants>
+
+ <RunTemplateTests Condition="'$(RunTemplateTests)' == ''">true</RunTemplateTests>
+ <SkipTests Condition="'$(RunTemplateTests)' != 'true'">true</SkipTests>
+
+ <BaseOutputPath />
+ <OutputPath />
+
+ <!-- Properties that affect test runs -->
+ <!-- TestTemplateCreationFolder is the folder where the templates will be created. Will point out to $(OutputDir)$(TestTemplateCreationFolder) -->
+ <TestTemplateCreationFolder>TestTemplates\</TestTemplateCreationFolder>
+ <RestoreFolderName>WebAssembly</RestoreFolderName>
+ <TestDependsOnAspNetPackages>true</TestDependsOnAspNetPackages>
+ <SkipHelixQueues>
+ $(HelixQueueArmDebian11);
+ </SkipHelixQueues>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)CertificateGeneration\**\*.cs" LinkBase="shared\CertificateGeneration" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="shared\Process" />
+ <Compile Include="..\..\Shared\**" LinkBase="Helpers" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <!-- We need the actual templates in the output directory for tests to verify file encodings. -->
+ <Content Include="..\..\Web.ProjectTemplates\**" LinkBase="Assets\Web.ProjectTemplates" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <HelixContent Include="$(OutputPath)$(TargetFramework)Assets\**" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="AngleSharp" />
+ <Reference Include="System.Net.Http" />
+ <ProjectReference Include="$(RepoRoot)src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+
+ <ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
+ <ProjectReference Include="$(RepoRoot)src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj" />
+ <ProjectReference Include="../../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+ </ItemGroup>
+
+ <PropertyGroup>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == '' AND '$(ContinuousIntegrationBuild)' == 'true'">true</PreserveExistingLogsInOutput>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == ''">false</PreserveExistingLogsInOutput>
+ </PropertyGroup>
+
+ <!-- Shared testing infrastructure for running E2E tests -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="..\..\TestInfrastructure\PrepareForTest.targets" />
+</Project>
diff --git a/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/BlazorWasmTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/BlazorWasmTemplateTest.cs
new file mode 100644
index 0000000000..6fc9ca0190
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/BlazorWasmTemplateTest.cs
@@ -0,0 +1,113 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Newtonsoft.Json.Linq;
+using Templates.Test.Helpers;
+using Xunit;
+using Xunit.Abstractions;
+using Xunit.Sdk;
+
+namespace Templates.Blazor.Test;
+
+public class BlazorWasmTemplateTest : BlazorTemplateTest
+{
+ public BlazorWasmTemplateTest(ProjectFactoryFixture projectFactory)
+ : base(projectFactory) { }
+
+ public override string ProjectType { get; } = "blazorwasm";
+
+ [Fact]
+ public async Task BlazorWasmStandaloneTemplateCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync();
+
+ // The service worker assets manifest isn't generated for non-PWA projects
+ var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
+ Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js");
+ }
+
+ [Fact]
+ public async Task BlazorWasmStandaloneTemplateNoHttpsCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync(args: new[] { ArgConstants.NoHttps });
+
+ // The service worker assets manifest isn't generated for non-PWA projects
+ var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
+ Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js");
+ }
+
+ [Fact]
+ public Task BlazorWasmHostedTemplateCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted }, serverProject: true);
+
+ [Fact]
+ public Task BlazorWasmHostedTemplateNoHttpsCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted, ArgConstants.NoHttps }, serverProject: true);
+
+ [Fact]
+ public Task BlazorWasmHostedTemplateWithProgamMainCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.UseProgramMain, ArgConstants.Hosted }, serverProject: true);
+
+ [Fact]
+ public Task BlazorWasmHostedTemplateNoHttpsWithProgamMainCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.UseProgramMain, ArgConstants.Hosted, ArgConstants.NoHttps }, serverProject: true);
+
+ [Fact]
+ public Task BlazorWasmStandalonePwaTemplateCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Pwa });
+
+ [Fact]
+ public Task BlazorWasmStandalonePwaTemplateNoHttpsCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Pwa, ArgConstants.NoHttps });
+
+ [Fact]
+ public async Task BlazorWasmHostedPwaTemplateCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted, ArgConstants.Pwa }, serverProject: true);
+
+ var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
+
+ ValidatePublishedServiceWorker(serverProject);
+ }
+
+ [Fact]
+ public async Task BlazorWasmHostedPwaTemplateNoHttpsCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted, ArgConstants.Pwa, ArgConstants.NoHttps }, serverProject: true);
+
+ var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
+
+ ValidatePublishedServiceWorker(serverProject);
+ }
+
+ private static void ValidatePublishedServiceWorker(Project project)
+ {
+ var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
+
+ // When publishing the PWA template, we generate an assets manifest
+ // and move service-worker.published.js to overwrite service-worker.js
+ Assert.False(File.Exists(Path.Combine(publishDir, "service-worker.published.js")), "service-worker.published.js should not be published");
+ Assert.True(File.Exists(Path.Combine(publishDir, "service-worker.js")), "service-worker.js should be published");
+ Assert.True(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "service-worker-assets.js should be published");
+
+ // We automatically append the SWAM version as a comment in the published service worker file
+ var serviceWorkerAssetsManifestContents = ReadFile(publishDir, "service-worker-assets.js");
+ var serviceWorkerContents = ReadFile(publishDir, "service-worker.js");
+
+ // Parse the "version": "..." value from the SWAM, and check it's in the service worker
+ var serviceWorkerAssetsManifestVersionMatch = new Regex(@"^\s*\""version\"":\s*(\""[^\""]+\"")", RegexOptions.Multiline)
+ .Match(serviceWorkerAssetsManifestContents);
+ Assert.True(serviceWorkerAssetsManifestVersionMatch.Success);
+ var serviceWorkerAssetsManifestVersionJson = serviceWorkerAssetsManifestVersionMatch.Groups[1].Captures[0].Value;
+ var serviceWorkerAssetsManifestVersion = JsonSerializer.Deserialize<string>(serviceWorkerAssetsManifestVersionJson);
+ Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal));
+ }
+}
diff --git a/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/EmptyBlazorWasmTemplateTest.cs b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/EmptyBlazorWasmTemplateTest.cs
new file mode 100644
index 0000000000..f03ec6175b
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/EmptyBlazorWasmTemplateTest.cs
@@ -0,0 +1,105 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text.Json;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Newtonsoft.Json.Linq;
+using Templates.Test.Helpers;
+using Xunit;
+using Xunit.Abstractions;
+using Xunit.Sdk;
+
+namespace Templates.Blazor.Test;
+
+public class EmptyBlazorWasmTemplateTest : BlazorTemplateTest
+{
+ public EmptyBlazorWasmTemplateTest(ProjectFactoryFixture projectFactory)
+ : base(projectFactory) { }
+
+ public override string ProjectType { get; } = "blazorwasm-empty";
+
+ [Fact]
+ public async Task EmptyBlazorWasmStandaloneTemplateCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync();
+
+ // The service worker assets manifest isn't generated for non-PWA projects
+ var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
+ Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js");
+ }
+
+ [Fact]
+ public async Task EmptyBlazorWasmStandaloneTemplateNoHttpsCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync(args: new[] { ArgConstants.NoHttps });
+
+ // The service worker assets manifest isn't generated for non-PWA projects
+ var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
+ Assert.False(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "Non-PWA templates should not produce service-worker-assets.js");
+ }
+
+ [Fact]
+ public Task EmptyBlazorWasmHostedTemplateCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted }, serverProject: true);
+
+ [Fact]
+ public Task EmptyBlazorWasmHostedTemplateNoHttpsCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted, ArgConstants.NoHttps }, serverProject: true);
+
+ [Fact]
+ public Task EmptyBlazorWasmStandalonePwaTemplateCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Pwa });
+
+ [Fact]
+ public Task EmptyBlazorWasmStandalonePwaTemplateNoHttpsCanCreateBuildPublish()
+ => CreateBuildPublishAsync(args: new[] { ArgConstants.Pwa, ArgConstants.NoHttps });
+
+ [Fact]
+ public async Task EmptyBlazorWasmHostedPwaTemplateCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted, ArgConstants.Pwa }, serverProject: true);
+
+ var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
+
+ ValidatePublishedServiceWorker(serverProject);
+ }
+
+ [Fact]
+ public async Task EmptyBlazorWasmHostedPwaTemplateNoHttpsCanCreateBuildPublish()
+ {
+ var project = await CreateBuildPublishAsync(args: new[] { ArgConstants.Hosted, ArgConstants.Pwa, ArgConstants.NoHttps }, serverProject: true);
+
+ var serverProject = GetSubProject(project, "Server", $"{project.ProjectName}.Server");
+
+ ValidatePublishedServiceWorker(serverProject);
+ }
+
+ private void ValidatePublishedServiceWorker(Project project)
+ {
+ var publishDir = Path.Combine(project.TemplatePublishDir, "wwwroot");
+
+ // When publishing the PWA template, we generate an assets manifest
+ // and move service-worker.published.js to overwrite service-worker.js
+ Assert.False(File.Exists(Path.Combine(publishDir, "service-worker.published.js")), "service-worker.published.js should not be published");
+ Assert.True(File.Exists(Path.Combine(publishDir, "service-worker.js")), "service-worker.js should be published");
+ Assert.True(File.Exists(Path.Combine(publishDir, "service-worker-assets.js")), "service-worker-assets.js should be published");
+
+ // We automatically append the SWAM version as a comment in the published service worker file
+ var serviceWorkerAssetsManifestContents = ReadFile(publishDir, "service-worker-assets.js");
+ var serviceWorkerContents = ReadFile(publishDir, "service-worker.js");
+
+ // Parse the "version": "..." value from the SWAM, and check it's in the service worker
+ var serviceWorkerAssetsManifestVersionMatch = new Regex(@"^\s*\""version\"":\s*(\""[^\""]+\"")", RegexOptions.Multiline)
+ .Match(serviceWorkerAssetsManifestContents);
+ Assert.True(serviceWorkerAssetsManifestVersionMatch.Success);
+ var serviceWorkerAssetsManifestVersionJson = serviceWorkerAssetsManifestVersionMatch.Groups[1].Captures[0].Value;
+ var serviceWorkerAssetsManifestVersion = JsonSerializer.Deserialize<string>(serviceWorkerAssetsManifestVersionJson);
+ Assert.True(serviceWorkerContents.Contains($"/* Manifest version: {serviceWorkerAssetsManifestVersion} */", StringComparison.Ordinal));
+ }
+}
diff --git a/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/Templates.Blazor.WebAssembly.Tests.csproj b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/Templates.Blazor.WebAssembly.Tests.csproj
new file mode 100644
index 0000000000..32a1dfb484
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Blazor.WebAssembly.Tests/Templates.Blazor.WebAssembly.Tests.csproj
@@ -0,0 +1,68 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <!-- Shared testing infrastructure for running E2E tests using selenium -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="$(SharedSourceRoot)E2ETesting\E2ETesting.props" />
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <TestGroupName>ProjectTemplates.Blazor.WebAssembly.Tests</TestGroupName>
+ <DefineConstants>$(DefineConstants);XPLAT</DefineConstants>
+
+ <RunTemplateTests Condition="'$(RunTemplateTests)' == ''">true</RunTemplateTests>
+ <SkipTests Condition="'$(RunTemplateTests)' != 'true'">true</SkipTests>
+
+ <BaseOutputPath />
+ <OutputPath />
+
+ <!-- Properties that affect test runs -->
+ <!-- TestTemplateCreationFolder is the folder where the templates will be created. Will point out to $(OutputDir)$(TestTemplateCreationFolder) -->
+ <TestTemplateCreationFolder>TestTemplates\</TestTemplateCreationFolder>
+ <RestoreFolderName>WebAssembly</RestoreFolderName>
+ <TestDependsOnAspNetPackages>true</TestDependsOnAspNetPackages>
+ <SkipHelixQueues>
+ $(HelixQueueArmDebian11);
+ </SkipHelixQueues>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)CertificateGeneration\**\*.cs" LinkBase="shared\CertificateGeneration" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="shared\Process" />
+ <Compile Include="..\..\Shared\**" LinkBase="Helpers" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <!-- We need the actual templates in the output directory for tests to verify file encodings. -->
+ <Content Include="..\..\Web.ProjectTemplates\**" LinkBase="Assets\Web.ProjectTemplates" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <HelixContent Include="$(OutputPath)$(TargetFramework)Assets\**" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="AngleSharp" />
+ <Reference Include="System.Net.Http" />
+ <ProjectReference Include="$(RepoRoot)src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+
+ <ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
+ <ProjectReference Include="$(RepoRoot)src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj" />
+ <ProjectReference Include="../../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+ </ItemGroup>
+
+ <PropertyGroup>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == '' AND '$(ContinuousIntegrationBuild)' == 'true'">true</PreserveExistingLogsInOutput>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == ''">false</PreserveExistingLogsInOutput>
+ </PropertyGroup>
+
+ <!-- Shared testing infrastructure for running E2E tests -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="..\..\TestInfrastructure\PrepareForTest.targets" />
+</Project>
diff --git a/src/ProjectTemplates/test/Templates.Mvc.Tests/.gitattributes b/src/ProjectTemplates/test/Templates.Mvc.Tests/.gitattributes
new file mode 100644
index 0000000000..300e504f3e
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Mvc.Tests/.gitattributes
@@ -0,0 +1 @@
+.json diff \ No newline at end of file
diff --git a/src/ProjectTemplates/test/MvcTemplateTest.cs b/src/ProjectTemplates/test/Templates.Mvc.Tests/MvcTemplateTest.cs
index 81f96e86b1..5db90382f6 100644
--- a/src/ProjectTemplates/test/MvcTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Mvc.Tests/MvcTemplateTest.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Testing;
using Templates.Test.Helpers;
using Xunit.Abstractions;
-namespace Templates.Test;
+namespace Templates.Mvc.Test;
public class MvcTemplateTest : LoggedTest
{
@@ -32,21 +32,38 @@ public class MvcTemplateTest : LoggedTest
[Fact]
public async Task MvcTemplate_NoAuthFSharp() => await MvcTemplateCore(languageOverride: "F#");
+ [Fact]
+ public async Task MvcTemplate_NoAuthNoHttpsFSharp() => await MvcTemplateCore(languageOverride: "F#", args: new[] { ArgConstants.NoHttps } );
+
[ConditionalFact]
[SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
public async Task MvcTemplate_NoAuthCSharp() => await MvcTemplateCore(languageOverride: null);
[ConditionalFact]
[SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
- public async Task MvcTemplate_ProgramMainNoAuthCSharp() => await MvcTemplateCore(languageOverride: null, new [] { "--use-program-main" });
+ public async Task MvcTemplate_NoAuthNoHttpsCSharp() => await MvcTemplateCore(languageOverride: null, new[] { ArgConstants.NoHttps });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
+ public async Task MvcTemplate_ProgramMainNoAuthCSharp() => await MvcTemplateCore(languageOverride: null, new[] { ArgConstants.UseProgramMain });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
+ public async Task MvcTemplate_ProgramMainNoAuthNoHttpsCSharp() => await MvcTemplateCore(languageOverride: null, new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps });
private async Task MvcTemplateCore(string languageOverride, string[] args = null)
{
- var project = await ProjectFactory.GetOrCreateProject("mvcnoauth" + (languageOverride == "F#" ? "fsharp" : "csharp"), Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("mvc", language: languageOverride, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ var noHttps = args?.Contains(ArgConstants.NoHttps) ?? false;
+ var expectedLaunchProfileNames = noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
var projectExtension = languageOverride == "F#" ? "fsproj" : "csproj";
var projectFileContents = project.ReadFile($"{project.ProjectName}.{projectExtension}");
Assert.DoesNotContain(".db", projectFileContents);
@@ -113,19 +130,41 @@ public class MvcTemplateTest : LoggedTest
}
[ConditionalTheory]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
[InlineData(true, false)]
[InlineData(true, true)]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX, SkipReason = "No LocalDb on non-Windows")]
+ public Task MvcTemplate_IndividualAuth_LocalDb(bool useProgramMain, bool noHttps) => MvcTemplate_IndividualAuth_Core(useLocalDB: true, useProgramMain, noHttps);
+
+ [ConditionalTheory]
[InlineData(false, false)]
[InlineData(false, true)]
+ [InlineData(true, false)]
+ [InlineData(true, true)]
[SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
- public async Task MvcTemplate_IndividualAuth(bool useLocalDB, bool useProgramMain)
- {
- var project = await ProjectFactory.GetOrCreateProject("mvcindividual" + (useLocalDB ? "uld" : ""), Output);
+ public Task MvcTemplate_IndividualAuth(bool useProgramMain, bool noHttps) => MvcTemplate_IndividualAuth_Core(useLocalDB: false, useProgramMain, noHttps);
- var args = useProgramMain ? new [] { "--use-program-main" } : null;
+ private async Task MvcTemplate_IndividualAuth_Core(bool useLocalDB, bool useProgramMain, bool noHttps)
+ {
+ var project = await ProjectFactory.CreateProject(Output);
+
+ var args = useProgramMain
+ ? noHttps
+ ? new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps }
+ : new[] { ArgConstants.UseProgramMain }
+ : noHttps
+ ? new[] { ArgConstants.NoHttps }
+ : null;
var createResult = await project.RunDotNetNewAsync("mvc", auth: "Individual", useLocalDB: useLocalDB, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ var expectedLaunchProfileNames = noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
var projectFileContents = project.ReadFile($"{project.ProjectName}.csproj");
if (!useLocalDB)
{
@@ -151,7 +190,7 @@ public class MvcTemplateTest : LoggedTest
new Page
{
Url = PageUrls.ForgotPassword,
- Links = new string [] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -163,7 +202,7 @@ public class MvcTemplateTest : LoggedTest
new Page
{
Url = PageUrls.HomeUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -176,7 +215,7 @@ public class MvcTemplateTest : LoggedTest
new Page
{
Url = PageUrls.PrivacyFullUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -188,7 +227,7 @@ public class MvcTemplateTest : LoggedTest
new Page
{
Url = PageUrls.LoginUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -203,7 +242,7 @@ public class MvcTemplateTest : LoggedTest
new Page
{
Url = PageUrls.RegisterUrl,
- Links = new string [] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -242,19 +281,19 @@ public class MvcTemplateTest : LoggedTest
// This test verifies publishing an MVC app as a single file exe works. We'll limit testing
// this to a few operating systems to make our lives easier.
var runtimeIdentifer = "win-x64";
- var project = await ProjectFactory.GetOrCreateProject("mvcsinglefileexe", Output);
+ var project = await ProjectFactory.CreateProject(Output);
project.RuntimeIdentifier = runtimeIdentifer;
var createResult = await project.RunDotNetNewAsync("mvc");
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
- var publishResult = await project.RunDotNetPublishAsync(additionalArgs: $"/p:PublishSingleFile=true -r {runtimeIdentifer}", noRestore: false);
+ var publishResult = await project.RunDotNetPublishAsync(additionalArgs: $"/p:PublishSingleFile=true -r {runtimeIdentifer} --self-contained", noRestore: false);
Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult));
var menuLinks = new[]
{
PageUrls.HomeUrl,
- PageUrls.HomeUrl,
+ PageUrls.HomeUrl,
PageUrls.PrivacyFullUrl
};
@@ -285,19 +324,50 @@ public class MvcTemplateTest : LoggedTest
[ConditionalTheory]
[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
[InlineData("IndividualB2C", null)]
- [InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ public Task MvcTemplate_IdentityWeb_IndividualB2C_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ public Task MvcTemplate_IdentityWeb_IndividualB2C_NoHttps_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CallsGraph })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph })]
+ public Task MvcTemplate_IdentityWeb_SingleOrg_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
[InlineData("SingleOrg", null)]
- [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--calls-graph" })]
- public Task MvcTemplate_IdentityWeb_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ public Task MvcTemplate_IdentityWeb_SingleOrg_NoHttps_BuildsAndPublishes(string auth, string[] args) => MvcTemplateBuildsAndPublishes(auth: auth, args: args);
private async Task<Project> MvcTemplateBuildsAndPublishes(string auth, string[] args)
{
- var project = await ProjectFactory.GetOrCreateProject("mvc" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("mvc", auth: auth, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ // Identity Web auth requires https and thus ignores the --no-https option if passed so there should never be an 'http' profile
+ var expectedLaunchProfileNames = new[] { "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
// Verify building in debug works
var buildResult = await project.RunDotNetBuildAsync();
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
diff --git a/src/ProjectTemplates/test/RazorPagesTemplateTest.cs b/src/ProjectTemplates/test/Templates.Mvc.Tests/RazorPagesTemplateTest.cs
index c56cc9762a..a780a5cc80 100644
--- a/src/ProjectTemplates/test/RazorPagesTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Mvc.Tests/RazorPagesTemplateTest.cs
@@ -10,7 +10,7 @@ using Templates.Test.Helpers;
using Xunit;
using Xunit.Abstractions;
-namespace Templates.Test;
+namespace Templates.Mvc.Test;
public class RazorPagesTemplateTest : LoggedTest
{
@@ -36,16 +36,29 @@ public class RazorPagesTemplateTest : LoggedTest
[ConditionalTheory]
[SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
- [InlineData(true)]
- [InlineData(false)]
- public async Task RazorPagesTemplate_NoAuth(bool useProgramMain)
+ [InlineData(true, false)]
+ [InlineData(true, true)]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ public async Task RazorPagesTemplate_NoAuth(bool useProgramMain, bool noHttps)
{
- var project = await ProjectFactory.GetOrCreateProject("razorpagesnoauth", Output);
-
- var args = useProgramMain ? new [] { "--use-program-main" } : null;
+ var project = await ProjectFactory.CreateProject(Output);
+
+ var args = useProgramMain
+ ? noHttps
+ ? new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps }
+ : new[] { ArgConstants.UseProgramMain }
+ : noHttps
+ ? new[] { ArgConstants.NoHttps }
+ : null;
var createResult = await project.RunDotNetNewAsync("razor", args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("razor", project, createResult));
+ var expectedLaunchProfileNames = noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
var projectFileContents = ReadFile(project.TemplateOutputDir, $"{project.ProjectName}.csproj");
Assert.DoesNotContain(".db", projectFileContents);
Assert.DoesNotContain("Microsoft.EntityFrameworkCore.Tools", projectFileContents);
@@ -68,7 +81,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.HomeUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -79,7 +92,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.PrivacyUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -111,15 +124,38 @@ public class RazorPagesTemplateTest : LoggedTest
[InlineData(false, true)]
[InlineData(true, false)]
[InlineData(true, true)]
- [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
- public async Task RazorPagesTemplate_IndividualAuth(bool useLocalDB, bool useProgramMain)
- {
- var project = await ProjectFactory.GetOrCreateProject("razorpagesindividual" + (useLocalDB ? "uld" : ""), Output);
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
+ [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX, SkipReason = "No LocalDb on non-Windows")]
+ public Task RazorPagesTemplate_IndividualAuth_LocalDb(bool useProgramMain, bool noHttps) => RazorPagesTemplate_IndividualAuth_Core(useLocalDB: true, useProgramMain, noHttps);
+
+ [ConditionalTheory]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ [InlineData(true, false)]
+ [InlineData(true, true)]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64 + HelixConstants.DebianAmd64)]
+ public Task RazorPagesTemplate_IndividualAuth(bool useProgramMain, bool noHttps) => RazorPagesTemplate_IndividualAuth_Core(useLocalDB: false, useProgramMain, noHttps);
- var args = useProgramMain ? new [] { "--use-program-main" } : null;
+ private async Task RazorPagesTemplate_IndividualAuth_Core(bool useLocalDB, bool useProgramMain, bool noHttps)
+ {
+ var project = await ProjectFactory.CreateProject(Output);
+
+ var args = useProgramMain
+ ? noHttps
+ ? new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps }
+ : new[] { ArgConstants.UseProgramMain }
+ : noHttps
+ ? new[] { ArgConstants.NoHttps }
+ : null;
var createResult = await project.RunDotNetNewAsync("razor", auth: "Individual", useLocalDB: useLocalDB, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ // Individual auth supports no https OK
+ var expectedLaunchProfileNames = noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
var projectFileContents = ReadFile(project.TemplateOutputDir, $"{project.ProjectName}.csproj");
if (!useLocalDB)
{
@@ -145,7 +181,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.ForgotPassword,
- Links = new string [] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -157,7 +193,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.HomeUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -170,7 +206,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.PrivacyUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -182,7 +218,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.LoginUrl,
- Links = new string[] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -197,7 +233,7 @@ public class RazorPagesTemplateTest : LoggedTest
new Page
{
Url = PageUrls.RegisterUrl,
- Links = new string [] {
+ Links = new [] {
PageUrls.HomeUrl,
PageUrls.HomeUrl,
PageUrls.PrivacyUrl,
@@ -231,25 +267,43 @@ public class RazorPagesTemplateTest : LoggedTest
[ConditionalTheory]
[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
[InlineData("IndividualB2C", null)]
- [InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("IndividualB2C", new string[] { "--use-program-main --called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("IndividualB2C", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ public Task RazorPagesTemplate_IdentityWeb_IndividualB2C_BuildsAndPublishes(string auth, string[] args) => BuildAndPublishRazorPagesTemplateIdentityWeb(auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
[InlineData("SingleOrg", null)]
- [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--use-program-main --called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- public Task RazorPagesTemplate_IdentityWeb_BuildsAndPublishes(string auth, string[] args) => BuildAndPublishRazorPagesTemplate(auth: auth, args: args);
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ public Task RazorPagesTemplate_IdentityWeb_SingleOrg_BuildsAndPublishes(string auth, string[] args) => BuildAndPublishRazorPagesTemplateIdentityWeb(auth: auth, args: args);
[ConditionalTheory]
- [InlineData("SingleOrg", new string[] { "--calls-graph" })]
- [InlineData("SingleOrg", new string[] { "--use-program-main --calls-graph" })]
- public Task RazorPagesTemplate_IdentityWeb_BuildsAndPublishes_WithSingleOrg(string auth, string[] args) => BuildAndPublishRazorPagesTemplate(auth: auth, args: args);
+ [InlineData("SingleOrg", new[] { ArgConstants.CallsGraph })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph })]
+ [InlineData("SingleOrg", new[] { ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new[] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ public Task RazorPagesTemplate_IdentityWeb_SingleOrg_CallsGraph_BuildsAndPublishes(string auth, string[] args) => BuildAndPublishRazorPagesTemplateIdentityWeb(auth: auth, args: args);
- private async Task<Project> BuildAndPublishRazorPagesTemplate(string auth, string[] args)
+ private async Task<Project> BuildAndPublishRazorPagesTemplateIdentityWeb(string auth, string[] args)
{
- var project = await ProjectFactory.GetOrCreateProject("razorpages" + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("razor", auth: auth, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ // Identity Web auth requires https and thus ignores the --no-https option if passed so there should never be an 'http' profile
+ var expectedLaunchProfileNames = new[] { "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
// Verify building in debug works
var buildResult = await project.RunDotNetBuildAsync();
Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
diff --git a/src/ProjectTemplates/test/Templates.Mvc.Tests/Templates.Mvc.Tests.csproj b/src/ProjectTemplates/test/Templates.Mvc.Tests/Templates.Mvc.Tests.csproj
new file mode 100644
index 0000000000..cd3a9c4646
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Mvc.Tests/Templates.Mvc.Tests.csproj
@@ -0,0 +1,68 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <!-- Shared testing infrastructure for running E2E tests using selenium -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="$(SharedSourceRoot)E2ETesting\E2ETesting.props" />
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <TestGroupName>ProjectTemplates.Mvc.Tests</TestGroupName>
+ <DefineConstants>$(DefineConstants);XPLAT</DefineConstants>
+
+ <RunTemplateTests Condition="'$(RunTemplateTests)' == ''">true</RunTemplateTests>
+ <SkipTests Condition="'$(RunTemplateTests)' != 'true'">true</SkipTests>
+
+ <BaseOutputPath />
+ <OutputPath />
+
+ <!-- Properties that affect test runs -->
+ <!-- TestTemplateCreationFolder is the folder where the templates will be created. Will point out to $(OutputDir)$(TestTemplateCreationFolder) -->
+ <TestTemplateCreationFolder>TestTemplates\</TestTemplateCreationFolder>
+ <RestoreFolderName>Mvc</RestoreFolderName>
+ <TestDependsOnAspNetPackages>true</TestDependsOnAspNetPackages>
+ <SkipHelixQueues>
+ $(HelixQueueArmDebian11);
+ </SkipHelixQueues>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)CertificateGeneration\**\*.cs" LinkBase="shared\CertificateGeneration" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="shared\Process" />
+ <Compile Include="..\..\Shared\**" LinkBase="Helpers" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <!-- We need the actual templates in the output directory for tests to verify file encodings. -->
+ <Content Include="..\..\Web.ProjectTemplates\**" LinkBase="Assets\Web.ProjectTemplates" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <HelixContent Include="$(OutputPath)$(TargetFramework)Assets\**" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="AngleSharp" />
+ <Reference Include="System.Net.Http" />
+ <ProjectReference Include="$(RepoRoot)src\Framework\App.Runtime\src\Microsoft.AspNetCore.App.Runtime.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+
+ <ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
+ <ProjectReference Include="$(RepoRoot)src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj" />
+ <ProjectReference Include="../../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
+ Private="false"
+ ReferenceOutputAssembly="false"
+ SkipGetTargetFrameworkProperties="true" />
+ </ItemGroup>
+
+ <PropertyGroup>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == '' AND '$(ContinuousIntegrationBuild)' == 'true'">true</PreserveExistingLogsInOutput>
+ <PreserveExistingLogsInOutput Condition="'$(PreserveExistingLogsInOutput)' == ''">false</PreserveExistingLogsInOutput>
+ </PropertyGroup>
+
+ <!-- Shared testing infrastructure for running E2E tests -->
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="..\..\TestInfrastructure\PrepareForTest.targets" />
+</Project>
diff --git a/src/ProjectTemplates/test/Templates.Mvc.Tests/WebApiTemplateTest.cs b/src/ProjectTemplates/test/Templates.Mvc.Tests/WebApiTemplateTest.cs
new file mode 100644
index 0000000000..b580a812c9
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Mvc.Tests/WebApiTemplateTest.cs
@@ -0,0 +1,289 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Security.Principal;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Testing;
+using Newtonsoft.Json;
+using Templates.Test.Helpers;
+using Xunit;
+using Xunit.Abstractions;
+
+namespace Templates.Mvc.Test;
+
+public class WebApiTemplateTest : LoggedTest
+{
+ public WebApiTemplateTest(ProjectFactoryFixture factoryFixture)
+ {
+ FactoryFixture = factoryFixture;
+ }
+
+ public ProjectFactoryFixture FactoryFixture { get; }
+
+ private ITestOutputHelper _output;
+ public ITestOutputHelper Output
+ {
+ get
+ {
+ if (_output == null)
+ {
+ _output = new TestOutputLogger(Logger);
+ }
+ return _output;
+ }
+ }
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseMinimalApis })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ public Task WebApiTemplateCSharp_IdentityWeb_IndividualB2C_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseMinimalApis, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ public Task WebApiTemplateCSharp_IdentityWeb_IndividualB2C_NoHttps_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ public Task WebApiTemplateCSharp_IdentityWeb_IndividualB2C_ProgramMain_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("IndividualB2C", null)]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("IndividualB2C", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ public Task WebApiTemplateCSharp_IdentityWeb_IndividualB2C_ProgramMain_NoHttps_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseMinimalApis })]
+ [InlineData("SingleOrg", new [] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new [] { ArgConstants.CallsGraph })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseMinimalApis, ArgConstants.CallsGraph })]
+ public Task WebApiTemplateCSharp_IdentityWeb_SingleOrg_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseMinimalApis, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseMinimalApis, ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ public Task WebApiTemplateCSharp_IdentityWeb_SingleOrg_NoHttps_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.CallsGraph })]
+ public Task WebApiTemplateCSharp_IdentityWeb_SingleOrg_ProgramMain_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [ConditionalTheory]
+ [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ [InlineData("SingleOrg", null)]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.CalledApiUrlGraphMicrosoftCom, ArgConstants.CalledApiScopesUserReadWrite, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ [InlineData("SingleOrg", new [] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.CallsGraph, ArgConstants.NoHttps })]
+ public Task WebApiTemplateCSharp_IdentityWeb_SingleOrg_ProgramMain_NoHttps_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
+
+ [Fact]
+ public Task WebApiTemplateFSharp() => WebApiTemplateCore(languageOverride: "F#");
+
+ [Fact]
+ public Task WebApiTemplateNoHttpsFSharp() => WebApiTemplateCore(languageOverride: "F#", args: new[] { ArgConstants.NoHttps } );
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateCSharp() => WebApiTemplateCore(languageOverride: null);
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateNoHttpsCSharp() => WebApiTemplateCore(languageOverride: null, new[] { ArgConstants.NoHttps });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateProgramMainCSharp() => WebApiTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseProgramMain });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateProgramMainNoHttpsCSharp() => WebApiTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateMinimalApisCSharp() => WebApiTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseMinimalApis });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateMinimalApisNoHttpsCSharp() => WebApiTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseMinimalApis, ArgConstants.NoHttps });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateProgramMainMinimalApisCSharp() => WebApiTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis });
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public Task WebApiTemplateProgramMainMinimalApisNoHttpsCSharp() => WebApiTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.NoHttps });
+
+ [ConditionalTheory]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public async Task WebApiTemplateCSharp_WithoutOpenAPI(bool useProgramMain, bool useMinimalApis)
+ {
+ var project = await FactoryFixture.CreateProject(Output);
+
+ var args = useProgramMain
+ ? useMinimalApis
+ ? new[] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.NoOpenApi }
+ : new[] { ArgConstants.UseProgramMain, ArgConstants.NoOpenApi }
+ : useMinimalApis
+ ? new[] { ArgConstants.UseMinimalApis, ArgConstants.NoOpenApi }
+ : new[] { ArgConstants.NoOpenApi };
+ var createResult = await project.RunDotNetNewAsync("webapi", args: args);
+ Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+
+ var buildResult = await project.RunDotNetBuildAsync();
+ Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
+
+ using var aspNetProcess = project.StartBuiltProjectAsync();
+ Assert.False(
+ aspNetProcess.Process.HasExited,
+ ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));
+
+ await aspNetProcess.AssertNotFound("swagger");
+ }
+
+ [ConditionalTheory]
+ [InlineData(false, false)]
+ [InlineData(false, true)]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public async Task WebApiTemplateCSharpNoHttps_WithoutOpenAPI(bool useProgramMain, bool useMinimalApis)
+ {
+ var project = await FactoryFixture.CreateProject(Output);
+
+ var args = useProgramMain
+ ? useMinimalApis
+ ? new[] { ArgConstants.UseProgramMain, ArgConstants.UseMinimalApis, ArgConstants.NoOpenApi, ArgConstants.NoHttps }
+ : new[] { ArgConstants.UseProgramMain, ArgConstants.NoOpenApi, ArgConstants.NoHttps }
+ : useMinimalApis
+ ? new[] { ArgConstants.UseMinimalApis, ArgConstants.NoOpenApi, ArgConstants.NoHttps }
+ : new[] { ArgConstants.NoOpenApi, ArgConstants.NoHttps };
+ var createResult = await project.RunDotNetNewAsync("webapi", args: args);
+ Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+
+ var noHttps = args.Contains(ArgConstants.NoHttps);
+ var expectedLaunchProfileNames = noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
+ var buildResult = await project.RunDotNetBuildAsync();
+ Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
+
+ using var aspNetProcess = project.StartBuiltProjectAsync();
+ Assert.False(
+ aspNetProcess.Process.HasExited,
+ ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));
+
+ await aspNetProcess.AssertNotFound("swagger");
+ }
+
+ private async Task<Project> PublishAndBuildWebApiTemplate(string languageOverride, string auth, string[] args = null)
+ {
+ var project = await FactoryFixture.CreateProject(Output);
+
+ var createResult = await project.RunDotNetNewAsync("webapi", language: languageOverride, auth: auth, args: args);
+ Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+
+ // External auth mechanisms require https to work and thus don't honor the --no-https flag
+ var requiresHttps = string.Equals(auth, "IndividualB2C", StringComparison.OrdinalIgnoreCase)
+ || string.Equals(auth, "SingleOrg", StringComparison.OrdinalIgnoreCase);
+ var noHttps = args?.Contains(ArgConstants.NoHttps) ?? false;
+ var expectedLaunchProfileNames = requiresHttps
+ ? new[] { "https", "IIS Express" }
+ : noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
+ // Avoid the F# compiler. See https://github.com/dotnet/aspnetcore/issues/14022
+ if (languageOverride != null)
+ {
+ return project;
+ }
+
+ var publishResult = await project.RunDotNetPublishAsync();
+ Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult));
+
+ // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
+ // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
+ // later, while the opposite is not true.
+
+ var buildResult = await project.RunDotNetBuildAsync();
+ Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
+
+ return project;
+ }
+
+ private async Task WebApiTemplateCore(string languageOverride, string[] args = null)
+ {
+ var project = await PublishAndBuildWebApiTemplate(languageOverride, null, args);
+
+ // Avoid the F# compiler. See https://github.com/dotnet/aspnetcore/issues/14022
+ if (languageOverride != null)
+ {
+ return;
+ }
+
+ using (var aspNetProcess = project.StartBuiltProjectAsync())
+ {
+ Assert.False(
+ aspNetProcess.Process.HasExited,
+ ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));
+
+ await aspNetProcess.AssertOk("weatherforecast");
+ await aspNetProcess.AssertOk("swagger");
+ await aspNetProcess.AssertNotFound("/");
+ }
+
+ using (var aspNetProcess = project.StartPublishedProjectAsync())
+ {
+ Assert.False(
+ aspNetProcess.Process.HasExited,
+ ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", project, aspNetProcess.Process));
+
+ await aspNetProcess.AssertOk("weatherforecast");
+ // Swagger is only available in Development
+ await aspNetProcess.AssertNotFound("swagger");
+ await aspNetProcess.AssertNotFound("/");
+ }
+ }
+}
diff --git a/src/ProjectTemplates/test/Templates.Tests/.gitattributes b/src/ProjectTemplates/test/Templates.Tests/.gitattributes
new file mode 100644
index 0000000000..300e504f3e
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Tests/.gitattributes
@@ -0,0 +1 @@
+.json diff \ No newline at end of file
diff --git a/src/ProjectTemplates/test/Templates.Tests/.npmrc b/src/ProjectTemplates/test/Templates.Tests/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/ProjectTemplates/test/Templates.Tests/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/ProjectTemplates/test/BaselineTest.cs b/src/ProjectTemplates/test/Templates.Tests/BaselineTest.cs
index c1a48ec40b..22993c25be 100644
--- a/src/ProjectTemplates/test/BaselineTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/BaselineTest.cs
@@ -17,7 +17,7 @@ namespace Templates.Test;
public class BaselineTest : LoggedTest
{
- private static readonly string BaselineDefinitionFileResourceName = "ProjectTemplates.Tests.template-baselines.json";
+ private static readonly string BaselineDefinitionFileResourceName = "Templates.Tests.template-baselines.json";
public BaselineTest(ProjectFactoryFixture projectFactory)
{
@@ -67,11 +67,12 @@ public class BaselineTest : LoggedTest
}
// This test should generally not be quarantined as it only is checking that the expected files are on disk
+ // and that the namespace declarations in the generated .cs files start with the project name
[Theory]
[MemberData(nameof(TemplateBaselines))]
public async Task Template_Produces_The_Right_Set_Of_FilesAsync(string arguments, string[] expectedFiles)
{
- Project = await ProjectFactory.GetOrCreateProject(CreateProjectKey(arguments), Output);
+ Project = await ProjectFactory.CreateProject(Output);
var createResult = await Project.RunDotNetNewRawAsync(arguments);
Assert.True(createResult.ExitCode == 0, createResult.GetFormattedOutput());
@@ -100,66 +101,21 @@ public class BaselineTest : LoggedTest
continue;
}
Assert.Contains(relativePath, expectedFiles);
- }
- }
-
- private static ConcurrentDictionary<string, object> _projectKeys = new();
-
- private string CreateProjectKey(string arguments)
- {
- var text = "baseline";
-
- // Turn string like "new templatename -minimal -au SingleOrg --another-option OptionValue"
- // into array like [ "new templatename", "minimal", "au SingleOrg", "another-option OptionValue" ]
- var argumentsArray = arguments
- .Split(new[] { " --", " -" }, StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)
- .ToArray();
- // Add template name, value has form of "new name"
- text += argumentsArray[0].Substring("new ".Length);
-
- // Sort arguments to ensure definitions that differ only by arguments order are caught
- Array.Sort(argumentsArray, StringComparer.Ordinal);
-
- foreach (var argValue in argumentsArray)
- {
- var argSegments = argValue.Split(' ', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
-
- if (argSegments.Length == 0)
- {
- continue;
- }
- else if (argSegments.Length == 1)
- {
- text += argSegments[0] switch
- {
- "ho" => "hosted",
- "p" => "pwa",
- _ => argSegments[0].Replace("-", "")
- };
- }
- else
+ if (relativePath.EndsWith(".cs", StringComparison.Ordinal))
{
- text += argSegments[0] switch
+ var namespaceDeclarationPrefix = "namespace ";
+ var namespaceDeclaration = File.ReadLines(file)
+ .SingleOrDefault(line => line.StartsWith(namespaceDeclarationPrefix, StringComparison.Ordinal))
+ ?.Substring(namespaceDeclarationPrefix.Length);
+
+ // nullable because Program.cs with top-level statements doesn't have a namespace declaration
+ if (namespaceDeclaration is not null)
{
- "au" => argSegments[1],
- "uld" => "uld",
- "language" => argSegments[1].Replace("#", "Sharp"),
- "support-pages-and-views" when argSegments[1] == "true" => "supportpagesandviewstrue",
- _ => ""
- };
+ Assert.StartsWith(Project.ProjectName, namespaceDeclaration, StringComparison.Ordinal);
+ }
}
}
-
- if (!_projectKeys.TryAdd(text, null))
- {
- throw new InvalidOperationException(
- $"Project key for template with args '{arguments}' already exists. " +
- $"Check that the metadata specified in {BaselineDefinitionFileResourceName} is correct and that " +
- $"the {nameof(CreateProjectKey)} method is considering enough template arguments to ensure uniqueness.");
- }
-
- return text;
}
private void AssertFileExists(string basePath, string path, bool shouldExist)
diff --git a/src/ProjectTemplates/test/ByteOrderMarkTest.cs b/src/ProjectTemplates/test/Templates.Tests/ByteOrderMarkTest.cs
index 219aa351c3..219aa351c3 100644
--- a/src/ProjectTemplates/test/ByteOrderMarkTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/ByteOrderMarkTest.cs
diff --git a/src/ProjectTemplates/test/EmptyWebTemplateTest.cs b/src/ProjectTemplates/test/Templates.Tests/EmptyWebTemplateTest.cs
index addfd26c81..c99e3b836a 100644
--- a/src/ProjectTemplates/test/EmptyWebTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/EmptyWebTemplateTest.cs
@@ -40,9 +40,23 @@ public class EmptyWebTemplateTest : LoggedTest
[ConditionalFact]
[SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public async Task EmptyWebTemplateNoHttpsCSharp()
+ {
+ await EmtpyTemplateCore(languageOverride: null, args: new[] { ArgConstants.NoHttps });
+ }
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
public async Task EmptyWebTemplateProgramMainCSharp()
{
- await EmtpyTemplateCore(languageOverride: null, args: new [] { "--use-program-main" });
+ await EmtpyTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseProgramMain });
+ }
+
+ [ConditionalFact]
+ [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
+ public async Task EmptyWebTemplateProgramMainNoHttpsCSharp()
+ {
+ await EmtpyTemplateCore(languageOverride: null, args: new[] { ArgConstants.UseProgramMain, ArgConstants.NoHttps });
}
[Fact]
@@ -51,13 +65,25 @@ public class EmptyWebTemplateTest : LoggedTest
await EmtpyTemplateCore("F#");
}
+ [Fact]
+ public async Task EmptyWebTemplateNoHttpsFSharp()
+ {
+ await EmtpyTemplateCore("F#", args: new[] { ArgConstants.NoHttps });
+ }
+
private async Task EmtpyTemplateCore(string languageOverride, string[] args = null)
{
- var project = await ProjectFactory.GetOrCreateProject("empty" + (languageOverride == "F#" ? "fsharp" : "csharp"), Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("web", args: args, language: languageOverride);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ var noHttps = args?.Contains(ArgConstants.NoHttps) ?? false;
+ var expectedLaunchProfileNames = noHttps
+ ? new[] { "http", "IIS Express" }
+ : new[] { "http", "https", "IIS Express" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
// Avoid the F# compiler. See https://github.com/dotnet/aspnetcore/issues/14022
if (languageOverride != null)
{
diff --git a/src/ProjectTemplates/test/GrpcTemplateTest.cs b/src/ProjectTemplates/test/Templates.Tests/GrpcTemplateTest.cs
index e7cbf12621..81d3625162 100644
--- a/src/ProjectTemplates/test/GrpcTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/GrpcTemplateTest.cs
@@ -39,14 +39,18 @@ public class GrpcTemplateTest : LoggedTest
[SkipOnAlpine("https://github.com/grpc/grpc/issues/18338")]
[InlineData(true)]
[InlineData(false)]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/41716")]
public async Task GrpcTemplate(bool useProgramMain)
{
- var project = await ProjectFactory.GetOrCreateProject("grpc", Output);
+ var project = await ProjectFactory.CreateProject(Output);
- var args = useProgramMain ? new [] { "--use-program-main" } : null;
+ var args = useProgramMain ? new[] { ArgConstants.UseProgramMain } : null;
var createResult = await project.RunDotNetNewAsync("grpc", args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
+ var expectedLaunchProfileNames = new[] { "http", "https" };
+ await project.VerifyLaunchSettings(expectedLaunchProfileNames);
+
var publishResult = await project.RunDotNetPublishAsync();
Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult));
diff --git a/src/ProjectTemplates/test/IdentityUIPackageTest.cs b/src/ProjectTemplates/test/Templates.Tests/IdentityUIPackageTest.cs
index ed081c459a..74ce8178c4 100644
--- a/src/ProjectTemplates/test/IdentityUIPackageTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/IdentityUIPackageTest.cs
@@ -34,7 +34,7 @@ public class IdentityUIPackageTest : LoggedTest
}
}
- public static string[] Bootstrap5ContentFiles { get; } = new string[]
+ public static string[] Bootstrap5ContentFiles { get; } = new []
{
"Identity/favicon.ico",
"Identity/css/site.css",
@@ -102,7 +102,7 @@ public class IdentityUIPackageTest : LoggedTest
public async Task IdentityUIPackage_WorksWithDifferentOptions()
{
var packageOptions = new Dictionary<string, string>();
- var project = await ProjectFactory.GetOrCreateProject("identityuipackage" + string.Concat(packageOptions.Values), Output);
+ var project = await ProjectFactory.CreateProject(Output);
var useLocalDB = false;
var createResult = await project.RunDotNetNewAsync("razor", auth: "Individual", useLocalDB: useLocalDB, environmentVariables: packageOptions);
diff --git a/src/ProjectTemplates/test/ItemTemplateTests/BlazorServerTests.cs b/src/ProjectTemplates/test/Templates.Tests/ItemTemplateTests/BlazorServerTests.cs
index b2728d7f96..29c3a3e2cd 100644
--- a/src/ProjectTemplates/test/ItemTemplateTests/BlazorServerTests.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/ItemTemplateTests/BlazorServerTests.cs
@@ -25,7 +25,7 @@ public class BlazorServerTest
[Fact]
public async Task BlazorServerItemTemplate()
{
- Project = await ProjectFactory.GetOrCreateProject("razorcomponentitem", Output);
+ Project = await ProjectFactory.CreateProject(Output);
var createResult = await Project.RunDotNetNewAsync("razorcomponent --name Different");
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create", Project, createResult));
diff --git a/src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs b/src/ProjectTemplates/test/Templates.Tests/RazorClassLibraryTemplateTest.cs
index f3360f62e2..7675499fd0 100644
--- a/src/ProjectTemplates/test/RazorClassLibraryTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/RazorClassLibraryTemplateTest.cs
@@ -33,7 +33,7 @@ public class RazorClassLibraryTemplateTest : LoggedTest
[Fact]
public async Task RazorClassLibraryTemplate_WithViews_Async()
{
- var project = await ProjectFactory.GetOrCreateProject("razorclasslibwithviews", Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("razorclasslib", args: new[] { "--support-pages-and-views", "true" });
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
@@ -53,7 +53,7 @@ public class RazorClassLibraryTemplateTest : LoggedTest
[SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
public async Task RazorClassLibraryTemplateAsync()
{
- var project = await ProjectFactory.GetOrCreateProject("razorclasslib", Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("razorclasslib");
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
diff --git a/src/ProjectTemplates/test/SpaTemplatesTest.cs b/src/ProjectTemplates/test/Templates.Tests/SpaTemplatesTest.cs
index 76c77ad07f..f067923b03 100644
--- a/src/ProjectTemplates/test/SpaTemplatesTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/SpaTemplatesTest.cs
@@ -35,13 +35,13 @@ public class SpaTemplatesTest : LoggedTest
}
[Theory]
- [InlineData("angularind", "angular", "Individual")]
- [InlineData("reactind", "react", "Individual")]
- [InlineData("angularnoauth", "angular", null)]
- [InlineData("reactnoauth", "react", null)]
- public async Task SpaTemplates_BuildAndPublish(string projectKey, string template, string auth)
+ [InlineData("angular", "Individual")]
+ [InlineData("react", "Individual")]
+ [InlineData("angular", null)]
+ [InlineData("react", null)]
+ public async Task SpaTemplates_BuildAndPublish(string template, string auth)
{
- var project = await ProjectFactory.GetOrCreateProject(projectKey, Output);
+ var project = await ProjectFactory.CreateProject(Output);
var args = new[] { "--NoSpaFrontEnd", "true" };
var createResult = await project.RunDotNetNewAsync(template, auth: auth, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage(template, project, createResult));
diff --git a/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj b/src/ProjectTemplates/test/Templates.Tests/Templates.Tests.csproj
index c0b6cf71ba..c465fc9be8 100644
--- a/src/ProjectTemplates/test/ProjectTemplates.Tests.csproj
+++ b/src/ProjectTemplates/test/Templates.Tests/Templates.Tests.csproj
@@ -1,14 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
-
<!-- Shared testing infrastructure for running E2E tests using selenium -->
<Import Condition="'$(SkipTestBuild)' != 'true'" Project="$(SharedSourceRoot)E2ETesting\E2ETesting.props" />
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <TestGroupName>ProjectTemplates.E2ETests</TestGroupName>
+ <TestGroupName>ProjectTemplates.Tests</TestGroupName>
<DefineConstants>$(DefineConstants);XPLAT</DefineConstants>
- <RunTemplateTests Condition="'$(RunTemplateTests)' == ''" >true</RunTemplateTests>
+ <RunTemplateTests Condition="'$(RunTemplateTests)' == ''">true</RunTemplateTests>
<SkipTests Condition="'$(RunTemplateTests)' != 'true'">true</SkipTests>
<BaseOutputPath />
@@ -17,8 +16,11 @@
<!-- Properties that affect test runs -->
<!-- TestTemplateCreationFolder is the folder where the templates will be created. Will point out to $(OutputDir)$(TestTemplateCreationFolder) -->
<TestTemplateCreationFolder>TestTemplates\</TestTemplateCreationFolder>
- <TestPackageRestorePath>$([MSBuild]::EnsureTrailingSlash('$(RepoRoot)'))obj\template-restore\</TestPackageRestorePath>
+ <RestoreFolderName>Other</RestoreFolderName>
<TestDependsOnAspNetPackages>true</TestDependsOnAspNetPackages>
+ <SkipHelixQueues>
+ $(HelixQueueArmDebian11);
+ </SkipHelixQueues>
</PropertyGroup>
<ItemGroup>
@@ -29,15 +31,15 @@
<ItemGroup>
<EmbeddedResource Include="template-baselines.json" />
<Compile Include="$(SharedSourceRoot)Process\*.cs" LinkBase="shared\Process" />
- <Compile Include="..\Shared\**" LinkBase="Helpers" />
+ <Compile Include="..\..\Shared\**" LinkBase="Helpers" />
</ItemGroup>
<ItemGroup>
<!-- We need the actual templates in the output directory for tests to verify file encodings. -->
- <Content Include="..\Web.ProjectTemplates\**" LinkBase="Assets\Web.ProjectTemplates" />
+ <Content Include="..\..\Web.ProjectTemplates\**" LinkBase="Assets\Web.ProjectTemplates" />
<Content Include="$(RepoRoot)src\submodules\spa-templates\src\**" LinkBase="Assets\Web.Spa.ProjectTemplates" />
- <Content Include="..\Web.ItemTemplates\**" LinkBase="Assets\Web.ItemTemplates" />
- <Content Include="..\Web.Client.ItemTemplates\**" LinkBase="Assets\Web.Client.ItemTemplates" />
+ <Content Include="..\..\Web.ItemTemplates\**" LinkBase="Assets\Web.ItemTemplates" />
+ <Content Include="..\..\Web.Client.ItemTemplates\**" LinkBase="Assets\Web.Client.ItemTemplates" />
</ItemGroup>
<ItemGroup>
@@ -54,19 +56,15 @@
<ProjectReference Include="$(RepoRoot)src\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj" />
<ProjectReference Include="$(RepoRoot)src\Shared\BrowserTesting\src\Microsoft.AspNetCore.BrowserTesting.csproj" />
- <ProjectReference Include="../testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj"
- Private="false"
- ReferenceOutputAssembly="false"
- SkipGetTargetFrameworkProperties="true" />
- <ProjectReference Include="../Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj"
+ <ProjectReference Include="../../Web.Client.ItemTemplates/Microsoft.DotNet.Web.Client.ItemTemplates.csproj"
Private="false"
ReferenceOutputAssembly="false"
SkipGetTargetFrameworkProperties="true" />
- <ProjectReference Include="../Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj"
+ <ProjectReference Include="../../Web.ItemTemplates/Microsoft.DotNet.Web.ItemTemplates.csproj"
Private="false"
ReferenceOutputAssembly="false"
SkipGetTargetFrameworkProperties="true" />
- <ProjectReference Include="../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
+ <ProjectReference Include="../../Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj"
Private="false"
ReferenceOutputAssembly="false"
SkipGetTargetFrameworkProperties="true" />
@@ -82,5 +80,5 @@
</PropertyGroup>
<!-- Shared testing infrastructure for running E2E tests -->
- <Import Condition="'$(SkipTestBuild)' != 'true'" Project="..\TestInfrastructure\PrepareForTest.targets" />
+ <Import Condition="'$(SkipTestBuild)' != 'true'" Project="..\..\TestInfrastructure\PrepareForTest.targets" />
</Project>
diff --git a/src/ProjectTemplates/test/WorkerTemplateTest.cs b/src/ProjectTemplates/test/Templates.Tests/WorkerTemplateTest.cs
index 8af59b84fe..53a4847912 100644
--- a/src/ProjectTemplates/test/WorkerTemplateTest.cs
+++ b/src/ProjectTemplates/test/Templates.Tests/WorkerTemplateTest.cs
@@ -31,16 +31,12 @@ public class WorkerTemplateTest : LoggedTest
}
[ConditionalTheory]
- [OSSkipCondition(OperatingSystems.Linux, SkipReason = "https://github.com/dotnet/sdk/issues/12831")]
[InlineData("C#", null)]
- [InlineData("C#", new string[] { "--use-program-main" })]
+ [InlineData("C#", new [] { ArgConstants.UseProgramMain })]
[InlineData("F#", null)]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/25404")]
public async Task WorkerTemplateAsync(string language, string[] args)
{
- var project = await ProjectFactory.GetOrCreateProject(
- $"worker-{ language.ToLowerInvariant()[0] }sharp",
- Output);
+ var project = await ProjectFactory.CreateProject(Output);
var createResult = await project.RunDotNetNewAsync("worker", language: language, args: args);
Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
diff --git a/src/ProjectTemplates/test/e2eTestSettings.ci.json b/src/ProjectTemplates/test/Templates.Tests/e2eTestSettings.ci.json
index 325431af35..325431af35 100644
--- a/src/ProjectTemplates/test/e2eTestSettings.ci.json
+++ b/src/ProjectTemplates/test/Templates.Tests/e2eTestSettings.ci.json
diff --git a/src/ProjectTemplates/test/e2eTestSettings.json b/src/ProjectTemplates/test/Templates.Tests/e2eTestSettings.json
index 809f33f046..809f33f046 100644
--- a/src/ProjectTemplates/test/e2eTestSettings.json
+++ b/src/ProjectTemplates/test/Templates.Tests/e2eTestSettings.json
diff --git a/src/ProjectTemplates/BlazorTemplates.Tests/package.json b/src/ProjectTemplates/test/Templates.Tests/package.json
index add79d4bdf..cf27e57550 100644
--- a/src/ProjectTemplates/BlazorTemplates.Tests/package.json
+++ b/src/ProjectTemplates/test/Templates.Tests/package.json
@@ -6,7 +6,7 @@
"private": true,
"scripts": {
"selenium-standalone": "selenium-standalone",
- "prepare": "selenium-standalone install --config ../../Shared/E2ETesting/selenium-config.json"
+ "prepare": "selenium-standalone install --config ../../../Shared/E2ETesting/selenium-config.json"
},
"author": "",
"license": "MIT",
diff --git a/src/ProjectTemplates/test/template-baselines.json b/src/ProjectTemplates/test/Templates.Tests/template-baselines.json
index 9dabc86be5..e751f7e959 100644
--- a/src/ProjectTemplates/test/template-baselines.json
+++ b/src/ProjectTemplates/test/Templates.Tests/template-baselines.json
@@ -541,6 +541,19 @@
],
"AuthOption": "IndividualB2C"
},
+ "IndividualB2CProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -au IndividualB2C --use-program-main --aad-b2c-instance https://login.microsoftonline.com/tfp/ --domain fake-b2c-domain.onmicrosoft.com --client-id 64f31f76-2750-49e4-aab9-f5de105b5172 -ssp B2C_1_SiUpIn",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Controllers/WeatherForecastController.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "IndividualB2C"
+ },
"SingleOrg": {
"Template": "webapi",
"Arguments": "new webapi -au SingleOrg --aad-instance https://login.microsoftonline.com/ --domain fake-aad-domain.onmicrosoft.com --client-id db33c356-12cc-4953-9167-00ad56c2e8b2 --tenant-id 7e511586-66ec-4108-bc9c-a68dee0dc2aa",
@@ -554,6 +567,19 @@
],
"AuthOption": "SingleOrg"
},
+ "SingleOrgProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -au SingleOrg --use-program-main --aad-instance https://login.microsoftonline.com/ --domain fake-aad-domain.onmicrosoft.com --client-id db33c356-12cc-4953-9167-00ad56c2e8b2 --tenant-id 7e511586-66ec-4108-bc9c-a68dee0dc2aa",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Controllers/WeatherForecastController.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "SingleOrg"
+ },
"None": {
"Template": "webapi",
"Arguments": "new webapi -au None",
@@ -567,6 +593,19 @@
],
"AuthOption": "None"
},
+ "NoneProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -au None --use-program-main",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Controllers/WeatherForecastController.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "None"
+ },
"MinimalIndividualB2C": {
"Template": "webapi",
"Arguments": "new webapi -minimal -au IndividualB2C --aad-b2c-instance https://login.microsoftonline.com/tfp/ --domain fake-b2c-domain.onmicrosoft.com --client-id 64f31f76-2750-49e4-aab9-f5de105b5172 -ssp B2C_1_SiUpIn",
@@ -578,6 +617,18 @@
],
"AuthOption": "IndividualB2C"
},
+ "MinimalIndividualB2CProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -minimal --use-program-main -au IndividualB2C --aad-b2c-instance https://login.microsoftonline.com/tfp/ --domain fake-b2c-domain.onmicrosoft.com --client-id 64f31f76-2750-49e4-aab9-f5de105b5172 -ssp B2C_1_SiUpIn",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "IndividualB2C"
+ },
"MinimalSingleOrg": {
"Template": "webapi",
"Arguments": "new webapi -minimal -au SingleOrg --aad-instance https://login.microsoftonline.com/ --domain fake-aad-domain.onmicrosoft.com --client-id db33c356-12cc-4953-9167-00ad56c2e8b2 --tenant-id 7e511586-66ec-4108-bc9c-a68dee0dc2aa",
@@ -589,6 +640,18 @@
],
"AuthOption": "SingleOrg"
},
+ "MinimalSingleOrgProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -minimal --use-program-main -au SingleOrg --aad-instance https://login.microsoftonline.com/ --domain fake-aad-domain.onmicrosoft.com --client-id db33c356-12cc-4953-9167-00ad56c2e8b2 --tenant-id 7e511586-66ec-4108-bc9c-a68dee0dc2aa",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "SingleOrg"
+ },
"Minimal": {
"Template": "webapi",
"Arguments": "new webapi -minimal -au None",
@@ -600,6 +663,18 @@
],
"AuthOption": "None"
},
+ "MinimalProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -minimal --use-program-main -au None",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "None"
+ },
"Windows": {
"Template": "webapi",
"Arguments": "new webapi -au Windows",
@@ -613,6 +688,19 @@
],
"AuthOption": "Windows"
},
+ "WindowsProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -au Windows --use-program-main",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Controllers/WeatherForecastController.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "Windows"
+ },
"MinimalWindows": {
"Template": "webapi",
"Arguments": "new webapi -minimal -au Windows",
@@ -624,6 +712,18 @@
],
"AuthOption": "Windows"
},
+ "MinimalWindowsProgramMain": {
+ "Template": "webapi",
+ "Arguments": "new webapi -minimal --use-program-main -au Windows",
+ "Files": [
+ "appsettings.Development.json",
+ "appsettings.json",
+ "Program.cs",
+ "WeatherForecast.cs",
+ "Properties/launchSettings.json"
+ ],
+ "AuthOption": "Windows"
+ },
"FSharp": {
"Template": "webapi",
"Arguments": "new webapi --language F#",
@@ -1269,7 +1369,7 @@
"Shared/NavMenu.razor",
"Shared/NavMenu.razor.css",
"Shared/SurveyPrompt.razor",
- "wwwroot/favicon.ico",
+ "wwwroot/favicon.png",
"wwwroot/css/site.css",
"wwwroot/css/bootstrap/bootstrap.min.css",
"wwwroot/css/bootstrap/bootstrap.min.css.map",
@@ -1308,7 +1408,7 @@
"Shared/NavMenu.razor",
"Shared/NavMenu.razor.css",
"Shared/SurveyPrompt.razor",
- "wwwroot/favicon.ico",
+ "wwwroot/favicon.png",
"wwwroot/css/site.css",
"wwwroot/css/bootstrap/bootstrap.min.css",
"wwwroot/css/bootstrap/bootstrap.min.css.map",
@@ -1347,7 +1447,7 @@
"Shared/NavMenu.razor",
"Shared/NavMenu.razor.css",
"Shared/SurveyPrompt.razor",
- "wwwroot/favicon.ico",
+ "wwwroot/favicon.png",
"wwwroot/css/site.css",
"wwwroot/css/bootstrap/bootstrap.min.css",
"wwwroot/css/bootstrap/bootstrap.min.css.map",
@@ -1385,7 +1485,7 @@
"Shared/NavMenu.razor",
"Shared/NavMenu.razor.css",
"Shared/SurveyPrompt.razor",
- "wwwroot/favicon.ico",
+ "wwwroot/favicon.png",
"wwwroot/css/site.css",
"wwwroot/css/bootstrap/bootstrap.min.css",
"wwwroot/css/bootstrap/bootstrap.min.css.map",
@@ -1400,6 +1500,37 @@
"wwwroot/css/open-iconic/font/fonts/open-iconic.woff"
]
},
+ "Empty": {
+ "Template": "blazorserver-empty",
+ "Arguments": "new blazorserver-empty",
+ "Files": [
+ "App.razor",
+ "appsettings.Development.json",
+ "appsettings.json",
+ "MainLayout.razor",
+ "Program.cs",
+ "_Imports.razor",
+ "Pages/Index.razor",
+ "Pages/_Host.cshtml",
+ "Properties/launchSettings.json",
+ "wwwroot/css/site.css"
+ ]
+ },
+ "EmptyExcludeLaunchSettings": {
+ "Template": "blazorserver-empty",
+ "Arguments": "new blazorserver-empty --exclude-launch-settings",
+ "Files": [
+ "App.razor",
+ "appsettings.Development.json",
+ "appsettings.json",
+ "MainLayout.razor",
+ "Program.cs",
+ "_Imports.razor",
+ "Pages/Index.razor",
+ "Pages/_Host.cshtml",
+ "wwwroot/css/site.css"
+ ]
+ },
"SingleOrg": {
"Template": "blazorserver",
"Arguments": "new blazorserver -au SingleOrg",
@@ -1424,7 +1555,7 @@
"Shared/NavMenu.razor",
"Shared/NavMenu.razor.css",
"Shared/SurveyPrompt.razor",
- "wwwroot/favicon.ico",
+ "wwwroot/favicon.png",
"wwwroot/css/site.css",
"wwwroot/css/bootstrap/bootstrap.min.css",
"wwwroot/css/bootstrap/bootstrap.min.css.map",
@@ -1463,7 +1594,7 @@
"Shared/NavMenu.razor",
"Shared/NavMenu.razor.css",
"Shared/SurveyPrompt.razor",
- "wwwroot/favicon.ico",
+ "wwwroot/favicon.png",
"wwwroot/css/site.css",
"wwwroot/css/bootstrap/bootstrap.min.css",
"wwwroot/css/bootstrap/bootstrap.min.css.map",
@@ -1563,6 +1694,7 @@
"ClientApp/src/custom.css",
"ClientApp/src/App.js",
"ClientApp/src/App.test.js",
+ "ClientApp/src/AppRoutes.js",
"ClientApp/src/index.js",
"ClientApp/src/reportWebVitals.js",
"ClientApp/src/serviceWorkerRegistration.js",
@@ -1588,5 +1720,433 @@
"Program.cs"
]
}
+ },
+ "blazorwasm": {
+ "None": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm",
+ "Files": [
+ "App.razor",
+ "_Imports.razor",
+ "Program.cs",
+ "Pages/Counter.razor",
+ "Pages/FetchData.razor",
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "Shared/MainLayout.razor",
+ "Shared/MainLayout.razor.css",
+ "Shared/NavMenu.razor",
+ "Shared/NavMenu.razor.css",
+ "Shared/SurveyPrompt.razor",
+ "wwwroot/favicon.png",
+ "wwwroot/icon-192.png",
+ "wwwroot/index.html",
+ "wwwroot/css/app.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "wwwroot/css/open-iconic/FONT-LICENSE",
+ "wwwroot/css/open-iconic/ICON-LICENSE",
+ "wwwroot/css/open-iconic/README.md",
+ "wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "wwwroot/sample-data/weather.json"
+ ]
+ },
+ "Individual": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm -au Individual",
+ "Files": [
+ "App.razor",
+ "_Imports.razor",
+ "Program.cs",
+ "Pages/Authentication.razor",
+ "Pages/Counter.razor",
+ "Pages/FetchData.razor",
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "Shared/LoginDisplay.razor",
+ "Shared/MainLayout.razor",
+ "Shared/MainLayout.razor.css",
+ "Shared/NavMenu.razor",
+ "Shared/NavMenu.razor.css",
+ "Shared/RedirectToLogin.razor",
+ "Shared/SurveyPrompt.razor",
+ "wwwroot/appsettings.Development.json",
+ "wwwroot/appsettings.json",
+ "wwwroot/favicon.png",
+ "wwwroot/icon-192.png",
+ "wwwroot/index.html",
+ "wwwroot/css/app.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "wwwroot/css/open-iconic/FONT-LICENSE",
+ "wwwroot/css/open-iconic/ICON-LICENSE",
+ "wwwroot/css/open-iconic/README.md",
+ "wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "wwwroot/sample-data/weather.json"
+ ]
+ },
+ "IndividualB2C": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm -au IndividualB2C",
+ "Files": [
+ "App.razor",
+ "_Imports.razor",
+ "Program.cs",
+ "Pages/Authentication.razor",
+ "Pages/Counter.razor",
+ "Pages/FetchData.razor",
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "Shared/LoginDisplay.razor",
+ "Shared/MainLayout.razor",
+ "Shared/MainLayout.razor.css",
+ "Shared/NavMenu.razor",
+ "Shared/NavMenu.razor.css",
+ "Shared/RedirectToLogin.razor",
+ "Shared/SurveyPrompt.razor",
+ "wwwroot/appsettings.json",
+ "wwwroot/favicon.png",
+ "wwwroot/icon-192.png",
+ "wwwroot/index.html",
+ "wwwroot/css/app.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "wwwroot/css/open-iconic/FONT-LICENSE",
+ "wwwroot/css/open-iconic/ICON-LICENSE",
+ "wwwroot/css/open-iconic/README.md",
+ "wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "wwwroot/sample-data/weather.json"
+ ]
+ },
+ "SingleOrg": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm -au SingleOrg",
+ "Files": [
+ "App.razor",
+ "_Imports.razor",
+ "Program.cs",
+ "Pages/Authentication.razor",
+ "Pages/Counter.razor",
+ "Pages/FetchData.razor",
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "Shared/LoginDisplay.razor",
+ "Shared/MainLayout.razor",
+ "Shared/MainLayout.razor.css",
+ "Shared/NavMenu.razor",
+ "Shared/NavMenu.razor.css",
+ "Shared/RedirectToLogin.razor",
+ "Shared/SurveyPrompt.razor",
+ "wwwroot/appsettings.json",
+ "wwwroot/favicon.png",
+ "wwwroot/icon-192.png",
+ "wwwroot/index.html",
+ "wwwroot/css/app.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "wwwroot/css/open-iconic/FONT-LICENSE",
+ "wwwroot/css/open-iconic/ICON-LICENSE",
+ "wwwroot/css/open-iconic/README.md",
+ "wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "wwwroot/sample-data/weather.json"
+ ]
+ },
+ "Hosted": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm --hosted",
+ "Files": [
+ "Client/_Imports.razor",
+ "Client/App.razor",
+ "Client/Program.cs",
+ "Client/Pages/Counter.razor",
+ "Client/Pages/FetchData.razor",
+ "Client/Pages/Index.razor",
+ "Client/Properties/launchSettings.json",
+ "Client/Shared/MainLayout.razor",
+ "Client/Shared/MainLayout.razor.css",
+ "Client/Shared/NavMenu.razor",
+ "Client/Shared/NavMenu.razor.css",
+ "Client/Shared/SurveyPrompt.razor",
+ "Client/wwwroot/css/app.css",
+ "Client/wwwroot/favicon.png",
+ "Client/wwwroot/icon-192.png",
+ "Client/wwwroot/index.html",
+ "Client/wwwroot/css/bootstrap/bootstrap.min.css",
+ "Client/wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "Client/wwwroot/css/open-iconic/FONT-LICENSE",
+ "Client/wwwroot/css/open-iconic/ICON-LICENSE",
+ "Client/wwwroot/css/open-iconic/README.md",
+ "Client/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "Server/Controllers/WeatherForecastController.cs",
+ "Server/Pages/Error.cshtml",
+ "Server/Pages/Error.cshtml.cs",
+ "Server/Properties/launchSettings.json",
+ "Server/appsettings.Development.json",
+ "Server/appsettings.json",
+ "Server/Program.cs",
+ "Shared/WeatherForecast.cs"
+ ]
+ },
+ "PWA": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm --pwa",
+ "Files": [
+ "App.razor",
+ "_Imports.razor",
+ "Program.cs",
+ "Pages/Counter.razor",
+ "Pages/FetchData.razor",
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "Shared/MainLayout.razor",
+ "Shared/MainLayout.razor.css",
+ "Shared/NavMenu.razor",
+ "Shared/NavMenu.razor.css",
+ "Shared/SurveyPrompt.razor",
+ "wwwroot/favicon.png",
+ "wwwroot/icon-192.png",
+ "wwwroot/icon-512.png",
+ "wwwroot/index.html",
+ "wwwroot/manifest.json",
+ "wwwroot/service-worker.js",
+ "wwwroot/service-worker.published.js",
+ "wwwroot/css/app.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "wwwroot/css/open-iconic/FONT-LICENSE",
+ "wwwroot/css/open-iconic/ICON-LICENSE",
+ "wwwroot/css/open-iconic/README.md",
+ "wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "wwwroot/sample-data/weather.json"
+ ]
+ },
+ "PWAHosted": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm --pwa --hosted",
+ "Files": [
+ "Client/_Imports.razor",
+ "Client/App.razor",
+ "Client/Program.cs",
+ "Client/Pages/Counter.razor",
+ "Client/Pages/FetchData.razor",
+ "Client/Pages/Index.razor",
+ "Client/Properties/launchSettings.json",
+ "Client/Shared/MainLayout.razor",
+ "Client/Shared/MainLayout.razor.css",
+ "Client/Shared/NavMenu.razor",
+ "Client/Shared/NavMenu.razor.css",
+ "Client/Shared/SurveyPrompt.razor",
+ "Client/wwwroot/css/app.css",
+ "Client/wwwroot/favicon.png",
+ "Client/wwwroot/icon-192.png",
+ "Client/wwwroot/icon-512.png",
+ "Client/wwwroot/index.html",
+ "Client/wwwroot/manifest.json",
+ "Client/wwwroot/service-worker.js",
+ "Client/wwwroot/service-worker.published.js",
+ "Client/wwwroot/css/bootstrap/bootstrap.min.css",
+ "Client/wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "Client/wwwroot/css/open-iconic/FONT-LICENSE",
+ "Client/wwwroot/css/open-iconic/ICON-LICENSE",
+ "Client/wwwroot/css/open-iconic/README.md",
+ "Client/wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "Client/wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "Server/Controllers/WeatherForecastController.cs",
+ "Server/Pages/Error.cshtml",
+ "Server/Pages/Error.cshtml.cs",
+ "Server/Properties/launchSettings.json",
+ "Server/appsettings.Development.json",
+ "Server/appsettings.json",
+ "Server/Program.cs",
+ "Shared/WeatherForecast.cs"
+ ]
+ },
+ "ExcludeLaunchSettings": {
+ "Template": "blazorwasm",
+ "Arguments": "new blazorwasm --exclude-launch-settings",
+ "Files": [
+ "App.razor",
+ "_Imports.razor",
+ "Program.cs",
+ "Pages/Counter.razor",
+ "Pages/FetchData.razor",
+ "Pages/Index.razor",
+ "Shared/MainLayout.razor",
+ "Shared/MainLayout.razor.css",
+ "Shared/NavMenu.razor",
+ "Shared/NavMenu.razor.css",
+ "Shared/SurveyPrompt.razor",
+ "wwwroot/favicon.png",
+ "wwwroot/icon-192.png",
+ "wwwroot/index.html",
+ "wwwroot/css/app.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css",
+ "wwwroot/css/bootstrap/bootstrap.min.css.map",
+ "wwwroot/css/open-iconic/FONT-LICENSE",
+ "wwwroot/css/open-iconic/ICON-LICENSE",
+ "wwwroot/css/open-iconic/README.md",
+ "wwwroot/css/open-iconic/font/css/open-iconic-bootstrap.min.css",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.eot",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.otf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.svg",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.ttf",
+ "wwwroot/css/open-iconic/font/fonts/open-iconic.woff",
+ "wwwroot/sample-data/weather.json"
+ ]
+ }
+ },
+ "blazorwasm-empty": {
+ "None": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty",
+ "Files": [
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "wwwroot/css/app.css",
+ "wwwroot/index.html",
+ "_Imports.razor",
+ "App.razor",
+ "MainLayout.razor",
+ "Program.cs"
+ ]
+ },
+ "Hosted": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty --hosted",
+ "Files": [
+ "Client/_Imports.razor",
+ "Client/App.razor",
+ "Client/MainLayout.razor",
+ "Client/Program.cs",
+ "Client/Pages/Index.razor",
+ "Client/Properties/launchSettings.json",
+ "Client/wwwroot/index.html",
+ "Client/wwwroot/css/app.css",
+ "Server/Properties/launchSettings.json",
+ "Server/appsettings.Development.json",
+ "Server/appsettings.json",
+ "Server/Program.cs",
+ "Shared/SharedClass.cs"
+ ]
+ },
+ "PWA": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty --pwa",
+ "Files": [
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "wwwroot/css/app.css",
+ "wwwroot/icon-512.png",
+ "wwwroot/index.html",
+ "wwwroot/manifest.json",
+ "wwwroot/service-worker.js",
+ "wwwroot/service-worker.published.js",
+ "_Imports.razor",
+ "App.razor",
+ "MainLayout.razor",
+ "Program.cs"
+ ]
+ },
+ "NoHttps": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty --no-https",
+ "Files": [
+ "Pages/Index.razor",
+ "Properties/launchSettings.json",
+ "wwwroot/css/app.css",
+ "wwwroot/index.html",
+ "_Imports.razor",
+ "App.razor",
+ "MainLayout.razor",
+ "Program.cs"
+ ]
+ },
+ "PWAHosted": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty --pwa --hosted",
+ "Files": [
+ "Client/_Imports.razor",
+ "Client/App.razor",
+ "Client/MainLayout.razor",
+ "Client/Program.cs",
+ "Client/Pages/Index.razor",
+ "Client/Properties/launchSettings.json",
+ "Client/wwwroot/icon-512.png",
+ "Client/wwwroot/index.html",
+ "Client/wwwroot/manifest.json",
+ "Client/wwwroot/service-worker.js",
+ "Client/wwwroot/service-worker.published.js",
+ "Client/wwwroot/css/app.css",
+ "Server/Properties/launchSettings.json",
+ "Server/appsettings.Development.json",
+ "Server/appsettings.json",
+ "Server/Program.cs",
+ "Shared/SharedClass.cs"
+ ]
+ },
+ "ExcludeLaunchSettings": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty --exclude-launch-settings",
+ "Files": [
+ "Pages/Index.razor",
+ "wwwroot/css/app.css",
+ "wwwroot/index.html",
+ "_Imports.razor",
+ "App.razor",
+ "MainLayout.razor",
+ "Program.cs"
+ ]
+ },
+ "ExcludeLaunchSettingsHosted": {
+ "Template": "blazorwasm-empty",
+ "Arguments": "new blazorwasm-empty --hosted --exclude-launch-settings",
+ "Files": [
+ "Client/_Imports.razor",
+ "Client/App.razor",
+ "Client/MainLayout.razor",
+ "Client/Program.cs",
+ "Client/Pages/Index.razor",
+ "Client/wwwroot/index.html",
+ "Client/wwwroot/css/app.css",
+ "Server/appsettings.Development.json",
+ "Server/appsettings.json",
+ "Server/Program.cs",
+ "Shared/SharedClass.cs"
+ ]
+ }
}
}
diff --git a/src/ProjectTemplates/test/yarn.lock b/src/ProjectTemplates/test/Templates.Tests/yarn.lock
index 25dae07962..8a1d841904 100644
--- a/src/ProjectTemplates/test/yarn.lock
+++ b/src/ProjectTemplates/test/Templates.Tests/yarn.lock
@@ -29,17 +29,22 @@
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==
+"@types/json-buffer@~3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/json-buffer/-/json-buffer-3.0.0.tgz#85c1ff0f0948fc159810d4b5be35bf8c20875f64"
+ integrity sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==
+
"@types/keyv@*":
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.3.tgz#1c9aae32872ec1f20dcdaee89a9f3ba88f465e41"
- integrity sha512-FXCJgyyN3ivVgRoml4h94G/p3kY+u/B86La+QptcqJaWtBWtmc6TtkNfS40n9bIvyLteHh7zXOtgbobORKPbDg==
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+ integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
dependencies:
"@types/node" "*"
"@types/node@*":
- version "17.0.21"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.21.tgz#864b987c0c68d07b4345845c3e63b75edd143644"
- integrity sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==
+ version "18.0.0"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a"
+ integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==
"@types/responselike@*", "@types/responselike@^1.0.0":
version "1.0.0"
@@ -96,7 +101,7 @@ cacheable-request@^7.0.2:
clone-response@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
- integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
+ integrity sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==
dependencies:
mimic-response "^1.0.0"
@@ -105,6 +110,14 @@ commander@^7.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+compress-brotli@^1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/compress-brotli/-/compress-brotli-1.3.8.tgz#0c0a60c97a989145314ec381e84e26682e7b38db"
+ integrity sha512-lVcQsjhxhIXsuupfy9fmZUFtAIdBmXA7EGY6GBdgZ++qkM9zG4YFT8iU7FoBxzryNDMOpD1HIFHUSX4D87oqhQ==
+ dependencies:
+ "@types/json-buffer" "~3.0.0"
+ json-buffer "~3.0.1"
+
cross-spawn@^7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
@@ -169,9 +182,9 @@ get-stream@^5.1.0:
pump "^3.0.0"
got@^11.8.2:
- version "11.8.3"
- resolved "https://registry.yarnpkg.com/got/-/got-11.8.3.tgz#f496c8fdda5d729a90b4905d2b07dbd148170770"
- integrity sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==
+ version "11.8.5"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046"
+ integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==
dependencies:
"@sindresorhus/is" "^4.0.0"
"@szmarczak/http-timer" "^4.0.5"
@@ -223,7 +236,7 @@ isexe@^2.0.0:
resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
-json-buffer@3.0.1:
+json-buffer@3.0.1, json-buffer@~3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
@@ -238,10 +251,11 @@ jsonfile@^6.0.1:
graceful-fs "^4.1.6"
keyv@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.1.1.tgz#02c538bfdbd2a9308cc932d4096f05ae42bfa06a"
- integrity sha512-tGv1yP6snQVDSM4X6yxrv2zzq/EvpW+oYiUz6aueW1u9CtS8RzUQYxxmFwgZlO2jSgCxQbchhxaqXXp2hnKGpQ==
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.3.2.tgz#e839df676a0c7ee594c8835e7c1c83742558e5c2"
+ integrity sha512-kn8WmodVBe12lmHpA6W8OY7SNh6wVR+Z+wZESF4iF5FCazaVXGWOtnbnvX0tMQ1bO+/TmOD9LziuYMvrIIs0xw==
dependencies:
+ compress-brotli "^1.3.8"
json-buffer "3.0.1"
lodash.mapvalues@^4.6.0:
@@ -292,7 +306,7 @@ normalize-url@^6.0.1:
once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
dependencies:
wrappy "1"
@@ -425,7 +439,7 @@ which@^2.0.1, which@^2.0.2:
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
yauzl@^2.10.0:
version "2.10.0"
diff --git a/src/ProjectTemplates/test/WebApiTemplateTest.cs b/src/ProjectTemplates/test/WebApiTemplateTest.cs
deleted file mode 100644
index 76425a7257..0000000000
--- a/src/ProjectTemplates/test/WebApiTemplateTest.cs
+++ /dev/null
@@ -1,142 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Testing;
-using Templates.Test.Helpers;
-using Xunit;
-using Xunit.Abstractions;
-
-namespace Templates.Test;
-
-public class WebApiTemplateTest : LoggedTest
-{
- public WebApiTemplateTest(ProjectFactoryFixture factoryFixture)
- {
- FactoryFixture = factoryFixture;
- }
-
- public ProjectFactoryFixture FactoryFixture { get; }
-
- private ITestOutputHelper _output;
- public ITestOutputHelper Output
- {
- get
- {
- if (_output == null)
- {
- _output = new TestOutputLogger(Logger);
- }
- return _output;
- }
- }
-
- [ConditionalTheory]
- [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/28090", Queues = HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
- [InlineData("IndividualB2C", null)]
- [InlineData("IndividualB2C", new string[] { "--use-program-main" })]
- [InlineData("IndividualB2C", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("IndividualB2C", new string[] { "--use-program-main --called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", null)]
- [InlineData("SingleOrg", new string[] { "--use-program-main" })]
- [InlineData("SingleOrg", new string[] { "--called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--use-program-main --called-api-url \"https://graph.microsoft.com\"", "--called-api-scopes user.readwrite" })]
- [InlineData("SingleOrg", new string[] { "--calls-graph" })]
- [InlineData("SingleOrg", new string[] { "--use-program-main --calls-graph" })]
- public Task WebApiTemplateCSharp_IdentityWeb_BuildsAndPublishes(string auth, string[] args) => PublishAndBuildWebApiTemplate(languageOverride: null, auth: auth, args: args);
-
- [Fact]
- public Task WebApiTemplateFSharp() => WebApiTemplateCore(languageOverride: "F#");
-
- [ConditionalFact]
- [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
- public Task WebApiTemplateCSharp() => WebApiTemplateCore(languageOverride: null);
-
- [ConditionalFact]
- [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
- public Task WebApiTemplateProgramMainCSharp() => WebApiTemplateCore(languageOverride: null, args: new [] { "--use-program-main" });
-
- [ConditionalTheory]
- [InlineData(false)]
- [InlineData(true)]
- [SkipOnHelix("Cert failure, https://github.com/dotnet/aspnetcore/issues/28090", Queues = "All.OSX;" + HelixConstants.Windows10Arm64 + HelixConstants.DebianArm64)]
- public async Task WebApiTemplateCSharp_WithoutOpenAPI(bool useProgramMain)
- {
- var project = await FactoryFixture.GetOrCreateProject("webapinoopenapi", Output);
-
- var args = useProgramMain ? new[] { "--use-program-main --no-openapi" } : new[] { "--no-openapi" };
- var createResult = await project.RunDotNetNewAsync("webapi", args: args);
- Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
-
- var buildResult = await project.RunDotNetBuildAsync();
- Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
-
- using var aspNetProcess = project.StartBuiltProjectAsync();
- Assert.False(
- aspNetProcess.Process.HasExited,
- ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));
-
- await aspNetProcess.AssertNotFound("swagger");
- }
-
- private async Task<Project> PublishAndBuildWebApiTemplate(string languageOverride, string auth, string[] args = null)
- {
- var project = await FactoryFixture.GetOrCreateProject("webapi" + (languageOverride == "F#" ? "fsharp" : "csharp") + Guid.NewGuid().ToString().Substring(0, 10).ToLowerInvariant(), Output);
-
- var createResult = await project.RunDotNetNewAsync("webapi", language: languageOverride, auth: auth, args: args);
- Assert.True(0 == createResult.ExitCode, ErrorMessages.GetFailedProcessMessage("create/restore", project, createResult));
-
- // Avoid the F# compiler. See https://github.com/dotnet/aspnetcore/issues/14022
- if (languageOverride != null)
- {
- return project;
- }
-
- var publishResult = await project.RunDotNetPublishAsync();
- Assert.True(0 == publishResult.ExitCode, ErrorMessages.GetFailedProcessMessage("publish", project, publishResult));
-
- // Run dotnet build after publish. The reason is that one uses Config = Debug and the other uses Config = Release
- // The output from publish will go into bin/Release/netcoreappX.Y/publish and won't be affected by calling build
- // later, while the opposite is not true.
-
- var buildResult = await project.RunDotNetBuildAsync();
- Assert.True(0 == buildResult.ExitCode, ErrorMessages.GetFailedProcessMessage("build", project, buildResult));
-
- return project;
- }
-
- private async Task WebApiTemplateCore(string languageOverride, string[] args = null)
- {
- var project = await PublishAndBuildWebApiTemplate(languageOverride, null, args);
-
- // Avoid the F# compiler. See https://github.com/dotnet/aspnetcore/issues/14022
- if (languageOverride != null)
- {
- return;
- }
-
- using (var aspNetProcess = project.StartBuiltProjectAsync())
- {
- Assert.False(
- aspNetProcess.Process.HasExited,
- ErrorMessages.GetFailedProcessMessageOrEmpty("Run built project", project, aspNetProcess.Process));
-
- await aspNetProcess.AssertOk("weatherforecast");
- await aspNetProcess.AssertOk("swagger");
- await aspNetProcess.AssertNotFound("/");
- }
-
- using (var aspNetProcess = project.StartPublishedProjectAsync())
- {
- Assert.False(
- aspNetProcess.Process.HasExited,
- ErrorMessages.GetFailedProcessMessageOrEmpty("Run published project", project, aspNetProcess.Process));
-
- await aspNetProcess.AssertOk("weatherforecast");
- // Swagger is only available in Development
- await aspNetProcess.AssertNotFound("swagger");
- await aspNetProcess.AssertNotFound("/");
- }
- }
-}
diff --git a/src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj b/src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj
deleted file mode 100644
index 85e9326e56..0000000000
--- a/src/ProjectTemplates/testassets/DotNetToolsInstaller/DotNetToolsInstaller.csproj
+++ /dev/null
@@ -1,22 +0,0 @@
-<Project>
- <!-- This project is used to ensure a copy of dotnet-ef is restored into the package cache. -->
-
- <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
-
- <PropertyGroup>
- <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
- <RestoreProjectStyle>DotnetToolReference</RestoreProjectStyle>
- </PropertyGroup>
-
- <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
-
- <ItemGroup>
- <PackageReference Remove="@(PackageReference)" />
- <PackageReference Include="dotnet-ef" Version="$(DotNetEfVersion)" />
- </ItemGroup>
-
- <!-- This project doesn't build anything. -->
- <Target Name="Build" />
- <Target Name="GetTargetPath" />
-
-</Project>
diff --git a/src/Razor/Razor.Runtime/src/Hosting/DefaultRazorCompiledItem.cs b/src/Razor/Razor.Runtime/src/Hosting/DefaultRazorCompiledItem.cs
index 29c19b35ff..91461146a6 100644
--- a/src/Razor/Razor.Runtime/src/Hosting/DefaultRazorCompiledItem.cs
+++ b/src/Razor/Razor.Runtime/src/Hosting/DefaultRazorCompiledItem.cs
@@ -1,9 +1,9 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.Razor.Hosting;
-internal class DefaultRazorCompiledItem : RazorCompiledItem
+internal sealed class DefaultRazorCompiledItem : RazorCompiledItem
{
private object[] _metadata;
diff --git a/src/Razor/Razor.Runtime/src/Runtime/TagHelpers/TagHelperScopeManager.cs b/src/Razor/Razor.Runtime/src/Runtime/TagHelpers/TagHelperScopeManager.cs
index 831dfc30ff..2c676d1e29 100644
--- a/src/Razor/Razor.Runtime/src/Runtime/TagHelpers/TagHelperScopeManager.cs
+++ b/src/Razor/Razor.Runtime/src/Runtime/TagHelpers/TagHelperScopeManager.cs
@@ -116,7 +116,7 @@ public class TagHelperScopeManager
return parentExecutionContext;
}
- private class ExecutionContextPool
+ private sealed class ExecutionContextPool
{
private readonly Action<HtmlEncoder> _startTagHelperWritingScope;
private readonly Func<TagHelperContent> _endTagHelperWritingScope;
diff --git a/src/Razor/Razor/src/TagHelpers/DefaultTagHelperContent.cs b/src/Razor/Razor/src/TagHelpers/DefaultTagHelperContent.cs
index fd4cce0564..4852c89bf9 100644
--- a/src/Razor/Razor/src/TagHelpers/DefaultTagHelperContent.cs
+++ b/src/Razor/Razor/src/TagHelpers/DefaultTagHelperContent.cs
@@ -313,7 +313,7 @@ public class DefaultTagHelperContent : TagHelperContent
}
// Overrides Write(string) to find if the content written is empty/whitespace.
- private class EmptyOrWhiteSpaceWriter : TextWriter
+ private sealed class EmptyOrWhiteSpaceWriter : TextWriter
{
public override Encoding Encoding
{
diff --git a/src/Security/Authentication/Certificate/src/AuthenticateResults.cs b/src/Security/Authentication/Certificate/src/AuthenticateResults.cs
new file mode 100644
index 0000000000..3fe01aebdd
--- /dev/null
+++ b/src/Security/Authentication/Certificate/src/AuthenticateResults.cs
@@ -0,0 +1,11 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.Certificate;
+
+internal static class AuthenticateResults
+{
+ internal static AuthenticateResult NoSelfSigned = AuthenticateResult.Fail("Options do not allow self signed certificates.");
+ internal static AuthenticateResult NoChainedCertificates = AuthenticateResult.Fail("Options do not allow chained certificates.");
+ internal static AuthenticateResult InvalidClientCertificate = AuthenticateResult.Fail("Client certificate failed validation.");
+}
diff --git a/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs b/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs
index b9f4b95afd..44ed2a9ff1 100644
--- a/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs
+++ b/src/Security/Authentication/Certificate/src/CertificateAuthenticationHandler.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Authentication.Certificate;
-internal class CertificateAuthenticationHandler : AuthenticationHandler<CertificateAuthenticationOptions>
+internal sealed class CertificateAuthenticationHandler : AuthenticationHandler<CertificateAuthenticationOptions>
{
private static readonly Oid ClientCertificateOid = new Oid("1.3.6.1.5.5.7.3.2");
private ICertificateValidationCache? _cache;
@@ -28,7 +28,7 @@ internal class CertificateAuthenticationHandler : AuthenticationHandler<Certific
/// The handler calls methods on the events which give the application control at certain points where processing is occurring.
/// If it is not provided a default instance is supplied which does nothing when the methods are called.
/// </summary>
- protected new CertificateAuthenticationEvents Events
+ private new CertificateAuthenticationEvents Events
{
get { return (CertificateAuthenticationEvents)base.Events!; }
set { base.Events = value; }
@@ -126,7 +126,7 @@ internal class CertificateAuthenticationHandler : AuthenticationHandler<Certific
!Options.AllowedCertificateTypes.HasFlag(CertificateTypes.SelfSigned))
{
Logger.CertificateRejected("Self signed", clientCertificate.Subject);
- return AuthenticateResult.Fail("Options do not allow self signed certificates.");
+ return AuthenticateResults.NoSelfSigned;
}
// If we have a chained cert, and they're not allowed, exit early and not bother with
@@ -135,7 +135,7 @@ internal class CertificateAuthenticationHandler : AuthenticationHandler<Certific
!Options.AllowedCertificateTypes.HasFlag(CertificateTypes.Chained))
{
Logger.CertificateRejected("Chained", clientCertificate.Subject);
- return AuthenticateResult.Fail("Options do not allow chained certificates.");
+ return AuthenticateResults.NoChainedCertificates;
}
var chainPolicy = BuildChainPolicy(clientCertificate, isCertificateSelfSigned);
@@ -153,7 +153,7 @@ internal class CertificateAuthenticationHandler : AuthenticationHandler<Certific
chainErrors.Add($"{validationFailure.Status} {validationFailure.StatusInformation}");
}
Logger.CertificateFailedValidation(clientCertificate.Subject, chainErrors);
- return AuthenticateResult.Fail("Client certificate failed validation.");
+ return AuthenticateResults.InvalidClientCertificate;
}
var certificateValidatedContext = new CertificateValidatedContext(Context, Scheme, Options)
diff --git a/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs b/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs
index f1b1540391..6f5faf020d 100644
--- a/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs
+++ b/src/Security/Authentication/Certificate/src/CertificateValidationCache.cs
@@ -65,7 +65,7 @@ public class CertificateValidationCache : ICertificateValidationCache
private static string ComputeKey(X509Certificate2 certificate)
=> certificate.GetCertHashString(HashAlgorithmName.SHA256);
- private class CachingClock : Extensions.Internal.ISystemClock
+ private sealed class CachingClock : Extensions.Internal.ISystemClock
{
private readonly ISystemClock _clock;
public CachingClock(ISystemClock clock) => _clock = clock;
diff --git a/src/Security/Authentication/Certificate/src/Microsoft.AspNetCore.Authentication.Certificate.csproj b/src/Security/Authentication/Certificate/src/Microsoft.AspNetCore.Authentication.Certificate.csproj
index b56a0db9df..9b4c994667 100644
--- a/src/Security/Authentication/Certificate/src/Microsoft.AspNetCore.Authentication.Certificate.csproj
+++ b/src/Security/Authentication/Certificate/src/Microsoft.AspNetCore.Authentication.Certificate.csproj
@@ -6,7 +6,7 @@
<DefineConstants>$(DefineConstants);SECURITY</DefineConstants>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security;x509;certificate</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Certificate/src/PublicAPI.Shipped.txt b/src/Security/Authentication/Certificate/src/PublicAPI.Shipped.txt
index d9be33bec2..4a414fdb74 100644
--- a/src/Security/Authentication/Certificate/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/Certificate/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCache.CertificateValidationCache(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCacheOptions!>! options) -> void
+Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCache.CertificateValidationCache(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCacheOptions!>! options) -> void
const Microsoft.AspNetCore.Authentication.Certificate.CertificateAuthenticationDefaults.AuthenticationScheme = "Certificate" -> string!
Microsoft.AspNetCore.Authentication.Certificate.CertificateAuthenticationDefaults
Microsoft.AspNetCore.Authentication.Certificate.CertificateAuthenticationEvents
diff --git a/src/Security/Authentication/Certificate/src/PublicAPI.Unshipped.txt b/src/Security/Authentication/Certificate/src/PublicAPI.Unshipped.txt
index a085af4670..7dc5c58110 100644
--- a/src/Security/Authentication/Certificate/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authentication/Certificate/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCache.CertificateValidationCache(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCacheOptions!>! options) -> void
-Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCache.CertificateValidationCache(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authentication.Certificate.CertificateValidationCacheOptions!>! options) -> void
diff --git a/src/Security/Authentication/Cookies/src/AuthenticateResults.cs b/src/Security/Authentication/Cookies/src/AuthenticateResults.cs
new file mode 100644
index 0000000000..35d294bc11
--- /dev/null
+++ b/src/Security/Authentication/Cookies/src/AuthenticateResults.cs
@@ -0,0 +1,13 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.Cookies;
+
+internal static class AuthenticateResults
+{
+ internal static AuthenticateResult FailedUnprotectingTicket = AuthenticateResult.Fail("Unprotect ticket failed");
+ internal static AuthenticateResult MissingSessionId = AuthenticateResult.Fail("SessionId missing");
+ internal static AuthenticateResult MissingIdentityInSession = AuthenticateResult.Fail("Identity missing in session store");
+ internal static AuthenticateResult ExpiredTicket = AuthenticateResult.Fail("Ticket expired");
+ internal static AuthenticateResult NoPrincipal = AuthenticateResult.Fail("No principal.");
+}
diff --git a/src/Security/Authentication/Cookies/src/CookieAuthenticationEvents.cs b/src/Security/Authentication/Cookies/src/CookieAuthenticationEvents.cs
index 1b13746bb2..be47982a28 100644
--- a/src/Security/Authentication/Cookies/src/CookieAuthenticationEvents.cs
+++ b/src/Security/Authentication/Cookies/src/CookieAuthenticationEvents.cs
@@ -113,7 +113,7 @@ public class CookieAuthenticationEvents
/// </summary>
/// <param name="context">The <see cref="CookieValidatePrincipalContext"/>.</param>
public virtual Task ValidatePrincipal(CookieValidatePrincipalContext context) => OnValidatePrincipal(context);
-
+
/// <summary>
/// Invoked to check if the cookie should be renewed.
/// </summary>
diff --git a/src/Security/Authentication/Cookies/src/CookieAuthenticationHandler.cs b/src/Security/Authentication/Cookies/src/CookieAuthenticationHandler.cs
index 7cfa4f94bb..1d535c017b 100644
--- a/src/Security/Authentication/Cookies/src/CookieAuthenticationHandler.cs
+++ b/src/Security/Authentication/Cookies/src/CookieAuthenticationHandler.cs
@@ -147,7 +147,7 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
var ticket = Options.TicketDataFormat.Unprotect(cookie, GetTlsTokenBinding());
if (ticket == null)
{
- return AuthenticateResult.Fail("Unprotect ticket failed");
+ return AuthenticateResults.FailedUnprotectingTicket;
}
if (Options.SessionStore != null)
@@ -155,13 +155,13 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
var claim = ticket.Principal.Claims.FirstOrDefault(c => c.Type.Equals(SessionIdClaim));
if (claim == null)
{
- return AuthenticateResult.Fail("SessionId missing");
+ return AuthenticateResults.MissingSessionId;
}
// Only store _sessionKey if it matches an existing session. Otherwise we'll create a new one.
- ticket = await Options.SessionStore.RetrieveAsync(claim.Value, Context.RequestAborted);
+ ticket = await Options.SessionStore.RetrieveAsync(claim.Value, Context, Context.RequestAborted);
if (ticket == null)
{
- return AuthenticateResult.Fail("Identity missing in session store");
+ return AuthenticateResults.MissingIdentityInSession;
}
_sessionKey = claim.Value;
}
@@ -173,9 +173,12 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
{
if (Options.SessionStore != null)
{
- await Options.SessionStore.RemoveAsync(_sessionKey!, Context.RequestAborted);
+ await Options.SessionStore.RemoveAsync(_sessionKey!, Context, Context.RequestAborted);
+
+ // Clear out the session key if its expired, so renew doesn't try to use it
+ _sessionKey = null;
}
- return AuthenticateResult.Fail("Ticket expired");
+ return AuthenticateResults.ExpiredTicket;
}
// Finally we have a valid ticket
@@ -201,7 +204,7 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
if (context.Principal == null)
{
- return AuthenticateResult.Fail("No principal.");
+ return AuthenticateResults.NoPrincipal;
}
if (context.ShouldRenew)
@@ -247,7 +250,7 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
if (Options.SessionStore != null && _sessionKey != null)
{
- await Options.SessionStore.RenewAsync(_sessionKey, ticket, Context.RequestAborted);
+ await Options.SessionStore.RenewAsync(_sessionKey, ticket, Context, Context.RequestAborted);
var principal = new ClaimsPrincipal(
new ClaimsIdentity(
new[] { new Claim(SessionIdClaim, _sessionKey, ClaimValueTypes.String, Options.ClaimsIssuer) },
@@ -269,7 +272,7 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
cookieValue,
cookieOptions);
- await ApplyHeaders(shouldRedirectToReturnUrl: false, properties: properties);
+ await ApplyHeaders(shouldRedirect: false, shouldHonorReturnUrlParameter: false, properties: properties);
}
}
@@ -328,11 +331,11 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
if (_sessionKey != null)
{
// Renew the ticket in cases of multiple requests see: https://github.com/dotnet/aspnetcore/issues/22135
- await Options.SessionStore.RenewAsync(_sessionKey, ticket, Context.RequestAborted);
+ await Options.SessionStore.RenewAsync(_sessionKey, ticket, Context, Context.RequestAborted);
}
else
{
- _sessionKey = await Options.SessionStore.StoreAsync(ticket, Context.RequestAborted);
+ _sessionKey = await Options.SessionStore.StoreAsync(ticket, Context, Context.RequestAborted);
}
var principal = new ClaimsPrincipal(
@@ -359,9 +362,9 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
await Events.SignedIn(signedInContext);
- // Only redirect on the login path
- var shouldRedirect = Options.LoginPath.HasValue && OriginalPath == Options.LoginPath;
- await ApplyHeaders(shouldRedirect, signedInContext.Properties);
+ // Only honor the ReturnUrl query string parameter on the login path
+ var shouldHonorReturnUrlParameter = Options.LoginPath.HasValue && OriginalPath == Options.LoginPath;
+ await ApplyHeaders(shouldRedirect: true, shouldHonorReturnUrlParameter, signedInContext.Properties);
Logger.AuthenticationSchemeSignedIn(Scheme.Name);
}
@@ -378,7 +381,7 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
var cookieOptions = BuildCookieOptions();
if (Options.SessionStore != null && _sessionKey != null)
{
- await Options.SessionStore.RemoveAsync(_sessionKey, Context.RequestAborted);
+ await Options.SessionStore.RemoveAsync(_sessionKey, Context, Context.RequestAborted);
}
var context = new CookieSigningOutContext(
@@ -395,29 +398,29 @@ public class CookieAuthenticationHandler : SignInAuthenticationHandler<CookieAut
Options.Cookie.Name!,
context.CookieOptions);
- // Only redirect on the logout path
- var shouldRedirect = Options.LogoutPath.HasValue && OriginalPath == Options.LogoutPath;
- await ApplyHeaders(shouldRedirect, context.Properties);
+ // Only honor the ReturnUrl query string parameter on the logout path
+ var shouldHonorReturnUrlParameter = Options.LogoutPath.HasValue && OriginalPath == Options.LogoutPath;
+ await ApplyHeaders(shouldRedirect: true, shouldHonorReturnUrlParameter, context.Properties);
Logger.AuthenticationSchemeSignedOut(Scheme.Name);
}
- private async Task ApplyHeaders(bool shouldRedirectToReturnUrl, AuthenticationProperties properties)
+ private async Task ApplyHeaders(bool shouldRedirect, bool shouldHonorReturnUrlParameter, AuthenticationProperties properties)
{
Response.Headers.CacheControl = HeaderValueNoCacheNoStore;
Response.Headers.Pragma = HeaderValueNoCache;
Response.Headers.Expires = HeaderValueEpocDate;
- if (shouldRedirectToReturnUrl && Response.StatusCode == 200)
+ if (shouldRedirect && Response.StatusCode == 200)
{
// set redirect uri in order:
// 1. properties.RedirectUri
- // 2. query parameter ReturnUrlParameter
+ // 2. query parameter ReturnUrlParameter (if the request path matches the path set in the options)
//
// Absolute uri is not allowed if it is from query string as query string is not
// a trusted source.
var redirectUri = properties.RedirectUri;
- if (string.IsNullOrEmpty(redirectUri))
+ if (shouldHonorReturnUrlParameter && string.IsNullOrEmpty(redirectUri))
{
redirectUri = Request.Query[Options.ReturnUrlParameter];
if (string.IsNullOrEmpty(redirectUri) || !IsHostRelative(redirectUri))
diff --git a/src/Security/Authentication/Cookies/src/ITicketStore.cs b/src/Security/Authentication/Cookies/src/ITicketStore.cs
index 4bb1c5e6a6..633837a323 100644
--- a/src/Security/Authentication/Cookies/src/ITicketStore.cs
+++ b/src/Security/Authentication/Cookies/src/ITicketStore.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.Http;
+
namespace Microsoft.AspNetCore.Authentication.Cookies;
/// <summary>
@@ -26,6 +28,15 @@ public interface ITicketStore
Task<string> StoreAsync(AuthenticationTicket ticket, CancellationToken cancellationToken) => StoreAsync(ticket);
/// <summary>
+ /// Store the identity ticket and return the associated key.
+ /// </summary>
+ /// <param name="ticket">The identity information to store.</param>
+ /// <param name="httpContext">The <see cref="HttpContext"/> associated with the current request.</param>
+ /// <param name="cancellationToken">The <see cref="CancellationToken"/> used to propagate notifications that the operation should be canceled.</param>
+ /// <returns>The key that can be used to retrieve the identity later.</returns>
+ Task<string> StoreAsync(AuthenticationTicket ticket, HttpContext httpContext, CancellationToken cancellationToken) => StoreAsync(ticket, cancellationToken);
+
+ /// <summary>
/// Tells the store that the given identity should be updated.
/// </summary>
/// <param name="key"></param>
@@ -43,6 +54,16 @@ public interface ITicketStore
Task RenewAsync(string key, AuthenticationTicket ticket, CancellationToken cancellationToken) => RenewAsync(key, ticket);
/// <summary>
+ /// Tells the store that the given identity should be updated.
+ /// </summary>
+ /// <param name="key"></param>
+ /// <param name="ticket"></param>
+ /// <param name="httpContext"></param>
+ /// <param name="cancellationToken">The <see cref="CancellationToken"/> used to propagate notifications that the operation should be canceled.</param>
+ /// <returns></returns>
+ Task RenewAsync(string key, AuthenticationTicket ticket, HttpContext httpContext, CancellationToken cancellationToken) => RenewAsync(key, ticket, cancellationToken);
+
+ /// <summary>
/// Retrieves an identity from the store for the given key.
/// </summary>
/// <param name="key">The key associated with the identity.</param>
@@ -58,6 +79,15 @@ public interface ITicketStore
Task<AuthenticationTicket?> RetrieveAsync(string key, CancellationToken cancellationToken) => RetrieveAsync(key);
/// <summary>
+ /// Retrieves an identity from the store for the given key.
+ /// </summary>
+ /// <param name="key">The key associated with the identity.</param>
+ /// <param name="httpContext">The <see cref="HttpContext"/> associated with the current request.</param>
+ /// <param name="cancellationToken">The <see cref="CancellationToken"/> used to propagate notifications that the operation should be canceled.</param>
+ /// <returns>The identity associated with the given key, or <c>null</c> if not found.</returns>
+ Task<AuthenticationTicket?> RetrieveAsync(string key, HttpContext httpContext, CancellationToken cancellationToken) => RetrieveAsync(key, cancellationToken);
+
+ /// <summary>
/// Remove the identity associated with the given key.
/// </summary>
/// <param name="key">The key associated with the identity.</param>
@@ -71,4 +101,13 @@ public interface ITicketStore
/// <param name="cancellationToken">The <see cref="CancellationToken"/> used to propagate notifications that the operation should be canceled.</param>
/// <returns></returns>
Task RemoveAsync(string key, CancellationToken cancellationToken) => RemoveAsync(key);
+
+ /// <summary>
+ /// Remove the identity associated with the given key.
+ /// </summary>
+ /// <param name="key">The key associated with the identity.</param>
+ /// <param name="httpContext">The <see cref="HttpContext"/> associated with the current request.</param>
+ /// <param name="cancellationToken">The <see cref="CancellationToken"/> used to propagate notifications that the operation should be canceled.</param>
+ /// <returns></returns>
+ Task RemoveAsync(string key, HttpContext httpContext, CancellationToken cancellationToken) => RemoveAsync(key, cancellationToken);
}
diff --git a/src/Security/Authentication/Cookies/src/Microsoft.AspNetCore.Authentication.Cookies.csproj b/src/Security/Authentication/Cookies/src/Microsoft.AspNetCore.Authentication.Cookies.csproj
index cc235c07f4..6a3843e976 100644
--- a/src/Security/Authentication/Cookies/src/Microsoft.AspNetCore.Authentication.Cookies.csproj
+++ b/src/Security/Authentication/Cookies/src/Microsoft.AspNetCore.Authentication.Cookies.csproj
@@ -8,7 +8,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Cookies/src/PublicAPI.Unshipped.txt b/src/Security/Authentication/Cookies/src/PublicAPI.Unshipped.txt
index 899d7d2843..656e195c1a 100644
--- a/src/Security/Authentication/Cookies/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authentication/Cookies/src/PublicAPI.Unshipped.txt
@@ -1,4 +1,8 @@
#nullable enable
*REMOVED*Microsoft.AspNetCore.Authentication.Cookies.PostConfigureCookieAuthenticationOptions.PostConfigure(string! name, Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions! options) -> void
+Microsoft.AspNetCore.Authentication.Cookies.ITicketStore.RemoveAsync(string! key, Microsoft.AspNetCore.Http.HttpContext! httpContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authentication.Cookies.ITicketStore.RenewAsync(string! key, Microsoft.AspNetCore.Authentication.AuthenticationTicket! ticket, Microsoft.AspNetCore.Http.HttpContext! httpContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authentication.Cookies.ITicketStore.RetrieveAsync(string! key, Microsoft.AspNetCore.Http.HttpContext! httpContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.AuthenticationTicket?>!
+Microsoft.AspNetCore.Authentication.Cookies.ITicketStore.StoreAsync(Microsoft.AspNetCore.Authentication.AuthenticationTicket! ticket, Microsoft.AspNetCore.Http.HttpContext! httpContext, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<string!>!
Microsoft.AspNetCore.Authentication.Cookies.PostConfigureCookieAuthenticationOptions.PostConfigure(string? name, Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationOptions! options) -> void
virtual Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationEvents.CheckSlidingExpiration(Microsoft.AspNetCore.Authentication.Cookies.CookieSlidingExpirationContext! context) -> System.Threading.Tasks.Task!
diff --git a/src/Security/Authentication/Core/src/AuthAppBuilderExtensions.cs b/src/Security/Authentication/Core/src/AuthAppBuilderExtensions.cs
index 8efc58c593..5c210ef7e9 100644
--- a/src/Security/Authentication/Core/src/AuthAppBuilderExtensions.cs
+++ b/src/Security/Authentication/Core/src/AuthAppBuilderExtensions.cs
@@ -10,6 +10,8 @@ namespace Microsoft.AspNetCore.Builder;
/// </summary>
public static class AuthAppBuilderExtensions
{
+ internal const string AuthenticationMiddlewareSetKey = "__AuthenticationMiddlewareSet";
+
/// <summary>
/// Adds the <see cref="AuthenticationMiddleware"/> to the specified <see cref="IApplicationBuilder"/>, which enables authentication capabilities.
/// </summary>
@@ -22,6 +24,7 @@ public static class AuthAppBuilderExtensions
throw new ArgumentNullException(nameof(app));
}
+ app.Properties[AuthenticationMiddlewareSetKey] = true;
return app.UseMiddleware<AuthenticationMiddleware>();
}
}
diff --git a/src/Security/Authentication/Core/src/AuthenticationBuilder.cs b/src/Security/Authentication/Core/src/AuthenticationBuilder.cs
index 664fc11f62..91c519de82 100644
--- a/src/Security/Authentication/Core/src/AuthenticationBuilder.cs
+++ b/src/Security/Authentication/Core/src/AuthenticationBuilder.cs
@@ -18,7 +18,9 @@ public class AuthenticationBuilder
/// </summary>
/// <param name="services">The services being configured.</param>
public AuthenticationBuilder(IServiceCollection services)
- => Services = services;
+ {
+ Services = services;
+ }
/// <summary>
/// The services being configured.
@@ -29,11 +31,12 @@ public class AuthenticationBuilder
where TOptions : AuthenticationSchemeOptions, new()
where THandler : class, IAuthenticationHandler
{
+ var state = new AddSchemeHelperState(typeof(THandler));
Services.Configure<AuthenticationOptions>(o =>
{
o.AddScheme(authenticationScheme, scheme =>
{
- scheme.HandlerType = typeof(THandler);
+ scheme.HandlerType = state.HandlerType;
scheme.DisplayName = displayName;
});
});
@@ -50,6 +53,18 @@ public class AuthenticationBuilder
return this;
}
+ // Workaround for linker bug: https://github.com/dotnet/linker/issues/1981
+ private readonly struct AddSchemeHelperState
+ {
+ public AddSchemeHelperState([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type handlerType)
+ {
+ HandlerType = handlerType;
+ }
+
+ [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]
+ public Type HandlerType { get; }
+ }
+
/// <summary>
/// Adds a <see cref="AuthenticationScheme"/> which can be used by <see cref="IAuthenticationService"/>.
/// </summary>
@@ -107,7 +122,7 @@ public class AuthenticationBuilder
=> AddSchemeHelper<PolicySchemeOptions, PolicySchemeHandler>(authenticationScheme, displayName, configureOptions);
// Used to ensure that there's always a default sign in scheme that's not itself
- private class EnsureSignInScheme<TOptions> : IPostConfigureOptions<TOptions> where TOptions : RemoteAuthenticationOptions
+ private sealed class EnsureSignInScheme<TOptions> : IPostConfigureOptions<TOptions> where TOptions : RemoteAuthenticationOptions
{
private readonly AuthenticationOptions _authOptions;
diff --git a/src/Security/Authentication/Core/src/AuthenticationConfigurationProviderExtensions.cs b/src/Security/Authentication/Core/src/AuthenticationConfigurationProviderExtensions.cs
new file mode 100644
index 0000000000..2002ff02f3
--- /dev/null
+++ b/src/Security/Authentication/Core/src/AuthenticationConfigurationProviderExtensions.cs
@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Configuration;
+
+namespace Microsoft.AspNetCore.Authentication;
+
+/// <summary>
+/// Extension methods for <see cref="IAuthenticationConfigurationProvider"/>
+/// </summary>
+public static class AuthenticationConfigurationProviderExtensions
+{
+ private const string AuthenticationSchemesKey = "Schemes";
+
+ /// <summary>
+ /// Returns the specified <see cref="IConfiguration"/> object.
+ /// </summary>
+ /// <param name="provider">An <see cref="IAuthenticationConfigurationProvider"/> instance.</param>
+ /// <param name="authenticationScheme">The path to the section to be returned.</param>
+ /// <returns>The specified <see cref="IConfiguration"/> object, or null if the requested section does not exist.</returns>
+ public static IConfiguration GetSchemeConfiguration(this IAuthenticationConfigurationProvider provider, string authenticationScheme)
+ {
+ ArgumentNullException.ThrowIfNull(provider, nameof(provider));
+
+ if (provider.AuthenticationConfiguration is null)
+ {
+ throw new InvalidOperationException("There was no top-level authentication property found in configuration.");
+ }
+
+ return provider.AuthenticationConfiguration.GetSection($"{AuthenticationSchemesKey}:{authenticationScheme}");
+ }
+}
diff --git a/src/Security/Authentication/Core/src/AuthenticationServiceCollectionExtensions.cs b/src/Security/Authentication/Core/src/AuthenticationServiceCollectionExtensions.cs
index b29001aa37..a318eb3a30 100644
--- a/src/Security/Authentication/Core/src/AuthenticationServiceCollectionExtensions.cs
+++ b/src/Security/Authentication/Core/src/AuthenticationServiceCollectionExtensions.cs
@@ -27,6 +27,8 @@ public static class AuthenticationServiceCollectionExtensions
services.AddDataProtection();
services.AddWebEncoders();
services.TryAddSingleton<ISystemClock, SystemClock>();
+ services.TryAddSingleton<IAuthenticationConfigurationProvider, DefaultAuthenticationConfigurationProvider>();
+
return new AuthenticationBuilder(services);
}
diff --git a/src/Security/Authentication/Core/src/DefaultAuthenticationConfigurationProvider.cs b/src/Security/Authentication/Core/src/DefaultAuthenticationConfigurationProvider.cs
new file mode 100644
index 0000000000..99472b8ef1
--- /dev/null
+++ b/src/Security/Authentication/Core/src/DefaultAuthenticationConfigurationProvider.cs
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Configuration;
+
+namespace Microsoft.AspNetCore.Authentication;
+
+internal sealed class DefaultAuthenticationConfigurationProvider : IAuthenticationConfigurationProvider
+{
+ private readonly IConfiguration _configuration;
+ private const string AuthenticationKey = "Authentication";
+
+ public DefaultAuthenticationConfigurationProvider(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ }
+
+ public IConfiguration AuthenticationConfiguration => _configuration.GetSection(AuthenticationKey);
+}
diff --git a/src/Security/Authentication/Core/src/HandleRequestResult.cs b/src/Security/Authentication/Core/src/HandleRequestResult.cs
index d0869aa368..3b77e0e3a8 100644
--- a/src/Security/Authentication/Core/src/HandleRequestResult.cs
+++ b/src/Security/Authentication/Core/src/HandleRequestResult.cs
@@ -8,6 +8,10 @@ namespace Microsoft.AspNetCore.Authentication;
/// </summary>
public class HandleRequestResult : AuthenticateResult
{
+ private static readonly HandleRequestResult _noResult = new() { None = true };
+ private static readonly HandleRequestResult _skippedResult = new() { Skipped = true };
+ private static readonly HandleRequestResult _handledResult = new() { Handled = true };
+
/// <summary>
/// Indicates that stage of authentication was directly handled by
/// user intervention and no further processing should be attempted.
@@ -77,26 +81,17 @@ public class HandleRequestResult : AuthenticateResult
/// The caller is responsible for generating the full response.
/// </summary>
/// <returns>The result.</returns>
- public static HandleRequestResult Handle()
- {
- return new HandleRequestResult() { Handled = true };
- }
+ public static HandleRequestResult Handle() => _handledResult;
/// <summary>
/// Discontinue processing the request in the current handler.
/// </summary>
/// <returns>The result.</returns>
- public static HandleRequestResult SkipHandler()
- {
- return new HandleRequestResult() { Skipped = true };
- }
+ public static HandleRequestResult SkipHandler() => _skippedResult;
/// <summary>
/// Indicates that there were no results produced during authentication.
/// </summary>
/// <returns>The result.</returns>
- public static new HandleRequestResult NoResult()
- {
- return new HandleRequestResult() { None = true };
- }
+ public static new HandleRequestResult NoResult() => _noResult;
}
diff --git a/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj b/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj
index 4598a5b866..32546d575c 100644
--- a/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj
+++ b/src/Security/Authentication/Core/src/Microsoft.AspNetCore.Authentication.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Core/src/PublicAPI.Shipped.txt b/src/Security/Authentication/Core/src/PublicAPI.Shipped.txt
index 98b6d65131..4c5b82b5bc 100644
--- a/src/Security/Authentication/Core/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/Core/src/PublicAPI.Shipped.txt
@@ -1,15 +1,15 @@
#nullable enable
-~Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>
-~Microsoft.AspNetCore.Authentication.BaseContext<TOptions>
-~Microsoft.AspNetCore.Authentication.HandleRequestContext<TOptions>
-~Microsoft.AspNetCore.Authentication.PrincipalContext<TOptions>
-~Microsoft.AspNetCore.Authentication.PropertiesContext<TOptions>
-~Microsoft.AspNetCore.Authentication.RedirectContext<TOptions>
-~Microsoft.AspNetCore.Authentication.RemoteAuthenticationContext<TOptions>
-~Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>
-~Microsoft.AspNetCore.Authentication.ResultContext<TOptions>
-~Microsoft.AspNetCore.Authentication.SignInAuthenticationHandler<TOptions>
-~Microsoft.AspNetCore.Authentication.SignOutAuthenticationHandler<TOptions>
+Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>
+Microsoft.AspNetCore.Authentication.BaseContext<TOptions>
+Microsoft.AspNetCore.Authentication.HandleRequestContext<TOptions>
+Microsoft.AspNetCore.Authentication.PrincipalContext<TOptions>
+Microsoft.AspNetCore.Authentication.PropertiesContext<TOptions>
+Microsoft.AspNetCore.Authentication.RedirectContext<TOptions>
+Microsoft.AspNetCore.Authentication.RemoteAuthenticationContext<TOptions>
+Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>
+Microsoft.AspNetCore.Authentication.ResultContext<TOptions>
+Microsoft.AspNetCore.Authentication.SignInAuthenticationHandler<TOptions>
+Microsoft.AspNetCore.Authentication.SignOutAuthenticationHandler<TOptions>
abstract Microsoft.AspNetCore.Authentication.AuthenticationHandler<TOptions>.HandleAuthenticateAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.AuthenticateResult!>!
abstract Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler<TOptions>.HandleRemoteAuthenticateAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.HandleRequestResult!>!
abstract Microsoft.AspNetCore.Authentication.SignInAuthenticationHandler<TOptions>.HandleSignInAsync(System.Security.Claims.ClaimsPrincipal! user, Microsoft.AspNetCore.Authentication.AuthenticationProperties? properties) -> System.Threading.Tasks.Task!
diff --git a/src/Security/Authentication/Core/src/PublicAPI.Unshipped.txt b/src/Security/Authentication/Core/src/PublicAPI.Unshipped.txt
index 7dc5c58110..3ea4be28d3 100644
--- a/src/Security/Authentication/Core/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authentication/Core/src/PublicAPI.Unshipped.txt
@@ -1 +1,3 @@
#nullable enable
+Microsoft.AspNetCore.Authentication.AuthenticationConfigurationProviderExtensions
+static Microsoft.AspNetCore.Authentication.AuthenticationConfigurationProviderExtensions.GetSchemeConfiguration(this Microsoft.AspNetCore.Authentication.IAuthenticationConfigurationProvider! provider, string! authenticationScheme) -> Microsoft.Extensions.Configuration.IConfiguration!
diff --git a/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs b/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs
index 9f42aecf40..b78c9d0cd3 100644
--- a/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs
+++ b/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs
@@ -199,7 +199,7 @@ public abstract class RemoteAuthenticationHandler<TOptions> : AuthenticationHand
ticket.Properties, Scheme.Name));
}
- return AuthenticateResult.Fail("Not authenticated");
+ return AuthenticateResult.NoResult();
}
return AuthenticateResult.Fail("Remote authentication does not directly support AuthenticateAsync");
diff --git a/src/Security/Authentication/Core/src/RemoteAuthenticationOptions.cs b/src/Security/Authentication/Core/src/RemoteAuthenticationOptions.cs
index d870509927..8a4e00a042 100644
--- a/src/Security/Authentication/Core/src/RemoteAuthenticationOptions.cs
+++ b/src/Security/Authentication/Core/src/RemoteAuthenticationOptions.cs
@@ -143,7 +143,7 @@ public class RemoteAuthenticationOptions : AuthenticationSchemeOptions
set => _correlationCookieBuilder = value ?? throw new ArgumentNullException(nameof(value));
}
- private class CorrelationCookieBuilder : RequestPathBaseCookieBuilder
+ private sealed class CorrelationCookieBuilder : RequestPathBaseCookieBuilder
{
private readonly RemoteAuthenticationOptions _options;
diff --git a/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj b/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj
index ece1e5408e..729c381798 100644
--- a/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj
+++ b/src/Security/Authentication/Facebook/src/Microsoft.AspNetCore.Authentication.Facebook.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Facebook/src/PublicAPI.Shipped.txt b/src/Security/Authentication/Facebook/src/PublicAPI.Shipped.txt
index ffc68010db..7716799b77 100644
--- a/src/Security/Authentication/Facebook/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/Facebook/src/PublicAPI.Shipped.txt
@@ -1,10 +1,6 @@
#nullable enable
~const Microsoft.AspNetCore.Authentication.Facebook.FacebookDefaults.AuthenticationScheme = "Facebook" -> string
~Microsoft.AspNetCore.Authentication.Facebook.FacebookHandler.FacebookHandler(Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.AspNetCore.Authentication.Facebook.FacebookOptions> options, Microsoft.Extensions.Logging.ILoggerFactory logger, System.Text.Encodings.Web.UrlEncoder encoder, Microsoft.AspNetCore.Authentication.ISystemClock clock) -> void
-~Microsoft.AspNetCore.Authentication.Facebook.FacebookOptions.AppId.get -> string
-~Microsoft.AspNetCore.Authentication.Facebook.FacebookOptions.AppId.set -> void
-~Microsoft.AspNetCore.Authentication.Facebook.FacebookOptions.AppSecret.get -> string
-~Microsoft.AspNetCore.Authentication.Facebook.FacebookOptions.AppSecret.set -> void
~Microsoft.AspNetCore.Authentication.Facebook.FacebookOptions.Fields.get -> System.Collections.Generic.ICollection<string>
~override Microsoft.AspNetCore.Authentication.Facebook.FacebookHandler.CreateTicketAsync(System.Security.Claims.ClaimsIdentity identity, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties, Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse tokens) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.AuthenticationTicket>
~override Microsoft.AspNetCore.Authentication.Facebook.FacebookHandler.FormatScope() -> string
diff --git a/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj b/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj
index 04e062a02b..8180fa0c11 100644
--- a/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj
+++ b/src/Security/Authentication/Google/src/Microsoft.AspNetCore.Authentication.Google.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Google/src/PublicAPI.Shipped.txt b/src/Security/Authentication/Google/src/PublicAPI.Shipped.txt
index 7d8f2de1d7..8ff04ed623 100644
--- a/src/Security/Authentication/Google/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/Google/src/PublicAPI.Shipped.txt
@@ -1,18 +1,8 @@
#nullable enable
~const Microsoft.AspNetCore.Authentication.Google.GoogleDefaults.AuthenticationScheme = "Google" -> string
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.AccessType.get -> string
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.AccessType.set -> void
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.ApprovalPrompt.get -> string
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.ApprovalPrompt.set -> void
~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.GoogleChallengeProperties(System.Collections.Generic.IDictionary<string, string> items) -> void
~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.GoogleChallengeProperties(System.Collections.Generic.IDictionary<string, string> items, System.Collections.Generic.IDictionary<string, object> parameters) -> void
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.LoginHint.get -> string
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.LoginHint.set -> void
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.Prompt.get -> string
-~Microsoft.AspNetCore.Authentication.Google.GoogleChallengeProperties.Prompt.set -> void
~Microsoft.AspNetCore.Authentication.Google.GoogleHandler.GoogleHandler(Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.AspNetCore.Authentication.Google.GoogleOptions> options, Microsoft.Extensions.Logging.ILoggerFactory logger, System.Text.Encodings.Web.UrlEncoder encoder, Microsoft.AspNetCore.Authentication.ISystemClock clock) -> void
-~Microsoft.AspNetCore.Authentication.Google.GoogleOptions.AccessType.get -> string
-~Microsoft.AspNetCore.Authentication.Google.GoogleOptions.AccessType.set -> void
~override Microsoft.AspNetCore.Authentication.Google.GoogleHandler.BuildChallengeUrl(Microsoft.AspNetCore.Authentication.AuthenticationProperties properties, string redirectUri) -> string
~override Microsoft.AspNetCore.Authentication.Google.GoogleHandler.CreateTicketAsync(System.Security.Claims.ClaimsIdentity identity, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties, Microsoft.AspNetCore.Authentication.OAuth.OAuthTokenResponse tokens) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authentication.AuthenticationTicket>
~static Microsoft.Extensions.DependencyInjection.GoogleExtensions.AddGoogle(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder builder) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder
diff --git a/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/MinimalJwtBearerSample.csproj b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/MinimalJwtBearerSample.csproj
new file mode 100644
index 0000000000..e0ab758b6a
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/MinimalJwtBearerSample.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <UserSecretsId>MinimalJwtBearerSample-20151210102827</UserSecretsId>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
+ <Reference Include="Microsoft.AspNetCore.Authentication" />
+ <Reference Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
+ <Reference Include="Microsoft.AspNetCore.Authorization.Policy" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Program.cs b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Program.cs
new file mode 100644
index 0000000000..734c8e413d
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Program.cs
@@ -0,0 +1,31 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Security.Claims;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services.AddAuthentication()
+ .AddJwtBearer()
+ .AddJwtBearer("ClaimedDetails")
+ .AddJwtBearer("InvalidScheme");
+
+builder.Services.AddAuthorization(options =>
+ options.AddPolicy("is_admin", policy =>
+ {
+ policy.RequireAuthenticatedUser();
+ policy.RequireClaim("is_admin", "true");
+ }));
+
+var app = builder.Build();
+
+app.MapGet("/protected", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}!")
+ .RequireAuthorization();
+
+app.MapGet("/protected-with-claims", (ClaimsPrincipal user) =>
+{
+ return $"Glory be to the admin {user.Identity?.Name}!";
+})
+.RequireAuthorization("is_admin");
+
+app.Run();
diff --git a/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Properties/launchSettings.json b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Properties/launchSettings.json
new file mode 100644
index 0000000000..ea8f54aeb1
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/Properties/launchSettings.json
@@ -0,0 +1,31 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:56852",
+ "sslPort": 44385
+ }
+ },
+ "profiles": {
+ "MinimalJwtBearerSample": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "protected",
+ "applicationUrl": "https://localhost:7259;http://localhost:5259",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "protected",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.Development.json b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.Development.json
new file mode 100644
index 0000000000..e4cb26668e
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.Development.json
@@ -0,0 +1,34 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "Authentication": {
+ "DefaultScheme": "ClaimedDetails",
+ "Schemes": {
+ "Bearer": {
+ "ValidAudiences": [
+ "https://localhost:7259",
+ "http://localhost:5259"
+ ],
+ "ValidIssuer": "dotnet-user-jwts"
+ },
+ "ClaimedDetails": {
+ "ValidAudiences": [
+ "https://localhost:7259",
+ "http://localhost:5259"
+ ],
+ "ValidIssuer": "dotnet-user-jwts"
+ },
+ "InvalidScheme": {
+ "ValidAudiences": [
+ "https://localhost:7259",
+ "http://localhost:5259"
+ ],
+ "ValidIssuer": "invalid-issuer"
+ }
+ }
+ }
+}
diff --git a/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.json b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.json
new file mode 100644
index 0000000000..10f68b8c8b
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/samples/MinimalJwtBearerSample/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/Security/Authentication/JwtBearer/src/AuthenticateResults.cs b/src/Security/Authentication/JwtBearer/src/AuthenticateResults.cs
new file mode 100644
index 0000000000..5f0e8bb6b9
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/src/AuthenticateResults.cs
@@ -0,0 +1,9 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer;
+
+internal static class AuthenticateResults
+{
+ internal static AuthenticateResult ValidatorNotFound = AuthenticateResult.Fail("No SecurityTokenValidator available for token.");
+}
diff --git a/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs b/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs
new file mode 100644
index 0000000000..812eb9287a
--- /dev/null
+++ b/src/Security/Authentication/JwtBearer/src/JwtBearerConfigureOptions.cs
@@ -0,0 +1,102 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.Linq;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+using Microsoft.IdentityModel.Tokens;
+
+namespace Microsoft.AspNetCore.Authentication;
+
+internal sealed class JwtBearerConfigureOptions : IConfigureNamedOptions<JwtBearerOptions>
+{
+ private readonly IAuthenticationConfigurationProvider _authenticationConfigurationProvider;
+ private static readonly Func<string, TimeSpan> _invariantTimeSpanParse = (string timespanString) => TimeSpan.Parse(timespanString, CultureInfo.InvariantCulture);
+
+ /// <summary>
+ /// Initializes a new <see cref="JwtBearerConfigureOptions"/> given the configuration
+ /// provided by the <paramref name="configurationProvider"/>.
+ /// </summary>
+ /// <param name="configurationProvider">An <see cref="IAuthenticationConfigurationProvider"/> instance.</param>\
+ public JwtBearerConfigureOptions(IAuthenticationConfigurationProvider configurationProvider)
+ {
+ _authenticationConfigurationProvider = configurationProvider;
+ }
+
+ /// <inheritdoc />
+ public void Configure(string? name, JwtBearerOptions options)
+ {
+ if (string.IsNullOrEmpty(name))
+ {
+ return;
+ }
+
+ var configSection = _authenticationConfigurationProvider.GetSchemeConfiguration(name);
+
+ if (configSection is null || !configSection.GetChildren().Any())
+ {
+ return;
+ }
+
+ var issuer = configSection[nameof(TokenValidationParameters.ValidIssuer)];
+ var issuers = configSection.GetSection(nameof(TokenValidationParameters.ValidIssuers)).GetChildren().Select(iss => iss.Value).ToList();
+ if (issuer is not null)
+ {
+ issuers.Add(issuer);
+ }
+ var audience = configSection[nameof(TokenValidationParameters.ValidAudience)];
+ var audiences = configSection.GetSection(nameof(TokenValidationParameters.ValidAudiences)).GetChildren().Select(aud => aud.Value).ToList();
+ if (audience is not null)
+ {
+ audiences.Add(audience);
+ }
+
+ options.Authority = configSection[nameof(options.Authority)] ?? options.Authority;
+ options.BackchannelTimeout = StringHelpers.ParseValueOrDefault(configSection[nameof(options.BackchannelTimeout)], _invariantTimeSpanParse, options.BackchannelTimeout);
+ options.Challenge = configSection[nameof(options.Challenge)] ?? options.Challenge;
+ options.ForwardAuthenticate = configSection[nameof(options.ForwardAuthenticate)] ?? options.ForwardAuthenticate;
+ options.ForwardChallenge = configSection[nameof(options.ForwardChallenge)] ?? options.ForwardChallenge;
+ options.ForwardDefault = configSection[nameof(options.ForwardDefault)] ?? options.ForwardDefault;
+ options.ForwardForbid = configSection[nameof(options.ForwardForbid)] ?? options.ForwardForbid;
+ options.ForwardSignIn = configSection[nameof(options.ForwardSignIn)] ?? options.ForwardSignIn;
+ options.ForwardSignOut = configSection[nameof(options.ForwardSignOut)] ?? options.ForwardSignOut;
+ options.IncludeErrorDetails = StringHelpers.ParseValueOrDefault(configSection[nameof(options.IncludeErrorDetails)], bool.Parse, options.IncludeErrorDetails);
+ options.MapInboundClaims = StringHelpers.ParseValueOrDefault( configSection[nameof(options.MapInboundClaims)], bool.Parse, options.MapInboundClaims);
+ options.MetadataAddress = configSection[nameof(options.MetadataAddress)] ?? options.MetadataAddress;
+ options.RefreshInterval = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RefreshInterval)], _invariantTimeSpanParse, options.RefreshInterval);
+ options.RefreshOnIssuerKeyNotFound = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RefreshOnIssuerKeyNotFound)], bool.Parse, options.RefreshOnIssuerKeyNotFound);
+ options.RequireHttpsMetadata = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RequireHttpsMetadata)], bool.Parse, options.RequireHttpsMetadata);
+ options.SaveToken = StringHelpers.ParseValueOrDefault(configSection[nameof(options.SaveToken)], bool.Parse, options.SaveToken);
+ options.TokenValidationParameters = new()
+ {
+ ValidateIssuer = issuers.Count > 0,
+ ValidIssuers = issuers,
+ ValidateAudience = audiences.Count > 0,
+ ValidAudiences = audiences,
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKeys = GetIssuerSigningKeys(configSection, issuers),
+ };
+ }
+
+ private static IEnumerable<SecurityKey> GetIssuerSigningKeys(IConfiguration configuration, List<string?> issuers)
+ {
+ foreach (var issuer in issuers)
+ {
+ var signingKey = configuration.GetSection("SigningKeys")
+ .GetChildren()
+ .SingleOrDefault(key => key["Issuer"] == issuer);
+ if (signingKey is not null && signingKey["Value"] is string keyValue)
+ {
+ yield return new SymmetricSecurityKey(Convert.FromBase64String(keyValue));
+ }
+ }
+ }
+
+ /// <inheritdoc />
+ public void Configure(JwtBearerOptions options)
+ {
+ Configure(Options.DefaultName, options);
+ }
+}
diff --git a/src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs b/src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs
index 12022ed078..f4a7ec2e9a 100644
--- a/src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs
+++ b/src/Security/Authentication/JwtBearer/src/JwtBearerExtensions.cs
@@ -25,6 +25,18 @@ public static class JwtBearerExtensions
=> builder.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, _ => { });
/// <summary>
+ /// Enables JWT-bearer authentication using a pre-defined scheme.
+ /// <para>
+ /// JWT bearer authentication performs authentication by extracting and validating a JWT token from the <c>Authorization</c> request header.
+ /// </para>
+ /// </summary>
+ /// <param name="builder">The <see cref="AuthenticationBuilder"/>.</param>
+ /// <param name="authenticationScheme">The authentication scheme.</param>
+ /// <returns>A reference to <paramref name="builder"/> after the operation has completed.</returns>
+ public static AuthenticationBuilder AddJwtBearer(this AuthenticationBuilder builder, string authenticationScheme)
+ => builder.AddJwtBearer(authenticationScheme, _ => { });
+
+ /// <summary>
/// Enables JWT-bearer authentication using the default scheme <see cref="JwtBearerDefaults.AuthenticationScheme"/>.
/// <para>
/// JWT bearer authentication performs authentication by extracting and validating a JWT token from the <c>Authorization</c> request header.
@@ -62,6 +74,7 @@ public static class JwtBearerExtensions
/// <returns>A reference to <paramref name="builder"/> after the operation has completed.</returns>
public static AuthenticationBuilder AddJwtBearer(this AuthenticationBuilder builder, string authenticationScheme, string? displayName, Action<JwtBearerOptions> configureOptions)
{
+ builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<JwtBearerOptions>, JwtBearerConfigureOptions>());
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<JwtBearerOptions>, JwtBearerPostConfigureOptions>());
return builder.AddScheme<JwtBearerOptions, JwtBearerHandler>(authenticationScheme, displayName, configureOptions);
}
diff --git a/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs b/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs
index 12e58584df..fd4b47ffa7 100644
--- a/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs
+++ b/src/Security/Authentication/JwtBearer/src/JwtBearerHandler.cs
@@ -178,7 +178,7 @@ public class JwtBearerHandler : AuthenticationHandler<JwtBearerOptions>
return AuthenticateResult.Fail(authenticationFailedContext.Exception);
}
- return AuthenticateResult.Fail("No SecurityTokenValidator available for token.");
+ return AuthenticateResults.ValidatorNotFound;
}
catch (Exception ex)
{
@@ -310,34 +310,24 @@ public class JwtBearerHandler : AuthenticationHandler<JwtBearerOptions>
{
// Order sensitive, some of these exceptions derive from others
// and we want to display the most specific message possible.
- switch (ex)
+ string? message = ex switch
{
- case SecurityTokenInvalidAudienceException stia:
- messages.Add($"The audience '{stia.InvalidAudience ?? "(null)"}' is invalid");
- break;
- case SecurityTokenInvalidIssuerException stii:
- messages.Add($"The issuer '{stii.InvalidIssuer ?? "(null)"}' is invalid");
- break;
- case SecurityTokenNoExpirationException _:
- messages.Add("The token has no expiration");
- break;
- case SecurityTokenInvalidLifetimeException stil:
- messages.Add("The token lifetime is invalid; NotBefore: "
- + $"'{stil.NotBefore?.ToString(CultureInfo.InvariantCulture) ?? "(null)"}'"
- + $", Expires: '{stil.Expires?.ToString(CultureInfo.InvariantCulture) ?? "(null)"}'");
- break;
- case SecurityTokenNotYetValidException stnyv:
- messages.Add($"The token is not valid before '{stnyv.NotBefore.ToString(CultureInfo.InvariantCulture)}'");
- break;
- case SecurityTokenExpiredException ste:
- messages.Add($"The token expired at '{ste.Expires.ToString(CultureInfo.InvariantCulture)}'");
- break;
- case SecurityTokenSignatureKeyNotFoundException _:
- messages.Add("The signature key was not found");
- break;
- case SecurityTokenInvalidSignatureException _:
- messages.Add("The signature is invalid");
- break;
+ SecurityTokenInvalidAudienceException stia => $"The audience '{stia.InvalidAudience ?? "(null)"}' is invalid",
+ SecurityTokenInvalidIssuerException stii => $"The issuer '{stii.InvalidIssuer ?? "(null)"}' is invalid",
+ SecurityTokenNoExpirationException _ => "The token has no expiration",
+ SecurityTokenInvalidLifetimeException stil => "The token lifetime is invalid; NotBefore: "
+ + $"'{stil.NotBefore?.ToString(CultureInfo.InvariantCulture) ?? "(null)"}'"
+ + $", Expires: '{stil.Expires?.ToString(CultureInfo.InvariantCulture) ?? "(null)"}'",
+ SecurityTokenNotYetValidException stnyv => $"The token is not valid before '{stnyv.NotBefore.ToString(CultureInfo.InvariantCulture)}'",
+ SecurityTokenExpiredException ste => $"The token expired at '{ste.Expires.ToString(CultureInfo.InvariantCulture)}'",
+ SecurityTokenSignatureKeyNotFoundException _ => "The signature key was not found",
+ SecurityTokenInvalidSignatureException _ => "The signature is invalid",
+ _ => null,
+ };
+
+ if (message is not null)
+ {
+ messages.Add(message);
}
}
diff --git a/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj b/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj
index b54ae6e24e..45c7f87f58 100644
--- a/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj
+++ b/src/Security/Authentication/JwtBearer/src/Microsoft.AspNetCore.Authentication.JwtBearer.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
@@ -13,4 +13,8 @@
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" />
</ItemGroup>
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)StringHelpers.cs" LinkBase="Shared" />
+ </ItemGroup>
+
</Project>
diff --git a/src/Security/Authentication/JwtBearer/src/PublicAPI.Shipped.txt b/src/Security/Authentication/JwtBearer/src/PublicAPI.Shipped.txt
index 05f2b5b5ce..736d93b934 100644
--- a/src/Security/Authentication/JwtBearer/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/JwtBearer/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration!>?
-~Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions.ConfigurationManager.set -> void
+Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration!>?
+Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions.ConfigurationManager.set -> void
const Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerDefaults.AuthenticationScheme = "Bearer" -> string!
Microsoft.AspNetCore.Authentication.JwtBearer.AuthenticationFailedContext
Microsoft.AspNetCore.Authentication.JwtBearer.AuthenticationFailedContext.AuthenticationFailedContext(Microsoft.AspNetCore.Http.HttpContext! context, Microsoft.AspNetCore.Authentication.AuthenticationScheme! scheme, Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions! options) -> void
diff --git a/src/Security/Authentication/JwtBearer/src/PublicAPI.Unshipped.txt b/src/Security/Authentication/JwtBearer/src/PublicAPI.Unshipped.txt
index 2c729aeee8..e66f11d82e 100644
--- a/src/Security/Authentication/JwtBearer/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authentication/JwtBearer/src/PublicAPI.Unshipped.txt
@@ -1,3 +1,4 @@
#nullable enable
*REMOVED*Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerPostConfigureOptions.PostConfigure(string! name, Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions! options) -> void
Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerPostConfigureOptions.PostConfigure(string? name, Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions! options) -> void
+static Microsoft.Extensions.DependencyInjection.JwtBearerExtensions.AddJwtBearer(this Microsoft.AspNetCore.Authentication.AuthenticationBuilder! builder, string! authenticationScheme) -> Microsoft.AspNetCore.Authentication.AuthenticationBuilder!
diff --git a/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj b/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj
index ff9cc3f3c7..b867497483 100644
--- a/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj
+++ b/src/Security/Authentication/MicrosoftAccount/src/Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Negotiate/src/Internal/NegotiateOptionsValidationStartupFilter.cs b/src/Security/Authentication/Negotiate/src/Internal/NegotiateOptionsValidationStartupFilter.cs
index 1afed8dc48..1fcb04b70e 100644
--- a/src/Security/Authentication/Negotiate/src/Internal/NegotiateOptionsValidationStartupFilter.cs
+++ b/src/Security/Authentication/Negotiate/src/Internal/NegotiateOptionsValidationStartupFilter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Authentication.Negotiate.Internal;
-internal class NegotiateOptionsValidationStartupFilter : IStartupFilter
+internal sealed class NegotiateOptionsValidationStartupFilter : IStartupFilter
{
private readonly string _authenticationScheme;
diff --git a/src/Security/Authentication/Negotiate/src/Internal/NegotiateState.cs b/src/Security/Authentication/Negotiate/src/Internal/NegotiateState.cs
new file mode 100644
index 0000000000..4d3e74e160
--- /dev/null
+++ b/src/Security/Authentication/Negotiate/src/Internal/NegotiateState.cs
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Security;
+using System.Security.Authentication;
+using System.Security.Claims;
+using System.Security.Principal;
+
+namespace Microsoft.AspNetCore.Authentication.Negotiate;
+
+internal sealed class NegotiateState : INegotiateState
+{
+ private static readonly NegotiateAuthenticationServerOptions _serverOptions = new();
+ private readonly NegotiateAuthentication _instance;
+
+ public NegotiateState()
+ {
+ _instance = new NegotiateAuthentication(_serverOptions);
+ }
+
+ public string? GetOutgoingBlob(string incomingBlob, out BlobErrorType status, out Exception? error)
+ {
+ var outgoingBlob = _instance.GetOutgoingBlob(incomingBlob, out var authStatus);
+
+ if (authStatus == NegotiateAuthenticationStatusCode.Completed ||
+ authStatus == NegotiateAuthenticationStatusCode.ContinueNeeded)
+ {
+ status = BlobErrorType.None;
+ error = null;
+ }
+ else
+ {
+ error = new AuthenticationException(authStatus.ToString());
+ if (IsCredentialError(authStatus))
+ {
+ status = BlobErrorType.CredentialError;
+ }
+ else if (IsClientError(authStatus))
+ {
+ status = BlobErrorType.ClientError;
+ }
+ else
+ {
+ status = BlobErrorType.Other;
+ }
+ }
+
+ return outgoingBlob;
+ }
+
+ public bool IsCompleted
+ {
+ get => _instance.IsAuthenticated;
+ }
+
+ public string Protocol
+ {
+ get => _instance.Package;
+ }
+
+ public IIdentity GetIdentity()
+ {
+ var remoteIdentity = _instance.RemoteIdentity;
+ return remoteIdentity is ClaimsIdentity claimsIdentity ? claimsIdentity.Clone() : remoteIdentity;
+ }
+
+ public void Dispose()
+ {
+ _instance.Dispose();
+ }
+
+ private static bool IsCredentialError(NegotiateAuthenticationStatusCode error)
+ {
+ return error == NegotiateAuthenticationStatusCode.UnknownCredentials ||
+ error == NegotiateAuthenticationStatusCode.CredentialsExpired ||
+ error == NegotiateAuthenticationStatusCode.BadBinding;
+ }
+
+ private static bool IsClientError(NegotiateAuthenticationStatusCode error)
+ {
+ return error == NegotiateAuthenticationStatusCode.InvalidToken ||
+ error == NegotiateAuthenticationStatusCode.QopNotSupported ||
+ error == NegotiateAuthenticationStatusCode.UnknownCredentials ||
+ error == NegotiateAuthenticationStatusCode.MessageAltered ||
+ error == NegotiateAuthenticationStatusCode.OutOfSequence ||
+ error == NegotiateAuthenticationStatusCode.InvalidCredentials;
+ }
+}
diff --git a/src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateStateFactory.cs b/src/Security/Authentication/Negotiate/src/Internal/NegotiateStateFactory.cs
index bc9028faf3..07bb5ff796 100644
--- a/src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateStateFactory.cs
+++ b/src/Security/Authentication/Negotiate/src/Internal/NegotiateStateFactory.cs
@@ -3,10 +3,10 @@
namespace Microsoft.AspNetCore.Authentication.Negotiate;
-internal class ReflectedNegotiateStateFactory : INegotiateStateFactory
+internal sealed class NegotiateStateFactory : INegotiateStateFactory
{
public INegotiateState CreateInstance()
{
- return new ReflectedNegotiateState();
+ return new NegotiateState();
}
}
diff --git a/src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateState.cs b/src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateState.cs
deleted file mode 100644
index 68edf94b81..0000000000
--- a/src/Security/Authentication/Negotiate/src/Internal/ReflectedNegotiateState.cs
+++ /dev/null
@@ -1,208 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-#pragma warning disable CA1810 // Initialize all static fields inline.
-
-using System.Linq;
-using System.Net;
-using System.Reflection;
-using System.Runtime.ExceptionServices;
-using System.Security.Authentication;
-using System.Security.Principal;
-
-namespace Microsoft.AspNetCore.Authentication.Negotiate;
-
-internal class ReflectedNegotiateState : INegotiateState
-{
- // https://www.gnu.org/software/gss/reference/gss.pdf
- private const uint GSS_S_NO_CRED = 7 << 16;
-
- private static readonly ConstructorInfo _constructor;
- private static readonly MethodInfo _getOutgoingBlob;
- private static readonly MethodInfo _isCompleted;
- private static readonly MethodInfo _protocol;
- private static readonly MethodInfo _getIdentity;
- private static readonly MethodInfo _closeContext;
- private static readonly FieldInfo _statusCode;
- private static readonly FieldInfo _statusException;
- private static readonly MethodInfo _getException;
- private static readonly FieldInfo? _gssMinorStatus;
- private static readonly Type? _gssExceptionType;
-
- private readonly object _instance;
-
- static ReflectedNegotiateState()
- {
- var secAssembly = typeof(AuthenticationException).Assembly;
- var ntAuthType = secAssembly.GetType("System.Net.NTAuthentication", throwOnError: true)!;
- _constructor = ntAuthType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).First();
- _getOutgoingBlob = ntAuthType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(info =>
- info.Name.Equals("GetOutgoingBlob") && info.GetParameters().Length == 3).Single();
- _isCompleted = ntAuthType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(info =>
- info.Name.Equals("get_IsCompleted")).Single();
- _protocol = ntAuthType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(info =>
- info.Name.Equals("get_ProtocolName")).Single();
- _closeContext = ntAuthType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance).Where(info =>
- info.Name.Equals("CloseContext")).Single();
-
- var securityStatusType = secAssembly.GetType("System.Net.SecurityStatusPal", throwOnError: true)!;
- _statusCode = securityStatusType.GetField("ErrorCode")!;
- _statusException = securityStatusType.GetField("Exception")!;
-
- if (!OperatingSystem.IsWindows())
- {
- var interopType = secAssembly.GetType("Interop", throwOnError: true)!;
- var netNativeType = interopType.GetNestedType("NetSecurityNative", BindingFlags.NonPublic | BindingFlags.Static)!;
- _gssExceptionType = netNativeType.GetNestedType("GssApiException", BindingFlags.NonPublic)!;
- _gssMinorStatus = _gssExceptionType.GetField("_minorStatus", BindingFlags.Instance | BindingFlags.NonPublic)!;
- }
-
- var negoStreamPalType = secAssembly.GetType("System.Net.Security.NegotiateStreamPal", throwOnError: true)!;
- _getIdentity = negoStreamPalType.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(info =>
- info.Name.Equals("GetIdentity")).Single();
- _getException = negoStreamPalType.GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Where(info =>
- info.Name.Equals("CreateExceptionFromError")).Single();
- }
-
- public ReflectedNegotiateState()
- {
- // internal NTAuthentication(bool isServer, string package, NetworkCredential credential, string spn, ContextFlagsPal requestedContextFlags, ChannelBinding channelBinding)
- var credential = CredentialCache.DefaultCredentials;
- _instance = _constructor.Invoke(new object?[] { true, "Negotiate", credential, null, 0, null });
- }
-
- // Copied rather than reflected to remove the IsCompleted -> CloseContext check.
- // The client doesn't need the context once auth is complete, but the server does.
- // I'm not sure why it auto-closes for the client given that the client closes it just a few lines later.
- // https://github.com/dotnet/corefx/blob/a3ab91e10045bb298f48c1d1f9bd5b0782a8ac46/src/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/AuthenticationHelper.NtAuth.cs#L134
- public string? GetOutgoingBlob(string incomingBlob, out BlobErrorType status, out Exception? error)
- {
- byte[]? decodedIncomingBlob = null;
- if (incomingBlob != null && incomingBlob.Length > 0)
- {
- decodedIncomingBlob = Convert.FromBase64String(incomingBlob);
- }
-
- byte[] decodedOutgoingBlob = GetOutgoingBlob(decodedIncomingBlob, out status, out error);
-
- string? outgoingBlob = null;
- if (decodedOutgoingBlob != null && decodedOutgoingBlob.Length > 0)
- {
- outgoingBlob = Convert.ToBase64String(decodedOutgoingBlob);
- }
-
- return outgoingBlob;
- }
-
- private byte[] GetOutgoingBlob(byte[]? incomingBlob, out BlobErrorType status, out Exception? error)
- {
- try
- {
- // byte[] GetOutgoingBlob(byte[] incomingBlob, bool throwOnError, out SecurityStatusPal statusCode)
- var parameters = new object?[] { incomingBlob, false, null };
- var blob = (byte[])_getOutgoingBlob.Invoke(_instance, parameters)!;
-
- var securityStatus = parameters[2];
- // TODO: Update after corefx changes
- error = (Exception?)(_statusException.GetValue(securityStatus)
- ?? _getException.Invoke(null, new[] { securityStatus }));
- var errorCode = (SecurityStatusPalErrorCode)_statusCode.GetValue(securityStatus)!;
-
- // TODO: Remove after corefx changes
- // The linux implementation always uses InternalError;
- if (errorCode == SecurityStatusPalErrorCode.InternalError
- && !OperatingSystem.IsWindows()
- && _gssExceptionType!.IsInstanceOfType(error))
- {
- var majorStatus = (uint)error.HResult;
- var minorStatus = (uint)_gssMinorStatus!.GetValue(error)!;
-
- // Remap specific errors
- if (majorStatus == GSS_S_NO_CRED && minorStatus == 0)
- {
- errorCode = SecurityStatusPalErrorCode.UnknownCredentials;
- }
-
- error = new Exception($"An authentication exception occurred (0x{majorStatus:X}/0x{minorStatus:X}).", error);
- }
-
- if (errorCode == SecurityStatusPalErrorCode.OK
- || errorCode == SecurityStatusPalErrorCode.ContinueNeeded
- || errorCode == SecurityStatusPalErrorCode.CompleteNeeded)
- {
- status = BlobErrorType.None;
- }
- else if (IsCredentialError(errorCode))
- {
- status = BlobErrorType.CredentialError;
- }
- else if (IsClientError(errorCode))
- {
- status = BlobErrorType.ClientError;
- }
- else
- {
- status = BlobErrorType.Other;
- }
-
- return blob;
- }
- catch (TargetInvocationException tex)
- {
- // Unwrap
- ExceptionDispatchInfo.Capture(tex.InnerException!).Throw();
- throw;
- }
- }
-
- public bool IsCompleted
- {
- get => (bool)_isCompleted.Invoke(_instance, Array.Empty<object>())!;
- }
-
- public string Protocol
- {
- get => (string)_protocol.Invoke(_instance, Array.Empty<object>())!;
- }
-
- public IIdentity GetIdentity()
- {
- return (IIdentity)_getIdentity.Invoke(obj: null, parameters: new object[] { _instance })!;
- }
-
- public void Dispose()
- {
- _closeContext.Invoke(_instance, Array.Empty<object>());
- }
-
- private static bool IsCredentialError(SecurityStatusPalErrorCode error)
- {
- return error == SecurityStatusPalErrorCode.LogonDenied ||
- error == SecurityStatusPalErrorCode.UnknownCredentials ||
- error == SecurityStatusPalErrorCode.NoImpersonation ||
- error == SecurityStatusPalErrorCode.NoAuthenticatingAuthority ||
- error == SecurityStatusPalErrorCode.UntrustedRoot ||
- error == SecurityStatusPalErrorCode.CertExpired ||
- error == SecurityStatusPalErrorCode.SmartcardLogonRequired ||
- error == SecurityStatusPalErrorCode.BadBinding;
- }
-
- private static bool IsClientError(SecurityStatusPalErrorCode error)
- {
- return error == SecurityStatusPalErrorCode.InvalidToken ||
- error == SecurityStatusPalErrorCode.CannotPack ||
- error == SecurityStatusPalErrorCode.QopNotSupported ||
- error == SecurityStatusPalErrorCode.NoCredentials ||
- error == SecurityStatusPalErrorCode.MessageAltered ||
- error == SecurityStatusPalErrorCode.OutOfSequence ||
- error == SecurityStatusPalErrorCode.IncompleteMessage ||
- error == SecurityStatusPalErrorCode.IncompleteCredentials ||
- error == SecurityStatusPalErrorCode.WrongPrincipal ||
- error == SecurityStatusPalErrorCode.TimeSkew ||
- error == SecurityStatusPalErrorCode.IllegalMessage ||
- error == SecurityStatusPalErrorCode.CertUnknown ||
- error == SecurityStatusPalErrorCode.AlgorithmMismatch ||
- error == SecurityStatusPalErrorCode.SecurityQosFailed ||
- error == SecurityStatusPalErrorCode.UnsupportedPreauth;
- }
-}
diff --git a/src/Security/Authentication/Negotiate/src/Internal/SecurityStatusPalErrorCode.cs b/src/Security/Authentication/Negotiate/src/Internal/SecurityStatusPalErrorCode.cs
deleted file mode 100644
index 4abac7f4e1..0000000000
--- a/src/Security/Authentication/Negotiate/src/Internal/SecurityStatusPalErrorCode.cs
+++ /dev/null
@@ -1,53 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.Authentication.Negotiate;
-
-internal enum SecurityStatusPalErrorCode
-{
- NotSet = 0,
- OK,
- ContinueNeeded,
- CompleteNeeded,
- CompAndContinue,
- ContextExpired,
- CredentialsNeeded,
- Renegotiate,
-
- // Errors
- OutOfMemory,
- InvalidHandle,
- Unsupported,
- TargetUnknown,
- InternalError,
- PackageNotFound,
- NotOwner,
- CannotInstall,
- InvalidToken,
- CannotPack,
- QopNotSupported,
- NoImpersonation,
- LogonDenied,
- UnknownCredentials,
- NoCredentials,
- MessageAltered,
- OutOfSequence,
- NoAuthenticatingAuthority,
- IncompleteMessage,
- IncompleteCredentials,
- BufferNotEnough,
- WrongPrincipal,
- TimeSkew,
- UntrustedRoot,
- IllegalMessage,
- CertUnknown,
- CertExpired,
- DecryptFailure,
- AlgorithmMismatch,
- SecurityQosFailed,
- SmartcardLogonRequired,
- UnsupportedPreauth,
- BadBinding,
- DowngradeDetected,
- ApplicationProtocolMismatch
-}
diff --git a/src/Security/Authentication/Negotiate/src/Microsoft.AspNetCore.Authentication.Negotiate.csproj b/src/Security/Authentication/Negotiate/src/Microsoft.AspNetCore.Authentication.Negotiate.csproj
index fe9c418c7e..edfcac2a4d 100644
--- a/src/Security/Authentication/Negotiate/src/Microsoft.AspNetCore.Authentication.Negotiate.csproj
+++ b/src/Security/Authentication/Negotiate/src/Microsoft.AspNetCore.Authentication.Negotiate.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Negotiate/src/NegotiateHandler.cs b/src/Security/Authentication/Negotiate/src/NegotiateHandler.cs
index 5acbb6f12b..12c7395f66 100644
--- a/src/Security/Authentication/Negotiate/src/NegotiateHandler.cs
+++ b/src/Security/Authentication/Negotiate/src/NegotiateHandler.cs
@@ -416,7 +416,7 @@ public class NegotiateHandler : AuthenticationHandler<NegotiateOptions>, IAuthen
}
// This allows us to have one disposal registration per connection and limits churn on the Items collection.
- private class AuthPersistence : IDisposable
+ private sealed class AuthPersistence : IDisposable
{
internal INegotiateState? State { get; set; }
diff --git a/src/Security/Authentication/Negotiate/src/NegotiateOptions.cs b/src/Security/Authentication/Negotiate/src/NegotiateOptions.cs
index bcf86af754..4a92b6b417 100644
--- a/src/Security/Authentication/Negotiate/src/NegotiateOptions.cs
+++ b/src/Security/Authentication/Negotiate/src/NegotiateOptions.cs
@@ -76,5 +76,5 @@ public class NegotiateOptions : AuthenticationSchemeOptions
internal bool DeferToServer { get; set; }
// For testing
- internal INegotiateStateFactory StateFactory { get; set; } = new ReflectedNegotiateStateFactory();
+ internal INegotiateStateFactory StateFactory { get; set; } = new NegotiateStateFactory();
}
diff --git a/src/Security/Authentication/Negotiate/test/Negotiate.Test/EventTests.cs b/src/Security/Authentication/Negotiate/test/Negotiate.Test/EventTests.cs
index d2e53fa2e8..0a9f556c83 100644
--- a/src/Security/Authentication/Negotiate/test/Negotiate.Test/EventTests.cs
+++ b/src/Security/Authentication/Negotiate/test/Negotiate.Test/EventTests.cs
@@ -411,7 +411,7 @@ public class EventTests
var builder = new HostBuilder()
.ConfigureServices(services => services
.AddRouting()
- .AddAuthentication(NegotiateDefaults.AuthenticationScheme)
+ .AddAuthentication()
.AddNegotiate(options =>
{
options.StateFactory = new TestNegotiateStateFactory();
diff --git a/src/Security/Authentication/Negotiate/test/Negotiate.Test/NegotiateHandlerTests.cs b/src/Security/Authentication/Negotiate/test/Negotiate.Test/NegotiateHandlerTests.cs
index b41ee5556d..f84b5b5b57 100644
--- a/src/Security/Authentication/Negotiate/test/Negotiate.Test/NegotiateHandlerTests.cs
+++ b/src/Security/Authentication/Negotiate/test/Negotiate.Test/NegotiateHandlerTests.cs
@@ -255,7 +255,7 @@ public class NegotiateHandlerTests
{
var builder = new HostBuilder()
.ConfigureServices(services => services
- .AddAuthentication(NegotiateDefaults.AuthenticationScheme)
+ .AddAuthentication()
.AddNegotiate(options =>
{
options.StateFactory = new TestNegotiateStateFactory();
@@ -382,7 +382,7 @@ public class NegotiateHandlerTests
var builder = new HostBuilder()
.ConfigureServices(services => services
.AddRouting()
- .AddAuthentication(NegotiateDefaults.AuthenticationScheme)
+ .AddAuthentication()
.AddNegotiate(options =>
{
options.StateFactory = new TestNegotiateStateFactory();
diff --git a/src/Security/Authentication/Negotiate/test/Negotiate.Test/ServerDeferralTests.cs b/src/Security/Authentication/Negotiate/test/Negotiate.Test/ServerDeferralTests.cs
index ba106aec5b..5fbe301936 100644
--- a/src/Security/Authentication/Negotiate/test/Negotiate.Test/ServerDeferralTests.cs
+++ b/src/Security/Authentication/Negotiate/test/Negotiate.Test/ServerDeferralTests.cs
@@ -44,7 +44,7 @@ public class ServerDeferralTests
var builder = new HostBuilder()
.ConfigureServices(services =>
{
- services.AddAuthentication(NegotiateDefaults.AuthenticationScheme)
+ services.AddAuthentication()
.AddNegotiate();
if (supportsAuth)
diff --git a/src/Security/Authentication/OAuth/src/HandleRequestResults.cs b/src/Security/Authentication/OAuth/src/HandleRequestResults.cs
new file mode 100644
index 0000000000..8087ed1c1a
--- /dev/null
+++ b/src/Security/Authentication/OAuth/src/HandleRequestResults.cs
@@ -0,0 +1,9 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.OAuth;
+
+internal static class HandleRequestResults
+{
+ internal static HandleRequestResult InvalidState = HandleRequestResult.Fail("The oauth state was missing or invalid.");
+}
diff --git a/src/Security/Authentication/OAuth/src/Microsoft.AspNetCore.Authentication.OAuth.csproj b/src/Security/Authentication/OAuth/src/Microsoft.AspNetCore.Authentication.OAuth.csproj
index c3e2e400e4..204e60ed0d 100644
--- a/src/Security/Authentication/OAuth/src/Microsoft.AspNetCore.Authentication.OAuth.csproj
+++ b/src/Security/Authentication/OAuth/src/Microsoft.AspNetCore.Authentication.OAuth.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/OAuth/src/OAuthHandler.cs b/src/Security/Authentication/OAuth/src/OAuthHandler.cs
index 0cf7bdf8d3..31f3079634 100644
--- a/src/Security/Authentication/OAuth/src/OAuthHandler.cs
+++ b/src/Security/Authentication/OAuth/src/OAuthHandler.cs
@@ -61,7 +61,7 @@ public class OAuthHandler<TOptions> : RemoteAuthenticationHandler<TOptions> wher
if (properties == null)
{
- return HandleRequestResult.Fail("The oauth state was missing or invalid.");
+ return HandleRequestResults.InvalidState;
}
// OAuth2 10.12 CSRF
@@ -211,7 +211,7 @@ public class OAuthHandler<TOptions> : RemoteAuthenticationHandler<TOptions> wher
requestMessage.Content = requestContent;
requestMessage.Version = Backchannel.DefaultRequestVersion;
var response = await Backchannel.SendAsync(requestMessage, Context.RequestAborted);
- var body = await response.Content.ReadAsStringAsync();
+ var body = await response.Content.ReadAsStringAsync(Context.RequestAborted);
return response.IsSuccessStatusCode switch
{
diff --git a/src/Security/Authentication/OAuth/src/PublicAPI.Shipped.txt b/src/Security/Authentication/OAuth/src/PublicAPI.Shipped.txt
index 2f4ec88a86..cca519ec5b 100644
--- a/src/Security/Authentication/OAuth/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/OAuth/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler<TOptions>
-~Microsoft.Extensions.DependencyInjection.OAuthPostConfigureOptions<TOptions, THandler>
+Microsoft.AspNetCore.Authentication.OAuth.OAuthHandler<TOptions>
+Microsoft.Extensions.DependencyInjection.OAuthPostConfigureOptions<TOptions, THandler>
abstract Microsoft.AspNetCore.Authentication.OAuth.Claims.ClaimAction.Run(System.Text.Json.JsonElement userData, System.Security.Claims.ClaimsIdentity! identity, string! issuer) -> void
Microsoft.AspNetCore.Authentication.ClaimActionCollectionMapExtensions
Microsoft.AspNetCore.Authentication.OAuth.Claims.ClaimAction
diff --git a/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/MinimalOpenIdConnectSample.csproj b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/MinimalOpenIdConnectSample.csproj
new file mode 100644
index 0000000000..f1b23925c4
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/MinimalOpenIdConnectSample.csproj
@@ -0,0 +1,15 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <Nullable>enable</Nullable>
+ <ImplicitUsings>enable</ImplicitUsings>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
+ <Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
+ <Reference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Program.cs b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Program.cs
new file mode 100644
index 0000000000..ac25f60200
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Program.cs
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+using System.Security.Claims;
+
+var builder = WebApplication.CreateBuilder(args);
+
+builder.Services
+ .AddAuthentication("OpenIdConnect")
+ .AddCookie()
+ .AddOpenIdConnect();
+builder.Services.AddAuthorization();
+
+var app = builder.Build();
+
+app.MapGet("/protected", (ClaimsPrincipal user) => $"Hello {user.Identity?.Name}!")
+ .RequireAuthorization();
+
+app.Run();
diff --git a/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Properties/launchSettings.json b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Properties/launchSettings.json
new file mode 100644
index 0000000000..6c73c375d4
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/Properties/launchSettings.json
@@ -0,0 +1,37 @@
+{
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:2726",
+ "sslPort": 44308
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "http://localhost:5204",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:7282;http://localhost:5204",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.Development.json b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.Development.json
new file mode 100644
index 0000000000..0c208ae918
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.json b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.json
new file mode 100644
index 0000000000..10f68b8c8b
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/samples/MinimalOpenIdConnectSample/appsettings.json
@@ -0,0 +1,9 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/Security/Authentication/OpenIdConnect/src/HandleRequestResults.cs b/src/Security/Authentication/OpenIdConnect/src/HandleRequestResults.cs
new file mode 100644
index 0000000000..e027e1c8e1
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/src/HandleRequestResults.cs
@@ -0,0 +1,10 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.OpenIdConnect;
+
+internal static class HandleRequestResults
+{
+ internal static HandleRequestResult UnexpectedParams = HandleRequestResult.Fail("An OpenID Connect response cannot contain an identity token or an access token when using response_mode=query");
+ internal static HandleRequestResult NoMessage = HandleRequestResult.Fail("No message.");
+}
diff --git a/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj b/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj
index b51566495a..68b81587a9 100644
--- a/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj
+++ b/src/Security/Authentication/OpenIdConnect/src/Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
@@ -13,4 +13,8 @@
<Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" />
</ItemGroup>
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)StringHelpers.cs" LinkBase="Shared" />
+ </ItemGroup>
+
</Project>
diff --git a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectConfigureOptions.cs b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectConfigureOptions.cs
new file mode 100644
index 0000000000..e90f4dab96
--- /dev/null
+++ b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectConfigureOptions.cs
@@ -0,0 +1,128 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.Linq;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Authentication.OpenIdConnect;
+
+internal sealed class OpenIdConnectConfigureOptions : IConfigureNamedOptions<OpenIdConnectOptions>
+{
+ private readonly IAuthenticationConfigurationProvider _authenticationConfigurationProvider;
+ private static readonly Func<string, TimeSpan> _invariantTimeSpanParse = (string timespanString) => TimeSpan.Parse(timespanString, CultureInfo.InvariantCulture);
+ private static readonly Func<string, TimeSpan?> _invariantNullableTimeSpanParse = (string timespanString) => TimeSpan.Parse(timespanString, CultureInfo.InvariantCulture);
+
+ /// <summary>
+ /// Initializes a new <see cref="OpenIdConnectConfigureOptions"/> given the configuration
+ /// provided by the <paramref name="configurationProvider"/>.
+ /// </summary>
+ /// <param name="configurationProvider">An <see cref="IAuthenticationConfigurationProvider"/> instance.</param>
+ public OpenIdConnectConfigureOptions(IAuthenticationConfigurationProvider configurationProvider)
+ {
+ _authenticationConfigurationProvider = configurationProvider;
+ }
+
+ /// <inheritdoc />
+ public void Configure(string? name, OpenIdConnectOptions options)
+ {
+ if (string.IsNullOrEmpty(name))
+ {
+ return;
+ }
+
+ var configSection = _authenticationConfigurationProvider.GetSchemeConfiguration(name);
+
+ if (configSection is null || !configSection.GetChildren().Any())
+ {
+ return;
+ }
+
+ options.AccessDeniedPath = new PathString(configSection[nameof(options.AccessDeniedPath)] ?? options.AccessDeniedPath.Value);
+ options.Authority = configSection[nameof(options.Authority)] ?? options.Authority;
+ options.AutomaticRefreshInterval = StringHelpers.ParseValueOrDefault(configSection[nameof(options.AutomaticRefreshInterval)], _invariantTimeSpanParse, options.AutomaticRefreshInterval);
+ options.BackchannelTimeout = StringHelpers.ParseValueOrDefault(configSection[nameof(options.BackchannelTimeout)], _invariantTimeSpanParse, options.BackchannelTimeout);
+ options.CallbackPath = new PathString(configSection[nameof(options.CallbackPath)] ?? options.CallbackPath.Value);
+ options.ClaimsIssuer = configSection[nameof(options.ClaimsIssuer)] ?? options.ClaimsIssuer;
+ options.ClientId = configSection[nameof(options.ClientId)] ?? options.ClientId;
+ options.ClientSecret = configSection[nameof(options.ClientSecret)] ?? options.ClientSecret;
+ SetCookieFromConfig(configSection.GetSection(nameof(options.CorrelationCookie)), options.CorrelationCookie);
+ options.DisableTelemetry = StringHelpers.ParseValueOrDefault(configSection[nameof(options.DisableTelemetry)], bool.Parse, options.DisableTelemetry);
+ options.ForwardAuthenticate = configSection[nameof(options.ForwardAuthenticate)] ?? options.ForwardAuthenticate;
+ options.ForwardChallenge = configSection[nameof(options.ForwardChallenge)] ?? options.ForwardChallenge;
+ options.ForwardDefault = configSection[nameof(options.ForwardDefault)] ?? options.ForwardDefault;
+ options.ForwardForbid = configSection[nameof(options.ForwardForbid)] ?? options.ForwardForbid;
+ options.ForwardSignIn = configSection[nameof(options.ForwardSignIn)] ?? options.ForwardSignIn;
+ options.ForwardSignOut = configSection[nameof(options.ForwardSignOut)] ?? options.ForwardSignOut;
+ options.GetClaimsFromUserInfoEndpoint = StringHelpers.ParseValueOrDefault(configSection[nameof(options.GetClaimsFromUserInfoEndpoint)], bool.Parse, options.GetClaimsFromUserInfoEndpoint);
+ options.MapInboundClaims = StringHelpers.ParseValueOrDefault(configSection[nameof(options.MapInboundClaims)], bool.Parse, options.MapInboundClaims);
+ options.MaxAge = StringHelpers.ParseValueOrDefault(configSection[nameof(options.MaxAge)], _invariantNullableTimeSpanParse, options.MaxAge);
+ options.MetadataAddress = configSection[nameof(options.MetadataAddress)] ?? options.MetadataAddress;
+ SetCookieFromConfig(configSection.GetSection(nameof(options.NonceCookie)), options.NonceCookie);
+ options.Prompt = configSection[nameof(options.Prompt)] ?? options.Prompt;
+ options.RefreshInterval = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RefreshInterval)], _invariantTimeSpanParse, options.RefreshInterval);
+ options.RefreshOnIssuerKeyNotFound = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RefreshOnIssuerKeyNotFound)], bool.Parse, options.RefreshOnIssuerKeyNotFound);
+ options.RemoteAuthenticationTimeout = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RemoteAuthenticationTimeout)], _invariantTimeSpanParse, options.RemoteAuthenticationTimeout);
+ options.RemoteSignOutPath = new PathString(configSection[nameof(options.RemoteSignOutPath)] ?? options.RemoteSignOutPath.Value);
+ options.RequireHttpsMetadata = StringHelpers.ParseValueOrDefault(configSection[nameof(options.RequireHttpsMetadata)], bool.Parse, options.RequireHttpsMetadata);
+ options.Resource = configSection[nameof(options.Resource)] ?? options.Resource;
+ options.ResponseMode = configSection[nameof(options.ResponseMode)] ?? options.ResponseMode;
+ options.ResponseType = configSection[nameof(options.ResponseType)] ?? options.ResponseType;
+ options.ReturnUrlParameter = configSection[nameof(options.ReturnUrlParameter)] ?? options.ReturnUrlParameter;
+ options.SaveTokens = StringHelpers.ParseValueOrDefault(configSection[nameof(options.SaveTokens)], bool.Parse, options.SaveTokens);
+ ClearAndSetListOption(options.Scope, configSection.GetSection(nameof(options.Scope)));
+ options.SignedOutCallbackPath = new PathString(configSection[nameof(options.SignedOutCallbackPath)] ?? options.SignedOutCallbackPath.Value);
+ options.SignedOutRedirectUri = configSection[nameof(options.SignedOutRedirectUri)] ?? options.SignedOutRedirectUri;
+ options.SignInScheme = configSection[nameof(options.SignInScheme)] ?? options.SignInScheme;
+ options.SignOutScheme = configSection[nameof(options.SignOutScheme)] ?? options.SignOutScheme;
+ options.SkipUnrecognizedRequests = StringHelpers.ParseValueOrDefault(configSection[nameof(options.SkipUnrecognizedRequests)], bool.Parse, options.SkipUnrecognizedRequests);
+ options.UsePkce = StringHelpers.ParseValueOrDefault(configSection[nameof(options.UsePkce)], bool.Parse, options.UsePkce);
+ options.UseTokenLifetime = StringHelpers.ParseValueOrDefault(configSection[nameof(options.UseTokenLifetime)], bool.Parse, options.UseTokenLifetime);
+ }
+
+ private static void SetCookieFromConfig(IConfiguration cookieConfigSection, CookieBuilder cookieBuilder)
+ {
+ if (cookieConfigSection is null || !cookieConfigSection.GetChildren().Any())
+ {
+ return;
+ }
+
+ // Override the existing defaults when values are set instead of constructing
+ // an entirely new CookieBuilder.
+ cookieBuilder.Domain = cookieConfigSection[nameof(cookieBuilder.Domain)] ?? cookieBuilder.Domain;
+ cookieBuilder.HttpOnly = StringHelpers.ParseValueOrDefault(cookieConfigSection[nameof(cookieBuilder.HttpOnly)], bool.Parse, cookieBuilder.HttpOnly);
+ cookieBuilder.IsEssential = StringHelpers.ParseValueOrDefault(cookieConfigSection[nameof(cookieBuilder.IsEssential)], bool.Parse, cookieBuilder.IsEssential);
+ cookieBuilder.Expiration = StringHelpers.ParseValueOrDefault(cookieConfigSection[nameof(cookieBuilder.Expiration)], _invariantNullableTimeSpanParse, cookieBuilder.Expiration);
+ cookieBuilder.MaxAge = StringHelpers.ParseValueOrDefault<TimeSpan?>(cookieConfigSection[nameof(cookieBuilder.MaxAge)], _invariantNullableTimeSpanParse, cookieBuilder.MaxAge);
+ cookieBuilder.Name = cookieConfigSection[nameof(CookieBuilder.Name)] ?? cookieBuilder.Name;
+ cookieBuilder.Path = cookieConfigSection[nameof(CookieBuilder.Path)] ?? cookieBuilder.Path;
+ cookieBuilder.SameSite = cookieConfigSection[nameof(CookieBuilder.SameSite)] is string sameSiteMode
+ ? Enum.Parse<SameSiteMode>(sameSiteMode, ignoreCase: true)
+ : cookieBuilder.SameSite;
+ cookieBuilder.SecurePolicy = cookieConfigSection[nameof(CookieBuilder.SecurePolicy)] is string securePolicy
+ ? Enum.Parse<CookieSecurePolicy>(securePolicy, ignoreCase: true)
+ : cookieBuilder.SecurePolicy;
+ ClearAndSetListOption(cookieBuilder.Extensions, cookieConfigSection.GetSection(nameof(cookieBuilder.Extensions)));
+ }
+
+ private static void ClearAndSetListOption(ICollection<string> listOption, IConfigurationSection listConfigSection)
+ {
+ var elementsFromConfig = listConfigSection.GetChildren().Select(element => element.Value).OfType<string>();
+ if (elementsFromConfig.Any())
+ {
+ listOption.Clear();
+ foreach (var element in elementsFromConfig)
+ {
+ listOption.Add(element);
+ }
+ }
+ }
+
+ /// <inheritdoc />
+ public void Configure(OpenIdConnectOptions options)
+ {
+ Configure(Options.DefaultName, options);
+ }
+}
diff --git a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectExtensions.cs b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectExtensions.cs
index 1a1a7af1ac..a457a1fe29 100644
--- a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectExtensions.cs
+++ b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectExtensions.cs
@@ -68,6 +68,7 @@ public static class OpenIdConnectExtensions
/// <returns>A reference to <paramref name="builder"/> after the operation has completed.</returns>
public static AuthenticationBuilder AddOpenIdConnect(this AuthenticationBuilder builder, string authenticationScheme, string? displayName, Action<OpenIdConnectOptions> configureOptions)
{
+ builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<OpenIdConnectOptions>, OpenIdConnectConfigureOptions>());
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IPostConfigureOptions<OpenIdConnectOptions>, OpenIdConnectPostConfigureOptions>());
return builder.AddRemoteScheme<OpenIdConnectOptions, OpenIdConnectHandler>(authenticationScheme, displayName, configureOptions);
}
diff --git a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectHandler.cs b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectHandler.cs
index c7588a16ed..7d17807757 100644
--- a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectHandler.cs
+++ b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectHandler.cs
@@ -522,8 +522,7 @@ public class OpenIdConnectHandler : RemoteAuthenticationHandler<OpenIdConnectOpt
// Not for us?
return HandleRequestResult.SkipHandler();
}
- return HandleRequestResult.Fail("An OpenID Connect response cannot contain an " +
- "identity token or an access token when using response_mode=query");
+ return HandleRequestResults.UnexpectedParams;
}
}
// assumption: if the ContentType is "application/x-www-form-urlencoded" it should be safe to read as it is small.
@@ -548,7 +547,7 @@ public class OpenIdConnectHandler : RemoteAuthenticationHandler<OpenIdConnectOpt
// Not for us?
return HandleRequestResult.SkipHandler();
}
- return HandleRequestResult.Fail("No message.");
+ return HandleRequestResults.NoMessage;
}
AuthenticationProperties? properties = null;
diff --git a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs
index 82b597ce4a..d4016bd658 100644
--- a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs
+++ b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectOptions.cs
@@ -304,7 +304,7 @@ public class OpenIdConnectOptions : RemoteAuthenticationOptions
/// </summary>
public bool UsePkce { get; set; } = true;
- private class OpenIdConnectNonceCookieBuilder : RequestPathBaseCookieBuilder
+ private sealed class OpenIdConnectNonceCookieBuilder : RequestPathBaseCookieBuilder
{
private readonly OpenIdConnectOptions _options;
diff --git a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectPostConfigureOptions.cs b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectPostConfigureOptions.cs
index aca849c3aa..0553656cac 100644
--- a/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectPostConfigureOptions.cs
+++ b/src/Security/Authentication/OpenIdConnect/src/OpenIdConnectPostConfigureOptions.cs
@@ -110,7 +110,7 @@ public class OpenIdConnectPostConfigureOptions : IPostConfigureOptions<OpenIdCon
}
}
- private class StringSerializer : IDataSerializer<string>
+ private sealed class StringSerializer : IDataSerializer<string>
{
public string Deserialize(byte[] data)
{
diff --git a/src/Security/Authentication/OpenIdConnect/src/PublicAPI.Shipped.txt b/src/Security/Authentication/OpenIdConnect/src/PublicAPI.Shipped.txt
index d12c43f7f8..98a791fe9e 100644
--- a/src/Security/Authentication/OpenIdConnect/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/OpenIdConnect/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration!>?
-~Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions.ConfigurationManager.set -> void
+Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfiguration!>?
+Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions.ConfigurationManager.set -> void
const Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectDefaults.AuthenticationScheme = "OpenIdConnect" -> string!
Microsoft.AspNetCore.Authentication.ClaimActionCollectionUniqueExtensions
Microsoft.AspNetCore.Authentication.OpenIdConnect.AuthenticationFailedContext
diff --git a/src/Security/Authentication/Twitter/src/HandleRequestResults.cs b/src/Security/Authentication/Twitter/src/HandleRequestResults.cs
new file mode 100644
index 0000000000..21960dea6f
--- /dev/null
+++ b/src/Security/Authentication/Twitter/src/HandleRequestResults.cs
@@ -0,0 +1,9 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.Twitter;
+
+internal static class HandleRequestResults
+{
+ internal static HandleRequestResult InvalidStateCookie = HandleRequestResult.Fail("Invalid state cookie.");
+}
diff --git a/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj b/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj
index 194713d2ce..c868859675 100644
--- a/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj
+++ b/src/Security/Authentication/Twitter/src/Microsoft.AspNetCore.Authentication.Twitter.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/Twitter/src/PublicAPI.Shipped.txt b/src/Security/Authentication/Twitter/src/PublicAPI.Shipped.txt
index 3a92691f98..9cf92a9830 100644
--- a/src/Security/Authentication/Twitter/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/Twitter/src/PublicAPI.Shipped.txt
@@ -1,37 +1,6 @@
#nullable enable
~const Microsoft.AspNetCore.Authentication.Twitter.TwitterDefaults.AuthenticationScheme = "Twitter" -> string
-~Microsoft.AspNetCore.Authentication.Twitter.AccessToken.ScreenName.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.AccessToken.ScreenName.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.AccessToken.UserId.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.AccessToken.UserId.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.RequestToken.Properties.get -> Microsoft.AspNetCore.Authentication.AuthenticationProperties
-~Microsoft.AspNetCore.Authentication.Twitter.RequestToken.Properties.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.RequestToken.Token.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.RequestToken.Token.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.RequestToken.TokenSecret.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.RequestToken.TokenSecret.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterCreatingTicketContext.AccessToken.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterCreatingTicketContext.AccessTokenSecret.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterCreatingTicketContext.ScreenName.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterCreatingTicketContext.TwitterCreatingTicketContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions options, System.Security.Claims.ClaimsPrincipal principal, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties, string userId, string screenName, string accessToken, string accessTokenSecret, System.Text.Json.JsonElement user) -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterCreatingTicketContext.UserId.get -> string
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterEvents.OnCreatingTicket.get -> System.Func<Microsoft.AspNetCore.Authentication.Twitter.TwitterCreatingTicketContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterEvents.OnCreatingTicket.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterEvents.OnRedirectToAuthorizationEndpoint.get -> System.Func<Microsoft.AspNetCore.Authentication.RedirectContext<Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions>, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterEvents.OnRedirectToAuthorizationEndpoint.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterHandler.Events.get -> Microsoft.AspNetCore.Authentication.Twitter.TwitterEvents
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterHandler.Events.set -> void
~Microsoft.AspNetCore.Authentication.Twitter.TwitterHandler.TwitterHandler(Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions> options, Microsoft.Extensions.Logging.ILoggerFactory logger, System.Text.Encodings.Web.UrlEncoder encoder, Microsoft.AspNetCore.Authentication.ISystemClock clock) -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.ClaimActions.get -> Microsoft.AspNetCore.Authentication.OAuth.Claims.ClaimActionCollection
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.ConsumerKey.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.ConsumerSecret.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.Events.get -> Microsoft.AspNetCore.Authentication.Twitter.TwitterEvents
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.Events.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.StateCookie.get -> Microsoft.AspNetCore.Http.CookieBuilder
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.StateCookie.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.StateDataFormat.get -> Microsoft.AspNetCore.Authentication.ISecureDataFormat<Microsoft.AspNetCore.Authentication.Twitter.RequestToken>
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions.StateDataFormat.set -> void
-~Microsoft.AspNetCore.Authentication.Twitter.TwitterPostConfigureOptions.PostConfigure(string name, Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions options) -> void
~Microsoft.AspNetCore.Authentication.Twitter.TwitterPostConfigureOptions.TwitterPostConfigureOptions(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtection) -> void
~override Microsoft.AspNetCore.Authentication.Twitter.TwitterHandler.CreateEventsAsync() -> System.Threading.Tasks.Task<object>
~override Microsoft.AspNetCore.Authentication.Twitter.TwitterHandler.HandleChallengeAsync(Microsoft.AspNetCore.Authentication.AuthenticationProperties properties) -> System.Threading.Tasks.Task
diff --git a/src/Security/Authentication/Twitter/src/PublicAPI.Unshipped.txt b/src/Security/Authentication/Twitter/src/PublicAPI.Unshipped.txt
index c0962460ff..873a23ae00 100644
--- a/src/Security/Authentication/Twitter/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authentication/Twitter/src/PublicAPI.Unshipped.txt
@@ -1,5 +1,3 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Authentication.Twitter.TwitterPostConfigureOptions.PostConfigure(string name, Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Authentication.Twitter.TwitterPostConfigureOptions.TwitterPostConfigureOptions(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtection) -> void
*REMOVED*Microsoft.AspNetCore.Authentication.Twitter.TwitterPostConfigureOptions.PostConfigure(string! name, Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions! options) -> void
Microsoft.AspNetCore.Authentication.Twitter.TwitterPostConfigureOptions.PostConfigure(string? name, Microsoft.AspNetCore.Authentication.Twitter.TwitterOptions! options) -> void
diff --git a/src/Security/Authentication/Twitter/src/TwitterError.cs b/src/Security/Authentication/Twitter/src/TwitterError.cs
index 6feb643dae..f397d887e3 100644
--- a/src/Security/Authentication/Twitter/src/TwitterError.cs
+++ b/src/Security/Authentication/Twitter/src/TwitterError.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Authentication.Twitter;
-internal class TwitterError
+internal sealed class TwitterError
{
public int Code { get; set; }
public string? Message { get; set; }
diff --git a/src/Security/Authentication/Twitter/src/TwitterErrorResponse.cs b/src/Security/Authentication/Twitter/src/TwitterErrorResponse.cs
index bdf7c1498c..1781aa1299 100644
--- a/src/Security/Authentication/Twitter/src/TwitterErrorResponse.cs
+++ b/src/Security/Authentication/Twitter/src/TwitterErrorResponse.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Authentication.Twitter;
-internal class TwitterErrorResponse
+internal sealed class TwitterErrorResponse
{
public List<TwitterError>? Errors { get; set; }
}
diff --git a/src/Security/Authentication/Twitter/src/TwitterHandler.cs b/src/Security/Authentication/Twitter/src/TwitterHandler.cs
index 0dd5335562..6c91b2d9f2 100644
--- a/src/Security/Authentication/Twitter/src/TwitterHandler.cs
+++ b/src/Security/Authentication/Twitter/src/TwitterHandler.cs
@@ -8,6 +8,7 @@ using System.Security.Cryptography;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
+using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging;
@@ -19,13 +20,8 @@ namespace Microsoft.AspNetCore.Authentication.Twitter;
/// <summary>
/// Authentication handler for Twitter's OAuth based authentication.
/// </summary>
-public class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions>
+public partial class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions>
{
- private static readonly JsonSerializerOptions ErrorSerializerOptions = new JsonSerializerOptions
- {
- PropertyNameCaseInsensitive = true
- };
-
private HttpClient Backchannel => Options.Backchannel;
/// <summary>
@@ -59,7 +55,7 @@ public class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions>
if (requestToken == null)
{
- return HandleRequestResult.Fail("Invalid state cookie.");
+ return HandleRequestResults.InvalidStateCookie;
}
var properties = requestToken.Properties;
@@ -361,7 +357,7 @@ public class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions>
{
// Failure, attempt to parse Twitters error message
var errorContentStream = await response.Content.ReadAsStreamAsync(Context.RequestAborted);
- errorResponse = await JsonSerializer.DeserializeAsync<TwitterErrorResponse>(errorContentStream, ErrorSerializerOptions);
+ errorResponse = await JsonSerializer.DeserializeAsync(errorContentStream, TwitterJsonContext.DefaultWithOptions.TwitterErrorResponse);
}
catch
{
@@ -390,4 +386,13 @@ public class TwitterHandler : RemoteAuthenticationHandler<TwitterOptions>
throw new InvalidOperationException(errorMessageStringBuilder.ToString());
}
+
+ [JsonSerializable(typeof(TwitterErrorResponse))]
+ internal sealed partial class TwitterJsonContext : JsonSerializerContext
+ {
+ public static readonly TwitterJsonContext DefaultWithOptions = new TwitterJsonContext(new JsonSerializerOptions
+ {
+ PropertyNameCaseInsensitive = true
+ });
+ }
}
diff --git a/src/Security/Authentication/Twitter/src/TwitterOptions.cs b/src/Security/Authentication/Twitter/src/TwitterOptions.cs
index e1ee989e6d..e85c9558c8 100644
--- a/src/Security/Authentication/Twitter/src/TwitterOptions.cs
+++ b/src/Security/Authentication/Twitter/src/TwitterOptions.cs
@@ -104,7 +104,7 @@ public class TwitterOptions : RemoteAuthenticationOptions
}
}
- private class TwitterCookieBuilder : CookieBuilder
+ private sealed class TwitterCookieBuilder : CookieBuilder
{
private readonly TwitterOptions _twitterOptions;
diff --git a/src/Security/Authentication/WsFederation/src/HandleRequestResults.cs b/src/Security/Authentication/WsFederation/src/HandleRequestResults.cs
new file mode 100644
index 0000000000..27e54ff673
--- /dev/null
+++ b/src/Security/Authentication/WsFederation/src/HandleRequestResults.cs
@@ -0,0 +1,10 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.WsFederation;
+
+internal static class HandleRequestResults
+{
+ internal static HandleRequestResult NoMessage = HandleRequestResult.Fail("No message.");
+ internal static HandleRequestResult UnsolicitedLoginsNotAllowed = HandleRequestResult.Fail("Unsolicited logins are not allowed.");
+}
diff --git a/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj b/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj
index f14899cafe..b68b19f727 100644
--- a/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj
+++ b/src/Security/Authentication/WsFederation/src/Microsoft.AspNetCore.Authentication.WsFederation.csproj
@@ -5,7 +5,7 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authentication;security</PackageTags>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/Authentication/WsFederation/src/PublicAPI.Shipped.txt b/src/Security/Authentication/WsFederation/src/PublicAPI.Shipped.txt
index 9b694fdb39..0568eff0ac 100644
--- a/src/Security/Authentication/WsFederation/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authentication/WsFederation/src/PublicAPI.Shipped.txt
@@ -2,66 +2,12 @@
~const Microsoft.AspNetCore.Authentication.WsFederation.WsFederationDefaults.AuthenticationScheme = "WsFederation" -> string
~const Microsoft.AspNetCore.Authentication.WsFederation.WsFederationDefaults.DisplayName = "WsFederation" -> string
~Microsoft.AspNetCore.Authentication.WsFederation.AuthenticationFailedContext.AuthenticationFailedContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.AuthenticationFailedContext.Exception.get -> System.Exception
-~Microsoft.AspNetCore.Authentication.WsFederation.AuthenticationFailedContext.Exception.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.AuthenticationFailedContext.ProtocolMessage.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage
-~Microsoft.AspNetCore.Authentication.WsFederation.AuthenticationFailedContext.ProtocolMessage.set -> void
~Microsoft.AspNetCore.Authentication.WsFederation.MessageReceivedContext.MessageReceivedContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.MessageReceivedContext.ProtocolMessage.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage
-~Microsoft.AspNetCore.Authentication.WsFederation.MessageReceivedContext.ProtocolMessage.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.RedirectContext.ProtocolMessage.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage
-~Microsoft.AspNetCore.Authentication.WsFederation.RedirectContext.ProtocolMessage.set -> void
~Microsoft.AspNetCore.Authentication.WsFederation.RedirectContext.RedirectContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.RemoteSignOutContext.ProtocolMessage.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage
-~Microsoft.AspNetCore.Authentication.WsFederation.RemoteSignOutContext.ProtocolMessage.set -> void
~Microsoft.AspNetCore.Authentication.WsFederation.RemoteSignOutContext.RemoteSignOutContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options, Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage message) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenReceivedContext.ProtocolMessage.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage
-~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenReceivedContext.ProtocolMessage.set -> void
~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenReceivedContext.SecurityTokenReceivedContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext.ProtocolMessage.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationMessage
-~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext.ProtocolMessage.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext.SecurityToken.get -> Microsoft.IdentityModel.Tokens.SecurityToken
-~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext.SecurityToken.set -> void
~Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext.SecurityTokenValidatedContext(Microsoft.AspNetCore.Http.HttpContext context, Microsoft.AspNetCore.Authentication.AuthenticationScheme scheme, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options, System.Security.Claims.ClaimsPrincipal principal, Microsoft.AspNetCore.Authentication.AuthenticationProperties properties) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnAuthenticationFailed.get -> System.Func<Microsoft.AspNetCore.Authentication.WsFederation.AuthenticationFailedContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnAuthenticationFailed.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnMessageReceived.get -> System.Func<Microsoft.AspNetCore.Authentication.WsFederation.MessageReceivedContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnMessageReceived.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnRedirectToIdentityProvider.get -> System.Func<Microsoft.AspNetCore.Authentication.WsFederation.RedirectContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnRedirectToIdentityProvider.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnRemoteSignOut.get -> System.Func<Microsoft.AspNetCore.Authentication.WsFederation.RemoteSignOutContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnRemoteSignOut.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnSecurityTokenReceived.get -> System.Func<Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenReceivedContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnSecurityTokenReceived.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnSecurityTokenValidated.get -> System.Func<Microsoft.AspNetCore.Authentication.WsFederation.SecurityTokenValidatedContext, System.Threading.Tasks.Task>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents.OnSecurityTokenValidated.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.Events.get -> Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.Events.set -> void
~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.WsFederationHandler(Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions> options, Microsoft.Extensions.Logging.ILoggerFactory logger, System.Text.Encodings.Web.UrlEncoder encoder, Microsoft.AspNetCore.Authentication.ISystemClock clock) -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Configuration.get -> Microsoft.IdentityModel.Protocols.WsFederation.WsFederationConfiguration
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Configuration.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.WsFederation.WsFederationConfiguration!>!
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.WsFederation.WsFederationConfiguration>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.ConfigurationManager.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Events.get -> Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Events.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.MetadataAddress.get -> string
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.MetadataAddress.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.SecurityTokenHandlers.get -> System.Collections.Generic.ICollection<Microsoft.IdentityModel.Tokens.ISecurityTokenValidator>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.SecurityTokenHandlers.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.SignOutScheme.get -> string
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.SignOutScheme.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.SignOutWreply.get -> string
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.SignOutWreply.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.StateDataFormat.get -> Microsoft.AspNetCore.Authentication.ISecureDataFormat<Microsoft.AspNetCore.Authentication.AuthenticationProperties>
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.StateDataFormat.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.TokenValidationParameters.get -> Microsoft.IdentityModel.Tokens.TokenValidationParameters
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.TokenValidationParameters.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Wreply.get -> string
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Wreply.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Wtrealm.get -> string
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.Wtrealm.set -> void
-~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationPostConfigureOptions.PostConfigure(string name, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options) -> void
~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationPostConfigureOptions.WsFederationPostConfigureOptions(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtection) -> void
~override Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.CreateEventsAsync() -> System.Threading.Tasks.Task<object>
~override Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.HandleChallengeAsync(Microsoft.AspNetCore.Authentication.AuthenticationProperties properties) -> System.Threading.Tasks.Task
@@ -131,6 +77,8 @@ Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.Events.get -> Microsoft.AspNetCore.Authentication.WsFederation.WsFederationEvents!
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.Events.set -> void
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationHandler.WsFederationHandler(Microsoft.Extensions.Options.IOptionsMonitor<Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! logger, System.Text.Encodings.Web.UrlEncoder! encoder, Microsoft.AspNetCore.Authentication.ISystemClock! clock) -> void
+Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.ConfigurationManager.get -> Microsoft.IdentityModel.Protocols.IConfigurationManager<Microsoft.IdentityModel.Protocols.WsFederation.WsFederationConfiguration!>!
+Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.ConfigurationManager.set -> void
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.AllowUnsolicitedLogins.get -> bool
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions.AllowUnsolicitedLogins.set -> void
diff --git a/src/Security/Authentication/WsFederation/src/PublicAPI.Unshipped.txt b/src/Security/Authentication/WsFederation/src/PublicAPI.Unshipped.txt
index 9f40b20778..974708cb01 100644
--- a/src/Security/Authentication/WsFederation/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authentication/WsFederation/src/PublicAPI.Unshipped.txt
@@ -1,5 +1,3 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationPostConfigureOptions.PostConfigure(string name, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions options) -> void
-*REMOVED*~Microsoft.AspNetCore.Authentication.WsFederation.WsFederationPostConfigureOptions.WsFederationPostConfigureOptions(Microsoft.AspNetCore.DataProtection.IDataProtectionProvider dataProtection) -> void
*REMOVED*Microsoft.AspNetCore.Authentication.WsFederation.WsFederationPostConfigureOptions.PostConfigure(string! name, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions! options) -> void
Microsoft.AspNetCore.Authentication.WsFederation.WsFederationPostConfigureOptions.PostConfigure(string? name, Microsoft.AspNetCore.Authentication.WsFederation.WsFederationOptions! options) -> void
diff --git a/src/Security/Authentication/WsFederation/src/WsFederationHandler.cs b/src/Security/Authentication/WsFederation/src/WsFederationHandler.cs
index 853a897eeb..71a8733d6c 100644
--- a/src/Security/Authentication/WsFederation/src/WsFederationHandler.cs
+++ b/src/Security/Authentication/WsFederation/src/WsFederationHandler.cs
@@ -161,7 +161,7 @@ public class WsFederationHandler : RemoteAuthenticationHandler<WsFederationOptio
return HandleRequestResult.SkipHandler();
}
- return HandleRequestResult.Fail("No message.");
+ return HandleRequestResults.NoMessage;
}
try
@@ -175,7 +175,7 @@ public class WsFederationHandler : RemoteAuthenticationHandler<WsFederationOptio
{
if (!Options.AllowUnsolicitedLogins)
{
- return HandleRequestResult.Fail("Unsolicited logins are not allowed.");
+ return HandleRequestResults.UnsolicitedLoginsNotAllowed;
}
}
else
diff --git a/src/Security/Authentication/test/AuthenticationMiddlewareTests.cs b/src/Security/Authentication/test/AuthenticationMiddlewareTests.cs
index f6ac9acce5..03d9f14b72 100644
--- a/src/Security/Authentication/test/AuthenticationMiddlewareTests.cs
+++ b/src/Security/Authentication/test/AuthenticationMiddlewareTests.cs
@@ -7,9 +7,11 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
using Moq;
namespace Microsoft.AspNetCore.Authentication;
@@ -151,6 +153,50 @@ public class AuthenticationMiddlewareTests
Assert.Same(context.User, newTicket.Principal);
}
+ [Fact]
+ public async Task WebApplicationBuilder_RegistersAuthenticationAndAuthorizationMiddlewares()
+ {
+ var builder = WebApplication.CreateBuilder();
+ builder.Configuration.AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidIssuer", "SomeIssuer"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidAudiences:0", "https://localhost:5001")
+ });
+ builder.Services.AddAuthorization();
+ builder.Services.AddAuthentication().AddJwtBearer();
+ await using var app = builder.Build();
+
+ // Authentication middleware isn't registered until application
+ // is built on startup
+ Assert.False(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.False(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+
+ await app.StartAsync();
+
+ Assert.True(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.True(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+
+ var options = app.Services.GetService<IOptionsMonitor<JwtBearerOptions>>().Get(JwtBearerDefaults.AuthenticationScheme);
+ Assert.Equal(new[] { "SomeIssuer" }, options.TokenValidationParameters.ValidIssuers);
+ Assert.Equal(new[] { "https://localhost:5001" }, options.TokenValidationParameters.ValidAudiences);
+ }
+
+ [Fact]
+ public async Task WebApplicationBuilder_OnlyRegistersMiddlewareWithSupportedServices()
+ {
+ var builder = WebApplication.CreateBuilder();
+ builder.Services.AddAuthentication().AddJwtBearer();
+ await using var app = builder.Build();
+
+ Assert.False(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.False(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+
+ await app.StartAsync();
+
+ Assert.True(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.False(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+ }
+
private HttpContext GetHttpContext(
Action<IServiceCollection> registerServices = null,
IAuthenticationService authenticationService = null)
@@ -164,6 +210,7 @@ public class AuthenticationMiddlewareTests
serviceCollection.AddOptions();
serviceCollection.AddLogging();
serviceCollection.AddAuthentication();
+ serviceCollection.AddSingleton<IConfiguration>(new ConfigurationManager());
registerServices?.Invoke(serviceCollection);
var serviceProvider = serviceCollection.BuildServiceProvider();
diff --git a/src/Security/Authentication/test/CertificateTests.cs b/src/Security/Authentication/test/CertificateTests.cs
index 03fd439a36..04f39ce29f 100644
--- a/src/Security/Authentication/test/CertificateTests.cs
+++ b/src/Security/Authentication/test/CertificateTests.cs
@@ -6,11 +6,13 @@ using System.Net;
using System.Security.Claims;
using System.Security.Cryptography.X509Certificates;
using System.Xml.Linq;
+using Microsoft.AspNetCore.Authentication.Certificate;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
@@ -23,7 +25,7 @@ public class ClientCertificateAuthenticationTests
[Fact]
public async Task VerifySchemeDefaults()
{
- var services = new ServiceCollection();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication().AddCertificate();
var sp = services.BuildServiceProvider();
var schemeProvider = sp.GetRequiredService<IAuthenticationSchemeProvider>();
@@ -842,7 +844,7 @@ public class ClientCertificateAuthenticationTests
AuthenticationBuilder authBuilder;
if (configureOptions != null)
{
- authBuilder = services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme).AddCertificate(options =>
+ authBuilder = services.AddAuthentication().AddCertificate(options =>
{
options.CustomTrustStore = configureOptions.CustomTrustStore;
options.ChainTrustValidationMode = configureOptions.ChainTrustValidationMode;
@@ -857,7 +859,7 @@ public class ClientCertificateAuthenticationTests
}
else
{
- authBuilder = services.AddAuthentication(CertificateAuthenticationDefaults.AuthenticationScheme).AddCertificate();
+ authBuilder = services.AddAuthentication().AddCertificate();
}
if (useCache)
{
diff --git a/src/Security/Authentication/test/CookieTests.cs b/src/Security/Authentication/test/CookieTests.cs
index 13cbfc2024..d4169b2e6c 100644
--- a/src/Security/Authentication/test/CookieTests.cs
+++ b/src/Security/Authentication/test/CookieTests.cs
@@ -101,7 +101,7 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
Assert.Equal("http://example.com/Account/Login?ReturnUrl=%2FCustomRedirect", location.ToString());
}
- private Task SignInAsAlice(HttpContext context)
+ private static Task SignInAsAlice(HttpContext context)
{
var user = new ClaimsIdentity(new GenericIdentity("Alice", "Cookies"));
user.AddClaim(new Claim("marker", "true"));
@@ -110,7 +110,7 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
new AuthenticationProperties());
}
- private Task SignInAsWrong(HttpContext context)
+ private static Task SignInAsWrong(HttpContext context)
{
return context.SignInAsync("Oops",
new ClaimsPrincipal(new ClaimsIdentity(new GenericIdentity("Alice", "Cookies"))),
@@ -147,6 +147,107 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
Assert.Equal("no-cache", transaction.Response.Headers.Pragma.ToString());
}
+ private class TestTicketStore : ITicketStore
+ {
+ private const string KeyPrefix = "AuthSessionStore-";
+ public readonly Dictionary<string, AuthenticationTicket> Store = new Dictionary<string, AuthenticationTicket>();
+
+ public async Task<string> StoreAsync(AuthenticationTicket ticket)
+ {
+ var guid = Guid.NewGuid();
+ var key = KeyPrefix + guid.ToString();
+ await RenewAsync(key, ticket);
+ return key;
+ }
+
+ public Task RenewAsync(string key, AuthenticationTicket ticket)
+ {
+ Store[key] = ticket;
+
+ return Task.FromResult(0);
+ }
+
+ public Task<AuthenticationTicket> RetrieveAsync(string key)
+ {
+ AuthenticationTicket ticket;
+ Store.TryGetValue(key, out ticket);
+ return Task.FromResult(ticket);
+ }
+
+ public Task RemoveAsync(string key)
+ {
+ Store.Remove(key);
+ return Task.FromResult(0);
+ }
+ }
+
+ [Fact]
+ public async Task SignInWithTicketStoreWorks()
+ {
+ var sessionStore = new TestTicketStore();
+ using var host = await CreateHostWithServices(s =>
+ {
+ s.AddSingleton<ISystemClock>(_clock);
+ s.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(o =>
+ {
+ o.SessionStore = sessionStore;
+ });
+ }, SignInAsAlice);
+
+ using var server = host.GetTestServer();
+ var transaction1 = await SendAsync(server, "http://example.com/testpath");
+
+ var transaction2 = await SendAsync(server, "http://example.com/me/Cookies", transaction1.CookieNameValue);
+
+ // Make sure we have one key as the session id
+ var key1 = Assert.Single(sessionStore.Store.Keys);
+ Assert.Equal("Alice", FindClaimValue(transaction2, ClaimTypes.Name));
+
+ // Make sure the session is expired
+ _clock.Add(TimeSpan.FromDays(60));
+
+ // Verify that a new session is generated with a new key
+ var transaction3 = await SendAsync(server, "http://example.com/signinalice", transaction1.CookieNameValue);
+
+ var transaction4 = await SendAsync(server, "http://example.com/me/Cookies", transaction3.CookieNameValue);
+
+ var key2 = Assert.Single(sessionStore.Store.Keys);
+ Assert.Equal("Alice", FindClaimValue(transaction4, ClaimTypes.Name));
+ Assert.NotEqual(key1, key2);
+ }
+
+ [Fact]
+ public async Task SessionStoreRemovesExpired()
+ {
+ var sessionStore = new TestTicketStore();
+ using var host = await CreateHostWithServices(s =>
+ {
+ s.AddSingleton<ISystemClock>(_clock);
+ s.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(o =>
+ {
+ o.SessionStore = sessionStore;
+ });
+ }, SignInAsAlice);
+
+ using var server = host.GetTestServer();
+ var transaction1 = await SendAsync(server, "http://example.com/testpath");
+
+ var transaction2 = await SendAsync(server, "http://example.com/me/Cookies", transaction1.CookieNameValue);
+
+ // Make sure we have one key as the session id
+ var key1 = Assert.Single(sessionStore.Store.Keys);
+ Assert.Equal("Alice", FindClaimValue(transaction2, ClaimTypes.Name));
+
+ // Make sure the session is expired
+ _clock.Add(TimeSpan.FromDays(60));
+
+ // Verify that a new session is generated with a new key
+ var transaction3 = await SendAsync(server, "http://example.com/me/Cookies", transaction1.CookieNameValue);
+
+ Assert.Empty(sessionStore.Store.Keys);
+ Assert.Null(FindClaimValue(transaction3, ClaimTypes.Name));
+ }
+
[Fact]
public async Task CustomAuthSchemeEncodesCookieName()
{
@@ -261,6 +362,8 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
o.Cookie.SecurePolicy = CookieSecurePolicy.Always;
o.Cookie.SameSite = SameSiteMode.None;
o.Cookie.HttpOnly = true;
+ o.Cookie.Extensions.Add("extension0");
+ o.Cookie.Extensions.Add("extension1=value1");
}, SignInAsAlice, baseAddress: new Uri("http://example.com/base"));
using var server1 = host.GetTestServer();
@@ -274,6 +377,8 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
Assert.Contains(" secure", setCookie1);
Assert.Contains(" samesite=none", setCookie1);
Assert.Contains(" httponly", setCookie1);
+ Assert.Contains(" extension0", setCookie1);
+ Assert.Contains(" extension1=value1", setCookie1);
using var host2 = await CreateHost(o =>
{
@@ -294,6 +399,7 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
Assert.DoesNotContain(" domain=", setCookie2);
Assert.DoesNotContain(" secure", setCookie2);
Assert.DoesNotContain(" httponly", setCookie2);
+ Assert.DoesNotContain(" extension", setCookie2);
}
[Fact]
@@ -1384,13 +1490,15 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
}
[Theory]
- [InlineData("/redirect_test")]
- [InlineData("http://example.com/redirect_to")]
- public async Task RedirectUriIsHoneredAfterSignin(string redirectUrl)
+ [InlineData("/redirect_test", "/loginpath")]
+ [InlineData("/redirect_test", "/testpath")]
+ [InlineData("http://example.com/redirect_to", "/loginpath")]
+ [InlineData("http://example.com/redirect_to", "/testpath")]
+ public async Task RedirectUriIsHonoredAfterSignin(string redirectUrl, string loginPath)
{
using var host = await CreateHost(o =>
{
- o.LoginPath = "/testpath";
+ o.LoginPath = loginPath;
o.Cookie.Name = "TestCookie";
},
async context =>
@@ -1408,7 +1516,29 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
}
[Fact]
- public async Task RedirectUriInQueryIsHoneredAfterSignin()
+ public async Task RedirectUriInQueryIsIgnoredAfterSigninForUnrecognizedEndpoints()
+ {
+ using var host = await CreateHost(o =>
+ {
+ o.LoginPath = "/loginpath";
+ o.ReturnUrlParameter = "return";
+ o.Cookie.Name = "TestCookie";
+ },
+ async context =>
+ {
+ await context.SignInAsync(
+ CookieAuthenticationDefaults.AuthenticationScheme,
+ new ClaimsPrincipal(new ClaimsIdentity(new GenericIdentity("Alice", CookieAuthenticationDefaults.AuthenticationScheme))));
+ });
+ using var server = host.GetTestServer();
+ var transaction = await SendAsync(server, "http://example.com/testpath?return=%2Fret_path_2");
+
+ Assert.NotEmpty(transaction.SetCookie);
+ Assert.Equal(HttpStatusCode.OK, transaction.Response.StatusCode);
+ }
+
+ [Fact]
+ public async Task RedirectUriInQueryIsHonoredAfterSignin()
{
using var host = await CreateHost(o =>
{
@@ -1638,17 +1768,6 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
return property.Attribute("value").Value;
}
- private static async Task<XElement> GetAuthData(TestServer server, string url, string cookie)
- {
- var request = new HttpRequestMessage(HttpMethod.Get, url);
- request.Headers.Add("Cookie", cookie);
-
- var response2 = await server.CreateClient().SendAsync(request);
- var text = await response2.Content.ReadAsStringAsync();
- var me = XElement.Parse(text);
- return me;
- }
-
private class ClaimsTransformer : IClaimsTransformation
{
public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal p)
@@ -1706,6 +1825,10 @@ public class CookieTests : SharedAuthenticationTests<CookieAuthenticationOptions
{
await context.ChallengeAsync(CookieAuthenticationDefaults.AuthenticationScheme);
}
+ else if (req.Path == new PathString("/signinalice"))
+ {
+ await SignInAsAlice(context);
+ }
else if (req.Path == new PathString("/signout"))
{
await context.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
diff --git a/src/Security/Authentication/test/FacebookTests.cs b/src/Security/Authentication/test/FacebookTests.cs
index 375272a1b5..0b6b6b242c 100644
--- a/src/Security/Authentication/test/FacebookTests.cs
+++ b/src/Security/Authentication/test/FacebookTests.cs
@@ -118,7 +118,7 @@ public class FacebookTests : RemoteAuthenticationTests<FacebookOptions>
app => app.UseAuthentication(),
services =>
{
- services.AddAuthentication().AddFacebook(o =>
+ services.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddFacebook(o =>
{
o.AppId = "Test App Id";
o.AppSecret = "Test App Secret";
@@ -148,7 +148,7 @@ public class FacebookTests : RemoteAuthenticationTests<FacebookOptions>
app => app.UseAuthentication(),
services =>
{
- services.AddAuthentication().AddFacebook(o =>
+ services.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddFacebook(o =>
{
o.AppId = "Test App Id";
o.AppSecret = "Test App Secret";
@@ -180,7 +180,7 @@ public class FacebookTests : RemoteAuthenticationTests<FacebookOptions>
app => app.UseAuthentication(),
services =>
{
- services.AddAuthentication().AddFacebook(o =>
+ services.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddFacebook(o =>
{
o.AppId = "Test App Id";
o.AppSecret = "Test App Secret";
diff --git a/src/Security/Authentication/test/GoogleTests.cs b/src/Security/Authentication/test/GoogleTests.cs
index 60da175766..0857a9bcd4 100644
--- a/src/Security/Authentication/test/GoogleTests.cs
+++ b/src/Security/Authentication/test/GoogleTests.cs
@@ -331,7 +331,7 @@ public class GoogleTests : RemoteAuthenticationTests<GoogleOptions>
}
[Fact]
- public async Task AuthenticateWithoutCookieWillFail()
+ public async Task AuthenticateWithoutCookieWillReturnNoResult()
{
using var host = await CreateHost(o =>
{
@@ -345,7 +345,7 @@ public class GoogleTests : RemoteAuthenticationTests<GoogleOptions>
if (req.Path == new PathString("/auth"))
{
var result = await context.AuthenticateAsync("Google");
- Assert.NotNull(result.Failure);
+ Assert.True(result.None);
}
});
using var server = host.GetTestServer();
diff --git a/src/Security/Authentication/test/JwtBearerTests.cs b/src/Security/Authentication/test/JwtBearerTests.cs
index f1dcb84eaa..6f21608300 100755
--- a/src/Security/Authentication/test/JwtBearerTests.cs
+++ b/src/Security/Authentication/test/JwtBearerTests.cs
@@ -9,12 +9,15 @@ using System.Security.Claims;
using System.Text;
using System.Text.Json;
using System.Xml.Linq;
+using Microsoft.AspNetCore.Authentication.Tests;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
namespace Microsoft.AspNetCore.Authentication.JwtBearer;
@@ -883,6 +886,75 @@ public class JwtBearerTests : SharedAuthenticationTests<JwtBearerOptions>
Assert.Equal(JsonValueKind.Null, dom.RootElement.GetProperty("issued").ValueKind);
}
+ [Fact]
+ public void CanReadJwtBearerOptionsFromConfig()
+ {
+ var services = new ServiceCollection().AddLogging();
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidIssuer", "dotnet-user-jwts"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidAudiences:0", "http://localhost:5000"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidAudiences:1", "https://localhost:5001"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:BackchannelTimeout", "00:01:00"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:RequireHttpsMetadata", "false"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SaveToken", "True"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication(o =>
+ {
+ o.AddScheme<TestHandler>("Bearer", "Bearer");
+ });
+ builder.AddJwtBearer("Bearer");
+ RegisterAuth(builder, _ => { });
+ var sp = services.BuildServiceProvider();
+
+ // Assert
+ var jwtBearerOptions = sp.GetRequiredService<IOptionsMonitor<JwtBearerOptions>>().Get(JwtBearerDefaults.AuthenticationScheme);
+ Assert.Equal(jwtBearerOptions.TokenValidationParameters.ValidIssuers, new[] { "dotnet-user-jwts" });
+ Assert.Equal(jwtBearerOptions.TokenValidationParameters.ValidAudiences, new[] { "http://localhost:5000", "https://localhost:5001" });
+ Assert.Equal(jwtBearerOptions.BackchannelTimeout, TimeSpan.FromSeconds(60));
+ Assert.False(jwtBearerOptions.RequireHttpsMetadata);
+ Assert.True(jwtBearerOptions.SaveToken);
+ Assert.True(jwtBearerOptions.MapInboundClaims); // Assert default values are respected
+ }
+
+ [Fact]
+ public void CanReadMultipleIssuersFromConfig()
+ {
+ var services = new ServiceCollection().AddLogging();
+ var firstKey = "qPG6tDtfxFYZifHW3sEueQ==";
+ var secondKey = "6JPzXj6aOPdojlZdeLshaA==";
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidIssuers:0", "dotnet-user-jwts"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:ValidIssuers:1", "dotnet-user-jwts-2"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SigningKeys:0:Issuer", "dotnet-user-jwts"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SigningKeys:0:Value", firstKey),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SigningKeys:0:Length", "32"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SigningKeys:1:Issuer", "dotnet-user-jwts-2"),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SigningKeys:1:Value", secondKey),
+ new KeyValuePair<string, string>("Authentication:Schemes:Bearer:SigningKeys:1:Length", "32"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication(o =>
+ {
+ o.AddScheme<TestHandler>("Bearer", "Bearer");
+ });
+ builder.AddJwtBearer("Bearer");
+ RegisterAuth(builder, _ => { });
+ var sp = services.BuildServiceProvider();
+
+ // Assert
+ var jwtBearerOptions = sp.GetRequiredService<IOptionsMonitor<JwtBearerOptions>>().Get(JwtBearerDefaults.AuthenticationScheme);
+ Assert.Equal(2, jwtBearerOptions.TokenValidationParameters.IssuerSigningKeys.Count());
+ Assert.Equal(firstKey, Convert.ToBase64String(jwtBearerOptions.TokenValidationParameters.IssuerSigningKeys.OfType<SymmetricSecurityKey>().FirstOrDefault()?.Key));
+ Assert.Equal(secondKey, Convert.ToBase64String(jwtBearerOptions.TokenValidationParameters.IssuerSigningKeys.OfType<SymmetricSecurityKey>().LastOrDefault()?.Key));
+ }
+
class InvalidTokenValidator : ISecurityTokenValidator
{
public InvalidTokenValidator()
diff --git a/src/Security/Authentication/test/Microsoft.AspNetCore.Authentication.Test.csproj b/src/Security/Authentication/test/Microsoft.AspNetCore.Authentication.Test.csproj
index a65c8ad927..72dad5f713 100644
--- a/src/Security/Authentication/test/Microsoft.AspNetCore.Authentication.Test.csproj
+++ b/src/Security/Authentication/test/Microsoft.AspNetCore.Authentication.Test.csproj
@@ -36,6 +36,7 @@
</ItemGroup>
<ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.AspNetCore.Authentication.Certificate" />
<Reference Include="Microsoft.AspNetCore.Authentication.Cookies" />
<Reference Include="Microsoft.AspNetCore.Authentication.Facebook" />
diff --git a/src/Security/Authentication/test/OAuthTests.cs b/src/Security/Authentication/test/OAuthTests.cs
index 8d348d8e4a..ef4c447dec 100644
--- a/src/Security/Authentication/test/OAuthTests.cs
+++ b/src/Security/Authentication/test/OAuthTests.cs
@@ -115,7 +115,7 @@ public class OAuthTests : RemoteAuthenticationTests<OAuthOptions>
public async Task RedirectToIdentityProvider_SetsCorrelationIdCookiePath_ToCallBackPath()
{
using var host = await CreateHost(
- s => s.AddAuthentication().AddOAuth(
+ s => s.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddOAuth(
"Weblie",
opt =>
{
@@ -142,7 +142,7 @@ public class OAuthTests : RemoteAuthenticationTests<OAuthOptions>
public async Task RedirectToAuthorizeEndpoint_CorrelationIdCookieOptions_CanBeOverriden()
{
using var host = await CreateHost(
- s => s.AddAuthentication().AddOAuth(
+ s => s.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddOAuth(
"Weblie",
opt =>
{
@@ -170,7 +170,7 @@ public class OAuthTests : RemoteAuthenticationTests<OAuthOptions>
public async Task RedirectToAuthorizeEndpoint_HasScopeAsConfigured()
{
using var host = await CreateHost(
- s => s.AddAuthentication().AddOAuth(
+ s => s.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddOAuth(
"Weblie",
opt =>
{
@@ -197,7 +197,7 @@ public class OAuthTests : RemoteAuthenticationTests<OAuthOptions>
public async Task RedirectToAuthorizeEndpoint_HasScopeAsOverwritten()
{
using var host = await CreateHost(
- s => s.AddAuthentication().AddOAuth(
+ s => s.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddOAuth(
"Weblie",
opt =>
{
@@ -226,7 +226,7 @@ public class OAuthTests : RemoteAuthenticationTests<OAuthOptions>
public async Task RedirectToAuthorizeEndpoint_HasScopeAsOverwrittenWithBaseAuthenticationProperties()
{
using var host = await CreateHost(
- s => s.AddAuthentication().AddOAuth(
+ s => s.AddAuthentication(o => o.DisableAutoDefaultScheme = true).AddOAuth(
"Weblie",
opt =>
{
diff --git a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectConfigurationTests.cs b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectConfigurationTests.cs
index 2e854c0ba4..95be59c52e 100644
--- a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectConfigurationTests.cs
+++ b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectConfigurationTests.cs
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -27,8 +28,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task CanForwardDefault()
{
- var services = new ServiceCollection().AddLogging();
-
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -71,8 +71,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task ForwardSignInThrows()
{
- var services = new ServiceCollection().AddLogging();
-
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -101,8 +100,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task ForwardSignOutWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
-
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -142,8 +140,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task ForwardForbidWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
-
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -183,8 +180,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task ForwardAuthenticateWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
-
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -224,7 +220,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task ForwardChallengeWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -264,7 +260,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task ForwardSelectorWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -319,7 +315,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task NullForwardSelectorUsesDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
@@ -374,7 +370,7 @@ public class OpenIdConnectConfigurationTests
[Fact]
public async Task SpecificForwardWinsOverSelectorAndDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.DefaultScheme = OpenIdConnectDefaults.AuthenticationScheme;
diff --git a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectTests.cs b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectTests.cs
index 99ac5bb819..fb9cee4d1b 100644
--- a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectTests.cs
+++ b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectTests.cs
@@ -7,9 +7,14 @@ using System.Net;
using System.Security.Claims;
using System.Text.Encodings.Web;
using Microsoft.AspNetCore.Authentication.Cookies;
+using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.DataProtection;
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Protocols.OpenIdConnect;
namespace Microsoft.AspNetCore.Authentication.Test.OpenIdConnect;
@@ -88,6 +93,7 @@ public class OpenIdConnectTests
AuthorizationEndpoint = "https://example.com/provider/login"
};
opt.NonceCookie.Path = "/";
+ opt.NonceCookie.Extensions.Add("ExtN");
});
var server = setting.CreateTestServer();
@@ -100,6 +106,7 @@ public class OpenIdConnectTests
var setCookie = Assert.Single(res.Headers, h => h.Key == "Set-Cookie");
var nonce = Assert.Single(setCookie.Value, v => v.StartsWith(OpenIdConnectDefaults.CookieNoncePrefix, StringComparison.Ordinal));
Assert.Contains("path=/", nonce);
+ Assert.Contains("ExtN", nonce);
}
[Fact]
@@ -139,6 +146,7 @@ public class OpenIdConnectTests
AuthorizationEndpoint = "https://example.com/provider/login"
};
opt.CorrelationCookie.Path = "/";
+ opt.CorrelationCookie.Extensions.Add("ExtC");
});
var server = setting.CreateTestServer();
@@ -151,6 +159,7 @@ public class OpenIdConnectTests
var setCookie = Assert.Single(res.Headers, h => h.Key == "Set-Cookie");
var correlation = Assert.Single(setCookie.Value, v => v.StartsWith(".AspNetCore.Correlation.", StringComparison.Ordinal));
Assert.Contains("path=/", correlation);
+ Assert.EndsWith("ExtC", correlation);
}
[Fact]
@@ -404,6 +413,152 @@ public class OpenIdConnectTests
Assert.Equal(DateTime.MinValue, GetNonceExpirationTime(utcNow.Ticks.ToString(CultureInfo.InvariantCulture) + nonceDelimiter + utcNow.Ticks.ToString(CultureInfo.InvariantCulture) + nonceDelimiter, TimeSpan.FromHours(1)));
}
+ [Fact]
+ public void CanReadOpenIdConnectOptionsFromConfig()
+ {
+ // Arrange
+ var services = new ServiceCollection().AddLogging();
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Authority", "https://authority.com"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:BackchannelTimeout", "00:05:00"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientId", "client-id"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientSecret", "client-secret"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:RequireHttpsMetadata", "false"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:CorrelationCookie:Domain", "https://localhost:5000"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:CorrelationCookie:Name", "CookieName"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication();
+ builder.AddOpenIdConnect();
+ var sp = services.BuildServiceProvider();
+
+ // Assert
+ var options = sp.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(OpenIdConnectDefaults.AuthenticationScheme);
+ Assert.Equal("https://authority.com", options.Authority);
+ Assert.Equal(options.BackchannelTimeout, TimeSpan.FromMinutes(5));
+ Assert.False(options.RequireHttpsMetadata);
+ Assert.False(options.GetClaimsFromUserInfoEndpoint); // Assert default values are respected
+ Assert.Equal(new PathString("/signin-oidc"), options.CallbackPath); // Assert default callback paths are respected
+ Assert.Equal("https://localhost:5000", options.CorrelationCookie.Domain); // Can set nested properties on cookie
+ Assert.Equal("CookieName", options.CorrelationCookie.Name);
+ }
+
+ [Fact]
+ public void CanCreateOpenIdConnectCookiesFromConfig()
+ {
+ // Arrange
+ var services = new ServiceCollection().AddLogging();
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Authority", "https://authority.com"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:BackchannelTimeout", ""),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientId", "client-id"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientSecret", "client-secret"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:CorrelationCookie:Domain", "https://localhost:5000"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:CorrelationCookie:IsEssential", "False"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:CorrelationCookie:SecurePolicy", "always"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication();
+ builder.AddOpenIdConnect();
+ var sp = services.BuildServiceProvider();
+
+ // Assert
+ var options = sp.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(OpenIdConnectDefaults.AuthenticationScheme);
+ Assert.Equal("https://localhost:5000", options.CorrelationCookie.Domain);
+ Assert.False(options.CorrelationCookie.IsEssential);
+ Assert.Equal(CookieSecurePolicy.Always, options.CorrelationCookie.SecurePolicy);
+ // Default values are respected
+ Assert.Equal(".AspNetCore.Correlation.", options.CorrelationCookie.Name);
+ Assert.True(options.CorrelationCookie.HttpOnly);
+ Assert.Equal(SameSiteMode.None, options.CorrelationCookie.SameSite);
+ Assert.Equal(OpenIdConnectDefaults.CookieNoncePrefix, options.NonceCookie.Name);
+ Assert.True(options.NonceCookie.IsEssential);
+ Assert.True(options.NonceCookie.HttpOnly);
+ Assert.Equal(CookieSecurePolicy.SameAsRequest, options.NonceCookie.SecurePolicy);
+ Assert.Equal(TimeSpan.FromMinutes(1), options.BackchannelTimeout);
+ }
+
+ [Fact]
+ public void ThrowsExceptionsWhenParsingInvalidOptionsFromConfig()
+ {
+ var services = new ServiceCollection().AddLogging();
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Authority", "https://authority.com"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:BackchannelTimeout", "definitelynotatimespan"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientId", "client-id"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientSecret", "client-secret"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:CorrelationCookie:IsEssential", "definitelynotaboolean"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication();
+ builder.AddOpenIdConnect();
+ var sp = services.BuildServiceProvider();
+
+ Assert.Throws<FormatException>(() =>
+ sp.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(OpenIdConnectDefaults.AuthenticationScheme));
+ }
+
+ [Fact]
+ public void ScopeOptionsCanBeOverwrittenFromOptions()
+ {
+ var services = new ServiceCollection().AddLogging();
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Authority", "https://authority.com"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientId", "client-id"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientSecret", "client-secret"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Scope:0", "given_name"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Scope:1", "birthdate"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication();
+ builder.AddOpenIdConnect();
+ var sp = services.BuildServiceProvider();
+
+ var options = sp.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(OpenIdConnectDefaults.AuthenticationScheme);
+ Assert.Equal(2, options.Scope.Count);
+ Assert.DoesNotContain("openid", options.Scope);
+ Assert.DoesNotContain("profile", options.Scope);
+ Assert.Contains("given_name", options.Scope);
+ Assert.Contains("birthdate", options.Scope);
+ }
+
+ [Fact]
+ public void OptionsFromConfigCanBeOverwritten()
+ {
+ var services = new ServiceCollection().AddLogging();
+ var config = new ConfigurationBuilder().AddInMemoryCollection(new[]
+ {
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:Authority", "https://authority.com"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientId", "client-id"),
+ new KeyValuePair<string, string>("Authentication:Schemes:OpenIdConnect:ClientSecret", "client-secret"),
+ }).Build();
+ services.AddSingleton<IConfiguration>(config);
+
+ // Act
+ var builder = services.AddAuthentication();
+ builder.AddOpenIdConnect(o =>
+ {
+ o.ClientSecret = "overwritten-client-secret";
+ });
+ var sp = services.BuildServiceProvider();
+
+ var options = sp.GetRequiredService<IOptionsMonitor<OpenIdConnectOptions>>().Get(OpenIdConnectDefaults.AuthenticationScheme);
+ Assert.Equal("client-id", options.ClientId);
+ Assert.Equal("overwritten-client-secret", options.ClientSecret);
+ }
+
private static DateTime GetNonceExpirationTime(string keyname, TimeSpan nonceLifetime)
{
DateTime nonceTime = DateTime.MinValue;
diff --git a/src/Security/Authentication/test/PolicyTests.cs b/src/Security/Authentication/test/PolicyTests.cs
index 7903089349..240ffa18d2 100644
--- a/src/Security/Authentication/test/PolicyTests.cs
+++ b/src/Security/Authentication/test/PolicyTests.cs
@@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -53,7 +54,7 @@ public class PolicyTests
[Fact]
public async Task DefaultTargetSelectorWinsOverDefaultTarget()
{
- var services = new ServiceCollection().AddOptions().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.AddScheme<TestHandler>("auth1", "auth1");
@@ -109,7 +110,7 @@ public class PolicyTests
[Fact]
public async Task NullDefaultTargetSelectorFallsBacktoDefaultTarget()
{
- var services = new ServiceCollection().AddOptions().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.AddScheme<TestHandler>("auth1", "auth1");
@@ -165,7 +166,7 @@ public class PolicyTests
[Fact]
public async Task SpecificTargetAlwaysWinsOverDefaultTarget()
{
- var services = new ServiceCollection().AddOptions().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.AddScheme<TestHandler>("auth1", "auth1");
@@ -226,7 +227,7 @@ public class PolicyTests
[Fact]
public async Task VirtualSchemeTargetsForwardWithDefaultTarget()
{
- var services = new ServiceCollection().AddOptions().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.AddScheme<TestHandler>("auth1", "auth1");
@@ -278,7 +279,7 @@ public class PolicyTests
[Fact]
public async Task VirtualSchemeTargetsOverrideDefaultTarget()
{
- var services = new ServiceCollection().AddOptions().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
services.AddAuthentication(o =>
{
o.AddScheme<TestHandler>("auth1", "auth1");
diff --git a/src/Security/Authentication/test/RemoteAuthenticationTests.cs b/src/Security/Authentication/test/RemoteAuthenticationTests.cs
index 51b736c9c0..f4577c7ff1 100644
--- a/src/Security/Authentication/test/RemoteAuthenticationTests.cs
+++ b/src/Security/Authentication/test/RemoteAuthenticationTests.cs
@@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -18,6 +19,7 @@ public abstract class RemoteAuthenticationTests<TOptions> : SharedAuthentication
=> CreateHostWithServices(s =>
{
var builder = s.AddAuthentication();
+ s.AddSingleton<IConfiguration>(new ConfigurationManager());
if (isDefault)
{
s.Configure<AuthenticationOptions>(o => o.DefaultScheme = DefaultScheme);
diff --git a/src/Security/Authentication/test/SharedAuthenticationTests.cs b/src/Security/Authentication/test/SharedAuthenticationTests.cs
index 4ee984335d..bc3a74fe31 100644
--- a/src/Security/Authentication/test/SharedAuthenticationTests.cs
+++ b/src/Security/Authentication/test/SharedAuthenticationTests.cs
@@ -4,6 +4,7 @@
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication.Tests;
using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Authentication;
@@ -24,7 +25,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task CanForwardDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
@@ -81,7 +82,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
{
if (SupportsSignIn)
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
@@ -124,7 +125,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
{
if (SupportsSignOut)
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -164,7 +165,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task ForwardForbidWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -213,7 +214,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task ForwardAuthenticateOnlyRunsTransformOnceByDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var transform = new RunOnce();
var builder = services.AddSingleton<IClaimsTransformation>(transform).AddAuthentication(o =>
{
@@ -243,7 +244,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task ForwardAuthenticateWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -282,7 +283,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task ForwardChallengeWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -321,7 +322,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task ForwardSelectorWinsOverDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -390,7 +391,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task NullForwardSelectorUsesDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -459,7 +460,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task SpecificForwardWinsOverSelectorAndDefault()
{
- var services = new ServiceCollection().AddLogging();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication(o =>
{
o.DefaultScheme = DefaultScheme;
@@ -533,7 +534,7 @@ public abstract class SharedAuthenticationTests<TOptions> where TOptions : Authe
[Fact]
public async Task VerifySchemeDefaults()
{
- var services = new ServiceCollection();
+ var services = new ServiceCollection().ConfigureAuthTestServices();
var builder = services.AddAuthentication();
RegisterAuth(builder, o => { });
var sp = services.BuildServiceProvider();
diff --git a/src/Security/Authentication/test/TestExtensions.cs b/src/Security/Authentication/test/TestExtensions.cs
index a41caa4072..e7cf730e1d 100644
--- a/src/Security/Authentication/test/TestExtensions.cs
+++ b/src/Security/Authentication/test/TestExtensions.cs
@@ -7,6 +7,8 @@ using System.Text;
using System.Xml.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.TestHost;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Authentication;
@@ -77,4 +79,12 @@ public static class TestExtensions
return res.Body.WriteAsync(xmlBytes, 0, xmlBytes.Length);
}
+ public static IServiceCollection ConfigureAuthTestServices(this IServiceCollection services)
+ {
+ return services
+ .AddOptions()
+ .AddLogging()
+ .AddSingleton<IConfiguration>(new ConfigurationManager());
+ }
+
}
diff --git a/src/Security/Authentication/test/WsFederation/WsFederationTest.cs b/src/Security/Authentication/test/WsFederation/WsFederationTest.cs
index d28490a162..bdbc4ad06a 100644
--- a/src/Security/Authentication/test/WsFederation/WsFederationTest.cs
+++ b/src/Security/Authentication/test/WsFederation/WsFederationTest.cs
@@ -12,6 +12,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Extensions;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.WebUtilities;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.IdentityModel.Tokens;
@@ -25,6 +26,7 @@ public class WsFederationTest
public async Task VerifySchemeDefaults()
{
var services = new ServiceCollection();
+ services.AddSingleton<IConfiguration>(new ConfigurationManager());
services.AddAuthentication().AddWsFederation();
var sp = services.BuildServiceProvider();
var schemeProvider = sp.GetRequiredService<IAuthenticationSchemeProvider>();
diff --git a/src/Security/Authorization/Core/src/AuthorizationBuilder.cs b/src/Security/Authorization/Core/src/AuthorizationBuilder.cs
new file mode 100644
index 0000000000..793d2ab270
--- /dev/null
+++ b/src/Security/Authorization/Core/src/AuthorizationBuilder.cs
@@ -0,0 +1,149 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Authorization;
+
+/// <summary>
+/// Used to configure authorization
+/// </summary>
+public class AuthorizationBuilder
+{
+ /// <summary>
+ /// Initializes a new instance of <see cref="AuthorizationBuilder"/>.
+ /// </summary>
+ /// <param name="services">The services being configured.</param>
+ public AuthorizationBuilder(IServiceCollection services)
+ => Services = services;
+
+ /// <summary>
+ /// The services being configured.
+ /// </summary>
+ public virtual IServiceCollection Services { get; }
+
+ /// <summary>
+ /// Determines whether authorization handlers should be invoked after <see cref="AuthorizationHandlerContext.HasFailed"/>.
+ /// Defaults to true.
+ /// </summary>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder SetInvokeHandlersAfterFailure(bool invoke)
+ {
+ Services.Configure<AuthorizationOptions>(o => o.InvokeHandlersAfterFailure = invoke);
+ return this;
+ }
+
+ /// <summary>
+ /// Sets the default authorization policy. Defaults to require authenticated users.
+ /// </summary>
+ /// <remarks>
+ /// The default policy used when evaluating <see cref="IAuthorizeData"/> with no policy name specified.
+ /// </remarks>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder SetDefaultPolicy(AuthorizationPolicy policy)
+ {
+ Services.Configure<AuthorizationOptions>(o => o.DefaultPolicy = policy);
+ return this;
+ }
+
+ /// <summary>
+ /// Sets the fallback authorization policy used by <see cref="AuthorizationPolicy.CombineAsync(IAuthorizationPolicyProvider, IEnumerable{IAuthorizeData})"/>
+ /// when no IAuthorizeData have been provided. As a result, the AuthorizationMiddleware uses the fallback policy
+ /// if there are no <see cref="IAuthorizeData"/> instances for a resource. If a resource has any <see cref="IAuthorizeData"/>
+ /// then they are evaluated instead of the fallback policy. By default the fallback policy is null, and usually will have no
+ /// effect unless you have the AuthorizationMiddleware in your pipeline. It is not used in any way by the
+ /// default <see cref="IAuthorizationService"/>.
+ /// </summary>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder SetFallbackPolicy(AuthorizationPolicy? policy)
+ {
+ Services.Configure<AuthorizationOptions>(o => o.FallbackPolicy = policy);
+ return this;
+ }
+
+ /// <summary>
+ /// Adds a <see cref="AuthorizationPolicy"/> which can be used by <see cref="IAuthorizationService"/>.
+ /// </summary>
+ /// <param name="name">The name of this policy.</param>
+ /// <param name="policy">The <see cref="AuthorizationPolicy"/>.></param>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder AddPolicy(string name, AuthorizationPolicy policy)
+ {
+ Services.Configure<AuthorizationOptions>(o => o.AddPolicy(name, policy));
+ return this;
+ }
+
+ /// <summary>
+ /// Add a policy that is built from a delegate with the provided name.
+ /// </summary>
+ /// <param name="name">The name of the policy.</param>
+ /// <param name="configurePolicy">The delegate that will be used to build the policy.</param>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder AddPolicy(string name, Action<AuthorizationPolicyBuilder> configurePolicy)
+ {
+ Services.Configure<AuthorizationOptions>(o => o.AddPolicy(name, configurePolicy));
+ return this;
+ }
+
+ /// <summary>
+ /// Add a policy that is built from a delegate with the provided name and used as the default policy.
+ /// </summary>
+ /// <param name="name">The name of the default policy.</param>
+ /// <param name="policy">The default <see cref="AuthorizationPolicy"/>.></param>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder AddDefaultPolicy(string name, AuthorizationPolicy policy)
+ {
+ SetDefaultPolicy(policy);
+ return AddPolicy(name, policy);
+ }
+
+ /// <summary>
+ /// Add a policy that is built from a delegate with the provided name and used as the DefaultPolicy.
+ /// </summary>
+ /// <param name="name">The name of the DefaultPolicy.</param>
+ /// <param name="configurePolicy">The delegate that will be used to build the DefaultPolicy.</param>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder AddDefaultPolicy(string name, Action<AuthorizationPolicyBuilder> configurePolicy)
+ {
+ if (configurePolicy == null)
+ {
+ throw new ArgumentNullException(nameof(configurePolicy));
+ }
+
+ var policyBuilder = new AuthorizationPolicyBuilder();
+ configurePolicy(policyBuilder);
+ return AddDefaultPolicy(name, policyBuilder.Build());
+ }
+
+ /// <summary>
+ /// Add a policy that is built from a delegate with the provided name and used as the FallbackPolicy.
+ /// </summary>
+ /// <param name="name">The name of the FallbackPolicy.</param>
+ /// <param name="policy">The Fallback <see cref="AuthorizationPolicy"/>.></param>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder AddFallbackPolicy(string name, AuthorizationPolicy policy)
+ {
+ SetFallbackPolicy(policy);
+ return AddPolicy(name, policy);
+ }
+
+ /// <summary>
+ /// Add a policy that is built from a delegate with the provided name and used as the FallbackPolicy.
+ /// </summary>
+ /// <param name="name">The name of the Fallback policy.</param>
+ /// <param name="configurePolicy">The delegate that will be used to build the Fallback policy.</param>
+ /// <returns>The builder.</returns>
+ public virtual AuthorizationBuilder AddFallbackPolicy(string name, Action<AuthorizationPolicyBuilder> configurePolicy)
+ {
+ if (configurePolicy == null)
+ {
+ throw new ArgumentNullException(nameof(configurePolicy));
+ }
+
+ var policyBuilder = new AuthorizationPolicyBuilder();
+ configurePolicy(policyBuilder);
+ return AddFallbackPolicy(name, policyBuilder.Build());
+ }
+}
diff --git a/src/Security/Authorization/Core/src/AuthorizationFailure.cs b/src/Security/Authorization/Core/src/AuthorizationFailure.cs
index e28a5a3518..3af0b69e52 100644
--- a/src/Security/Authorization/Core/src/AuthorizationFailure.cs
+++ b/src/Security/Authorization/Core/src/AuthorizationFailure.cs
@@ -12,6 +12,8 @@ namespace Microsoft.AspNetCore.Authorization;
/// </summary>
public class AuthorizationFailure
{
+ private static readonly AuthorizationFailure _explicitFailure = new() { FailCalled = true };
+
private AuthorizationFailure() { }
/// <summary>
@@ -33,11 +35,7 @@ public class AuthorizationFailure
/// Return a failure due to <see cref="AuthorizationHandlerContext.Fail()"/> being called.
/// </summary>
/// <returns>The failure.</returns>
- public static AuthorizationFailure ExplicitFail()
- => new AuthorizationFailure
- {
- FailCalled = true
- };
+ public static AuthorizationFailure ExplicitFail() => _explicitFailure;
/// <summary>
/// Return a failure due to <see cref="AuthorizationHandlerContext.Fail(AuthorizationFailureReason)"/> being called.
diff --git a/src/Security/Authorization/Core/src/AuthorizationOptions.cs b/src/Security/Authorization/Core/src/AuthorizationOptions.cs
index 1b53575a61..be317aa553 100644
--- a/src/Security/Authorization/Core/src/AuthorizationOptions.cs
+++ b/src/Security/Authorization/Core/src/AuthorizationOptions.cs
@@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
+using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Authorization;
@@ -11,10 +12,12 @@ namespace Microsoft.AspNetCore.Authorization;
/// </summary>
public class AuthorizationOptions
{
- private Dictionary<string, AuthorizationPolicy> PolicyMap { get; } = new Dictionary<string, AuthorizationPolicy>(StringComparer.OrdinalIgnoreCase);
+ private static readonly Task<AuthorizationPolicy?> _nullPolicyTask = Task.FromResult<AuthorizationPolicy?>(null);
+
+ private Dictionary<string, Task<AuthorizationPolicy?>> PolicyMap { get; } = new Dictionary<string, Task<AuthorizationPolicy?>>(StringComparer.OrdinalIgnoreCase);
/// <summary>
- /// Determines whether authentication handlers should be invoked after <see cref="AuthorizationHandlerContext.HasFailed"/>.
+ /// Determines whether authorization handlers should be invoked after <see cref="AuthorizationHandlerContext.HasFailed"/>.
/// Defaults to true.
/// </summary>
public bool InvokeHandlersAfterFailure { get; set; } = true;
@@ -54,7 +57,7 @@ public class AuthorizationOptions
throw new ArgumentNullException(nameof(policy));
}
- PolicyMap[name] = policy;
+ PolicyMap[name] = Task.FromResult<AuthorizationPolicy?>(policy);
}
/// <summary>
@@ -76,7 +79,7 @@ public class AuthorizationOptions
var policyBuilder = new AuthorizationPolicyBuilder();
configurePolicy(policyBuilder);
- PolicyMap[name] = policyBuilder.Build();
+ PolicyMap[name] = Task.FromResult<AuthorizationPolicy?>(policyBuilder.Build());
}
/// <summary>
@@ -93,9 +96,24 @@ public class AuthorizationOptions
if (PolicyMap.TryGetValue(name, out var value))
{
- return value;
+ return value.Result;
}
return null;
}
+
+ internal Task<AuthorizationPolicy?> GetPolicyTask(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+
+ if (PolicyMap.TryGetValue(name, out var value))
+ {
+ return value;
+ }
+
+ return _nullPolicyTask;
+ }
}
diff --git a/src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs b/src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs
index 1212caf962..2ba70e5c9a 100644
--- a/src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs
+++ b/src/Security/Authorization/Core/src/AuthorizationPolicyBuilder.cs
@@ -14,6 +14,8 @@ namespace Microsoft.AspNetCore.Authorization;
/// </summary>
public class AuthorizationPolicyBuilder
{
+ private static readonly DenyAnonymousAuthorizationRequirement _denyAnonymousAuthorizationRequirement = new();
+
/// <summary>
/// Creates a new instance of <see cref="AuthorizationPolicyBuilder"/>
/// </summary>
@@ -201,7 +203,7 @@ public class AuthorizationPolicyBuilder
/// <returns>A reference to this instance after the operation has completed.</returns>
public AuthorizationPolicyBuilder RequireAuthenticatedUser()
{
- Requirements.Add(new DenyAnonymousAuthorizationRequirement());
+ Requirements.Add(_denyAnonymousAuthorizationRequirement);
return this;
}
diff --git a/src/Security/Authorization/Core/src/AuthorizationResult.cs b/src/Security/Authorization/Core/src/AuthorizationResult.cs
index 260c404f5e..3c44cdd169 100644
--- a/src/Security/Authorization/Core/src/AuthorizationResult.cs
+++ b/src/Security/Authorization/Core/src/AuthorizationResult.cs
@@ -11,6 +11,9 @@ namespace Microsoft.AspNetCore.Authorization;
/// </summary>
public class AuthorizationResult
{
+ private static readonly AuthorizationResult _succeededResult = new() { Succeeded = true };
+ private static readonly AuthorizationResult _failedResult = new() { Failure = AuthorizationFailure.ExplicitFail() };
+
private AuthorizationResult() { }
/// <summary>
@@ -27,7 +30,7 @@ public class AuthorizationResult
/// Returns a successful result.
/// </summary>
/// <returns>A successful result.</returns>
- public static AuthorizationResult Success() => new AuthorizationResult { Succeeded = true };
+ public static AuthorizationResult Success() => _succeededResult;
/// <summary>
/// Creates a failed authorization result.
@@ -40,5 +43,5 @@ public class AuthorizationResult
/// Creates a failed authorization result.
/// </summary>
/// <returns>The <see cref="AuthorizationResult"/>.</returns>
- public static AuthorizationResult Failed() => new AuthorizationResult { Failure = AuthorizationFailure.ExplicitFail() };
+ public static AuthorizationResult Failed() => _failedResult;
}
diff --git a/src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs b/src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs
index 8426a1db36..28483292c5 100644
--- a/src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs
+++ b/src/Security/Authorization/Core/src/ClaimsAuthorizationRequirement.cs
@@ -15,6 +15,8 @@ namespace Microsoft.AspNetCore.Authorization.Infrastructure;
/// </summary>
public class ClaimsAuthorizationRequirement : AuthorizationHandler<ClaimsAuthorizationRequirement>, IAuthorizationRequirement
{
+ private readonly bool _emptyAllowedValues;
+
/// <summary>
/// Creates a new instance of <see cref="ClaimsAuthorizationRequirement"/>.
/// </summary>
@@ -29,6 +31,7 @@ public class ClaimsAuthorizationRequirement : AuthorizationHandler<ClaimsAuthori
ClaimType = claimType;
AllowedValues = allowedValues;
+ _emptyAllowedValues = AllowedValues == null || !AllowedValues.Any();
}
/// <summary>
@@ -52,14 +55,28 @@ public class ClaimsAuthorizationRequirement : AuthorizationHandler<ClaimsAuthori
if (context.User != null)
{
var found = false;
- if (requirement.AllowedValues == null || !requirement.AllowedValues.Any())
+ if (requirement._emptyAllowedValues)
{
- found = context.User.Claims.Any(c => string.Equals(c.Type, requirement.ClaimType, StringComparison.OrdinalIgnoreCase));
+ foreach (var claim in context.User.Claims)
+ {
+ if (string.Equals(claim.Type, requirement.ClaimType, StringComparison.OrdinalIgnoreCase))
+ {
+ found = true;
+ break;
+ }
+ }
}
else
{
- found = context.User.Claims.Any(c => string.Equals(c.Type, requirement.ClaimType, StringComparison.OrdinalIgnoreCase)
- && requirement.AllowedValues.Contains(c.Value, StringComparer.Ordinal));
+ foreach (var claim in context.User.Claims)
+ {
+ if (string.Equals(claim.Type, requirement.ClaimType, StringComparison.OrdinalIgnoreCase)
+ && requirement.AllowedValues!.Contains(claim.Value, StringComparer.Ordinal))
+ {
+ found = true;
+ break;
+ }
+ }
}
if (found)
{
@@ -72,9 +89,9 @@ public class ClaimsAuthorizationRequirement : AuthorizationHandler<ClaimsAuthori
/// <inheritdoc />
public override string ToString()
{
- var value = (AllowedValues == null || !AllowedValues.Any())
+ var value = (_emptyAllowedValues)
? string.Empty
- : $" and Claim.Value is one of the following values: ({string.Join("|", AllowedValues)})";
+ : $" and Claim.Value is one of the following values: ({string.Join("|", AllowedValues!)})";
return $"{nameof(ClaimsAuthorizationRequirement)}:Claim.Type={ClaimType}{value}";
}
diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs b/src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs
index deca71d6c2..e92dee2a3f 100644
--- a/src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs
+++ b/src/Security/Authorization/Core/src/DefaultAuthorizationHandlerProvider.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Authorization;
/// </summary>
public class DefaultAuthorizationHandlerProvider : IAuthorizationHandlerProvider
{
- private readonly IEnumerable<IAuthorizationHandler> _handlers;
+ private readonly Task<IEnumerable<IAuthorizationHandler>> _handlersTask;
/// <summary>
/// Creates a new instance of <see cref="DefaultAuthorizationHandlerProvider"/>.
@@ -26,10 +26,10 @@ public class DefaultAuthorizationHandlerProvider : IAuthorizationHandlerProvider
throw new ArgumentNullException(nameof(handlers));
}
- _handlers = handlers;
+ _handlersTask = Task.FromResult(handlers);
}
/// <inheritdoc />
public Task<IEnumerable<IAuthorizationHandler>> GetHandlersAsync(AuthorizationHandlerContext context)
- => Task.FromResult(_handlers);
+ => _handlersTask;
}
diff --git a/src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs b/src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs
index 02b226adcd..ccc81ce354 100644
--- a/src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs
+++ b/src/Security/Authorization/Core/src/DefaultAuthorizationPolicyProvider.cs
@@ -69,6 +69,13 @@ public class DefaultAuthorizationPolicyProvider : IAuthorizationPolicyProvider
// MVC caches policies specifically for this class, so this method MUST return the same policy per
// policyName for every request or it could allow undesired access. It also must return synchronously.
// A change to either of these behaviors would require shipping a patch of MVC as well.
- return Task.FromResult(_options.GetPolicy(policyName));
+ return _options.GetPolicyTask(policyName);
}
+
+#if NETCOREAPP
+ /// <summary>
+ /// Determines if policies from this provider can be cached, which is true only for this type.
+ /// </summary>
+ public virtual bool CanCachePolicy => GetType() == typeof(DefaultAuthorizationPolicyProvider);
+#endif
}
diff --git a/src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs b/src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs
index 7ab90400ef..3612569372 100644
--- a/src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs
+++ b/src/Security/Authorization/Core/src/IAuthorizationPolicyProvider.cs
@@ -28,4 +28,11 @@ public interface IAuthorizationPolicyProvider
/// </summary>
/// <returns>The fallback authorization policy.</returns>
Task<AuthorizationPolicy?> GetFallbackPolicyAsync();
+
+#if NETCOREAPP
+ /// <summary>
+ /// Determines if policies from this provider can be cached, defaults to false.
+ /// </summary>
+ bool CanCachePolicy => false;
+#endif
}
diff --git a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj
index db4b9d2870..77ce484940 100644
--- a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj
+++ b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj
@@ -20,4 +20,9 @@ Microsoft.AspNetCore.Authorization.AuthorizeAttribute</Description>
<Reference Include="Microsoft.Extensions.Options" />
</ItemGroup>
+ <ItemGroup>
+ <AdditionalFiles Include="PublicAPI/$(TargetFramework)/PublicAPI.Shipped.txt" />
+ <AdditionalFiles Include="PublicAPI/$(TargetFramework)/PublicAPI.Unshipped.txt" />
+ </ItemGroup>
+
</Project>
diff --git a/src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs b/src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs
index e9f82f43a9..95caf8ac7d 100644
--- a/src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs
+++ b/src/Security/Authorization/Core/src/NameAuthorizationRequirement.cs
@@ -41,7 +41,18 @@ public class NameAuthorizationRequirement : AuthorizationHandler<NameAuthorizati
{
if (context.User != null)
{
- if (context.User.Identities.Any(i => string.Equals(i.Name, requirement.RequiredName, StringComparison.Ordinal)))
+ var succeed = false;
+
+ foreach (var identity in context.User.Identities)
+ {
+ if (string.Equals(identity.Name, requirement.RequiredName, StringComparison.Ordinal))
+ {
+ succeed = true;
+ break;
+ }
+ }
+
+ if (succeed)
{
context.Succeed(requirement);
}
diff --git a/src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs b/src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs
index bce2452f67..28766b2c2d 100644
--- a/src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs
+++ b/src/Security/Authorization/Core/src/PassThroughAuthorizationHandler.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.Threading.Tasks;
+using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Authorization.Infrastructure;
@@ -12,6 +13,21 @@ namespace Microsoft.AspNetCore.Authorization.Infrastructure;
/// </summary>
public class PassThroughAuthorizationHandler : IAuthorizationHandler
{
+ private readonly AuthorizationOptions _options;
+
+ /// <summary>
+ /// Creates a new instance of <see cref="PassThroughAuthorizationHandler"/>.
+ /// </summary>
+ public PassThroughAuthorizationHandler() : this(Options.Create(new AuthorizationOptions()))
+ { }
+
+ /// <summary>
+ /// Creates a new instance of <see cref="PassThroughAuthorizationHandler"/>.
+ /// </summary>
+ /// <param name="options">The <see cref="AuthorizationOptions"/> used.</param>
+ public PassThroughAuthorizationHandler(IOptions<AuthorizationOptions> options)
+ => _options = options.Value;
+
/// <summary>
/// Makes a decision if authorization is allowed.
/// </summary>
@@ -21,6 +37,10 @@ public class PassThroughAuthorizationHandler : IAuthorizationHandler
foreach (var handler in context.Requirements.OfType<IAuthorizationHandler>())
{
await handler.HandleAsync(context).ConfigureAwait(false);
+ if (!_options.InvokeHandlersAfterFailure && context.HasFailed)
+ {
+ break;
+ }
}
}
}
diff --git a/src/Security/Authorization/Core/src/PublicAPI.Unshipped.txt b/src/Security/Authorization/Core/src/PublicAPI.Unshipped.txt
deleted file mode 100644
index 3ae82ce3ce..0000000000
--- a/src/Security/Authorization/Core/src/PublicAPI.Unshipped.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.DefaultAuthorizationPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.DefaultAuthorizationService(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider! handlers, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Authorization.DefaultAuthorizationService!>! logger, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory! contextFactory, Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator! evaluator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
-Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.DefaultAuthorizationPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
-Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.DefaultAuthorizationService(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider! handlers, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Authorization.DefaultAuthorizationService!>! logger, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory! contextFactory, Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator! evaluator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
-static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizeData!>! authorizeData, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>! policies) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
diff --git a/src/Security/Authorization/Core/src/PublicAPI.Shipped.txt b/src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Shipped.txt
index 6848bb660a..cf34e70c4b 100644
--- a/src/Security/Authorization/Core/src/PublicAPI.Shipped.txt
+++ b/src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.DefaultAuthorizationPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
-~Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.DefaultAuthorizationService(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider! handlers, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Authorization.DefaultAuthorizationService!>! logger, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory! contextFactory, Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator! evaluator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.DefaultAuthorizationPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.DefaultAuthorizationService(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider! handlers, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Authorization.DefaultAuthorizationService!>! logger, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory! contextFactory, Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator! evaluator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
abstract Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, TRequirement requirement, TResource resource) -> System.Threading.Tasks.Task!
abstract Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, TRequirement requirement) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute
diff --git a/src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Unshipped.txt b/src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..38f8cdf2c0
--- /dev/null
+++ b/src/Security/Authorization/Core/src/PublicAPI/net462/PublicAPI.Unshipped.txt
@@ -0,0 +1,15 @@
+#nullable enable
+Microsoft.AspNetCore.Authorization.AuthorizationBuilder
+Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AuthorizationBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.PassThroughAuthorizationHandler(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizeData!>! authorizeData, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>! policies) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddDefaultPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddDefaultPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddFallbackPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddFallbackPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetDefaultPolicy(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetFallbackPolicy(Microsoft.AspNetCore.Authorization.AuthorizationPolicy? policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetInvokeHandlersAfterFailure(bool invoke) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
diff --git a/src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Shipped.txt b/src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..cf34e70c4b
--- /dev/null
+++ b/src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Shipped.txt
@@ -0,0 +1,171 @@
+#nullable enable
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.DefaultAuthorizationPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.DefaultAuthorizationService(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider! handlers, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Authorization.DefaultAuthorizationService!>! logger, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory! contextFactory, Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator! evaluator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+abstract Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, TRequirement requirement, TResource resource) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, TRequirement requirement) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute
+Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute.AllowAnonymousAttribute() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationFailure
+Microsoft.AspNetCore.Authorization.AuthorizationFailure.FailCalled.get -> bool
+Microsoft.AspNetCore.Authorization.AuthorizationFailure.FailedRequirements.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+Microsoft.AspNetCore.Authorization.AuthorizationFailure.FailureReasons.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationFailureReason!>!
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason.AuthorizationFailureReason(Microsoft.AspNetCore.Authorization.IAuthorizationHandler! handler, string! message) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason.Handler.get -> Microsoft.AspNetCore.Authorization.IAuthorizationHandler!
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason.Message.get -> string!
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.AuthorizationHandler() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.AuthorizationHandler() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext
+Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.AuthorizationHandlerContext(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Security.Claims.ClaimsPrincipal! user, object? resource) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.AddPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.AddPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.AuthorizationOptions() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.DefaultPolicy.get -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.DefaultPolicy.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.FallbackPolicy.get -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy?
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.FallbackPolicy.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.GetPolicy(string! name) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy?
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.InvokeHandlersAfterFailure.get -> bool
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.InvokeHandlersAfterFailure.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList<string!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy.AuthorizationPolicy(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Collections.Generic.IEnumerable<string!>! authenticationSchemes) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy.Requirements.get -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AddAuthenticationSchemes(params string![]! schemes) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AddRequirements(params Microsoft.AspNetCore.Authorization.IAuthorizationRequirement![]! requirements) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthenticationSchemes.get -> System.Collections.Generic.IList<string!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthenticationSchemes.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthorizationPolicyBuilder(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthorizationPolicyBuilder(params string![]! authenticationSchemes) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Build() -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Combine(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireAssertion(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, bool>! handler) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireAssertion(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, System.Threading.Tasks.Task<bool>!>! handler) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireAuthenticatedUser() -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireClaim(string! claimType) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireClaim(string! claimType, params string![]! allowedValues) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireClaim(string! claimType, System.Collections.Generic.IEnumerable<string!>! allowedValues) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Requirements.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Requirements.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireRole(params string![]! roles) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireRole(System.Collections.Generic.IEnumerable<string!>! roles) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireUserName(string! userName) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationResult
+Microsoft.AspNetCore.Authorization.AuthorizationResult.Failure.get -> Microsoft.AspNetCore.Authorization.AuthorizationFailure?
+Microsoft.AspNetCore.Authorization.AuthorizationResult.Succeeded.get -> bool
+Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthenticationSchemes.get -> string?
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthenticationSchemes.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthorizeAttribute() -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthorizeAttribute(string! policy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Policy.get -> string?
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Policy.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Roles.get -> string?
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Roles.set -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationEvaluator
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationEvaluator.DefaultAuthorizationEvaluator() -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationEvaluator.Evaluate(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerContextFactory
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerContextFactory.DefaultAuthorizationHandlerContextFactory() -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider.DefaultAuthorizationHandlerProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler!>! handlers) -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider.GetHandlersAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler!>!>!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.GetDefaultPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.GetFallbackPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationService
+Microsoft.AspNetCore.Authorization.IAllowAnonymous (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator
+Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator.Evaluate(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+Microsoft.AspNetCore.Authorization.IAuthorizationHandler
+Microsoft.AspNetCore.Authorization.IAuthorizationHandler.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory.CreateContext(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Security.Claims.ClaimsPrincipal! user, object? resource) -> Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider.GetHandlersAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler!>!>!
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.GetDefaultPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>!
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.GetFallbackPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.GetPolicyAsync(string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+Microsoft.AspNetCore.Authorization.IAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.IAuthorizationService
+Microsoft.AspNetCore.Authorization.IAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+Microsoft.AspNetCore.Authorization.IAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+Microsoft.AspNetCore.Authorization.IAuthorizeData (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.AuthenticationSchemes.get -> string? (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.AuthenticationSchemes.set -> void (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Policy.get -> string? (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Policy.set -> void (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Roles.get -> string? (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Roles.set -> void (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.AssertionRequirement(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, bool>! handler) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.AssertionRequirement(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, System.Threading.Tasks.Task<bool>!>! handler) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.Handler.get -> System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, System.Threading.Tasks.Task<bool>!>!
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.AllowedValues.get -> System.Collections.Generic.IEnumerable<string!>?
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.ClaimsAuthorizationRequirement(string! claimType, System.Collections.Generic.IEnumerable<string!>? allowedValues) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.ClaimType.get -> string!
+Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement.DenyAnonymousAuthorizationRequirement() -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.NameAuthorizationRequirement(string! requiredName) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.RequiredName.get -> string!
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.Name.get -> string!
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.Name.set -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.OperationAuthorizationRequirement() -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.PassThroughAuthorizationHandler() -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.AllowedRoles.get -> System.Collections.Generic.IEnumerable<string!>!
+Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.RolesAuthorizationRequirement(System.Collections.Generic.IEnumerable<string!>! allowedRoles) -> void
+Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions
+override Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.ToString() -> string!
+static Microsoft.AspNetCore.Authorization.AuthorizationFailure.ExplicitFail() -> Microsoft.AspNetCore.Authorization.AuthorizationFailure!
+static Microsoft.AspNetCore.Authorization.AuthorizationFailure.Failed(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationFailureReason!>! reasons) -> Microsoft.AspNetCore.Authorization.AuthorizationFailure!
+static Microsoft.AspNetCore.Authorization.AuthorizationFailure.Failed(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! failed) -> Microsoft.AspNetCore.Authorization.AuthorizationFailure!
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.Combine(params Microsoft.AspNetCore.Authorization.AuthorizationPolicy![]! policies) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.Combine(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>! policies) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizeData!>! authorizeData) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+static Microsoft.AspNetCore.Authorization.AuthorizationResult.Failed() -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+static Microsoft.AspNetCore.Authorization.AuthorizationResult.Failed(Microsoft.AspNetCore.Authorization.AuthorizationFailure! failure) -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+static Microsoft.AspNetCore.Authorization.AuthorizationResult.Success() -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, object? resource, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, object? resource, Microsoft.AspNetCore.Authorization.IAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions.AddAuthorizationCore(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions.AddAuthorizationCore(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Fail() -> void
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Fail(Microsoft.AspNetCore.Authorization.AuthorizationFailureReason! reason) -> void
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.FailureReasons.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationFailureReason!>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.HasFailed.get -> bool
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.HasSucceeded.get -> bool
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.PendingRequirements.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Requirements.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Resource.get -> object?
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Succeed(Microsoft.AspNetCore.Authorization.IAuthorizationRequirement! requirement) -> void
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.User.get -> System.Security.Claims.ClaimsPrincipal!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerContextFactory.CreateContext(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Security.Claims.ClaimsPrincipal! user, object? resource) -> Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.GetPolicyAsync(string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
diff --git a/src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt b/src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..2e9a164e83
--- /dev/null
+++ b/src/Security/Authorization/Core/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt
@@ -0,0 +1,17 @@
+#nullable enable
+Microsoft.AspNetCore.Authorization.AuthorizationBuilder
+Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AuthorizationBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.CanCachePolicy.get -> bool
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.PassThroughAuthorizationHandler(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizeData!>! authorizeData, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>! policies) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddDefaultPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddDefaultPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddFallbackPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddFallbackPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetDefaultPolicy(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetFallbackPolicy(Microsoft.AspNetCore.Authorization.AuthorizationPolicy? policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetInvokeHandlersAfterFailure(bool invoke) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.CanCachePolicy.get -> bool
diff --git a/src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..cf34e70c4b
--- /dev/null
+++ b/src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt
@@ -0,0 +1,171 @@
+#nullable enable
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.DefaultAuthorizationPolicyProvider(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.DefaultAuthorizationService(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider! handlers, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Authorization.DefaultAuthorizationService!>! logger, Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory! contextFactory, Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator! evaluator, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+abstract Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, TRequirement requirement, TResource resource) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, TRequirement requirement) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute
+Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute.AllowAnonymousAttribute() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationFailure
+Microsoft.AspNetCore.Authorization.AuthorizationFailure.FailCalled.get -> bool
+Microsoft.AspNetCore.Authorization.AuthorizationFailure.FailedRequirements.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+Microsoft.AspNetCore.Authorization.AuthorizationFailure.FailureReasons.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationFailureReason!>!
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason.AuthorizationFailureReason(Microsoft.AspNetCore.Authorization.IAuthorizationHandler! handler, string! message) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason.Handler.get -> Microsoft.AspNetCore.Authorization.IAuthorizationHandler!
+Microsoft.AspNetCore.Authorization.AuthorizationFailureReason.Message.get -> string!
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.AuthorizationHandler() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>
+Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.AuthorizationHandler() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext
+Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.AuthorizationHandlerContext(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Security.Claims.ClaimsPrincipal! user, object? resource) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.AddPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.AddPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.AuthorizationOptions() -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.DefaultPolicy.get -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.DefaultPolicy.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.FallbackPolicy.get -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy?
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.FallbackPolicy.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.GetPolicy(string! name) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy?
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.InvokeHandlersAfterFailure.get -> bool
+Microsoft.AspNetCore.Authorization.AuthorizationOptions.InvokeHandlersAfterFailure.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy.AuthenticationSchemes.get -> System.Collections.Generic.IReadOnlyList<string!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy.AuthorizationPolicy(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Collections.Generic.IEnumerable<string!>! authenticationSchemes) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicy.Requirements.get -> System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AddAuthenticationSchemes(params string![]! schemes) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AddRequirements(params Microsoft.AspNetCore.Authorization.IAuthorizationRequirement![]! requirements) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthenticationSchemes.get -> System.Collections.Generic.IList<string!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthenticationSchemes.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthorizationPolicyBuilder(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.AuthorizationPolicyBuilder(params string![]! authenticationSchemes) -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Build() -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Combine(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireAssertion(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, bool>! handler) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireAssertion(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, System.Threading.Tasks.Task<bool>!>! handler) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireAuthenticatedUser() -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireClaim(string! claimType) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireClaim(string! claimType, params string![]! allowedValues) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireClaim(string! claimType, System.Collections.Generic.IEnumerable<string!>! allowedValues) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Requirements.get -> System.Collections.Generic.IList<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.Requirements.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireRole(params string![]! roles) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireRole(System.Collections.Generic.IEnumerable<string!>! roles) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder.RequireUserName(string! userName) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!
+Microsoft.AspNetCore.Authorization.AuthorizationResult
+Microsoft.AspNetCore.Authorization.AuthorizationResult.Failure.get -> Microsoft.AspNetCore.Authorization.AuthorizationFailure?
+Microsoft.AspNetCore.Authorization.AuthorizationResult.Succeeded.get -> bool
+Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthenticationSchemes.get -> string?
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthenticationSchemes.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthorizeAttribute() -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.AuthorizeAttribute(string! policy) -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Policy.get -> string?
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Policy.set -> void
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Roles.get -> string?
+Microsoft.AspNetCore.Authorization.AuthorizeAttribute.Roles.set -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationEvaluator
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationEvaluator.DefaultAuthorizationEvaluator() -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationEvaluator.Evaluate(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerContextFactory
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerContextFactory.DefaultAuthorizationHandlerContextFactory() -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider.DefaultAuthorizationHandlerProvider(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler!>! handlers) -> void
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerProvider.GetHandlersAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler!>!>!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.GetDefaultPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.GetFallbackPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+Microsoft.AspNetCore.Authorization.DefaultAuthorizationService
+Microsoft.AspNetCore.Authorization.IAllowAnonymous (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator
+Microsoft.AspNetCore.Authorization.IAuthorizationEvaluator.Evaluate(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+Microsoft.AspNetCore.Authorization.IAuthorizationHandler
+Microsoft.AspNetCore.Authorization.IAuthorizationHandler.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerContextFactory.CreateContext(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Security.Claims.ClaimsPrincipal! user, object? resource) -> Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider
+Microsoft.AspNetCore.Authorization.IAuthorizationHandlerProvider.GetHandlersAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationHandler!>!>!
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.GetDefaultPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>!
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.GetFallbackPolicyAsync() -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider.GetPolicyAsync(string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+Microsoft.AspNetCore.Authorization.IAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.IAuthorizationService
+Microsoft.AspNetCore.Authorization.IAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+Microsoft.AspNetCore.Authorization.IAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+Microsoft.AspNetCore.Authorization.IAuthorizeData (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.AuthenticationSchemes.get -> string? (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.AuthenticationSchemes.set -> void (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Policy.get -> string? (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Policy.set -> void (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Roles.get -> string? (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.IAuthorizeData.Roles.set -> void (forwarded, contained in Microsoft.AspNetCore.Metadata)
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.AssertionRequirement(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, bool>! handler) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.AssertionRequirement(System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, System.Threading.Tasks.Task<bool>!>! handler) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.Handler.get -> System.Func<Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!, System.Threading.Tasks.Task<bool>!>!
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.AllowedValues.get -> System.Collections.Generic.IEnumerable<string!>?
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.ClaimsAuthorizationRequirement(string! claimType, System.Collections.Generic.IEnumerable<string!>? allowedValues) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.ClaimType.get -> string!
+Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement.DenyAnonymousAuthorizationRequirement() -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.NameAuthorizationRequirement(string! requiredName) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.RequiredName.get -> string!
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.Name.get -> string!
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.Name.set -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.OperationAuthorizationRequirement() -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.PassThroughAuthorizationHandler() -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement
+Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.AllowedRoles.get -> System.Collections.Generic.IEnumerable<string!>!
+Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.RolesAuthorizationRequirement(System.Collections.Generic.IEnumerable<string!>! allowedRoles) -> void
+Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions
+override Microsoft.AspNetCore.Authorization.Infrastructure.AssertionRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.ClaimsAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.DenyAnonymousAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.NameAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.OperationAuthorizationRequirement.ToString() -> string!
+override Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.HandleRequirementAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context, Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task!
+override Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.ToString() -> string!
+static Microsoft.AspNetCore.Authorization.AuthorizationFailure.ExplicitFail() -> Microsoft.AspNetCore.Authorization.AuthorizationFailure!
+static Microsoft.AspNetCore.Authorization.AuthorizationFailure.Failed(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationFailureReason!>! reasons) -> Microsoft.AspNetCore.Authorization.AuthorizationFailure!
+static Microsoft.AspNetCore.Authorization.AuthorizationFailure.Failed(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! failed) -> Microsoft.AspNetCore.Authorization.AuthorizationFailure!
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.Combine(params Microsoft.AspNetCore.Authorization.AuthorizationPolicy![]! policies) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.Combine(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>! policies) -> Microsoft.AspNetCore.Authorization.AuthorizationPolicy!
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizeData!>! authorizeData) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+static Microsoft.AspNetCore.Authorization.AuthorizationResult.Failed() -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+static Microsoft.AspNetCore.Authorization.AuthorizationResult.Failed(Microsoft.AspNetCore.Authorization.AuthorizationFailure! failure) -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+static Microsoft.AspNetCore.Authorization.AuthorizationResult.Success() -> Microsoft.AspNetCore.Authorization.AuthorizationResult!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, object? resource, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, object? resource, Microsoft.AspNetCore.Authorization.IAuthorizationRequirement! requirement) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.AspNetCore.Authorization.AuthorizationServiceExtensions.AuthorizeAsync(this Microsoft.AspNetCore.Authorization.IAuthorizationService! service, System.Security.Claims.ClaimsPrincipal! user, string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+static Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions.AddAuthorizationCore(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+static Microsoft.Extensions.DependencyInjection.AuthorizationServiceCollectionExtensions.AddAuthorizationCore(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! configure) -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement, TResource>.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandler<TRequirement>.HandleAsync(Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext! context) -> System.Threading.Tasks.Task!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Fail() -> void
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Fail(Microsoft.AspNetCore.Authorization.AuthorizationFailureReason! reason) -> void
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.FailureReasons.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationFailureReason!>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.HasFailed.get -> bool
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.HasSucceeded.get -> bool
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.PendingRequirements.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Requirements.get -> System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Resource.get -> object?
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.Succeed(Microsoft.AspNetCore.Authorization.IAuthorizationRequirement! requirement) -> void
+virtual Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext.User.get -> System.Security.Claims.ClaimsPrincipal!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationHandlerContextFactory.CreateContext(System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements, System.Security.Claims.ClaimsPrincipal! user, object? resource) -> Microsoft.AspNetCore.Authorization.AuthorizationHandlerContext!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider.GetPolicyAsync(string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, string! policyName) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
+virtual Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(System.Security.Claims.ClaimsPrincipal! user, object? resource, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizationRequirement!>! requirements) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationResult!>!
diff --git a/src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..38f8cdf2c0
--- /dev/null
+++ b/src/Security/Authorization/Core/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
@@ -0,0 +1,15 @@
+#nullable enable
+Microsoft.AspNetCore.Authorization.AuthorizationBuilder
+Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AuthorizationBuilder(Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> void
+Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.PassThroughAuthorizationHandler(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Authorization.AuthorizationOptions!>! options) -> void
+static Microsoft.AspNetCore.Authorization.AuthorizationPolicy.CombineAsync(Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.IAuthorizeData!>! authorizeData, System.Collections.Generic.IEnumerable<Microsoft.AspNetCore.Authorization.AuthorizationPolicy!>! policies) -> System.Threading.Tasks.Task<Microsoft.AspNetCore.Authorization.AuthorizationPolicy?>!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddDefaultPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddDefaultPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddFallbackPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddFallbackPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddPolicy(string! name, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.AddPolicy(string! name, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetDefaultPolicy(Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetFallbackPolicy(Microsoft.AspNetCore.Authorization.AuthorizationPolicy? policy) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
+virtual Microsoft.AspNetCore.Authorization.AuthorizationBuilder.SetInvokeHandlersAfterFailure(bool invoke) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
diff --git a/src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs b/src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs
index 3e6fac417f..43d953b431 100644
--- a/src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs
+++ b/src/Security/Authorization/Core/src/RolesAuthorizationRequirement.cs
@@ -46,15 +46,17 @@ public class RolesAuthorizationRequirement : AuthorizationHandler<RolesAuthoriza
{
if (context.User != null)
{
- bool found = false;
- if (requirement.AllowedRoles == null || !requirement.AllowedRoles.Any())
- {
- // Review: What do we want to do here? No roles requested is auto success?
- }
- else
+ var found = false;
+
+ foreach (var role in requirement.AllowedRoles)
{
- found = requirement.AllowedRoles.Any(r => context.User.IsInRole(r));
+ if (context.User.IsInRole(role))
+ {
+ found = true;
+ break;
+ }
}
+
if (found)
{
context.Succeed(requirement);
diff --git a/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs b/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs
index 1e6cedfc5b..74b23c01f8 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationAppBuilderExtensions.cs
@@ -12,6 +12,8 @@ namespace Microsoft.AspNetCore.Builder;
/// </summary>
public static class AuthorizationAppBuilderExtensions
{
+ internal const string AuthorizationMiddlewareSetKey = "__AuthorizationMiddlewareSet";
+
/// <summary>
/// Adds the <see cref="AuthorizationMiddleware"/> to the specified <see cref="IApplicationBuilder"/>, which enables authorization capabilities.
/// <para>
@@ -30,6 +32,7 @@ public static class AuthorizationAppBuilderExtensions
VerifyServicesRegistered(app);
+ app.Properties[AuthorizationMiddlewareSetKey] = true;
return app.UseMiddleware<AuthorizationMiddleware>();
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs b/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs
index 6551f048fb..83a19972ff 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationEndpointConventionBuilderExtensions.cs
@@ -168,5 +168,4 @@ public static class AuthorizationEndpointConventionBuilderExtensions
}
});
}
-
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs b/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
index 0a58a00a37..2df6ca2e46 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationMiddleware.cs
@@ -23,6 +23,8 @@ public class AuthorizationMiddleware
private readonly RequestDelegate _next;
private readonly IAuthorizationPolicyProvider _policyProvider;
+ private readonly bool _canCache;
+ private readonly AuthorizationPolicyCache? _policyCache;
/// <summary>
/// Initializes a new instance of <see cref="AuthorizationMiddleware"/>.
@@ -33,6 +35,24 @@ public class AuthorizationMiddleware
{
_next = next ?? throw new ArgumentNullException(nameof(next));
_policyProvider = policyProvider ?? throw new ArgumentNullException(nameof(policyProvider));
+ _canCache = false;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of <see cref="AuthorizationMiddleware"/>.
+ /// </summary>
+ /// <param name="next">The next middleware in the application middleware pipeline.</param>
+ /// <param name="policyProvider">The <see cref="IAuthorizationPolicyProvider"/>.</param>
+ /// <param name="services">The <see cref="IServiceProvider"/>.</param>
+ public AuthorizationMiddleware(RequestDelegate next, IAuthorizationPolicyProvider policyProvider, IServiceProvider services) : this(next, policyProvider)
+ {
+ ArgumentNullException.ThrowIfNull(services);
+
+ if (_policyProvider.CanCachePolicy)
+ {
+ _policyCache = services.GetService<AuthorizationPolicyCache>();
+ _canCache = _policyCache != null;
+ }
}
/// <summary>
@@ -47,7 +67,6 @@ public class AuthorizationMiddleware
}
var endpoint = context.GetEndpoint();
-
if (endpoint != null)
{
// EndpointRoutingMiddleware uses this flag to check if the Authorization middleware processed auth metadata on the endpoint.
@@ -55,12 +74,29 @@ public class AuthorizationMiddleware
context.Items[AuthorizationMiddlewareInvokedWithEndpointKey] = AuthorizationMiddlewareWithEndpointInvokedValue;
}
- // IMPORTANT: Changes to authorization logic should be mirrored in MVC's AuthorizeFilter
- var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();
+ // Use the computed policy for this endpoint if we can
+ AuthorizationPolicy? policy = null;
+ var canCachePolicy = _canCache && endpoint != null;
+ if (canCachePolicy)
+ {
+ policy = _policyCache!.Lookup(endpoint!);
+ }
+
+ if (policy == null)
+ {
+ // IMPORTANT: Changes to authorization logic should be mirrored in MVC's AuthorizeFilter
+ var authorizeData = endpoint?.Metadata.GetOrderedMetadata<IAuthorizeData>() ?? Array.Empty<IAuthorizeData>();
- var policies = endpoint?.Metadata.GetOrderedMetadata<AuthorizationPolicy>() ?? Array.Empty<AuthorizationPolicy>();
+ var policies = endpoint?.Metadata.GetOrderedMetadata<AuthorizationPolicy>() ?? Array.Empty<AuthorizationPolicy>();
- var policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData, policies);
+ policy = await AuthorizationPolicy.CombineAsync(_policyProvider, authorizeData, policies);
+
+ // Cache the computed policy
+ if (policy != null && canCachePolicy)
+ {
+ _policyCache!.Store(endpoint!, policy);
+ }
+ }
if (policy == null)
{
@@ -108,4 +144,5 @@ public class AuthorizationMiddleware
var authorizationMiddlewareResultHandler = context.RequestServices.GetRequiredService<IAuthorizationMiddlewareResultHandler>();
await authorizationMiddlewareResultHandler.HandleAsync(_next, context, policy, authorizeResult);
}
+
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationMiddlewareResultHandler.cs b/src/Security/Authorization/Policy/src/AuthorizationMiddlewareResultHandler.cs
index dc46a09663..7ca03020d8 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationMiddlewareResultHandler.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationMiddlewareResultHandler.cs
@@ -12,41 +12,45 @@ namespace Microsoft.AspNetCore.Authorization.Policy;
public class AuthorizationMiddlewareResultHandler : IAuthorizationMiddlewareResultHandler
{
/// <inheritdoc />
- public async Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
+ public Task HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
{
- if (authorizeResult.Challenged)
+ if (authorizeResult.Succeeded)
{
- if (policy.AuthenticationSchemes.Count > 0)
- {
- foreach (var scheme in policy.AuthenticationSchemes)
- {
- await context.ChallengeAsync(scheme);
- }
- }
- else
- {
- await context.ChallengeAsync();
- }
-
- return;
+ return next(context);
}
- else if (authorizeResult.Forbidden)
+
+ return Handle();
+
+ async Task Handle()
{
- if (policy.AuthenticationSchemes.Count > 0)
+ if (authorizeResult.Challenged)
{
- foreach (var scheme in policy.AuthenticationSchemes)
+ if (policy.AuthenticationSchemes.Count > 0)
{
- await context.ForbidAsync(scheme);
+ foreach (var scheme in policy.AuthenticationSchemes)
+ {
+ await context.ChallengeAsync(scheme);
+ }
+ }
+ else
+ {
+ await context.ChallengeAsync();
}
}
- else
+ else if (authorizeResult.Forbidden)
{
- await context.ForbidAsync();
+ if (policy.AuthenticationSchemes.Count > 0)
+ {
+ foreach (var scheme in policy.AuthenticationSchemes)
+ {
+ await context.ForbidAsync(scheme);
+ }
+ }
+ else
+ {
+ await context.ForbidAsync();
+ }
}
-
- return;
}
-
- await next(context);
}
}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationPolicyCache.cs b/src/Security/Authorization/Policy/src/AuthorizationPolicyCache.cs
new file mode 100644
index 0000000000..276250f42c
--- /dev/null
+++ b/src/Security/Authorization/Policy/src/AuthorizationPolicyCache.cs
@@ -0,0 +1,42 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Concurrent;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
+
+namespace Microsoft.AspNetCore.Authorization.Policy;
+
+internal sealed class AuthorizationPolicyCache : IDisposable
+{
+ // Caches AuthorizationPolicy instances
+ private readonly DataSourceDependentCache<ConcurrentDictionary<Endpoint, AuthorizationPolicy>> _policyCache;
+
+ public AuthorizationPolicyCache(EndpointDataSource dataSource)
+ {
+ // We cache AuthorizationPolicy instances per-Endpoint for performance, but we want to wipe out
+ // that cache if the endpoints change so that we don't allow unbounded memory growth.
+ _policyCache = new DataSourceDependentCache<ConcurrentDictionary<Endpoint, AuthorizationPolicy>>(dataSource, (_) =>
+ {
+ // We don't eagerly fill this cache because there's no real reason to.
+ return new ConcurrentDictionary<Endpoint, AuthorizationPolicy>();
+ });
+ _policyCache.EnsureInitialized();
+ }
+
+ public AuthorizationPolicy? Lookup(Endpoint endpoint)
+ {
+ _policyCache.Value!.TryGetValue(endpoint, out var policy);
+ return policy;
+ }
+
+ public void Store(Endpoint endpoint, AuthorizationPolicy policy)
+ {
+ _policyCache.Value![endpoint] = policy;
+ }
+
+ public void Dispose()
+ {
+ _policyCache.Dispose();
+ }
+}
diff --git a/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs b/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs
index f5e06073af..6a53b07b3c 100644
--- a/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs
+++ b/src/Security/Authorization/Policy/src/AuthorizationPolicyMarkerService.cs
@@ -3,6 +3,6 @@
namespace Microsoft.AspNetCore.Authorization.Policy;
-internal class AuthorizationPolicyMarkerService
+internal sealed class AuthorizationPolicyMarkerService
{
}
diff --git a/src/Security/Authorization/Policy/src/Microsoft.AspNetCore.Authorization.Policy.csproj b/src/Security/Authorization/Policy/src/Microsoft.AspNetCore.Authorization.Policy.csproj
index 088318e513..14912c54a9 100644
--- a/src/Security/Authorization/Policy/src/Microsoft.AspNetCore.Authorization.Policy.csproj
+++ b/src/Security/Authorization/Policy/src/Microsoft.AspNetCore.Authorization.Policy.csproj
@@ -7,11 +7,12 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;authorization</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(SharedSourceRoot)SecurityHelper\**\*.cs" />
+ <Compile Include="..\..\..\..\Http\Routing\src\DataSourceDependentCache.cs" Link="DataSourceDependentCache.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Security/Authorization/Policy/src/PolicyAuthorizationResult.cs b/src/Security/Authorization/Policy/src/PolicyAuthorizationResult.cs
index b89d4ad90f..45266f19ae 100644
--- a/src/Security/Authorization/Policy/src/PolicyAuthorizationResult.cs
+++ b/src/Security/Authorization/Policy/src/PolicyAuthorizationResult.cs
@@ -8,6 +8,10 @@ namespace Microsoft.AspNetCore.Authorization.Policy;
/// </summary>
public class PolicyAuthorizationResult
{
+ private static readonly PolicyAuthorizationResult _challengedResult = new() { Challenged = true };
+ private static readonly PolicyAuthorizationResult _forbiddenResult = new() { Forbidden = true };
+ private static readonly PolicyAuthorizationResult _succeededResult = new() { Succeeded = true };
+
private PolicyAuthorizationResult() { }
/// <summary>
@@ -34,15 +38,13 @@ public class PolicyAuthorizationResult
///Indicates that an unauthenticated user requested access to an endpoint that requires authentication.
/// </summary>
/// <returns>The <see cref="PolicyAuthorizationResult"/>.</returns>
- public static PolicyAuthorizationResult Challenge()
- => new PolicyAuthorizationResult { Challenged = true };
+ public static PolicyAuthorizationResult Challenge() => _challengedResult;
/// <summary>
/// Indicates that the access to a resource was forbidden.
/// </summary>
/// <returns>The <see cref="PolicyAuthorizationResult"/>.</returns>
- public static PolicyAuthorizationResult Forbid()
- => Forbid(null);
+ public static PolicyAuthorizationResult Forbid() => _forbiddenResult;
/// <summary>
/// Indicates that the access to a resource was forbidden.
@@ -50,12 +52,13 @@ public class PolicyAuthorizationResult
/// <param name="authorizationFailure">Specifies the reason the authorization failed.s</param>
/// <returns>The <see cref="PolicyAuthorizationResult"/>.</returns>
public static PolicyAuthorizationResult Forbid(AuthorizationFailure? authorizationFailure)
- => new PolicyAuthorizationResult { Forbidden = true, AuthorizationFailure = authorizationFailure };
+ => authorizationFailure is null
+ ? _forbiddenResult
+ : new PolicyAuthorizationResult { Forbidden = true, AuthorizationFailure = authorizationFailure };
/// <summary>
/// Indicates a successful authorization.
/// </summary>
/// <returns>The <see cref="PolicyAuthorizationResult"/>.</returns>
- public static PolicyAuthorizationResult Success()
- => new PolicyAuthorizationResult { Succeeded = true };
+ public static PolicyAuthorizationResult Success() => _succeededResult;
}
diff --git a/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs b/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs
index 4c4a958a09..6f68fb2194 100644
--- a/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs
+++ b/src/Security/Authorization/Policy/src/PolicyServiceCollectionExtensions.cs
@@ -13,6 +13,14 @@ namespace Microsoft.Extensions.DependencyInjection;
public static class PolicyServiceCollectionExtensions
{
/// <summary>
+ /// Adds authorization services to the specified <see cref="IServiceCollection" />.
+ /// </summary>
+ /// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
+ /// <returns>The <see cref="AuthorizationBuilder"/> so that additional calls can be chained.</returns>
+ public static AuthorizationBuilder AddAuthorizationBuilder(this IServiceCollection services)
+ => new AuthorizationBuilder(services.AddAuthorization());
+
+ /// <summary>
/// Adds the authorization policy evaluator service to the specified <see cref="IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="IServiceCollection" /> to add services to.</param>
@@ -44,6 +52,7 @@ public static class PolicyServiceCollectionExtensions
services.AddAuthorizationCore();
services.AddAuthorizationPolicyEvaluator();
+ services.AddSingleton<AuthorizationPolicyCache>();
return services;
}
@@ -62,6 +71,7 @@ public static class PolicyServiceCollectionExtensions
services.AddAuthorizationCore(configure);
services.AddAuthorizationPolicyEvaluator();
+ services.AddSingleton<AuthorizationPolicyCache>();
return services;
}
}
diff --git a/src/Security/Authorization/Policy/src/PublicAPI.Unshipped.txt b/src/Security/Authorization/Policy/src/PublicAPI.Unshipped.txt
index 9c11d1e7b2..302dcdf9f9 100644
--- a/src/Security/Authorization/Policy/src/PublicAPI.Unshipped.txt
+++ b/src/Security/Authorization/Policy/src/PublicAPI.Unshipped.txt
@@ -1,3 +1,5 @@
#nullable enable
+Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.AuthorizationMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.AspNetCore.Authorization.IAuthorizationPolicyProvider! policyProvider, System.IServiceProvider! services) -> void
static Microsoft.AspNetCore.Builder.AuthorizationEndpointConventionBuilderExtensions.RequireAuthorization<TBuilder>(this TBuilder builder, Microsoft.AspNetCore.Authorization.AuthorizationPolicy! policy) -> TBuilder
static Microsoft.AspNetCore.Builder.AuthorizationEndpointConventionBuilderExtensions.RequireAuthorization<TBuilder>(this TBuilder builder, System.Action<Microsoft.AspNetCore.Authorization.AuthorizationPolicyBuilder!>! configurePolicy) -> TBuilder
+static Microsoft.Extensions.DependencyInjection.PolicyServiceCollectionExtensions.AddAuthorizationBuilder(this Microsoft.Extensions.DependencyInjection.IServiceCollection! services) -> Microsoft.AspNetCore.Authorization.AuthorizationBuilder!
diff --git a/src/Security/Authorization/test/AssertionRequirementsTests.cs b/src/Security/Authorization/test/AssertionRequirementsTests.cs
index 15430f3e81..3297bd76e0 100644
--- a/src/Security/Authorization/test/AssertionRequirementsTests.cs
+++ b/src/Security/Authorization/test/AssertionRequirementsTests.cs
@@ -7,11 +7,6 @@ namespace Microsoft.AspNetCore.Authorization.Test;
public class AssertionRequirementsTests
{
- private AssertionRequirement CreateRequirement()
- {
- return new AssertionRequirement(context => true);
- }
-
[Fact]
public void ToString_ShouldReturnFormatValue()
{
diff --git a/src/Security/Authorization/test/AuthorizationBuilderTests.cs b/src/Security/Authorization/test/AuthorizationBuilderTests.cs
new file mode 100644
index 0000000000..46c2b66066
--- /dev/null
+++ b/src/Security/Authorization/test/AuthorizationBuilderTests.cs
@@ -0,0 +1,116 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Authorization.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+
+namespace Microsoft.AspNetCore.Authorization.Test;
+
+public class AuthorizationBuilderTests
+{
+ [Fact]
+ public void CanSetFallbackPolicy()
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
+ var builder = TestHelpers.CreateAuthorizationBuilder()
+ // Act
+ .SetFallbackPolicy(policy);
+
+ var options = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<AuthorizationOptions>>().Value;
+
+ // Assert
+ Assert.Equal(policy, options.FallbackPolicy);
+ }
+
+ [Fact]
+ public void CanUnSetFallbackPolicy()
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
+ var builder = TestHelpers.CreateAuthorizationBuilder()
+ .SetFallbackPolicy(policy)
+ // Act
+ .SetFallbackPolicy(null);
+
+ var options = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<AuthorizationOptions>>().Value;
+
+ // Assert
+ Assert.Null(options.FallbackPolicy);
+ }
+
+ [Fact]
+ public void CanSetDefaultPolicy()
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
+ var builder = TestHelpers.CreateAuthorizationBuilder()
+ // Act
+ .SetDefaultPolicy(policy);
+
+ var options = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<AuthorizationOptions>>().Value;
+
+ // Assert
+ Assert.Equal(policy, options.DefaultPolicy);
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public void CanSetInvokeHandlersAfterFailure(bool invoke)
+ {
+ // Arrange
+ var builder = TestHelpers.CreateAuthorizationBuilder()
+ // Act
+ .SetInvokeHandlersAfterFailure(invoke);
+
+ var options = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<AuthorizationOptions>>().Value;
+
+ // Assert
+ Assert.Equal(invoke, options.InvokeHandlersAfterFailure);
+ }
+
+ [Fact]
+ public void CanAddPolicyInstance()
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
+ var builder = TestHelpers.CreateAuthorizationBuilder()
+ // Act
+ .AddPolicy("name", policy);
+
+ var options = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<AuthorizationOptions>>().Value;
+
+ // Assert
+ Assert.Equal(policy, options.GetPolicy("name"));
+ }
+
+ [Fact]
+ public void CanAddPolicyDelegate()
+ {
+ // Arrange
+ var builder = TestHelpers.CreateAuthorizationBuilder()
+ // Act
+ .AddPolicy("name", p => p.RequireAssertion(_ => true));
+
+ var options = builder.Services.BuildServiceProvider().GetRequiredService<IOptions<AuthorizationOptions>>().Value;
+
+ // Assert
+ var policy = options.GetPolicy("name");
+ Assert.NotNull(policy);
+ Assert.Equal(1, policy.Requirements.Count);
+ Assert.IsType<AssertionRequirement>(policy.Requirements.First());
+ }
+}
+
+internal class TestHelpers
+{
+ public static AuthorizationBuilder CreateAuthorizationBuilder()
+ {
+ var services = new ServiceCollection();
+ services.AddLogging();
+ services.AddOptions();
+ return services.AddAuthorizationBuilder();
+ }
+}
diff --git a/src/Security/Authorization/test/AuthorizationMiddlewareTests.cs b/src/Security/Authorization/test/AuthorizationMiddlewareTests.cs
index 15ee3bc641..3907fbd60f 100644
--- a/src/Security/Authorization/test/AuthorizationMiddlewareTests.cs
+++ b/src/Security/Authorization/test/AuthorizationMiddlewareTests.cs
@@ -5,8 +5,14 @@ using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization.Policy;
using Microsoft.AspNetCore.Authorization.Test.TestObjects;
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Primitives;
using Moq;
namespace Microsoft.AspNetCore.Authorization.Test;
@@ -207,6 +213,145 @@ public class AuthorizationMiddlewareTests
Assert.Equal(3, next.CalledCount);
}
+ private static EndpointDataSource CreateDataSource(Endpoint endpoint)
+ {
+ var dataSource = new Mock<EndpointDataSource>();
+ dataSource.Setup(d => d.Endpoints).Returns(new Endpoint[] { endpoint });
+ dataSource.Setup(d => d.GetChangeToken()).Returns(new CancellationChangeToken(new CancellationToken()));
+ return dataSource.Object;
+ }
+
+ [Fact]
+ public async Task OnAuthorizationAsync_WillNotCallPolicyProviderWithCache()
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build();
+ var policyProvider = new Mock<IAuthorizationPolicyProvider>();
+ var getPolicyCount = 0;
+ var getFallbackPolicyCount = 0;
+ policyProvider.Setup(p => p.GetPolicyAsync(It.IsAny<string>())).ReturnsAsync(policy)
+ .Callback(() => getPolicyCount++);
+ policyProvider.Setup(p => p.GetFallbackPolicyAsync()).ReturnsAsync(policy)
+ .Callback(() => getFallbackPolicyCount++);
+ policyProvider.Setup(p => p.CanCachePolicy).Returns(true);
+ var next = new TestRequestDelegate();
+
+ var endpoint = CreateEndpoint(new AuthorizeAttribute("whatever"));
+ var services = new ServiceCollection()
+ .AddAuthorization()
+ .AddSingleton(CreateDataSource(endpoint)).BuildServiceProvider();
+ var middleware = CreateMiddleware(next.Invoke, policyProvider.Object, services);
+ var context = GetHttpContext(anonymous: true, endpoint: endpoint);
+
+ // Act & Assert
+ await middleware.Invoke(context);
+ Assert.Equal(1, getPolicyCount);
+ Assert.Equal(0, getFallbackPolicyCount);
+ Assert.Equal(1, next.CalledCount);
+
+ await middleware.Invoke(context);
+ Assert.Equal(1, getPolicyCount);
+ Assert.Equal(0, getFallbackPolicyCount);
+ Assert.Equal(2, next.CalledCount);
+
+ await middleware.Invoke(context);
+ Assert.Equal(1, getPolicyCount);
+ Assert.Equal(0, getFallbackPolicyCount);
+ Assert.Equal(3, next.CalledCount);
+ }
+
+ private class TestDefaultPolicyProvider : DefaultAuthorizationPolicyProvider
+ {
+ public int GetFallbackPolicyCount;
+ public int GetPolicyCount;
+ private readonly bool _canCache;
+
+ public TestDefaultPolicyProvider(IOptions<AuthorizationOptions> options, bool canCache) : base(options)
+ {
+ _canCache = canCache;
+ }
+
+ public new Task<AuthorizationPolicy> GetFallbackPolicyAsync()
+ {
+ GetFallbackPolicyCount++;
+ return base.GetFallbackPolicyAsync();
+ }
+
+ public override Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
+ {
+ GetPolicyCount++;
+ return Task.FromResult(new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build());
+ }
+
+ public override bool CanCachePolicy => _canCache;
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task OnAuthorizationAsync_WillCallDerviedDefaultPolicyProviderCanCache(bool canCache)
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build();
+ var policyProvider = new TestDefaultPolicyProvider(Options.Create(new AuthorizationOptions()), canCache);
+ var next = new TestRequestDelegate();
+ var endpoint = CreateEndpoint(new AuthorizeAttribute("whatever"));
+ var services = new ServiceCollection()
+ .AddAuthorization()
+ .AddSingleton(CreateDataSource(endpoint)).BuildServiceProvider();
+ var middleware = CreateMiddleware(next.Invoke, policyProvider, services);
+ var context = GetHttpContext(anonymous: true, endpoint: endpoint);
+
+ // Act & Assert
+ await middleware.Invoke(context);
+ Assert.Equal(1, policyProvider.GetPolicyCount);
+ Assert.Equal(0, policyProvider.GetFallbackPolicyCount);
+ Assert.Equal(1, next.CalledCount);
+
+ await middleware.Invoke(context);
+ Assert.Equal(canCache ? 1: 2, policyProvider.GetPolicyCount);
+ Assert.Equal(0, policyProvider.GetFallbackPolicyCount);
+ Assert.Equal(2, next.CalledCount);
+
+ await middleware.Invoke(context);
+ Assert.Equal(canCache ? 1 : 3, policyProvider.GetPolicyCount);
+ Assert.Equal(0, policyProvider.GetFallbackPolicyCount);
+ Assert.Equal(3, next.CalledCount);
+ }
+
+ [Fact]
+ public async Task OnAuthorizationAsync_WillCallCustomPolicyProviderWithCache()
+ {
+ // Arrange
+ var policy = new AuthorizationPolicyBuilder().RequireAssertion(_ => true).Build();
+ var policyProvider = new Mock<IAuthorizationPolicyProvider>();
+ var getPolicyCount = 0;
+ var getFallbackPolicyCount = 0;
+ policyProvider.Setup(p => p.GetPolicyAsync(It.IsAny<string>())).ReturnsAsync(policy)
+ .Callback(() => getPolicyCount++);
+ policyProvider.Setup(p => p.GetFallbackPolicyAsync()).ReturnsAsync(policy)
+ .Callback(() => getFallbackPolicyCount++);
+ var next = new TestRequestDelegate();
+ var middleware = CreateMiddleware(next.Invoke, policyProvider.Object);
+ var context = GetHttpContext(anonymous: true, endpoint: CreateEndpoint(new AuthorizeAttribute("whatever")));
+
+ // Act & Assert
+ await middleware.Invoke(context);
+ Assert.Equal(1, getPolicyCount);
+ Assert.Equal(0, getFallbackPolicyCount);
+ Assert.Equal(1, next.CalledCount);
+
+ await middleware.Invoke(context);
+ Assert.Equal(2, getPolicyCount);
+ Assert.Equal(0, getFallbackPolicyCount);
+ Assert.Equal(2, next.CalledCount);
+
+ await middleware.Invoke(context);
+ Assert.Equal(3, getPolicyCount);
+ Assert.Equal(0, getFallbackPolicyCount);
+ Assert.Equal(3, next.CalledCount);
+ }
+
[Fact]
public async Task CanApplyPolicyDirectlyToEndpoint()
{
@@ -658,10 +803,32 @@ public class AuthorizationMiddlewareTests
Assert.Same(authenticateResult, authenticateResultFeature.AuthenticateResult);
}
- private AuthorizationMiddleware CreateMiddleware(RequestDelegate requestDelegate = null, IAuthorizationPolicyProvider policyProvider = null)
+ // Validation for https://github.com/dotnet/aspnetcore/issues/43188
+ [Fact]
+ public async Task WebApplicationBuilder_CanRegisterAuthzMiddlewareWithScopedService()
+ {
+ var builder = WebApplication.CreateBuilder(new WebApplicationOptions()
+ {
+ EnvironmentName = Environments.Development
+ });
+ builder.Services.AddAuthorization();
+ builder.Services.AddScoped<IAuthorizationHandler, TestAuthorizationHandler>();
+ using var app = builder.Build();
+
+ Assert.False(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.False(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+
+ await app.StartAsync();
+
+ Assert.False(app.Properties.ContainsKey("__AuthenticationMiddlewareSet"));
+ Assert.True(app.Properties.ContainsKey("__AuthorizationMiddlewareSet"));
+ }
+
+ private AuthorizationMiddleware CreateMiddleware(RequestDelegate requestDelegate = null, IAuthorizationPolicyProvider policyProvider = null, IServiceProvider services = null)
{
requestDelegate = requestDelegate ?? ((context) => Task.CompletedTask);
- return new AuthorizationMiddleware(requestDelegate, policyProvider);
+ services ??= new ServiceCollection().BuildServiceProvider();
+ return new AuthorizationMiddleware(requestDelegate, policyProvider, services);
}
private Endpoint CreateEndpoint(params object[] metadata)
@@ -724,6 +891,11 @@ public class AuthorizationMiddlewareTests
return httpContext;
}
+ public class TestAuthorizationHandler : IAuthorizationHandler
+ {
+ public Task HandleAsync(AuthorizationHandlerContext context) => Task.CompletedTask;
+ }
+
private class TestRequestDelegate
{
private readonly int _statusCode;
diff --git a/src/Security/Authorization/test/DefaultAuthorizationServiceTests.cs b/src/Security/Authorization/test/DefaultAuthorizationServiceTests.cs
index 937adbc55e..fcab4e0388 100644
--- a/src/Security/Authorization/test/DefaultAuthorizationServiceTests.cs
+++ b/src/Security/Authorization/test/DefaultAuthorizationServiceTests.cs
@@ -37,12 +37,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage")));
var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] { new Claim("Permission", "CanViewPage") }));
// Act
@@ -58,13 +53,10 @@ public class DefaultAuthorizationServiceTests
// Arrange
var authorizationService = BuildAuthorizationService(services =>
{
- services.AddAuthorization(options =>
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy =>
{
- options.AddPolicy("Basic", policy =>
- {
- policy.AddAuthenticationSchemes("Basic");
- policy.RequireClaim("Permission", "CanViewPage");
- });
+ policy.AddAuthenticationSchemes("Basic");
+ policy.RequireClaim("Permission", "CanViewPage");
});
});
var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[] { new Claim("Permission", "CanViewPage") }, "Basic"));
@@ -81,12 +73,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage", "CanViewAnything"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage", "CanViewAnything")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
@@ -113,10 +100,7 @@ public class DefaultAuthorizationServiceTests
{
services.AddSingleton<IAuthorizationHandler>(handler1);
services.AddSingleton<IAuthorizationHandler>(handler2);
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Custom", policy => policy.Requirements.Add(new CustomRequirement()));
- });
+ services.AddAuthorizationBuilder().AddPolicy("Custom", policy => policy.Requirements.Add(new CustomRequirement()));
});
// Act
@@ -141,11 +125,9 @@ public class DefaultAuthorizationServiceTests
{
services.AddSingleton<IAuthorizationHandler>(handler1);
services.AddSingleton<IAuthorizationHandler>(handler2);
- services.AddAuthorization(options =>
- {
- options.InvokeHandlersAfterFailure = invokeAllHandlers;
- options.AddPolicy("Custom", policy => policy.Requirements.Add(new CustomRequirement()));
- });
+ services.AddAuthorizationBuilder()
+ .AddPolicy("Custom", policy => policy.Requirements.Add(new CustomRequirement()))
+ .SetInvokeHandlersAfterFailure(invokeAllHandlers);
});
// Act
@@ -196,10 +178,7 @@ public class DefaultAuthorizationServiceTests
services.AddSingleton<IAuthorizationHandler>(handler1);
services.AddSingleton<IAuthorizationHandler>(handler2);
services.AddSingleton<IAuthorizationHandler>(handler3);
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Custom", policy => policy.Requirements.Add(new CustomRequirement()));
- });
+ services.AddAuthorizationBuilder().AddPolicy("Custom", policy => policy.Requirements.Add(new CustomRequirement()));
});
// Act
@@ -222,12 +201,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage", "CanViewAnything"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage", "CanViewAnything")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
@@ -249,12 +223,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage", "CanViewAnything"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage", "CanViewAnything")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
@@ -275,12 +244,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
@@ -301,12 +265,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[0],
@@ -325,12 +284,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage")));
// Act
var allowed = await authorizationService.AuthorizeAsync(null, null, "Basic");
@@ -344,12 +298,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage")));
var user = new ClaimsPrincipal(new ClaimsIdentity());
// Act
@@ -364,12 +313,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireClaim("Permission", "CanViewPage")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
@@ -517,12 +461,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => policy.RequireRole("Admin", "Users"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => policy.RequireRole("Admin", "Users")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
@@ -541,12 +480,7 @@ public class DefaultAuthorizationServiceTests
public void PolicyThrowsWithNoRequirements()
{
Assert.Throws<InvalidOperationException>(() => BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Basic", policy => { });
- });
- }));
+ services.AddAuthorizationBuilder().AddPolicy("Basic", policy => { })));
}
[Fact]
@@ -554,12 +488,7 @@ public class DefaultAuthorizationServiceTests
{
// Arrange
var authorizationService = BuildAuthorizationService(services =>
- {
- services.AddAuthorization(options =>
- {
- options.AddPolicy("Hao", policy => policy.RequireUserName("Hao"));
- });
- });
+ services.AddAuthorizationBuilder().AddPolicy("Hao", policy => policy.RequireUserName("Hao")));
var user = new ClaimsPrincipal(
new ClaimsIdentity(
new Claim[] {
diff --git a/src/Security/Authorization/test/Microsoft.AspNetCore.Authorization.Test.csproj b/src/Security/Authorization/test/Microsoft.AspNetCore.Authorization.Test.csproj
index c89f347b2a..11fe6d5589 100644
--- a/src/Security/Authorization/test/Microsoft.AspNetCore.Authorization.Test.csproj
+++ b/src/Security/Authorization/test/Microsoft.AspNetCore.Authorization.Test.csproj
@@ -5,6 +5,7 @@
</PropertyGroup>
<ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.AspNetCore.Authorization" />
<Reference Include="Microsoft.AspNetCore.Authorization.Policy" />
<Reference Include="Microsoft.AspNetCore.Http" />
diff --git a/src/Security/Authorization/test/PassThroughAuthorizationHandlerTests.cs b/src/Security/Authorization/test/PassThroughAuthorizationHandlerTests.cs
new file mode 100644
index 0000000000..55940a2a48
--- /dev/null
+++ b/src/Security/Authorization/test/PassThroughAuthorizationHandlerTests.cs
@@ -0,0 +1,72 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Security.Claims;
+using Microsoft.AspNetCore.Authorization.Infrastructure;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Microsoft.AspNetCore.Authorization.Test;
+
+public class PassThroughAuthorizationHandlerTests
+{
+ private IAuthorizationService BuildAuthorizationService(Action<IServiceCollection> setupServices = null)
+ {
+ var services = new ServiceCollection();
+ services.AddAuthorizationCore();
+ services.AddLogging();
+ services.AddOptions();
+ setupServices?.Invoke(services);
+ return services.BuildServiceProvider().GetRequiredService<IAuthorizationService>();
+ }
+
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task PassThroughShouldInvokeAllHandlersBasedOnSetting(bool invokeAllHandlers)
+ {
+ // Arrange
+ var willFail = new SelfRequirement(fail: true);
+ var afterHandler = new SelfRequirement(fail: false);
+ var authorizationService = BuildAuthorizationService(services =>
+ {
+ services.AddAuthorization(options =>
+ {
+ options.InvokeHandlersAfterFailure = invokeAllHandlers;
+ options.AddPolicy("Self", policy => policy.Requirements.Add(willFail));
+ });
+ services.AddSingleton<IAuthorizationHandler>(afterHandler);
+ });
+
+ // Act
+ var allowed = await authorizationService.AuthorizeAsync(new ClaimsPrincipal(), "Self");
+
+ // Assert
+ Assert.False(allowed.Succeeded);
+ Assert.True(willFail.Invoked);
+ Assert.Equal(invokeAllHandlers, afterHandler.Invoked);
+ }
+
+ public class SelfRequirement : AuthorizationHandler<SelfRequirement>, IAuthorizationRequirement
+ {
+ private readonly bool _fail;
+
+ public SelfRequirement(bool fail) => _fail = fail;
+
+ public bool Invoked { get; set; }
+
+ protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, SelfRequirement requirement)
+ {
+ Invoked = true;
+ if (_fail)
+ {
+ context.Fail();
+ }
+ else
+ {
+ context.Succeed(requirement);
+ }
+ return Task.FromResult(0);
+ }
+ }
+
+}
diff --git a/src/Security/CookiePolicy/src/CookiePolicyMiddleware.cs b/src/Security/CookiePolicy/src/CookiePolicyMiddleware.cs
index 807c3ef0cf..f8bc887f7f 100644
--- a/src/Security/CookiePolicy/src/CookiePolicyMiddleware.cs
+++ b/src/Security/CookiePolicy/src/CookiePolicyMiddleware.cs
@@ -62,7 +62,7 @@ public class CookiePolicyMiddleware
return _next(context);
}
- private class CookiesWrapperFeature : IResponseCookiesFeature
+ private sealed class CookiesWrapperFeature : IResponseCookiesFeature
{
public CookiesWrapperFeature(ResponseCookiesWrapper wrapper)
{
diff --git a/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj b/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj
index b0c5252e80..aab3dc37f5 100644
--- a/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj
+++ b/src/Security/CookiePolicy/src/Microsoft.AspNetCore.CookiePolicy.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsPackable>false</IsPackable>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/Security/CookiePolicy/src/PublicAPI.Shipped.txt b/src/Security/CookiePolicy/src/PublicAPI.Shipped.txt
index 4cd46d9bc9..d1b708b9cc 100644
--- a/src/Security/CookiePolicy/src/PublicAPI.Shipped.txt
+++ b/src/Security/CookiePolicy/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options) -> void
-~Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! factory) -> void
+Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options) -> void
+Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! factory) -> void
Microsoft.AspNetCore.Builder.CookiePolicyAppBuilderExtensions
Microsoft.AspNetCore.Builder.CookiePolicyOptions
Microsoft.AspNetCore.Builder.CookiePolicyOptions.CheckConsentNeeded.get -> System.Func<Microsoft.AspNetCore.Http.HttpContext!, bool>?
diff --git a/src/Security/CookiePolicy/src/PublicAPI.Unshipped.txt b/src/Security/CookiePolicy/src/PublicAPI.Unshipped.txt
index 47209d950c..80a5d1716d 100644
--- a/src/Security/CookiePolicy/src/PublicAPI.Unshipped.txt
+++ b/src/Security/CookiePolicy/src/PublicAPI.Unshipped.txt
@@ -1,7 +1,3 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options) -> void
-*REMOVED*~Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! factory) -> void
-Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options) -> void
-Microsoft.AspNetCore.CookiePolicy.CookiePolicyMiddleware.CookiePolicyMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.CookiePolicyOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! factory) -> void
Microsoft.AspNetCore.Builder.CookiePolicyOptions.ConsentCookieValue.get -> string!
Microsoft.AspNetCore.Builder.CookiePolicyOptions.ConsentCookieValue.set -> void
diff --git a/src/Security/CookiePolicy/src/ResponseCookiesWrapper.cs b/src/Security/CookiePolicy/src/ResponseCookiesWrapper.cs
index 2de742c7b2..6fc2f1141d 100644
--- a/src/Security/CookiePolicy/src/ResponseCookiesWrapper.cs
+++ b/src/Security/CookiePolicy/src/ResponseCookiesWrapper.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.CookiePolicy;
-internal class ResponseCookiesWrapper : IResponseCookies, ITrackingConsentFeature
+internal sealed class ResponseCookiesWrapper : IResponseCookies, ITrackingConsentFeature
{
private readonly ILogger _logger;
private bool? _isConsentNeeded;
@@ -98,20 +98,7 @@ internal class ResponseCookiesWrapper : IResponseCookies, ITrackingConsentFeatur
Debug.Assert(key != null);
ApplyAppendPolicy(ref key, ref value, options);
- var setCookieHeaderValue = new Net.Http.Headers.SetCookieHeaderValue(
- Uri.EscapeDataString(key),
- Uri.EscapeDataString(value))
- {
- Domain = options.Domain,
- Path = options.Path,
- Expires = options.Expires,
- MaxAge = options.MaxAge,
- Secure = options.Secure,
- SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite,
- HttpOnly = options.HttpOnly
- };
-
- return setCookieHeaderValue.ToString();
+ return options.CreateCookieHeader(Uri.EscapeDataString(key), Uri.EscapeDataString(value)).ToString();
}
private bool CheckPolicyRequired()
diff --git a/src/Security/CookiePolicy/test/CookieChunkingTests.cs b/src/Security/CookiePolicy/test/CookieChunkingTests.cs
index 59f7f5a8ec..c02fef621f 100644
--- a/src/Security/CookiePolicy/test/CookieChunkingTests.cs
+++ b/src/Security/CookiePolicy/test/CookieChunkingTests.cs
@@ -62,6 +62,25 @@ public class CookieChunkingTests
}
[Fact]
+ public void AppendLargeCookieWithExtensions_Chunked()
+ {
+ HttpContext context = new DefaultHttpContext();
+
+ string testString = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ new ChunkingCookieManager() { ChunkSize = 63 }.AppendResponseCookie(context, "TestCookie", testString,
+ new CookieOptions() { Extensions = { "simple", "key=value" } });
+ var values = context.Response.Headers["Set-Cookie"];
+ Assert.Equal(4, values.Count);
+ Assert.Equal<string[]>(new[]
+ {
+ "TestCookie=chunks-3; path=/; simple; key=value",
+ "TestCookieC1=abcdefghijklmnopqrstuv; path=/; simple; key=value",
+ "TestCookieC2=wxyz0123456789ABCDEFGH; path=/; simple; key=value",
+ "TestCookieC3=IJKLMNOPQRSTUVWXYZ; path=/; simple; key=value",
+ }, values);
+ }
+
+ [Fact]
public void GetLargeChunkedCookie_Reassembled()
{
HttpContext context = new DefaultHttpContext();
@@ -127,22 +146,57 @@ public class CookieChunkingTests
public void DeleteChunkedCookieWithOptions_AllDeleted()
{
HttpContext context = new DefaultHttpContext();
- context.Request.Headers.Append("Cookie", "TestCookie=chunks-7");
+ context.Request.Headers.Append("Cookie", "TestCookie=chunks-7;TestCookieC1=1;TestCookieC2=2;TestCookieC3=3;TestCookieC4=4;TestCookieC5=5;TestCookieC6=6;TestCookieC7=7");
- new ChunkingCookieManager().DeleteCookie(context, "TestCookie", new CookieOptions() { Domain = "foo.com", Secure = true });
+ new ChunkingCookieManager().DeleteCookie(context, "TestCookie", new CookieOptions() { Domain = "foo.com", Secure = true, Extensions = { "extension" } });
var cookies = context.Response.Headers["Set-Cookie"];
Assert.Equal(8, cookies.Count);
Assert.Equal(new[]
{
- "TestCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC3=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC4=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC5=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC6=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC7=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- }, cookies);
+ "TestCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC3=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC4=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC5=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC6=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC7=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ }, cookies);
+ }
+
+ [Fact]
+ public void DeleteChunkedCookieWithMissingRequestCookies_OnlyPresentCookiesDeleted()
+ {
+ HttpContext context = new DefaultHttpContext();
+ context.Request.Headers.Append("Cookie", "TestCookie=chunks-7;TestCookieC1=1;TestCookieC2=2");
+
+ new ChunkingCookieManager().DeleteCookie(context, "TestCookie", new CookieOptions() { Domain = "foo.com", Secure = true });
+ var cookies = context.Response.Headers["Set-Cookie"];
+ Assert.Equal(3, cookies.Count);
+ Assert.Equal(new[]
+ {
+ "TestCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
+ "TestCookieC1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
+ "TestCookieC2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
+ }, cookies);
+ }
+
+ [Fact]
+ public void DeleteChunkedCookieWithMissingRequestCookies_StopsAtMissingChunk()
+ {
+ HttpContext context = new DefaultHttpContext();
+ // C3 is missing so we don't try to delete C4 either.
+ context.Request.Headers.Append("Cookie", "TestCookie=chunks-7;TestCookieC1=1;TestCookieC2=2;TestCookieC4=4");
+
+ new ChunkingCookieManager().DeleteCookie(context, "TestCookie", new CookieOptions() { Domain = "foo.com", Secure = true });
+ var cookies = context.Response.Headers["Set-Cookie"];
+ Assert.Equal(3, cookies.Count);
+ Assert.Equal(new[]
+ {
+ "TestCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
+ "TestCookieC1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
+ "TestCookieC2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
+ }, cookies);
}
[Fact]
@@ -167,12 +221,13 @@ public class CookieChunkingTests
{
Domain = "foo.com",
Path = "/",
- Secure = true
+ Secure = true,
+ Extensions = { "extension" }
};
httpContext.Response.Headers[HeaderNames.SetCookie] = new[]
{
- "TestCookie=chunks-7; domain=foo.com; path=/; secure",
+ "TestCookie=chunks-7; domain=foo.com; path=/; secure; other=extension",
"TestCookieC1=STUVWXYZ; domain=foo.com; path=/; secure",
"TestCookieC2=123456789; domain=foo.com; path=/; secure",
"TestCookieC3=stuvwxyz0; domain=foo.com; path=/; secure",
@@ -186,14 +241,14 @@ public class CookieChunkingTests
Assert.Equal(8, httpContext.Response.Headers[HeaderNames.SetCookie].Count);
Assert.Equal(new[]
{
- "TestCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC3=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC4=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC5=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC6=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure",
- "TestCookieC7=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure"
+ "TestCookie=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC1=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC2=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC3=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC4=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC5=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC6=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension",
+ "TestCookieC7=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=foo.com; path=/; secure; extension"
}, httpContext.Response.Headers[HeaderNames.SetCookie]);
}
}
diff --git a/src/Security/CookiePolicy/test/CookieConsentTests.cs b/src/Security/CookiePolicy/test/CookieConsentTests.cs
index e217f18da9..73bfd00486 100644
--- a/src/Security/CookiePolicy/test/CookieConsentTests.cs
+++ b/src/Security/CookiePolicy/test/CookieConsentTests.cs
@@ -244,6 +244,7 @@ public class CookieConsentTests
Assert.Equal(Http.SameSiteMode.Strict, context.CookieOptions.SameSite);
context.CookieName += "1";
context.CookieValue += "1";
+ context.CookieOptions.Extensions.Add("extension");
};
},
requestContext => { },
@@ -270,6 +271,7 @@ public class CookieConsentTests
Assert.Equal("yes1", consentCookie.Value);
Assert.Equal(Net.Http.Headers.SameSiteMode.Strict, consentCookie.SameSite);
Assert.NotNull(consentCookie.Expires);
+ Assert.Contains("extension", consentCookie.Extensions);
}
[Fact]
diff --git a/src/Security/CookiePolicy/test/CookiePolicyTests.cs b/src/Security/CookiePolicy/test/CookiePolicyTests.cs
index a78b7b2818..bdee31a542 100644
--- a/src/Security/CookiePolicy/test/CookiePolicyTests.cs
+++ b/src/Security/CookiePolicy/test/CookiePolicyTests.cs
@@ -367,6 +367,7 @@ public class CookiePolicyTests
{
HttpOnly = HttpOnlyPolicy.Always,
Secure = CookieSecurePolicy.Always,
+ OnAppendCookie = c => c.CookieOptions.Extensions.Add("extension")
});
app.UseAuthentication();
app.Run(context =>
@@ -401,6 +402,7 @@ public class CookiePolicyTests
Assert.True(cookie.HttpOnly);
Assert.True(cookie.Secure);
Assert.Equal("/", cookie.Path);
+ Assert.Contains("extension", cookie.Extensions);
}
[Fact]
@@ -416,6 +418,7 @@ public class CookiePolicyTests
{
HttpOnly = HttpOnlyPolicy.Always,
Secure = CookieSecurePolicy.Always,
+ OnAppendCookie = c => c.CookieOptions.Extensions.Add("ext")
});
app.UseAuthentication();
app.Run(context =>
@@ -452,18 +455,21 @@ public class CookiePolicyTests
Assert.True(cookie.HttpOnly);
Assert.True(cookie.Secure);
Assert.Equal("/", cookie.Path);
+ Assert.Contains("ext", cookie.Extensions);
cookie = SetCookieHeaderValue.Parse(transaction.SetCookie[1]);
Assert.Equal("TestCookieC1", cookie.Name);
Assert.True(cookie.HttpOnly);
Assert.True(cookie.Secure);
Assert.Equal("/", cookie.Path);
+ Assert.Contains("ext", cookie.Extensions);
cookie = SetCookieHeaderValue.Parse(transaction.SetCookie[2]);
Assert.Equal("TestCookieC2", cookie.Name);
Assert.True(cookie.HttpOnly);
Assert.True(cookie.Secure);
Assert.Equal("/", cookie.Path);
+ Assert.Contains("ext", cookie.Extensions);
}
private class TestCookieFeature : IResponseCookiesFeature
diff --git a/src/Security/Security.slnf b/src/Security/Security.slnf
index 0dd86cd84f..bc74b70868 100644
--- a/src/Security/Security.slnf
+++ b/src/Security/Security.slnf
@@ -6,6 +6,7 @@
"src\\DataProtection\\Cryptography.Internal\\src\\Microsoft.AspNetCore.Cryptography.Internal.csproj",
"src\\DataProtection\\DataProtection\\src\\Microsoft.AspNetCore.DataProtection.csproj",
"src\\DefaultBuilder\\src\\Microsoft.AspNetCore.csproj",
+ "src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
"src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj",
"src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj",
@@ -15,7 +16,6 @@
"src\\Http\\Headers\\src\\Microsoft.Net.Http.Headers.csproj",
"src\\Http\\Http.Abstractions\\src\\Microsoft.AspNetCore.Http.Abstractions.csproj",
"src\\Http\\Http.Extensions\\src\\Microsoft.AspNetCore.Http.Extensions.csproj",
- "src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
"src\\Http\\Http.Features\\src\\Microsoft.AspNetCore.Http.Features.csproj",
"src\\Http\\Http\\src\\Microsoft.AspNetCore.Http.csproj",
"src\\Http\\Metadata\\src\\Microsoft.AspNetCore.Metadata.csproj",
@@ -38,6 +38,7 @@
"src\\Security\\Authentication\\Facebook\\src\\Microsoft.AspNetCore.Authentication.Facebook.csproj",
"src\\Security\\Authentication\\Google\\src\\Microsoft.AspNetCore.Authentication.Google.csproj",
"src\\Security\\Authentication\\JwtBearer\\samples\\JwtBearerSample\\JwtBearerSample.csproj",
+ "src\\Security\\Authentication\\JwtBearer\\samples\\MinimalJwtBearerSample\\MinimalJwtBearerSample.csproj",
"src\\Security\\Authentication\\JwtBearer\\src\\Microsoft.AspNetCore.Authentication.JwtBearer.csproj",
"src\\Security\\Authentication\\MicrosoftAccount\\src\\Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj",
"src\\Security\\Authentication\\Negotiate\\samples\\NegotiateAuthSample\\NegotiateAuthSample.csproj",
@@ -45,6 +46,7 @@
"src\\Security\\Authentication\\Negotiate\\test\\Negotiate.FunctionalTest\\Microsoft.AspNetCore.Authentication.Negotiate.FunctionalTest.csproj",
"src\\Security\\Authentication\\Negotiate\\test\\Negotiate.Test\\Microsoft.AspNetCore.Authentication.Negotiate.Test.csproj",
"src\\Security\\Authentication\\OAuth\\src\\Microsoft.AspNetCore.Authentication.OAuth.csproj",
+ "src\\Security\\Authentication\\OpenIdConnect\\samples\\MinimalOpenIdConnectSample\\MinimalOpenIdConnectSample.csproj",
"src\\Security\\Authentication\\OpenIdConnect\\samples\\OpenIdConnectSample\\OpenIdConnectSample.csproj",
"src\\Security\\Authentication\\OpenIdConnect\\src\\Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj",
"src\\Security\\Authentication\\Twitter\\src\\Microsoft.AspNetCore.Authentication.Twitter.csproj",
diff --git a/src/Security/perf/Microbenchmarks/AuthorizationMiddlewareBenchmark.cs b/src/Security/perf/Microbenchmarks/AuthorizationMiddlewareBenchmark.cs
index 02b01bf472..6cc5177e04 100644
--- a/src/Security/perf/Microbenchmarks/AuthorizationMiddlewareBenchmark.cs
+++ b/src/Security/perf/Microbenchmarks/AuthorizationMiddlewareBenchmark.cs
@@ -43,7 +43,7 @@ public class AuthorizationMiddlewareBenchmark
return _authorizationMiddleware.Invoke(_httpContextHasEndpoint);
}
- private class EndpointFeature : IEndpointFeature
+ private sealed class EndpointFeature : IEndpointFeature
{
public Endpoint Endpoint { get; set; }
}
diff --git a/src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml b/src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml
index 75eed13b43..a09ba761ee 100644
--- a/src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml
+++ b/src/Security/samples/ClaimsTransformation/Views/Shared/_Layout.cshtml
@@ -54,11 +54,11 @@
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.6.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
diff --git a/src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml
index a2b13b317f..a95baa7d6e 100644
--- a/src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml
+++ b/src/Security/samples/ClaimsTransformation/Views/Shared/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Security/samples/ClaimsTransformation/bower.json b/src/Security/samples/ClaimsTransformation/bower.json
index bf55590ec5..81dc40ca32 100644
--- a/src/Security/samples/ClaimsTransformation/bower.json
+++ b/src/Security/samples/ClaimsTransformation/bower.json
@@ -3,8 +3,8 @@
"private": true,
"dependencies": {
"bootstrap": "3.4.0",
- "jquery": "3.5.1",
+ "jquery": "3.6.0",
"jquery-validation": "1.14.0",
- "jquery-validation-unobtrusive": "3.2.6"
+ "jquery-validation-unobtrusive": "4.0.0"
}
}
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
index ccf48121dc..343e1b970a 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
@@ -1,6 +1,6 @@
{
"name": "jquery-validation-unobtrusive",
- "version": "3.2.6",
+ "version": "4.0.0",
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive",
"description": "Add-on to jQuery Validation to enable unobtrusive validation options in data-* attributes.",
"main": [
@@ -23,7 +23,7 @@
"authors": [
"Microsoft"
],
- "license": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/aspnet/jquery-validation-unobtrusive.git"
@@ -32,13 +32,13 @@
"jquery-validation": ">=1.8",
"jquery": ">=1.8"
},
- "_release": "3.2.6",
+ "_release": "4.0.0",
"_resolution": {
"type": "version",
- "tag": "v3.2.6",
- "commit": "13386cd1b5947d8a5d23a12b531ce3960be1eba7"
+ "tag": "v4.0.0",
+ "commit": "a5b50566f8b839177bc7733d67be3a37bca400ff"
},
"_source": "git://github.com/aspnet/jquery-validation-unobtrusive.git",
- "_target": "3.2.6",
+ "_target": "4.0.0",
"_originalSource": "jquery-validation-unobtrusive"
} \ No newline at end of file
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 1b0de12496..009306070a 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,12 +1,26 @@
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
-(function ($) {
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // CommonJS-like environments that support module.exports
+ module.exports = factory(require('jquery-validation'));
+ } else {
+ // Browser global
+ jQuery.validator.unobtrusive = factory(jQuery);
+ }
+}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@@ -107,7 +121,7 @@
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
+ .removeData("unobtrusiveContainer");
}
function validationInfo(form) {
@@ -118,7 +132,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
- }
+ };
if (!result) {
result = {
@@ -223,10 +237,10 @@
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
+ .addBack()
+ .filter("form")
+ .add($selector.find("form"))
+ .has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
@@ -409,8 +423,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
+ adapters.add("fileextensions", ["extensions"], function (options) {
+ setValidationValues(options, "extension", options.params.extensions);
+ });
$(function () {
$jQval.unobtrusive.parse(document);
});
-}(jQuery)); \ No newline at end of file
+
+ return $jQval.unobtrusive;
+}));
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json
index e3218a820e..cc09fc942f 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/.bower.json
@@ -12,14 +12,15 @@
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
- "version": "3.5.1",
- "_release": "3.5.1",
+ "version": "3.6.0",
+ "_release": "3.6.0",
"_resolution": {
"type": "version",
- "tag": "3.5.1",
- "commit": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215"
+ "tag": "3.6.0",
+ "commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
- "_source": "git://github.com/jquery/jquery-dist.git",
- "_target": "3.5.1",
- "_originalSource": "jquery"
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "^3.6.0",
+ "_originalSource": "jquery",
+ "_direct": true
} \ No newline at end of file
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt
index 5312a4c864..599bdf2c72 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Security/samples/ClaimsTransformation/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Security/samples/Cookies/Views/Shared/_Layout.cshtml b/src/Security/samples/Cookies/Views/Shared/_Layout.cshtml
index d3242afe16..2aded5a889 100644
--- a/src/Security/samples/Cookies/Views/Shared/_Layout.cshtml
+++ b/src/Security/samples/Cookies/Views/Shared/_Layout.cshtml
@@ -54,11 +54,11 @@
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.6.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
diff --git a/src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml
index a2b13b317f..a95baa7d6e 100644
--- a/src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml
+++ b/src/Security/samples/Cookies/Views/Shared/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Security/samples/Cookies/bower.json b/src/Security/samples/Cookies/bower.json
index bf55590ec5..81dc40ca32 100644
--- a/src/Security/samples/Cookies/bower.json
+++ b/src/Security/samples/Cookies/bower.json
@@ -3,8 +3,8 @@
"private": true,
"dependencies": {
"bootstrap": "3.4.0",
- "jquery": "3.5.1",
+ "jquery": "3.6.0",
"jquery-validation": "1.14.0",
- "jquery-validation-unobtrusive": "3.2.6"
+ "jquery-validation-unobtrusive": "4.0.0"
}
}
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
index ccf48121dc..343e1b970a 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
@@ -1,6 +1,6 @@
{
"name": "jquery-validation-unobtrusive",
- "version": "3.2.6",
+ "version": "4.0.0",
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive",
"description": "Add-on to jQuery Validation to enable unobtrusive validation options in data-* attributes.",
"main": [
@@ -23,7 +23,7 @@
"authors": [
"Microsoft"
],
- "license": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/aspnet/jquery-validation-unobtrusive.git"
@@ -32,13 +32,13 @@
"jquery-validation": ">=1.8",
"jquery": ">=1.8"
},
- "_release": "3.2.6",
+ "_release": "4.0.0",
"_resolution": {
"type": "version",
- "tag": "v3.2.6",
- "commit": "13386cd1b5947d8a5d23a12b531ce3960be1eba7"
+ "tag": "v4.0.0",
+ "commit": "a5b50566f8b839177bc7733d67be3a37bca400ff"
},
"_source": "git://github.com/aspnet/jquery-validation-unobtrusive.git",
- "_target": "3.2.6",
+ "_target": "4.0.0",
"_originalSource": "jquery-validation-unobtrusive"
} \ No newline at end of file
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 1b0de12496..009306070a 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,12 +1,26 @@
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
-(function ($) {
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // CommonJS-like environments that support module.exports
+ module.exports = factory(require('jquery-validation'));
+ } else {
+ // Browser global
+ jQuery.validator.unobtrusive = factory(jQuery);
+ }
+}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@@ -107,7 +121,7 @@
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
+ .removeData("unobtrusiveContainer");
}
function validationInfo(form) {
@@ -118,7 +132,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
- }
+ };
if (!result) {
result = {
@@ -223,10 +237,10 @@
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
+ .addBack()
+ .filter("form")
+ .add($selector.find("form"))
+ .has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
@@ -409,8 +423,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
+ adapters.add("fileextensions", ["extensions"], function (options) {
+ setValidationValues(options, "extension", options.params.extensions);
+ });
$(function () {
$jQval.unobtrusive.parse(document);
});
-}(jQuery)); \ No newline at end of file
+
+ return $jQval.unobtrusive;
+}));
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json b/src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json
index e3218a820e..cc09fc942f 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery/.bower.json
@@ -12,14 +12,15 @@
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
- "version": "3.5.1",
- "_release": "3.5.1",
+ "version": "3.6.0",
+ "_release": "3.6.0",
"_resolution": {
"type": "version",
- "tag": "3.5.1",
- "commit": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215"
+ "tag": "3.6.0",
+ "commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
- "_source": "git://github.com/jquery/jquery-dist.git",
- "_target": "3.5.1",
- "_originalSource": "jquery"
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "^3.6.0",
+ "_originalSource": "jquery",
+ "_direct": true
} \ No newline at end of file
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt
index 5312a4c864..599bdf2c72 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Security/samples/Cookies/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GASpC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAC1B,mBAAbD,EAAIE,MAIVC,EAAW,SAAmBH,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB8B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOtC,GAGC0C,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQxB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCyB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa/B,GAMrB,IAAIgC,IAAWhC,GAAO,WAAYA,GAAOA,EAAIgC,OAC5C3B,EAAOmB,EAAQxB,GAEhB,OAAKD,EAAYC,KAASG,EAAUH,KAIpB,UAATK,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAOhC,GArWhE0B,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOpD,EAAMG,KAAMT,OAKpB2D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGtD,EAAMG,KAAMT,MAIb4D,EAAM,EAAI5D,KAAM4D,EAAM5D,KAAKsD,QAAWtD,KAAM4D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAOhE,KAAKyD,cAAeK,GAM5C,OAHAC,EAAIE,WAAajE,KAGV+D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMlE,KAAMmE,IAG3BC,IAAK,SAAUD,GACd,OAAOnE,KAAK6D,UAAWb,EAAOoB,IAAKpE,KAAM,SAAUqE,EAAMlC,GACxD,OAAOgC,EAAS1D,KAAM4D,EAAMlC,EAAGkC,OAIjC/D,MAAO,WACN,OAAON,KAAK6D,UAAWvD,EAAMK,MAAOX,KAAMsE,aAG3CC,MAAO,WACN,OAAOvE,KAAKwE,GAAI,IAGjBC,KAAM,WACL,OAAOzE,KAAKwE,IAAK,IAGlBE,KAAM,WACL,OAAO1E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO7E,KAAK6D,UAAWb,EAAO2B,KAAM3E,KAAM,SAAU4E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM9E,KAAKsD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO9E,KAAK6D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE9E,KAAM+E,IAAQ,KAG5DC,IAAK,WACJ,OAAOhF,KAAKiE,YAAcjE,KAAKyD,eAKhC7C,KAAMA,EACNqE,KAAM/E,EAAI+E,KACVC,OAAQhF,EAAIgF,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBpE,EAAYoE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASzF,KACTmC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAIvG,MAAOuG,IAGlBC,KAAM,aAENX,cAAe,SAAUrE,GACxB,IAAIiF,EAAOC,EAIX,SAAMlF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BiF,EAAQpG,EAAUmB,KASK,mBADvBkF,EAAOxF,EAAOP,KAAM8F,EAAO,gBAAmBA,EAAM9C,cACfvC,EAAWT,KAAM+F,KAAWrF,IAGlEsF,cAAe,SAAUnF,GACxB,IAAI+D,EAEJ,IAAMA,KAAQ/D,EACb,OAAO,EAER,OAAO,GAKRoF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU5C,EAAK6C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa/B,IAEjB,IADAgC,EAAShC,EAAIgC,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,WAIF,IAAMA,KAAKb,EACV,IAAgD,IAA3C6C,EAAS1D,KAAMa,EAAKa,GAAKA,EAAGb,EAAKa,IACrC,MAKH,OAAOb,GAIRqF,UAAW,SAAUzG,EAAK0G,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAP1G,IACCmD,EAAajD,OAAQF,IACzB8C,EAAOgB,MAAOD,EACE,iBAAR7D,EACN,CAAEA,GAAQA,GAGZU,EAAKH,KAAMsD,EAAK7D,IAIX6D,GAGR8C,QAAS,SAAUxC,EAAMnE,EAAKiC,GAC7B,OAAc,MAAPjC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKmE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQpG,KAAMkD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAInD,KAAMuG,GAMb,OAAO5G,EAAMwD,IAIdqD,KAAM,EAINhG,QAASA,IAGa,mBAAXiG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAapH,EAAKmH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC1F,SAAUC,EAAInC,GACbvE,EAAY,WAAauE,EAAO,KAAQA,EAAKoC,gBAmB/C,IAAIC,EAWJ,SAAY3H,GACZ,IAAIoC,EACHf,EACAuG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAxI,EACAyI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe5I,EAAOH,SACtBgJ,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRnH,EAAS,GAAOC,eAChBf,EAAM,GACNoJ,EAAMpJ,EAAIoJ,IACVC,EAAarJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU2I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOjL,MAAO,GAAM,MAEtC,OAAOkL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGxL,MAAO,GAAI,GAAM,KAC1BwL,EAAGE,WAAYF,EAAGxI,OAAS,GAAIvC,SAAU,IAAO,IAI3C,KAAO+K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC3L,EAAKD,MACFT,EAAMI,EAAMG,KAAMkI,EAAa6D,YACjC7D,EAAa6D,YAMdtM,EAAKyI,EAAa6D,WAAWlJ,QAAS/B,SACrC,MAAQkL,GACT7L,EAAO,CAAED,MAAOT,EAAIoD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW5I,MAAO8E,EAAQnF,EAAMG,KAAMiM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC3L,EAAW2B,EAAUA,EAAQ3B,SAAW,EAKzC,GAHAqF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAb1B,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOqF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWtD,EAEhB0I,GAAiB,CAIrB,GAAkB,KAAb/G,IAAqBuL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbvL,EAAiB,CACrB,KAAO8C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQhG,KAAMyD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQhG,KAAMyD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAlM,EAAKD,MAAOiG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAAS1L,EAAQmM,wBACzCrK,EAAQqK,uBAGR,OADA3M,EAAKD,MAAOiG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKxF,EAAQoM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAb1B,GAAqD,WAAnC2B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb3B,IACF4I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY9B,EAAQuM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAjN,EAAKD,MAAOiG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKrN,KAAMuN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK5O,EAAS0C,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIzO,EAAMwO,EAAMnH,MAAO,KACtBpF,EAAIjC,EAAIoD,OAET,MAAQnB,IACPwF,EAAKiH,WAAY1O,EAAKiC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE7H,UAAiC,IAAf8H,EAAE9H,UACnC6H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNf,EAAUsG,GAAOtG,QAAU,GAO3ByG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,GAAQA,EAAKqL,aAC5BrH,EAAUhE,IAAUA,EAAK6I,eAAiB7I,GAAOsL,gBAKlD,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOtC,GAA6B,IAAjBsC,EAAIX,UAAmBW,EAAIyN,kBAMnDtH,GADAzI,EAAWsC,GACQyN,gBACnBrH,GAAkBT,EAAOjI,GAQpB+I,GAAgB/I,IAClBiQ,EAAYjQ,EAASkQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC7K,EAAQuM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa/C,EAAS0C,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDlC,EAAQwI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BpB,EAAQkM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa/C,EAASuQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxClC,EAAQmM,uBAAyBrC,EAAQuC,KAAM7N,EAAS2N,wBAMxDnM,EAAQgP,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBnG,EAASyQ,oBAAsBzQ,EAASyQ,kBAAmBtK,GAAUzC,SAIzElC,EAAQgP,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAIpP,EAAQkM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BtP,EAAQoM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK9C,UACToP,EAAI/P,KAAMyD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAIpP,EAAQmM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELnH,EAAQoM,IAAMtC,EAAQuC,KAAM7N,EAASkO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU3H,KAAM,SAAW8I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU3H,KAAM,MAAQ8I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU3H,KAAM,OAQjBgQ,EAAQhR,EAAS0C,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU3H,KAAM,MAAQ8I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU3H,KAAM,YAMX4N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU3H,KAAM,YAKjB4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,iBAGjB2N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQhR,EAAS0C,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,OAAS8I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU3H,KAAM,WAAY,aAK7ByH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU3H,KAAM,WAAY,aAK7B4N,EAAGV,iBAAkB,QACrBvF,EAAU3H,KAAM,YAIXQ,EAAQ0P,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBpN,EAAQ+P,kBAAoBnK,EAAQvG,KAAM+N,EAAI,KAI9CxH,EAAQvG,KAAM+N,EAAI,aAClBhG,EAAc5H,KAAM,KAAMiJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE7H,SAAiB6H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI/P,YAClC8P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGjI,EAAQoQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKxJ,GAAYwJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKzJ,GAAYyJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJrH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKxJ,GAAY,EACvByJ,GAAKzJ,EAAW,EAEhB6R,GAAO,EACPH,EAAM,EACNpJ,EACErH,EAASqH,EAAWkB,GAAMvI,EAASqH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK/I,GAGR8H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERjD,EAAQ0P,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQvG,KAAM4D,EAAMwN,GAG9B,GAAK9N,GAAO3C,EAAQ+P,mBAInB9M,EAAKzE,UAAuC,KAA3ByE,EAAKzE,SAAS2B,SAC/B,OAAOwC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMjS,EAAU,KAAM,CAAEyE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAatD,GAC5CwI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUzE,GACtCwI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMnC,EAAOP,KAAMkH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAhB,EAAQwI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAIvG,MAAO,0CAA4CuG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB/G,EAAQgR,iBACxBlK,GAAa9G,EAAQiR,YAAczL,EAAQtG,MAAO,GAClDsG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWvR,KAAMuB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJZ,EAAW8C,EAAK9C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB8C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb9C,GAA+B,IAAbA,EAC7B,OAAO8C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMxM,MAAO,EAAG,IAGxBsK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIxM,MAAO,EAAG,IAGnBwM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASrS,QAAS,IAAKqS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIxM,MAAO,EAAG2S,GAClCnG,EAAO,GAAMoG,EAAS5S,MAAO,EAAG2S,IAI1BnG,EAAMxM,MAAO,EAAG,MAIzBgQ,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAO1S,QAASyS,GAChC,OAAbD,EAAoBC,GAASC,EAAOjT,OAAQgT,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMjJ,QAASyS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOjT,MAAO,EAAGgT,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKrB,MAAO,EAAG,GAC3BqT,EAA+B,SAArBhS,EAAKrB,OAAQ,GACvBsT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,SAEL,OAAO,EAKT2S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKV,YAAoBwN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKV,aACHwN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWxT,eAAgBsT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM7T,EAAS8L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASxD,QAAS0B,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASpU,QAASmU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK9C,UAC7C,OAAO,KAKTkE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOnV,EAAOoV,UAAYpV,EAAOoV,SAASD,KAC9C,OAAOA,GAAQA,EAAK5U,MAAO,KAAQ+D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASzE,EAAS0V,iBACrB1V,EAAS2V,UAAY3V,EAAS2V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK9C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR4S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa5O,KAAMuB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa5O,KAAMuB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK9C,UAAkBwV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK9C,UAAkBwV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAa1W,KAAMyD,GACdkT,GACJnT,EAAIxD,KAAMuB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ3B,SAAW,CAAE2B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAKhX,KAAQsX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa7W,EAAS8L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvClT,EAAKD,MAAOiG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCxD,EAASwX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU3B,SAC1BiX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOhB,MAAO,KAAMgW,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACErW,MAAO,EAAG6B,EAAI,GACdzB,OAAQ,CAAEyG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOrW,MAAO6B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOrW,MAAOyE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASxW,KAAMiU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOxY,MAAO,GAGtCsY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMtY,MAAOwM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOnM,KAAQ+V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO/V,KAAM,CACZuG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMtY,MAAOqU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASzM,MAAO,IA4ZzCyH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYpY,KAAMkY,GAElBC,EAAgBnY,KAAMkY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWtD,GAAYsD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBtN,IACtCwI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWtD,EAAUkU,GAAQ,CAChDlN,EAAQhG,KAAMyD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUlU,KAAMyD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI7I,KAAMmG,IAM/B0S,EAAajC,GAAUiC,GAIxB1Y,EAAKD,MAAOiG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIxM,MAAO,IAC5BgD,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ3B,UAAkB+G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS3C,MAAOqW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA/V,EAAKD,MAAOiG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRxF,EAAQiR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E3E,EAAQgR,mBAAqBjK,EAG7BC,IAIAhH,EAAQoQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBxR,EAAS0C,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjErG,EAAQwI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK3H,GAILiD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK9C,SACtC,GAAuB,IAAlB8C,EAAK9C,SAAiB,CAC1B,GAAK0Y,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ/T,KAAMyD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE7Y,UAAkB6Y,IAAM/V,GAC9BsQ,EAAQ/T,KAAMwZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAExB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG9D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKvT,EAAYmZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU/Z,KAAM4D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUjZ,SACPyB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCxD,EAAQJ,KAAM+Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK9C,SACxByB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK9C,aAIdyB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM9E,KAAKsD,OACXmX,EAAOza,KAER,GAAyB,iBAAbiD,EACX,OAAOjD,KAAK6D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKnC,MAChC,OAAO,KAQX,IAFA+D,EAAM/D,KAAK6D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOjD,KAAK6D,UAAW0W,EAAQva,KAAMiD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRva,KAIoB,iBAAbiD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOjD,KAQR,GAHAoV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BjD,KAAKyD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAOhE,KAAMgD,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ3B,SAAW2B,EAAQgK,eAAiBhK,EAAUtD,GACjE,IAII0a,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT7B,EAAYrB,KAAM8M,IACtB9M,KAAM8M,GAAS5J,EAAS4J,IAIxB9M,KAAK+R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO9M,KAYP,OARAqE,EAAOzE,EAASwN,eAAgBN,EAAO,OAKtC9M,KAAM,GAAMqE,EACZrE,KAAKsD,OAAS,GAERtD,KAcH,OAAKiD,EAAS1B,UACpBvB,KAAM,GAAMiD,EACZjD,KAAKsD,OAAS,EACPtD,MAIIqB,EAAY4B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUjD,QAIhCuD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQpD,GAGrB,IAAIib,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAIvN,UACpC,OAAOuN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQzF,MAC7Bob,EAAID,EAAQ7X,OAEb,OAAOtD,KAAKsQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUzI,KAAMmb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAIpb,KAAKsD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM9O,KAAMmC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAIvN,SAAW,KAAQ4Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAIvN,UACHyB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ/T,KAAMkO,GACd,MAMJ,OAAO9O,KAAK6D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJxD,EAAQJ,KAAMuC,EAAQqB,GAAQrE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBqE,EAAKb,OAASa,EAAM,GAAMA,GAZjBrE,KAAM,IAAOA,KAAM,GAAI4C,WAAe5C,KAAKuE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOlD,KAAK6D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAOhE,KAAK2D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOjD,KAAKwb,IAAiB,MAAZvY,EAChBjD,KAAKiE,WAAajE,KAAKiE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO5S,SAAkB4S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT5b,EAAUkE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKpE,KAAMmD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK/E,OAAQ,KACjB2C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd3U,KAAKsD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHjc,KAAK6D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS9F,EAAcsb,EAASxV,EAAMyV,SAC1CD,EAAOlc,KAAM0G,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS9F,EAAcsb,EAASxV,EAAM2V,MACjDH,EAAOlc,KAAM0G,EAAOqV,EAASC,GAQ7BD,EAAQ7b,WAAOmF,EAAW,CAAEqB,GAAQ7G,MAAOoc,IAM3C,MAAQvV,GAITsV,EAAO9b,WAAOmF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc7c,MAAOyc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM3c,KAAMwc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B7F,EAAY6F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK5I,KAAMsG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKzd,MAIR4d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIxd,MAKR+U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDxJ,MAMR6d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTpd,MAERoM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVpd,MAERsd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQlU,MAAQkU,EAAKlU,QAAUkU,GAC9C+I,EAAM3c,KAAM4T,GACN2I,GACLM,KAGKzd,MAIRyd,KAAM,WAEL,OADAhD,EAAKsD,SAAU/d,KAAMsE,WACdtE,MAIRqd,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BtE,MAERse,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK9B,EAAYmd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGxC,MAAOX,KAAMsE,WAChCqa,GAAYtd,EAAYsd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtB1e,KACAmD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOpf,KACVwU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQhO,MAAOye,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLzb,EAAYyb,GAGXqC,EACJrC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKrc,KACJke,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC9f,EAAO+f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY2d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAYyd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACApd,EAAY0d,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUtb,GAClB,OAAc,MAAPA,EAAc0B,EAAOmC,OAAQ7D,EAAKsb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAU1e,OAASqe,OAAWvY,EAAY9F,KAAMsE,WAChEtE,MAMRqe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKxd,KAAM4d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB9f,EAAMG,KAAM6D,WAG5B+b,EAAUrd,EAAOgb,WAGjBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMnC,KACvBogB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAahD,EAAMG,KAAM6D,WAAc6C,IAC5D+Y,GACTG,EAAQb,YAAaW,EAAiBC,KAM1C,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAQxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAQ5D,QACxEyD,GAGuB,YAApBG,EAAQlC,SACZ9c,EAAY+e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAQvD,OAKjB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAQ5D,QAG1D,OAAO4D,EAAQzD,aAOjB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CzgB,EAAO0gB,SAAW1gB,EAAO0gB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9EtF,EAAO0gB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCrG,EAAO+f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRlhB,EAASmhB,oBAAqB,mBAAoBD,GAClD/gB,EAAOghB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBpG,MAGRgD,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa5f,EAAU,CAAEoD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBld,EAASshB,YACa,YAAxBthB,EAASshB,aAA6BthB,EAAS+P,gBAAgBwR,SAGjEphB,EAAO+f,WAAY9c,EAAO4X,QAK1Bhb,EAASoQ,iBAAkB,mBAAoB8Q,GAG/C/gB,EAAOiQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAENhgB,EAAY8F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAG1C,KAAMqD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK/gB,KAAMuC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EAChBpa,EACAA,EAAM1G,KAAMqD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAMhD,OAAKkT,EACGvd,EAIH0d,EACGre,EAAG1C,KAAMqD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM5gB,UAAqC,IAAnB4gB,EAAM5gB,YAAsB4gB,EAAM5gB,UAMlE,SAAS6gB,IACRpiB,KAAK+F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOniB,KAAK+F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,SAAYoB,EAMxB/G,OAAOkiB,eAAgBH,EAAOniB,KAAK+F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQlO,KAAKkO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNnO,KAAKkO,MAAOiU,GAGZA,EAAOniB,KAAK+F,UAAaoc,EAAOniB,KAAK+F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElCnH,KAAK2D,IAAKwe,EAAOhU,IASzBnO,KAAKwiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOniB,KAAK+F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM5gB,SACV4gB,EAAOniB,KAAK+F,cAAYD,SAEjBqc,EAAOniB,KAAK+F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOniB,KAAK+F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK9C,SAI/B,GAHA8D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOrE,KAAM,GACb0O,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKnO,KAAKsD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK9C,WAAmBqhB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRxE,QAAS,WAClBwE,EAAO2c,EAAW3c,EAAK/E,MAAO,IAC9B0iB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJnO,KAAKkE,KAAM,WACjB2e,EAASL,IAAKxiB,KAAMmO,KAIfiT,EAAQphB,KAAM,SAAUmH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDziB,KAAKkE,KAAM,WAGV2e,EAASL,IAAKxiB,KAAMmO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOnO,KAAKkE,KAAM,WACjB2e,EAASjF,OAAQ5d,KAAMmO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM3c,KAAM6hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAG1C,KAAM4D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOvd,KAAM,GAAK2B,QAGjBmE,IAAT2c,EACNziB,KACAA,KAAKkE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOvd,KAAM2B,EAAM8gB,GAGtCzf,EAAOygB,YAAazjB,KAAM2B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAAStjB,KAAM2B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO3B,KAAKkE,KAAM,WACjBlB,EAAOsgB,QAAStjB,KAAM2B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO3B,KAAKud,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAML,GACxB,IAAIqP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW9R,KACXmC,EAAInC,KAAKsD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXL,EAAMK,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAAStb,MAGxB,IAAIyiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB/P,EAAS+P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK9C,WAClByB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUtlB,MAAM,IAExB0lB,KAAM,WACL,OAAOJ,GAAUtlB,OAElB2lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQne,KAAKulB,OAASvlB,KAAK0lB,OAG5B1lB,KAAKkE,KAAM,WACZogB,GAAoBtkB,MACxBgD,EAAQhD,MAAOulB,OAEfviB,EAAQhD,MAAO0lB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADchmB,EAASomB,yBACRrjB,YAAa/C,EAAS0C,cAAe,SACpDsO,GAAQhR,EAAS0C,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBxP,EAAQ6kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBzP,EAAQ+kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBzP,EAAQglB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfrlB,EAAQglB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK9C,SAAW,CAAE8C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM/mB,KAAMsC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ3mB,KAAMyD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQzmB,KAAMyD,GAMlB,OAAOqjB,EAIR,IAAII,GAAiB,sBAErB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY5jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOzE,EAAS0V,cACf,MAAQ4S,KATQC,KAAqC,UAATxmB,GAY/C,SAASymB,GAAI/jB,EAAMgkB,EAAOplB,EAAUwf,EAAMtf,EAAImlB,GAC7C,IAAIC,EAAQ5mB,EAGZ,GAAsB,iBAAV0mB,EAAqB,CAShC,IAAM1mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEuiB,EACbD,GAAI/jB,EAAM1C,EAAMsB,EAAUwf,EAAM4F,EAAO1mB,GAAQ2mB,GAEhD,OAAOjkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK6kB,QACC,IAAM7kB,EACZ,OAAOkB,EAeR,OAZa,IAARikB,IACJC,EAASplB,GACTA,EAAK,SAAUqlB,GAId,OADAxlB,IAASylB,IAAKD,GACPD,EAAO5nB,MAAOX,KAAMsE,aAIzB8C,KAAOmhB,EAAOnhB,OAAUmhB,EAAOnhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAOwlB,MAAMhN,IAAKxb,KAAMqoB,EAAOllB,EAAIsf,EAAMxf,KA+a3C,SAASylB,GAAgBla,EAAI7M,EAAMsmB,GAG5BA,GAQNrF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU6Z,GAClB,IAAIG,EAAUpV,EACbqV,EAAQhG,EAASjf,IAAK3D,KAAM2B,GAE7B,GAAyB,EAAlB6mB,EAAMK,WAAmB7oB,KAAM2B,IAKrC,GAAMinB,EAAMtlB,QAuCEN,EAAOwlB,MAAMrJ,QAASxd,IAAU,IAAKmnB,cAClDN,EAAMO,uBArBN,GAdAH,EAAQtoB,EAAMG,KAAM6D,WACpBse,EAASJ,IAAKxiB,KAAM2B,EAAMinB,GAK1BD,EAAWV,EAAYjoB,KAAM2B,GAC7B3B,KAAM2B,KAEDinB,KADLrV,EAASqP,EAASjf,IAAK3D,KAAM2B,KACJgnB,EACxB/F,EAASJ,IAAKxiB,KAAM2B,GAAM,GAE1B4R,EAAS,GAELqV,IAAUrV,EAWd,OARAiV,EAAMQ,2BACNR,EAAMS,iBAOC1V,GAAUA,EAAOpM,WAefyhB,EAAMtlB,SAGjBsf,EAASJ,IAAKxiB,KAAM2B,EAAM,CACzBwF,MAAOnE,EAAOwlB,MAAMU,QAInBlmB,EAAOmC,OAAQyjB,EAAO,GAAK5lB,EAAOmmB,MAAM5lB,WACxCqlB,EAAMtoB,MAAO,GACbN,QAKFwoB,EAAMQ,qCA/E0BljB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAOwlB,MAAMhN,IAAKhN,EAAI7M,EAAMomB,IA5a/B/kB,EAAOwlB,MAAQ,CAEdhpB,OAAQ,GAERgc,IAAK,SAAUnX,EAAMgkB,EAAO1Z,EAAS8T,EAAMxf,GAE1C,IAAImmB,EAAaC,EAAa1Y,EAC7B2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADAya,EAAcza,GACQA,QACtB1L,EAAWmmB,EAAYnmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfkiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASlpB,OAAOypB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUrd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAOwlB,MAAMuB,YAActd,EAAE9K,KACpEqB,EAAOwlB,MAAMwB,SAASrpB,MAAO0D,EAAMC,gBAAcwB,IAMpDyjB,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAEP5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,EAGjEwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAG1C6nB,EAAYxmB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNgoB,SAAUA,EACVlH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWia,EAAW7b,KAAM,MAC1Bub,IAGKK,EAAWH,EAAQ3nB,OAC1B8nB,EAAWH,EAAQ3nB,GAAS,IACnBuoB,cAAgB,EAGnB/K,EAAQgL,QACiD,IAA9DhL,EAAQgL,MAAM1pB,KAAM4D,EAAMoe,EAAMiH,EAAYL,IAEvChlB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM0nB,IAK3BlK,EAAQ3D,MACZ2D,EAAQ3D,IAAI/a,KAAM4D,EAAMmlB,GAElBA,EAAU7a,QAAQvH,OACvBoiB,EAAU7a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJwmB,EAASvkB,OAAQukB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS7oB,KAAM4oB,GAIhBxmB,EAAOwlB,MAAMhpB,OAAQmC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMgkB,EAAO1Z,EAAS1L,EAAUmnB,GAEjD,IAAIrlB,EAAGslB,EAAW1Z,EACjB2Y,EAAQC,EAAGC,EACXrK,EAASsK,EAAU9nB,EAAM+nB,EAAYC,EACrCC,EAAWhH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMulB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKvb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQimB,IAMP,GAJA5nB,EAAOgoB,GADPhZ,EAAMmX,GAAe3a,KAAMkb,EAAOkB,KAAS,IACpB,GACvBG,GAAe/Y,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GAE1C8nB,EAAWH,EADX3nB,GAASsB,EAAWkc,EAAQ2J,aAAe3J,EAAQ8K,WAActoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAG9Dwc,EAAYtlB,EAAI0kB,EAASnmB,OACzB,MAAQyB,IACPykB,EAAYC,EAAU1kB,IAEfqlB,GAAeT,IAAaH,EAAUG,UACzChb,GAAWA,EAAQvH,OAASoiB,EAAUpiB,MACtCuJ,IAAOA,EAAIlD,KAAM+b,EAAU/Z,YAC3BxM,GAAYA,IAAaumB,EAAUvmB,WACxB,OAAbA,IAAqBumB,EAAUvmB,YAChCwmB,EAASvkB,OAAQH,EAAG,GAEfykB,EAAUvmB,UACdwmB,EAASS,gBAEL/K,EAAQvB,QACZuB,EAAQvB,OAAOnd,KAAM4D,EAAMmlB,IAOzBa,IAAcZ,EAASnmB,SACrB6b,EAAQmL,WACkD,IAA/DnL,EAAQmL,SAAS7pB,KAAM4D,EAAMqlB,EAAYE,EAASE,SAElD9mB,EAAOunB,YAAalmB,EAAM1C,EAAMioB,EAASE,eAGnCR,EAAQ3nB,SA1Cf,IAAMA,KAAQ2nB,EACbtmB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,EAAO0mB,EAAOkB,GAAK5a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe6iB,IAC1B1G,EAAShF,OAAQvZ,EAAM,mBAIzB2lB,SAAU,SAAUQ,GAEnB,IAAIroB,EAAG4C,EAAGhB,EAAK4Q,EAAS6U,EAAWiB,EAClCjW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BklB,EAAQxlB,EAAOwlB,MAAMkC,IAAKF,GAE1Bf,GACC7G,EAASjf,IAAK3D,KAAM,WAAcI,OAAOypB,OAAQ,OAC/CrB,EAAM7mB,OAAU,GACnBwd,EAAUnc,EAAOwlB,MAAMrJ,QAASqJ,EAAM7mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMgU,EAENrmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAqmB,EAAMmC,eAAiB3qB,MAGlBmf,EAAQyL,cAA2D,IAA5CzL,EAAQyL,YAAYnqB,KAAMT,KAAMwoB,GAA5D,CAKAiC,EAAeznB,EAAOwlB,MAAMiB,SAAShpB,KAAMT,KAAMwoB,EAAOiB,GAGxDtnB,EAAI,EACJ,OAAUwS,EAAU8V,EAActoB,QAAYqmB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBnW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAUykB,EAAY7U,EAAQ8U,SAAU1kB,QACtCyjB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAU/Z,YACnC+Y,EAAMwC,WAAWvd,KAAM+b,EAAU/Z,aAEjC+Y,EAAMgB,UAAYA,EAClBhB,EAAM/F,KAAO+G,EAAU/G,UAKV3c,KAHb/B,IAAUf,EAAOwlB,MAAMrJ,QAASqK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU7a,SAAUhO,MAAOgU,EAAQtQ,KAAMmQ,MAGT,KAAzBgU,EAAMjV,OAASxP,KACrBykB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK5J,EAAQ8L,cACZ9L,EAAQ8L,aAAaxqB,KAAMT,KAAMwoB,GAG3BA,EAAMjV,SAGdkW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAItnB,EAAGqnB,EAAWvX,EAAKiZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBpb,EAAM0Z,EAAM/iB,OAGb,GAAKykB,GAIJpb,EAAIvN,YAOc,UAAfinB,EAAM7mB,MAAoC,GAAhB6mB,EAAMxS,QAEnC,KAAQlH,IAAQ9O,KAAM8O,EAAMA,EAAIlM,YAAc5C,KAI7C,GAAsB,IAAjB8O,EAAIvN,WAAoC,UAAfinB,EAAM7mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFA8e,EAAkB,GAClBC,EAAmB,GACbhpB,EAAI,EAAGA,EAAI+nB,EAAe/nB,SAME2D,IAA5BqlB,EAFLlZ,GAHAuX,EAAYC,EAAUtnB,IAGNc,SAAW,OAG1BkoB,EAAkBlZ,GAAQuX,EAAU1e,cACC,EAApC9H,EAAQiP,EAAKjS,MAAOsb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKjS,KAAM,KAAM,CAAE8O,IAAQxL,QAErC6nB,EAAkBlZ,IACtBiZ,EAAgBtqB,KAAM4oB,GAGnB0B,EAAgB5nB,QACpBmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUyB,IAY9C,OALApc,EAAM9O,KACDkqB,EAAgBT,EAASnmB,QAC7BmnB,EAAa7pB,KAAM,CAAEyD,KAAMyK,EAAK2a,SAAUA,EAASnpB,MAAO4pB,KAGpDO,GAGRW,QAAS,SAAU/lB,EAAMgmB,GACxBjrB,OAAOkiB,eAAgBtf,EAAOmmB,MAAM5lB,UAAW8B,EAAM,CACpDimB,YAAY,EACZ/I,cAAc,EAEd5e,IAAKtC,EAAYgqB,GAChB,WACC,GAAKrrB,KAAKurB,cACT,OAAOF,EAAMrrB,KAAKurB,gBAGpB,WACC,GAAKvrB,KAAKurB,cACT,OAAOvrB,KAAKurB,cAAelmB,IAI9Bmd,IAAK,SAAUrb,GACd/G,OAAOkiB,eAAgBtiB,KAAMqF,EAAM,CAClCimB,YAAY,EACZ/I,cAAc,EACdiJ,UAAU,EACVrkB,MAAOA,QAMXujB,IAAK,SAAUa,GACd,OAAOA,EAAevoB,EAAO+C,SAC5BwlB,EACA,IAAIvoB,EAAOmmB,MAAOoC,IAGpBpM,QAAS,CACRsM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU1H,GAIhB,IAAIjU,EAAKxO,MAAQyiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAG1Bka,GAAgBla,EAAI,QAASuZ,KAIvB,GAERmB,QAAS,SAAUzG,GAIlB,IAAIjU,EAAKxO,MAAQyiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGmd,OAAStf,EAAUmC,EAAI,UAE1Bka,GAAgBla,EAAI,UAId,GAKRkY,SAAU,SAAU8B,GACnB,IAAI/iB,EAAS+iB,EAAM/iB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOkmB,OAAStf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBmmB,aAAc,CACbX,aAAc,SAAUzC,QAID1iB,IAAjB0iB,EAAMjV,QAAwBiV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMjV,YAoG7CvQ,EAAOunB,YAAc,SAAUlmB,EAAM1C,EAAMmoB,GAGrCzlB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMmoB,IAIlC9mB,EAAOmmB,MAAQ,SAAUvnB,EAAKkqB,GAG7B,KAAQ9rB,gBAAgBgD,EAAOmmB,OAC9B,OAAO,IAAInmB,EAAOmmB,MAAOvnB,EAAKkqB,GAI1BlqB,GAAOA,EAAID,MACf3B,KAAKurB,cAAgB3pB,EACrB5B,KAAK2B,KAAOC,EAAID,KAIhB3B,KAAK+rB,mBAAqBnqB,EAAIoqB,uBACHlmB,IAAzBlE,EAAIoqB,mBAGgB,IAApBpqB,EAAIiqB,YACL9D,GACAC,GAKDhoB,KAAKyF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOlE,SACxCK,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELzF,KAAK8qB,cAAgBlpB,EAAIkpB,cACzB9qB,KAAKisB,cAAgBrqB,EAAIqqB,eAIzBjsB,KAAK2B,KAAOC,EAIRkqB,GACJ9oB,EAAOmC,OAAQnF,KAAM8rB,GAItB9rB,KAAKksB,UAAYtqB,GAAOA,EAAIsqB,WAAaxjB,KAAKyjB,MAG9CnsB,KAAMgD,EAAO+C,UAAY,GAK1B/C,EAAOmmB,MAAM5lB,UAAY,CACxBE,YAAaT,EAAOmmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAIxc,EAAIzM,KAAKurB,cAEbvrB,KAAK+rB,mBAAqBhE,GAErBtb,IAAMzM,KAAKosB,aACf3f,EAAEwc,kBAGJF,gBAAiB,WAChB,IAAItc,EAAIzM,KAAKurB,cAEbvrB,KAAK6qB,qBAAuB9C,GAEvBtb,IAAMzM,KAAKosB,aACf3f,EAAEsc,mBAGJC,yBAA0B,WACzB,IAAIvc,EAAIzM,KAAKurB,cAEbvrB,KAAK+qB,8BAAgChD,GAEhCtb,IAAMzM,KAAKosB,aACf3f,EAAEuc,2BAGHhpB,KAAK+oB,oBAKP/lB,EAAOkB,KAAM,CACZmoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRjrB,MAAM,EACNkrB,UAAU,EACV/e,KAAK,EACLgf,SAAS,EACTnX,QAAQ,EACRoX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EACTC,OAAO,GACLhrB,EAAOwlB,MAAM4C,SAEhBpoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUtsB,EAAMmnB,GACpE9lB,EAAOwlB,MAAMrJ,QAASxd,GAAS,CAG9BwoB,MAAO,WAQN,OAHAzB,GAAgB1oB,KAAM2B,EAAMsmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB1oB,KAAM2B,IAGf,GAKR+kB,SAAU,WACT,OAAO,GAGRoC,aAAcA,KAYhB9lB,EAAOkB,KAAM,CACZgqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB1nB,EAAOwlB,MAAMrJ,QAASmP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAIzkB,EAEHwqB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTvuB,MAMgCgD,EAAOyF,SANvCzI,KAMyDuuB,MAClE/F,EAAM7mB,KAAO6nB,EAAUG,SACvB5lB,EAAMylB,EAAU7a,QAAQhO,MAAOX,KAAMsE,WACrCkkB,EAAM7mB,KAAO+oB,GAEP3mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBijB,GAAI,SAAUC,EAAOplB,EAAUwf,EAAMtf,GACpC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,IAEzCmlB,IAAK,SAAUD,EAAOplB,EAAUwf,EAAMtf,GACrC,OAAOilB,GAAIpoB,KAAMqoB,EAAOplB,EAAUwf,EAAMtf,EAAI,IAE7CslB,IAAK,SAAUJ,EAAOplB,EAAUE,GAC/B,IAAIqmB,EAAW7nB,EACf,GAAK0mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClBxmB,EAAQqlB,EAAMsC,gBAAiBlC,IAC9Be,EAAU/Z,UACT+Z,EAAUG,SAAW,IAAMH,EAAU/Z,UACrC+Z,EAAUG,SACXH,EAAUvmB,SACVumB,EAAU7a,SAEJ3O,KAER,GAAsB,iBAAVqoB,EAAqB,CAGhC,IAAM1mB,KAAQ0mB,EACbroB,KAAKyoB,IAAK9mB,EAAMsB,EAAUolB,EAAO1mB,IAElC,OAAO3B,KAWR,OATkB,IAAbiD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK6kB,IAEChoB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAM5K,OAAQ5d,KAAMqoB,EAAOllB,EAAIF,QAMzC,IAKCurB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBtqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQza,SAAkBya,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASuqB,GAAevqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAASwqB,GAAexqB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKrB,MAAO,EAAG,GAClC+D,EAAK1C,KAAO0C,EAAK1C,KAAKrB,MAAO,GAE7B+D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAASyqB,GAAgBltB,EAAKmtB,GAC7B,IAAI5sB,EAAGiZ,EAAGzZ,EAAgBqtB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKxtB,SAAV,CAKA,GAAKqhB,EAASD,QAAS/gB,KAEtB0nB,EADW1G,EAASjf,IAAK/B,GACP0nB,QAKjB,IAAM3nB,KAFNihB,EAAShF,OAAQmR,EAAM,iBAETzF,EACb,IAAMnnB,EAAI,EAAGiZ,EAAIkO,EAAQ3nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAOwlB,MAAMhN,IAAKuT,EAAMptB,EAAM2nB,EAAQ3nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBotB,EAAWnM,EAASzB,OAAQxf,GAC5BqtB,EAAWjsB,EAAOmC,OAAQ,GAAI6pB,GAE9BnM,EAASL,IAAKuM,EAAME,KAkBtB,SAASC,GAAUC,EAAY3a,EAAMrQ,EAAUojB,GAG9C/S,EAAOjU,EAAMiU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAAS+H,EAAYntB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAI+T,EAAW7rB,OACf+rB,EAAWjU,EAAI,EACfjU,EAAQqN,EAAM,GACd8a,EAAkBjuB,EAAY8F,GAG/B,GAAKmoB,GACG,EAAJlU,GAA0B,iBAAVjU,IAChB/F,EAAQ6kB,YAAcwI,GAAShhB,KAAMtG,GACxC,OAAOgoB,EAAWjrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO0U,EAAW3qB,GAAI8W,GACrBgU,IACJ9a,EAAM,GAAMrN,EAAM1G,KAAMT,KAAMsb,EAAOb,EAAK8U,SAE3CL,GAAUzU,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM2a,EAAY,GAAIjiB,eAAe,EAAOiiB,EAAY5H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA6H,GADA/H,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYkH,KAC/BtrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMktB,IACVptB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BmtB,GAIJpsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAAS1D,KAAM0uB,EAAYhtB,GAAKF,EAAME,GAGvC,GAAKitB,EAOJ,IANAltB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAASwH,IAGf1sB,EAAI,EAAGA,EAAIitB,EAAYjtB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAOwsB,WAAavtB,EAAKH,UAC7BkB,EAAOwsB,SAAUvtB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAASwoB,GAAc,IAAMzsB,EAAMC,IAQnE,OAAOitB,EAGR,SAASvR,GAAQvZ,EAAMpB,EAAUwsB,GAKhC,IAJA,IAAIxtB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCstB,GAA8B,IAAlBxtB,EAAKV,UACtByB,EAAO0sB,UAAW/I,GAAQ1kB,IAGtBA,EAAKW,aACJ6sB,GAAYtL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU2H,GACxB,OAAOA,GAGR/pB,MAAO,SAAUnB,EAAMsrB,EAAeC,GACrC,IAAIztB,EAAGiZ,EAAGyU,EAAaC,EApINluB,EAAKmtB,EACnB1iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB6J,EAAS5L,GAAY9f,GAGtB,KAAMjD,EAAQ+kB,gBAAsC,IAAlB9hB,EAAK9C,UAAoC,KAAlB8C,EAAK9C,UAC3DyB,EAAO8W,SAAUzV,IAMnB,IAHAyrB,EAAenJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFbyU,EAAclJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLiuB,EAAa1tB,GAjJH4sB,EAiJQe,EAAc3tB,QAhJzCkK,EAGc,WAHdA,EAAW0iB,EAAK1iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDotB,EAAKpZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC0iB,EAAKnV,aAAehY,EAAIgY,cA6IxB,GAAK+V,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAelJ,GAAQtiB,GACrCyrB,EAAeA,GAAgBnJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAIyU,EAAYvsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C2sB,GAAgBe,EAAa1tB,GAAK2tB,EAAc3tB,SAGjD2sB,GAAgBzqB,EAAMmB,GAWxB,OAL2B,GAD3BsqB,EAAenJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAekJ,GAAeC,GAAUpJ,GAAQtiB,EAAM,WAIhDmB,GAGRkqB,UAAW,SAAU5rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAOwlB,MAAMrJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK6G,OACT,IAAM3nB,KAAQ8gB,EAAK6G,OACbnK,EAASxd,GACbqB,EAAOwlB,MAAM5K,OAAQvZ,EAAM1C,GAI3BqB,EAAOunB,YAAalmB,EAAM1C,EAAM8gB,EAAKqH,QAOxCzlB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB6qB,OAAQ,SAAU/sB,GACjB,OAAO2a,GAAQ5d,KAAMiD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ5d,KAAMiD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMvC,MACbA,KAAK8V,QAAQ5R,KAAM,WACK,IAAlBlE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKsS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B2sB,OAAQ,WACP,OAAOf,GAAUlvB,KAAMsE,UAAW,SAAUD,GACpB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CotB,GAAoB3uB,KAAMqE,GAChC1B,YAAa0B,MAKvB6rB,QAAS,WACR,OAAOhB,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBrE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIkE,EAASkpB,GAAoB3uB,KAAMqE,GACvCoB,EAAO0qB,aAAc9rB,EAAMoB,EAAO8M,gBAKrC6d,OAAQ,WACP,OAAOlB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,SAKvCqwB,MAAO,WACN,OAAOnB,GAAUlvB,KAAMsE,UAAW,SAAUD,GACtCrE,KAAK4C,YACT5C,KAAK4C,WAAWutB,aAAc9rB,EAAMrE,KAAKiP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOrE,KAAMmC,IAAeA,IACd,IAAlBkC,EAAK9C,WAGTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOtS,MAGRwF,MAAO,SAAUmqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD5vB,KAAKoE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOxF,KAAM2vB,EAAeC,MAI5CL,KAAM,SAAUpoB,GACf,OAAOia,EAAQphB,KAAM,SAAUmH,GAC9B,IAAI9C,EAAOrE,KAAM,IAAO,GACvBmC,EAAI,EACJiZ,EAAIpb,KAAKsD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK9C,SAChC,OAAO8C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBqnB,GAAa/gB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOrE,KAAMmC,IAAO,IAGVZ,WACTyB,EAAO0sB,UAAW/I,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJrE,KAAK8V,QAAQma,OAAQ9oB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BgtB,YAAa,WACZ,IAAI/I,EAAU,GAGd,OAAO2H,GAAUlvB,KAAMsE,UAAW,SAAUD,GAC3C,IAAI8P,EAASnU,KAAK4C,WAEbI,EAAO6D,QAAS7G,KAAMunB,GAAY,IACtCvkB,EAAO0sB,UAAW/I,GAAQ3mB,OACrBmU,GACJA,EAAOoc,aAAclsB,EAAMrE,QAK3BunB,MAILvkB,EAAOkB,KAAM,CACZssB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUtrB,EAAMurB,GAClB5tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACN8sB,EAAS7tB,EAAQC,GACjBwB,EAAOosB,EAAOvtB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOzE,KAAOA,KAAKwF,OAAO,GACxCxC,EAAQ6tB,EAAQ1uB,IAAOyuB,GAAY9sB,GAInClD,EAAKD,MAAOoD,EAAKD,EAAMH,OAGxB,OAAO3D,KAAK6D,UAAWE,MAGzB,IAAI+sB,GAAY,IAAI/mB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDgN,GAAY,SAAU1sB,GAKxB,IAAI2oB,EAAO3oB,EAAK6I,cAAc4C,YAM9B,OAJMkd,GAASA,EAAKgE,SACnBhE,EAAOjtB,GAGDitB,EAAKiE,iBAAkB5sB,IAG5B6sB,GAAO,SAAU7sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACR8rB,EAAM,GAGP,IAAM9rB,KAAQD,EACb+rB,EAAK9rB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAAS1D,KAAM4D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAAS8rB,EAAK9rB,GAG3B,OAAOtB,GAIJqtB,GAAY,IAAIrnB,OAAQma,GAAUrW,KAAM,KAAO,KAiJnD,SAASwjB,GAAQhtB,EAAMgB,EAAMisB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU1tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCA+M,EAAWA,GAAYP,GAAW1sB,MAQpB,MAFbN,EAAMutB,EAASI,iBAAkBrsB,IAAUisB,EAAUjsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBjE,EAAQuwB,kBAAoBb,GAAUrjB,KAAM1J,IAASqtB,GAAU3jB,KAAMpI,KAG1EksB,EAAQhN,EAAMgN,MACdC,EAAWjN,EAAMiN,SACjBC,EAAWlN,EAAMkN,SAGjBlN,EAAMiN,SAAWjN,EAAMkN,SAAWlN,EAAMgN,MAAQxtB,EAChDA,EAAMutB,EAASC,MAGfhN,EAAMgN,MAAQA,EACdhN,EAAMiN,SAAWA,EACjBjN,EAAMkN,SAAWA,SAIJ3rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS6tB,GAAcC,EAAaC,GAGnC,MAAO,CACNnuB,IAAK,WACJ,IAAKkuB,IASL,OAAS7xB,KAAK2D,IAAMmuB,GAASnxB,MAAOX,KAAMsE,kBALlCtE,KAAK2D,OA3MhB,WAIC,SAASouB,IAGR,GAAMnM,EAAN,CAIAoM,EAAUzN,MAAM0N,QAAU,+EAE1BrM,EAAIrB,MAAM0N,QACT,4HAGDtiB,GAAgBhN,YAAaqvB,GAAYrvB,YAAaijB,GAEtD,IAAIsM,EAAWnyB,EAAOkxB,iBAAkBrL,GACxCuM,EAAoC,OAAjBD,EAASniB,IAG5BqiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD1M,EAAIrB,MAAMgO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD3L,EAAIrB,MAAMmO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoBzM,EAAIgN,YAAc,GAEzDjjB,GAAgB9M,YAAamvB,GAI7BpM,EAAM,MAGP,SAASyM,EAAoBQ,GAC5B,OAAO7sB,KAAK8sB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYpyB,EAAS0C,cAAe,OACpCsjB,EAAMhmB,EAAS0C,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM0O,eAAiB,cAC3BrN,EAAIM,WAAW,GAAO3B,MAAM0O,eAAiB,GAC7C7xB,EAAQ8xB,gBAA+C,gBAA7BtN,EAAIrB,MAAM0O,eAEpCjwB,EAAOmC,OAAQ/D,EAAS,CACvB+xB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAYRY,qBAAsB,WACrB,IAAIC,EAAOhN,EAAIiN,EAASC,EAmCxB,OAlCgC,MAA3BV,IACJQ,EAAQ5zB,EAAS0C,cAAe,SAChCkkB,EAAK5mB,EAAS0C,cAAe,MAC7BmxB,EAAU7zB,EAAS0C,cAAe,OAElCkxB,EAAMjP,MAAM0N,QAAU,2DACtBzL,EAAGjC,MAAM0N,QAAU,mBAKnBzL,EAAGjC,MAAMoP,OAAS,MAClBF,EAAQlP,MAAMoP,OAAS,MAQvBF,EAAQlP,MAAMC,QAAU,QAExB7U,GACEhN,YAAa6wB,GACb7wB,YAAa6jB,GACb7jB,YAAa8wB,GAEfC,EAAU3zB,EAAOkxB,iBAAkBzK,GACnCwM,EAA4BY,SAAUF,EAAQC,OAAQ,IACrDC,SAAUF,EAAQG,eAAgB,IAClCD,SAAUF,EAAQI,kBAAmB,MAAWtN,EAAGuN,aAEpDpkB,GAAgB9M,YAAa2wB,IAEvBR,MAvIV,GAsNA,IAAIgB,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAar0B,EAAS0C,cAAe,OAAQiiB,MAC7C2P,GAAc,GAkBf,SAASC,GAAe9uB,GACvB,IAAI+uB,EAAQpxB,EAAOqxB,SAAUhvB,IAAU6uB,GAAa7uB,GAEpD,OAAK+uB,IAGA/uB,KAAQ4uB,GACL5uB,EAED6uB,GAAa7uB,GAxBrB,SAAyBA,GAGxB,IAAIivB,EAAUjvB,EAAM,GAAI0c,cAAgB1c,EAAK/E,MAAO,GACnD6B,EAAI6xB,GAAY1wB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO2uB,GAAa7xB,GAAMmyB,KACbL,GACZ,OAAO5uB,EAeoBkvB,CAAgBlvB,IAAUA,GAIxD,IAKCmvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAEhC,SAAU,WAAYiC,WAAY,SAAUnQ,QAAS,SACjEoQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBnwB,EAAOuC,EAAO6tB,GAIzC,IAAIhuB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKivB,IAAK,EAAGjuB,EAAS,IAAQguB,GAAY,KAAUhuB,EAAS,IAAO,MACpEG,EAGF,SAAS+tB,GAAoB7wB,EAAM8wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAIpzB,EAAkB,UAAdgzB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQlzB,EAAI,EAAGA,GAAK,EAGN,WAARizB,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM+wB,EAAMlR,GAAW/hB,IAAK,EAAMmzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,IAIjD,WAARF,IACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,MAtBvEG,GAASzyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMmzB,GAGhD,YAARF,EACJK,GAASzyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,GAItEE,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMmzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASzvB,KAAKivB,IAAK,EAAGjvB,KAAK0vB,KAC1BrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEi1B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBtxB,EAAM8wB,EAAWK,GAG3C,IAAIF,EAASvE,GAAW1sB,GAKvBgxB,IADmBj0B,EAAQ+xB,qBAAuBqC,IAEE,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCM,EAAmBP,EAEnBjzB,EAAMivB,GAAQhtB,EAAM8wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,GAIzE,GAAKwwB,GAAUrjB,KAAMrL,GAAQ,CAC5B,IAAMozB,EACL,OAAOpzB,EAERA,EAAM,OAyCP,QAlCQhB,EAAQ+xB,qBAAuBkC,IAMrCj0B,EAAQmyB,wBAA0BlnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC2wB,WAAY3wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOixB,KAG1DjxB,EAAKyxB,iBAAiBxyB,SAEtB+xB,EAAiE,eAAnDryB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,IAKpDM,EAAmBC,KAAcxxB,KAEhCjC,EAAMiC,EAAMwxB,MAKdzzB,EAAM2wB,WAAY3wB,IAAS,GAI1B8yB,GACC7wB,EACA8wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAlzB,GAEE,KA+SL,SAAS2zB,GAAO1xB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GACzC,OAAO,IAAID,GAAMxyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,GA7S5DhzB,EAAOmC,OAAQ,CAId8wB,SAAU,CACTC,QAAS,CACRvyB,IAAK,SAAUU,EAAMitB,GACpB,GAAKA,EAAW,CAGf,IAAIvtB,EAAMstB,GAAQhtB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACVgR,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV9P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOquB,GAGnC,GAAMnxB,GAA0B,IAAlBA,EAAK9C,UAAoC,IAAlB8C,EAAK9C,UAAmB8C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd6T,EAAWrV,EAAW3c,GACtBiyB,EAAe7C,GAAYhnB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM+S,IACLjyB,EAAO8uB,GAAekD,IAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,QAGrCvxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOmxB,IAEzBzxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB21B,IAC1BnwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWkS,GAAa,GAAK,OAI7Dj2B,EAAQ8xB,iBAA6B,KAAV/rB,GAAiD,IAAjC9B,EAAKxE,QAAS,gBAC9D0jB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOquB,MAE7B8B,EACJ/S,EAAMgT,YAAalyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMmwB,EAAOF,GACjC,IAAIlzB,EAAKwB,EAAK4f,EACb6T,EAAWrV,EAAW3c,GA6BvB,OA5BgBovB,GAAYhnB,KAAMpI,KAMjCA,EAAO8uB,GAAekD,KAIvB7T,EAAQxgB,EAAOizB,SAAU5wB,IAAUrC,EAAOizB,SAAUoB,KAGtC,QAAS7T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMmxB,SAIjB1vB,IAAR1D,IACJA,EAAMivB,GAAQhtB,EAAMgB,EAAMiwB,IAId,WAARlzB,GAAoBiD,KAAQuvB,KAChCxyB,EAAMwyB,GAAoBvvB,IAIZ,KAAVmwB,GAAgBA,GACpB5xB,EAAMmvB,WAAY3wB,IACD,IAAVozB,GAAkBgC,SAAU5zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI2tB,GACjDnyB,EAAOizB,SAAUd,GAAc,CAC9BxxB,IAAK,SAAUU,EAAMitB,EAAUkE,GAC9B,GAAKlE,EAIJ,OAAOkD,GAAa/mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKyxB,iBAAiBxyB,QAAWe,EAAKozB,wBAAwBlG,MAIjEoE,GAAkBtxB,EAAM8wB,EAAWK,GAHnCtE,GAAM7sB,EAAMqwB,GAAS,WACpB,OAAOiB,GAAkBtxB,EAAM8wB,EAAWK,MAM9ChT,IAAK,SAAUne,EAAM8C,EAAOquB,GAC3B,IAAIxuB,EACHsuB,EAASvE,GAAW1sB,GAIpBqzB,GAAsBt2B,EAAQkyB,iBACT,aAApBgC,EAAO5C,SAIR2C,GADkBqC,GAAsBlC,IAEY,eAAnDxyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOixB,GACvCN,EAAWQ,EACVN,GACC7wB,EACA8wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAYhvB,KAAK0vB,KAChBrxB,EAAM,SAAW8wB,EAAW,GAAIpT,cAAgBoT,EAAU70B,MAAO,IACjEyyB,WAAYuC,EAAQH,IACpBD,GAAoB7wB,EAAM8wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAchuB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO4Q,GAAchuB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM8wB,IAGpBJ,GAAmB1wB,EAAM8C,EAAO6tB,OAK1ChyB,EAAOizB,SAAS3D,WAAaV,GAAcxwB,EAAQiyB,mBAClD,SAAUhvB,EAAMitB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQhtB,EAAM,gBAClCA,EAAKozB,wBAAwBE,KAC5BzG,GAAM7sB,EAAM,CAAEiuB,WAAY,GAAK,WAC9B,OAAOjuB,EAAKozB,wBAAwBE,QAEnC,OAMP30B,EAAOkB,KAAM,CACZ0zB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpBh1B,EAAOizB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU9wB,GAOjB,IANA,IAAIhF,EAAI,EACP+1B,EAAW,GAGXC,EAAyB,iBAAVhxB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd+1B,EAAUH,EAAS7T,GAAW/hB,GAAM61B,GACnCG,EAAOh2B,IAAOg2B,EAAOh2B,EAAI,IAAOg2B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ/0B,EAAOizB,SAAU8B,EAASC,GAASxV,IAAMuS,MAI3C/xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQphB,KAAM,SAAUqE,EAAMgB,EAAM8B,GAC1C,IAAImuB,EAAQxwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAiwB,EAASvE,GAAW1sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOmzB,GAGxD,OAAOlxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO+yB,MAAQA,IAETxyB,UAAY,CACjBE,YAAasyB,GACb3yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAKgxB,EAAQ9Q,GACjDllB,KAAKqE,KAAOA,EACZrE,KAAK0iB,KAAOA,EACZ1iB,KAAKg2B,OAASA,GAAUhzB,EAAOgzB,OAAOtP,SACtC1mB,KAAKoF,QAAUA,EACfpF,KAAKkU,MAAQlU,KAAKmsB,IAAMnsB,KAAK8O,MAC7B9O,KAAKgF,IAAMA,EACXhF,KAAKklB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK3D,MACX+1B,GAAMqC,UAAU1R,SAAS/iB,IAAK3D,OAEhCq4B,IAAK,SAAUC,GACd,IAAIC,EACH/U,EAAQuS,GAAMqC,UAAWp4B,KAAK0iB,MAoB/B,OAlBK1iB,KAAKoF,QAAQozB,SACjBx4B,KAAKy4B,IAAMF,EAAQv1B,EAAOgzB,OAAQh2B,KAAKg2B,QACtCsC,EAASt4B,KAAKoF,QAAQozB,SAAWF,EAAS,EAAG,EAAGt4B,KAAKoF,QAAQozB,UAG9Dx4B,KAAKy4B,IAAMF,EAAQD,EAEpBt4B,KAAKmsB,KAAQnsB,KAAKgF,IAAMhF,KAAKkU,OAAUqkB,EAAQv4B,KAAKkU,MAE/ClU,KAAKoF,QAAQszB,MACjB14B,KAAKoF,QAAQszB,KAAKj4B,KAAMT,KAAKqE,KAAMrE,KAAKmsB,IAAKnsB,MAGzCwjB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKxiB,MAEX+1B,GAAMqC,UAAU1R,SAASlE,IAAKxiB,MAExBA,QAIOoD,KAAKG,UAAYwyB,GAAMxyB,WAEvCwyB,GAAMqC,UAAY,CACjB1R,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK9C,UACa,MAA5BqjB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAC1B1f,EAAO21B,GAAGD,KAAM9T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK9C,WACtByB,EAAOizB,SAAUrR,EAAMlC,OAC6B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO4P,GAAevP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,IAFjCnpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMuH,IAAMvH,EAAMM,UAU5C0T,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDrW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK9C,UAAYqjB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMuH,OAKpCnpB,EAAOgzB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM/yB,KAAKizB,IAAKF,EAAI/yB,KAAKkzB,IAAO,GAExCxS,SAAU,SAGX1jB,EAAO21B,GAAK5C,GAAMxyB,UAAUH,KAG5BJ,EAAO21B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAmrBHxoB,GAEHyoB,GAprBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBx5B,EAAS65B,QAAoB15B,EAAO25B,sBACxC35B,EAAO25B,sBAAuBF,IAE9Bz5B,EAAO+f,WAAY0Z,GAAUx2B,EAAO21B,GAAGgB,UAGxC32B,EAAO21B,GAAGiB,QAKZ,SAASC,KAIR,OAHA95B,EAAO+f,WAAY,WAClBqZ,QAAQrzB,IAEAqzB,GAAQzwB,KAAKyjB,MAIvB,SAAS2N,GAAOn4B,EAAMo4B,GACrB,IAAI/L,EACH7rB,EAAI,EACJuM,EAAQ,CAAEilB,OAAQhyB,GAKnB,IADAo4B,EAAeA,EAAe,EAAI,EAC1B53B,EAAI,EAAGA,GAAK,EAAI43B,EAEvBrrB,EAAO,UADPsf,EAAQ9J,GAAW/hB,KACSuM,EAAO,UAAYsf,GAAUrsB,EAO1D,OAJKo4B,IACJrrB,EAAMwnB,QAAUxnB,EAAM6iB,MAAQ5vB,GAGxB+M,EAGR,SAASsrB,GAAa7yB,EAAOub,EAAMuX,GAKlC,IAJA,IAAIrV,EACHuK,GAAe+K,GAAUC,SAAUzX,IAAU,IAAKhiB,OAAQw5B,GAAUC,SAAU,MAC9E7e,EAAQ,EACRhY,EAAS6rB,EAAW7rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQuK,EAAY7T,GAAQ7a,KAAMw5B,EAAWvX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASsV,GAAW71B,EAAM+1B,EAAYh1B,GACrC,IAAImO,EACH8mB,EACA/e,EAAQ,EACRhY,EAAS42B,GAAUI,WAAWh3B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bwb,EAAKv1B,OAEbu1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B3Z,EAAYla,KAAKivB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHpY,EAAY+Z,EAAUzB,UAAY,GAEzCld,EAAQ,EACRhY,EAAS22B,EAAUQ,OAAOn3B,OAEnBgY,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAKC,GAMhC,OAHAja,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW3B,EAASpY,IAG5CoY,EAAU,GAAKh1B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAI5C5b,EAASmB,YAAanb,EAAM,CAAE41B,KACvB,IAERA,EAAY5b,EAASzB,QAAS,CAC7BvY,KAAMA,EACNynB,MAAO9oB,EAAOmC,OAAQ,GAAIi1B,GAC1BM,KAAM13B,EAAOmC,QAAQ,EAAM,CAC1Bw1B,cAAe,GACf3E,OAAQhzB,EAAOgzB,OAAOtP,UACpBthB,GACHw1B,mBAAoBR,EACpBS,gBAAiBz1B,EACjBo1B,UAAWrB,IAASU,KACpBrB,SAAUpzB,EAAQozB,SAClBiC,OAAQ,GACRT,YAAa,SAAUtX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO+yB,MAAO1xB,EAAM41B,EAAUS,KAAMhY,EAAM1d,EACrDi1B,EAAUS,KAAKC,cAAejY,IAAUuX,EAAUS,KAAK1E,QAExD,OADAiE,EAAUQ,OAAO75B,KAAMgkB,GAChBA,GAERlB,KAAM,SAAUoX,GACf,IAAIxf,EAAQ,EAIXhY,EAASw3B,EAAUb,EAAUQ,OAAOn3B,OAAS,EAC9C,GAAK+2B,EACJ,OAAOr6B,KAGR,IADAq6B,GAAU,EACF/e,EAAQhY,EAAQgY,IACvB2e,EAAUQ,OAAQnf,GAAQ+c,IAAK,GAUhC,OANKyC,GACJzc,EAASkB,WAAYlb,EAAM,CAAE41B,EAAW,EAAG,IAC3C5b,EAASmB,YAAanb,EAAM,CAAE41B,EAAWa,KAEzCzc,EAASuB,WAAYvb,EAAM,CAAE41B,EAAWa,IAElC96B,QAGT8rB,EAAQmO,EAAUnO,MAInB,KA/HD,SAAqBA,EAAO6O,GAC3B,IAAIrf,EAAOjW,EAAM2wB,EAAQ7uB,EAAOqc,EAGhC,IAAMlI,KAASwQ,EAed,GAbAkK,EAAS2E,EADTt1B,EAAO2c,EAAW1G,IAElBnU,EAAQ2kB,EAAOxQ,GACV1V,MAAMC,QAASsB,KACnB6uB,EAAS7uB,EAAO,GAChBA,EAAQ2kB,EAAOxQ,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACdymB,EAAOzmB,GAAS8B,SACT2kB,EAAOxQ,KAGfkI,EAAQxgB,EAAOizB,SAAU5wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMyU,OAAQ9wB,UACf2kB,EAAOzmB,GAIC8B,EACNmU,KAASwQ,IAChBA,EAAOxQ,GAAUnU,EAAOmU,GACxBqf,EAAerf,GAAU0a,QAI3B2E,EAAet1B,GAAS2wB,EA6F1B+E,CAAYjP,EAAOmO,EAAUS,KAAKC,eAE1Brf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS2mB,GAAUI,WAAYhf,GAAQ7a,KAAMw5B,EAAW51B,EAAMynB,EAAOmO,EAAUS,MAM9E,OAJKr5B,EAAYkS,EAAOmQ,QACvB1gB,EAAOygB,YAAawW,EAAU51B,KAAM41B,EAAUS,KAAKnd,OAAQmG,KAC1DnQ,EAAOmQ,KAAKsX,KAAMznB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK0nB,EAAOkO,GAAaC,GAE3B54B,EAAY44B,EAAUS,KAAKxmB,QAC/B+lB,EAAUS,KAAKxmB,MAAMzT,KAAM4D,EAAM41B,GAIlCA,EACErb,SAAUqb,EAAUS,KAAK9b,UACzB/V,KAAMoxB,EAAUS,KAAK7xB,KAAMoxB,EAAUS,KAAKO,UAC1Cpe,KAAMod,EAAUS,KAAK7d,MACrBuB,OAAQ6b,EAAUS,KAAKtc,QAEzBpb,EAAO21B,GAAGuC,MACTl4B,EAAOmC,OAAQy0B,EAAM,CACpBv1B,KAAMA,EACN82B,KAAMlB,EACN1c,MAAO0c,EAAUS,KAAKnd,SAIjB0c,EAGRj3B,EAAOk3B,UAAYl3B,EAAOmC,OAAQ+0B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAU1Y,EAAMvb,GACtB,IAAIyd,EAAQ5kB,KAAKg6B,YAAatX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITyW,QAAS,SAAUvP,EAAO3nB,GACpB9C,EAAYyqB,IAChB3nB,EAAW2nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMhf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAASwoB,EAAMxoB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOoJ,EAAOxQ,GACd4e,GAAUC,SAAUzX,GAASwX,GAAUC,SAAUzX,IAAU,GAC3DwX,GAAUC,SAAUzX,GAAO9Q,QAASzN,IAItCm2B,WAAY,CA3Wb,SAA2Bj2B,EAAMynB,EAAO4O,GACvC,IAAIhY,EAAMvb,EAAOwe,EAAQnC,EAAO8X,EAASC,EAAWC,EAAgBhX,EACnEiX,EAAQ,UAAW3P,GAAS,WAAYA,EACxCqP,EAAOn7B,KACPsuB,EAAO,GACP/J,EAAQlgB,EAAKkgB,MACbkV,EAASp1B,EAAK9C,UAAY+iB,GAAoBjgB,GAC9Cq3B,EAAW9Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BAgY,EAAKnd,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBs3B,WACVnY,EAAMmY,SAAW,EACjBL,EAAU9X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMmY,UACXL,MAIH9X,EAAMmY,WAENR,EAAK/c,OAAQ,WAGZ+c,EAAK/c,OAAQ,WACZoF,EAAMmY,WACA34B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFqO,EAEb,GADA3kB,EAAQ2kB,EAAOpJ,GACV4W,GAAS7rB,KAAMtG,GAAU,CAG7B,UAFO2kB,EAAOpJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYsyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVtyB,IAAoBu0B,QAAiC51B,IAArB41B,EAAUhZ,GAK9C,SAJA+W,GAAS,EAOXnL,EAAM5L,GAASgZ,GAAYA,EAAUhZ,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA6Y,GAAav4B,EAAOyD,cAAeqlB,MAChB9oB,EAAOyD,cAAe6nB,GA8DzC,IAAM5L,KAzDD+Y,GAA2B,IAAlBp3B,EAAK9C,WAMlBm5B,EAAKkB,SAAW,CAAErX,EAAMqX,SAAUrX,EAAMsX,UAAWtX,EAAMuX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASlX,WAErCgX,EAAiB5Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBm3B,EACJhX,EAAUgX,GAIVlW,GAAU,CAAEjhB,IAAQ,GACpBm3B,EAAiBn3B,EAAKkgB,MAAMC,SAAWgX,EACvChX,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlBgX,IACrB,SAAhCx4B,EAAOyhB,IAAKpgB,EAAM,WAGhBk3B,IACLJ,EAAKtyB,KAAM,WACV0b,EAAMC,QAAUgX,IAEM,MAAlBA,IACJhX,EAAUD,EAAMC,QAChBgX,EAA6B,SAAZhX,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdkW,EAAKkB,WACTrX,EAAMqX,SAAW,SACjBT,EAAK/c,OAAQ,WACZmG,EAAMqX,SAAWlB,EAAKkB,SAAU,GAChCrX,EAAMsX,UAAYnB,EAAKkB,SAAU,GACjCrX,EAAMuX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACEjN,EAGPiN,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW9Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAASgX,IAInD7V,IACJ+V,EAASjC,QAAUA,GAIfA,GACJnU,GAAU,CAAEjhB,IAAQ,GAKrB82B,EAAKtyB,KAAM,WASV,IAAM6Z,KAJA+W,GACLnU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTiqB,EACbtrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM4L,EAAM5L,OAMnC6Y,EAAYvB,GAAaP,EAASiC,EAAUhZ,GAAS,EAAGA,EAAMyY,GACtDzY,KAAQgZ,IACfA,EAAUhZ,GAAS6Y,EAAUrnB,MACxBulB,IACJ8B,EAAUv2B,IAAMu2B,EAAUrnB,MAC1BqnB,EAAUrnB,MAAQ,MAuMrB6nB,UAAW,SAAU53B,EAAU+rB,GACzBA,EACJgK,GAAUI,WAAW1oB,QAASzN,GAE9B+1B,GAAUI,WAAW15B,KAAMuD,MAK9BnB,EAAOg5B,MAAQ,SAAUA,EAAOhG,EAAQ7yB,GACvC,IAAIk2B,EAAM2C,GAA0B,iBAAVA,EAAqBh5B,EAAOmC,OAAQ,GAAI62B,GAAU,CAC3Ef,SAAU93B,IAAOA,GAAM6yB,GACtB30B,EAAY26B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ7yB,GAAM6yB,GAAUA,IAAW30B,EAAY20B,IAAYA,GAoC5D,OAhCKhzB,EAAO21B,GAAGlQ,IACd4Q,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYx1B,EAAO21B,GAAGsD,OAC9B5C,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWx1B,EAAO21B,GAAGsD,OAAOvV,UAMjB,MAAb2S,EAAI9b,QAA+B,IAAd8b,EAAI9b,QAC7B8b,EAAI9b,MAAQ,MAIb8b,EAAIlI,IAAMkI,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT55B,EAAYg4B,EAAIlI,MACpBkI,EAAIlI,IAAI1wB,KAAMT,MAGVq5B,EAAI9b,OACRva,EAAOsgB,QAAStjB,KAAMq5B,EAAI9b,QAIrB8b,GAGRr2B,EAAOG,GAAGgC,OAAQ,CACjB+2B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ7xB,GAGpC,OAAOnE,KAAKsQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMo3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ7xB,IAElDi4B,QAAS,SAAU1Z,EAAMsZ,EAAOhG,EAAQ7xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC2Z,EAASr5B,EAAOg5B,MAAOA,EAAOhG,EAAQ7xB,GACtCm4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWl6B,KAAMgD,EAAOmC,OAAQ,GAAIud,GAAQ2Z,IAGlDvmB,GAAS8M,EAASjf,IAAK3D,KAAM,YACjCm7B,EAAKzX,MAAM,IAMd,OAFA4Y,EAAYC,OAASD,EAEdxmB,IAA0B,IAAjBumB,EAAO9e,MACtBvd,KAAKkE,KAAMo4B,GACXt8B,KAAKud,MAAO8e,EAAO9e,MAAO+e,IAE5B5Y,KAAM,SAAU/hB,EAAMiiB,EAAYkX,GACjC,IAAI0B,EAAY,SAAUhZ,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMoX,IAYP,MATqB,iBAATn5B,IACXm5B,EAAUlX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ5jB,KAAKud,MAAO5b,GAAQ,KAAM,IAGpB3B,KAAKkE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B86B,EAASz5B,EAAOy5B,OAChBha,EAAOG,EAASjf,IAAK3D,MAEtB,GAAKsb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC8Y,EAAW/Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ6V,GAAK9rB,KAAM6N,IACtDkhB,EAAW/Z,EAAMnH,IAKpB,IAAMA,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MACnB,MAAR2B,GAAgB86B,EAAQnhB,GAAQiC,QAAU5b,IAE5C86B,EAAQnhB,GAAQ6f,KAAKzX,KAAMoX,GAC3BxX,GAAU,EACVmZ,EAAOv3B,OAAQoW,EAAO,KAOnBgI,GAAYwX,GAChB93B,EAAOsgB,QAAStjB,KAAM2B,MAIzB46B,OAAQ,SAAU56B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET3B,KAAKkE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK3D,MACrBud,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB86B,EAASz5B,EAAOy5B,OAChBn5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK8Z,QAAS,EAGdv5B,EAAOua,MAAOvd,KAAM2B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKjjB,KAAMT,MAAM,GAIlBsb,EAAQmhB,EAAOn5B,OAAQgY,KACvBmhB,EAAQnhB,GAAQjX,OAASrE,MAAQy8B,EAAQnhB,GAAQiC,QAAU5b,IAC/D86B,EAAQnhB,GAAQ6f,KAAKzX,MAAM,GAC3B+Y,EAAOv3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQihB,QACrChf,EAAOjC,GAAQihB,OAAO97B,KAAMT,aAKvByiB,EAAK8Z,YAKfv5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIq3B,EAAQ15B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAgB,MAAT63B,GAAkC,kBAAVA,EAC9BU,EAAM/7B,MAAOX,KAAMsE,WACnBtE,KAAKo8B,QAAStC,GAAOz0B,GAAM,GAAQ22B,EAAOhG,EAAQ7xB,MAKrDnB,EAAOkB,KAAM,CACZy4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU7wB,EAAMymB,GAClB9oB,EAAOG,GAAIkC,GAAS,SAAU22B,EAAOhG,EAAQ7xB,GAC5C,OAAOnE,KAAKo8B,QAAStQ,EAAOkQ,EAAOhG,EAAQ7xB,MAI7CnB,EAAOy5B,OAAS,GAChBz5B,EAAO21B,GAAGiB,KAAO,WAChB,IAAIsB,EACH/4B,EAAI,EACJs6B,EAASz5B,EAAOy5B,OAIjB,IAFAtD,GAAQzwB,KAAKyjB,MAELhqB,EAAIs6B,EAAOn5B,OAAQnB,KAC1B+4B,EAAQuB,EAAQt6B,OAGCs6B,EAAQt6B,KAAQ+4B,GAChCuB,EAAOv3B,OAAQ/C,IAAK,GAIhBs6B,EAAOn5B,QACZN,EAAO21B,GAAGjV,OAEXyV,QAAQrzB,GAGT9C,EAAO21B,GAAGuC,MAAQ,SAAUA,GAC3Bl4B,EAAOy5B,OAAO77B,KAAMs6B,GACpBl4B,EAAO21B,GAAGzkB,SAGXlR,EAAO21B,GAAGgB,SAAW,GACrB32B,EAAO21B,GAAGzkB,MAAQ,WACZklB,KAILA,IAAa,EACbI,OAGDx2B,EAAO21B,GAAGjV,KAAO,WAChB0V,GAAa,MAGdp2B,EAAO21B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNxW,SAAU,KAMX1jB,EAAOG,GAAGg6B,MAAQ,SAAUC,EAAMz7B,GAIjC,OAHAy7B,EAAOp6B,EAAO21B,IAAK31B,EAAO21B,GAAGsD,OAAQmB,IAAiBA,EACtDz7B,EAAOA,GAAQ,KAER3B,KAAKud,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI6Z,EAAUt9B,EAAO+f,WAAYvT,EAAM6wB,GACvC5Z,EAAME,KAAO,WACZ3jB,EAAOu9B,aAAcD,OAOnBzsB,GAAQhR,EAAS0C,cAAe,SAEnC+2B,GADSz5B,EAAS0C,cAAe,UACpBK,YAAa/C,EAAS0C,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbP,EAAQm8B,QAA0B,KAAhB3sB,GAAMzJ,MAIxB/F,EAAQo8B,YAAcnE,GAAIzjB,UAI1BhF,GAAQhR,EAAS0C,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbP,EAAQq8B,WAA6B,MAAhB7sB,GAAMzJ,MAI5B,IAAIu2B,GACH9uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dq6B,WAAY,SAAUt4B,GACrB,OAAOrF,KAAKkE,KAAM,WACjBlB,EAAO26B,WAAY39B,KAAMqF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBv5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVy2B,GAAgB56B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO66B,UAAWx4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASq4B,QAAW53B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO26B,WAAYt5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC85B,UAAW,CACVl8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM/F,EAAQq8B,YAAwB,UAAVt2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXw2B,WAAY,SAAUt5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ27B,EAAY32B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK4hB,GAA+B,IAAlBz5B,EAAK9C,SACtB,MAAU8D,EAAOy4B,EAAW37B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bq4B,GAAW,CACVlb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO26B,WAAYt5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAI04B,EAASnvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAK+lB,EACRkU,EAAgB34B,EAAKoC,cAYtB,OAVMI,IAGLiiB,EAASlb,GAAYovB,GACrBpvB,GAAYovB,GAAkBj6B,EAC9BA,EAAqC,MAA/Bg6B,EAAQ15B,EAAMgB,EAAMwC,GACzBm2B,EACA,KACDpvB,GAAYovB,GAAkBlU,GAExB/lB,KAOT,IAAIk6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkBh3B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASuwB,GAAU/5B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS67B,GAAgBl3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQphB,KAAMgD,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Dg7B,WAAY,SAAUj5B,GACrB,OAAOrF,KAAKkE,KAAM,kBACVlE,KAAMgD,EAAOu7B,QAASl5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRoa,EAAQv5B,EAAK9C,SAGd,GAAe,IAAVq8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB56B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOu7B,QAASl5B,IAAUA,EACjCme,EAAQxgB,EAAOo1B,UAAW/yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd+yB,UAAW,CACV3iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIm6B,EAAWx7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKm6B,EACG5K,SAAU4K,EAAU,IAI3BP,GAAWxwB,KAAMpJ,EAAKgI,WACtB6xB,GAAWzwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX+oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLt9B,EAAQo8B,cACbx6B,EAAOo1B,UAAUxiB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOu7B,QAASv+B,KAAKyH,eAAkBzH,OA4BxCgD,EAAOG,GAAGgC,OAAQ,CACjBw5B,SAAU,SAAUx3B,GACnB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAO2+B,SAAUx3B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAM1D,IAFA4+B,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAItB,GAHA08B,EAAWT,GAAU/5B,GACrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KACrB+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAAQ,IACvChwB,GAAOgwB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRg/B,YAAa,SAAU73B,GACtB,IAAIy3B,EAASv6B,EAAMyK,EAAK+vB,EAAUC,EAAO/5B,EAAGg6B,EAC3C58B,EAAI,EAEL,GAAKd,EAAY8F,GAChB,OAAOnH,KAAKkE,KAAM,SAAUa,GAC3B/B,EAAQhD,MAAOg/B,YAAa73B,EAAM1G,KAAMT,KAAM+E,EAAGq5B,GAAUp+B,UAI7D,IAAMsE,UAAUhB,OACf,OAAOtD,KAAK+R,KAAM,QAAS,IAK5B,IAFA6sB,EAAUP,GAAgBl3B,IAEb7D,OACZ,MAAUe,EAAOrE,KAAMmC,KAMtB,GALA08B,EAAWT,GAAU/5B,GAGrByK,EAAwB,IAAlBzK,EAAK9C,UAAoB,IAAM48B,GAAkBU,GAAa,IAEzD,CACV95B,EAAI,EACJ,MAAU+5B,EAAQF,EAAS75B,KAG1B,OAA4C,EAApC+J,EAAIjO,QAAS,IAAMi+B,EAAQ,KAClChwB,EAAMA,EAAI5I,QAAS,IAAM44B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBrvB,KAE9BzK,EAAK5B,aAAc,QAASs8B,GAMhC,OAAO/+B,MAGRi/B,YAAa,SAAU93B,EAAO+3B,GAC7B,IAAIv9B,SAAcwF,EACjBg4B,EAAwB,WAATx9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb+3B,GAA0BC,EAC9BD,EAAWl/B,KAAK2+B,SAAUx3B,GAAUnH,KAAKg/B,YAAa73B,GAGzD9F,EAAY8F,GACTnH,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOi/B,YACd93B,EAAM1G,KAAMT,KAAMmC,EAAGi8B,GAAUp+B,MAAQk/B,GACvCA,KAKIl/B,KAAKkE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM2kB,EAExB,GAAKD,EAAe,CAGnBh9B,EAAI,EACJsY,EAAOzX,EAAQhD,MACfo/B,EAAaf,GAAgBl3B,GAE7B,MAAU+I,EAAYkvB,EAAYj9B,KAG5BsY,EAAK4kB,SAAUnvB,GACnBuK,EAAKukB,YAAa9uB,GAElBuK,EAAKkkB,SAAUzuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYkuB,GAAUp+B,QAIrB4iB,EAASJ,IAAKxiB,KAAM,gBAAiBkQ,GAOjClQ,KAAKyC,cACTzC,KAAKyC,aAAc,QAClByN,IAAuB,IAAV/I,EACZ,GACAyb,EAASjf,IAAK3D,KAAM,kBAAqB,QAO/Cq/B,SAAU,SAAUp8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOrE,KAAMmC,KACtB,GAAuB,IAAlBkC,EAAK9C,WACoE,GAA3E,IAAM48B,GAAkBC,GAAU/5B,IAAW,KAAMxD,QAASqP,GAC9D,OAAO,EAIT,OAAO,KAOT,IAAIovB,GAAU,MAEdt8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKurB,EACfjrB,EAAOrE,KAAM,GAEd,OAAMsE,UAAUhB,QA0BhBgsB,EAAkBjuB,EAAY8F,GAEvBnH,KAAKkE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBpC,KAAKuB,WAWE,OANXa,EADIktB,EACEnoB,EAAM1G,KAAMT,KAAMmC,EAAGa,EAAQhD,MAAOoC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOu8B,SAAUv/B,KAAK2B,OAAUqB,EAAOu8B,SAAUv/B,KAAKqM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKxiB,KAAMoC,EAAK,WAC3DpC,KAAKmH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOu8B,SAAUl7B,EAAK1C,OAC7BqB,EAAOu8B,SAAUl7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASo5B,GAAS,IAIhB,MAAPv7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdo6B,SAAU,CACTnZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA+7B,GAAkBn7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACbyS,EAAoB,eAAdjkB,EAAK1C,KACX6jB,EAAS8C,EAAM,KAAO,GACtB2M,EAAM3M,EAAMhN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR2Z,EAGA3M,EAAMhN,EAAQ,EAIXnZ,EAAI8yB,EAAK9yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBkmB,EACJ,OAAOnhB,EAIRqe,EAAO5kB,KAAMuG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIq4B,EAAWpZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOu8B,SAASnZ,OAAOziB,IAAKyiB,GAAUZ,MAEtDga,GAAY,GAUd,OAHMA,IACLn7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOu8B,SAAUv/B,MAAS,CACzBwiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D/F,EAAQm8B,UACbv6B,EAAOu8B,SAAUv/B,MAAO2D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D/F,EAAQq+B,QAAU,cAAe1/B,EAGjC,IAAI2/B,GAAc,kCACjBC,GAA0B,SAAUlzB,GACnCA,EAAEsc,mBAGJ/lB,EAAOmC,OAAQnC,EAAOwlB,MAAO,CAE5BU,QAAS,SAAUV,EAAO/F,EAAMpe,EAAMu7B,GAErC,IAAIz9B,EAAG2M,EAAK6B,EAAKkvB,EAAYC,EAAQhW,EAAQ3K,EAAS4gB,EACrDC,EAAY,CAAE37B,GAAQzE,GACtB+B,EAAOX,EAAOP,KAAM+nB,EAAO,QAAWA,EAAM7mB,KAAO6mB,EACnDkB,EAAa1oB,EAAOP,KAAM+nB,EAAO,aAAgBA,EAAM/Y,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMixB,EAAcpvB,EAAMtM,EAAOA,GAAQzE,EAGlB,IAAlByE,EAAK9C,UAAoC,IAAlB8C,EAAK9C,WAK5Bm+B,GAAYjyB,KAAM9L,EAAOqB,EAAOwlB,MAAMuB,cAIf,EAAvBpoB,EAAKd,QAAS,OAIlBc,GADA+nB,EAAa/nB,EAAK4F,MAAO,MACP8G,QAClBqb,EAAWzkB,QAEZ66B,EAASn+B,EAAKd,QAAS,KAAQ,GAAK,KAAOc,GAG3C6mB,EAAQA,EAAOxlB,EAAO+C,SACrByiB,EACA,IAAIxlB,EAAOmmB,MAAOxnB,EAAuB,iBAAV6mB,GAAsBA,IAGhDK,UAAY+W,EAAe,EAAI,EACrCpX,EAAM/Y,UAAYia,EAAW7b,KAAM,KACnC2a,EAAMwC,WAAaxC,EAAM/Y,UACxB,IAAI1F,OAAQ,UAAY2f,EAAW7b,KAAM,iBAAoB,WAC7D,KAGD2a,EAAMjV,YAASzN,EACT0iB,EAAM/iB,SACX+iB,EAAM/iB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAE+F,GACFxlB,EAAO2D,UAAW8b,EAAM,CAAE+F,IAG3BrJ,EAAUnc,EAAOwlB,MAAMrJ,QAASxd,IAAU,GACpCi+B,IAAgBzgB,EAAQ+J,UAAmD,IAAxC/J,EAAQ+J,QAAQvoB,MAAO0D,EAAMoe,IAAtE,CAMA,IAAMmd,IAAiBzgB,EAAQuM,WAAajqB,EAAU4C,GAAS,CAM9D,IAJAw7B,EAAa1gB,EAAQ2J,cAAgBnnB,EAC/B+9B,GAAYjyB,KAAMoyB,EAAal+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBo9B,EAAUp/B,KAAMkO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBtN,IACpCogC,EAAUp/B,KAAM+P,EAAIb,aAAea,EAAIsvB,cAAgBlgC,GAKzDoC,EAAI,EACJ,OAAU2M,EAAMkxB,EAAW79B,QAAYqmB,EAAMqC,uBAC5CkV,EAAcjxB,EACd0Z,EAAM7mB,KAAW,EAAJQ,EACZ09B,EACA1gB,EAAQ8K,UAAYtoB,GAGrBmoB,GAAWlH,EAASjf,IAAKmL,EAAK,WAAc1O,OAAOypB,OAAQ,OAAUrB,EAAM7mB,OAC1EihB,EAASjf,IAAKmL,EAAK,YAEnBgb,EAAOnpB,MAAOmO,EAAK2T,IAIpBqH,EAASgW,GAAUhxB,EAAKgxB,KACThW,EAAOnpB,OAASuhB,EAAYpT,KAC1C0Z,EAAMjV,OAASuW,EAAOnpB,MAAOmO,EAAK2T,IACZ,IAAjB+F,EAAMjV,QACViV,EAAMS,kBA8CT,OA1CAT,EAAM7mB,KAAOA,EAGPi+B,GAAiBpX,EAAMuD,sBAEpB5M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS/lB,MAAOq/B,EAAU12B,MAAOmZ,KACzCP,EAAY7d,IAIPy7B,GAAUz+B,EAAYgD,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMy7B,MAGXz7B,EAAMy7B,GAAW,MAIlB98B,EAAOwlB,MAAMuB,UAAYpoB,EAEpB6mB,EAAMqC,wBACVkV,EAAY/vB,iBAAkBrO,EAAMg+B,IAGrCt7B,EAAM1C,KAED6mB,EAAMqC,wBACVkV,EAAYhf,oBAAqBpf,EAAMg+B,IAGxC38B,EAAOwlB,MAAMuB,eAAYjkB,EAEpB6K,IACJtM,EAAMy7B,GAAWnvB,IAMd6X,EAAMjV,SAKd2sB,SAAU,SAAUv+B,EAAM0C,EAAMmkB,GAC/B,IAAI/b,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOmmB,MACXX,EACA,CACC7mB,KAAMA,EACNyqB,aAAa,IAIfppB,EAAOwlB,MAAMU,QAASzc,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjB+jB,QAAS,SAAUvnB,EAAM8gB,GACxB,OAAOziB,KAAKkE,KAAM,WACjBlB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMziB,SAGpCmgC,eAAgB,SAAUx+B,EAAM8gB,GAC/B,IAAIpe,EAAOrE,KAAM,GACjB,GAAKqE,EACJ,OAAOrB,EAAOwlB,MAAMU,QAASvnB,EAAM8gB,EAAMpe,GAAM,MAc5CjD,EAAQq+B,SACbz8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW4Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAI/b,EAAU,SAAU6Z,GACvBxlB,EAAOwlB,MAAM0X,SAAUxV,EAAKlC,EAAM/iB,OAAQzC,EAAOwlB,MAAMkC,IAAKlC,KAG7DxlB,EAAOwlB,MAAMrJ,QAASuL,GAAQ,CAC7BP,MAAO,WAIN,IAAIjoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAE5B0V,GACLl+B,EAAI8N,iBAAkBse,EAAM3f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAKwoB,GAAO0V,GAAY,GAAM,IAEhD9V,SAAU,WACT,IAAIpoB,EAAMlC,KAAKkN,eAAiBlN,KAAKJ,UAAYI,KAChDogC,EAAWxd,EAASxB,OAAQlf,EAAKwoB,GAAQ,EAEpC0V,EAKLxd,EAASxB,OAAQlf,EAAKwoB,EAAK0V,IAJ3Bl+B,EAAI6e,oBAAqBuN,EAAM3f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAKwoB,QAS3B,IAAIvV,GAAWpV,EAAOoV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAKyjB,OAErBkU,GAAS,KAKbr9B,EAAOs9B,SAAW,SAAU7d,GAC3B,IAAI3O,EAAKysB,EACT,IAAM9d,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM/T,EAAOygC,WAAcC,gBAAiBhe,EAAM,YACvD,MAAQhW,IAYV,OAVA8zB,EAAkBzsB,GAAOA,EAAIxG,qBAAsB,eAAiB,GAC9DwG,IAAOysB,GACZv9B,EAAOoD,MAAO,iBACbm6B,EACCv9B,EAAOoB,IAAKm8B,EAAgB/zB,WAAY,SAAUgC,GACjD,OAAOA,EAAG8D,cACPzE,KAAM,MACV4U,IAGI3O,GAIR,IACC4sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa/I,EAAQz2B,EAAKy/B,EAAavlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAASvE,GAGnB0B,EAAOkB,KAAM5C,EAAK,SAAUa,EAAGia,GACzB2kB,GAAeL,GAASjzB,KAAMsqB,GAGlCvc,EAAKuc,EAAQ3b,GAKb0kB,GACC/I,EAAS,KAAqB,iBAAN3b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACA2kB,EACAvlB,UAKG,GAAMulB,GAAiC,WAAlBj+B,EAAQxB,GAUnCka,EAAKuc,EAAQz2B,QAPb,IAAM+D,KAAQ/D,EACbw/B,GAAa/I,EAAS,IAAM1yB,EAAO,IAAK/D,EAAK+D,GAAQ07B,EAAavlB,GAYrExY,EAAOg+B,MAAQ,SAAU53B,EAAG23B,GAC3B,IAAIhJ,EACHkJ,EAAI,GACJzlB,EAAM,SAAUrN,EAAK+yB,GAGpB,IAAI/5B,EAAQ9F,EAAY6/B,GACvBA,IACAA,EAEDD,EAAGA,EAAE39B,QAAW69B,mBAAoBhzB,GAAQ,IAC3CgzB,mBAA6B,MAATh6B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKxb,KAAKqF,KAAMrF,KAAKmH,cAOtB,IAAM4wB,KAAU3uB,EACf03B,GAAa/I,EAAQ3uB,EAAG2uB,GAAUgJ,EAAavlB,GAKjD,OAAOylB,EAAEpzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjBi8B,UAAW,WACV,OAAOp+B,EAAOg+B,MAAOhhC,KAAKqhC,mBAE3BA,eAAgB,WACf,OAAOrhC,KAAKoE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAM1iB,KAAM,YAClC,OAAO8R,EAAW9O,EAAO2D,UAAWmL,GAAa9R,OAC9CsQ,OAAQ,WACX,IAAI3O,EAAO3B,KAAK2B,KAGhB,OAAO3B,KAAKqF,OAASrC,EAAQhD,MAAOka,GAAI,cACvC2mB,GAAapzB,KAAMzN,KAAKqM,YAAeu0B,GAAgBnzB,KAAM9L,KAC3D3B,KAAK2V,UAAYkQ,GAAepY,KAAM9L,MACtCyC,IAAK,SAAUoD,EAAInD,GACtB,IAAIjC,EAAMY,EAAQhD,MAAOoC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAIhD,CAAEt7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASy6B,GAAO,WAClDh9B,SAKN,IACC29B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZrH,GAAa,GAObsH,GAAa,GAGbC,GAAW,KAAKnhC,OAAQ,KAGxBohC,GAAeliC,EAAS0C,cAAe,KAKxC,SAASy/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoBhkB,GAED,iBAAvBgkB,IACXhkB,EAAOgkB,EACPA,EAAqB,KAGtB,IAAIC,EACH//B,EAAI,EACJggC,EAAYF,EAAmBx6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK7a,EAAY4c,GAGhB,MAAUikB,EAAWC,EAAWhgC,KAGR,MAAlB+/B,EAAU,IACdA,EAAWA,EAAS5hC,MAAO,IAAO,KAChC0hC,EAAWE,GAAaF,EAAWE,IAAc,IAAKtwB,QAASqM,KAI/D+jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKthC,KAAMqd,IAQnE,SAASmkB,GAA+BJ,EAAW58B,EAASy1B,EAAiBwH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAItsB,EAcJ,OAbA0sB,EAAWJ,IAAa,EACxBl/B,EAAOkB,KAAM89B,EAAWE,IAAc,GAAI,SAAUjlB,EAAGwlB,GACtD,IAAIC,EAAsBD,EAAoBr9B,EAASy1B,EAAiBwH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACD3sB,EAAW8sB,QADf,GAHNt9B,EAAQ+8B,UAAUvwB,QAAS8wB,GAC3BF,EAASE,IACF,KAKF9sB,EAGR,OAAO4sB,EAASp9B,EAAQ+8B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYl9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRk9B,EAAc5/B,EAAO6/B,aAAaD,aAAe,GAElD,IAAMz0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPy0B,EAAaz0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/ERq8B,GAAatsB,KAAOL,GAASK,KAgP7BxS,EAAOmC,OAAQ,CAGd29B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK9tB,GAASK,KACd7T,KAAM,MACNuhC,QAxRgB,4DAwRQz1B,KAAM0H,GAASguB,UACvC3jC,QAAQ,EACR4jC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRnI,IAAKyG,GACLt/B,KAAM,aACNgtB,KAAM,YACNzb,IAAK,4BACL0vB,KAAM,qCAGPxoB,SAAU,CACTlH,IAAK,UACLyb,KAAM,SACNiU,KAAM,YAGPC,eAAgB,CACf3vB,IAAK,cACLvR,KAAM,eACNihC,KAAM,gBAKPE,WAAY,CAGXC,SAAUj4B,OAGVk4B,aAAa,EAGbC,YAAa5gB,KAAKC,MAGlB4gB,WAAY9gC,EAAOs9B,UAOpBsC,YAAa,CACZK,KAAK,EACL//B,SAAS,IAOX6gC,UAAW,SAAUt+B,EAAQu+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYl9B,EAAQzC,EAAO6/B,cAAgBmB,GAGvDrB,GAAY3/B,EAAO6/B,aAAcp9B,IAGnCw+B,cAAelC,GAA6BzH,IAC5C4J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK79B,GAGA,iBAAR69B,IACX79B,EAAU69B,EACVA,OAAMn9B,GAIPV,EAAUA,GAAW,GAErB,IAAIg/B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGA3jB,EAGA4jB,EAGAviC,EAGAwiC,EAGA1D,EAAIj+B,EAAO+gC,UAAW,GAAI3+B,GAG1Bw/B,EAAkB3D,EAAE/9B,SAAW+9B,EAG/B4D,EAAqB5D,EAAE/9B,UACpB0hC,EAAgBrjC,UAAYqjC,EAAgBphC,QAC9CR,EAAQ4hC,GACR5hC,EAAOwlB,MAGRnK,EAAWrb,EAAOgb,WAClB8mB,EAAmB9hC,EAAO+Z,UAAW,eAGrCgoB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPnhB,WAAY,EAGZikB,kBAAmB,SAAUh3B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMyjB,EAAkB,CACvBA,EAAkB,GAClB,MAAUz3B,EAAQ20B,GAASt0B,KAAMm3B,GAChCC,EAAiBz3B,EAAO,GAAIrF,cAAgB,MACzC88B,EAAiBz3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD/G,OAAQoM,EAAO,IAGpBA,EAAQy3B,EAAiBp2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cu3B,sBAAuB,WACtB,OAAOtkB,EAAYwjB,EAAwB,MAI5Ce,iBAAkB,SAAUhgC,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO4/B,EAAqB5/B,EAAKoC,eAChCw9B,EAAqB5/B,EAAKoC,gBAAmBpC,EAC9C2/B,EAAgB3/B,GAAS8B,GAEnBnH,MAIRslC,iBAAkB,SAAU3jC,GAI3B,OAHkB,MAAbmf,IACJmgB,EAAEsE,SAAW5jC,GAEP3B,MAIR+kC,WAAY,SAAU3gC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJuhB,EAAMjkB,OAAQha,EAAKi+B,EAAMmD,cAIzB,IAAMxjC,KAAQoC,EACb2gC,EAAY/iC,GAAS,CAAE+iC,EAAY/iC,GAAQoC,EAAKpC,IAInD,OAAOhC,MAIRylC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB98B,EAAM,EAAG88B,GACF3lC,OAoBV,GAfAqe,EAASzB,QAASylB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO9tB,GAASK,MAAS,IAC5CtP,QAASy7B,GAAWxsB,GAASguB,SAAW,MAG1ClC,EAAEt/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQs/B,EAAEtkB,QAAUskB,EAAEt/B,KAGzDs/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMz6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB+kB,EAAE2E,YAAsB,CAC5BnB,EAAY7kC,EAAS0C,cAAe,KAKpC,IACCmiC,EAAUjvB,KAAOyrB,EAAEgC,IAInBwB,EAAUjvB,KAAOivB,EAAUjvB,KAC3ByrB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQp5B,GAITw0B,EAAE2E,aAAc,GAalB,GARK3E,EAAExe,MAAQwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,OACxCwe,EAAExe,KAAOzf,EAAOg+B,MAAOC,EAAExe,KAAMwe,EAAEF,cAIlCqB,GAA+B9H,GAAY2G,EAAG77B,EAASi9B,GAGlDvhB,EACJ,OAAOuhB,EA8ER,IAAMlgC,KAzENuiC,EAAc1hC,EAAOwlB,OAASyY,EAAEzhC,SAGQ,GAApBwD,EAAO8/B,UAC1B9/B,EAAOwlB,MAAMU,QAAS,aAIvB+X,EAAEt/B,KAAOs/B,EAAEt/B,KAAKogB,cAGhBkf,EAAE6E,YAAcpE,GAAWj0B,KAAMwzB,EAAEt/B,MAKnC0iC,EAAWpD,EAAEgC,IAAI/8B,QAASq7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAExe,MAAQwe,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKziC,QAAS,uCACjCogC,EAAExe,KAAOwe,EAAExe,KAAKvc,QAASo7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAI3iC,MAAO+jC,EAAS/gC,QAG5B29B,EAAExe,OAAUwe,EAAEmC,aAAiC,iBAAXnC,EAAExe,QAC1C4hB,IAAchE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQpD,EAAExe,YAGjDwe,EAAExe,OAIO,IAAZwe,EAAE/yB,QACNm2B,EAAWA,EAASn+B,QAASs7B,GAAY,MACzCmD,GAAatE,GAAO5yB,KAAM42B,GAAa,IAAM,KAAQ,KAASxiC,GAAMuF,OACnEu9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD/iC,EAAO+/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBriC,EAAO+/B,aAAcsB,IAE9DrhC,EAAOggC,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBriC,EAAOggC,KAAMqB,MAKnDpD,EAAExe,MAAQwe,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBl+B,EAAQk+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBljC,EAAG8+B,EAAE+E,QAAS7jC,IAIvC,GAAK8+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWxlC,KAAMmkC,EAAiBvC,EAAOpB,IAAiBngB,GAG9D,OAAOuhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBtpB,IAAKylB,EAAEhG,UACxBoH,EAAMx5B,KAAMo4B,EAAEiF,SACd7D,EAAMxlB,KAAMokB,EAAE76B,OAGdg+B,EAAYhC,GAA+BR,GAAYX,EAAG77B,EAASi9B,GAK5D,CASN,GARAA,EAAMnhB,WAAa,EAGdwjB,GACJG,EAAmB3b,QAAS,WAAY,CAAEmZ,EAAOpB,IAI7CngB,EACJ,OAAOuhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE5D,UACjBmH,EAAezkC,EAAO+f,WAAY,WACjCuiB,EAAMoD,MAAO,YACXxE,EAAE5D,UAGN,IACCvc,GAAY,EACZsjB,EAAU+B,KAAMnB,EAAgBn8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAM28B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS9/B,EAAOmgC,EAAUC,EACxCd,EAAaU,EAGTtlB,IAILA,GAAY,EAGP0jB,GACJzkC,EAAOu9B,aAAckH,GAKtBJ,OAAYt+B,EAGZw+B,EAAwB0B,GAAW,GAGnC3D,EAAMnhB,WAAsB,EAATskB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI9kC,EAAM+kC,EAAeC,EAC5B3rB,EAAWimB,EAAEjmB,SACbmnB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU9zB,aACEvI,IAAP2gC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM9kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAMg5B,GAAO,CACtDtE,EAAUvwB,QAASjQ,GACnB,MAMH,GAAKwgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMxgC,KAAQ0kC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY/hC,EAAO,IAAMwgC,EAAW,IAAQ,CACrEuE,EAAgB/kC,EAChB,MAEKglC,IACLA,EAAgBhlC,GAKlB+kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUvwB,QAAS80B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IACsC,EAA3CtjC,EAAO6D,QAAS,SAAUo6B,EAAEkB,YAC5Bn/B,EAAO6D,QAAS,OAAQo6B,EAAEkB,WAAc,IACxClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA9iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMp2B,EAAKsK,EAC9ByoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU7hC,QAGzB,GAAK6hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKt/B,eAAkBw5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU9zB,QAGpB,MAAQy4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCtrB,GAAQqrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtCjnB,EAAO6rB,EACPA,EAAU3E,EAAU9zB,QAKnB,GAAiB,MAAZy4B,EAEJA,EAAU7rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS6rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYzoB,EAAO,IAAM6rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA/yB,EAAMk2B,EAAMt/B,MAAO,MACT,KAAQu/B,IAGjBC,EAAOrD,EAAYzoB,EAAO,IAAMtK,EAAK,KACpC+yB,EAAY,KAAO/yB,EAAK,KACb,EAGG,IAATo2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUn2B,EAAK,GACfwxB,EAAUvwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATo2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ95B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAO2gC,EAAOt6B,EAAI,sBAAwBwO,EAAO,OAAS6rB,IASjE,MAAO,CAAE3oB,MAAO,UAAWsE,KAAM8jB,GAidpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCniC,EAAO+/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCniC,EAAOggC,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEt/B,KACxB+jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASpoB,MACtB+nB,EAAUK,EAAS9jB,KAEnB6jB,IADAlgC,EAAQmgC,EAASngC,UAMlBA,EAAQs/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJjoB,EAASmB,YAAaolB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9DhkB,EAASuB,WAAYglB,EAAiB,CAAEvC,EAAOqD,EAAYt/B,IAI5Di8B,EAAM0C,WAAYA,GAClBA,OAAaj/B,EAER4+B,GACJG,EAAmB3b,QAASod,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU9/B,IAIpC0+B,EAAiB/mB,SAAU6mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmB3b,QAAS,eAAgB,CAAEmZ,EAAOpB,MAG3Cj+B,EAAO8/B,QAChB9/B,EAAOwlB,MAAMU,QAAS,cAKzB,OAAOmZ,GAGR8E,QAAS,SAAUlE,EAAKxgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKs/B,EAAKxgB,EAAMte,EAAU,SAGzCijC,UAAW,SAAUnE,EAAK9+B,GACzB,OAAOnB,EAAOW,IAAKs/B,OAAKn9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUsmB,EAAKxgB,EAAMte,EAAUxC,GAUjD,OAPKN,EAAYohB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOmhC,KAAMnhC,EAAOmC,OAAQ,CAClC89B,IAAKA,EACLthC,KAAMgb,EACNulB,SAAUvgC,EACV8gB,KAAMA,EACNyjB,QAAS/hC,GACPnB,EAAO2C,cAAes9B,IAASA,OAIpCjgC,EAAOihC,cAAe,SAAUhD,GAC/B,IAAI9+B,EACJ,IAAMA,KAAK8+B,EAAE+E,QACa,iBAApB7jC,EAAEsF,gBACNw5B,EAAEqC,YAAcrC,EAAE+E,QAAS7jC,IAAO,MAMrCa,EAAOwsB,SAAW,SAAUyT,EAAK79B,EAASlD,GACzC,OAAOc,EAAOmhC,KAAM,CACnBlB,IAAKA,EAGLthC,KAAM,MACNugC,SAAU,SACVh0B,OAAO,EACPm1B,OAAO,EACP7jC,QAAQ,EAKRkkC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBvjC,EAAO0D,WAAY6/B,EAAUnhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBmiC,QAAS,SAAU/X,GAClB,IAAI/H,EAyBJ,OAvBKxnB,KAAM,KACLqB,EAAYkuB,KAChBA,EAAOA,EAAK9uB,KAAMT,KAAM,KAIzBwnB,EAAOxkB,EAAQusB,EAAMvvB,KAAM,GAAIkN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDxF,KAAM,GAAI4C,YACd4kB,EAAK2I,aAAcnwB,KAAM,IAG1BwnB,EAAKpjB,IAAK,WACT,IAAIC,EAAOrE,KAEX,MAAQqE,EAAKkjC,kBACZljC,EAAOA,EAAKkjC,kBAGb,OAAOljC,IACJ4rB,OAAQjwB,OAGNA,MAGRwnC,UAAW,SAAUjY,GACpB,OAAKluB,EAAYkuB,GACTvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOwnC,UAAWjY,EAAK9uB,KAAMT,KAAMmC,MAItCnC,KAAKkE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQhD,MAClBgb,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASssB,QAAS/X,GAGlB9U,EAAKwV,OAAQV,MAKhB/H,KAAM,SAAU+H,GACf,IAAIkY,EAAiBpmC,EAAYkuB,GAEjC,OAAOvvB,KAAKkE,KAAM,SAAU/B,GAC3Ba,EAAQhD,MAAOsnC,QAASG,EAAiBlY,EAAK9uB,KAAMT,KAAMmC,GAAMotB,MAIlEmY,OAAQ,SAAUzkC,GAIjB,OAHAjD,KAAKmU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQhD,MAAOswB,YAAatwB,KAAKwM,cAE3BxM,QAKTgD,EAAO6O,KAAKhI,QAAQ4vB,OAAS,SAAUp1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ89B,QAAStjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ89B,QAAU,SAAUtjC,GACvC,SAAWA,EAAKuuB,aAAevuB,EAAK0vB,cAAgB1vB,EAAKyxB,iBAAiBxyB,SAM3EN,EAAO6/B,aAAa+E,IAAM,WACzB,IACC,OAAO,IAAI7nC,EAAO8nC,eACjB,MAAQp7B,MAGX,IAAIq7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAejlC,EAAO6/B,aAAa+E,MAEpCxmC,EAAQ8mC,OAASD,IAAkB,oBAAqBA,GACxD7mC,EAAQ+iC,KAAO8D,KAAiBA,GAEhCjlC,EAAOkhC,cAAe,SAAU9+B,GAC/B,IAAIjB,EAAUgkC,EAGd,GAAK/mC,EAAQ8mC,MAAQD,KAAiB7iC,EAAQwgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS/K,GACxB,IAAI94B,EACHylC,EAAMxiC,EAAQwiC,MAWf,GATAA,EAAIQ,KACHhjC,EAAQzD,KACRyD,EAAQ69B,IACR79B,EAAQi+B,MACRj+B,EAAQijC,SACRjjC,EAAQmR,UAIJnR,EAAQkjC,UACZ,IAAMnmC,KAAKiD,EAAQkjC,UAClBV,EAAKzlC,GAAMiD,EAAQkjC,UAAWnmC,GAmBhC,IAAMA,KAdDiD,EAAQmgC,UAAYqC,EAAItC,kBAC5BsC,EAAItC,iBAAkBlgC,EAAQmgC,UAQzBngC,EAAQwgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV4B,EAAIvC,iBAAkBljC,EAAG6jC,EAAS7jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAWgkC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAThnC,EACJimC,EAAInC,QACgB,UAAT9jC,EAKgB,iBAAfimC,EAAIpC,OACfvK,EAAU,EAAG,SAEbA,EAGC2M,EAAIpC,OACJoC,EAAIlC,YAINzK,EACC6M,GAAkBF,EAAIpC,SAAYoC,EAAIpC,OACtCoC,EAAIlC,WAK+B,UAAjCkC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAIrB,UACd,CAAEhkC,KAAMqlC,EAAIiB,cACbjB,EAAIxC,4BAQTwC,EAAIW,OAASpkC,IACbgkC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYvkC,EAAU,cAKnC2B,IAAhB8hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAI1mB,YAMRnhB,EAAO+f,WAAY,WACb3b,GACJgkC,OAQLhkC,EAAWA,EAAU,SAErB,IAGCyjC,EAAIzB,KAAM/gC,EAAQ0gC,YAAc1gC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKTg5B,MAAO,WACDthC,GACJA,QAWLnB,EAAOihC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAEjmB,SAAS3Y,QAAS,KAKtBW,EAAO+gC,UAAW,CACjBR,QAAS,CACRlhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETqhC,WAAY,CACX2D,cAAe,SAAU9kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAOihC,cAAe,SAAU,SAAUhD,QACxBn7B,IAAZm7B,EAAE/yB,QACN+yB,EAAE/yB,OAAQ,GAEN+yB,EAAE2E,cACN3E,EAAEt/B,KAAO,SAKXqB,EAAOkhC,cAAe,SAAU,SAAUjD,GAIxC,IAAI5+B,EAAQ8B,EADb,GAAK88B,EAAE2E,aAAe3E,EAAE8H,YAEvB,MAAO,CACN5C,KAAM,SAAUlpB,EAAGge,GAClB54B,EAASW,EAAQ,YACf+O,KAAMkvB,EAAE8H,aAAe,IACvBrmB,KAAM,CAAEsmB,QAAS/H,EAAEgI,cAAernC,IAAKq/B,EAAEgC,MACzC7a,GAAI,aAAcjkB,EAAW,SAAU+kC,GACvC7mC,EAAOub,SACPzZ,EAAW,KACN+kC,GACJjO,EAAuB,UAAbiO,EAAIvnC,KAAmB,IAAM,IAAKunC,EAAIvnC,QAKnD/B,EAAS8C,KAAKC,YAAaN,EAAQ,KAEpCojC,MAAO,WACDthC,GACJA,QAUL,IAqGKshB,GArGD0jB,GAAe,GAClBC,GAAS,oBAGVpmC,EAAO+gC,UAAW,CACjBsF,MAAO,WACPC,cAAe,WACd,IAAInlC,EAAWglC,GAAa7/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADApH,KAAMmE,IAAa,EACZA,KAKTnB,EAAOihC,cAAe,aAAc,SAAUhD,EAAGsI,EAAkBlH,GAElE,IAAImH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ1I,EAAEoI,QAAqBD,GAAO37B,KAAMwzB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAExe,MAE6C,KADnDwe,EAAEqC,aAAe,IACjBziC,QAAS,sCACXuoC,GAAO37B,KAAMwzB,EAAExe,OAAU,QAI5B,GAAKknB,GAAiC,UAArB1I,EAAEkB,UAAW,GA8D7B,OA3DAqH,EAAevI,EAAEqI,cAAgBjoC,EAAY4/B,EAAEqI,eAC9CrI,EAAEqI,gBACFrI,EAAEqI,cAGEK,EACJ1I,EAAG0I,GAAa1I,EAAG0I,GAAWzjC,QAASkjC,GAAQ,KAAOI,IAC/B,IAAZvI,EAAEoI,QACbpI,EAAEgC,MAAS5C,GAAO5yB,KAAMwzB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEoI,MAAQ,IAAMG,GAIjEvI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMgG,GACL1mC,EAAOoD,MAAOojC,EAAe,mBAEvBE,EAAmB,IAI3BzI,EAAEkB,UAAW,GAAM,OAGnBsH,EAAc1pC,EAAQypC,GACtBzpC,EAAQypC,GAAiB,WACxBE,EAAoBplC,WAIrB+9B,EAAMjkB,OAAQ,gBAGQtY,IAAhB2jC,EACJzmC,EAAQjD,GAASu+B,WAAYkL,GAI7BzpC,EAAQypC,GAAiBC,EAIrBxI,EAAGuI,KAGPvI,EAAEqI,cAAgBC,EAAiBD,cAGnCH,GAAavoC,KAAM4oC,IAIfE,GAAqBroC,EAAYooC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc3jC,IAI5B,WAYT1E,EAAQwoC,qBACHnkB,GAAO7lB,EAASiqC,eAAeD,mBAAoB,IAAKnkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS4mC,GAC3C,MAAqB,iBAATrnB,EACJ,IAEgB,kBAAZvf,IACX4mC,EAAc5mC,EACdA,GAAU,GAKLA,IAIA9B,EAAQwoC,qBAMZ/yB,GALA3T,EAAUtD,EAASiqC,eAAeD,mBAAoB,KAKvCtnC,cAAe,SACzBkT,KAAO5V,EAASuV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUtD,GAKZynB,GAAWyiB,GAAe,IAD1BC,EAASzvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAeynC,EAAQ,MAGzCA,EAAS3iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI+lC,EAAOv9B,cAlChC,IAAIqK,EAAMkzB,EAAQ1iB,GAyCnBrkB,EAAOG,GAAGsoB,KAAO,SAAUwX,EAAK+G,EAAQ7lC,GACvC,IAAIlB,EAAUtB,EAAM4kC,EACnB9rB,EAAOza,KACPyoB,EAAMwa,EAAIpiC,QAAS,KAsDpB,OApDY,EAAP4nB,IACJxlB,EAAWk7B,GAAkB8E,EAAI3iC,MAAOmoB,IACxCwa,EAAMA,EAAI3iC,MAAO,EAAGmoB,IAIhBpnB,EAAY2oC,IAGhB7lC,EAAW6lC,EACXA,OAASlkC,GAGEkkC,GAA4B,iBAAXA,IAC5BroC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOmhC,KAAM,CACZlB,IAAKA,EAKLthC,KAAMA,GAAQ,MACdugC,SAAU,OACVzf,KAAMunB,IACHnhC,KAAM,SAAUggC,GAGnBtC,EAAWjiC,UAEXmW,EAAK8U,KAAMtsB,EAIVD,EAAQ,SAAUitB,OAAQjtB,EAAO2X,UAAWkuB,IAAiBr4B,KAAMvN,GAGnE4lC,KAKEzqB,OAAQja,GAAY,SAAUk+B,EAAOmD,GACxC/qB,EAAKvW,KAAM,WACVC,EAASxD,MAAOX,KAAMumC,GAAY,CAAElE,EAAMwG,aAAcrD,EAAQnD,QAK5DriC,MAMRgD,EAAO6O,KAAKhI,QAAQogC,SAAW,SAAU5lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOy5B,OAAQ,SAAUt5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOknC,OAAS,CACfC,UAAW,SAAU9lC,EAAMe,EAASjD,GACnC,IAAIioC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD/X,EAAW1vB,EAAOyhB,IAAKpgB,EAAM,YAC7BqmC,EAAU1nC,EAAQqB,GAClBynB,EAAQ,GAGS,WAAb4G,IACJruB,EAAKkgB,MAAMmO,SAAW,YAGvB8X,EAAYE,EAAQR,SACpBI,EAAYtnC,EAAOyhB,IAAKpgB,EAAM,OAC9BomC,EAAaznC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbquB,GAAwC,UAAbA,KACA,GAA9C4X,EAAYG,GAAa5pC,QAAS,SAMpC0pC,GADAH,EAAcM,EAAQhY,YACD3iB,IACrBs6B,EAAUD,EAAYzS,OAGtB4S,EAASxX,WAAYuX,IAAe,EACpCD,EAAUtX,WAAY0X,IAAgB,GAGlCppC,EAAY+D,KAGhBA,EAAUA,EAAQ3E,KAAM4D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIqlC,KAGjC,MAAfplC,EAAQ2K,MACZ+b,EAAM/b,IAAQ3K,EAAQ2K,IAAMy6B,EAAUz6B,IAAQw6B,GAE1B,MAAhBnlC,EAAQuyB,OACZ7L,EAAM6L,KAASvyB,EAAQuyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWjlC,EACfA,EAAQulC,MAAMlqC,KAAM4D,EAAMynB,GAG1B4e,EAAQjmB,IAAKqH,KAKhB9oB,EAAOG,GAAGgC,OAAQ,CAGjB+kC,OAAQ,SAAU9kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNpF,KACAA,KAAKkE,KAAM,SAAU/B,GACpBa,EAAOknC,OAAOC,UAAWnqC,KAAMoF,EAASjD,KAI3C,IAAIyoC,EAAMC,EACTxmC,EAAOrE,KAAM,GAEd,OAAMqE,EAQAA,EAAKyxB,iBAAiBxyB,QAK5BsnC,EAAOvmC,EAAKozB,wBACZoT,EAAMxmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK66B,EAAK76B,IAAM86B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAEh7B,IAAK,EAAG4nB,KAAM,QATxB,GAuBDjF,SAAU,WACT,GAAM1yB,KAAM,GAAZ,CAIA,IAAIgrC,EAAcd,EAAQhoC,EACzBmC,EAAOrE,KAAM,GACbirC,EAAe,CAAEl7B,IAAK,EAAG4nB,KAAM,GAGhC,GAAwC,UAAnC30B,EAAOyhB,IAAKpgB,EAAM,YAGtB6lC,EAAS7lC,EAAKozB,4BAER,CACNyS,EAASlqC,KAAKkqC,SAIdhoC,EAAMmC,EAAK6I,cACX89B,EAAe3mC,EAAK2mC,cAAgB9oC,EAAIyN,gBACxC,MAAQq7B,IACLA,IAAiB9oC,EAAIujB,MAAQulB,IAAiB9oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKumB,EAAc,YAE1BA,EAAeA,EAAapoC,WAExBooC,GAAgBA,IAAiB3mC,GAAkC,IAA1B2mC,EAAazpC,YAG1D0pC,EAAejoC,EAAQgoC,GAAed,UACzBn6B,KAAO/M,EAAOyhB,IAAKumB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ30B,EAAOyhB,IAAKumB,EAAc,mBAAmB,IAKpE,MAAO,CACNj7B,IAAKm6B,EAAOn6B,IAAMk7B,EAAal7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEszB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO30B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E2mC,aAAc,WACb,OAAOhrC,KAAKoE,IAAK,WAChB,IAAI4mC,EAAehrC,KAAKgrC,aAExB,MAAQA,GAA2D,WAA3ChoC,EAAOyhB,IAAKumB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBr7B,QAM1B3M,EAAOkB,KAAM,CAAE20B,WAAY,cAAeD,UAAW,eAAiB,SAAUjc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQphB,KAAM,SAAUqE,EAAMsY,EAAQva,GAG5C,IAAIyoC,EAOJ,GANKppC,EAAU4C,GACdwmC,EAAMxmC,EACuB,IAAlBA,EAAK9C,WAChBspC,EAAMxmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOyoC,EAAMA,EAAKnoB,GAASre,EAAMsY,GAG7BkuB,EACJA,EAAIK,SACFn7B,EAAY86B,EAAIE,YAAV3oC,EACP2N,EAAM3N,EAAMyoC,EAAIC,aAIjBzmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOizB,SAAUvT,GAASkP,GAAcxwB,EAAQgyB,cAC/C,SAAU/uB,EAAMitB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQhtB,EAAMqe,GAGlBoO,GAAUrjB,KAAM6jB,GACtBtuB,EAAQqB,GAAOquB,WAAYhQ,GAAS,KACpC4O,MAQLtuB,EAAOkB,KAAM,CAAEinC,OAAQ,SAAUC,MAAO,SAAW,SAAU/lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CACZ2zB,QAAS,QAAUxyB,EACnB2W,QAASra,EACT0pC,GAAI,QAAUhmC,GACZ,SAAUimC,EAAcC,GAG1BvoC,EAAOG,GAAIooC,GAAa,SAAU3T,EAAQzwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAYgoC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVzwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQphB,KAAM,SAAUqE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCknC,EAAS1qC,QAAS,SACxBwD,EAAM,QAAUgB,GAChBhB,EAAKzE,SAAS+P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK9C,UACTW,EAAMmC,EAAKsL,gBAIJ3J,KAAKivB,IACX5wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM6zB,GAGxBxyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOquB,IAChC7zB,EAAM0f,EAAYuW,OAAS9xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOnD,KAAKooB,GAAIzmB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB61B,KAAM,SAAU3S,EAAO5F,EAAMtf,GAC5B,OAAOnD,KAAKooB,GAAIC,EAAO,KAAM5F,EAAMtf,IAEpCqoC,OAAQ,SAAUnjB,EAAOllB,GACxB,OAAOnD,KAAKyoB,IAAKJ,EAAO,KAAMllB,IAG/BsoC,SAAU,SAAUxoC,EAAUolB,EAAO5F,EAAMtf,GAC1C,OAAOnD,KAAKooB,GAAIC,EAAOplB,EAAUwf,EAAMtf,IAExCuoC,WAAY,SAAUzoC,EAAUolB,EAAOllB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBtD,KAAKyoB,IAAKxlB,EAAU,MACpBjD,KAAKyoB,IAAKJ,EAAOplB,GAAY,KAAME,IAGrCwoC,MAAO,SAAUC,EAAQC,GACxB,OAAO7rC,KAAKkuB,WAAY0d,GAASzd,WAAY0d,GAASD,MAIxD5oC,EAAOkB,KACN,wLAE4DqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBtD,KAAKooB,GAAI/iB,EAAM,KAAMod,EAAMtf,GAC3BnD,KAAKkpB,QAAS7jB,MAUlB,IAAI2E,GAAQ,qCAMZhH,EAAO8oC,MAAQ,SAAU3oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMs3B,EAUf,GARwB,iBAAZ5oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKAtP,EAAY8B,GAalB,OARAqR,EAAOlU,EAAMG,KAAM6D,UAAW,IAC9BwnC,EAAQ,WACP,OAAO3oC,EAAGxC,MAAOuC,GAAWlD,KAAMwU,EAAK9T,OAAQJ,EAAMG,KAAM6D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElC0kC,GAGR9oC,EAAO+oC,UAAY,SAAUC,GACvBA,EACJhpC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOipC,UAAYhpB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO3B,WAAaA,EACpB2B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOmpB,IAAMzjB,KAAKyjB,IAElBnpB,EAAOkpC,UAAY,SAAU5qC,GAK5B,IAAIK,EAAOqB,EAAOrB,KAAML,GACxB,OAAkB,WAATK,GAA8B,WAATA,KAK5BwqC,MAAO7qC,EAAMyxB,WAAYzxB,KAG5B0B,EAAOopC,KAAO,SAAU7pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXqiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOrpC,IAOT,IAGCupC,GAAUxsC,EAAOiD,OAGjBwpC,GAAKzsC,EAAO0sC,EAwBb,OAtBAzpC,EAAO0pC,WAAa,SAAUhnC,GAS7B,OARK3F,EAAO0sC,IAAMzpC,IACjBjD,EAAO0sC,EAAID,IAGP9mC,GAAQ3F,EAAOiD,SAAWA,IAC9BjD,EAAOiD,OAASupC,IAGVvpC,GAMiB,oBAAb/C,IACXF,EAAOiD,OAASjD,EAAO0sC,EAAIzpC,GAMrBA","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs b/src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs
index d3532bd49d..699fdef951 100644
--- a/src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs
+++ b/src/Security/samples/CustomPolicyProvider/Controllers/AccountController.cs
@@ -1,10 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
+using System.Globalization;
using System.Security.Claims;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
@@ -20,7 +18,7 @@ public class AccountController : Controller
}
[HttpPost]
- public async Task<IActionResult> Signin(string userName, DateTime? birthDate, string returnUrl = null)
+ public async Task<IActionResult> Signin(string userName, string birthDate = null, string returnUrl = null)
{
if (string.IsNullOrEmpty(userName))
{
@@ -31,9 +29,9 @@ public class AccountController : Controller
var claims = new List<Claim>();
// Add a Name claim and, if birth date was provided, a DateOfBirth claim
claims.Add(new Claim(ClaimTypes.Name, userName));
- if (birthDate.HasValue)
+ if (DateTime.TryParse(birthDate, CultureInfo.InvariantCulture, out _))
{
- claims.Add(new Claim(ClaimTypes.DateOfBirth, birthDate.Value.ToShortDateString()));
+ claims.Add(new Claim(ClaimTypes.DateOfBirth, birthDate));
}
// Create user's identity and sign them in
diff --git a/src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml b/src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml
index 6aaad6adbe..46c52e45f8 100644
--- a/src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml
+++ b/src/Security/samples/DynamicSchemes/Pages/_Layout.cshtml
@@ -51,11 +51,11 @@
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.6.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
diff --git a/src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml b/src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml
index a2b13b317f..a95baa7d6e 100644
--- a/src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml
+++ b/src/Security/samples/DynamicSchemes/Pages/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
index ccf48121dc..343e1b970a 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
@@ -1,6 +1,6 @@
{
"name": "jquery-validation-unobtrusive",
- "version": "3.2.6",
+ "version": "4.0.0",
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive",
"description": "Add-on to jQuery Validation to enable unobtrusive validation options in data-* attributes.",
"main": [
@@ -23,7 +23,7 @@
"authors": [
"Microsoft"
],
- "license": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/aspnet/jquery-validation-unobtrusive.git"
@@ -32,13 +32,13 @@
"jquery-validation": ">=1.8",
"jquery": ">=1.8"
},
- "_release": "3.2.6",
+ "_release": "4.0.0",
"_resolution": {
"type": "version",
- "tag": "v3.2.6",
- "commit": "13386cd1b5947d8a5d23a12b531ce3960be1eba7"
+ "tag": "v4.0.0",
+ "commit": "a5b50566f8b839177bc7733d67be3a37bca400ff"
},
"_source": "git://github.com/aspnet/jquery-validation-unobtrusive.git",
- "_target": "3.2.6",
+ "_target": "4.0.0",
"_originalSource": "jquery-validation-unobtrusive"
} \ No newline at end of file
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 1b0de12496..009306070a 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,12 +1,26 @@
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
-(function ($) {
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // CommonJS-like environments that support module.exports
+ module.exports = factory(require('jquery-validation'));
+ } else {
+ // Browser global
+ jQuery.validator.unobtrusive = factory(jQuery);
+ }
+}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@@ -107,7 +121,7 @@
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
+ .removeData("unobtrusiveContainer");
}
function validationInfo(form) {
@@ -118,7 +132,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
- }
+ };
if (!result) {
result = {
@@ -223,10 +237,10 @@
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
+ .addBack()
+ .filter("form")
+ .add($selector.find("form"))
+ .has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
@@ -409,8 +423,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
+ adapters.add("fileextensions", ["extensions"], function (options) {
+ setValidationValues(options, "extension", options.params.extensions);
+ });
$(function () {
$jQval.unobtrusive.parse(document);
});
-}(jQuery)); \ No newline at end of file
+
+ return $jQval.unobtrusive;
+}));
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json
index e3218a820e..cc09fc942f 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/.bower.json
@@ -12,14 +12,15 @@
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
- "version": "3.5.1",
- "_release": "3.5.1",
+ "version": "3.6.0",
+ "_release": "3.6.0",
"_resolution": {
"type": "version",
- "tag": "3.5.1",
- "commit": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215"
+ "tag": "3.6.0",
+ "commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
- "_source": "git://github.com/jquery/jquery-dist.git",
- "_target": "3.5.1",
- "_originalSource": "jquery"
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "^3.6.0",
+ "_originalSource": "jquery",
+ "_direct": true
} \ No newline at end of file
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt
index 5312a4c864..599bdf2c72 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Security/samples/DynamicSchemes/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs
index 0f9a6ca886..61bce742f0 100644
--- a/src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs
+++ b/src/Security/samples/Identity.ExternalClaims/Pages/Account/Register.cshtml.cs
@@ -19,13 +19,13 @@ public class RegisterModel : PageModel
{
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly UserManager<ApplicationUser> _userManager;
- private readonly ILogger<LoginModel> _logger;
+ private readonly ILogger<RegisterModel> _logger;
private readonly IEmailSender _emailSender;
public RegisterModel(
UserManager<ApplicationUser> userManager,
SignInManager<ApplicationUser> signInManager,
- ILogger<LoginModel> logger,
+ ILogger<RegisterModel> logger,
IEmailSender emailSender)
{
_userManager = userManager;
diff --git a/src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml
index e56f60432f..97272e03ec 100644
--- a/src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml
+++ b/src/Security/samples/Identity.ExternalClaims/Pages/_Layout.cshtml
@@ -52,11 +52,11 @@
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.6.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
diff --git a/src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml b/src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml
index a2b13b317f..a95baa7d6e 100644
--- a/src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml
+++ b/src/Security/samples/Identity.ExternalClaims/Pages/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
index ccf48121dc..343e1b970a 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
@@ -1,6 +1,6 @@
{
"name": "jquery-validation-unobtrusive",
- "version": "3.2.6",
+ "version": "4.0.0",
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive",
"description": "Add-on to jQuery Validation to enable unobtrusive validation options in data-* attributes.",
"main": [
@@ -23,7 +23,7 @@
"authors": [
"Microsoft"
],
- "license": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/aspnet/jquery-validation-unobtrusive.git"
@@ -32,13 +32,13 @@
"jquery-validation": ">=1.8",
"jquery": ">=1.8"
},
- "_release": "3.2.6",
+ "_release": "4.0.0",
"_resolution": {
"type": "version",
- "tag": "v3.2.6",
- "commit": "13386cd1b5947d8a5d23a12b531ce3960be1eba7"
+ "tag": "v4.0.0",
+ "commit": "a5b50566f8b839177bc7733d67be3a37bca400ff"
},
"_source": "git://github.com/aspnet/jquery-validation-unobtrusive.git",
- "_target": "3.2.6",
+ "_target": "4.0.0",
"_originalSource": "jquery-validation-unobtrusive"
} \ No newline at end of file
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 1b0de12496..009306070a 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,12 +1,26 @@
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
-(function ($) {
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // CommonJS-like environments that support module.exports
+ module.exports = factory(require('jquery-validation'));
+ } else {
+ // Browser global
+ jQuery.validator.unobtrusive = factory(jQuery);
+ }
+}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@@ -107,7 +121,7 @@
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
+ .removeData("unobtrusiveContainer");
}
function validationInfo(form) {
@@ -118,7 +132,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
- }
+ };
if (!result) {
result = {
@@ -223,10 +237,10 @@
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
+ .addBack()
+ .filter("form")
+ .add($selector.find("form"))
+ .has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
@@ -409,8 +423,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
+ adapters.add("fileextensions", ["extensions"], function (options) {
+ setValidationValues(options, "extension", options.params.extensions);
+ });
$(function () {
$jQval.unobtrusive.parse(document);
});
-}(jQuery)); \ No newline at end of file
+
+ return $jQval.unobtrusive;
+}));
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json
index e3218a820e..cc09fc942f 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/.bower.json
@@ -12,14 +12,15 @@
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
- "version": "3.5.1",
- "_release": "3.5.1",
+ "version": "3.6.0",
+ "_release": "3.6.0",
"_resolution": {
"type": "version",
- "tag": "3.5.1",
- "commit": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215"
+ "tag": "3.6.0",
+ "commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
- "_source": "git://github.com/jquery/jquery-dist.git",
- "_target": "3.5.1",
- "_originalSource": "jquery"
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "^3.6.0",
+ "_originalSource": "jquery",
+ "_direct": true
} \ No newline at end of file
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt
index 5312a4c864..599bdf2c72 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Security/samples/Identity.ExternalClaims/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml b/src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml
index 4707c61599..871cd4b119 100644
--- a/src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml
+++ b/src/Security/samples/PathSchemeSelection/Views/Shared/_Layout.cshtml
@@ -54,11 +54,11 @@
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.6.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
diff --git a/src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml
index a2b13b317f..a95baa7d6e 100644
--- a/src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml
+++ b/src/Security/samples/PathSchemeSelection/Views/Shared/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Security/samples/PathSchemeSelection/bower.json b/src/Security/samples/PathSchemeSelection/bower.json
index bf55590ec5..81dc40ca32 100644
--- a/src/Security/samples/PathSchemeSelection/bower.json
+++ b/src/Security/samples/PathSchemeSelection/bower.json
@@ -3,8 +3,8 @@
"private": true,
"dependencies": {
"bootstrap": "3.4.0",
- "jquery": "3.5.1",
+ "jquery": "3.6.0",
"jquery-validation": "1.14.0",
- "jquery-validation-unobtrusive": "3.2.6"
+ "jquery-validation-unobtrusive": "4.0.0"
}
}
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
index ccf48121dc..343e1b970a 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
@@ -1,6 +1,6 @@
{
"name": "jquery-validation-unobtrusive",
- "version": "3.2.6",
+ "version": "4.0.0",
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive",
"description": "Add-on to jQuery Validation to enable unobtrusive validation options in data-* attributes.",
"main": [
@@ -23,7 +23,7 @@
"authors": [
"Microsoft"
],
- "license": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/aspnet/jquery-validation-unobtrusive.git"
@@ -32,13 +32,13 @@
"jquery-validation": ">=1.8",
"jquery": ">=1.8"
},
- "_release": "3.2.6",
+ "_release": "4.0.0",
"_resolution": {
"type": "version",
- "tag": "v3.2.6",
- "commit": "13386cd1b5947d8a5d23a12b531ce3960be1eba7"
+ "tag": "v4.0.0",
+ "commit": "a5b50566f8b839177bc7733d67be3a37bca400ff"
},
"_source": "git://github.com/aspnet/jquery-validation-unobtrusive.git",
- "_target": "3.2.6",
+ "_target": "4.0.0",
"_originalSource": "jquery-validation-unobtrusive"
} \ No newline at end of file
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 1b0de12496..009306070a 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,12 +1,26 @@
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
-(function ($) {
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // CommonJS-like environments that support module.exports
+ module.exports = factory(require('jquery-validation'));
+ } else {
+ // Browser global
+ jQuery.validator.unobtrusive = factory(jQuery);
+ }
+}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@@ -107,7 +121,7 @@
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
+ .removeData("unobtrusiveContainer");
}
function validationInfo(form) {
@@ -118,7 +132,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
- }
+ };
if (!result) {
result = {
@@ -223,10 +237,10 @@
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
+ .addBack()
+ .filter("form")
+ .add($selector.find("form"))
+ .has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
@@ -409,8 +423,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
+ adapters.add("fileextensions", ["extensions"], function (options) {
+ setValidationValues(options, "extension", options.params.extensions);
+ });
$(function () {
$jQval.unobtrusive.parse(document);
});
-}(jQuery)); \ No newline at end of file
+
+ return $jQval.unobtrusive;
+}));
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json
index e3218a820e..cc09fc942f 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/.bower.json
@@ -12,14 +12,15 @@
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
- "version": "3.5.1",
- "_release": "3.5.1",
+ "version": "3.6.0",
+ "_release": "3.6.0",
"_resolution": {
"type": "version",
- "tag": "3.5.1",
- "commit": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215"
+ "tag": "3.6.0",
+ "commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
- "_source": "git://github.com/jquery/jquery-dist.git",
- "_target": "3.5.1",
- "_originalSource": "jquery"
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "^3.6.0",
+ "_originalSource": "jquery",
+ "_direct": true
} \ No newline at end of file
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt
index 5312a4c864..599bdf2c72 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Security/samples/PathSchemeSelection/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":";CAaA,SAAYA,EAAQC,GAEnB,aAEuB,iBAAXC,QAAiD,iBAAnBA,OAAOC,QAShDD,OAAOC,QAAUH,EAAOI,SACvBH,EAASD,GAAQ,GACjB,SAAUK,GACT,IAAMA,EAAED,SACP,MAAM,IAAIE,MAAO,4CAElB,OAAOL,EAASI,IAGlBJ,EAASD,GAtBX,CA0BuB,oBAAXO,OAAyBA,OAASC,KAAM,SAAUD,EAAQE,GAMtE,aAEA,IAAIC,EAAM,GAENC,EAAWC,OAAOC,eAElBC,EAAQJ,EAAII,MAEZC,EAAOL,EAAIK,KAAO,SAAUC,GAC/B,OAAON,EAAIK,KAAKE,KAAMD,IACnB,SAAUA,GACb,OAAON,EAAIQ,OAAOC,MAAO,GAAIH,IAI1BI,EAAOV,EAAIU,KAEXC,EAAUX,EAAIW,QAEdC,EAAa,GAEbC,EAAWD,EAAWC,SAEtBC,EAASF,EAAWG,eAEpBC,EAAaF,EAAOD,SAEpBI,EAAuBD,EAAWT,KAAML,QAExCgB,EAAU,GAEVC,EAAa,SAAqBC,GAMhC,MAAsB,mBAARA,GAA8C,iBAAjBA,EAAIC,UAIjDC,EAAW,SAAmBF,GAChC,OAAc,MAAPA,GAAeA,IAAQA,EAAIvB,QAIhCH,EAAWG,EAAOH,SAIjB6B,EAA4B,CAC/BC,MAAM,EACNC,KAAK,EACLC,OAAO,EACPC,UAAU,GAGX,SAASC,EAASC,EAAMC,EAAMC,GAG7B,IAAIC,EAAGC,EACNC,GAHDH,EAAMA,GAAOrC,GAGCyC,cAAe,UAG7B,GADAD,EAAOE,KAAOP,EACTC,EACJ,IAAME,KAAKT,GAYVU,EAAMH,EAAME,IAAOF,EAAKO,cAAgBP,EAAKO,aAAcL,KAE1DE,EAAOI,aAAcN,EAAGC,GAI3BF,EAAIQ,KAAKC,YAAaN,GAASO,WAAWC,YAAaR,GAIzD,SAASS,EAAQvB,GAChB,OAAY,MAAPA,EACGA,EAAM,GAIQ,iBAARA,GAAmC,mBAARA,EACxCR,EAAYC,EAASN,KAAMa,KAAW,gBAC/BA,EAQT,IACCwB,EAAU,QAGVC,EAAS,SAAUC,EAAUC,GAI5B,OAAO,IAAIF,EAAOG,GAAGC,KAAMH,EAAUC,IA0VvC,SAASG,EAAa9B,GAMrB,IAAI+B,IAAW/B,GAAO,WAAYA,GAAOA,EAAI+B,OAC5C3B,EAAOmB,EAAQvB,GAEhB,OAAKD,EAAYC,KAASE,EAAUF,KAIpB,UAATI,GAA+B,IAAX2B,GACR,iBAAXA,GAAgC,EAATA,GAAgBA,EAAS,KAAO/B,GArWhEyB,EAAOG,GAAKH,EAAOO,UAAY,CAG9BC,OAAQT,EAERU,YAAaT,EAGbM,OAAQ,EAERI,QAAS,WACR,OAAOnD,EAAMG,KAAMT,OAKpB0D,IAAK,SAAUC,GAGd,OAAY,MAAPA,EACGrD,EAAMG,KAAMT,MAIb2D,EAAM,EAAI3D,KAAM2D,EAAM3D,KAAKqD,QAAWrD,KAAM2D,IAKpDC,UAAW,SAAUC,GAGpB,IAAIC,EAAMf,EAAOgB,MAAO/D,KAAKwD,cAAeK,GAM5C,OAHAC,EAAIE,WAAahE,KAGV8D,GAIRG,KAAM,SAAUC,GACf,OAAOnB,EAAOkB,KAAMjE,KAAMkE,IAG3BC,IAAK,SAAUD,GACd,OAAOlE,KAAK4D,UAAWb,EAAOoB,IAAKnE,KAAM,SAAUoE,EAAMlC,GACxD,OAAOgC,EAASzD,KAAM2D,EAAMlC,EAAGkC,OAIjC9D,MAAO,WACN,OAAON,KAAK4D,UAAWtD,EAAMK,MAAOX,KAAMqE,aAG3CC,MAAO,WACN,OAAOtE,KAAKuE,GAAI,IAGjBC,KAAM,WACL,OAAOxE,KAAKuE,IAAK,IAGlBE,KAAM,WACL,OAAOzE,KAAK4D,UAAWb,EAAO2B,KAAM1E,KAAM,SAAU2E,EAAOzC,GAC1D,OAASA,EAAI,GAAM,MAIrB0C,IAAK,WACJ,OAAO5E,KAAK4D,UAAWb,EAAO2B,KAAM1E,KAAM,SAAU2E,EAAOzC,GAC1D,OAAOA,EAAI,MAIbqC,GAAI,SAAUrC,GACb,IAAI2C,EAAM7E,KAAKqD,OACdyB,GAAK5C,GAAMA,EAAI,EAAI2C,EAAM,GAC1B,OAAO7E,KAAK4D,UAAgB,GAALkB,GAAUA,EAAID,EAAM,CAAE7E,KAAM8E,IAAQ,KAG5DC,IAAK,WACJ,OAAO/E,KAAKgE,YAAchE,KAAKwD,eAKhC5C,KAAMA,EACNoE,KAAM9E,EAAI8E,KACVC,OAAQ/E,EAAI+E,QAGblC,EAAOmC,OAASnC,EAAOG,GAAGgC,OAAS,WAClC,IAAIC,EAASC,EAAMzD,EAAK0D,EAAMC,EAAaC,EAC1CC,EAASnB,UAAW,IAAO,GAC3BnC,EAAI,EACJmB,EAASgB,UAAUhB,OACnBoC,GAAO,EAsBR,IAnBuB,kBAAXD,IACXC,EAAOD,EAGPA,EAASnB,UAAWnC,IAAO,GAC3BA,KAIsB,iBAAXsD,GAAwBnE,EAAYmE,KAC/CA,EAAS,IAILtD,IAAMmB,IACVmC,EAASxF,KACTkC,KAGOA,EAAImB,EAAQnB,IAGnB,GAAqC,OAA9BiD,EAAUd,UAAWnC,IAG3B,IAAMkD,KAAQD,EACbE,EAAOF,EAASC,GAIF,cAATA,GAAwBI,IAAWH,IAKnCI,GAAQJ,IAAUtC,EAAO2C,cAAeL,KAC1CC,EAAcK,MAAMC,QAASP,MAC/B1D,EAAM6D,EAAQJ,GAIbG,EADID,IAAgBK,MAAMC,QAASjE,GAC3B,GACI2D,GAAgBvC,EAAO2C,cAAe/D,GAG1CA,EAFA,GAIT2D,GAAc,EAGdE,EAAQJ,GAASrC,EAAOmC,OAAQO,EAAMF,EAAOF,SAGzBQ,IAATR,IACXG,EAAQJ,GAASC,IAOrB,OAAOG,GAGRzC,EAAOmC,OAAQ,CAGdY,QAAS,UAAahD,EAAUiD,KAAKC,UAAWC,QAAS,MAAO,IAGhEC,SAAS,EAETC,MAAO,SAAUC,GAChB,MAAM,IAAItG,MAAOsG,IAGlBC,KAAM,aAENX,cAAe,SAAUpE,GACxB,IAAIgF,EAAOC,EAIX,SAAMjF,GAAgC,oBAAzBP,EAASN,KAAMa,QAI5BgF,EAAQnG,EAAUmB,KASK,mBADvBiF,EAAOvF,EAAOP,KAAM6F,EAAO,gBAAmBA,EAAM9C,cACftC,EAAWT,KAAM8F,KAAWpF,IAGlEqF,cAAe,SAAUlF,GACxB,IAAI8D,EAEJ,IAAMA,KAAQ9D,EACb,OAAO,EAER,OAAO,GAKRmF,WAAY,SAAU1E,EAAMoD,EAASlD,GACpCH,EAASC,EAAM,CAAEH,MAAOuD,GAAWA,EAAQvD,OAASK,IAGrDgC,KAAM,SAAU3C,EAAK4C,GACpB,IAAIb,EAAQnB,EAAI,EAEhB,GAAKkB,EAAa9B,IAEjB,IADA+B,EAAS/B,EAAI+B,OACLnB,EAAImB,EAAQnB,IACnB,IAAgD,IAA3CgC,EAASzD,KAAMa,EAAKY,GAAKA,EAAGZ,EAAKY,IACrC,WAIF,IAAMA,KAAKZ,EACV,IAAgD,IAA3C4C,EAASzD,KAAMa,EAAKY,GAAKA,EAAGZ,EAAKY,IACrC,MAKH,OAAOZ,GAIRoF,UAAW,SAAUxG,EAAKyG,GACzB,IAAI7C,EAAM6C,GAAW,GAarB,OAXY,MAAPzG,IACCkD,EAAahD,OAAQF,IACzB6C,EAAOgB,MAAOD,EACE,iBAAR5D,EACP,CAAEA,GAAQA,GAGXU,EAAKH,KAAMqD,EAAK5D,IAIX4D,GAGR8C,QAAS,SAAUxC,EAAMlE,EAAKgC,GAC7B,OAAc,MAAPhC,GAAe,EAAIW,EAAQJ,KAAMP,EAAKkE,EAAMlC,IAKpD6B,MAAO,SAAUO,EAAOuC,GAKvB,IAJA,IAAIhC,GAAOgC,EAAOxD,OACjByB,EAAI,EACJ5C,EAAIoC,EAAMjB,OAEHyB,EAAID,EAAKC,IAChBR,EAAOpC,KAAQ2E,EAAQ/B,GAKxB,OAFAR,EAAMjB,OAASnB,EAERoC,GAGRI,KAAM,SAAUb,EAAOK,EAAU4C,GAShC,IARA,IACCC,EAAU,GACV7E,EAAI,EACJmB,EAASQ,EAAMR,OACf2D,GAAkBF,EAIX5E,EAAImB,EAAQnB,KACAgC,EAAUL,EAAO3B,GAAKA,KAChB8E,GACxBD,EAAQnG,KAAMiD,EAAO3B,IAIvB,OAAO6E,GAIR5C,IAAK,SAAUN,EAAOK,EAAU+C,GAC/B,IAAI5D,EAAQ6D,EACXhF,EAAI,EACJ4B,EAAM,GAGP,GAAKV,EAAaS,GAEjB,IADAR,EAASQ,EAAMR,OACPnB,EAAImB,EAAQnB,IAGL,OAFdgF,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAIlD,KAAMsG,QAMZ,IAAMhF,KAAK2B,EAGI,OAFdqD,EAAQhD,EAAUL,EAAO3B,GAAKA,EAAG+E,KAGhCnD,EAAIlD,KAAMsG,GAMb,OAAO3G,EAAMuD,IAIdqD,KAAM,EAIN/F,QAASA,IAGa,mBAAXgG,SACXrE,EAAOG,GAAIkE,OAAOC,UAAanH,EAAKkH,OAAOC,WAI5CtE,EAAOkB,KAAM,uEAAuEqD,MAAO,KAC3F,SAAUC,EAAInC,GACbtE,EAAY,WAAasE,EAAO,KAAQA,EAAKoC,gBAmB9C,IAAIC,EAWJ,SAAY1H,GACZ,IAAImC,EACHd,EACAsG,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACAvI,EACAwI,EACAC,EACAC,EACAC,EACAxB,EACAyB,EAGA1C,EAAU,SAAW,EAAI,IAAI2C,KAC7BC,EAAe3I,EAAOH,SACtB+I,EAAU,EACVC,EAAO,EACPC,EAAaC,KACbC,EAAaD,KACbE,EAAgBF,KAChBG,EAAyBH,KACzBI,EAAY,SAAUC,EAAGC,GAIxB,OAHKD,IAAMC,IACVlB,GAAe,GAET,GAIRlH,EAAS,GAAOC,eAChBf,EAAM,GACNmJ,EAAMnJ,EAAImJ,IACVC,EAAapJ,EAAIU,KACjBA,EAAOV,EAAIU,KACXN,EAAQJ,EAAII,MAIZO,EAAU,SAAU0I,EAAMnF,GAGzB,IAFA,IAAIlC,EAAI,EACP2C,EAAM0E,EAAKlG,OACJnB,EAAI2C,EAAK3C,IAChB,GAAKqH,EAAMrH,KAAQkC,EAClB,OAAOlC,EAGT,OAAQ,GAGTsH,EAAW,6HAMXC,EAAa,sBAGbC,EAAa,0BAA4BD,EACxC,0CAGDE,EAAa,MAAQF,EAAa,KAAOC,EAAa,OAASD,EAG9D,gBAAkBA,EAIlB,2DAA6DC,EAAa,OAC1ED,EAAa,OAEdG,EAAU,KAAOF,EAAa,wFAOAC,EAAa,eAO3CE,EAAc,IAAIC,OAAQL,EAAa,IAAK,KAC5CM,EAAQ,IAAID,OAAQ,IAAML,EAAa,8BACtCA,EAAa,KAAM,KAEpBO,EAAS,IAAIF,OAAQ,IAAML,EAAa,KAAOA,EAAa,KAC5DQ,EAAe,IAAIH,OAAQ,IAAML,EAAa,WAAaA,EAAa,IAAMA,EAC7E,KACDS,EAAW,IAAIJ,OAAQL,EAAa,MAEpCU,EAAU,IAAIL,OAAQF,GACtBQ,EAAc,IAAIN,OAAQ,IAAMJ,EAAa,KAE7CW,EAAY,CACXC,GAAM,IAAIR,OAAQ,MAAQJ,EAAa,KACvCa,MAAS,IAAIT,OAAQ,QAAUJ,EAAa,KAC5Cc,IAAO,IAAIV,OAAQ,KAAOJ,EAAa,SACvCe,KAAQ,IAAIX,OAAQ,IAAMH,GAC1Be,OAAU,IAAIZ,OAAQ,IAAMF,GAC5Be,MAAS,IAAIb,OAAQ,yDACpBL,EAAa,+BAAiCA,EAAa,cAC3DA,EAAa,aAAeA,EAAa,SAAU,KACpDmB,KAAQ,IAAId,OAAQ,OAASN,EAAW,KAAM,KAI9CqB,aAAgB,IAAIf,OAAQ,IAAML,EACjC,mDAAqDA,EACrD,mBAAqBA,EAAa,mBAAoB,MAGxDqB,EAAQ,SACRC,EAAU,sCACVC,EAAU,SAEVC,EAAU,yBAGVC,EAAa,mCAEbC,GAAW,OAIXC,GAAY,IAAItB,OAAQ,uBAAyBL,EAAa,uBAAwB,KACtF4B,GAAY,SAAUC,EAAQC,GAC7B,IAAIC,EAAO,KAAOF,EAAOhL,MAAO,GAAM,MAEtC,OAAOiL,IASNC,EAAO,EACNC,OAAOC,aAAcF,EAAO,OAC5BC,OAAOC,aAAcF,GAAQ,GAAK,MAAe,KAAPA,EAAe,SAK5DG,GAAa,sDACbC,GAAa,SAAUC,EAAIC,GAC1B,OAAKA,EAGQ,OAAPD,EACG,SAIDA,EAAGvL,MAAO,GAAI,GAAM,KAC1BuL,EAAGE,WAAYF,EAAGxI,OAAS,GAAItC,SAAU,IAAO,IAI3C,KAAO8K,GAOfG,GAAgB,WACf7D,KAGD8D,GAAqBC,GACpB,SAAU9H,GACT,OAAyB,IAAlBA,EAAK+H,UAAqD,aAAhC/H,EAAKgI,SAAS5E,eAEhD,CAAE6E,IAAK,aAAcC,KAAM,WAI7B,IACC1L,EAAKD,MACFT,EAAMI,EAAMG,KAAMiI,EAAa6D,YACjC7D,EAAa6D,YAMdrM,EAAKwI,EAAa6D,WAAWlJ,QAAS9B,SACrC,MAAQiL,GACT5L,EAAO,CAAED,MAAOT,EAAImD,OAGnB,SAAUmC,EAAQiH,GACjBnD,EAAW3I,MAAO6E,EAAQlF,EAAMG,KAAMgM,KAKvC,SAAUjH,EAAQiH,GACjB,IAAI3H,EAAIU,EAAOnC,OACdnB,EAAI,EAGL,MAAUsD,EAAQV,KAAQ2H,EAAKvK,MAC/BsD,EAAOnC,OAASyB,EAAI,IAKvB,SAAS2C,GAAQzE,EAAUC,EAAS0D,EAAS+F,GAC5C,IAAIC,EAAGzK,EAAGkC,EAAMwI,EAAKC,EAAOC,EAAQC,EACnCC,EAAa/J,GAAWA,EAAQgK,cAGhC1L,EAAW0B,EAAUA,EAAQ1B,SAAW,EAKzC,GAHAoF,EAAUA,GAAW,GAGI,iBAAb3D,IAA0BA,GACxB,IAAbzB,GAA+B,IAAbA,GAA+B,KAAbA,EAEpC,OAAOoF,EAIR,IAAM+F,IACLvE,EAAalF,GACbA,EAAUA,GAAWrD,EAEhByI,GAAiB,CAIrB,GAAkB,KAAb9G,IAAqBsL,EAAQ3B,EAAWgC,KAAMlK,IAGlD,GAAO2J,EAAIE,EAAO,IAGjB,GAAkB,IAAbtL,EAAiB,CACrB,KAAO6C,EAAOnB,EAAQkK,eAAgBR,IAUrC,OAAOhG,EALP,GAAKvC,EAAKgJ,KAAOT,EAEhB,OADAhG,EAAQ/F,KAAMwD,GACPuC,OAYT,GAAKqG,IAAgB5I,EAAO4I,EAAWG,eAAgBR,KACtDnE,EAAUvF,EAASmB,IACnBA,EAAKgJ,KAAOT,EAGZ,OADAhG,EAAQ/F,KAAMwD,GACPuC,MAKH,CAAA,GAAKkG,EAAO,GAElB,OADAjM,EAAKD,MAAOgG,EAAS1D,EAAQoK,qBAAsBrK,IAC5C2D,EAGD,IAAOgG,EAAIE,EAAO,KAASzL,EAAQkM,wBACzCrK,EAAQqK,uBAGR,OADA1M,EAAKD,MAAOgG,EAAS1D,EAAQqK,uBAAwBX,IAC9ChG,EAKT,GAAKvF,EAAQmM,MACXtE,EAAwBjG,EAAW,QACjCsF,IAAcA,EAAUkF,KAAMxK,MAIlB,IAAbzB,GAAqD,WAAnC0B,EAAQmJ,SAAS5E,eAA+B,CAYpE,GAVAuF,EAAc/J,EACdgK,EAAa/J,EASK,IAAb1B,IACF2I,EAASsD,KAAMxK,IAAciH,EAAauD,KAAMxK,IAAe,EAGjEgK,EAAa7B,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAC9DM,KAImBA,GAAY7B,EAAQsM,SAGhCd,EAAM3J,EAAQV,aAAc,OAClCqK,EAAMA,EAAI3G,QAAS0F,GAAYC,IAE/B3I,EAAQT,aAAc,KAAQoK,EAAM9G,IAMtC5D,GADA4K,EAASjF,EAAU7E,IACRK,OACX,MAAQnB,IACP4K,EAAQ5K,IAAQ0K,EAAM,IAAMA,EAAM,UAAa,IAC9Ce,GAAYb,EAAQ5K,IAEtB6K,EAAcD,EAAOc,KAAM,KAG5B,IAIC,OAHAhN,EAAKD,MAAOgG,EACXqG,EAAWa,iBAAkBd,IAEvBpG,EACN,MAAQmH,GACT7E,EAAwBjG,GAAU,GACjC,QACI4J,IAAQ9G,GACZ7C,EAAQ8K,gBAAiB,QAQ9B,OAAOhG,EAAQ/E,EAASiD,QAAS8D,EAAO,MAAQ9G,EAAS0D,EAAS+F,GASnE,SAAS5D,KACR,IAAIkF,EAAO,GAYX,OAVA,SAASC,EAAOC,EAAKhH,GAQpB,OALK8G,EAAKpN,KAAMsN,EAAM,KAAQxG,EAAKyG,oBAG3BF,EAAOD,EAAKI,SAEXH,EAAOC,EAAM,KAAQhH,GAShC,SAASmH,GAAcnL,GAEtB,OADAA,EAAI4C,IAAY,EACT5C,EAOR,SAASoL,GAAQpL,GAChB,IAAIqL,EAAK3O,EAASyC,cAAe,YAEjC,IACC,QAASa,EAAIqL,GACZ,MAAQ/B,GACT,OAAO,EACN,QAGI+B,EAAG5L,YACP4L,EAAG5L,WAAWC,YAAa2L,GAI5BA,EAAK,MASP,SAASC,GAAWC,EAAOC,GAC1B,IAAIxO,EAAMuO,EAAMnH,MAAO,KACtBpF,EAAIhC,EAAImD,OAET,MAAQnB,IACPwF,EAAKiH,WAAYzO,EAAKgC,IAAQwM,EAUhC,SAASE,GAAczF,EAAGC,GACzB,IAAIyF,EAAMzF,GAAKD,EACd2F,EAAOD,GAAsB,IAAf1F,EAAE5H,UAAiC,IAAf6H,EAAE7H,UACnC4H,EAAE4F,YAAc3F,EAAE2F,YAGpB,GAAKD,EACJ,OAAOA,EAIR,GAAKD,EACJ,MAAUA,EAAMA,EAAIG,YACnB,GAAKH,IAAQzF,EACZ,OAAQ,EAKX,OAAOD,EAAI,GAAK,EAOjB,SAAS8F,GAAmBvN,GAC3B,OAAO,SAAU0C,GAEhB,MAAgB,UADLA,EAAKgI,SAAS5E,eACEpD,EAAK1C,OAASA,GAQ3C,SAASwN,GAAoBxN,GAC5B,OAAO,SAAU0C,GAChB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,OAAkB,UAATpC,GAA6B,WAATA,IAAuBhB,EAAK1C,OAASA,GAQpE,SAASyN,GAAsBhD,GAG9B,OAAO,SAAU/H,GAKhB,MAAK,SAAUA,EASTA,EAAKzB,aAAgC,IAAlByB,EAAK+H,SAGvB,UAAW/H,EACV,UAAWA,EAAKzB,WACbyB,EAAKzB,WAAWwJ,WAAaA,EAE7B/H,EAAK+H,WAAaA,EAMpB/H,EAAKgL,aAAejD,GAI1B/H,EAAKgL,cAAgBjD,GACrBF,GAAoB7H,KAAW+H,EAG1B/H,EAAK+H,WAAaA,EAKd,UAAW/H,GACfA,EAAK+H,WAAaA,GAY5B,SAASkD,GAAwBnM,GAChC,OAAOmL,GAAc,SAAUiB,GAE9B,OADAA,GAAYA,EACLjB,GAAc,SAAU3B,EAAM3F,GACpC,IAAIjC,EACHyK,EAAerM,EAAI,GAAIwJ,EAAKrJ,OAAQiM,GACpCpN,EAAIqN,EAAalM,OAGlB,MAAQnB,IACFwK,EAAQ5H,EAAIyK,EAAcrN,MAC9BwK,EAAM5H,KAASiC,EAASjC,GAAM4H,EAAM5H,SAYzC,SAAS2I,GAAaxK,GACrB,OAAOA,GAAmD,oBAAjCA,EAAQoK,sBAAwCpK,EAkrC1E,IAAMf,KA9qCNd,EAAUqG,GAAOrG,QAAU,GAO3BwG,EAAQH,GAAOG,MAAQ,SAAUxD,GAChC,IAAIoL,EAAYpL,EAAKqL,aACpBrH,GAAYhE,EAAK6I,eAAiB7I,GAAOsL,gBAK1C,OAAQ5E,EAAM0C,KAAMgC,GAAapH,GAAWA,EAAQgE,UAAY,SAQjEjE,EAAcV,GAAOU,YAAc,SAAUnG,GAC5C,IAAI2N,EAAYC,EACf3N,EAAMD,EAAOA,EAAKiL,eAAiBjL,EAAO0G,EAO3C,OAAKzG,GAAOrC,GAA6B,IAAjBqC,EAAIV,UAAmBU,EAAIyN,kBAMnDtH,GADAxI,EAAWqC,GACQyN,gBACnBrH,GAAkBT,EAAOhI,GAQpB8I,GAAgB9I,IAClBgQ,EAAYhQ,EAASiQ,cAAiBD,EAAUE,MAAQF,IAGrDA,EAAUG,iBACdH,EAAUG,iBAAkB,SAAU/D,IAAe,GAG1C4D,EAAUI,aACrBJ,EAAUI,YAAa,WAAYhE,KASrC5K,EAAQsM,MAAQY,GAAQ,SAAUC,GAEjC,OADAnG,EAAQ1F,YAAa6L,GAAK7L,YAAa9C,EAASyC,cAAe,QACzB,oBAAxBkM,EAAGV,mBACfU,EAAGV,iBAAkB,uBAAwBxK,SAShDjC,EAAQuI,WAAa2E,GAAQ,SAAUC,GAEtC,OADAA,EAAG0B,UAAY,KACP1B,EAAGhM,aAAc,eAO1BnB,EAAQiM,qBAAuBiB,GAAQ,SAAUC,GAEhD,OADAA,EAAG7L,YAAa9C,EAASsQ,cAAe,MAChC3B,EAAGlB,qBAAsB,KAAMhK,SAIxCjC,EAAQkM,uBAAyBrC,EAAQuC,KAAM5N,EAAS0N,wBAMxDlM,EAAQ+O,QAAU7B,GAAQ,SAAUC,GAEnC,OADAnG,EAAQ1F,YAAa6L,GAAKnB,GAAKtH,GACvBlG,EAASwQ,oBAAsBxQ,EAASwQ,kBAAmBtK,GAAUzC,SAIzEjC,EAAQ+O,SACZzI,EAAK2I,OAAa,GAAI,SAAUjD,GAC/B,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,OAAOA,EAAK7B,aAAc,QAAW+N,IAGvC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIjE,EAAOnB,EAAQkK,eAAgBC,GACnC,OAAOhJ,EAAO,CAAEA,GAAS,OAI3BsD,EAAK2I,OAAa,GAAK,SAAUjD,GAChC,IAAIkD,EAASlD,EAAGnH,QAASmF,GAAWC,IACpC,OAAO,SAAUjH,GAChB,IAAIpC,EAAwC,oBAA1BoC,EAAKoM,kBACtBpM,EAAKoM,iBAAkB,MACxB,OAAOxO,GAAQA,EAAKkF,QAAUoJ,IAMhC5I,EAAK6I,KAAW,GAAI,SAAUnD,EAAInK,GACjC,GAAuC,oBAA3BA,EAAQkK,gBAAkC9E,EAAiB,CACtE,IAAIrG,EAAME,EAAG2B,EACZO,EAAOnB,EAAQkK,eAAgBC,GAEhC,GAAKhJ,EAAO,CAIX,IADApC,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAIVP,EAAQZ,EAAQmN,kBAAmBhD,GACnClL,EAAI,EACJ,MAAUkC,EAAOP,EAAO3B,KAEvB,IADAF,EAAOoC,EAAKoM,iBAAkB,QACjBxO,EAAKkF,QAAUkG,EAC3B,MAAO,CAAEhJ,GAKZ,MAAO,MAMVsD,EAAK6I,KAAY,IAAInP,EAAQiM,qBAC5B,SAAUoD,EAAKxN,GACd,MAA6C,oBAAjCA,EAAQoK,qBACZpK,EAAQoK,qBAAsBoD,GAG1BrP,EAAQmM,IACZtK,EAAQ4K,iBAAkB4C,QAD3B,GAKR,SAAUA,EAAKxN,GACd,IAAImB,EACHsM,EAAM,GACNxO,EAAI,EAGJyE,EAAU1D,EAAQoK,qBAAsBoD,GAGzC,GAAa,MAARA,EAAc,CAClB,MAAUrM,EAAOuC,EAASzE,KACF,IAAlBkC,EAAK7C,UACTmP,EAAI9P,KAAMwD,GAIZ,OAAOsM,EAER,OAAO/J,GAITe,EAAK6I,KAAc,MAAInP,EAAQkM,wBAA0B,SAAU2C,EAAWhN,GAC7E,GAA+C,oBAAnCA,EAAQqK,wBAA0CjF,EAC7D,OAAOpF,EAAQqK,uBAAwB2C,IAUzC1H,EAAgB,GAOhBD,EAAY,IAELlH,EAAQmM,IAAMtC,EAAQuC,KAAM5N,EAASiO,qBAI3CS,GAAQ,SAAUC,GAEjB,IAAIoC,EAOJvI,EAAQ1F,YAAa6L,GAAKqC,UAAY,UAAY9K,EAAU,qBAC1CA,EAAU,kEAOvByI,EAAGV,iBAAkB,wBAAyBxK,QAClDiF,EAAU1H,KAAM,SAAW6I,EAAa,gBAKnC8E,EAAGV,iBAAkB,cAAexK,QACzCiF,EAAU1H,KAAM,MAAQ6I,EAAa,aAAeD,EAAW,KAI1D+E,EAAGV,iBAAkB,QAAU/H,EAAU,MAAOzC,QACrDiF,EAAU1H,KAAM,OAQjB+P,EAAQ/Q,EAASyC,cAAe,UAC1BG,aAAc,OAAQ,IAC5B+L,EAAG7L,YAAaiO,GACVpC,EAAGV,iBAAkB,aAAcxK,QACxCiF,EAAU1H,KAAM,MAAQ6I,EAAa,QAAUA,EAAa,KAC3DA,EAAa,gBAMT8E,EAAGV,iBAAkB,YAAaxK,QACvCiF,EAAU1H,KAAM,YAMX2N,EAAGV,iBAAkB,KAAO/H,EAAU,MAAOzC,QAClDiF,EAAU1H,KAAM,YAKjB2N,EAAGV,iBAAkB,QACrBvF,EAAU1H,KAAM,iBAGjB0N,GAAQ,SAAUC,GACjBA,EAAGqC,UAAY,oFAKf,IAAID,EAAQ/Q,EAASyC,cAAe,SACpCsO,EAAMnO,aAAc,OAAQ,UAC5B+L,EAAG7L,YAAaiO,GAAQnO,aAAc,OAAQ,KAIzC+L,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU1H,KAAM,OAAS6I,EAAa,eAKW,IAA7C8E,EAAGV,iBAAkB,YAAaxK,QACtCiF,EAAU1H,KAAM,WAAY,aAK7BwH,EAAQ1F,YAAa6L,GAAKpC,UAAW,EACc,IAA9CoC,EAAGV,iBAAkB,aAAcxK,QACvCiF,EAAU1H,KAAM,WAAY,aAK7B2N,EAAGV,iBAAkB,QACrBvF,EAAU1H,KAAM,YAIXQ,EAAQyP,gBAAkB5F,EAAQuC,KAAQzG,EAAUqB,EAAQrB,SAClEqB,EAAQ0I,uBACR1I,EAAQ2I,oBACR3I,EAAQ4I,kBACR5I,EAAQ6I,qBAER3C,GAAQ,SAAUC,GAIjBnN,EAAQ8P,kBAAoBnK,EAAQtG,KAAM8N,EAAI,KAI9CxH,EAAQtG,KAAM8N,EAAI,aAClBhG,EAAc3H,KAAM,KAAMgJ,KAI5BtB,EAAYA,EAAUjF,QAAU,IAAIyG,OAAQxB,EAAUsF,KAAM,MAC5DrF,EAAgBA,EAAclF,QAAU,IAAIyG,OAAQvB,EAAcqF,KAAM,MAIxE+B,EAAa1E,EAAQuC,KAAMpF,EAAQ+I,yBAKnC3I,EAAWmH,GAAc1E,EAAQuC,KAAMpF,EAAQI,UAC9C,SAAUW,EAAGC,GACZ,IAAIgI,EAAuB,IAAfjI,EAAE5H,SAAiB4H,EAAEuG,gBAAkBvG,EAClDkI,EAAMjI,GAAKA,EAAEzG,WACd,OAAOwG,IAAMkI,MAAWA,GAAwB,IAAjBA,EAAI9P,YAClC6P,EAAM5I,SACL4I,EAAM5I,SAAU6I,GAChBlI,EAAEgI,yBAA8D,GAAnChI,EAAEgI,wBAAyBE,MAG3D,SAAUlI,EAAGC,GACZ,GAAKA,EACJ,MAAUA,EAAIA,EAAEzG,WACf,GAAKyG,IAAMD,EACV,OAAO,EAIV,OAAO,GAOTD,EAAYyG,EACZ,SAAUxG,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAIR,IAAIoJ,GAAWnI,EAAEgI,yBAA2B/H,EAAE+H,wBAC9C,OAAKG,IAgBU,GAPfA,GAAYnI,EAAE8D,eAAiB9D,KAASC,EAAE6D,eAAiB7D,GAC1DD,EAAEgI,wBAAyB/H,GAG3B,KAIGhI,EAAQmQ,cAAgBnI,EAAE+H,wBAAyBhI,KAAQmI,EAOzDnI,GAAKvJ,GAAYuJ,EAAE8D,eAAiBvE,GACxCF,EAAUE,EAAcS,IAChB,EAOJC,GAAKxJ,GAAYwJ,EAAE6D,eAAiBvE,GACxCF,EAAUE,EAAcU,GACjB,EAIDnB,EACJpH,EAASoH,EAAWkB,GAAMtI,EAASoH,EAAWmB,GAChD,EAGe,EAAVkI,GAAe,EAAI,IAE3B,SAAUnI,EAAGC,GAGZ,GAAKD,IAAMC,EAEV,OADAlB,GAAe,EACR,EAGR,IAAI2G,EACH3M,EAAI,EACJsP,EAAMrI,EAAExG,WACR0O,EAAMjI,EAAEzG,WACR8O,EAAK,CAAEtI,GACPuI,EAAK,CAAEtI,GAGR,IAAMoI,IAAQH,EAMb,OAAOlI,GAAKvJ,GAAY,EACvBwJ,GAAKxJ,EAAW,EAEhB4R,GAAO,EACPH,EAAM,EACNpJ,EACEpH,EAASoH,EAAWkB,GAAMtI,EAASoH,EAAWmB,GAChD,EAGK,GAAKoI,IAAQH,EACnB,OAAOzC,GAAczF,EAAGC,GAIzByF,EAAM1F,EACN,MAAU0F,EAAMA,EAAIlM,WACnB8O,EAAGE,QAAS9C,GAEbA,EAAMzF,EACN,MAAUyF,EAAMA,EAAIlM,WACnB+O,EAAGC,QAAS9C,GAIb,MAAQ4C,EAAIvP,KAAQwP,EAAIxP,GACvBA,IAGD,OAAOA,EAGN0M,GAAc6C,EAAIvP,GAAKwP,EAAIxP,IAO3BuP,EAAIvP,IAAOwG,GAAgB,EAC3BgJ,EAAIxP,IAAOwG,EAAe,EAE1B,IAGK9I,GAGR6H,GAAOV,QAAU,SAAU6K,EAAMC,GAChC,OAAOpK,GAAQmK,EAAM,KAAM,KAAMC,IAGlCpK,GAAOoJ,gBAAkB,SAAUzM,EAAMwN,GAGxC,GAFAzJ,EAAa/D,GAERhD,EAAQyP,iBAAmBxI,IAC9BY,EAAwB2I,EAAO,QAC7BrJ,IAAkBA,EAAciF,KAAMoE,OACtCtJ,IAAkBA,EAAUkF,KAAMoE,IAErC,IACC,IAAI9N,EAAMiD,EAAQtG,KAAM2D,EAAMwN,GAG9B,GAAK9N,GAAO1C,EAAQ8P,mBAInB9M,EAAKxE,UAAuC,KAA3BwE,EAAKxE,SAAS2B,SAC/B,OAAOuC,EAEP,MAAQ0I,GACTvD,EAAwB2I,GAAM,GAIhC,OAAyD,EAAlDnK,GAAQmK,EAAMhS,EAAU,KAAM,CAAEwE,IAASf,QAGjDoE,GAAOe,SAAW,SAAUvF,EAASmB,GAUpC,OAHOnB,EAAQgK,eAAiBhK,IAAarD,GAC5CuI,EAAalF,GAEPuF,EAAUvF,EAASmB,IAG3BqD,GAAOqK,KAAO,SAAU1N,EAAMgB,IAOtBhB,EAAK6I,eAAiB7I,IAAUxE,GACtCuI,EAAa/D,GAGd,IAAIlB,EAAKwE,EAAKiH,WAAYvJ,EAAKoC,eAG9BrF,EAAMe,GAAMlC,EAAOP,KAAMiH,EAAKiH,WAAYvJ,EAAKoC,eAC9CtE,EAAIkB,EAAMgB,GAAOiD,QACjBxC,EAEF,YAAeA,IAAR1D,EACNA,EACAf,EAAQuI,aAAetB,EACtBjE,EAAK7B,aAAc6C,IACjBjD,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,MAGJO,GAAO6D,OAAS,SAAU0G,GACzB,OAASA,EAAM,IAAK/L,QAAS0F,GAAYC,KAG1CnE,GAAOtB,MAAQ,SAAUC,GACxB,MAAM,IAAItG,MAAO,0CAA4CsG,IAO9DqB,GAAOwK,WAAa,SAAUtL,GAC7B,IAAIvC,EACH8N,EAAa,GACbpN,EAAI,EACJ5C,EAAI,EAOL,GAJAgG,GAAgB9G,EAAQ+Q,iBACxBlK,GAAa7G,EAAQgR,YAAczL,EAAQrG,MAAO,GAClDqG,EAAQ3B,KAAMkE,GAEThB,EAAe,CACnB,MAAU9D,EAAOuC,EAASzE,KACpBkC,IAASuC,EAASzE,KACtB4C,EAAIoN,EAAWtR,KAAMsB,IAGvB,MAAQ4C,IACP6B,EAAQ1B,OAAQiN,EAAYpN,GAAK,GAQnC,OAFAmD,EAAY,KAELtB,GAORgB,EAAUF,GAAOE,QAAU,SAAUvD,GACpC,IAAIpC,EACH8B,EAAM,GACN5B,EAAI,EACJX,EAAW6C,EAAK7C,SAEjB,GAAMA,GAQC,GAAkB,IAAbA,GAA+B,IAAbA,GAA+B,KAAbA,EAAkB,CAIjE,GAAiC,iBAArB6C,EAAKiO,YAChB,OAAOjO,EAAKiO,YAIZ,IAAMjO,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/ClL,GAAO6D,EAASvD,QAGZ,GAAkB,IAAb7C,GAA+B,IAAbA,EAC7B,OAAO6C,EAAKmO,eAnBZ,MAAUvQ,EAAOoC,EAAMlC,KAGtB4B,GAAO6D,EAAS3F,GAqBlB,OAAO8B,IAGR4D,EAAOD,GAAO+K,UAAY,CAGzBrE,YAAa,GAEbsE,aAAcpE,GAEdxB,MAAOxC,EAEPsE,WAAY,GAEZ4B,KAAM,GAENmC,SAAU,CACTC,IAAK,CAAEtG,IAAK,aAAc/H,OAAO,GACjCsO,IAAK,CAAEvG,IAAK,cACZwG,IAAK,CAAExG,IAAK,kBAAmB/H,OAAO,GACtCwO,IAAK,CAAEzG,IAAK,oBAGb0G,UAAW,CACVtI,KAAQ,SAAUoC,GAWjB,OAVAA,EAAO,GAAMA,EAAO,GAAI5G,QAASmF,GAAWC,IAG5CwB,EAAO,IAAQA,EAAO,IAAOA,EAAO,IACnCA,EAAO,IAAO,IAAK5G,QAASmF,GAAWC,IAEpB,OAAfwB,EAAO,KACXA,EAAO,GAAM,IAAMA,EAAO,GAAM,KAG1BA,EAAMvM,MAAO,EAAG,IAGxBqK,MAAS,SAAUkC,GAiClB,OArBAA,EAAO,GAAMA,EAAO,GAAIrF,cAEU,QAA7BqF,EAAO,GAAIvM,MAAO,EAAG,IAGnBuM,EAAO,IACZpF,GAAOtB,MAAO0G,EAAO,IAKtBA,EAAO,KAASA,EAAO,GACtBA,EAAO,IAAQA,EAAO,IAAO,GAC7B,GAAqB,SAAfA,EAAO,IAAiC,QAAfA,EAAO,KACvCA,EAAO,KAAWA,EAAO,GAAMA,EAAO,IAAwB,QAAfA,EAAO,KAG3CA,EAAO,IAClBpF,GAAOtB,MAAO0G,EAAO,IAGfA,GAGRnC,OAAU,SAAUmC,GACnB,IAAImG,EACHC,GAAYpG,EAAO,IAAOA,EAAO,GAElC,OAAKxC,EAAmB,MAAEmD,KAAMX,EAAO,IAC/B,MAIHA,EAAO,GACXA,EAAO,GAAMA,EAAO,IAAOA,EAAO,IAAO,GAG9BoG,GAAY9I,EAAQqD,KAAMyF,KAGnCD,EAASnL,EAAUoL,GAAU,MAG7BD,EAASC,EAASpS,QAAS,IAAKoS,EAAS5P,OAAS2P,GAAWC,EAAS5P,UAGxEwJ,EAAO,GAAMA,EAAO,GAAIvM,MAAO,EAAG0S,GAClCnG,EAAO,GAAMoG,EAAS3S,MAAO,EAAG0S,IAI1BnG,EAAMvM,MAAO,EAAG,MAIzB+P,OAAQ,CAEP7F,IAAO,SAAU0I,GAChB,IAAI9G,EAAW8G,EAAiBjN,QAASmF,GAAWC,IAAY7D,cAChE,MAA4B,MAArB0L,EACN,WACC,OAAO,GAER,SAAU9O,GACT,OAAOA,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkB4E,IAI3D7B,MAAS,SAAU0F,GAClB,IAAIkD,EAAUtK,EAAYoH,EAAY,KAEtC,OAAOkD,IACJA,EAAU,IAAIrJ,OAAQ,MAAQL,EAC/B,IAAMwG,EAAY,IAAMxG,EAAa,SAAaZ,EACjDoH,EAAW,SAAU7L,GACpB,OAAO+O,EAAQ3F,KACY,iBAAnBpJ,EAAK6L,WAA0B7L,EAAK6L,WACd,oBAAtB7L,EAAK7B,cACX6B,EAAK7B,aAAc,UACpB,OAKNkI,KAAQ,SAAUrF,EAAMgO,EAAUC,GACjC,OAAO,SAAUjP,GAChB,IAAIkP,EAAS7L,GAAOqK,KAAM1N,EAAMgB,GAEhC,OAAe,MAAVkO,EACgB,OAAbF,GAEFA,IAINE,GAAU,GAIU,MAAbF,EAAmBE,IAAWD,EACvB,OAAbD,EAAoBE,IAAWD,EAClB,OAAbD,EAAoBC,GAAqC,IAA5BC,EAAOzS,QAASwS,GAChC,OAAbD,EAAoBC,IAAoC,EAA3BC,EAAOzS,QAASwS,GAChC,OAAbD,EAAoBC,GAASC,EAAOhT,OAAQ+S,EAAMhQ,UAAagQ,EAClD,OAAbD,GAA2F,GAArE,IAAME,EAAOrN,QAAS4D,EAAa,KAAQ,KAAMhJ,QAASwS,GACnE,OAAbD,IAAoBE,IAAWD,GAASC,EAAOhT,MAAO,EAAG+S,EAAMhQ,OAAS,KAAQgQ,EAAQ,QAO3F1I,MAAS,SAAUjJ,EAAM6R,EAAMC,EAAWlP,EAAOE,GAChD,IAAIiP,EAAgC,QAAvB/R,EAAKpB,MAAO,EAAG,GAC3BoT,EAA+B,SAArBhS,EAAKpB,OAAQ,GACvBqT,EAAkB,YAATJ,EAEV,OAAiB,IAAVjP,GAAwB,IAATE,EAGrB,SAAUJ,GACT,QAASA,EAAKzB,YAGf,SAAUyB,EAAMwP,EAAUC,GACzB,IAAI5F,EAAO6F,EAAaC,EAAY/R,EAAMgS,EAAWC,EACpD5H,EAAMoH,IAAWC,EAAU,cAAgB,kBAC3CQ,EAAS9P,EAAKzB,WACdyC,EAAOuO,GAAUvP,EAAKgI,SAAS5E,cAC/B2M,GAAYN,IAAQF,EACpB7E,GAAO,EAER,GAAKoF,EAAS,CAGb,GAAKT,EAAS,CACb,MAAQpH,EAAM,CACbrK,EAAOoC,EACP,MAAUpC,EAAOA,EAAMqK,GACtB,GAAKsH,EACJ3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKT,SAEL,OAAO,EAKT0S,EAAQ5H,EAAe,SAAT3K,IAAoBuS,GAAS,cAE5C,OAAO,EAMR,GAHAA,EAAQ,CAAEP,EAAUQ,EAAO5B,WAAa4B,EAAOE,WAG1CV,GAAWS,EAAW,CAe1BrF,GADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOkS,GACYpO,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KACzBA,EAAO,GAC3BjM,EAAOgS,GAAaE,EAAO3H,WAAYyH,GAEvC,MAAUhS,IAASgS,GAAahS,GAAQA,EAAMqK,KAG3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAGlC,GAAuB,IAAlBrH,EAAKT,YAAoBuN,GAAQ9M,IAASoC,EAAO,CACrD0P,EAAapS,GAAS,CAAEiH,EAASqL,EAAWlF,GAC5C,YAyBF,GAlBKqF,IAaJrF,EADAkF,GADA/F,GAHA6F,GAJAC,GADA/R,EAAOoC,GACY0B,KAAe9D,EAAM8D,GAAY,KAI1B9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEZ3S,IAAU,IACZ,KAAQiH,GAAWsF,EAAO,KAMhC,IAATa,EAGJ,MAAU9M,IAASgS,GAAahS,GAAQA,EAAMqK,KAC3CyC,EAAOkF,EAAY,IAAOC,EAAM5K,MAElC,IAAOsK,EACN3R,EAAKoK,SAAS5E,gBAAkBpC,EACd,IAAlBpD,EAAKT,aACHuN,IAGGqF,KAMJL,GALAC,EAAa/R,EAAM8D,KAChB9D,EAAM8D,GAAY,KAIK9D,EAAKqS,YAC5BN,EAAY/R,EAAKqS,UAAa,KAEpB3S,GAAS,CAAEiH,EAASmG,IAG7B9M,IAASoC,GACb,MASL,OADA0K,GAAQtK,KACQF,GAAWwK,EAAOxK,GAAU,GAAqB,GAAhBwK,EAAOxK,KAK5DoG,OAAU,SAAU4J,EAAQhF,GAM3B,IAAIiF,EACHrR,EAAKwE,EAAKkC,QAAS0K,IAAY5M,EAAK8M,WAAYF,EAAO9M,gBACtDC,GAAOtB,MAAO,uBAAyBmO,GAKzC,OAAKpR,EAAI4C,GACD5C,EAAIoM,GAIK,EAAZpM,EAAGG,QACPkR,EAAO,CAAED,EAAQA,EAAQ,GAAIhF,GACtB5H,EAAK8M,WAAWvT,eAAgBqT,EAAO9M,eAC7C6G,GAAc,SAAU3B,EAAM3F,GAC7B,IAAI0N,EACHC,EAAUxR,EAAIwJ,EAAM4C,GACpBpN,EAAIwS,EAAQrR,OACb,MAAQnB,IAEPwK,EADA+H,EAAM5T,EAAS6L,EAAMgI,EAASxS,OACb6E,EAAS0N,GAAQC,EAASxS,MAG7C,SAAUkC,GACT,OAAOlB,EAAIkB,EAAM,EAAGmQ,KAIhBrR,IAIT0G,QAAS,CAGR+K,IAAOtG,GAAc,SAAUrL,GAK9B,IAAI2N,EAAQ,GACXhK,EAAU,GACViO,EAAU9M,EAAS9E,EAASiD,QAAS8D,EAAO,OAE7C,OAAO6K,EAAS9O,GACfuI,GAAc,SAAU3B,EAAM3F,EAAS6M,EAAUC,GAChD,IAAIzP,EACHyQ,EAAYD,EAASlI,EAAM,KAAMmH,EAAK,IACtC3R,EAAIwK,EAAKrJ,OAGV,MAAQnB,KACAkC,EAAOyQ,EAAW3S,MACxBwK,EAAMxK,KAAS6E,EAAS7E,GAAMkC,MAIjC,SAAUA,EAAMwP,EAAUC,GAMzB,OALAlD,EAAO,GAAMvM,EACbwQ,EAASjE,EAAO,KAAMkD,EAAKlN,GAG3BgK,EAAO,GAAM,MACLhK,EAAQ0C,SAInByL,IAAOzG,GAAc,SAAUrL,GAC9B,OAAO,SAAUoB,GAChB,OAAyC,EAAlCqD,GAAQzE,EAAUoB,GAAOf,UAIlCmF,SAAY6F,GAAc,SAAU/L,GAEnC,OADAA,EAAOA,EAAK2D,QAASmF,GAAWC,IACzB,SAAUjH,GAChB,OAAkE,GAAzDA,EAAKiO,aAAe1K,EAASvD,IAASvD,QAASyB,MAW1DyS,KAAQ1G,GAAc,SAAU0G,GAO/B,OAJM3K,EAAYoD,KAAMuH,GAAQ,KAC/BtN,GAAOtB,MAAO,qBAAuB4O,GAEtCA,EAAOA,EAAK9O,QAASmF,GAAWC,IAAY7D,cACrC,SAAUpD,GAChB,IAAI4Q,EACJ,GACC,GAAOA,EAAW3M,EACjBjE,EAAK2Q,KACL3Q,EAAK7B,aAAc,aAAgB6B,EAAK7B,aAAc,QAGtD,OADAyS,EAAWA,EAASxN,iBACAuN,GAA2C,IAAnCC,EAASnU,QAASkU,EAAO,YAE3C3Q,EAAOA,EAAKzB,aAAkC,IAAlByB,EAAK7C,UAC7C,OAAO,KAKTiE,OAAU,SAAUpB,GACnB,IAAI6Q,EAAOlV,EAAOmV,UAAYnV,EAAOmV,SAASD,KAC9C,OAAOA,GAAQA,EAAK3U,MAAO,KAAQ8D,EAAKgJ,IAGzC+H,KAAQ,SAAU/Q,GACjB,OAAOA,IAASgE,GAGjBgN,MAAS,SAAUhR,GAClB,OAAOA,IAASxE,EAASyV,iBACrBzV,EAAS0V,UAAY1V,EAAS0V,gBAC7BlR,EAAK1C,MAAQ0C,EAAKmR,OAASnR,EAAKoR,WAItCC,QAAWtG,IAAsB,GACjChD,SAAYgD,IAAsB,GAElCuG,QAAW,SAAUtR,GAIpB,IAAIgI,EAAWhI,EAAKgI,SAAS5E,cAC7B,MAAsB,UAAb4E,KAA0BhI,EAAKsR,SACxB,WAAbtJ,KAA2BhI,EAAKuR,UAGpCA,SAAY,SAAUvR,GASrB,OALKA,EAAKzB,YAETyB,EAAKzB,WAAWiT,eAGQ,IAAlBxR,EAAKuR,UAIbE,MAAS,SAAUzR,GAMlB,IAAMA,EAAOA,EAAKkO,WAAYlO,EAAMA,EAAOA,EAAK4K,YAC/C,GAAK5K,EAAK7C,SAAW,EACpB,OAAO,EAGT,OAAO,GAGR2S,OAAU,SAAU9P,GACnB,OAAQsD,EAAKkC,QAAiB,MAAGxF,IAIlC0R,OAAU,SAAU1R,GACnB,OAAO4G,EAAQwC,KAAMpJ,EAAKgI,WAG3BuE,MAAS,SAAUvM,GAClB,OAAO2G,EAAQyC,KAAMpJ,EAAKgI,WAG3B2J,OAAU,SAAU3R,GACnB,IAAIgB,EAAOhB,EAAKgI,SAAS5E,cACzB,MAAgB,UAATpC,GAAkC,WAAdhB,EAAK1C,MAA8B,WAAT0D,GAGtD9C,KAAQ,SAAU8B,GACjB,IAAI0N,EACJ,MAAuC,UAAhC1N,EAAKgI,SAAS5E,eACN,SAAdpD,EAAK1C,OAIuC,OAAxCoQ,EAAO1N,EAAK7B,aAAc,UACN,SAAvBuP,EAAKtK,gBAIRlD,MAAS+K,GAAwB,WAChC,MAAO,CAAE,KAGV7K,KAAQ6K,GAAwB,SAAU2G,EAAe3S,GACxD,MAAO,CAAEA,EAAS,KAGnBkB,GAAM8K,GAAwB,SAAU2G,EAAe3S,EAAQiM,GAC9D,MAAO,CAAEA,EAAW,EAAIA,EAAWjM,EAASiM,KAG7C7K,KAAQ4K,GAAwB,SAAUE,EAAclM,GAEvD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR3K,IAAOyK,GAAwB,SAAUE,EAAclM,GAEtD,IADA,IAAInB,EAAI,EACAA,EAAImB,EAAQnB,GAAK,EACxBqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR0G,GAAM5G,GAAwB,SAAUE,EAAclM,EAAQiM,GAM7D,IALA,IAAIpN,EAAIoN,EAAW,EAClBA,EAAWjM,EACAA,EAAXiM,EACCjM,EACAiM,EACa,KAALpN,GACTqN,EAAa3O,KAAMsB,GAEpB,OAAOqN,IAGR2G,GAAM7G,GAAwB,SAAUE,EAAclM,EAAQiM,GAE7D,IADA,IAAIpN,EAAIoN,EAAW,EAAIA,EAAWjM,EAASiM,IACjCpN,EAAImB,GACbkM,EAAa3O,KAAMsB,GAEpB,OAAOqN,OAKL3F,QAAe,IAAIlC,EAAKkC,QAAc,GAGhC,CAAEuM,OAAO,EAAMC,UAAU,EAAMC,MAAM,EAAMC,UAAU,EAAMC,OAAO,GAC5E7O,EAAKkC,QAAS1H,GAAM+M,GAAmB/M,GAExC,IAAMA,IAAK,CAAEsU,QAAQ,EAAMC,OAAO,GACjC/O,EAAKkC,QAAS1H,GAAMgN,GAAoBhN,GAIzC,SAASsS,MA0ET,SAAS7G,GAAY+I,GAIpB,IAHA,IAAIxU,EAAI,EACP2C,EAAM6R,EAAOrT,OACbL,EAAW,GACJd,EAAI2C,EAAK3C,IAChBc,GAAY0T,EAAQxU,GAAIgF,MAEzB,OAAOlE,EAGR,SAASkJ,GAAe0I,EAAS+B,EAAYC,GAC5C,IAAIvK,EAAMsK,EAAWtK,IACpBwK,EAAOF,EAAWrK,KAClB4B,EAAM2I,GAAQxK,EACdyK,EAAmBF,GAAgB,eAAR1I,EAC3B6I,EAAWnO,IAEZ,OAAO+N,EAAWrS,MAGjB,SAAUF,EAAMnB,EAAS4Q,GACxB,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK7C,UAAkBuV,EAC3B,OAAOlC,EAASxQ,EAAMnB,EAAS4Q,GAGjC,OAAO,GAIR,SAAUzP,EAAMnB,EAAS4Q,GACxB,IAAImD,EAAUlD,EAAaC,EAC1BkD,EAAW,CAAEtO,EAASoO,GAGvB,GAAKlD,GACJ,MAAUzP,EAAOA,EAAMiI,GACtB,IAAuB,IAAlBjI,EAAK7C,UAAkBuV,IACtBlC,EAASxQ,EAAMnB,EAAS4Q,GAC5B,OAAO,OAKV,MAAUzP,EAAOA,EAAMiI,GACtB,GAAuB,IAAlBjI,EAAK7C,UAAkBuV,EAQ3B,GAHAhD,GAJAC,EAAa3P,EAAM0B,KAAe1B,EAAM0B,GAAY,KAI1B1B,EAAKiQ,YAC5BN,EAAY3P,EAAKiQ,UAAa,IAE5BwC,GAAQA,IAASzS,EAAKgI,SAAS5E,cACnCpD,EAAOA,EAAMiI,IAASjI,MAChB,CAAA,IAAO4S,EAAWlD,EAAa5F,KACrC8I,EAAU,KAAQrO,GAAWqO,EAAU,KAAQD,EAG/C,OAASE,EAAU,GAAMD,EAAU,GAOnC,IAHAlD,EAAa5F,GAAQ+I,GAGJ,GAAMrC,EAASxQ,EAAMnB,EAAS4Q,GAC9C,OAAO,EAMZ,OAAO,GAIV,SAASqD,GAAgBC,GACxB,OAAyB,EAAlBA,EAAS9T,OACf,SAAUe,EAAMnB,EAAS4Q,GACxB,IAAI3R,EAAIiV,EAAS9T,OACjB,MAAQnB,IACP,IAAMiV,EAAUjV,GAAKkC,EAAMnB,EAAS4Q,GACnC,OAAO,EAGT,OAAO,GAERsD,EAAU,GAYZ,SAASC,GAAUvC,EAAW1Q,EAAKkM,EAAQpN,EAAS4Q,GAOnD,IANA,IAAIzP,EACHiT,EAAe,GACfnV,EAAI,EACJ2C,EAAMgQ,EAAUxR,OAChBiU,EAAgB,MAAPnT,EAEFjC,EAAI2C,EAAK3C,KACTkC,EAAOyQ,EAAW3S,MAClBmO,IAAUA,EAAQjM,EAAMnB,EAAS4Q,KACtCwD,EAAazW,KAAMwD,GACdkT,GACJnT,EAAIvD,KAAMsB,KAMd,OAAOmV,EAGR,SAASE,GAAYxE,EAAW/P,EAAU4R,EAAS4C,EAAYC,EAAYC,GAO1E,OANKF,IAAeA,EAAY1R,KAC/B0R,EAAaD,GAAYC,IAErBC,IAAeA,EAAY3R,KAC/B2R,EAAaF,GAAYE,EAAYC,IAE/BrJ,GAAc,SAAU3B,EAAM/F,EAAS1D,EAAS4Q,GACtD,IAAI8D,EAAMzV,EAAGkC,EACZwT,EAAS,GACTC,EAAU,GACVC,EAAcnR,EAAQtD,OAGtBQ,EAAQ6I,GA5CX,SAA2B1J,EAAU+U,EAAUpR,GAG9C,IAFA,IAAIzE,EAAI,EACP2C,EAAMkT,EAAS1U,OACRnB,EAAI2C,EAAK3C,IAChBuF,GAAQzE,EAAU+U,EAAU7V,GAAKyE,GAElC,OAAOA,EAsCWqR,CACfhV,GAAY,IACZC,EAAQ1B,SAAW,CAAE0B,GAAYA,EACjC,IAIDgV,GAAYlF,IAAerG,GAAS1J,EAEnCa,EADAuT,GAAUvT,EAAO+T,EAAQ7E,EAAW9P,EAAS4Q,GAG9CqE,EAAatD,EAGZ6C,IAAgB/K,EAAOqG,EAAY+E,GAAeN,GAGjD,GAGA7Q,EACDsR,EAQF,GALKrD,GACJA,EAASqD,EAAWC,EAAYjV,EAAS4Q,GAIrC2D,EAAa,CACjBG,EAAOP,GAAUc,EAAYL,GAC7BL,EAAYG,EAAM,GAAI1U,EAAS4Q,GAG/B3R,EAAIyV,EAAKtU,OACT,MAAQnB,KACAkC,EAAOuT,EAAMzV,MACnBgW,EAAYL,EAAS3V,MAAW+V,EAAWJ,EAAS3V,IAAQkC,IAK/D,GAAKsI,GACJ,GAAK+K,GAAc1E,EAAY,CAC9B,GAAK0E,EAAa,CAGjBE,EAAO,GACPzV,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,KAGzByV,EAAK/W,KAAQqX,EAAW/V,GAAMkC,GAGhCqT,EAAY,KAAQS,EAAa,GAAMP,EAAM9D,GAI9C3R,EAAIgW,EAAW7U,OACf,MAAQnB,KACAkC,EAAO8T,EAAYhW,MACsC,GAA7DyV,EAAOF,EAAa5W,EAAS6L,EAAMtI,GAASwT,EAAQ1V,MAEtDwK,EAAMiL,KAAYhR,EAASgR,GAASvT,UAOvC8T,EAAad,GACZc,IAAevR,EACduR,EAAWjT,OAAQ6S,EAAaI,EAAW7U,QAC3C6U,GAEGT,EACJA,EAAY,KAAM9Q,EAASuR,EAAYrE,GAEvCjT,EAAKD,MAAOgG,EAASuR,KAMzB,SAASC,GAAmBzB,GAyB3B,IAxBA,IAAI0B,EAAcxD,EAAS9P,EAC1BD,EAAM6R,EAAOrT,OACbgV,EAAkB3Q,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAC7C4W,EAAmBD,GAAmB3Q,EAAKgL,SAAU,KACrDxQ,EAAImW,EAAkB,EAAI,EAG1BE,EAAerM,GAAe,SAAU9H,GACvC,OAAOA,IAASgU,GACdE,GAAkB,GACrBE,EAAkBtM,GAAe,SAAU9H,GAC1C,OAAwC,EAAjCvD,EAASuX,EAAchU,IAC5BkU,GAAkB,GACrBnB,EAAW,CAAE,SAAU/S,EAAMnB,EAAS4Q,GACrC,IAAI/P,GAASuU,IAAqBxE,GAAO5Q,IAAY+E,MAClDoQ,EAAenV,GAAU1B,SAC1BgX,EAAcnU,EAAMnB,EAAS4Q,GAC7B2E,EAAiBpU,EAAMnB,EAAS4Q,IAIlC,OADAuE,EAAe,KACRtU,IAGD5B,EAAI2C,EAAK3C,IAChB,GAAO0S,EAAUlN,EAAKgL,SAAUgE,EAAQxU,GAAIR,MAC3CyV,EAAW,CAAEjL,GAAegL,GAAgBC,GAAYvC,QAClD,CAIN,IAHAA,EAAUlN,EAAK2I,OAAQqG,EAAQxU,GAAIR,MAAOf,MAAO,KAAM+V,EAAQxU,GAAI6E,UAGrDjB,GAAY,CAIzB,IADAhB,IAAM5C,EACE4C,EAAID,EAAKC,IAChB,GAAK4C,EAAKgL,SAAUgE,EAAQ5R,GAAIpD,MAC/B,MAGF,OAAO6V,GACF,EAAJrV,GAASgV,GAAgBC,GACrB,EAAJjV,GAASyL,GAGT+I,EACEpW,MAAO,EAAG4B,EAAI,GACdxB,OAAQ,CAAEwG,MAAgC,MAAzBwP,EAAQxU,EAAI,GAAIR,KAAe,IAAM,MACtDuE,QAAS8D,EAAO,MAClB6K,EACA1S,EAAI4C,GAAKqT,GAAmBzB,EAAOpW,MAAO4B,EAAG4C,IAC7CA,EAAID,GAAOsT,GAAqBzB,EAASA,EAAOpW,MAAOwE,IACvDA,EAAID,GAAO8I,GAAY+I,IAGzBS,EAASvW,KAAMgU,GAIjB,OAAOsC,GAAgBC,GAoTxB,OAtpBA3C,GAAWlR,UAAYoE,EAAK+Q,QAAU/Q,EAAKkC,QAC3ClC,EAAK8M,WAAa,IAAIA,GAEtB3M,EAAWJ,GAAOI,SAAW,SAAU7E,EAAU0V,GAChD,IAAIhE,EAAS7H,EAAO6J,EAAQhV,EAC3BiX,EAAO7L,EAAQ8L,EACfC,EAAS9P,EAAY/F,EAAW,KAEjC,GAAK6V,EACJ,OAAOH,EAAY,EAAIG,EAAOvY,MAAO,GAGtCqY,EAAQ3V,EACR8J,EAAS,GACT8L,EAAalR,EAAKqL,UAElB,MAAQ4F,EAAQ,CA2Bf,IAAMjX,KAxBAgT,KAAa7H,EAAQ7C,EAAOkD,KAAMyL,MAClC9L,IAGJ8L,EAAQA,EAAMrY,MAAOuM,EAAO,GAAIxJ,SAAYsV,GAE7C7L,EAAOlM,KAAQ8V,EAAS,KAGzBhC,GAAU,GAGH7H,EAAQ5C,EAAaiD,KAAMyL,MACjCjE,EAAU7H,EAAMuB,QAChBsI,EAAO9V,KAAM,CACZsG,MAAOwN,EAGPhT,KAAMmL,EAAO,GAAI5G,QAAS8D,EAAO,OAElC4O,EAAQA,EAAMrY,MAAOoU,EAAQrR,SAIhBqE,EAAK2I,SACXxD,EAAQxC,EAAW3I,GAAOwL,KAAMyL,KAAgBC,EAAYlX,MAChEmL,EAAQ+L,EAAYlX,GAAQmL,MAC9B6H,EAAU7H,EAAMuB,QAChBsI,EAAO9V,KAAM,CACZsG,MAAOwN,EACPhT,KAAMA,EACNqF,QAAS8F,IAEV8L,EAAQA,EAAMrY,MAAOoU,EAAQrR,SAI/B,IAAMqR,EACL,MAOF,OAAOgE,EACNC,EAAMtV,OACNsV,EACClR,GAAOtB,MAAOnD,GAGd+F,EAAY/F,EAAU8J,GAASxM,MAAO,IA4ZzCwH,EAAUL,GAAOK,QAAU,SAAU9E,EAAU6J,GAC9C,IAAI3K,EA9H8B4W,EAAiBC,EAC/CC,EACHC,EACAC,EA4HAH,EAAc,GACdD,EAAkB,GAClBD,EAAS7P,EAAehG,EAAW,KAEpC,IAAM6V,EAAS,CAGRhM,IACLA,EAAQhF,EAAU7E,IAEnBd,EAAI2K,EAAMxJ,OACV,MAAQnB,KACP2W,EAASV,GAAmBtL,EAAO3K,KACtB4D,GACZiT,EAAYnY,KAAMiY,GAElBC,EAAgBlY,KAAMiY,IAKxBA,EAAS7P,EACRhG,GArJgC8V,EAsJNA,EArJxBE,EAA6B,GADkBD,EAsJNA,GArJrB1V,OACvB4V,EAAqC,EAAzBH,EAAgBzV,OAC5B6V,EAAe,SAAUxM,EAAMzJ,EAAS4Q,EAAKlN,EAASwS,GACrD,IAAI/U,EAAMU,EAAG8P,EACZwE,EAAe,EACflX,EAAI,IACJ2S,EAAYnI,GAAQ,GACpB2M,EAAa,GACbC,EAAgBtR,EAGhBnE,EAAQ6I,GAAQuM,GAAavR,EAAK6I,KAAY,IAAG,IAAK4I,GAGtDI,EAAkB5Q,GAA4B,MAAjB2Q,EAAwB,EAAIvT,KAAKC,UAAY,GAC1EnB,EAAMhB,EAAMR,OAcb,IAZK8V,IAMJnR,EAAmB/E,GAAWrD,GAAYqD,GAAWkW,GAM9CjX,IAAM2C,GAAgC,OAAvBT,EAAOP,EAAO3B,IAAeA,IAAM,CACzD,GAAK+W,GAAa7U,EAAO,CACxBU,EAAI,EAME7B,GAAWmB,EAAK6I,eAAiBrN,IACtCuI,EAAa/D,GACbyP,GAAOxL,GAER,MAAUuM,EAAUkE,EAAiBhU,KACpC,GAAK8P,EAASxQ,EAAMnB,GAAWrD,EAAUiU,GAAQ,CAChDlN,EAAQ/F,KAAMwD,GACd,MAGG+U,IACJxQ,EAAU4Q,GAKPP,KAGG5U,GAAQwQ,GAAWxQ,IACzBgV,IAII1M,GACJmI,EAAUjU,KAAMwD,IAgBnB,GATAgV,GAAgBlX,EASX8W,GAAS9W,IAAMkX,EAAe,CAClCtU,EAAI,EACJ,MAAU8P,EAAUmE,EAAajU,KAChC8P,EAASC,EAAWwE,EAAYpW,EAAS4Q,GAG1C,GAAKnH,EAAO,CAGX,GAAoB,EAAf0M,EACJ,MAAQlX,IACC2S,EAAW3S,IAAOmX,EAAYnX,KACrCmX,EAAYnX,GAAMmH,EAAI5I,KAAMkG,IAM/B0S,EAAajC,GAAUiC,GAIxBzY,EAAKD,MAAOgG,EAAS0S,GAGhBF,IAAczM,GAA4B,EAApB2M,EAAWhW,QACG,EAAtC+V,EAAeL,EAAY1V,QAE7BoE,GAAOwK,WAAYtL,GAUrB,OALKwS,IACJxQ,EAAU4Q,EACVvR,EAAmBsR,GAGbzE,GAGFmE,EACN3K,GAAc6K,GACdA,KAgCOlW,SAAWA,EAEnB,OAAO6V,GAYR9Q,EAASN,GAAOM,OAAS,SAAU/E,EAAUC,EAAS0D,EAAS+F,GAC9D,IAAIxK,EAAGwU,EAAQ8C,EAAO9X,EAAM6O,EAC3BkJ,EAA+B,mBAAbzW,GAA2BA,EAC7C6J,GAASH,GAAQ7E,EAAY7E,EAAWyW,EAASzW,UAAYA,GAM9D,GAJA2D,EAAUA,GAAW,GAIC,IAAjBkG,EAAMxJ,OAAe,CAIzB,GAAqB,GADrBqT,EAAS7J,EAAO,GAAMA,EAAO,GAAIvM,MAAO,IAC5B+C,QAA+C,QAA/BmW,EAAQ9C,EAAQ,IAAMhV,MAC5B,IAArBuB,EAAQ1B,UAAkB8G,GAAkBX,EAAKgL,SAAUgE,EAAQ,GAAIhV,MAAS,CAIhF,KAFAuB,GAAYyE,EAAK6I,KAAW,GAAGiJ,EAAMzS,QAAS,GAC5Cd,QAASmF,GAAWC,IAAapI,IAAa,IAAM,IAErD,OAAO0D,EAGI8S,IACXxW,EAAUA,EAAQN,YAGnBK,EAAWA,EAAS1C,MAAOoW,EAAOtI,QAAQlH,MAAM7D,QAIjDnB,EAAImI,EAA0B,aAAEmD,KAAMxK,GAAa,EAAI0T,EAAOrT,OAC9D,MAAQnB,IAAM,CAIb,GAHAsX,EAAQ9C,EAAQxU,GAGXwF,EAAKgL,SAAYhR,EAAO8X,EAAM9X,MAClC,MAED,IAAO6O,EAAO7I,EAAK6I,KAAM7O,MAGjBgL,EAAO6D,EACbiJ,EAAMzS,QAAS,GAAId,QAASmF,GAAWC,IACvCF,GAASqC,KAAMkJ,EAAQ,GAAIhV,OAAU+L,GAAaxK,EAAQN,aACzDM,IACI,CAKL,GAFAyT,EAAOzR,OAAQ/C,EAAG,KAClBc,EAAW0J,EAAKrJ,QAAUsK,GAAY+I,IAGrC,OADA9V,EAAKD,MAAOgG,EAAS+F,GACd/F,EAGR,QAeJ,OAPE8S,GAAY3R,EAAS9E,EAAU6J,IAChCH,EACAzJ,GACCoF,EACD1B,GACC1D,GAAWkI,GAASqC,KAAMxK,IAAcyK,GAAaxK,EAAQN,aAAgBM,GAExE0D,GAMRvF,EAAQgR,WAAatM,EAAQwB,MAAO,IAAKtC,KAAMkE,GAAY0E,KAAM,MAAS9H,EAI1E1E,EAAQ+Q,mBAAqBjK,EAG7BC,IAIA/G,EAAQmQ,aAAejD,GAAQ,SAAUC,GAGxC,OAA4E,EAArEA,EAAG4C,wBAAyBvR,EAASyC,cAAe,eAMtDiM,GAAQ,SAAUC,GAEvB,OADAA,EAAGqC,UAAY,mBACiC,MAAzCrC,EAAG+D,WAAW/P,aAAc,WAEnCiM,GAAW,yBAA0B,SAAUpK,EAAMgB,EAAMwC,GAC1D,IAAMA,EACL,OAAOxD,EAAK7B,aAAc6C,EAA6B,SAAvBA,EAAKoC,cAA2B,EAAI,KAOjEpG,EAAQuI,YAAe2E,GAAQ,SAAUC,GAG9C,OAFAA,EAAGqC,UAAY,WACfrC,EAAG+D,WAAW9P,aAAc,QAAS,IACY,KAA1C+L,EAAG+D,WAAW/P,aAAc,YAEnCiM,GAAW,QAAS,SAAUpK,EAAMsV,EAAO9R,GAC1C,IAAMA,GAAyC,UAAhCxD,EAAKgI,SAAS5E,cAC5B,OAAOpD,EAAKuV,eAOTrL,GAAQ,SAAUC,GACvB,OAAwC,MAAjCA,EAAGhM,aAAc,eAExBiM,GAAWhF,EAAU,SAAUpF,EAAMgB,EAAMwC,GAC1C,IAAIzF,EACJ,IAAMyF,EACL,OAAwB,IAAjBxD,EAAMgB,GAAkBA,EAAKoC,eACjCrF,EAAMiC,EAAKoM,iBAAkBpL,KAAYjD,EAAI4P,UAC9C5P,EAAI+E,MACJ,OAKEO,GA14EP,CA44EK1H,GAILgD,EAAOwN,KAAO9I,EACd1E,EAAO6O,KAAOnK,EAAO+K,UAGrBzP,EAAO6O,KAAM,KAAQ7O,EAAO6O,KAAKhI,QACjC7G,EAAOkP,WAAalP,EAAO6W,OAASnS,EAAOwK,WAC3ClP,EAAOT,KAAOmF,EAAOE,QACrB5E,EAAO8W,SAAWpS,EAAOG,MACzB7E,EAAOyF,SAAWf,EAAOe,SACzBzF,EAAO+W,eAAiBrS,EAAO6D,OAK/B,IAAIe,EAAM,SAAUjI,EAAMiI,EAAK0N,GAC9B,IAAIrF,EAAU,GACbsF,OAAqBnU,IAAVkU,EAEZ,OAAU3V,EAAOA,EAAMiI,KAA6B,IAAlBjI,EAAK7C,SACtC,GAAuB,IAAlB6C,EAAK7C,SAAiB,CAC1B,GAAKyY,GAAYjX,EAAQqB,GAAO6V,GAAIF,GACnC,MAEDrF,EAAQ9T,KAAMwD,GAGhB,OAAOsQ,GAIJwF,EAAW,SAAUC,EAAG/V,GAG3B,IAFA,IAAIsQ,EAAU,GAENyF,EAAGA,EAAIA,EAAEnL,YACI,IAAfmL,EAAE5Y,UAAkB4Y,IAAM/V,GAC9BsQ,EAAQ9T,KAAMuZ,GAIhB,OAAOzF,GAIJ0F,EAAgBrX,EAAO6O,KAAK/E,MAAMhC,aAItC,SAASuB,EAAUhI,EAAMgB,GAEvB,OAAOhB,EAAKgI,UAAYhI,EAAKgI,SAAS5E,gBAAkBpC,EAAKoC,cAG/D,IAAI6S,EAAa,kEAKjB,SAASC,EAAQzI,EAAU0I,EAAW5F,GACrC,OAAKtT,EAAYkZ,GACTxX,EAAO2B,KAAMmN,EAAU,SAAUzN,EAAMlC,GAC7C,QAASqY,EAAU9Z,KAAM2D,EAAMlC,EAAGkC,KAAWuQ,IAK1C4F,EAAUhZ,SACPwB,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAASA,IAASmW,IAAgB5F,IAKV,iBAAd4F,EACJxX,EAAO2B,KAAMmN,EAAU,SAAUzN,GACvC,OAA4C,EAAnCvD,EAAQJ,KAAM8Z,EAAWnW,KAAkBuQ,IAK/C5R,EAAOsN,OAAQkK,EAAW1I,EAAU8C,GAG5C5R,EAAOsN,OAAS,SAAUuB,EAAM/N,EAAO8Q,GACtC,IAAIvQ,EAAOP,EAAO,GAMlB,OAJK8Q,IACJ/C,EAAO,QAAUA,EAAO,KAGH,IAAjB/N,EAAMR,QAAkC,IAAlBe,EAAK7C,SACxBwB,EAAOwN,KAAKM,gBAAiBzM,EAAMwN,GAAS,CAAExN,GAAS,GAGxDrB,EAAOwN,KAAKxJ,QAAS6K,EAAM7O,EAAO2B,KAAMb,EAAO,SAAUO,GAC/D,OAAyB,IAAlBA,EAAK7C,aAIdwB,EAAOG,GAAGgC,OAAQ,CACjBqL,KAAM,SAAUvN,GACf,IAAId,EAAG4B,EACNe,EAAM7E,KAAKqD,OACXmX,EAAOxa,KAER,GAAyB,iBAAbgD,EACX,OAAOhD,KAAK4D,UAAWb,EAAQC,GAAWqN,OAAQ,WACjD,IAAMnO,EAAI,EAAGA,EAAI2C,EAAK3C,IACrB,GAAKa,EAAOyF,SAAUgS,EAAMtY,GAAKlC,MAChC,OAAO,KAQX,IAFA8D,EAAM9D,KAAK4D,UAAW,IAEhB1B,EAAI,EAAGA,EAAI2C,EAAK3C,IACrBa,EAAOwN,KAAMvN,EAAUwX,EAAMtY,GAAK4B,GAGnC,OAAa,EAANe,EAAU9B,EAAOkP,WAAYnO,GAAQA,GAE7CuM,OAAQ,SAAUrN,GACjB,OAAOhD,KAAK4D,UAAW0W,EAAQta,KAAMgD,GAAY,IAAI,KAEtD2R,IAAK,SAAU3R,GACd,OAAOhD,KAAK4D,UAAW0W,EAAQta,KAAMgD,GAAY,IAAI,KAEtDiX,GAAI,SAAUjX,GACb,QAASsX,EACRta,KAIoB,iBAAbgD,GAAyBoX,EAAc5M,KAAMxK,GACnDD,EAAQC,GACRA,GAAY,IACb,GACCK,UASJ,IAAIoX,EAMHvP,EAAa,uCAENnI,EAAOG,GAAGC,KAAO,SAAUH,EAAUC,EAASkS,GACpD,IAAItI,EAAOzI,EAGX,IAAMpB,EACL,OAAOhD,KAQR,GAHAmV,EAAOA,GAAQsF,EAGU,iBAAbzX,EAAwB,CAanC,KAPC6J,EALsB,MAAlB7J,EAAU,IACsB,MAApCA,EAAUA,EAASK,OAAS,IACT,GAAnBL,EAASK,OAGD,CAAE,KAAML,EAAU,MAGlBkI,EAAWgC,KAAMlK,MAIV6J,EAAO,IAAQ5J,EA6CxB,OAAMA,GAAWA,EAAQM,QACtBN,GAAWkS,GAAO5E,KAAMvN,GAK1BhD,KAAKwD,YAAaP,GAAUsN,KAAMvN,GAhDzC,GAAK6J,EAAO,GAAM,CAYjB,GAXA5J,EAAUA,aAAmBF,EAASE,EAAS,GAAMA,EAIrDF,EAAOgB,MAAO/D,KAAM+C,EAAO2X,UAC1B7N,EAAO,GACP5J,GAAWA,EAAQ1B,SAAW0B,EAAQgK,eAAiBhK,EAAUrD,GACjE,IAIIya,EAAW7M,KAAMX,EAAO,KAAS9J,EAAO2C,cAAezC,GAC3D,IAAM4J,KAAS5J,EAGT5B,EAAYrB,KAAM6M,IACtB7M,KAAM6M,GAAS5J,EAAS4J,IAIxB7M,KAAK8R,KAAMjF,EAAO5J,EAAS4J,IAK9B,OAAO7M,KAYP,OARAoE,EAAOxE,EAASuN,eAAgBN,EAAO,OAKtC7M,KAAM,GAAMoE,EACZpE,KAAKqD,OAAS,GAERrD,KAcH,OAAKgD,EAASzB,UACpBvB,KAAM,GAAMgD,EACZhD,KAAKqD,OAAS,EACPrD,MAIIqB,EAAY2B,QACD6C,IAAfsP,EAAKwF,MACXxF,EAAKwF,MAAO3X,GAGZA,EAAUD,GAGLA,EAAO2D,UAAW1D,EAAUhD,QAIhCsD,UAAYP,EAAOG,GAGxBuX,EAAa1X,EAAQnD,GAGrB,IAAIgb,EAAe,iCAGlBC,EAAmB,CAClBC,UAAU,EACVC,UAAU,EACVzO,MAAM,EACN0O,MAAM,GAoFR,SAASC,EAASpM,EAAKxC,GACtB,OAAUwC,EAAMA,EAAKxC,KAA4B,IAAjBwC,EAAItN,UACpC,OAAOsN,EAnFR9L,EAAOG,GAAGgC,OAAQ,CACjB4P,IAAK,SAAUtP,GACd,IAAI0V,EAAUnY,EAAQyC,EAAQxF,MAC7Bmb,EAAID,EAAQ7X,OAEb,OAAOrD,KAAKqQ,OAAQ,WAEnB,IADA,IAAInO,EAAI,EACAA,EAAIiZ,EAAGjZ,IACd,GAAKa,EAAOyF,SAAUxI,KAAMkb,EAAShZ,IACpC,OAAO,KAMXkZ,QAAS,SAAU5I,EAAWvP,GAC7B,IAAI4L,EACH3M,EAAI,EACJiZ,EAAInb,KAAKqD,OACTqR,EAAU,GACVwG,EAA+B,iBAAd1I,GAA0BzP,EAAQyP,GAGpD,IAAM4H,EAAc5M,KAAMgF,GACzB,KAAQtQ,EAAIiZ,EAAGjZ,IACd,IAAM2M,EAAM7O,KAAMkC,GAAK2M,GAAOA,IAAQ5L,EAAS4L,EAAMA,EAAIlM,WAGxD,GAAKkM,EAAItN,SAAW,KAAQ2Z,GACH,EAAxBA,EAAQG,MAAOxM,GAGE,IAAjBA,EAAItN,UACHwB,EAAOwN,KAAKM,gBAAiBhC,EAAK2D,IAAgB,CAEnDkC,EAAQ9T,KAAMiO,GACd,MAMJ,OAAO7O,KAAK4D,UAA4B,EAAjB8Q,EAAQrR,OAAaN,EAAOkP,WAAYyC,GAAYA,IAI5E2G,MAAO,SAAUjX,GAGhB,OAAMA,EAKe,iBAATA,EACJvD,EAAQJ,KAAMsC,EAAQqB,GAAQpE,KAAM,IAIrCa,EAAQJ,KAAMT,KAGpBoE,EAAKb,OAASa,EAAM,GAAMA,GAZjBpE,KAAM,IAAOA,KAAM,GAAI2C,WAAe3C,KAAKsE,QAAQgX,UAAUjY,QAAU,GAgBlFkY,IAAK,SAAUvY,EAAUC,GACxB,OAAOjD,KAAK4D,UACXb,EAAOkP,WACNlP,EAAOgB,MAAO/D,KAAK0D,MAAOX,EAAQC,EAAUC,OAK/CuY,QAAS,SAAUxY,GAClB,OAAOhD,KAAKub,IAAiB,MAAZvY,EAChBhD,KAAKgE,WAAahE,KAAKgE,WAAWqM,OAAQrN,OAU7CD,EAAOkB,KAAM,CACZiQ,OAAQ,SAAU9P,GACjB,IAAI8P,EAAS9P,EAAKzB,WAClB,OAAOuR,GAA8B,KAApBA,EAAO3S,SAAkB2S,EAAS,MAEpDuH,QAAS,SAAUrX,GAClB,OAAOiI,EAAKjI,EAAM,eAEnBsX,aAAc,SAAUtX,EAAMmD,EAAIwS,GACjC,OAAO1N,EAAKjI,EAAM,aAAc2V,IAEjCzN,KAAM,SAAUlI,GACf,OAAO6W,EAAS7W,EAAM,gBAEvB4W,KAAM,SAAU5W,GACf,OAAO6W,EAAS7W,EAAM,oBAEvBuX,QAAS,SAAUvX,GAClB,OAAOiI,EAAKjI,EAAM,gBAEnBkX,QAAS,SAAUlX,GAClB,OAAOiI,EAAKjI,EAAM,oBAEnBwX,UAAW,SAAUxX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,cAAe2V,IAElC8B,UAAW,SAAUzX,EAAMmD,EAAIwS,GAC9B,OAAO1N,EAAKjI,EAAM,kBAAmB2V,IAEtCG,SAAU,SAAU9V,GACnB,OAAO8V,GAAY9V,EAAKzB,YAAc,IAAK2P,WAAYlO,IAExD0W,SAAU,SAAU1W,GACnB,OAAO8V,EAAU9V,EAAKkO,aAEvByI,SAAU,SAAU3W,GACnB,OAA6B,MAAxBA,EAAK0X,iBAKT3b,EAAUiE,EAAK0X,iBAER1X,EAAK0X,iBAMR1P,EAAUhI,EAAM,cACpBA,EAAOA,EAAK2X,SAAW3X,GAGjBrB,EAAOgB,MAAO,GAAIK,EAAKmI,eAE7B,SAAUnH,EAAMlC,GAClBH,EAAOG,GAAIkC,GAAS,SAAU2U,EAAO/W,GACpC,IAAI0R,EAAU3R,EAAOoB,IAAKnE,KAAMkD,EAAI6W,GAuBpC,MArB0B,UAArB3U,EAAK9E,OAAQ,KACjB0C,EAAW+W,GAGP/W,GAAgC,iBAAbA,IACvB0R,EAAU3R,EAAOsN,OAAQrN,EAAU0R,IAGjB,EAAd1U,KAAKqD,SAGHwX,EAAkBzV,IACvBrC,EAAOkP,WAAYyC,GAIfkG,EAAapN,KAAMpI,IACvBsP,EAAQsH,WAIHhc,KAAK4D,UAAW8Q,MAGzB,IAAIuH,EAAgB,oBAsOpB,SAASC,EAAUC,GAClB,OAAOA,EAER,SAASC,EAASC,GACjB,MAAMA,EAGP,SAASC,EAAYpV,EAAOqV,EAASC,EAAQC,GAC5C,IAAIC,EAEJ,IAGMxV,GAAS7F,EAAcqb,EAASxV,EAAMyV,SAC1CD,EAAOjc,KAAMyG,GAAQ0B,KAAM2T,GAAUK,KAAMJ,GAGhCtV,GAAS7F,EAAcqb,EAASxV,EAAM2V,MACjDH,EAAOjc,KAAMyG,EAAOqV,EAASC,GAQ7BD,EAAQ5b,WAAOkF,EAAW,CAAEqB,GAAQ5G,MAAOmc,IAM3C,MAAQvV,GAITsV,EAAO7b,WAAOkF,EAAW,CAAEqB,KAvO7BnE,EAAO+Z,UAAY,SAAU3X,GA9B7B,IAAwBA,EACnB4X,EAiCJ5X,EAA6B,iBAAZA,GAlCMA,EAmCPA,EAlCZ4X,EAAS,GACbha,EAAOkB,KAAMkB,EAAQ0H,MAAOoP,IAAmB,GAAI,SAAUe,EAAGC,GAC/DF,EAAQE,IAAS,IAEXF,GA+BNha,EAAOmC,OAAQ,GAAIC,GAEpB,IACC+X,EAGAC,EAGAC,EAGAC,EAGA9T,EAAO,GAGP+T,EAAQ,GAGRC,GAAe,EAGfC,EAAO,WAQN,IALAH,EAASA,GAAUlY,EAAQsY,KAI3BL,EAAQF,GAAS,EACTI,EAAMja,OAAQka,GAAe,EAAI,CACxCJ,EAASG,EAAMlP,QACf,QAAUmP,EAAchU,EAAKlG,QAGmC,IAA1DkG,EAAMgU,GAAc5c,MAAOwc,EAAQ,GAAKA,EAAQ,KACpDhY,EAAQuY,cAGRH,EAAchU,EAAKlG,OACnB8Z,GAAS,GAMNhY,EAAQgY,SACbA,GAAS,GAGVD,GAAS,EAGJG,IAIH9T,EADI4T,EACG,GAIA,KAMV3C,EAAO,CAGNe,IAAK,WA2BJ,OA1BKhS,IAGC4T,IAAWD,IACfK,EAAchU,EAAKlG,OAAS,EAC5Bia,EAAM1c,KAAMuc,IAGb,SAAW5B,EAAKhH,GACfxR,EAAOkB,KAAMsQ,EAAM,SAAUyI,EAAG/V,GAC1B5F,EAAY4F,GACV9B,EAAQyU,QAAWY,EAAK1F,IAAK7N,IAClCsC,EAAK3I,KAAMqG,GAEDA,GAAOA,EAAI5D,QAA4B,WAAlBR,EAAQoE,IAGxCsU,EAAKtU,KATR,CAYK5C,WAEA8Y,IAAWD,GACfM,KAGKxd,MAIR2d,OAAQ,WAYP,OAXA5a,EAAOkB,KAAMI,UAAW,SAAU2Y,EAAG/V,GACpC,IAAIoU,EACJ,OAA0D,GAAhDA,EAAQtY,EAAO6D,QAASK,EAAKsC,EAAM8R,IAC5C9R,EAAKtE,OAAQoW,EAAO,GAGfA,GAASkC,GACbA,MAIIvd,MAKR8U,IAAK,SAAU5R,GACd,OAAOA,GACwB,EAA9BH,EAAO6D,QAAS1D,EAAIqG,GACN,EAAdA,EAAKlG,QAIPwS,MAAO,WAIN,OAHKtM,IACJA,EAAO,IAEDvJ,MAMR4d,QAAS,WAGR,OAFAP,EAASC,EAAQ,GACjB/T,EAAO4T,EAAS,GACTnd,MAERmM,SAAU,WACT,OAAQ5C,GAMTsU,KAAM,WAKL,OAJAR,EAASC,EAAQ,GACXH,GAAWD,IAChB3T,EAAO4T,EAAS,IAEVnd,MAERqd,OAAQ,WACP,QAASA,GAIVS,SAAU,SAAU7a,EAASsR,GAS5B,OARM8I,IAEL9I,EAAO,CAAEtR,GADTsR,EAAOA,GAAQ,IACQjU,MAAQiU,EAAKjU,QAAUiU,GAC9C+I,EAAM1c,KAAM2T,GACN2I,GACLM,KAGKxd,MAIRwd,KAAM,WAEL,OADAhD,EAAKsD,SAAU9d,KAAMqE,WACdrE,MAIRod,MAAO,WACN,QAASA,IAIZ,OAAO5C,GA4CRzX,EAAOmC,OAAQ,CAEd6Y,SAAU,SAAUC,GACnB,IAAIC,EAAS,CAIX,CAAE,SAAU,WAAYlb,EAAO+Z,UAAW,UACzC/Z,EAAO+Z,UAAW,UAAY,GAC/B,CAAE,UAAW,OAAQ/Z,EAAO+Z,UAAW,eACtC/Z,EAAO+Z,UAAW,eAAiB,EAAG,YACvC,CAAE,SAAU,OAAQ/Z,EAAO+Z,UAAW,eACrC/Z,EAAO+Z,UAAW,eAAiB,EAAG,aAExCoB,EAAQ,UACRvB,EAAU,CACTuB,MAAO,WACN,OAAOA,GAERC,OAAQ,WAEP,OADAC,EAASxV,KAAMvE,WAAYuY,KAAMvY,WAC1BrE,MAERqe,QAAS,SAAUnb,GAClB,OAAOyZ,EAAQE,KAAM,KAAM3Z,IAI5Bob,KAAM,WACL,IAAIC,EAAMla,UAEV,OAAOtB,EAAOgb,SAAU,SAAUS,GACjCzb,EAAOkB,KAAMga,EAAQ,SAAU1W,EAAIkX,GAGlC,IAAIvb,EAAK7B,EAAYkd,EAAKE,EAAO,MAAWF,EAAKE,EAAO,IAKxDL,EAAUK,EAAO,IAAO,WACvB,IAAIC,EAAWxb,GAAMA,EAAGvC,MAAOX,KAAMqE,WAChCqa,GAAYrd,EAAYqd,EAAS/B,SACrC+B,EAAS/B,UACPgC,SAAUH,EAASI,QACnBhW,KAAM4V,EAASjC,SACfK,KAAM4B,EAAShC,QAEjBgC,EAAUC,EAAO,GAAM,QACtBze,KACAkD,EAAK,CAAEwb,GAAara,eAKxBka,EAAM,OACH5B,WAELE,KAAM,SAAUgC,EAAaC,EAAYC,GACxC,IAAIC,EAAW,EACf,SAASzC,EAAS0C,EAAOb,EAAU1P,EAASwQ,GAC3C,OAAO,WACN,IAAIC,EAAOnf,KACVuU,EAAOlQ,UACP+a,EAAa,WACZ,IAAIV,EAAU7B,EAKd,KAAKoC,EAAQD,GAAb,CAQA,IAJAN,EAAWhQ,EAAQ/N,MAAOwe,EAAM5K,MAId6J,EAASzB,UAC1B,MAAM,IAAI0C,UAAW,4BAOtBxC,EAAO6B,IAKgB,iBAAbA,GACY,mBAAbA,IACRA,EAAS7B,KAGLxb,EAAYwb,GAGXqC,EACJrC,EAAKpc,KACJie,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,KAOvCF,IAEAnC,EAAKpc,KACJie,EACAnC,EAASyC,EAAUZ,EAAUlC,EAAUgD,GACvC3C,EAASyC,EAAUZ,EAAUhC,EAAS8C,GACtC3C,EAASyC,EAAUZ,EAAUlC,EAC5BkC,EAASkB,eASP5Q,IAAYwN,IAChBiD,OAAOtZ,EACP0O,EAAO,CAAEmK,KAKRQ,GAAWd,EAASmB,aAAeJ,EAAM5K,MAK7CiL,EAAUN,EACTE,EACA,WACC,IACCA,IACC,MAAQ5S,GAEJzJ,EAAOgb,SAAS0B,eACpB1c,EAAOgb,SAAS0B,cAAejT,EAC9BgT,EAAQE,YAMQV,GAAbC,EAAQ,IAIPvQ,IAAY0N,IAChB+C,OAAOtZ,EACP0O,EAAO,CAAE/H,IAGV4R,EAASuB,WAAYR,EAAM5K,MAS3B0K,EACJO,KAKKzc,EAAOgb,SAAS6B,eACpBJ,EAAQE,WAAa3c,EAAOgb,SAAS6B,gBAEtC7f,EAAO8f,WAAYL,KAKtB,OAAOzc,EAAOgb,SAAU,SAAUS,GAGjCP,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAY0d,GACXA,EACA7C,EACDsC,EAASc,aAKXrB,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAYwd,GACXA,EACA3C,IAKH+B,EAAQ,GAAK,GAAI1C,IAChBgB,EACC,EACAiC,EACAnd,EAAYyd,GACXA,EACA1C,MAGAO,WAKLA,QAAS,SAAUrb,GAClB,OAAc,MAAPA,EAAcyB,EAAOmC,OAAQ5D,EAAKqb,GAAYA,IAGvDyB,EAAW,GAkEZ,OA/DArb,EAAOkB,KAAMga,EAAQ,SAAU/b,EAAGuc,GACjC,IAAIlV,EAAOkV,EAAO,GACjBqB,EAAcrB,EAAO,GAKtB9B,EAAS8B,EAAO,IAAQlV,EAAKgS,IAGxBuE,GACJvW,EAAKgS,IACJ,WAIC2C,EAAQ4B,GAKT7B,EAAQ,EAAI/b,GAAK,GAAI0b,QAIrBK,EAAQ,EAAI/b,GAAK,GAAI0b,QAGrBK,EAAQ,GAAK,GAAIJ,KAGjBI,EAAQ,GAAK,GAAIJ,MAOnBtU,EAAKgS,IAAKkD,EAAO,GAAIjB,MAKrBY,EAAUK,EAAO,IAAQ,WAExB,OADAL,EAAUK,EAAO,GAAM,QAAUze,OAASoe,OAAWvY,EAAY7F,KAAMqE,WAChErE,MAMRoe,EAAUK,EAAO,GAAM,QAAWlV,EAAKuU,WAIxCnB,EAAQA,QAASyB,GAGZJ,GACJA,EAAKvd,KAAM2d,EAAUA,GAIfA,GAIR2B,KAAM,SAAUC,GACf,IAGCC,EAAY5b,UAAUhB,OAGtBnB,EAAI+d,EAGJC,EAAkBva,MAAOzD,GACzBie,EAAgB7f,EAAMG,KAAM4D,WAG5B+b,EAASrd,EAAOgb,WAGhBsC,EAAa,SAAUne,GACtB,OAAO,SAAUgF,GAChBgZ,EAAiBhe,GAAMlC,KACvBmgB,EAAeje,GAAyB,EAAnBmC,UAAUhB,OAAa/C,EAAMG,KAAM4D,WAAc6C,IAC5D+Y,GACTG,EAAOb,YAAaW,EAAiBC,KAMzC,GAAKF,GAAa,IACjB3D,EAAY0D,EAAaI,EAAOxX,KAAMyX,EAAYne,IAAMqa,QAAS6D,EAAO5D,QACtEyD,GAGsB,YAAnBG,EAAOlC,SACX7c,EAAY8e,EAAeje,IAAOie,EAAeje,GAAI2a,OAErD,OAAOuD,EAAOvD,OAKhB,MAAQ3a,IACPoa,EAAY6D,EAAeje,GAAKme,EAAYne,GAAKke,EAAO5D,QAGzD,OAAO4D,EAAOzD,aAOhB,IAAI2D,EAAc,yDAElBvd,EAAOgb,SAAS0B,cAAgB,SAAUtZ,EAAOoa,GAI3CxgB,EAAOygB,SAAWzgB,EAAOygB,QAAQC,MAAQta,GAASma,EAAY9S,KAAMrH,EAAMf,OAC9ErF,EAAOygB,QAAQC,KAAM,8BAAgCta,EAAMua,QAASva,EAAMoa,MAAOA,IAOnFxd,EAAO4d,eAAiB,SAAUxa,GACjCpG,EAAO8f,WAAY,WAClB,MAAM1Z,KAQR,IAAIya,EAAY7d,EAAOgb,WAkDvB,SAAS8C,IACRjhB,EAASkhB,oBAAqB,mBAAoBD,GAClD9gB,EAAO+gB,oBAAqB,OAAQD,GACpC9d,EAAO4X,QAnDR5X,EAAOG,GAAGyX,MAAQ,SAAUzX,GAY3B,OAVA0d,EACE/D,KAAM3Z,GAKNmb,SAAO,SAAUlY,GACjBpD,EAAO4d,eAAgBxa,KAGlBnG,MAGR+C,EAAOmC,OAAQ,CAGdgB,SAAS,EAIT6a,UAAW,EAGXpG,MAAO,SAAUqG,KAGF,IAATA,IAAkBje,EAAOge,UAAYhe,EAAOmD,WAKjDnD,EAAOmD,SAAU,KAGZ8a,GAAsC,IAAnBje,EAAOge,WAK/BH,EAAUrB,YAAa3f,EAAU,CAAEmD,OAIrCA,EAAO4X,MAAMkC,KAAO+D,EAAU/D,KAaD,aAAxBjd,EAASqhB,YACa,YAAxBrhB,EAASqhB,aAA6BrhB,EAAS8P,gBAAgBwR,SAGjEnhB,EAAO8f,WAAY9c,EAAO4X,QAK1B/a,EAASmQ,iBAAkB,mBAAoB8Q,GAG/C9gB,EAAOgQ,iBAAkB,OAAQ8Q,IAQlC,IAAIM,EAAS,SAAUtd,EAAOX,EAAIgL,EAAKhH,EAAOka,EAAWC,EAAUC,GAClE,IAAIpf,EAAI,EACP2C,EAAMhB,EAAMR,OACZke,EAAc,MAAPrT,EAGR,GAAuB,WAAlBrL,EAAQqL,GAEZ,IAAMhM,KADNkf,GAAY,EACDlT,EACViT,EAAQtd,EAAOX,EAAIhB,EAAGgM,EAAKhM,IAAK,EAAMmf,EAAUC,QAI3C,QAAezb,IAAVqB,IACXka,GAAY,EAEN/f,EAAY6F,KACjBoa,GAAM,GAGFC,IAGCD,GACJpe,EAAGzC,KAAMoD,EAAOqD,GAChBhE,EAAK,OAILqe,EAAOre,EACPA,EAAK,SAAUkB,EAAMod,EAAMta,GAC1B,OAAOqa,EAAK9gB,KAAMsC,EAAQqB,GAAQ8C,MAKhChE,GACJ,KAAQhB,EAAI2C,EAAK3C,IAChBgB,EACCW,EAAO3B,GAAKgM,EAAKoT,EACjBpa,EACAA,EAAMzG,KAAMoD,EAAO3B,GAAKA,EAAGgB,EAAIW,EAAO3B,GAAKgM,KAM/C,OAAKkT,EACGvd,EAIH0d,EACGre,EAAGzC,KAAMoD,GAGVgB,EAAM3B,EAAIW,EAAO,GAAKqK,GAAQmT,GAKlCI,EAAY,QACfC,EAAa,YAGd,SAASC,EAAYC,EAAMC,GAC1B,OAAOA,EAAOC,cAMf,SAASC,EAAWC,GACnB,OAAOA,EAAO/b,QAASwb,EAAW,OAAQxb,QAASyb,EAAYC,GAEhE,IAAIM,EAAa,SAAUC,GAQ1B,OAA0B,IAAnBA,EAAM3gB,UAAqC,IAAnB2gB,EAAM3gB,YAAsB2gB,EAAM3gB,UAMlE,SAAS4gB,IACRniB,KAAK8F,QAAU/C,EAAO+C,QAAUqc,EAAKC,MAGtCD,EAAKC,IAAM,EAEXD,EAAK7e,UAAY,CAEhB2K,MAAO,SAAUiU,GAGhB,IAAIhb,EAAQgb,EAAOliB,KAAK8F,SA4BxB,OAzBMoB,IACLA,EAAQ,GAKH+a,EAAYC,KAIXA,EAAM3gB,SACV2gB,EAAOliB,KAAK8F,SAAYoB,EAMxB9G,OAAOiiB,eAAgBH,EAAOliB,KAAK8F,QAAS,CAC3CoB,MAAOA,EACPob,cAAc,MAMXpb,GAERqb,IAAK,SAAUL,EAAOM,EAAMtb,GAC3B,IAAIub,EACHxU,EAAQjO,KAAKiO,MAAOiU,GAIrB,GAAqB,iBAATM,EACXvU,EAAO8T,EAAWS,IAAWtb,OAM7B,IAAMub,KAAQD,EACbvU,EAAO8T,EAAWU,IAAWD,EAAMC,GAGrC,OAAOxU,GAERvK,IAAK,SAAUwe,EAAOhU,GACrB,YAAerI,IAARqI,EACNlO,KAAKiO,MAAOiU,GAGZA,EAAOliB,KAAK8F,UAAaoc,EAAOliB,KAAK8F,SAAWic,EAAW7T,KAE7DiT,OAAQ,SAAUe,EAAOhU,EAAKhH,GAa7B,YAAarB,IAARqI,GACCA,GAAsB,iBAARA,QAAgCrI,IAAVqB,EAElClH,KAAK0D,IAAKwe,EAAOhU,IASzBlO,KAAKuiB,IAAKL,EAAOhU,EAAKhH,QAILrB,IAAVqB,EAAsBA,EAAQgH,IAEtCyP,OAAQ,SAAUuE,EAAOhU,GACxB,IAAIhM,EACH+L,EAAQiU,EAAOliB,KAAK8F,SAErB,QAAeD,IAAVoI,EAAL,CAIA,QAAapI,IAARqI,EAAoB,CAkBxBhM,GAXCgM,EAJIvI,MAAMC,QAASsI,GAIbA,EAAI/J,IAAK4d,IAEf7T,EAAM6T,EAAW7T,MAIJD,EACZ,CAAEC,GACAA,EAAIrB,MAAOoP,IAAmB,IAG1B5Y,OAER,MAAQnB,WACA+L,EAAOC,EAAKhM,UAKR2D,IAARqI,GAAqBnL,EAAOyD,cAAeyH,MAM1CiU,EAAM3gB,SACV2gB,EAAOliB,KAAK8F,cAAYD,SAEjBqc,EAAOliB,KAAK8F,YAItB4c,QAAS,SAAUR,GAClB,IAAIjU,EAAQiU,EAAOliB,KAAK8F,SACxB,YAAiBD,IAAVoI,IAAwBlL,EAAOyD,cAAeyH,KAGvD,IAAI0U,EAAW,IAAIR,EAEfS,EAAW,IAAIT,EAcfU,EAAS,gCACZC,EAAa,SA2Bd,SAASC,EAAU3e,EAAM8J,EAAKsU,GAC7B,IAAIpd,EA1Baod,EA8BjB,QAAc3c,IAAT2c,GAAwC,IAAlBpe,EAAK7C,SAI/B,GAHA6D,EAAO,QAAU8I,EAAIjI,QAAS6c,EAAY,OAAQtb,cAG7B,iBAFrBgb,EAAOpe,EAAK7B,aAAc6C,IAEM,CAC/B,IACCod,EAnCW,UADGA,EAoCEA,IA/BL,UAATA,IAIS,SAATA,EACG,KAIHA,KAAUA,EAAO,IACbA,EAGJK,EAAOrV,KAAMgV,GACVQ,KAAKC,MAAOT,GAGbA,GAeH,MAAQhW,IAGVoW,EAASL,IAAKne,EAAM8J,EAAKsU,QAEzBA,OAAO3c,EAGT,OAAO2c,EAGRzf,EAAOmC,OAAQ,CACdwd,QAAS,SAAUte,GAClB,OAAOwe,EAASF,QAASte,IAAUue,EAASD,QAASte,IAGtDoe,KAAM,SAAUpe,EAAMgB,EAAMod,GAC3B,OAAOI,EAASzB,OAAQ/c,EAAMgB,EAAMod,IAGrCU,WAAY,SAAU9e,EAAMgB,GAC3Bwd,EAASjF,OAAQvZ,EAAMgB,IAKxB+d,MAAO,SAAU/e,EAAMgB,EAAMod,GAC5B,OAAOG,EAASxB,OAAQ/c,EAAMgB,EAAMod,IAGrCY,YAAa,SAAUhf,EAAMgB,GAC5Bud,EAAShF,OAAQvZ,EAAMgB,MAIzBrC,EAAOG,GAAGgC,OAAQ,CACjBsd,KAAM,SAAUtU,EAAKhH,GACpB,IAAIhF,EAAGkD,EAAMod,EACZpe,EAAOpE,KAAM,GACbyO,EAAQrK,GAAQA,EAAKuF,WAGtB,QAAa9D,IAARqI,EAAoB,CACxB,GAAKlO,KAAKqD,SACTmf,EAAOI,EAASlf,IAAKU,GAEE,IAAlBA,EAAK7C,WAAmBohB,EAASjf,IAAKU,EAAM,iBAAmB,CACnElC,EAAIuM,EAAMpL,OACV,MAAQnB,IAIFuM,EAAOvM,IAEsB,KADjCkD,EAAOqJ,EAAOvM,GAAIkD,MACRvE,QAAS,WAClBuE,EAAO2c,EAAW3c,EAAK9E,MAAO,IAC9ByiB,EAAU3e,EAAMgB,EAAMod,EAAMpd,KAI/Bud,EAASJ,IAAKne,EAAM,gBAAgB,GAItC,OAAOoe,EAIR,MAAoB,iBAARtU,EACJlO,KAAKiE,KAAM,WACjB2e,EAASL,IAAKviB,KAAMkO,KAIfiT,EAAQnhB,KAAM,SAAUkH,GAC9B,IAAIsb,EAOJ,GAAKpe,QAAkByB,IAAVqB,EAKZ,YAAcrB,KADd2c,EAAOI,EAASlf,IAAKU,EAAM8J,IAEnBsU,OAMM3c,KADd2c,EAAOO,EAAU3e,EAAM8J,IAEfsU,OAIR,EAIDxiB,KAAKiE,KAAM,WAGV2e,EAASL,IAAKviB,KAAMkO,EAAKhH,MAExB,KAAMA,EAA0B,EAAnB7C,UAAUhB,OAAY,MAAM,IAG7C6f,WAAY,SAAUhV,GACrB,OAAOlO,KAAKiE,KAAM,WACjB2e,EAASjF,OAAQ3d,KAAMkO,QAM1BnL,EAAOmC,OAAQ,CACdoY,MAAO,SAAUlZ,EAAM1C,EAAM8gB,GAC5B,IAAIlF,EAEJ,GAAKlZ,EAYJ,OAXA1C,GAASA,GAAQ,MAAS,QAC1B4b,EAAQqF,EAASjf,IAAKU,EAAM1C,GAGvB8gB,KACElF,GAAS3X,MAAMC,QAAS4c,GAC7BlF,EAAQqF,EAASxB,OAAQ/c,EAAM1C,EAAMqB,EAAO2D,UAAW8b,IAEvDlF,EAAM1c,KAAM4hB,IAGPlF,GAAS,IAIlB+F,QAAS,SAAUjf,EAAM1C,GACxBA,EAAOA,GAAQ,KAEf,IAAI4b,EAAQva,EAAOua,MAAOlZ,EAAM1C,GAC/B4hB,EAAchG,EAAMja,OACpBH,EAAKoa,EAAMlP,QACXmV,EAAQxgB,EAAOygB,YAAapf,EAAM1C,GAMvB,eAAPwB,IACJA,EAAKoa,EAAMlP,QACXkV,KAGIpgB,IAIU,OAATxB,GACJ4b,EAAM3L,QAAS,qBAIT4R,EAAME,KACbvgB,EAAGzC,KAAM2D,EApBF,WACNrB,EAAOsgB,QAASjf,EAAM1C,IAmBF6hB,KAGhBD,GAAeC,GACpBA,EAAM1N,MAAM2H,QAKdgG,YAAa,SAAUpf,EAAM1C,GAC5B,IAAIwM,EAAMxM,EAAO,aACjB,OAAOihB,EAASjf,IAAKU,EAAM8J,IAASyU,EAASxB,OAAQ/c,EAAM8J,EAAK,CAC/D2H,MAAO9S,EAAO+Z,UAAW,eAAgBvB,IAAK,WAC7CoH,EAAShF,OAAQvZ,EAAM,CAAE1C,EAAO,QAASwM,WAM7CnL,EAAOG,GAAGgC,OAAQ,CACjBoY,MAAO,SAAU5b,EAAM8gB,GACtB,IAAIkB,EAAS,EAQb,MANqB,iBAAThiB,IACX8gB,EAAO9gB,EACPA,EAAO,KACPgiB,KAGIrf,UAAUhB,OAASqgB,EAChB3gB,EAAOua,MAAOtd,KAAM,GAAK0B,QAGjBmE,IAAT2c,EACNxiB,KACAA,KAAKiE,KAAM,WACV,IAAIqZ,EAAQva,EAAOua,MAAOtd,KAAM0B,EAAM8gB,GAGtCzf,EAAOygB,YAAaxjB,KAAM0B,GAEZ,OAATA,GAAgC,eAAf4b,EAAO,IAC5Bva,EAAOsgB,QAASrjB,KAAM0B,MAI1B2hB,QAAS,SAAU3hB,GAClB,OAAO1B,KAAKiE,KAAM,WACjBlB,EAAOsgB,QAASrjB,KAAM0B,MAGxBiiB,WAAY,SAAUjiB,GACrB,OAAO1B,KAAKsd,MAAO5b,GAAQ,KAAM,KAKlCib,QAAS,SAAUjb,EAAMJ,GACxB,IAAIoP,EACHkT,EAAQ,EACRC,EAAQ9gB,EAAOgb,WACflM,EAAW7R,KACXkC,EAAIlC,KAAKqD,OACTkZ,EAAU,aACCqH,GACTC,EAAMtE,YAAa1N,EAAU,CAAEA,KAIb,iBAATnQ,IACXJ,EAAMI,EACNA,OAAOmE,GAERnE,EAAOA,GAAQ,KAEf,MAAQQ,KACPwO,EAAMiS,EAASjf,IAAKmO,EAAU3P,GAAKR,EAAO,gBAC9BgP,EAAImF,QACf+N,IACAlT,EAAImF,MAAM0F,IAAKgB,IAIjB,OADAA,IACOsH,EAAMlH,QAASrb,MAGxB,IAAIwiB,GAAO,sCAA0CC,OAEjDC,GAAU,IAAIla,OAAQ,iBAAmBga,GAAO,cAAe,KAG/DG,GAAY,CAAE,MAAO,QAAS,SAAU,QAExCvU,GAAkB9P,EAAS8P,gBAI1BwU,GAAa,SAAU9f,GACzB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAE7C+f,GAAW,CAAEA,UAAU,GAOnBzU,GAAgB0U,cACpBF,GAAa,SAAU9f,GACtB,OAAOrB,EAAOyF,SAAUpE,EAAK6I,cAAe7I,IAC3CA,EAAKggB,YAAaD,MAAe/f,EAAK6I,gBAG1C,IAAIoX,GAAqB,SAAUjgB,EAAMmK,GAOvC,MAA8B,UAH9BnK,EAAOmK,GAAMnK,GAGDkgB,MAAMC,SACM,KAAvBngB,EAAKkgB,MAAMC,SAMXL,GAAY9f,IAEsB,SAAlCrB,EAAOyhB,IAAKpgB,EAAM,YAKrB,SAASqgB,GAAWrgB,EAAMqe,EAAMiC,EAAYC,GAC3C,IAAIC,EAAUC,EACbC,EAAgB,GAChBC,EAAeJ,EACd,WACC,OAAOA,EAAM9V,OAEd,WACC,OAAO9L,EAAOyhB,IAAKpgB,EAAMqe,EAAM,KAEjCuC,EAAUD,IACVE,EAAOP,GAAcA,EAAY,KAAS3hB,EAAOmiB,UAAWzC,GAAS,GAAK,MAG1E0C,EAAgB/gB,EAAK7C,WAClBwB,EAAOmiB,UAAWzC,IAAmB,OAATwC,IAAkBD,IAChDhB,GAAQ9W,KAAMnK,EAAOyhB,IAAKpgB,EAAMqe,IAElC,GAAK0C,GAAiBA,EAAe,KAAQF,EAAO,CAInDD,GAAoB,EAGpBC,EAAOA,GAAQE,EAAe,GAG9BA,GAAiBH,GAAW,EAE5B,MAAQF,IAIP/hB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,IACnC,EAAIJ,IAAY,GAAMA,EAAQE,IAAiBC,GAAW,MAAW,IAC3EF,EAAgB,GAEjBK,GAAgCN,EAIjCM,GAAgC,EAChCpiB,EAAOuhB,MAAOlgB,EAAMqe,EAAM0C,EAAgBF,GAG1CP,EAAaA,GAAc,GAgB5B,OAbKA,IACJS,GAAiBA,IAAkBH,GAAW,EAG9CJ,EAAWF,EAAY,GACtBS,GAAkBT,EAAY,GAAM,GAAMA,EAAY,IACrDA,EAAY,GACTC,IACJA,EAAMM,KAAOA,EACbN,EAAM1Q,MAAQkR,EACdR,EAAM5f,IAAM6f,IAGPA,EAIR,IAAIQ,GAAoB,GAyBxB,SAASC,GAAUxT,EAAUyT,GAO5B,IANA,IAAIf,EAASngB,EAxBcA,EACvBuT,EACH1V,EACAmK,EACAmY,EAqBAgB,EAAS,GACTlK,EAAQ,EACRhY,EAASwO,EAASxO,OAGXgY,EAAQhY,EAAQgY,KACvBjX,EAAOyN,EAAUwJ,IACNiJ,QAIXC,EAAUngB,EAAKkgB,MAAMC,QAChBe,GAKa,SAAZf,IACJgB,EAAQlK,GAAUsH,EAASjf,IAAKU,EAAM,YAAe,KAC/CmhB,EAAQlK,KACbjX,EAAKkgB,MAAMC,QAAU,KAGK,KAAvBngB,EAAKkgB,MAAMC,SAAkBF,GAAoBjgB,KACrDmhB,EAAQlK,IA7CVkJ,EAFAtiB,EADG0V,OAAAA,EACH1V,GAF0BmC,EAiDaA,GA/C5B6I,cACXb,EAAWhI,EAAKgI,UAChBmY,EAAUa,GAAmBhZ,MAM9BuL,EAAO1V,EAAIujB,KAAK9iB,YAAaT,EAAII,cAAe+J,IAChDmY,EAAUxhB,EAAOyhB,IAAK7M,EAAM,WAE5BA,EAAKhV,WAAWC,YAAa+U,GAEZ,SAAZ4M,IACJA,EAAU,SAEXa,GAAmBhZ,GAAamY,MAkCb,SAAZA,IACJgB,EAAQlK,GAAU,OAGlBsH,EAASJ,IAAKne,EAAM,UAAWmgB,KAMlC,IAAMlJ,EAAQ,EAAGA,EAAQhY,EAAQgY,IACR,MAAnBkK,EAAQlK,KACZxJ,EAAUwJ,GAAQiJ,MAAMC,QAAUgB,EAAQlK,IAI5C,OAAOxJ,EAGR9O,EAAOG,GAAGgC,OAAQ,CACjBogB,KAAM,WACL,OAAOD,GAAUrlB,MAAM,IAExBylB,KAAM,WACL,OAAOJ,GAAUrlB,OAElB0lB,OAAQ,SAAUxH,GACjB,MAAsB,kBAAVA,EACJA,EAAQle,KAAKslB,OAAStlB,KAAKylB,OAG5BzlB,KAAKiE,KAAM,WACZogB,GAAoBrkB,MACxB+C,EAAQ/C,MAAOslB,OAEfviB,EAAQ/C,MAAOylB,YAKnB,IAUEE,GACAhV,GAXEiV,GAAiB,wBAEjBC,GAAW,iCAEXC,GAAc,qCAMhBH,GADc/lB,EAASmmB,yBACRrjB,YAAa9C,EAASyC,cAAe,SACpDsO,GAAQ/Q,EAASyC,cAAe,UAM3BG,aAAc,OAAQ,SAC5BmO,GAAMnO,aAAc,UAAW,WAC/BmO,GAAMnO,aAAc,OAAQ,KAE5BmjB,GAAIjjB,YAAaiO,IAIjBvP,EAAQ4kB,WAAaL,GAAIM,WAAW,GAAOA,WAAW,GAAO7R,UAAUsB,QAIvEiQ,GAAI/U,UAAY,yBAChBxP,EAAQ8kB,iBAAmBP,GAAIM,WAAW,GAAO7R,UAAUuF,aAK3DgM,GAAI/U,UAAY,oBAChBxP,EAAQ+kB,SAAWR,GAAIvR,UAKxB,IAAIgS,GAAU,CAKbC,MAAO,CAAE,EAAG,UAAW,YACvBC,IAAK,CAAE,EAAG,oBAAqB,uBAC/BC,GAAI,CAAE,EAAG,iBAAkB,oBAC3BC,GAAI,CAAE,EAAG,qBAAsB,yBAE/BC,SAAU,CAAE,EAAG,GAAI,KAYpB,SAASC,GAAQzjB,EAASwN,GAIzB,IAAI3M,EAYJ,OATCA,EAD4C,oBAAjCb,EAAQoK,qBACbpK,EAAQoK,qBAAsBoD,GAAO,KAEI,oBAA7BxN,EAAQ4K,iBACpB5K,EAAQ4K,iBAAkB4C,GAAO,KAGjC,QAGM5K,IAAR4K,GAAqBA,GAAOrE,EAAUnJ,EAASwN,GAC5C1N,EAAOgB,MAAO,CAAEd,GAAWa,GAG5BA,EAKR,SAAS6iB,GAAe9iB,EAAO+iB,GAI9B,IAHA,IAAI1kB,EAAI,EACPiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IACdygB,EAASJ,IACR1e,EAAO3B,GACP,cACC0kB,GAAejE,EAASjf,IAAKkjB,EAAa1kB,GAAK,eA1CnDkkB,GAAQS,MAAQT,GAAQU,MAAQV,GAAQW,SAAWX,GAAQY,QAAUZ,GAAQC,MAC7ED,GAAQa,GAAKb,GAAQI,GAGfplB,EAAQ+kB,SACbC,GAAQc,SAAWd,GAAQD,OAAS,CAAE,EAAG,+BAAgC,cA2C1E,IAAIrb,GAAQ,YAEZ,SAASqc,GAAetjB,EAAOZ,EAASmkB,EAASC,EAAWC,GAO3D,IANA,IAAIljB,EAAMsM,EAAKD,EAAK8W,EAAMC,EAAU1iB,EACnC2iB,EAAWxkB,EAAQ8iB,yBACnB2B,EAAQ,GACRxlB,EAAI,EACJiZ,EAAItX,EAAMR,OAEHnB,EAAIiZ,EAAGjZ,IAGd,IAFAkC,EAAOP,EAAO3B,KAEQ,IAATkC,EAGZ,GAAwB,WAAnBvB,EAAQuB,GAIZrB,EAAOgB,MAAO2jB,EAAOtjB,EAAK7C,SAAW,CAAE6C,GAASA,QAG1C,GAAM0G,GAAM0C,KAAMpJ,GAIlB,CACNsM,EAAMA,GAAO+W,EAAS/kB,YAAaO,EAAQZ,cAAe,QAG1DoO,GAAQoV,GAAS3Y,KAAM9I,IAAU,CAAE,GAAI,KAAQ,GAAIoD,cACnD+f,EAAOnB,GAAS3V,IAAS2V,GAAQK,SACjC/V,EAAIE,UAAY2W,EAAM,GAAMxkB,EAAO4kB,cAAevjB,GAASmjB,EAAM,GAGjEziB,EAAIyiB,EAAM,GACV,MAAQziB,IACP4L,EAAMA,EAAI0D,UAKXrR,EAAOgB,MAAO2jB,EAAOhX,EAAInE,aAGzBmE,EAAM+W,EAASnV,YAGXD,YAAc,QAzBlBqV,EAAM9mB,KAAMqC,EAAQ2kB,eAAgBxjB,IA+BvCqjB,EAASpV,YAAc,GAEvBnQ,EAAI,EACJ,MAAUkC,EAAOsjB,EAAOxlB,KAGvB,GAAKmlB,IAAkD,EAArCtkB,EAAO6D,QAASxC,EAAMijB,GAClCC,GACJA,EAAQ1mB,KAAMwD,QAgBhB,GAXAojB,EAAWtD,GAAY9f,GAGvBsM,EAAMgW,GAAQe,EAAS/kB,YAAa0B,GAAQ,UAGvCojB,GACJb,GAAejW,GAIX0W,EAAU,CACdtiB,EAAI,EACJ,MAAUV,EAAOsM,EAAK5L,KAChBghB,GAAYtY,KAAMpJ,EAAK1C,MAAQ,KACnC0lB,EAAQxmB,KAAMwD,GAMlB,OAAOqjB,EAIR,IACCI,GAAY,OACZC,GAAc,iDACdC,GAAiB,sBAElB,SAASC,KACR,OAAO,EAGR,SAASC,KACR,OAAO,EASR,SAASC,GAAY9jB,EAAM1C,GAC1B,OAAS0C,IAMV,WACC,IACC,OAAOxE,EAASyV,cACf,MAAQ8S,KATQC,KAAqC,UAAT1mB,GAY/C,SAAS2mB,GAAIjkB,EAAMkkB,EAAOtlB,EAAUwf,EAAMtf,EAAIqlB,GAC7C,IAAIC,EAAQ9mB,EAGZ,GAAsB,iBAAV4mB,EAAqB,CAShC,IAAM5mB,IANmB,iBAAbsB,IAGXwf,EAAOA,GAAQxf,EACfA,OAAW6C,GAEEyiB,EACbD,GAAIjkB,EAAM1C,EAAMsB,EAAUwf,EAAM8F,EAAO5mB,GAAQ6mB,GAEhD,OAAOnkB,EAsBR,GAnBa,MAARoe,GAAsB,MAANtf,GAGpBA,EAAKF,EACLwf,EAAOxf,OAAW6C,GACD,MAAN3C,IACc,iBAAbF,GAGXE,EAAKsf,EACLA,OAAO3c,IAIP3C,EAAKsf,EACLA,EAAOxf,EACPA,OAAW6C,KAGD,IAAP3C,EACJA,EAAK+kB,QACC,IAAM/kB,EACZ,OAAOkB,EAeR,OAZa,IAARmkB,IACJC,EAAStlB,GACTA,EAAK,SAAUulB,GAId,OADA1lB,IAAS2lB,IAAKD,GACPD,EAAO7nB,MAAOX,KAAMqE,aAIzB8C,KAAOqhB,EAAOrhB,OAAUqhB,EAAOrhB,KAAOpE,EAAOoE,SAE1C/C,EAAKH,KAAM,WACjBlB,EAAO0lB,MAAMlN,IAAKvb,KAAMsoB,EAAOplB,EAAIsf,EAAMxf,KA+a3C,SAAS2lB,GAAgBpa,EAAI7M,EAAMwmB,GAG5BA,GAQNvF,EAASJ,IAAKhU,EAAI7M,GAAM,GACxBqB,EAAO0lB,MAAMlN,IAAKhN,EAAI7M,EAAM,CAC3B8N,WAAW,EACXd,QAAS,SAAU+Z,GAClB,IAAIG,EAAUtV,EACbuV,EAAQlG,EAASjf,IAAK1D,KAAM0B,GAE7B,GAAyB,EAAlB+mB,EAAMK,WAAmB9oB,KAAM0B,IAKrC,GAAMmnB,EAAMxlB,QAiCEN,EAAO0lB,MAAMvJ,QAASxd,IAAU,IAAKqnB,cAClDN,EAAMO,uBAfN,GAdAH,EAAQvoB,EAAMG,KAAM4D,WACpBse,EAASJ,IAAKviB,KAAM0B,EAAMmnB,GAK1BD,EAAWV,EAAYloB,KAAM0B,GAC7B1B,KAAM0B,KAEDmnB,KADLvV,EAASqP,EAASjf,IAAK1D,KAAM0B,KACJknB,EACxBjG,EAASJ,IAAKviB,KAAM0B,GAAM,GAE1B4R,EAAS,GAELuV,IAAUvV,EAKd,OAFAmV,EAAMQ,2BACNR,EAAMS,iBACC5V,EAAOpM,WAeL2hB,EAAMxlB,SAGjBsf,EAASJ,IAAKviB,KAAM0B,EAAM,CACzBwF,MAAOnE,EAAO0lB,MAAMU,QAInBpmB,EAAOmC,OAAQ2jB,EAAO,GAAK9lB,EAAOqmB,MAAM9lB,WACxCulB,EAAMvoB,MAAO,GACbN,QAKFyoB,EAAMQ,qCAzE0BpjB,IAA7B8c,EAASjf,IAAK6K,EAAI7M,IACtBqB,EAAO0lB,MAAMlN,IAAKhN,EAAI7M,EAAMsmB,IA5a/BjlB,EAAO0lB,MAAQ,CAEdjpB,OAAQ,GAER+b,IAAK,SAAUnX,EAAMkkB,EAAO5Z,EAAS8T,EAAMxf,GAE1C,IAAIqmB,EAAaC,EAAa5Y,EAC7B6Y,EAAQC,EAAGC,EACXvK,EAASwK,EAAUhoB,EAAMioB,EAAYC,EACrCC,EAAWlH,EAASjf,IAAKU,GAG1B,GAAM6d,EAAY7d,GAAlB,CAKKsK,EAAQA,UAEZA,GADA2a,EAAc3a,GACQA,QACtB1L,EAAWqmB,EAAYrmB,UAKnBA,GACJD,EAAOwN,KAAKM,gBAAiBnB,GAAiB1M,GAIzC0L,EAAQvH,OACbuH,EAAQvH,KAAOpE,EAAOoE,SAIfoiB,EAASM,EAASN,UACzBA,EAASM,EAASN,OAASnpB,OAAO0pB,OAAQ,QAEnCR,EAAcO,EAASE,UAC9BT,EAAcO,EAASE,OAAS,SAAUvd,GAIzC,MAAyB,oBAAXzJ,GAA0BA,EAAO0lB,MAAMuB,YAAcxd,EAAE9K,KACpEqB,EAAO0lB,MAAMwB,SAAStpB,MAAOyD,EAAMC,gBAAcwB,IAMpD2jB,GADAlB,GAAUA,GAAS,IAAKzb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQmmB,IAEP9nB,EAAOkoB,GADPlZ,EAAMqX,GAAe7a,KAAMob,EAAOkB,KAAS,IACpB,GACvBG,GAAejZ,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,IAKNwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAG1CA,GAASsB,EAAWkc,EAAQ6J,aAAe7J,EAAQgL,WAAcxoB,EAGjEwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAG1C+nB,EAAY1mB,EAAOmC,OAAQ,CAC1BxD,KAAMA,EACNkoB,SAAUA,EACVpH,KAAMA,EACN9T,QAASA,EACTvH,KAAMuH,EAAQvH,KACdnE,SAAUA,EACV6H,aAAc7H,GAAYD,EAAO6O,KAAK/E,MAAMhC,aAAa2C,KAAMxK,GAC/DwM,UAAWma,EAAW/b,KAAM,MAC1Byb,IAGKK,EAAWH,EAAQ7nB,OAC1BgoB,EAAWH,EAAQ7nB,GAAS,IACnByoB,cAAgB,EAGnBjL,EAAQkL,QACiD,IAA9DlL,EAAQkL,MAAM3pB,KAAM2D,EAAMoe,EAAMmH,EAAYL,IAEvCllB,EAAK2L,kBACT3L,EAAK2L,iBAAkBrO,EAAM4nB,IAK3BpK,EAAQ3D,MACZ2D,EAAQ3D,IAAI9a,KAAM2D,EAAMqlB,GAElBA,EAAU/a,QAAQvH,OACvBsiB,EAAU/a,QAAQvH,KAAOuH,EAAQvH,OAK9BnE,EACJ0mB,EAASzkB,OAAQykB,EAASS,gBAAiB,EAAGV,GAE9CC,EAAS9oB,KAAM6oB,GAIhB1mB,EAAO0lB,MAAMjpB,OAAQkC,IAAS,KAMhCic,OAAQ,SAAUvZ,EAAMkkB,EAAO5Z,EAAS1L,EAAUqnB,GAEjD,IAAIvlB,EAAGwlB,EAAW5Z,EACjB6Y,EAAQC,EAAGC,EACXvK,EAASwK,EAAUhoB,EAAMioB,EAAYC,EACrCC,EAAWlH,EAASD,QAASte,IAAUue,EAASjf,IAAKU,GAEtD,GAAMylB,IAAeN,EAASM,EAASN,QAAvC,CAMAC,GADAlB,GAAUA,GAAS,IAAKzb,MAAOoP,IAAmB,CAAE,KAC1C5Y,OACV,MAAQmmB,IAMP,GAJA9nB,EAAOkoB,GADPlZ,EAAMqX,GAAe7a,KAAMob,EAAOkB,KAAS,IACpB,GACvBG,GAAejZ,EAAK,IAAO,IAAKpJ,MAAO,KAAMtC,OAGvCtD,EAAN,CAOAwd,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GAE1CgoB,EAAWH,EADX7nB,GAASsB,EAAWkc,EAAQ6J,aAAe7J,EAAQgL,WAAcxoB,IACpC,GAC7BgP,EAAMA,EAAK,IACV,IAAI5G,OAAQ,UAAY6f,EAAW/b,KAAM,iBAAoB,WAG9D0c,EAAYxlB,EAAI4kB,EAASrmB,OACzB,MAAQyB,IACP2kB,EAAYC,EAAU5kB,IAEfulB,GAAeT,IAAaH,EAAUG,UACzClb,GAAWA,EAAQvH,OAASsiB,EAAUtiB,MACtCuJ,IAAOA,EAAIlD,KAAMic,EAAUja,YAC3BxM,GAAYA,IAAaymB,EAAUzmB,WACxB,OAAbA,IAAqBymB,EAAUzmB,YAChC0mB,EAASzkB,OAAQH,EAAG,GAEf2kB,EAAUzmB,UACd0mB,EAASS,gBAELjL,EAAQvB,QACZuB,EAAQvB,OAAOld,KAAM2D,EAAMqlB,IAOzBa,IAAcZ,EAASrmB,SACrB6b,EAAQqL,WACkD,IAA/DrL,EAAQqL,SAAS9pB,KAAM2D,EAAMulB,EAAYE,EAASE,SAElDhnB,EAAOynB,YAAapmB,EAAM1C,EAAMmoB,EAASE,eAGnCR,EAAQ7nB,SA1Cf,IAAMA,KAAQ6nB,EACbxmB,EAAO0lB,MAAM9K,OAAQvZ,EAAM1C,EAAO4mB,EAAOkB,GAAK9a,EAAS1L,GAAU,GA8C/DD,EAAOyD,cAAe+iB,IAC1B5G,EAAShF,OAAQvZ,EAAM,mBAIzB6lB,SAAU,SAAUQ,GAEnB,IAAIvoB,EAAG4C,EAAGhB,EAAK4Q,EAAS+U,EAAWiB,EAClCnW,EAAO,IAAI5O,MAAOtB,UAAUhB,QAG5BolB,EAAQ1lB,EAAO0lB,MAAMkC,IAAKF,GAE1Bf,GACE/G,EAASjf,IAAK1D,KAAM,WAAcI,OAAO0pB,OAAQ,OAC/CrB,EAAM/mB,OAAU,GACpBwd,EAAUnc,EAAO0lB,MAAMvJ,QAASuJ,EAAM/mB,OAAU,GAKjD,IAFA6S,EAAM,GAAMkU,EAENvmB,EAAI,EAAGA,EAAImC,UAAUhB,OAAQnB,IAClCqS,EAAMrS,GAAMmC,UAAWnC,GAMxB,GAHAumB,EAAMmC,eAAiB5qB,MAGlBkf,EAAQ2L,cAA2D,IAA5C3L,EAAQ2L,YAAYpqB,KAAMT,KAAMyoB,GAA5D,CAKAiC,EAAe3nB,EAAO0lB,MAAMiB,SAASjpB,KAAMT,KAAMyoB,EAAOiB,GAGxDxnB,EAAI,EACJ,OAAUwS,EAAUgW,EAAcxoB,QAAYumB,EAAMqC,uBAAyB,CAC5ErC,EAAMsC,cAAgBrW,EAAQtQ,KAE9BU,EAAI,EACJ,OAAU2kB,EAAY/U,EAAQgV,SAAU5kB,QACtC2jB,EAAMuC,gCAIDvC,EAAMwC,aAAsC,IAAxBxB,EAAUja,YACnCiZ,EAAMwC,WAAWzd,KAAMic,EAAUja,aAEjCiZ,EAAMgB,UAAYA,EAClBhB,EAAMjG,KAAOiH,EAAUjH,UAKV3c,KAHb/B,IAAUf,EAAO0lB,MAAMvJ,QAASuK,EAAUG,WAAc,IAAKG,QAC5DN,EAAU/a,SAAU/N,MAAO+T,EAAQtQ,KAAMmQ,MAGT,KAAzBkU,EAAMnV,OAASxP,KACrB2kB,EAAMS,iBACNT,EAAMO,oBAYX,OAJK9J,EAAQgM,cACZhM,EAAQgM,aAAazqB,KAAMT,KAAMyoB,GAG3BA,EAAMnV,SAGdoW,SAAU,SAAUjB,EAAOiB,GAC1B,IAAIxnB,EAAGunB,EAAWzX,EAAKmZ,EAAiBC,EACvCV,EAAe,GACfP,EAAgBT,EAASS,cACzBtb,EAAM4Z,EAAMjjB,OAGb,GAAK2kB,GAIJtb,EAAItN,YAOc,UAAfknB,EAAM/mB,MAAoC,GAAhB+mB,EAAM1S,QAEnC,KAAQlH,IAAQ7O,KAAM6O,EAAMA,EAAIlM,YAAc3C,KAI7C,GAAsB,IAAjB6O,EAAItN,WAAoC,UAAfknB,EAAM/mB,OAAqC,IAAjBmN,EAAI1C,UAAsB,CAGjF,IAFAgf,EAAkB,GAClBC,EAAmB,GACblpB,EAAI,EAAGA,EAAIioB,EAAejoB,SAME2D,IAA5BulB,EAFLpZ,GAHAyX,EAAYC,EAAUxnB,IAGNc,SAAW,OAG1BooB,EAAkBpZ,GAAQyX,EAAU5e,cACC,EAApC9H,EAAQiP,EAAKhS,MAAOqb,MAAOxM,GAC3B9L,EAAOwN,KAAMyB,EAAKhS,KAAM,KAAM,CAAE6O,IAAQxL,QAErC+nB,EAAkBpZ,IACtBmZ,EAAgBvqB,KAAM6oB,GAGnB0B,EAAgB9nB,QACpBqnB,EAAa9pB,KAAM,CAAEwD,KAAMyK,EAAK6a,SAAUyB,IAY9C,OALAtc,EAAM7O,KACDmqB,EAAgBT,EAASrmB,QAC7BqnB,EAAa9pB,KAAM,CAAEwD,KAAMyK,EAAK6a,SAAUA,EAASppB,MAAO6pB,KAGpDO,GAGRW,QAAS,SAAUjmB,EAAMkmB,GACxBlrB,OAAOiiB,eAAgBtf,EAAOqmB,MAAM9lB,UAAW8B,EAAM,CACpDmmB,YAAY,EACZjJ,cAAc,EAEd5e,IAAKrC,EAAYiqB,GAChB,WACC,GAAKtrB,KAAKwrB,cACR,OAAOF,EAAMtrB,KAAKwrB,gBAGrB,WACC,GAAKxrB,KAAKwrB,cACR,OAAOxrB,KAAKwrB,cAAepmB,IAI/Bmd,IAAK,SAAUrb,GACd9G,OAAOiiB,eAAgBriB,KAAMoF,EAAM,CAClCmmB,YAAY,EACZjJ,cAAc,EACdmJ,UAAU,EACVvkB,MAAOA,QAMXyjB,IAAK,SAAUa,GACd,OAAOA,EAAezoB,EAAO+C,SAC5B0lB,EACA,IAAIzoB,EAAOqmB,MAAOoC,IAGpBtM,QAAS,CACRwM,KAAM,CAGLC,UAAU,GAEXC,MAAO,CAGNxB,MAAO,SAAU5H,GAIhB,IAAIjU,EAAKvO,MAAQwiB,EAWjB,OARKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGqd,OAASxf,EAAUmC,EAAI,UAG1Boa,GAAgBpa,EAAI,QAASyZ,KAIvB,GAERmB,QAAS,SAAU3G,GAIlB,IAAIjU,EAAKvO,MAAQwiB,EAUjB,OAPKoD,GAAepY,KAAMe,EAAG7M,OAC5B6M,EAAGqd,OAASxf,EAAUmC,EAAI,UAE1Boa,GAAgBpa,EAAI,UAId,GAKRkY,SAAU,SAAUgC,GACnB,IAAIjjB,EAASijB,EAAMjjB,OACnB,OAAOogB,GAAepY,KAAMhI,EAAO9D,OAClC8D,EAAOomB,OAASxf,EAAU5G,EAAQ,UAClCmd,EAASjf,IAAK8B,EAAQ,UACtB4G,EAAU5G,EAAQ,OAIrBqmB,aAAc,CACbX,aAAc,SAAUzC,QAID5iB,IAAjB4iB,EAAMnV,QAAwBmV,EAAM+C,gBACxC/C,EAAM+C,cAAcM,YAAcrD,EAAMnV,YA8F7CvQ,EAAOynB,YAAc,SAAUpmB,EAAM1C,EAAMqoB,GAGrC3lB,EAAK0c,qBACT1c,EAAK0c,oBAAqBpf,EAAMqoB,IAIlChnB,EAAOqmB,MAAQ,SAAUznB,EAAKoqB,GAG7B,KAAQ/rB,gBAAgB+C,EAAOqmB,OAC9B,OAAO,IAAIrmB,EAAOqmB,MAAOznB,EAAKoqB,GAI1BpqB,GAAOA,EAAID,MACf1B,KAAKwrB,cAAgB7pB,EACrB3B,KAAK0B,KAAOC,EAAID,KAIhB1B,KAAKgsB,mBAAqBrqB,EAAIsqB,uBACHpmB,IAAzBlE,EAAIsqB,mBAGgB,IAApBtqB,EAAImqB,YACL9D,GACAC,GAKDjoB,KAAKwF,OAAW7D,EAAI6D,QAAkC,IAAxB7D,EAAI6D,OAAOjE,SACxCI,EAAI6D,OAAO7C,WACXhB,EAAI6D,OAELxF,KAAK+qB,cAAgBppB,EAAIopB,cACzB/qB,KAAKksB,cAAgBvqB,EAAIuqB,eAIzBlsB,KAAK0B,KAAOC,EAIRoqB,GACJhpB,EAAOmC,OAAQlF,KAAM+rB,GAItB/rB,KAAKmsB,UAAYxqB,GAAOA,EAAIwqB,WAAa1jB,KAAK2jB,MAG9CpsB,KAAM+C,EAAO+C,UAAY,GAK1B/C,EAAOqmB,MAAM9lB,UAAY,CACxBE,YAAaT,EAAOqmB,MACpB4C,mBAAoB/D,GACpB6C,qBAAsB7C,GACtB+C,8BAA+B/C,GAC/BoE,aAAa,EAEbnD,eAAgB,WACf,IAAI1c,EAAIxM,KAAKwrB,cAEbxrB,KAAKgsB,mBAAqBhE,GAErBxb,IAAMxM,KAAKqsB,aACf7f,EAAE0c,kBAGJF,gBAAiB,WAChB,IAAIxc,EAAIxM,KAAKwrB,cAEbxrB,KAAK8qB,qBAAuB9C,GAEvBxb,IAAMxM,KAAKqsB,aACf7f,EAAEwc,mBAGJC,yBAA0B,WACzB,IAAIzc,EAAIxM,KAAKwrB,cAEbxrB,KAAKgrB,8BAAgChD,GAEhCxb,IAAMxM,KAAKqsB,aACf7f,EAAEyc,2BAGHjpB,KAAKgpB,oBAKPjmB,EAAOkB,KAAM,CACZqoB,QAAQ,EACRC,SAAS,EACTC,YAAY,EACZC,gBAAgB,EAChBC,SAAS,EACTC,QAAQ,EACRC,YAAY,EACZC,SAAS,EACTC,OAAO,EACPC,OAAO,EACPC,UAAU,EACVC,MAAM,EACNC,QAAQ,EACRnrB,MAAM,EACNorB,UAAU,EACVjf,KAAK,EACLkf,SAAS,EACTrX,QAAQ,EACRsX,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,SAAS,EACTC,WAAW,EACXC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,eAAe,EACfC,WAAW,EACXC,SAAS,EAETC,MAAO,SAAUxF,GAChB,IAAI1S,EAAS0S,EAAM1S,OAGnB,OAAoB,MAAf0S,EAAMwF,OAAiBpG,GAAUra,KAAMib,EAAM/mB,MACxB,MAAlB+mB,EAAM0E,SAAmB1E,EAAM0E,SAAW1E,EAAM2E,SAIlD3E,EAAMwF,YAAoBpoB,IAAXkQ,GAAwB+R,GAAYta,KAAMib,EAAM/mB,MACtD,EAATqU,EACG,EAGM,EAATA,EACG,EAGM,EAATA,EACG,EAGD,EAGD0S,EAAMwF,QAEZlrB,EAAO0lB,MAAM4C,SAEhBtoB,EAAOkB,KAAM,CAAEmR,MAAO,UAAW8Y,KAAM,YAAc,SAAUxsB,EAAMqnB,GACpEhmB,EAAO0lB,MAAMvJ,QAASxd,GAAS,CAG9B0oB,MAAO,WAQN,OAHAzB,GAAgB3oB,KAAM0B,EAAMwmB,KAGrB,GAERiB,QAAS,WAMR,OAHAR,GAAgB3oB,KAAM0B,IAGf,GAGRqnB,aAAcA,KAYhBhmB,EAAOkB,KAAM,CACZkqB,WAAY,YACZC,WAAY,WACZC,aAAc,cACdC,aAAc,cACZ,SAAUC,EAAM5D,GAClB5nB,EAAO0lB,MAAMvJ,QAASqP,GAAS,CAC9BxF,aAAc4B,EACdT,SAAUS,EAEVZ,OAAQ,SAAUtB,GACjB,IAAI3kB,EAEH0qB,EAAU/F,EAAMyD,cAChBzC,EAAYhB,EAAMgB,UASnB,OALM+E,IAAaA,IANTxuB,MAMgC+C,EAAOyF,SANvCxI,KAMyDwuB,MAClE/F,EAAM/mB,KAAO+nB,EAAUG,SACvB9lB,EAAM2lB,EAAU/a,QAAQ/N,MAAOX,KAAMqE,WACrCokB,EAAM/mB,KAAOipB,GAEP7mB,MAKVf,EAAOG,GAAGgC,OAAQ,CAEjBmjB,GAAI,SAAUC,EAAOtlB,EAAUwf,EAAMtf,GACpC,OAAOmlB,GAAIroB,KAAMsoB,EAAOtlB,EAAUwf,EAAMtf,IAEzCqlB,IAAK,SAAUD,EAAOtlB,EAAUwf,EAAMtf,GACrC,OAAOmlB,GAAIroB,KAAMsoB,EAAOtlB,EAAUwf,EAAMtf,EAAI,IAE7CwlB,IAAK,SAAUJ,EAAOtlB,EAAUE,GAC/B,IAAIumB,EAAW/nB,EACf,GAAK4mB,GAASA,EAAMY,gBAAkBZ,EAAMmB,UAW3C,OARAA,EAAYnB,EAAMmB,UAClB1mB,EAAQulB,EAAMsC,gBAAiBlC,IAC9Be,EAAUja,UACTia,EAAUG,SAAW,IAAMH,EAAUja,UACrCia,EAAUG,SACXH,EAAUzmB,SACVymB,EAAU/a,SAEJ1O,KAER,GAAsB,iBAAVsoB,EAAqB,CAGhC,IAAM5mB,KAAQ4mB,EACbtoB,KAAK0oB,IAAKhnB,EAAMsB,EAAUslB,EAAO5mB,IAElC,OAAO1B,KAWR,OATkB,IAAbgD,GAA0C,mBAAbA,IAGjCE,EAAKF,EACLA,OAAW6C,IAEA,IAAP3C,IACJA,EAAK+kB,IAECjoB,KAAKiE,KAAM,WACjBlB,EAAO0lB,MAAM9K,OAAQ3d,KAAMsoB,EAAOplB,EAAIF,QAMzC,IAKCyrB,GAAe,wBAGfC,GAAW,oCACXC,GAAe,2CAGhB,SAASC,GAAoBxqB,EAAM2X,GAClC,OAAK3P,EAAUhI,EAAM,UACpBgI,EAA+B,KAArB2P,EAAQxa,SAAkBwa,EAAUA,EAAQzJ,WAAY,OAE3DvP,EAAQqB,GAAO0W,SAAU,SAAW,IAGrC1W,EAIR,SAASyqB,GAAezqB,GAEvB,OADAA,EAAK1C,MAAyC,OAAhC0C,EAAK7B,aAAc,SAAsB,IAAM6B,EAAK1C,KAC3D0C,EAER,SAAS0qB,GAAe1qB,GAOvB,MAN2C,WAApCA,EAAK1C,MAAQ,IAAKpB,MAAO,EAAG,GAClC8D,EAAK1C,KAAO0C,EAAK1C,KAAKpB,MAAO,GAE7B8D,EAAK2J,gBAAiB,QAGhB3J,EAGR,SAAS2qB,GAAgBptB,EAAKqtB,GAC7B,IAAI9sB,EAAGiZ,EAAGzZ,EAAgButB,EAAUC,EAAU3F,EAE9C,GAAuB,IAAlByF,EAAKztB,SAAV,CAKA,GAAKohB,EAASD,QAAS/gB,KAEtB4nB,EADW5G,EAASjf,IAAK/B,GACP4nB,QAKjB,IAAM7nB,KAFNihB,EAAShF,OAAQqR,EAAM,iBAETzF,EACb,IAAMrnB,EAAI,EAAGiZ,EAAIoO,EAAQ7nB,GAAO2B,OAAQnB,EAAIiZ,EAAGjZ,IAC9Ca,EAAO0lB,MAAMlN,IAAKyT,EAAMttB,EAAM6nB,EAAQ7nB,GAAQQ,IAO7C0gB,EAASF,QAAS/gB,KACtBstB,EAAWrM,EAASzB,OAAQxf,GAC5ButB,EAAWnsB,EAAOmC,OAAQ,GAAI+pB,GAE9BrM,EAASL,IAAKyM,EAAME,KAkBtB,SAASC,GAAUC,EAAY7a,EAAMrQ,EAAUojB,GAG9C/S,EAAOhU,EAAMgU,GAEb,IAAIkT,EAAUnjB,EAAO8iB,EAASiI,EAAYrtB,EAAMC,EAC/CC,EAAI,EACJiZ,EAAIiU,EAAW/rB,OACfisB,EAAWnU,EAAI,EACfjU,EAAQqN,EAAM,GACdgb,EAAkBluB,EAAY6F,GAG/B,GAAKqoB,GACG,EAAJpU,GAA0B,iBAAVjU,IAChB9F,EAAQ4kB,YAAc0I,GAASlhB,KAAMtG,GACxC,OAAOkoB,EAAWnrB,KAAM,SAAUoX,GACjC,IAAIb,EAAO4U,EAAW7qB,GAAI8W,GACrBkU,IACJhb,EAAM,GAAMrN,EAAMzG,KAAMT,KAAMqb,EAAOb,EAAKgV,SAE3CL,GAAU3U,EAAMjG,EAAMrQ,EAAUojB,KAIlC,GAAKnM,IAEJ7W,GADAmjB,EAAWN,GAAe5S,EAAM6a,EAAY,GAAIniB,eAAe,EAAOmiB,EAAY9H,IACjEhV,WAEmB,IAA/BmV,EAASlb,WAAWlJ,SACxBokB,EAAWnjB,GAIPA,GAASgjB,GAAU,CAOvB,IALA+H,GADAjI,EAAUrkB,EAAOoB,IAAKuiB,GAAQe,EAAU,UAAYoH,KAC/BxrB,OAKbnB,EAAIiZ,EAAGjZ,IACdF,EAAOylB,EAEFvlB,IAAMotB,IACVttB,EAAOe,EAAOwC,MAAOvD,GAAM,GAAM,GAG5BqtB,GAIJtsB,EAAOgB,MAAOqjB,EAASV,GAAQ1kB,EAAM,YAIvCkC,EAASzD,KAAM2uB,EAAYltB,GAAKF,EAAME,GAGvC,GAAKmtB,EAOJ,IANAptB,EAAMmlB,EAASA,EAAQ/jB,OAAS,GAAI4J,cAGpClK,EAAOoB,IAAKijB,EAAS0H,IAGf5sB,EAAI,EAAGA,EAAImtB,EAAYntB,IAC5BF,EAAOolB,EAASllB,GACX4jB,GAAYtY,KAAMxL,EAAKN,MAAQ,MAClCihB,EAASxB,OAAQnf,EAAM,eACxBe,EAAOyF,SAAUvG,EAAKD,KAEjBA,EAAKL,KAA8C,YAArCK,EAAKN,MAAQ,IAAK8F,cAG/BzE,EAAO0sB,WAAaztB,EAAKH,UAC7BkB,EAAO0sB,SAAUztB,EAAKL,IAAK,CAC1BC,MAAOI,EAAKJ,OAASI,EAAKO,aAAc,UACtCN,GAGJH,EAASE,EAAKqQ,YAAYpM,QAAS0oB,GAAc,IAAM3sB,EAAMC,IAQnE,OAAOmtB,EAGR,SAASzR,GAAQvZ,EAAMpB,EAAU0sB,GAKhC,IAJA,IAAI1tB,EACH0lB,EAAQ1kB,EAAWD,EAAOsN,OAAQrN,EAAUoB,GAASA,EACrDlC,EAAI,EAE4B,OAAvBF,EAAO0lB,EAAOxlB,IAAeA,IAChCwtB,GAA8B,IAAlB1tB,EAAKT,UACtBwB,EAAO4sB,UAAWjJ,GAAQ1kB,IAGtBA,EAAKW,aACJ+sB,GAAYxL,GAAYliB,IAC5B2kB,GAAeD,GAAQ1kB,EAAM,WAE9BA,EAAKW,WAAWC,YAAaZ,IAI/B,OAAOoC,EAGRrB,EAAOmC,OAAQ,CACdyiB,cAAe,SAAU6H,GACxB,OAAOA,GAGRjqB,MAAO,SAAUnB,EAAMwrB,EAAeC,GACrC,IAAI3tB,EAAGiZ,EAAG2U,EAAaC,EApINpuB,EAAKqtB,EACnB5iB,EAoIF7G,EAAQnB,EAAK6hB,WAAW,GACxB+J,EAAS9L,GAAY9f,GAGtB,KAAMhD,EAAQ8kB,gBAAsC,IAAlB9hB,EAAK7C,UAAoC,KAAlB6C,EAAK7C,UAC3DwB,EAAO8W,SAAUzV,IAMnB,IAHA2rB,EAAerJ,GAAQnhB,GAGjBrD,EAAI,EAAGiZ,GAFb2U,EAAcpJ,GAAQtiB,IAEOf,OAAQnB,EAAIiZ,EAAGjZ,IAhJ5BP,EAiJLmuB,EAAa5tB,GAjJH8sB,EAiJQe,EAAc7tB,QAhJzCkK,EAGc,WAHdA,EAAW4iB,EAAK5iB,SAAS5E,gBAGAoe,GAAepY,KAAM7L,EAAID,MACrDstB,EAAKtZ,QAAU/T,EAAI+T,QAGK,UAAbtJ,GAAqC,aAAbA,IACnC4iB,EAAKrV,aAAehY,EAAIgY,cA6IxB,GAAKiW,EACJ,GAAKC,EAIJ,IAHAC,EAAcA,GAAepJ,GAAQtiB,GACrC2rB,EAAeA,GAAgBrJ,GAAQnhB,GAEjCrD,EAAI,EAAGiZ,EAAI2U,EAAYzsB,OAAQnB,EAAIiZ,EAAGjZ,IAC3C6sB,GAAgBe,EAAa5tB,GAAK6tB,EAAc7tB,SAGjD6sB,GAAgB3qB,EAAMmB,GAWxB,OAL2B,GAD3BwqB,EAAerJ,GAAQnhB,EAAO,WACZlC,QACjBsjB,GAAeoJ,GAAeC,GAAUtJ,GAAQtiB,EAAM,WAIhDmB,GAGRoqB,UAAW,SAAU9rB,GAKpB,IAJA,IAAI2e,EAAMpe,EAAM1C,EACfwd,EAAUnc,EAAO0lB,MAAMvJ,QACvBhd,EAAI,OAE6B2D,KAAxBzB,EAAOP,EAAO3B,IAAqBA,IAC5C,GAAK+f,EAAY7d,GAAS,CACzB,GAAOoe,EAAOpe,EAAMue,EAAS7c,SAAc,CAC1C,GAAK0c,EAAK+G,OACT,IAAM7nB,KAAQ8gB,EAAK+G,OACbrK,EAASxd,GACbqB,EAAO0lB,MAAM9K,OAAQvZ,EAAM1C,GAI3BqB,EAAOynB,YAAapmB,EAAM1C,EAAM8gB,EAAKuH,QAOxC3lB,EAAMue,EAAS7c,cAAYD,EAEvBzB,EAAMwe,EAAS9c,WAInB1B,EAAMwe,EAAS9c,cAAYD,OAOhC9C,EAAOG,GAAGgC,OAAQ,CACjB+qB,OAAQ,SAAUjtB,GACjB,OAAO2a,GAAQ3d,KAAMgD,GAAU,IAGhC2a,OAAQ,SAAU3a,GACjB,OAAO2a,GAAQ3d,KAAMgD,IAGtBV,KAAM,SAAU4E,GACf,OAAOia,EAAQnhB,KAAM,SAAUkH,GAC9B,YAAiBrB,IAAVqB,EACNnE,EAAOT,KAAMtC,MACbA,KAAK6V,QAAQ5R,KAAM,WACK,IAAlBjE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,WACxDvB,KAAKqS,YAAcnL,MAGpB,KAAMA,EAAO7C,UAAUhB,SAG3B6sB,OAAQ,WACP,OAAOf,GAAUnvB,KAAMqE,UAAW,SAAUD,GACpB,IAAlBpE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,UAC3CqtB,GAAoB5uB,KAAMoE,GAChC1B,YAAa0B,MAKvB+rB,QAAS,WACR,OAAOhB,GAAUnvB,KAAMqE,UAAW,SAAUD,GAC3C,GAAuB,IAAlBpE,KAAKuB,UAAoC,KAAlBvB,KAAKuB,UAAqC,IAAlBvB,KAAKuB,SAAiB,CACzE,IAAIiE,EAASopB,GAAoB5uB,KAAMoE,GACvCoB,EAAO4qB,aAAchsB,EAAMoB,EAAO8M,gBAKrC+d,OAAQ,WACP,OAAOlB,GAAUnvB,KAAMqE,UAAW,SAAUD,GACtCpE,KAAK2C,YACT3C,KAAK2C,WAAWytB,aAAchsB,EAAMpE,SAKvCswB,MAAO,WACN,OAAOnB,GAAUnvB,KAAMqE,UAAW,SAAUD,GACtCpE,KAAK2C,YACT3C,KAAK2C,WAAWytB,aAAchsB,EAAMpE,KAAKgP,gBAK5C6G,MAAO,WAIN,IAHA,IAAIzR,EACHlC,EAAI,EAE2B,OAAtBkC,EAAOpE,KAAMkC,IAAeA,IACd,IAAlBkC,EAAK7C,WAGTwB,EAAO4sB,UAAWjJ,GAAQtiB,GAAM,IAGhCA,EAAKiO,YAAc,IAIrB,OAAOrS,MAGRuF,MAAO,SAAUqqB,EAAeC,GAI/B,OAHAD,EAAiC,MAAjBA,GAAgCA,EAChDC,EAAyC,MAArBA,EAA4BD,EAAgBC,EAEzD7vB,KAAKmE,IAAK,WAChB,OAAOpB,EAAOwC,MAAOvF,KAAM4vB,EAAeC,MAI5CL,KAAM,SAAUtoB,GACf,OAAOia,EAAQnhB,KAAM,SAAUkH,GAC9B,IAAI9C,EAAOpE,KAAM,IAAO,GACvBkC,EAAI,EACJiZ,EAAInb,KAAKqD,OAEV,QAAewC,IAAVqB,GAAyC,IAAlB9C,EAAK7C,SAChC,OAAO6C,EAAKwM,UAIb,GAAsB,iBAAV1J,IAAuBunB,GAAajhB,KAAMtG,KACpDkf,IAAWP,GAAS3Y,KAAMhG,IAAW,CAAE,GAAI,KAAQ,GAAIM,eAAkB,CAE1EN,EAAQnE,EAAO4kB,cAAezgB,GAE9B,IACC,KAAQhF,EAAIiZ,EAAGjZ,IAIS,KAHvBkC,EAAOpE,KAAMkC,IAAO,IAGVX,WACTwB,EAAO4sB,UAAWjJ,GAAQtiB,GAAM,IAChCA,EAAKwM,UAAY1J,GAInB9C,EAAO,EAGN,MAAQoI,KAGNpI,GACJpE,KAAK6V,QAAQqa,OAAQhpB,IAEpB,KAAMA,EAAO7C,UAAUhB,SAG3BktB,YAAa,WACZ,IAAIjJ,EAAU,GAGd,OAAO6H,GAAUnvB,KAAMqE,UAAW,SAAUD,GAC3C,IAAI8P,EAASlU,KAAK2C,WAEbI,EAAO6D,QAAS5G,KAAMsnB,GAAY,IACtCvkB,EAAO4sB,UAAWjJ,GAAQ1mB,OACrBkU,GACJA,EAAOsc,aAAcpsB,EAAMpE,QAK3BsnB,MAILvkB,EAAOkB,KAAM,CACZwsB,SAAU,SACVC,UAAW,UACXN,aAAc,SACdO,YAAa,QACbC,WAAY,eACV,SAAUxrB,EAAMyrB,GAClB9tB,EAAOG,GAAIkC,GAAS,SAAUpC,GAO7B,IANA,IAAIa,EACHC,EAAM,GACNgtB,EAAS/tB,EAAQC,GACjBwB,EAAOssB,EAAOztB,OAAS,EACvBnB,EAAI,EAEGA,GAAKsC,EAAMtC,IAClB2B,EAAQ3B,IAAMsC,EAAOxE,KAAOA,KAAKuF,OAAO,GACxCxC,EAAQ+tB,EAAQ5uB,IAAO2uB,GAAYhtB,GAInCjD,EAAKD,MAAOmD,EAAKD,EAAMH,OAGxB,OAAO1D,KAAK4D,UAAWE,MAGzB,IAAIitB,GAAY,IAAIjnB,OAAQ,KAAOga,GAAO,kBAAmB,KAEzDkN,GAAY,SAAU5sB,GAKxB,IAAI6oB,EAAO7oB,EAAK6I,cAAc4C,YAM9B,OAJMod,GAASA,EAAKgE,SACnBhE,EAAOltB,GAGDktB,EAAKiE,iBAAkB9sB,IAG5B+sB,GAAO,SAAU/sB,EAAMe,EAASjB,GACnC,IAAIJ,EAAKsB,EACRgsB,EAAM,GAGP,IAAMhsB,KAAQD,EACbisB,EAAKhsB,GAAShB,EAAKkgB,MAAOlf,GAC1BhB,EAAKkgB,MAAOlf,GAASD,EAASC,GAM/B,IAAMA,KAHNtB,EAAMI,EAASzD,KAAM2D,GAGPe,EACbf,EAAKkgB,MAAOlf,GAASgsB,EAAKhsB,GAG3B,OAAOtB,GAIJutB,GAAY,IAAIvnB,OAAQma,GAAUrW,KAAM,KAAO,KA8HnD,SAAS0jB,GAAQltB,EAAMgB,EAAMmsB,GAC5B,IAAIC,EAAOC,EAAUC,EAAU5tB,EAM9BwgB,EAAQlgB,EAAKkgB,MAqCd,OAnCAiN,EAAWA,GAAYP,GAAW5sB,MAQpB,MAFbN,EAAMytB,EAASI,iBAAkBvsB,IAAUmsB,EAAUnsB,KAEjC8e,GAAY9f,KAC/BN,EAAMf,EAAOuhB,MAAOlgB,EAAMgB,KAQrBhE,EAAQwwB,kBAAoBb,GAAUvjB,KAAM1J,IAASutB,GAAU7jB,KAAMpI,KAG1EosB,EAAQlN,EAAMkN,MACdC,EAAWnN,EAAMmN,SACjBC,EAAWpN,EAAMoN,SAGjBpN,EAAMmN,SAAWnN,EAAMoN,SAAWpN,EAAMkN,MAAQ1tB,EAChDA,EAAMytB,EAASC,MAGflN,EAAMkN,MAAQA,EACdlN,EAAMmN,SAAWA,EACjBnN,EAAMoN,SAAWA,SAIJ7rB,IAAR/B,EAINA,EAAM,GACNA,EAIF,SAAS+tB,GAAcC,EAAaC,GAGnC,MAAO,CACNruB,IAAK,WACJ,IAAKouB,IASL,OAAS9xB,KAAK0D,IAAMquB,GAASpxB,MAAOX,KAAMqE,kBALlCrE,KAAK0D,OAxLhB,WAIC,SAASsuB,IAGR,GAAMrM,EAAN,CAIAsM,EAAU3N,MAAM4N,QAAU,+EAE1BvM,EAAIrB,MAAM4N,QACT,4HAGDxiB,GAAgBhN,YAAauvB,GAAYvvB,YAAaijB,GAEtD,IAAIwM,EAAWpyB,EAAOmxB,iBAAkBvL,GACxCyM,EAAoC,OAAjBD,EAASriB,IAG5BuiB,EAAsE,KAA9CC,EAAoBH,EAASI,YAIrD5M,EAAIrB,MAAMkO,MAAQ,MAClBC,EAA6D,KAAzCH,EAAoBH,EAASK,OAIjDE,EAAgE,KAAzCJ,EAAoBH,EAASX,OAMpD7L,EAAIrB,MAAMqO,SAAW,WACrBC,EAAiE,KAA9CN,EAAoB3M,EAAIkN,YAAc,GAEzDnjB,GAAgB9M,YAAaqvB,GAI7BtM,EAAM,MAGP,SAAS2M,EAAoBQ,GAC5B,OAAO/sB,KAAKgtB,MAAOC,WAAYF,IAGhC,IAAIV,EAAkBM,EAAsBE,EAAkBH,EAC7DQ,EAAyBZ,EACzBJ,EAAYryB,EAASyC,cAAe,OACpCsjB,EAAM/lB,EAASyC,cAAe,OAGzBsjB,EAAIrB,QAMVqB,EAAIrB,MAAM4O,eAAiB,cAC3BvN,EAAIM,WAAW,GAAO3B,MAAM4O,eAAiB,GAC7C9xB,EAAQ+xB,gBAA+C,gBAA7BxN,EAAIrB,MAAM4O,eAEpCnwB,EAAOmC,OAAQ9D,EAAS,CACvBgyB,kBAAmB,WAElB,OADApB,IACOU,GAERd,eAAgB,WAEf,OADAI,IACOS,GAERY,cAAe,WAEd,OADArB,IACOI,GAERkB,mBAAoB,WAEnB,OADAtB,IACOK,GAERkB,cAAe,WAEd,OADAvB,IACOY,GAQRY,qBAAsB,WACrB,IAAIC,EAAOlN,EAAImN,EAASC,EAoBxB,OAnBgC,MAA3BV,IACJQ,EAAQ7zB,EAASyC,cAAe,SAChCkkB,EAAK3mB,EAASyC,cAAe,MAC7BqxB,EAAU9zB,EAASyC,cAAe,OAElCoxB,EAAMnP,MAAM4N,QAAU,kCACtB3L,EAAGjC,MAAMsP,OAAS,MAClBF,EAAQpP,MAAMsP,OAAS,MAEvBlkB,GACEhN,YAAa+wB,GACb/wB,YAAa6jB,GACb7jB,YAAagxB,GAEfC,EAAU5zB,EAAOmxB,iBAAkB3K,GACnC0M,EAAuD,EAA7BY,SAAUF,EAAQC,QAE5ClkB,GAAgB9M,YAAa6wB,IAEvBR,MApHV,GAmMA,IAAIa,GAAc,CAAE,SAAU,MAAO,MACpCC,GAAan0B,EAASyC,cAAe,OAAQiiB,MAC7C0P,GAAc,GAkBf,SAASC,GAAe7uB,GACvB,IAAI8uB,EAAQnxB,EAAOoxB,SAAU/uB,IAAU4uB,GAAa5uB,GAEpD,OAAK8uB,IAGA9uB,KAAQ2uB,GACL3uB,EAED4uB,GAAa5uB,GAxBrB,SAAyBA,GAGxB,IAAIgvB,EAAUhvB,EAAM,GAAI0c,cAAgB1c,EAAK9E,MAAO,GACnD4B,EAAI4xB,GAAYzwB,OAEjB,MAAQnB,IAEP,IADAkD,EAAO0uB,GAAa5xB,GAAMkyB,KACbL,GACZ,OAAO3uB,EAeoBivB,CAAgBjvB,IAAUA,GAIxD,IAKCkvB,GAAe,4BACfC,GAAc,MACdC,GAAU,CAAE7B,SAAU,WAAY8B,WAAY,SAAUlQ,QAAS,SACjEmQ,GAAqB,CACpBC,cAAe,IACfC,WAAY,OAGd,SAASC,GAAmBlwB,EAAOuC,EAAO4tB,GAIzC,IAAI/tB,EAAUid,GAAQ9W,KAAMhG,GAC5B,OAAOH,EAGNhB,KAAKgvB,IAAK,EAAGhuB,EAAS,IAAQ+tB,GAAY,KAAU/tB,EAAS,IAAO,MACpEG,EAGF,SAAS8tB,GAAoB5wB,EAAM6wB,EAAWC,EAAKC,EAAaC,EAAQC,GACvE,IAAInzB,EAAkB,UAAd+yB,EAAwB,EAAI,EACnCK,EAAQ,EACRC,EAAQ,EAGT,GAAKL,KAAUC,EAAc,SAAW,WACvC,OAAO,EAGR,KAAQjzB,EAAI,EAAGA,GAAK,EAGN,WAARgzB,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM8wB,EAAMjR,GAAW/hB,IAAK,EAAMkzB,IAIlDD,GAmBQ,YAARD,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMkzB,IAIjD,WAARF,IACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,MAtBvEG,GAASxyB,EAAOyhB,IAAKpgB,EAAM,UAAY6f,GAAW/hB,IAAK,EAAMkzB,GAGhD,YAARF,EACJK,GAASxyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,GAItEE,GAASvyB,EAAOyhB,IAAKpgB,EAAM,SAAW6f,GAAW/hB,GAAM,SAAS,EAAMkzB,IAoCzE,OAhBMD,GAA8B,GAAfE,IAIpBE,GAASxvB,KAAKgvB,IAAK,EAAGhvB,KAAKyvB,KAC1BpxB,EAAM,SAAW6wB,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,IACjE+0B,EACAE,EACAD,EACA,MAIM,GAGDC,EAGR,SAASE,GAAkBrxB,EAAM6wB,EAAWK,GAG3C,IAAIF,EAASpE,GAAW5sB,GAKvB+wB,IADmB/zB,EAAQgyB,qBAAuBkC,IAEE,eAAnDvyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,GACvCM,EAAmBP,EAEnBhzB,EAAMmvB,GAAQltB,EAAM6wB,EAAWG,GAC/BO,EAAa,SAAWV,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,GAIzE,GAAKywB,GAAUvjB,KAAMrL,GAAQ,CAC5B,IAAMmzB,EACL,OAAOnzB,EAERA,EAAM,OAyCP,QAlCQf,EAAQgyB,qBAAuB+B,IAMrC/zB,EAAQoyB,wBAA0BpnB,EAAUhI,EAAM,OAI3C,SAARjC,IAIC6wB,WAAY7wB,IAA0D,WAAjDY,EAAOyhB,IAAKpgB,EAAM,WAAW,EAAOgxB,KAG1DhxB,EAAKwxB,iBAAiBvyB,SAEtB8xB,EAAiE,eAAnDpyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,IAKpDM,EAAmBC,KAAcvxB,KAEhCjC,EAAMiC,EAAMuxB,MAKdxzB,EAAM6wB,WAAY7wB,IAAS,GAI1B6yB,GACC5wB,EACA6wB,EACAK,IAAWH,EAAc,SAAW,WACpCO,EACAN,EAGAjzB,GAEE,KA+SL,SAAS0zB,GAAOzxB,EAAMe,EAASsd,EAAM1d,EAAK+wB,GACzC,OAAO,IAAID,GAAMvyB,UAAUH,KAAMiB,EAAMe,EAASsd,EAAM1d,EAAK+wB,GA7S5D/yB,EAAOmC,OAAQ,CAId6wB,SAAU,CACTC,QAAS,CACRtyB,IAAK,SAAUU,EAAMmtB,GACpB,GAAKA,EAAW,CAGf,IAAIztB,EAAMwtB,GAAQltB,EAAM,WACxB,MAAe,KAARN,EAAa,IAAMA,MAO9BohB,UAAW,CACV+Q,yBAA2B,EAC3BC,aAAe,EACfC,aAAe,EACfC,UAAY,EACZC,YAAc,EACdzB,YAAc,EACd0B,UAAY,EACZC,YAAc,EACdC,eAAiB,EACjBC,iBAAmB,EACnBC,SAAW,EACXC,YAAc,EACdC,cAAgB,EAChBC,YAAc,EACdb,SAAW,EACXc,OAAS,EACTC,SAAW,EACXC,QAAU,EACVC,QAAU,EACVC,MAAQ,GAKT/C,SAAU,GAGV7P,MAAO,SAAUlgB,EAAMgB,EAAM8B,EAAOouB,GAGnC,GAAMlxB,GAA0B,IAAlBA,EAAK7C,UAAoC,IAAlB6C,EAAK7C,UAAmB6C,EAAKkgB,MAAlE,CAKA,IAAIxgB,EAAKpC,EAAM6hB,EACd4T,EAAWpV,EAAW3c,GACtBgyB,EAAe7C,GAAY/mB,KAAMpI,GACjCkf,EAAQlgB,EAAKkgB,MAad,GARM8S,IACLhyB,EAAO6uB,GAAekD,IAIvB5T,EAAQxgB,EAAOgzB,SAAU3wB,IAAUrC,EAAOgzB,SAAUoB,QAGrCtxB,IAAVqB,EA0CJ,OAAKqc,GAAS,QAASA,QACwB1d,KAA5C/B,EAAMyf,EAAM7f,IAAKU,GAAM,EAAOkxB,IAEzBxxB,EAIDwgB,EAAOlf,GA7CA,YAHd1D,SAAcwF,KAGcpD,EAAMkgB,GAAQ9W,KAAMhG,KAAapD,EAAK,KACjEoD,EAAQud,GAAWrgB,EAAMgB,EAAMtB,GAG/BpC,EAAO,UAIM,MAATwF,GAAiBA,GAAUA,IAOlB,WAATxF,GAAsB01B,IAC1BlwB,GAASpD,GAAOA,EAAK,KAASf,EAAOmiB,UAAWiS,GAAa,GAAK,OAI7D/1B,EAAQ+xB,iBAA6B,KAAVjsB,GAAiD,IAAjC9B,EAAKvE,QAAS,gBAC9DyjB,EAAOlf,GAAS,WAIXme,GAAY,QAASA,QACsB1d,KAA9CqB,EAAQqc,EAAMhB,IAAKne,EAAM8C,EAAOouB,MAE7B8B,EACJ9S,EAAM+S,YAAajyB,EAAM8B,GAEzBod,EAAOlf,GAAS8B,MAkBpBsd,IAAK,SAAUpgB,EAAMgB,EAAMkwB,EAAOF,GACjC,IAAIjzB,EAAKwB,EAAK4f,EACb4T,EAAWpV,EAAW3c,GA6BvB,OA5BgBmvB,GAAY/mB,KAAMpI,KAMjCA,EAAO6uB,GAAekD,KAIvB5T,EAAQxgB,EAAOgzB,SAAU3wB,IAAUrC,EAAOgzB,SAAUoB,KAGtC,QAAS5T,IACtBphB,EAAMohB,EAAM7f,IAAKU,GAAM,EAAMkxB,SAIjBzvB,IAAR1D,IACJA,EAAMmvB,GAAQltB,EAAMgB,EAAMgwB,IAId,WAARjzB,GAAoBiD,KAAQsvB,KAChCvyB,EAAMuyB,GAAoBtvB,IAIZ,KAAVkwB,GAAgBA,GACpB3xB,EAAMqvB,WAAY7wB,IACD,IAAVmzB,GAAkBgC,SAAU3zB,GAAQA,GAAO,EAAIxB,GAGhDA,KAITY,EAAOkB,KAAM,CAAE,SAAU,SAAW,SAAUsD,EAAI0tB,GACjDlyB,EAAOgzB,SAAUd,GAAc,CAC9BvxB,IAAK,SAAUU,EAAMmtB,EAAU+D,GAC9B,GAAK/D,EAIJ,OAAO+C,GAAa9mB,KAAMzK,EAAOyhB,IAAKpgB,EAAM,aAQxCA,EAAKwxB,iBAAiBvyB,QAAWe,EAAKmzB,wBAAwB/F,MAIhEiE,GAAkBrxB,EAAM6wB,EAAWK,GAHnCnE,GAAM/sB,EAAMowB,GAAS,WACpB,OAAOiB,GAAkBrxB,EAAM6wB,EAAWK,MAM/C/S,IAAK,SAAUne,EAAM8C,EAAOouB,GAC3B,IAAIvuB,EACHquB,EAASpE,GAAW5sB,GAIpBozB,GAAsBp2B,EAAQmyB,iBACT,aAApB6B,EAAOzC,SAIRwC,GADkBqC,GAAsBlC,IAEY,eAAnDvyB,EAAOyhB,IAAKpgB,EAAM,aAAa,EAAOgxB,GACvCN,EAAWQ,EACVN,GACC5wB,EACA6wB,EACAK,EACAH,EACAC,GAED,EAqBF,OAjBKD,GAAeqC,IACnB1C,GAAY/uB,KAAKyvB,KAChBpxB,EAAM,SAAW6wB,EAAW,GAAInT,cAAgBmT,EAAU30B,MAAO,IACjE0yB,WAAYoC,EAAQH,IACpBD,GAAoB5wB,EAAM6wB,EAAW,UAAU,EAAOG,GACtD,KAKGN,IAAc/tB,EAAUid,GAAQ9W,KAAMhG,KACb,QAA3BH,EAAS,IAAO,QAElB3C,EAAKkgB,MAAO2Q,GAAc/tB,EAC1BA,EAAQnE,EAAOyhB,IAAKpgB,EAAM6wB,IAGpBJ,GAAmBzwB,EAAM8C,EAAO4tB,OAK1C/xB,EAAOgzB,SAASxD,WAAaV,GAAczwB,EAAQkyB,mBAClD,SAAUlvB,EAAMmtB,GACf,GAAKA,EACJ,OAASyB,WAAY1B,GAAQltB,EAAM,gBAClCA,EAAKmzB,wBAAwBE,KAC5BtG,GAAM/sB,EAAM,CAAEmuB,WAAY,GAAK,WAC9B,OAAOnuB,EAAKmzB,wBAAwBE,QAElC,OAMR10B,EAAOkB,KAAM,CACZyzB,OAAQ,GACRC,QAAS,GACTC,OAAQ,SACN,SAAUC,EAAQC,GACpB/0B,EAAOgzB,SAAU8B,EAASC,GAAW,CACpCC,OAAQ,SAAU7wB,GAOjB,IANA,IAAIhF,EAAI,EACP81B,EAAW,GAGXC,EAAyB,iBAAV/wB,EAAqBA,EAAMI,MAAO,KAAQ,CAAEJ,GAEpDhF,EAAI,EAAGA,IACd81B,EAAUH,EAAS5T,GAAW/hB,GAAM41B,GACnCG,EAAO/1B,IAAO+1B,EAAO/1B,EAAI,IAAO+1B,EAAO,GAGzC,OAAOD,IAIO,WAAXH,IACJ90B,EAAOgzB,SAAU8B,EAASC,GAASvV,IAAMsS,MAI3C9xB,EAAOG,GAAGgC,OAAQ,CACjBsf,IAAK,SAAUpf,EAAM8B,GACpB,OAAOia,EAAQnhB,KAAM,SAAUoE,EAAMgB,EAAM8B,GAC1C,IAAIkuB,EAAQvwB,EACXV,EAAM,GACNjC,EAAI,EAEL,GAAKyD,MAAMC,QAASR,GAAS,CAI5B,IAHAgwB,EAASpE,GAAW5sB,GACpBS,EAAMO,EAAK/B,OAEHnB,EAAI2C,EAAK3C,IAChBiC,EAAKiB,EAAMlD,IAAQa,EAAOyhB,IAAKpgB,EAAMgB,EAAMlD,IAAK,EAAOkzB,GAGxD,OAAOjxB,EAGR,YAAiB0B,IAAVqB,EACNnE,EAAOuhB,MAAOlgB,EAAMgB,EAAM8B,GAC1BnE,EAAOyhB,IAAKpgB,EAAMgB,IACjBA,EAAM8B,EAA0B,EAAnB7C,UAAUhB,aAQ5BN,EAAO8yB,MAAQA,IAETvyB,UAAY,CACjBE,YAAaqyB,GACb1yB,KAAM,SAAUiB,EAAMe,EAASsd,EAAM1d,EAAK+wB,EAAQ7Q,GACjDjlB,KAAKoE,KAAOA,EACZpE,KAAKyiB,KAAOA,EACZziB,KAAK81B,OAASA,GAAU/yB,EAAO+yB,OAAOrP,SACtCzmB,KAAKmF,QAAUA,EACfnF,KAAKiU,MAAQjU,KAAKosB,IAAMpsB,KAAK6O,MAC7B7O,KAAK+E,IAAMA,EACX/E,KAAKilB,KAAOA,IAAUliB,EAAOmiB,UAAWzC,GAAS,GAAK,OAEvD5T,IAAK,WACJ,IAAI0U,EAAQsS,GAAMqC,UAAWl4B,KAAKyiB,MAElC,OAAOc,GAASA,EAAM7f,IACrB6f,EAAM7f,IAAK1D,MACX61B,GAAMqC,UAAUzR,SAAS/iB,IAAK1D,OAEhCm4B,IAAK,SAAUC,GACd,IAAIC,EACH9U,EAAQsS,GAAMqC,UAAWl4B,KAAKyiB,MAoB/B,OAlBKziB,KAAKmF,QAAQmzB,SACjBt4B,KAAKu4B,IAAMF,EAAQt1B,EAAO+yB,OAAQ91B,KAAK81B,QACtCsC,EAASp4B,KAAKmF,QAAQmzB,SAAWF,EAAS,EAAG,EAAGp4B,KAAKmF,QAAQmzB,UAG9Dt4B,KAAKu4B,IAAMF,EAAQD,EAEpBp4B,KAAKosB,KAAQpsB,KAAK+E,IAAM/E,KAAKiU,OAAUokB,EAAQr4B,KAAKiU,MAE/CjU,KAAKmF,QAAQqzB,MACjBx4B,KAAKmF,QAAQqzB,KAAK/3B,KAAMT,KAAKoE,KAAMpE,KAAKosB,IAAKpsB,MAGzCujB,GAASA,EAAMhB,IACnBgB,EAAMhB,IAAKviB,MAEX61B,GAAMqC,UAAUzR,SAASlE,IAAKviB,MAExBA,QAIOmD,KAAKG,UAAYuyB,GAAMvyB,WAEvCuyB,GAAMqC,UAAY,CACjBzR,SAAU,CACT/iB,IAAK,SAAUihB,GACd,IAAIrR,EAIJ,OAA6B,IAAxBqR,EAAMvgB,KAAK7C,UACa,MAA5BojB,EAAMvgB,KAAMugB,EAAMlC,OAAoD,MAAlCkC,EAAMvgB,KAAKkgB,MAAOK,EAAMlC,MACrDkC,EAAMvgB,KAAMugB,EAAMlC,OAO1BnP,EAASvQ,EAAOyhB,IAAKG,EAAMvgB,KAAMugB,EAAMlC,KAAM,MAGhB,SAAXnP,EAAwBA,EAAJ,GAEvCiP,IAAK,SAAUoC,GAKT5hB,EAAO01B,GAAGD,KAAM7T,EAAMlC,MAC1B1f,EAAO01B,GAAGD,KAAM7T,EAAMlC,MAAQkC,GACK,IAAxBA,EAAMvgB,KAAK7C,WACrBwB,EAAOgzB,SAAUpR,EAAMlC,OAC4B,MAAnDkC,EAAMvgB,KAAKkgB,MAAO2P,GAAetP,EAAMlC,OAGxCkC,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMyH,IAFjCrpB,EAAOuhB,MAAOK,EAAMvgB,KAAMugB,EAAMlC,KAAMkC,EAAMyH,IAAMzH,EAAMM,UAU5CyT,UAAY7C,GAAMqC,UAAUS,WAAa,CACxDpW,IAAK,SAAUoC,GACTA,EAAMvgB,KAAK7C,UAAYojB,EAAMvgB,KAAKzB,aACtCgiB,EAAMvgB,KAAMugB,EAAMlC,MAASkC,EAAMyH,OAKpCrpB,EAAO+yB,OAAS,CACf8C,OAAQ,SAAUC,GACjB,OAAOA,GAERC,MAAO,SAAUD,GAChB,MAAO,GAAM9yB,KAAKgzB,IAAKF,EAAI9yB,KAAKizB,IAAO,GAExCvS,SAAU,SAGX1jB,EAAO01B,GAAK5C,GAAMvyB,UAAUH,KAG5BJ,EAAO01B,GAAGD,KAAO,GAKjB,IACCS,GAAOC,GAkrBHvoB,GAEHwoB,GAnrBDC,GAAW,yBACXC,GAAO,cAER,SAASC,KACHJ,MACqB,IAApBt5B,EAAS25B,QAAoBx5B,EAAOy5B,sBACxCz5B,EAAOy5B,sBAAuBF,IAE9Bv5B,EAAO8f,WAAYyZ,GAAUv2B,EAAO01B,GAAGgB,UAGxC12B,EAAO01B,GAAGiB,QAKZ,SAASC,KAIR,OAHA55B,EAAO8f,WAAY,WAClBoZ,QAAQpzB,IAEAozB,GAAQxwB,KAAK2jB,MAIvB,SAASwN,GAAOl4B,EAAMm4B,GACrB,IAAI5L,EACH/rB,EAAI,EACJuM,EAAQ,CAAEmlB,OAAQlyB,GAKnB,IADAm4B,EAAeA,EAAe,EAAI,EAC1B33B,EAAI,EAAGA,GAAK,EAAI23B,EAEvBprB,EAAO,UADPwf,EAAQhK,GAAW/hB,KACSuM,EAAO,UAAYwf,GAAUvsB,EAO1D,OAJKm4B,IACJprB,EAAMunB,QAAUvnB,EAAM+iB,MAAQ9vB,GAGxB+M,EAGR,SAASqrB,GAAa5yB,EAAOub,EAAMsX,GAKlC,IAJA,IAAIpV,EACHyK,GAAe4K,GAAUC,SAAUxX,IAAU,IAAK/hB,OAAQs5B,GAAUC,SAAU,MAC9E5e,EAAQ,EACRhY,EAAS+rB,EAAW/rB,OACbgY,EAAQhY,EAAQgY,IACvB,GAAOsJ,EAAQyK,EAAY/T,GAAQ5a,KAAMs5B,EAAWtX,EAAMvb,GAGzD,OAAOyd,EAsNV,SAASqV,GAAW51B,EAAM81B,EAAY/0B,GACrC,IAAImO,EACH6mB,EACA9e,EAAQ,EACRhY,EAAS22B,GAAUI,WAAW/2B,OAC9B+a,EAAWrb,EAAOgb,WAAWI,OAAQ,kBAG7Bub,EAAKt1B,OAEbs1B,EAAO,WACN,GAAKS,EACJ,OAAO,EAYR,IAVA,IAAIE,EAAcpB,IAASU,KAC1B1Z,EAAYla,KAAKgvB,IAAK,EAAGgF,EAAUO,UAAYP,EAAUzB,SAAW+B,GAKpEjC,EAAU,GADHnY,EAAY8Z,EAAUzB,UAAY,GAEzCjd,EAAQ,EACRhY,EAAS02B,EAAUQ,OAAOl3B,OAEnBgY,EAAQhY,EAAQgY,IACvB0e,EAAUQ,OAAQlf,GAAQ8c,IAAKC,GAMhC,OAHAha,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW3B,EAASnY,IAG5CmY,EAAU,GAAK/0B,EACZ4c,GAIF5c,GACL+a,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW,EAAG,IAI5C3b,EAASmB,YAAanb,EAAM,CAAE21B,KACvB,IAERA,EAAY3b,EAASzB,QAAS,CAC7BvY,KAAMA,EACN2nB,MAAOhpB,EAAOmC,OAAQ,GAAIg1B,GAC1BM,KAAMz3B,EAAOmC,QAAQ,EAAM,CAC1Bu1B,cAAe,GACf3E,OAAQ/yB,EAAO+yB,OAAOrP,UACpBthB,GACHu1B,mBAAoBR,EACpBS,gBAAiBx1B,EACjBm1B,UAAWrB,IAASU,KACpBrB,SAAUnzB,EAAQmzB,SAClBiC,OAAQ,GACRT,YAAa,SAAUrX,EAAM1d,GAC5B,IAAI4f,EAAQ5hB,EAAO8yB,MAAOzxB,EAAM21B,EAAUS,KAAM/X,EAAM1d,EACpDg1B,EAAUS,KAAKC,cAAehY,IAAUsX,EAAUS,KAAK1E,QAEzD,OADAiE,EAAUQ,OAAO35B,KAAM+jB,GAChBA,GAERlB,KAAM,SAAUmX,GACf,IAAIvf,EAAQ,EAIXhY,EAASu3B,EAAUb,EAAUQ,OAAOl3B,OAAS,EAC9C,GAAK82B,EACJ,OAAOn6B,KAGR,IADAm6B,GAAU,EACF9e,EAAQhY,EAAQgY,IACvB0e,EAAUQ,OAAQlf,GAAQ8c,IAAK,GAUhC,OANKyC,GACJxc,EAASkB,WAAYlb,EAAM,CAAE21B,EAAW,EAAG,IAC3C3b,EAASmB,YAAanb,EAAM,CAAE21B,EAAWa,KAEzCxc,EAASuB,WAAYvb,EAAM,CAAE21B,EAAWa,IAElC56B,QAGT+rB,EAAQgO,EAAUhO,MAInB,KA/HD,SAAqBA,EAAO0O,GAC3B,IAAIpf,EAAOjW,EAAM0wB,EAAQ5uB,EAAOqc,EAGhC,IAAMlI,KAAS0Q,EAed,GAbA+J,EAAS2E,EADTr1B,EAAO2c,EAAW1G,IAElBnU,EAAQ6kB,EAAO1Q,GACV1V,MAAMC,QAASsB,KACnB4uB,EAAS5uB,EAAO,GAChBA,EAAQ6kB,EAAO1Q,GAAUnU,EAAO,IAG5BmU,IAAUjW,IACd2mB,EAAO3mB,GAAS8B,SACT6kB,EAAO1Q,KAGfkI,EAAQxgB,EAAOgzB,SAAU3wB,KACX,WAAYme,EAMzB,IAAMlI,KALNnU,EAAQqc,EAAMwU,OAAQ7wB,UACf6kB,EAAO3mB,GAIC8B,EACNmU,KAAS0Q,IAChBA,EAAO1Q,GAAUnU,EAAOmU,GACxBof,EAAepf,GAAUya,QAI3B2E,EAAer1B,GAAS0wB,EA6F1B+E,CAAY9O,EAAOgO,EAAUS,KAAKC,eAE1Bpf,EAAQhY,EAAQgY,IAEvB,GADA/H,EAAS0mB,GAAUI,WAAY/e,GAAQ5a,KAAMs5B,EAAW31B,EAAM2nB,EAAOgO,EAAUS,MAM9E,OAJKn5B,EAAYiS,EAAOmQ,QACvB1gB,EAAOygB,YAAauW,EAAU31B,KAAM21B,EAAUS,KAAKld,OAAQmG,KAC1DnQ,EAAOmQ,KAAKqX,KAAMxnB,IAEbA,EAyBT,OArBAvQ,EAAOoB,IAAK4nB,EAAO+N,GAAaC,GAE3B14B,EAAY04B,EAAUS,KAAKvmB,QAC/B8lB,EAAUS,KAAKvmB,MAAMxT,KAAM2D,EAAM21B,GAIlCA,EACEpb,SAAUob,EAAUS,KAAK7b,UACzB/V,KAAMmxB,EAAUS,KAAK5xB,KAAMmxB,EAAUS,KAAKO,UAC1Cne,KAAMmd,EAAUS,KAAK5d,MACrBuB,OAAQ4b,EAAUS,KAAKrc,QAEzBpb,EAAO01B,GAAGuC,MACTj4B,EAAOmC,OAAQw0B,EAAM,CACpBt1B,KAAMA,EACN62B,KAAMlB,EACNzc,MAAOyc,EAAUS,KAAKld,SAIjByc,EAGRh3B,EAAOi3B,UAAYj3B,EAAOmC,OAAQ80B,GAAW,CAE5CC,SAAU,CACTiB,IAAK,CAAE,SAAUzY,EAAMvb,GACtB,IAAIyd,EAAQ3kB,KAAK85B,YAAarX,EAAMvb,GAEpC,OADAud,GAAWE,EAAMvgB,KAAMqe,EAAMuB,GAAQ9W,KAAMhG,GAASyd,GAC7CA,KAITwW,QAAS,SAAUpP,EAAO7nB,GACpB7C,EAAY0qB,IAChB7nB,EAAW6nB,EACXA,EAAQ,CAAE,MAEVA,EAAQA,EAAMlf,MAAOoP,GAOtB,IAJA,IAAIwG,EACHpH,EAAQ,EACRhY,EAAS0oB,EAAM1oB,OAERgY,EAAQhY,EAAQgY,IACvBoH,EAAOsJ,EAAO1Q,GACd2e,GAAUC,SAAUxX,GAASuX,GAAUC,SAAUxX,IAAU,GAC3DuX,GAAUC,SAAUxX,GAAO9Q,QAASzN,IAItCk2B,WAAY,CA3Wb,SAA2Bh2B,EAAM2nB,EAAOyO,GACvC,IAAI/X,EAAMvb,EAAOwe,EAAQnC,EAAO6X,EAASC,EAAWC,EAAgB/W,EACnEgX,EAAQ,UAAWxP,GAAS,WAAYA,EACxCkP,EAAOj7B,KACPuuB,EAAO,GACPjK,EAAQlgB,EAAKkgB,MACbiV,EAASn1B,EAAK7C,UAAY8iB,GAAoBjgB,GAC9Co3B,EAAW7Y,EAASjf,IAAKU,EAAM,UA6BhC,IAAMqe,KA1BA+X,EAAKld,QAEa,OADvBiG,EAAQxgB,EAAOygB,YAAapf,EAAM,OACvBq3B,WACVlY,EAAMkY,SAAW,EACjBL,EAAU7X,EAAM1N,MAAM2H,KACtB+F,EAAM1N,MAAM2H,KAAO,WACZ+F,EAAMkY,UACXL,MAIH7X,EAAMkY,WAENR,EAAK9c,OAAQ,WAGZ8c,EAAK9c,OAAQ,WACZoF,EAAMkY,WACA14B,EAAOua,MAAOlZ,EAAM,MAAOf,QAChCkgB,EAAM1N,MAAM2H,YAOFuO,EAEb,GADA7kB,EAAQ6kB,EAAOtJ,GACV2W,GAAS5rB,KAAMtG,GAAU,CAG7B,UAFO6kB,EAAOtJ,GACdiD,EAASA,GAAoB,WAAVxe,EACdA,KAAYqyB,EAAS,OAAS,QAAW,CAI7C,GAAe,SAAVryB,IAAoBs0B,QAAiC31B,IAArB21B,EAAU/Y,GAK9C,SAJA8W,GAAS,EAOXhL,EAAM9L,GAAS+Y,GAAYA,EAAU/Y,IAAU1f,EAAOuhB,MAAOlgB,EAAMqe,GAMrE,IADA4Y,GAAat4B,EAAOyD,cAAeulB,MAChBhpB,EAAOyD,cAAe+nB,GA8DzC,IAAM9L,KAzDD8Y,GAA2B,IAAlBn3B,EAAK7C,WAMlBi5B,EAAKkB,SAAW,CAAEpX,EAAMoX,SAAUpX,EAAMqX,UAAWrX,EAAMsX,WAIlC,OADvBN,EAAiBE,GAAYA,EAASjX,WAErC+W,EAAiB3Y,EAASjf,IAAKU,EAAM,YAGrB,UADjBmgB,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,cAEtBk3B,EACJ/W,EAAU+W,GAIVjW,GAAU,CAAEjhB,IAAQ,GACpBk3B,EAAiBl3B,EAAKkgB,MAAMC,SAAW+W,EACvC/W,EAAUxhB,EAAOyhB,IAAKpgB,EAAM,WAC5BihB,GAAU,CAAEjhB,OAKG,WAAZmgB,GAAoC,iBAAZA,GAAgD,MAAlB+W,IACrB,SAAhCv4B,EAAOyhB,IAAKpgB,EAAM,WAGhBi3B,IACLJ,EAAKryB,KAAM,WACV0b,EAAMC,QAAU+W,IAEM,MAAlBA,IACJ/W,EAAUD,EAAMC,QAChB+W,EAA6B,SAAZ/W,EAAqB,GAAKA,IAG7CD,EAAMC,QAAU,iBAKdiW,EAAKkB,WACTpX,EAAMoX,SAAW,SACjBT,EAAK9c,OAAQ,WACZmG,EAAMoX,SAAWlB,EAAKkB,SAAU,GAChCpX,EAAMqX,UAAYnB,EAAKkB,SAAU,GACjCpX,EAAMsX,UAAYpB,EAAKkB,SAAU,MAKnCL,GAAY,EACE9M,EAGP8M,IACAG,EACC,WAAYA,IAChBjC,EAASiC,EAASjC,QAGnBiC,EAAW7Y,EAASxB,OAAQ/c,EAAM,SAAU,CAAEmgB,QAAS+W,IAInD5V,IACJ8V,EAASjC,QAAUA,GAIfA,GACJlU,GAAU,CAAEjhB,IAAQ,GAKrB62B,EAAKryB,KAAM,WASV,IAAM6Z,KAJA8W,GACLlU,GAAU,CAAEjhB,IAEbue,EAAShF,OAAQvZ,EAAM,UACTmqB,EACbxrB,EAAOuhB,MAAOlgB,EAAMqe,EAAM8L,EAAM9L,OAMnC4Y,EAAYvB,GAAaP,EAASiC,EAAU/Y,GAAS,EAAGA,EAAMwY,GACtDxY,KAAQ+Y,IACfA,EAAU/Y,GAAS4Y,EAAUpnB,MACxBslB,IACJ8B,EAAUt2B,IAAMs2B,EAAUpnB,MAC1BonB,EAAUpnB,MAAQ,MAuMrB4nB,UAAW,SAAU33B,EAAUisB,GACzBA,EACJ6J,GAAUI,WAAWzoB,QAASzN,GAE9B81B,GAAUI,WAAWx5B,KAAMsD,MAK9BnB,EAAO+4B,MAAQ,SAAUA,EAAOhG,EAAQ5yB,GACvC,IAAIi2B,EAAM2C,GAA0B,iBAAVA,EAAqB/4B,EAAOmC,OAAQ,GAAI42B,GAAU,CAC3Ef,SAAU73B,IAAOA,GAAM4yB,GACtBz0B,EAAYy6B,IAAWA,EACxBxD,SAAUwD,EACVhG,OAAQ5yB,GAAM4yB,GAAUA,IAAWz0B,EAAYy0B,IAAYA,GAoC5D,OAhCK/yB,EAAO01B,GAAG/P,IACdyQ,EAAIb,SAAW,EAGc,iBAAjBa,EAAIb,WACVa,EAAIb,YAAYv1B,EAAO01B,GAAGsD,OAC9B5C,EAAIb,SAAWv1B,EAAO01B,GAAGsD,OAAQ5C,EAAIb,UAGrCa,EAAIb,SAAWv1B,EAAO01B,GAAGsD,OAAOtV,UAMjB,MAAb0S,EAAI7b,QAA+B,IAAd6b,EAAI7b,QAC7B6b,EAAI7b,MAAQ,MAIb6b,EAAI/H,IAAM+H,EAAI4B,SAEd5B,EAAI4B,SAAW,WACT15B,EAAY83B,EAAI/H,MACpB+H,EAAI/H,IAAI3wB,KAAMT,MAGVm5B,EAAI7b,OACRva,EAAOsgB,QAASrjB,KAAMm5B,EAAI7b,QAIrB6b,GAGRp2B,EAAOG,GAAGgC,OAAQ,CACjB82B,OAAQ,SAAUF,EAAOG,EAAInG,EAAQ5xB,GAGpC,OAAOlE,KAAKqQ,OAAQgU,IAAqBG,IAAK,UAAW,GAAIc,OAG3DvgB,MAAMm3B,QAAS,CAAElG,QAASiG,GAAMH,EAAOhG,EAAQ5xB,IAElDg4B,QAAS,SAAUzZ,EAAMqZ,EAAOhG,EAAQ5xB,GACvC,IAAI2R,EAAQ9S,EAAOyD,cAAeic,GACjC0Z,EAASp5B,EAAO+4B,MAAOA,EAAOhG,EAAQ5xB,GACtCk4B,EAAc,WAGb,IAAInB,EAAOjB,GAAWh6B,KAAM+C,EAAOmC,OAAQ,GAAIud,GAAQ0Z,IAGlDtmB,GAAS8M,EAASjf,IAAK1D,KAAM,YACjCi7B,EAAKxX,MAAM,IAKd,OAFC2Y,EAAYC,OAASD,EAEfvmB,IAA0B,IAAjBsmB,EAAO7e,MACtBtd,KAAKiE,KAAMm4B,GACXp8B,KAAKsd,MAAO6e,EAAO7e,MAAO8e,IAE5B3Y,KAAM,SAAU/hB,EAAMiiB,EAAYiX,GACjC,IAAI0B,EAAY,SAAU/Y,GACzB,IAAIE,EAAOF,EAAME,YACVF,EAAME,KACbA,EAAMmX,IAYP,MATqB,iBAATl5B,IACXk5B,EAAUjX,EACVA,EAAajiB,EACbA,OAAOmE,GAEH8d,GACJ3jB,KAAKsd,MAAO5b,GAAQ,KAAM,IAGpB1B,KAAKiE,KAAM,WACjB,IAAIof,GAAU,EACbhI,EAAgB,MAAR3Z,GAAgBA,EAAO,aAC/B66B,EAASx5B,EAAOw5B,OAChB/Z,EAAOG,EAASjf,IAAK1D,MAEtB,GAAKqb,EACCmH,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MACnC6Y,EAAW9Z,EAAMnH,SAGlB,IAAMA,KAASmH,EACTA,EAAMnH,IAAWmH,EAAMnH,GAAQoI,MAAQ4V,GAAK7rB,KAAM6N,IACtDihB,EAAW9Z,EAAMnH,IAKpB,IAAMA,EAAQkhB,EAAOl5B,OAAQgY,KACvBkhB,EAAQlhB,GAAQjX,OAASpE,MACnB,MAAR0B,GAAgB66B,EAAQlhB,GAAQiC,QAAU5b,IAE5C66B,EAAQlhB,GAAQ4f,KAAKxX,KAAMmX,GAC3BvX,GAAU,EACVkZ,EAAOt3B,OAAQoW,EAAO,KAOnBgI,GAAYuX,GAChB73B,EAAOsgB,QAASrjB,KAAM0B,MAIzB26B,OAAQ,SAAU36B,GAIjB,OAHc,IAATA,IACJA,EAAOA,GAAQ,MAET1B,KAAKiE,KAAM,WACjB,IAAIoX,EACHmH,EAAOG,EAASjf,IAAK1D,MACrBsd,EAAQkF,EAAM9gB,EAAO,SACrB6hB,EAAQf,EAAM9gB,EAAO,cACrB66B,EAASx5B,EAAOw5B,OAChBl5B,EAASia,EAAQA,EAAMja,OAAS,EAajC,IAVAmf,EAAK6Z,QAAS,EAGdt5B,EAAOua,MAAOtd,KAAM0B,EAAM,IAErB6hB,GAASA,EAAME,MACnBF,EAAME,KAAKhjB,KAAMT,MAAM,GAIlBqb,EAAQkhB,EAAOl5B,OAAQgY,KACvBkhB,EAAQlhB,GAAQjX,OAASpE,MAAQu8B,EAAQlhB,GAAQiC,QAAU5b,IAC/D66B,EAAQlhB,GAAQ4f,KAAKxX,MAAM,GAC3B8Y,EAAOt3B,OAAQoW,EAAO,IAKxB,IAAMA,EAAQ,EAAGA,EAAQhY,EAAQgY,IAC3BiC,EAAOjC,IAAWiC,EAAOjC,GAAQghB,QACrC/e,EAAOjC,GAAQghB,OAAO57B,KAAMT,aAKvBwiB,EAAK6Z,YAKft5B,EAAOkB,KAAM,CAAE,SAAU,OAAQ,QAAU,SAAUsD,EAAInC,GACxD,IAAIo3B,EAAQz5B,EAAOG,GAAIkC,GACvBrC,EAAOG,GAAIkC,GAAS,SAAU02B,EAAOhG,EAAQ5xB,GAC5C,OAAgB,MAAT43B,GAAkC,kBAAVA,EAC9BU,EAAM77B,MAAOX,KAAMqE,WACnBrE,KAAKk8B,QAAStC,GAAOx0B,GAAM,GAAQ02B,EAAOhG,EAAQ5xB,MAKrDnB,EAAOkB,KAAM,CACZw4B,UAAW7C,GAAO,QAClB8C,QAAS9C,GAAO,QAChB+C,YAAa/C,GAAO,UACpBgD,OAAQ,CAAE5G,QAAS,QACnB6G,QAAS,CAAE7G,QAAS,QACpB8G,WAAY,CAAE9G,QAAS,WACrB,SAAU5wB,EAAM2mB,GAClBhpB,EAAOG,GAAIkC,GAAS,SAAU02B,EAAOhG,EAAQ5xB,GAC5C,OAAOlE,KAAKk8B,QAASnQ,EAAO+P,EAAOhG,EAAQ5xB,MAI7CnB,EAAOw5B,OAAS,GAChBx5B,EAAO01B,GAAGiB,KAAO,WAChB,IAAIsB,EACH94B,EAAI,EACJq6B,EAASx5B,EAAOw5B,OAIjB,IAFAtD,GAAQxwB,KAAK2jB,MAELlqB,EAAIq6B,EAAOl5B,OAAQnB,KAC1B84B,EAAQuB,EAAQr6B,OAGCq6B,EAAQr6B,KAAQ84B,GAChCuB,EAAOt3B,OAAQ/C,IAAK,GAIhBq6B,EAAOl5B,QACZN,EAAO01B,GAAGhV,OAEXwV,QAAQpzB,GAGT9C,EAAO01B,GAAGuC,MAAQ,SAAUA,GAC3Bj4B,EAAOw5B,OAAO37B,KAAMo6B,GACpBj4B,EAAO01B,GAAGxkB,SAGXlR,EAAO01B,GAAGgB,SAAW,GACrB12B,EAAO01B,GAAGxkB,MAAQ,WACZilB,KAILA,IAAa,EACbI,OAGDv2B,EAAO01B,GAAGhV,KAAO,WAChByV,GAAa,MAGdn2B,EAAO01B,GAAGsD,OAAS,CAClBgB,KAAM,IACNC,KAAM,IAGNvW,SAAU,KAMX1jB,EAAOG,GAAG+5B,MAAQ,SAAUC,EAAMx7B,GAIjC,OAHAw7B,EAAOn6B,EAAO01B,IAAK11B,EAAO01B,GAAGsD,OAAQmB,IAAiBA,EACtDx7B,EAAOA,GAAQ,KAER1B,KAAKsd,MAAO5b,EAAM,SAAU4K,EAAMiX,GACxC,IAAI4Z,EAAUp9B,EAAO8f,WAAYvT,EAAM4wB,GACvC3Z,EAAME,KAAO,WACZ1jB,EAAOq9B,aAAcD,OAOnBxsB,GAAQ/Q,EAASyC,cAAe,SAEnC82B,GADSv5B,EAASyC,cAAe,UACpBK,YAAa9C,EAASyC,cAAe,WAEnDsO,GAAMjP,KAAO,WAIbN,EAAQi8B,QAA0B,KAAhB1sB,GAAMzJ,MAIxB9F,EAAQk8B,YAAcnE,GAAIxjB,UAI1BhF,GAAQ/Q,EAASyC,cAAe,UAC1B6E,MAAQ,IACdyJ,GAAMjP,KAAO,QACbN,EAAQm8B,WAA6B,MAAhB5sB,GAAMzJ,MAI5B,IAAIs2B,GACH7uB,GAAa5L,EAAO6O,KAAKjD,WAE1B5L,EAAOG,GAAGgC,OAAQ,CACjB4M,KAAM,SAAU1M,EAAM8B,GACrB,OAAOia,EAAQnhB,KAAM+C,EAAO+O,KAAM1M,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1Do6B,WAAY,SAAUr4B,GACrB,OAAOpF,KAAKiE,KAAM,WACjBlB,EAAO06B,WAAYz9B,KAAMoF,QAK5BrC,EAAOmC,OAAQ,CACd4M,KAAM,SAAU1N,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRma,EAAQt5B,EAAK7C,SAGd,GAAe,IAAVm8B,GAAyB,IAAVA,GAAyB,IAAVA,EAKnC,MAAkC,oBAAtBt5B,EAAK7B,aACTQ,EAAO0f,KAAMre,EAAMgB,EAAM8B,IAKlB,IAAVw2B,GAAgB36B,EAAO8W,SAAUzV,KACrCmf,EAAQxgB,EAAO46B,UAAWv4B,EAAKoC,iBAC5BzE,EAAO6O,KAAK/E,MAAMjC,KAAK4C,KAAMpI,GAASo4B,QAAW33B,SAGtCA,IAAVqB,EACW,OAAVA,OACJnE,EAAO06B,WAAYr5B,EAAMgB,GAIrBme,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,GAGRM,EAAK5B,aAAc4C,EAAM8B,EAAQ,IAC1BA,GAGHqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAMM,OAHdA,EAAMf,EAAOwN,KAAKuB,KAAM1N,EAAMgB,SAGTS,EAAY/B,IAGlC65B,UAAW,CACVj8B,KAAM,CACL6gB,IAAK,SAAUne,EAAM8C,GACpB,IAAM9F,EAAQm8B,YAAwB,UAAVr2B,GAC3BkF,EAAUhI,EAAM,SAAY,CAC5B,IAAIjC,EAAMiC,EAAK8C,MAKf,OAJA9C,EAAK5B,aAAc,OAAQ0E,GACtB/E,IACJiC,EAAK8C,MAAQ/E,GAEP+E,MAMXu2B,WAAY,SAAUr5B,EAAM8C,GAC3B,IAAI9B,EACHlD,EAAI,EAIJ07B,EAAY12B,GAASA,EAAM2F,MAAOoP,GAEnC,GAAK2hB,GAA+B,IAAlBx5B,EAAK7C,SACtB,MAAU6D,EAAOw4B,EAAW17B,KAC3BkC,EAAK2J,gBAAiB3I,MAO1Bo4B,GAAW,CACVjb,IAAK,SAAUne,EAAM8C,EAAO9B,GAQ3B,OAPe,IAAV8B,EAGJnE,EAAO06B,WAAYr5B,EAAMgB,GAEzBhB,EAAK5B,aAAc4C,EAAMA,GAEnBA,IAITrC,EAAOkB,KAAMlB,EAAO6O,KAAK/E,MAAMjC,KAAKmZ,OAAOlX,MAAO,QAAU,SAAUtF,EAAInC,GACzE,IAAIy4B,EAASlvB,GAAYvJ,IAAUrC,EAAOwN,KAAKuB,KAE/CnD,GAAYvJ,GAAS,SAAUhB,EAAMgB,EAAMwC,GAC1C,IAAI9D,EAAKimB,EACR+T,EAAgB14B,EAAKoC,cAYtB,OAVMI,IAGLmiB,EAASpb,GAAYmvB,GACrBnvB,GAAYmvB,GAAkBh6B,EAC9BA,EAAqC,MAA/B+5B,EAAQz5B,EAAMgB,EAAMwC,GACzBk2B,EACA,KACDnvB,GAAYmvB,GAAkB/T,GAExBjmB,KAOT,IAAIi6B,GAAa,sCAChBC,GAAa,gBAyIb,SAASC,GAAkB/2B,GAE1B,OADaA,EAAM2F,MAAOoP,IAAmB,IAC/BrO,KAAM,KAItB,SAASswB,GAAU95B,GAClB,OAAOA,EAAK7B,cAAgB6B,EAAK7B,aAAc,UAAa,GAG7D,SAAS47B,GAAgBj3B,GACxB,OAAKvB,MAAMC,QAASsB,GACZA,EAEc,iBAAVA,GACJA,EAAM2F,MAAOoP,IAEd,GAxJRlZ,EAAOG,GAAGgC,OAAQ,CACjBud,KAAM,SAAUrd,EAAM8B,GACrB,OAAOia,EAAQnhB,KAAM+C,EAAO0f,KAAMrd,EAAM8B,EAA0B,EAAnB7C,UAAUhB,SAG1D+6B,WAAY,SAAUh5B,GACrB,OAAOpF,KAAKiE,KAAM,kBACVjE,KAAM+C,EAAOs7B,QAASj5B,IAAUA,QAK1CrC,EAAOmC,OAAQ,CACdud,KAAM,SAAUre,EAAMgB,EAAM8B,GAC3B,IAAIpD,EAAKyf,EACRma,EAAQt5B,EAAK7C,SAGd,GAAe,IAAVm8B,GAAyB,IAAVA,GAAyB,IAAVA,EAWnC,OAPe,IAAVA,GAAgB36B,EAAO8W,SAAUzV,KAGrCgB,EAAOrC,EAAOs7B,QAASj5B,IAAUA,EACjCme,EAAQxgB,EAAOm1B,UAAW9yB,SAGZS,IAAVqB,EACCqc,GAAS,QAASA,QACuB1d,KAA3C/B,EAAMyf,EAAMhB,IAAKne,EAAM8C,EAAO9B,IACzBtB,EAGCM,EAAMgB,GAAS8B,EAGpBqc,GAAS,QAASA,GAA+C,QAApCzf,EAAMyf,EAAM7f,IAAKU,EAAMgB,IACjDtB,EAGDM,EAAMgB,IAGd8yB,UAAW,CACV1iB,SAAU,CACT9R,IAAK,SAAUU,GAOd,IAAIk6B,EAAWv7B,EAAOwN,KAAKuB,KAAM1N,EAAM,YAEvC,OAAKk6B,EACGzK,SAAUyK,EAAU,IAI3BP,GAAWvwB,KAAMpJ,EAAKgI,WACtB4xB,GAAWxwB,KAAMpJ,EAAKgI,WACtBhI,EAAKmR,KAEE,GAGA,KAKX8oB,QAAS,CACRE,MAAO,UACPC,QAAS,eAYLp9B,EAAQk8B,cACbv6B,EAAOm1B,UAAUviB,SAAW,CAC3BjS,IAAK,SAAUU,GAId,IAAI8P,EAAS9P,EAAKzB,WAIlB,OAHKuR,GAAUA,EAAOvR,YACrBuR,EAAOvR,WAAWiT,cAEZ,MAER2M,IAAK,SAAUne,GAId,IAAI8P,EAAS9P,EAAKzB,WACbuR,IACJA,EAAO0B,cAEF1B,EAAOvR,YACXuR,EAAOvR,WAAWiT,kBAOvB7S,EAAOkB,KAAM,CACZ,WACA,WACA,YACA,cACA,cACA,UACA,UACA,SACA,cACA,mBACE,WACFlB,EAAOs7B,QAASr+B,KAAKwH,eAAkBxH,OA4BxC+C,EAAOG,GAAGgC,OAAQ,CACjBu5B,SAAU,SAAUv3B,GACnB,IAAIw3B,EAASt6B,EAAMyK,EAAK8vB,EAAUC,EAAO95B,EAAG+5B,EAC3C38B,EAAI,EAEL,GAAKb,EAAY6F,GAChB,OAAOlH,KAAKiE,KAAM,SAAUa,GAC3B/B,EAAQ/C,MAAOy+B,SAAUv3B,EAAMzG,KAAMT,KAAM8E,EAAGo5B,GAAUl+B,UAM1D,IAFA0+B,EAAUP,GAAgBj3B,IAEb7D,OACZ,MAAUe,EAAOpE,KAAMkC,KAItB,GAHAy8B,EAAWT,GAAU95B,GACrByK,EAAwB,IAAlBzK,EAAK7C,UAAoB,IAAM08B,GAAkBU,GAAa,IAEzD,CACV75B,EAAI,EACJ,MAAU85B,EAAQF,EAAS55B,KACrB+J,EAAIhO,QAAS,IAAM+9B,EAAQ,KAAQ,IACvC/vB,GAAO+vB,EAAQ,KAMZD,KADLE,EAAaZ,GAAkBpvB,KAE9BzK,EAAK5B,aAAc,QAASq8B,GAMhC,OAAO7+B,MAGR8+B,YAAa,SAAU53B,GACtB,IAAIw3B,EAASt6B,EAAMyK,EAAK8vB,EAAUC,EAAO95B,EAAG+5B,EAC3C38B,EAAI,EAEL,GAAKb,EAAY6F,GAChB,OAAOlH,KAAKiE,KAAM,SAAUa,GAC3B/B,EAAQ/C,MAAO8+B,YAAa53B,EAAMzG,KAAMT,KAAM8E,EAAGo5B,GAAUl+B,UAI7D,IAAMqE,UAAUhB,OACf,OAAOrD,KAAK8R,KAAM,QAAS,IAK5B,IAFA4sB,EAAUP,GAAgBj3B,IAEb7D,OACZ,MAAUe,EAAOpE,KAAMkC,KAMtB,GALAy8B,EAAWT,GAAU95B,GAGrByK,EAAwB,IAAlBzK,EAAK7C,UAAoB,IAAM08B,GAAkBU,GAAa,IAEzD,CACV75B,EAAI,EACJ,MAAU85B,EAAQF,EAAS55B,KAG1B,OAA4C,EAApC+J,EAAIhO,QAAS,IAAM+9B,EAAQ,KAClC/vB,EAAMA,EAAI5I,QAAS,IAAM24B,EAAQ,IAAK,KAMnCD,KADLE,EAAaZ,GAAkBpvB,KAE9BzK,EAAK5B,aAAc,QAASq8B,GAMhC,OAAO7+B,MAGR++B,YAAa,SAAU73B,EAAO83B,GAC7B,IAAIt9B,SAAcwF,EACjB+3B,EAAwB,WAATv9B,GAAqBiE,MAAMC,QAASsB,GAEpD,MAAyB,kBAAb83B,GAA0BC,EAC9BD,EAAWh/B,KAAKy+B,SAAUv3B,GAAUlH,KAAK8+B,YAAa53B,GAGzD7F,EAAY6F,GACTlH,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAO++B,YACd73B,EAAMzG,KAAMT,KAAMkC,EAAGg8B,GAAUl+B,MAAQg/B,GACvCA,KAKIh/B,KAAKiE,KAAM,WACjB,IAAIgM,EAAW/N,EAAGsY,EAAM0kB,EAExB,GAAKD,EAAe,CAGnB/8B,EAAI,EACJsY,EAAOzX,EAAQ/C,MACfk/B,EAAaf,GAAgBj3B,GAE7B,MAAU+I,EAAYivB,EAAYh9B,KAG5BsY,EAAK2kB,SAAUlvB,GACnBuK,EAAKskB,YAAa7uB,GAElBuK,EAAKikB,SAAUxuB,aAKIpK,IAAVqB,GAAgC,YAATxF,KAClCuO,EAAYiuB,GAAUl+B,QAIrB2iB,EAASJ,IAAKviB,KAAM,gBAAiBiQ,GAOjCjQ,KAAKwC,cACTxC,KAAKwC,aAAc,QAClByN,IAAuB,IAAV/I,EACb,GACAyb,EAASjf,IAAK1D,KAAM,kBAAqB,QAO9Cm/B,SAAU,SAAUn8B,GACnB,IAAIiN,EAAW7L,EACdlC,EAAI,EAEL+N,EAAY,IAAMjN,EAAW,IAC7B,MAAUoB,EAAOpE,KAAMkC,KACtB,GAAuB,IAAlBkC,EAAK7C,WACoE,GAA3E,IAAM08B,GAAkBC,GAAU95B,IAAW,KAAMvD,QAASoP,GAC7D,OAAO,EAIV,OAAO,KAOT,IAAImvB,GAAU,MAEdr8B,EAAOG,GAAGgC,OAAQ,CACjB/C,IAAK,SAAU+E,GACd,IAAIqc,EAAOzf,EAAKyrB,EACfnrB,EAAOpE,KAAM,GAEd,OAAMqE,UAAUhB,QA0BhBksB,EAAkBluB,EAAY6F,GAEvBlH,KAAKiE,KAAM,SAAU/B,GAC3B,IAAIC,EAEmB,IAAlBnC,KAAKuB,WAWE,OANXY,EADIotB,EACEroB,EAAMzG,KAAMT,KAAMkC,EAAGa,EAAQ/C,MAAOmC,OAEpC+E,GAKN/E,EAAM,GAEoB,iBAARA,EAClBA,GAAO,GAEIwD,MAAMC,QAASzD,KAC1BA,EAAMY,EAAOoB,IAAKhC,EAAK,SAAU+E,GAChC,OAAgB,MAATA,EAAgB,GAAKA,EAAQ,OAItCqc,EAAQxgB,EAAOs8B,SAAUr/B,KAAK0B,OAAUqB,EAAOs8B,SAAUr/B,KAAKoM,SAAS5E,iBAGrD,QAAS+b,QAA+C1d,IAApC0d,EAAMhB,IAAKviB,KAAMmC,EAAK,WAC3DnC,KAAKkH,MAAQ/E,OAzDTiC,GACJmf,EAAQxgB,EAAOs8B,SAAUj7B,EAAK1C,OAC7BqB,EAAOs8B,SAAUj7B,EAAKgI,SAAS5E,iBAG/B,QAAS+b,QACgC1d,KAAvC/B,EAAMyf,EAAM7f,IAAKU,EAAM,UAElBN,EAMY,iBAHpBA,EAAMM,EAAK8C,OAIHpD,EAAImC,QAASm5B,GAAS,IAIhB,MAAPt7B,EAAc,GAAKA,OAG3B,KAyCHf,EAAOmC,OAAQ,CACdm6B,SAAU,CACTlZ,OAAQ,CACPziB,IAAK,SAAUU,GAEd,IAAIjC,EAAMY,EAAOwN,KAAKuB,KAAM1N,EAAM,SAClC,OAAc,MAAPjC,EACNA,EAMA87B,GAAkBl7B,EAAOT,KAAM8B,MAGlC2D,OAAQ,CACPrE,IAAK,SAAUU,GACd,IAAI8C,EAAOif,EAAQjkB,EAClBiD,EAAUf,EAAKe,QACfkW,EAAQjX,EAAKwR,cACb2S,EAAoB,eAAdnkB,EAAK1C,KACX6jB,EAASgD,EAAM,KAAO,GACtBwM,EAAMxM,EAAMlN,EAAQ,EAAIlW,EAAQ9B,OAUjC,IAPCnB,EADImZ,EAAQ,EACR0Z,EAGAxM,EAAMlN,EAAQ,EAIXnZ,EAAI6yB,EAAK7yB,IAKhB,KAJAikB,EAAShhB,EAASjD,IAIJyT,UAAYzT,IAAMmZ,KAG7B8K,EAAOha,YACLga,EAAOxjB,WAAWwJ,WACnBC,EAAU+Z,EAAOxjB,WAAY,aAAiB,CAMjD,GAHAuE,EAAQnE,EAAQojB,GAAShkB,MAGpBomB,EACJ,OAAOrhB,EAIRqe,EAAO3kB,KAAMsG,GAIf,OAAOqe,GAGRhD,IAAK,SAAUne,EAAM8C,GACpB,IAAIo4B,EAAWnZ,EACdhhB,EAAUf,EAAKe,QACfogB,EAASxiB,EAAO2D,UAAWQ,GAC3BhF,EAAIiD,EAAQ9B,OAEb,MAAQnB,MACPikB,EAAShhB,EAASjD,IAINyT,UACuD,EAAlE5S,EAAO6D,QAAS7D,EAAOs8B,SAASlZ,OAAOziB,IAAKyiB,GAAUZ,MAEtD+Z,GAAY,GAUd,OAHMA,IACLl7B,EAAKwR,eAAiB,GAEhB2P,OAOXxiB,EAAOkB,KAAM,CAAE,QAAS,YAAc,WACrClB,EAAOs8B,SAAUr/B,MAAS,CACzBuiB,IAAK,SAAUne,EAAM8C,GACpB,GAAKvB,MAAMC,QAASsB,GACnB,OAAS9C,EAAKsR,SAA2D,EAAjD3S,EAAO6D,QAAS7D,EAAQqB,GAAOjC,MAAO+E,KAI3D9F,EAAQi8B,UACbt6B,EAAOs8B,SAAUr/B,MAAO0D,IAAM,SAAUU,GACvC,OAAwC,OAAjCA,EAAK7B,aAAc,SAAqB,KAAO6B,EAAK8C,UAW9D9F,EAAQm+B,QAAU,cAAex/B,EAGjC,IAAIy/B,GAAc,kCACjBC,GAA0B,SAAUjzB,GACnCA,EAAEwc,mBAGJjmB,EAAOmC,OAAQnC,EAAO0lB,MAAO,CAE5BU,QAAS,SAAUV,EAAOjG,EAAMpe,EAAMs7B,GAErC,IAAIx9B,EAAG2M,EAAK6B,EAAKivB,EAAYC,EAAQ7V,EAAQ7K,EAAS2gB,EACrDC,EAAY,CAAE17B,GAAQxE,GACtB8B,EAAOV,EAAOP,KAAMgoB,EAAO,QAAWA,EAAM/mB,KAAO+mB,EACnDkB,EAAa3oB,EAAOP,KAAMgoB,EAAO,aAAgBA,EAAMjZ,UAAUlI,MAAO,KAAQ,GAKjF,GAHAuH,EAAMgxB,EAAcnvB,EAAMtM,EAAOA,GAAQxE,EAGlB,IAAlBwE,EAAK7C,UAAoC,IAAlB6C,EAAK7C,WAK5Bi+B,GAAYhyB,KAAM9L,EAAOqB,EAAO0lB,MAAMuB,cAIf,EAAvBtoB,EAAKb,QAAS,OAIlBa,GADAioB,EAAajoB,EAAK4F,MAAO,MACP8G,QAClBub,EAAW3kB,QAEZ46B,EAASl+B,EAAKb,QAAS,KAAQ,GAAK,KAAOa,GAG3C+mB,EAAQA,EAAO1lB,EAAO+C,SACrB2iB,EACA,IAAI1lB,EAAOqmB,MAAO1nB,EAAuB,iBAAV+mB,GAAsBA,IAGhDK,UAAY4W,EAAe,EAAI,EACrCjX,EAAMjZ,UAAYma,EAAW/b,KAAM,KACnC6a,EAAMwC,WAAaxC,EAAMjZ,UACxB,IAAI1F,OAAQ,UAAY6f,EAAW/b,KAAM,iBAAoB,WAC7D,KAGD6a,EAAMnV,YAASzN,EACT4iB,EAAMjjB,SACXijB,EAAMjjB,OAASpB,GAIhBoe,EAAe,MAARA,EACN,CAAEiG,GACF1lB,EAAO2D,UAAW8b,EAAM,CAAEiG,IAG3BvJ,EAAUnc,EAAO0lB,MAAMvJ,QAASxd,IAAU,GACpCg+B,IAAgBxgB,EAAQiK,UAAmD,IAAxCjK,EAAQiK,QAAQxoB,MAAOyD,EAAMoe,IAAtE,CAMA,IAAMkd,IAAiBxgB,EAAQyM,WAAanqB,EAAU4C,GAAS,CAM9D,IAJAu7B,EAAazgB,EAAQ6J,cAAgBrnB,EAC/B89B,GAAYhyB,KAAMmyB,EAAaj+B,KACpCmN,EAAMA,EAAIlM,YAEHkM,EAAKA,EAAMA,EAAIlM,WACtBm9B,EAAUl/B,KAAMiO,GAChB6B,EAAM7B,EAIF6B,KAAUtM,EAAK6I,eAAiBrN,IACpCkgC,EAAUl/B,KAAM8P,EAAIb,aAAea,EAAIqvB,cAAgBhgC,GAKzDmC,EAAI,EACJ,OAAU2M,EAAMixB,EAAW59B,QAAYumB,EAAMqC,uBAC5C+U,EAAchxB,EACd4Z,EAAM/mB,KAAW,EAAJQ,EACZy9B,EACAzgB,EAAQgL,UAAYxoB,GAGrBqoB,GACEpH,EAASjf,IAAKmL,EAAK,WAAczO,OAAO0pB,OAAQ,OAC9CrB,EAAM/mB,OACTihB,EAASjf,IAAKmL,EAAK,YAEnBkb,EAAOppB,MAAOkO,EAAK2T,IAIpBuH,EAAS6V,GAAU/wB,EAAK+wB,KACT7V,EAAOppB,OAASshB,EAAYpT,KAC1C4Z,EAAMnV,OAASyW,EAAOppB,MAAOkO,EAAK2T,IACZ,IAAjBiG,EAAMnV,QACVmV,EAAMS,kBA8CT,OA1CAT,EAAM/mB,KAAOA,EAGPg+B,GAAiBjX,EAAMuD,sBAEpB9M,EAAQuH,WACqC,IAApDvH,EAAQuH,SAAS9lB,MAAOm/B,EAAUz2B,MAAOmZ,KACzCP,EAAY7d,IAIPw7B,GAAUv+B,EAAY+C,EAAM1C,MAAaF,EAAU4C,MAGvDsM,EAAMtM,EAAMw7B,MAGXx7B,EAAMw7B,GAAW,MAIlB78B,EAAO0lB,MAAMuB,UAAYtoB,EAEpB+mB,EAAMqC,wBACV+U,EAAY9vB,iBAAkBrO,EAAM+9B,IAGrCr7B,EAAM1C,KAED+mB,EAAMqC,wBACV+U,EAAY/e,oBAAqBpf,EAAM+9B,IAGxC18B,EAAO0lB,MAAMuB,eAAYnkB,EAEpB6K,IACJtM,EAAMw7B,GAAWlvB,IAMd+X,EAAMnV,SAKd0sB,SAAU,SAAUt+B,EAAM0C,EAAMqkB,GAC/B,IAAIjc,EAAIzJ,EAAOmC,OACd,IAAInC,EAAOqmB,MACXX,EACA,CACC/mB,KAAMA,EACN2qB,aAAa,IAIftpB,EAAO0lB,MAAMU,QAAS3c,EAAG,KAAMpI,MAKjCrB,EAAOG,GAAGgC,OAAQ,CAEjBikB,QAAS,SAAUznB,EAAM8gB,GACxB,OAAOxiB,KAAKiE,KAAM,WACjBlB,EAAO0lB,MAAMU,QAASznB,EAAM8gB,EAAMxiB,SAGpCigC,eAAgB,SAAUv+B,EAAM8gB,GAC/B,IAAIpe,EAAOpE,KAAM,GACjB,GAAKoE,EACJ,OAAOrB,EAAO0lB,MAAMU,QAASznB,EAAM8gB,EAAMpe,GAAM,MAc5ChD,EAAQm+B,SACbx8B,EAAOkB,KAAM,CAAEmR,MAAO,UAAW8Y,KAAM,YAAc,SAAUK,EAAM5D,GAGpE,IAAIjc,EAAU,SAAU+Z,GACvB1lB,EAAO0lB,MAAMuX,SAAUrV,EAAKlC,EAAMjjB,OAAQzC,EAAO0lB,MAAMkC,IAAKlC,KAG7D1lB,EAAO0lB,MAAMvJ,QAASyL,GAAQ,CAC7BP,MAAO,WAIN,IAAInoB,EAAMjC,KAAKiN,eAAiBjN,KAAKJ,UAAYI,KAChDkgC,EAAWvd,EAASxB,OAAQlf,EAAK0oB,GAE5BuV,GACLj+B,EAAI8N,iBAAkBwe,EAAM7f,GAAS,GAEtCiU,EAASxB,OAAQlf,EAAK0oB,GAAOuV,GAAY,GAAM,IAEhD3V,SAAU,WACT,IAAItoB,EAAMjC,KAAKiN,eAAiBjN,KAAKJ,UAAYI,KAChDkgC,EAAWvd,EAASxB,OAAQlf,EAAK0oB,GAAQ,EAEpCuV,EAKLvd,EAASxB,OAAQlf,EAAK0oB,EAAKuV,IAJ3Bj+B,EAAI6e,oBAAqByN,EAAM7f,GAAS,GACxCiU,EAAShF,OAAQ1b,EAAK0oB,QAS3B,IAAIzV,GAAWnV,EAAOmV,SAElBtT,GAAQ,CAAEuF,KAAMsB,KAAK2jB,OAErB+T,GAAS,KAKbp9B,EAAOq9B,SAAW,SAAU5d,GAC3B,IAAI3O,EACJ,IAAM2O,GAAwB,iBAATA,EACpB,OAAO,KAKR,IACC3O,GAAM,IAAM9T,EAAOsgC,WAAcC,gBAAiB9d,EAAM,YACvD,MAAQhW,GACTqH,OAAMhO,EAMP,OAHMgO,IAAOA,EAAIxG,qBAAsB,eAAgBhK,QACtDN,EAAOoD,MAAO,gBAAkBqc,GAE1B3O,GAIR,IACC0sB,GAAW,QACXC,GAAQ,SACRC,GAAkB,wCAClBC,GAAe,qCAEhB,SAASC,GAAa9I,EAAQv2B,EAAKs/B,EAAarlB,GAC/C,IAAInW,EAEJ,GAAKO,MAAMC,QAAStE,GAGnByB,EAAOkB,KAAM3C,EAAK,SAAUY,EAAGia,GACzBykB,GAAeL,GAAS/yB,KAAMqqB,GAGlCtc,EAAKsc,EAAQ1b,GAKbwkB,GACC9I,EAAS,KAAqB,iBAAN1b,GAAuB,MAALA,EAAYja,EAAI,IAAO,IACjEia,EACAykB,EACArlB,UAKG,GAAMqlB,GAAiC,WAAlB/9B,EAAQvB,GAUnCia,EAAKsc,EAAQv2B,QAPb,IAAM8D,KAAQ9D,EACbq/B,GAAa9I,EAAS,IAAMzyB,EAAO,IAAK9D,EAAK8D,GAAQw7B,EAAarlB,GAYrExY,EAAO89B,MAAQ,SAAU13B,EAAGy3B,GAC3B,IAAI/I,EACHiJ,EAAI,GACJvlB,EAAM,SAAUrN,EAAK6yB,GAGpB,IAAI75B,EAAQ7F,EAAY0/B,GACvBA,IACAA,EAEDD,EAAGA,EAAEz9B,QAAW29B,mBAAoB9yB,GAAQ,IAC3C8yB,mBAA6B,MAAT95B,EAAgB,GAAKA,IAG5C,GAAU,MAALiC,EACJ,MAAO,GAIR,GAAKxD,MAAMC,QAASuD,IAASA,EAAE5F,SAAWR,EAAO2C,cAAeyD,GAG/DpG,EAAOkB,KAAMkF,EAAG,WACfoS,EAAKvb,KAAKoF,KAAMpF,KAAKkH,cAOtB,IAAM2wB,KAAU1uB,EACfw3B,GAAa9I,EAAQ1uB,EAAG0uB,GAAU+I,EAAarlB,GAKjD,OAAOulB,EAAElzB,KAAM,MAGhB7K,EAAOG,GAAGgC,OAAQ,CACjB+7B,UAAW,WACV,OAAOl+B,EAAO89B,MAAO7gC,KAAKkhC,mBAE3BA,eAAgB,WACf,OAAOlhC,KAAKmE,IAAK,WAGhB,IAAI0N,EAAW9O,EAAO0f,KAAMziB,KAAM,YAClC,OAAO6R,EAAW9O,EAAO2D,UAAWmL,GAAa7R,OAEjDqQ,OAAQ,WACR,IAAI3O,EAAO1B,KAAK0B,KAGhB,OAAO1B,KAAKoF,OAASrC,EAAQ/C,MAAOia,GAAI,cACvCymB,GAAalzB,KAAMxN,KAAKoM,YAAeq0B,GAAgBjzB,KAAM9L,KAC3D1B,KAAK0V,UAAYkQ,GAAepY,KAAM9L,MAEzCyC,IAAK,SAAUoD,EAAInD,GACnB,IAAIjC,EAAMY,EAAQ/C,MAAOmC,MAEzB,OAAY,MAAPA,EACG,KAGHwD,MAAMC,QAASzD,GACZY,EAAOoB,IAAKhC,EAAK,SAAUA,GACjC,MAAO,CAAEiD,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASu6B,GAAO,WAIhD,CAAEp7B,KAAMhB,EAAKgB,KAAM8B,MAAO/E,EAAI8D,QAASu6B,GAAO,WAClD98B,SAKN,IACCy9B,GAAM,OACNC,GAAQ,OACRC,GAAa,gBACbC,GAAW,6BAIXC,GAAa,iBACbC,GAAY,QAWZpH,GAAa,GAObqH,GAAa,GAGbC,GAAW,KAAKhhC,OAAQ,KAGxBihC,GAAe/hC,EAASyC,cAAe,KAIxC,SAASu/B,GAA6BC,GAGrC,OAAO,SAAUC,EAAoB9jB,GAED,iBAAvB8jB,IACX9jB,EAAO8jB,EACPA,EAAqB,KAGtB,IAAIC,EACH7/B,EAAI,EACJ8/B,EAAYF,EAAmBt6B,cAAcqF,MAAOoP,IAAmB,GAExE,GAAK5a,EAAY2c,GAGhB,MAAU+jB,EAAWC,EAAW9/B,KAGR,MAAlB6/B,EAAU,IACdA,EAAWA,EAASzhC,MAAO,IAAO,KAChCuhC,EAAWE,GAAaF,EAAWE,IAAc,IAAKpwB,QAASqM,KAI/D6jB,EAAWE,GAAaF,EAAWE,IAAc,IAAKnhC,KAAMod,IAQnE,SAASikB,GAA+BJ,EAAW18B,EAASw1B,EAAiBuH,GAE5E,IAAIC,EAAY,GACfC,EAAqBP,IAAcJ,GAEpC,SAASY,EAASN,GACjB,IAAIpsB,EAcJ,OAbAwsB,EAAWJ,IAAa,EACxBh/B,EAAOkB,KAAM49B,EAAWE,IAAc,GAAI,SAAU/kB,EAAGslB,GACtD,IAAIC,EAAsBD,EAAoBn9B,EAASw1B,EAAiBuH,GACxE,MAAoC,iBAAxBK,GACVH,GAAqBD,EAAWI,GAKtBH,IACDzsB,EAAW4sB,QADf,GAHNp9B,EAAQ68B,UAAUrwB,QAAS4wB,GAC3BF,EAASE,IACF,KAKF5sB,EAGR,OAAO0sB,EAASl9B,EAAQ68B,UAAW,MAAUG,EAAW,MAASE,EAAS,KAM3E,SAASG,GAAYh9B,EAAQ7D,GAC5B,IAAIuM,EAAKzI,EACRg9B,EAAc1/B,EAAO2/B,aAAaD,aAAe,GAElD,IAAMv0B,KAAOvM,OACQkE,IAAflE,EAAKuM,MACPu0B,EAAav0B,GAAQ1I,EAAWC,IAAUA,EAAO,KAAUyI,GAAQvM,EAAKuM,IAO5E,OAJKzI,GACJ1C,EAAOmC,QAAQ,EAAMM,EAAQC,GAGvBD,EA/EPm8B,GAAapsB,KAAOL,GAASK,KAgP9BxS,EAAOmC,OAAQ,CAGdy9B,OAAQ,EAGRC,aAAc,GACdC,KAAM,GAENH,aAAc,CACbI,IAAK5tB,GAASK,KACd7T,KAAM,MACNqhC,QAvRgB,4DAuRQv1B,KAAM0H,GAAS8tB,UACvCxjC,QAAQ,EACRyjC,aAAa,EACbC,OAAO,EACPC,YAAa,mDAcbC,QAAS,CACRlI,IAAKwG,GACLp/B,KAAM,aACNktB,KAAM,YACN3b,IAAK,4BACLwvB,KAAM,qCAGPtoB,SAAU,CACTlH,IAAK,UACL2b,KAAM,SACN6T,KAAM,YAGPC,eAAgB,CACfzvB,IAAK,cACLvR,KAAM,eACN+gC,KAAM,gBAKPE,WAAY,CAGXC,SAAU/3B,OAGVg4B,aAAa,EAGbC,YAAa1gB,KAAKC,MAGlB0gB,WAAY5gC,EAAOq9B,UAOpBqC,YAAa,CACZK,KAAK,EACL7/B,SAAS,IAOX2gC,UAAW,SAAUp+B,EAAQq+B,GAC5B,OAAOA,EAGNrB,GAAYA,GAAYh9B,EAAQzC,EAAO2/B,cAAgBmB,GAGvDrB,GAAYz/B,EAAO2/B,aAAcl9B,IAGnCs+B,cAAelC,GAA6BxH,IAC5C2J,cAAenC,GAA6BH,IAG5CuC,KAAM,SAAUlB,EAAK39B,GAGA,iBAAR29B,IACX39B,EAAU29B,EACVA,OAAMj9B,GAIPV,EAAUA,GAAW,GAErB,IAAI8+B,EAGHC,EAGAC,EACAC,EAGAC,EAGAC,EAGAzjB,EAGA0jB,EAGAriC,EAGAsiC,EAGA1D,EAAI/9B,EAAO6gC,UAAW,GAAIz+B,GAG1Bs/B,EAAkB3D,EAAE79B,SAAW69B,EAG/B4D,EAAqB5D,EAAE79B,UACpBwhC,EAAgBljC,UAAYkjC,EAAgBlhC,QAC7CR,EAAQ0hC,GACR1hC,EAAO0lB,MAGTrK,EAAWrb,EAAOgb,WAClB4mB,EAAmB5hC,EAAO+Z,UAAW,eAGrC8nB,EAAa9D,EAAE8D,YAAc,GAG7BC,EAAiB,GACjBC,EAAsB,GAGtBC,EAAW,WAGX7C,EAAQ,CACPjhB,WAAY,EAGZ+jB,kBAAmB,SAAU92B,GAC5B,IAAIrB,EACJ,GAAKgU,EAAY,CAChB,IAAMujB,EAAkB,CACvBA,EAAkB,GAClB,MAAUv3B,EAAQy0B,GAASp0B,KAAMi3B,GAChCC,EAAiBv3B,EAAO,GAAIrF,cAAgB,MACzC48B,EAAiBv3B,EAAO,GAAIrF,cAAgB,MAAS,IACrD9G,OAAQmM,EAAO,IAGpBA,EAAQu3B,EAAiBl2B,EAAI1G,cAAgB,KAE9C,OAAgB,MAATqF,EAAgB,KAAOA,EAAMe,KAAM,OAI3Cq3B,sBAAuB,WACtB,OAAOpkB,EAAYsjB,EAAwB,MAI5Ce,iBAAkB,SAAU9/B,EAAM8B,GAMjC,OALkB,MAAb2Z,IACJzb,EAAO0/B,EAAqB1/B,EAAKoC,eAChCs9B,EAAqB1/B,EAAKoC,gBAAmBpC,EAC9Cy/B,EAAgBz/B,GAAS8B,GAEnBlH,MAIRmlC,iBAAkB,SAAUzjC,GAI3B,OAHkB,MAAbmf,IACJigB,EAAEsE,SAAW1jC,GAEP1B,MAIR4kC,WAAY,SAAUzgC,GACrB,IAAIpC,EACJ,GAAKoC,EACJ,GAAK0c,EAGJqhB,EAAM/jB,OAAQha,EAAK+9B,EAAMmD,cAIzB,IAAMtjC,KAAQoC,EACbygC,EAAY7iC,GAAS,CAAE6iC,EAAY7iC,GAAQoC,EAAKpC,IAInD,OAAO/B,MAIRslC,MAAO,SAAUC,GAChB,IAAIC,EAAYD,GAAcR,EAK9B,OAJKd,GACJA,EAAUqB,MAAOE,GAElB58B,EAAM,EAAG48B,GACFxlC,OAoBV,GAfAoe,EAASzB,QAASulB,GAKlBpB,EAAEgC,MAAUA,GAAOhC,EAAEgC,KAAO5tB,GAASK,MAAS,IAC5CtP,QAASu7B,GAAWtsB,GAAS8tB,SAAW,MAG1ClC,EAAEp/B,KAAOyD,EAAQuX,QAAUvX,EAAQzD,MAAQo/B,EAAEpkB,QAAUokB,EAAEp/B,KAGzDo/B,EAAEkB,WAAclB,EAAEiB,UAAY,KAAMv6B,cAAcqF,MAAOoP,IAAmB,CAAE,IAGxD,MAAjB6kB,EAAE2E,YAAsB,CAC5BnB,EAAY1kC,EAASyC,cAAe,KAKpC,IACCiiC,EAAU/uB,KAAOurB,EAAEgC,IAInBwB,EAAU/uB,KAAO+uB,EAAU/uB,KAC3BurB,EAAE2E,YAAc9D,GAAaqB,SAAW,KAAOrB,GAAa+D,MAC3DpB,EAAUtB,SAAW,KAAOsB,EAAUoB,KACtC,MAAQl5B,GAITs0B,EAAE2E,aAAc,GAalB,GARK3E,EAAEte,MAAQse,EAAEmC,aAAiC,iBAAXnC,EAAEte,OACxCse,EAAEte,KAAOzf,EAAO89B,MAAOC,EAAEte,KAAMse,EAAEF,cAIlCqB,GAA+B7H,GAAY0G,EAAG37B,EAAS+8B,GAGlDrhB,EACJ,OAAOqhB,EA8ER,IAAMhgC,KAzENqiC,EAAcxhC,EAAO0lB,OAASqY,EAAEthC,SAGQ,GAApBuD,EAAO4/B,UAC1B5/B,EAAO0lB,MAAMU,QAAS,aAIvB2X,EAAEp/B,KAAOo/B,EAAEp/B,KAAKogB,cAGhBgf,EAAE6E,YAAcpE,GAAW/zB,KAAMszB,EAAEp/B,MAKnCwiC,EAAWpD,EAAEgC,IAAI78B,QAASm7B,GAAO,IAG3BN,EAAE6E,WAwBI7E,EAAEte,MAAQse,EAAEmC,aACoD,KAAzEnC,EAAEqC,aAAe,IAAKtiC,QAAS,uCACjCigC,EAAEte,KAAOse,EAAEte,KAAKvc,QAASk7B,GAAK,OAvB9BqD,EAAW1D,EAAEgC,IAAIxiC,MAAO4jC,EAAS7gC,QAG5By9B,EAAEte,OAAUse,EAAEmC,aAAiC,iBAAXnC,EAAEte,QAC1C0hB,IAAc/D,GAAO3yB,KAAM02B,GAAa,IAAM,KAAQpD,EAAEte,YAGjDse,EAAEte,OAIO,IAAZse,EAAE7yB,QACNi2B,EAAWA,EAASj+B,QAASo7B,GAAY,MACzCmD,GAAarE,GAAO3yB,KAAM02B,GAAa,IAAM,KAAQ,KAAStiC,GAAMuF,OACnEq9B,GAIF1D,EAAEgC,IAAMoB,EAAWM,GASf1D,EAAE8E,aACD7iC,EAAO6/B,aAAcsB,IACzBhC,EAAMgD,iBAAkB,oBAAqBniC,EAAO6/B,aAAcsB,IAE9DnhC,EAAO8/B,KAAMqB,IACjBhC,EAAMgD,iBAAkB,gBAAiBniC,EAAO8/B,KAAMqB,MAKnDpD,EAAEte,MAAQse,EAAE6E,aAAgC,IAAlB7E,EAAEqC,aAAyBh+B,EAAQg+B,cACjEjB,EAAMgD,iBAAkB,eAAgBpE,EAAEqC,aAI3CjB,EAAMgD,iBACL,SACApE,EAAEkB,UAAW,IAAOlB,EAAEsC,QAAStC,EAAEkB,UAAW,IAC3ClB,EAAEsC,QAAStC,EAAEkB,UAAW,KACA,MAArBlB,EAAEkB,UAAW,GAAc,KAAON,GAAW,WAAa,IAC7DZ,EAAEsC,QAAS,MAIFtC,EAAE+E,QACZ3D,EAAMgD,iBAAkBhjC,EAAG4+B,EAAE+E,QAAS3jC,IAIvC,GAAK4+B,EAAEgF,cAC+C,IAAnDhF,EAAEgF,WAAWrlC,KAAMgkC,EAAiBvC,EAAOpB,IAAiBjgB,GAG9D,OAAOqhB,EAAMoD,QAed,GAXAP,EAAW,QAGXJ,EAAiBppB,IAAKulB,EAAE/F,UACxBmH,EAAMt5B,KAAMk4B,EAAEiF,SACd7D,EAAMtlB,KAAMkkB,EAAE36B,OAGd89B,EAAYhC,GAA+BR,GAAYX,EAAG37B,EAAS+8B,GAK5D,CASN,GARAA,EAAMjhB,WAAa,EAGdsjB,GACJG,EAAmBvb,QAAS,WAAY,CAAE+Y,EAAOpB,IAI7CjgB,EACJ,OAAOqhB,EAIHpB,EAAEoC,OAAqB,EAAZpC,EAAE3D,UACjBkH,EAAetkC,EAAO8f,WAAY,WACjCqiB,EAAMoD,MAAO,YACXxE,EAAE3D,UAGN,IACCtc,GAAY,EACZojB,EAAU+B,KAAMnB,EAAgBj8B,GAC/B,MAAQ4D,GAGT,GAAKqU,EACJ,MAAMrU,EAIP5D,GAAO,EAAG4D,SAhCX5D,GAAO,EAAG,gBAqCX,SAASA,EAAMy8B,EAAQY,EAAkBC,EAAWL,GACnD,IAAIM,EAAWJ,EAAS5/B,EAAOigC,EAAUC,EACxCd,EAAaU,EAGTplB,IAILA,GAAY,EAGPwjB,GACJtkC,EAAOq9B,aAAciH,GAKtBJ,OAAYp+B,EAGZs+B,EAAwB0B,GAAW,GAGnC3D,EAAMjhB,WAAsB,EAATokB,EAAa,EAAI,EAGpCc,EAAsB,KAAVd,GAAiBA,EAAS,KAAkB,MAAXA,EAGxCa,IACJE,EA7lBJ,SAA8BtF,EAAGoB,EAAOgE,GAEvC,IAAII,EAAI5kC,EAAM6kC,EAAeC,EAC5BzrB,EAAW+lB,EAAE/lB,SACbinB,EAAYlB,EAAEkB,UAGf,MAA2B,MAAnBA,EAAW,GAClBA,EAAU5zB,aACEvI,IAAPygC,IACJA,EAAKxF,EAAEsE,UAAYlD,EAAM8C,kBAAmB,iBAK9C,GAAKsB,EACJ,IAAM5kC,KAAQqZ,EACb,GAAKA,EAAUrZ,IAAUqZ,EAAUrZ,GAAO8L,KAAM84B,GAAO,CACtDtE,EAAUrwB,QAASjQ,GACnB,MAMH,GAAKsgC,EAAW,KAAOkE,EACtBK,EAAgBvE,EAAW,OACrB,CAGN,IAAMtgC,KAAQwkC,EAAY,CACzB,IAAMlE,EAAW,IAAOlB,EAAEyC,WAAY7hC,EAAO,IAAMsgC,EAAW,IAAQ,CACrEuE,EAAgB7kC,EAChB,MAEK8kC,IACLA,EAAgB9kC,GAKlB6kC,EAAgBA,GAAiBC,EAMlC,GAAKD,EAIJ,OAHKA,IAAkBvE,EAAW,IACjCA,EAAUrwB,QAAS40B,GAEbL,EAAWK,GA0iBLE,CAAqB3F,EAAGoB,EAAOgE,KAIrCC,IAAwD,EAA3CpjC,EAAO6D,QAAS,SAAUk6B,EAAEkB,aAC9ClB,EAAEyC,WAAY,eAAkB,cAIjC6C,EA5iBH,SAAsBtF,EAAGsF,EAAUlE,EAAOiE,GACzC,IAAIO,EAAOC,EAASC,EAAMl2B,EAAKsK,EAC9BuoB,EAAa,GAGbvB,EAAYlB,EAAEkB,UAAU1hC,QAGzB,GAAK0hC,EAAW,GACf,IAAM4E,KAAQ9F,EAAEyC,WACfA,EAAYqD,EAAKp/B,eAAkBs5B,EAAEyC,WAAYqD,GAInDD,EAAU3E,EAAU5zB,QAGpB,MAAQu4B,EAcP,GAZK7F,EAAEwC,eAAgBqD,KACtBzE,EAAOpB,EAAEwC,eAAgBqD,IAAcP,IAIlCprB,GAAQmrB,GAAarF,EAAE+F,aAC5BT,EAAWtF,EAAE+F,WAAYT,EAAUtF,EAAEiB,WAGtC/mB,EAAO2rB,EACPA,EAAU3E,EAAU5zB,QAKnB,GAAiB,MAAZu4B,EAEJA,EAAU3rB,OAGJ,GAAc,MAATA,GAAgBA,IAAS2rB,EAAU,CAM9C,KAHAC,EAAOrD,EAAYvoB,EAAO,IAAM2rB,IAAapD,EAAY,KAAOoD,IAI/D,IAAMD,KAASnD,EAId,IADA7yB,EAAMg2B,EAAMp/B,MAAO,MACT,KAAQq/B,IAGjBC,EAAOrD,EAAYvoB,EAAO,IAAMtK,EAAK,KACpC6yB,EAAY,KAAO7yB,EAAK,KACb,EAGG,IAATk2B,EACJA,EAAOrD,EAAYmD,IAGgB,IAAxBnD,EAAYmD,KACvBC,EAAUj2B,EAAK,GACfsxB,EAAUrwB,QAASjB,EAAK,KAEzB,MAOJ,IAAc,IAATk2B,EAGJ,GAAKA,GAAQ9F,EAAEgG,UACdV,EAAWQ,EAAMR,QAEjB,IACCA,EAAWQ,EAAMR,GAChB,MAAQ55B,GACT,MAAO,CACN0R,MAAO,cACP/X,MAAOygC,EAAOp6B,EAAI,sBAAwBwO,EAAO,OAAS2rB,IASjE,MAAO,CAAEzoB,MAAO,UAAWsE,KAAM4jB,GA+cpBW,CAAajG,EAAGsF,EAAUlE,EAAOiE,GAGvCA,GAGCrF,EAAE8E,cACNS,EAAWnE,EAAM8C,kBAAmB,oBAEnCjiC,EAAO6/B,aAAcsB,GAAamC,IAEnCA,EAAWnE,EAAM8C,kBAAmB,WAEnCjiC,EAAO8/B,KAAMqB,GAAamC,IAKZ,MAAXhB,GAA6B,SAAXvE,EAAEp/B,KACxB6jC,EAAa,YAGS,MAAXF,EACXE,EAAa,eAIbA,EAAaa,EAASloB,MACtB6nB,EAAUK,EAAS5jB,KAEnB2jB,IADAhgC,EAAQigC,EAASjgC,UAMlBA,EAAQo/B,GACHF,GAAWE,IACfA,EAAa,QACRF,EAAS,IACbA,EAAS,KAMZnD,EAAMmD,OAASA,EACfnD,EAAMqD,YAAeU,GAAoBV,GAAe,GAGnDY,EACJ/nB,EAASmB,YAAaklB,EAAiB,CAAEsB,EAASR,EAAYrD,IAE9D9jB,EAASuB,WAAY8kB,EAAiB,CAAEvC,EAAOqD,EAAYp/B,IAI5D+7B,EAAM0C,WAAYA,GAClBA,OAAa/+B,EAER0+B,GACJG,EAAmBvb,QAASgd,EAAY,cAAgB,YACvD,CAAEjE,EAAOpB,EAAGqF,EAAYJ,EAAU5/B,IAIpCw+B,EAAiB7mB,SAAU2mB,EAAiB,CAAEvC,EAAOqD,IAEhDhB,IACJG,EAAmBvb,QAAS,eAAgB,CAAE+Y,EAAOpB,MAG3C/9B,EAAO4/B,QAChB5/B,EAAO0lB,MAAMU,QAAS,cAKzB,OAAO+Y,GAGR8E,QAAS,SAAUlE,EAAKtgB,EAAMte,GAC7B,OAAOnB,EAAOW,IAAKo/B,EAAKtgB,EAAMte,EAAU,SAGzC+iC,UAAW,SAAUnE,EAAK5+B,GACzB,OAAOnB,EAAOW,IAAKo/B,OAAKj9B,EAAW3B,EAAU,aAI/CnB,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAImV,GAC7C3Z,EAAQ2Z,GAAW,SAAUomB,EAAKtgB,EAAMte,EAAUxC,GAUjD,OAPKL,EAAYmhB,KAChB9gB,EAAOA,GAAQwC,EACfA,EAAWse,EACXA,OAAO3c,GAID9C,EAAOihC,KAAMjhC,EAAOmC,OAAQ,CAClC49B,IAAKA,EACLphC,KAAMgb,EACNqlB,SAAUrgC,EACV8gB,KAAMA,EACNujB,QAAS7hC,GACPnB,EAAO2C,cAAeo9B,IAASA,OAIpC//B,EAAO+gC,cAAe,SAAUhD,GAC/B,IAAI5+B,EACJ,IAAMA,KAAK4+B,EAAE+E,QACa,iBAApB3jC,EAAEsF,gBACNs5B,EAAEqC,YAAcrC,EAAE+E,QAAS3jC,IAAO,MAMrCa,EAAO0sB,SAAW,SAAUqT,EAAK39B,EAASlD,GACzC,OAAOc,EAAOihC,KAAM,CACnBlB,IAAKA,EAGLphC,KAAM,MACNqgC,SAAU,SACV9zB,OAAO,EACPi1B,OAAO,EACP1jC,QAAQ,EAKR+jC,WAAY,CACX2D,cAAe,cAEhBL,WAAY,SAAUT,GACrBrjC,EAAO0D,WAAY2/B,EAAUjhC,EAASlD,OAMzCc,EAAOG,GAAGgC,OAAQ,CACjBiiC,QAAS,SAAU3X,GAClB,IAAIjI,EAyBJ,OAvBKvnB,KAAM,KACLqB,EAAYmuB,KAChBA,EAAOA,EAAK/uB,KAAMT,KAAM,KAIzBunB,EAAOxkB,EAAQysB,EAAMxvB,KAAM,GAAIiN,eAAgB1I,GAAI,GAAIgB,OAAO,GAEzDvF,KAAM,GAAI2C,YACd4kB,EAAK6I,aAAcpwB,KAAM,IAG1BunB,EAAKpjB,IAAK,WACT,IAAIC,EAAOpE,KAEX,MAAQoE,EAAKgjC,kBACZhjC,EAAOA,EAAKgjC,kBAGb,OAAOhjC,IACJ8rB,OAAQlwB,OAGNA,MAGRqnC,UAAW,SAAU7X,GACpB,OAAKnuB,EAAYmuB,GACTxvB,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAOqnC,UAAW7X,EAAK/uB,KAAMT,KAAMkC,MAItClC,KAAKiE,KAAM,WACjB,IAAIuW,EAAOzX,EAAQ/C,MAClB+a,EAAWP,EAAKO,WAEZA,EAAS1X,OACb0X,EAASosB,QAAS3X,GAGlBhV,EAAK0V,OAAQV,MAKhBjI,KAAM,SAAUiI,GACf,IAAI8X,EAAiBjmC,EAAYmuB,GAEjC,OAAOxvB,KAAKiE,KAAM,SAAU/B,GAC3Ba,EAAQ/C,MAAOmnC,QAASG,EAAiB9X,EAAK/uB,KAAMT,KAAMkC,GAAMstB,MAIlE+X,OAAQ,SAAUvkC,GAIjB,OAHAhD,KAAKkU,OAAQlR,GAAW2R,IAAK,QAAS1Q,KAAM,WAC3ClB,EAAQ/C,MAAOuwB,YAAavwB,KAAKuM,cAE3BvM,QAKT+C,EAAO6O,KAAKhI,QAAQ2vB,OAAS,SAAUn1B,GACtC,OAAQrB,EAAO6O,KAAKhI,QAAQ49B,QAASpjC,IAEtCrB,EAAO6O,KAAKhI,QAAQ49B,QAAU,SAAUpjC,GACvC,SAAWA,EAAKyuB,aAAezuB,EAAKqjC,cAAgBrjC,EAAKwxB,iBAAiBvyB,SAM3EN,EAAO2/B,aAAagF,IAAM,WACzB,IACC,OAAO,IAAI3nC,EAAO4nC,eACjB,MAAQn7B,MAGX,IAAIo7B,GAAmB,CAGrBC,EAAG,IAIHC,KAAM,KAEPC,GAAehlC,EAAO2/B,aAAagF,MAEpCtmC,EAAQ4mC,OAASD,IAAkB,oBAAqBA,GACxD3mC,EAAQ4iC,KAAO+D,KAAiBA,GAEhChlC,EAAOghC,cAAe,SAAU5+B,GAC/B,IAAIjB,EAAU+jC,EAGd,GAAK7mC,EAAQ4mC,MAAQD,KAAiB5iC,EAAQsgC,YAC7C,MAAO,CACNO,KAAM,SAAUH,EAAS9K,GACxB,IAAI74B,EACHwlC,EAAMviC,EAAQuiC,MAWf,GATAA,EAAIQ,KACH/iC,EAAQzD,KACRyD,EAAQ29B,IACR39B,EAAQ+9B,MACR/9B,EAAQgjC,SACRhjC,EAAQmR,UAIJnR,EAAQijC,UACZ,IAAMlmC,KAAKiD,EAAQijC,UAClBV,EAAKxlC,GAAMiD,EAAQijC,UAAWlmC,GAmBhC,IAAMA,KAdDiD,EAAQigC,UAAYsC,EAAIvC,kBAC5BuC,EAAIvC,iBAAkBhgC,EAAQigC,UAQzBjgC,EAAQsgC,aAAgBI,EAAS,sBACtCA,EAAS,oBAAuB,kBAItBA,EACV6B,EAAIxC,iBAAkBhjC,EAAG2jC,EAAS3jC,IAInCgC,EAAW,SAAUxC,GACpB,OAAO,WACDwC,IACJA,EAAW+jC,EAAgBP,EAAIW,OAC9BX,EAAIY,QAAUZ,EAAIa,QAAUb,EAAIc,UAC/Bd,EAAIe,mBAAqB,KAEb,UAAT/mC,EACJgmC,EAAIpC,QACgB,UAAT5jC,EAKgB,iBAAfgmC,EAAIrC,OACftK,EAAU,EAAG,SAEbA,EAGC2M,EAAIrC,OACJqC,EAAInC,YAINxK,EACC6M,GAAkBF,EAAIrC,SAAYqC,EAAIrC,OACtCqC,EAAInC,WAK+B,UAAjCmC,EAAIgB,cAAgB,SACM,iBAArBhB,EAAIiB,aACV,CAAEC,OAAQlB,EAAItB,UACd,CAAE9jC,KAAMolC,EAAIiB,cACbjB,EAAIzC,4BAQTyC,EAAIW,OAASnkC,IACb+jC,EAAgBP,EAAIY,QAAUZ,EAAIc,UAAYtkC,EAAU,cAKnC2B,IAAhB6hC,EAAIa,QACRb,EAAIa,QAAUN,EAEdP,EAAIe,mBAAqB,WAGA,IAAnBf,EAAIzmB,YAMRlhB,EAAO8f,WAAY,WACb3b,GACJ+jC,OAQL/jC,EAAWA,EAAU,SAErB,IAGCwjC,EAAI1B,KAAM7gC,EAAQwgC,YAAcxgC,EAAQqd,MAAQ,MAC/C,MAAQhW,GAGT,GAAKtI,EACJ,MAAMsI,IAKT84B,MAAO,WACDphC,GACJA,QAWLnB,EAAO+gC,cAAe,SAAUhD,GAC1BA,EAAE2E,cACN3E,EAAE/lB,SAAS3Y,QAAS,KAKtBW,EAAO6gC,UAAW,CACjBR,QAAS,CACRhhC,OAAQ,6FAGT2Y,SAAU,CACT3Y,OAAQ,2BAETmhC,WAAY,CACX2D,cAAe,SAAU5kC,GAExB,OADAS,EAAO0D,WAAYnE,GACZA,MAMVS,EAAO+gC,cAAe,SAAU,SAAUhD,QACxBj7B,IAAZi7B,EAAE7yB,QACN6yB,EAAE7yB,OAAQ,GAEN6yB,EAAE2E,cACN3E,EAAEp/B,KAAO,SAKXqB,EAAOghC,cAAe,SAAU,SAAUjD,GAIxC,IAAI1+B,EAAQ8B,EADb,GAAK48B,EAAE2E,aAAe3E,EAAE+H,YAEvB,MAAO,CACN7C,KAAM,SAAUhpB,EAAG+d,GAClB34B,EAASW,EAAQ,YACf+O,KAAMgvB,EAAE+H,aAAe,IACvBpmB,KAAM,CAAEqmB,QAAShI,EAAEiI,cAAepnC,IAAKm/B,EAAEgC,MACzCza,GAAI,aAAcnkB,EAAW,SAAU8kC,GACvC5mC,EAAOub,SACPzZ,EAAW,KACN8kC,GACJjO,EAAuB,UAAbiO,EAAItnC,KAAmB,IAAM,IAAKsnC,EAAItnC,QAKnD9B,EAAS6C,KAAKC,YAAaN,EAAQ,KAEpCkjC,MAAO,WACDphC,GACJA,QAUL,IAqGKshB,GArGDyjB,GAAe,GAClBC,GAAS,oBAGVnmC,EAAO6gC,UAAW,CACjBuF,MAAO,WACPC,cAAe,WACd,IAAIllC,EAAW+kC,GAAa5/B,OAAWtG,EAAO+C,QAAU,IAAQlE,GAAMuF,OAEtE,OADAnH,KAAMkE,IAAa,EACZA,KAKTnB,EAAO+gC,cAAe,aAAc,SAAUhD,EAAGuI,EAAkBnH,GAElE,IAAIoH,EAAcC,EAAaC,EAC9BC,GAAuB,IAAZ3I,EAAEqI,QAAqBD,GAAO17B,KAAMszB,EAAEgC,KAChD,MACkB,iBAAXhC,EAAEte,MAE6C,KADnDse,EAAEqC,aAAe,IACjBtiC,QAAS,sCACXqoC,GAAO17B,KAAMszB,EAAEte,OAAU,QAI5B,GAAKinB,GAAiC,UAArB3I,EAAEkB,UAAW,GA8D7B,OA3DAsH,EAAexI,EAAEsI,cAAgB/nC,EAAYy/B,EAAEsI,eAC9CtI,EAAEsI,gBACFtI,EAAEsI,cAGEK,EACJ3I,EAAG2I,GAAa3I,EAAG2I,GAAWxjC,QAASijC,GAAQ,KAAOI,IAC/B,IAAZxI,EAAEqI,QACbrI,EAAEgC,MAAS3C,GAAO3yB,KAAMszB,EAAEgC,KAAQ,IAAM,KAAQhC,EAAEqI,MAAQ,IAAMG,GAIjExI,EAAEyC,WAAY,eAAkB,WAI/B,OAHMiG,GACLzmC,EAAOoD,MAAOmjC,EAAe,mBAEvBE,EAAmB,IAI3B1I,EAAEkB,UAAW,GAAM,OAGnBuH,EAAcxpC,EAAQupC,GACtBvpC,EAAQupC,GAAiB,WACxBE,EAAoBnlC,WAIrB69B,EAAM/jB,OAAQ,gBAGQtY,IAAhB0jC,EACJxmC,EAAQhD,GAASq+B,WAAYkL,GAI7BvpC,EAAQupC,GAAiBC,EAIrBzI,EAAGwI,KAGPxI,EAAEsI,cAAgBC,EAAiBD,cAGnCH,GAAaroC,KAAM0oC,IAIfE,GAAqBnoC,EAAYkoC,IACrCA,EAAaC,EAAmB,IAGjCA,EAAoBD,OAAc1jC,IAI5B,WAYTzE,EAAQsoC,qBACHlkB,GAAO5lB,EAAS+pC,eAAeD,mBAAoB,IAAKlkB,MACvD5U,UAAY,6BACiB,IAA3B4U,GAAKjZ,WAAWlJ,QAQxBN,EAAO2X,UAAY,SAAU8H,EAAMvf,EAAS2mC,GAC3C,MAAqB,iBAATpnB,EACJ,IAEgB,kBAAZvf,IACX2mC,EAAc3mC,EACdA,GAAU,GAKLA,IAIA7B,EAAQsoC,qBAMZ9yB,GALA3T,EAAUrD,EAAS+pC,eAAeD,mBAAoB,KAKvCrnC,cAAe,SACzBkT,KAAO3V,EAASsV,SAASK,KAC9BtS,EAAQR,KAAKC,YAAakU,IAE1B3T,EAAUrD,GAKZwnB,GAAWwiB,GAAe,IAD1BC,EAASxvB,EAAWnN,KAAMsV,IAKlB,CAAEvf,EAAQZ,cAAewnC,EAAQ,MAGzCA,EAAS1iB,GAAe,CAAE3E,GAAQvf,EAASmkB,GAEtCA,GAAWA,EAAQ/jB,QACvBN,EAAQqkB,GAAUzJ,SAGZ5a,EAAOgB,MAAO,GAAI8lC,EAAOt9B,cAlChC,IAAIqK,EAAMizB,EAAQziB,GAyCnBrkB,EAAOG,GAAGwoB,KAAO,SAAUoX,EAAKgH,EAAQ5lC,GACvC,IAAIlB,EAAUtB,EAAM0kC,EACnB5rB,EAAOxa,KACP0oB,EAAMoa,EAAIjiC,QAAS,KAsDpB,OApDY,EAAP6nB,IACJ1lB,EAAWi7B,GAAkB6E,EAAIxiC,MAAOooB,IACxCoa,EAAMA,EAAIxiC,MAAO,EAAGooB,IAIhBrnB,EAAYyoC,IAGhB5lC,EAAW4lC,EACXA,OAASjkC,GAGEikC,GAA4B,iBAAXA,IAC5BpoC,EAAO,QAIW,EAAd8Y,EAAKnX,QACTN,EAAOihC,KAAM,CACZlB,IAAKA,EAKLphC,KAAMA,GAAQ,MACdqgC,SAAU,OACVvf,KAAMsnB,IACHlhC,KAAM,SAAU+/B,GAGnBvC,EAAW/hC,UAEXmW,EAAKgV,KAAMxsB,EAIVD,EAAQ,SAAUmtB,OAAQntB,EAAO2X,UAAWiuB,IAAiBp4B,KAAMvN,GAGnE2lC,KAKExqB,OAAQja,GAAY,SAAUg+B,EAAOmD,GACxC7qB,EAAKvW,KAAM,WACVC,EAASvD,MAAOX,KAAMomC,GAAY,CAAElE,EAAMyG,aAActD,EAAQnD,QAK5DliC,MAMR+C,EAAO6O,KAAKhI,QAAQmgC,SAAW,SAAU3lC,GACxC,OAAOrB,EAAO2B,KAAM3B,EAAOw5B,OAAQ,SAAUr5B,GAC5C,OAAOkB,IAASlB,EAAGkB,OAChBf,QAMLN,EAAOinC,OAAS,CACfC,UAAW,SAAU7lC,EAAMe,EAASjD,GACnC,IAAIgoC,EAAaC,EAASC,EAAWC,EAAQC,EAAWC,EACvD5X,EAAW5vB,EAAOyhB,IAAKpgB,EAAM,YAC7BomC,EAAUznC,EAAQqB,GAClB2nB,EAAQ,GAGS,WAAb4G,IACJvuB,EAAKkgB,MAAMqO,SAAW,YAGvB2X,EAAYE,EAAQR,SACpBI,EAAYrnC,EAAOyhB,IAAKpgB,EAAM,OAC9BmmC,EAAaxnC,EAAOyhB,IAAKpgB,EAAM,SACI,aAAbuuB,GAAwC,UAAbA,KACA,GAA9CyX,EAAYG,GAAa1pC,QAAS,SAMpCwpC,GADAH,EAAcM,EAAQ7X,YACD7iB,IACrBq6B,EAAUD,EAAYzS,OAGtB4S,EAASrX,WAAYoX,IAAe,EACpCD,EAAUnX,WAAYuX,IAAgB,GAGlClpC,EAAY8D,KAGhBA,EAAUA,EAAQ1E,KAAM2D,EAAMlC,EAAGa,EAAOmC,OAAQ,GAAIolC,KAGjC,MAAfnlC,EAAQ2K,MACZic,EAAMjc,IAAQ3K,EAAQ2K,IAAMw6B,EAAUx6B,IAAQu6B,GAE1B,MAAhBllC,EAAQsyB,OACZ1L,EAAM0L,KAAStyB,EAAQsyB,KAAO6S,EAAU7S,KAAS0S,GAG7C,UAAWhlC,EACfA,EAAQslC,MAAMhqC,KAAM2D,EAAM2nB,IAGA,iBAAdA,EAAMjc,MACjBic,EAAMjc,KAAO,MAEa,iBAAfic,EAAM0L,OACjB1L,EAAM0L,MAAQ,MAEf+S,EAAQhmB,IAAKuH,MAKhBhpB,EAAOG,GAAGgC,OAAQ,CAGjB8kC,OAAQ,SAAU7kC,GAGjB,GAAKd,UAAUhB,OACd,YAAmBwC,IAAZV,EACNnF,KACAA,KAAKiE,KAAM,SAAU/B,GACpBa,EAAOinC,OAAOC,UAAWjqC,KAAMmF,EAASjD,KAI3C,IAAIwoC,EAAMC,EACTvmC,EAAOpE,KAAM,GAEd,OAAMoE,EAQAA,EAAKwxB,iBAAiBvyB,QAK5BqnC,EAAOtmC,EAAKmzB,wBACZoT,EAAMvmC,EAAK6I,cAAc4C,YAClB,CACNC,IAAK46B,EAAK56B,IAAM66B,EAAIC,YACpBnT,KAAMiT,EAAKjT,KAAOkT,EAAIE,cARf,CAAE/6B,IAAK,EAAG2nB,KAAM,QATxB,GAuBD9E,SAAU,WACT,GAAM3yB,KAAM,GAAZ,CAIA,IAAI8qC,EAAcd,EAAQ/nC,EACzBmC,EAAOpE,KAAM,GACb+qC,EAAe,CAAEj7B,IAAK,EAAG2nB,KAAM,GAGhC,GAAwC,UAAnC10B,EAAOyhB,IAAKpgB,EAAM,YAGtB4lC,EAAS5lC,EAAKmzB,4BAER,CACNyS,EAAShqC,KAAKgqC,SAId/nC,EAAMmC,EAAK6I,cACX69B,EAAe1mC,EAAK0mC,cAAgB7oC,EAAIyN,gBACxC,MAAQo7B,IACLA,IAAiB7oC,EAAIujB,MAAQslB,IAAiB7oC,EAAIyN,kBACT,WAA3C3M,EAAOyhB,IAAKsmB,EAAc,YAE1BA,EAAeA,EAAanoC,WAExBmoC,GAAgBA,IAAiB1mC,GAAkC,IAA1B0mC,EAAavpC,YAG1DwpC,EAAehoC,EAAQ+nC,GAAed,UACzBl6B,KAAO/M,EAAOyhB,IAAKsmB,EAAc,kBAAkB,GAChEC,EAAatT,MAAQ10B,EAAOyhB,IAAKsmB,EAAc,mBAAmB,IAKpE,MAAO,CACNh7B,IAAKk6B,EAAOl6B,IAAMi7B,EAAaj7B,IAAM/M,EAAOyhB,IAAKpgB,EAAM,aAAa,GACpEqzB,KAAMuS,EAAOvS,KAAOsT,EAAatT,KAAO10B,EAAOyhB,IAAKpgB,EAAM,cAAc,MAc1E0mC,aAAc,WACb,OAAO9qC,KAAKmE,IAAK,WAChB,IAAI2mC,EAAe9qC,KAAK8qC,aAExB,MAAQA,GAA2D,WAA3C/nC,EAAOyhB,IAAKsmB,EAAc,YACjDA,EAAeA,EAAaA,aAG7B,OAAOA,GAAgBp7B,QAM1B3M,EAAOkB,KAAM,CAAE00B,WAAY,cAAeD,UAAW,eAAiB,SAAUhc,EAAQ+F,GACvF,IAAI3S,EAAM,gBAAkB2S,EAE5B1f,EAAOG,GAAIwZ,GAAW,SAAUva,GAC/B,OAAOgf,EAAQnhB,KAAM,SAAUoE,EAAMsY,EAAQva,GAG5C,IAAIwoC,EAOJ,GANKnpC,EAAU4C,GACdumC,EAAMvmC,EACuB,IAAlBA,EAAK7C,WAChBopC,EAAMvmC,EAAKyL,kBAGChK,IAAR1D,EACJ,OAAOwoC,EAAMA,EAAKloB,GAASre,EAAMsY,GAG7BiuB,EACJA,EAAIK,SACFl7B,EAAY66B,EAAIE,YAAV1oC,EACP2N,EAAM3N,EAAMwoC,EAAIC,aAIjBxmC,EAAMsY,GAAWva,GAEhBua,EAAQva,EAAKkC,UAAUhB,WAU5BN,EAAOkB,KAAM,CAAE,MAAO,QAAU,SAAUsD,EAAIkb,GAC7C1f,EAAOgzB,SAAUtT,GAASoP,GAAczwB,EAAQiyB,cAC/C,SAAUjvB,EAAMmtB,GACf,GAAKA,EAIJ,OAHAA,EAAWD,GAAQltB,EAAMqe,GAGlBsO,GAAUvjB,KAAM+jB,GACtBxuB,EAAQqB,GAAOuuB,WAAYlQ,GAAS,KACpC8O,MAQLxuB,EAAOkB,KAAM,CAAEgnC,OAAQ,SAAUC,MAAO,SAAW,SAAU9lC,EAAM1D,GAClEqB,EAAOkB,KAAM,CAAE0zB,QAAS,QAAUvyB,EAAM2W,QAASra,EAAMypC,GAAI,QAAU/lC,GACpE,SAAUgmC,EAAcC,GAGxBtoC,EAAOG,GAAImoC,GAAa,SAAU3T,EAAQxwB,GACzC,IAAIka,EAAY/c,UAAUhB,SAAY+nC,GAAkC,kBAAX1T,GAC5DpC,EAAQ8V,KAA6B,IAAX1T,IAA6B,IAAVxwB,EAAiB,SAAW,UAE1E,OAAOia,EAAQnhB,KAAM,SAAUoE,EAAM1C,EAAMwF,GAC1C,IAAIjF,EAEJ,OAAKT,EAAU4C,GAGyB,IAAhCinC,EAASxqC,QAAS,SACxBuD,EAAM,QAAUgB,GAChBhB,EAAKxE,SAAS8P,gBAAiB,SAAWtK,GAIrB,IAAlBhB,EAAK7C,UACTU,EAAMmC,EAAKsL,gBAIJ3J,KAAKgvB,IACX3wB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9ChB,EAAKohB,KAAM,SAAWpgB,GAAQnD,EAAK,SAAWmD,GAC9CnD,EAAK,SAAWmD,UAIDS,IAAVqB,EAGNnE,EAAOyhB,IAAKpgB,EAAM1C,EAAM4zB,GAGxBvyB,EAAOuhB,MAAOlgB,EAAM1C,EAAMwF,EAAOouB,IAChC5zB,EAAM0f,EAAYsW,OAAS7xB,EAAWub,QAM5Cre,EAAOkB,KAAM,CACZ,YACA,WACA,eACA,YACA,cACA,YACE,SAAUsD,EAAI7F,GAChBqB,EAAOG,GAAIxB,GAAS,SAAUwB,GAC7B,OAAOlD,KAAKqoB,GAAI3mB,EAAMwB,MAOxBH,EAAOG,GAAGgC,OAAQ,CAEjB41B,KAAM,SAAUxS,EAAO9F,EAAMtf,GAC5B,OAAOlD,KAAKqoB,GAAIC,EAAO,KAAM9F,EAAMtf,IAEpCooC,OAAQ,SAAUhjB,EAAOplB,GACxB,OAAOlD,KAAK0oB,IAAKJ,EAAO,KAAMplB,IAG/BqoC,SAAU,SAAUvoC,EAAUslB,EAAO9F,EAAMtf,GAC1C,OAAOlD,KAAKqoB,GAAIC,EAAOtlB,EAAUwf,EAAMtf,IAExCsoC,WAAY,SAAUxoC,EAAUslB,EAAOplB,GAGtC,OAA4B,IAArBmB,UAAUhB,OAChBrD,KAAK0oB,IAAK1lB,EAAU,MACpBhD,KAAK0oB,IAAKJ,EAAOtlB,GAAY,KAAME,IAGrCuoC,MAAO,SAAUC,EAAQC,GACxB,OAAO3rC,KAAKmuB,WAAYud,GAAStd,WAAYud,GAASD,MAIxD3oC,EAAOkB,KAAM,wLAEgDqD,MAAO,KACnE,SAAUC,EAAInC,GAGbrC,EAAOG,GAAIkC,GAAS,SAAUod,EAAMtf,GACnC,OAA0B,EAAnBmB,UAAUhB,OAChBrD,KAAKqoB,GAAIjjB,EAAM,KAAMod,EAAMtf,GAC3BlD,KAAKmpB,QAAS/jB,MASlB,IAAI2E,GAAQ,qCAMZhH,EAAO6oC,MAAQ,SAAU1oC,EAAID,GAC5B,IAAIyN,EAAK6D,EAAMq3B,EAUf,GARwB,iBAAZ3oC,IACXyN,EAAMxN,EAAID,GACVA,EAAUC,EACVA,EAAKwN,GAKArP,EAAY6B,GAalB,OARAqR,EAAOjU,EAAMG,KAAM4D,UAAW,IAC9BunC,EAAQ,WACP,OAAO1oC,EAAGvC,MAAOsC,GAAWjD,KAAMuU,EAAK7T,OAAQJ,EAAMG,KAAM4D,eAItD8C,KAAOjE,EAAGiE,KAAOjE,EAAGiE,MAAQpE,EAAOoE,OAElCykC,GAGR7oC,EAAO8oC,UAAY,SAAUC,GACvBA,EACJ/oC,EAAOge,YAEPhe,EAAO4X,OAAO,IAGhB5X,EAAO6C,QAAUD,MAAMC,QACvB7C,EAAOgpC,UAAY/oB,KAAKC,MACxBlgB,EAAOqJ,SAAWA,EAClBrJ,EAAO1B,WAAaA,EACpB0B,EAAOvB,SAAWA,EAClBuB,EAAOgf,UAAYA,EACnBhf,EAAOrB,KAAOmB,EAEdE,EAAOqpB,IAAM3jB,KAAK2jB,IAElBrpB,EAAOipC,UAAY,SAAU1qC,GAK5B,IAAII,EAAOqB,EAAOrB,KAAMJ,GACxB,OAAkB,WAATI,GAA8B,WAATA,KAK5BuqC,MAAO3qC,EAAM0xB,WAAY1xB,KAG5ByB,EAAOmpC,KAAO,SAAU5pC,GACvB,OAAe,MAARA,EACN,IACEA,EAAO,IAAK2D,QAAS8D,GAAO,KAkBT,mBAAXoiC,QAAyBA,OAAOC,KAC3CD,OAAQ,SAAU,GAAI,WACrB,OAAOppC,IAOT,IAGCspC,GAAUtsC,EAAOgD,OAGjBupC,GAAKvsC,EAAOwsC,EAwBb,OAtBAxpC,EAAOypC,WAAa,SAAU/mC,GAS7B,OARK1F,EAAOwsC,IAAMxpC,IACjBhD,EAAOwsC,EAAID,IAGP7mC,GAAQ1F,EAAOgD,SAAWA,IAC9BhD,EAAOgD,OAASspC,IAGVtpC,GAMiB,oBAAb9C,IACXF,EAAOgD,OAAShD,EAAOwsC,EAAIxpC,GAMrBA","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml b/src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml
index bf2813831b..656c72c484 100644
--- a/src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml
+++ b/src/Security/samples/StaticFilesAuth/Views/Shared/_Layout.cshtml
@@ -51,11 +51,11 @@
<script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment exclude="Development">
- <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.6.0.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery"
crossorigin="anonymous"
- integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=">
+ integrity="sha384-vtXRMe3mGCbOeY7l30aIg8H9p3GdeSe4IFlP6G8JMa7o7lXvnz3GFKzPxzJdPfGK">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"
asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
diff --git a/src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml b/src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml
index a2b13b317f..a95baa7d6e 100644
--- a/src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml
+++ b/src/Security/samples/StaticFilesAuth/Views/Shared/_ValidationScriptsPartial.cshtml
@@ -9,10 +9,10 @@
crossorigin="anonymous"
integrity="sha384-Fnqn3nxp3506LP/7Y3j/25BlWeA3PXTyT1l78LjECcPaKCV12TsZP7yyMxOe/G/k">
</script>
- <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/3.2.6/jquery.validate.unobtrusive.min.js"
+ <script src="https://ajax.aspnetcdn.com/ajax/jquery.validation.unobtrusive/4.0.0/jquery.validate.unobtrusive.min.js"
asp-fallback-src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"
asp-fallback-test="window.jQuery && window.jQuery.validator && window.jQuery.validator.unobtrusive"
crossorigin="anonymous"
- integrity="sha384-JrXK+k53HACyavUKOsL+NkmSesD2P+73eDMrbTtTk0h4RmOF8hF8apPlkp26JlyH">
+ integrity="sha384-sV5X0dDETui+OkDHNCRUdFU7p2OhiVPVXAHyp69bAh4BQFoY/e44iQ169W/XkX5Z">
</script>
</environment>
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
index ccf48121dc..343e1b970a 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/.bower.json
@@ -1,6 +1,6 @@
{
"name": "jquery-validation-unobtrusive",
- "version": "3.2.6",
+ "version": "4.0.0",
"homepage": "https://github.com/aspnet/jquery-validation-unobtrusive",
"description": "Add-on to jQuery Validation to enable unobtrusive validation options in data-* attributes.",
"main": [
@@ -23,7 +23,7 @@
"authors": [
"Microsoft"
],
- "license": "http://www.microsoft.com/web/webpi/eula/net_library_eula_enu.htm",
+ "license": "MIT",
"repository": {
"type": "git",
"url": "git://github.com/aspnet/jquery-validation-unobtrusive.git"
@@ -32,13 +32,13 @@
"jquery-validation": ">=1.8",
"jquery": ">=1.8"
},
- "_release": "3.2.6",
+ "_release": "4.0.0",
"_resolution": {
"type": "version",
- "tag": "v3.2.6",
- "commit": "13386cd1b5947d8a5d23a12b531ce3960be1eba7"
+ "tag": "v4.0.0",
+ "commit": "a5b50566f8b839177bc7733d67be3a37bca400ff"
},
"_source": "git://github.com/aspnet/jquery-validation-unobtrusive.git",
- "_target": "3.2.6",
+ "_target": "4.0.0",
"_originalSource": "jquery-validation-unobtrusive"
} \ No newline at end of file
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
index 1b0de12496..009306070a 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js
@@ -1,12 +1,26 @@
-/*!
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
-(function ($) {
+(function (factory) {
+ if (typeof define === 'function' && define.amd) {
+ // AMD. Register as an anonymous module.
+ define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
+ } else if (typeof module === 'object' && module.exports) {
+ // CommonJS-like environments that support module.exports
+ module.exports = factory(require('jquery-validation'));
+ } else {
+ // Browser global
+ jQuery.validator.unobtrusive = factory(jQuery);
+ }
+}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
@@ -107,7 +121,7 @@
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
- .removeData("unobtrusiveContainer");
+ .removeData("unobtrusiveContainer");
}
function validationInfo(form) {
@@ -118,7 +132,7 @@
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
- }
+ };
if (!result) {
result = {
@@ -223,10 +237,10 @@
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
- .addBack()
- .filter("form")
- .add($selector.find("form"))
- .has("[data-val=true]");
+ .addBack()
+ .filter("form")
+ .add($selector.find("form"))
+ .has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
@@ -409,8 +423,13 @@
setValidationValues(options, "regex", options.params.regex);
}
});
+ adapters.add("fileextensions", ["extensions"], function (options) {
+ setValidationValues(options, "extension", options.params.extensions);
+ });
$(function () {
$jQval.unobtrusive.parse(document);
});
-}(jQuery)); \ No newline at end of file
+
+ return $jQval.unobtrusive;
+}));
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
index be9a38a4cf..d8d803c65e 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js
@@ -1,5 +1,8 @@
-/*
-** Unobtrusive validation support library for jQuery and jQuery Validate
-** Copyright (C) Microsoft Corporation. All rights reserved.
-*/
-!function(a){function e(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function n(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function t(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function r(a){return a.substr(0,a.lastIndexOf(".")+1)}function i(a,e){return 0===a.indexOf("*.")&&(a=a.replace("*.",e)),a}function o(e,n){var r=a(this).find("[data-valmsg-for='"+t(n[0].name)+"']"),i=r.attr("data-valmsg-replace"),o=i?a.parseJSON(i)!==!1:null;r.removeClass("field-validation-valid").addClass("field-validation-error"),e.data("unobtrusiveContainer",r),o?(r.empty(),e.removeClass("input-validation-error").appendTo(r)):e.hide()}function d(e,n){var t=a(this).find("[data-valmsg-summary=true]"),r=t.find("ul");r&&r.length&&n.errorList.length&&(r.empty(),t.addClass("validation-summary-errors").removeClass("validation-summary-valid"),a.each(n.errorList,function(){a("<li />").html(this.message).appendTo(r)}))}function s(e){var n=e.data("unobtrusiveContainer");if(n){var t=n.attr("data-valmsg-replace"),r=t?a.parseJSON(t):null;n.addClass("field-validation-valid").removeClass("field-validation-error"),e.removeData("unobtrusiveContainer"),r&&n.empty()}}function l(e){var n=a(this),t="__jquery_unobtrusive_validation_form_reset";if(!n.data(t)){n.data(t,!0);try{n.data("validator").resetForm()}finally{n.removeData(t)}n.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),n.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function m(e){var n=a(e),t=n.data(v),r=a.proxy(l,e),i=p.unobtrusive.options||{},m=function(n,t){var r=i[n];r&&a.isFunction(r)&&r.apply(e,t)};return t||(t={options:{errorClass:i.errorClass||"input-validation-error",errorElement:i.errorElement||"span",errorPlacement:function(){o.apply(e,arguments),m("errorPlacement",arguments)},invalidHandler:function(){d.apply(e,arguments),m("invalidHandler",arguments)},messages:{},rules:{},success:function(){s.apply(e,arguments),m("success",arguments)}},attachValidation:function(){n.off("reset."+v,r).on("reset."+v,r).validate(this.options)},validate:function(){return n.validate(),n.valid()}},n.data(v,t)),t}var u,p=a.validator,v="unobtrusiveValidation";p.unobtrusive={adapters:[],parseElement:function(e,n){var t,r,i,o=a(e),d=o.parents("form")[0];d&&(t=m(d),t.options.rules[e.name]=r={},t.options.messages[e.name]=i={},a.each(this.adapters,function(){var n="data-val-"+this.name,t=o.attr(n),s={};void 0!==t&&(n+="-",a.each(this.params,function(){s[this]=o.attr(n+this)}),this.adapt({element:e,form:d,message:t,params:s,rules:r,messages:i}))}),a.extend(r,{__dummy__:!0}),n||t.attachValidation())},parse:function(e){var n=a(e),t=n.parents().addBack().filter("form").add(n.find("form")).has("[data-val=true]");n.find("[data-val=true]").each(function(){p.unobtrusive.parseElement(this,!0)}),t.each(function(){var a=m(this);a&&a.attachValidation()})}},u=p.unobtrusive.adapters,u.add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},u.addBool=function(a,n){return this.add(a,function(t){e(t,n||a,!0)})},u.addMinMax=function(a,n,t,r,i,o){return this.add(a,[i||"min",o||"max"],function(a){var i=a.params.min,o=a.params.max;i&&o?e(a,r,[i,o]):i?e(a,n,i):o&&e(a,t,o)})},u.addSingleVal=function(a,n,t){return this.add(a,[n||"val"],function(r){e(r,t||a,r.params[n])})},p.addMethod("__dummy__",function(a,e,n){return!0}),p.addMethod("regex",function(a,e,n){var t;return this.optional(e)?!0:(t=new RegExp(n).exec(a),t&&0===t.index&&t[0].length===a.length)}),p.addMethod("nonalphamin",function(a,e,n){var t;return n&&(t=a.match(/\W/g),t=t&&t.length>=n),t}),p.methods.extension?(u.addSingleVal("accept","mimtype"),u.addSingleVal("extension","extension")):u.addSingleVal("extension","extension","accept"),u.addSingleVal("regex","pattern"),u.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),u.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),u.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),u.add("equalto",["other"],function(n){var o=r(n.element.name),d=n.params.other,s=i(d,o),l=a(n.form).find(":input").filter("[name='"+t(s)+"']")[0];e(n,"equalTo",l)}),u.add("required",function(a){("INPUT"!==a.element.tagName.toUpperCase()||"CHECKBOX"!==a.element.type.toUpperCase())&&e(a,"required",!0)}),u.add("remote",["url","type","additionalfields"],function(o){var d={url:o.params.url,type:o.params.type||"GET",data:{}},s=r(o.element.name);a.each(n(o.params.additionalfields||o.element.name),function(e,n){var r=i(n,s);d.data[r]=function(){var e=a(o.form).find(":input").filter("[name='"+t(r)+"']");return e.is(":checkbox")?e.filter(":checked").val()||e.filter(":hidden").val()||"":e.is(":radio")?e.filter(":checked").val()||"":e.val()}}),e(o,"remote",d)}),u.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&e(a,"minlength",a.params.min),a.params.nonalphamin&&e(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&e(a,"regex",a.params.regex)}),a(function(){p.unobtrusive.parse(document)})}(jQuery); \ No newline at end of file
+/**
+ * @license
+ * Unobtrusive validation support library for jQuery and jQuery Validate
+ * Copyright (c) .NET Foundation. All rights reserved.
+ * Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+ * @version v4.0.0
+ */
+!function(a){"function"==typeof define&&define.amd?define("jquery.validate.unobtrusive",["jquery-validation"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery-validation")):jQuery.validator.unobtrusive=a(jQuery)}(function(s){var a,o=s.validator,d="unobtrusiveValidation";function l(a,e,n){a.rules[e]=n,a.message&&(a.messages[e]=a.message)}function u(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function n(a){return a.substr(0,a.lastIndexOf(".")+1)}function m(a,e){return a=0===a.indexOf("*.")?a.replace("*.",e):a}function f(a){var e=s(this),n="__jquery_unobtrusive_validation_form_reset";if(!e.data(n)){e.data(n,!0);try{e.data("validator").resetForm()}finally{e.removeData(n)}e.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors"),e.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}}function p(n){function a(a,e){(a=r[a])&&s.isFunction(a)&&a.apply(n,e)}var e=s(n),t=e.data(d),i=s.proxy(f,n),r=o.unobtrusive.options||{};return t||(t={options:{errorClass:r.errorClass||"input-validation-error",errorElement:r.errorElement||"span",errorPlacement:function(){!function(a,e){var e=s(this).find("[data-valmsg-for='"+u(e[0].name)+"']"),n=(n=e.attr("data-valmsg-replace"))?!1!==s.parseJSON(n):null;e.removeClass("field-validation-valid").addClass("field-validation-error"),a.data("unobtrusiveContainer",e),n?(e.empty(),a.removeClass("input-validation-error").appendTo(e)):a.hide()}.apply(n,arguments),a("errorPlacement",arguments)},invalidHandler:function(){!function(a,e){var n=s(this).find("[data-valmsg-summary=true]"),t=n.find("ul");t&&t.length&&e.errorList.length&&(t.empty(),n.addClass("validation-summary-errors").removeClass("validation-summary-valid"),s.each(e.errorList,function(){s("<li />").html(this.message).appendTo(t)}))}.apply(n,arguments),a("invalidHandler",arguments)},messages:{},rules:{},success:function(){!function(a){var e,n=a.data("unobtrusiveContainer");n&&(e=(e=n.attr("data-valmsg-replace"))?s.parseJSON(e):null,n.addClass("field-validation-valid").removeClass("field-validation-error"),a.removeData("unobtrusiveContainer"),e&&n.empty())}.apply(n,arguments),a("success",arguments)}},attachValidation:function(){e.off("reset."+d,i).on("reset."+d,i).validate(this.options)},validate:function(){return e.validate(),e.valid()}},e.data(d,t)),t}return o.unobtrusive={adapters:[],parseElement:function(t,a){var e,i,r,o=s(t),d=o.parents("form")[0];d&&((e=p(d)).options.rules[t.name]=i={},e.options.messages[t.name]=r={},s.each(this.adapters,function(){var a="data-val-"+this.name,e=o.attr(a),n={};void 0!==e&&(a+="-",s.each(this.params,function(){n[this]=o.attr(a+this)}),this.adapt({element:t,form:d,message:e,params:n,rules:i,messages:r}))}),s.extend(i,{__dummy__:!0}),a||e.attachValidation())},parse:function(a){var a=s(a),e=a.parents().addBack().filter("form").add(a.find("form")).has("[data-val=true]");a.find("[data-val=true]").each(function(){o.unobtrusive.parseElement(this,!0)}),e.each(function(){var a=p(this);a&&a.attachValidation()})}},(a=o.unobtrusive.adapters).add=function(a,e,n){return n||(n=e,e=[]),this.push({name:a,params:e,adapt:n}),this},a.addBool=function(e,n){return this.add(e,function(a){l(a,n||e,!0)})},a.addMinMax=function(a,t,i,r,e,n){return this.add(a,[e||"min",n||"max"],function(a){var e=a.params.min,n=a.params.max;e&&n?l(a,r,[e,n]):e?l(a,t,e):n&&l(a,i,n)})},a.addSingleVal=function(e,n,t){return this.add(e,[n||"val"],function(a){l(a,t||e,a.params[n])})},o.addMethod("__dummy__",function(a,e,n){return!0}),o.addMethod("regex",function(a,e,n){return!!this.optional(e)||(e=new RegExp(n).exec(a))&&0===e.index&&e[0].length===a.length}),o.addMethod("nonalphamin",function(a,e,n){var t;return t=n?(t=a.match(/\W/g))&&t.length>=n:t}),o.methods.extension?(a.addSingleVal("accept","mimtype"),a.addSingleVal("extension","extension")):a.addSingleVal("extension","extension","accept"),a.addSingleVal("regex","pattern"),a.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url"),a.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range"),a.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength"),a.add("equalto",["other"],function(a){var e=n(a.element.name),e=m(a.params.other,e);l(a,"equalTo",s(a.form).find(":input").filter("[name='"+u(e)+"']")[0])}),a.add("required",function(a){"INPUT"===a.element.tagName.toUpperCase()&&"CHECKBOX"===a.element.type.toUpperCase()||l(a,"required",!0)}),a.add("remote",["url","type","additionalfields"],function(t){var i={url:t.params.url,type:t.params.type||"GET",data:{}},r=n(t.element.name);s.each((t.params.additionalfields||t.element.name).replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g),function(a,e){var n=m(e,r);i.data[n]=function(){var a=s(t.form).find(":input").filter("[name='"+u(n)+"']");return a.is(":checkbox")?a.filter(":checked").val()||a.filter(":hidden").val()||"":a.is(":radio")?a.filter(":checked").val()||"":a.val()}}),l(t,"remote",i)}),a.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&l(a,"minlength",a.params.min),a.params.nonalphamin&&l(a,"nonalphamin",a.params.nonalphamin),a.params.regex&&l(a,"regex",a.params.regex)}),a.add("fileextensions",["extensions"],function(a){l(a,"extension",a.params.extensions)}),s(function(){o.unobtrusive.parse(document)}),o.unobtrusive}); \ No newline at end of file
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json
index e3218a820e..cc09fc942f 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/.bower.json
@@ -12,14 +12,15 @@
"library"
],
"homepage": "https://github.com/jquery/jquery-dist",
- "version": "3.5.1",
- "_release": "3.5.1",
+ "version": "3.6.0",
+ "_release": "3.6.0",
"_resolution": {
"type": "version",
- "tag": "3.5.1",
- "commit": "4c0e4becb8263bb5b3e6dadc448d8e7305ef8215"
+ "tag": "3.6.0",
+ "commit": "e786e3d9707ffd9b0dd330ca135b66344dcef85a"
},
- "_source": "git://github.com/jquery/jquery-dist.git",
- "_target": "3.5.1",
- "_originalSource": "jquery"
+ "_source": "https://github.com/jquery/jquery-dist.git",
+ "_target": "^3.6.0",
+ "_originalSource": "jquery",
+ "_direct": true
} \ No newline at end of file
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt
index 5312a4c864..599bdf2c72 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/LICENSE.txt
@@ -1,13 +1,5 @@
-Copyright jQuery Foundation and other contributors, https://jquery.org/
-This software consists of voluntary contributions made by many
-individuals. For exact contribution history, see the revision history
-available at https://github.com/jquery/jquery
-
-The following license applies to all parts of this software except as
-documented below:
-
-====
+Copyright OpenJS Foundation and other contributors, https://openjsf.org/
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
@@ -26,11 +18,4 @@ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-====
-
-All files located in the node_modules and external directories are
-externally maintained libraries used by this software which have their
-own licenses; we recommend you read them, as their terms may differ from
-the terms above.
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js
index 50937333b9..fc6c299b73 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.js
@@ -1,15 +1,15 @@
/*!
- * jQuery JavaScript Library v3.5.1
+ * jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
- * Copyright JS Foundation and other contributors
+ * Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
- * Date: 2020-05-04T22:49Z
+ * Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@@ -76,12 +76,16 @@ var support = {};
var isFunction = function isFunction( obj ) {
- // Support: Chrome <=57, Firefox <=52
- // In some browsers, typeof returns "function" for HTML <object> elements
- // (i.e., `typeof document.createElement( "object" ) === "function"`).
- // We don't want to classify *any* DOM node as a function.
- return typeof obj === "function" && typeof obj.nodeType !== "number";
- };
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
+ // Plus for old WebKit, typeof returns "function" for HTML collections
+ // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
+ return typeof obj === "function" && typeof obj.nodeType !== "number" &&
+ typeof obj.item !== "function";
+ };
var isWindow = function isWindow( obj ) {
@@ -147,7 +151,7 @@ function toType( obj ) {
var
- version = "3.5.1",
+ version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@@ -401,7 +405,7 @@ jQuery.extend( {
if ( isArrayLike( Object( arr ) ) ) {
jQuery.merge( ret,
typeof arr === "string" ?
- [ arr ] : arr
+ [ arr ] : arr
);
} else {
push.call( ret, arr );
@@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
-function( _i, name ) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-} );
+ function( _i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+ } );
function isArrayLike( obj ) {
@@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
- * Sizzle CSS Selector Engine v2.3.5
+ * Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
- * Date: 2020-03-14
+ * Date: 2021-02-16
*/
( function( window ) {
var i,
@@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
- var namespace = elem.namespaceURI,
- docElem = ( elem.ownerDocument || elem ).documentElement;
+ var namespace = elem && elem.namespaceURI,
+ docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
function nodeName( elem, name ) {
- return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
-};
+}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
- // the master Deferred
- master = jQuery.Deferred(),
+ // the primary Deferred
+ primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
- master.resolveWith( resolveContexts, resolveValues );
+ primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
- adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
- if ( master.state() === "pending" ||
+ if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
- return master.then();
+ return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
- adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
- return master.promise();
+ return primary.promise();
}
} );
@@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
for ( ; i < len; i++ ) {
fn(
elems[ i ], key, raw ?
- value :
- value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
);
}
}
@@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
-var
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
- rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@@ -5387,8 +5388,8 @@ jQuery.event = {
event = jQuery.event.fix( nativeEvent ),
handlers = (
- dataPriv.get( this, "events" ) || Object.create( null )
- )[ event.type ] || [],
+ dataPriv.get( this, "events" ) || Object.create( null )
+ )[ event.type ] || [],
special = jQuery.event.special[ event.type ] || {};
// Use the fix-ed jQuery.Event rather than the (read-only) native event
@@ -5512,12 +5513,12 @@ jQuery.event = {
get: isFunction( hook ) ?
function() {
if ( this.originalEvent ) {
- return hook( this.originalEvent );
+ return hook( this.originalEvent );
}
} :
function() {
if ( this.originalEvent ) {
- return this.originalEvent[ name ];
+ return this.originalEvent[ name ];
}
},
@@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
- return result.value;
+
+ // Support: Chrome 86+
+ // In Chrome, if an element having a focusout handler is blurred by
+ // clicking outside of it, it invokes the handler synchronously. If
+ // that handler calls `.remove()` on the element, the data is cleared,
+ // leaving `result` undefined. We need to guard against this.
+ return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
-
- which: function( event ) {
- var button = event.button;
-
- // Add which for key events
- if ( event.which == null && rkeyEvent.test( event.type ) ) {
- return event.charCode != null ? event.charCode : event.keyCode;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
- if ( button & 1 ) {
- return 1;
- }
-
- if ( button & 2 ) {
- return 3;
- }
-
- if ( button & 4 ) {
- return 2;
- }
-
- return 0;
- }
-
- return event.which;
- }
+ which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
+ // Suppress native focus or blur as it's already being fired
+ // in leverageNative.
+ _default: function() {
+ return true;
+ },
+
delegateType: delegateType
};
} );
@@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
+ //
+ // Support: Firefox 70+
+ // Only Firefox includes border widths
+ // in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
- table.style.cssText = "position:absolute;left:-11111px";
+ table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
+ tr.style.cssText = "border:1px solid";
+
+ // Support: Chrome 86+
+ // Height set through cssText does not get applied.
+ // Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
+ // Support: Android 8 Chrome 86+
+ // In our bodyBackground.html iframe,
+ // display for all div elements is set to "inline",
+ // which causes a problem only in Android 8 Chrome 86.
+ // Ensuring the div is display: block
+ // gets around this issue.
+ trChild.style.display = "block";
+
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
- reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
+ reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
+ parseInt( trStyle.borderTopWidth, 10 ) +
+ parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
// Running getBoundingClientRect on a disconnected node
// in IE throws an error.
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
- swap( elem, cssShow, function() {
- return getWidthOrHeight( elem, dimension, extra );
- } ) :
- getWidthOrHeight( elem, dimension, extra );
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
}
},
@@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
swap( elem, { marginLeft: 0 }, function() {
return elem.getBoundingClientRect().left;
} )
- ) + "px";
+ ) + "px";
}
}
);
@@ -7223,7 +7228,7 @@ Tween.propHooks = {
if ( jQuery.fx.step[ tween.prop ] ) {
jQuery.fx.step[ tween.prop ]( tween );
} else if ( tween.elem.nodeType === 1 && (
- jQuery.cssHooks[ tween.prop ] ||
+ jQuery.cssHooks[ tween.prop ] ||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
} else {
@@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
anim.done( function() {
- /* eslint-enable no-loop-func */
+ /* eslint-enable no-loop-func */
// The final step of a "hide" animation is actually hiding the element
if ( !hidden ) {
@@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
tweens: [],
createTween: function( prop, end ) {
var tween = jQuery.Tween( elem, animation.opts, prop, end,
- animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
animation.tweens.push( tween );
return tween;
},
@@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
- doAnimation.finish = doAnimation;
+
+ doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
this.each( doAnimation ) :
@@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
if ( this.setAttribute ) {
this.setAttribute( "class",
className || value === false ?
- "" :
- dataPriv.get( this, "__className__" ) || ""
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
);
}
}
@@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
while ( ( elem = this[ i++ ] ) ) {
if ( elem.nodeType === 1 &&
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
- return true;
+ return true;
}
}
@@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
- handle = (
- dataPriv.get( cur, "events" ) || Object.create( null )
- )[ event.type ] &&
+ handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
- var xml;
+ var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
- } catch ( e ) {
- xml = undefined;
- }
+ } catch ( e ) {}
- if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
+ parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
+ if ( !xml || parserErrorElem ) {
+ jQuery.error( "Invalid XML: " + (
+ parserErrorElem ?
+ jQuery.map( parserErrorElem.childNodes, function( el ) {
+ return el.textContent;
+ } ).join( "\n" ) :
+ data
+ ) );
}
return xml;
};
@@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
- } )
- .filter( function() {
+ } ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
- } )
- .map( function( _i, elem ) {
+ } ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@@ -9033,7 +9040,8 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
- originAnchor.href = location.href;
+
+originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -9414,8 +9422,8 @@ jQuery.extend( {
// Context for global events is callbackContext if it is a DOM node or jQuery collection
globalEventContext = s.context &&
( callbackContext.nodeType || callbackContext.jquery ) ?
- jQuery( callbackContext ) :
- jQuery.event,
+ jQuery( callbackContext ) :
+ jQuery.event,
// Deferreds
deferred = jQuery.Deferred(),
@@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
- // Use a noop converter for missing script
- if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
+ // Use a noop converter for missing script but not if jsonp
+ if ( !isSuccess &&
+ jQuery.inArray( "script", s.dataTypes ) > -1 &&
+ jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
- if ( typeof props.top === "number" ) {
- props.top += "px";
- }
- if ( typeof props.left === "number" ) {
- props.left += "px";
- }
curElem.css( props );
}
}
@@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
- jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
- function( defaultExtra, funcName ) {
+ jQuery.each( {
+ padding: "inner" + name,
+ content: type,
+ "": "outer" + name
+ }, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
-jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+jQuery.each(
+ ( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
- } );
+ }
+);
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js
index b0614034ad..c4c6022f29 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.js
@@ -1,2 +1,2 @@
-/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),D=function(e,t){return e===t&&(l=!0),0},j={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&j.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(D),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(D).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(D(this,e||[],!1))},not:function(e){return this.pushStack(D(this,e||[],!0))},is:function(e){return!!D(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var j,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^key/,we=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Te=/^([^.]*)(?:\.(.+)|)/;function Ce(){return!0}function Ee(){return!1}function Se(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function ke(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)ke(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ee;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Ae(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,Ce)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=Te.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=Te.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click",Ce),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Ae(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?Ce:Ee,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Ee,isPropagationStopped:Ee,isImmediatePropagationStopped:Ee,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=Ce,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=Ce,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=Ce,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(e){var t=e.button;return null==e.which&&be.test(e.type)?null!=e.charCode?e.charCode:e.keyCode:!e.which&&void 0!==t&&we.test(e.type)?1&t?1:2&t?3:4&t?2:0:e.which}},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Ae(this,e,Se),!1},trigger:function(){return Ae(this,e),!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return ke(this,e,t,n,r)},one:function(e,t,n,r){return ke(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Ee),this.each(function(){S.event.remove(this,e,n,t)})}});var Ne=/<script|<style|<link/i,De=/checked\s*(?:[^=]|=\s*.checked.)/i,je=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function Pe(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&De.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),Pe(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),Le)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,He),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(je,""),u,l))}return n}function Re(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Oe(o[r],a[r]);else Oe(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Re(this,e,!0)},remove:function(e){return Re(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||qe(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=qe(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!Ne.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return Pe(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Me=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Ie=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},We=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Fe=new RegExp(ne.join("|"),"i");function Be(e,t,n){var r,i,o,a,s=e.style;return(n=n||Ie(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Me.test(a)&&Fe.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function $e(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px",t.style.height="1px",n.style.height="9px",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=3<parseInt(r.height),re.removeChild(e)),a}}))}();var _e=["Webkit","Moz","ms"],ze=E.createElement("div").style,Ue={};function Xe(e){var t=S.cssProps[e]||Ue[e];return t||(e in ze?e:Ue[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=_e.length;while(n--)if((e=_e[n]+t)in ze)return e}(e)||e)}var Ve=/^(none|table(?!-c[ea]).+)/,Ge=/^--/,Ye={position:"absolute",visibility:"hidden",display:"block"},Qe={letterSpacing:"0",fontWeight:"400"};function Je(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Ke(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Ze(e,t,n){var r=Ie(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=Be(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Me.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Ke(e,t,n||(i?"border":"content"),o,r,a)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Be(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Ge.test(t),l=e.style;if(u||(t=Xe(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Ge.test(t)||(t=Xe(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=Be(e,t,r)),"normal"===i&&t in Qe&&(i=Qe[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ve.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Ze(e,u,n):We(e,Ye,function(){return Ze(e,u,n)})},set:function(e,t,n){var r,i=Ie(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Ke(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Ke(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Je(0,t,s)}}}),S.cssHooks.marginLeft=$e(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(Be(e,"marginLeft"))||e.getBoundingClientRect().left-We(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Je)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Ie(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=et).prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}}).init.prototype=et.prototype,(et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[Xe(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=et.prototype.init,S.fx.step={};var tt,nt,rt,it,ot=/^(?:toggle|show|hide)$/,at=/queueHooks$/;function st(){nt&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(st):C.setTimeout(st,S.fx.interval),S.fx.tick())}function ut(){return C.setTimeout(function(){tt=void 0}),tt=Date.now()}function lt(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ct(e,t,n){for(var r,i=(ft.tweeners[t]||[]).concat(ft.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function ft(o,e,t){var n,a,r=0,i=ft.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=tt||ut(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:tt||ut(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=ft.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ct,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(ft,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],ft.tweeners[n]=ft.tweeners[n]||[],ft.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],ot.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ct(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?ft.prefilters.unshift(e):ft.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=ft(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&at.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(lt(r,!0),e,t,n)}}),S.each({slideDown:lt("show"),slideUp:lt("hide"),slideToggle:lt("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(tt=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),tt=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){nt||(nt=!0,st())},S.fx.stop=function(){nt=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},rt=E.createElement("input"),it=E.createElement("select").appendChild(E.createElement("option")),rt.type="checkbox",y.checkOn=""!==rt.value,y.optSelected=it.selected,(rt=E.createElement("input")).value="t",rt.type="radio",y.radioValue="t"===rt.value;var pt,dt=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?pt:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),pt={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=dt[t]||S.find.attr;dt[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=dt[o],dt[o]=r,r=null!=a(e,t,n)?o:null,dt[o]=i),r}});var ht=/^(?:input|select|textarea|button)$/i,gt=/^(?:a|area)$/i;function vt(e){return(e.match(P)||[]).join(" ")}function yt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):ht.test(e.nodeName)||gt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,yt(this)))});if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,yt(this)))});if(!arguments.length)return this.attr("class","");if((e=mt(t)).length)while(n=this[u++])if(i=yt(n),r=1===n.nodeType&&" "+vt(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=vt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,yt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=mt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=yt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+vt(yt(n))+" ").indexOf(t))return!0;return!1}});var xt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(xt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:vt(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var bt=/^(?:focusinfocus|focusoutblur)$/,wt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!bt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,bt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,wt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,wt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var Tt=C.location,Ct={guid:Date.now()},Et=/\?/;S.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||S.error("Invalid XML: "+e),t};var St=/\[\]$/,kt=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,Nt=/^(?:input|select|textarea|keygen)/i;function Dt(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||St.test(n)?i(n,t):Dt(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)Dt(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)Dt(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&Nt.test(this.nodeName)&&!At.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(kt,"\r\n")}}):{name:t.name,value:n.replace(kt,"\r\n")}}).get()}});var jt=/%20/g,qt=/#.*$/,Lt=/([?&])_=[^&]*/,Ht=/^(.*?):[ \t]*([^\r\n]*)$/gm,Ot=/^(?:GET|HEAD)$/,Pt=/^\/\//,Rt={},Mt={},It="*/".concat("*"),Wt=E.createElement("a");function Ft(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Bt(t,i,o,a){var s={},u=t===Mt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function $t(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Wt.href=Tt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Tt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Tt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":It,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,S.ajaxSettings),t):$t(S.ajaxSettings,e)},ajaxPrefilter:Ft(Rt),ajaxTransport:Ft(Mt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=Ht.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||Tt.href)+"").replace(Pt,Tt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Wt.protocol+"//"+Wt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Bt(Rt,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Ot.test(v.type),f=v.url.replace(qt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(jt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Et.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Lt,"$1"),o=(Et.test(f)?"&":"?")+"_="+Ct.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+It+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Bt(Mt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var _t={0:200,1223:204},zt=S.ajaxSettings.xhr();y.cors=!!zt&&"withCredentials"in zt,y.ajax=zt=!!zt,S.ajaxTransport(function(i){var o,a;if(y.cors||zt&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(_t[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=vt(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Gt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Gt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Yt=C.jQuery,Qt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Qt),e&&C.jQuery===S&&(C.jQuery=Yt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
+/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map
index cbe1012155..7d86eb1694 100644
--- a/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map
+++ b/src/Security/samples/StaticFilesAuth/wwwroot/lib/jquery/dist/jquery.min.map
@@ -1 +1 @@
-{"version":3,"sources":["jquery.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","master","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rkeyEvent","rmouseEvent","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","offsetHeight","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery.min.js"} \ No newline at end of file
+{"version":3,"sources":["jquery-3.6.0.js"],"names":["global","factory","module","exports","document","w","Error","window","this","noGlobal","arr","getProto","Object","getPrototypeOf","slice","flat","array","call","concat","apply","push","indexOf","class2type","toString","hasOwn","hasOwnProperty","fnToString","ObjectFunctionString","support","isFunction","obj","nodeType","item","isWindow","preservedScriptAttributes","type","src","nonce","noModule","DOMEval","code","node","doc","i","val","script","createElement","text","getAttribute","setAttribute","head","appendChild","parentNode","removeChild","toType","version","jQuery","selector","context","fn","init","isArrayLike","length","prototype","jquery","constructor","toArray","get","num","pushStack","elems","ret","merge","prevObject","each","callback","map","elem","arguments","first","eq","last","even","grep","_elem","odd","len","j","end","sort","splice","extend","options","name","copy","copyIsArray","clone","target","deep","isPlainObject","Array","isArray","undefined","expando","Math","random","replace","isReady","error","msg","noop","proto","Ctor","isEmptyObject","globalEval","makeArray","results","inArray","second","invert","matches","callbackExpect","arg","value","guid","Symbol","iterator","split","_i","toLowerCase","Sizzle","Expr","getText","isXML","tokenize","compile","select","outermostContext","sortInput","hasDuplicate","setDocument","docElem","documentIsHTML","rbuggyQSA","rbuggyMatches","contains","Date","preferredDoc","dirruns","done","classCache","createCache","tokenCache","compilerCache","nonnativeSelectorCache","sortOrder","a","b","pop","pushNative","list","booleans","whitespace","identifier","attributes","pseudos","rwhitespace","RegExp","rtrim","rcomma","rcombinators","rdescend","rpseudo","ridentifier","matchExpr","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rhtml","rinputs","rheader","rnative","rquickExpr","rsibling","runescape","funescape","escape","nonHex","high","String","fromCharCode","rcssescape","fcssescape","ch","asCodePoint","charCodeAt","unloadHandler","inDisabledFieldset","addCombinator","disabled","nodeName","dir","next","childNodes","e","els","seed","m","nid","match","groups","newSelector","newContext","ownerDocument","exec","getElementById","id","getElementsByTagName","getElementsByClassName","qsa","test","testContext","scope","toSelector","join","querySelectorAll","qsaError","removeAttribute","keys","cache","key","cacheLength","shift","markFunction","assert","el","addHandle","attrs","handler","attrHandle","siblingCheck","cur","diff","sourceIndex","nextSibling","createInputPseudo","createButtonPseudo","createDisabledPseudo","isDisabled","createPositionalPseudo","argument","matchIndexes","namespace","namespaceURI","documentElement","hasCompare","subWindow","defaultView","top","addEventListener","attachEvent","className","createComment","getById","getElementsByName","filter","attrId","find","getAttributeNode","tag","tmp","input","innerHTML","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","unshift","expr","elements","attr","specified","sel","uniqueSort","duplicates","detectDuplicates","sortStable","textContent","firstChild","nodeValue","selectors","createPseudo","relative",">"," ","+","~","preFilter","excess","unquoted","nodeNameSelector","pattern","operator","check","result","what","_argument","simple","forward","ofType","_context","xml","uniqueCache","outerCache","nodeIndex","start","parent","useCache","lastChild","uniqueID","pseudo","args","setFilters","idx","matched","not","matcher","unmatched","has","lang","elemLang","hash","location","root","focus","activeElement","hasFocus","href","tabIndex","enabled","checked","selected","selectedIndex","empty","header","button","_matchIndexes","lt","gt","radio","checkbox","file","password","image","submit","reset","tokens","combinator","base","skip","checkNonElements","doneName","oldCache","newCache","elementMatcher","matchers","condense","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","temp","preMap","postMap","preexisting","contexts","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","implicitRelative","matchContext","matchAnyContext","filters","parseOnly","soFar","preFilters","cached","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","token","compiled","_name","defaultValue","unique","isXMLDoc","escapeSelector","until","truncate","is","siblings","n","rneedsContext","rsingleTag","winnow","qualifier","self","rootjQuery","parseHTML","ready","rparentsprev","guaranteedUnique","children","contents","prev","sibling","targets","l","closest","index","prevAll","add","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","contentDocument","content","reverse","rnothtmlwhite","Identity","v","Thrower","ex","adoptValue","resolve","reject","noValue","method","promise","fail","then","Callbacks","object","_","flag","firing","memory","fired","locked","queue","firingIndex","fire","once","stopOnFalse","remove","disable","lock","fireWith","Deferred","func","tuples","state","always","deferred","catch","pipe","fns","newDefer","tuple","returned","progress","notify","onFulfilled","onRejected","onProgress","maxDepth","depth","special","that","mightThrow","TypeError","notifyWith","resolveWith","process","exceptionHook","stackTrace","rejectWith","getStackHook","setTimeout","stateString","when","singleValue","remaining","resolveContexts","resolveValues","primary","updateFunc","rerrorNames","stack","console","warn","message","readyException","readyList","completed","removeEventListener","readyWait","wait","readyState","doScroll","access","chainable","emptyGet","raw","bulk","_key","rmsPrefix","rdashAlpha","fcamelCase","_all","letter","toUpperCase","camelCase","string","acceptData","owner","Data","uid","defineProperty","configurable","set","data","prop","hasData","dataPriv","dataUser","rbrace","rmultiDash","dataAttr","JSON","parse","removeData","_data","_removeData","dequeue","startLength","hooks","_queueHooks","stop","setter","clearQueue","count","defer","pnum","source","rcssNum","cssExpand","isAttached","composed","getRootNode","isHiddenWithinTree","style","display","css","adjustCSS","valueParts","tween","adjusted","scale","maxIterations","currentValue","initial","unit","cssNumber","initialInUnit","defaultDisplayMap","showHide","show","values","body","hide","toggle","div","rcheckableType","rtagName","rscriptType","createDocumentFragment","checkClone","cloneNode","noCloneChecked","option","wrapMap","thead","col","tr","td","_default","getAll","setGlobalEval","refElements","tbody","tfoot","colgroup","caption","th","optgroup","buildFragment","scripts","selection","ignored","wrap","attached","fragment","nodes","htmlPrefilter","createTextNode","rtypenamespace","returnTrue","returnFalse","expectSync","err","safeActiveElement","on","types","one","origFn","event","off","leverageNative","notAsync","saved","isTrigger","delegateType","stopPropagation","stopImmediatePropagation","preventDefault","trigger","Event","handleObjIn","eventHandle","events","t","handleObj","handlers","namespaces","origType","elemData","create","handle","triggered","dispatch","bindType","delegateCount","setup","mappedTypes","origCount","teardown","removeEvent","nativeEvent","handlerQueue","fix","delegateTarget","preDispatch","isPropagationStopped","currentTarget","isImmediatePropagationStopped","rnamespace","postDispatch","matchedHandlers","matchedSelectors","addProp","hook","enumerable","originalEvent","writable","load","noBubble","click","beforeunload","returnValue","props","isDefaultPrevented","defaultPrevented","relatedTarget","timeStamp","now","isSimulated","altKey","bubbles","cancelable","changedTouches","ctrlKey","detail","eventPhase","metaKey","pageX","pageY","shiftKey","view","char","charCode","keyCode","buttons","clientX","clientY","offsetX","offsetY","pointerId","pointerType","screenX","screenY","targetTouches","toElement","touches","which","blur","mouseenter","mouseleave","pointerenter","pointerleave","orig","related","rnoInnerhtml","rchecked","rcleanScript","manipulationTarget","disableScript","restoreScript","cloneCopyEvent","dest","udataOld","udataCur","domManip","collection","hasScripts","iNoClone","valueIsFunction","html","_evalUrl","keepData","cleanData","dataAndEvents","deepDataAndEvents","srcElements","destElements","inPage","detach","append","prepend","insertBefore","before","after","replaceWith","replaceChild","appendTo","prependTo","insertAfter","replaceAll","original","insert","rnumnonpx","getStyles","opener","getComputedStyle","swap","old","rboxStyle","curCSS","computed","width","minWidth","maxWidth","getPropertyValue","pixelBoxStyles","addGetHookIf","conditionFn","hookFn","computeStyleTests","container","cssText","divStyle","pixelPositionVal","reliableMarginLeftVal","roundPixelMeasures","marginLeft","right","pixelBoxStylesVal","boxSizingReliableVal","position","scrollboxSizeVal","offsetWidth","measure","round","parseFloat","reliableTrDimensionsVal","backgroundClip","clearCloneStyle","boxSizingReliable","pixelPosition","reliableMarginLeft","scrollboxSize","reliableTrDimensions","table","trChild","trStyle","height","parseInt","borderTopWidth","borderBottomWidth","offsetHeight","cssPrefixes","emptyStyle","vendorProps","finalPropName","final","cssProps","capName","vendorPropName","rdisplayswap","rcustomProp","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","setPositiveNumber","subtract","max","boxModelAdjustment","dimension","box","isBorderBox","styles","computedVal","extra","delta","ceil","getWidthOrHeight","valueIsBorderBox","offsetProp","getClientRects","Tween","easing","cssHooks","opacity","animationIterationCount","columnCount","fillOpacity","flexGrow","flexShrink","gridArea","gridColumn","gridColumnEnd","gridColumnStart","gridRow","gridRowEnd","gridRowStart","lineHeight","order","orphans","widows","zIndex","zoom","origName","isCustomProp","setProperty","isFinite","getBoundingClientRect","scrollboxSizeBuggy","left","margin","padding","border","prefix","suffix","expand","expanded","parts","propHooks","run","percent","eased","duration","pos","step","fx","scrollTop","scrollLeft","linear","p","swing","cos","PI","fxNow","inProgress","opt","rfxtypes","rrun","schedule","hidden","requestAnimationFrame","interval","tick","createFxNow","genFx","includeWidth","createTween","animation","Animation","tweeners","properties","stopped","prefilters","currentTime","startTime","tweens","opts","specialEasing","originalProperties","originalOptions","gotoEnd","propFilter","bind","complete","timer","anim","*","tweener","oldfire","propTween","restoreDisplay","isBox","dataShow","unqueued","overflow","overflowX","overflowY","prefilter","speed","speeds","fadeTo","to","animate","optall","doAnimation","finish","stopQueue","timers","cssFn","slideDown","slideUp","slideToggle","fadeIn","fadeOut","fadeToggle","slow","fast","delay","time","timeout","clearTimeout","checkOn","optSelected","radioValue","boolHook","removeAttr","nType","attrHooks","attrNames","getter","lowercaseName","rfocusable","rclickable","stripAndCollapse","getClass","classesToArray","removeProp","propFix","tabindex","for","class","addClass","classes","curValue","clazz","finalValue","removeClass","toggleClass","stateVal","isValidValue","classNames","hasClass","rreturn","valHooks","optionSet","focusin","rfocusMorph","stopPropagationCallback","onlyHandlers","bubbleType","ontype","lastElement","eventPath","parentWindow","simulate","triggerHandler","attaches","rquery","parseXML","parserErrorElem","DOMParser","parseFromString","rbracket","rCRLF","rsubmitterTypes","rsubmittable","buildParams","traditional","param","s","valueOrFunction","encodeURIComponent","serialize","serializeArray","r20","rhash","rantiCache","rheaders","rnoContent","rprotocol","transports","allTypes","originAnchor","addToPrefiltersOrTransports","structure","dataTypeExpression","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspected","seekingTransport","inspect","prefilterOrFactory","dataTypeOrTransport","ajaxExtend","flatOptions","ajaxSettings","active","lastModified","etag","url","isLocal","protocol","processData","async","contentType","accepts","json","responseFields","converters","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","transport","cacheURL","responseHeadersString","responseHeaders","timeoutTimer","urlAnchor","fireGlobals","uncached","callbackContext","globalEventContext","completeDeferred","statusCode","requestHeaders","requestHeadersNames","strAbort","getResponseHeader","getAllResponseHeaders","setRequestHeader","overrideMimeType","mimeType","status","abort","statusText","finalText","crossDomain","host","hasContent","ifModified","headers","beforeSend","success","send","nativeStatusText","responses","isSuccess","response","modified","ct","finalDataType","firstDataType","ajaxHandleResponses","conv2","current","conv","dataFilter","throws","ajaxConvert","getJSON","getScript","text script","wrapAll","firstElementChild","wrapInner","htmlIsFunction","unwrap","visible","xhr","XMLHttpRequest","xhrSuccessStatus","0","1223","xhrSupported","cors","errorCallback","open","username","xhrFields","onload","onerror","onabort","ontimeout","onreadystatechange","responseType","responseText","binary","scriptAttrs","charset","scriptCharset","evt","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","createHTMLDocument","implementation","keepScripts","parsed","params","animated","offset","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","curElem","using","rect","win","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","unbind","delegate","undelegate","hover","fnOver","fnOut","proxy","holdReady","hold","parseJSON","isNumeric","isNaN","trim","define","amd","_jQuery","_$","$","noConflict"],"mappings":"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","file":"jquery-3.6.0.min.js"} \ No newline at end of file
diff --git a/src/Servers/Connections.Abstractions/src/Features/IStreamClosedFeature.cs b/src/Servers/Connections.Abstractions/src/Features/IStreamClosedFeature.cs
new file mode 100644
index 0000000000..8fe03352ba
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/Features/IStreamClosedFeature.cs
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Threading.Tasks;
+using System;
+
+namespace Microsoft.AspNetCore.Connections.Features;
+
+/// <summary>
+/// Represents the close action for a stream.
+/// </summary>
+public interface IStreamClosedFeature
+{
+ /// <summary>
+ /// Registers a callback to be invoked when a stream is closed.
+ /// If the stream is already in a closed state, the callback will be run immediately.
+ /// </summary>
+ /// <param name="callback">The callback to invoke after the stream is closed.</param>
+ /// <param name="state">The state to pass into the callback.</param>
+ void OnClosed(Action<object?> callback, object? state);
+}
diff --git a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
index 691b85d697..039515346f 100644
--- a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
+++ b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>Core components of ASP.NET Core networking protocol stack.</Description>
@@ -19,6 +19,11 @@
<Compile Include="$(SharedSourceRoot)CodeAnalysis\*.cs" />
</ItemGroup>
+ <ItemGroup>
+ <AdditionalFiles Include="PublicAPI/$(TargetFramework)/PublicAPI.Shipped.txt" />
+ <AdditionalFiles Include="PublicAPI/$(TargetFramework)/PublicAPI.Unshipped.txt" />
+ </ItemGroup>
+
<!-- Special case building from source because Microsoft.Bcl.AsyncInterfaces isn't available for source builds. -->
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' OR
'$(TargetFramework)' == '$(DefaultNetFxTargetFramework)' OR
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI.Unshipped.txt
deleted file mode 100644
index 7dc5c58110..0000000000
--- a/src/Servers/Connections.Abstractions/src/PublicAPI.Unshipped.txt
+++ /dev/null
@@ -1 +0,0 @@
-#nullable enable
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI.Shipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Shipped.txt
index 93a5c9add4..93a5c9add4 100644
--- a/src/Servers/Connections.Abstractions/src/PublicAPI.Shipped.txt
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Shipped.txt
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..553973838a
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net462/PublicAPI.Unshipped.txt
@@ -0,0 +1,3 @@
+#nullable enable
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature.OnClosed(System.Action<object?>! callback, object? state) -> void
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Shipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..93a5c9add4
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Shipped.txt
@@ -0,0 +1,182 @@
+#nullable enable
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Abort() -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionId.get -> string!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionId.set -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Features.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Items.set -> void
+abstract Microsoft.AspNetCore.Connections.ConnectionContext.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+abstract Microsoft.AspNetCore.Connections.ConnectionContext.Transport.set -> void
+abstract Microsoft.AspNetCore.Connections.ConnectionHandler.OnConnectedAsync(Microsoft.AspNetCore.Connections.ConnectionContext! connection) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+abstract Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.ConnectAsync(Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext!>
+Microsoft.AspNetCore.Connections.AddressInUseException
+Microsoft.AspNetCore.Connections.AddressInUseException.AddressInUseException(string! message) -> void
+Microsoft.AspNetCore.Connections.AddressInUseException.AddressInUseException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.BaseConnectionContext
+Microsoft.AspNetCore.Connections.BaseConnectionContext.BaseConnectionContext() -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException() -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException(string! message) -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.ConnectionBuilder
+Microsoft.AspNetCore.Connections.ConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.ConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.ConnectionDelegate!
+Microsoft.AspNetCore.Connections.ConnectionBuilder.ConnectionBuilder(System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Connections.ConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.ConnectionDelegate!, Microsoft.AspNetCore.Connections.ConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions
+Microsoft.AspNetCore.Connections.ConnectionContext
+Microsoft.AspNetCore.Connections.ConnectionContext.ConnectionContext() -> void
+Microsoft.AspNetCore.Connections.ConnectionDelegate
+Microsoft.AspNetCore.Connections.ConnectionHandler
+Microsoft.AspNetCore.Connections.ConnectionHandler.ConnectionHandler() -> void
+Microsoft.AspNetCore.Connections.ConnectionItems
+Microsoft.AspNetCore.Connections.ConnectionItems.ConnectionItems() -> void
+Microsoft.AspNetCore.Connections.ConnectionItems.ConnectionItems(System.Collections.Generic.IDictionary<object!, object?>! items) -> void
+Microsoft.AspNetCore.Connections.ConnectionItems.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.ConnectionResetException
+Microsoft.AspNetCore.Connections.ConnectionResetException.ConnectionResetException(string! message) -> void
+Microsoft.AspNetCore.Connections.ConnectionResetException.ConnectionResetException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.Application.get -> System.IO.Pipelines.IDuplexPipe?
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.Application.set -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext() -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext(string! id) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext(string! id, System.IO.Pipelines.IDuplexPipe! transport, System.IO.Pipelines.IDuplexPipe! application) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.User.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.User.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionCompleteFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionCompleteFeature.OnCompleted(System.Func<object!, System.Threading.Tasks.Task!>! callback, object! state) -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.LocalEndPoint.get -> System.Net.EndPoint?
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.LocalEndPoint.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.RemoteEndPoint.get -> System.Net.EndPoint?
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.RemoteEndPoint.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionHeartbeatFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionHeartbeatFeature.OnHeartbeat(System.Action<object!>! action, object! state) -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature.ConnectionId.get -> string!
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature.ConnectionId.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionInherentKeepAliveFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionInherentKeepAliveFeature.HasInherentKeepAlive.get -> bool
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature.Items.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.Abort() -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.ConnectionClosed.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.ConnectionClosed.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.ConnectionClosedRequested.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.ConnectionClosedRequested.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.RequestClose() -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature.Socket.get -> System.Net.Sockets.Socket!
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature.Transport.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature.User.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature.User.set -> void
+Microsoft.AspNetCore.Connections.Features.IMemoryPoolFeature
+Microsoft.AspNetCore.Connections.Features.IMemoryPoolFeature.MemoryPool.get -> System.Buffers.MemoryPool<byte>!
+Microsoft.AspNetCore.Connections.Features.IPersistentStateFeature
+Microsoft.AspNetCore.Connections.Features.IPersistentStateFeature.State.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature.Error.get -> long
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature.Error.set -> void
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature.AbortRead(long errorCode, Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature.AbortWrite(long errorCode, Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature.CanRead.get -> bool
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature.CanWrite.get -> bool
+Microsoft.AspNetCore.Connections.Features.IStreamIdFeature
+Microsoft.AspNetCore.Connections.Features.IStreamIdFeature.StreamId.get -> long
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.CipherAlgorithm.get -> System.Security.Authentication.CipherAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.CipherStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.HashAlgorithm.get -> System.Security.Authentication.HashAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.HashStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.KeyExchangeAlgorithm.get -> System.Security.Authentication.ExchangeAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.KeyExchangeStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.Protocol.get -> System.Security.Authentication.SslProtocols
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.ActiveFormat.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.ActiveFormat.set -> void
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.SupportedFormats.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.FileHandleEndPoint
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandle.get -> ulong
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandleEndPoint(ulong fileHandle, Microsoft.AspNetCore.Connections.FileHandleType fileHandleType) -> void
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandleType.get -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Auto = 0 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Pipe = 2 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Tcp = 1 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.IConnectionBuilder
+Microsoft.AspNetCore.Connections.IConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.IConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.ConnectionDelegate!
+Microsoft.AspNetCore.Connections.IConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.ConnectionDelegate!, Microsoft.AspNetCore.Connections.ConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+Microsoft.AspNetCore.Connections.IConnectionFactory
+Microsoft.AspNetCore.Connections.IConnectionFactory.ConnectAsync(System.Net.EndPoint! endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext!>
+Microsoft.AspNetCore.Connections.IConnectionListener
+Microsoft.AspNetCore.Connections.IConnectionListener.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+Microsoft.AspNetCore.Connections.IConnectionListener.EndPoint.get -> System.Net.EndPoint!
+Microsoft.AspNetCore.Connections.IConnectionListener.UnbindAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Connections.IConnectionListenerFactory
+Microsoft.AspNetCore.Connections.IConnectionListenerFactory.BindAsync(System.Net.EndPoint! endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IConnectionListener!>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!, Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionFactory
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionFactory.ConnectAsync(System.Net.EndPoint! endpoint, Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.MultiplexedConnectionContext!>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.AcceptAsync(Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.MultiplexedConnectionContext?>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.EndPoint.get -> System.Net.EndPoint!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.UnbindAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListenerFactory
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListenerFactory.BindAsync(System.Net.EndPoint! endpoint, Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener!>
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.MultiplexedConnectionBuilder(System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!, Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionContext
+Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.MultiplexedConnectionContext() -> void
+Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate
+Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.TransferFormat.Binary = 1 -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.TransferFormat.Text = 2 -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.UriEndPoint
+Microsoft.AspNetCore.Connections.UriEndPoint.Uri.get -> System.Uri!
+Microsoft.AspNetCore.Connections.UriEndPoint.UriEndPoint(System.Uri! uri) -> void
+override Microsoft.AspNetCore.Connections.ConnectionContext.Abort() -> void
+override Microsoft.AspNetCore.Connections.ConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionClosed.get -> System.Threading.CancellationToken
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionClosed.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionId.get -> string!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionId.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.DisposeAsync() -> System.Threading.Tasks.ValueTask
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Features.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Items.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.LocalEndPoint.get -> System.Net.EndPoint?
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.LocalEndPoint.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.RemoteEndPoint.get -> System.Net.EndPoint?
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.RemoteEndPoint.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Transport.set -> void
+override Microsoft.AspNetCore.Connections.UriEndPoint.ToString() -> string!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.Run(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder, System.Func<Microsoft.AspNetCore.Connections.ConnectionContext!, System.Threading.Tasks.Task!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.Use(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder, System.Func<Microsoft.AspNetCore.Connections.ConnectionContext!, System.Func<System.Threading.Tasks.Task!>!, System.Threading.Tasks.Task!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.UseConnectionHandler<TConnectionHandler>(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionClosed.get -> System.Threading.CancellationToken
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionClosed.set -> void
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.DisposeAsync() -> System.Threading.Tasks.ValueTask
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.LocalEndPoint.get -> System.Net.EndPoint?
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.LocalEndPoint.set -> void
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.RemoteEndPoint.get -> System.Net.EndPoint?
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.RemoteEndPoint.set -> void
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..4dd8553d83
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt
@@ -0,0 +1,19 @@
+#nullable enable
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature.OnClosed(System.Action<object?>! callback, object? state) -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.ClientHelloInfo.get -> System.Net.Security.SslClientHelloInfo
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.ClientHelloInfo.set -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.Connection.get -> Microsoft.AspNetCore.Connections.BaseConnectionContext!
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.Connection.set -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.State.get -> object?
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.State.set -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext.TlsConnectionCallbackContext() -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.ApplicationProtocols.get -> System.Collections.Generic.List<System.Net.Security.SslApplicationProtocol>!
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.ApplicationProtocols.set -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.OnConnection.get -> System.Func<Microsoft.AspNetCore.Connections.TlsConnectionCallbackContext!, System.Threading.CancellationToken, System.Threading.Tasks.ValueTask<System.Net.Security.SslServerAuthenticationOptions!>>!
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.OnConnection.set -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.OnConnectionState.get -> object?
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.OnConnectionState.set -> void
+Microsoft.AspNetCore.Connections.TlsConnectionCallbackOptions.TlsConnectionCallbackOptions() -> void
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..93a5c9add4
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt
@@ -0,0 +1,182 @@
+#nullable enable
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Abort() -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionId.get -> string!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionId.set -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Features.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Items.set -> void
+abstract Microsoft.AspNetCore.Connections.ConnectionContext.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+abstract Microsoft.AspNetCore.Connections.ConnectionContext.Transport.set -> void
+abstract Microsoft.AspNetCore.Connections.ConnectionHandler.OnConnectedAsync(Microsoft.AspNetCore.Connections.ConnectionContext! connection) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+abstract Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.ConnectAsync(Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext!>
+Microsoft.AspNetCore.Connections.AddressInUseException
+Microsoft.AspNetCore.Connections.AddressInUseException.AddressInUseException(string! message) -> void
+Microsoft.AspNetCore.Connections.AddressInUseException.AddressInUseException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.BaseConnectionContext
+Microsoft.AspNetCore.Connections.BaseConnectionContext.BaseConnectionContext() -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException() -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException(string! message) -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.ConnectionBuilder
+Microsoft.AspNetCore.Connections.ConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.ConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.ConnectionDelegate!
+Microsoft.AspNetCore.Connections.ConnectionBuilder.ConnectionBuilder(System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Connections.ConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.ConnectionDelegate!, Microsoft.AspNetCore.Connections.ConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions
+Microsoft.AspNetCore.Connections.ConnectionContext
+Microsoft.AspNetCore.Connections.ConnectionContext.ConnectionContext() -> void
+Microsoft.AspNetCore.Connections.ConnectionDelegate
+Microsoft.AspNetCore.Connections.ConnectionHandler
+Microsoft.AspNetCore.Connections.ConnectionHandler.ConnectionHandler() -> void
+Microsoft.AspNetCore.Connections.ConnectionItems
+Microsoft.AspNetCore.Connections.ConnectionItems.ConnectionItems() -> void
+Microsoft.AspNetCore.Connections.ConnectionItems.ConnectionItems(System.Collections.Generic.IDictionary<object!, object?>! items) -> void
+Microsoft.AspNetCore.Connections.ConnectionItems.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.ConnectionResetException
+Microsoft.AspNetCore.Connections.ConnectionResetException.ConnectionResetException(string! message) -> void
+Microsoft.AspNetCore.Connections.ConnectionResetException.ConnectionResetException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.Application.get -> System.IO.Pipelines.IDuplexPipe?
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.Application.set -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext() -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext(string! id) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext(string! id, System.IO.Pipelines.IDuplexPipe! transport, System.IO.Pipelines.IDuplexPipe! application) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.User.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.User.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionCompleteFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionCompleteFeature.OnCompleted(System.Func<object!, System.Threading.Tasks.Task!>! callback, object! state) -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.LocalEndPoint.get -> System.Net.EndPoint?
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.LocalEndPoint.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.RemoteEndPoint.get -> System.Net.EndPoint?
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.RemoteEndPoint.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionHeartbeatFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionHeartbeatFeature.OnHeartbeat(System.Action<object!>! action, object! state) -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature.ConnectionId.get -> string!
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature.ConnectionId.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionInherentKeepAliveFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionInherentKeepAliveFeature.HasInherentKeepAlive.get -> bool
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature.Items.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.Abort() -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.ConnectionClosed.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.ConnectionClosed.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.ConnectionClosedRequested.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.ConnectionClosedRequested.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.RequestClose() -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature.Socket.get -> System.Net.Sockets.Socket!
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature.Transport.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature.User.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature.User.set -> void
+Microsoft.AspNetCore.Connections.Features.IMemoryPoolFeature
+Microsoft.AspNetCore.Connections.Features.IMemoryPoolFeature.MemoryPool.get -> System.Buffers.MemoryPool<byte>!
+Microsoft.AspNetCore.Connections.Features.IPersistentStateFeature
+Microsoft.AspNetCore.Connections.Features.IPersistentStateFeature.State.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature.Error.get -> long
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature.Error.set -> void
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature.AbortRead(long errorCode, Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature.AbortWrite(long errorCode, Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature.CanRead.get -> bool
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature.CanWrite.get -> bool
+Microsoft.AspNetCore.Connections.Features.IStreamIdFeature
+Microsoft.AspNetCore.Connections.Features.IStreamIdFeature.StreamId.get -> long
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.CipherAlgorithm.get -> System.Security.Authentication.CipherAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.CipherStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.HashAlgorithm.get -> System.Security.Authentication.HashAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.HashStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.KeyExchangeAlgorithm.get -> System.Security.Authentication.ExchangeAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.KeyExchangeStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.Protocol.get -> System.Security.Authentication.SslProtocols
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.ActiveFormat.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.ActiveFormat.set -> void
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.SupportedFormats.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.FileHandleEndPoint
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandle.get -> ulong
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandleEndPoint(ulong fileHandle, Microsoft.AspNetCore.Connections.FileHandleType fileHandleType) -> void
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandleType.get -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Auto = 0 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Pipe = 2 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Tcp = 1 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.IConnectionBuilder
+Microsoft.AspNetCore.Connections.IConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.IConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.ConnectionDelegate!
+Microsoft.AspNetCore.Connections.IConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.ConnectionDelegate!, Microsoft.AspNetCore.Connections.ConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+Microsoft.AspNetCore.Connections.IConnectionFactory
+Microsoft.AspNetCore.Connections.IConnectionFactory.ConnectAsync(System.Net.EndPoint! endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext!>
+Microsoft.AspNetCore.Connections.IConnectionListener
+Microsoft.AspNetCore.Connections.IConnectionListener.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+Microsoft.AspNetCore.Connections.IConnectionListener.EndPoint.get -> System.Net.EndPoint!
+Microsoft.AspNetCore.Connections.IConnectionListener.UnbindAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Connections.IConnectionListenerFactory
+Microsoft.AspNetCore.Connections.IConnectionListenerFactory.BindAsync(System.Net.EndPoint! endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IConnectionListener!>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!, Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionFactory
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionFactory.ConnectAsync(System.Net.EndPoint! endpoint, Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.MultiplexedConnectionContext!>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.AcceptAsync(Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.MultiplexedConnectionContext?>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.EndPoint.get -> System.Net.EndPoint!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.UnbindAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListenerFactory
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListenerFactory.BindAsync(System.Net.EndPoint! endpoint, Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener!>
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.MultiplexedConnectionBuilder(System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!, Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionContext
+Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.MultiplexedConnectionContext() -> void
+Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate
+Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.TransferFormat.Binary = 1 -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.TransferFormat.Text = 2 -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.UriEndPoint
+Microsoft.AspNetCore.Connections.UriEndPoint.Uri.get -> System.Uri!
+Microsoft.AspNetCore.Connections.UriEndPoint.UriEndPoint(System.Uri! uri) -> void
+override Microsoft.AspNetCore.Connections.ConnectionContext.Abort() -> void
+override Microsoft.AspNetCore.Connections.ConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionClosed.get -> System.Threading.CancellationToken
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionClosed.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionId.get -> string!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionId.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.DisposeAsync() -> System.Threading.Tasks.ValueTask
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Features.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Items.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.LocalEndPoint.get -> System.Net.EndPoint?
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.LocalEndPoint.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.RemoteEndPoint.get -> System.Net.EndPoint?
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.RemoteEndPoint.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Transport.set -> void
+override Microsoft.AspNetCore.Connections.UriEndPoint.ToString() -> string!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.Run(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder, System.Func<Microsoft.AspNetCore.Connections.ConnectionContext!, System.Threading.Tasks.Task!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.Use(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder, System.Func<Microsoft.AspNetCore.Connections.ConnectionContext!, System.Func<System.Threading.Tasks.Task!>!, System.Threading.Tasks.Task!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.UseConnectionHandler<TConnectionHandler>(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionClosed.get -> System.Threading.CancellationToken
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionClosed.set -> void
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.DisposeAsync() -> System.Threading.Tasks.ValueTask
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.LocalEndPoint.get -> System.Net.EndPoint?
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.LocalEndPoint.set -> void
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.RemoteEndPoint.get -> System.Net.EndPoint?
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.RemoteEndPoint.set -> void
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..553973838a
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
@@ -0,0 +1,3 @@
+#nullable enable
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature.OnClosed(System.Action<object?>! callback, object? state) -> void
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..93a5c9add4
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Shipped.txt
@@ -0,0 +1,182 @@
+#nullable enable
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Abort() -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionId.get -> string!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionId.set -> void
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Features.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+abstract Microsoft.AspNetCore.Connections.BaseConnectionContext.Items.set -> void
+abstract Microsoft.AspNetCore.Connections.ConnectionContext.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+abstract Microsoft.AspNetCore.Connections.ConnectionContext.Transport.set -> void
+abstract Microsoft.AspNetCore.Connections.ConnectionHandler.OnConnectedAsync(Microsoft.AspNetCore.Connections.ConnectionContext! connection) -> System.Threading.Tasks.Task!
+abstract Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+abstract Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.ConnectAsync(Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext!>
+Microsoft.AspNetCore.Connections.AddressInUseException
+Microsoft.AspNetCore.Connections.AddressInUseException.AddressInUseException(string! message) -> void
+Microsoft.AspNetCore.Connections.AddressInUseException.AddressInUseException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.BaseConnectionContext
+Microsoft.AspNetCore.Connections.BaseConnectionContext.BaseConnectionContext() -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException() -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException(string! message) -> void
+Microsoft.AspNetCore.Connections.ConnectionAbortedException.ConnectionAbortedException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.ConnectionBuilder
+Microsoft.AspNetCore.Connections.ConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.ConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.ConnectionDelegate!
+Microsoft.AspNetCore.Connections.ConnectionBuilder.ConnectionBuilder(System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Connections.ConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.ConnectionDelegate!, Microsoft.AspNetCore.Connections.ConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions
+Microsoft.AspNetCore.Connections.ConnectionContext
+Microsoft.AspNetCore.Connections.ConnectionContext.ConnectionContext() -> void
+Microsoft.AspNetCore.Connections.ConnectionDelegate
+Microsoft.AspNetCore.Connections.ConnectionHandler
+Microsoft.AspNetCore.Connections.ConnectionHandler.ConnectionHandler() -> void
+Microsoft.AspNetCore.Connections.ConnectionItems
+Microsoft.AspNetCore.Connections.ConnectionItems.ConnectionItems() -> void
+Microsoft.AspNetCore.Connections.ConnectionItems.ConnectionItems(System.Collections.Generic.IDictionary<object!, object?>! items) -> void
+Microsoft.AspNetCore.Connections.ConnectionItems.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.ConnectionResetException
+Microsoft.AspNetCore.Connections.ConnectionResetException.ConnectionResetException(string! message) -> void
+Microsoft.AspNetCore.Connections.ConnectionResetException.ConnectionResetException(string! message, System.Exception! inner) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.Application.get -> System.IO.Pipelines.IDuplexPipe?
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.Application.set -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext() -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext(string! id) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.DefaultConnectionContext(string! id, System.IO.Pipelines.IDuplexPipe! transport, System.IO.Pipelines.IDuplexPipe! application) -> void
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.User.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Connections.DefaultConnectionContext.User.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionCompleteFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionCompleteFeature.OnCompleted(System.Func<object!, System.Threading.Tasks.Task!>! callback, object! state) -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.LocalEndPoint.get -> System.Net.EndPoint?
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.LocalEndPoint.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.RemoteEndPoint.get -> System.Net.EndPoint?
+Microsoft.AspNetCore.Connections.Features.IConnectionEndPointFeature.RemoteEndPoint.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionHeartbeatFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionHeartbeatFeature.OnHeartbeat(System.Action<object!>! action, object! state) -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature.ConnectionId.get -> string!
+Microsoft.AspNetCore.Connections.Features.IConnectionIdFeature.ConnectionId.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionInherentKeepAliveFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionInherentKeepAliveFeature.HasInherentKeepAlive.get -> bool
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.Features.IConnectionItemsFeature.Items.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.Abort() -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.ConnectionClosed.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeFeature.ConnectionClosed.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.ConnectionClosedRequested.get -> System.Threading.CancellationToken
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.ConnectionClosedRequested.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionLifetimeNotificationFeature.RequestClose() -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionSocketFeature.Socket.get -> System.Net.Sockets.Socket!
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+Microsoft.AspNetCore.Connections.Features.IConnectionTransportFeature.Transport.set -> void
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature.User.get -> System.Security.Claims.ClaimsPrincipal?
+Microsoft.AspNetCore.Connections.Features.IConnectionUserFeature.User.set -> void
+Microsoft.AspNetCore.Connections.Features.IMemoryPoolFeature
+Microsoft.AspNetCore.Connections.Features.IMemoryPoolFeature.MemoryPool.get -> System.Buffers.MemoryPool<byte>!
+Microsoft.AspNetCore.Connections.Features.IPersistentStateFeature
+Microsoft.AspNetCore.Connections.Features.IPersistentStateFeature.State.get -> System.Collections.Generic.IDictionary<object!, object?>!
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature.Error.get -> long
+Microsoft.AspNetCore.Connections.Features.IProtocolErrorCodeFeature.Error.set -> void
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature.AbortRead(long errorCode, Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+Microsoft.AspNetCore.Connections.Features.IStreamAbortFeature.AbortWrite(long errorCode, Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature.CanRead.get -> bool
+Microsoft.AspNetCore.Connections.Features.IStreamDirectionFeature.CanWrite.get -> bool
+Microsoft.AspNetCore.Connections.Features.IStreamIdFeature
+Microsoft.AspNetCore.Connections.Features.IStreamIdFeature.StreamId.get -> long
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.CipherAlgorithm.get -> System.Security.Authentication.CipherAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.CipherStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.HashAlgorithm.get -> System.Security.Authentication.HashAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.HashStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.KeyExchangeAlgorithm.get -> System.Security.Authentication.ExchangeAlgorithmType
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.KeyExchangeStrength.get -> int
+Microsoft.AspNetCore.Connections.Features.ITlsHandshakeFeature.Protocol.get -> System.Security.Authentication.SslProtocols
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.ActiveFormat.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.ActiveFormat.set -> void
+Microsoft.AspNetCore.Connections.Features.ITransferFormatFeature.SupportedFormats.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.FileHandleEndPoint
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandle.get -> ulong
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandleEndPoint(ulong fileHandle, Microsoft.AspNetCore.Connections.FileHandleType fileHandleType) -> void
+Microsoft.AspNetCore.Connections.FileHandleEndPoint.FileHandleType.get -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Auto = 0 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Pipe = 2 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.FileHandleType.Tcp = 1 -> Microsoft.AspNetCore.Connections.FileHandleType
+Microsoft.AspNetCore.Connections.IConnectionBuilder
+Microsoft.AspNetCore.Connections.IConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.IConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.ConnectionDelegate!
+Microsoft.AspNetCore.Connections.IConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.ConnectionDelegate!, Microsoft.AspNetCore.Connections.ConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+Microsoft.AspNetCore.Connections.IConnectionFactory
+Microsoft.AspNetCore.Connections.IConnectionFactory.ConnectAsync(System.Net.EndPoint! endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext!>
+Microsoft.AspNetCore.Connections.IConnectionListener
+Microsoft.AspNetCore.Connections.IConnectionListener.AcceptAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.ConnectionContext?>
+Microsoft.AspNetCore.Connections.IConnectionListener.EndPoint.get -> System.Net.EndPoint!
+Microsoft.AspNetCore.Connections.IConnectionListener.UnbindAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Connections.IConnectionListenerFactory
+Microsoft.AspNetCore.Connections.IConnectionListenerFactory.BindAsync(System.Net.EndPoint! endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IConnectionListener!>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!, Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionFactory
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionFactory.ConnectAsync(System.Net.EndPoint! endpoint, Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.MultiplexedConnectionContext!>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.AcceptAsync(Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.MultiplexedConnectionContext?>
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.EndPoint.get -> System.Net.EndPoint!
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener.UnbindAsync(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListenerFactory
+Microsoft.AspNetCore.Connections.IMultiplexedConnectionListenerFactory.BindAsync(System.Net.EndPoint! endpoint, Microsoft.AspNetCore.Http.Features.IFeatureCollection? features = null, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IMultiplexedConnectionListener!>
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.ApplicationServices.get -> System.IServiceProvider!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.Build() -> Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.MultiplexedConnectionBuilder(System.IServiceProvider! applicationServices) -> void
+Microsoft.AspNetCore.Connections.MultiplexedConnectionBuilder.Use(System.Func<Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!, Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate!>! middleware) -> Microsoft.AspNetCore.Connections.IMultiplexedConnectionBuilder!
+Microsoft.AspNetCore.Connections.MultiplexedConnectionContext
+Microsoft.AspNetCore.Connections.MultiplexedConnectionContext.MultiplexedConnectionContext() -> void
+Microsoft.AspNetCore.Connections.MultiplexedConnectionDelegate
+Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.TransferFormat.Binary = 1 -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.TransferFormat.Text = 2 -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.Connections.UriEndPoint
+Microsoft.AspNetCore.Connections.UriEndPoint.Uri.get -> System.Uri!
+Microsoft.AspNetCore.Connections.UriEndPoint.UriEndPoint(System.Uri! uri) -> void
+override Microsoft.AspNetCore.Connections.ConnectionContext.Abort() -> void
+override Microsoft.AspNetCore.Connections.ConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Abort(Microsoft.AspNetCore.Connections.ConnectionAbortedException! abortReason) -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionClosed.get -> System.Threading.CancellationToken
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionClosed.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionId.get -> string!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.ConnectionId.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.DisposeAsync() -> System.Threading.Tasks.ValueTask
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Features.get -> Microsoft.AspNetCore.Http.Features.IFeatureCollection!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Items.get -> System.Collections.Generic.IDictionary<object!, object?>!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Items.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.LocalEndPoint.get -> System.Net.EndPoint?
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.LocalEndPoint.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.RemoteEndPoint.get -> System.Net.EndPoint?
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.RemoteEndPoint.set -> void
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Transport.get -> System.IO.Pipelines.IDuplexPipe!
+override Microsoft.AspNetCore.Connections.DefaultConnectionContext.Transport.set -> void
+override Microsoft.AspNetCore.Connections.UriEndPoint.ToString() -> string!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.Run(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder, System.Func<Microsoft.AspNetCore.Connections.ConnectionContext!, System.Threading.Tasks.Task!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.Use(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder, System.Func<Microsoft.AspNetCore.Connections.ConnectionContext!, System.Func<System.Threading.Tasks.Task!>!, System.Threading.Tasks.Task!>! middleware) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+static Microsoft.AspNetCore.Connections.ConnectionBuilderExtensions.UseConnectionHandler<TConnectionHandler>(this Microsoft.AspNetCore.Connections.IConnectionBuilder! connectionBuilder) -> Microsoft.AspNetCore.Connections.IConnectionBuilder!
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionClosed.get -> System.Threading.CancellationToken
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.ConnectionClosed.set -> void
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.DisposeAsync() -> System.Threading.Tasks.ValueTask
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.LocalEndPoint.get -> System.Net.EndPoint?
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.LocalEndPoint.set -> void
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.RemoteEndPoint.get -> System.Net.EndPoint?
+virtual Microsoft.AspNetCore.Connections.BaseConnectionContext.RemoteEndPoint.set -> void
diff --git a/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..553973838a
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/PublicAPI/netstandard2.1/PublicAPI.Unshipped.txt
@@ -0,0 +1,3 @@
+#nullable enable
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature
+Microsoft.AspNetCore.Connections.Features.IStreamClosedFeature.OnClosed(System.Action<object?>! callback, object? state) -> void
diff --git a/src/Servers/Connections.Abstractions/src/TlsConnectionCallbackContext.cs b/src/Servers/Connections.Abstractions/src/TlsConnectionCallbackContext.cs
new file mode 100644
index 0000000000..91aa617f4f
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/TlsConnectionCallbackContext.cs
@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#if NET7_0_OR_GREATER
+using System.Net.Security;
+using System.Threading;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Http.Features;
+
+namespace Microsoft.AspNetCore.Connections;
+
+/// <summary>
+/// Per connection state used to determine the TLS options.
+/// </summary>
+public class TlsConnectionCallbackContext
+{
+ /// <summary>
+ /// Information from the Client Hello message.
+ /// </summary>
+ public SslClientHelloInfo ClientHelloInfo { get; set; }
+
+ /// <summary>
+ /// The information that was passed when registering the callback.
+ /// </summary>
+ public object? State { get; set; }
+
+ /// <summary>
+ /// Information about an individual connection.
+ /// </summary>
+ public BaseConnectionContext Connection { get; set; } = default!;
+}
+#endif
diff --git a/src/Servers/Connections.Abstractions/src/TlsConnectionCallbackOptions.cs b/src/Servers/Connections.Abstractions/src/TlsConnectionCallbackOptions.cs
new file mode 100644
index 0000000000..05664f3c7b
--- /dev/null
+++ b/src/Servers/Connections.Abstractions/src/TlsConnectionCallbackOptions.cs
@@ -0,0 +1,33 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+#if NET7_0_OR_GREATER
+using System;
+using System.Collections.Generic;
+using System.Net.Security;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace Microsoft.AspNetCore.Connections;
+
+/// <summary>
+/// Options used to configure a per connection callback for TLS configuration.
+/// </summary>
+public class TlsConnectionCallbackOptions
+{
+ /// <summary>
+ /// The callback to invoke per connection. This property is required.
+ /// </summary>
+ public Func<TlsConnectionCallbackContext, CancellationToken, ValueTask<SslServerAuthenticationOptions>> OnConnection { get; set; } = default!;
+
+ /// <summary>
+ /// Optional application state to flow to the <see cref="OnConnection"/> callback.
+ /// </summary>
+ public object? OnConnectionState { get; set; }
+
+ /// <summary>
+ /// Gets or sets a list of ALPN protocols.
+ /// </summary>
+ public List<SslApplicationProtocol> ApplicationProtocols { get; set; } = default!;
+}
+#endif
diff --git a/src/Servers/HttpSys/src/ApplicationRequestContextFactory.cs b/src/Servers/HttpSys/src/ApplicationRequestContextFactory.cs
index 39e70aa22d..8a80b189ac 100644
--- a/src/Servers/HttpSys/src/ApplicationRequestContextFactory.cs
+++ b/src/Servers/HttpSys/src/ApplicationRequestContextFactory.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Hosting.Server;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal class ApplicationRequestContextFactory<TContext> : IRequestContextFactory where TContext : notnull
+internal sealed class ApplicationRequestContextFactory<TContext> : IRequestContextFactory where TContext : notnull
{
private readonly IHttpApplication<TContext> _application;
private readonly MessagePump _messagePump;
diff --git a/src/Servers/HttpSys/src/AsyncAcceptContext.cs b/src/Servers/HttpSys/src/AsyncAcceptContext.cs
index c5b5f5bef5..72131695ae 100644
--- a/src/Servers/HttpSys/src/AsyncAcceptContext.cs
+++ b/src/Servers/HttpSys/src/AsyncAcceptContext.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.HttpSys.Internal;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal unsafe class AsyncAcceptContext : IValueTaskSource<RequestContext>, IDisposable
+internal sealed unsafe class AsyncAcceptContext : IValueTaskSource<RequestContext>, IDisposable
{
private static readonly IOCompletionCallback IOCallback = IOWaitCallback;
private readonly PreAllocatedOverlapped _preallocatedOverlapped;
@@ -178,7 +178,7 @@ internal unsafe class AsyncAcceptContext : IValueTaskSource<RequestContext>, IDi
Dispose(true);
}
- protected virtual void Dispose(bool disposing)
+ private void Dispose(bool disposing)
{
if (disposing)
{
diff --git a/src/Servers/HttpSys/src/AuthenticationHandler.cs b/src/Servers/HttpSys/src/AuthenticationHandler.cs
index 0e6babbc7e..af6708c1cf 100644
--- a/src/Servers/HttpSys/src/AuthenticationHandler.cs
+++ b/src/Servers/HttpSys/src/AuthenticationHandler.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal class AuthenticationHandler : IAuthenticationHandler
+internal sealed class AuthenticationHandler : IAuthenticationHandler
{
private RequestContext? _requestContext;
private AuthenticationScheme? _scheme;
diff --git a/src/Servers/HttpSys/src/HttpSysListener.cs b/src/Servers/HttpSys/src/HttpSysListener.cs
index dcb9023007..dcc3812f60 100644
--- a/src/Servers/HttpSys/src/HttpSysListener.cs
+++ b/src/Servers/HttpSys/src/HttpSysListener.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys;
/// <summary>
/// An HTTP server wrapping the Http.Sys APIs that accepts requests.
/// </summary>
-internal partial class HttpSysListener : IDisposable
+internal sealed partial class HttpSysListener : IDisposable
{
// Win8# 559317 fixed a bug in Http.sys's HttpReceiveClientCertificate method.
// Without this fix IOCP callbacks were not being called although ERROR_IO_PENDING was
@@ -43,14 +43,8 @@ internal partial class HttpSysListener : IDisposable
public HttpSysListener(HttpSysOptions options, ILoggerFactory loggerFactory)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(loggerFactory);
if (!HttpApi.Supported)
{
@@ -77,9 +71,9 @@ internal partial class HttpSysListener : IDisposable
{
_serverSession = new ServerSession();
- _urlGroup = new UrlGroup(_serverSession, Logger);
+ _requestQueue = new RequestQueue(options.RequestQueueName, options.RequestQueueMode, Logger);
- _requestQueue = new RequestQueue(_urlGroup, options.RequestQueueName, options.RequestQueueMode, Logger);
+ _urlGroup = new UrlGroup(_serverSession, _requestQueue, Logger);
_disconnectListener = new DisconnectListener(_requestQueue, Logger);
}
@@ -147,12 +141,12 @@ internal partial class HttpSysListener : IDisposable
return;
}
- // If this instance created the queue then configure it.
- if (_requestQueue.Created)
+ // Always configure the UrlGroup if the intent was to create, only configure the queue if we actually created it
+ if (Options.RequestQueueMode == RequestQueueMode.Create || Options.RequestQueueMode == RequestQueueMode.CreateOrAttach)
{
- Options.Apply(UrlGroup, RequestQueue);
+ Options.Apply(UrlGroup, _requestQueue.Created ? RequestQueue : null);
- _requestQueue.AttachToUrlGroup();
+ UrlGroup.AttachToQueue();
// All resources are set up correctly. Now add all prefixes.
try
@@ -162,7 +156,7 @@ internal partial class HttpSysListener : IDisposable
catch (HttpSysException)
{
// If an error occurred while adding prefixes, free all resources allocated by previous steps.
- _requestQueue.DetachFromUrlGroup();
+ UrlGroup.DetachFromQueue();
throw;
}
}
@@ -194,11 +188,11 @@ internal partial class HttpSysListener : IDisposable
Log.ListenerStopping(Logger);
- // If this instance created the queue then remove the URL prefixes before shutting down.
- if (_requestQueue.Created)
+ // If this instance registered URL prefixes then remove them before shutting down.
+ if (Options.RequestQueueMode == RequestQueueMode.Create || Options.RequestQueueMode == RequestQueueMode.CreateOrAttach)
{
Options.UrlPrefixes.UnregisterAllPrefixes();
- _requestQueue.DetachFromUrlGroup();
+ UrlGroup.DetachFromQueue();
}
_state = State.Stopped;
@@ -418,9 +412,6 @@ internal partial class HttpSysListener : IDisposable
private void CheckDisposed()
{
- if (_state == State.Disposed)
- {
- throw new ObjectDisposedException(this.GetType().FullName);
- }
+ ObjectDisposedException.ThrowIf(_state == State.Disposed, this);
}
}
diff --git a/src/Servers/HttpSys/src/HttpSysOptions.cs b/src/Servers/HttpSys/src/HttpSysOptions.cs
index 8db5f9f039..f5eded3da0 100644
--- a/src/Servers/HttpSys/src/HttpSysOptions.cs
+++ b/src/Servers/HttpSys/src/HttpSysOptions.cs
@@ -238,7 +238,7 @@ public class HttpSysOptions
public bool UseLatin1RequestHeaders { get; set; }
// Not called when attaching to an existing queue.
- internal void Apply(UrlGroup urlGroup, RequestQueue requestQueue)
+ internal void Apply(UrlGroup urlGroup, RequestQueue? requestQueue)
{
_urlGroup = urlGroup;
_requestQueue = requestQueue;
@@ -248,14 +248,17 @@ public class HttpSysOptions
_urlGroup.SetMaxConnections(_maxConnections.Value);
}
- if (_requestQueueLength != DefaultRequestQueueLength)
+ if (_requestQueue is not null)
{
- _requestQueue.SetLengthLimit(_requestQueueLength);
- }
+ if (_requestQueueLength != DefaultRequestQueueLength)
+ {
+ _requestQueue.SetLengthLimit(_requestQueueLength);
+ }
- if (_rejectionVebosityLevel != DefaultRejectionVerbosityLevel)
- {
- _requestQueue.SetRejectionVerbosity(_rejectionVebosityLevel);
+ if (_rejectionVebosityLevel != DefaultRejectionVerbosityLevel)
+ {
+ _requestQueue.SetRejectionVerbosity(_rejectionVebosityLevel);
+ }
}
Authentication.SetUrlGroupSecurity(urlGroup);
diff --git a/src/Servers/HttpSys/src/MessagePump.cs b/src/Servers/HttpSys/src/MessagePump.cs
index 8420716c26..aab65b6a00 100644
--- a/src/Servers/HttpSys/src/MessagePump.cs
+++ b/src/Servers/HttpSys/src/MessagePump.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal partial class MessagePump : IServer
+internal sealed partial class MessagePump : IServer, IServerDelegationFeature
{
private readonly ILogger _logger;
private readonly HttpSysOptions _options;
@@ -30,14 +30,8 @@ internal partial class MessagePump : IServer
public MessagePump(IOptions<HttpSysOptions> options, ILoggerFactory loggerFactory, IAuthenticationSchemeProvider authentication)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(loggerFactory);
_options = options.Value;
Listener = new HttpSysListener(_options, loggerFactory);
_logger = loggerFactory.CreateLogger<MessagePump>();
@@ -53,8 +47,7 @@ internal partial class MessagePump : IServer
if (HttpApi.SupportsDelegation)
{
- var delegationProperty = new ServerDelegationPropertyFeature(Listener.RequestQueue, _logger);
- Features.Set<IServerDelegationFeature>(delegationProperty);
+ Features.Set<IServerDelegationFeature>(this);
}
_maxAccepts = _options.MaxAccepts;
@@ -70,10 +63,7 @@ internal partial class MessagePump : IServer
public Task StartAsync<TContext>(IHttpApplication<TContext> application, CancellationToken cancellationToken) where TContext : notnull
{
- if (application == null)
- {
- throw new ArgumentNullException(nameof(application));
- }
+ ArgumentNullException.ThrowIfNull(application);
var hostingUrlsPresent = _serverAddresses.Addresses.Count > 0;
var serverAddressCopy = _serverAddresses.Addresses.ToList();
@@ -271,6 +261,13 @@ internal partial class MessagePump : IServer
return _shutdownSignal.Task;
}
+ public DelegationRule CreateDelegationRule(string queueName, string uri)
+ {
+ var rule = new DelegationRule(Listener.UrlGroup, queueName, uri, _logger);
+ Listener.UrlGroup.SetDelegationProperty(rule.Queue);
+ return rule;
+ }
+
public void Dispose()
{
_stopping = 1;
diff --git a/src/Servers/HttpSys/src/NativeInterop/DisconnectListener.cs b/src/Servers/HttpSys/src/NativeInterop/DisconnectListener.cs
index 6093294c41..26f95d1367 100644
--- a/src/Servers/HttpSys/src/NativeInterop/DisconnectListener.cs
+++ b/src/Servers/HttpSys/src/NativeInterop/DisconnectListener.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal partial class DisconnectListener
+internal sealed partial class DisconnectListener
{
private readonly ConcurrentDictionary<ulong, ConnectionCancellation> _connectionCancellationTokens = new();
@@ -116,7 +116,7 @@ internal partial class DisconnectListener
return returnToken;
}
- private class ConnectionCancellation
+ private sealed class ConnectionCancellation
{
private readonly DisconnectListener _parent;
private volatile bool _initialized; // Must be volatile because initialization is synchronized
diff --git a/src/Servers/HttpSys/src/NativeInterop/HttpApi.cs b/src/Servers/HttpSys/src/NativeInterop/HttpApi.cs
index 8501fa4083..1582c12175 100644
--- a/src/Servers/HttpSys/src/NativeInterop/HttpApi.cs
+++ b/src/Servers/HttpSys/src/NativeInterop/HttpApi.cs
@@ -8,76 +8,77 @@ using static Microsoft.AspNetCore.HttpSys.Internal.HttpApiTypes;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal static unsafe class HttpApi
+internal static unsafe partial class HttpApi
{
private const string HTTPAPI = "httpapi.dll";
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpInitialize(HTTPAPI_VERSION version, uint flags, void* pReserved);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpInitialize(HTTPAPI_VERSION version, uint flags, void* pReserved);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpReceiveRequestEntityBody(SafeHandle requestQueueHandle, ulong requestId, uint flags, IntPtr pEntityBuffer, uint entityBufferLength, out uint bytesReturned, SafeNativeOverlapped pOverlapped);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpReceiveRequestEntityBody(SafeHandle requestQueueHandle, ulong requestId, uint flags, IntPtr pEntityBuffer, uint entityBufferLength, out uint bytesReturned, SafeNativeOverlapped pOverlapped);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpReceiveClientCertificate(SafeHandle requestQueueHandle, ulong connectionId, uint flags, HTTP_SSL_CLIENT_CERT_INFO* pSslClientCertInfo, uint sslClientCertInfoSize, uint* pBytesReceived, SafeNativeOverlapped pOverlapped);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpReceiveClientCertificate(SafeHandle requestQueueHandle, ulong connectionId, uint flags, HTTP_SSL_CLIENT_CERT_INFO* pSslClientCertInfo, uint sslClientCertInfoSize, uint* pBytesReceived, SafeNativeOverlapped pOverlapped);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpReceiveClientCertificate(SafeHandle requestQueueHandle, ulong connectionId, uint flags, byte* pSslClientCertInfo, uint sslClientCertInfoSize, uint* pBytesReceived, SafeNativeOverlapped pOverlapped);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpReceiveClientCertificate(SafeHandle requestQueueHandle, ulong connectionId, uint flags, byte* pSslClientCertInfo, uint sslClientCertInfoSize, uint* pBytesReceived, SafeNativeOverlapped pOverlapped);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpReceiveHttpRequest(SafeHandle requestQueueHandle, ulong requestId, uint flags, HTTP_REQUEST* pRequestBuffer, uint requestBufferLength, uint* pBytesReturned, NativeOverlapped* pOverlapped);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpReceiveHttpRequest(SafeHandle requestQueueHandle, ulong requestId, uint flags, HTTP_REQUEST* pRequestBuffer, uint requestBufferLength, uint* pBytesReturned, NativeOverlapped* pOverlapped);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpSendHttpResponse(SafeHandle requestQueueHandle, ulong requestId, uint flags, HTTP_RESPONSE_V2* pHttpResponse, HTTP_CACHE_POLICY* pCachePolicy, uint* pBytesSent, IntPtr pReserved1, uint Reserved2, SafeNativeOverlapped pOverlapped, IntPtr pLogData);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpSendHttpResponse(SafeHandle requestQueueHandle, ulong requestId, uint flags, HTTP_RESPONSE_V2* pHttpResponse, HTTP_CACHE_POLICY* pCachePolicy, uint* pBytesSent, IntPtr pReserved1, uint Reserved2, SafeNativeOverlapped pOverlapped, IntPtr pLogData);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpSendResponseEntityBody(SafeHandle requestQueueHandle, ulong requestId, uint flags, ushort entityChunkCount, HTTP_DATA_CHUNK* pEntityChunks, uint* pBytesSent, IntPtr pReserved1, uint Reserved2, SafeNativeOverlapped pOverlapped, IntPtr pLogData);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpSendResponseEntityBody(SafeHandle requestQueueHandle, ulong requestId, uint flags, ushort entityChunkCount, HTTP_DATA_CHUNK* pEntityChunks, uint* pBytesSent, IntPtr pReserved1, uint Reserved2, SafeNativeOverlapped pOverlapped, IntPtr pLogData);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpCancelHttpRequest(SafeHandle requestQueueHandle, ulong requestId, IntPtr pOverlapped);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpCancelHttpRequest(SafeHandle requestQueueHandle, ulong requestId, IntPtr pOverlapped);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpWaitForDisconnectEx(SafeHandle requestQueueHandle, ulong connectionId, uint reserved, NativeOverlapped* overlapped);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpWaitForDisconnectEx(SafeHandle requestQueueHandle, ulong connectionId, uint reserved, NativeOverlapped* overlapped);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpCreateServerSession(HTTPAPI_VERSION version, ulong* serverSessionId, uint reserved);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpCreateServerSession(HTTPAPI_VERSION version, ulong* serverSessionId, uint reserved);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpCreateUrlGroup(ulong serverSessionId, ulong* urlGroupId, uint reserved);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpCreateUrlGroup(ulong serverSessionId, ulong* urlGroupId, uint reserved);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
- internal static extern uint HttpFindUrlGroupId(string pFullyQualifiedUrl, SafeHandle requestQueueHandle, ulong* urlGroupId);
+ [LibraryImport(HTTPAPI, SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ internal static partial uint HttpFindUrlGroupId(string pFullyQualifiedUrl, SafeHandle requestQueueHandle, ulong* urlGroupId);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
- internal static extern uint HttpAddUrlToUrlGroup(ulong urlGroupId, string pFullyQualifiedUrl, ulong context, uint pReserved);
+ [LibraryImport(HTTPAPI, SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ internal static partial uint HttpAddUrlToUrlGroup(ulong urlGroupId, string pFullyQualifiedUrl, ulong context, uint pReserved);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpSetUrlGroupProperty(ulong urlGroupId, HTTP_SERVER_PROPERTY serverProperty, IntPtr pPropertyInfo, uint propertyInfoLength);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpSetUrlGroupProperty(ulong urlGroupId, HTTP_SERVER_PROPERTY serverProperty, IntPtr pPropertyInfo, uint propertyInfoLength);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
- internal static extern uint HttpRemoveUrlFromUrlGroup(ulong urlGroupId, string pFullyQualifiedUrl, uint flags);
+ [LibraryImport(HTTPAPI, SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ internal static partial uint HttpRemoveUrlFromUrlGroup(ulong urlGroupId, string pFullyQualifiedUrl, uint flags);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpCloseServerSession(ulong serverSessionId);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpCloseServerSession(ulong serverSessionId);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpCloseUrlGroup(ulong urlGroupId);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpCloseUrlGroup(ulong urlGroupId);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern uint HttpSetRequestQueueProperty(SafeHandle requestQueueHandle, HTTP_SERVER_PROPERTY serverProperty, IntPtr pPropertyInfo, uint propertyInfoLength, uint reserved, IntPtr pReserved);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static partial uint HttpSetRequestQueueProperty(SafeHandle requestQueueHandle, HTTP_SERVER_PROPERTY serverProperty, IntPtr pPropertyInfo, uint propertyInfoLength, uint reserved, IntPtr pReserved);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
- internal static extern unsafe uint HttpCreateRequestQueue(HTTPAPI_VERSION version, string? pName,
- UnsafeNclNativeMethods.SECURITY_ATTRIBUTES? pSecurityAttributes, HTTP_CREATE_REQUEST_QUEUE_FLAG flags, out HttpRequestQueueV2Handle pReqQueueHandle);
+ [LibraryImport(HTTPAPI, SetLastError = true, StringMarshalling = StringMarshalling.Utf16)]
+ internal static unsafe partial uint HttpCreateRequestQueue(HTTPAPI_VERSION version, string? pName,
+ IntPtr pSecurityAttributes, HTTP_CREATE_REQUEST_QUEUE_FLAG flags, out HttpRequestQueueV2Handle pReqQueueHandle);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern unsafe uint HttpCloseRequestQueue(IntPtr pReqQueueHandle);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static unsafe partial uint HttpCloseRequestQueue(IntPtr pReqQueueHandle);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern bool HttpIsFeatureSupported(HTTP_FEATURE_ID feature);
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static partial bool HttpIsFeatureSupported(HTTP_FEATURE_ID feature);
- [DllImport(HTTPAPI, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
- internal static extern unsafe uint HttpDelegateRequestEx(SafeHandle pReqQueueHandle, SafeHandle pDelegateQueueHandle, ulong requestId,
+ [LibraryImport(HTTPAPI, SetLastError = true)]
+ internal static unsafe partial uint HttpDelegateRequestEx(SafeHandle pReqQueueHandle, SafeHandle pDelegateQueueHandle, ulong requestId,
ulong delegateUrlGroupId, ulong propertyInfoSetSize, HTTP_DELEGATE_REQUEST_PROPERTY_INFO* pRequestPropertyBuffer);
internal delegate uint HttpSetRequestPropertyInvoker(SafeHandle requestQueueHandle, ulong requestId, HTTP_REQUEST_PROPERTY propertyId, void* input, uint inputSize, IntPtr overlapped);
diff --git a/src/Servers/HttpSys/src/NativeInterop/RequestQueue.cs b/src/Servers/HttpSys/src/NativeInterop/RequestQueue.cs
index eb235706b4..4330f40f86 100644
--- a/src/Servers/HttpSys/src/NativeInterop/RequestQueue.cs
+++ b/src/Servers/HttpSys/src/NativeInterop/RequestQueue.cs
@@ -10,26 +10,22 @@ namespace Microsoft.AspNetCore.Server.HttpSys;
internal sealed partial class RequestQueue
{
- private static readonly int BindingInfoSize =
- Marshal.SizeOf<HttpApiTypes.HTTP_BINDING_INFO>();
-
private readonly RequestQueueMode _mode;
private readonly ILogger _logger;
private bool _disposed;
internal RequestQueue(string requestQueueName, ILogger logger)
- : this(urlGroup: null, requestQueueName, RequestQueueMode.Attach, logger, receiver: true)
+ : this(requestQueueName, RequestQueueMode.Attach, logger, receiver: true)
{
}
- internal RequestQueue(UrlGroup urlGroup, string? requestQueueName, RequestQueueMode mode, ILogger logger)
- : this(urlGroup, requestQueueName, mode, logger, false)
+ internal RequestQueue(string? requestQueueName, RequestQueueMode mode, ILogger logger)
+ : this(requestQueueName, mode, logger, false)
{ }
- private RequestQueue(UrlGroup? urlGroup, string? requestQueueName, RequestQueueMode mode, ILogger logger, bool receiver)
+ private RequestQueue(string? requestQueueName, RequestQueueMode mode, ILogger logger, bool receiver)
{
_mode = mode;
- UrlGroup = urlGroup;
_logger = logger;
var flags = HttpApiTypes.HTTP_CREATE_REQUEST_QUEUE_FLAG.None;
@@ -48,7 +44,7 @@ internal sealed partial class RequestQueue
var statusCode = HttpApi.HttpCreateRequestQueue(
HttpApi.Version,
requestQueueName,
- null,
+ IntPtr.Zero,
flags,
out var requestQueueHandle);
@@ -60,7 +56,7 @@ internal sealed partial class RequestQueue
statusCode = HttpApi.HttpCreateRequestQueue(
HttpApi.Version,
requestQueueName,
- null,
+ IntPtr.Zero,
flags,
out requestQueueHandle);
}
@@ -106,55 +102,6 @@ internal sealed partial class RequestQueue
internal SafeHandle Handle { get; }
internal ThreadPoolBoundHandle BoundHandle { get; }
- internal UrlGroup? UrlGroup { get; }
-
- internal unsafe void AttachToUrlGroup()
- {
- if (UrlGroup == null)
- {
- throw new NotSupportedException("Can't attach when UrlGroup is null");
- }
-
- Debug.Assert(Created);
- CheckDisposed();
- // Set the association between request queue and url group. After this, requests for registered urls will
- // get delivered to this request queue.
-
- var info = new HttpApiTypes.HTTP_BINDING_INFO();
- info.Flags = HttpApiTypes.HTTP_FLAGS.HTTP_PROPERTY_FLAG_PRESENT;
- info.RequestQueueHandle = Handle.DangerousGetHandle();
-
- var infoptr = new IntPtr(&info);
-
- UrlGroup.SetProperty(HttpApiTypes.HTTP_SERVER_PROPERTY.HttpServerBindingProperty,
- infoptr, (uint)BindingInfoSize);
- }
-
- internal unsafe void DetachFromUrlGroup()
- {
- if (UrlGroup == null)
- {
- throw new NotSupportedException("Can't detach when UrlGroup is null");
- }
-
- Debug.Assert(Created);
- CheckDisposed();
- // Break the association between request queue and url group. After this, requests for registered urls
- // will get 503s.
- // Note that this method may be called multiple times (Stop() and then Abort()). This
- // is fine since http.sys allows to set HttpServerBindingProperty multiple times for valid
- // Url groups.
-
- var info = new HttpApiTypes.HTTP_BINDING_INFO();
- info.Flags = HttpApiTypes.HTTP_FLAGS.NONE;
- info.RequestQueueHandle = IntPtr.Zero;
-
- var infoptr = new IntPtr(&info);
-
- UrlGroup.SetProperty(HttpApiTypes.HTTP_SERVER_PROPERTY.HttpServerBindingProperty,
- infoptr, (uint)BindingInfoSize, throwOnError: false);
- }
-
// The listener must be active for this to work.
internal unsafe void SetLengthLimit(long length)
{
@@ -201,10 +148,7 @@ internal sealed partial class RequestQueue
private void CheckDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(this.GetType().FullName);
- }
+ ObjectDisposedException.ThrowIf(_disposed, this);
}
private static partial class Log
diff --git a/src/Servers/HttpSys/src/NativeInterop/SafeLibraryHandle.cs b/src/Servers/HttpSys/src/NativeInterop/SafeLibraryHandle.cs
index 8949d77de4..1f90207dee 100644
--- a/src/Servers/HttpSys/src/NativeInterop/SafeLibraryHandle.cs
+++ b/src/Servers/HttpSys/src/NativeInterop/SafeLibraryHandle.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys;
/// <summary>
/// Represents a handle to a Windows module (DLL).
/// </summary>
-internal sealed unsafe class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInvalid
+internal sealed unsafe partial class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInvalid
{
// Called by P/Invoke when returning SafeHandles
private SafeLibraryHandle()
@@ -70,25 +70,25 @@ internal sealed unsafe class SafeLibraryHandle : SafeHandleZeroOrMinusOneIsInval
}
[SuppressUnmanagedCodeSecurity]
- private static class UnsafeNativeMethods
+ private static partial class UnsafeNativeMethods
{
// http://msdn.microsoft.com/en-us/library/ms683152(v=vs.85).aspx
[return: MarshalAs(UnmanagedType.Bool)]
- [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)]
- internal static extern bool FreeLibrary(IntPtr hModule);
+ [LibraryImport("kernel32.dll")]
+ internal static partial bool FreeLibrary(IntPtr hModule);
// http://msdn.microsoft.com/en-us/library/ms683212(v=vs.85).aspx
- [DllImport("kernel32.dll", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- internal static extern IntPtr GetProcAddress(
- [In] SafeLibraryHandle hModule,
- [In, MarshalAs(UnmanagedType.LPStr)] string lpProcName);
+ [LibraryImport("kernel32.dll", SetLastError = true)]
+ internal static partial IntPtr GetProcAddress(
+ SafeLibraryHandle hModule,
+ [MarshalAs(UnmanagedType.LPStr)] string lpProcName);
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
- [DllImport("kernel32.dll", EntryPoint = "LoadLibraryExW", CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- internal static extern SafeLibraryHandle LoadLibraryEx(
- [In, MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
- [In] IntPtr hFile,
- [In] uint dwFlags);
+ [LibraryImport("kernel32.dll", EntryPoint = "LoadLibraryExW", SetLastError = true)]
+ internal static partial SafeLibraryHandle LoadLibraryEx(
+ [MarshalAs(UnmanagedType.LPWStr)] string lpFileName,
+ IntPtr hFile,
+ uint dwFlags);
internal static void ThrowExceptionForLastWin32Error()
{
diff --git a/src/Servers/HttpSys/src/NativeInterop/ServerSession.cs b/src/Servers/HttpSys/src/NativeInterop/ServerSession.cs
index df4cb3d3c8..a1cff3fc39 100644
--- a/src/Servers/HttpSys/src/NativeInterop/ServerSession.cs
+++ b/src/Servers/HttpSys/src/NativeInterop/ServerSession.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.HttpSys.Internal;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal class ServerSession : IDisposable
+internal sealed class ServerSession : IDisposable
{
internal unsafe ServerSession()
{
diff --git a/src/Servers/HttpSys/src/NativeInterop/UrlGroup.cs b/src/Servers/HttpSys/src/NativeInterop/UrlGroup.cs
index 06ebd23a8b..dbde24640e 100644
--- a/src/Servers/HttpSys/src/NativeInterop/UrlGroup.cs
+++ b/src/Servers/HttpSys/src/NativeInterop/UrlGroup.cs
@@ -8,8 +8,10 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal partial class UrlGroup : IDisposable
+internal sealed partial class UrlGroup : IDisposable
{
+ private static readonly int BindingInfoSize =
+ Marshal.SizeOf<HttpApiTypes.HTTP_BINDING_INFO>();
private static readonly int QosInfoSize =
Marshal.SizeOf<HttpApiTypes.HTTP_QOS_SETTING_INFO>();
private static readonly int RequestPropertyInfoSize =
@@ -18,12 +20,14 @@ internal partial class UrlGroup : IDisposable
private readonly ILogger _logger;
private readonly ServerSession? _serverSession;
+ private readonly RequestQueue _requestQueue;
private bool _disposed;
private readonly bool _created;
- internal unsafe UrlGroup(ServerSession serverSession, ILogger logger)
+ internal unsafe UrlGroup(ServerSession serverSession, RequestQueue requestQueue, ILogger logger)
{
_serverSession = serverSession;
+ _requestQueue = requestQueue;
_logger = logger;
ulong urlGroupId = 0;
@@ -91,6 +95,41 @@ internal partial class UrlGroup : IDisposable
}
}
+ internal unsafe void AttachToQueue()
+ {
+ CheckDisposed();
+ // Set the association between request queue and url group. After this, requests for registered urls will
+ // get delivered to this request queue.
+
+ var info = new HttpApiTypes.HTTP_BINDING_INFO();
+ info.Flags = HttpApiTypes.HTTP_FLAGS.HTTP_PROPERTY_FLAG_PRESENT;
+ info.RequestQueueHandle = _requestQueue.Handle.DangerousGetHandle();
+
+ var infoptr = new IntPtr(&info);
+
+ SetProperty(HttpApiTypes.HTTP_SERVER_PROPERTY.HttpServerBindingProperty,
+ infoptr, (uint)BindingInfoSize);
+ }
+
+ internal unsafe void DetachFromQueue()
+ {
+ CheckDisposed();
+ // Break the association between request queue and url group. After this, requests for registered urls
+ // will get 503s.
+ // Note that this method may be called multiple times (Stop() and then Abort()). This
+ // is fine since http.sys allows to set HttpServerBindingProperty multiple times for valid
+ // Url groups.
+
+ var info = new HttpApiTypes.HTTP_BINDING_INFO();
+ info.Flags = HttpApiTypes.HTTP_FLAGS.NONE;
+ info.RequestQueueHandle = IntPtr.Zero;
+
+ var infoptr = new IntPtr(&info);
+
+ SetProperty(HttpApiTypes.HTTP_SERVER_PROPERTY.HttpServerBindingProperty,
+ infoptr, (uint)BindingInfoSize, throwOnError: false);
+ }
+
internal void RegisterPrefix(string uriPrefix, int contextId)
{
Log.RegisteringPrefix(_logger, uriPrefix);
@@ -101,6 +140,22 @@ internal partial class UrlGroup : IDisposable
{
if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_ALREADY_EXISTS)
{
+ // If we didn't create the queue and the uriPrefix already exists, confirm it exists for the
+ // queue we attached to, if so we are all good, otherwise throw an already registered error.
+ if (!_requestQueue.Created)
+ {
+ unsafe
+ {
+ ulong urlGroupId;
+ var findUrlStatusCode = HttpApi.HttpFindUrlGroupId(uriPrefix, _requestQueue.Handle, &urlGroupId);
+ if (findUrlStatusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS)
+ {
+ // Already registered for the desired queue, all good
+ return;
+ }
+ }
+ }
+
throw new HttpSysException((int)statusCode, Resources.FormatException_PrefixAlreadyRegistered(uriPrefix));
}
if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_ACCESS_DENIED)
@@ -111,18 +166,12 @@ internal partial class UrlGroup : IDisposable
}
}
- internal bool UnregisterPrefix(string uriPrefix)
+ internal void UnregisterPrefix(string uriPrefix)
{
Log.UnregisteringPrefix(_logger, uriPrefix);
CheckDisposed();
- var statusCode = HttpApi.HttpRemoveUrlFromUrlGroup(Id, uriPrefix, 0);
-
- if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_NOT_FOUND)
- {
- return false;
- }
- return true;
+ HttpApi.HttpRemoveUrlFromUrlGroup(Id, uriPrefix, 0);
}
public void Dispose()
@@ -153,9 +202,6 @@ internal partial class UrlGroup : IDisposable
private void CheckDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(this.GetType().FullName);
- }
+ ObjectDisposedException.ThrowIf(_disposed, this);
}
}
diff --git a/src/Servers/HttpSys/src/RequestProcessing/OpaqueStream.cs b/src/Servers/HttpSys/src/RequestProcessing/OpaqueStream.cs
index 0e7008281d..76a04c0905 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/OpaqueStream.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/OpaqueStream.cs
@@ -5,7 +5,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys;
// A duplex wrapper around RequestStream and ResponseStream.
// TODO: Consider merging RequestStream and ResponseStream instead.
-internal class OpaqueStream : Stream
+internal sealed class OpaqueStream : Stream
{
private readonly Stream _requestStream;
private readonly Stream _responseStream;
diff --git a/src/Servers/HttpSys/src/RequestProcessing/Request.cs b/src/Servers/HttpSys/src/RequestProcessing/Request.cs
index 3156683abf..d0fb349f32 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/Request.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/Request.cs
@@ -250,7 +250,7 @@ internal sealed partial class Request
public string Scheme => IsHttps ? Constants.HttpsScheme : Constants.HttpScheme;
// HTTP.Sys allows you to upgrade anything to opaque unless content-length > 0 or chunked are specified.
- internal bool IsUpgradable => ProtocolVersion < HttpVersion.Version20 && !HasEntityBody && ComNetOS.IsWin8orLater;
+ internal bool IsUpgradable => ProtocolVersion == HttpVersion.Version11 && !HasEntityBody && ComNetOS.IsWin8orLater;
internal WindowsPrincipal User { get; }
diff --git a/src/Servers/HttpSys/src/RequestProcessing/RequestContext.FeatureCollection.cs b/src/Servers/HttpSys/src/RequestProcessing/RequestContext.FeatureCollection.cs
index fe3aa0c501..adf0fa35e3 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/RequestContext.FeatureCollection.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/RequestContext.FeatureCollection.cs
@@ -434,10 +434,7 @@ internal partial class RequestContext :
void IHttpResponseFeature.OnStarting(Func<object, Task> callback, object state)
{
- if (callback == null)
- {
- throw new ArgumentNullException(nameof(callback));
- }
+ ArgumentNullException.ThrowIfNull(callback);
if (_onStartingActions == null)
{
throw new InvalidOperationException("Cannot register new callbacks, the response has already started.");
@@ -448,10 +445,7 @@ internal partial class RequestContext :
void IHttpResponseFeature.OnCompleted(Func<object, Task> callback, object state)
{
- if (callback == null)
- {
- throw new ArgumentNullException(nameof(callback));
- }
+ ArgumentNullException.ThrowIfNull(callback);
if (_onCompletedActions == null)
{
throw new InvalidOperationException("Cannot register new callbacks, the response has already completed.");
diff --git a/src/Servers/HttpSys/src/RequestProcessing/RequestContext.cs b/src/Servers/HttpSys/src/RequestProcessing/RequestContext.cs
index 6b39296569..6493488a5b 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/RequestContext.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/RequestContext.cs
@@ -87,7 +87,11 @@ internal partial class RequestContext : NativeRequestContext, IThreadPoolWorkIte
{
if (!IsUpgradableRequest)
{
- throw new InvalidOperationException("This request cannot be upgraded, it is incompatible.");
+ if (Request.ProtocolVersion != System.Net.HttpVersion.Version11)
+ {
+ throw new InvalidOperationException("Upgrade requires HTTP/1.1.");
+ }
+ throw new InvalidOperationException("This request cannot be upgraded because it has a body.");
}
if (Response.HasStarted)
{
@@ -254,15 +258,11 @@ internal partial class RequestContext : NativeRequestContext, IThreadPoolWorkIte
{
Response.StatusCode = status;
Response.ContentLength = 0;
- Dispose();
}
internal unsafe void Delegate(DelegationRule destination)
{
- if (destination == null)
- {
- throw new ArgumentNullException(nameof(destination));
- }
+ ArgumentNullException.ThrowIfNull(destination);
if (Request.HasRequestBodyStarted)
{
throw new InvalidOperationException("This request cannot be delegated, the request body has already started.");
diff --git a/src/Servers/HttpSys/src/RequestProcessing/RequestContextOfT.cs b/src/Servers/HttpSys/src/RequestProcessing/RequestContextOfT.cs
index 016190fd3a..6d7eecab82 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/RequestContextOfT.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/RequestContextOfT.cs
@@ -32,10 +32,12 @@ internal sealed partial class RequestContext<TContext> : RequestContext where TC
if (messagePump.Stopping)
{
SetFatalResponse(503);
+ Dispose();
return;
}
TContext? context = default;
+ Exception? applicationException = null;
messagePump.IncrementOutstandingRequest();
try
{
@@ -49,16 +51,12 @@ internal sealed partial class RequestContext<TContext> : RequestContext where TC
{
await OnCompleted();
}
- application.DisposeContext(context, null);
- Dispose();
}
catch (Exception ex)
{
+ applicationException = ex;
+
Log.RequestProcessError(Logger, ex);
- if (context != null)
- {
- application.DisposeContext(context, ex);
- }
if (Response.HasStarted)
{
// Otherwise the default is Cancel = 0x8 (h2) or 0x010c (h3).
@@ -94,11 +92,18 @@ internal sealed partial class RequestContext<TContext> : RequestContext where TC
}
finally
{
+ if (context != null)
+ {
+ application.DisposeContext(context, applicationException);
+ }
+
if (messagePump.DecrementOutstandingRequest() == 0 && messagePump.Stopping)
{
Log.RequestsDrained(Logger);
messagePump.SetShutdownSignal();
}
+
+ Dispose();
}
}
catch (Exception ex)
diff --git a/src/Servers/HttpSys/src/RequestProcessing/RequestStream.cs b/src/Servers/HttpSys/src/RequestProcessing/RequestStream.cs
index 1460ffcec4..50afac9bb3 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/RequestStream.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/RequestStream.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.HttpSys;
#pragma warning disable CA1844 // Provide memory-based overrides of async methods when subclassing 'Stream'. Fixing this is too gnarly.
-internal partial class RequestStream : Stream
+internal sealed partial class RequestStream : Stream
#pragma warning restore CA1844 // Provide memory-based overrides of async methods when subclassing 'Stream'
{
private const int MaxReadSize = 0x20000; // http.sys recommends we limit reads to 128k
@@ -96,15 +96,12 @@ internal partial class RequestStream : Stream
private static void ValidateReadBuffer(byte[] buffer, int offset, int size)
{
- if (buffer == null)
- {
- throw new ArgumentNullException(nameof(buffer));
- }
- if (offset < 0 || offset > buffer.Length)
+ ArgumentNullException.ThrowIfNull(buffer);
+ if ((uint)offset > (uint)buffer.Length)
{
throw new ArgumentOutOfRangeException(nameof(offset), offset, string.Empty);
}
- if (size <= 0 || size > buffer.Length - offset)
+ if ((uint)size > (uint)(buffer.Length - offset))
{
throw new ArgumentOutOfRangeException(nameof(size), size, string.Empty);
}
@@ -161,7 +158,14 @@ internal partial class RequestStream : Stream
dataRead += extraDataRead;
}
- if (statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_HANDLE_EOF)
+
+ // Zero-byte reads
+ if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_MORE_DATA && size == 0)
+ {
+ // extraDataRead returns 1 to let us know there's data available. Don't count it against the request body size yet.
+ dataRead = 0;
+ }
+ else if (statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_HANDLE_EOF)
{
Exception exception = new IOException(string.Empty, new HttpSysException((int)statusCode));
Log.ErrorWhileRead(Logger, exception);
@@ -181,7 +185,8 @@ internal partial class RequestStream : Stream
internal void UpdateAfterRead(uint statusCode, uint dataRead)
{
- if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_HANDLE_EOF || dataRead == 0)
+ if (statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_HANDLE_EOF
+ || statusCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_MORE_DATA && dataRead == 0)
{
Dispose();
}
@@ -242,7 +247,7 @@ internal partial class RequestStream : Stream
cancellationRegistration = RequestContext.RegisterForCancellation(cancellationToken);
}
- asyncResult = new RequestStreamAsyncResult(this, null, null, buffer, offset, dataRead, cancellationRegistration);
+ asyncResult = new RequestStreamAsyncResult(this, null, null, buffer, offset, size, dataRead, cancellationRegistration);
uint bytesReturned;
try
diff --git a/src/Servers/HttpSys/src/RequestProcessing/RequestStreamAsyncResult.cs b/src/Servers/HttpSys/src/RequestProcessing/RequestStreamAsyncResult.cs
index c4bd842d43..63871580b4 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/RequestStreamAsyncResult.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/RequestStreamAsyncResult.cs
@@ -7,44 +7,30 @@ using Microsoft.AspNetCore.HttpSys.Internal;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal unsafe class RequestStreamAsyncResult : IAsyncResult, IDisposable
+internal sealed unsafe class RequestStreamAsyncResult : IAsyncResult, IDisposable
{
private static readonly IOCompletionCallback IOCallback = new IOCompletionCallback(Callback);
private readonly SafeNativeOverlapped? _overlapped;
private readonly IntPtr _pinnedBuffer;
+ private readonly int _size;
private readonly uint _dataAlreadyRead;
private readonly TaskCompletionSource<int> _tcs;
private readonly RequestStream _requestStream;
private readonly AsyncCallback? _callback;
private readonly CancellationTokenRegistration _cancellationRegistration;
- internal RequestStreamAsyncResult(RequestStream requestStream, object? userState, AsyncCallback? callback)
+ internal RequestStreamAsyncResult(RequestStream requestStream, object? userState, AsyncCallback? callback, byte[] buffer, int offset, int size, uint dataAlreadyRead, CancellationTokenRegistration cancellationRegistration)
{
_requestStream = requestStream;
_tcs = new TaskCompletionSource<int>(userState);
_callback = callback;
- }
-
- internal RequestStreamAsyncResult(RequestStream requestStream, object? userState, AsyncCallback? callback, uint dataAlreadyRead)
- : this(requestStream, userState, callback)
- {
- _dataAlreadyRead = dataAlreadyRead;
- }
-
- internal RequestStreamAsyncResult(RequestStream requestStream, object? userState, AsyncCallback? callback, byte[] buffer, int offset, uint dataAlreadyRead)
- : this(requestStream, userState, callback, buffer, offset, dataAlreadyRead, new CancellationTokenRegistration())
- {
- }
-
- internal RequestStreamAsyncResult(RequestStream requestStream, object? userState, AsyncCallback? callback, byte[] buffer, int offset, uint dataAlreadyRead, CancellationTokenRegistration cancellationRegistration)
- : this(requestStream, userState, callback)
- {
_dataAlreadyRead = dataAlreadyRead;
var boundHandle = requestStream.RequestContext.Server.RequestQueue.BoundHandle;
_overlapped = new SafeNativeOverlapped(boundHandle,
boundHandle.AllocateNativeOverlapped(IOCallback, this, buffer));
_pinnedBuffer = (Marshal.UnsafeAddrOfPinnedArrayElement(buffer, offset));
+ _size = size;
_cancellationRegistration = cancellationRegistration;
}
@@ -83,7 +69,13 @@ internal unsafe class RequestStreamAsyncResult : IAsyncResult, IDisposable
{
try
{
- if (errorCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && errorCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_HANDLE_EOF)
+ // Zero-byte reads
+ if (errorCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_MORE_DATA && asyncResult._size == 0)
+ {
+ // numBytes returns 1 to let us know there's data available. Don't count it against the request body size yet.
+ asyncResult.Complete(0, errorCode);
+ }
+ else if (errorCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS && errorCode != UnsafeNclNativeMethods.ErrorCodes.ERROR_HANDLE_EOF)
{
asyncResult.Fail(new IOException(string.Empty, new HttpSysException((int)errorCode)));
}
@@ -154,7 +146,7 @@ internal unsafe class RequestStreamAsyncResult : IAsyncResult, IDisposable
Dispose(true);
}
- protected virtual void Dispose(bool disposing)
+ private void Dispose(bool disposing)
{
if (disposing)
{
diff --git a/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs b/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs
index cc5fdd614c..214f0f2856 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/ResponseBody.cs
@@ -524,10 +524,7 @@ internal sealed partial class ResponseBody : Stream
public override void EndWrite(IAsyncResult asyncResult)
{
- if (asyncResult == null)
- {
- throw new ArgumentNullException(nameof(asyncResult));
- }
+ ArgumentNullException.ThrowIfNull(asyncResult);
TaskToApm.End(asyncResult);
}
@@ -726,10 +723,7 @@ internal sealed partial class ResponseBody : Stream
private void CheckDisposed()
{
- if (_disposed)
- {
- throw new ObjectDisposedException(GetType().FullName);
- }
+ ObjectDisposedException.ThrowIf(_disposed, this);
}
private static partial class Log
diff --git a/src/Servers/HttpSys/src/RequestProcessing/ResponseStreamAsyncResult.cs b/src/Servers/HttpSys/src/RequestProcessing/ResponseStreamAsyncResult.cs
index 8d2b57fa5f..63f1de475c 100644
--- a/src/Servers/HttpSys/src/RequestProcessing/ResponseStreamAsyncResult.cs
+++ b/src/Servers/HttpSys/src/RequestProcessing/ResponseStreamAsyncResult.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.HttpSys.Internal;
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal unsafe partial class ResponseStreamAsyncResult : IAsyncResult, IDisposable
+internal sealed unsafe partial class ResponseStreamAsyncResult : IAsyncResult, IDisposable
{
private static readonly IOCompletionCallback IOCallback = new IOCompletionCallback(Callback);
diff --git a/src/Servers/HttpSys/src/ResponseStream.cs b/src/Servers/HttpSys/src/ResponseStream.cs
index 3483df2963..21e47ea531 100644
--- a/src/Servers/HttpSys/src/ResponseStream.cs
+++ b/src/Servers/HttpSys/src/ResponseStream.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.HttpSys;
-internal class ResponseStream : Stream
+internal sealed class ResponseStream : Stream
{
private readonly Stream _innerStream;
private readonly Func<Task> _onStart;
diff --git a/src/Servers/HttpSys/src/ServerDelegationPropertyFeature.cs b/src/Servers/HttpSys/src/ServerDelegationPropertyFeature.cs
deleted file mode 100644
index ccdb71c174..0000000000
--- a/src/Servers/HttpSys/src/ServerDelegationPropertyFeature.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using Microsoft.Extensions.Logging;
-
-namespace Microsoft.AspNetCore.Server.HttpSys;
-
-internal class ServerDelegationPropertyFeature : IServerDelegationFeature
-{
- private readonly ILogger _logger;
- private readonly UrlGroup _urlGroup;
-
- public ServerDelegationPropertyFeature(RequestQueue queue, ILogger logger)
- {
- if (queue.UrlGroup == null)
- {
- throw new ArgumentException($"{nameof(queue)}.UrlGroup can't be null");
- }
-
- _urlGroup = queue.UrlGroup;
- _logger = logger;
- }
-
- public DelegationRule CreateDelegationRule(string queueName, string uri)
- {
- var rule = new DelegationRule(_urlGroup, queueName, uri, _logger);
- _urlGroup.SetDelegationProperty(rule.Queue);
- return rule;
- }
-}
diff --git a/src/Servers/HttpSys/src/WebHostBuilderHttpSysExtensions.cs b/src/Servers/HttpSys/src/WebHostBuilderHttpSysExtensions.cs
index 0111d6169e..fb0feaa236 100644
--- a/src/Servers/HttpSys/src/WebHostBuilderHttpSysExtensions.cs
+++ b/src/Servers/HttpSys/src/WebHostBuilderHttpSysExtensions.cs
@@ -28,7 +28,12 @@ public static class WebHostBuilderHttpSysExtensions
{
return hostBuilder.ConfigureServices(services =>
{
- services.AddSingleton<IServer, MessagePump>();
+ services.AddSingleton<MessagePump>();
+ services.AddSingleton<IServer>(services => services.GetRequiredService<MessagePump>());
+ if (HttpApi.SupportsDelegation)
+ {
+ services.AddSingleton<IServerDelegationFeature>(services => services.GetRequiredService<MessagePump>());
+ }
services.AddTransient<AuthenticationHandler>();
services.AddSingleton<IServerIntegratedAuth>(services =>
{
diff --git a/src/Servers/HttpSys/test/FunctionalTests/DelegateTests.cs b/src/Servers/HttpSys/test/FunctionalTests/DelegateTests.cs
index b3db093023..420a1f0e11 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/DelegateTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/DelegateTests.cs
@@ -3,9 +3,13 @@
using System.Net.Http;
using System.Runtime.InteropServices;
+using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.HttpSys.Internal;
using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests;
@@ -15,6 +19,21 @@ public class DelegateTests
[ConditionalFact]
[DelegateSupportedCondition(true)]
+ public void IServerDelegationFeature_IsAvailableFromServices()
+ {
+ var builder = new HostBuilder();
+ builder.ConfigureWebHost(webHost =>
+ {
+ webHost.UseHttpSys();
+ });
+ using var host = builder.Build();
+ var server = host.Services.GetRequiredService<IServer>();
+ var delegationFeature = host.Services.GetRequiredService<IServerDelegationFeature>();
+ Assert.Same(server, delegationFeature);
+ }
+
+ [ConditionalFact]
+ [DelegateSupportedCondition(true)]
public async Task DelegateRequestTest()
{
var queueName = Guid.NewGuid().ToString();
@@ -227,9 +246,7 @@ public class DelegateTests
// Stop the receiver
receiver?.Dispose();
- // Start the receiver again but this time we need to attach to the existing queue.
- // Due to https://github.com/dotnet/aspnetcore/issues/40359, we have to manually
- // register URL prefixes and attach the server's queue to them.
+ // Start the receiver again but this time we need to use CreateOrAttach to attach to the existing queue and setup the UrlPrefixes
using var receiverRestarted = (MessagePump)Utilities.CreateHttpServer(out receiverAddress, async httpContext =>
{
await httpContext.Response.WriteAsync(_expectedResponseString);
@@ -237,12 +254,10 @@ public class DelegateTests
options =>
{
options.RequestQueueName = queueName;
- options.RequestQueueMode = RequestQueueMode.Attach;
+ options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
options.UrlPrefixes.Clear();
options.UrlPrefixes.Add(receiverAddress);
});
- AttachToUrlGroup(receiverRestarted.Listener.RequestQueue);
- receiverRestarted.Listener.Options.UrlPrefixes.RegisterAllPrefixes(receiverRestarted.Listener.UrlGroup);
responseString = await SendRequestAsync(delegatorAddress);
Assert.Equal(_expectedResponseString, responseString);
@@ -250,18 +265,6 @@ public class DelegateTests
destination?.Dispose();
}
- private unsafe void AttachToUrlGroup(RequestQueue requestQueue)
- {
- var info = new HttpApiTypes.HTTP_BINDING_INFO();
- info.Flags = HttpApiTypes.HTTP_FLAGS.HTTP_PROPERTY_FLAG_PRESENT;
- info.RequestQueueHandle = requestQueue.Handle.DangerousGetHandle();
-
- var infoptr = new IntPtr(&info);
-
- requestQueue.UrlGroup.SetProperty(HttpApiTypes.HTTP_SERVER_PROPERTY.HttpServerBindingProperty,
- infoptr, (uint)Marshal.SizeOf<HttpApiTypes.HTTP_BINDING_INFO>());
- }
-
private async Task<string> SendRequestAsync(string uri)
{
using var client = new HttpClient();
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Http2Tests.cs b/src/Servers/HttpSys/test/FunctionalTests/Http2Tests.cs
index 101224c7e4..93dc7f15ab 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Http2Tests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Http2Tests.cs
@@ -11,6 +11,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Http2Cat;
+using Microsoft.AspNetCore.Server;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Hosting;
@@ -48,7 +49,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -79,17 +80,17 @@ public class Http2Tests : LoggedTest
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
};
await h2Connection.StartStreamAsync(1, headers, endStream: true);
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("411", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("411", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -129,17 +130,17 @@ public class Http2Tests : LoggedTest
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
};
await h2Connection.StartStreamAsync(1, headers, endStream: true);
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -179,10 +180,10 @@ public class Http2Tests : LoggedTest
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>(HeaderNames.ContentLength, "11"),
};
@@ -199,7 +200,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -244,10 +245,10 @@ public class Http2Tests : LoggedTest
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
};
await h2Connection.StartStreamAsync(1, headers, endStream: false);
@@ -263,7 +264,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -298,7 +299,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -336,7 +337,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
// Send and receive a second request to ensure there is no GoAway frame on the wire yet.
@@ -347,7 +348,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
await h2Connection.StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
@@ -383,7 +384,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -422,7 +423,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -462,7 +463,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -479,7 +480,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -498,7 +499,7 @@ public class Http2Tests : LoggedTest
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -529,7 +530,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("500", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -562,7 +563,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var resetFrame = await h2Connection.ReceiveFrameAsync();
@@ -594,7 +595,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var frame = await h2Connection.ReceiveFrameAsync();
@@ -723,7 +724,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var resetFrame = await h2Connection.ReceiveFrameAsync();
@@ -770,7 +771,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -822,7 +823,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -837,7 +838,6 @@ public class Http2Tests : LoggedTest
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/29126")]
[MinimumOSVersion(OperatingSystems.Windows, VersionForReset)]
public async Task Reset_BeforeRequestBody_Resets()
{
@@ -884,7 +884,6 @@ public class Http2Tests : LoggedTest
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/29126")]
[MinimumOSVersion(OperatingSystems.Windows, VersionForReset)]
public async Task Reset_DurringRequestBody_Resets()
{
@@ -977,7 +976,7 @@ public class Http2Tests : LoggedTest
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Http3Tests.cs b/src/Servers/HttpSys/test/FunctionalTests/Http3Tests.cs
index 569b06045c..e97a59ecdc 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Http3Tests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Http3Tests.cs
@@ -174,8 +174,9 @@ public class Http3Tests
client.DefaultRequestVersion = HttpVersion.Version30;
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
- Assert.Equal(0x010b, qex.ErrorCode);
+ var qex = Assert.IsType<QuicException>(ex.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x010b, qex.ApplicationErrorCode.Value);
}
[ConditionalFact]
@@ -206,8 +207,9 @@ public class Http3Tests
headersReceived.SetResult();
response.EnsureSuccessStatusCode();
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
- Assert.Equal(0x010c, qex.ErrorCode);
+ var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x010c, qex.ApplicationErrorCode.Value);
}
[ConditionalFact]
@@ -231,8 +233,9 @@ public class Http3Tests
headersReceived.SetResult();
response.EnsureSuccessStatusCode();
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
- Assert.Equal(0x0102, qex.ErrorCode); // H3_INTERNAL_ERROR
+ var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x0102, qex.ApplicationErrorCode.Value); // H3_INTERNAL_ERROR
}
[ConditionalFact]
@@ -251,7 +254,8 @@ public class Http3Tests
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
- Assert.Equal(0x010c, qex.ErrorCode); // H3_REQUEST_CANCELLED
+ var qex = Assert.IsType<QuicException>(ex.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x010c, qex.ApplicationErrorCode.Value); // H3_REQUEST_CANCELLED
}
}
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/AuthenticationOnExistingQueueTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/AuthenticationOnExistingQueueTests.cs
index aa16185862..8e1d611801 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Listener/AuthenticationOnExistingQueueTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/AuthenticationOnExistingQueueTests.cs
@@ -10,7 +10,37 @@ using Xunit;
namespace Microsoft.AspNetCore.Server.HttpSys.Listener;
-public class AuthenticationOnExistingQueueTests
+public class AuthenticationOnExistingQueueTests_Attach : AuthenticationOnExistingQueueTests
+{
+ protected override string ConfigureServer(HttpSysOptions options, string baseServerAddress)
+ {
+ options.RequestQueueMode = RequestQueueMode.Attach;
+ return baseServerAddress;
+ }
+}
+
+public class AuthenticationOnExistingQueueTests_CreateOrAttach_UseExistingUrlPrefix : AuthenticationOnExistingQueueTests
+{
+ protected override string ConfigureServer(HttpSysOptions options, string baseServerAddress)
+ {
+ options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
+ return baseServerAddress;
+ }
+}
+
+public class AuthenticationOnExistingQueueTests_CreateOrAttach_UseNewUrlPrefix : AuthenticationOnExistingQueueTests
+{
+ protected override string ConfigureServer(HttpSysOptions options, string baseServerAddress)
+ {
+ options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
+ var basePrefix = UrlPrefix.Create(baseServerAddress);
+ var prefix = UrlPrefix.Create(basePrefix.Scheme, basePrefix.Host, basePrefix.Port, "/server");
+ options.UrlPrefixes.Add(prefix);
+ return prefix.ToString();
+ }
+}
+
+public abstract class AuthenticationOnExistingQueueTests
{
private static readonly bool AllowAnoymous = true;
private static readonly bool DenyAnoymous = false;
@@ -24,8 +54,8 @@ public class AuthenticationOnExistingQueueTests
[InlineData(AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM | /*AuthenticationSchemes.Digest |*/ AuthenticationSchemes.Basic)]
public async Task AuthTypes_AllowAnonymous_NoChallenge(AuthenticationSchemes authType)
{
- using var baseServer = Utilities.CreateHttpAuthServer(authType, AllowAnoymous, out var address);
- using var server = Utilities.CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer.Options.RequestQueueName);
+ using var baseServer = CreateHttpAuthServer(authType, AllowAnoymous);
+ using var server = CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer, out var address);
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
@@ -47,8 +77,8 @@ public class AuthenticationOnExistingQueueTests
[InlineData(AuthenticationSchemes.Basic)]
public async Task AuthType_RequireAuth_ChallengesAdded(AuthenticationSchemes authType)
{
- using var baseServer = Utilities.CreateHttpAuthServer(authType, DenyAnoymous, out var address);
- using var server = Utilities.CreateServerOnExistingQueue(authType, DenyAnoymous, baseServer.Options.RequestQueueName);
+ using var baseServer = CreateHttpAuthServer(authType, DenyAnoymous);
+ using var server = CreateServerOnExistingQueue(authType, DenyAnoymous, baseServer, out var address);
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
@@ -65,8 +95,8 @@ public class AuthenticationOnExistingQueueTests
[InlineData(AuthenticationSchemes.Basic)]
public async Task AuthType_AllowAnonymousButSpecify401_ChallengesAdded(AuthenticationSchemes authType)
{
- using var baseServer = Utilities.CreateHttpAuthServer(authType, AllowAnoymous, out var address);
- using var server = Utilities.CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer.Options.RequestQueueName);
+ using var baseServer = CreateHttpAuthServer(authType, AllowAnoymous);
+ using var server = CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer, out var address);
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
@@ -90,8 +120,8 @@ public class AuthenticationOnExistingQueueTests
| AuthenticationSchemes.NTLM
/* | AuthenticationSchemes.Digest TODO: Not implemented */
| AuthenticationSchemes.Basic;
- using var baseServer = Utilities.CreateHttpAuthServer(authType, AllowAnoymous, out var address);
- using var server = Utilities.CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer.Options.RequestQueueName);
+ using var baseServer = CreateHttpAuthServer(authType, AllowAnoymous);
+ using var server = CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer, out var address);
Task<HttpResponseMessage> responseTask = SendRequestAsync(address);
@@ -115,8 +145,8 @@ public class AuthenticationOnExistingQueueTests
[InlineData(AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM | /*AuthenticationType.Digest |*/ AuthenticationSchemes.Basic)]
public async Task AuthTypes_AllowAnonymousButSpecify401_Success(AuthenticationSchemes authType)
{
- using var baseServer = Utilities.CreateHttpAuthServer(authType, AllowAnoymous, out var address);
- using var server = Utilities.CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer.Options.RequestQueueName);
+ using var baseServer = CreateHttpAuthServer(authType, AllowAnoymous);
+ using var server = CreateServerOnExistingQueue(authType, AllowAnoymous, baseServer, out var address);
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, useDefaultCredentials: true);
@@ -145,8 +175,8 @@ public class AuthenticationOnExistingQueueTests
[InlineData(AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM | /*AuthenticationType.Digest |*/ AuthenticationSchemes.Basic)]
public async Task AuthTypes_RequireAuth_Success(AuthenticationSchemes authType)
{
- using var baseServer = Utilities.CreateHttpAuthServer(authType, DenyAnoymous, out var address);
- using var server = Utilities.CreateServerOnExistingQueue(authType, DenyAnoymous, baseServer.Options.RequestQueueName);
+ using var baseServer = CreateHttpAuthServer(authType, DenyAnoymous);
+ using var server = CreateServerOnExistingQueue(authType, DenyAnoymous, baseServer, out var address);
Task<HttpResponseMessage> responseTask = SendRequestAsync(address, useDefaultCredentials: true);
@@ -160,6 +190,32 @@ public class AuthenticationOnExistingQueueTests
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
+ protected abstract string ConfigureServer(HttpSysOptions options, string baseServerAddress);
+
+ private HttpSysListener CreateHttpAuthServer(AuthenticationSchemes authType, bool allowAnonymous)
+ {
+ var server = Utilities.CreateDynamicHttpServer("/baseServer", out var root, out var baseAddress);
+ server.Options.Authentication.Schemes = authType;
+ server.Options.Authentication.AllowAnonymous = allowAnonymous;
+ return server;
+ }
+
+ private HttpSysListener CreateServerOnExistingQueue(AuthenticationSchemes authScheme, bool allowAnonymos, HttpSysListener baseServer, out string address)
+ {
+ string serverAddress = null;
+ var baseServerAddress = baseServer.Options.UrlPrefixes.First().ToString();
+ var server = Utilities.CreateServer(options =>
+ {
+ options.RequestQueueName = baseServer.Options.RequestQueueName;
+ options.Authentication.Schemes = authScheme;
+ options.Authentication.AllowAnonymous = allowAnonymos;
+ serverAddress = ConfigureServer(options, baseServerAddress);
+ });
+
+ address = serverAddress;
+ return server;
+ }
+
private async Task<HttpResponseMessage> SendRequestAsync(string uri, bool useDefaultCredentials = false)
{
HttpClientHandler handler = new HttpClientHandler();
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerOnExistingQueueTests.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerOnExistingQueueTests.cs
index 0d62957ee3..932a398ace 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerOnExistingQueueTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/ServerOnExistingQueueTests.cs
@@ -6,6 +6,7 @@ using System.IO;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.AspNetCore.HttpSys.Internal;
using Microsoft.AspNetCore.Testing;
using Xunit;
@@ -232,6 +233,88 @@ public class ServerOnExistingQueueTests
Assert.Equal(string.Empty, response);
}
+ [ConditionalFact]
+ public async Task Server_CreateOrAttach_NoUrlPrefix_NewUrlPrefixWorks()
+ {
+ var queueName = Guid.NewGuid().ToString();
+
+ // Create a queue without a UrlGroup or any UrlPrefixes
+ HttpRequestQueueV2Handle requestQueueHandle = null;
+ var statusCode = HttpApi.HttpCreateRequestQueue(
+ HttpApi.Version,
+ queueName,
+ IntPtr.Zero,
+ 0,
+ out requestQueueHandle);
+
+ Assert.True(statusCode == UnsafeNclNativeMethods.ErrorCodes.ERROR_SUCCESS);
+
+ using var server = Utilities.CreateServer(options =>
+ {
+ options.RequestQueueName = queueName;
+ options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
+ options.UrlPrefixes.Add("http://localhost:0");
+ });
+
+ var address = server.Options.UrlPrefixes.First().FullPrefix;
+
+ var responseTask = SendRequestAsync(address);
+
+ var context = await server.AcceptAsync(Utilities.DefaultTimeout);
+ context.Dispose();
+
+ var response = await responseTask;
+ Assert.Equal(string.Empty, response);
+ }
+
+ [ConditionalFact]
+ public async Task Server_CreateOrAttach_UrlPrefixExist_ExistingUrlPrefixWorks()
+ {
+ using var baseServer = Utilities.CreateHttpServer(out var address);
+ using var server = Utilities.CreateServer(options =>
+ {
+ options.RequestQueueName = baseServer.Options.RequestQueueName;
+ options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
+ options.UrlPrefixes.Add(address);
+ });
+
+ var responseTask = SendRequestAsync(address);
+
+ var context = await server.AcceptAsync(Utilities.DefaultTimeout);
+ context.Dispose();
+
+ var response = await responseTask;
+ Assert.Equal(string.Empty, response);
+ }
+
+ [ConditionalFact]
+ public async Task Server_CreateOrAttach_UrlPrefixExist_NewAndExistingUrlPrefixsWork()
+ {
+ using var baseServer = Utilities.CreateHttpServerReturnRoot("/baseServer", out string rootAddress);
+ using var server = Utilities.CreateServer(options =>
+ {
+ options.RequestQueueName = baseServer.Options.RequestQueueName;
+ options.RequestQueueMode = RequestQueueMode.CreateOrAttach;
+ options.UrlPrefixes.Add(rootAddress + "/server");
+ });
+
+ var responseTask = SendRequestAsync(rootAddress + "/baseServer");
+
+ var context = await server.AcceptAsync(Utilities.DefaultTimeout);
+ context.Dispose();
+
+ var response = await responseTask;
+ Assert.Equal(string.Empty, response);
+
+ responseTask = SendRequestAsync(rootAddress + "/server");
+
+ context = await server.AcceptAsync(Utilities.DefaultTimeout);
+ context.Dispose();
+
+ response = await responseTask;
+ Assert.Equal(string.Empty, response);
+ }
+
private async Task<string> SendRequestAsync(string uri)
{
using HttpClient client = new HttpClient();
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Listener/Utilities.cs b/src/Servers/HttpSys/test/FunctionalTests/Listener/Utilities.cs
index 696fce6f82..15664bf821 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Listener/Utilities.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/Listener/Utilities.cs
@@ -22,14 +22,6 @@ internal static class Utilities
internal static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(15);
- internal static HttpSysListener CreateHttpAuthServer(AuthenticationSchemes authType, bool allowAnonymous, out string baseAddress)
- {
- var listener = CreateHttpServer(out baseAddress);
- listener.Options.Authentication.Schemes = authType;
- listener.Options.Authentication.AllowAnonymous = allowAnonymous;
- return listener;
- }
-
internal static HttpSysListener CreateHttpServer(out string baseAddress)
{
string root;
@@ -90,23 +82,24 @@ internal static class Utilities
return listener;
}
- internal static HttpSysListener CreateServerOnExistingQueue(string requestQueueName)
- {
- return CreateServerOnExistingQueue(AuthenticationSchemes.None, true, requestQueueName);
- }
-
- internal static HttpSysListener CreateServerOnExistingQueue(AuthenticationSchemes authScheme, bool allowAnonymos, string requestQueueName)
+ internal static HttpSysListener CreateServer(Action<HttpSysOptions> configureOptions)
{
var options = new HttpSysOptions();
- options.RequestQueueMode = RequestQueueMode.Attach;
- options.RequestQueueName = requestQueueName;
- options.Authentication.Schemes = authScheme;
- options.Authentication.AllowAnonymous = allowAnonymos;
+ configureOptions(options);
var listener = new HttpSysListener(options, new LoggerFactory());
listener.Start();
return listener;
}
+ internal static HttpSysListener CreateServerOnExistingQueue(string requestQueueName)
+ {
+ return CreateServer(options =>
+ {
+ options.RequestQueueName = requestQueueName;
+ options.RequestQueueMode = RequestQueueMode.Attach;
+ });
+ }
+
/// <summary>
/// AcceptAsync extension with timeout. This extension should be used in all tests to prevent
/// unexpected hangs when a request does not arrive.
diff --git a/src/Servers/HttpSys/test/FunctionalTests/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests.csproj b/src/Servers/HttpSys/test/FunctionalTests/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests.csproj
index 46c820b85d..ab93eb41f5 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests.csproj
+++ b/src/Servers/HttpSys/test/FunctionalTests/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests.csproj
@@ -4,14 +4,11 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<TestGroupName>HttpSys.FunctionalTests</TestGroupName>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <!-- Required for System.Net.Quic which has a preview API in .NET 7 -->
+ <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>
- <!-- Required for QUIC & HTTP/3 in .NET 6 - https://github.com/dotnet/runtime/pull/55332 -->
- <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
- </ItemGroup>
-
- <ItemGroup>
<Compile Include="$(SharedSourceRoot)runtime\Http2\**\*.cs" LinkBase="Shared\Http2\" />
<Compile Include="$(SharedSourceRoot)runtime\IHttpStreamHeadersHandler.cs" LinkBase="Shared\IHttpStreamHeadersHandler.cs" />
<Compile Include="$(SharedSourceRoot)runtime\SR.cs" LinkBase="Shared\SR.cs" />
@@ -20,6 +17,7 @@
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Shared\" />
<Compile Remove="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Remove="$(SharedSourceRoot)ServerInfrastructure\StringUtilities.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Linkbase="shared"/>
<Compile Include="$(KestrelSharedSourceRoot)test\TestResources.cs" LinkBase="shared" />
<Content Include="$(KestrelSharedSourceRoot)test\TestCertificates\*.pfx" LinkBase="shared\TestCertificates" CopyToOutputDirectory="PreserveNewest" />
<Compile Include="$(KestrelSharedSourceRoot)test\TransportTestHelpers\MsQuicSupportedAttribute.cs" LinkBase="shared\" />
diff --git a/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs b/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs
index a5bbf69542..79041a7d24 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/OpaqueUpgradeTests.cs
@@ -301,6 +301,70 @@ public class OpaqueUpgradeTests
}
}
+ [ConditionalFact]
+ [MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8)]
+ public async Task OpaqueUpgrade_Http10_ThrowsIfUpgraded()
+ {
+ var upgrade = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ using (Utilities.CreateHttpServer(out string address, async httpContext =>
+ {
+ var opaqueFeature = httpContext.Features.Get<IHttpUpgradeFeature>();
+ Assert.NotNull(opaqueFeature);
+ Assert.False(opaqueFeature.IsUpgradableRequest);
+ try
+ {
+ await opaqueFeature.UpgradeAsync();
+ }
+ catch (Exception ex)
+ {
+ upgrade.TrySetException(ex);
+ throw;
+ }
+ upgrade.TrySetResult();
+ }))
+ {
+ // Connect with a socket
+ Uri uri = new Uri(address);
+ TcpClient client = new TcpClient();
+
+ try
+ {
+ await client.ConnectAsync(uri.Host, uri.Port);
+ NetworkStream stream = client.GetStream();
+
+ // Send an HTTP GET request
+ StringBuilder builder = new StringBuilder();
+ builder.Append("GET");
+ builder.Append(" ");
+ builder.Append(uri.PathAndQuery);
+ builder.Append(" HTTP/1.0");
+ builder.AppendLine();
+
+ builder.Append("Host: ");
+ builder.Append(uri.Host);
+ builder.Append(':');
+ builder.Append(uri.Port);
+ builder.AppendLine();
+
+ builder.AppendLine();
+ var requestBytes = Encoding.ASCII.GetBytes(builder.ToString());
+ await stream.WriteAsync(requestBytes, 0, requestBytes.Length);
+
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => upgrade.Task);
+ Assert.Equal("Upgrade requires HTTP/1.1.", ex.Message);
+
+ // Read the response headers, fail if it's not a 101
+ ex = await Assert.ThrowsAsync<InvalidOperationException>(() => ParseResponseAsync(stream));
+ Assert.EndsWith("HTTP/1.1 500 Internal Server Error", ex.Message);
+ }
+ catch (Exception)
+ {
+ ((IDisposable)client).Dispose();
+ throw;
+ }
+ }
+ }
+
private async Task<HttpResponseMessage> SendRequestAsync(string uri)
{
using (HttpClient client = new HttpClient())
diff --git a/src/Servers/HttpSys/test/FunctionalTests/RequestBodyTests.cs b/src/Servers/HttpSys/test/FunctionalTests/RequestBodyTests.cs
index bc2d77e264..c29cc7fe8f 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/RequestBodyTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/RequestBodyTests.cs
@@ -40,6 +40,28 @@ public class RequestBodyTests
}
[ConditionalFact]
+ public async Task RequestBody_Read0ByteSync_Success()
+ {
+ string address;
+ using (Utilities.CreateHttpServer(out address, httpContext =>
+ {
+ Assert.True(httpContext.Request.CanHaveBody());
+ byte[] input = new byte[100];
+ httpContext.Features.Get<IHttpBodyControlFeature>().AllowSynchronousIO = true;
+ int read = httpContext.Request.Body.Read(input, 0, 0);
+ Assert.Equal(0, read);
+ read = httpContext.Request.Body.Read(input, 0, input.Length);
+ httpContext.Response.ContentLength = read;
+ httpContext.Response.Body.Write(input, 0, read);
+ return Task.FromResult(0);
+ }))
+ {
+ string response = await SendRequestAsync(address, "Hello World");
+ Assert.Equal("Hello World", response);
+ }
+ }
+
+ [ConditionalFact]
public async Task RequestBody_ReadAsync_Success()
{
string address;
@@ -58,6 +80,26 @@ public class RequestBodyTests
}
[ConditionalFact]
+ public async Task RequestBody_Read0ByteAsync_Success()
+ {
+ string address;
+ using (Utilities.CreateHttpServer(out address, async httpContext =>
+ {
+ Assert.True(httpContext.Request.CanHaveBody());
+ byte[] input = new byte[100];
+ int read = await httpContext.Request.Body.ReadAsync(input, 0, 0);
+ Assert.Equal(0, read);
+ read = await httpContext.Request.Body.ReadAsync(input, 0, input.Length);
+ httpContext.Response.ContentLength = read;
+ await httpContext.Response.Body.WriteAsync(input, 0, read);
+ }))
+ {
+ string response = await SendRequestAsync(address, "Hello World");
+ Assert.Equal("Hello World", response);
+ }
+ }
+
+ [ConditionalFact]
public async Task RequestBody_ReadBeginEnd_Success()
{
string address;
@@ -87,7 +129,6 @@ public class RequestBodyTests
Assert.Throws<ArgumentOutOfRangeException>("offset", () => httpContext.Request.Body.Read(input, -1, 1));
Assert.Throws<ArgumentOutOfRangeException>("offset", () => httpContext.Request.Body.Read(input, input.Length + 1, 1));
Assert.Throws<ArgumentOutOfRangeException>("size", () => httpContext.Request.Body.Read(input, 10, -1));
- Assert.Throws<ArgumentOutOfRangeException>("size", () => httpContext.Request.Body.Read(input, 0, 0));
Assert.Throws<ArgumentOutOfRangeException>("size", () => httpContext.Request.Body.Read(input, 1, input.Length));
Assert.Throws<ArgumentOutOfRangeException>("size", () => httpContext.Request.Body.Read(input, 0, input.Length + 1));
return Task.FromResult(0);
diff --git a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
index 39c1553a70..2731b109e3 100644
--- a/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
+++ b/src/Servers/HttpSys/test/FunctionalTests/ServerTests.cs
@@ -36,8 +36,10 @@ public class ServerTests
}
}
- [ConditionalFact]
- public async Task Server_ConnectExistingQueueName_Success()
+ [ConditionalTheory]
+ [InlineData(RequestQueueMode.Attach)]
+ [InlineData(RequestQueueMode.CreateOrAttach)]
+ public async Task Server_ConnectExistingQueueName_Success(RequestQueueMode queueMode)
{
string address;
var queueName = Guid.NewGuid().ToString();
@@ -47,7 +49,7 @@ public class ServerTests
var statusCode = HttpApi.HttpCreateRequestQueue(
HttpApi.Version,
queueName,
- null,
+ IntPtr.Zero,
0,
out requestQueueHandle);
@@ -60,7 +62,7 @@ public class ServerTests
}, options =>
{
options.RequestQueueName = queueName;
- options.RequestQueueMode = RequestQueueMode.Attach;
+ options.RequestQueueMode = queueMode;
}))
{
var psi = new ProcessStartInfo("netsh", "http show servicestate view=requestq")
@@ -71,6 +73,20 @@ public class ServerTests
process.Start();
var netshOutput = await process.StandardOutput.ReadToEndAsync();
Assert.Contains(queueName, netshOutput);
+
+ var prefix = UrlPrefix.Create(address);
+ switch (queueMode)
+ {
+ case RequestQueueMode.Attach:
+ Assert.Equal("0", prefix.Port);
+
+ break;
+ case RequestQueueMode.CreateOrAttach:
+ Assert.NotEqual("0", prefix.Port);
+ Assert.Contains(address, netshOutput, StringComparison.OrdinalIgnoreCase);
+
+ break;
+ }
}
}
@@ -587,8 +603,10 @@ public class ServerTests
}
}
- [ConditionalFact]
- public async Task Server_AttachToExistingQueue_NoIServerAddresses_NoDefaultAdded()
+ [ConditionalTheory]
+ [InlineData(RequestQueueMode.Attach)]
+ [InlineData(RequestQueueMode.CreateOrAttach)]
+ public async Task Server_AttachToExistingQueue_NoIServerAddresses_NoDefaultAdded(RequestQueueMode queueMode)
{
var queueName = Guid.NewGuid().ToString();
using var server = Utilities.CreateHttpServer(out var address, httpContext => Task.CompletedTask, options =>
@@ -598,7 +616,7 @@ public class ServerTests
using var attachedServer = Utilities.CreatePump(options =>
{
options.RequestQueueName = queueName;
- options.RequestQueueMode = RequestQueueMode.Attach;
+ options.RequestQueueMode = queueMode;
});
await attachedServer.StartAsync(new DummyApplication(context => Task.CompletedTask), default);
var addressesFeature = attachedServer.Features.Get<IServerAddressesFeature>();
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
index a2f1d77683..85cb5b4902 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
+++ b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj
@@ -85,10 +85,7 @@
<ResourceCompile Include="HtmlResponses.rc" />
</ItemGroup>
<ItemGroup>
- <None Include="InProcessShimStaticHtml.htm">
- <DeploymentContent>true</DeploymentContent>
- </None>
- <None Include="OutOfProcessShimStaticHtml.htm">
+ <None Include="ancm_error_page.htm">
<DeploymentContent>true</DeploymentContent>
</None>
</ItemGroup>
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc
index d923a2121c..5e587ec7e2 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc
+++ b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc
Binary files differ
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm
deleted file mode 100644
index a9e6d96c75..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm
+++ /dev/null
@@ -1,80 +0,0 @@
-<!DOCTYPE html>
-<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8" />
- <title> HTTP Error %d.%d - %s </title>
- <style>
- body {
- font-family: 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;
- font-size: .813em;
- color: #222;
- background-color: #fff;
- }
-
- h1, h2, h3, h4, h5 {
- /*font-family: 'Segoe UI',Tahoma,Arial,Helvetica,sans-serif;*/
- font-weight: 100;
- }
-
- h1 {
- color: #44525e;
- margin: 15px 0 15px 0;
- }
-
- h2 {
- margin: 10px 5px 0 0;
- }
-
- h3 {
- color: #363636;
- margin: 5px 5px 0 0;
- }
-
- code {
- font-family: Consolas, "Courier New", courier, monospace;
- }
-
- body .titleerror {
- padding: 3px 3px 6px 3px;
- display: block;
- font-size: 1.5em;
- font-weight: 100;
- }
-
- a {
- color: #1ba1e2;
- text-decoration: none;
- }
-
- a:hover {
- color: #13709e;
- text-decoration: underline;
- }
-
- li {
- margin: 5px;
- }
-
- </style>
- </head>
- <body>
- <h1> HTTP Error %d.%d - %s </h1>
-
- %s
-
- %s
-
- <h2> Troubleshooting steps: </h2>
-
- <ul>
- <li> Check the system event log for error messages </li>
- <li> Enable logging the application process' stdout messages </li>
- <li> Attach a debugger to the application process and inspect </li>
- </ul>
-
- <h2>
- For more information visit:
- %s <a href="https://go.microsoft.com/fwlink/?LinkID=2028526"> <cite> https://go.microsoft.com/fwlink/?LinkID=2028526 </cite> </a>
- </h2>
- </body>
-</html>
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm
deleted file mode 100644
index b15ed7dccb..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html>
-<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8" />
- <title> HTTP Error %d.%d - %s </title>
- <style>
- body {
- font-family: 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;
- font-size: .813em;
- color: #222;
- background-color: #fff;
- }
-
- h1, h2, h3, h4, h5 {
- /*font-family: 'Segoe UI',Tahoma,Arial,Helvetica,sans-serif;*/
- font-weight: 100;
- }
-
- h1 {
- color: #44525e;
- margin: 15px 0 15px 0;
- }
-
- h2 {
- margin: 10px 5px 0 0;
- }
-
- h3 {
- color: #363636;
- margin: 5px 5px 0 0;
- }
-
- code {
- font-family: Consolas, "Courier New", courier, monospace;
- }
-
- body .titleerror {
- padding: 3px 3px 6px 3px;
- display: block;
- font-size: 1.5em;
- font-weight: 100;
- }
-
- a {
- color: #1ba1e2;
- text-decoration: none;
- }
-
- a:hover {
- color: #13709e;
- text-decoration: underline;
- }
-
- li {
- margin: 5px;
- }
-
- </style>
- </head>
- <body>
- <h1> HTTP Error %d.%d - %s </h1>
-
- %s
-
- %s
-
- <h2> Troubleshooting steps: </h2>
- <ul>
- <li> Check the system event log for error messages </li>
- <li> Enable logging the application process' stdout messages </li>
- <li> Attach a debugger to the application process and inspect </li>
- </ul>
-
- <h2>
- For more information visit:
- %s <a href="https://go.microsoft.com/fwlink/?LinkID=2028526"> <cite> https://go.microsoft.com/fwlink/?LinkID=2028526 </cite> </a>
- </h2>
- </body>
-</html>
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/ancm_error_page.htm
index 8783b58adb..b8720028c4 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm
+++ b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/ancm_error_page.htm
@@ -72,9 +72,8 @@
</ul>
<h2>
- For more information visit:
- %s <a href="https://go.microsoft.com/fwlink/?LinkID=2028265"> <cite> https://go.microsoft.com/fwlink/?LinkID=2028265 </cite></a>
+ For more guidance on diagnosing and handling these errors, visit
+ %s <a href="https://go.microsoft.com/fwlink/?LinkID=2028526"> <cite>Troubleshoot ASP.NET Core on Azure App Service and IIS</cite></a>.
</h2>
-
</body>
</html>
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp
index b592c0dcb1..cecd62a326 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp
+++ b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp
@@ -113,7 +113,7 @@ APPLICATION_INFO::CreateApplication(IHttpContext& pHttpContext)
pHttpApplication.GetApplicationId(),
hr);
- auto page = options.QueryHostingModel() == HOSTING_IN_PROCESS ? IN_PROCESS_SHIM_STATIC_HTML : OUT_OF_PROCESS_SHIM_STATIC_HTML;
+ auto page = ANCM_ERROR_PAGE;
std::string responseContent;
if (options.QueryShowDetailedErrors())
{
@@ -253,22 +253,22 @@ APPLICATION_INFO::ShutDownApplication(const bool fServerInitiated)
/* Overview of shadow copy logic when enabled. See https://github.com/dotnet/aspnetcore/pull/28357 for more context
- * On first request, ANCM goes through its startup sequence, starting dotnet and sending the request into managed code. During this sequence,
+ * On first request, ANCM goes through its startup sequence, starting dotnet and sending the request into managed code. During this sequence,
* ANCM will copy the contents of the app directory to another directory which is user specified. The path to this directory can be absolute or relative.
- * Logs and log files will be written to the app directory rather than the shadow copy directory. app_offline will also only be watched in the app directory.
+ * Logs and log files will be written to the app directory rather than the shadow copy directory. app_offline will also only be watched in the app directory.
* The current directory will be set to the app directory as well as the AppContext.BaseDirectory.
- * On publish of new content to the app directory, ANCM will start debouncing file change notifications for dlls, waiting for a steady state.
- * This is done by resetting a timer each time a dll is changed, eventually triggering the timer once there are no dll changes. Afterwards, shutdown is started,
+ * On publish of new content to the app directory, ANCM will start debouncing file change notifications for dlls, waiting for a steady state.
+ * This is done by resetting a timer each time a dll is changed, eventually triggering the timer once there are no dll changes. Afterwards, shutdown is started,
* causing the process to recycle.
- * Subfolders are created under the user specified shadowCopyDirectory, where the highest int value directory name will be used each time.
- * It will start at subdirectory with name '0' and increment from there. On shutdown, because dlls are still locked by the running process,
- * we need to copy dlls to a different directory than what is currently running in the app. So in the case where the directory name is '0',
+ * Subfolders are created under the user specified shadowCopyDirectory, where the highest int value directory name will be used each time.
+ * It will start at subdirectory with name '0' and increment from there. On shutdown, because dlls are still locked by the running process,
+ * we need to copy dlls to a different directory than what is currently running in the app. So in the case where the directory name is '0',
* we will create a directory name '1' and write the contents there. Then on app start, it will pick the directory name '1' as it's the highest value.
- * Other directories in the shadow copy directory will be cleaned up as well. Following the example, after '1' has been selected as the directory to use,
+ * Other directories in the shadow copy directory will be cleaned up as well. Following the example, after '1' has been selected as the directory to use,
* we will start a thread that deletes all other folders in that directory.
*/
std::filesystem::path
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/resource.h b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/resource.h
index 289df99bc3..4bd70c3b97 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/resource.h
+++ b/src/Servers/IIS/AspNetCoreModuleV2/AspNetCore/resource.h
@@ -2,13 +2,11 @@
// Microsoft Visual C++ generated include file.
// Used by HtmlResponses.rc
//
-#define IN_PROCESS_SHIM_STATIC_HTML 101
-#define OUT_OF_PROCESS_SHIM_STATIC_HTML 102
-#define UNKNOWN_HOSTING_STATIC_HTML 103
+#define ANCM_ERROR_PAGE 101
// Next default values for new objects
-//
+//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 104
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/CommonLib/file_utility.h b/src/Servers/IIS/AspNetCoreModuleV2/CommonLib/file_utility.h
index fc3ce8935b..9eeebb7fed 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/CommonLib/file_utility.h
+++ b/src/Servers/IIS/AspNetCoreModuleV2/CommonLib/file_utility.h
@@ -28,19 +28,19 @@ public:
static
std::string
- GetHtml(HMODULE module, int page, USHORT statusCode, USHORT subStatusCode, const std::string& speicificReasonPhrase, const std::string& solution);
+ GetHtml(HMODULE module, int page, USHORT statusCode, USHORT subStatusCode, const std::string& specificReasonPhrase, const std::string& solution);
static
std::string
- GetHtml(HMODULE module, int page, USHORT statusCode, USHORT subStatusCode, const std::string& speicificReasonPhrase, const std::string& solution, const std::string& error);
+ GetHtml(HMODULE module, int page, USHORT statusCode, USHORT subStatusCode, const std::string& specificReasonPhrase, const std::string& solution, const std::string& error);
private:
+
static
HRESULT
IsPathUnc(
__in LPCWSTR pszPath,
__out BOOL * pfIsUnc
);
-
};
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/CommonLibTests/CommonLibTests.vcxproj b/src/Servers/IIS/AspNetCoreModuleV2/CommonLibTests/CommonLibTests.vcxproj
index b5fdfb8064..e85b795c68 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/CommonLibTests/CommonLibTests.vcxproj
+++ b/src/Servers/IIS/AspNetCoreModuleV2/CommonLibTests/CommonLibTests.vcxproj
@@ -3,45 +3,11 @@
<BuildHelixPayload>false</BuildHelixPayload>
</PropertyGroup>
- <ItemGroup Label="ProjectConfigurations">
- <ProjectConfiguration Include="Debug|Win32">
- <Configuration>Debug</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|x64">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|ARM64">
- <Configuration>Debug</Configuration>
- <Platform>ARM64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Debug|Any CPU">
- <Configuration>Debug</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Win32">
- <Configuration>Release</Configuration>
- <Platform>Win32</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|x64">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|ARM64">
- <Configuration>Release</Configuration>
- <Platform>ARM64</Platform>
- </ProjectConfiguration>
- <ProjectConfiguration Include="Release|Any CPU">
- <Configuration>Release</Configuration>
- <Platform>x64</Platform>
- </ProjectConfiguration>
- </ItemGroup>
+ <Import Project="..\..\build\Config.Definitions.Props" />
+
<PropertyGroup Label="Globals">
<ProjectGuid>{1eac8125-1765-4e2d-8cbe-56dc98a1c8c1}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
- <WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.18362.0</WindowsTargetPlatformVersion>
- <PlatformToolsetVersion Condition=" '$(PlatformToolsetVersion)' == '' ">v142</PlatformToolsetVersion>
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>$(PlatformToolsetVersion)</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
@@ -49,9 +15,6 @@
<DisableArcadeTestFramework>true</DisableArcadeTestFramework>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
- <PropertyGroup Label="Configuration">
- <VCToolsVersion>14.29.30133</VCToolsVersion>
- </PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings" />
<ImportGroup Label="Shared" />
@@ -140,4 +103,4 @@
</ItemDefinitionGroup>
-</Project> \ No newline at end of file
+</Project>
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc
index 969377c22b..458e3bd1f8 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc
+++ b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc
@@ -24,18 +24,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// TEXTINCLUDE
//
-1 TEXTINCLUDE
+1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
-2 TEXTINCLUDE
+2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
-3 TEXTINCLUDE
+3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
@@ -49,7 +49,7 @@ END
// HTML
//
-IN_PROCESS_RH_STATIC_HTML HTML "InProcessRhStaticHtml.htm"
+ANCM_ERROR_PAGE HTML "..\\..\\AspNetCoreModuleV2\\AspNetCore\\ancm_error_page.htm"
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
index 70918feda3..131099756f 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
+++ b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj
@@ -59,7 +59,7 @@
<ResourceCompile Include="inprocessrequesthandler.rc" />
</ItemGroup>
<ItemGroup>
- <None Include="InProcessRhStaticHtml.htm">
+ <None Include="..\..\AspNetCore\ancm_error_page.htm">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Source.def" />
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h
deleted file mode 100644
index 1d0f3b7cc9..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright (c) Microsoft Corporation. All rights reserved.
-// Licensed under the MIT License. See License.txt in the project root for license information.
-
-#pragma once
-
-#include "requesthandler.h"
-#include "resource.h"
-#include "file_utility.h"
-
-
-class StartupExceptionHandler : public REQUEST_HANDLER
-{
-public:
-
- StartupExceptionHandler(IHttpContext& pContext, BOOL disableLogs, HRESULT hr)
- : m_pContext(pContext),
- m_disableLogs(disableLogs),
- m_HR(hr)
- {
- }
-
- ~StartupExceptionHandler()
- {
- }
-
- REQUEST_NOTIFICATION_STATUS OnExecuteRequestHandler()
- {
- static std::string s_html500Page = FILE_UTILITY::GetHtml(g_hModule, IN_PROCESS_SHIM_STATIC_HTML);
-
- WriteStaticResponse(m_pContext, s_html500Page, m_HR, m_disableLogs);
-
- return REQUEST_NOTIFICATION_STATUS::RQ_NOTIFICATION_FINISH_REQUEST;
- }
-
-private:
- IHttpContext& m_pContext;
- BOOL m_disableLogs;
- HRESULT m_HR;
-};
-
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp
index 29d4ad614f..3040e06924 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp
+++ b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp
@@ -140,12 +140,11 @@ CreateApplication(
auto content = !g_errorPageContent.empty() ?
g_errorPageContent :
FILE_UTILITY::GetHtml(g_hServerModule,
- IN_PROCESS_RH_STATIC_HTML,
+ ANCM_ERROR_PAGE,
errorContext.statusCode,
errorContext.subStatusCode,
errorContext.generalErrorType,
- errorContext.errorReason,
- "");
+ errorContext.errorReason);
auto pErrorApplication = std::make_unique<StartupExceptionApplication>(*pServer,
*pHttpApplication,
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/resource.h b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/resource.h
index 61f67c2833..77d0fb4fd6 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/resource.h
+++ b/src/Servers/IIS/AspNetCoreModuleV2/InProcessRequestHandler/resource.h
@@ -2,10 +2,10 @@
// Microsoft Visual C++ generated include file.
// Used by HtmlResponses.rc
//
-#define IN_PROCESS_RH_STATIC_HTML 101
+#define ANCM_ERROR_PAGE 101
// Next default values for new objects
-//
+//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc
index 231f122fef..5e93a83c82 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc
+++ b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc
@@ -49,7 +49,7 @@ END
// HTML
//
-OUT_OF_PROCESS_RH_STATIC_HTML HTML "OutOfProcessRhStaticHtml.htm"
+ANCM_ERROR_PAGE HTML "..\\..\\AspNetCoreModuleV2\\AspNetCore\\ancm_error_page.htm"
#endif // English (United States) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
index 5b4f89c3a5..451d1afcba 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
+++ b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj
@@ -68,7 +68,7 @@
<ResourceCompile Include="outofprocessrequesthandler.rc" />
</ItemGroup>
<ItemGroup>
- <None Include="OutOfProcessRhStaticHtml.htm">
+ <None Include="..\..\AspNetCore\ancm_error_page.htm">
<DeploymentContent>true</DeploymentContent>
</None>
<None Include="Source.def" />
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm
deleted file mode 100644
index bedf0a8dce..0000000000
--- a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm
+++ /dev/null
@@ -1,81 +0,0 @@
-<!DOCTYPE html>
-<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta charset="utf-8" />
- <title> HTTP Error %d.%d - %s </title>
- <style>
- body {
- font-family: 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;
- font-size: .813em;
- color: #222;
- background-color: #fff;
- }
-
- h1, h2, h3, h4, h5 {
- /*font-family: 'Segoe UI',Tahoma,Arial,Helvetica,sans-serif;*/
- font-weight: 100;
- }
-
- h1 {
- color: #44525e;
- margin: 15px 0 15px 0;
- }
-
- h2 {
- margin: 10px 5px 0 0;
- }
-
- h3 {
- color: #363636;
- margin: 5px 5px 0 0;
- }
-
- code {
- font-family: Consolas, "Courier New", courier, monospace;
- }
-
- body .titleerror {
- padding: 3px 3px 6px 3px;
- display: block;
- font-size: 1.5em;
- font-weight: 100;
- }
-
- a {
- color: #1ba1e2;
- text-decoration: none;
- }
-
- a:hover {
- color: #13709e;
- text-decoration: underline;
- }
-
- li {
- margin: 5px;
- }
-
- </style>
- </head>
- <body>
- <h1> HTTP Error %d.%d - %s </h1>
-
- %s
-
- %s
-
- <h2> Troubleshooting steps: </h2>
-
- <ul>
- <li> Check the system event log for error messages </li>
- <li> Enable logging the application process' stdout messages </li>
- <li> Attach a debugger to the application process and inspect </li>
- </ul>
-
- <h2>
- For more information visit:
- %s <a href="https://go.microsoft.com/fwlink/?linkid=808681"> <cite> https://go.microsoft.com/fwlink/?LinkID=808681 </cite></a>
- </h2>
-
- </body>
-</html>
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp
index 82737cf24b..d30883ea53 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp
+++ b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp
@@ -306,7 +306,7 @@ Failure:
else if (fFailedToStartKestrel && !m_pApplication->QueryConfig()->QueryDisableStartUpErrorPage())
{
static std::string htmlResponse = FILE_UTILITY::GetHtml(g_hOutOfProcessRHModule,
- OUT_OF_PROCESS_RH_STATIC_HTML,
+ ANCM_ERROR_PAGE,
502,
5,
"ANCM Out-Of-Process Startup Failure",
diff --git a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h
index 4d54425300..77d0fb4fd6 100644
--- a/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h
+++ b/src/Servers/IIS/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h
@@ -2,7 +2,7 @@
// Microsoft Visual C++ generated include file.
// Used by HtmlResponses.rc
//
-#define OUT_OF_PROCESS_RH_STATIC_HTML 101
+#define ANCM_ERROR_PAGE 101
// Next default values for new objects
//
diff --git a/src/Servers/IIS/IIS/perf/Microbenchmarks/FirstRequestConfig.cs b/src/Servers/IIS/IIS/perf/Microbenchmarks/FirstRequestConfig.cs
index bad83f2515..99878cd6ea 100644
--- a/src/Servers/IIS/IIS/perf/Microbenchmarks/FirstRequestConfig.cs
+++ b/src/Servers/IIS/IIS/perf/Microbenchmarks/FirstRequestConfig.cs
@@ -14,7 +14,7 @@ using BenchmarkDotNet.Validators;
namespace BenchmarkDotNet.Attributes;
-internal class FirstRequestConfig : ManualConfig
+internal sealed class FirstRequestConfig : ManualConfig
{
public FirstRequestConfig()
{
diff --git a/src/Servers/IIS/IIS/perf/Microbenchmarks/IIS.Microbenchmarks.csproj b/src/Servers/IIS/IIS/perf/Microbenchmarks/IIS.Microbenchmarks.csproj
index 19ea680c82..b65ae0e6db 100644
--- a/src/Servers/IIS/IIS/perf/Microbenchmarks/IIS.Microbenchmarks.csproj
+++ b/src/Servers/IIS/IIS/perf/Microbenchmarks/IIS.Microbenchmarks.csproj
@@ -37,6 +37,7 @@
<ItemGroup>
<Reference Include="BenchmarkDotNet" />
<Reference Include="Microsoft.AspNetCore.Server.IISIntegration" />
+ <Reference Include="System.Private.Uri" />
<Compile Include="$(SharedSourceRoot)BenchmarkRunner\*.cs" />
</ItemGroup>
diff --git a/src/Servers/IIS/IIS/samples/NativeIISSample/NativeIISSample.csproj b/src/Servers/IIS/IIS/samples/NativeIISSample/NativeIISSample.csproj
index fa97a75dd5..ecde817e70 100644
--- a/src/Servers/IIS/IIS/samples/NativeIISSample/NativeIISSample.csproj
+++ b/src/Servers/IIS/IIS/samples/NativeIISSample/NativeIISSample.csproj
@@ -14,6 +14,7 @@
<Reference Include="Microsoft.AspNetCore.Server.IIS" />
<Reference Include="Microsoft.AspNetCore.Server.IISIntegration" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
+ <Reference Include="System.Private.Uri" />
</ItemGroup>
</Project>
diff --git a/src/Servers/IIS/IIS/src/Core/DuplexStream.cs b/src/Servers/IIS/IIS/src/Core/DuplexStream.cs
index 506974df54..5e70bcda36 100644
--- a/src/Servers/IIS/IIS/src/Core/DuplexStream.cs
+++ b/src/Servers/IIS/IIS/src/Core/DuplexStream.cs
@@ -4,7 +4,7 @@
namespace Microsoft.AspNetCore.Server.IIS.Core;
// See https://github.com/aspnet/IISIntegration/issues/426
-internal class DuplexStream : Stream
+internal sealed class DuplexStream : Stream
{
private readonly Stream _requestBody;
private readonly Stream _responseBody;
diff --git a/src/Servers/IIS/IIS/src/Core/EmptyStream.cs b/src/Servers/IIS/IIS/src/Core/EmptyStream.cs
index debaa09799..e0a4a62f2b 100644
--- a/src/Servers/IIS/IIS/src/Core/EmptyStream.cs
+++ b/src/Servers/IIS/IIS/src/Core/EmptyStream.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class EmptyStream : ReadOnlyStream
+internal sealed class EmptyStream : ReadOnlyStream
{
private readonly IHttpBodyControlFeature _bodyControl;
private HttpStreamState _state;
diff --git a/src/Servers/IIS/IIS/src/Core/HttpRequestStream.cs b/src/Servers/IIS/IIS/src/Core/HttpRequestStream.cs
index e1f5aa7361..b47ea1582b 100644
--- a/src/Servers/IIS/IIS/src/Core/HttpRequestStream.cs
+++ b/src/Servers/IIS/IIS/src/Core/HttpRequestStream.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class HttpRequestStream : ReadOnlyStream
+internal sealed class HttpRequestStream : ReadOnlyStream
{
private readonly IHttpBodyControlFeature _bodyControl;
private IISHttpContext? _body;
diff --git a/src/Servers/IIS/IIS/src/Core/HttpResponseStream.cs b/src/Servers/IIS/IIS/src/Core/HttpResponseStream.cs
index db6c11267c..7b4f3ab82f 100644
--- a/src/Servers/IIS/IIS/src/Core/HttpResponseStream.cs
+++ b/src/Servers/IIS/IIS/src/Core/HttpResponseStream.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Http.Features;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class HttpResponseStream : WriteOnlyStreamInternal
+internal sealed class HttpResponseStream : WriteOnlyStreamInternal
{
private readonly IHttpBodyControlFeature _bodyControl;
private readonly IISHttpContext _context;
diff --git a/src/Servers/IIS/IIS/src/Core/HttpUpgradeStream.cs b/src/Servers/IIS/IIS/src/Core/HttpUpgradeStream.cs
index 3306ef044e..1fca4ea88b 100644
--- a/src/Servers/IIS/IIS/src/Core/HttpUpgradeStream.cs
+++ b/src/Servers/IIS/IIS/src/Core/HttpUpgradeStream.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class HttpUpgradeStream : Stream
+internal sealed class HttpUpgradeStream : Stream
{
private readonly Stream _requestStream;
private readonly Stream _responseStream;
diff --git a/src/Servers/IIS/IIS/src/Core/IISConfigurationData.cs b/src/Servers/IIS/IIS/src/Core/IISConfigurationData.cs
index b138541d7a..41f3aba13f 100644
--- a/src/Servers/IIS/IIS/src/Core/IISConfigurationData.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISConfigurationData.cs
@@ -2,21 +2,81 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
namespace Microsoft.AspNetCore.Server.IIS.Core;
+[NativeMarshalling(typeof(Marshaller))]
[StructLayout(LayoutKind.Sequential)]
internal struct IISConfigurationData
{
public IntPtr pNativeApplication;
- [MarshalAs(UnmanagedType.BStr)]
public string pwzFullApplicationPath;
- [MarshalAs(UnmanagedType.BStr)]
public string pwzVirtualApplicationPath;
public bool fWindowsAuthEnabled;
public bool fBasicAuthEnabled;
public bool fAnonymousAuthEnable;
- [MarshalAs(UnmanagedType.BStr)]
public string pwzBindings;
public uint maxRequestBodySize;
+
+ [CustomMarshaller(typeof(IISConfigurationData), MarshalMode.Default, typeof(Marshaller))]
+ public static class Marshaller
+ {
+ public struct Native
+ {
+ public IntPtr pNativeApplication;
+ public IntPtr pwzFullApplicationPath;
+ public IntPtr pwzVirtualApplicationPath;
+ public int fWindowsAuthEnabled;
+ public int fBasicAuthEnabled;
+ public int fAnonymousAuthEnable;
+ public IntPtr pwzBindings;
+ public uint maxRequestBodySize;
+ }
+
+ public static Native ConvertToUnmanaged(IISConfigurationData managed)
+ {
+ Native native;
+ native.pNativeApplication = managed.pNativeApplication;
+ native.pwzFullApplicationPath = managed.pwzFullApplicationPath is null ? IntPtr.Zero : Marshal.StringToBSTR(managed.pwzFullApplicationPath);
+ native.pwzVirtualApplicationPath = managed.pwzVirtualApplicationPath is null ? IntPtr.Zero : Marshal.StringToBSTR(managed.pwzVirtualApplicationPath);
+ native.fWindowsAuthEnabled = managed.fWindowsAuthEnabled ? 1 : 0;
+ native.fBasicAuthEnabled = managed.fBasicAuthEnabled ? 1 : 0;
+ native.fAnonymousAuthEnable = managed.fAnonymousAuthEnable ? 1 : 0;
+ native.pwzBindings = managed.pwzBindings is null ? IntPtr.Zero : Marshal.StringToBSTR(managed.pwzBindings);
+ native.maxRequestBodySize = managed.maxRequestBodySize;
+ return native;
+ }
+
+ public static void Free(Native native)
+ {
+ if (native.pwzFullApplicationPath != IntPtr.Zero)
+ {
+ Marshal.FreeBSTR(native.pwzFullApplicationPath);
+ }
+ if (native.pwzVirtualApplicationPath != IntPtr.Zero)
+ {
+ Marshal.FreeBSTR(native.pwzVirtualApplicationPath);
+ }
+ if (native.pwzBindings != IntPtr.Zero)
+ {
+ Marshal.FreeBSTR(native.pwzBindings);
+ }
+ }
+
+ public static IISConfigurationData ConvertToManaged(Native native)
+ {
+ return new()
+ {
+ pNativeApplication = native.pNativeApplication,
+ pwzFullApplicationPath = native.pwzFullApplicationPath == IntPtr.Zero ? string.Empty : Marshal.PtrToStringBSTR(native.pwzFullApplicationPath),
+ pwzVirtualApplicationPath = native.pwzVirtualApplicationPath == IntPtr.Zero ? string.Empty : Marshal.PtrToStringBSTR(native.pwzVirtualApplicationPath),
+ fWindowsAuthEnabled = native.fWindowsAuthEnabled != 0,
+ fBasicAuthEnabled = native.fBasicAuthEnabled != 0,
+ fAnonymousAuthEnable = native.fAnonymousAuthEnable != 0,
+ pwzBindings = native.pwzBindings == IntPtr.Zero ? string.Empty : Marshal.PtrToStringBSTR(native.pwzBindings),
+ maxRequestBodySize = native.maxRequestBodySize
+ };
+ }
+ }
}
diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpContext.FeatureCollection.cs b/src/Servers/IIS/IIS/src/Core/IISHttpContext.FeatureCollection.cs
index 8302587ed9..00da9d049b 100644
--- a/src/Servers/IIS/IIS/src/Core/IISHttpContext.FeatureCollection.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISHttpContext.FeatureCollection.cs
@@ -261,9 +261,9 @@ internal partial class IISHttpContext : IFeatureCollection,
}
// Http/2 does not support the upgrade mechanic.
- // Http/1.x upgrade requests may have a request body, but that's not allowed in our main scenario (WebSockets) and much
+ // Http/1.1 upgrade requests may have a request body, but that's not allowed in our main scenario (WebSockets) and much
// more complicated to support. See https://tools.ietf.org/html/rfc7230#section-6.7, https://tools.ietf.org/html/rfc7540#section-3.2
- bool IHttpUpgradeFeature.IsUpgradableRequest => !RequestCanHaveBody && HttpVersion < System.Net.HttpVersion.Version20;
+ bool IHttpUpgradeFeature.IsUpgradableRequest => !RequestCanHaveBody && HttpVersion == System.Net.HttpVersion.Version11;
bool IFeatureCollection.IsReadOnly => false;
@@ -297,10 +297,7 @@ internal partial class IISHttpContext : IFeatureCollection,
throw new ArgumentException($"{nameof(variableName)} should be non-empty string");
}
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
+ ArgumentNullException.ThrowIfNull(value);
// Synchronize access to native methods that might run in parallel with IO loops
lock (_contextLock)
@@ -340,6 +337,10 @@ internal partial class IISHttpContext : IFeatureCollection,
{
if (!((IHttpUpgradeFeature)this).IsUpgradableRequest)
{
+ if (HttpVersion != System.Net.HttpVersion.Version11)
+ {
+ throw new InvalidOperationException(CoreStrings.UpgradeWithWrongProtocolVersion);
+ }
throw new InvalidOperationException(CoreStrings.CannotUpgradeNonUpgradableRequest);
}
diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpContext.IO.cs b/src/Servers/IIS/IIS/src/Core/IISHttpContext.IO.cs
index 79ac033f65..61d11e20c8 100644
--- a/src/Servers/IIS/IIS/src/Core/IISHttpContext.IO.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISHttpContext.IO.cs
@@ -155,6 +155,7 @@ internal partial class IISHttpContext
private async Task WriteBody(bool flush = false)
{
Exception? error = null;
+
try
{
while (true)
@@ -162,10 +163,18 @@ internal partial class IISHttpContext
var result = await _bodyOutput.Reader.ReadAsync();
var buffer = result.Buffer;
+
try
{
+ if (_bodyOutput.Aborted)
+ {
+ break;
+ }
+
if (!buffer.IsEmpty)
{
+ // We are ignoring the result of the write operation here. If we fix this behavior,
+ // we should also fix AsyncIOEngine.WriteDataOverChunksLimit.
await AsyncIO!.WriteAsync(buffer);
}
diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpContextOfT.cs b/src/Servers/IIS/IIS/src/Core/IISHttpContextOfT.cs
index 21d2121b9a..2cd129323c 100644
--- a/src/Servers/IIS/IIS/src/Core/IISHttpContextOfT.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISHttpContextOfT.cs
@@ -10,7 +10,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core;
using BadHttpRequestException = Microsoft.AspNetCore.Http.BadHttpRequestException;
-internal class IISHttpContextOfT<TContext> : IISHttpContext where TContext : notnull
+internal sealed class IISHttpContextOfT<TContext> : IISHttpContext where TContext : notnull
{
private readonly IHttpApplication<TContext> _application;
diff --git a/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs b/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs
index ab653b3a5a..09ba3ecf0b 100644
--- a/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISHttpServer.cs
@@ -15,7 +15,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class IISHttpServer : IServer
+internal sealed class IISHttpServer : IServer
{
private const string WebSocketVersionString = "WEBSOCKET_VERSION";
@@ -259,7 +259,7 @@ internal class IISHttpServer : IServer
}
}
- private class IISContextFactory<T> : IISContextFactory where T : notnull
+ private sealed class IISContextFactory<T> : IISContextFactory where T : notnull
{
private const string Latin1Suppport = "Microsoft.AspNetCore.Server.IIS.Latin1RequestHeaders";
diff --git a/src/Servers/IIS/IIS/src/Core/IISNativeApplication.cs b/src/Servers/IIS/IIS/src/Core/IISNativeApplication.cs
index 224b4a99ba..a031f50aeb 100644
--- a/src/Servers/IIS/IIS/src/Core/IISNativeApplication.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISNativeApplication.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class IISNativeApplication
+internal sealed class IISNativeApplication
{
private readonly NativeSafeHandle _nativeApplication;
private readonly object _sync = new object();
diff --git a/src/Servers/IIS/IIS/src/Core/IISServerAuthenticationHandlerInternal.cs b/src/Servers/IIS/IIS/src/Core/IISServerAuthenticationHandlerInternal.cs
index 89d6a5637a..b53d0fbce5 100644
--- a/src/Servers/IIS/IIS/src/Core/IISServerAuthenticationHandlerInternal.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISServerAuthenticationHandlerInternal.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core;
/// <summary>
/// The default authentication handler with IIS In-Process
/// </summary>
-internal class IISServerAuthenticationHandlerInternal : IAuthenticationHandler
+internal sealed class IISServerAuthenticationHandlerInternal : IAuthenticationHandler
{
private HttpContext? _context;
private IISHttpContext? _iisHttpContext;
diff --git a/src/Servers/IIS/IIS/src/Core/IISServerSetupFilter.cs b/src/Servers/IIS/IIS/src/Core/IISServerSetupFilter.cs
index dcdc4754ac..4dd107b882 100644
--- a/src/Servers/IIS/IIS/src/Core/IISServerSetupFilter.cs
+++ b/src/Servers/IIS/IIS/src/Core/IISServerSetupFilter.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class IISServerSetupFilter : IStartupFilter
+internal sealed class IISServerSetupFilter : IStartupFilter
{
private readonly string _virtualPath;
diff --git a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Flush.cs b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Flush.cs
index 2c724583d0..ed0654170e 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Flush.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Flush.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
internal partial class AsyncIOEngine
{
- internal class AsyncFlushOperation : AsyncIOOperation
+ internal sealed class AsyncFlushOperation : AsyncIOOperation
{
private readonly AsyncIOEngine _engine;
diff --git a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Read.cs b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Read.cs
index f765e96316..b137ade232 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Read.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Read.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
internal partial class AsyncIOEngine
{
- internal class AsyncReadOperation : AsyncIOOperation
+ internal sealed class AsyncReadOperation : AsyncIOOperation
{
private readonly AsyncIOEngine _engine;
diff --git a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Write.cs b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Write.cs
index 8d375c5c45..c786c2d28c 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Write.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.Write.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
internal partial class AsyncIOEngine
{
- private class AsyncWriteOperation : AsyncWriteOperationBase
+ private sealed class AsyncWriteOperation : AsyncWriteOperationBase
{
private readonly AsyncIOEngine _engine;
diff --git a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.cs b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.cs
index 001a5e3255..bc3d35968c 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/AsyncIOEngine.cs
@@ -6,8 +6,10 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
-internal partial class AsyncIOEngine : IAsyncIOEngine
+internal sealed partial class AsyncIOEngine : IAsyncIOEngine
{
+ private const ushort ResponseMaxChunks = 65533;
+
private readonly IISHttpContext _context;
private readonly NativeSafeHandle _handler;
@@ -36,12 +38,82 @@ internal partial class AsyncIOEngine : IAsyncIOEngine
public ValueTask<int> WriteAsync(ReadOnlySequence<byte> data)
{
+ if (SegmentsOverChunksLimit(data))
+ {
+ return WriteDataOverChunksLimit(data);
+ }
+
+ return WriteDataAsync(data);
+ }
+
+ private ValueTask<int> WriteDataAsync(in ReadOnlySequence<byte> data)
+ {
var write = GetWriteOperation();
write.Initialize(_handler, data);
Run(write);
return new ValueTask<int>(write, 0);
}
+ // In case the number of chunks is bigger than responseMaxChunks we need to make multiple calls
+ // to the native api https://docs.microsoft.com/en-us/iis/web-development-reference/native-code-api-reference/ihttpresponse-writeentitychunks-method
+ // Despite the documentation states that feeding the function with more than 65535 chunks will cause the function to throw an exception,
+ // it actually seems that 65534 is the maximum number of chunks allowed.
+ // Also, there seems to be a problem when slicing a ReadOnlySequence on segment borders tracked here https://github.com/dotnet/runtime/issues/67607
+ // That's why we only allow 65533 chunks.
+ private async ValueTask<int> WriteDataOverChunksLimit(ReadOnlySequence<byte> data)
+ {
+ ushort segmentsCount = 0;
+ var length = 0;
+
+ // Since the result is discarded in the only place it's used (IISHttpContext.WriteBody), we return the last result.
+ // If we start using the result there, we should make sure we handle the value correctly here.
+ var result = 0;
+
+ foreach (var segment in data)
+ {
+ segmentsCount++;
+ length += segment.Length;
+
+ if (segmentsCount == ResponseMaxChunks)
+ {
+ result = await WriteDataAsync(data.Slice(0, length));
+
+ data = data.Slice(length);
+ segmentsCount = 0;
+ length = 0;
+ }
+ }
+
+ if (segmentsCount > 0)
+ {
+ result = await WriteDataAsync(data);
+ }
+
+ return result;
+ }
+
+ private static bool SegmentsOverChunksLimit(in ReadOnlySequence<byte> data)
+ {
+ if (data.IsSingleSegment)
+ {
+ return false;
+ }
+
+ var count = 0;
+
+ foreach (var _ in data)
+ {
+ count++;
+
+ if (count > ResponseMaxChunks)
+ {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private void Run(AsyncIOOperation ioOperation)
{
lock (_context._contextLock)
diff --git a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs
index 99d6ccdca4..10018a0512 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs
@@ -7,7 +7,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
internal partial class WebSocketsAsyncIOEngine
{
- internal class AsyncInitializeOperation : AsyncIOOperation
+ internal sealed class AsyncInitializeOperation : AsyncIOOperation
{
private readonly WebSocketsAsyncIOEngine _engine;
diff --git a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs
index bc61870c79..bc29203b52 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.Read.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
internal partial class WebSocketsAsyncIOEngine
{
- internal class WebSocketReadOperation : AsyncIOOperation
+ internal sealed class WebSocketReadOperation : AsyncIOOperation
{
[UnmanagedCallersOnly]
public static NativeMethods.REQUEST_NOTIFICATION_STATUS ReadCallback(IntPtr httpContext, IntPtr completionInfo, IntPtr completionContext)
diff --git a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs
index 215643edc2..7748802be6 100644
--- a/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs
+++ b/src/Servers/IIS/IIS/src/Core/IO/WebSocketsAsyncIOEngine.cs
@@ -5,7 +5,7 @@ using System.Buffers;
namespace Microsoft.AspNetCore.Server.IIS.Core.IO;
-internal partial class WebSocketsAsyncIOEngine : IAsyncIOEngine
+internal sealed partial class WebSocketsAsyncIOEngine : IAsyncIOEngine
{
private readonly IISHttpContext _context;
diff --git a/src/Servers/IIS/IIS/src/Core/NativeSafeHandle.cs b/src/Servers/IIS/IIS/src/Core/NativeSafeHandle.cs
index 3908776d0d..f5af0cb55b 100644
--- a/src/Servers/IIS/IIS/src/Core/NativeSafeHandle.cs
+++ b/src/Servers/IIS/IIS/src/Core/NativeSafeHandle.cs
@@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class NativeSafeHandle : SafeHandle
+internal sealed class NativeSafeHandle : SafeHandle
{
public override bool IsInvalid => handle == IntPtr.Zero;
diff --git a/src/Servers/IIS/IIS/src/Core/OutputProducer.cs b/src/Servers/IIS/IIS/src/Core/OutputProducer.cs
index 00934ea1b6..24012b446f 100644
--- a/src/Servers/IIS/IIS/src/Core/OutputProducer.cs
+++ b/src/Servers/IIS/IIS/src/Core/OutputProducer.cs
@@ -7,11 +7,12 @@ using System.IO.Pipelines;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class OutputProducer
+internal sealed class OutputProducer
{
- // This locks access to _completed.
+ // This locks access to _completed and _aborted.
private readonly object _contextLock = new object();
private bool _completed;
+ private volatile bool _aborted;
private readonly Pipe _pipe;
@@ -29,6 +30,8 @@ internal class OutputProducer
public PipeReader Reader => _pipe.Reader;
+ public bool Aborted => _aborted;
+
public Task FlushAsync(CancellationToken cancellationToken)
{
_pipe.Reader.CancelPendingRead();
@@ -40,7 +43,7 @@ internal class OutputProducer
{
lock (_contextLock)
{
- if (_completed)
+ if (_completed || _aborted)
{
return;
}
@@ -54,12 +57,12 @@ internal class OutputProducer
{
lock (_contextLock)
{
- if (_completed)
+ if (_completed || _aborted)
{
return;
}
- _completed = true;
+ _aborted = true;
_pipe.Reader.CancelPendingRead();
_pipe.Writer.Complete();
@@ -70,7 +73,7 @@ internal class OutputProducer
{
lock (_contextLock)
{
- if (_completed)
+ if (_completed || _aborted)
{
return Task.CompletedTask;
}
diff --git a/src/Servers/IIS/IIS/src/Core/ServerAddressesFeature.cs b/src/Servers/IIS/IIS/src/Core/ServerAddressesFeature.cs
index 0082ecba8f..4913c42ff7 100644
--- a/src/Servers/IIS/IIS/src/Core/ServerAddressesFeature.cs
+++ b/src/Servers/IIS/IIS/src/Core/ServerAddressesFeature.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Hosting.Server.Features;
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class ServerAddressesFeature : IServerAddressesFeature
+internal sealed class ServerAddressesFeature : IServerAddressesFeature
{
public ICollection<string> Addresses { get; set; } = Array.Empty<string>();
public bool PreferHostingUrls { get; set; }
diff --git a/src/Servers/IIS/IIS/src/Core/Streams.cs b/src/Servers/IIS/IIS/src/Core/Streams.cs
index f0c91070e5..50b6a922f7 100644
--- a/src/Servers/IIS/IIS/src/Core/Streams.cs
+++ b/src/Servers/IIS/IIS/src/Core/Streams.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class Streams
+internal sealed class Streams
{
private static readonly ThrowingWasUpgradedWriteOnlyStreamInternal _throwingResponseStream
= new ThrowingWasUpgradedWriteOnlyStreamInternal();
diff --git a/src/Servers/IIS/IIS/src/Core/ThrowingWasUpgradedWriteOnlyStreamInternal.cs b/src/Servers/IIS/IIS/src/Core/ThrowingWasUpgradedWriteOnlyStreamInternal.cs
index 993ad2c54d..0c4306e61b 100644
--- a/src/Servers/IIS/IIS/src/Core/ThrowingWasUpgradedWriteOnlyStreamInternal.cs
+++ b/src/Servers/IIS/IIS/src/Core/ThrowingWasUpgradedWriteOnlyStreamInternal.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Server.IIS.Core;
/// <remarks>
/// Users should not need to instantiate this class.
/// </remarks>
-internal class ThrowingWasUpgradedWriteOnlyStreamInternal : WriteOnlyStreamInternal
+internal sealed class ThrowingWasUpgradedWriteOnlyStreamInternal : WriteOnlyStreamInternal
{
///<inheritdoc/>
public override void Write(byte[] buffer, int offset, int count)
diff --git a/src/Servers/IIS/IIS/src/Core/WrappingStream.cs b/src/Servers/IIS/IIS/src/Core/WrappingStream.cs
index f73124650e..eb83216b34 100644
--- a/src/Servers/IIS/IIS/src/Core/WrappingStream.cs
+++ b/src/Servers/IIS/IIS/src/Core/WrappingStream.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.IIS.Core;
-internal class WrappingStream : Stream
+internal sealed class WrappingStream : Stream
{
private Stream _inner;
private bool _disposed;
@@ -15,10 +15,7 @@ internal class WrappingStream : Stream
public void SetInnerStream(Stream inner)
{
- if (_disposed)
- {
- throw new ObjectDisposedException(nameof(WrappingStream));
- }
+ ObjectDisposedException.ThrowIf(_disposed, nameof(WrappingStream));
_inner = inner;
}
diff --git a/src/Servers/IIS/IIS/src/CoreStrings.resx b/src/Servers/IIS/IIS/src/CoreStrings.resx
index 3f845cc74e..cec142eb57 100644
--- a/src/Servers/IIS/IIS/src/CoreStrings.resx
+++ b/src/Servers/IIS/IIS/src/CoreStrings.resx
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
- <!--
- Microsoft ResX Schema
-
+ <!--
+ Microsoft ResX Schema
+
Version 2.0
-
- The primary goals of this format is to allow a simple XML format
- that is mostly human readable. The generation and parsing of the
- various data types are done through the TypeConverter classes
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
associated with the data types.
-
+
Example:
-
+
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
@@ -26,36 +26,36 @@
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
-
- There are any number of "resheader" rows that contain simple
+
+ There are any number of "resheader" rows that contain simple
name/value pairs.
-
- Each data row contains a name, and value. The row also contains a
- type or mimetype. Type corresponds to a .NET class that support
- text/value conversion through the TypeConverter architecture.
- Classes that don't support this are serialized and stored with the
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
mimetype set.
-
- The mimetype is used for serialized objects, and tells the
- ResXResourceReader how to depersist the object. This is currently not
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
-
- Note - application/x-microsoft.net.object.binary.base64 is the format
- that the ResXResourceWriter will generate, however the reader can
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
-
+
mimetype: application/x-microsoft.net.object.binary.base64
- value : The object must be serialized with
+ value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
-
+
mimetype: application/x-microsoft.net.object.soap.base64
- value : The object must be serialized with
+ value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
- value : The object must be serialized into a byte array
+ value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
@@ -147,7 +147,7 @@
<data name="ParameterReadOnlyAfterResponseStarted" xml:space="preserve">
<value>{name} cannot be set because the response has already started.</value>
</data>
- <data name="BadRequest_RequestBodyTooLarge" xml:space="preserve">
+ <data name="BadRequest_RequestBodyTooLarge" xml:space="preserve">
<value>Request body too large.</value>
</data>
<data name="MaxRequestBodySizeCannotBeModifiedAfterRead" xml:space="preserve">
@@ -165,4 +165,7 @@
<data name="MaxRequestLimitWarning" xml:space="preserve">
<value>Increasing the MaxRequestBodySize conflicts with the max value for IIS limit maxAllowedContentLength. HTTP requests that have a content length greater than maxAllowedContentLength will still be rejected by IIS. You can disable the limit by either removing or setting the maxAllowedContentLength value to a higher limit.</value>
</data>
-</root>
+ <data name="UpgradeWithWrongProtocolVersion" xml:space="preserve">
+ <value>Upgrade requires HTTP/1.1.</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/src/Servers/IIS/IIS/src/NativeMethods.cs b/src/Servers/IIS/IIS/src/NativeMethods.cs
index e9d2e4bf07..fb13a77394 100644
--- a/src/Servers/IIS/IIS/src/NativeMethods.cs
+++ b/src/Servers/IIS/IIS/src/NativeMethods.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Server.IIS.Core;
namespace Microsoft.AspNetCore.Server.IIS;
-internal static class NativeMethods
+internal static partial class NativeMethods
{
internal const int HR_OK = 0;
internal const int ERROR_NOT_FOUND = unchecked((int)0x80070490);
@@ -19,12 +19,12 @@ internal static class NativeMethods
internal const string AspNetCoreModuleDll = "aspnetcorev2_inprocess.dll";
- [DllImport(KERNEL32, ExactSpelling = true, SetLastError = true)]
+ [LibraryImport(KERNEL32, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static partial bool CloseHandle(IntPtr handle);
- public static extern bool CloseHandle(IntPtr handle);
-
- [DllImport("kernel32.dll")]
- private static extern IntPtr GetModuleHandle(string lpModuleName);
+ [LibraryImport(KERNEL32, EntryPoint = "GetModuleHandleW")]
+ private static partial IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPWStr)] string lpModuleName);
public static bool IsAspNetCoreModuleLoaded()
{
@@ -38,17 +38,17 @@ internal static class NativeMethods
RQ_NOTIFICATION_FINISH_REQUEST
}
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_set_completion_status(NativeSafeHandle pInProcessHandler, REQUEST_NOTIFICATION_STATUS rquestNotificationStatus);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_post_completion(NativeSafeHandle pInProcessHandler, int cbBytes);
- [DllImport(AspNetCoreModuleDll)]
- private static extern void http_indicate_completion(IntPtr pInProcessHandler, REQUEST_NOTIFICATION_STATUS notificationStatus);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_set_completion_status(NativeSafeHandle pInProcessHandler, REQUEST_NOTIFICATION_STATUS rquestNotificationStatus);
- [DllImport(AspNetCoreModuleDll)]
- private static extern void http_set_managed_request_complete(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial void http_indicate_completion(NativeSafeHandle pInProcessHandler, REQUEST_NOTIFICATION_STATUS notificationStatus);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int register_callbacks(NativeSafeHandle pInProcessApplication,
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int register_callbacks(NativeSafeHandle pInProcessApplication,
delegate* unmanaged<IntPtr, IntPtr, REQUEST_NOTIFICATION_STATUS> requestCallback,
delegate* unmanaged<IntPtr, int> shutdownCallback,
delegate* unmanaged<IntPtr, void> disconnectCallback,
@@ -57,101 +57,101 @@ internal static class NativeMethods
IntPtr pvRequestContext,
IntPtr pvShutdownContext);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_write_response_bytes(NativeSafeHandle pInProcessHandler, HttpApiTypes.HTTP_DATA_CHUNK* pDataChunks, int nChunks, out bool fCompletionExpected);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_write_response_bytes(NativeSafeHandle pInProcessHandler, HttpApiTypes.HTTP_DATA_CHUNK* pDataChunks, int nChunks, [MarshalAs(UnmanagedType.Bool)] out bool fCompletionExpected);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_flush_response_bytes(NativeSafeHandle pInProcessHandler, bool fMoreData, out bool fCompletionExpected);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_flush_response_bytes(NativeSafeHandle pInProcessHandler, [MarshalAs(UnmanagedType.Bool)] bool fMoreData, [MarshalAs(UnmanagedType.Bool)] out bool fCompletionExpected);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe HttpApiTypes.HTTP_REQUEST_V2* http_get_raw_request(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial HttpApiTypes.HTTP_REQUEST_V2* http_get_raw_request(NativeSafeHandle pInProcessHandler);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_stop_calls_into_managed(NativeSafeHandle pInProcessApplication);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_stop_calls_into_managed(NativeSafeHandle pInProcessApplication);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_stop_incoming_requests(NativeSafeHandle pInProcessApplication);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_stop_incoming_requests(NativeSafeHandle pInProcessApplication);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_disable_buffering(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_disable_buffering(NativeSafeHandle pInProcessHandler);
- [DllImport(AspNetCoreModuleDll, CharSet = CharSet.Ansi)]
- private static extern int http_set_response_status_code(NativeSafeHandle pInProcessHandler, ushort statusCode, string pszReason);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_set_response_status_code(NativeSafeHandle pInProcessHandler, ushort statusCode, [MarshalAs(UnmanagedType.LPStr)] string pszReason);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_read_request_bytes(NativeSafeHandle pInProcessHandler, byte* pvBuffer, int cbBuffer, out int dwBytesReceived, out bool fCompletionExpected);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_read_request_bytes(NativeSafeHandle pInProcessHandler, byte* pvBuffer, int cbBuffer, out int dwBytesReceived, [MarshalAs(UnmanagedType.Bool)] out bool fCompletionExpected);
- [DllImport(AspNetCoreModuleDll)]
- private static extern void http_get_completion_info(IntPtr pCompletionInfo, out int cbBytes, out int hr);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial void http_get_completion_info(IntPtr pCompletionInfo, out int cbBytes, out int hr);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_set_managed_context(NativeSafeHandle pInProcessHandler, IntPtr pvManagedContext);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_set_managed_context(NativeSafeHandle pInProcessHandler, IntPtr pvManagedContext);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_get_application_properties(ref IISConfigurationData iiConfigData);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_get_application_properties(out IISConfigurationData iiConfigData);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_get_server_variable(
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_get_server_variable(
NativeSafeHandle pInProcessHandler,
[MarshalAs(UnmanagedType.LPStr)] string variableName,
[MarshalAs(UnmanagedType.BStr)] out string value);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_set_server_variable(
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_set_server_variable(
NativeSafeHandle pInProcessHandler,
[MarshalAs(UnmanagedType.LPStr)] string variableName,
[MarshalAs(UnmanagedType.LPWStr)] string value);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_websockets_read_bytes(
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_websockets_read_bytes(
NativeSafeHandle pInProcessHandler,
byte* pvBuffer,
int cbBuffer,
delegate* unmanaged<IntPtr, IntPtr, IntPtr, REQUEST_NOTIFICATION_STATUS> pfnCompletionCallback,
IntPtr pvCompletionContext,
out int dwBytesReceived,
- out bool fCompletionExpected);
+ [MarshalAs(UnmanagedType.Bool)] out bool fCompletionExpected);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_websockets_write_bytes(
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_websockets_write_bytes(
NativeSafeHandle pInProcessHandler,
HttpApiTypes.HTTP_DATA_CHUNK* pDataChunks,
int nChunks,
delegate* unmanaged<IntPtr, IntPtr, IntPtr, REQUEST_NOTIFICATION_STATUS> pfnCompletionCallback,
IntPtr pvCompletionContext,
- out bool fCompletionExpected);
+ [MarshalAs(UnmanagedType.Bool)] out bool fCompletionExpected);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_enable_websockets(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_enable_websockets(NativeSafeHandle pInProcessHandler);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_cancel_io(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_cancel_io(NativeSafeHandle pInProcessHandler);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_close_connection(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_close_connection(NativeSafeHandle pInProcessHandler);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_response_set_need_goaway(NativeSafeHandle pInProcessHandler);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_response_set_need_goaway(NativeSafeHandle pInProcessHandler);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_response_set_unknown_header(NativeSafeHandle pInProcessHandler, byte* pszHeaderName, byte* pszHeaderValue, ushort usHeaderValueLength, bool fReplace);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_response_set_unknown_header(NativeSafeHandle pInProcessHandler, byte* pszHeaderName, byte* pszHeaderValue, ushort usHeaderValueLength, [MarshalAs(UnmanagedType.Bool)] bool fReplace);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_has_response4(NativeSafeHandle pInProcessHandler, out bool isResponse4);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_response_set_trailer(NativeSafeHandle pInProcessHandler, byte* pszHeaderName, byte* pszHeaderValue, ushort usHeaderValueLength, bool replace);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_has_response4(NativeSafeHandle pInProcessHandler, [MarshalAs(UnmanagedType.Bool)] out bool isResponse4);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_response_set_trailer(NativeSafeHandle pInProcessHandler, byte* pszHeaderName, byte* pszHeaderValue, ushort usHeaderValueLength, [MarshalAs(UnmanagedType.Bool)] bool replace);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_reset_stream(NativeSafeHandle pInProcessHandler, ulong errorCode);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_reset_stream(NativeSafeHandle pInProcessHandler, ulong errorCode);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_response_set_known_header(NativeSafeHandle pInProcessHandler, int headerId, byte* pHeaderValue, ushort length, bool fReplace);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_response_set_known_header(NativeSafeHandle pInProcessHandler, int headerId, byte* pHeaderValue, ushort length, [MarshalAs(UnmanagedType.Bool)] bool fReplace);
- [DllImport(AspNetCoreModuleDll)]
- private static extern int http_get_authentication_information(NativeSafeHandle pInProcessHandler, [MarshalAs(UnmanagedType.BStr)] out string authType, out IntPtr token);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static partial int http_get_authentication_information(NativeSafeHandle pInProcessHandler, [MarshalAs(UnmanagedType.BStr)] out string authType, out IntPtr token);
- [DllImport(AspNetCoreModuleDll)]
- private static extern unsafe int http_set_startup_error_page_content(byte* content, int contentLength);
+ [LibraryImport(AspNetCoreModuleDll)]
+ private static unsafe partial int http_set_startup_error_page_content(byte* content, int contentLength);
public static void HttpIndicateCompletion(IntPtr pInProcessHandler, REQUEST_NOTIFICATION_STATUS requestNotificationStatus)
{
@@ -232,8 +232,7 @@ internal static class NativeMethods
internal static IISConfigurationData HttpGetApplicationProperties()
{
- var iisConfigurationData = new IISConfigurationData();
- Validate(http_get_application_properties(ref iisConfigurationData));
+ Validate(http_get_application_properties(out IISConfigurationData iisConfigurationData));
return iisConfigurationData;
}
diff --git a/src/Servers/IIS/IIS/src/StartupHook.cs b/src/Servers/IIS/IIS/src/StartupHook.cs
index 9a01f9e669..e913ae7e18 100644
--- a/src/Servers/IIS/IIS/src/StartupHook.cs
+++ b/src/Servers/IIS/IIS/src/StartupHook.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.FileProviders;
/// See: <see href="https://github.com/dotnet/core-setup/blob/master/Documentation/design-docs/host-startup-hook.md"/>
/// The type must be named StartupHook without any namespace, and should be internal.
/// </summary>
-internal class StartupHook
+internal sealed class StartupHook
{
/// <summary>
/// Startup hooks are pieces of code that will run before a users program main executes
diff --git a/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs b/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs
index dbaef93075..ada353beb5 100644
--- a/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs
+++ b/src/Servers/IIS/IIS/src/WebHostBuilderIISExtensions.cs
@@ -22,10 +22,7 @@ public static class WebHostBuilderIISExtensions
/// <returns>The <see cref="IWebHostBuilder"/>.</returns>
public static IWebHostBuilder UseIIS(this IWebHostBuilder hostBuilder)
{
- if (hostBuilder == null)
- {
- throw new ArgumentNullException(nameof(hostBuilder));
- }
+ ArgumentNullException.ThrowIfNull(hostBuilder);
// Check if in process
if (OperatingSystem.IsWindows() && NativeMethods.IsAspNetCoreModuleLoaded())
diff --git a/src/Servers/IIS/IIS/test/Common.FunctionalTests/Http2Tests.cs b/src/Servers/IIS/IIS/test/Common.FunctionalTests/Http2Tests.cs
index 34906e32e4..3c3d89260d 100644
--- a/src/Servers/IIS/IIS/test/Common.FunctionalTests/Http2Tests.cs
+++ b/src/Servers/IIS/IIS/test/Common.FunctionalTests/Http2Tests.cs
@@ -69,17 +69,17 @@ public class Http2Tests
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/Http2_MethodsRequestWithoutData_Success"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/Http2_MethodsRequestWithoutData_Success"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
};
await h2Connection.StartStreamAsync(1, headers, endStream: true);
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -106,17 +106,17 @@ public class Http2Tests
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
};
await h2Connection.StartStreamAsync(1, headers, endStream: true);
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("411", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("411", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -149,10 +149,10 @@ public class Http2Tests
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/Http2_RequestWithDataAndContentLength_Success"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/Http2_RequestWithDataAndContentLength_Success"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
new KeyValuePair<string, string>(HeaderNames.ContentLength, "11"),
};
@@ -169,7 +169,7 @@ public class Http2Tests
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -219,10 +219,10 @@ public class Http2Tests
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/Http2_RequestWithDataAndNoContentLength_Success"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/Http2_RequestWithDataAndNoContentLength_Success"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
};
await h2Connection.StartStreamAsync(1, headers, endStream: false);
@@ -238,7 +238,7 @@ public class Http2Tests
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -283,7 +283,7 @@ public class Http2Tests
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -339,7 +339,7 @@ public class Http2Tests
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("500", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -380,7 +380,7 @@ public class Http2Tests
{
var headers = Headers.ToList();
- var kvp = new KeyValuePair<string, string>(HeaderNames.Path, path);
+ var kvp = new KeyValuePair<string, string>(InternalHeaderNames.Path, path);
headers.Add(kvp);
return headers;
}
@@ -397,9 +397,9 @@ public class Http2Tests
private static readonly IEnumerable<KeyValuePair<string, string>> Headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
diff --git a/src/Servers/IIS/IIS/test/Common.FunctionalTests/Infrastructure/FunctionalTestsBase.cs b/src/Servers/IIS/IIS/test/Common.FunctionalTests/Infrastructure/FunctionalTestsBase.cs
index f23b04caf8..bbace3d509 100644
--- a/src/Servers/IIS/IIS/test/Common.FunctionalTests/Infrastructure/FunctionalTestsBase.cs
+++ b/src/Servers/IIS/IIS/test/Common.FunctionalTests/Infrastructure/FunctionalTestsBase.cs
@@ -1,13 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.IO;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Server.IIS.FunctionalTests;
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
using Microsoft.AspNetCore.Testing;
-using Microsoft.Extensions.Logging.Testing;
using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Server.IntegrationTesting;
diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs
index 1b45ede43b..fe4f3735c2 100644
--- a/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs
+++ b/src/Servers/IIS/IIS/test/Common.LongTests/ShutdownTests.cs
@@ -34,7 +34,6 @@ public class ShutdownTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/38995")]
public async Task ShutdownTimeoutIsApplied()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite);
@@ -187,7 +186,6 @@ public class ShutdownTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/38951")]
public async Task GracefulShutdownWorksWithMultipleRequestsInFlight_InProcess()
{
// The goal of this test is to have multiple requests currently in progress
@@ -371,7 +369,6 @@ public class ShutdownTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/40628")]
public async Task ConfigurationChangeStopsInProcess()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(HostingModel.InProcess);
@@ -405,7 +402,6 @@ public class ShutdownTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/41207")]
public async Task ConfigurationChangeCanBeIgnoredInProcess()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(HostingModel.InProcess);
@@ -486,7 +482,6 @@ public class ShutdownTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/38951")]
public async Task ConfigurationTouchedStress_InProcess()
{
await ConfigurationTouchedStress(HostingModel.InProcess);
diff --git a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs
index 3ea9955b98..1c9887b378 100644
--- a/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs
+++ b/src/Servers/IIS/IIS/test/Common.LongTests/StartupTests.cs
@@ -41,7 +41,6 @@ public class StartupTests : IISFunctionalTestBase
[ConditionalFact]
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/38260")]
public async Task ExpandEnvironmentVariableInWebConfig()
{
// Point to dotnet installed in user profile.
@@ -236,7 +235,6 @@ public class StartupTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/38732")]
public async Task LogsStartupExceptionExitError()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite);
@@ -1029,7 +1027,6 @@ public class StartupTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/37932")]
public async Task Gets500_30_ErrorPage()
{
var deploymentParameters = Fixture.GetBaseDeploymentParameters(Fixture.InProcessTestSite);
diff --git a/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http2TrailersResetTests.cs b/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http2TrailersResetTests.cs
index d05619647b..ffbfcc98d0 100644
--- a/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http2TrailersResetTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http2TrailersResetTests.cs
@@ -11,6 +11,7 @@ using Microsoft.AspNetCore.Http2Cat;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
using Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
+using Microsoft.AspNetCore.Server;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Hosting;
@@ -201,7 +202,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var frame = await h2Connection.ReceiveFrameAsync();
@@ -261,7 +262,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
{
// HTTP/2 filters out the connection header
Assert.False(decodedHeaders.ContainsKey(HeaderNames.Connection));
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -322,7 +323,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var resetFrame = await h2Connection.ReceiveFrameAsync();
@@ -435,7 +436,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -465,7 +466,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
await h2Connection.ReceiveHeadersAsync(1, decodedHeaders =>
{
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
});
var dataFrame = await h2Connection.ReceiveFrameAsync();
@@ -484,7 +485,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
{
var headers = Headers.ToList();
- var kvp = new KeyValuePair<string, string>(HeaderNames.Path, path);
+ var kvp = new KeyValuePair<string, string>(InternalHeaderNames.Path, path);
headers.Add(kvp);
return headers;
}
@@ -493,7 +494,7 @@ public class Http2TrailerResetTests : FunctionalTestsBase
{
var headers = PostRequestHeaders.ToList();
- var kvp = new KeyValuePair<string, string>(HeaderNames.Path, path);
+ var kvp = new KeyValuePair<string, string>(InternalHeaderNames.Path, path);
headers.Add(kvp);
return headers;
}
@@ -519,9 +520,9 @@ public class Http2TrailerResetTests : FunctionalTestsBase
private static readonly IEnumerable<KeyValuePair<string, string>> Headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
@@ -531,8 +532,8 @@ public class Http2TrailerResetTests : FunctionalTestsBase
private static readonly IEnumerable<KeyValuePair<string, string>> PostRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
};
}
diff --git a/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http3Tests.cs b/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http3Tests.cs
index be5022389b..3ee6212c46 100644
--- a/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http3Tests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http3Tests.cs
@@ -120,8 +120,9 @@ public class Http3Tests : FunctionalTestsBase
client.DefaultRequestVersion = HttpVersion.Version30;
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
- Assert.Equal(0x010b, qex.ErrorCode);
+ var qex = Assert.IsType<QuicException>(ex.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x010b, qex.ApplicationErrorCode.Value);
}
[ConditionalFact]
@@ -135,8 +136,9 @@ public class Http3Tests : FunctionalTestsBase
await client.GetAsync(Fixture.Client.BaseAddress.ToString() + "Http3_ResetAfterHeaders_SetResult");
response.EnsureSuccessStatusCode();
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
- Assert.Equal(0x010c, qex.ErrorCode); // H3_REQUEST_CANCELLED
+ var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x010c, qex.ApplicationErrorCode.Value); // H3_REQUEST_CANCELLED
}
[ConditionalFact]
@@ -151,8 +153,9 @@ public class Http3Tests : FunctionalTestsBase
await client.GetAsync(Fixture.Client.BaseAddress.ToString() + "Http3_AppExceptionAfterHeaders_InternalError_SetResult");
response.EnsureSuccessStatusCode();
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
- Assert.Equal(0x0102, qex.ErrorCode); // H3_INTERNAL_ERROR
+ var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x0102, qex.ApplicationErrorCode.Value); // H3_INTERNAL_ERROR
}
[ConditionalFact]
@@ -164,8 +167,9 @@ public class Http3Tests : FunctionalTestsBase
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
- var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
- Assert.Equal(0x010c, qex.ErrorCode); // H3_REQUEST_CANCELLED
+ var qex = Assert.IsType<QuicException>(ex.InnerException);
+ Assert.Equal(QuicError.StreamAborted, qex.QuicError);
+ Assert.Equal(0x010c, qex.ApplicationErrorCode.Value); // H3_REQUEST_CANCELLED
}
private HttpClient SetUpClient()
diff --git a/src/Servers/IIS/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/Servers/IIS/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
index bec23081cb..c1a54a55e5 100644
--- a/src/Servers/IIS/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
+++ b/src/Servers/IIS/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -7,16 +7,13 @@
<DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
<SkipTests Condition=" '$(SkipIISTests)' == 'true' ">true</SkipTests>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <!-- Required for System.Net.Quic which has a preview API in .NET 7 -->
+ <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<Import Project="../FunctionalTest.props" />
<ItemGroup>
- <!-- Required for QUIC & HTTP/3 in .NET 6 - https://github.com/dotnet/runtime/pull/55332 -->
- <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
- </ItemGroup>
-
- <ItemGroup>
<ProjectReference Include="..\testassets\IIS.Common.TestLib\IIS.Common.TestLib.csproj" />
<ProjectReference Include="..\testassets\InProcessWebSite\InProcessWebSite.csproj"
Private="false"
@@ -34,6 +31,7 @@
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" LinkBase="Shared\" Exclude="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Shared\" />
<Compile Include="$(SharedSourceRoot)TaskToApm.cs" Link="Shared\TaskToApm.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\" />
<Compile Include="$(KestrelSharedSourceRoot)test\TransportTestHelpers\MsQuicSupportedAttribute.cs" LinkBase="Shared\" />
<Compile Include="$(KestrelSharedSourceRoot)test\TransportTestHelpers\HttpSysHttp3SupportedAttribute.cs" LinkBase="shared\" />
</ItemGroup>
diff --git a/src/Servers/IIS/IIS/test/IIS.LongTests/IIS.LongTests.csproj b/src/Servers/IIS/IIS/test/IIS.LongTests/IIS.LongTests.csproj
index 993642d240..5f6ccde7ed 100644
--- a/src/Servers/IIS/IIS/test/IIS.LongTests/IIS.LongTests.csproj
+++ b/src/Servers/IIS/IIS/test/IIS.LongTests/IIS.LongTests.csproj
@@ -29,6 +29,7 @@
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" LinkBase="Shared\" Exclude="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Shared\" />
<Compile Include="$(SharedSourceRoot)TaskToApm.cs" Link="Shared\TaskToApm.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/IIS/IIS/test/IIS.NewHandler.FunctionalTests/IIS.NewHandler.FunctionalTests.csproj b/src/Servers/IIS/IIS/test/IIS.NewHandler.FunctionalTests/IIS.NewHandler.FunctionalTests.csproj
index f2f7e93bb6..acf593717f 100644
--- a/src/Servers/IIS/IIS/test/IIS.NewHandler.FunctionalTests/IIS.NewHandler.FunctionalTests.csproj
+++ b/src/Servers/IIS/IIS/test/IIS.NewHandler.FunctionalTests/IIS.NewHandler.FunctionalTests.csproj
@@ -22,6 +22,7 @@
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" LinkBase="Shared\" Exclude="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Shared\" />
<Compile Include="$(SharedSourceRoot)TaskToApm.cs" Link="Shared\TaskToApm.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/IIS.NewShim.FunctionalTests.csproj b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/IIS.NewShim.FunctionalTests.csproj
index 8bbfb032da..d9faa225cb 100644
--- a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/IIS.NewShim.FunctionalTests.csproj
+++ b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/IIS.NewShim.FunctionalTests.csproj
@@ -32,6 +32,7 @@
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" LinkBase="Shared\" Exclude="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Shared\" />
<Compile Include="$(SharedSourceRoot)TaskToApm.cs" Link="Shared\TaskToApm.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/NewShimTests.cs b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/NewShimTests.cs
index c85af18329..133b05ce1e 100644
--- a/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/NewShimTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.NewShim.FunctionalTests/NewShimTests.cs
@@ -27,10 +27,11 @@ public class NewShimTests : IISFunctionalTestBase
{
if (handle.ModuleName == "aspnetcorev2_inprocess.dll")
{
- Assert.Equal("12.2.18316.0", handle.FileVersionInfo.FileVersion);
+ Assert.Equal("12.2.19169.6", handle.FileVersionInfo.FileVersion);
return;
}
}
+
throw new XunitException($"Could not find aspnetcorev2_inprocess.dll loaded in process {result.HostProcess.ProcessName}");
}
}
diff --git a/src/Servers/IIS/IIS/test/IIS.ShadowCopy.Tests/ShadowCopyTests.cs b/src/Servers/IIS/IIS/test/IIS.ShadowCopy.Tests/ShadowCopyTests.cs
index c37cbe7274..8f5ca5c0dc 100644
--- a/src/Servers/IIS/IIS/test/IIS.ShadowCopy.Tests/ShadowCopyTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.ShadowCopy.Tests/ShadowCopyTests.cs
@@ -168,7 +168,6 @@ public class ShadowCopyTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/40619")]
public async Task ShadowCopyE2EWorksWithOldFoldersPresent()
{
using var directory = TempDirectory.Create();
@@ -253,7 +252,6 @@ public class ShadowCopyTests : IISFunctionalTestBase
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/40059")]
public async Task ShadowCopyIgnoresItsOwnDirectoryWithRelativePathSegmentWhenCopying()
{
using var directory = TempDirectory.Create();
diff --git a/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/ApplicationInitializationTests.cs b/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/ApplicationInitializationTests.cs
index f13e6e2e2a..4e46f788c3 100644
--- a/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/ApplicationInitializationTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/ApplicationInitializationTests.cs
@@ -61,6 +61,7 @@ public class ApplicationInitializationTests : IISFunctionalTestBase
[RequiresNewHandler]
[InlineData(HostingModel.InProcess)]
[InlineData(HostingModel.OutOfProcess)]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42658")]
public async Task ApplicationInitializationPageIsRequested(HostingModel hostingModel)
{
// This test often hits a memory leak in warmup.dll module, it has been reported to IIS team
diff --git a/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/StdOutRedirectionTests.cs b/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/StdOutRedirectionTests.cs
index 260919c6de..6e34d43f20 100644
--- a/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/StdOutRedirectionTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.Shared.FunctionalTests/StdOutRedirectionTests.cs
@@ -54,6 +54,7 @@ public class StdOutRedirectionTests : IISFunctionalTestBase
[ConditionalFact]
[RequiresNewShim]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/43087")]
public async Task FrameworkNotFoundExceptionLogged_File()
{
var deploymentParameters =
@@ -107,6 +108,7 @@ public class StdOutRedirectionTests : IISFunctionalTestBase
}
[ConditionalTheory]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42913")]
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
[SkipIfDebug]
[InlineData("CheckLargeStdErrWrites")]
@@ -131,6 +133,7 @@ public class StdOutRedirectionTests : IISFunctionalTestBase
}
[ConditionalTheory]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42820")]
[RequiresIIS(IISCapability.PoolEnvironmentVariables)]
[SkipIfDebug]
[InlineData("CheckLargeStdErrWrites")]
diff --git a/src/Servers/IIS/IIS/test/IIS.Tests/IIS.Tests.csproj b/src/Servers/IIS/IIS/test/IIS.Tests/IIS.Tests.csproj
index 0b56bed4bd..605656b955 100644
--- a/src/Servers/IIS/IIS/test/IIS.Tests/IIS.Tests.csproj
+++ b/src/Servers/IIS/IIS/test/IIS.Tests/IIS.Tests.csproj
@@ -5,6 +5,7 @@
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<InProcessTestSite>true</InProcessTestSite>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<Import Project="../FunctionalTest.props" />
@@ -19,6 +20,7 @@
<Reference Include="Microsoft.AspNetCore.Server.IIS" />
<Reference Include="Microsoft.Extensions.Logging" />
<Reference Include="System.Diagnostics.EventLog" />
+ <Reference Include="System.Private.Uri" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/IIS/IIS/test/IIS.Tests/ResponseAbortTests.cs b/src/Servers/IIS/IIS/test/IIS.Tests/ResponseAbortTests.cs
index f614cdc2a1..dc03cef8df 100644
--- a/src/Servers/IIS/IIS/test/IIS.Tests/ResponseAbortTests.cs
+++ b/src/Servers/IIS/IIS/test/IIS.Tests/ResponseAbortTests.cs
@@ -34,7 +34,6 @@ public class ResponseAbortTests : StrictTestServerTests
}
[ConditionalFact]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/31404")]
public async Task ClosesAfterDataSent()
{
var bodyReceived = CreateTaskCompletionSource();
diff --git a/src/Servers/IIS/IIS/test/IIS.Tests/ResponseBodySizeTests.cs b/src/Servers/IIS/IIS/test/IIS.Tests/ResponseBodySizeTests.cs
new file mode 100644
index 0000000000..69dbc0858c
--- /dev/null
+++ b/src/Servers/IIS/IIS/test/IIS.Tests/ResponseBodySizeTests.cs
@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Server.IIS.FunctionalTests;
+using Microsoft.AspNetCore.Testing;
+
+namespace IIS.Tests;
+
+[SkipIfHostableWebCoreNotAvailable]
+[MinimumOSVersion(OperatingSystems.Windows, WindowsVersions.Win8, SkipReason = "https://github.com/aspnet/IISIntegration/issues/866")]
+public class ResponseBodySizeTests : LoggedTest
+{
+ [ConditionalFact]
+ public async Task WriteAsyncShouldCorrectlyHandleBigBuffers()
+ {
+ const int bufferSize = 256 * 1024 * 1024;
+
+ using (var testServer = await TestServer.Create(
+ async ctx =>
+ {
+ var buffer = new byte[bufferSize];
+ await ctx.Response.Body.WriteAsync(buffer, 0, buffer.Length);
+
+ }, LoggerFactory))
+ {
+ var response = await testServer.HttpClient.GetAsync("/");
+ var content = await response.Content.ReadAsByteArrayAsync();
+
+ Assert.Equal(bufferSize, content.Length);
+ }
+ }
+}
diff --git a/src/Servers/IIS/IIS/test/IIS.Tests/Utilities/TestServer.cs b/src/Servers/IIS/IIS/test/IIS.Tests/Utilities/TestServer.cs
index a4bd602edc..1d3be52275 100644
--- a/src/Servers/IIS/IIS/test/IIS.Tests/Utilities/TestServer.cs
+++ b/src/Servers/IIS/IIS/test/IIS.Tests/Utilities/TestServer.cs
@@ -23,7 +23,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests;
-public class TestServer : IDisposable
+public partial class TestServer : IDisposable
{
private const string InProcessHandlerDll = "aspnetcorev2_inprocess.dll";
private const string AspNetCoreModuleDll = "aspnetcorev2.dll";
@@ -178,23 +178,23 @@ public class TestServer : IDisposable
private delegate int hostfxr_main_fn(IntPtr argc, IntPtr argv);
- [DllImport(HWebCoreDll)]
- private static extern int WebCoreActivate(
- [In, MarshalAs(UnmanagedType.LPWStr)]
+ [LibraryImport(HWebCoreDll)]
+ private static partial int WebCoreActivate(
+ [MarshalAs(UnmanagedType.LPWStr)]
string appHostConfigPath,
- [In, MarshalAs(UnmanagedType.LPWStr)]
+ [MarshalAs(UnmanagedType.LPWStr)]
string rootWebConfigPath,
- [In, MarshalAs(UnmanagedType.LPWStr)]
+ [MarshalAs(UnmanagedType.LPWStr)]
string instanceName);
- [DllImport(HWebCoreDll)]
- private static extern int WebCoreShutdown(bool immediate);
+ [LibraryImport(HWebCoreDll)]
+ private static partial int WebCoreShutdown([MarshalAs(UnmanagedType.Bool)] bool immediate);
- [DllImport(InProcessHandlerDll)]
- private static extern int set_main_handler(hostfxr_main_fn main);
+ [LibraryImport(InProcessHandlerDll)]
+ private static partial int set_main_handler(hostfxr_main_fn main);
- [DllImport("kernel32", SetLastError = true, CharSet = CharSet.Ansi)]
- private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
+ [LibraryImport("kernel32", EntryPoint = "LoadLibraryW", SetLastError = true)]
+ private static partial IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPWStr)] string lpFileName);
private void Retry(Action func, int attempts)
{
diff --git a/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
index 4260359467..ff8b63d4fd 100644
--- a/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
+++ b/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<Import Project="../FunctionalTest.props" />
@@ -34,6 +34,7 @@
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" LinkBase="Shared\" Exclude="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" LinkBase="Shared\" />
<Compile Include="$(SharedSourceRoot)TaskToApm.cs" Link="Shared\TaskToApm.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs b/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
index 65da17c282..c965ddb357 100644
--- a/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
+++ b/src/Servers/IIS/IIS/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs
@@ -5,6 +5,7 @@ using System;
using System.Globalization;
using System.Linq;
using System.Net.Http;
+using System.Net.Sockets;
using System.Net.WebSockets;
using System.Text;
using System.Threading;
@@ -78,6 +79,67 @@ public class WebSocketsTests
}
}
+ [ConditionalFact]
+ public async Task Http1_0_Request_NotUpgradable()
+ {
+ Uri uri = new Uri(_requestUri + "WebSocketNotUpgradable");
+ using TcpClient client = new TcpClient();
+
+ await client.ConnectAsync(uri.Host, uri.Port);
+ NetworkStream stream = client.GetStream();
+
+ await SendHttp10Request(stream, uri);
+
+ StreamReader reader = new StreamReader(stream);
+ string statusLine = await reader.ReadLineAsync();
+ string[] parts = statusLine.Split(' ');
+ if (int.Parse(parts[1], CultureInfo.InvariantCulture) != 200)
+ {
+ throw new InvalidOperationException("The response status code was incorrect: " + statusLine);
+ }
+ }
+
+ [ConditionalFact]
+ public async Task Http1_0_Request_UpgradeErrors()
+ {
+ Uri uri = new Uri(_requestUri + "WebSocketUpgradeFails");
+ using TcpClient client = new TcpClient();
+
+ await client.ConnectAsync(uri.Host, uri.Port);
+ NetworkStream stream = client.GetStream();
+
+ await SendHttp10Request(stream, uri);
+
+ StreamReader reader = new StreamReader(stream);
+ string statusLine = await reader.ReadLineAsync();
+ string[] parts = statusLine.Split(' ');
+ if (int.Parse(parts[1], CultureInfo.InvariantCulture) != 200)
+ {
+ throw new InvalidOperationException("The response status code was incorrect: " + statusLine);
+ }
+ }
+
+ private async Task SendHttp10Request(NetworkStream stream, Uri uri)
+ {
+ // Send an HTTP GET request
+ StringBuilder builder = new StringBuilder();
+ builder.Append("GET");
+ builder.Append(" ");
+ builder.Append(uri.PathAndQuery);
+ builder.Append(" HTTP/1.0");
+ builder.AppendLine();
+
+ builder.Append("Host: ");
+ builder.Append(uri.Host);
+ builder.Append(':');
+ builder.Append(uri.Port);
+ builder.AppendLine();
+
+ builder.AppendLine();
+ var requestBytes = Encoding.ASCII.GetBytes(builder.ToString());
+ await stream.WriteAsync(requestBytes, 0, requestBytes.Length);
+ }
+
private async Task SendMessage(ClientWebSocket webSocket, string message)
{
await webSocket.SendAsync(new ArraySegment<byte>(Encoding.ASCII.GetBytes(message)), WebSocketMessageType.Text, true, default);
diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj b/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj
index 1f2caa733b..9edc221a06 100644
--- a/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj
+++ b/src/Servers/IIS/IIS/test/testassets/InProcessNewShimWebSite/InProcessNewShimWebSite.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<Import Project="..\..\..\..\build\testsite.props" />
<PropertyGroup>
@@ -7,6 +7,7 @@
<DefineConstants>FORWARDCOMPAT</DefineConstants>
<CompileUsingReferenceAssemblies>false</CompileUsingReferenceAssemblies>
<ImplicitUsings>disable</ImplicitUsings>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup Condition="'$(OS)' == 'Windows_NT'">
@@ -28,7 +29,7 @@
<ItemGroup>
<!-- This package is hard-coded to the 2.2.0 package as a part of ensuring ANCM stays forward compatible. -->
- <PackageReference Include="Microsoft.AspNetCore.Server.IIS" Version="2.2.0">
+ <PackageReference Include="Microsoft.AspNetCore.Server.IIS" Version="2.2.6">
<AllowExplicitReference>true</AllowExplicitReference>
</PackageReference>
</ItemGroup>
@@ -58,6 +59,9 @@
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" >
<AllowExplicitReference>true</AllowExplicitReference>
</PackageReference>
+ <PackageReference Include="System.Private.Uri" Version="4.3.2" >
+ <AllowExplicitReference>true</AllowExplicitReference>
+ </PackageReference>
<PackageReference Include="System.Text.Encodings.Web" Version="4.5.1" >
<AllowExplicitReference>true</AllowExplicitReference>
</PackageReference>
diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj
index b457ae1279..be69b71e92 100644
--- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj
+++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj
@@ -4,6 +4,7 @@
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<InProcessTestSite>true</InProcessTestSite>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup Condition="'$(OS)' == 'Windows_NT'">
@@ -32,6 +33,7 @@
<Reference Include="Microsoft.Extensions.Configuration.Json" />
<Reference Include="Microsoft.Extensions.Hosting" />
<Reference Include="Microsoft.Extensions.Logging.Console" />
+ <Reference Include="System.Private.Uri" />
<Reference Include="xunit.assert" />
</ItemGroup>
</Project>
diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs
index af9718ec54..d0750ef81f 100644
--- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs
+++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.WebSockets.cs
@@ -25,7 +25,6 @@ public partial class Startup
{
app.Run(context =>
{
-
var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>();
Assert.False(upgradeFeature.IsUpgradableRequest);
return Task.CompletedTask;
@@ -36,7 +35,6 @@ public partial class Startup
{
app.Run(context =>
{
-
var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>();
Assert.True(upgradeFeature.IsUpgradableRequest);
return Task.CompletedTask;
@@ -47,7 +45,6 @@ public partial class Startup
{
app.Run(async context =>
{
-
var singleByteArray = new byte[1];
Assert.Equal(0, await context.Request.Body.ReadAsync(singleByteArray, 0, 1));
@@ -75,7 +72,6 @@ public partial class Startup
{
app.Run(async context =>
{
-
var messages = new List<string>();
context.Response.OnStarting(() =>
@@ -92,6 +88,16 @@ public partial class Startup
});
}
+ private void WebSocketUpgradeFails(IApplicationBuilder app)
+ {
+ app.Run(async context =>
+ {
+ var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>();
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => upgradeFeature.UpgradeAsync());
+ Assert.Equal("Upgrade requires HTTP/1.1.", ex.Message);
+ });
+ }
+
private static async Task SendMessages(WebSocket webSocket, params string[] messages)
{
foreach (var message in messages)
diff --git a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs
index de9ddf614f..d394828b9e 100644
--- a/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs
+++ b/src/Servers/IIS/IIS/test/testassets/InProcessWebSite/Startup.cs
@@ -9,6 +9,7 @@ using System.IO;
using System.Linq;
using System.Net;
using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
using System.Security.Principal;
using System.Text;
using System.Threading;
@@ -179,16 +180,6 @@ public partial class Startup
});
}
- [DllImport("kernel32.dll")]
- static extern uint GetDllDirectory(uint nBufferLength, [Out] StringBuilder lpBuffer);
-
- private async Task DllDirectory(HttpContext context)
- {
- var builder = new StringBuilder(1024);
- GetDllDirectory(1024, builder);
- await context.Response.WriteAsync(builder.ToString());
- }
-
private async Task GetEnvironmentVariable(HttpContext ctx)
{
await ctx.Response.WriteAsync(Environment.GetEnvironmentVariable(ctx.Request.Query["name"].ToString()));
diff --git a/src/Servers/IIS/IIS/test/testassets/shared/WebSockets/HandshakeHelpers.cs b/src/Servers/IIS/IIS/test/testassets/shared/WebSockets/HandshakeHelpers.cs
index d361c92108..4264b3f17f 100644
--- a/src/Servers/IIS/IIS/test/testassets/shared/WebSockets/HandshakeHelpers.cs
+++ b/src/Servers/IIS/IIS/test/testassets/shared/WebSockets/HandshakeHelpers.cs
@@ -24,10 +24,7 @@ internal static class HandshakeHelpers
// this concatenated value to obtain a 20-byte value and base64-encoding"
// https://tools.ietf.org/html/rfc6455#section-4.2.2
- if (requestKey == null)
- {
- throw new ArgumentNullException(nameof(requestKey));
- }
+ ArgumentNullException.ThrowIfNull(requestKey);
string merged = requestKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
byte[] mergedBytes = Encoding.UTF8.GetBytes(merged);
diff --git a/src/Servers/IIS/IISIntegration/src/AuthenticationHandler.cs b/src/Servers/IIS/IISIntegration/src/AuthenticationHandler.cs
index 9ea5973df8..8f487998ac 100644
--- a/src/Servers/IIS/IISIntegration/src/AuthenticationHandler.cs
+++ b/src/Servers/IIS/IISIntegration/src/AuthenticationHandler.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Server.IISIntegration;
-internal class AuthenticationHandler : IAuthenticationHandler
+internal sealed class AuthenticationHandler : IAuthenticationHandler
{
private WindowsPrincipal? _user;
private HttpContext? _context;
diff --git a/src/Servers/IIS/IISIntegration/src/ForwardedTlsConnectionFeature.cs b/src/Servers/IIS/IISIntegration/src/ForwardedTlsConnectionFeature.cs
index f655f0149b..356b82ebb3 100644
--- a/src/Servers/IIS/IISIntegration/src/ForwardedTlsConnectionFeature.cs
+++ b/src/Servers/IIS/IISIntegration/src/ForwardedTlsConnectionFeature.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Server.IISIntegration;
-internal class ForwardedTlsConnectionFeature : ITlsConnectionFeature
+internal sealed class ForwardedTlsConnectionFeature : ITlsConnectionFeature
{
private StringValues _header;
private X509Certificate2? _certificate;
diff --git a/src/Servers/IIS/IISIntegration/src/IISMiddleware.cs b/src/Servers/IIS/IISIntegration/src/IISMiddleware.cs
index e63045c34e..65a5b601b3 100644
--- a/src/Servers/IIS/IISIntegration/src/IISMiddleware.cs
+++ b/src/Servers/IIS/IISIntegration/src/IISMiddleware.cs
@@ -73,22 +73,10 @@ public class IISMiddleware
IAuthenticationSchemeProvider authentication,
IHostApplicationLifetime applicationLifetime)
{
- if (next == null)
- {
- throw new ArgumentNullException(nameof(next));
- }
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
- if (applicationLifetime == null)
- {
- throw new ArgumentNullException(nameof(applicationLifetime));
- }
+ ArgumentNullException.ThrowIfNull(next);
+ ArgumentNullException.ThrowIfNull(loggerFactory);
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(applicationLifetime);
if (string.IsNullOrEmpty(pairingToken))
{
throw new ArgumentException("Missing or empty pairing token.");
diff --git a/src/Servers/IIS/IISIntegration/src/IISSetupFilter.cs b/src/Servers/IIS/IISIntegration/src/IISSetupFilter.cs
index c0ad1949b1..8be0f0ee7d 100644
--- a/src/Servers/IIS/IISIntegration/src/IISSetupFilter.cs
+++ b/src/Servers/IIS/IISIntegration/src/IISSetupFilter.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Http;
namespace Microsoft.AspNetCore.Server.IISIntegration;
-internal class IISSetupFilter : IStartupFilter
+internal sealed class IISSetupFilter : IStartupFilter
{
private readonly string _pairingToken;
private readonly PathString _pathBase;
diff --git a/src/Servers/IIS/IISIntegration/src/NativeMethods.cs b/src/Servers/IIS/IISIntegration/src/NativeMethods.cs
index e24c14fc1b..df927ded80 100644
--- a/src/Servers/IIS/IISIntegration/src/NativeMethods.cs
+++ b/src/Servers/IIS/IISIntegration/src/NativeMethods.cs
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
namespace Microsoft.AspNetCore.Server.IISIntegration;
-internal static class NativeMethods
+internal static partial class NativeMethods
{
private const string KERNEL32 = "kernel32.dll";
- [DllImport(KERNEL32, ExactSpelling = true, SetLastError = true)]
-
- public static extern bool CloseHandle(IntPtr handle);
+ [LibraryImport(KERNEL32, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ public static partial bool CloseHandle(IntPtr handle);
}
diff --git a/src/Servers/IIS/IISIntegration/src/PublicAPI.Shipped.txt b/src/Servers/IIS/IISIntegration/src/PublicAPI.Shipped.txt
index 07683ebaaf..b3daf4c184 100644
--- a/src/Servers/IIS/IISIntegration/src/PublicAPI.Shipped.txt
+++ b/src/Servers/IIS/IISIntegration/src/PublicAPI.Shipped.txt
@@ -1,6 +1,6 @@
#nullable enable
-~Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, bool isWebsocketsSupported, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
-~Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
+Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, bool isWebsocketsSupported, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
+Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
const Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme = "Windows" -> string!
const Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.Negotiate = "Negotiate" -> string!
const Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.Ntlm = "NTLM" -> string!
diff --git a/src/Servers/IIS/IISIntegration/src/PublicAPI.Unshipped.txt b/src/Servers/IIS/IISIntegration/src/PublicAPI.Unshipped.txt
index bcee8ca36f..7dc5c58110 100644
--- a/src/Servers/IIS/IISIntegration/src/PublicAPI.Unshipped.txt
+++ b/src/Servers/IIS/IISIntegration/src/PublicAPI.Unshipped.txt
@@ -1,5 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, bool isWebsocketsSupported, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
-*REMOVED*~Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
-Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, bool isWebsocketsSupported, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
-Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.IISMiddleware(Microsoft.AspNetCore.Http.RequestDelegate! next, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Builder.IISOptions!>! options, string! pairingToken, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider! authentication, Microsoft.Extensions.Hosting.IHostApplicationLifetime! applicationLifetime) -> void
diff --git a/src/Servers/IIS/IISIntegration/src/WebHostBuilderIISExtensions.cs b/src/Servers/IIS/IISIntegration/src/WebHostBuilderIISExtensions.cs
index fbb366085c..46f7dfd714 100644
--- a/src/Servers/IIS/IISIntegration/src/WebHostBuilderIISExtensions.cs
+++ b/src/Servers/IIS/IISIntegration/src/WebHostBuilderIISExtensions.cs
@@ -30,10 +30,7 @@ public static class WebHostBuilderIISExtensions
/// <returns></returns>
public static IWebHostBuilder UseIISIntegration(this IWebHostBuilder hostBuilder)
{
- if (hostBuilder == null)
- {
- throw new ArgumentNullException(nameof(hostBuilder));
- }
+ ArgumentNullException.ThrowIfNull(hostBuilder);
// Check if `UseIISIntegration` was called already
if (hostBuilder.GetSetting(nameof(UseIISIntegration)) != null)
diff --git a/src/Servers/IIS/IntegrationTesting.IIS/src/ApplicationDeployerFactory.cs b/src/Servers/IIS/IntegrationTesting.IIS/src/ApplicationDeployerFactory.cs
index c64fbca516..31a241aeed 100644
--- a/src/Servers/IIS/IntegrationTesting.IIS/src/ApplicationDeployerFactory.cs
+++ b/src/Servers/IIS/IntegrationTesting.IIS/src/ApplicationDeployerFactory.cs
@@ -19,15 +19,9 @@ public class IISApplicationDeployerFactory
/// <returns></returns>
public static ApplicationDeployer Create(DeploymentParameters deploymentParameters, ILoggerFactory loggerFactory)
{
- if (deploymentParameters == null)
- {
- throw new ArgumentNullException(nameof(deploymentParameters));
- }
+ ArgumentNullException.ThrowIfNull(deploymentParameters);
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(loggerFactory);
switch (deploymentParameters.ServerType)
{
diff --git a/src/Servers/IIS/IntegrationTesting.IIS/src/IISDeployer.cs b/src/Servers/IIS/IntegrationTesting.IIS/src/IISDeployer.cs
index d1d8e4e5d7..e00dca54d2 100644
--- a/src/Servers/IIS/IntegrationTesting.IIS/src/IISDeployer.cs
+++ b/src/Servers/IIS/IntegrationTesting.IIS/src/IISDeployer.cs
@@ -2,9 +2,12 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Globalization;
using System.ServiceProcess;
+using System.Text;
using System.Xml.Linq;
using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
+using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
using Microsoft.Web.Administration;
@@ -235,25 +238,24 @@ public class IISDeployer : IISDeployerBase
RetryServerManagerAction(serverManager =>
{
- var site = serverManager.Sites.Single();
- var appPool = serverManager.ApplicationPools.Single();
-
- var actualPath = site.Applications.FirstOrDefault().VirtualDirectories.Single().PhysicalPath;
- if (actualPath != contentRoot)
+ var site = FindSite(serverManager, contentRoot);
+ if (site == null)
{
- throw new InvalidOperationException($"Wrong physical path. Expected: {contentRoot} Actual: {actualPath}");
+ PreserveConfigFiles("nositetostart");
+ throw new InvalidOperationException($"Can't find site for: {contentRoot} to start.");
}
+ var appPool = serverManager.ApplicationPools.Single();
if (appPool.State != ObjectState.Started && appPool.State != ObjectState.Starting)
{
var state = appPool.Start();
- Logger.LogInformation($"Starting pool, state: {state.ToString()}");
+ Logger.LogInformation($"Starting pool, state: {state}");
}
if (site.State != ObjectState.Started && site.State != ObjectState.Starting)
{
var state = site.Start();
- Logger.LogInformation($"Starting site, state: {state.ToString()}");
+ Logger.LogInformation($"Starting site, state: {state}");
}
if (site.State != ObjectState.Started)
@@ -264,7 +266,8 @@ public class IISDeployer : IISDeployerBase
var workerProcess = appPool.WorkerProcesses.SingleOrDefault();
if (workerProcess == null)
{
- throw new InvalidOperationException("Site is started but no worked process found");
+ PreserveConfigFiles("noworkerprocess");
+ throw new InvalidOperationException("Site is started but no worker process found");
}
HostProcess = Process.GetProcessById(workerProcess.ProcessId);
@@ -280,6 +283,19 @@ public class IISDeployer : IISDeployerBase
});
}
+ private static Site FindSite(ServerManager serverManager, string contentRoot)
+ {
+ foreach (var site in serverManager.Sites)
+ {
+ var app = site.Applications.FirstOrDefault();
+ if (app != null && app.VirtualDirectories.FirstOrDefault()?.PhysicalPath == contentRoot)
+ {
+ return site;
+ }
+ }
+ return null;
+ }
+
private void AddTemporaryAppHostConfig(string contentRoot, int port)
{
_configPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("D"));
@@ -305,6 +321,7 @@ public class IISDeployer : IISDeployerBase
serverManager.CommitChanges();
+ PreserveConfigFiles("redirectionbetween");
throw new InvalidOperationException("Redirection is enabled between test runs.");
}
@@ -361,45 +378,47 @@ public class IISDeployer : IISDeployerBase
{
RetryServerManagerAction(serverManager =>
{
- var site = serverManager.Sites.SingleOrDefault();
- if (site == null)
+ // Stop all sites
+ foreach (var site in serverManager.Sites)
{
- throw new InvalidOperationException("Site not found");
- }
-
- if (site.State != ObjectState.Stopped && site.State != ObjectState.Stopping)
- {
- var state = site.Stop();
- Logger.LogInformation($"Stopping site, state: {state.ToString()}");
- }
-
- var appPool = serverManager.ApplicationPools.SingleOrDefault();
- if (appPool == null)
- {
- throw new InvalidOperationException("Application pool not found");
+ if (site.State != ObjectState.Stopped && site.State != ObjectState.Stopping)
+ {
+ var state = site.Stop();
+ Logger.LogInformation($"Stopping site, state: {state}");
+ }
}
- if (appPool.State != ObjectState.Stopped && appPool.State != ObjectState.Stopping)
+ // Stop all app pools
+ foreach (var appPool in serverManager.ApplicationPools)
{
- var state = appPool.Stop();
- Logger.LogInformation($"Stopping pool, state: {state.ToString()}");
+ if (appPool.State != ObjectState.Stopped && appPool.State != ObjectState.Stopping)
+ {
+ var state = appPool.Stop();
+ Logger.LogInformation($"Stopping pool, state: {state}");
+ }
}
-
- if (site.State != ObjectState.Stopped)
+
+ // Make sure all sites are stopped
+ foreach (var site in serverManager.Sites)
{
- throw new InvalidOperationException("Site not stopped yet");
+ if (site.State != ObjectState.Stopped)
+ {
+ throw new InvalidOperationException($"Site {site.Name} not stopped yet");
+ }
}
try
{
- if (appPool.WorkerProcesses != null &&
- appPool.WorkerProcesses.Any(wp =>
- wp.State == WorkerProcessState.Running ||
- wp.State == WorkerProcessState.Stopping))
+ foreach (var appPool in serverManager.ApplicationPools)
{
- throw new InvalidOperationException("WorkerProcess not stopped yet");
+ if (appPool.WorkerProcesses != null &&
+ appPool.WorkerProcesses.Any(wp =>
+ wp.State == WorkerProcessState.Running ||
+ wp.State == WorkerProcessState.Stopping))
+ {
+ throw new InvalidOperationException("WorkerProcess not stopped yet");
+ }
}
-
}
// If WAS was stopped for some reason appPool.WorkerProcesses
// would throw UnauthorizedAccessException.
@@ -413,7 +432,7 @@ public class IISDeployer : IISDeployerBase
}
}
- if (!HostProcess.HasExited)
+ if (HostProcess is not null && !HostProcess.HasExited)
{
throw new InvalidOperationException("Site is stopped but host process is not");
}
@@ -440,7 +459,7 @@ public class IISDeployer : IISDeployerBase
}
}
- private static void RetryServerManagerAction(Action<ServerManager> action)
+ private void RetryServerManagerAction(Action<ServerManager> action)
{
List<Exception> exceptions = null;
var sw = Stopwatch.StartNew();
@@ -473,6 +492,37 @@ public class IISDeployer : IISDeployerBase
delay *= 1.5;
}
- throw new AggregateException($"Operation did not succeed after {retryCount} retries", exceptions.ToArray());
+ // Try to upload the applicationHost config on helix to help debug
+ PreserveConfigFiles("serverManagerRetryFailed");
+
+ throw new AggregateException($"Operation did not succeed after {retryCount} retries, serverManagerConfig: {DumpServerManagerConfig()}", exceptions.ToArray());
+ }
+
+ private void PreserveConfigFiles(string fileNamePrefix)
+ {
+ HelixHelper.PreserveFile(Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "web.config"), fileNamePrefix+".web.config");
+ HelixHelper.PreserveFile(Path.Combine(_configPath, "applicationHost.config"), fileNamePrefix + ".applicationHost.config");
+ HelixHelper.PreserveFile(Path.Combine(Environment.SystemDirectory, @"inetsrv\config\ApplicationHost.config"), fileNamePrefix + ".inetsrv.applicationHost.config");
+ HelixHelper.PreserveFile(Path.Combine(Environment.SystemDirectory, @"inetsrv\config\redirection.config"), fileNamePrefix + ".inetsrv.redirection.config");
+ var tmpFile = Path.GetRandomFileName();
+ File.WriteAllText(tmpFile, DumpServerManagerConfig());
+ HelixHelper.PreserveFile(tmpFile, fileNamePrefix + ".serverManager.dump.txt");
+ }
+
+ private static string DumpServerManagerConfig()
+ {
+ var configDump = new StringBuilder();
+ using (var serverManager = new ServerManager())
+ {
+ foreach (var site in serverManager.Sites)
+ {
+ configDump.AppendLine(CultureInfo.InvariantCulture, $"Site Name:{site.Name} Id:{site.Id} State:{site.State}");
+ }
+ foreach (var appPool in serverManager.ApplicationPools)
+ {
+ configDump.AppendLine(CultureInfo.InvariantCulture, $"AppPool Name:{appPool.Name} Id:{appPool.ProcessModel} State:{appPool.State}");
+ }
+ }
+ return configDump.ToString();
}
}
diff --git a/src/Servers/IIS/IntegrationTesting.IIS/src/IISExpressDeployer.cs b/src/Servers/IIS/IntegrationTesting.IIS/src/IISExpressDeployer.cs
index 9c3b101371..951491335c 100644
--- a/src/Servers/IIS/IntegrationTesting.IIS/src/IISExpressDeployer.cs
+++ b/src/Servers/IIS/IntegrationTesting.IIS/src/IISExpressDeployer.cs
@@ -2,8 +2,10 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using Microsoft.AspNetCore.Server.IntegrationTesting.Common;
@@ -15,7 +17,7 @@ namespace Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
/// <summary>
/// Deployment helper for IISExpress.
/// </summary>
-public class IISExpressDeployer : IISDeployerBase
+public partial class IISExpressDeployer : IISDeployerBase
{
private const string IISExpressRunningMessage = "IIS Express is running.";
private const string FailedToInitializeBindingsMessage = "Failed to initialize site bindings";
@@ -440,17 +442,40 @@ public class IISExpressDeployer : IISDeployerBase
}
}
- private class WindowsNativeMethods
+ private sealed partial class WindowsNativeMethods
{
internal delegate bool EnumWindowProc(IntPtr hwnd, IntPtr lParam);
- [DllImport("user32.dll")]
- internal static extern uint GetWindowThreadProcessId(IntPtr hwnd, out uint lpdwProcessId);
- [DllImport("user32.dll")]
- internal static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
- [DllImport("user32.dll")]
- internal static extern bool EnumWindows(EnumWindowProc callback, IntPtr lParam);
- [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
- internal static extern int GetClassName(IntPtr hWnd, char[] lpClassName, int nMaxCount);
+ [LibraryImport("user32.dll")]
+ internal static partial uint GetWindowThreadProcessId(IntPtr hwnd, out uint lpdwProcessId);
+ [LibraryImport("user32.dll", EntryPoint = "PostMessageW")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static partial bool PostMessage([MarshalUsing(typeof(HandleRefMarshaller))] HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
+ [LibraryImport("user32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static partial bool EnumWindows(EnumWindowProc callback, IntPtr lParam);
+ [LibraryImport("user32.dll", EntryPoint = "GetClassNameW", SetLastError = true)]
+ internal static partial int GetClassName(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.U2)] char[] lpClassName, int nMaxCount);
+
+ [CustomMarshaller(typeof(HandleRef), MarshalMode.ManagedToUnmanagedIn, typeof(ManagedToUnmanagedIn))]
+ internal static class HandleRefMarshaller
+ {
+ internal struct ManagedToUnmanagedIn
+ {
+ private HandleRef _handle;
+
+ public void FromManaged(HandleRef handle)
+ {
+ _handle = handle;
+ }
+
+ public IntPtr ToUnmanaged() => _handle.Handle;
+
+ public void OnInvoked() => GC.KeepAlive(_handle.Wrapper);
+
+ [SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "This method is part of the marshaller shape and is required to be an instance method.")]
+ public void Free() {}
+ }
+ }
}
private void SendStopMessageToProcess(int pid)
diff --git a/src/Servers/IIS/IntegrationTesting.IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj b/src/Servers/IIS/IntegrationTesting.IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj
index 62a4b5b234..e6c3f4276d 100644
--- a/src/Servers/IIS/IntegrationTesting.IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj
+++ b/src/Servers/IIS/IntegrationTesting.IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -20,6 +20,7 @@
<NoWarn>$(NoWarn);NU5100</NoWarn>
<!-- Ignore platform compatibility analyzer warnings for test and test infrastructure -->
<NoWarn>$(NoWarn);CA1416</NoWarn>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<Import Project="..\..\build\assets.props" />
@@ -69,6 +70,7 @@
<Reference Include="Microsoft.NETCore.Windows.ApiSets" />
<Reference Include="Microsoft.Web.Administration" />
<Reference Include="System.Net.Http" />
+ <Reference Include="System.Security.Cryptography.X509Certificates" />
<Reference Include="System.ServiceProcess.ServiceController" />
</ItemGroup>
diff --git a/src/Servers/IIS/IntegrationTesting.IIS/src/ProcessTracker.cs b/src/Servers/IIS/IntegrationTesting.IIS/src/ProcessTracker.cs
index 3fdf0025dd..616f40bfc1 100644
--- a/src/Servers/IIS/IntegrationTesting.IIS/src/ProcessTracker.cs
+++ b/src/Servers/IIS/IntegrationTesting.IIS/src/ProcessTracker.cs
@@ -8,7 +8,7 @@ using System.Runtime.InteropServices;
namespace Microsoft.AspNetCore.Server.IntegrationTesting.IIS;
// Uses Windows Job Objects to ensure external processes are killed if the current process is terminated non-gracefully.
-internal static class ProcessTracker
+internal static partial class ProcessTracker
{
private static readonly IntPtr _jobHandle = IntiailizeProcessTracker();
@@ -63,15 +63,17 @@ internal static class ProcessTracker
}
}
- [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
- static extern IntPtr CreateJobObject(IntPtr lpJobAttributes, string name);
+ [LibraryImport("kernel32.dll", EntryPoint = "CreateJobObjectW", StringMarshalling = StringMarshalling.Utf16)]
+ private static partial IntPtr CreateJobObject(IntPtr lpJobAttributes, string name);
- [DllImport("kernel32.dll")]
- static extern bool SetInformationJobObject(IntPtr job, JobObjectInfoType infoType,
+ [LibraryImport("kernel32.dll")]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static partial bool SetInformationJobObject(IntPtr job, JobObjectInfoType infoType,
IntPtr lpJobObjectInfo, uint cbJobObjectInfoLength);
- [DllImport("kernel32.dll", SetLastError = true)]
- static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
+ [LibraryImport("kernel32.dll", SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ private static partial bool AssignProcessToJobObject(IntPtr job, IntPtr process);
private enum JobObjectInfoType
{
diff --git a/src/Servers/IIS/build/Build.Common.Settings b/src/Servers/IIS/build/Build.Common.Settings
index b013ae0305..196e069eaf 100644
--- a/src/Servers/IIS/build/Build.Common.Settings
+++ b/src/Servers/IIS/build/Build.Common.Settings
@@ -15,12 +15,8 @@
<SolutionDir Condition="'$(SolutionDir)' == '' Or '$(SolutionDir)' == '*Undefined*'">$(MSBuildThisFileDirectory)..\</SolutionDir>
<Configuration Condition="'$(Configuration)'==''">Debug</Configuration>
<VCProjectVersion>15.0</VCProjectVersion>
- <VCToolsVersion>14.29.30133</VCToolsVersion>
<Keyword>Win32Proj</Keyword>
<Platform Condition="'$(Platform)' == ''">x64</Platform>
- <PlatformToolsetVersion>v142</PlatformToolsetVersion>
- <PlatformToolset>$(PlatformToolsetVersion)</PlatformToolset>
- <WindowsTargetPlatformVersion Condition=" '$(WindowsTargetPlatformVersion)' == '' ">10.0.18362.0</WindowsTargetPlatformVersion>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
@@ -44,8 +40,9 @@
<ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles>
<TreatWarningAsError>true</TreatWarningAsError>
<!-- Microsoft.Security.SystemsADM.10086 - SDL required warnings -->
+ <!-- See https://github.com/dotnet/aspnetcore/issues/40525 -->
<WarningLevel>Level4</WarningLevel>
- <TreatSpecificWarningsAsErrors>4018;4055;4146;4242;4244;4267;4302;4308;4509;4510;4532;4533;4610;4611;4700;4701;4703;4789;4995;4996</TreatSpecificWarningsAsErrors>
+ <TreatSpecificWarningsAsErrors>$(TreatSpecificWarningsAsErrors);4018;4055;4146;4242;4244;4267;4302;4308;4509;4510;4532;4533;4610;4611;4700;4701;4703;4789;4995;4996</TreatSpecificWarningsAsErrors>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<ShowIncludes>false</ShowIncludes>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
diff --git a/src/Servers/Kestrel/Core/src/CoreStrings.resx b/src/Servers/Kestrel/Core/src/CoreStrings.resx
index c9f39d1da1..472e34a318 100644
--- a/src/Servers/Kestrel/Core/src/CoreStrings.resx
+++ b/src/Servers/Kestrel/Core/src/CoreStrings.resx
@@ -423,9 +423,6 @@
<data name="ServerCertificateRequired" xml:space="preserve">
<value>The server certificate parameter is required.</value>
</data>
- <data name="BindingToDefaultAddresses" xml:space="preserve">
- <value>No listening endpoints were configured. Binding to {address0} and {address1} by default.</value>
- </data>
<data name="CertNotFoundInStore" xml:space="preserve">
<value>The requested certificate {subject} could not be found in {storeLocation}/{storeName} with AllowInvalid setting: {allowInvalid}.</value>
</data>
@@ -668,4 +665,55 @@ For more information on configuring HTTPS see https://go.microsoft.com/fwlink/?l
<data name="Http3ControlStreamErrorInitializingOutbound" xml:space="preserve">
<value>Error initializing outbound control stream.</value>
</data>
+ <data name="Http3DatagramStatusMismatch" xml:space="preserve">
+ <value>HTTP/3 datagrams negotiation mismatch. Currently client has it '{clientStatus}' and server has it '{serverStatus}'</value>
+ </data>
+ <data name="Http3MethodMustBeConnectWhenUsingProtocolPseudoHeader" xml:space="preserve">
+ <value>Method must be CONNECT when using the :protocol pseudo-header.</value>
+ </data>
+ <data name="Http3MissingAuthorityOrPathPseudoHeaders" xml:space="preserve">
+ <value>The :authority and/or :path pseudo-headers are missing.</value>
+ </data>
+ <data name="ConnectRequestsWithProtocolRequireSchemeAndPath" xml:space="preserve">
+ <value>'CONNECT' requests with ':protocol' require ':scheme' and ':path'.</value>
+ </data>
+ <data name="ProtocolRequiresConnect" xml:space="preserve">
+ <value>':protocol' is only allowed with the 'CONNECT' method.</value>
+ </data>
+ <data name="CannotAcceptNonConnectRequest" xml:space="preserve">
+ <value>Cannot accept a non-CONNECT request. Check IHttpExtendedConnectFeature.IsExtendedConnect to determine if the request can be accepted.</value>
+ </data>
+ <data name="AcceptCannotBeCalledMultipleTimes" xml:space="preserve">
+ <value>IHttpExtendedConnectFeature.AcceptAsync was already called and can only be called once per request.</value>
+ </data>
+ <data name="ConnectStatusMustBe200" xml:space="preserve">
+ <value>The response status code for a Extended CONNECT request must be 200.</value>
+ </data>
+ <data name="AttemptedToReadHeaderOnAbortedStream" xml:space="preserve">
+ <value>Attempted to read header on aborted stream.</value>
+ </data>
+ <data name="ReceivedLooseWebTransportStream" xml:space="preserve">
+ <value>Received a WebTransport stream that is not associated with an existing WebTransport session.</value>
+ </data>
+ <data name="UnidentifiedStream" xml:space="preserve">
+ <value>Unidentified stream {stream}.</value>
+ </data>
+ <data name="WebTransportFailedToAddStreamToPendingQueue" xml:space="preserve">
+ <value>Failed to add incoming stream to pending queue.</value>
+ </data>
+ <data name="FailedToNegotiateCommonWebTransportVersion" xml:space="preserve">
+ <value>Failed to negotiate a common WebTransport version with client. Kestrel only supports {currentSuppportedVersion}.</value>
+ </data>
+ <data name="WebTransportIsDisabled" xml:space="preserve">
+ <value>WebTransport is disabled. Please enable it before starting a session.</value>
+ </data>
+ <data name="DynamicPortOnMultipleTransportsNotSupported" xml:space="preserve">
+ <value>Dynamic port binding is not supported when binding multiple transports. HTTP/3 not enabled. A port must be specified to support TCP based HTTP/1.1 and HTTP/2, and QUIC based HTTP/3 with the same endpoint.</value>
+ </data>
+ <data name="NonzeroContentLengthNotAllowedOn205" xml:space="preserve">
+ <value>Responses with status code 205 cannot have a non-zero Content-Length value.</value>
+ </data>
+ <data name="Http3ErrorControlStreamClosed" xml:space="preserve">
+ <value>A control stream used by the connection was closed or reset.</value>
+ </data>
</root> \ No newline at end of file
diff --git a/src/Servers/Kestrel/Core/src/Http2Limits.cs b/src/Servers/Kestrel/Core/src/Http2Limits.cs
index 6833ec871e..1f5877e812 100644
--- a/src/Servers/Kestrel/Core/src/Http2Limits.cs
+++ b/src/Servers/Kestrel/Core/src/Http2Limits.cs
@@ -16,15 +16,15 @@ public class Http2Limits
private int _headerTableSize = (int)Http2PeerSettings.DefaultHeaderTableSize;
private int _maxFrameSize = (int)Http2PeerSettings.DefaultMaxFrameSize;
private int _maxRequestHeaderFieldSize = (int)Http2PeerSettings.DefaultMaxFrameSize;
- private int _initialConnectionWindowSize = 1024 * 128; // Larger than the default 64kb, and larger than any one single stream.
- private int _initialStreamWindowSize = 1024 * 96; // Larger than the default 64kb
+ private int _initialConnectionWindowSize = 1024 * 1024; // Equal to SocketTransportOptions.MaxReadBufferSize and larger than any one single stream.
+ private int _initialStreamWindowSize = 768 * 1024; // Larger than the default 64kb and able to use most (3/4ths) of the connection window by itself.
private TimeSpan _keepAlivePingDelay = TimeSpan.MaxValue;
private TimeSpan _keepAlivePingTimeout = TimeSpan.FromSeconds(20);
/// <summary>
/// Limits the number of concurrent request streams per HTTP/2 connection. Excess streams will be refused.
/// <para>
- /// Value must be greater than 0, defaults to 100.
+ /// Value must be greater than 0, defaults to 100 streams.
/// </para>
/// </summary>
public int MaxStreamsPerConnection
@@ -44,7 +44,7 @@ public class Http2Limits
/// <summary>
/// Limits the size of the header compression tables, in octets, the HPACK encoder and decoder on the server can use.
/// <para>
- /// Value must be greater than or equal to 0, defaults to 4096.
+ /// Value must be greater than or equal to 0, defaults to 4096 octets (4 KiB).
/// </para>
/// </summary>
public int HeaderTableSize
@@ -64,7 +64,7 @@ public class Http2Limits
/// <summary>
/// Indicates the size of the largest frame payload that is allowed to be received, in octets. The size must be between 2^14 and 2^24-1.
/// <para>
- /// Value must be between 2^14 and 2^24, defaults to 2^14 (16,384).
+ /// Value must be between 2^14 and 2^24, defaults to 2^14 octets (16 KiB).
/// </para>
/// </summary>
public int MaxFrameSize
@@ -82,9 +82,9 @@ public class Http2Limits
}
/// <summary>
- /// Indicates the size of the maximum allowed size of a request header field sequence. This limit applies to both name and value sequences in their compressed and uncompressed representations.
+ /// Indicates the size of the maximum allowed size of a request header field sequence, in octets. This limit applies to both name and value sequences in their compressed and uncompressed representations.
/// <para>
- /// Value must be greater than 0, defaults to 2^14 (16,384).
+ /// Value must be greater than 0, defaults to 2^14 octets (16 KiB).
/// </para>
/// </summary>
public int MaxRequestHeaderFieldSize
@@ -102,10 +102,10 @@ public class Http2Limits
}
/// <summary>
- /// Indicates how much request body data the server is willing to receive and buffer at a time aggregated across all
+ /// Indicates how much request body data, in bytes, the server is willing to receive and buffer at a time aggregated across all
/// requests (streams) per connection. Note requests are also limited by <see cref="InitialStreamWindowSize"/>
/// <para>
- /// Value must be greater than or equal to 65,535 and less than 2^31, defaults to 128 kb.
+ /// Value must be greater than or equal to 64 KiB and less than 2 GiB, defaults to 1 MiB.
/// </para>
/// </summary>
public int InitialConnectionWindowSize
@@ -124,10 +124,11 @@ public class Http2Limits
}
/// <summary>
- /// Indicates how much request body data the server is willing to receive and buffer at a time per stream.
- /// Note connections are also limited by <see cref="InitialConnectionWindowSize"/>
+ /// Indicates how much request body data, in bytes, the server is willing to receive and buffer at a time per stream.
+ /// Note connections are also limited by <see cref="InitialConnectionWindowSize"/>. There must be space in both the stream
+ /// window and connection window for a client to upload request body data.
/// <para>
- /// Value must be greater than or equal to 65,535 and less than 2^31, defaults to 96 kb.
+ /// Value must be greater than or equal to 64 KiB and less than 2 GiB, defaults to 768 KiB.
/// </para>
/// </summary>
public int InitialStreamWindowSize
diff --git a/src/Servers/Kestrel/Core/src/HttpsConnectionAdapterOptions.cs b/src/Servers/Kestrel/Core/src/HttpsConnectionAdapterOptions.cs
index 1c05815c38..8435bfa998 100644
--- a/src/Servers/Kestrel/Core/src/HttpsConnectionAdapterOptions.cs
+++ b/src/Servers/Kestrel/Core/src/HttpsConnectionAdapterOptions.cs
@@ -29,7 +29,7 @@ public class HttpsConnectionAdapterOptions
/// <summary>
/// <para>
- /// Specifies the server certificate used to authenticate HTTPS connections. This is ignored if ServerCertificateSelector is set.
+ /// Specifies the server certificate information presented when an https connection is initiated. This is ignored if ServerCertificateSelector is set.
/// </para>
/// <para>
/// If the server certificate has an Extended Key Usage extension, the usages must include Server Authentication (OID 1.3.6.1.5.5.7.3.1).
@@ -39,6 +39,13 @@ public class HttpsConnectionAdapterOptions
/// <summary>
/// <para>
+ /// Specifies the full server certificate chain presented when an https connection is initiated
+ /// </para>
+ /// </summary>
+ public X509Certificate2Collection? ServerCertificateChain { get; set; }
+
+ /// <summary>
+ /// <para>
/// A callback that will be invoked to dynamically select a server certificate. This is higher priority than ServerCertificate.
/// If SNI is not available then the name parameter will be null. The <see cref="ConnectionContext"/> will be null for HTTP/3 connections.
/// </para>
diff --git a/src/Servers/Kestrel/Core/src/Internal/AddressBindContext.cs b/src/Servers/Kestrel/Core/src/Internal/AddressBindContext.cs
index 705cb23b0b..192b86fe19 100644
--- a/src/Servers/Kestrel/Core/src/Internal/AddressBindContext.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/AddressBindContext.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class AddressBindContext
+internal sealed class AddressBindContext
{
public AddressBindContext(
ServerAddressesFeature serverAddressesFeature,
diff --git a/src/Servers/Kestrel/Core/src/Internal/AddressBinder.cs b/src/Servers/Kestrel/Core/src/Internal/AddressBinder.cs
index 30e0a16d13..e8f8bbee90 100644
--- a/src/Servers/Kestrel/Core/src/Internal/AddressBinder.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/AddressBinder.cs
@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class AddressBinder
+internal sealed class AddressBinder
{
public static async Task BindAsync(IEnumerable<ListenOptions> listenOptions, AddressBindContext context, CancellationToken cancellationToken)
{
@@ -70,7 +70,7 @@ internal class AddressBinder
/// Returns an <see cref="IPEndPoint"/> for the given host an port.
/// If the host parameter isn't "localhost" or an IP address, use IPAddress.Any.
/// </summary>
- protected internal static bool TryCreateIPEndPoint(BindingAddress address, [NotNullWhen(true)] out IPEndPoint? endpoint)
+ internal static bool TryCreateIPEndPoint(BindingAddress address, [NotNullWhen(true)] out IPEndPoint? endpoint)
{
if (!IPAddress.TryParse(address.Host, out var ip))
{
@@ -143,7 +143,7 @@ internal class AddressBinder
Task BindAsync(AddressBindContext context, CancellationToken cancellationToken);
}
- private class DefaultAddressStrategy : IStrategy
+ private sealed class DefaultAddressStrategy : IStrategy
{
public async Task BindAsync(AddressBindContext context, CancellationToken cancellationToken)
{
@@ -151,25 +151,11 @@ internal class AddressBinder
context.ServerOptions.ApplyEndpointDefaults(httpDefault);
await httpDefault.BindAsync(context, cancellationToken).ConfigureAwait(false);
- // Conditional https default, only if a cert is available
- var httpsDefault = ParseAddress(Constants.DefaultServerHttpsAddress, out _);
- context.ServerOptions.ApplyEndpointDefaults(httpsDefault);
-
- if (httpsDefault.IsTls || httpsDefault.TryUseHttps())
- {
- await httpsDefault.BindAsync(context, cancellationToken).ConfigureAwait(false);
- context.Logger.LogDebug(CoreStrings.BindingToDefaultAddresses,
- Constants.DefaultServerAddress, Constants.DefaultServerHttpsAddress);
- }
- else
- {
- // No default cert is available, do not bind to the https endpoint.
- context.Logger.LogDebug(CoreStrings.BindingToDefaultAddress, Constants.DefaultServerAddress);
- }
+ context.Logger.LogDebug(CoreStrings.BindingToDefaultAddress, Constants.DefaultServerAddress);
}
}
- private class OverrideWithAddressesStrategy : AddressesStrategy
+ private sealed class OverrideWithAddressesStrategy : AddressesStrategy
{
public OverrideWithAddressesStrategy(IReadOnlyCollection<string> addresses)
: base(addresses)
@@ -185,7 +171,7 @@ internal class AddressBinder
}
}
- private class OverrideWithEndpointsStrategy : EndpointsStrategy
+ private sealed class OverrideWithEndpointsStrategy : EndpointsStrategy
{
private readonly string[] _originalAddresses;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Certificates/CertificateConfigLoader.cs b/src/Servers/Kestrel/Core/src/Internal/Certificates/CertificateConfigLoader.cs
index eca6922972..d0239122fc 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Certificates/CertificateConfigLoader.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Certificates/CertificateConfigLoader.cs
@@ -10,7 +10,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Certificates;
-internal class CertificateConfigLoader : ICertificateConfigLoader
+internal sealed class CertificateConfigLoader : ICertificateConfigLoader
{
public CertificateConfigLoader(IHostEnvironment hostEnvironment, ILogger<KestrelServer> logger)
{
@@ -23,11 +23,11 @@ internal class CertificateConfigLoader : ICertificateConfigLoader
public bool IsTestMock => false;
- public X509Certificate2? LoadCertificate(CertificateConfig? certInfo, string endpointName)
+ public (X509Certificate2?, X509Certificate2Collection?) LoadCertificate(CertificateConfig? certInfo, string endpointName)
{
if (certInfo is null)
{
- return null;
+ return (null, null);
}
if (certInfo.IsFileCert && certInfo.IsStoreCert)
@@ -37,6 +37,9 @@ internal class CertificateConfigLoader : ICertificateConfigLoader
else if (certInfo.IsFileCert)
{
var certificatePath = Path.Combine(HostEnvironment.ContentRootPath, certInfo.Path!);
+ var fullChain = new X509Certificate2Collection();
+ fullChain.ImportFromPemFile(certificatePath);
+
if (certInfo.KeyPath != null)
{
var certificateKeyPath = Path.Combine(HostEnvironment.ContentRootPath, certInfo.KeyPath);
@@ -55,10 +58,10 @@ internal class CertificateConfigLoader : ICertificateConfigLoader
{
if (OperatingSystem.IsWindows())
{
- return PersistKey(certificate);
+ return (PersistKey(certificate), fullChain);
}
- return certificate;
+ return (certificate, fullChain);
}
else
{
@@ -68,14 +71,14 @@ internal class CertificateConfigLoader : ICertificateConfigLoader
throw new InvalidOperationException(CoreStrings.InvalidPemKey);
}
- return new X509Certificate2(Path.Combine(HostEnvironment.ContentRootPath, certInfo.Path!), certInfo.Password);
+ return (new X509Certificate2(Path.Combine(HostEnvironment.ContentRootPath, certInfo.Path!), certInfo.Password), fullChain);
}
else if (certInfo.IsStoreCert)
{
- return LoadFromStoreCert(certInfo);
+ return (LoadFromStoreCert(certInfo), null);
}
- return null;
+ return (null, null);
}
private static X509Certificate2 PersistKey(X509Certificate2 fullCertificate)
diff --git a/src/Servers/Kestrel/Core/src/Internal/Certificates/ICertificateConfigLoader.cs b/src/Servers/Kestrel/Core/src/Internal/Certificates/ICertificateConfigLoader.cs
index e6dbbfb858..182b353b0e 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Certificates/ICertificateConfigLoader.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Certificates/ICertificateConfigLoader.cs
@@ -9,5 +9,5 @@ internal interface ICertificateConfigLoader
{
bool IsTestMock { get; }
- X509Certificate2? LoadCertificate(CertificateConfig? certInfo, string endpointName);
+ (X509Certificate2?, X509Certificate2Collection?) LoadCertificate(CertificateConfig? certInfo, string endpointName);
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/ConfigurationReader.cs b/src/Servers/Kestrel/Core/src/Internal/ConfigurationReader.cs
index 98f20c41ad..152026d05e 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ConfigurationReader.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ConfigurationReader.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Configuration;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class ConfigurationReader
+internal sealed class ConfigurationReader
{
private const string ProtocolsKey = "Protocols";
private const string CertificatesKey = "Certificates";
@@ -236,7 +236,7 @@ internal class ConfigurationReader
// "SslProtocols": [ "Tls11", "Tls12", "Tls13"],
// "ClientCertificateMode" : "NoCertificate"
// }
-internal class EndpointDefaults
+internal sealed class EndpointDefaults
{
public HttpProtocols? Protocols { get; set; }
public SslProtocols? SslProtocols { get; set; }
@@ -264,7 +264,7 @@ internal class EndpointDefaults
// }
// }
// }
-internal class EndpointConfig
+internal sealed class EndpointConfig
{
private readonly ConfigSectionClone _configSectionClone;
@@ -334,7 +334,7 @@ internal class EndpointConfig
}
}
-internal class SniConfig
+internal sealed class SniConfig
{
public HttpProtocols? Protocols { get; set; }
public SslProtocols? SslProtocols { get; set; }
@@ -360,7 +360,7 @@ internal class SniConfig
// "Path": "testCert.pfx",
// "Password": "testPassword"
// }
-internal class CertificateConfig
+internal sealed class CertificateConfig
{
public CertificateConfig(IConfigurationSection configSection)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/ConnectionDispatcher.cs b/src/Servers/Kestrel/Core/src/Internal/ConnectionDispatcher.cs
index ae75b74449..f48a897348 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ConnectionDispatcher.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ConnectionDispatcher.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class ConnectionDispatcher<T> where T : BaseConnectionContext
+internal sealed class ConnectionDispatcher<T> where T : BaseConnectionContext
{
private readonly ServiceContext _serviceContext;
private readonly Func<T, Task> _connectionDelegate;
diff --git a/src/Servers/Kestrel/Core/src/Internal/ConnectionLogScope.cs b/src/Servers/Kestrel/Core/src/Internal/ConnectionLogScope.cs
index f828f65ac9..22094285b9 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ConnectionLogScope.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ConnectionLogScope.cs
@@ -6,7 +6,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object>>
+internal sealed class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object>>
{
private readonly string _connectionId;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/ChunkWriter.cs b/src/Servers/Kestrel/Core/src/Internal/Http/ChunkWriter.cs
index 2a2dcd0dd2..deaa411eac 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/ChunkWriter.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/ChunkWriter.cs
@@ -25,7 +25,7 @@ internal static class ChunkWriter
// This must be explicity typed as ReadOnlySpan<byte>
// It then becomes a non-allocating mapping to the data section of the assembly.
// For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- ReadOnlySpan<byte> hex = new byte[16] { (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f' };
+ ReadOnlySpan<byte> hex = "0123456789abcdef"u8;
var offset = 0;
for (shift = total; shift >= 0; shift -= 4)
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/DateHeaderValueManager.cs b/src/Servers/Kestrel/Core/src/Internal/Http/DateHeaderValueManager.cs
index 3576db3b44..31ad48241a 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/DateHeaderValueManager.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/DateHeaderValueManager.cs
@@ -10,10 +10,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
/// <summary>
/// Manages the generation of the date header value.
/// </summary>
-internal class DateHeaderValueManager : IHeartbeatHandler
+internal sealed class DateHeaderValueManager : IHeartbeatHandler
{
// This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- private static ReadOnlySpan<byte> DatePreambleBytes => new byte[8] { (byte)'\r', (byte)'\n', (byte)'D', (byte)'a', (byte)'t', (byte)'e', (byte)':', (byte)' ' };
+ private static ReadOnlySpan<byte> DatePreambleBytes => "\r\nDate: "u8;
private DateHeaderValues? _dateValues;
@@ -45,7 +45,7 @@ internal class DateHeaderValueManager : IHeartbeatHandler
Volatile.Write(ref _dateValues, dateValues);
}
- public class DateHeaderValues
+ public sealed class DateHeaderValues
{
public readonly byte[] Bytes;
public readonly string String;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs
index 64762913a8..87998e4082 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1Connection.cs
@@ -18,6 +18,8 @@ internal partial class Http1Connection : HttpProtocol, IRequestProcessor, IHttpO
{
internal static ReadOnlySpan<byte> Http2GoAwayHttp11RequiredBytes => new byte[17] { 0, 0, 8, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13 };
+ private const byte ByteCR = (byte)'\r';
+ private const byte ByteLF = (byte)'\n';
private const byte ByteAsterisk = (byte)'*';
private const byte ByteForwardSlash = (byte)'/';
private const string Asterisk = "*";
@@ -151,6 +153,13 @@ internal partial class Http1Connection : HttpProtocol, IRequestProcessor, IHttpO
switch (_requestProcessingStatus)
{
case RequestProcessingStatus.RequestPending:
+ // Skip any empty lines (\r or \n) between requests.
+ // Peek first as a minor performance optimization; it's a quick inlined check.
+ if (reader.TryPeek(out byte b) && (b == ByteCR || b == ByteLF))
+ {
+ reader.AdvancePastAny(ByteCR, ByteLF);
+ }
+
if (reader.End)
{
break;
@@ -512,9 +521,20 @@ internal partial class Http1Connection : HttpProtocol, IRequestProcessor, IHttpO
previousValue == null || previousValue.Length != target.Length ||
!StringUtilities.BytesOrdinalEqualsStringAndAscii(previousValue, target))
{
- // The previous string does not match what the bytes would convert to,
- // so we will need to generate a new string.
- RawTarget = _parsedRawTarget = target.GetAsciiStringNonNullCharacters();
+ try
+ {
+ // The previous string does not match what the bytes would convert to,
+ // so we will need to generate a new string.
+ RawTarget = _parsedRawTarget = target.GetAsciiStringNonNullCharacters();
+ }
+ catch (InvalidOperationException)
+ {
+ // GetAsciiStringNonNullCharacters throws an InvalidOperationException if there are
+ // invalid characters in the string. This is hard to understand/diagnose, so let's
+ // catch it and instead throw a more meaningful error. This matches the behavior in
+ // the origin-form case.
+ ThrowRequestTargetRejected(target);
+ }
// Validation of absolute URIs is slow, but clients
// should not be sending this form anyways, so perf optimization
@@ -625,7 +645,7 @@ internal partial class Http1Connection : HttpProtocol, IRequestProcessor, IHttpO
_requestTimedOut = false;
_requestTargetForm = HttpRequestTarget.Unknown;
_absoluteRequestTarget = null;
- _remainingRequestHeadersBytesAllowed = ServerOptions.Limits.MaxRequestHeadersTotalSize + 2;
+ _remainingRequestHeadersBytesAllowed = (long)ServerOptions.Limits.MaxRequestHeadersTotalSize + 2;
MinResponseDataRate = ServerOptions.Limits.MinResponseDataRate;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs b/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs
index 7254e1b338..b4a2f71d5f 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/Http1OutputProducer.cs
@@ -12,17 +12,15 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.PipeWrite
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
+#pragma warning disable CA1852 // Seal internal types
internal class Http1OutputProducer : IHttpOutputProducer, IDisposable
+#pragma warning restore CA1852 // Seal internal types
{
// Use C#7.3's ReadOnlySpan<byte> optimization for static data https://vcsjones.com/2019/02/01/csharp-readonly-span-bytes-static/
- // "HTTP/1.1 100 Continue\r\n\r\n"
- private static ReadOnlySpan<byte> ContinueBytes => new byte[] { (byte)'H', (byte)'T', (byte)'T', (byte)'P', (byte)'/', (byte)'1', (byte)'.', (byte)'1', (byte)' ', (byte)'1', (byte)'0', (byte)'0', (byte)' ', (byte)'C', (byte)'o', (byte)'n', (byte)'t', (byte)'i', (byte)'n', (byte)'u', (byte)'e', (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' };
- // "HTTP/1.1 "
- private static ReadOnlySpan<byte> HttpVersion11Bytes => new byte[] { (byte)'H', (byte)'T', (byte)'T', (byte)'P', (byte)'/', (byte)'1', (byte)'.', (byte)'1', (byte)' ' };
- // "\r\n\r\n"
- private static ReadOnlySpan<byte> EndHeadersBytes => new byte[] { (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' };
- // "0\r\n\r\n"
- private static ReadOnlySpan<byte> EndChunkedResponseBytes => new byte[] { (byte)'0', (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' };
+ private static ReadOnlySpan<byte> ContinueBytes => "HTTP/1.1 100 Continue\r\n\r\n"u8;
+ private static ReadOnlySpan<byte> HttpVersion11Bytes => "HTTP/1.1 "u8;
+ private static ReadOnlySpan<byte> EndHeadersBytes => "\r\n\r\n"u8;
+ private static ReadOnlySpan<byte> EndChunkedResponseBytes => "0\r\n\r\n"u8;
private const int MaxBeginChunkLength = 10;
private const int EndChunkLength = 2;
@@ -486,7 +484,7 @@ internal class Http1OutputProducer : IHttpOutputProducer, IDisposable
if (_pipeWriterCompleted)
{
- return new ValueTask<FlushResult>(new FlushResult(false,true));
+ return new ValueTask<FlushResult>(new FlushResult(false, true));
}
// Uses same BufferWriter to write response headers and response
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpHeaders.Generated.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpHeaders.Generated.cs
index 412c1b9281..38804c59d2 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpHeaders.Generated.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpHeaders.Generated.cs
@@ -39,6 +39,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
Age,
Allow,
AltSvc,
+ AltUsed,
Authority,
Authorization,
Baggage,
@@ -77,6 +78,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
Origin,
Path,
Pragma,
+ Protocol,
ProxyAuthenticate,
ProxyAuthorization,
ProxyConnection,
@@ -277,7 +279,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
internal partial class HttpHeaders
{
- private readonly static HashSet<string> _internedHeaderNames = new HashSet<string>(96, StringComparer.OrdinalIgnoreCase)
+ private readonly static HashSet<string> _internedHeaderNames = new HashSet<string>(91, StringComparer.OrdinalIgnoreCase)
{
HeaderNames.Accept,
HeaderNames.AcceptCharset,
@@ -295,7 +297,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
HeaderNames.Age,
HeaderNames.Allow,
HeaderNames.AltSvc,
- HeaderNames.Authority,
HeaderNames.Authorization,
HeaderNames.Baggage,
HeaderNames.CacheControl,
@@ -334,9 +335,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
HeaderNames.Link,
HeaderNames.Location,
HeaderNames.MaxForwards,
- HeaderNames.Method,
HeaderNames.Origin,
- HeaderNames.Path,
HeaderNames.Pragma,
HeaderNames.ProxyAuthenticate,
HeaderNames.ProxyAuthorization,
@@ -345,7 +344,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
HeaderNames.Referer,
HeaderNames.RetryAfter,
HeaderNames.RequestId,
- HeaderNames.Scheme,
HeaderNames.SecWebSocketAccept,
HeaderNames.SecWebSocketKey,
HeaderNames.SecWebSocketProtocol,
@@ -353,7 +351,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
HeaderNames.SecWebSocketExtensions,
HeaderNames.Server,
HeaderNames.SetCookie,
- HeaderNames.Status,
HeaderNames.StrictTransportSecurity,
HeaderNames.TE,
HeaderNames.Trailer,
@@ -383,7 +380,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
private HeaderReferences _headers;
public bool HasConnection => (_bits & 0x2L) != 0;
- public bool HasTransferEncoding => (_bits & 0x20000000000L) != 0;
+ public bool HasCookie => (_bits & 0x80000L) != 0;
+ public bool HasTransferEncoding => (_bits & 0x80000000000L) != 0;
public int HostCount => _headers._Host.Count;
@@ -507,14 +505,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_headers._Path = value;
}
}
- public StringValues HeaderScheme
+ public StringValues HeaderProtocol
{
get
{
StringValues value = default;
if ((_bits & 0x80L) != 0)
{
- value = _headers._Scheme;
+ value = _headers._Protocol;
}
return value;
}
@@ -528,6 +526,30 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
_bits &= ~0x80L;
}
+ _headers._Protocol = value;
+ }
+ }
+ public StringValues HeaderScheme
+ {
+ get
+ {
+ StringValues value = default;
+ if ((_bits & 0x100L) != 0)
+ {
+ value = _headers._Scheme;
+ }
+ return value;
+ }
+ set
+ {
+ if (!StringValues.IsNullOrEmpty(value))
+ {
+ _bits |= 0x100L;
+ }
+ else
+ {
+ _bits &= ~0x100L;
+ }
_headers._Scheme = value;
}
}
@@ -536,7 +558,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
StringValues value = default;
- if ((_bits & 0x20000000000L) != 0)
+ if ((_bits & 0x80000000000L) != 0)
{
value = _headers._TransferEncoding;
}
@@ -546,11 +568,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (!StringValues.IsNullOrEmpty(value))
{
- _bits |= 0x20000000000L;
+ _bits |= 0x80000000000L;
}
else
{
- _bits &= ~0x20000000000L;
+ _bits &= ~0x80000000000L;
}
_headers._TransferEncoding = value;
}
@@ -689,7 +711,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._AcceptCharset;
- if ((_bits & 0x100L) != 0)
+ if ((_bits & 0x200L) != 0)
{
return value;
}
@@ -699,7 +721,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x100L;
+ var flag = 0x200L;
if (value.Count > 0)
{
_bits |= flag;
@@ -717,7 +739,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._AcceptEncoding;
- if ((_bits & 0x200L) != 0)
+ if ((_bits & 0x400L) != 0)
{
return value;
}
@@ -727,7 +749,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x200L;
+ var flag = 0x400L;
if (value.Count > 0)
{
_bits |= flag;
@@ -745,7 +767,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._AcceptLanguage;
- if ((_bits & 0x400L) != 0)
+ if ((_bits & 0x800L) != 0)
{
return value;
}
@@ -755,7 +777,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x400L;
+ var flag = 0x800L;
if (value.Count > 0)
{
_bits |= flag;
@@ -773,7 +795,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._AccessControlRequestHeaders;
- if ((_bits & 0x800L) != 0)
+ if ((_bits & 0x1000L) != 0)
{
return value;
}
@@ -783,7 +805,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x800L;
+ var flag = 0x1000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -801,7 +823,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._AccessControlRequestMethod;
- if ((_bits & 0x1000L) != 0)
+ if ((_bits & 0x2000L) != 0)
{
return value;
}
@@ -811,7 +833,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x1000L;
+ var flag = 0x2000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -829,7 +851,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Authorization;
- if ((_bits & 0x2000L) != 0)
+ if ((_bits & 0x8000L) != 0)
{
return value;
}
@@ -839,7 +861,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x2000L;
+ var flag = 0x8000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -857,7 +879,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Baggage;
- if ((_bits & 0x4000L) != 0)
+ if ((_bits & 0x10000L) != 0)
{
return value;
}
@@ -867,7 +889,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x4000L;
+ var flag = 0x10000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -885,7 +907,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._CacheControl;
- if ((_bits & 0x8000L) != 0)
+ if ((_bits & 0x20000L) != 0)
{
return value;
}
@@ -895,7 +917,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x8000L;
+ var flag = 0x20000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -913,7 +935,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._ContentType;
- if ((_bits & 0x10000L) != 0)
+ if ((_bits & 0x40000L) != 0)
{
return value;
}
@@ -923,7 +945,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x10000L;
+ var flag = 0x40000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -941,7 +963,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Cookie;
- if ((_bits & 0x20000L) != 0)
+ if ((_bits & 0x80000L) != 0)
{
return value;
}
@@ -951,7 +973,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x20000L;
+ var flag = 0x80000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -969,7 +991,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._CorrelationContext;
- if ((_bits & 0x40000L) != 0)
+ if ((_bits & 0x100000L) != 0)
{
return value;
}
@@ -979,7 +1001,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x40000L;
+ var flag = 0x100000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -997,7 +1019,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Date;
- if ((_bits & 0x80000L) != 0)
+ if ((_bits & 0x200000L) != 0)
{
return value;
}
@@ -1007,7 +1029,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x80000L;
+ var flag = 0x200000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1025,7 +1047,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Expect;
- if ((_bits & 0x100000L) != 0)
+ if ((_bits & 0x400000L) != 0)
{
return value;
}
@@ -1035,7 +1057,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x100000L;
+ var flag = 0x400000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1053,7 +1075,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._From;
- if ((_bits & 0x200000L) != 0)
+ if ((_bits & 0x800000L) != 0)
{
return value;
}
@@ -1063,7 +1085,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x200000L;
+ var flag = 0x800000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1081,7 +1103,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._GrpcAcceptEncoding;
- if ((_bits & 0x400000L) != 0)
+ if ((_bits & 0x1000000L) != 0)
{
return value;
}
@@ -1091,7 +1113,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x400000L;
+ var flag = 0x1000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1109,7 +1131,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._GrpcEncoding;
- if ((_bits & 0x800000L) != 0)
+ if ((_bits & 0x2000000L) != 0)
{
return value;
}
@@ -1119,7 +1141,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x800000L;
+ var flag = 0x2000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1137,7 +1159,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._GrpcTimeout;
- if ((_bits & 0x1000000L) != 0)
+ if ((_bits & 0x4000000L) != 0)
{
return value;
}
@@ -1147,7 +1169,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x1000000L;
+ var flag = 0x4000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1165,7 +1187,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._IfMatch;
- if ((_bits & 0x2000000L) != 0)
+ if ((_bits & 0x8000000L) != 0)
{
return value;
}
@@ -1175,7 +1197,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x2000000L;
+ var flag = 0x8000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1193,7 +1215,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._IfModifiedSince;
- if ((_bits & 0x4000000L) != 0)
+ if ((_bits & 0x10000000L) != 0)
{
return value;
}
@@ -1203,7 +1225,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x4000000L;
+ var flag = 0x10000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1221,7 +1243,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._IfNoneMatch;
- if ((_bits & 0x8000000L) != 0)
+ if ((_bits & 0x20000000L) != 0)
{
return value;
}
@@ -1231,7 +1253,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x8000000L;
+ var flag = 0x20000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1249,7 +1271,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._IfRange;
- if ((_bits & 0x10000000L) != 0)
+ if ((_bits & 0x40000000L) != 0)
{
return value;
}
@@ -1259,7 +1281,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x10000000L;
+ var flag = 0x40000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1277,7 +1299,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._IfUnmodifiedSince;
- if ((_bits & 0x20000000L) != 0)
+ if ((_bits & 0x80000000L) != 0)
{
return value;
}
@@ -1287,7 +1309,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x20000000L;
+ var flag = 0x80000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1305,7 +1327,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._KeepAlive;
- if ((_bits & 0x40000000L) != 0)
+ if ((_bits & 0x100000000L) != 0)
{
return value;
}
@@ -1315,7 +1337,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x40000000L;
+ var flag = 0x100000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1333,7 +1355,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._MaxForwards;
- if ((_bits & 0x80000000L) != 0)
+ if ((_bits & 0x200000000L) != 0)
{
return value;
}
@@ -1343,7 +1365,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x80000000L;
+ var flag = 0x200000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1361,7 +1383,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Origin;
- if ((_bits & 0x100000000L) != 0)
+ if ((_bits & 0x400000000L) != 0)
{
return value;
}
@@ -1371,7 +1393,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x100000000L;
+ var flag = 0x400000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1389,7 +1411,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Pragma;
- if ((_bits & 0x200000000L) != 0)
+ if ((_bits & 0x800000000L) != 0)
{
return value;
}
@@ -1399,7 +1421,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x200000000L;
+ var flag = 0x800000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1417,7 +1439,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._ProxyAuthorization;
- if ((_bits & 0x400000000L) != 0)
+ if ((_bits & 0x1000000000L) != 0)
{
return value;
}
@@ -1427,7 +1449,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x400000000L;
+ var flag = 0x1000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1445,7 +1467,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Range;
- if ((_bits & 0x800000000L) != 0)
+ if ((_bits & 0x2000000000L) != 0)
{
return value;
}
@@ -1455,7 +1477,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x800000000L;
+ var flag = 0x2000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1473,7 +1495,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Referer;
- if ((_bits & 0x1000000000L) != 0)
+ if ((_bits & 0x4000000000L) != 0)
{
return value;
}
@@ -1483,7 +1505,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x1000000000L;
+ var flag = 0x4000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1501,7 +1523,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._RequestId;
- if ((_bits & 0x2000000000L) != 0)
+ if ((_bits & 0x8000000000L) != 0)
{
return value;
}
@@ -1511,7 +1533,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x2000000000L;
+ var flag = 0x8000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1529,7 +1551,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._TE;
- if ((_bits & 0x4000000000L) != 0)
+ if ((_bits & 0x10000000000L) != 0)
{
return value;
}
@@ -1539,7 +1561,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x4000000000L;
+ var flag = 0x10000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1557,7 +1579,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._TraceParent;
- if ((_bits & 0x8000000000L) != 0)
+ if ((_bits & 0x20000000000L) != 0)
{
return value;
}
@@ -1567,7 +1589,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x8000000000L;
+ var flag = 0x20000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1585,7 +1607,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._TraceState;
- if ((_bits & 0x10000000000L) != 0)
+ if ((_bits & 0x40000000000L) != 0)
{
return value;
}
@@ -1595,7 +1617,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x10000000000L;
+ var flag = 0x40000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1613,7 +1635,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._TransferEncoding;
- if ((_bits & 0x20000000000L) != 0)
+ if ((_bits & 0x80000000000L) != 0)
{
return value;
}
@@ -1623,7 +1645,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x20000000000L;
+ var flag = 0x80000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1641,7 +1663,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Translate;
- if ((_bits & 0x40000000000L) != 0)
+ if ((_bits & 0x100000000000L) != 0)
{
return value;
}
@@ -1651,7 +1673,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x40000000000L;
+ var flag = 0x100000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1669,7 +1691,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Upgrade;
- if ((_bits & 0x80000000000L) != 0)
+ if ((_bits & 0x200000000000L) != 0)
{
return value;
}
@@ -1679,7 +1701,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x80000000000L;
+ var flag = 0x200000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1697,7 +1719,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._UpgradeInsecureRequests;
- if ((_bits & 0x100000000000L) != 0)
+ if ((_bits & 0x400000000000L) != 0)
{
return value;
}
@@ -1707,7 +1729,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x100000000000L;
+ var flag = 0x400000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1725,7 +1747,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Via;
- if ((_bits & 0x200000000000L) != 0)
+ if ((_bits & 0x800000000000L) != 0)
{
return value;
}
@@ -1735,7 +1757,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x200000000000L;
+ var flag = 0x800000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -1753,7 +1775,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
get
{
var value = _headers._Warning;
- if ((_bits & 0x400000000000L) != 0)
+ if ((_bits & 0x1000000000000L) != 0)
{
return value;
}
@@ -1763,7 +1785,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (_isReadOnly) { ThrowHeadersReadOnlyException(); }
- var flag = 0x400000000000L;
+ var flag = 0x1000000000000L;
if (value.Count > 0)
{
_bits |= flag;
@@ -2574,7 +2596,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TE, key))
{
- if ((_bits & 0x4000000000L) != 0)
+ if ((_bits & 0x10000000000L) != 0)
{
value = _headers._TE;
return true;
@@ -2584,7 +2606,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.TE.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000000000L) != 0)
+ if ((_bits & 0x10000000000L) != 0)
{
value = _headers._TE;
return true;
@@ -2597,7 +2619,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Via, key))
{
- if ((_bits & 0x200000000000L) != 0)
+ if ((_bits & 0x800000000000L) != 0)
{
value = _headers._Via;
return true;
@@ -2607,7 +2629,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.Via.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000000000L) != 0)
+ if ((_bits & 0x800000000000L) != 0)
{
value = _headers._Via;
return true;
@@ -2629,7 +2651,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Date, key))
{
- if ((_bits & 0x80000L) != 0)
+ if ((_bits & 0x200000L) != 0)
{
value = _headers._Date;
return true;
@@ -2638,7 +2660,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.From, key))
{
- if ((_bits & 0x200000L) != 0)
+ if ((_bits & 0x800000L) != 0)
{
value = _headers._From;
return true;
@@ -2657,7 +2679,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Date.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000L) != 0)
+ if ((_bits & 0x200000L) != 0)
{
value = _headers._Date;
return true;
@@ -2666,7 +2688,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.From.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000L) != 0)
+ if ((_bits & 0x800000L) != 0)
{
value = _headers._From;
return true;
@@ -2677,7 +2699,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 5:
{
- if (ReferenceEquals(HeaderNames.Path, key))
+ if (ReferenceEquals(InternalHeaderNames.Path, key))
{
if ((_bits & 0x40L) != 0)
{
@@ -2688,7 +2710,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Range, key))
{
- if ((_bits & 0x800000000L) != 0)
+ if ((_bits & 0x2000000000L) != 0)
{
value = _headers._Range;
return true;
@@ -2696,7 +2718,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;
}
- if (HeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x40L) != 0)
{
@@ -2707,7 +2729,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Range.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800000000L) != 0)
+ if ((_bits & 0x2000000000L) != 0)
{
value = _headers._Range;
return true;
@@ -2729,7 +2751,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Cookie, key))
{
- if ((_bits & 0x20000L) != 0)
+ if ((_bits & 0x80000L) != 0)
{
value = _headers._Cookie;
return true;
@@ -2738,7 +2760,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Expect, key))
{
- if ((_bits & 0x100000L) != 0)
+ if ((_bits & 0x400000L) != 0)
{
value = _headers._Expect;
return true;
@@ -2747,7 +2769,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Origin, key))
{
- if ((_bits & 0x100000000L) != 0)
+ if ((_bits & 0x400000000L) != 0)
{
value = _headers._Origin;
return true;
@@ -2756,7 +2778,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Pragma, key))
{
- if ((_bits & 0x200000000L) != 0)
+ if ((_bits & 0x800000000L) != 0)
{
value = _headers._Pragma;
return true;
@@ -2775,7 +2797,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Cookie.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000L) != 0)
+ if ((_bits & 0x80000L) != 0)
{
value = _headers._Cookie;
return true;
@@ -2784,7 +2806,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Expect.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000L) != 0)
+ if ((_bits & 0x400000L) != 0)
{
value = _headers._Expect;
return true;
@@ -2793,7 +2815,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Origin.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000000L) != 0)
+ if ((_bits & 0x400000000L) != 0)
{
value = _headers._Origin;
return true;
@@ -2802,7 +2824,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Pragma.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000000L) != 0)
+ if ((_bits & 0x800000000L) != 0)
{
value = _headers._Pragma;
return true;
@@ -2813,7 +2835,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 7:
{
- if (ReferenceEquals(HeaderNames.Method, key))
+ if (ReferenceEquals(InternalHeaderNames.Method, key))
{
if ((_bits & 0x20L) != 0)
{
@@ -2822,9 +2844,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (ReferenceEquals(HeaderNames.Scheme, key))
+ if (ReferenceEquals(InternalHeaderNames.Scheme, key))
{
- if ((_bits & 0x80L) != 0)
+ if ((_bits & 0x100L) != 0)
{
value = _headers._Scheme;
return true;
@@ -2833,7 +2855,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Baggage, key))
{
- if ((_bits & 0x4000L) != 0)
+ if ((_bits & 0x10000L) != 0)
{
value = _headers._Baggage;
return true;
@@ -2842,7 +2864,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Referer, key))
{
- if ((_bits & 0x1000000000L) != 0)
+ if ((_bits & 0x4000000000L) != 0)
{
value = _headers._Referer;
return true;
@@ -2851,7 +2873,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Upgrade, key))
{
- if ((_bits & 0x80000000000L) != 0)
+ if ((_bits & 0x200000000000L) != 0)
{
value = _headers._Upgrade;
return true;
@@ -2860,7 +2882,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Warning, key))
{
- if ((_bits & 0x400000000000L) != 0)
+ if ((_bits & 0x1000000000000L) != 0)
{
value = _headers._Warning;
return true;
@@ -2868,7 +2890,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;
}
- if (HeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x20L) != 0)
{
@@ -2877,9 +2899,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (HeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80L) != 0)
+ if ((_bits & 0x100L) != 0)
{
value = _headers._Scheme;
return true;
@@ -2888,7 +2910,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Baggage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000L) != 0)
+ if ((_bits & 0x10000L) != 0)
{
value = _headers._Baggage;
return true;
@@ -2897,7 +2919,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Referer.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000000000L) != 0)
+ if ((_bits & 0x4000000000L) != 0)
{
value = _headers._Referer;
return true;
@@ -2906,7 +2928,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Upgrade.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000000000L) != 0)
+ if ((_bits & 0x200000000000L) != 0)
{
value = _headers._Upgrade;
return true;
@@ -2915,7 +2937,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Warning.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000000000L) != 0)
+ if ((_bits & 0x1000000000000L) != 0)
{
value = _headers._Warning;
return true;
@@ -2926,9 +2948,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 8:
{
+ if (ReferenceEquals(InternalHeaderNames.AltUsed, key))
+ {
+ if ((_bits & 0x4000L) != 0)
+ {
+ value = _headers._AltUsed;
+ return true;
+ }
+ return false;
+ }
if (ReferenceEquals(HeaderNames.IfMatch, key))
{
- if ((_bits & 0x2000000L) != 0)
+ if ((_bits & 0x8000000L) != 0)
{
value = _headers._IfMatch;
return true;
@@ -2937,7 +2968,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfRange, key))
{
- if ((_bits & 0x10000000L) != 0)
+ if ((_bits & 0x40000000L) != 0)
{
value = _headers._IfRange;
return true;
@@ -2945,9 +2976,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;
}
+ if (InternalHeaderNames.AltUsed.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ if ((_bits & 0x4000L) != 0)
+ {
+ value = _headers._AltUsed;
+ return true;
+ }
+ return false;
+ }
if (HeaderNames.IfMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000000L) != 0)
+ if ((_bits & 0x8000000L) != 0)
{
value = _headers._IfMatch;
return true;
@@ -2956,7 +2996,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfRange.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000000L) != 0)
+ if ((_bits & 0x40000000L) != 0)
{
value = _headers._IfRange;
return true;
@@ -2967,9 +3007,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 9:
{
+ if (ReferenceEquals(InternalHeaderNames.Protocol, key))
+ {
+ if ((_bits & 0x80L) != 0)
+ {
+ value = _headers._Protocol;
+ return true;
+ }
+ return false;
+ }
if (ReferenceEquals(HeaderNames.Translate, key))
{
- if ((_bits & 0x40000000000L) != 0)
+ if ((_bits & 0x100000000000L) != 0)
{
value = _headers._Translate;
return true;
@@ -2977,9 +3026,18 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;
}
+ if (InternalHeaderNames.Protocol.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ if ((_bits & 0x80L) != 0)
+ {
+ value = _headers._Protocol;
+ return true;
+ }
+ return false;
+ }
if (HeaderNames.Translate.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000000000L) != 0)
+ if ((_bits & 0x100000000000L) != 0)
{
value = _headers._Translate;
return true;
@@ -3008,7 +3066,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (ReferenceEquals(HeaderNames.Authority, key))
+ if (ReferenceEquals(InternalHeaderNames.Authority, key))
{
if ((_bits & 0x10L) != 0)
{
@@ -3019,7 +3077,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.KeepAlive, key))
{
- if ((_bits & 0x40000000L) != 0)
+ if ((_bits & 0x100000000L) != 0)
{
value = _headers._KeepAlive;
return true;
@@ -3028,7 +3086,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.RequestId, key))
{
- if ((_bits & 0x2000000000L) != 0)
+ if ((_bits & 0x8000000000L) != 0)
{
value = _headers._RequestId;
return true;
@@ -3037,7 +3095,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.TraceState, key))
{
- if ((_bits & 0x10000000000L) != 0)
+ if ((_bits & 0x40000000000L) != 0)
{
value = _headers._TraceState;
return true;
@@ -3063,7 +3121,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (HeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x10L) != 0)
{
@@ -3074,7 +3132,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.KeepAlive.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000000L) != 0)
+ if ((_bits & 0x100000000L) != 0)
{
value = _headers._KeepAlive;
return true;
@@ -3083,7 +3141,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.RequestId.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000000000L) != 0)
+ if ((_bits & 0x8000000000L) != 0)
{
value = _headers._RequestId;
return true;
@@ -3092,7 +3150,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.TraceState.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000000000L) != 0)
+ if ((_bits & 0x40000000000L) != 0)
{
value = _headers._TraceState;
return true;
@@ -3105,7 +3163,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TraceParent, key))
{
- if ((_bits & 0x8000000000L) != 0)
+ if ((_bits & 0x20000000000L) != 0)
{
value = _headers._TraceParent;
return true;
@@ -3115,7 +3173,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.TraceParent.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000000000L) != 0)
+ if ((_bits & 0x20000000000L) != 0)
{
value = _headers._TraceParent;
return true;
@@ -3128,7 +3186,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.ContentType, key))
{
- if ((_bits & 0x10000L) != 0)
+ if ((_bits & 0x40000L) != 0)
{
value = _headers._ContentType;
return true;
@@ -3137,7 +3195,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.GrpcTimeout, key))
{
- if ((_bits & 0x1000000L) != 0)
+ if ((_bits & 0x4000000L) != 0)
{
value = _headers._GrpcTimeout;
return true;
@@ -3146,7 +3204,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.MaxForwards, key))
{
- if ((_bits & 0x80000000L) != 0)
+ if ((_bits & 0x200000000L) != 0)
{
value = _headers._MaxForwards;
return true;
@@ -3156,7 +3214,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.ContentType.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000L) != 0)
+ if ((_bits & 0x40000L) != 0)
{
value = _headers._ContentType;
return true;
@@ -3165,7 +3223,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.GrpcTimeout.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000000L) != 0)
+ if ((_bits & 0x4000000L) != 0)
{
value = _headers._GrpcTimeout;
return true;
@@ -3174,7 +3232,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.MaxForwards.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000000L) != 0)
+ if ((_bits & 0x200000000L) != 0)
{
value = _headers._MaxForwards;
return true;
@@ -3187,7 +3245,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Authorization, key))
{
- if ((_bits & 0x2000L) != 0)
+ if ((_bits & 0x8000L) != 0)
{
value = _headers._Authorization;
return true;
@@ -3196,7 +3254,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.CacheControl, key))
{
- if ((_bits & 0x8000L) != 0)
+ if ((_bits & 0x20000L) != 0)
{
value = _headers._CacheControl;
return true;
@@ -3205,7 +3263,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.GrpcEncoding, key))
{
- if ((_bits & 0x800000L) != 0)
+ if ((_bits & 0x2000000L) != 0)
{
value = _headers._GrpcEncoding;
return true;
@@ -3214,7 +3272,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfNoneMatch, key))
{
- if ((_bits & 0x8000000L) != 0)
+ if ((_bits & 0x20000000L) != 0)
{
value = _headers._IfNoneMatch;
return true;
@@ -3224,7 +3282,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.Authorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000L) != 0)
+ if ((_bits & 0x8000L) != 0)
{
value = _headers._Authorization;
return true;
@@ -3233,7 +3291,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.CacheControl.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000L) != 0)
+ if ((_bits & 0x20000L) != 0)
{
value = _headers._CacheControl;
return true;
@@ -3242,7 +3300,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.GrpcEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800000L) != 0)
+ if ((_bits & 0x2000000L) != 0)
{
value = _headers._GrpcEncoding;
return true;
@@ -3251,7 +3309,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfNoneMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000000L) != 0)
+ if ((_bits & 0x20000000L) != 0)
{
value = _headers._IfNoneMatch;
return true;
@@ -3264,7 +3322,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptCharset, key))
{
- if ((_bits & 0x100L) != 0)
+ if ((_bits & 0x200L) != 0)
{
value = _headers._AcceptCharset;
return true;
@@ -3283,7 +3341,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptCharset.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100L) != 0)
+ if ((_bits & 0x200L) != 0)
{
value = _headers._AcceptCharset;
return true;
@@ -3305,7 +3363,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptEncoding, key))
{
- if ((_bits & 0x200L) != 0)
+ if ((_bits & 0x400L) != 0)
{
value = _headers._AcceptEncoding;
return true;
@@ -3314,7 +3372,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.AcceptLanguage, key))
{
- if ((_bits & 0x400L) != 0)
+ if ((_bits & 0x800L) != 0)
{
value = _headers._AcceptLanguage;
return true;
@@ -3324,7 +3382,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200L) != 0)
+ if ((_bits & 0x400L) != 0)
{
value = _headers._AcceptEncoding;
return true;
@@ -3333,7 +3391,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.AcceptLanguage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400L) != 0)
+ if ((_bits & 0x800L) != 0)
{
value = _headers._AcceptLanguage;
return true;
@@ -3346,7 +3404,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.IfModifiedSince, key))
{
- if ((_bits & 0x4000000L) != 0)
+ if ((_bits & 0x10000000L) != 0)
{
value = _headers._IfModifiedSince;
return true;
@@ -3355,7 +3413,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.TransferEncoding, key))
{
- if ((_bits & 0x20000000000L) != 0)
+ if ((_bits & 0x80000000000L) != 0)
{
value = _headers._TransferEncoding;
return true;
@@ -3365,7 +3423,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.IfModifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000000L) != 0)
+ if ((_bits & 0x10000000L) != 0)
{
value = _headers._IfModifiedSince;
return true;
@@ -3374,7 +3432,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.TransferEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000000000L) != 0)
+ if ((_bits & 0x80000000000L) != 0)
{
value = _headers._TransferEncoding;
return true;
@@ -3387,7 +3445,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.CorrelationContext, key))
{
- if ((_bits & 0x40000L) != 0)
+ if ((_bits & 0x100000L) != 0)
{
value = _headers._CorrelationContext;
return true;
@@ -3396,7 +3454,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfUnmodifiedSince, key))
{
- if ((_bits & 0x20000000L) != 0)
+ if ((_bits & 0x80000000L) != 0)
{
value = _headers._IfUnmodifiedSince;
return true;
@@ -3405,7 +3463,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.ProxyAuthorization, key))
{
- if ((_bits & 0x400000000L) != 0)
+ if ((_bits & 0x1000000000L) != 0)
{
value = _headers._ProxyAuthorization;
return true;
@@ -3415,7 +3473,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.CorrelationContext.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000L) != 0)
+ if ((_bits & 0x100000L) != 0)
{
value = _headers._CorrelationContext;
return true;
@@ -3424,7 +3482,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfUnmodifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000000L) != 0)
+ if ((_bits & 0x80000000L) != 0)
{
value = _headers._IfUnmodifiedSince;
return true;
@@ -3433,7 +3491,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.ProxyAuthorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000000L) != 0)
+ if ((_bits & 0x1000000000L) != 0)
{
value = _headers._ProxyAuthorization;
return true;
@@ -3446,7 +3504,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.GrpcAcceptEncoding, key))
{
- if ((_bits & 0x400000L) != 0)
+ if ((_bits & 0x1000000L) != 0)
{
value = _headers._GrpcAcceptEncoding;
return true;
@@ -3456,7 +3514,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.GrpcAcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000L) != 0)
+ if ((_bits & 0x1000000L) != 0)
{
value = _headers._GrpcAcceptEncoding;
return true;
@@ -3469,7 +3527,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.UpgradeInsecureRequests, key))
{
- if ((_bits & 0x100000000000L) != 0)
+ if ((_bits & 0x400000000000L) != 0)
{
value = _headers._UpgradeInsecureRequests;
return true;
@@ -3479,7 +3537,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.UpgradeInsecureRequests.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000000000L) != 0)
+ if ((_bits & 0x400000000000L) != 0)
{
value = _headers._UpgradeInsecureRequests;
return true;
@@ -3492,7 +3550,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestMethod, key))
{
- if ((_bits & 0x1000L) != 0)
+ if ((_bits & 0x2000L) != 0)
{
value = _headers._AccessControlRequestMethod;
return true;
@@ -3502,7 +3560,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AccessControlRequestMethod.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000L) != 0)
+ if ((_bits & 0x2000L) != 0)
{
value = _headers._AccessControlRequestMethod;
return true;
@@ -3515,7 +3573,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestHeaders, key))
{
- if ((_bits & 0x800L) != 0)
+ if ((_bits & 0x1000L) != 0)
{
value = _headers._AccessControlRequestHeaders;
return true;
@@ -3525,7 +3583,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AccessControlRequestHeaders.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800L) != 0)
+ if ((_bits & 0x1000L) != 0)
{
value = _headers._AccessControlRequestHeaders;
return true;
@@ -3547,14 +3605,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TE, key))
{
- _bits |= 0x4000000000L;
+ _bits |= 0x10000000000L;
_headers._TE = value;
return;
}
if (HeaderNames.TE.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x4000000000L;
+ _bits |= 0x10000000000L;
_headers._TE = value;
return;
}
@@ -3564,14 +3622,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Via, key))
{
- _bits |= 0x200000000000L;
+ _bits |= 0x800000000000L;
_headers._Via = value;
return;
}
if (HeaderNames.Via.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x200000000000L;
+ _bits |= 0x800000000000L;
_headers._Via = value;
return;
}
@@ -3587,13 +3645,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Date, key))
{
- _bits |= 0x80000L;
+ _bits |= 0x200000L;
_headers._Date = value;
return;
}
if (ReferenceEquals(HeaderNames.From, key))
{
- _bits |= 0x200000L;
+ _bits |= 0x800000L;
_headers._From = value;
return;
}
@@ -3606,13 +3664,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Date.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x80000L;
+ _bits |= 0x200000L;
_headers._Date = value;
return;
}
if (HeaderNames.From.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x200000L;
+ _bits |= 0x800000L;
_headers._From = value;
return;
}
@@ -3620,7 +3678,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 5:
{
- if (ReferenceEquals(HeaderNames.Path, key))
+ if (ReferenceEquals(InternalHeaderNames.Path, key))
{
_bits |= 0x40L;
_headers._Path = value;
@@ -3628,12 +3686,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Range, key))
{
- _bits |= 0x800000000L;
+ _bits |= 0x2000000000L;
_headers._Range = value;
return;
}
- if (HeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
{
_bits |= 0x40L;
_headers._Path = value;
@@ -3641,7 +3699,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Range.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x800000000L;
+ _bits |= 0x2000000000L;
_headers._Range = value;
return;
}
@@ -3657,25 +3715,25 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Cookie, key))
{
- _bits |= 0x20000L;
+ _bits |= 0x80000L;
_headers._Cookie = value;
return;
}
if (ReferenceEquals(HeaderNames.Expect, key))
{
- _bits |= 0x100000L;
+ _bits |= 0x400000L;
_headers._Expect = value;
return;
}
if (ReferenceEquals(HeaderNames.Origin, key))
{
- _bits |= 0x100000000L;
+ _bits |= 0x400000000L;
_headers._Origin = value;
return;
}
if (ReferenceEquals(HeaderNames.Pragma, key))
{
- _bits |= 0x200000000L;
+ _bits |= 0x800000000L;
_headers._Pragma = value;
return;
}
@@ -3688,25 +3746,25 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Cookie.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x20000L;
+ _bits |= 0x80000L;
_headers._Cookie = value;
return;
}
if (HeaderNames.Expect.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x100000L;
+ _bits |= 0x400000L;
_headers._Expect = value;
return;
}
if (HeaderNames.Origin.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x100000000L;
+ _bits |= 0x400000000L;
_headers._Origin = value;
return;
}
if (HeaderNames.Pragma.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x200000000L;
+ _bits |= 0x800000000L;
_headers._Pragma = value;
return;
}
@@ -3714,76 +3772,76 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 7:
{
- if (ReferenceEquals(HeaderNames.Method, key))
+ if (ReferenceEquals(InternalHeaderNames.Method, key))
{
_bits |= 0x20L;
_headers._Method = value;
return;
}
- if (ReferenceEquals(HeaderNames.Scheme, key))
+ if (ReferenceEquals(InternalHeaderNames.Scheme, key))
{
- _bits |= 0x80L;
+ _bits |= 0x100L;
_headers._Scheme = value;
return;
}
if (ReferenceEquals(HeaderNames.Baggage, key))
{
- _bits |= 0x4000L;
+ _bits |= 0x10000L;
_headers._Baggage = value;
return;
}
if (ReferenceEquals(HeaderNames.Referer, key))
{
- _bits |= 0x1000000000L;
+ _bits |= 0x4000000000L;
_headers._Referer = value;
return;
}
if (ReferenceEquals(HeaderNames.Upgrade, key))
{
- _bits |= 0x80000000000L;
+ _bits |= 0x200000000000L;
_headers._Upgrade = value;
return;
}
if (ReferenceEquals(HeaderNames.Warning, key))
{
- _bits |= 0x400000000000L;
+ _bits |= 0x1000000000000L;
_headers._Warning = value;
return;
}
- if (HeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
{
_bits |= 0x20L;
_headers._Method = value;
return;
}
- if (HeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x80L;
+ _bits |= 0x100L;
_headers._Scheme = value;
return;
}
if (HeaderNames.Baggage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x4000L;
+ _bits |= 0x10000L;
_headers._Baggage = value;
return;
}
if (HeaderNames.Referer.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x1000000000L;
+ _bits |= 0x4000000000L;
_headers._Referer = value;
return;
}
if (HeaderNames.Upgrade.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x80000000000L;
+ _bits |= 0x200000000000L;
_headers._Upgrade = value;
return;
}
if (HeaderNames.Warning.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x400000000000L;
+ _bits |= 0x1000000000000L;
_headers._Warning = value;
return;
}
@@ -3791,28 +3849,40 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 8:
{
+ if (ReferenceEquals(InternalHeaderNames.AltUsed, key))
+ {
+ _bits |= 0x4000L;
+ _headers._AltUsed = value;
+ return;
+ }
if (ReferenceEquals(HeaderNames.IfMatch, key))
{
- _bits |= 0x2000000L;
+ _bits |= 0x8000000L;
_headers._IfMatch = value;
return;
}
if (ReferenceEquals(HeaderNames.IfRange, key))
{
- _bits |= 0x10000000L;
+ _bits |= 0x40000000L;
_headers._IfRange = value;
return;
}
+ if (InternalHeaderNames.AltUsed.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ _bits |= 0x4000L;
+ _headers._AltUsed = value;
+ return;
+ }
if (HeaderNames.IfMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x2000000L;
+ _bits |= 0x8000000L;
_headers._IfMatch = value;
return;
}
if (HeaderNames.IfRange.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x10000000L;
+ _bits |= 0x40000000L;
_headers._IfRange = value;
return;
}
@@ -3820,16 +3890,28 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 9:
{
+ if (ReferenceEquals(InternalHeaderNames.Protocol, key))
+ {
+ _bits |= 0x80L;
+ _headers._Protocol = value;
+ return;
+ }
if (ReferenceEquals(HeaderNames.Translate, key))
{
- _bits |= 0x40000000000L;
+ _bits |= 0x100000000000L;
_headers._Translate = value;
return;
}
+ if (InternalHeaderNames.Protocol.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ _bits |= 0x80L;
+ _headers._Protocol = value;
+ return;
+ }
if (HeaderNames.Translate.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x40000000000L;
+ _bits |= 0x100000000000L;
_headers._Translate = value;
return;
}
@@ -3849,7 +3931,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_headers._UserAgent = value;
return;
}
- if (ReferenceEquals(HeaderNames.Authority, key))
+ if (ReferenceEquals(InternalHeaderNames.Authority, key))
{
_bits |= 0x10L;
_headers._Authority = value;
@@ -3857,19 +3939,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.KeepAlive, key))
{
- _bits |= 0x40000000L;
+ _bits |= 0x100000000L;
_headers._KeepAlive = value;
return;
}
if (ReferenceEquals(HeaderNames.RequestId, key))
{
- _bits |= 0x2000000000L;
+ _bits |= 0x8000000000L;
_headers._RequestId = value;
return;
}
if (ReferenceEquals(HeaderNames.TraceState, key))
{
- _bits |= 0x10000000000L;
+ _bits |= 0x40000000000L;
_headers._TraceState = value;
return;
}
@@ -3886,7 +3968,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_headers._UserAgent = value;
return;
}
- if (HeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
{
_bits |= 0x10L;
_headers._Authority = value;
@@ -3894,19 +3976,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.KeepAlive.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x40000000L;
+ _bits |= 0x100000000L;
_headers._KeepAlive = value;
return;
}
if (HeaderNames.RequestId.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x2000000000L;
+ _bits |= 0x8000000000L;
_headers._RequestId = value;
return;
}
if (HeaderNames.TraceState.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x10000000000L;
+ _bits |= 0x40000000000L;
_headers._TraceState = value;
return;
}
@@ -3916,14 +3998,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TraceParent, key))
{
- _bits |= 0x8000000000L;
+ _bits |= 0x20000000000L;
_headers._TraceParent = value;
return;
}
if (HeaderNames.TraceParent.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x8000000000L;
+ _bits |= 0x20000000000L;
_headers._TraceParent = value;
return;
}
@@ -3933,38 +4015,38 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.ContentType, key))
{
- _bits |= 0x10000L;
+ _bits |= 0x40000L;
_headers._ContentType = value;
return;
}
if (ReferenceEquals(HeaderNames.GrpcTimeout, key))
{
- _bits |= 0x1000000L;
+ _bits |= 0x4000000L;
_headers._GrpcTimeout = value;
return;
}
if (ReferenceEquals(HeaderNames.MaxForwards, key))
{
- _bits |= 0x80000000L;
+ _bits |= 0x200000000L;
_headers._MaxForwards = value;
return;
}
if (HeaderNames.ContentType.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x10000L;
+ _bits |= 0x40000L;
_headers._ContentType = value;
return;
}
if (HeaderNames.GrpcTimeout.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x1000000L;
+ _bits |= 0x4000000L;
_headers._GrpcTimeout = value;
return;
}
if (HeaderNames.MaxForwards.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x80000000L;
+ _bits |= 0x200000000L;
_headers._MaxForwards = value;
return;
}
@@ -3974,50 +4056,50 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Authorization, key))
{
- _bits |= 0x2000L;
+ _bits |= 0x8000L;
_headers._Authorization = value;
return;
}
if (ReferenceEquals(HeaderNames.CacheControl, key))
{
- _bits |= 0x8000L;
+ _bits |= 0x20000L;
_headers._CacheControl = value;
return;
}
if (ReferenceEquals(HeaderNames.GrpcEncoding, key))
{
- _bits |= 0x800000L;
+ _bits |= 0x2000000L;
_headers._GrpcEncoding = value;
return;
}
if (ReferenceEquals(HeaderNames.IfNoneMatch, key))
{
- _bits |= 0x8000000L;
+ _bits |= 0x20000000L;
_headers._IfNoneMatch = value;
return;
}
if (HeaderNames.Authorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x2000L;
+ _bits |= 0x8000L;
_headers._Authorization = value;
return;
}
if (HeaderNames.CacheControl.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x8000L;
+ _bits |= 0x20000L;
_headers._CacheControl = value;
return;
}
if (HeaderNames.GrpcEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x800000L;
+ _bits |= 0x2000000L;
_headers._GrpcEncoding = value;
return;
}
if (HeaderNames.IfNoneMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x8000000L;
+ _bits |= 0x20000000L;
_headers._IfNoneMatch = value;
return;
}
@@ -4027,7 +4109,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptCharset, key))
{
- _bits |= 0x100L;
+ _bits |= 0x200L;
_headers._AcceptCharset = value;
return;
}
@@ -4039,7 +4121,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptCharset.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x100L;
+ _bits |= 0x200L;
_headers._AcceptCharset = value;
return;
}
@@ -4054,26 +4136,26 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptEncoding, key))
{
- _bits |= 0x200L;
+ _bits |= 0x400L;
_headers._AcceptEncoding = value;
return;
}
if (ReferenceEquals(HeaderNames.AcceptLanguage, key))
{
- _bits |= 0x400L;
+ _bits |= 0x800L;
_headers._AcceptLanguage = value;
return;
}
if (HeaderNames.AcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x200L;
+ _bits |= 0x400L;
_headers._AcceptEncoding = value;
return;
}
if (HeaderNames.AcceptLanguage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x400L;
+ _bits |= 0x800L;
_headers._AcceptLanguage = value;
return;
}
@@ -4083,26 +4165,26 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.IfModifiedSince, key))
{
- _bits |= 0x4000000L;
+ _bits |= 0x10000000L;
_headers._IfModifiedSince = value;
return;
}
if (ReferenceEquals(HeaderNames.TransferEncoding, key))
{
- _bits |= 0x20000000000L;
+ _bits |= 0x80000000000L;
_headers._TransferEncoding = value;
return;
}
if (HeaderNames.IfModifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x4000000L;
+ _bits |= 0x10000000L;
_headers._IfModifiedSince = value;
return;
}
if (HeaderNames.TransferEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x20000000000L;
+ _bits |= 0x80000000000L;
_headers._TransferEncoding = value;
return;
}
@@ -4112,38 +4194,38 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.CorrelationContext, key))
{
- _bits |= 0x40000L;
+ _bits |= 0x100000L;
_headers._CorrelationContext = value;
return;
}
if (ReferenceEquals(HeaderNames.IfUnmodifiedSince, key))
{
- _bits |= 0x20000000L;
+ _bits |= 0x80000000L;
_headers._IfUnmodifiedSince = value;
return;
}
if (ReferenceEquals(HeaderNames.ProxyAuthorization, key))
{
- _bits |= 0x400000000L;
+ _bits |= 0x1000000000L;
_headers._ProxyAuthorization = value;
return;
}
if (HeaderNames.CorrelationContext.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x40000L;
+ _bits |= 0x100000L;
_headers._CorrelationContext = value;
return;
}
if (HeaderNames.IfUnmodifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x20000000L;
+ _bits |= 0x80000000L;
_headers._IfUnmodifiedSince = value;
return;
}
if (HeaderNames.ProxyAuthorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x400000000L;
+ _bits |= 0x1000000000L;
_headers._ProxyAuthorization = value;
return;
}
@@ -4153,14 +4235,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.GrpcAcceptEncoding, key))
{
- _bits |= 0x400000L;
+ _bits |= 0x1000000L;
_headers._GrpcAcceptEncoding = value;
return;
}
if (HeaderNames.GrpcAcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x400000L;
+ _bits |= 0x1000000L;
_headers._GrpcAcceptEncoding = value;
return;
}
@@ -4170,14 +4252,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.UpgradeInsecureRequests, key))
{
- _bits |= 0x100000000000L;
+ _bits |= 0x400000000000L;
_headers._UpgradeInsecureRequests = value;
return;
}
if (HeaderNames.UpgradeInsecureRequests.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x100000000000L;
+ _bits |= 0x400000000000L;
_headers._UpgradeInsecureRequests = value;
return;
}
@@ -4187,14 +4269,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestMethod, key))
{
- _bits |= 0x1000L;
+ _bits |= 0x2000L;
_headers._AccessControlRequestMethod = value;
return;
}
if (HeaderNames.AccessControlRequestMethod.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x1000L;
+ _bits |= 0x2000L;
_headers._AccessControlRequestMethod = value;
return;
}
@@ -4204,14 +4286,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestHeaders, key))
{
- _bits |= 0x800L;
+ _bits |= 0x1000L;
_headers._AccessControlRequestHeaders = value;
return;
}
if (HeaderNames.AccessControlRequestHeaders.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- _bits |= 0x800L;
+ _bits |= 0x1000L;
_headers._AccessControlRequestHeaders = value;
return;
}
@@ -4230,9 +4312,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TE, key))
{
- if ((_bits & 0x4000000000L) == 0)
+ if ((_bits & 0x10000000000L) == 0)
{
- _bits |= 0x4000000000L;
+ _bits |= 0x10000000000L;
_headers._TE = value;
return true;
}
@@ -4241,9 +4323,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.TE.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000000000L) == 0)
+ if ((_bits & 0x10000000000L) == 0)
{
- _bits |= 0x4000000000L;
+ _bits |= 0x10000000000L;
_headers._TE = value;
return true;
}
@@ -4255,9 +4337,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Via, key))
{
- if ((_bits & 0x200000000000L) == 0)
+ if ((_bits & 0x800000000000L) == 0)
{
- _bits |= 0x200000000000L;
+ _bits |= 0x800000000000L;
_headers._Via = value;
return true;
}
@@ -4266,9 +4348,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.Via.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000000000L) == 0)
+ if ((_bits & 0x800000000000L) == 0)
{
- _bits |= 0x200000000000L;
+ _bits |= 0x800000000000L;
_headers._Via = value;
return true;
}
@@ -4290,9 +4372,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Date, key))
{
- if ((_bits & 0x80000L) == 0)
+ if ((_bits & 0x200000L) == 0)
{
- _bits |= 0x80000L;
+ _bits |= 0x200000L;
_headers._Date = value;
return true;
}
@@ -4300,9 +4382,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.From, key))
{
- if ((_bits & 0x200000L) == 0)
+ if ((_bits & 0x800000L) == 0)
{
- _bits |= 0x200000L;
+ _bits |= 0x800000L;
_headers._From = value;
return true;
}
@@ -4321,9 +4403,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Date.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000L) == 0)
+ if ((_bits & 0x200000L) == 0)
{
- _bits |= 0x80000L;
+ _bits |= 0x200000L;
_headers._Date = value;
return true;
}
@@ -4331,9 +4413,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.From.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000L) == 0)
+ if ((_bits & 0x800000L) == 0)
{
- _bits |= 0x200000L;
+ _bits |= 0x800000L;
_headers._From = value;
return true;
}
@@ -4343,7 +4425,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 5:
{
- if (ReferenceEquals(HeaderNames.Path, key))
+ if (ReferenceEquals(InternalHeaderNames.Path, key))
{
if ((_bits & 0x40L) == 0)
{
@@ -4355,16 +4437,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Range, key))
{
- if ((_bits & 0x800000000L) == 0)
+ if ((_bits & 0x2000000000L) == 0)
{
- _bits |= 0x800000000L;
+ _bits |= 0x2000000000L;
_headers._Range = value;
return true;
}
return false;
}
- if (HeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x40L) == 0)
{
@@ -4376,9 +4458,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Range.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800000000L) == 0)
+ if ((_bits & 0x2000000000L) == 0)
{
- _bits |= 0x800000000L;
+ _bits |= 0x2000000000L;
_headers._Range = value;
return true;
}
@@ -4400,9 +4482,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Cookie, key))
{
- if ((_bits & 0x20000L) == 0)
+ if ((_bits & 0x80000L) == 0)
{
- _bits |= 0x20000L;
+ _bits |= 0x80000L;
_headers._Cookie = value;
return true;
}
@@ -4410,9 +4492,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Expect, key))
{
- if ((_bits & 0x100000L) == 0)
+ if ((_bits & 0x400000L) == 0)
{
- _bits |= 0x100000L;
+ _bits |= 0x400000L;
_headers._Expect = value;
return true;
}
@@ -4420,9 +4502,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Origin, key))
{
- if ((_bits & 0x100000000L) == 0)
+ if ((_bits & 0x400000000L) == 0)
{
- _bits |= 0x100000000L;
+ _bits |= 0x400000000L;
_headers._Origin = value;
return true;
}
@@ -4430,9 +4512,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Pragma, key))
{
- if ((_bits & 0x200000000L) == 0)
+ if ((_bits & 0x800000000L) == 0)
{
- _bits |= 0x200000000L;
+ _bits |= 0x800000000L;
_headers._Pragma = value;
return true;
}
@@ -4451,9 +4533,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Cookie.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000L) == 0)
+ if ((_bits & 0x80000L) == 0)
{
- _bits |= 0x20000L;
+ _bits |= 0x80000L;
_headers._Cookie = value;
return true;
}
@@ -4461,9 +4543,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Expect.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000L) == 0)
+ if ((_bits & 0x400000L) == 0)
{
- _bits |= 0x100000L;
+ _bits |= 0x400000L;
_headers._Expect = value;
return true;
}
@@ -4471,9 +4553,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Origin.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000000L) == 0)
+ if ((_bits & 0x400000000L) == 0)
{
- _bits |= 0x100000000L;
+ _bits |= 0x400000000L;
_headers._Origin = value;
return true;
}
@@ -4481,9 +4563,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Pragma.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000000L) == 0)
+ if ((_bits & 0x800000000L) == 0)
{
- _bits |= 0x200000000L;
+ _bits |= 0x800000000L;
_headers._Pragma = value;
return true;
}
@@ -4493,7 +4575,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 7:
{
- if (ReferenceEquals(HeaderNames.Method, key))
+ if (ReferenceEquals(InternalHeaderNames.Method, key))
{
if ((_bits & 0x20L) == 0)
{
@@ -4503,11 +4585,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (ReferenceEquals(HeaderNames.Scheme, key))
+ if (ReferenceEquals(InternalHeaderNames.Scheme, key))
{
- if ((_bits & 0x80L) == 0)
+ if ((_bits & 0x100L) == 0)
{
- _bits |= 0x80L;
+ _bits |= 0x100L;
_headers._Scheme = value;
return true;
}
@@ -4515,9 +4597,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Baggage, key))
{
- if ((_bits & 0x4000L) == 0)
+ if ((_bits & 0x10000L) == 0)
{
- _bits |= 0x4000L;
+ _bits |= 0x10000L;
_headers._Baggage = value;
return true;
}
@@ -4525,9 +4607,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Referer, key))
{
- if ((_bits & 0x1000000000L) == 0)
+ if ((_bits & 0x4000000000L) == 0)
{
- _bits |= 0x1000000000L;
+ _bits |= 0x4000000000L;
_headers._Referer = value;
return true;
}
@@ -4535,9 +4617,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Upgrade, key))
{
- if ((_bits & 0x80000000000L) == 0)
+ if ((_bits & 0x200000000000L) == 0)
{
- _bits |= 0x80000000000L;
+ _bits |= 0x200000000000L;
_headers._Upgrade = value;
return true;
}
@@ -4545,16 +4627,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Warning, key))
{
- if ((_bits & 0x400000000000L) == 0)
+ if ((_bits & 0x1000000000000L) == 0)
{
- _bits |= 0x400000000000L;
+ _bits |= 0x1000000000000L;
_headers._Warning = value;
return true;
}
return false;
}
- if (HeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x20L) == 0)
{
@@ -4564,11 +4646,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (HeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80L) == 0)
+ if ((_bits & 0x100L) == 0)
{
- _bits |= 0x80L;
+ _bits |= 0x100L;
_headers._Scheme = value;
return true;
}
@@ -4576,9 +4658,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Baggage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000L) == 0)
+ if ((_bits & 0x10000L) == 0)
{
- _bits |= 0x4000L;
+ _bits |= 0x10000L;
_headers._Baggage = value;
return true;
}
@@ -4586,9 +4668,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Referer.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000000000L) == 0)
+ if ((_bits & 0x4000000000L) == 0)
{
- _bits |= 0x1000000000L;
+ _bits |= 0x4000000000L;
_headers._Referer = value;
return true;
}
@@ -4596,9 +4678,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Upgrade.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000000000L) == 0)
+ if ((_bits & 0x200000000000L) == 0)
{
- _bits |= 0x80000000000L;
+ _bits |= 0x200000000000L;
_headers._Upgrade = value;
return true;
}
@@ -4606,9 +4688,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Warning.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000000000L) == 0)
+ if ((_bits & 0x1000000000000L) == 0)
{
- _bits |= 0x400000000000L;
+ _bits |= 0x1000000000000L;
_headers._Warning = value;
return true;
}
@@ -4618,11 +4700,21 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 8:
{
+ if (ReferenceEquals(InternalHeaderNames.AltUsed, key))
+ {
+ if ((_bits & 0x4000L) == 0)
+ {
+ _bits |= 0x4000L;
+ _headers._AltUsed = value;
+ return true;
+ }
+ return false;
+ }
if (ReferenceEquals(HeaderNames.IfMatch, key))
{
- if ((_bits & 0x2000000L) == 0)
+ if ((_bits & 0x8000000L) == 0)
{
- _bits |= 0x2000000L;
+ _bits |= 0x8000000L;
_headers._IfMatch = value;
return true;
}
@@ -4630,20 +4722,30 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfRange, key))
{
- if ((_bits & 0x10000000L) == 0)
+ if ((_bits & 0x40000000L) == 0)
{
- _bits |= 0x10000000L;
+ _bits |= 0x40000000L;
_headers._IfRange = value;
return true;
}
return false;
}
+ if (InternalHeaderNames.AltUsed.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ if ((_bits & 0x4000L) == 0)
+ {
+ _bits |= 0x4000L;
+ _headers._AltUsed = value;
+ return true;
+ }
+ return false;
+ }
if (HeaderNames.IfMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000000L) == 0)
+ if ((_bits & 0x8000000L) == 0)
{
- _bits |= 0x2000000L;
+ _bits |= 0x8000000L;
_headers._IfMatch = value;
return true;
}
@@ -4651,9 +4753,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfRange.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000000L) == 0)
+ if ((_bits & 0x40000000L) == 0)
{
- _bits |= 0x10000000L;
+ _bits |= 0x40000000L;
_headers._IfRange = value;
return true;
}
@@ -4663,22 +4765,42 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 9:
{
+ if (ReferenceEquals(InternalHeaderNames.Protocol, key))
+ {
+ if ((_bits & 0x80L) == 0)
+ {
+ _bits |= 0x80L;
+ _headers._Protocol = value;
+ return true;
+ }
+ return false;
+ }
if (ReferenceEquals(HeaderNames.Translate, key))
{
- if ((_bits & 0x40000000000L) == 0)
+ if ((_bits & 0x100000000000L) == 0)
{
- _bits |= 0x40000000000L;
+ _bits |= 0x100000000000L;
_headers._Translate = value;
return true;
}
return false;
}
+ if (InternalHeaderNames.Protocol.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ if ((_bits & 0x80L) == 0)
+ {
+ _bits |= 0x80L;
+ _headers._Protocol = value;
+ return true;
+ }
+ return false;
+ }
if (HeaderNames.Translate.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000000000L) == 0)
+ if ((_bits & 0x100000000000L) == 0)
{
- _bits |= 0x40000000000L;
+ _bits |= 0x100000000000L;
_headers._Translate = value;
return true;
}
@@ -4708,7 +4830,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (ReferenceEquals(HeaderNames.Authority, key))
+ if (ReferenceEquals(InternalHeaderNames.Authority, key))
{
if ((_bits & 0x10L) == 0)
{
@@ -4720,9 +4842,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.KeepAlive, key))
{
- if ((_bits & 0x40000000L) == 0)
+ if ((_bits & 0x100000000L) == 0)
{
- _bits |= 0x40000000L;
+ _bits |= 0x100000000L;
_headers._KeepAlive = value;
return true;
}
@@ -4730,9 +4852,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.RequestId, key))
{
- if ((_bits & 0x2000000000L) == 0)
+ if ((_bits & 0x8000000000L) == 0)
{
- _bits |= 0x2000000000L;
+ _bits |= 0x8000000000L;
_headers._RequestId = value;
return true;
}
@@ -4740,9 +4862,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.TraceState, key))
{
- if ((_bits & 0x10000000000L) == 0)
+ if ((_bits & 0x40000000000L) == 0)
{
- _bits |= 0x10000000000L;
+ _bits |= 0x40000000000L;
_headers._TraceState = value;
return true;
}
@@ -4769,7 +4891,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (HeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x10L) == 0)
{
@@ -4781,9 +4903,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.KeepAlive.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000000L) == 0)
+ if ((_bits & 0x100000000L) == 0)
{
- _bits |= 0x40000000L;
+ _bits |= 0x100000000L;
_headers._KeepAlive = value;
return true;
}
@@ -4791,9 +4913,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.RequestId.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000000000L) == 0)
+ if ((_bits & 0x8000000000L) == 0)
{
- _bits |= 0x2000000000L;
+ _bits |= 0x8000000000L;
_headers._RequestId = value;
return true;
}
@@ -4801,9 +4923,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.TraceState.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000000000L) == 0)
+ if ((_bits & 0x40000000000L) == 0)
{
- _bits |= 0x10000000000L;
+ _bits |= 0x40000000000L;
_headers._TraceState = value;
return true;
}
@@ -4815,9 +4937,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TraceParent, key))
{
- if ((_bits & 0x8000000000L) == 0)
+ if ((_bits & 0x20000000000L) == 0)
{
- _bits |= 0x8000000000L;
+ _bits |= 0x20000000000L;
_headers._TraceParent = value;
return true;
}
@@ -4826,9 +4948,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.TraceParent.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000000000L) == 0)
+ if ((_bits & 0x20000000000L) == 0)
{
- _bits |= 0x8000000000L;
+ _bits |= 0x20000000000L;
_headers._TraceParent = value;
return true;
}
@@ -4840,9 +4962,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.ContentType, key))
{
- if ((_bits & 0x10000L) == 0)
+ if ((_bits & 0x40000L) == 0)
{
- _bits |= 0x10000L;
+ _bits |= 0x40000L;
_headers._ContentType = value;
return true;
}
@@ -4850,9 +4972,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.GrpcTimeout, key))
{
- if ((_bits & 0x1000000L) == 0)
+ if ((_bits & 0x4000000L) == 0)
{
- _bits |= 0x1000000L;
+ _bits |= 0x4000000L;
_headers._GrpcTimeout = value;
return true;
}
@@ -4860,9 +4982,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.MaxForwards, key))
{
- if ((_bits & 0x80000000L) == 0)
+ if ((_bits & 0x200000000L) == 0)
{
- _bits |= 0x80000000L;
+ _bits |= 0x200000000L;
_headers._MaxForwards = value;
return true;
}
@@ -4871,9 +4993,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.ContentType.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000L) == 0)
+ if ((_bits & 0x40000L) == 0)
{
- _bits |= 0x10000L;
+ _bits |= 0x40000L;
_headers._ContentType = value;
return true;
}
@@ -4881,9 +5003,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.GrpcTimeout.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000000L) == 0)
+ if ((_bits & 0x4000000L) == 0)
{
- _bits |= 0x1000000L;
+ _bits |= 0x4000000L;
_headers._GrpcTimeout = value;
return true;
}
@@ -4891,9 +5013,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.MaxForwards.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000000L) == 0)
+ if ((_bits & 0x200000000L) == 0)
{
- _bits |= 0x80000000L;
+ _bits |= 0x200000000L;
_headers._MaxForwards = value;
return true;
}
@@ -4905,9 +5027,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Authorization, key))
{
- if ((_bits & 0x2000L) == 0)
+ if ((_bits & 0x8000L) == 0)
{
- _bits |= 0x2000L;
+ _bits |= 0x8000L;
_headers._Authorization = value;
return true;
}
@@ -4915,9 +5037,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.CacheControl, key))
{
- if ((_bits & 0x8000L) == 0)
+ if ((_bits & 0x20000L) == 0)
{
- _bits |= 0x8000L;
+ _bits |= 0x20000L;
_headers._CacheControl = value;
return true;
}
@@ -4925,9 +5047,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.GrpcEncoding, key))
{
- if ((_bits & 0x800000L) == 0)
+ if ((_bits & 0x2000000L) == 0)
{
- _bits |= 0x800000L;
+ _bits |= 0x2000000L;
_headers._GrpcEncoding = value;
return true;
}
@@ -4935,9 +5057,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfNoneMatch, key))
{
- if ((_bits & 0x8000000L) == 0)
+ if ((_bits & 0x20000000L) == 0)
{
- _bits |= 0x8000000L;
+ _bits |= 0x20000000L;
_headers._IfNoneMatch = value;
return true;
}
@@ -4946,9 +5068,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.Authorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000L) == 0)
+ if ((_bits & 0x8000L) == 0)
{
- _bits |= 0x2000L;
+ _bits |= 0x8000L;
_headers._Authorization = value;
return true;
}
@@ -4956,9 +5078,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.CacheControl.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000L) == 0)
+ if ((_bits & 0x20000L) == 0)
{
- _bits |= 0x8000L;
+ _bits |= 0x20000L;
_headers._CacheControl = value;
return true;
}
@@ -4966,9 +5088,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.GrpcEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800000L) == 0)
+ if ((_bits & 0x2000000L) == 0)
{
- _bits |= 0x800000L;
+ _bits |= 0x2000000L;
_headers._GrpcEncoding = value;
return true;
}
@@ -4976,9 +5098,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfNoneMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000000L) == 0)
+ if ((_bits & 0x20000000L) == 0)
{
- _bits |= 0x8000000L;
+ _bits |= 0x20000000L;
_headers._IfNoneMatch = value;
return true;
}
@@ -4990,9 +5112,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptCharset, key))
{
- if ((_bits & 0x100L) == 0)
+ if ((_bits & 0x200L) == 0)
{
- _bits |= 0x100L;
+ _bits |= 0x200L;
_headers._AcceptCharset = value;
return true;
}
@@ -5010,9 +5132,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptCharset.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100L) == 0)
+ if ((_bits & 0x200L) == 0)
{
- _bits |= 0x100L;
+ _bits |= 0x200L;
_headers._AcceptCharset = value;
return true;
}
@@ -5033,9 +5155,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptEncoding, key))
{
- if ((_bits & 0x200L) == 0)
+ if ((_bits & 0x400L) == 0)
{
- _bits |= 0x200L;
+ _bits |= 0x400L;
_headers._AcceptEncoding = value;
return true;
}
@@ -5043,9 +5165,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.AcceptLanguage, key))
{
- if ((_bits & 0x400L) == 0)
+ if ((_bits & 0x800L) == 0)
{
- _bits |= 0x400L;
+ _bits |= 0x800L;
_headers._AcceptLanguage = value;
return true;
}
@@ -5054,9 +5176,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200L) == 0)
+ if ((_bits & 0x400L) == 0)
{
- _bits |= 0x200L;
+ _bits |= 0x400L;
_headers._AcceptEncoding = value;
return true;
}
@@ -5064,9 +5186,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.AcceptLanguage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400L) == 0)
+ if ((_bits & 0x800L) == 0)
{
- _bits |= 0x400L;
+ _bits |= 0x800L;
_headers._AcceptLanguage = value;
return true;
}
@@ -5078,9 +5200,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.IfModifiedSince, key))
{
- if ((_bits & 0x4000000L) == 0)
+ if ((_bits & 0x10000000L) == 0)
{
- _bits |= 0x4000000L;
+ _bits |= 0x10000000L;
_headers._IfModifiedSince = value;
return true;
}
@@ -5088,9 +5210,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.TransferEncoding, key))
{
- if ((_bits & 0x20000000000L) == 0)
+ if ((_bits & 0x80000000000L) == 0)
{
- _bits |= 0x20000000000L;
+ _bits |= 0x80000000000L;
_headers._TransferEncoding = value;
return true;
}
@@ -5099,9 +5221,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.IfModifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000000L) == 0)
+ if ((_bits & 0x10000000L) == 0)
{
- _bits |= 0x4000000L;
+ _bits |= 0x10000000L;
_headers._IfModifiedSince = value;
return true;
}
@@ -5109,9 +5231,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.TransferEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000000000L) == 0)
+ if ((_bits & 0x80000000000L) == 0)
{
- _bits |= 0x20000000000L;
+ _bits |= 0x80000000000L;
_headers._TransferEncoding = value;
return true;
}
@@ -5123,9 +5245,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.CorrelationContext, key))
{
- if ((_bits & 0x40000L) == 0)
+ if ((_bits & 0x100000L) == 0)
{
- _bits |= 0x40000L;
+ _bits |= 0x100000L;
_headers._CorrelationContext = value;
return true;
}
@@ -5133,9 +5255,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfUnmodifiedSince, key))
{
- if ((_bits & 0x20000000L) == 0)
+ if ((_bits & 0x80000000L) == 0)
{
- _bits |= 0x20000000L;
+ _bits |= 0x80000000L;
_headers._IfUnmodifiedSince = value;
return true;
}
@@ -5143,9 +5265,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.ProxyAuthorization, key))
{
- if ((_bits & 0x400000000L) == 0)
+ if ((_bits & 0x1000000000L) == 0)
{
- _bits |= 0x400000000L;
+ _bits |= 0x1000000000L;
_headers._ProxyAuthorization = value;
return true;
}
@@ -5154,9 +5276,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.CorrelationContext.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000L) == 0)
+ if ((_bits & 0x100000L) == 0)
{
- _bits |= 0x40000L;
+ _bits |= 0x100000L;
_headers._CorrelationContext = value;
return true;
}
@@ -5164,9 +5286,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfUnmodifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000000L) == 0)
+ if ((_bits & 0x80000000L) == 0)
{
- _bits |= 0x20000000L;
+ _bits |= 0x80000000L;
_headers._IfUnmodifiedSince = value;
return true;
}
@@ -5174,9 +5296,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.ProxyAuthorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000000L) == 0)
+ if ((_bits & 0x1000000000L) == 0)
{
- _bits |= 0x400000000L;
+ _bits |= 0x1000000000L;
_headers._ProxyAuthorization = value;
return true;
}
@@ -5188,9 +5310,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.GrpcAcceptEncoding, key))
{
- if ((_bits & 0x400000L) == 0)
+ if ((_bits & 0x1000000L) == 0)
{
- _bits |= 0x400000L;
+ _bits |= 0x1000000L;
_headers._GrpcAcceptEncoding = value;
return true;
}
@@ -5199,9 +5321,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.GrpcAcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000L) == 0)
+ if ((_bits & 0x1000000L) == 0)
{
- _bits |= 0x400000L;
+ _bits |= 0x1000000L;
_headers._GrpcAcceptEncoding = value;
return true;
}
@@ -5213,9 +5335,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.UpgradeInsecureRequests, key))
{
- if ((_bits & 0x100000000000L) == 0)
+ if ((_bits & 0x400000000000L) == 0)
{
- _bits |= 0x100000000000L;
+ _bits |= 0x400000000000L;
_headers._UpgradeInsecureRequests = value;
return true;
}
@@ -5224,9 +5346,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.UpgradeInsecureRequests.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000000000L) == 0)
+ if ((_bits & 0x400000000000L) == 0)
{
- _bits |= 0x100000000000L;
+ _bits |= 0x400000000000L;
_headers._UpgradeInsecureRequests = value;
return true;
}
@@ -5238,9 +5360,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestMethod, key))
{
- if ((_bits & 0x1000L) == 0)
+ if ((_bits & 0x2000L) == 0)
{
- _bits |= 0x1000L;
+ _bits |= 0x2000L;
_headers._AccessControlRequestMethod = value;
return true;
}
@@ -5249,9 +5371,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AccessControlRequestMethod.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000L) == 0)
+ if ((_bits & 0x2000L) == 0)
{
- _bits |= 0x1000L;
+ _bits |= 0x2000L;
_headers._AccessControlRequestMethod = value;
return true;
}
@@ -5263,9 +5385,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestHeaders, key))
{
- if ((_bits & 0x800L) == 0)
+ if ((_bits & 0x1000L) == 0)
{
- _bits |= 0x800L;
+ _bits |= 0x1000L;
_headers._AccessControlRequestHeaders = value;
return true;
}
@@ -5274,9 +5396,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AccessControlRequestHeaders.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800L) == 0)
+ if ((_bits & 0x1000L) == 0)
{
- _bits |= 0x800L;
+ _bits |= 0x1000L;
_headers._AccessControlRequestHeaders = value;
return true;
}
@@ -5297,9 +5419,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TE, key))
{
- if ((_bits & 0x4000000000L) != 0)
+ if ((_bits & 0x10000000000L) != 0)
{
- _bits &= ~0x4000000000L;
+ _bits &= ~0x10000000000L;
_headers._TE = default(StringValues);
return true;
}
@@ -5308,9 +5430,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.TE.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000000000L) != 0)
+ if ((_bits & 0x10000000000L) != 0)
{
- _bits &= ~0x4000000000L;
+ _bits &= ~0x10000000000L;
_headers._TE = default(StringValues);
return true;
}
@@ -5322,9 +5444,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Via, key))
{
- if ((_bits & 0x200000000000L) != 0)
+ if ((_bits & 0x800000000000L) != 0)
{
- _bits &= ~0x200000000000L;
+ _bits &= ~0x800000000000L;
_headers._Via = default(StringValues);
return true;
}
@@ -5333,9 +5455,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.Via.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000000000L) != 0)
+ if ((_bits & 0x800000000000L) != 0)
{
- _bits &= ~0x200000000000L;
+ _bits &= ~0x800000000000L;
_headers._Via = default(StringValues);
return true;
}
@@ -5357,9 +5479,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Date, key))
{
- if ((_bits & 0x80000L) != 0)
+ if ((_bits & 0x200000L) != 0)
{
- _bits &= ~0x80000L;
+ _bits &= ~0x200000L;
_headers._Date = default(StringValues);
return true;
}
@@ -5367,9 +5489,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.From, key))
{
- if ((_bits & 0x200000L) != 0)
+ if ((_bits & 0x800000L) != 0)
{
- _bits &= ~0x200000L;
+ _bits &= ~0x800000L;
_headers._From = default(StringValues);
return true;
}
@@ -5388,9 +5510,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Date.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000L) != 0)
+ if ((_bits & 0x200000L) != 0)
{
- _bits &= ~0x80000L;
+ _bits &= ~0x200000L;
_headers._Date = default(StringValues);
return true;
}
@@ -5398,9 +5520,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.From.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000L) != 0)
+ if ((_bits & 0x800000L) != 0)
{
- _bits &= ~0x200000L;
+ _bits &= ~0x800000L;
_headers._From = default(StringValues);
return true;
}
@@ -5410,7 +5532,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 5:
{
- if (ReferenceEquals(HeaderNames.Path, key))
+ if (ReferenceEquals(InternalHeaderNames.Path, key))
{
if ((_bits & 0x40L) != 0)
{
@@ -5422,16 +5544,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Range, key))
{
- if ((_bits & 0x800000000L) != 0)
+ if ((_bits & 0x2000000000L) != 0)
{
- _bits &= ~0x800000000L;
+ _bits &= ~0x2000000000L;
_headers._Range = default(StringValues);
return true;
}
return false;
}
- if (HeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Path.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x40L) != 0)
{
@@ -5443,9 +5565,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Range.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800000000L) != 0)
+ if ((_bits & 0x2000000000L) != 0)
{
- _bits &= ~0x800000000L;
+ _bits &= ~0x2000000000L;
_headers._Range = default(StringValues);
return true;
}
@@ -5467,9 +5589,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Cookie, key))
{
- if ((_bits & 0x20000L) != 0)
+ if ((_bits & 0x80000L) != 0)
{
- _bits &= ~0x20000L;
+ _bits &= ~0x80000L;
_headers._Cookie = default(StringValues);
return true;
}
@@ -5477,9 +5599,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Expect, key))
{
- if ((_bits & 0x100000L) != 0)
+ if ((_bits & 0x400000L) != 0)
{
- _bits &= ~0x100000L;
+ _bits &= ~0x400000L;
_headers._Expect = default(StringValues);
return true;
}
@@ -5487,9 +5609,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Origin, key))
{
- if ((_bits & 0x100000000L) != 0)
+ if ((_bits & 0x400000000L) != 0)
{
- _bits &= ~0x100000000L;
+ _bits &= ~0x400000000L;
_headers._Origin = default(StringValues);
return true;
}
@@ -5497,9 +5619,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Pragma, key))
{
- if ((_bits & 0x200000000L) != 0)
+ if ((_bits & 0x800000000L) != 0)
{
- _bits &= ~0x200000000L;
+ _bits &= ~0x800000000L;
_headers._Pragma = default(StringValues);
return true;
}
@@ -5518,9 +5640,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Cookie.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000L) != 0)
+ if ((_bits & 0x80000L) != 0)
{
- _bits &= ~0x20000L;
+ _bits &= ~0x80000L;
_headers._Cookie = default(StringValues);
return true;
}
@@ -5528,9 +5650,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Expect.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000L) != 0)
+ if ((_bits & 0x400000L) != 0)
{
- _bits &= ~0x100000L;
+ _bits &= ~0x400000L;
_headers._Expect = default(StringValues);
return true;
}
@@ -5538,9 +5660,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Origin.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000000L) != 0)
+ if ((_bits & 0x400000000L) != 0)
{
- _bits &= ~0x100000000L;
+ _bits &= ~0x400000000L;
_headers._Origin = default(StringValues);
return true;
}
@@ -5548,9 +5670,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Pragma.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200000000L) != 0)
+ if ((_bits & 0x800000000L) != 0)
{
- _bits &= ~0x200000000L;
+ _bits &= ~0x800000000L;
_headers._Pragma = default(StringValues);
return true;
}
@@ -5560,7 +5682,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 7:
{
- if (ReferenceEquals(HeaderNames.Method, key))
+ if (ReferenceEquals(InternalHeaderNames.Method, key))
{
if ((_bits & 0x20L) != 0)
{
@@ -5570,11 +5692,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (ReferenceEquals(HeaderNames.Scheme, key))
+ if (ReferenceEquals(InternalHeaderNames.Scheme, key))
{
- if ((_bits & 0x80L) != 0)
+ if ((_bits & 0x100L) != 0)
{
- _bits &= ~0x80L;
+ _bits &= ~0x100L;
_headers._Scheme = default(StringValues);
return true;
}
@@ -5582,9 +5704,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Baggage, key))
{
- if ((_bits & 0x4000L) != 0)
+ if ((_bits & 0x10000L) != 0)
{
- _bits &= ~0x4000L;
+ _bits &= ~0x10000L;
_headers._Baggage = default(StringValues);
return true;
}
@@ -5592,9 +5714,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Referer, key))
{
- if ((_bits & 0x1000000000L) != 0)
+ if ((_bits & 0x4000000000L) != 0)
{
- _bits &= ~0x1000000000L;
+ _bits &= ~0x4000000000L;
_headers._Referer = default(StringValues);
return true;
}
@@ -5602,9 +5724,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Upgrade, key))
{
- if ((_bits & 0x80000000000L) != 0)
+ if ((_bits & 0x200000000000L) != 0)
{
- _bits &= ~0x80000000000L;
+ _bits &= ~0x200000000000L;
_headers._Upgrade = default(StringValues);
return true;
}
@@ -5612,16 +5734,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.Warning, key))
{
- if ((_bits & 0x400000000000L) != 0)
+ if ((_bits & 0x1000000000000L) != 0)
{
- _bits &= ~0x400000000000L;
+ _bits &= ~0x1000000000000L;
_headers._Warning = default(StringValues);
return true;
}
return false;
}
- if (HeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Method.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x20L) != 0)
{
@@ -5631,11 +5753,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (HeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Scheme.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80L) != 0)
+ if ((_bits & 0x100L) != 0)
{
- _bits &= ~0x80L;
+ _bits &= ~0x100L;
_headers._Scheme = default(StringValues);
return true;
}
@@ -5643,9 +5765,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Baggage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000L) != 0)
+ if ((_bits & 0x10000L) != 0)
{
- _bits &= ~0x4000L;
+ _bits &= ~0x10000L;
_headers._Baggage = default(StringValues);
return true;
}
@@ -5653,9 +5775,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Referer.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000000000L) != 0)
+ if ((_bits & 0x4000000000L) != 0)
{
- _bits &= ~0x1000000000L;
+ _bits &= ~0x4000000000L;
_headers._Referer = default(StringValues);
return true;
}
@@ -5663,9 +5785,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Upgrade.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000000000L) != 0)
+ if ((_bits & 0x200000000000L) != 0)
{
- _bits &= ~0x80000000000L;
+ _bits &= ~0x200000000000L;
_headers._Upgrade = default(StringValues);
return true;
}
@@ -5673,9 +5795,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.Warning.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000000000L) != 0)
+ if ((_bits & 0x1000000000000L) != 0)
{
- _bits &= ~0x400000000000L;
+ _bits &= ~0x1000000000000L;
_headers._Warning = default(StringValues);
return true;
}
@@ -5685,11 +5807,21 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 8:
{
+ if (ReferenceEquals(InternalHeaderNames.AltUsed, key))
+ {
+ if ((_bits & 0x4000L) != 0)
+ {
+ _bits &= ~0x4000L;
+ _headers._AltUsed = default(StringValues);
+ return true;
+ }
+ return false;
+ }
if (ReferenceEquals(HeaderNames.IfMatch, key))
{
- if ((_bits & 0x2000000L) != 0)
+ if ((_bits & 0x8000000L) != 0)
{
- _bits &= ~0x2000000L;
+ _bits &= ~0x8000000L;
_headers._IfMatch = default(StringValues);
return true;
}
@@ -5697,20 +5829,30 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfRange, key))
{
- if ((_bits & 0x10000000L) != 0)
+ if ((_bits & 0x40000000L) != 0)
{
- _bits &= ~0x10000000L;
+ _bits &= ~0x40000000L;
_headers._IfRange = default(StringValues);
return true;
}
return false;
}
+ if (InternalHeaderNames.AltUsed.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ if ((_bits & 0x4000L) != 0)
+ {
+ _bits &= ~0x4000L;
+ _headers._AltUsed = default(StringValues);
+ return true;
+ }
+ return false;
+ }
if (HeaderNames.IfMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000000L) != 0)
+ if ((_bits & 0x8000000L) != 0)
{
- _bits &= ~0x2000000L;
+ _bits &= ~0x8000000L;
_headers._IfMatch = default(StringValues);
return true;
}
@@ -5718,9 +5860,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfRange.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000000L) != 0)
+ if ((_bits & 0x40000000L) != 0)
{
- _bits &= ~0x10000000L;
+ _bits &= ~0x40000000L;
_headers._IfRange = default(StringValues);
return true;
}
@@ -5730,22 +5872,42 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
case 9:
{
+ if (ReferenceEquals(InternalHeaderNames.Protocol, key))
+ {
+ if ((_bits & 0x80L) != 0)
+ {
+ _bits &= ~0x80L;
+ _headers._Protocol = default(StringValues);
+ return true;
+ }
+ return false;
+ }
if (ReferenceEquals(HeaderNames.Translate, key))
{
- if ((_bits & 0x40000000000L) != 0)
+ if ((_bits & 0x100000000000L) != 0)
{
- _bits &= ~0x40000000000L;
+ _bits &= ~0x100000000000L;
_headers._Translate = default(StringValues);
return true;
}
return false;
}
+ if (InternalHeaderNames.Protocol.Equals(key, StringComparison.OrdinalIgnoreCase))
+ {
+ if ((_bits & 0x80L) != 0)
+ {
+ _bits &= ~0x80L;
+ _headers._Protocol = default(StringValues);
+ return true;
+ }
+ return false;
+ }
if (HeaderNames.Translate.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000000000L) != 0)
+ if ((_bits & 0x100000000000L) != 0)
{
- _bits &= ~0x40000000000L;
+ _bits &= ~0x100000000000L;
_headers._Translate = default(StringValues);
return true;
}
@@ -5775,7 +5937,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (ReferenceEquals(HeaderNames.Authority, key))
+ if (ReferenceEquals(InternalHeaderNames.Authority, key))
{
if ((_bits & 0x10L) != 0)
{
@@ -5787,9 +5949,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.KeepAlive, key))
{
- if ((_bits & 0x40000000L) != 0)
+ if ((_bits & 0x100000000L) != 0)
{
- _bits &= ~0x40000000L;
+ _bits &= ~0x100000000L;
_headers._KeepAlive = default(StringValues);
return true;
}
@@ -5797,9 +5959,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.RequestId, key))
{
- if ((_bits & 0x2000000000L) != 0)
+ if ((_bits & 0x8000000000L) != 0)
{
- _bits &= ~0x2000000000L;
+ _bits &= ~0x8000000000L;
_headers._RequestId = default(StringValues);
return true;
}
@@ -5807,9 +5969,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.TraceState, key))
{
- if ((_bits & 0x10000000000L) != 0)
+ if ((_bits & 0x40000000000L) != 0)
{
- _bits &= ~0x10000000000L;
+ _bits &= ~0x40000000000L;
_headers._TraceState = default(StringValues);
return true;
}
@@ -5836,7 +5998,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return false;
}
- if (HeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if (InternalHeaderNames.Authority.Equals(key, StringComparison.OrdinalIgnoreCase))
{
if ((_bits & 0x10L) != 0)
{
@@ -5848,9 +6010,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.KeepAlive.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000000L) != 0)
+ if ((_bits & 0x100000000L) != 0)
{
- _bits &= ~0x40000000L;
+ _bits &= ~0x100000000L;
_headers._KeepAlive = default(StringValues);
return true;
}
@@ -5858,9 +6020,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.RequestId.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000000000L) != 0)
+ if ((_bits & 0x8000000000L) != 0)
{
- _bits &= ~0x2000000000L;
+ _bits &= ~0x8000000000L;
_headers._RequestId = default(StringValues);
return true;
}
@@ -5868,9 +6030,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.TraceState.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000000000L) != 0)
+ if ((_bits & 0x40000000000L) != 0)
{
- _bits &= ~0x10000000000L;
+ _bits &= ~0x40000000000L;
_headers._TraceState = default(StringValues);
return true;
}
@@ -5882,9 +6044,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.TraceParent, key))
{
- if ((_bits & 0x8000000000L) != 0)
+ if ((_bits & 0x20000000000L) != 0)
{
- _bits &= ~0x8000000000L;
+ _bits &= ~0x20000000000L;
_headers._TraceParent = default(StringValues);
return true;
}
@@ -5893,9 +6055,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.TraceParent.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000000000L) != 0)
+ if ((_bits & 0x20000000000L) != 0)
{
- _bits &= ~0x8000000000L;
+ _bits &= ~0x20000000000L;
_headers._TraceParent = default(StringValues);
return true;
}
@@ -5907,9 +6069,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.ContentType, key))
{
- if ((_bits & 0x10000L) != 0)
+ if ((_bits & 0x40000L) != 0)
{
- _bits &= ~0x10000L;
+ _bits &= ~0x40000L;
_headers._ContentType = default(StringValues);
return true;
}
@@ -5917,9 +6079,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.GrpcTimeout, key))
{
- if ((_bits & 0x1000000L) != 0)
+ if ((_bits & 0x4000000L) != 0)
{
- _bits &= ~0x1000000L;
+ _bits &= ~0x4000000L;
_headers._GrpcTimeout = default(StringValues);
return true;
}
@@ -5927,9 +6089,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.MaxForwards, key))
{
- if ((_bits & 0x80000000L) != 0)
+ if ((_bits & 0x200000000L) != 0)
{
- _bits &= ~0x80000000L;
+ _bits &= ~0x200000000L;
_headers._MaxForwards = default(StringValues);
return true;
}
@@ -5938,9 +6100,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.ContentType.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x10000L) != 0)
+ if ((_bits & 0x40000L) != 0)
{
- _bits &= ~0x10000L;
+ _bits &= ~0x40000L;
_headers._ContentType = default(StringValues);
return true;
}
@@ -5948,9 +6110,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.GrpcTimeout.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000000L) != 0)
+ if ((_bits & 0x4000000L) != 0)
{
- _bits &= ~0x1000000L;
+ _bits &= ~0x4000000L;
_headers._GrpcTimeout = default(StringValues);
return true;
}
@@ -5958,9 +6120,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.MaxForwards.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x80000000L) != 0)
+ if ((_bits & 0x200000000L) != 0)
{
- _bits &= ~0x80000000L;
+ _bits &= ~0x200000000L;
_headers._MaxForwards = default(StringValues);
return true;
}
@@ -5972,9 +6134,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.Authorization, key))
{
- if ((_bits & 0x2000L) != 0)
+ if ((_bits & 0x8000L) != 0)
{
- _bits &= ~0x2000L;
+ _bits &= ~0x8000L;
_headers._Authorization = default(StringValues);
return true;
}
@@ -5982,9 +6144,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.CacheControl, key))
{
- if ((_bits & 0x8000L) != 0)
+ if ((_bits & 0x20000L) != 0)
{
- _bits &= ~0x8000L;
+ _bits &= ~0x20000L;
_headers._CacheControl = default(StringValues);
return true;
}
@@ -5992,9 +6154,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.GrpcEncoding, key))
{
- if ((_bits & 0x800000L) != 0)
+ if ((_bits & 0x2000000L) != 0)
{
- _bits &= ~0x800000L;
+ _bits &= ~0x2000000L;
_headers._GrpcEncoding = default(StringValues);
return true;
}
@@ -6002,9 +6164,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfNoneMatch, key))
{
- if ((_bits & 0x8000000L) != 0)
+ if ((_bits & 0x20000000L) != 0)
{
- _bits &= ~0x8000000L;
+ _bits &= ~0x20000000L;
_headers._IfNoneMatch = default(StringValues);
return true;
}
@@ -6013,9 +6175,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.Authorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x2000L) != 0)
+ if ((_bits & 0x8000L) != 0)
{
- _bits &= ~0x2000L;
+ _bits &= ~0x8000L;
_headers._Authorization = default(StringValues);
return true;
}
@@ -6023,9 +6185,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.CacheControl.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000L) != 0)
+ if ((_bits & 0x20000L) != 0)
{
- _bits &= ~0x8000L;
+ _bits &= ~0x20000L;
_headers._CacheControl = default(StringValues);
return true;
}
@@ -6033,9 +6195,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.GrpcEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800000L) != 0)
+ if ((_bits & 0x2000000L) != 0)
{
- _bits &= ~0x800000L;
+ _bits &= ~0x2000000L;
_headers._GrpcEncoding = default(StringValues);
return true;
}
@@ -6043,9 +6205,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfNoneMatch.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x8000000L) != 0)
+ if ((_bits & 0x20000000L) != 0)
{
- _bits &= ~0x8000000L;
+ _bits &= ~0x20000000L;
_headers._IfNoneMatch = default(StringValues);
return true;
}
@@ -6057,9 +6219,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptCharset, key))
{
- if ((_bits & 0x100L) != 0)
+ if ((_bits & 0x200L) != 0)
{
- _bits &= ~0x100L;
+ _bits &= ~0x200L;
_headers._AcceptCharset = default(StringValues);
return true;
}
@@ -6077,9 +6239,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptCharset.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100L) != 0)
+ if ((_bits & 0x200L) != 0)
{
- _bits &= ~0x100L;
+ _bits &= ~0x200L;
_headers._AcceptCharset = default(StringValues);
return true;
}
@@ -6100,9 +6262,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AcceptEncoding, key))
{
- if ((_bits & 0x200L) != 0)
+ if ((_bits & 0x400L) != 0)
{
- _bits &= ~0x200L;
+ _bits &= ~0x400L;
_headers._AcceptEncoding = default(StringValues);
return true;
}
@@ -6110,9 +6272,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.AcceptLanguage, key))
{
- if ((_bits & 0x400L) != 0)
+ if ((_bits & 0x800L) != 0)
{
- _bits &= ~0x400L;
+ _bits &= ~0x800L;
_headers._AcceptLanguage = default(StringValues);
return true;
}
@@ -6121,9 +6283,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x200L) != 0)
+ if ((_bits & 0x400L) != 0)
{
- _bits &= ~0x200L;
+ _bits &= ~0x400L;
_headers._AcceptEncoding = default(StringValues);
return true;
}
@@ -6131,9 +6293,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.AcceptLanguage.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400L) != 0)
+ if ((_bits & 0x800L) != 0)
{
- _bits &= ~0x400L;
+ _bits &= ~0x800L;
_headers._AcceptLanguage = default(StringValues);
return true;
}
@@ -6145,9 +6307,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.IfModifiedSince, key))
{
- if ((_bits & 0x4000000L) != 0)
+ if ((_bits & 0x10000000L) != 0)
{
- _bits &= ~0x4000000L;
+ _bits &= ~0x10000000L;
_headers._IfModifiedSince = default(StringValues);
return true;
}
@@ -6155,9 +6317,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.TransferEncoding, key))
{
- if ((_bits & 0x20000000000L) != 0)
+ if ((_bits & 0x80000000000L) != 0)
{
- _bits &= ~0x20000000000L;
+ _bits &= ~0x80000000000L;
_headers._TransferEncoding = default(StringValues);
return true;
}
@@ -6166,9 +6328,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.IfModifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x4000000L) != 0)
+ if ((_bits & 0x10000000L) != 0)
{
- _bits &= ~0x4000000L;
+ _bits &= ~0x10000000L;
_headers._IfModifiedSince = default(StringValues);
return true;
}
@@ -6176,9 +6338,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.TransferEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000000000L) != 0)
+ if ((_bits & 0x80000000000L) != 0)
{
- _bits &= ~0x20000000000L;
+ _bits &= ~0x80000000000L;
_headers._TransferEncoding = default(StringValues);
return true;
}
@@ -6190,9 +6352,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.CorrelationContext, key))
{
- if ((_bits & 0x40000L) != 0)
+ if ((_bits & 0x100000L) != 0)
{
- _bits &= ~0x40000L;
+ _bits &= ~0x100000L;
_headers._CorrelationContext = default(StringValues);
return true;
}
@@ -6200,9 +6362,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.IfUnmodifiedSince, key))
{
- if ((_bits & 0x20000000L) != 0)
+ if ((_bits & 0x80000000L) != 0)
{
- _bits &= ~0x20000000L;
+ _bits &= ~0x80000000L;
_headers._IfUnmodifiedSince = default(StringValues);
return true;
}
@@ -6210,9 +6372,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (ReferenceEquals(HeaderNames.ProxyAuthorization, key))
{
- if ((_bits & 0x400000000L) != 0)
+ if ((_bits & 0x1000000000L) != 0)
{
- _bits &= ~0x400000000L;
+ _bits &= ~0x1000000000L;
_headers._ProxyAuthorization = default(StringValues);
return true;
}
@@ -6221,9 +6383,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.CorrelationContext.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x40000L) != 0)
+ if ((_bits & 0x100000L) != 0)
{
- _bits &= ~0x40000L;
+ _bits &= ~0x100000L;
_headers._CorrelationContext = default(StringValues);
return true;
}
@@ -6231,9 +6393,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.IfUnmodifiedSince.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x20000000L) != 0)
+ if ((_bits & 0x80000000L) != 0)
{
- _bits &= ~0x20000000L;
+ _bits &= ~0x80000000L;
_headers._IfUnmodifiedSince = default(StringValues);
return true;
}
@@ -6241,9 +6403,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
if (HeaderNames.ProxyAuthorization.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000000L) != 0)
+ if ((_bits & 0x1000000000L) != 0)
{
- _bits &= ~0x400000000L;
+ _bits &= ~0x1000000000L;
_headers._ProxyAuthorization = default(StringValues);
return true;
}
@@ -6255,9 +6417,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.GrpcAcceptEncoding, key))
{
- if ((_bits & 0x400000L) != 0)
+ if ((_bits & 0x1000000L) != 0)
{
- _bits &= ~0x400000L;
+ _bits &= ~0x1000000L;
_headers._GrpcAcceptEncoding = default(StringValues);
return true;
}
@@ -6266,9 +6428,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.GrpcAcceptEncoding.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x400000L) != 0)
+ if ((_bits & 0x1000000L) != 0)
{
- _bits &= ~0x400000L;
+ _bits &= ~0x1000000L;
_headers._GrpcAcceptEncoding = default(StringValues);
return true;
}
@@ -6280,9 +6442,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.UpgradeInsecureRequests, key))
{
- if ((_bits & 0x100000000000L) != 0)
+ if ((_bits & 0x400000000000L) != 0)
{
- _bits &= ~0x100000000000L;
+ _bits &= ~0x400000000000L;
_headers._UpgradeInsecureRequests = default(StringValues);
return true;
}
@@ -6291,9 +6453,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.UpgradeInsecureRequests.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x100000000000L) != 0)
+ if ((_bits & 0x400000000000L) != 0)
{
- _bits &= ~0x100000000000L;
+ _bits &= ~0x400000000000L;
_headers._UpgradeInsecureRequests = default(StringValues);
return true;
}
@@ -6305,9 +6467,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestMethod, key))
{
- if ((_bits & 0x1000L) != 0)
+ if ((_bits & 0x2000L) != 0)
{
- _bits &= ~0x1000L;
+ _bits &= ~0x2000L;
_headers._AccessControlRequestMethod = default(StringValues);
return true;
}
@@ -6316,9 +6478,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AccessControlRequestMethod.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x1000L) != 0)
+ if ((_bits & 0x2000L) != 0)
{
- _bits &= ~0x1000L;
+ _bits &= ~0x2000L;
_headers._AccessControlRequestMethod = default(StringValues);
return true;
}
@@ -6330,9 +6492,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
if (ReferenceEquals(HeaderNames.AccessControlRequestHeaders, key))
{
- if ((_bits & 0x800L) != 0)
+ if ((_bits & 0x1000L) != 0)
{
- _bits &= ~0x800L;
+ _bits &= ~0x1000L;
_headers._AccessControlRequestHeaders = default(StringValues);
return true;
}
@@ -6341,9 +6503,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if (HeaderNames.AccessControlRequestHeaders.Equals(key, StringComparison.OrdinalIgnoreCase))
{
- if ((_bits & 0x800L) != 0)
+ if ((_bits & 0x1000L) != 0)
{
- _bits &= ~0x800L;
+ _bits &= ~0x1000L;
_headers._AccessControlRequestHeaders = default(StringValues);
return true;
}
@@ -6431,7 +6593,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x80L) != 0)
{
- _headers._Scheme = default;
+ _headers._Protocol = default;
if((tempBits & ~0x80L) == 0)
{
return;
@@ -6441,7 +6603,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x100L) != 0)
{
- _headers._AcceptCharset = default;
+ _headers._Scheme = default;
if((tempBits & ~0x100L) == 0)
{
return;
@@ -6451,7 +6613,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x200L) != 0)
{
- _headers._AcceptEncoding = default;
+ _headers._AcceptCharset = default;
if((tempBits & ~0x200L) == 0)
{
return;
@@ -6461,7 +6623,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x400L) != 0)
{
- _headers._AcceptLanguage = default;
+ _headers._AcceptEncoding = default;
if((tempBits & ~0x400L) == 0)
{
return;
@@ -6471,7 +6633,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x800L) != 0)
{
- _headers._AccessControlRequestHeaders = default;
+ _headers._AcceptLanguage = default;
if((tempBits & ~0x800L) == 0)
{
return;
@@ -6481,7 +6643,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x1000L) != 0)
{
- _headers._AccessControlRequestMethod = default;
+ _headers._AccessControlRequestHeaders = default;
if((tempBits & ~0x1000L) == 0)
{
return;
@@ -6491,7 +6653,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x2000L) != 0)
{
- _headers._Authorization = default;
+ _headers._AccessControlRequestMethod = default;
if((tempBits & ~0x2000L) == 0)
{
return;
@@ -6501,7 +6663,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x4000L) != 0)
{
- _headers._Baggage = default;
+ _headers._AltUsed = default;
if((tempBits & ~0x4000L) == 0)
{
return;
@@ -6511,7 +6673,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x8000L) != 0)
{
- _headers._CacheControl = default;
+ _headers._Authorization = default;
if((tempBits & ~0x8000L) == 0)
{
return;
@@ -6521,7 +6683,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x10000L) != 0)
{
- _headers._ContentType = default;
+ _headers._Baggage = default;
if((tempBits & ~0x10000L) == 0)
{
return;
@@ -6531,7 +6693,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x20000L) != 0)
{
- _headers._Cookie = default;
+ _headers._CacheControl = default;
if((tempBits & ~0x20000L) == 0)
{
return;
@@ -6541,7 +6703,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x40000L) != 0)
{
- _headers._CorrelationContext = default;
+ _headers._ContentType = default;
if((tempBits & ~0x40000L) == 0)
{
return;
@@ -6551,7 +6713,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x80000L) != 0)
{
- _headers._Date = default;
+ _headers._Cookie = default;
if((tempBits & ~0x80000L) == 0)
{
return;
@@ -6561,7 +6723,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x100000L) != 0)
{
- _headers._Expect = default;
+ _headers._CorrelationContext = default;
if((tempBits & ~0x100000L) == 0)
{
return;
@@ -6571,7 +6733,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x200000L) != 0)
{
- _headers._From = default;
+ _headers._Date = default;
if((tempBits & ~0x200000L) == 0)
{
return;
@@ -6581,7 +6743,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x400000L) != 0)
{
- _headers._GrpcAcceptEncoding = default;
+ _headers._Expect = default;
if((tempBits & ~0x400000L) == 0)
{
return;
@@ -6591,7 +6753,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x800000L) != 0)
{
- _headers._GrpcEncoding = default;
+ _headers._From = default;
if((tempBits & ~0x800000L) == 0)
{
return;
@@ -6601,7 +6763,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x1000000L) != 0)
{
- _headers._GrpcTimeout = default;
+ _headers._GrpcAcceptEncoding = default;
if((tempBits & ~0x1000000L) == 0)
{
return;
@@ -6611,7 +6773,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x2000000L) != 0)
{
- _headers._IfMatch = default;
+ _headers._GrpcEncoding = default;
if((tempBits & ~0x2000000L) == 0)
{
return;
@@ -6621,7 +6783,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x4000000L) != 0)
{
- _headers._IfModifiedSince = default;
+ _headers._GrpcTimeout = default;
if((tempBits & ~0x4000000L) == 0)
{
return;
@@ -6631,7 +6793,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x8000000L) != 0)
{
- _headers._IfNoneMatch = default;
+ _headers._IfMatch = default;
if((tempBits & ~0x8000000L) == 0)
{
return;
@@ -6641,7 +6803,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x10000000L) != 0)
{
- _headers._IfRange = default;
+ _headers._IfModifiedSince = default;
if((tempBits & ~0x10000000L) == 0)
{
return;
@@ -6651,7 +6813,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x20000000L) != 0)
{
- _headers._IfUnmodifiedSince = default;
+ _headers._IfNoneMatch = default;
if((tempBits & ~0x20000000L) == 0)
{
return;
@@ -6661,7 +6823,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x40000000L) != 0)
{
- _headers._KeepAlive = default;
+ _headers._IfRange = default;
if((tempBits & ~0x40000000L) == 0)
{
return;
@@ -6671,7 +6833,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x80000000L) != 0)
{
- _headers._MaxForwards = default;
+ _headers._IfUnmodifiedSince = default;
if((tempBits & ~0x80000000L) == 0)
{
return;
@@ -6681,7 +6843,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x100000000L) != 0)
{
- _headers._Origin = default;
+ _headers._KeepAlive = default;
if((tempBits & ~0x100000000L) == 0)
{
return;
@@ -6691,7 +6853,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x200000000L) != 0)
{
- _headers._Pragma = default;
+ _headers._MaxForwards = default;
if((tempBits & ~0x200000000L) == 0)
{
return;
@@ -6701,7 +6863,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x400000000L) != 0)
{
- _headers._ProxyAuthorization = default;
+ _headers._Origin = default;
if((tempBits & ~0x400000000L) == 0)
{
return;
@@ -6711,7 +6873,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x800000000L) != 0)
{
- _headers._Range = default;
+ _headers._Pragma = default;
if((tempBits & ~0x800000000L) == 0)
{
return;
@@ -6721,7 +6883,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x1000000000L) != 0)
{
- _headers._Referer = default;
+ _headers._ProxyAuthorization = default;
if((tempBits & ~0x1000000000L) == 0)
{
return;
@@ -6731,7 +6893,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x2000000000L) != 0)
{
- _headers._RequestId = default;
+ _headers._Range = default;
if((tempBits & ~0x2000000000L) == 0)
{
return;
@@ -6741,7 +6903,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x4000000000L) != 0)
{
- _headers._TE = default;
+ _headers._Referer = default;
if((tempBits & ~0x4000000000L) == 0)
{
return;
@@ -6751,7 +6913,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x8000000000L) != 0)
{
- _headers._TraceParent = default;
+ _headers._RequestId = default;
if((tempBits & ~0x8000000000L) == 0)
{
return;
@@ -6761,7 +6923,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x10000000000L) != 0)
{
- _headers._TraceState = default;
+ _headers._TE = default;
if((tempBits & ~0x10000000000L) == 0)
{
return;
@@ -6771,7 +6933,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x20000000000L) != 0)
{
- _headers._TransferEncoding = default;
+ _headers._TraceParent = default;
if((tempBits & ~0x20000000000L) == 0)
{
return;
@@ -6781,7 +6943,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x40000000000L) != 0)
{
- _headers._Translate = default;
+ _headers._TraceState = default;
if((tempBits & ~0x40000000000L) == 0)
{
return;
@@ -6791,7 +6953,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x80000000000L) != 0)
{
- _headers._Upgrade = default;
+ _headers._TransferEncoding = default;
if((tempBits & ~0x80000000000L) == 0)
{
return;
@@ -6801,7 +6963,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x100000000000L) != 0)
{
- _headers._UpgradeInsecureRequests = default;
+ _headers._Translate = default;
if((tempBits & ~0x100000000000L) == 0)
{
return;
@@ -6811,7 +6973,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x200000000000L) != 0)
{
- _headers._Via = default;
+ _headers._Upgrade = default;
if((tempBits & ~0x200000000000L) == 0)
{
return;
@@ -6821,7 +6983,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
if ((tempBits & 0x400000000000L) != 0)
{
- _headers._Warning = default;
+ _headers._UpgradeInsecureRequests = default;
if((tempBits & ~0x400000000000L) == 0)
{
return;
@@ -6829,6 +6991,26 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
tempBits &= ~0x400000000000L;
}
+ if ((tempBits & 0x800000000000L) != 0)
+ {
+ _headers._Via = default;
+ if((tempBits & ~0x800000000000L) == 0)
+ {
+ return;
+ }
+ tempBits &= ~0x800000000000L;
+ }
+
+ if ((tempBits & 0x1000000000000L) != 0)
+ {
+ _headers._Warning = default;
+ if((tempBits & ~0x1000000000000L) == 0)
+ {
+ return;
+ }
+ tempBits &= ~0x1000000000000L;
+ }
+
}
protected override bool CopyToFast(KeyValuePair<string, StringValues>[] array, int arrayIndex)
@@ -6880,7 +7062,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Authority, _headers._Authority);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(InternalHeaderNames.Authority, _headers._Authority);
++arrayIndex;
}
if ((_bits & 0x20L) != 0)
@@ -6889,7 +7071,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Method, _headers._Method);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(InternalHeaderNames.Method, _headers._Method);
++arrayIndex;
}
if ((_bits & 0x40L) != 0)
@@ -6898,7 +7080,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Path, _headers._Path);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(InternalHeaderNames.Path, _headers._Path);
++arrayIndex;
}
if ((_bits & 0x80L) != 0)
@@ -6907,7 +7089,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Scheme, _headers._Scheme);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(InternalHeaderNames.Protocol, _headers._Protocol);
++arrayIndex;
}
if ((_bits & 0x100L) != 0)
@@ -6916,7 +7098,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AcceptCharset, _headers._AcceptCharset);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(InternalHeaderNames.Scheme, _headers._Scheme);
++arrayIndex;
}
if ((_bits & 0x200L) != 0)
@@ -6925,7 +7107,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AcceptEncoding, _headers._AcceptEncoding);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AcceptCharset, _headers._AcceptCharset);
++arrayIndex;
}
if ((_bits & 0x400L) != 0)
@@ -6934,7 +7116,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AcceptLanguage, _headers._AcceptLanguage);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AcceptEncoding, _headers._AcceptEncoding);
++arrayIndex;
}
if ((_bits & 0x800L) != 0)
@@ -6943,7 +7125,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestHeaders, _headers._AccessControlRequestHeaders);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AcceptLanguage, _headers._AcceptLanguage);
++arrayIndex;
}
if ((_bits & 0x1000L) != 0)
@@ -6952,7 +7134,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestMethod, _headers._AccessControlRequestMethod);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestHeaders, _headers._AccessControlRequestHeaders);
++arrayIndex;
}
if ((_bits & 0x2000L) != 0)
@@ -6961,7 +7143,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Authorization, _headers._Authorization);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestMethod, _headers._AccessControlRequestMethod);
++arrayIndex;
}
if ((_bits & 0x4000L) != 0)
@@ -6970,7 +7152,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Baggage, _headers._Baggage);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(InternalHeaderNames.AltUsed, _headers._AltUsed);
++arrayIndex;
}
if ((_bits & 0x8000L) != 0)
@@ -6979,7 +7161,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.CacheControl, _headers._CacheControl);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Authorization, _headers._Authorization);
++arrayIndex;
}
if ((_bits & 0x10000L) != 0)
@@ -6988,7 +7170,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.ContentType, _headers._ContentType);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Baggage, _headers._Baggage);
++arrayIndex;
}
if ((_bits & 0x20000L) != 0)
@@ -6997,7 +7179,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Cookie, _headers._Cookie);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.CacheControl, _headers._CacheControl);
++arrayIndex;
}
if ((_bits & 0x40000L) != 0)
@@ -7006,7 +7188,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.CorrelationContext, _headers._CorrelationContext);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.ContentType, _headers._ContentType);
++arrayIndex;
}
if ((_bits & 0x80000L) != 0)
@@ -7015,7 +7197,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Date, _headers._Date);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Cookie, _headers._Cookie);
++arrayIndex;
}
if ((_bits & 0x100000L) != 0)
@@ -7024,7 +7206,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Expect, _headers._Expect);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.CorrelationContext, _headers._CorrelationContext);
++arrayIndex;
}
if ((_bits & 0x200000L) != 0)
@@ -7033,7 +7215,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.From, _headers._From);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Date, _headers._Date);
++arrayIndex;
}
if ((_bits & 0x400000L) != 0)
@@ -7042,7 +7224,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.GrpcAcceptEncoding, _headers._GrpcAcceptEncoding);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Expect, _headers._Expect);
++arrayIndex;
}
if ((_bits & 0x800000L) != 0)
@@ -7051,7 +7233,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.GrpcEncoding, _headers._GrpcEncoding);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.From, _headers._From);
++arrayIndex;
}
if ((_bits & 0x1000000L) != 0)
@@ -7060,7 +7242,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.GrpcTimeout, _headers._GrpcTimeout);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.GrpcAcceptEncoding, _headers._GrpcAcceptEncoding);
++arrayIndex;
}
if ((_bits & 0x2000000L) != 0)
@@ -7069,7 +7251,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfMatch, _headers._IfMatch);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.GrpcEncoding, _headers._GrpcEncoding);
++arrayIndex;
}
if ((_bits & 0x4000000L) != 0)
@@ -7078,7 +7260,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfModifiedSince, _headers._IfModifiedSince);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.GrpcTimeout, _headers._GrpcTimeout);
++arrayIndex;
}
if ((_bits & 0x8000000L) != 0)
@@ -7087,7 +7269,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfNoneMatch, _headers._IfNoneMatch);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfMatch, _headers._IfMatch);
++arrayIndex;
}
if ((_bits & 0x10000000L) != 0)
@@ -7096,7 +7278,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfRange, _headers._IfRange);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfModifiedSince, _headers._IfModifiedSince);
++arrayIndex;
}
if ((_bits & 0x20000000L) != 0)
@@ -7105,7 +7287,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfUnmodifiedSince, _headers._IfUnmodifiedSince);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfNoneMatch, _headers._IfNoneMatch);
++arrayIndex;
}
if ((_bits & 0x40000000L) != 0)
@@ -7114,7 +7296,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.KeepAlive, _headers._KeepAlive);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfRange, _headers._IfRange);
++arrayIndex;
}
if ((_bits & 0x80000000L) != 0)
@@ -7123,7 +7305,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.MaxForwards, _headers._MaxForwards);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.IfUnmodifiedSince, _headers._IfUnmodifiedSince);
++arrayIndex;
}
if ((_bits & 0x100000000L) != 0)
@@ -7132,7 +7314,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Origin, _headers._Origin);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.KeepAlive, _headers._KeepAlive);
++arrayIndex;
}
if ((_bits & 0x200000000L) != 0)
@@ -7141,7 +7323,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Pragma, _headers._Pragma);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.MaxForwards, _headers._MaxForwards);
++arrayIndex;
}
if ((_bits & 0x400000000L) != 0)
@@ -7150,7 +7332,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.ProxyAuthorization, _headers._ProxyAuthorization);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Origin, _headers._Origin);
++arrayIndex;
}
if ((_bits & 0x800000000L) != 0)
@@ -7159,7 +7341,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Range, _headers._Range);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Pragma, _headers._Pragma);
++arrayIndex;
}
if ((_bits & 0x1000000000L) != 0)
@@ -7168,7 +7350,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Referer, _headers._Referer);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.ProxyAuthorization, _headers._ProxyAuthorization);
++arrayIndex;
}
if ((_bits & 0x2000000000L) != 0)
@@ -7177,7 +7359,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.RequestId, _headers._RequestId);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Range, _headers._Range);
++arrayIndex;
}
if ((_bits & 0x4000000000L) != 0)
@@ -7186,7 +7368,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TE, _headers._TE);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Referer, _headers._Referer);
++arrayIndex;
}
if ((_bits & 0x8000000000L) != 0)
@@ -7195,7 +7377,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TraceParent, _headers._TraceParent);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.RequestId, _headers._RequestId);
++arrayIndex;
}
if ((_bits & 0x10000000000L) != 0)
@@ -7204,7 +7386,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TraceState, _headers._TraceState);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TE, _headers._TE);
++arrayIndex;
}
if ((_bits & 0x20000000000L) != 0)
@@ -7213,7 +7395,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TransferEncoding, _headers._TransferEncoding);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TraceParent, _headers._TraceParent);
++arrayIndex;
}
if ((_bits & 0x40000000000L) != 0)
@@ -7222,7 +7404,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Translate, _headers._Translate);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TraceState, _headers._TraceState);
++arrayIndex;
}
if ((_bits & 0x80000000000L) != 0)
@@ -7231,7 +7413,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Upgrade, _headers._Upgrade);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.TransferEncoding, _headers._TransferEncoding);
++arrayIndex;
}
if ((_bits & 0x100000000000L) != 0)
@@ -7240,7 +7422,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.UpgradeInsecureRequests, _headers._UpgradeInsecureRequests);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Translate, _headers._Translate);
++arrayIndex;
}
if ((_bits & 0x200000000000L) != 0)
@@ -7249,7 +7431,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Via, _headers._Via);
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Upgrade, _headers._Upgrade);
++arrayIndex;
}
if ((_bits & 0x400000000000L) != 0)
@@ -7258,6 +7440,24 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
return false;
}
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.UpgradeInsecureRequests, _headers._UpgradeInsecureRequests);
+ ++arrayIndex;
+ }
+ if ((_bits & 0x800000000000L) != 0)
+ {
+ if (arrayIndex == array.Length)
+ {
+ return false;
+ }
+ array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Via, _headers._Via);
+ ++arrayIndex;
+ }
+ if ((_bits & 0x1000000000000L) != 0)
+ {
+ if (arrayIndex == array.Length)
+ {
+ return false;
+ }
array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.Warning, _headers._Warning);
++arrayIndex;
}
@@ -7277,8 +7477,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
internal void ClearPseudoRequestHeaders()
{
- _pseudoBits = _bits & 240;
- _bits &= ~240;
+ _pseudoBits = _bits & 496;
+ _bits &= ~496;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
@@ -7325,7 +7525,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 2:
if (((ReadUnalignedLittleEndian_ushort(ref nameStart) & 0xdfdfu) == 0x4554u))
{
- flag = 0x4000000000L;
+ flag = 0x10000000000L;
values = ref _headers._TE;
nameStr = HeaderNames.TE;
}
@@ -7333,7 +7533,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 3:
if (((ReadUnalignedLittleEndian_ushort(ref nameStart) & 0xdfdfu) == 0x4956u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)2) & 0xdfu) == 0x41u))
{
- flag = 0x200000000000L;
+ flag = 0x800000000000L;
values = ref _headers._Via;
nameStr = HeaderNames.Via;
}
@@ -7348,13 +7548,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
else if ((firstTerm4 == 0x45544144u))
{
- flag = 0x80000L;
+ flag = 0x200000L;
values = ref _headers._Date;
nameStr = HeaderNames.Date;
}
else if ((firstTerm4 == 0x4d4f5246u))
{
- flag = 0x200000L;
+ flag = 0x800000L;
values = ref _headers._From;
nameStr = HeaderNames.From;
}
@@ -7364,11 +7564,11 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
flag = 0x40L;
values = ref _headers._Path;
- nameStr = HeaderNames.Path;
+ nameStr = InternalHeaderNames.Path;
}
else if (((ReadUnalignedLittleEndian_uint(ref nameStart) & 0xdfdfdfdfu) == 0x474e4152u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)4) & 0xdfu) == 0x45u))
{
- flag = 0x800000000L;
+ flag = 0x2000000000L;
values = ref _headers._Range;
nameStr = HeaderNames.Range;
}
@@ -7383,25 +7583,25 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
else if ((firstTerm6 == 0x4b4f4f43u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4549u))
{
- flag = 0x20000L;
+ flag = 0x80000L;
values = ref _headers._Cookie;
nameStr = HeaderNames.Cookie;
}
else if ((firstTerm6 == 0x45505845u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x5443u))
{
- flag = 0x100000L;
+ flag = 0x400000L;
values = ref _headers._Expect;
nameStr = HeaderNames.Expect;
}
else if ((firstTerm6 == 0x4749524fu) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4e49u))
{
- flag = 0x100000000L;
+ flag = 0x400000000L;
values = ref _headers._Origin;
nameStr = HeaderNames.Origin;
}
else if ((firstTerm6 == 0x47415250u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x414du))
{
- flag = 0x200000000L;
+ flag = 0x800000000L;
values = ref _headers._Pragma;
nameStr = HeaderNames.Pragma;
}
@@ -7411,58 +7611,69 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
flag = 0x20L;
values = ref _headers._Method;
- nameStr = HeaderNames.Method;
+ nameStr = InternalHeaderNames.Method;
}
else if (((ReadUnalignedLittleEndian_uint(ref nameStart) & 0xdfdfdfffu) == 0x4843533au) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4d45u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)6) & 0xdfu) == 0x45u))
{
- flag = 0x80L;
+ flag = 0x100L;
values = ref _headers._Scheme;
- nameStr = HeaderNames.Scheme;
+ nameStr = InternalHeaderNames.Scheme;
}
else if (((ReadUnalignedLittleEndian_uint(ref nameStart) & 0xdfdfdfdfu) == 0x47474142u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4741u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)6) & 0xdfu) == 0x45u))
{
- flag = 0x4000L;
+ flag = 0x10000L;
values = ref _headers._Baggage;
nameStr = HeaderNames.Baggage;
}
else if (((ReadUnalignedLittleEndian_uint(ref nameStart) & 0xdfdfdfdfu) == 0x45464552u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4552u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)6) & 0xdfu) == 0x52u))
{
- flag = 0x1000000000L;
+ flag = 0x4000000000L;
values = ref _headers._Referer;
nameStr = HeaderNames.Referer;
}
else if (((ReadUnalignedLittleEndian_uint(ref nameStart) & 0xdfdfdfdfu) == 0x52475055u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4441u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)6) & 0xdfu) == 0x45u))
{
- flag = 0x80000000000L;
+ flag = 0x200000000000L;
values = ref _headers._Upgrade;
nameStr = HeaderNames.Upgrade;
}
else if (((ReadUnalignedLittleEndian_uint(ref nameStart) & 0xdfdfdfdfu) == 0x4e524157u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ushort)))) & 0xdfdfu) == 0x4e49u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)6) & 0xdfu) == 0x47u))
{
- flag = 0x400000000000L;
+ flag = 0x1000000000000L;
values = ref _headers._Warning;
nameStr = HeaderNames.Warning;
}
break;
case 8:
- var firstTerm8 = (ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfffdfdfuL);
- if ((firstTerm8 == 0x484354414d2d4649uL))
+ if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfffdfdfdfuL) == 0x444553552d544c41uL))
{
- flag = 0x2000000L;
+ flag = 0x4000L;
+ values = ref _headers._AltUsed;
+ nameStr = InternalHeaderNames.AltUsed;
+ }
+ else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfffdfdfuL) == 0x484354414d2d4649uL))
+ {
+ flag = 0x8000000L;
values = ref _headers._IfMatch;
nameStr = HeaderNames.IfMatch;
}
- else if ((firstTerm8 == 0x45474e41522d4649uL))
+ else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfffdfdfuL) == 0x45474e41522d4649uL))
{
- flag = 0x10000000L;
+ flag = 0x40000000L;
values = ref _headers._IfRange;
nameStr = HeaderNames.IfRange;
}
break;
case 9:
- if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x54414c534e415254uL) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)8) & 0xdfu) == 0x45u))
+ if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfffuL) == 0x4f434f544f52503auL) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)8) & 0xdfu) == 0x4cu))
{
- flag = 0x40000000000L;
+ flag = 0x80L;
+ values = ref _headers._Protocol;
+ nameStr = InternalHeaderNames.Protocol;
+ }
+ else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x54414c534e415254uL) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)8) & 0xdfu) == 0x45u))
+ {
+ flag = 0x100000000000L;
values = ref _headers._Translate;
nameStr = HeaderNames.Translate;
}
@@ -7484,23 +7695,23 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
flag = 0x10L;
values = ref _headers._Authority;
- nameStr = HeaderNames.Authority;
+ nameStr = InternalHeaderNames.Authority;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfffdfdfdfdfuL) == 0x494c412d5045454buL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(4 * sizeof(ushort)))) & 0xdfdfu) == 0x4556u))
{
- flag = 0x40000000L;
+ flag = 0x100000000L;
values = ref _headers._KeepAlive;
nameStr = HeaderNames.KeepAlive;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xffdfdfdfdfdfdfdfuL) == 0x2d54534555514552uL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(4 * sizeof(ushort)))) & 0xdfdfu) == 0x4449u))
{
- flag = 0x2000000000L;
+ flag = 0x8000000000L;
values = ref _headers._RequestId;
nameStr = HeaderNames.RequestId;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x4154534543415254uL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(4 * sizeof(ushort)))) & 0xdfdfu) == 0x4554u))
{
- flag = 0x10000000000L;
+ flag = 0x40000000000L;
values = ref _headers._TraceState;
nameStr = HeaderNames.TraceState;
}
@@ -7508,7 +7719,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 11:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x5241504543415254uL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(4 * sizeof(ushort)))) & 0xdfdfu) == 0x4e45u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)10) & 0xdfu) == 0x54u))
{
- flag = 0x8000000000L;
+ flag = 0x20000000000L;
values = ref _headers._TraceParent;
nameStr = HeaderNames.TraceParent;
}
@@ -7516,19 +7727,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 12:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xffdfdfdfdfdfdfdfuL) == 0x2d544e45544e4f43uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x45505954u))
{
- flag = 0x10000L;
+ flag = 0x40000L;
values = ref _headers._ContentType;
nameStr = HeaderNames.ContentType;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfffdfdfdfdfuL) == 0x4d49542d43505247uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x54554f45u))
{
- flag = 0x1000000L;
+ flag = 0x4000000L;
values = ref _headers._GrpcTimeout;
nameStr = HeaderNames.GrpcTimeout;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfffdfdfdfuL) == 0x57524f462d58414duL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x53445241u))
{
- flag = 0x80000000L;
+ flag = 0x200000000L;
values = ref _headers._MaxForwards;
nameStr = HeaderNames.MaxForwards;
}
@@ -7536,25 +7747,25 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 13:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x5a49524f48545541uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x4f495441u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)12) & 0xdfu) == 0x4eu))
{
- flag = 0x2000L;
+ flag = 0x8000L;
values = ref _headers._Authorization;
nameStr = HeaderNames.Authorization;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfffdfdfdfdfdfuL) == 0x4f432d4548434143uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x4f52544eu) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)12) & 0xdfu) == 0x4cu))
{
- flag = 0x8000L;
+ flag = 0x20000L;
values = ref _headers._CacheControl;
nameStr = HeaderNames.CacheControl;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfffdfdfdfdfuL) == 0x434e452d43505247uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x4e49444fu) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)12) & 0xdfu) == 0x47u))
{
- flag = 0x800000L;
+ flag = 0x2000000L;
values = ref _headers._GrpcEncoding;
nameStr = HeaderNames.GrpcEncoding;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xffdfdfdfdfffdfdfuL) == 0x2d454e4f4e2d4649uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x4354414du) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)12) & 0xdfu) == 0x48u))
{
- flag = 0x8000000L;
+ flag = 0x20000000L;
values = ref _headers._IfNoneMatch;
nameStr = HeaderNames.IfNoneMatch;
}
@@ -7562,7 +7773,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 14:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfffdfdfdfdfdfdfuL) == 0x432d545045434341uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x53524148u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(6 * sizeof(ushort)))) & 0xdfdfu) == 0x5445u))
{
- flag = 0x100L;
+ flag = 0x200L;
values = ref _headers._AcceptCharset;
nameStr = HeaderNames.AcceptCharset;
}
@@ -7585,13 +7796,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
var firstTerm15 = (ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfffdfdfdfdfdfdfuL);
if ((firstTerm15 == 0x452d545045434341uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x444f434eu) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(6 * sizeof(ushort)))) & 0xdfdfu) == 0x4e49u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)14) & 0xdfu) == 0x47u))
{
- flag = 0x200L;
+ flag = 0x400L;
values = ref _headers._AcceptEncoding;
nameStr = HeaderNames.AcceptEncoding;
}
else if ((firstTerm15 == 0x4c2d545045434341uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x55474e41u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(6 * sizeof(ushort)))) & 0xdfdfu) == 0x4741u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)14) & 0xdfu) == 0x45u))
{
- flag = 0x400L;
+ flag = 0x800L;
values = ref _headers._AcceptLanguage;
nameStr = HeaderNames.AcceptLanguage;
}
@@ -7599,13 +7810,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 17:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfffdfdfuL) == 0x4649444f4d2d4649uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfdfdfffdfdfdfuL) == 0x434e49532d444549uL) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)16) & 0xdfu) == 0x45u))
{
- flag = 0x4000000L;
+ flag = 0x10000000L;
values = ref _headers._IfModifiedSince;
nameStr = HeaderNames.IfModifiedSince;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x524546534e415254uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfdfdfdfdfdfffuL) == 0x4e49444f434e452duL) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)16) & 0xdfu) == 0x47u))
{
- flag = 0x20000000000L;
+ flag = 0x80000000000L;
values = ref _headers._TransferEncoding;
nameStr = HeaderNames.TransferEncoding;
}
@@ -7613,19 +7824,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 19:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfdfdfdfuL) == 0x54414c4552524f43uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfdfdfffdfdfdfuL) == 0x544e4f432d4e4f49uL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(8 * sizeof(ushort)))) & 0xdfdfu) == 0x5845u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)18) & 0xdfu) == 0x54u))
{
- flag = 0x40000L;
+ flag = 0x100000L;
values = ref _headers._CorrelationContext;
nameStr = HeaderNames.CorrelationContext;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfdfdfffdfdfuL) == 0x444f4d4e552d4649uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfffdfdfdfdfdfuL) == 0x49532d4445494649uL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(8 * sizeof(ushort)))) & 0xdfdfu) == 0x434eu) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)18) & 0xdfu) == 0x45u))
{
- flag = 0x20000000L;
+ flag = 0x80000000L;
values = ref _headers._IfUnmodifiedSince;
nameStr = HeaderNames.IfUnmodifiedSince;
}
else if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfffdfdfdfdfdfuL) == 0x55412d59584f5250uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfdfdfdfdfdfdfuL) == 0x54415a49524f4854uL) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(8 * sizeof(ushort)))) & 0xdfdfu) == 0x4f49u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)18) & 0xdfu) == 0x4eu))
{
- flag = 0x400000000L;
+ flag = 0x1000000000L;
values = ref _headers._ProxyAuthorization;
nameStr = HeaderNames.ProxyAuthorization;
}
@@ -7633,7 +7844,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 20:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfdfdfffdfdfdfdfuL) == 0x4343412d43505247uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfdfdfffdfdfdfuL) == 0x4f434e452d545045uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(4 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x474e4944u))
{
- flag = 0x400000L;
+ flag = 0x1000000L;
values = ref _headers._GrpcAcceptEncoding;
nameStr = HeaderNames.GrpcAcceptEncoding;
}
@@ -7641,7 +7852,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 25:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xffdfdfdfdfdfdfdfuL) == 0x2d45444152475055uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfdfdfdfdfdfdfdfuL) == 0x4552554345534e49uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ulong)))) & 0xdfdfdfdfdfdfdfffuL) == 0x545345555145522duL) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)24) & 0xdfu) == 0x53u))
{
- flag = 0x100000000000L;
+ flag = 0x400000000000L;
values = ref _headers._UpgradeInsecureRequests;
nameStr = HeaderNames.UpgradeInsecureRequests;
}
@@ -7649,7 +7860,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 29:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfffdfdfdfdfdfdfuL) == 0x432d535345434341uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfffdfdfdfdfdfdfuL) == 0x522d4c4f52544e4fuL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ulong)))) & 0xdfffdfdfdfdfdfdfuL) == 0x4d2d545345555145uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(6 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x4f485445u) && ((Unsafe.AddByteOffset(ref nameStart, (IntPtr)28) & 0xdfu) == 0x44u))
{
- flag = 0x1000L;
+ flag = 0x2000L;
values = ref _headers._AccessControlRequestMethod;
nameStr = HeaderNames.AccessControlRequestMethod;
}
@@ -7657,7 +7868,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 30:
if (((ReadUnalignedLittleEndian_ulong(ref nameStart) & 0xdfffdfdfdfdfdfdfuL) == 0x432d535345434341uL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)sizeof(ulong))) & 0xdfffdfdfdfdfdfdfuL) == 0x522d4c4f52544e4fuL) && ((ReadUnalignedLittleEndian_ulong(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(2 * sizeof(ulong)))) & 0xdfffdfdfdfdfdfdfuL) == 0x482d545345555145uL) && ((ReadUnalignedLittleEndian_uint(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(6 * sizeof(uint)))) & 0xdfdfdfdfu) == 0x45444145u) && ((ReadUnalignedLittleEndian_ushort(ref Unsafe.AddByteOffset(ref nameStart, (IntPtr)(14 * sizeof(ushort)))) & 0xdfdfu) == 0x5352u))
{
- flag = 0x800L;
+ flag = 0x1000L;
values = ref _headers._AccessControlRequestHeaders;
nameStr = HeaderNames.AccessControlRequestHeaders;
}
@@ -7726,38 +7937,38 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 1:
flag = 0x10L;
values = ref _headers._Authority;
- nameStr = HeaderNames.Authority;
+ nameStr = InternalHeaderNames.Authority;
break;
case 2:
case 3:
flag = 0x20L;
values = ref _headers._Method;
- nameStr = HeaderNames.Method;
+ nameStr = InternalHeaderNames.Method;
break;
case 4:
case 5:
flag = 0x40L;
values = ref _headers._Path;
- nameStr = HeaderNames.Path;
+ nameStr = InternalHeaderNames.Path;
break;
case 6:
case 7:
- flag = 0x80L;
+ flag = 0x100L;
values = ref _headers._Scheme;
- nameStr = HeaderNames.Scheme;
+ nameStr = InternalHeaderNames.Scheme;
break;
case 15:
- flag = 0x100L;
+ flag = 0x200L;
values = ref _headers._AcceptCharset;
nameStr = HeaderNames.AcceptCharset;
break;
case 16:
- flag = 0x200L;
+ flag = 0x400L;
values = ref _headers._AcceptEncoding;
nameStr = HeaderNames.AcceptEncoding;
break;
case 17:
- flag = 0x400L;
+ flag = 0x800L;
values = ref _headers._AcceptLanguage;
nameStr = HeaderNames.AcceptLanguage;
break;
@@ -7767,12 +7978,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
nameStr = HeaderNames.Accept;
break;
case 23:
- flag = 0x2000L;
+ flag = 0x8000L;
values = ref _headers._Authorization;
nameStr = HeaderNames.Authorization;
break;
case 24:
- flag = 0x8000L;
+ flag = 0x20000L;
values = ref _headers._CacheControl;
nameStr = HeaderNames.CacheControl;
break;
@@ -7789,27 +8000,27 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return true;
case 31:
- flag = 0x10000L;
+ flag = 0x40000L;
values = ref _headers._ContentType;
nameStr = HeaderNames.ContentType;
break;
case 32:
- flag = 0x20000L;
+ flag = 0x80000L;
values = ref _headers._Cookie;
nameStr = HeaderNames.Cookie;
break;
case 33:
- flag = 0x80000L;
+ flag = 0x200000L;
values = ref _headers._Date;
nameStr = HeaderNames.Date;
break;
case 35:
- flag = 0x100000L;
+ flag = 0x400000L;
values = ref _headers._Expect;
nameStr = HeaderNames.Expect;
break;
case 37:
- flag = 0x200000L;
+ flag = 0x800000L;
values = ref _headers._From;
nameStr = HeaderNames.From;
break;
@@ -7819,52 +8030,52 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
nameStr = HeaderNames.Host;
break;
case 39:
- flag = 0x2000000L;
+ flag = 0x8000000L;
values = ref _headers._IfMatch;
nameStr = HeaderNames.IfMatch;
break;
case 40:
- flag = 0x4000000L;
+ flag = 0x10000000L;
values = ref _headers._IfModifiedSince;
nameStr = HeaderNames.IfModifiedSince;
break;
case 41:
- flag = 0x8000000L;
+ flag = 0x20000000L;
values = ref _headers._IfNoneMatch;
nameStr = HeaderNames.IfNoneMatch;
break;
case 42:
- flag = 0x10000000L;
+ flag = 0x40000000L;
values = ref _headers._IfRange;
nameStr = HeaderNames.IfRange;
break;
case 43:
- flag = 0x20000000L;
+ flag = 0x80000000L;
values = ref _headers._IfUnmodifiedSince;
nameStr = HeaderNames.IfUnmodifiedSince;
break;
case 47:
- flag = 0x80000000L;
+ flag = 0x200000000L;
values = ref _headers._MaxForwards;
nameStr = HeaderNames.MaxForwards;
break;
case 49:
- flag = 0x400000000L;
+ flag = 0x1000000000L;
values = ref _headers._ProxyAuthorization;
nameStr = HeaderNames.ProxyAuthorization;
break;
case 50:
- flag = 0x800000000L;
+ flag = 0x2000000000L;
values = ref _headers._Range;
nameStr = HeaderNames.Range;
break;
case 51:
- flag = 0x1000000000L;
+ flag = 0x4000000000L;
values = ref _headers._Referer;
nameStr = HeaderNames.Referer;
break;
case 57:
- flag = 0x20000000000L;
+ flag = 0x80000000000L;
values = ref _headers._TransferEncoding;
nameStr = HeaderNames.TransferEncoding;
break;
@@ -7874,7 +8085,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
nameStr = HeaderNames.UserAgent;
break;
case 60:
- flag = 0x200000000000L;
+ flag = 0x800000000000L;
values = ref _headers._Via;
nameStr = HeaderNames.Via;
break;
@@ -7938,12 +8149,12 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 0:
flag = 0x10L;
values = ref _headers._Authority;
- nameStr = HeaderNames.Authority;
+ nameStr = InternalHeaderNames.Authority;
break;
case 1:
flag = 0x40L;
values = ref _headers._Path;
- nameStr = HeaderNames.Path;
+ nameStr = InternalHeaderNames.Path;
break;
case 4:
var customEncoding = ReferenceEquals(EncodingSelector, KestrelServerOptions.DefaultHeaderEncodingSelector)
@@ -7958,27 +8169,27 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
return true;
case 5:
- flag = 0x20000L;
+ flag = 0x80000L;
values = ref _headers._Cookie;
nameStr = HeaderNames.Cookie;
break;
case 6:
- flag = 0x80000L;
+ flag = 0x200000L;
values = ref _headers._Date;
nameStr = HeaderNames.Date;
break;
case 8:
- flag = 0x4000000L;
+ flag = 0x10000000L;
values = ref _headers._IfModifiedSince;
nameStr = HeaderNames.IfModifiedSince;
break;
case 9:
- flag = 0x8000000L;
+ flag = 0x20000000L;
values = ref _headers._IfNoneMatch;
nameStr = HeaderNames.IfNoneMatch;
break;
case 13:
- flag = 0x1000000000L;
+ flag = 0x4000000000L;
values = ref _headers._Referer;
nameStr = HeaderNames.Referer;
break;
@@ -7991,13 +8202,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 21:
flag = 0x20L;
values = ref _headers._Method;
- nameStr = HeaderNames.Method;
+ nameStr = InternalHeaderNames.Method;
break;
case 22:
case 23:
- flag = 0x80L;
+ flag = 0x100L;
values = ref _headers._Scheme;
- nameStr = HeaderNames.Scheme;
+ nameStr = InternalHeaderNames.Scheme;
break;
case 29:
case 30:
@@ -8006,7 +8217,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
nameStr = HeaderNames.Accept;
break;
case 31:
- flag = 0x200L;
+ flag = 0x400L;
values = ref _headers._AcceptEncoding;
nameStr = HeaderNames.AcceptEncoding;
break;
@@ -8016,7 +8227,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 39:
case 40:
case 41:
- flag = 0x8000L;
+ flag = 0x20000L;
values = ref _headers._CacheControl;
nameStr = HeaderNames.CacheControl;
break;
@@ -8031,46 +8242,51 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
case 52:
case 53:
case 54:
- flag = 0x10000L;
+ flag = 0x40000L;
values = ref _headers._ContentType;
nameStr = HeaderNames.ContentType;
break;
case 55:
- flag = 0x800000000L;
+ flag = 0x2000000000L;
values = ref _headers._Range;
nameStr = HeaderNames.Range;
break;
case 72:
- flag = 0x400L;
+ flag = 0x800L;
values = ref _headers._AcceptLanguage;
nameStr = HeaderNames.AcceptLanguage;
break;
case 80:
- flag = 0x800L;
+ flag = 0x1000L;
values = ref _headers._AccessControlRequestHeaders;
nameStr = HeaderNames.AccessControlRequestHeaders;
break;
case 81:
case 82:
- flag = 0x1000L;
+ flag = 0x2000L;
values = ref _headers._AccessControlRequestMethod;
nameStr = HeaderNames.AccessControlRequestMethod;
break;
case 84:
- flag = 0x2000L;
+ flag = 0x8000L;
values = ref _headers._Authorization;
nameStr = HeaderNames.Authorization;
break;
case 89:
- flag = 0x10000000L;
+ flag = 0x40000000L;
values = ref _headers._IfRange;
nameStr = HeaderNames.IfRange;
break;
case 90:
- flag = 0x100000000L;
+ flag = 0x400000000L;
values = ref _headers._Origin;
nameStr = HeaderNames.Origin;
break;
+ case 94:
+ flag = 0x400000000000L;
+ values = ref _headers._UpgradeInsecureRequests;
+ nameStr = HeaderNames.UpgradeInsecureRequests;
+ break;
case 95:
flag = 0x8L;
values = ref _headers._UserAgent;
@@ -8132,12 +8348,14 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
public StringValues _Authority;
public StringValues _Method;
public StringValues _Path;
+ public StringValues _Protocol;
public StringValues _Scheme;
public StringValues _AcceptCharset;
public StringValues _AcceptEncoding;
public StringValues _AcceptLanguage;
public StringValues _AccessControlRequestHeaders;
public StringValues _AccessControlRequestMethod;
+ public StringValues _AltUsed;
public StringValues _Authorization;
public StringValues _Baggage;
public StringValues _CacheControl;
@@ -8204,220 +8422,230 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
break;
case 4: // Header: ":authority"
Debug.Assert((_currentBits & 0x10L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Authority, _collection._headers._Authority);
+ _current = new KeyValuePair<string, StringValues>(InternalHeaderNames.Authority, _collection._headers._Authority);
_currentBits ^= 0x10L;
break;
case 5: // Header: ":method"
Debug.Assert((_currentBits & 0x20L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Method, _collection._headers._Method);
+ _current = new KeyValuePair<string, StringValues>(InternalHeaderNames.Method, _collection._headers._Method);
_currentBits ^= 0x20L;
break;
case 6: // Header: ":path"
Debug.Assert((_currentBits & 0x40L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Path, _collection._headers._Path);
+ _current = new KeyValuePair<string, StringValues>(InternalHeaderNames.Path, _collection._headers._Path);
_currentBits ^= 0x40L;
break;
- case 7: // Header: ":scheme"
+ case 7: // Header: ":protocol"
Debug.Assert((_currentBits & 0x80L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Scheme, _collection._headers._Scheme);
+ _current = new KeyValuePair<string, StringValues>(InternalHeaderNames.Protocol, _collection._headers._Protocol);
_currentBits ^= 0x80L;
break;
- case 8: // Header: "Accept-Charset"
+ case 8: // Header: ":scheme"
Debug.Assert((_currentBits & 0x100L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.AcceptCharset, _collection._headers._AcceptCharset);
+ _current = new KeyValuePair<string, StringValues>(InternalHeaderNames.Scheme, _collection._headers._Scheme);
_currentBits ^= 0x100L;
break;
- case 9: // Header: "Accept-Encoding"
+ case 9: // Header: "Accept-Charset"
Debug.Assert((_currentBits & 0x200L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.AcceptEncoding, _collection._headers._AcceptEncoding);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.AcceptCharset, _collection._headers._AcceptCharset);
_currentBits ^= 0x200L;
break;
- case 10: // Header: "Accept-Language"
+ case 10: // Header: "Accept-Encoding"
Debug.Assert((_currentBits & 0x400L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.AcceptLanguage, _collection._headers._AcceptLanguage);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.AcceptEncoding, _collection._headers._AcceptEncoding);
_currentBits ^= 0x400L;
break;
- case 11: // Header: "Access-Control-Request-Headers"
+ case 11: // Header: "Accept-Language"
Debug.Assert((_currentBits & 0x800L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestHeaders, _collection._headers._AccessControlRequestHeaders);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.AcceptLanguage, _collection._headers._AcceptLanguage);
_currentBits ^= 0x800L;
break;
- case 12: // Header: "Access-Control-Request-Method"
+ case 12: // Header: "Access-Control-Request-Headers"
Debug.Assert((_currentBits & 0x1000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestMethod, _collection._headers._AccessControlRequestMethod);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestHeaders, _collection._headers._AccessControlRequestHeaders);
_currentBits ^= 0x1000L;
break;
- case 13: // Header: "Authorization"
+ case 13: // Header: "Access-Control-Request-Method"
Debug.Assert((_currentBits & 0x2000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Authorization, _collection._headers._Authorization);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.AccessControlRequestMethod, _collection._headers._AccessControlRequestMethod);
_currentBits ^= 0x2000L;
break;
- case 14: // Header: "baggage"
+ case 14: // Header: "Alt-Used"
Debug.Assert((_currentBits & 0x4000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Baggage, _collection._headers._Baggage);
+ _current = new KeyValuePair<string, StringValues>(InternalHeaderNames.AltUsed, _collection._headers._AltUsed);
_currentBits ^= 0x4000L;
break;
- case 15: // Header: "Cache-Control"
+ case 15: // Header: "Authorization"
Debug.Assert((_currentBits & 0x8000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.CacheControl, _collection._headers._CacheControl);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Authorization, _collection._headers._Authorization);
_currentBits ^= 0x8000L;
break;
- case 16: // Header: "Content-Type"
+ case 16: // Header: "baggage"
Debug.Assert((_currentBits & 0x10000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.ContentType, _collection._headers._ContentType);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Baggage, _collection._headers._Baggage);
_currentBits ^= 0x10000L;
break;
- case 17: // Header: "Cookie"
+ case 17: // Header: "Cache-Control"
Debug.Assert((_currentBits & 0x20000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Cookie, _collection._headers._Cookie);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.CacheControl, _collection._headers._CacheControl);
_currentBits ^= 0x20000L;
break;
- case 18: // Header: "Correlation-Context"
+ case 18: // Header: "Content-Type"
Debug.Assert((_currentBits & 0x40000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.CorrelationContext, _collection._headers._CorrelationContext);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.ContentType, _collection._headers._ContentType);
_currentBits ^= 0x40000L;
break;
- case 19: // Header: "Date"
+ case 19: // Header: "Cookie"
Debug.Assert((_currentBits & 0x80000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Date, _collection._headers._Date);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Cookie, _collection._headers._Cookie);
_currentBits ^= 0x80000L;
break;
- case 20: // Header: "Expect"
+ case 20: // Header: "Correlation-Context"
Debug.Assert((_currentBits & 0x100000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Expect, _collection._headers._Expect);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.CorrelationContext, _collection._headers._CorrelationContext);
_currentBits ^= 0x100000L;
break;
- case 21: // Header: "From"
+ case 21: // Header: "Date"
Debug.Assert((_currentBits & 0x200000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.From, _collection._headers._From);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Date, _collection._headers._Date);
_currentBits ^= 0x200000L;
break;
- case 22: // Header: "Grpc-Accept-Encoding"
+ case 22: // Header: "Expect"
Debug.Assert((_currentBits & 0x400000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.GrpcAcceptEncoding, _collection._headers._GrpcAcceptEncoding);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Expect, _collection._headers._Expect);
_currentBits ^= 0x400000L;
break;
- case 23: // Header: "Grpc-Encoding"
+ case 23: // Header: "From"
Debug.Assert((_currentBits & 0x800000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.GrpcEncoding, _collection._headers._GrpcEncoding);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.From, _collection._headers._From);
_currentBits ^= 0x800000L;
break;
- case 24: // Header: "Grpc-Timeout"
+ case 24: // Header: "Grpc-Accept-Encoding"
Debug.Assert((_currentBits & 0x1000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.GrpcTimeout, _collection._headers._GrpcTimeout);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.GrpcAcceptEncoding, _collection._headers._GrpcAcceptEncoding);
_currentBits ^= 0x1000000L;
break;
- case 25: // Header: "If-Match"
+ case 25: // Header: "Grpc-Encoding"
Debug.Assert((_currentBits & 0x2000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.IfMatch, _collection._headers._IfMatch);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.GrpcEncoding, _collection._headers._GrpcEncoding);
_currentBits ^= 0x2000000L;
break;
- case 26: // Header: "If-Modified-Since"
+ case 26: // Header: "Grpc-Timeout"
Debug.Assert((_currentBits & 0x4000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.IfModifiedSince, _collection._headers._IfModifiedSince);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.GrpcTimeout, _collection._headers._GrpcTimeout);
_currentBits ^= 0x4000000L;
break;
- case 27: // Header: "If-None-Match"
+ case 27: // Header: "If-Match"
Debug.Assert((_currentBits & 0x8000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.IfNoneMatch, _collection._headers._IfNoneMatch);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.IfMatch, _collection._headers._IfMatch);
_currentBits ^= 0x8000000L;
break;
- case 28: // Header: "If-Range"
+ case 28: // Header: "If-Modified-Since"
Debug.Assert((_currentBits & 0x10000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.IfRange, _collection._headers._IfRange);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.IfModifiedSince, _collection._headers._IfModifiedSince);
_currentBits ^= 0x10000000L;
break;
- case 29: // Header: "If-Unmodified-Since"
+ case 29: // Header: "If-None-Match"
Debug.Assert((_currentBits & 0x20000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.IfUnmodifiedSince, _collection._headers._IfUnmodifiedSince);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.IfNoneMatch, _collection._headers._IfNoneMatch);
_currentBits ^= 0x20000000L;
break;
- case 30: // Header: "Keep-Alive"
+ case 30: // Header: "If-Range"
Debug.Assert((_currentBits & 0x40000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.KeepAlive, _collection._headers._KeepAlive);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.IfRange, _collection._headers._IfRange);
_currentBits ^= 0x40000000L;
break;
- case 31: // Header: "Max-Forwards"
+ case 31: // Header: "If-Unmodified-Since"
Debug.Assert((_currentBits & 0x80000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.MaxForwards, _collection._headers._MaxForwards);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.IfUnmodifiedSince, _collection._headers._IfUnmodifiedSince);
_currentBits ^= 0x80000000L;
break;
- case 32: // Header: "Origin"
+ case 32: // Header: "Keep-Alive"
Debug.Assert((_currentBits & 0x100000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Origin, _collection._headers._Origin);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.KeepAlive, _collection._headers._KeepAlive);
_currentBits ^= 0x100000000L;
break;
- case 33: // Header: "Pragma"
+ case 33: // Header: "Max-Forwards"
Debug.Assert((_currentBits & 0x200000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Pragma, _collection._headers._Pragma);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.MaxForwards, _collection._headers._MaxForwards);
_currentBits ^= 0x200000000L;
break;
- case 34: // Header: "Proxy-Authorization"
+ case 34: // Header: "Origin"
Debug.Assert((_currentBits & 0x400000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.ProxyAuthorization, _collection._headers._ProxyAuthorization);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Origin, _collection._headers._Origin);
_currentBits ^= 0x400000000L;
break;
- case 35: // Header: "Range"
+ case 35: // Header: "Pragma"
Debug.Assert((_currentBits & 0x800000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Range, _collection._headers._Range);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Pragma, _collection._headers._Pragma);
_currentBits ^= 0x800000000L;
break;
- case 36: // Header: "Referer"
+ case 36: // Header: "Proxy-Authorization"
Debug.Assert((_currentBits & 0x1000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Referer, _collection._headers._Referer);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.ProxyAuthorization, _collection._headers._ProxyAuthorization);
_currentBits ^= 0x1000000000L;
break;
- case 37: // Header: "Request-Id"
+ case 37: // Header: "Range"
Debug.Assert((_currentBits & 0x2000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.RequestId, _collection._headers._RequestId);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Range, _collection._headers._Range);
_currentBits ^= 0x2000000000L;
break;
- case 38: // Header: "TE"
+ case 38: // Header: "Referer"
Debug.Assert((_currentBits & 0x4000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.TE, _collection._headers._TE);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Referer, _collection._headers._Referer);
_currentBits ^= 0x4000000000L;
break;
- case 39: // Header: "traceparent"
+ case 39: // Header: "Request-Id"
Debug.Assert((_currentBits & 0x8000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.TraceParent, _collection._headers._TraceParent);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.RequestId, _collection._headers._RequestId);
_currentBits ^= 0x8000000000L;
break;
- case 40: // Header: "tracestate"
+ case 40: // Header: "TE"
Debug.Assert((_currentBits & 0x10000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.TraceState, _collection._headers._TraceState);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.TE, _collection._headers._TE);
_currentBits ^= 0x10000000000L;
break;
- case 41: // Header: "Transfer-Encoding"
+ case 41: // Header: "traceparent"
Debug.Assert((_currentBits & 0x20000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.TransferEncoding, _collection._headers._TransferEncoding);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.TraceParent, _collection._headers._TraceParent);
_currentBits ^= 0x20000000000L;
break;
- case 42: // Header: "Translate"
+ case 42: // Header: "tracestate"
Debug.Assert((_currentBits & 0x40000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Translate, _collection._headers._Translate);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.TraceState, _collection._headers._TraceState);
_currentBits ^= 0x40000000000L;
break;
- case 43: // Header: "Upgrade"
+ case 43: // Header: "Transfer-Encoding"
Debug.Assert((_currentBits & 0x80000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Upgrade, _collection._headers._Upgrade);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.TransferEncoding, _collection._headers._TransferEncoding);
_currentBits ^= 0x80000000000L;
break;
- case 44: // Header: "Upgrade-Insecure-Requests"
+ case 44: // Header: "Translate"
Debug.Assert((_currentBits & 0x100000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.UpgradeInsecureRequests, _collection._headers._UpgradeInsecureRequests);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Translate, _collection._headers._Translate);
_currentBits ^= 0x100000000000L;
break;
- case 45: // Header: "Via"
+ case 45: // Header: "Upgrade"
Debug.Assert((_currentBits & 0x200000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Via, _collection._headers._Via);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Upgrade, _collection._headers._Upgrade);
_currentBits ^= 0x200000000000L;
break;
- case 46: // Header: "Warning"
+ case 46: // Header: "Upgrade-Insecure-Requests"
Debug.Assert((_currentBits & 0x400000000000L) != 0);
- _current = new KeyValuePair<string, StringValues>(HeaderNames.Warning, _collection._headers._Warning);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.UpgradeInsecureRequests, _collection._headers._UpgradeInsecureRequests);
_currentBits ^= 0x400000000000L;
break;
- case 47: // Header: "Content-Length"
+ case 47: // Header: "Via"
+ Debug.Assert((_currentBits & 0x800000000000L) != 0);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Via, _collection._headers._Via);
+ _currentBits ^= 0x800000000000L;
+ break;
+ case 48: // Header: "Warning"
+ Debug.Assert((_currentBits & 0x1000000000000L) != 0);
+ _current = new KeyValuePair<string, StringValues>(HeaderNames.Warning, _collection._headers._Warning);
+ _currentBits ^= 0x1000000000000L;
+ break;
+ case 49: // Header: "Content-Length"
Debug.Assert(_currentBits == 0);
_current = new KeyValuePair<string, StringValues>(HeaderNames.ContentLength, HeaderUtilities.FormatNonNegativeInt64(_collection._contentLength.GetValueOrDefault()));
_next = -1;
@@ -8439,7 +8667,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
}
else
{
- _next = _collection._contentLength.HasValue ? 47 : -1;
+ _next = _collection._contentLength.HasValue ? 49 : -1;
return true;
}
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs
index 5e18ba0861..2fafdb58a5 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpParser.cs
@@ -21,6 +21,7 @@ using BadHttpRequestException = Microsoft.AspNetCore.Http.BadHttpRequestExceptio
public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TRequestHandler : IHttpHeadersHandler, IHttpRequestLineHandler
{
private readonly bool _showErrorDetails;
+ private readonly bool _disableHttp1LineFeedTerminators;
/// <summary>
/// This API supports framework infrastructure and is not intended to be used
@@ -34,9 +35,14 @@ public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TR
/// This API supports framework infrastructure and is not intended to be used
/// directly from application code.
/// </summary>
- public HttpParser(bool showErrorDetails)
+ public HttpParser(bool showErrorDetails) : this(showErrorDetails, AppContext.TryGetSwitch(KestrelServerOptions.DisableHttp1LineFeedTerminatorsSwitchKey, out var disabled) && disabled)
+ {
+ }
+
+ internal HttpParser(bool showErrorDetails, bool disableHttp1LineFeedTerminators)
{
_showErrorDetails = showErrorDetails;
+ _disableHttp1LineFeedTerminators = disableHttp1LineFeedTerminators;
}
// byte types don't have a data type annotation so we pre-cast them; to avoid in-place casts
@@ -55,14 +61,6 @@ public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TR
/// </summary>
public bool ParseRequestLine(TRequestHandler handler, ref SequenceReader<byte> reader)
{
- // Skip any leading \r or \n on the request line. This is not technically allowed,
- // but apparently there are enough clients relying on this that it's worth allowing.
- // Peek first as a minor performance optimization; it's a quick inlined check.
- if (reader.TryPeek(out byte b) && (b == ByteCR || b == ByteLF))
- {
- reader.AdvancePastAny(ByteCR, ByteLF);
- }
-
if (reader.TryReadTo(out ReadOnlySpan<byte> requestLine, ByteLF, advancePastDelimiter: true))
{
ParseRequestLine(handler, requestLine);
@@ -143,9 +141,15 @@ public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TR
// Version + CR is 9 bytes which should take us to .Length
// LF should have been dropped prior to method call
- if ((uint)offset + 9 != (uint)requestLine.Length || requestLine[offset + sizeof(ulong)] != ByteCR)
+ if ((uint)offset + 9 != (uint)requestLine.Length || requestLine[offset + 8] != ByteCR)
{
- RejectRequestLine(requestLine);
+ // LF should have been dropped prior to method call
+ // If !_disableHttp1LineFeedTerminators and offset + 8 is .Length,
+ // then requestLine is valid since it means LF was the next char
+ if (_disableHttp1LineFeedTerminators || (uint)offset + 8 != (uint)requestLine.Length)
+ {
+ RejectRequestLine(requestLine);
+ }
}
// Version
@@ -172,135 +176,142 @@ public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TR
{
while (!reader.End)
{
+ // Check if the reader's span contains an LF to skip the reader if possible
var span = reader.UnreadSpan;
- while (span.Length > 0)
+
+ // Fast path, CR/LF at the beginning
+ if (span.Length >= 2 && span[0] == ByteCR && span[1] == ByteLF)
{
- byte ch1;
- var ch2 = (byte)0;
- var readAhead = 0;
+ reader.Advance(2);
+ handler.OnHeadersComplete(endStream: false);
+ return true;
+ }
- // Fast path, we're still looking at the same span
- if (span.Length >= 2)
- {
- ch1 = span[0];
- ch2 = span[1];
- }
- else if (reader.TryRead(out ch1)) // Possibly split across spans
- {
- // Note if we read ahead by 1 or 2 bytes
- readAhead = (reader.TryRead(out ch2)) ? 2 : 1;
- }
+ var foundCrlf = false;
- if (ch1 == ByteCR)
+ var lfOrCrIndex = span.IndexOfAny(ByteCR, ByteLF);
+ if (lfOrCrIndex >= 0)
+ {
+ if (span[lfOrCrIndex] == ByteCR)
{
- // Check for final CRLF.
- if (ch2 == ByteLF)
- {
- // If we got 2 bytes from the span directly so skip ahead 2 so that
- // the reader's state matches what we expect
- if (readAhead == 0)
- {
- reader.Advance(2);
- }
+ // We got a CR. Is this a CR/LF sequence?
+ var crIndex = lfOrCrIndex;
+ reader.Advance(crIndex + 1);
- // Double CRLF found, so end of headers.
- handler.OnHeadersComplete(endStream: false);
- return true;
+ bool hasDataAfterCr;
+
+ if ((uint)span.Length > (uint)(crIndex + 1) && span[crIndex + 1] == ByteLF)
+ {
+ // CR/LF in the same span (common case)
+ span = span.Slice(0, crIndex);
+ foundCrlf = true;
}
- else if (readAhead == 1)
+ else if ((hasDataAfterCr = reader.TryPeek(out byte lfMaybe)) && lfMaybe == ByteLF)
{
- // Didn't read 2 bytes, reset the reader so we don't consume anything
- reader.Rewind(1);
- return false;
+ // CR/LF but split between spans
+ span = span.Slice(0, span.Length - 1);
+ foundCrlf = true;
}
-
- Debug.Assert(readAhead == 0 || readAhead == 2);
- // Headers don't end in CRLF line.
-
- KestrelBadHttpRequestException.Throw(RequestRejectionReason.InvalidRequestHeadersNoCRLF);
- }
-
- var length = 0;
- // We only need to look for the end if we didn't read ahead; otherwise there isn't enough in
- // in the span to contain a header.
- if (readAhead == 0)
- {
- length = span.IndexOfAny(ByteCR, ByteLF);
- // If not found length with be -1; casting to uint will turn it to uint.MaxValue
- // which will be larger than any possible span.Length. This also serves to eliminate
- // the bounds check for the next lookup of span[length]
- if ((uint)length < (uint)span.Length)
+ else
{
- // Early memory read to hide latency
- var expectedCR = span[length];
- // Correctly has a CR, move to next
- length++;
-
- if (expectedCR != ByteCR)
+ // What's after the CR?
+ if (!hasDataAfterCr)
{
- // Sequence needs to be CRLF not LF first.
- RejectRequestHeader(span[..length]);
+ // No more chars after CR? Don't consume an incomplete header
+ reader.Rewind(crIndex + 1);
+ return false;
}
-
- if ((uint)length < (uint)span.Length)
+ else if (crIndex == 0)
{
- // Early memory read to hide latency
- var expectedLF = span[length];
- // Correctly has a LF, move to next
- length++;
-
- if (expectedLF != ByteLF ||
- length < 5 ||
- // Exclude the CRLF from the headerLine and parse the header name:value pair
- !TryTakeSingleHeader(handler, span[..(length - 2)]))
- {
- // Sequence needs to be CRLF and not contain an inner CR not part of terminator.
- // Less than min possible headerSpan of 5 bytes a:b\r\n
- // Not parsable as a valid name:value header pair.
- RejectRequestHeader(span[..length]);
- }
-
- // Read the header successfully, skip the reader forward past the headerSpan.
- span = span.Slice(length);
- reader.Advance(length);
+ // CR followed by something other than LF
+ KestrelBadHttpRequestException.Throw(RequestRejectionReason.InvalidRequestHeadersNoCRLF);
}
else
{
- // No enough data, set length to 0.
- length = 0;
+ // Include the thing after the CR in the rejection exception.
+ var stopIndex = crIndex + 2;
+ RejectRequestHeader(span[..stopIndex]);
}
}
- }
- // End found in current span
- if (length > 0)
- {
- continue;
- }
+ if (foundCrlf)
+ {
+ // Advance past the LF too
+ reader.Advance(1);
- // We moved the reader to look ahead 2 bytes so rewind the reader
- if (readAhead > 0)
- {
- reader.Rewind(readAhead);
+ // Empty line?
+ if (crIndex == 0)
+ {
+ handler.OnHeadersComplete(endStream: false);
+ return true;
+ }
+ }
}
+ else
+ {
+ // We got an LF with no CR before it.
+ var lfIndex = lfOrCrIndex;
+ if (_disableHttp1LineFeedTerminators)
+ {
+ RejectRequestHeader(AppendEndOfLine(span[..lfIndex], lineFeedOnly: true));
+ }
- length = ParseMultiSpanHeader(handler, ref reader);
+ // Consume the header including the LF
+ reader.Advance(lfIndex + 1);
+
+ span = span.Slice(0, lfIndex);
+ if (span.Length == 0)
+ {
+ handler.OnHeadersComplete(endStream: false);
+ return true;
+ }
+ }
+ }
+ else
+ {
+ // No CR or LF. Is this a multi-span header?
+ int length = ParseMultiSpanHeader(handler, ref reader);
if (length < 0)
{
- // Not there
+ // Not multi-line, just bad.
return false;
}
+ // This was a multi-line header. Advance the reader.
reader.Advance(length);
- // As we crossed spans set the current span to default
- // so we move to the next span on the next iteration
- span = default;
+
+ continue;
+ }
+
+ // We got to a point where we believe we have a header.
+ if (!TryTakeSingleHeader(handler, span))
+ {
+ // Sequence needs to be CRLF and not contain an inner CR not part of terminator.
+ // Not parsable as a valid name:value header pair.
+ RejectRequestHeader(AppendEndOfLine(span, lineFeedOnly: !foundCrlf));
}
}
return false;
}
+ private static byte[] AppendEndOfLine(ReadOnlySpan<byte> span, bool lineFeedOnly)
+ {
+ var array = new byte[span.Length + (lineFeedOnly ? 1 : 2)];
+
+ span.CopyTo(array);
+ array[^1] = ByteLF;
+
+ if (!lineFeedOnly)
+ {
+ array[^2] = ByteCR;
+ }
+
+ return array;
+ }
+
+ // Parse a header that might cross multiple spans, and return the length of the header
+ // or -1 if there was a failure during parsing.
private int ParseMultiSpanHeader(TRequestHandler handler, ref SequenceReader<byte> reader)
{
var currentSlice = reader.UnreadSequence;
@@ -313,44 +324,84 @@ public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TR
}
SequencePosition lineEnd;
- ReadOnlySpan<byte> headerSpan;
+ ReadOnlySequence<byte> header;
+
+ var firstLineEndCharPos = lineEndPosition.Value;
+ currentSlice.TryGet(ref firstLineEndCharPos, out var s);
+ var firstEolChar = s.Span[0];
+
+ // Is the first EOL char the last of the current slice?
if (currentSlice.Slice(reader.Position, lineEndPosition.Value).Length == currentSlice.Length - 1)
{
- // No enough data, so CRLF can't currently be there.
- // However, we need to check the found char is CR and not LF
-
- // Advance 1 to include CR/LF in lineEnd
- lineEnd = currentSlice.GetPosition(1, lineEndPosition.Value);
- headerSpan = currentSlice.Slice(reader.Position, lineEnd).ToSpan();
- if (headerSpan[^1] != ByteCR)
+ // Get the EOL char
+ if (firstEolChar == ByteCR)
{
- RejectRequestHeader(headerSpan);
+ // CR without LF, can't read the header
+ return -1;
}
+ else
+ {
+ if (_disableHttp1LineFeedTerminators)
+ {
+ // LF only but disabled
+
+ // Advance 1 to include LF in result
+ lineEnd = currentSlice.GetPosition(1, lineEndPosition.Value);
+ RejectRequestHeader(currentSlice.Slice(reader.Position, lineEnd).ToSpan());
+ }
+ }
+ }
+
+ // At this point the first EOL char is not the last byte in the current slice
+
+ // Offset 1 to include the first EOL char.
+ firstLineEndCharPos = currentSlice.GetPosition(1, lineEndPosition.Value);
+
+ if (firstEolChar == ByteCR)
+ {
+ // First EOL char is CR, include the char after CR
+ lineEnd = currentSlice.GetPosition(2, lineEndPosition.Value);
+ header = currentSlice.Slice(reader.Position, lineEnd);
+ }
+ else if (_disableHttp1LineFeedTerminators)
+ {
+ // The terminator is an LF and we don't allow it.
+ RejectRequestHeader(currentSlice.Slice(reader.Position, firstLineEndCharPos).ToSpan());
return -1;
}
+ else
+ {
+ // First EOL char is LF. only include this one
+ lineEnd = currentSlice.GetPosition(1, lineEndPosition.Value);
+ header = currentSlice.Slice(reader.Position, lineEnd);
+ }
- // Advance 2 to include CR{LF?} in lineEnd
- lineEnd = currentSlice.GetPosition(2, lineEndPosition.Value);
- headerSpan = currentSlice.Slice(reader.Position, lineEnd).ToSpan();
+ var headerSpan = header.ToSpan();
- if (headerSpan.Length < 5)
+ // 'a:b\n' or 'a:b\r\n'
+ var minHeaderSpan = _disableHttp1LineFeedTerminators ? 5 : 4;
+ if (headerSpan.Length < minHeaderSpan)
{
- // Less than min possible headerSpan is 5 bytes a:b\r\n
RejectRequestHeader(headerSpan);
}
- if (headerSpan[^2] != ByteCR)
+ var terminatorSize = -1;
+
+ if (headerSpan[^1] == ByteLF)
{
- // Sequence needs to be CRLF not LF first.
- RejectRequestHeader(headerSpan[..^1]);
+ if (headerSpan[^2] == ByteCR)
+ {
+ terminatorSize = 2;
+ }
+ else if (!_disableHttp1LineFeedTerminators)
+ {
+ terminatorSize = 1;
+ }
}
- if (headerSpan[^1] != ByteLF ||
- // Exclude the CRLF from the headerLine and parse the header name:value pair
- !TryTakeSingleHeader(handler, headerSpan[..^2]))
+ // Last chance to bail if the terminator size is not valid or the header doesn't parse.
+ if (terminatorSize == -1 || !TryTakeSingleHeader(handler, headerSpan.Slice(0, headerSpan.Length - terminatorSize)))
{
- // Sequence needs to be CRLF and not contain an inner CR not part of terminator.
- // Not parsable as a valid name:value header pair.
RejectRequestHeader(headerSpan);
}
@@ -445,7 +496,7 @@ public class HttpParser<TRequestHandler> : IHttpParser<TRequestHandler> where TR
// Range end is exclusive, so add 1 to valueEnd
valueEnd++;
- handler.OnHeader(name: headerLine[..nameEnd], value: headerLine[valueStart..valueEnd]);
+ handler.OnHeader(name: headerLine.Slice(0, nameEnd), value: headerLine[valueStart..valueEnd]);
return true;
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.FeatureCollection.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.FeatureCollection.cs
index 115b925e0b..9413ca9353 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.FeatureCollection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.FeatureCollection.cs
@@ -92,7 +92,7 @@ internal partial class HttpProtocol
if (!ReferenceEquals(_requestStreamInternal, RequestBody))
{
_requestStreamInternal = RequestBody;
- RequestBodyPipeReader = PipeReader.Create(RequestBody, new StreamPipeReaderOptions(_context.MemoryPool, _context.MemoryPool.GetMinimumSegmentSize(), _context.MemoryPool.GetMinimumAllocSize()));
+ RequestBodyPipeReader = PipeReader.Create(RequestBody, new StreamPipeReaderOptions(_context.MemoryPool, _context.MemoryPool.GetMinimumSegmentSize(), _context.MemoryPool.GetMinimumAllocSize(), useZeroByteReads: true));
OnCompleted((self) =>
{
@@ -149,6 +149,10 @@ internal partial class HttpProtocol
bool IHttpUpgradeFeature.IsUpgradableRequest => IsUpgradableRequest;
+ bool IHttpExtendedConnectFeature.IsExtendedConnect => IsExtendedConnectRequest;
+
+ string? IHttpExtendedConnectFeature.Protocol => ConnectProtocol;
+
IPAddress? IHttpConnectionFeature.RemoteIpAddress
{
get => RemoteIpAddress;
@@ -191,7 +195,7 @@ internal partial class HttpProtocol
set => AllowSynchronousIO = value;
}
- bool IHttpMaxRequestBodySizeFeature.IsReadOnly => HasStartedConsumingRequestBody || IsUpgraded;
+ bool IHttpMaxRequestBodySizeFeature.IsReadOnly => HasStartedConsumingRequestBody || IsUpgraded || IsExtendedConnectRequest;
long? IHttpMaxRequestBodySizeFeature.MaxRequestBodySize
{
@@ -284,6 +288,30 @@ internal partial class HttpProtocol
return _bodyControl!.Upgrade();
}
+ async ValueTask<Stream> IHttpExtendedConnectFeature.AcceptAsync()
+ {
+ if (!IsExtendedConnectRequest)
+ {
+ throw new InvalidOperationException(CoreStrings.CannotAcceptNonConnectRequest);
+ }
+
+ if (IsExtendedConnectAccepted)
+ {
+ throw new InvalidOperationException(CoreStrings.AcceptCannotBeCalledMultipleTimes);
+ }
+
+ if (StatusCode != StatusCodes.Status200OK)
+ {
+ throw new InvalidOperationException(CoreStrings.ConnectStatusMustBe200);
+ }
+
+ IsExtendedConnectAccepted = true;
+
+ await FlushAsync();
+
+ return _bodyControl!.Upgrade();
+ }
+
void IHttpRequestLifetimeFeature.Abort()
{
ApplicationAbort();
@@ -314,4 +342,12 @@ internal partial class HttpProtocol
{
return CompleteAsync();
}
+
+#pragma warning disable CA2252 // WebTransport is a preview feature. Suppress this warning
+ public bool IsWebTransportRequest { get; set; }
+ public virtual ValueTask<IWebTransportSession> AcceptAsync(CancellationToken token)
+ {
+ throw new NotSupportedException();
+ }
+#pragma warning restore CA2252
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.Generated.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.Generated.cs
index b8516497ba..69466b6579 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.Generated.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.Generated.cs
@@ -23,6 +23,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
IEndpointFeature,
IHttpRequestIdentifierFeature,
IHttpRequestTrailersFeature,
+ IHttpExtendedConnectFeature,
IHttpUpgradeFeature,
IRequestBodyPipeFeature,
IHttpConnectionFeature,
@@ -30,6 +31,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
IHttpBodyControlFeature,
IHttpMaxRequestBodySizeFeature,
IHttpRequestBodyDetectionFeature,
+ IHttpWebTransportFeature,
IBadRequestExceptionFeature
{
// Implemented features
@@ -40,6 +42,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
internal protected IEndpointFeature? _currentIEndpointFeature;
internal protected IHttpRequestIdentifierFeature? _currentIHttpRequestIdentifierFeature;
internal protected IHttpRequestTrailersFeature? _currentIHttpRequestTrailersFeature;
+ internal protected IHttpExtendedConnectFeature? _currentIHttpExtendedConnectFeature;
internal protected IHttpUpgradeFeature? _currentIHttpUpgradeFeature;
internal protected IRequestBodyPipeFeature? _currentIRequestBodyPipeFeature;
internal protected IHttpConnectionFeature? _currentIHttpConnectionFeature;
@@ -47,6 +50,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
internal protected IHttpBodyControlFeature? _currentIHttpBodyControlFeature;
internal protected IHttpMaxRequestBodySizeFeature? _currentIHttpMaxRequestBodySizeFeature;
internal protected IHttpRequestBodyDetectionFeature? _currentIHttpRequestBodyDetectionFeature;
+ internal protected IHttpWebTransportFeature? _currentIHttpWebTransportFeature;
internal protected IBadRequestExceptionFeature? _currentIBadRequestExceptionFeature;
// Other reserved feature slots
@@ -80,6 +84,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_currentIEndpointFeature = this;
_currentIHttpRequestIdentifierFeature = this;
_currentIHttpRequestTrailersFeature = this;
+ _currentIHttpExtendedConnectFeature = this;
_currentIHttpUpgradeFeature = this;
_currentIRequestBodyPipeFeature = this;
_currentIHttpConnectionFeature = this;
@@ -87,6 +92,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
_currentIHttpBodyControlFeature = this;
_currentIHttpMaxRequestBodySizeFeature = this;
_currentIHttpRequestBodyDetectionFeature = this;
+ _currentIHttpWebTransportFeature = this;
_currentIBadRequestExceptionFeature = this;
_currentIServiceProvidersFeature = null;
@@ -252,6 +258,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
feature = _currentITlsConnectionFeature;
}
+ else if (key == typeof(IHttpExtendedConnectFeature))
+ {
+ feature = _currentIHttpExtendedConnectFeature;
+ }
else if (key == typeof(IHttpUpgradeFeature))
{
feature = _currentIHttpUpgradeFeature;
@@ -260,6 +270,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
feature = _currentIHttpWebSocketFeature;
}
+ else if (key == typeof(IHttpWebTransportFeature))
+ {
+ feature = _currentIHttpWebTransportFeature;
+ }
else if (key == typeof(IBadRequestExceptionFeature))
{
feature = _currentIBadRequestExceptionFeature;
@@ -388,6 +402,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
_currentITlsConnectionFeature = (ITlsConnectionFeature?)value;
}
+ else if (key == typeof(IHttpExtendedConnectFeature))
+ {
+ _currentIHttpExtendedConnectFeature = (IHttpExtendedConnectFeature?)value;
+ }
else if (key == typeof(IHttpUpgradeFeature))
{
_currentIHttpUpgradeFeature = (IHttpUpgradeFeature?)value;
@@ -396,6 +414,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
_currentIHttpWebSocketFeature = (IHttpWebSocketFeature?)value;
}
+ else if (key == typeof(IHttpWebTransportFeature))
+ {
+ _currentIHttpWebTransportFeature = (IHttpWebTransportFeature?)value;
+ }
else if (key == typeof(IBadRequestExceptionFeature))
{
_currentIBadRequestExceptionFeature = (IBadRequestExceptionFeature?)value;
@@ -526,6 +548,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
feature = Unsafe.As<ITlsConnectionFeature?, TFeature?>(ref _currentITlsConnectionFeature);
}
+ else if (typeof(TFeature) == typeof(IHttpExtendedConnectFeature))
+ {
+ feature = Unsafe.As<IHttpExtendedConnectFeature?, TFeature?>(ref _currentIHttpExtendedConnectFeature);
+ }
else if (typeof(TFeature) == typeof(IHttpUpgradeFeature))
{
feature = Unsafe.As<IHttpUpgradeFeature?, TFeature?>(ref _currentIHttpUpgradeFeature);
@@ -534,6 +560,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
feature = Unsafe.As<IHttpWebSocketFeature?, TFeature?>(ref _currentIHttpWebSocketFeature);
}
+ else if (typeof(TFeature) == typeof(IHttpWebTransportFeature))
+ {
+ feature = Unsafe.As<IHttpWebTransportFeature?, TFeature?>(ref _currentIHttpWebTransportFeature);
+ }
else if (typeof(TFeature) == typeof(IBadRequestExceptionFeature))
{
feature = Unsafe.As<IBadRequestExceptionFeature?, TFeature?>(ref _currentIBadRequestExceptionFeature);
@@ -670,6 +700,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
_currentITlsConnectionFeature = Unsafe.As<TFeature?, ITlsConnectionFeature?>(ref feature);
}
+ else if (typeof(TFeature) == typeof(IHttpExtendedConnectFeature))
+ {
+ _currentIHttpExtendedConnectFeature = Unsafe.As<TFeature?, IHttpExtendedConnectFeature?>(ref feature);
+ }
else if (typeof(TFeature) == typeof(IHttpUpgradeFeature))
{
_currentIHttpUpgradeFeature = Unsafe.As<TFeature?, IHttpUpgradeFeature?>(ref feature);
@@ -678,6 +712,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
_currentIHttpWebSocketFeature = Unsafe.As<TFeature?, IHttpWebSocketFeature?>(ref feature);
}
+ else if (typeof(TFeature) == typeof(IHttpWebTransportFeature))
+ {
+ _currentIHttpWebTransportFeature = Unsafe.As<TFeature?, IHttpWebTransportFeature?>(ref feature);
+ }
else if (typeof(TFeature) == typeof(IBadRequestExceptionFeature))
{
_currentIBadRequestExceptionFeature = Unsafe.As<TFeature?, IBadRequestExceptionFeature?>(ref feature);
@@ -802,6 +840,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
yield return new KeyValuePair<Type, object>(typeof(ITlsConnectionFeature), _currentITlsConnectionFeature);
}
+ if (_currentIHttpExtendedConnectFeature != null)
+ {
+ yield return new KeyValuePair<Type, object>(typeof(IHttpExtendedConnectFeature), _currentIHttpExtendedConnectFeature);
+ }
if (_currentIHttpUpgradeFeature != null)
{
yield return new KeyValuePair<Type, object>(typeof(IHttpUpgradeFeature), _currentIHttpUpgradeFeature);
@@ -810,6 +852,10 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{
yield return new KeyValuePair<Type, object>(typeof(IHttpWebSocketFeature), _currentIHttpWebSocketFeature);
}
+ if (_currentIHttpWebTransportFeature != null)
+ {
+ yield return new KeyValuePair<Type, object>(typeof(IHttpWebTransportFeature), _currentIHttpWebTransportFeature);
+ }
if (_currentIBadRequestExceptionFeature != null)
{
yield return new KeyValuePair<Type, object>(typeof(IBadRequestExceptionFeature), _currentIBadRequestExceptionFeature);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs
index 013a8bc98d..57cc51fa59 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpProtocol.cs
@@ -127,10 +127,14 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
public bool IsUpgradableRequest { get; private set; }
public bool IsUpgraded { get; set; }
+ public bool IsExtendedConnectRequest { get; set; }
+ public bool IsExtendedConnectAccepted { get; set; }
public IPAddress? RemoteIpAddress { get; set; }
public int RemotePort { get; set; }
public IPAddress? LocalIpAddress { get; set; }
public int LocalPort { get; set; }
+ // https://datatracker.ietf.org/doc/html/rfc8441 ":protocol"
+ public string? ConnectProtocol { get; set; }
public string? Scheme { get; set; }
public HttpMethod Method { get; set; }
public string MethodText => ((IHttpRequestFeature)this).Method;
@@ -277,7 +281,7 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
return new CancellationToken(false);
}
- if (_connectionAborted)
+ if (_connectionAborted && _abortedCts == null)
{
return new CancellationToken(true);
}
@@ -355,6 +359,10 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
_httpProtocol = null;
_statusCode = StatusCodes.Status200OK;
_reasonPhrase = null;
+ IsUpgraded = false;
+ IsExtendedConnectRequest = false;
+ IsExtendedConnectAccepted = false;
+ IsWebTransportRequest = false;
var remoteEndPoint = RemoteEndPoint;
RemoteIpAddress = remoteEndPoint?.Address;
@@ -457,7 +465,6 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
if (_abortedCts != null && !_preventRequestAbortedCancellation)
{
localAbortCts = _abortedCts;
- _abortedCts = null;
}
}
@@ -1140,7 +1147,21 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
if (!_canWriteResponseBody && hasTransferEncoding)
{
- RejectNonBodyTransferEncodingResponse(appCompleted);
+ RejectInvalidHeaderForNonBodyResponse(appCompleted, HeaderNames.TransferEncoding);
+ }
+ else if (responseHeaders.ContentLength.HasValue)
+ {
+ if (!CanIncludeResponseContentLengthHeader())
+ {
+ RejectInvalidHeaderForNonBodyResponse(appCompleted, HeaderNames.ContentLength);
+ }
+ else if (StatusCode == StatusCodes.Status205ResetContent && responseHeaders.ContentLength.Value != 0)
+ {
+ // It is valid for a 205 response to have a Content-Length but it must be 0
+ // since 205 implies that no additional content will be provided.
+ // https://httpwg.org/specs/rfc7231.html#rfc.section.6.3.6
+ RejectNonzeroContentLengthOn205Response(appCompleted);
+ }
}
else if (StatusCode == StatusCodes.Status101SwitchingProtocols)
{
@@ -1150,7 +1171,6 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
{
if ((appCompleted || !_canWriteResponseBody) && !_hasAdvanced) // Avoid setting contentLength of 0 if we wrote data before calling CreateResponseHeaders
{
- // Don't set the Content-Length header automatically for HEAD requests, 204 responses, or 304 responses.
if (CanAutoSetContentLengthZeroResponseHeader())
{
// Since the app has completed writing or cannot write to the response, we can safely set the Content-Length to 0.
@@ -1212,6 +1232,28 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
return responseHeaders;
}
+ private bool CanIncludeResponseContentLengthHeader()
+ {
+ // Section 4.3.6 of RFC7231
+ if (Is1xxCode(StatusCode) || StatusCode == StatusCodes.Status204NoContent)
+ {
+ // A server MUST NOT send a Content-Length header field in any response
+ // with a status code of 1xx (Informational) or 204 (No Content).
+ return false;
+ }
+ else if (Method == HttpMethod.Connect && Is2xxCode(StatusCode))
+ {
+ // A server MUST NOT send a Content-Length header field in any 2xx
+ // (Successful) response to a CONNECT request.
+ return false;
+ }
+
+ return true;
+
+ static bool Is1xxCode(int code) => code >= StatusCodes.Status100Continue && code < StatusCodes.Status200OK;
+ static bool Is2xxCode(int code) => code >= StatusCodes.Status200OK && code < StatusCodes.Status300MultipleChoices;
+ }
+
private bool CanWriteResponseBody()
{
// List of status codes taken from Microsoft.Net.Http.Server.Response
@@ -1223,9 +1265,12 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
private bool CanAutoSetContentLengthZeroResponseHeader()
{
- return Method != HttpMethod.Head &&
- StatusCode != StatusCodes.Status204NoContent &&
- StatusCode != StatusCodes.Status304NotModified;
+ return CanIncludeResponseContentLengthHeader() &&
+ // Responses to HEAD may omit Content-Length (Section 4.3.6 of RFC7231).
+ Method != HttpMethod.Head &&
+ // 304s should only include specific fields, of which Content-Length is
+ // not one (Section 4.1 of RFC7232).
+ StatusCode != StatusCodes.Status304NotModified;
}
private static void ThrowResponseAlreadyStartedException(string value)
@@ -1233,9 +1278,15 @@ internal abstract partial class HttpProtocol : IHttpResponseControl
throw new InvalidOperationException(CoreStrings.FormatParameterReadOnlyAfterResponseStarted(value));
}
- private void RejectNonBodyTransferEncodingResponse(bool appCompleted)
+ private void RejectInvalidHeaderForNonBodyResponse(bool appCompleted, string headerName)
+ => RejectInvalidResponse(appCompleted, CoreStrings.FormatHeaderNotAllowedOnResponse(headerName, StatusCode));
+
+ private void RejectNonzeroContentLengthOn205Response(bool appCompleted)
+ => RejectInvalidResponse(appCompleted, CoreStrings.NonzeroContentLengthNotAllowedOn205);
+
+ private void RejectInvalidResponse(bool appCompleted, string message)
{
- var ex = new InvalidOperationException(CoreStrings.FormatHeaderNotAllowedOnResponse("Transfer-Encoding", StatusCode));
+ var ex = new InvalidOperationException(message);
if (!appCompleted)
{
// Back out of header creation surface exception in user code
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestHeaders.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestHeaders.cs
index d16e1619f9..472f1c4771 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestHeaders.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestHeaders.cs
@@ -48,6 +48,15 @@ internal sealed partial class HttpRequestHeaders : HttpHeaders
Clear(headersToClear);
}
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public void MergeCookies()
+ {
+ if (HasCookie && _headers._Cookie.Count > 1)
+ {
+ _headers._Cookie = string.Join("; ", _headers._Cookie.ToArray());
+ }
+ }
+
protected override void ClearFast()
{
if (!ReuseHeaderValues)
@@ -176,7 +185,7 @@ internal sealed partial class HttpRequestHeaders : HttpHeaders
return enumerator;
}
- private class EnumeratorCache
+ private sealed class EnumeratorCache
{
/// <summary>
/// Enumerator created from previous request
@@ -207,7 +216,7 @@ internal sealed partial class HttpRequestHeaders : HttpHeaders
/// IEnumerator allocations across requests if the header collection is commonly
/// enumerated for forwarding in a reverse-proxy type situation.
/// </summary>
- private class EnumeratorBox : IEnumerator<KeyValuePair<string, StringValues>>
+ private sealed class EnumeratorBox : IEnumerator<KeyValuePair<string, StringValues>>
{
public Enumerator Enumerator;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestStream.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestStream.cs
index 7d5074300b..7203ae0cc2 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestStream.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpRequestStream.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Buffers;
+using System.Runtime.CompilerServices;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
@@ -109,6 +110,7 @@ internal sealed class HttpRequestStream : Stream
}
}
+ [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))]
private async ValueTask<int> ReadAsyncInternal(Memory<byte> destination, CancellationToken cancellationToken)
{
while (true)
@@ -152,10 +154,7 @@ internal sealed class HttpRequestStream : Stream
/// <inheritdoc />
public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken)
{
- if (destination == null)
- {
- throw new ArgumentNullException(nameof(destination));
- }
+ ArgumentNullException.ThrowIfNull(destination);
if (bufferSize <= 0)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/HttpResponseHeaders.cs b/src/Servers/Kestrel/Core/src/Internal/Http/HttpResponseHeaders.cs
index cd449dc37e..768649ac40 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/HttpResponseHeaders.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/HttpResponseHeaders.cs
@@ -16,8 +16,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
internal sealed partial class HttpResponseHeaders : HttpHeaders
{
// This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- private static ReadOnlySpan<byte> CrLf => new[] { (byte)'\r', (byte)'\n' };
- private static ReadOnlySpan<byte> ColonSpace => new[] { (byte)':', (byte)' ' };
+ private static ReadOnlySpan<byte> CrLf => "\r\n"u8;
+ private static ReadOnlySpan<byte> ColonSpace => ": "u8;
public Func<string, Encoding?> EncodingSelector { get; set; }
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs
index 5208a35bcd..4898d874d4 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http/MessageBody.cs
@@ -37,6 +37,8 @@ internal abstract class MessageBody
public bool RequestUpgrade { get; protected set; }
+ public bool ExtendedConnect { get; protected set; }
+
public virtual bool IsEmpty => false;
protected KestrelTrace Log => _context.ServiceContext.Log;
@@ -122,7 +124,7 @@ internal abstract class MessageBody
OnReadStarting();
_context.HasStartedConsumingRequestBody = true;
- if (!RequestUpgrade)
+ if (!RequestUpgrade && !ExtendedConnect)
{
// Accessing TraceIdentifier will lazy-allocate a string ID.
// Don't access TraceIdentifer unless logging is enabled.
@@ -150,7 +152,7 @@ internal abstract class MessageBody
_stopped = true;
- if (!RequestUpgrade)
+ if (!RequestUpgrade && !ExtendedConnect)
{
// Accessing TraceIdentifier will lazy-allocate a string ID
// Don't access TraceIdentifer unless logging is enabled.
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/InputFlowControl.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/InputFlowControl.cs
index b1716fd1e7..91d40f12f4 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/InputFlowControl.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/InputFlowControl.cs
@@ -5,7 +5,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.FlowControl;
-internal class InputFlowControl
+internal sealed class InputFlowControl
{
private readonly int _initialWindowSize;
private readonly int _minWindowSizeIncrement;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/StreamInputFlowControl.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/StreamInputFlowControl.cs
index b59b718da0..85b8f3be1a 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/StreamInputFlowControl.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/FlowControl/StreamInputFlowControl.cs
@@ -5,7 +5,7 @@ using System.Diagnostics;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.FlowControl;
-internal class StreamInputFlowControl
+internal sealed class StreamInputFlowControl
{
private readonly InputFlowControl _connectionLevelFlowControl;
private readonly InputFlowControl _streamLevelFlowControl;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.Generated.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.Generated.cs
deleted file mode 100644
index f31ad2cc6e..0000000000
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.Generated.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-
-#nullable enable
-
-namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2
-{
- internal partial class Http2Connection
- {
- // This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
-
- private static ReadOnlySpan<byte> ClientPrefaceBytes => new byte[24] { (byte)'P', (byte)'R', (byte)'I', (byte)' ', (byte)'*', (byte)' ', (byte)'H', (byte)'T', (byte)'T', (byte)'P', (byte)'/', (byte)'2', (byte)'.', (byte)'0', (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n', (byte)'S', (byte)'M', (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' };
- private static ReadOnlySpan<byte> AuthorityBytes => new byte[10] { (byte)':', (byte)'a', (byte)'u', (byte)'t', (byte)'h', (byte)'o', (byte)'r', (byte)'i', (byte)'t', (byte)'y' };
- private static ReadOnlySpan<byte> MethodBytes => new byte[7] { (byte)':', (byte)'m', (byte)'e', (byte)'t', (byte)'h', (byte)'o', (byte)'d' };
- private static ReadOnlySpan<byte> PathBytes => new byte[5] { (byte)':', (byte)'p', (byte)'a', (byte)'t', (byte)'h' };
- private static ReadOnlySpan<byte> SchemeBytes => new byte[7] { (byte)':', (byte)'s', (byte)'c', (byte)'h', (byte)'e', (byte)'m', (byte)'e' };
- private static ReadOnlySpan<byte> StatusBytes => new byte[7] { (byte)':', (byte)'s', (byte)'t', (byte)'a', (byte)'t', (byte)'u', (byte)'s' };
- private static ReadOnlySpan<byte> ConnectionBytes => new byte[10] { (byte)'c', (byte)'o', (byte)'n', (byte)'n', (byte)'e', (byte)'c', (byte)'t', (byte)'i', (byte)'o', (byte)'n' };
- private static ReadOnlySpan<byte> TeBytes => new byte[2] { (byte)'t', (byte)'e' };
- private static ReadOnlySpan<byte> TrailersBytes => new byte[8] { (byte)'t', (byte)'r', (byte)'a', (byte)'i', (byte)'l', (byte)'e', (byte)'r', (byte)'s' };
- private static ReadOnlySpan<byte> ConnectBytes => new byte[7] { (byte)'C', (byte)'O', (byte)'N', (byte)'N', (byte)'E', (byte)'C', (byte)'T' };
- }
-}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs
index feaff535ee..c8ff2a3c90 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Connection.cs
@@ -21,8 +21,21 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-internal partial class Http2Connection : IHttp2StreamLifetimeHandler, IHttpStreamHeadersHandler, IRequestProcessor
+internal sealed partial class Http2Connection : IHttp2StreamLifetimeHandler, IHttpStreamHeadersHandler, IRequestProcessor
{
+ // This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
+ private static ReadOnlySpan<byte> ClientPrefaceBytes => "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"u8;
+ private static ReadOnlySpan<byte> AuthorityBytes => ":authority"u8;
+ private static ReadOnlySpan<byte> MethodBytes => ":method"u8;
+ private static ReadOnlySpan<byte> PathBytes => ":path"u8;
+ private static ReadOnlySpan<byte> SchemeBytes => ":scheme"u8;
+ private static ReadOnlySpan<byte> StatusBytes => ":status"u8;
+ private static ReadOnlySpan<byte> ConnectionBytes => "connection"u8;
+ private static ReadOnlySpan<byte> TeBytes => "te"u8;
+ private static ReadOnlySpan<byte> TrailersBytes => "trailers"u8;
+ private static ReadOnlySpan<byte> ConnectBytes => "CONNECT"u8;
+ private static ReadOnlySpan<byte> ProtocolBytes => ":protocol"u8;
+
public static ReadOnlySpan<byte> ClientPreface => ClientPrefaceBytes;
public static byte[]? InvalidHttp1xErrorResponseBytes;
@@ -1617,6 +1630,10 @@ internal partial class Http2Connection : IHttp2StreamLifetimeHandler, IHttpStrea
{
return PseudoHeaderFields.Authority;
}
+ else if (name.SequenceEqual(ProtocolBytes))
+ {
+ return PseudoHeaderFields.Protocol;
+ }
else
{
return PseudoHeaderFields.Unknown;
@@ -1721,6 +1738,7 @@ internal partial class Http2Connection : IHttp2StreamLifetimeHandler, IHttpStrea
Path = 0x4,
Scheme = 0x8,
Status = 0x10,
+ Protocol = 0x20,
Unknown = 0x40000000
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
index 07dbd9975f..e8fca0c394 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2FrameWriter.cs
@@ -14,7 +14,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.PipeWrite
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-internal class Http2FrameWriter
+internal sealed class Http2FrameWriter
{
// Literal Header Field without Indexing - Indexed Name (Index 8 - :status)
// This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
@@ -161,10 +161,8 @@ internal class Http2FrameWriter
FlushResult flushResult = default;
- // There are 2 cases where we abort:
- // 1. We're not complete but we got the abort.
- // 2. We're complete and there's no more response data to be written.
- if ((aborted && !completed) || (aborted && completed && actual == 0 && stream.ResponseTrailers is null or { Count: 0 }))
+ // We're not complete but we got the abort.
+ if (aborted && !completed)
{
// Response body is aborted, complete reader for this output producer.
if (flushHeaders)
@@ -175,10 +173,17 @@ internal class Http2FrameWriter
if (actual > 0)
{
+ // actual > int.MaxValue should never be possible because it would exceed Http2PeerSettings.MaxWindowSize
+ // which is a protocol-defined limit. There's no way Kestrel would try to write more than that in one go.
+ Debug.Assert(actual <= int.MaxValue);
+
// If we got here it means we're going to cancel the write. Restore any consumed bytes to the connection window.
- lock (_windowUpdateLock)
+ if (!TryUpdateConnectionWindow((int)actual))
{
- _connectionWindow += actual;
+ // This branch can only ever be taken given both a buggy client and aborting streams mid-write. Even then, we're much more likely catch the
+ // error in Http2Connection.ProcessFrameAsync() before catching it here. This branch is technically possible though, so we defend against it.
+ await HandleFlowControlErrorAsync();
+ return;
}
}
}
@@ -196,6 +201,8 @@ internal class Http2FrameWriter
}
else if (completed && producer.AppCompletedWithNoResponseBodyOrTrailers)
{
+ Debug.Assert(flushHeaders, "The app completed successfully without flushing headers!");
+
if (buffer.Length != 0)
{
_log.Http2UnexpectedDataRemaining(stream.StreamId, _connectionId);
@@ -204,8 +211,7 @@ internal class Http2FrameWriter
{
stream.DecrementActiveClientStreamCount();
- // Headers have already been written and there is no other content to write
- flushResult = await FlushAsync(stream, flushHeaders, outputAborter: null, cancellationToken: default);
+ flushResult = await FlushEndOfStreamHeadersAsync(stream);
}
}
else
@@ -265,6 +271,18 @@ internal class Http2FrameWriter
_log.Http2ConnectionQueueProcessingCompleted(_connectionId);
}
+ private async Task HandleFlowControlErrorAsync()
+ {
+ var connectionError = new Http2ConnectionErrorException(CoreStrings.Http2ErrorWindowUpdateSizeInvalid, Http2ErrorCode.FLOW_CONTROL_ERROR);
+ _log.Http2ConnectionError(_connectionId, connectionError);
+ await WriteGoAwayAsync(int.MaxValue, Http2ErrorCode.FLOW_CONTROL_ERROR);
+
+ // Prevent Abort() from writing an INTERNAL_ERROR GOAWAY frame after our FLOW_CONTROL_ERROR.
+ Complete();
+ // Stop processing any more requests and immediately close the connection.
+ _http2Connection.Abort(new ConnectionAbortedException(CoreStrings.Http2ErrorWindowUpdateSizeInvalid, connectionError));
+ }
+
private bool TryQueueProducerForConnectionWindowUpdate(long actual, Http2OutputProducer producer)
{
lock (_windowUpdateLock)
@@ -354,7 +372,7 @@ internal class Http2FrameWriter
}
}
- private ValueTask<FlushResult> FlushAsync(Http2Stream stream, bool writeHeaders, IHttpOutputAborter? outputAborter, CancellationToken cancellationToken)
+ private ValueTask<FlushResult> FlushEndOfStreamHeadersAsync(Http2Stream stream)
{
lock (_writeLock)
{
@@ -363,16 +381,12 @@ internal class Http2FrameWriter
return default;
}
- if (writeHeaders)
- {
- // write headers
- WriteResponseHeadersUnsynchronized(stream.StreamId, stream.StatusCode, Http2HeadersFrameFlags.END_STREAM, (HttpResponseHeaders)stream.ResponseHeaders);
- }
+ WriteResponseHeadersUnsynchronized(stream.StreamId, stream.StatusCode, Http2HeadersFrameFlags.END_STREAM, (HttpResponseHeaders)stream.ResponseHeaders);
var bytesWritten = _unflushedBytes;
_unflushedBytes = 0;
- return _flusher.FlushAsync(_minResponseDataRate, bytesWritten, outputAborter, cancellationToken);
+ return _flusher.FlushAsync(_minResponseDataRate, bytesWritten);
}
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2KeepAlive.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2KeepAlive.cs
index c7d4920d3f..03ae646856 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2KeepAlive.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2KeepAlive.cs
@@ -14,7 +14,7 @@ internal enum KeepAliveState
Timeout
}
-internal class Http2KeepAlive
+internal sealed class Http2KeepAlive
{
// An empty ping payload
internal static readonly ReadOnlySequence<byte> PingPayload = new ReadOnlySequence<byte>(new byte[8]);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs
index 126bdb5651..398baf674f 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2MessageBody.cs
@@ -19,6 +19,7 @@ internal sealed class Http2MessageBody : MessageBody
: base(context)
{
_context = context;
+ ExtendedConnect = _context.IsExtendedConnectRequest;
}
protected override void OnReadStarting()
@@ -51,6 +52,7 @@ internal sealed class Http2MessageBody : MessageBody
{
base.Reset();
_readResult = default;
+ ExtendedConnect = _context.IsExtendedConnectRequest;
}
public override void AdvanceTo(SequencePosition consumed, SequencePosition examined)
@@ -62,7 +64,12 @@ internal sealed class Http2MessageBody : MessageBody
// The HTTP/2 flow control window cannot be larger than 2^31-1 which limits bytesRead.
_context.OnDataRead((int)newlyExaminedBytes);
- AddAndCheckObservedBytes(newlyExaminedBytes);
+
+ // Don't limit extended CONNECT requests to the MaxRequestBodySize.
+ if (!ExtendedConnect)
+ {
+ AddAndCheckObservedBytes(newlyExaminedBytes);
+ }
}
public override bool TryRead(out ReadResult readResult)
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs
index b0780f154a..8f13acbc27 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2OutputProducer.cs
@@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.PipeWrite
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-internal class Http2OutputProducer : IHttpOutputProducer, IHttpOutputAborter, IDisposable
+internal sealed class Http2OutputProducer : IHttpOutputProducer, IHttpOutputAborter, IDisposable
{
private int StreamId => _stream.StreamId;
private readonly Http2FrameWriter _frameWriter;
@@ -436,9 +436,10 @@ internal class Http2OutputProducer : IHttpOutputProducer, IHttpOutputAborter, ID
{
lock (_dataWriterLock)
{
+ // Stop() always schedules a completion if one wasn't scheduled already.
Stop();
// We queued the stream to complete but didn't complete the response yet
- if (_completeScheduled && !_completedResponse)
+ if (!_completedResponse)
{
// Set the error so that we can write the RST when the response completes.
_resetErrorCode = error;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.FeatureCollection.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.FeatureCollection.cs
index 49ac110d17..c3bfc470f7 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.FeatureCollection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.FeatureCollection.cs
@@ -37,10 +37,7 @@ internal partial class Http2Stream : IHttp2StreamIdFeature,
}
set
{
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
+ ArgumentNullException.ThrowIfNull(value);
_userTrailers = value;
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs
index c69f40bfa2..6df8039ae7 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http2/Http2Stream.cs
@@ -201,6 +201,10 @@ internal abstract partial class Http2Stream : HttpProtocol, IThreadPoolWorkItem,
// Suppress pseudo headers from the public headers collection.
HttpRequestHeaders.ClearPseudoRequestHeaders();
+ // Cookies should be merged into a single string separated by "; "
+ // https://datatracker.ietf.org/doc/html/rfc7540#section-8.1.2.5
+ HttpRequestHeaders.MergeCookies();
+
return true;
}
@@ -222,18 +226,37 @@ internal abstract partial class Http2Stream : HttpProtocol, IThreadPoolWorkItem,
return false;
}
- // CONNECT - :scheme and :path must be excluded
if (Method == HttpMethod.Connect)
{
- if (!String.IsNullOrEmpty(HttpRequestHeaders.HeaderScheme) || !String.IsNullOrEmpty(HttpRequestHeaders.HeaderPath))
+ // https://datatracker.ietf.org/doc/html/rfc8441#section-4
+ // HTTP/2 WebSockets
+ if (!StringValues.IsNullOrEmpty(HttpRequestHeaders.HeaderProtocol))
+ {
+ // On requests that contain the :protocol pseudo-header field, the :scheme and :path pseudo-header fields of the target URI MUST also be included.
+ if (StringValues.IsNullOrEmpty(HttpRequestHeaders.HeaderScheme) || StringValues.IsNullOrEmpty(HttpRequestHeaders.HeaderPath))
+ {
+ ResetAndAbort(new ConnectionAbortedException(CoreStrings.ConnectRequestsWithProtocolRequireSchemeAndPath), Http2ErrorCode.PROTOCOL_ERROR);
+ return false;
+ }
+ ConnectProtocol = HttpRequestHeaders.HeaderProtocol;
+ IsExtendedConnectRequest = true;
+ }
+ // CONNECT - :scheme and :path must be excluded
+ else if (!StringValues.IsNullOrEmpty(HttpRequestHeaders.HeaderScheme) || !StringValues.IsNullOrEmpty(HttpRequestHeaders.HeaderPath))
{
ResetAndAbort(new ConnectionAbortedException(CoreStrings.Http2ErrorConnectMustNotSendSchemeOrPath), Http2ErrorCode.PROTOCOL_ERROR);
return false;
}
-
- RawTarget = hostText;
-
- return true;
+ else
+ {
+ RawTarget = hostText;
+ return true;
+ }
+ }
+ else if (!StringValues.IsNullOrEmpty(HttpRequestHeaders.HeaderProtocol))
+ {
+ ResetAndAbort(new ConnectionAbortedException(CoreStrings.ProtocolRequiresConnect), Http2ErrorCode.PROTOCOL_ERROR);
+ return false;
}
// :scheme https://tools.ietf.org/html/rfc7540#section-8.1.2.3
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/DefaultStreamDirectionFeature.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/DefaultStreamDirectionFeature.cs
index ecbf60fac9..66bd3fdd3e 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/DefaultStreamDirectionFeature.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/DefaultStreamDirectionFeature.cs
@@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Connections.Features;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class DefaultStreamDirectionFeature : IStreamDirectionFeature
+internal sealed class DefaultStreamDirectionFeature : IStreamDirectionFeature
{
public DefaultStreamDirectionFeature(bool canRead, bool canWrite)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Frames/Http3RawFrame.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Frames/Http3RawFrame.cs
index 6a2ce0af6c..076b9640d0 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Frames/Http3RawFrame.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Frames/Http3RawFrame.cs
@@ -5,7 +5,9 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
namespace System.Net.Http;
+#pragma warning disable CA1852 // Seal internal types
internal partial class Http3RawFrame
+#pragma warning restore CA1852 // Seal internal types
{
public long Length { get; set; }
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Connection.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Connection.cs
index a3e9199a61..65003cce36 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Connection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Connection.cs
@@ -11,38 +11,44 @@ using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
+internal sealed class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
{
- internal static readonly object StreamPersistentStateKey = new object();
+ internal static readonly object StreamPersistentStateKey = new();
// Internal for unit testing
- internal readonly Dictionary<long, IHttp3Stream> _streams = new Dictionary<long, IHttp3Stream>();
internal IHttp3StreamLifetimeHandler _streamLifetimeHandler;
+ internal readonly Dictionary<long, IHttp3Stream> _streams = new();
+ internal readonly Dictionary<long, Http3PendingStream> _unidentifiedStreams = new();
+
+ internal readonly MultiplexedConnectionContext _multiplexedContext;
+ internal readonly Http3PeerSettings _serverSettings = new();
+ internal readonly Http3PeerSettings _clientSettings = new();
// The highest opened request stream ID is sent with GOAWAY. The GOAWAY
// value will signal to the peer to discard all requests with that value or greater.
// When this value is sent, 4 will be added. We want 0 to be sent for no requests,
// so start highest opened request stream ID at -4.
private const long DefaultHighestOpenedRequestStreamId = -4;
- private long _highestOpenedRequestStreamId = DefaultHighestOpenedRequestStreamId;
- private readonly object _sync = new object();
- private readonly MultiplexedConnectionContext _multiplexedContext;
+ private readonly object _sync = new();
private readonly HttpMultiplexedConnectionContext _context;
+ private readonly object _protocolSelectionLock = new();
+ private readonly StreamCloseAwaitable _streamCompletionAwaitable = new();
+ private readonly IProtocolErrorCodeFeature _errorCodeFeature;
+ private readonly Dictionary<long, WebTransportSession>? _webtransportSessions;
+
+ private long _highestOpenedRequestStreamId = DefaultHighestOpenedRequestStreamId;
private bool _aborted;
- private readonly object _protocolSelectionLock = new object();
private int _gracefulCloseInitiator;
private int _stoppedAcceptingStreams;
private bool _gracefulCloseStarted;
private int _activeRequestCount;
- private CancellationTokenSource _acceptStreamsCts = new CancellationTokenSource();
- private readonly Http3PeerSettings _serverSettings = new Http3PeerSettings();
- private readonly Http3PeerSettings _clientSettings = new Http3PeerSettings();
- private readonly StreamCloseAwaitable _streamCompletionAwaitable = new StreamCloseAwaitable();
- private readonly IProtocolErrorCodeFeature _errorCodeFeature;
+ private CancellationTokenSource _acceptStreamsCts = new();
public Http3Connection(HttpMultiplexedConnectionContext context)
{
@@ -56,6 +62,15 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
_serverSettings.HeaderTableSize = (uint)httpLimits.Http3.HeaderTableSize;
_serverSettings.MaxRequestHeaderFieldSectionSize = (uint)httpLimits.MaxRequestHeadersTotalSize;
+ _serverSettings.EnableWebTransport = Convert.ToUInt32(context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams);
+ // technically these are 2 different settings so they should have separate values but the Chromium implementation requires
+ // them to both be 1 to use WebTransport.
+ _serverSettings.H3Datagram = Convert.ToUInt32(context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams);
+
+ if (context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams)
+ {
+ _webtransportSessions = new();
+ }
}
private void UpdateHighestOpenedRequestStreamId(long streamId)
@@ -82,6 +97,7 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
public Http3ControlStream? EncoderStream { get; set; }
public Http3ControlStream? DecoderStream { get; set; }
public string ConnectionId => _context.ConnectionId;
+ public ITimeoutControl TimeoutControl => _context.TimeoutControl;
public void StopProcessingNextRequest()
=> StopProcessingNextRequest(serverInitiated: true);
@@ -146,6 +162,21 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
_aborted = true;
}
+ if (_webtransportSessions is not null)
+ {
+ foreach (var session in _webtransportSessions)
+ {
+ if (ex.InnerException is not null)
+ {
+ session.Value.Abort(new ConnectionAbortedException(ex.Message, ex.InnerException), errorCode);
+ }
+ else
+ {
+ session.Value.Abort(new ConnectionAbortedException(ex.Message), errorCode);
+ }
+ }
+ }
+
if (!previousState)
{
_errorCodeFeature.Error = (long)errorCode;
@@ -168,9 +199,49 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
return;
}
+ ValidateOpenControlStreams(now);
UpdateStreamTimeouts(now);
}
+ private void ValidateOpenControlStreams(DateTimeOffset now)
+ {
+ var ticks = now.Ticks;
+
+ // This method validates that a connnection's control streams are open.
+ //
+ // They're checked on a delayed timer because when a connection is aborted or timed out, notifications are sent to open streams
+ // and the connection simultaneously. This is a problem because when a control stream is closed the connection should be aborted
+ // with the H3_CLOSED_CRITICAL_STREAM status. There is a race between the connection closing for the real reason, and control
+ // streams closing the connection with H3_CLOSED_CRITICAL_STREAM.
+ //
+ // Realistically, control streams are never closed except when the connection is. A small delay in aborting the connection in the
+ // unlikely situation where a control stream is incorrectly closed should be fine.
+ ValidateOpenControlStream(OutboundControlStream, this, ticks);
+ ValidateOpenControlStream(ControlStream, this, ticks);
+ ValidateOpenControlStream(EncoderStream, this, ticks);
+ ValidateOpenControlStream(DecoderStream, this, ticks);
+
+ static void ValidateOpenControlStream(Http3ControlStream? stream, Http3Connection connection, long ticks)
+ {
+ if (stream != null)
+ {
+ if (stream.IsCompleted || stream.IsAborted || stream.EndStreamReceived)
+ {
+ // If a control stream is no longer active then set a timeout so that the connection is aborted next tick.
+ if (stream.StreamTimeoutTicks == default)
+ {
+ stream.StreamTimeoutTicks = ticks;
+ }
+
+ if (stream.StreamTimeoutTicks < ticks)
+ {
+ connection.OnStreamConnectionError(new Http3ConnectionErrorException("A control stream used by the connection was closed or reset.", Http3ErrorCode.ClosedCriticalStream));
+ }
+ }
+ }
+ }
+ }
+
private void UpdateStreamTimeouts(DateTimeOffset now)
{
// This method checks for timeouts:
@@ -181,6 +252,24 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
var ticks = now.Ticks;
+ lock (_unidentifiedStreams)
+ {
+ foreach (var stream in _unidentifiedStreams.Values)
+ {
+ if (stream.StreamTimeoutTicks == default)
+ {
+ // On expiration overflow, use max value.
+ var expirationTicks = ticks + _context.ServiceContext.ServerOptions.Limits.RequestHeadersTimeout.Ticks;
+ stream.StreamTimeoutTicks = expirationTicks >= 0 ? expirationTicks : long.MaxValue;
+ }
+
+ if (stream.StreamTimeoutTicks < ticks)
+ {
+ stream.Abort(new("Stream timed out before its type was determined."));
+ }
+ }
+ }
+
lock (_streams)
{
foreach (var stream in _streams.Values)
@@ -216,14 +305,14 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
if (stream.StreamTimeoutTicks == default)
{
- stream.StreamTimeoutTicks = _context.TimeoutControl.GetResponseDrainDeadline(ticks, minDataRate);
+ stream.StreamTimeoutTicks = TimeoutControl.GetResponseDrainDeadline(ticks, minDataRate);
}
if (stream.StreamTimeoutTicks < ticks)
{
// Cancel connection to be consistent with other data rate limits.
Log.ResponseMinimumDataRateNotSatisfied(_context.ConnectionId, stream.TraceIdentifier);
- Abort(new ConnectionAbortedException(CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied), Http3ErrorCode.InternalError);
+ OnStreamConnectionError(new Http3ConnectionErrorException(CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied, Http3ErrorCode.InternalError));
}
}
}
@@ -258,6 +347,9 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
// Don't delay on waiting to send outbound control stream settings.
outboundControlStreamTask = ProcessOutboundControlStreamAsync(outboundControlStream);
+ // Close the connection if we don't receive any request streams
+ TimeoutControl.SetTimeout(Limits.KeepAliveTimeout.Ticks, TimeoutReason.KeepAlive);
+
while (_stoppedAcceptingStreams == 0)
{
var streamContext = await _multiplexedContext.AcceptAsync(_acceptStreamsCts.Token);
@@ -284,56 +376,75 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
Debug.Assert(streamDirectionFeature != null);
Debug.Assert(streamIdFeature != null);
+ // unidirectional stream
if (!streamDirectionFeature.CanWrite)
{
- // Unidirectional stream
- var stream = new Http3ControlStream<TContext>(application, CreateHttpStreamContext(streamContext));
- _streamLifetimeHandler.OnStreamCreated(stream);
+ var context = CreateHttpStreamContext(streamContext);
+
+ if (_context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams)
+ {
+ var pendingStream = new Http3PendingStream(context, streamIdFeature.StreamId);
+
+ _streamLifetimeHandler.OnUnidentifiedStreamReceived(pendingStream);
+
+ // TODO: This needs to get dispatched off of the accept loop to avoid blocking other streams. (https://github.com/dotnet/aspnetcore/issues/42789)
+ var streamType = await pendingStream.ReadNextStreamHeaderAsync(context, streamIdFeature.StreamId, null);
+
+ _unidentifiedStreams.Remove(streamIdFeature.StreamId, out _);
- ThreadPool.UnsafeQueueUserWorkItem(stream, preferLocal: false);
+ if (streamType == (long)Http3StreamType.WebTransportUnidirectional)
+ {
+ await CreateAndAddWebTransportStream(pendingStream, streamIdFeature.StreamId, WebTransportStreamType.Input);
+ }
+ else
+ {
+ var controlStream = new Http3ControlStream<TContext>(application, context, streamType);
+ _streamLifetimeHandler.OnStreamCreated(controlStream);
+ ThreadPool.UnsafeQueueUserWorkItem(controlStream, preferLocal: false);
+ }
+ }
+ else
+ {
+ var controlStream = new Http3ControlStream<TContext>(application, context, null);
+ _streamLifetimeHandler.OnStreamCreated(controlStream);
+ ThreadPool.UnsafeQueueUserWorkItem(controlStream, preferLocal: false);
+ }
}
+ // bidirectional stream
else
{
- // Request stream
-
- // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-5.2-2
- if (_gracefulCloseStarted)
+ if (_context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams)
{
- // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-4.1.2-3
- streamContext.Features.GetRequiredFeature<IProtocolErrorCodeFeature>().Error = (long)Http3ErrorCode.RequestRejected;
- streamContext.Abort(new ConnectionAbortedException("HTTP/3 connection is closing and no longer accepts new requests."));
- await streamContext.DisposeAsync();
-
- continue;
- }
+ var context = CreateHttpStreamContext(streamContext);
+ var pendingStream = new Http3PendingStream(context, streamIdFeature.StreamId);
- // Request stream IDs are tracked.
- UpdateHighestOpenedRequestStreamId(streamIdFeature.StreamId);
+ _streamLifetimeHandler.OnUnidentifiedStreamReceived(pendingStream);
- var persistentStateFeature = streamContext.Features.Get<IPersistentStateFeature>();
- Debug.Assert(persistentStateFeature != null, $"Required {nameof(IPersistentStateFeature)} not on stream context.");
+ // TODO: This needs to get dispatched off of the accept loop to avoid blocking other streams. (https://github.com/dotnet/aspnetcore/issues/42789)
+ var streamType = await pendingStream.ReadNextStreamHeaderAsync(context, streamIdFeature.StreamId, Http3StreamType.WebTransportBidirectional);
- Http3Stream<TContext> stream;
+ _unidentifiedStreams.Remove(streamIdFeature.StreamId, out _);
- // Check whether there is an existing HTTP/3 stream on the transport stream.
- // A stream will only be cached if the transport stream itself is reused.
- if (!persistentStateFeature.State.TryGetValue(StreamPersistentStateKey, out var s))
- {
- stream = new Http3Stream<TContext>(application, CreateHttpStreamContext(streamContext));
- persistentStateFeature.State.Add(StreamPersistentStateKey, stream);
+ if (streamType == (long)Http3StreamType.WebTransportBidirectional)
+ {
+ await CreateAndAddWebTransportStream(pendingStream, streamIdFeature.StreamId, WebTransportStreamType.Bidirectional);
+ }
+ else
+ {
+ await CreateHttp3Stream(streamContext, application, streamIdFeature.StreamId);
+ }
}
else
{
- stream = (Http3Stream<TContext>)s!;
- stream.InitializeWithExistingContext(streamContext.Transport);
+ await CreateHttp3Stream(streamContext, application, streamIdFeature.StreamId);
}
-
- _streamLifetimeHandler.OnStreamCreated(stream);
-
- KestrelEventSource.Log.RequestQueuedStart(stream, AspNetCore.Http.HttpProtocol.Http3);
- ThreadPool.UnsafeQueueUserWorkItem(stream, preferLocal: false);
}
}
+ catch (Http3PendingStreamException ex)
+ {
+ _unidentifiedStreams.Remove(ex.StreamId, out var stream);
+ Log.Http3StreamAbort(CoreStrings.FormatUnidentifiedStream(ex.StreamId), Http3ErrorCode.StreamCreationError, new(ex.Message));
+ }
finally
{
UpdateConnectionState();
@@ -393,6 +504,22 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
}
}
+ lock (_unidentifiedStreams)
+ {
+ foreach (var stream in _unidentifiedStreams.Values)
+ {
+ stream.Abort(CreateConnectionAbortError(error, clientAbort));
+ }
+ }
+
+ if (_webtransportSessions is not null)
+ {
+ foreach (var session in _webtransportSessions.Values)
+ {
+ session.OnClientConnectionClosed();
+ }
+ }
+
if (outboundControlStream != null)
{
// Don't gracefully close the outbound control stream. If the peer detects
@@ -411,7 +538,7 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
await _streamCompletionAwaitable;
}
- _context.TimeoutControl.CancelTimeout();
+ TimeoutControl.CancelTimeout();
}
catch
{
@@ -430,6 +557,67 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
}
}
+ private async Task CreateHttp3Stream<TContext>(ConnectionContext streamContext, IHttpApplication<TContext> application, long streamId) where TContext : notnull
+ {
+ // http request stream
+ // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-5.2-2
+ if (_gracefulCloseStarted)
+ {
+ // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-4.1.2-3
+ streamContext.Features.GetRequiredFeature<IProtocolErrorCodeFeature>().Error = (long)Http3ErrorCode.RequestRejected;
+ streamContext.Abort(new ConnectionAbortedException("HTTP/3 connection is closing and no longer accepts new requests."));
+ await streamContext.DisposeAsync();
+
+ return;
+ }
+
+ // Request stream IDs are tracked.
+ UpdateHighestOpenedRequestStreamId(streamId);
+
+ var persistentStateFeature = streamContext.Features.Get<IPersistentStateFeature>();
+ Debug.Assert(persistentStateFeature != null, $"Required {nameof(IPersistentStateFeature)} not on stream context.");
+
+ Http3Stream stream;
+
+ // Check whether there is an existing HTTP/3 stream on the transport stream.
+ // A stream will only be cached if the transport stream itself is reused.
+ if (!persistentStateFeature.State.TryGetValue(StreamPersistentStateKey, out var s))
+ {
+ stream = new Http3Stream<TContext>(application, CreateHttpStreamContext(streamContext));
+ persistentStateFeature.State.Add(StreamPersistentStateKey, stream);
+ }
+ else
+ {
+ stream = (Http3Stream<TContext>)s!;
+ stream.InitializeWithExistingContext(streamContext.Transport);
+ }
+
+ _streamLifetimeHandler.OnStreamCreated(stream);
+ KestrelEventSource.Log.RequestQueuedStart(stream, AspNetCore.Http.HttpProtocol.Http3);
+ ThreadPool.UnsafeQueueUserWorkItem(stream, preferLocal: false);
+ }
+
+ private async Task CreateAndAddWebTransportStream(Http3PendingStream stream, long streamId, WebTransportStreamType type)
+ {
+ Debug.Assert(_context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams);
+
+ // TODO: This needs to get dispatched off of the accept loop to avoid blocking other streams. (https://github.com/dotnet/aspnetcore/issues/42789)
+ var correspondingSession = await stream.ReadNextStreamHeaderAsync(stream.Context, streamId, null);
+
+ lock (_webtransportSessions!)
+ {
+ if (!_webtransportSessions.TryGetValue(correspondingSession, out var session))
+ {
+ stream.Abort(new ConnectionAbortedException(CoreStrings.ReceivedLooseWebTransportStream));
+ throw new Http3StreamErrorException(CoreStrings.ReceivedLooseWebTransportStream, Http3ErrorCode.StreamCreationError);
+ }
+
+ stream.Context.WebTransportSession = session;
+ var webtransportStream = new WebTransportStream(stream.Context, type);
+ session.AddStream(webtransportStream);
+ }
+ }
+
private static ConnectionAbortedException CreateConnectionAbortError(Exception? error, bool clientAbort)
{
if (error is ConnectionAbortedException abortedException)
@@ -445,7 +633,7 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
return new ConnectionAbortedException(CoreStrings.Http3ConnectionFaulted, error!);
}
- private Http3StreamContext CreateHttpStreamContext(ConnectionContext streamContext)
+ internal Http3StreamContext CreateHttpStreamContext(ConnectionContext streamContext)
{
var httpConnectionContext = new Http3StreamContext(
_multiplexedContext.ConnectionId,
@@ -457,12 +645,12 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
_context.MemoryPool,
streamContext.LocalEndPoint as IPEndPoint,
streamContext.RemoteEndPoint as IPEndPoint,
- _streamLifetimeHandler,
streamContext,
- _clientSettings,
- _serverSettings);
- httpConnectionContext.TimeoutControl = _context.TimeoutControl;
- httpConnectionContext.Transport = streamContext.Transport;
+ this)
+ {
+ TimeoutControl = _context.TimeoutControl,
+ Transport = streamContext.Transport
+ };
return httpConnectionContext;
}
@@ -507,8 +695,7 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
{
try
{
- await controlStream.SendStreamIdAsync(id: 0);
- await controlStream.SendSettingsFrameAsync();
+ await controlStream.ProcessOutboundSendsAsync(id: 0);
}
catch (Exception ex)
{
@@ -527,24 +714,9 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
var features = new FeatureCollection();
features.Set<IStreamDirectionFeature>(new DefaultStreamDirectionFeature(canRead: false, canWrite: true));
var streamContext = await _multiplexedContext.ConnectAsync(features);
- var httpConnectionContext = new Http3StreamContext(
- _multiplexedContext.ConnectionId,
- HttpProtocols.Http3,
- _context.AltSvcHeader,
- _multiplexedContext,
- _context.ServiceContext,
- streamContext.Features,
- _context.MemoryPool,
- streamContext.LocalEndPoint as IPEndPoint,
- streamContext.RemoteEndPoint as IPEndPoint,
- _streamLifetimeHandler,
- streamContext,
- _clientSettings,
- _serverSettings);
- httpConnectionContext.TimeoutControl = _context.TimeoutControl;
- httpConnectionContext.Transport = streamContext.Transport;
+ var httpConnectionContext = CreateHttpStreamContext(streamContext);
- return new Http3ControlStream<TContext>(application, httpConnectionContext);
+ return new Http3ControlStream<TContext>(application, httpConnectionContext, 0L);
}
private async ValueTask<FlushResult> SendGoAwayAsync(long id)
@@ -610,12 +782,26 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
}
}
+ void IHttp3StreamLifetimeHandler.OnUnidentifiedStreamReceived(Http3PendingStream stream)
+ {
+ lock (_unidentifiedStreams)
+ {
+ // place in a pending stream dictionary so we can track it (and timeout if necessary) as we don't have a proper stream instance yet
+ _unidentifiedStreams.Add(stream.StreamId, stream);
+ }
+ }
+
void IHttp3StreamLifetimeHandler.OnStreamCreated(IHttp3Stream stream)
{
lock (_streams)
{
if (stream.IsRequestStream)
{
+ if (_activeRequestCount == 0 && TimeoutControl.TimerReason == TimeoutReason.KeepAlive)
+ {
+ TimeoutControl.CancelTimeout();
+ }
+
_activeRequestCount++;
}
_streams[stream.StreamId] = stream;
@@ -629,6 +815,11 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
if (stream.IsRequestStream)
{
_activeRequestCount--;
+
+ if (_activeRequestCount == 0)
+ {
+ TimeoutControl.SetTimeout(Limits.KeepAliveTimeout.Ticks, TimeoutReason.KeepAlive);
+ }
}
_streams.Remove(stream.StreamId);
}
@@ -641,6 +832,11 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
void IHttp3StreamLifetimeHandler.OnStreamConnectionError(Http3ConnectionErrorException ex)
{
+ OnStreamConnectionError(ex);
+ }
+
+ private void OnStreamConnectionError(Http3ConnectionErrorException ex)
+ {
Log.Http3ConnectionError(ConnectionId, ex);
Abort(new ConnectionAbortedException(ex.Message, ex), ex.ErrorCode);
}
@@ -656,6 +852,12 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
break;
case Http3SettingType.QPackBlockedStreams:
break;
+ case Http3SettingType.EnableWebTransport:
+ _clientSettings.EnableWebTransport = (uint)value;
+ break;
+ case Http3SettingType.H3Datagram:
+ _clientSettings.H3Datagram = (uint)value;
+ break;
default:
throw new InvalidOperationException("Unexpected setting: " + type);
}
@@ -688,6 +890,21 @@ internal class Http3Connection : IHttp3StreamLifetimeHandler, IRequestProcessor
Abort(new ConnectionAbortedException(CoreStrings.ConnectionAbortedByClient), (Http3ErrorCode)_errorCodeFeature.Error);
}
+ internal WebTransportSession OpenNewWebTransportSession(Http3Stream http3Stream)
+ {
+ Debug.Assert(_context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams);
+
+ WebTransportSession session;
+ lock (_webtransportSessions!)
+ {
+ Debug.Assert(!_webtransportSessions.ContainsKey(http3Stream.StreamId));
+
+ session = new WebTransportSession(this, http3Stream);
+ _webtransportSessions[http3Stream.StreamId] = session;
+ }
+ return session;
+ }
+
private static class GracefulCloseInitiator
{
public const int None = 0;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ConnectionErrorException.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ConnectionErrorException.cs
index ef093ac2e2..14ad5d0956 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ConnectionErrorException.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ConnectionErrorException.cs
@@ -5,7 +5,7 @@ using System.Net.Http;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3ConnectionErrorException : Exception
+internal sealed class Http3ConnectionErrorException : Exception
{
public Http3ConnectionErrorException(string message, Http3ErrorCode errorCode)
: base($"HTTP/3 connection error ({Http3Formatting.ToFormattedErrorCode(errorCode)}): {message}")
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs
index e709d5486d..de28823a6d 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStream.cs
@@ -23,24 +23,32 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
private readonly Http3StreamContext _context;
private readonly Http3PeerSettings _serverPeerSettings;
private readonly IStreamIdFeature _streamIdFeature;
+ private readonly IStreamClosedFeature _streamClosedFeature;
private readonly IProtocolErrorCodeFeature _errorCodeFeature;
private readonly Http3RawFrame _incomingFrame = new Http3RawFrame();
private volatile int _isClosed;
- private int _gracefulCloseInitiator;
private long _headerType;
+ private int _gracefulCloseInitiator;
+ private readonly object _completionLock = new();
private bool _haveReceivedSettingsFrame;
+ private StreamCompletionFlags _completionState;
+
+ public bool EndStreamReceived => (_completionState & StreamCompletionFlags.EndStreamReceived) == StreamCompletionFlags.EndStreamReceived;
+ public bool IsAborted => (_completionState & StreamCompletionFlags.Aborted) == StreamCompletionFlags.Aborted;
+ public bool IsCompleted => (_completionState & StreamCompletionFlags.Completed) == StreamCompletionFlags.Completed;
public long StreamId => _streamIdFeature.StreamId;
- public Http3ControlStream(Http3StreamContext context)
+ public Http3ControlStream(Http3StreamContext context, long? headerType)
{
var httpLimits = context.ServiceContext.ServerOptions.Limits;
_context = context;
_serverPeerSettings = context.ServerPeerSettings;
_streamIdFeature = context.ConnectionFeatures.GetRequiredFeature<IStreamIdFeature>();
+ _streamClosedFeature = context.ConnectionFeatures.GetRequiredFeature<IStreamClosedFeature>();
_errorCodeFeature = context.ConnectionFeatures.GetRequiredFeature<IProtocolErrorCodeFeature>();
- _headerType = -1;
+ _headerType = headerType ?? -1;
_frameWriter = new Http3FrameWriter(
context.StreamContext,
@@ -56,7 +64,7 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
private void OnStreamClosed()
{
- Abort(new ConnectionAbortedException("HTTP_CLOSED_CRITICAL_STREAM"), Http3ErrorCode.InternalError);
+ ApplyCompletionFlag(StreamCompletionFlags.Completed);
}
public PipeReader Input => _context.Transport.Input;
@@ -70,15 +78,27 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
public void Abort(ConnectionAbortedException abortReason, Http3ErrorCode errorCode)
{
- // TODO - Should there be a check here to track abort state to avoid
- // running twice for a request?
+ lock (_completionLock)
+ {
+ if (IsCompleted || IsAborted)
+ {
+ return;
+ }
+
+ var (oldState, newState) = ApplyCompletionFlag(StreamCompletionFlags.Aborted);
+
+ if (oldState == newState)
+ {
+ return;
+ }
- Log.Http3StreamAbort(_context.ConnectionId, errorCode, abortReason);
+ Log.Http3StreamAbort(TraceIdentifier, errorCode, abortReason);
- _errorCodeFeature.Error = (long)errorCode;
- _frameWriter.Abort(abortReason);
+ _errorCodeFeature.Error = (long)errorCode;
+ _frameWriter.Abort(abortReason);
- Input.Complete(abortReason);
+ Input.Complete(abortReason);
+ }
}
public void OnInputOrOutputCompleted()
@@ -97,9 +117,27 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
return false;
}
- internal async ValueTask SendStreamIdAsync(long id)
+ private (StreamCompletionFlags OldState, StreamCompletionFlags NewState) ApplyCompletionFlag(StreamCompletionFlags completionState)
{
+ lock (_completionLock)
+ {
+ var oldCompletionState = _completionState;
+ _completionState |= completionState;
+
+ return (oldCompletionState, _completionState);
+ }
+ }
+
+ internal async ValueTask ProcessOutboundSendsAsync(long id)
+ {
+ _streamClosedFeature.OnClosed(static state =>
+ {
+ var stream = (Http3ControlStream)state!;
+ stream.OnStreamClosed();
+ }, this);
+
await _frameWriter.WriteStreamIdAsync(id);
+ await _frameWriter.WriteSettingsAsync(_serverPeerSettings.GetNonProtocolDefaults());
}
internal ValueTask<FlushResult> SendGoAway(long id)
@@ -108,11 +146,6 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
return _frameWriter.WriteGoAway(id);
}
- internal async ValueTask SendSettingsFrameAsync()
- {
- await _frameWriter.WriteSettingsAsync(_serverPeerSettings.GetNonProtocolDefaults());
- }
-
private async ValueTask<long> TryReadStreamHeaderAsync()
{
// https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-6.2
@@ -152,7 +185,16 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
{
try
{
- _headerType = await TryReadStreamHeaderAsync();
+ // todo: the _headerType should be read earlier
+ // and by the Http3PendingStream. However, to
+ // avoid perf issues with the current implementation
+ // we can defer the reading until now
+ // (https://github.com/dotnet/aspnetcore/issues/42789)
+ if (_headerType == -1)
+ {
+ _headerType = await TryReadStreamHeaderAsync();
+ }
+
_context.StreamLifetimeHandler.OnStreamHeaderReceived(this);
switch (_headerType)
@@ -199,6 +241,7 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
}
finally
{
+ ApplyCompletionFlag(StreamCompletionFlags.Completed);
_context.StreamLifetimeHandler.OnStreamCompleted(this);
}
}
@@ -228,12 +271,6 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
if (result.IsCompleted)
{
- if (!_context.StreamContext.ConnectionClosed.IsCancellationRequested)
- {
- // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-6.2.1-2
- throw new Http3ConnectionErrorException(CoreStrings.Http3ErrorControlStreamClientClosedInbound, Http3ErrorCode.ClosedCriticalStream);
- }
-
return;
}
}
@@ -289,7 +326,11 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
}
_haveReceivedSettingsFrame = true;
- using var closedRegistration = _context.StreamContext.ConnectionClosed.Register(state => ((Http3ControlStream)state!).OnStreamClosed(), this);
+ _streamClosedFeature.OnClosed(static state =>
+ {
+ var stream = (Http3ControlStream)state!;
+ stream.OnStreamClosed();
+ }, this);
while (true)
{
@@ -331,6 +372,8 @@ internal abstract class Http3ControlStream : IHttp3Stream, IThreadPoolWorkItem
case (long)Http3SettingType.QPackMaxTableCapacity:
case (long)Http3SettingType.MaxFieldSectionSize:
case (long)Http3SettingType.QPackBlockedStreams:
+ case (long)Http3SettingType.EnableWebTransport:
+ case (long)Http3SettingType.H3Datagram:
_context.StreamLifetimeHandler.OnInboundControlStreamSetting((Http3SettingType)id, value);
break;
default:
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStreamOfT.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStreamOfT.cs
index eec22a5932..4131b7c21f 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStreamOfT.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3ControlStreamOfT.cs
@@ -10,7 +10,7 @@ internal sealed class Http3ControlStream<TContext> : Http3ControlStream, IHostCo
{
private readonly IHttpApplication<TContext> _application;
- public Http3ControlStream(IHttpApplication<TContext> application, Http3StreamContext context) : base(context)
+ public Http3ControlStream(IHttpApplication<TContext> application, Http3StreamContext context, long? headerType) : base(context, headerType)
{
_application = application;
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameReader.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameReader.cs
index c66e2870a1..66740c710f 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameReader.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameReader.cs
@@ -6,7 +6,7 @@ using System.Net.Http;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3FrameReader
+internal sealed class Http3FrameReader
{
/* https://quicwg.org/base-drafts/draft-ietf-quic-http.html#frame-layout
0 1 2 3
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameWriter.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameWriter.cs
index ee274408b0..dbcd774af4 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameWriter.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3FrameWriter.cs
@@ -15,7 +15,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.PipeWrite
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3FrameWriter
+internal sealed class Http3FrameWriter
{
// These bytes represent a ":status: 100" continue response header frame encoded with
// QPACK. To arrive at this, we first take the index in the QPACK static table for status
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3MessageBody.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3MessageBody.cs
index b271ebc076..3acf52411a 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3MessageBody.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3MessageBody.cs
@@ -14,10 +14,11 @@ internal sealed class Http3MessageBody : MessageBody
private readonly Http3Stream _context;
private ReadResult _readResult;
- private Http3MessageBody(Http3Stream context)
+ public Http3MessageBody(Http3Stream context)
: base(context)
{
_context = context;
+ ExtendedConnect = _context.IsExtendedConnectRequest;
}
protected override void OnReadStarting()
@@ -31,9 +32,11 @@ internal sealed class Http3MessageBody : MessageBody
}
}
- public static MessageBody For(Http3Stream context)
+ public override void Reset()
{
- return new Http3MessageBody(context);
+ base.Reset();
+ _readResult = default;
+ ExtendedConnect = _context.IsExtendedConnectRequest;
}
public override void AdvanceTo(SequencePosition consumed, SequencePosition examined)
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3OutputProducer.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3OutputProducer.cs
index 99d40ef5c3..d387d36296 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3OutputProducer.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3OutputProducer.cs
@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3OutputProducer : IHttpOutputProducer, IHttpOutputAborter
+internal sealed class Http3OutputProducer : IHttpOutputProducer, IHttpOutputAborter
{
private readonly Http3FrameWriter _frameWriter;
private readonly TimingPipeFlusher _flusher;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PeerSettings.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PeerSettings.cs
index 148f717c67..144e9dc1de 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PeerSettings.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PeerSettings.cs
@@ -3,14 +3,18 @@
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3PeerSettings
+internal sealed class Http3PeerSettings
{
// Note these are protocol defaults, not Kestrel defaults.
public const uint DefaultHeaderTableSize = 0;
public const uint DefaultMaxRequestHeaderFieldSize = uint.MaxValue;
+ public const uint DefaultEnableWebTransport = 0;
+ public const uint DefaultH3Datagram = 0;
public uint HeaderTableSize { get; internal set; } = DefaultHeaderTableSize;
public uint MaxRequestHeaderFieldSectionSize { get; internal set; } = DefaultMaxRequestHeaderFieldSize;
+ public uint EnableWebTransport { get; internal set; } = DefaultEnableWebTransport;
+ public uint H3Datagram { get; internal set; } = DefaultH3Datagram;
// Gets the settings that are different from the protocol defaults (as opposed to the server defaults).
internal List<Http3PeerSetting> GetNonProtocolDefaults()
@@ -29,6 +33,16 @@ internal class Http3PeerSettings
list.Add(new Http3PeerSetting(Http3SettingType.MaxFieldSectionSize, MaxRequestHeaderFieldSectionSize));
}
+ if (EnableWebTransport != DefaultEnableWebTransport)
+ {
+ list.Add(new Http3PeerSetting(Http3SettingType.EnableWebTransport, EnableWebTransport));
+ }
+
+ if (H3Datagram != DefaultH3Datagram)
+ {
+ list.Add(new Http3PeerSetting(Http3SettingType.H3Datagram, H3Datagram));
+ }
+
return list;
}
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStream.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStream.cs
new file mode 100644
index 0000000000..adc7d5bb56
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStream.cs
@@ -0,0 +1,103 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using Microsoft.AspNetCore.Connections;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+
+internal sealed class Http3PendingStream
+{
+ private ConnectionAbortedException? _abortedException;
+ private bool _isClosed;
+
+ internal readonly Http3StreamContext Context;
+ internal readonly long StreamId;
+ internal long StreamTimeoutTicks;
+
+ public Http3PendingStream(Http3StreamContext context, long id)
+ {
+ Context = context;
+ StreamTimeoutTicks = default;
+ StreamId = id;
+ }
+
+ public void Abort(ConnectionAbortedException exception)
+ {
+ if (_isClosed)
+ {
+ return;
+ }
+ _isClosed = true;
+
+ _abortedException = exception;
+
+ Context.Transport.Input.CancelPendingRead();
+ Context.Transport.Input.Complete(exception);
+ Context.Transport.Output.Complete(exception);
+ }
+
+ public async ValueTask<long> ReadNextStreamHeaderAsync(Http3StreamContext context, long streamId, Http3StreamType? advanceOn)
+ {
+ var Input = context.Transport.Input;
+ var advance = false;
+ SequencePosition consumed = default;
+ SequencePosition start = default;
+ try
+ {
+ while (!_isClosed)
+ {
+ var result = await Input.ReadAsync();
+
+ if (result.IsCanceled)
+ {
+ throw new Exception();
+ }
+
+ var readableBuffer = result.Buffer;
+ consumed = readableBuffer.Start;
+ start = readableBuffer.Start;
+
+ if (!readableBuffer.IsEmpty)
+ {
+ var value = VariableLengthIntegerHelper.GetInteger(readableBuffer, out consumed, out _);
+ if (value != -1)
+ {
+ if (!advanceOn.HasValue || value == (long)advanceOn)
+ {
+ advance = true;
+ }
+ return value;
+ }
+ }
+
+ if (result.IsCompleted)
+ {
+ return -1L;
+ }
+ }
+ }
+ catch (Exception)
+ {
+ throw new Http3PendingStreamException(CoreStrings.AttemptedToReadHeaderOnAbortedStream, streamId, _abortedException);
+ }
+ finally
+ {
+ if (!_isClosed)
+ {
+ if (advance)
+ {
+ Input.AdvanceTo(consumed);
+ }
+ else
+ {
+ Input.AdvanceTo(start);
+ }
+ }
+
+ StreamTimeoutTicks = default;
+ }
+
+ return -1L;
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStreamException.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStreamException.cs
new file mode 100644
index 0000000000..97e1382006
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3PendingStreamException.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+
+internal sealed class Http3PendingStreamException : Exception
+{
+ public Http3PendingStreamException(string message, long streamId, Exception? innerException = null)
+ : base($"HTTP/3 stream error while trying to identify stream {streamId}: {message}", innerException)
+ {
+ StreamId = streamId;
+ }
+
+ public long StreamId { get; }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3SettingType.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3SettingType.cs
index 2d12fd96eb..4e79e025bd 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3SettingType.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3SettingType.cs
@@ -13,5 +13,18 @@ internal enum Http3SettingType : long
/// </summary>
MaxFieldSectionSize = 0x6,
// https://quicwg.org/base-drafts/draft-ietf-quic-qpack.html#section-5
- QPackBlockedStreams = 0x7
+ QPackBlockedStreams = 0x7,
+
+ /// <summary>
+ /// SETTINGS_ENABLE_WEBTRANSPORT, default is 0 (off)
+ /// https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-01.html#name-http-3-settings-parameter-r
+ /// </summary>
+ EnableWebTransport = 0x2b603742,
+
+ /// <summary>
+ /// H3_DATAGRAM, default is 0 (off)
+ /// indicates that the server suppprts sending individual datagrams over Http/3
+ /// rather than just streams.
+ /// </summary>
+ H3Datagram = 0xffd277
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.FeatureCollection.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.FeatureCollection.cs
index 81d8009459..f82738e1f0 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.FeatureCollection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.FeatureCollection.cs
@@ -32,10 +32,7 @@ internal partial class Http3Stream : IHttpResetFeature,
}
set
{
- if (value == null)
- {
- throw new ArgumentNullException(nameof(value));
- }
+ ArgumentNullException.ThrowIfNull(value);
_userTrailers = value;
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.cs
index 462e56533e..e867076bba 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3Stream.cs
@@ -15,26 +15,27 @@ using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
-using Microsoft.Net.Http.Headers;
+using HttpCharacters = Microsoft.AspNetCore.Http.HttpCharacters;
using HttpMethod = Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpMethod;
using HttpMethods = Microsoft.AspNetCore.Http.HttpMethods;
-using HttpCharacters = Microsoft.AspNetCore.Http.HttpCharacters;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpStreamHeadersHandler, IThreadPoolWorkItem
{
- private static ReadOnlySpan<byte> AuthorityBytes => new byte[10] { (byte)':', (byte)'a', (byte)'u', (byte)'t', (byte)'h', (byte)'o', (byte)'r', (byte)'i', (byte)'t', (byte)'y' };
- private static ReadOnlySpan<byte> MethodBytes => new byte[7] { (byte)':', (byte)'m', (byte)'e', (byte)'t', (byte)'h', (byte)'o', (byte)'d' };
- private static ReadOnlySpan<byte> PathBytes => new byte[5] { (byte)':', (byte)'p', (byte)'a', (byte)'t', (byte)'h' };
- private static ReadOnlySpan<byte> SchemeBytes => new byte[7] { (byte)':', (byte)'s', (byte)'c', (byte)'h', (byte)'e', (byte)'m', (byte)'e' };
- private static ReadOnlySpan<byte> StatusBytes => new byte[7] { (byte)':', (byte)'s', (byte)'t', (byte)'a', (byte)'t', (byte)'u', (byte)'s' };
- private static ReadOnlySpan<byte> ConnectionBytes => new byte[10] { (byte)'c', (byte)'o', (byte)'n', (byte)'n', (byte)'e', (byte)'c', (byte)'t', (byte)'i', (byte)'o', (byte)'n' };
- private static ReadOnlySpan<byte> TeBytes => new byte[2] { (byte)'t', (byte)'e' };
- private static ReadOnlySpan<byte> TrailersBytes => new byte[8] { (byte)'t', (byte)'r', (byte)'a', (byte)'i', (byte)'l', (byte)'e', (byte)'r', (byte)'s' };
- private static ReadOnlySpan<byte> ConnectBytes => new byte[7] { (byte)'C', (byte)'O', (byte)'N', (byte)'N', (byte)'E', (byte)'C', (byte)'T' };
+ private static ReadOnlySpan<byte> AuthorityBytes => ":authority"u8;
+ private static ReadOnlySpan<byte> MethodBytes => ":method"u8;
+ private static ReadOnlySpan<byte> PathBytes => ":path"u8;
+ private static ReadOnlySpan<byte> ProtocolBytes => ":protocol"u8;
+ private static ReadOnlySpan<byte> SchemeBytes => ":scheme"u8;
+ private static ReadOnlySpan<byte> StatusBytes => ":status"u8;
+ private static ReadOnlySpan<byte> ConnectionBytes => "connection"u8;
+ private static ReadOnlySpan<byte> TeBytes => "te"u8;
+ private static ReadOnlySpan<byte> TrailersBytes => "trailers"u8;
+ private static ReadOnlySpan<byte> ConnectBytes => "CONNECT"u8;
private const PseudoHeaderFields _mandatoryRequestPseudoHeaderFields =
PseudoHeaderFields.Method | PseudoHeaderFields.Path | PseudoHeaderFields.Scheme;
@@ -45,38 +46,36 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
private IProtocolErrorCodeFeature _errorCodeFeature = default!;
private IStreamIdFeature _streamIdFeature = default!;
private IStreamAbortFeature _streamAbortFeature = default!;
- private int _isClosed;
- private readonly Http3RawFrame _incomingFrame = new Http3RawFrame();
- protected RequestHeaderParsingState _requestHeaderParsingState;
+ private IStreamClosedFeature _streamClosedFeature = default!;
private PseudoHeaderFields _parsedPseudoHeaderFields;
+ private StreamCompletionFlags _completionState;
+ private int _isClosed;
private int _totalParsedHeaderSize;
private bool _isMethodConnect;
+ private bool _isWebTransportSessionAccepted;
+ private Http3MessageBody? _messageBody;
- private readonly ManualResetValueTaskSource<object?> _appCompletedTaskSource = new ManualResetValueTaskSource<object?>();
+ private readonly ManualResetValueTaskSource<object?> _appCompletedTaskSource = new();
+ private readonly object _completionLock = new();
- private StreamCompletionFlags _completionState;
- private readonly object _completionLock = new object();
+ protected RequestHeaderParsingState _requestHeaderParsingState;
+ protected readonly Http3RawFrame _incomingFrame = new();
public bool EndStreamReceived => (_completionState & StreamCompletionFlags.EndStreamReceived) == StreamCompletionFlags.EndStreamReceived;
- private bool IsAborted => (_completionState & StreamCompletionFlags.Aborted) == StreamCompletionFlags.Aborted;
- private bool IsCompleted => (_completionState & StreamCompletionFlags.Completed) == StreamCompletionFlags.Completed;
+ public bool IsAborted => (_completionState & StreamCompletionFlags.Aborted) == StreamCompletionFlags.Aborted;
+ public bool IsCompleted => (_completionState & StreamCompletionFlags.Completed) == StreamCompletionFlags.Completed;
public Pipe RequestBodyPipe { get; private set; } = default!;
-
public long? InputRemaining { get; internal set; }
-
public QPackDecoder QPackDecoder { get; private set; } = default!;
public PipeReader Input => _context.Transport.Input;
-
public ISystemClock SystemClock => _context.ServiceContext.SystemClock;
public KestrelServerLimits Limits => _context.ServiceContext.ServerOptions.Limits;
public long StreamId => _streamIdFeature.StreamId;
-
public long StreamTimeoutTicks { get; set; }
public bool IsReceivingHeader => _requestHeaderParsingState <= RequestHeaderParsingState.Headers; // Assigned once headers are received
public bool IsDraining => _appCompletedTaskSource.GetStatus() != ValueTaskSourceStatus.Pending; // Draining starts once app is complete
-
public bool IsRequestStream => true;
public void Initialize(Http3StreamContext context)
@@ -90,6 +89,7 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
_errorCodeFeature = _context.ConnectionFeatures.GetRequiredFeature<IProtocolErrorCodeFeature>();
_streamIdFeature = _context.ConnectionFeatures.GetRequiredFeature<IStreamIdFeature>();
_streamAbortFeature = _context.ConnectionFeatures.GetRequiredFeature<IStreamAbortFeature>();
+ _streamClosedFeature = _context.ConnectionFeatures.GetRequiredFeature<IStreamClosedFeature>();
_appCompletedTaskSource.Reset();
_isClosed = 0;
@@ -146,7 +146,7 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
{
lock (_completionLock)
{
- if (IsCompleted)
+ if (IsCompleted || IsAborted)
{
return;
}
@@ -163,6 +163,8 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
abortReason = new ConnectionAbortedException(exception.Message, exception);
}
+ _context.WebTransportSession?.Abort(abortReason, errorCode);
+
Log.Http3StreamAbort(TraceIdentifier, errorCode, abortReason);
// Call _http3Output.Stop() prior to poisoning the request body stream or pipe to
@@ -507,6 +509,10 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
{
return PseudoHeaderFields.Authority;
}
+ else if (name.SequenceEqual(ProtocolBytes))
+ {
+ return PseudoHeaderFields.Protocol;
+ }
else
{
return PseudoHeaderFields.Unknown;
@@ -569,6 +575,28 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
{
Exception? error = null;
+ // With HTTP/3 the write-side of the stream can be aborted by the client after the server
+ // has finished reading incoming content. That means errors can happen after the Input loop
+ // has finished reading.
+ //
+ // To get notification of request aborted we register to the stream closing or complete.
+ // It will notify this type that the client has aborted the request and Kestrel will complete
+ // pipes and cancel the HttpContext.RequestAborted token.
+ _streamClosedFeature.OnClosed(static s =>
+ {
+ var stream = (Http3Stream)s!;
+
+ if (!stream.IsCompleted)
+ {
+ // An error code value other than -1 indicates a value was set and the request didn't gracefully complete.
+ var errorCode = stream._errorCodeFeature.Error;
+ if (errorCode >= 0)
+ {
+ stream.AbortCore(new IOException(CoreStrings.HttpStreamResetByClient), (Http3ErrorCode)errorCode);
+ }
+ }
+ }, this);
+
try
{
while (_isClosed == 0)
@@ -632,9 +660,6 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
}
finally
{
- var streamError = error as ConnectionAbortedException
- ?? new ConnectionAbortedException("The stream has completed.", error!);
-
await Input.CompleteAsync();
// Once the header is finished being received then the app has started.
@@ -642,44 +667,9 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
? new ValueTask(_appCompletedTaskSource, _appCompletedTaskSource.Version)
: ValueTask.CompletedTask;
- if (!appCompletedTask.IsCompletedSuccessfully)
- {
- // At this point in the stream's read-side is complete. However, with HTTP/3
- // the write-side of the stream can still be aborted by the client on request
- // aborted.
- //
- // To get notification of request aborted we register to connection closed
- // token. It will notify this type that the client has aborted the request
- // and Kestrel will complete pipes and cancel the RequestAborted token.
- //
- // Only subscribe to this event after the stream's read-side is complete to
- // avoid interactions between reading that is in-progress and an abort.
- // This means while reading, read-side abort will handle getting abort notifications.
- //
- // We don't need to hang on to the CancellationTokenRegistration from register.
- // The CTS is cleaned up in StreamContext.DisposeAsync.
- //
- // TODO: Consider a better way to provide this notification. For perf we want to
- // make the ConnectionClosed CTS pay-for-play, and change this event to use
- // something that is more lightweight than a CTS.
- _context.StreamContext.ConnectionClosed.Register(static s =>
- {
- var stream = (Http3Stream)s!;
-
- if (!stream.IsCompleted)
- {
- // An error code value other than -1 indicates a value was set and the request didn't gracefully complete.
- var errorCode = stream._errorCodeFeature.Error;
- if (errorCode >= 0)
- {
- stream.AbortCore(new IOException(CoreStrings.HttpStreamResetByClient), (Http3ErrorCode)errorCode);
- }
- }
- }, this);
-
- // Make sure application func is completed before completing writer.
- await appCompletedTask;
- }
+ // At this point, assuming an error wasn't thrown, the stream's read-side is complete.
+ // Make sure application func is completed before completing writer.
+ await appCompletedTask;
try
{
@@ -687,6 +677,9 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
}
catch
{
+ var streamError = error as ConnectionAbortedException
+ ?? new ConnectionAbortedException("The stream has completed.", error!);
+
Abort(streamError, Http3ErrorCode.ProtocolError);
throw;
}
@@ -699,6 +692,9 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
ApplyCompletionFlag(StreamCompletionFlags.Completed);
_context.StreamLifetimeHandler.OnStreamCompleted(this);
+ // If we have a webtransport session on this stream, end it
+ _context.WebTransportSession?.OnClientConnectionClosed();
+
// TODO this is a hack for .NET 6 pooling.
//
// Pooling needs to happen after transports have been drained and stream
@@ -736,31 +732,30 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
}
}
+ _context.WebTransportSession?.OnClientConnectionClosed();
+
OnTrailersComplete();
return RequestBodyPipe.Writer.CompleteAsync();
}
private Task ProcessHttp3Stream<TContext>(IHttpApplication<TContext> application, in ReadOnlySequence<byte> payload, bool isCompleted) where TContext : notnull
{
- switch (_incomingFrame.Type)
- {
- case Http3FrameType.Data:
- return ProcessDataFrameAsync(payload);
- case Http3FrameType.Headers:
- return ProcessHeadersFrameAsync(application, payload, isCompleted);
- case Http3FrameType.Settings:
- case Http3FrameType.CancelPush:
- case Http3FrameType.GoAway:
- case Http3FrameType.MaxPushId:
- // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-7.2.4
- // These frames need to be on a control stream
- throw new Http3ConnectionErrorException(CoreStrings.FormatHttp3ErrorUnsupportedFrameOnRequestStream(_incomingFrame.FormattedType), Http3ErrorCode.UnexpectedFrame);
- case Http3FrameType.PushPromise:
- // The server should never receive push promise
- throw new Http3ConnectionErrorException(CoreStrings.FormatHttp3ErrorUnsupportedFrameOnServer(_incomingFrame.FormattedType), Http3ErrorCode.UnexpectedFrame);
- default:
- return ProcessUnknownFrameAsync();
- }
+ return _incomingFrame.Type switch
+ {
+ Http3FrameType.Data => ProcessDataFrameAsync(payload),
+ Http3FrameType.Headers => ProcessHeadersFrameAsync(application, payload, isCompleted),
+ // https://quicwg.org/base-drafts/draft-ietf-quic-http.html#section-7.2.4
+ // These frames need to be on a control stream
+ Http3FrameType.Settings or
+ Http3FrameType.CancelPush or
+ Http3FrameType.GoAway or
+ Http3FrameType.MaxPushId => throw new Http3ConnectionErrorException(
+ CoreStrings.FormatHttp3ErrorUnsupportedFrameOnRequestStream(_incomingFrame.FormattedType), Http3ErrorCode.UnexpectedFrame),
+ // The server should never receive push promise
+ Http3FrameType.PushPromise => throw new Http3ConnectionErrorException(
+ CoreStrings.FormatHttp3ErrorUnsupportedFrameOnServer(_incomingFrame.FormattedType), Http3ErrorCode.UnexpectedFrame),
+ _ => ProcessUnknownFrameAsync(),
+ };
}
private static Task ProcessUnknownFrameAsync()
@@ -821,7 +816,34 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
await OnEndStreamReceived();
}
- if (!_isMethodConnect && (_parsedPseudoHeaderFields & _mandatoryRequestPseudoHeaderFields) != _mandatoryRequestPseudoHeaderFields)
+ // https://datatracker.ietf.org/doc/html/draft-ietf-webtrans-http3/#section-3.3
+ if (_context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams && HttpRequestHeaders.HeaderProtocol.Count > 0)
+ {
+ if (!_isMethodConnect)
+ {
+ throw new Http3StreamErrorException(CoreStrings.Http3MethodMustBeConnectWhenUsingProtocolPseudoHeader, Http3ErrorCode.ProtocolError);
+ }
+
+ if (!_parsedPseudoHeaderFields.HasFlag(PseudoHeaderFields.Authority) || !_parsedPseudoHeaderFields.HasFlag(PseudoHeaderFields.Path))
+ {
+ throw new Http3StreamErrorException(CoreStrings.Http3MissingAuthorityOrPathPseudoHeaders, Http3ErrorCode.ProtocolError);
+ }
+
+ if (_context.ClientPeerSettings.H3Datagram != _context.ServerPeerSettings.H3Datagram)
+ {
+ throw new Http3StreamErrorException(CoreStrings.FormatHttp3DatagramStatusMismatch(_context.ClientPeerSettings.H3Datagram == 1, _context.ServerPeerSettings.H3Datagram == 1), Http3ErrorCode.SettingsError);
+ }
+
+ if (string.Equals(HttpRequestHeaders.HeaderProtocol, WebTransportSession.WebTransportProtocolValue, StringComparison.Ordinal))
+ {
+ // if the client supports the same version of WebTransport as Kestrel, make this a WebTransport request
+ if (((AspNetCore.Http.IHeaderDictionary)HttpRequestHeaders).TryGetValue(WebTransportSession.CurrentSuppportedVersion, out var version) && string.Equals(version, WebTransportSession.VersionEnabledIndicator, StringComparison.Ordinal))
+ {
+ IsWebTransportRequest = true;
+ }
+ }
+ }
+ else if (!_isMethodConnect && (_parsedPseudoHeaderFields & _mandatoryRequestPseudoHeaderFields) != _mandatoryRequestPseudoHeaderFields)
{
// All HTTP/3 requests MUST include exactly one valid value for the :method, :scheme, and :path pseudo-header
// fields, unless it is a CONNECT request. An HTTP request that omits mandatory pseudo-header
@@ -878,6 +900,8 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
_keepAlive = true;
_connectionAborted = false;
_userTrailers = null;
+ _isWebTransportSessionAccepted = false;
+ _isMethodConnect = false;
// Reset Http3 Features
_currentIHttpMinRequestBodyDataRateFeature = this;
@@ -898,7 +922,18 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
}
protected override MessageBody CreateMessageBody()
- => Http3MessageBody.For(this);
+ {
+ if (_messageBody != null)
+ {
+ _messageBody.Reset();
+ }
+ else
+ {
+ _messageBody = new Http3MessageBody(this);
+ }
+
+ return _messageBody;
+ }
protected override bool TryParseRequest(ReadResult result, out bool endConnection)
{
@@ -907,6 +942,10 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
// Suppress pseudo headers from the public headers collection.
HttpRequestHeaders.ClearPseudoRequestHeaders();
+ // Cookies should be merged into a single string separated by "; "
+ // https://datatracker.ietf.org/doc/html/draft-ietf-quic-http-34#section-4.1.1.2
+ HttpRequestHeaders.MergeCookies();
+
return true;
}
@@ -924,10 +963,10 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
return false;
}
- // CONNECT - :scheme and :path must be excluded
- if (Method == Http.HttpMethod.Connect)
+ // CONNECT - :scheme and :path must be excluded=
+ if (Method == HttpMethod.Connect && HttpRequestHeaders.HeaderProtocol.Count == 0)
{
- if (!string.IsNullOrEmpty(RequestHeaders[HeaderNames.Scheme]) || !string.IsNullOrEmpty(RequestHeaders[HeaderNames.Path]))
+ if (!string.IsNullOrEmpty(HttpRequestHeaders.HeaderScheme) || !string.IsNullOrEmpty(HttpRequestHeaders.HeaderPath))
{
Abort(new ConnectionAbortedException(CoreStrings.Http3ErrorConnectMustNotSendSchemeOrPath), Http3ErrorCode.ProtocolError);
return false;
@@ -968,7 +1007,7 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
// OPTIONS request for an "http" or "https" URI that does not include
// a path component; these MUST include a ":path" pseudo-header field
// with a value of '*'.
- if (Method == Http.HttpMethod.Options && path.Length == 1 && path[0] == '*')
+ if (Method == HttpMethod.Options && path.Length == 1 && path[0] == '*')
{
// * is stored in RawTarget only since HttpRequest expects Path to be empty or start with a /.
Path = string.Empty;
@@ -998,13 +1037,13 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
_methodText = HttpRequestHeaders.HeaderMethod.ToString();
Method = HttpUtilities.GetKnownMethod(_methodText);
- if (Method == Http.HttpMethod.None)
+ if (Method == HttpMethod.None)
{
Abort(new ConnectionAbortedException(CoreStrings.FormatHttp3ErrorMethodInvalid(_methodText)), Http3ErrorCode.ProtocolError);
return false;
}
- if (Method == Http.HttpMethod.Custom)
+ if (Method == HttpMethod.Custom)
{
if (HttpCharacters.IndexOfInvalidTokenChar(_methodText) >= 0)
{
@@ -1130,11 +1169,47 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
}
}
+ public override async ValueTask<IWebTransportSession> AcceptAsync(CancellationToken token)
+ {
+ if (_isWebTransportSessionAccepted)
+ {
+ throw new InvalidOperationException(CoreStrings.AcceptCannotBeCalledMultipleTimes);
+ }
+
+ if (!_context.ServiceContext.ServerOptions.EnableWebTransportAndH3Datagrams)
+ {
+ throw new InvalidOperationException(CoreStrings.WebTransportIsDisabled);
+ }
+
+ if (!IsWebTransportRequest)
+ {
+ throw new InvalidOperationException(CoreStrings.FormatFailedToNegotiateCommonWebTransportVersion(WebTransportSession.CurrentSuppportedVersion));
+ }
+
+ _isWebTransportSessionAccepted = true;
+
+ // version negotiation
+ var version = WebTransportSession.CurrentSuppportedVersion[WebTransportSession.SecPrefix.Length..];
+
+ _context.WebTransportSession = _context.Connection!.OpenNewWebTransportSession(this);
+
+ // send version negotiation resulting version
+ ResponseHeaders[WebTransportSession.VersionHeaderPrefix] = version;
+ await FlushAsync(token);
+
+ return _context.WebTransportSession;
+ }
+
/// <summary>
/// Used to kick off the request processing loop by derived classes.
/// </summary>
public abstract void Execute();
+ public void Abort()
+ {
+ Abort(new(), Http3ErrorCode.RequestCancelled);
+ }
+
protected enum RequestHeaderParsingState
{
Ready,
@@ -1153,19 +1228,10 @@ internal abstract partial class Http3Stream : HttpProtocol, IHttp3Stream, IHttpS
Path = 0x4,
Scheme = 0x8,
Status = 0x10,
+ Protocol = 0x20,
Unknown = 0x40000000
}
- [Flags]
- private enum StreamCompletionFlags
- {
- None = 0,
- EndStreamReceived = 1,
- AbortedRead = 2,
- Aborted = 4,
- Completed = 8,
- }
-
private static class GracefulCloseInitiator
{
public const int None = 0;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamContext.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamContext.cs
index 31a0ef2753..1b59bf0763 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamContext.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamContext.cs
@@ -6,10 +6,11 @@ using System.Net;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3StreamContext : HttpConnectionContext
+internal sealed class Http3StreamContext : HttpConnectionContext
{
public Http3StreamContext(
string connectionId,
@@ -21,19 +22,20 @@ internal class Http3StreamContext : HttpConnectionContext
MemoryPool<byte> memoryPool,
IPEndPoint? localEndPoint,
IPEndPoint? remoteEndPoint,
- IHttp3StreamLifetimeHandler streamLifetimeHandler,
ConnectionContext streamContext,
- Http3PeerSettings clientPeerSettings,
- Http3PeerSettings serverPeerSettings) : base(connectionId, protocols, altSvcHeader, connectionContext, serviceContext, connectionFeatures, memoryPool, localEndPoint, remoteEndPoint)
+ Http3Connection connection) : base(connectionId, protocols, altSvcHeader, connectionContext, serviceContext, connectionFeatures, memoryPool, localEndPoint, remoteEndPoint)
{
- StreamLifetimeHandler = streamLifetimeHandler;
+ StreamLifetimeHandler = connection._streamLifetimeHandler;
StreamContext = streamContext;
- ClientPeerSettings = clientPeerSettings;
- ServerPeerSettings = serverPeerSettings;
+ ClientPeerSettings = connection._clientSettings;
+ ServerPeerSettings = connection._serverSettings;
+ Connection = connection;
}
public IHttp3StreamLifetimeHandler StreamLifetimeHandler { get; }
public ConnectionContext StreamContext { get; }
public Http3PeerSettings ClientPeerSettings { get; }
public Http3PeerSettings ServerPeerSettings { get; }
+ public WebTransportSession? WebTransportSession { get; set; }
+ public Http3Connection Connection { get; }
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamErrorException.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamErrorException.cs
index f805925b99..0b10235585 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamErrorException.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamErrorException.cs
@@ -5,7 +5,7 @@ using System.Net.Http;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-internal class Http3StreamErrorException : Exception
+internal sealed class Http3StreamErrorException : Exception
{
public Http3StreamErrorException(string message, Http3ErrorCode errorCode)
: base($"HTTP/3 stream error ({errorCode}): {message}")
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamOfT.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamOfT.cs
index 47c6b5240c..406f30eebb 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamOfT.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/Http3StreamOfT.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
-class Http3Stream<TContext> : Http3Stream, IHostContextContainer<TContext> where TContext : notnull
+internal sealed class Http3Stream<TContext> : Http3Stream, IHostContextContainer<TContext> where TContext : notnull
{
private readonly IHttpApplication<TContext> _application;
@@ -21,13 +21,13 @@ class Http3Stream<TContext> : Http3Stream, IHostContextContainer<TContext> where
{
KestrelEventSource.Log.RequestQueuedStop(this, AspNetCore.Http.HttpProtocol.Http3);
- if (_requestHeaderParsingState == Http3Stream.RequestHeaderParsingState.Ready)
+ if (_requestHeaderParsingState == RequestHeaderParsingState.Ready)
{
_ = ProcessRequestAsync(_application);
}
else
{
- _ = base.ProcessRequestsAsync(_application);
+ _ = ProcessRequestsAsync(_application);
}
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3Stream.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3Stream.cs
index 590755fda1..379b5e9844 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3Stream.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3Stream.cs
@@ -36,6 +36,10 @@ internal interface IHttp3Stream
bool IsRequestStream { get; }
+ bool EndStreamReceived { get; }
+ bool IsAborted { get; }
+ bool IsCompleted { get; }
+
string TraceIdentifier { get; }
void Abort(ConnectionAbortedException abortReason, Http3ErrorCode errorCode);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3StreamLifetimeHandler.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3StreamLifetimeHandler.cs
index e960412a40..eeb1e31106 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3StreamLifetimeHandler.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/IHttp3StreamLifetimeHandler.cs
@@ -5,6 +5,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
internal interface IHttp3StreamLifetimeHandler
{
+ void OnUnidentifiedStreamReceived(Http3PendingStream stream);
void OnStreamCreated(IHttp3Stream stream);
void OnStreamHeaderReceived(IHttp3Stream stream);
void OnStreamCompleted(IHttp3Stream stream);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DecoderStreamReader.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DecoderStreamReader.cs
index 0283465f04..8804ea5d29 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DecoderStreamReader.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DecoderStreamReader.cs
@@ -6,7 +6,7 @@ using System.Net.Http.HPack;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.QPack;
-internal class DecoderStreamReader
+internal sealed class DecoderStreamReader
{
private enum State
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DynamicTable.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DynamicTable.cs
index 4c0e341a27..83194f1367 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DynamicTable.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/DynamicTable.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.QPack;
// The size of an entry is the sum of its name's length in bytes (as
// defined in Section 4.1.2), its value's length in bytes, and 32.
-internal class DynamicTable
+internal sealed class DynamicTable
{
// The encoder sends a Set Dynamic Table Capacity
// instruction(Section 4.3.1) with a non-zero capacity to begin using
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/EncoderStreamReader.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/EncoderStreamReader.cs
index 1552a5cdbe..086a8b77d5 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/EncoderStreamReader.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/QPack/EncoderStreamReader.cs
@@ -7,7 +7,7 @@ using System.Net.Http.QPack;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.QPack;
-internal class EncoderStreamReader
+internal sealed class EncoderStreamReader
{
private enum State
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/Http3/StreamCompletionFlags.cs b/src/Servers/Kestrel/Core/src/Internal/Http3/StreamCompletionFlags.cs
new file mode 100644
index 0000000000..78d1edb1f6
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Http3/StreamCompletionFlags.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+
+[Flags]
+internal enum StreamCompletionFlags
+{
+ None = 0,
+ EndStreamReceived = 1,
+ AbortedRead = 2,
+ Aborted = 4,
+ Completed = 8,
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/HttpConnection.cs b/src/Servers/Kestrel/Core/src/Internal/HttpConnection.cs
index c057a14124..89a28d23e4 100644
--- a/src/Servers/Kestrel/Core/src/Internal/HttpConnection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/HttpConnection.cs
@@ -15,10 +15,10 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class HttpConnection : ITimeoutHandler
+internal sealed class HttpConnection : ITimeoutHandler
{
// Use C#7.3's ReadOnlySpan<byte> optimization for static data https://vcsjones.com/2019/02/01/csharp-readonly-span-bytes-static/
- private static ReadOnlySpan<byte> Http2Id => new[] { (byte)'h', (byte)'2' };
+ private static ReadOnlySpan<byte> Http2Id => "h2"u8;
private readonly BaseHttpConnectionContext _context;
private readonly ISystemClock _systemClock;
@@ -127,13 +127,6 @@ internal class HttpConnection : ITimeoutHandler
{
previousState = _protocolSelectionState;
Debug.Assert(previousState != ProtocolSelectionState.Initializing, "The state should never be initializing");
-
- switch (_protocolSelectionState)
- {
- case ProtocolSelectionState.Selected:
- case ProtocolSelectionState.Aborted:
- break;
- }
}
switch (previousState)
@@ -153,13 +146,6 @@ internal class HttpConnection : ITimeoutHandler
{
previousState = _protocolSelectionState;
Debug.Assert(previousState != ProtocolSelectionState.Initializing, "The state should never be initializing");
-
- switch (_protocolSelectionState)
- {
- case ProtocolSelectionState.Selected:
- case ProtocolSelectionState.Aborted:
- break;
- }
}
switch (previousState)
diff --git a/src/Servers/Kestrel/Core/src/Internal/HttpMultiplexedConnectionContext.cs b/src/Servers/Kestrel/Core/src/Internal/HttpMultiplexedConnectionContext.cs
index 428500713f..a579e0e8e3 100644
--- a/src/Servers/Kestrel/Core/src/Internal/HttpMultiplexedConnectionContext.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/HttpMultiplexedConnectionContext.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class HttpMultiplexedConnectionContext : BaseHttpConnectionContext
+internal sealed class HttpMultiplexedConnectionContext : BaseHttpConnectionContext
{
public HttpMultiplexedConnectionContext(
string connectionId,
diff --git a/src/Servers/Kestrel/Core/src/Internal/HttpProtocolsFeature.cs b/src/Servers/Kestrel/Core/src/Internal/HttpProtocolsFeature.cs
index 5d47e2c5f5..23e4c4078a 100644
--- a/src/Servers/Kestrel/Core/src/Internal/HttpProtocolsFeature.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/HttpProtocolsFeature.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class HttpProtocolsFeature
+internal sealed class HttpProtocolsFeature
{
public HttpProtocolsFeature(HttpProtocols httpProtocols)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/BodyControl.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/BodyControl.cs
index 890199bb86..4558bcd10a 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/BodyControl.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/BodyControl.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class BodyControl
+internal sealed class BodyControl
{
private static readonly ThrowingWasUpgradedWriteOnlyStream _throwingResponseStream
= new ThrowingWasUpgradedWriteOnlyStream();
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionManager.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionManager.cs
index b4b844ab9f..9b27d4d8bc 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionManager.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionManager.cs
@@ -5,7 +5,7 @@ using System.Collections.Concurrent;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class ConnectionManager
+internal sealed class ConnectionManager
{
private long _lastConnectionId = long.MinValue;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionReference.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionReference.cs
index 690d6fa50c..c752d0a813 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionReference.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ConnectionReference.cs
@@ -5,7 +5,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class ConnectionReference
+internal sealed class ConnectionReference
{
private readonly long _id;
private readonly WeakReference<KestrelConnection> _weakReference;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Constants.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Constants.cs
index f5c647f947..d300c3d62d 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Constants.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Constants.cs
@@ -13,11 +13,6 @@ internal static class Constants
public const string DefaultServerAddress = "http://localhost:5000";
/// <summary>
- /// The endpoint Kestrel will bind to if nothing else is specified and a default certificate is available.
- /// </summary>
- public const string DefaultServerHttpsAddress = "https://localhost:5001";
-
- /// <summary>
/// Prefix of host name used to specify Unix sockets in the configuration.
/// </summary>
public const string UnixPipeHostPrefix = "unix:/";
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Disposable.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Disposable.cs
index d9fd0013ff..b818bed4cc 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Disposable.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Disposable.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
/// <summary>
/// Summary description for Disposable
/// </summary>
-internal class Disposable : IDisposable
+internal sealed class Disposable : IDisposable
{
private Action? _dispose;
private bool _disposedValue; // To detect redundant calls
@@ -16,7 +16,7 @@ internal class Disposable : IDisposable
_dispose = dispose;
}
- protected virtual void Dispose(bool disposing)
+ void Dispose(bool disposing)
{
if (!_disposedValue)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Heartbeat.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Heartbeat.cs
index 5384728796..c0ce110eee 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Heartbeat.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/Heartbeat.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class Heartbeat : IDisposable
+internal sealed class Heartbeat : IDisposable
{
public static readonly TimeSpan Interval = TimeSpan.FromSeconds(1);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HeartbeatManager.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HeartbeatManager.cs
index 7dd1472d5d..27239e5b40 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HeartbeatManager.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HeartbeatManager.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class HeartbeatManager : IHeartbeatHandler, ISystemClock
+internal sealed class HeartbeatManager : IHeartbeatHandler, ISystemClock
{
private readonly ConnectionManager _connectionManager;
private readonly Action<KestrelConnection> _walkCallback;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HttpUtilities.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HttpUtilities.cs
index 4ec46f086d..0ab5ff6f74 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HttpUtilities.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/HttpUtilities.cs
@@ -552,4 +552,4 @@ internal static partial class HttpUtilities
}
}
-internal record AltSvcHeader(string Value, byte[] RawBytes);
+internal sealed record AltSvcHeader(string Value, byte[] RawBytes);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnectionOfT.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnectionOfT.cs
index 03bf89e389..86eb944f96 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnectionOfT.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelConnectionOfT.cs
@@ -7,7 +7,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class KestrelConnection<T> : KestrelConnection, IThreadPoolWorkItem where T : BaseConnectionContext
+internal sealed class KestrelConnection<T> : KestrelConnection, IThreadPoolWorkItem where T : BaseConnectionContext
{
private readonly Func<T, Task> _connectionDelegate;
private readonly T _transportConnection;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.BadRequests.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.BadRequests.cs
new file mode 100644
index 0000000000..3903a32c21
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.BadRequests.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+
+internal sealed partial class KestrelTrace : ILogger
+{
+ public void ConnectionBadRequest(string connectionId, AspNetCore.Http.BadHttpRequestException ex)
+ {
+ BadRequestsLog.ConnectionBadRequest(_badRequestsLogger, connectionId, ex.Message, ex);
+ }
+
+ public void RequestProcessingError(string connectionId, Exception ex)
+ {
+ BadRequestsLog.RequestProcessingError(_badRequestsLogger, connectionId, ex);
+ }
+
+ public void RequestBodyMinimumDataRateNotSatisfied(string connectionId, string? traceIdentifier, double rate)
+ {
+ BadRequestsLog.RequestBodyMinimumDataRateNotSatisfied(_badRequestsLogger, connectionId, traceIdentifier, rate);
+ }
+
+ public void ResponseMinimumDataRateNotSatisfied(string connectionId, string? traceIdentifier)
+ {
+ BadRequestsLog.ResponseMinimumDataRateNotSatisfied(_badRequestsLogger, connectionId, traceIdentifier);
+ }
+
+ public void PossibleInvalidHttpVersionDetected(string connectionId, HttpVersion expectedHttpVersion, HttpVersion detectedHttpVersion)
+ {
+ if (_generalLogger.IsEnabled(LogLevel.Debug))
+ {
+ BadRequestsLog.PossibleInvalidHttpVersionDetected(_badRequestsLogger, connectionId, HttpUtilities.VersionToString(expectedHttpVersion), HttpUtilities.VersionToString(detectedHttpVersion));
+ }
+ }
+
+ private static partial class BadRequestsLog
+ {
+ [LoggerMessage(17, LogLevel.Debug, @"Connection id ""{ConnectionId}"" bad request data: ""{message}""", EventName = "ConnectionBadRequest")]
+ public static partial void ConnectionBadRequest(ILogger logger, string connectionId, string message, Microsoft.AspNetCore.Http.BadHttpRequestException ex);
+
+ [LoggerMessage(20, LogLevel.Debug, @"Connection id ""{ConnectionId}"" request processing ended abnormally.", EventName = "RequestProcessingError")]
+ public static partial void RequestProcessingError(ILogger logger, string connectionId, Exception ex);
+
+ [LoggerMessage(27, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the request timed out because it was not sent by the client at a minimum of {Rate} bytes/second.", EventName = "RequestBodyMinimumDataRateNotSatisfied")]
+ public static partial void RequestBodyMinimumDataRateNotSatisfied(ILogger logger, string connectionId, string? traceIdentifier, double rate);
+
+ [LoggerMessage(28, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the connection was closed because the response was not read by the client at the specified minimum data rate.", EventName = "ResponseMinimumDataRateNotSatisfied")]
+ public static partial void ResponseMinimumDataRateNotSatisfied(ILogger logger, string connectionId, string? traceIdentifier);
+
+ [LoggerMessage(54, LogLevel.Debug, @"Connection id ""{ConnectionId}"": Invalid content received on connection. Possible incorrect HTTP version detected. Expected {ExpectedHttpVersion} but received {DetectedHttpVersion}.", EventName = "PossibleInvalidHttpVersionDetected", SkipEnabledCheck = true)]
+ public static partial void PossibleInvalidHttpVersionDetected(ILogger logger, string connectionId, string expectedHttpVersion, string detectedHttpVersion);
+
+ // Highest shared ID is 63. New consecutive IDs start at 64
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Connections.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Connections.cs
new file mode 100644
index 0000000000..1d1ab4c359
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Connections.cs
@@ -0,0 +1,102 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+
+internal sealed partial class KestrelTrace : ILogger
+{
+ public void ConnectionStart(string connectionId)
+ {
+ ConnectionsLog.ConnectionStart(_connectionsLogger, connectionId);
+ }
+
+ public void ConnectionStop(string connectionId)
+ {
+ ConnectionsLog.ConnectionStop(_connectionsLogger, connectionId);
+ }
+
+ public void ConnectionPause(string connectionId)
+ {
+ ConnectionsLog.ConnectionPause(_connectionsLogger, connectionId);
+ }
+
+ public void ConnectionResume(string connectionId)
+ {
+ ConnectionsLog.ConnectionResume(_connectionsLogger, connectionId);
+ }
+
+ public void ConnectionKeepAlive(string connectionId)
+ {
+ ConnectionsLog.ConnectionKeepAlive(_connectionsLogger, connectionId);
+ }
+
+ public void ConnectionDisconnect(string connectionId)
+ {
+ ConnectionsLog.ConnectionDisconnect(_connectionsLogger, connectionId);
+ }
+
+ public void NotAllConnectionsClosedGracefully()
+ {
+ ConnectionsLog.NotAllConnectionsClosedGracefully(_connectionsLogger);
+ }
+
+ public void NotAllConnectionsAborted()
+ {
+ ConnectionsLog.NotAllConnectionsAborted(_connectionsLogger);
+ }
+
+ public void ConnectionRejected(string connectionId)
+ {
+ ConnectionsLog.ConnectionRejected(_connectionsLogger, connectionId);
+ }
+
+ public void ApplicationAbortedConnection(string connectionId, string traceIdentifier)
+ {
+ ConnectionsLog.ApplicationAbortedConnection(_connectionsLogger, connectionId, traceIdentifier);
+ }
+
+ public void ConnectionAccepted(string connectionId)
+ {
+ ConnectionsLog.ConnectionAccepted(_connectionsLogger, connectionId);
+ }
+
+ private static partial class ConnectionsLog
+ {
+ [LoggerMessage(1, LogLevel.Debug, @"Connection id ""{ConnectionId}"" started.", EventName = "ConnectionStart")]
+ public static partial void ConnectionStart(ILogger logger, string connectionId);
+
+ [LoggerMessage(2, LogLevel.Debug, @"Connection id ""{ConnectionId}"" stopped.", EventName = "ConnectionStop")]
+ public static partial void ConnectionStop(ILogger logger, string connectionId);
+
+ [LoggerMessage(4, LogLevel.Debug, @"Connection id ""{ConnectionId}"" paused.", EventName = "ConnectionPause")]
+ public static partial void ConnectionPause(ILogger logger, string connectionId);
+
+ [LoggerMessage(5, LogLevel.Debug, @"Connection id ""{ConnectionId}"" resumed.", EventName = "ConnectionResume")]
+ public static partial void ConnectionResume(ILogger logger, string connectionId);
+
+ [LoggerMessage(9, LogLevel.Debug, @"Connection id ""{ConnectionId}"" completed keep alive response.", EventName = "ConnectionKeepAlive")]
+ public static partial void ConnectionKeepAlive(ILogger logger, string connectionId);
+
+ [LoggerMessage(10, LogLevel.Debug, @"Connection id ""{ConnectionId}"" disconnecting.", EventName = "ConnectionDisconnect")]
+ public static partial void ConnectionDisconnect(ILogger logger, string connectionId);
+
+ [LoggerMessage(16, LogLevel.Debug, "Some connections failed to close gracefully during server shutdown.", EventName = "NotAllConnectionsClosedGracefully")]
+ public static partial void NotAllConnectionsClosedGracefully(ILogger logger);
+
+ [LoggerMessage(21, LogLevel.Debug, "Some connections failed to abort during server shutdown.", EventName = "NotAllConnectionsAborted")]
+ public static partial void NotAllConnectionsAborted(ILogger logger);
+
+ [LoggerMessage(24, LogLevel.Warning, @"Connection id ""{ConnectionId}"" rejected because the maximum number of concurrent connections has been reached.", EventName = "ConnectionRejected")]
+ public static partial void ConnectionRejected(ILogger logger, string connectionId);
+
+ [LoggerMessage(34, LogLevel.Information, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the application aborted the connection.", EventName = "ApplicationAbortedConnection")]
+ public static partial void ApplicationAbortedConnection(ILogger logger, string connectionId, string traceIdentifier);
+
+ [LoggerMessage(39, LogLevel.Debug, @"Connection id ""{ConnectionId}"" accepted.", EventName = "ConnectionAccepted")]
+ public static partial void ConnectionAccepted(ILogger logger, string connectionId);
+
+ // Highest shared ID is 63. New consecutive IDs start at 64
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.General.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.General.cs
new file mode 100644
index 0000000000..24c9784bc2
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.General.cs
@@ -0,0 +1,87 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+
+internal sealed partial class KestrelTrace : ILogger
+{
+ public void ApplicationError(string connectionId, string traceIdentifier, Exception ex)
+ {
+ GeneralLog.ApplicationError(_generalLogger, connectionId, traceIdentifier, ex);
+ }
+
+ public void ConnectionHeadResponseBodyWrite(string connectionId, long count)
+ {
+ GeneralLog.ConnectionHeadResponseBodyWrite(_generalLogger, connectionId, count);
+ }
+
+ public void HeartbeatSlow(TimeSpan heartbeatDuration, TimeSpan interval, DateTimeOffset now)
+ {
+ // while the heartbeat does loop over connections, this log is usually an indicator of threadpool starvation
+ GeneralLog.HeartbeatSlow(_generalLogger, now, heartbeatDuration, interval);
+ }
+
+ public void ApplicationNeverCompleted(string connectionId)
+ {
+ GeneralLog.ApplicationNeverCompleted(_generalLogger, connectionId);
+ }
+
+ public void RequestBodyStart(string connectionId, string traceIdentifier)
+ {
+ GeneralLog.RequestBodyStart(_generalLogger, connectionId, traceIdentifier);
+ }
+
+ public void RequestBodyDone(string connectionId, string traceIdentifier)
+ {
+ GeneralLog.RequestBodyDone(_generalLogger, connectionId, traceIdentifier);
+ }
+
+ public void RequestBodyNotEntirelyRead(string connectionId, string traceIdentifier)
+ {
+ GeneralLog.RequestBodyNotEntirelyRead(_generalLogger, connectionId, traceIdentifier);
+ }
+
+ public void RequestBodyDrainTimedOut(string connectionId, string traceIdentifier)
+ {
+ GeneralLog.RequestBodyDrainTimedOut(_generalLogger, connectionId, traceIdentifier);
+ }
+
+ public void InvalidResponseHeaderRemoved()
+ {
+ GeneralLog.InvalidResponseHeaderRemoved(_generalLogger);
+ }
+
+ private static partial class GeneralLog
+ {
+ [LoggerMessage(13, LogLevel.Error, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": An unhandled exception was thrown by the application.", EventName = "ApplicationError")]
+ public static partial void ApplicationError(ILogger logger, string connectionId, string traceIdentifier, Exception ex);
+
+ [LoggerMessage(18, LogLevel.Debug, @"Connection id ""{ConnectionId}"" write of ""{count}"" body bytes to non-body HEAD response.", EventName = "ConnectionHeadResponseBodyWrite")]
+ public static partial void ConnectionHeadResponseBodyWrite(ILogger logger, string connectionId, long count);
+
+ [LoggerMessage(22, LogLevel.Warning, @"As of ""{now}"", the heartbeat has been running for ""{heartbeatDuration}"" which is longer than ""{interval}"". This could be caused by thread pool starvation.", EventName = "HeartbeatSlow")]
+ public static partial void HeartbeatSlow(ILogger logger, DateTimeOffset now, TimeSpan heartbeatDuration, TimeSpan interval);
+
+ [LoggerMessage(23, LogLevel.Critical, @"Connection id ""{ConnectionId}"" application never completed.", EventName = "ApplicationNeverCompleted")]
+ public static partial void ApplicationNeverCompleted(ILogger logger, string connectionId);
+
+ [LoggerMessage(25, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": started reading request body.", EventName = "RequestBodyStart", SkipEnabledCheck = true)]
+ public static partial void RequestBodyStart(ILogger logger, string connectionId, string traceIdentifier);
+
+ [LoggerMessage(26, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": done reading request body.", EventName = "RequestBodyDone", SkipEnabledCheck = true)]
+ public static partial void RequestBodyDone(ILogger logger, string connectionId, string traceIdentifier);
+
+ [LoggerMessage(32, LogLevel.Information, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the application completed without reading the entire request body.", EventName = "RequestBodyNotEntirelyRead")]
+ public static partial void RequestBodyNotEntirelyRead(ILogger logger, string connectionId, string traceIdentifier);
+
+ [LoggerMessage(33, LogLevel.Information, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": automatic draining of the request body timed out after taking over 5 seconds.", EventName = "RequestBodyDrainTimedOut")]
+ public static partial void RequestBodyDrainTimedOut(ILogger logger, string connectionId, string traceIdentifier);
+
+ [LoggerMessage(41, LogLevel.Warning, "One or more of the following response headers have been removed because they are invalid for HTTP/2 and HTTP/3 responses: 'Connection', 'Transfer-Encoding', 'Keep-Alive', 'Upgrade' and 'Proxy-Connection'.", EventName = "InvalidResponseHeaderRemoved")]
+ public static partial void InvalidResponseHeaderRemoved(ILogger logger);
+
+ // Highest shared ID is 63. New consecutive IDs start at 64
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http2.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http2.cs
new file mode 100644
index 0000000000..84a7609f07
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http2.cs
@@ -0,0 +1,134 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+
+internal sealed partial class KestrelTrace : ILogger
+{
+ public void Http2ConnectionError(string connectionId, Http2ConnectionErrorException ex)
+ {
+ Http2Log.Http2ConnectionError(_http2Logger, connectionId, ex);
+ }
+
+ public void Http2StreamError(string connectionId, Http2StreamErrorException ex)
+ {
+ Http2Log.Http2StreamError(_http2Logger, connectionId, ex);
+ }
+
+ public void HPackDecodingError(string connectionId, int streamId, Exception ex)
+ {
+ Http2Log.HPackDecodingError(_http2Logger, connectionId, streamId, ex);
+ }
+
+ public void Http2StreamResetAbort(string traceIdentifier, Http2ErrorCode error, ConnectionAbortedException abortReason)
+ {
+ Http2Log.Http2StreamResetAbort(_http2Logger, traceIdentifier, error, abortReason);
+ }
+
+ public void Http2ConnectionClosing(string connectionId)
+ {
+ Http2Log.Http2ConnectionClosing(_http2Logger, connectionId);
+ }
+
+ public void Http2FrameReceived(string connectionId, Http2Frame frame)
+ {
+ if (_http2Logger.IsEnabled(LogLevel.Trace))
+ {
+ Http2Log.Http2FrameReceived(_http2Logger, connectionId, frame.Type, frame.StreamId, frame.PayloadLength, frame.ShowFlags());
+ }
+ }
+
+ public void HPackEncodingError(string connectionId, int streamId, Exception ex)
+ {
+ Http2Log.HPackEncodingError(_http2Logger, connectionId, streamId, ex);
+ }
+
+ public void Http2MaxConcurrentStreamsReached(string connectionId)
+ {
+ Http2Log.Http2MaxConcurrentStreamsReached(_http2Logger, connectionId);
+ }
+
+ public void Http2ConnectionClosed(string connectionId, int highestOpenedStreamId)
+ {
+ Http2Log.Http2ConnectionClosed(_http2Logger, connectionId, highestOpenedStreamId);
+ }
+
+ public void Http2FrameSending(string connectionId, Http2Frame frame)
+ {
+ if (_http2Logger.IsEnabled(LogLevel.Trace))
+ {
+ Http2Log.Http2FrameSending(_http2Logger, connectionId, frame.Type, frame.StreamId, frame.PayloadLength, frame.ShowFlags());
+ }
+ }
+
+ public void Http2QueueOperationsExceeded(string connectionId, ConnectionAbortedException ex)
+ {
+ Http2Log.Http2QueueOperationsExceeded(_http2Logger, connectionId, ex);
+ }
+
+ public void Http2UnexpectedDataRemaining(int streamId, string connectionId)
+ {
+ Http2Log.Http2UnexpectedDataRemaining(_http2Logger, streamId, connectionId);
+ }
+
+ public void Http2ConnectionQueueProcessingCompleted(string connectionId)
+ {
+ Http2Log.Http2ConnectionQueueProcessingCompleted(_http2Logger, connectionId);
+ }
+
+ public void Http2UnexpectedConnectionQueueError(string connectionId, Exception ex)
+ {
+ Http2Log.Http2UnexpectedConnectionQueueError(_http2Logger, connectionId, ex);
+ }
+
+ private static partial class Http2Log
+ {
+ [LoggerMessage(29, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HTTP/2 connection error.", EventName = "Http2ConnectionError")]
+ public static partial void Http2ConnectionError(ILogger logger, string connectionId, Http2ConnectionErrorException ex);
+
+ [LoggerMessage(30, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HTTP/2 stream error.", EventName = "Http2StreamError")]
+ public static partial void Http2StreamError(ILogger logger, string connectionId, Http2StreamErrorException ex);
+
+ [LoggerMessage(31, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HPACK decoding error while decoding headers for stream ID {StreamId}.", EventName = "HPackDecodingError")]
+ public static partial void HPackDecodingError(ILogger logger, string connectionId, int streamId, Exception ex);
+
+ [LoggerMessage(35, LogLevel.Debug, @"Trace id ""{TraceIdentifier}"": HTTP/2 stream error ""{error}"". A Reset is being sent to the stream.", EventName = "Http2StreamResetAbort")]
+ public static partial void Http2StreamResetAbort(ILogger logger, string traceIdentifier, Http2ErrorCode error, ConnectionAbortedException abortReason);
+
+ [LoggerMessage(36, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closing.", EventName = "Http2ConnectionClosing")]
+ public static partial void Http2ConnectionClosing(ILogger logger, string connectionId);
+
+ [LoggerMessage(37, LogLevel.Trace, @"Connection id ""{ConnectionId}"" received {type} frame for stream ID {id} with length {length} and flags {flags}.", EventName = "Http2FrameReceived", SkipEnabledCheck = true)]
+ public static partial void Http2FrameReceived(ILogger logger, string connectionId, Http2FrameType type, int id, int length, object flags);
+
+ [LoggerMessage(38, LogLevel.Information, @"Connection id ""{ConnectionId}"": HPACK encoding error while encoding headers for stream ID {StreamId}.", EventName = "HPackEncodingError")]
+ public static partial void HPackEncodingError(ILogger logger, string connectionId, int streamId, Exception ex);
+
+ [LoggerMessage(40, LogLevel.Debug, @"Connection id ""{ConnectionId}"" reached the maximum number of concurrent HTTP/2 streams allowed.", EventName = "Http2MaxConcurrentStreamsReached")]
+ public static partial void Http2MaxConcurrentStreamsReached(ILogger logger, string connectionId);
+
+ [LoggerMessage(48, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closed. The last processed stream ID was {HighestOpenedStreamId}.", EventName = "Http2ConnectionClosed")]
+ public static partial void Http2ConnectionClosed(ILogger logger, string connectionId, int highestOpenedStreamId);
+
+ [LoggerMessage(49, LogLevel.Trace, @"Connection id ""{ConnectionId}"" sending {type} frame for stream ID {id} with length {length} and flags {flags}.", EventName = "Http2FrameSending", SkipEnabledCheck = true)]
+ public static partial void Http2FrameSending(ILogger logger, string connectionId, Http2FrameType type, int id, int length, object flags);
+
+ [LoggerMessage(60, LogLevel.Critical, @"Connection id ""{ConnectionId}"" exceeded the output operations maximum queue size.", EventName = "Http2QueueOperationsExceeded")]
+ public static partial void Http2QueueOperationsExceeded(ILogger logger, string connectionId, ConnectionAbortedException ex);
+
+ [LoggerMessage(61, LogLevel.Critical, @"Stream {StreamId} on connection id ""{ConnectionId}"" observed an unexpected state where the streams output ended with data still remaining in the pipe.", EventName = "Http2UnexpectedDataRemaining")]
+ public static partial void Http2UnexpectedDataRemaining(ILogger logger, int streamId, string connectionId);
+
+ [LoggerMessage(62, LogLevel.Debug, @"The connection queue processing loop for {ConnectionId} completed.", EventName = "Http2ConnectionQueueProcessingCompleted")]
+ public static partial void Http2ConnectionQueueProcessingCompleted(ILogger logger, string connectionId);
+
+ [LoggerMessage(63, LogLevel.Critical, @"The event loop in connection {ConnectionId} failed unexpectedly.", EventName = "Http2UnexpectedConnectionQueueError")]
+ public static partial void Http2UnexpectedConnectionQueueError(ILogger logger, string connectionId, Exception ex);
+
+ // Highest shared ID is 63. New consecutive IDs start at 64
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http3.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http3.cs
new file mode 100644
index 0000000000..cca9dbd0eb
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.Http3.cs
@@ -0,0 +1,106 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net.Http;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+
+internal sealed partial class KestrelTrace : ILogger
+{
+ public void Http3ConnectionError(string connectionId, Http3ConnectionErrorException ex)
+ {
+ Http3Log.Http3ConnectionError(_http3Logger, connectionId, ex);
+ }
+
+ public void Http3ConnectionClosing(string connectionId)
+ {
+ Http3Log.Http3ConnectionClosing(_http3Logger, connectionId);
+ }
+
+ public void Http3ConnectionClosed(string connectionId, long? highestOpenedStreamId)
+ {
+ Http3Log.Http3ConnectionClosed(_http3Logger, connectionId, highestOpenedStreamId);
+ }
+
+ public void Http3StreamAbort(string traceIdentifier, Http3ErrorCode error, ConnectionAbortedException abortReason)
+ {
+ if (_http3Logger.IsEnabled(LogLevel.Debug))
+ {
+ Http3Log.Http3StreamAbort(_http3Logger, traceIdentifier, Http3Formatting.ToFormattedErrorCode(error), abortReason);
+ }
+ }
+
+ public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame)
+ {
+ if (_http3Logger.IsEnabled(LogLevel.Trace))
+ {
+ Http3Log.Http3FrameReceived(_http3Logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length);
+ }
+ }
+
+ public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame)
+ {
+ if (_http3Logger.IsEnabled(LogLevel.Trace))
+ {
+ Http3Log.Http3FrameSending(_http3Logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length);
+ }
+ }
+
+ public void Http3OutboundControlStreamError(string connectionId, Exception ex)
+ {
+ Http3Log.Http3OutboundControlStreamError(_http3Logger, connectionId, ex);
+ }
+
+ public void QPackDecodingError(string connectionId, long streamId, Exception ex)
+ {
+ Http3Log.QPackDecodingError(_http3Logger, connectionId, streamId, ex);
+ }
+
+ public void QPackEncodingError(string connectionId, long streamId, Exception ex)
+ {
+ Http3Log.QPackEncodingError(_http3Logger, connectionId, streamId, ex);
+ }
+
+ public void Http3GoAwayStreamId(string connectionId, long goAwayStreamId)
+ {
+ Http3Log.Http3GoAwayStreamId(_http3Logger, connectionId, goAwayStreamId);
+ }
+
+ private static partial class Http3Log
+ {
+ [LoggerMessage(42, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HTTP/3 connection error.", EventName = "Http3ConnectionError")]
+ public static partial void Http3ConnectionError(ILogger logger, string connectionId, Http3ConnectionErrorException ex);
+
+ [LoggerMessage(43, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closing.", EventName = "Http3ConnectionClosing")]
+ public static partial void Http3ConnectionClosing(ILogger logger, string connectionId);
+
+ [LoggerMessage(44, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closed. The last processed stream ID was {HighestOpenedStreamId}.", EventName = "Http3ConnectionClosed")]
+ public static partial void Http3ConnectionClosed(ILogger logger, string connectionId, long? highestOpenedStreamId);
+
+ [LoggerMessage(45, LogLevel.Debug, @"Trace id ""{TraceIdentifier}"": HTTP/3 stream error ""{error}"". An abort is being sent to the stream.", EventName = "Http3StreamAbort", SkipEnabledCheck = true)]
+ public static partial void Http3StreamAbort(ILogger logger, string traceIdentifier, string error, ConnectionAbortedException abortReason);
+
+ [LoggerMessage(46, LogLevel.Trace, @"Connection id ""{ConnectionId}"" received {type} frame for stream ID {id} with length {length}.", EventName = "Http3FrameReceived", SkipEnabledCheck = true)]
+ public static partial void Http3FrameReceived(ILogger logger, string connectionId, string type, long id, long length);
+
+ [LoggerMessage(47, LogLevel.Trace, @"Connection id ""{ConnectionId}"" sending {type} frame for stream ID {id} with length {length}.", EventName = "Http3FrameSending", SkipEnabledCheck = true)]
+ public static partial void Http3FrameSending(ILogger logger, string connectionId, string type, long id, long length);
+
+ [LoggerMessage(50, LogLevel.Debug, @"Connection id ""{ConnectionId}"": Unexpected error when initializing outbound control stream.", EventName = "Http3OutboundControlStreamError")]
+ public static partial void Http3OutboundControlStreamError(ILogger logger, string connectionId, Exception ex);
+
+ [LoggerMessage(51, LogLevel.Debug, @"Connection id ""{ConnectionId}"": QPACK decoding error while decoding headers for stream ID {StreamId}.", EventName = "QPackDecodingError")]
+ public static partial void QPackDecodingError(ILogger logger, string connectionId, long streamId, Exception ex);
+
+ [LoggerMessage(52, LogLevel.Information, @"Connection id ""{ConnectionId}"": QPACK encoding error while encoding headers for stream ID {StreamId}.", EventName = "QPackEncodingError")]
+ public static partial void QPackEncodingError(ILogger logger, string connectionId, long streamId, Exception ex);
+
+ [LoggerMessage(53, LogLevel.Debug, @"Connection id ""{ConnectionId}"": GOAWAY stream ID {GoAwayStreamId}.", EventName = "Http3GoAwayHighestOpenedStreamId")]
+ public static partial void Http3GoAwayStreamId(ILogger logger, string connectionId, long goAwayStreamId);
+
+ // Highest shared ID is 63. New consecutive IDs start at 64
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.cs
index f0335df430..e372c3f182 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/KestrelTrace.cs
@@ -1,11 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Net.Http;
-using Microsoft.AspNetCore.Connections;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
@@ -27,417 +22,6 @@ internal sealed partial class KestrelTrace : ILogger
_http3Logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Server.Kestrel.Http3");
}
- [LoggerMessage(39, LogLevel.Debug, @"Connection id ""{ConnectionId}"" accepted.", EventName = "ConnectionAccepted")]
- private static partial void ConnectionAccepted(ILogger logger, string connectionId);
-
- public void ConnectionAccepted(string connectionId)
- {
- ConnectionAccepted(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(1, LogLevel.Debug, @"Connection id ""{ConnectionId}"" started.", EventName = "ConnectionStart")]
- private static partial void ConnectionStart(ILogger logger, string connectionId);
-
- public void ConnectionStart(string connectionId)
- {
- ConnectionStart(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(2, LogLevel.Debug, @"Connection id ""{ConnectionId}"" stopped.", EventName = "ConnectionStop")]
- private static partial void ConnectionStop(ILogger logger, string connectionId);
-
- public void ConnectionStop(string connectionId)
- {
- ConnectionStop(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(4, LogLevel.Debug, @"Connection id ""{ConnectionId}"" paused.", EventName = "ConnectionPause")]
- private static partial void ConnectionPause(ILogger logger, string connectionId);
-
- public void ConnectionPause(string connectionId)
- {
- ConnectionPause(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(5, LogLevel.Debug, @"Connection id ""{ConnectionId}"" resumed.", EventName = "ConnectionResume")]
- private static partial void ConnectionResume(ILogger logger, string connectionId);
-
- public void ConnectionResume(string connectionId)
- {
- ConnectionResume(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(9, LogLevel.Debug, @"Connection id ""{ConnectionId}"" completed keep alive response.", EventName = "ConnectionKeepAlive")]
- private static partial void ConnectionKeepAlive(ILogger logger, string connectionId);
-
- public void ConnectionKeepAlive(string connectionId)
- {
- ConnectionKeepAlive(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(24, LogLevel.Warning, @"Connection id ""{ConnectionId}"" rejected because the maximum number of concurrent connections has been reached.", EventName = "ConnectionRejected")]
- private static partial void ConnectionRejected(ILogger logger, string connectionId);
-
- public void ConnectionRejected(string connectionId)
- {
- ConnectionRejected(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(10, LogLevel.Debug, @"Connection id ""{ConnectionId}"" disconnecting.", EventName = "ConnectionDisconnect")]
- private static partial void ConnectionDisconnect(ILogger logger, string connectionId);
-
- public void ConnectionDisconnect(string connectionId)
- {
- ConnectionDisconnect(_connectionsLogger, connectionId);
- }
-
- [LoggerMessage(13, LogLevel.Error, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": An unhandled exception was thrown by the application.", EventName = "ApplicationError")]
- private static partial void ApplicationError(ILogger logger, string connectionId, string traceIdentifier, Exception ex);
-
- public void ApplicationError(string connectionId, string traceIdentifier, Exception ex)
- {
- ApplicationError(_generalLogger, connectionId, traceIdentifier, ex);
- }
-
- [LoggerMessage(18, LogLevel.Debug, @"Connection id ""{ConnectionId}"" write of ""{count}"" body bytes to non-body HEAD response.", EventName = "ConnectionHeadResponseBodyWrite")]
- private static partial void ConnectionHeadResponseBodyWrite(ILogger logger, string connectionId, long count);
-
- public void ConnectionHeadResponseBodyWrite(string connectionId, long count)
- {
- ConnectionHeadResponseBodyWrite(_generalLogger, connectionId, count);
- }
-
- [LoggerMessage(16, LogLevel.Debug, "Some connections failed to close gracefully during server shutdown.", EventName = "NotAllConnectionsClosedGracefully")]
- private static partial void NotAllConnectionsClosedGracefully(ILogger logger);
-
- public void NotAllConnectionsClosedGracefully()
- {
- NotAllConnectionsClosedGracefully(_connectionsLogger);
- }
-
- [LoggerMessage(17, LogLevel.Debug, @"Connection id ""{ConnectionId}"" bad request data: ""{message}""", EventName = "ConnectionBadRequest")]
- private static partial void ConnectionBadRequest(ILogger logger, string connectionId, string message, Microsoft.AspNetCore.Http.BadHttpRequestException ex);
-
- public void ConnectionBadRequest(string connectionId, Microsoft.AspNetCore.Http.BadHttpRequestException ex)
- {
- ConnectionBadRequest(_badRequestsLogger, connectionId, ex.Message, ex);
- }
-
- [LoggerMessage(20, LogLevel.Debug, @"Connection id ""{ConnectionId}"" request processing ended abnormally.", EventName = "RequestProcessingError")]
- private static partial void RequestProcessingError(ILogger logger, string connectionId, Exception ex);
-
- public void RequestProcessingError(string connectionId, Exception ex)
- {
- RequestProcessingError(_badRequestsLogger, connectionId, ex);
- }
-
- [LoggerMessage(21, LogLevel.Debug, "Some connections failed to abort during server shutdown.", EventName = "NotAllConnectionsAborted")]
- private static partial void NotAllConnectionsAborted(ILogger logger);
-
- public void NotAllConnectionsAborted()
- {
- NotAllConnectionsAborted(_connectionsLogger);
- }
-
- [LoggerMessage(22, LogLevel.Warning, @"As of ""{now}"", the heartbeat has been running for ""{heartbeatDuration}"" which is longer than ""{interval}"". This could be caused by thread pool starvation.", EventName = "HeartbeatSlow")]
- private static partial void HeartbeatSlow(ILogger logger, DateTimeOffset now, TimeSpan heartbeatDuration, TimeSpan interval);
-
- public void HeartbeatSlow(TimeSpan heartbeatDuration, TimeSpan interval, DateTimeOffset now)
- {
- // while the heartbeat does loop over connections, this log is usually an indicator of threadpool starvation
- HeartbeatSlow(_generalLogger, now, heartbeatDuration, interval);
- }
-
- [LoggerMessage(23, LogLevel.Critical, @"Connection id ""{ConnectionId}"" application never completed.", EventName = "ApplicationNeverCompleted")]
- private static partial void ApplicationNeverCompleted(ILogger logger, string connectionId);
-
- public void ApplicationNeverCompleted(string connectionId)
- {
- ApplicationNeverCompleted(_generalLogger, connectionId);
- }
-
- [LoggerMessage(25, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": started reading request body.", EventName = "RequestBodyStart", SkipEnabledCheck = true)]
- private static partial void RequestBodyStart(ILogger logger, string connectionId, string traceIdentifier);
-
- public void RequestBodyStart(string connectionId, string traceIdentifier)
- {
- RequestBodyStart(_generalLogger, connectionId, traceIdentifier);
- }
-
- [LoggerMessage(26, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": done reading request body.", EventName = "RequestBodyDone", SkipEnabledCheck = true)]
- private static partial void RequestBodyDone(ILogger logger, string connectionId, string traceIdentifier);
-
- public void RequestBodyDone(string connectionId, string traceIdentifier)
- {
- RequestBodyDone(_generalLogger, connectionId, traceIdentifier);
- }
-
- [LoggerMessage(27, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the request timed out because it was not sent by the client at a minimum of {Rate} bytes/second.", EventName = "RequestBodyMinimumDataRateNotSatisfied")]
- private static partial void RequestBodyMinimumDataRateNotSatisfied(ILogger logger, string connectionId, string? traceIdentifier, double rate);
-
- public void RequestBodyMinimumDataRateNotSatisfied(string connectionId, string? traceIdentifier, double rate)
- {
- RequestBodyMinimumDataRateNotSatisfied(_badRequestsLogger, connectionId, traceIdentifier, rate);
- }
-
- [LoggerMessage(32, LogLevel.Information, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the application completed without reading the entire request body.", EventName = "RequestBodyNotEntirelyRead")]
- private static partial void RequestBodyNotEntirelyRead(ILogger logger, string connectionId, string traceIdentifier);
-
- public void RequestBodyNotEntirelyRead(string connectionId, string traceIdentifier)
- {
- RequestBodyNotEntirelyRead(_generalLogger, connectionId, traceIdentifier);
- }
-
- [LoggerMessage(33, LogLevel.Information, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": automatic draining of the request body timed out after taking over 5 seconds.", EventName = "RequestBodyDrainTimedOut")]
- private static partial void RequestBodyDrainTimedOut(ILogger logger, string connectionId, string traceIdentifier);
-
- public void RequestBodyDrainTimedOut(string connectionId, string traceIdentifier)
- {
- RequestBodyDrainTimedOut(_generalLogger, connectionId, traceIdentifier);
- }
-
- [LoggerMessage(28, LogLevel.Debug, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the connection was closed because the response was not read by the client at the specified minimum data rate.", EventName = "ResponseMinimumDataRateNotSatisfied")]
- private static partial void ResponseMinimumDataRateNotSatisfied(ILogger logger, string connectionId, string? traceIdentifier);
-
- public void ResponseMinimumDataRateNotSatisfied(string connectionId, string? traceIdentifier)
- {
- ResponseMinimumDataRateNotSatisfied(_badRequestsLogger, connectionId, traceIdentifier);
- }
-
- [LoggerMessage(34, LogLevel.Information, @"Connection id ""{ConnectionId}"", Request id ""{TraceIdentifier}"": the application aborted the connection.", EventName = "ApplicationAbortedConnection")]
- private static partial void ApplicationAbortedConnection(ILogger logger, string connectionId, string traceIdentifier);
-
- public void ApplicationAbortedConnection(string connectionId, string traceIdentifier)
- {
- ApplicationAbortedConnection(_connectionsLogger, connectionId, traceIdentifier);
- }
-
- [LoggerMessage(29, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HTTP/2 connection error.", EventName = "Http2ConnectionError")]
- private static partial void Http2ConnectionError(ILogger logger, string connectionId, Http2ConnectionErrorException ex);
-
- public void Http2ConnectionError(string connectionId, Http2ConnectionErrorException ex)
- {
- Http2ConnectionError(_http2Logger, connectionId, ex);
- }
-
- [LoggerMessage(36, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closing.", EventName = "Http2ConnectionClosing")]
- private static partial void Http2ConnectionClosing(ILogger logger, string connectionId);
-
- public void Http2ConnectionClosing(string connectionId)
- {
- Http2ConnectionClosing(_http2Logger, connectionId);
- }
-
- [LoggerMessage(48, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closed. The last processed stream ID was {HighestOpenedStreamId}.", EventName = "Http2ConnectionClosed")]
- private static partial void Http2ConnectionClosed(ILogger logger, string connectionId, int highestOpenedStreamId);
-
- public void Http2ConnectionClosed(string connectionId, int highestOpenedStreamId)
- {
- Http2ConnectionClosed(_http2Logger, connectionId, highestOpenedStreamId);
- }
-
- [LoggerMessage(30, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HTTP/2 stream error.", EventName = "Http2StreamError")]
- private static partial void Http2StreamError(ILogger logger, string connectionId, Http2StreamErrorException ex);
-
- public void Http2StreamError(string connectionId, Http2StreamErrorException ex)
- {
- Http2StreamError(_http2Logger, connectionId, ex);
- }
-
- [LoggerMessage(35, LogLevel.Debug, @"Trace id ""{TraceIdentifier}"": HTTP/2 stream error ""{error}"". A Reset is being sent to the stream.", EventName = "Http2StreamResetAbort")]
- private static partial void Http2StreamResetAbort(ILogger logger, string traceIdentifier, Http2ErrorCode error, ConnectionAbortedException abortReason);
-
- public void Http2StreamResetAbort(string traceIdentifier, Http2ErrorCode error, ConnectionAbortedException abortReason)
- {
- Http2StreamResetAbort(_http2Logger, traceIdentifier, error, abortReason);
- }
-
- [LoggerMessage(31, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HPACK decoding error while decoding headers for stream ID {StreamId}.", EventName = "HPackDecodingError")]
- private static partial void HPackDecodingError(ILogger logger, string connectionId, int streamId, Exception ex);
-
- public void HPackDecodingError(string connectionId, int streamId, Exception ex)
- {
- HPackDecodingError(_http2Logger, connectionId, streamId, ex);
- }
-
- [LoggerMessage(38, LogLevel.Information, @"Connection id ""{ConnectionId}"": HPACK encoding error while encoding headers for stream ID {StreamId}.", EventName = "HPackEncodingError")]
- private static partial void HPackEncodingError(ILogger logger, string connectionId, int streamId, Exception ex);
-
- public void HPackEncodingError(string connectionId, int streamId, Exception ex)
- {
- HPackEncodingError(_http2Logger, connectionId, streamId, ex);
- }
-
- [LoggerMessage(37, LogLevel.Trace, @"Connection id ""{ConnectionId}"" received {type} frame for stream ID {id} with length {length} and flags {flags}.", EventName = "Http2FrameReceived", SkipEnabledCheck = true)]
- private static partial void Http2FrameReceived(ILogger logger, string connectionId, Http2FrameType type, int id, int length, object flags);
-
- public void Http2FrameReceived(string connectionId, Http2Frame frame)
- {
- if (_http2Logger.IsEnabled(LogLevel.Trace))
- {
- Http2FrameReceived(_http2Logger, connectionId, frame.Type, frame.StreamId, frame.PayloadLength, frame.ShowFlags());
- }
- }
-
- [LoggerMessage(49, LogLevel.Trace, @"Connection id ""{ConnectionId}"" sending {type} frame for stream ID {id} with length {length} and flags {flags}.", EventName = "Http2FrameSending", SkipEnabledCheck = true)]
- private static partial void Http2FrameSending(ILogger logger, string connectionId, Http2FrameType type, int id, int length, object flags);
-
- public void Http2FrameSending(string connectionId, Http2Frame frame)
- {
- if (_http2Logger.IsEnabled(LogLevel.Trace))
- {
- Http2FrameSending(_http2Logger, connectionId, frame.Type, frame.StreamId, frame.PayloadLength, frame.ShowFlags());
- }
- }
-
- [LoggerMessage(40, LogLevel.Debug, @"Connection id ""{ConnectionId}"" reached the maximum number of concurrent HTTP/2 streams allowed.", EventName = "Http2MaxConcurrentStreamsReached")]
- private static partial void Http2MaxConcurrentStreamsReached(ILogger logger, string connectionId);
-
- public void Http2MaxConcurrentStreamsReached(string connectionId)
- {
- Http2MaxConcurrentStreamsReached(_http2Logger, connectionId);
- }
-
- [LoggerMessage(60, LogLevel.Critical, @"Connection id ""{ConnectionId}"" exceeded the output operations maximum queue size.", EventName = "Http2QueueOperationsExceeded")]
- private static partial void Http2QueueOperationsExceeded(ILogger logger, string connectionId, ConnectionAbortedException ex);
-
- public void Http2QueueOperationsExceeded(string connectionId, ConnectionAbortedException ex)
- {
- Http2QueueOperationsExceeded(_http2Logger, connectionId, ex);
- }
-
- [LoggerMessage(61, LogLevel.Critical, @"Stream {StreamId} on connection id ""{ConnectionId}"" observed an unexpected state where the streams output ended with data still remaining in the pipe.", EventName = "Http2UnexpectedDataRemaining")]
- private static partial void Http2UnexpectedDataRemaining(ILogger logger, int streamId, string connectionId);
-
- public void Http2UnexpectedDataRemaining(int streamId, string connectionId)
- {
- Http2UnexpectedDataRemaining(_http2Logger, streamId, connectionId);
- }
-
- [LoggerMessage(62, LogLevel.Debug, @"The connection queue processing loop for {ConnectionId} completed.", EventName = "Http2ConnectionQueueProcessingCompleted")]
- private static partial void Http2ConnectionQueueProcessingCompleted(ILogger logger, string connectionId);
-
- public void Http2ConnectionQueueProcessingCompleted(string connectionId)
- {
- Http2ConnectionQueueProcessingCompleted(_http2Logger, connectionId);
- }
-
- [LoggerMessage(63, LogLevel.Critical, @"The event loop in connection {ConnectionId} failed unexpectedly.", EventName = "Http2UnexpectedConnectionQueueError")]
- private static partial void Http2UnexpectedConnectionQueueError(ILogger logger, string connectionId, Exception ex);
-
- public void Http2UnexpectedConnectionQueueError(string connectionId, Exception ex)
- {
- Http2UnexpectedConnectionQueueError(_http2Logger, connectionId, ex);
- }
-
- [LoggerMessage(41, LogLevel.Warning, "One or more of the following response headers have been removed because they are invalid for HTTP/2 and HTTP/3 responses: 'Connection', 'Transfer-Encoding', 'Keep-Alive', 'Upgrade' and 'Proxy-Connection'.", EventName = "InvalidResponseHeaderRemoved")]
- private static partial void InvalidResponseHeaderRemoved(ILogger logger);
-
- public void InvalidResponseHeaderRemoved()
- {
- InvalidResponseHeaderRemoved(_generalLogger);
- }
-
- [LoggerMessage(42, LogLevel.Debug, @"Connection id ""{ConnectionId}"": HTTP/3 connection error.", EventName = "Http3ConnectionError")]
- private static partial void Http3ConnectionError(ILogger logger, string connectionId, Http3ConnectionErrorException ex);
-
- public void Http3ConnectionError(string connectionId, Http3ConnectionErrorException ex)
- {
- Http3ConnectionError(_http3Logger, connectionId, ex);
- }
-
- [LoggerMessage(43, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closing.", EventName = "Http3ConnectionClosing")]
- private static partial void Http3ConnectionClosing(ILogger logger, string connectionId);
-
- public void Http3ConnectionClosing(string connectionId)
- {
- Http3ConnectionClosing(_http3Logger, connectionId);
- }
-
- [LoggerMessage(44, LogLevel.Debug, @"Connection id ""{ConnectionId}"" is closed. The last processed stream ID was {HighestOpenedStreamId}.", EventName = "Http3ConnectionClosed")]
- private static partial void Http3ConnectionClosed(ILogger logger, string connectionId, long? highestOpenedStreamId);
-
- public void Http3ConnectionClosed(string connectionId, long? highestOpenedStreamId)
- {
- Http3ConnectionClosed(_http3Logger, connectionId, highestOpenedStreamId);
- }
-
- [LoggerMessage(45, LogLevel.Debug, @"Trace id ""{TraceIdentifier}"": HTTP/3 stream error ""{error}"". An abort is being sent to the stream.", EventName = "Http3StreamAbort", SkipEnabledCheck = true)]
- private static partial void Http3StreamAbort(ILogger logger, string traceIdentifier, string error, ConnectionAbortedException abortReason);
-
- public void Http3StreamAbort(string traceIdentifier, Http3ErrorCode error, ConnectionAbortedException abortReason)
- {
- if (_http3Logger.IsEnabled(LogLevel.Debug))
- {
- Http3StreamAbort(_http3Logger, traceIdentifier, Http3Formatting.ToFormattedErrorCode(error), abortReason);
- }
- }
-
- [LoggerMessage(46, LogLevel.Trace, @"Connection id ""{ConnectionId}"" received {type} frame for stream ID {id} with length {length}.", EventName = "Http3FrameReceived", SkipEnabledCheck = true)]
- private static partial void Http3FrameReceived(ILogger logger, string connectionId, string type, long id, long length);
-
- public void Http3FrameReceived(string connectionId, long streamId, Http3RawFrame frame)
- {
- if (_http3Logger.IsEnabled(LogLevel.Trace))
- {
- Http3FrameReceived(_http3Logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length);
- }
- }
-
- [LoggerMessage(47, LogLevel.Trace, @"Connection id ""{ConnectionId}"" sending {type} frame for stream ID {id} with length {length}.", EventName = "Http3FrameSending", SkipEnabledCheck = true)]
- private static partial void Http3FrameSending(ILogger logger, string connectionId, string type, long id, long length);
-
- public void Http3FrameSending(string connectionId, long streamId, Http3RawFrame frame)
- {
- if (_http3Logger.IsEnabled(LogLevel.Trace))
- {
- Http3FrameSending(_http3Logger, connectionId, Http3Formatting.ToFormattedType(frame.Type), streamId, frame.Length);
- }
- }
-
- [LoggerMessage(50, LogLevel.Debug, @"Connection id ""{ConnectionId}"": Unexpected error when initializing outbound control stream.", EventName = "Http3OutboundControlStreamError")]
- private static partial void Http3OutboundControlStreamError(ILogger logger, string connectionId, Exception ex);
-
- public void Http3OutboundControlStreamError(string connectionId, Exception ex)
- {
- Http3OutboundControlStreamError(_http3Logger, connectionId, ex);
- }
-
- [LoggerMessage(51, LogLevel.Debug, @"Connection id ""{ConnectionId}"": QPACK decoding error while decoding headers for stream ID {StreamId}.", EventName = "QPackDecodingError")]
- private static partial void QPackDecodingError(ILogger logger, string connectionId, long streamId, Exception ex);
-
- public void QPackDecodingError(string connectionId, long streamId, Exception ex)
- {
- QPackDecodingError(_http3Logger, connectionId, streamId, ex);
- }
-
- [LoggerMessage(52, LogLevel.Information, @"Connection id ""{ConnectionId}"": QPACK encoding error while encoding headers for stream ID {StreamId}.", EventName = "QPackEncodingError")]
- private static partial void QPackEncodingError(ILogger logger, string connectionId, long streamId, Exception ex);
-
- public void QPackEncodingError(string connectionId, long streamId, Exception ex)
- {
- QPackEncodingError(_http3Logger, connectionId, streamId, ex);
- }
-
- [LoggerMessage(53, LogLevel.Debug, @"Connection id ""{ConnectionId}"": GOAWAY stream ID {GoAwayStreamId}.", EventName = "Http3GoAwayHighestOpenedStreamId")]
- private static partial void Http3GoAwayStreamId(ILogger logger, string connectionId, long goAwayStreamId);
-
- public void Http3GoAwayStreamId(string connectionId, long goAwayStreamId)
- {
- Http3GoAwayStreamId(_http3Logger, connectionId, goAwayStreamId);
- }
-
- [LoggerMessage(54, LogLevel.Debug, @"Connection id ""{ConnectionId}"": Invalid content received on connection. Possible incorrect HTTP version detected. Expected {ExpectedHttpVersion} but received {DetectedHttpVersion}.", EventName = "PossibleInvalidHttpVersionDetected", SkipEnabledCheck = true)]
- private static partial void PossibleInvalidHttpVersionDetected(ILogger logger, string connectionId, string expectedHttpVersion, string detectedHttpVersion);
-
- public void PossibleInvalidHttpVersionDetected(string connectionId, HttpVersion expectedHttpVersion, HttpVersion detectedHttpVersion)
- {
- if (_generalLogger.IsEnabled(LogLevel.Debug))
- {
- PossibleInvalidHttpVersionDetected(_badRequestsLogger, connectionId, HttpUtilities.VersionToString(expectedHttpVersion), HttpUtilities.VersionToString(detectedHttpVersion));
- }
- }
-
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
=> _generalLogger.Log(logLevel, eventId, state, exception, formatter);
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/PipeWriterHelpers/TimingPipeFlusher.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/PipeWriterHelpers/TimingPipeFlusher.cs
index 53f88df7f8..2a9b886396 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/PipeWriterHelpers/TimingPipeFlusher.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/PipeWriterHelpers/TimingPipeFlusher.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure.PipeW
/// This wraps PipeWriter.FlushAsync() in a way that allows multiple awaiters making it safe to call from publicly
/// exposed Stream implementations while also tracking response data rate.
/// </summary>
-internal class TimingPipeFlusher
+internal sealed class TimingPipeFlusher
{
private PipeWriter _writer = default!;
private readonly ITimeoutControl? _timeoutControl;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ResourceCounter.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ResourceCounter.cs
index fc0a7f6222..5bbc5e9b20 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ResourceCounter.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ResourceCounter.cs
@@ -13,7 +13,7 @@ internal abstract class ResourceCounter
public static ResourceCounter Unlimited { get; } = new UnlimitedCounter();
public static ResourceCounter Quota(long amount) => new FiniteCounter(amount);
- private class UnlimitedCounter : ResourceCounter
+ private sealed class UnlimitedCounter : ResourceCounter
{
public override bool TryLockOne() => true;
public override void ReleaseOne()
@@ -21,7 +21,7 @@ internal abstract class ResourceCounter
}
}
- internal class FiniteCounter : ResourceCounter
+ internal sealed class FiniteCounter : ResourceCounter
{
private readonly long _max;
private long _count;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/StreamCloseAwaitable.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/StreamCloseAwaitable.cs
index bfce0d9ec1..b4b039378d 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/StreamCloseAwaitable.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/StreamCloseAwaitable.cs
@@ -6,7 +6,7 @@ using System.Runtime.CompilerServices;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class StreamCloseAwaitable : ICriticalNotifyCompletion
+internal sealed class StreamCloseAwaitable : ICriticalNotifyCompletion
{
private static readonly Action _callbackCompleted = () => { };
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/SystemClock.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/SystemClock.cs
index e10fe70184..662038772a 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/SystemClock.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/SystemClock.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
/// <summary>
/// Provides access to the normal system clock.
/// </summary>
-internal class SystemClock : ISystemClock
+internal sealed class SystemClock : ISystemClock
{
/// <summary>
/// Retrieves the current UTC system time.
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ThreadPoolAwaitable.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ThreadPoolAwaitable.cs
index aa3506de3e..53073778a1 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ThreadPoolAwaitable.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/ThreadPoolAwaitable.cs
@@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-internal class ThreadPoolAwaitable : ICriticalNotifyCompletion
+internal sealed class ThreadPoolAwaitable : ICriticalNotifyCompletion
{
public static readonly ThreadPoolAwaitable Instance = new ThreadPoolAwaitable();
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimeoutControl.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimeoutControl.cs
index e31f79b1a4..7ad002a1fd 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimeoutControl.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TimeoutControl.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2.FlowControl;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class TimeoutControl : ITimeoutControl, IConnectionTimeoutFeature
+internal sealed class TimeoutControl : ITimeoutControl, IConnectionTimeoutFeature
{
private readonly ITimeoutHandler _timeoutHandler;
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportConnectionManager.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportConnectionManager.cs
index 9d913fa0a5..63d7a48da8 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportConnectionManager.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportConnectionManager.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Connections;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class TransportConnectionManager
+internal sealed class TransportConnectionManager
{
private readonly ConnectionManager _connectionManager;
private readonly ConcurrentDictionary<long, ConnectionReference> _connectionReferences = new ConcurrentDictionary<long, ConnectionReference>();
diff --git a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportManager.cs b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportManager.cs
index 15ac6ec361..b1871b6d5c 100644
--- a/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportManager.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/Infrastructure/TransportManager.cs
@@ -3,15 +3,18 @@
#nullable enable
+using System.IO.Pipelines;
using System.Linq;
using System.Net;
+using System.Net.Security;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Https;
using Microsoft.AspNetCore.Server.Kestrel.Https.Internal;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
-internal class TransportManager
+internal sealed class TransportManager
{
private readonly List<ActiveTransport> _transports = new List<ActiveTransport>();
@@ -53,11 +56,35 @@ internal class TransportManager
var features = new FeatureCollection();
- // This should always be set in production, but it's not set for InMemory tests.
- // The transport will check if the feature is missing.
+ // HttpsOptions or HttpsCallbackOptions should always be set in production, but it's not set for InMemory tests.
+ // The QUIC transport will check if TlsConnectionCallbackOptions is missing.
if (listenOptions.HttpsOptions != null)
{
- features.Set(HttpsConnectionMiddleware.CreateHttp3Options(listenOptions.HttpsOptions));
+ var sslServerAuthenticationOptions = HttpsConnectionMiddleware.CreateHttp3Options(listenOptions.HttpsOptions);
+ features.Set(new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = sslServerAuthenticationOptions.ApplicationProtocols ?? new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = (context, cancellationToken) => ValueTask.FromResult(sslServerAuthenticationOptions),
+ OnConnectionState = null,
+ });
+ }
+ else if (listenOptions.HttpsCallbackOptions != null)
+ {
+ features.Set(new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = (context, cancellationToken) =>
+ {
+ return listenOptions.HttpsCallbackOptions.OnConnection(new TlsHandshakeCallbackContext
+ {
+ ClientHelloInfo = context.ClientHelloInfo,
+ CancellationToken = cancellationToken,
+ State = context.State,
+ Connection = new ConnectionContextAdapter(context.Connection),
+ });
+ },
+ OnConnectionState = listenOptions.HttpsCallbackOptions.OnConnectionState,
+ });
}
var transport = await _multiplexedTransportFactory.BindAsync(endPoint, features, cancellationToken).ConfigureAwait(false);
@@ -65,6 +92,49 @@ internal class TransportManager
return transport.EndPoint;
}
+ /// <summary>
+ /// TlsHandshakeCallbackContext.Connection is ConnectionContext but QUIC connection only implements BaseConnectionContext.
+ /// </summary>
+ private sealed class ConnectionContextAdapter : ConnectionContext
+ {
+ private readonly BaseConnectionContext _inner;
+
+ public ConnectionContextAdapter(BaseConnectionContext inner) => _inner = inner;
+
+ public override IDuplexPipe Transport
+ {
+ get => throw new NotSupportedException("Not supported by HTTP/3 connections.");
+ set => throw new NotSupportedException("Not supported by HTTP/3 connections.");
+ }
+ public override string ConnectionId
+ {
+ get => _inner.ConnectionId;
+ set => _inner.ConnectionId = value;
+ }
+ public override IFeatureCollection Features => _inner.Features;
+ public override IDictionary<object, object?> Items
+ {
+ get => _inner.Items;
+ set => _inner.Items = value;
+ }
+ public override EndPoint? LocalEndPoint
+ {
+ get => _inner.LocalEndPoint;
+ set => _inner.LocalEndPoint = value;
+ }
+ public override EndPoint? RemoteEndPoint
+ {
+ get => _inner.RemoteEndPoint;
+ set => _inner.RemoteEndPoint = value;
+ }
+ public override CancellationToken ConnectionClosed
+ {
+ get => _inner.ConnectionClosed;
+ set => _inner.ConnectionClosed = value;
+ }
+ public override ValueTask DisposeAsync() => _inner.DisposeAsync();
+ }
+
private void StartAcceptLoop<T>(IConnectionListener<T> connectionListener, Func<T, Task> connectionDelegate, EndpointConfig? endpointConfig) where T : BaseConnectionContext
{
var transportConnectionManager = new TransportConnectionManager(_serviceContext.ConnectionManager);
@@ -129,7 +199,7 @@ internal class TransportManager
}
}
- private class ActiveTransport : IAsyncDisposable
+ private sealed class ActiveTransport : IAsyncDisposable
{
public ActiveTransport(IConnectionListenerBase transport, Task acceptLoopTask, TransportConnectionManager transportConnectionManager, EndpointConfig? endpointConfig = null)
{
@@ -157,7 +227,7 @@ internal class TransportManager
}
}
- private class GenericConnectionListener : IConnectionListener<ConnectionContext>
+ private sealed class GenericConnectionListener : IConnectionListener<ConnectionContext>
{
private readonly IConnectionListener _connectionListener;
@@ -178,7 +248,7 @@ internal class TransportManager
=> _connectionListener.DisposeAsync();
}
- private class GenericMultiplexedConnectionListener : IConnectionListener<MultiplexedConnectionContext>
+ private sealed class GenericMultiplexedConnectionListener : IConnectionListener<MultiplexedConnectionContext>
{
private readonly IMultiplexedConnectionListener _multiplexedConnectionListener;
diff --git a/src/Servers/Kestrel/Core/src/Internal/KestrelServerImpl.cs b/src/Servers/Kestrel/Core/src/Internal/KestrelServerImpl.cs
index 8a37f6d6d2..1063849f60 100644
--- a/src/Servers/Kestrel/Core/src/Internal/KestrelServerImpl.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/KestrelServerImpl.cs
@@ -18,7 +18,7 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.Server.Kestrel.Core;
-internal class KestrelServerImpl : IServer
+internal sealed class KestrelServerImpl : IServer
{
private readonly ServerAddressesFeature _serverAddresses;
private readonly TransportManager _transportManager;
@@ -72,10 +72,7 @@ internal class KestrelServerImpl : IServer
IEnumerable<IMultiplexedConnectionListenerFactory>? multiplexedFactories,
ServiceContext serviceContext)
{
- if (transportFactories == null)
- {
- throw new ArgumentNullException(nameof(transportFactories));
- }
+ ArgumentNullException.ThrowIfNull(transportFactories);
_transportFactory = transportFactories.LastOrDefault();
_multiplexedTransportFactory = multiplexedFactories?.LastOrDefault();
@@ -98,14 +95,8 @@ internal class KestrelServerImpl : IServer
private static ServiceContext CreateServiceContext(IOptions<KestrelServerOptions> options, ILoggerFactory loggerFactory, DiagnosticSource? diagnosticSource)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(options);
+ ArgumentNullException.ThrowIfNull(loggerFactory);
var serverOptions = options.Value ?? new KestrelServerOptions();
var trace = new KestrelTrace(loggerFactory);
@@ -126,7 +117,7 @@ internal class KestrelServerImpl : IServer
{
Log = trace,
Scheduler = PipeScheduler.ThreadPool,
- HttpParser = new HttpParser<Http1ParsingHandler>(trace.IsEnabled(LogLevel.Information)),
+ HttpParser = new HttpParser<Http1ParsingHandler>(trace.IsEnabled(LogLevel.Information), serverOptions.DisableHttp1LineFeedTerminators),
SystemClock = heartbeatManager,
DateHeaderValueManager = dateHeaderValueManager,
ConnectionManager = connectionManager,
@@ -195,6 +186,8 @@ internal class KestrelServerImpl : IServer
// multiplexed transport factory, which happens if QUIC isn't supported.
var addAltSvcHeader = !options.DisableAltSvcHeader && _multiplexedTransportFactory != null;
+ var configuredEndpoint = options.EndPoint;
+
// Add the HTTP middleware as the terminal connection middleware
if (hasHttp1 || hasHttp2
|| options.Protocols == HttpProtocols.None) // TODO a test fails because it doesn't throw an exception in the right place
@@ -211,18 +204,27 @@ internal class KestrelServerImpl : IServer
// Add the connection limit middleware
connectionDelegate = EnforceConnectionLimit(connectionDelegate, Options.Limits.MaxConcurrentConnections, Trace);
- options.EndPoint = await _transportManager.BindAsync(options.EndPoint, connectionDelegate, options.EndpointConfig, onBindCancellationToken).ConfigureAwait(false);
+ options.EndPoint = await _transportManager.BindAsync(configuredEndpoint, connectionDelegate, options.EndpointConfig, onBindCancellationToken).ConfigureAwait(false);
}
if (hasHttp3 && _multiplexedTransportFactory is not null)
{
- options.UseHttp3Server(ServiceContext, application, options.Protocols, addAltSvcHeader);
- var multiplexedConnectionDelegate = ((IMultiplexedConnectionBuilder)options).Build();
+ // Check if a previous transport has changed the endpoint. If it has then the endpoint is dynamic and we can't guarantee it will work for other transports.
+ // For more details, see https://github.com/dotnet/aspnetcore/issues/42982
+ if (!configuredEndpoint.Equals(options.EndPoint))
+ {
+ Trace.LogError(CoreStrings.DynamicPortOnMultipleTransportsNotSupported);
+ }
+ else
+ {
+ options.UseHttp3Server(ServiceContext, application, options.Protocols, addAltSvcHeader);
+ var multiplexedConnectionDelegate = ((IMultiplexedConnectionBuilder)options).Build();
- // Add the connection limit middleware
- multiplexedConnectionDelegate = EnforceConnectionLimit(multiplexedConnectionDelegate, Options.Limits.MaxConcurrentConnections, Trace);
+ // Add the connection limit middleware
+ multiplexedConnectionDelegate = EnforceConnectionLimit(multiplexedConnectionDelegate, Options.Limits.MaxConcurrentConnections, Trace);
- options.EndPoint = await _transportManager.BindAsync(options.EndPoint, multiplexedConnectionDelegate, options, onBindCancellationToken).ConfigureAwait(false);
+ options.EndPoint = await _transportManager.BindAsync(configuredEndpoint, multiplexedConnectionDelegate, options, onBindCancellationToken).ConfigureAwait(false);
+ }
}
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/KestrelServerOptionsSetup.cs b/src/Servers/Kestrel/Core/src/Internal/KestrelServerOptionsSetup.cs
index f3085bb8e6..8d8c51d4d0 100644
--- a/src/Servers/Kestrel/Core/src/Internal/KestrelServerOptionsSetup.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/KestrelServerOptionsSetup.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class KestrelServerOptionsSetup : IConfigureOptions<KestrelServerOptions>
+internal sealed class KestrelServerOptionsSetup : IConfigureOptions<KestrelServerOptions>
{
private readonly IServiceProvider _services;
diff --git a/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs b/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs
index 8266eb8c33..baa0c085d0 100644
--- a/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/LoggerExtensions.cs
@@ -37,4 +37,7 @@ internal static partial class LoggerExtensions
[LoggerMessage(7, LogLevel.Error, "The certificate key file at '{CertificateKeyFilePath}' can not be found, contains malformed data or does not contain a PEM encoded key in PKCS8 format.", EventName = "MissingOrInvalidCertificateKeyFile")]
public static partial void FailedToLoadCertificateKey(this ILogger<KestrelServer> logger, string certificateKeyFilePath);
+
+ [LoggerMessage(8, LogLevel.Warning, "The ASP.NET Core developer certificate is not trusted. For information about trusting the ASP.NET Core developer certificate, see https://aka.ms/aspnet/https-trust-dev-cert.", EventName = "DeveloperCertificateNotTrusted")]
+ public static partial void DeveloperCertificateNotTrusted(this ILogger<KestrelServer> logger);
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/ServerAddressesCollection.cs b/src/Servers/Kestrel/Core/src/Internal/ServerAddressesCollection.cs
index b8ba315587..b6af449b66 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ServerAddressesCollection.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ServerAddressesCollection.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Hosting.Server.Features;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class ServerAddressesCollection : ICollection<string>
+internal sealed class ServerAddressesCollection : ICollection<string>
{
private readonly List<string> _addresses = new List<string>();
private readonly PublicServerAddressesCollection _publicCollection;
@@ -96,7 +96,7 @@ internal class ServerAddressesCollection : ICollection<string>
return GetEnumerator();
}
- private class PublicServerAddressesCollection : ICollection<string>
+ private sealed class PublicServerAddressesCollection : ICollection<string>
{
private readonly ServerAddressesCollection _addressesCollection;
private readonly object _addressesLock;
diff --git a/src/Servers/Kestrel/Core/src/Internal/ServerAddressesFeature.cs b/src/Servers/Kestrel/Core/src/Internal/ServerAddressesFeature.cs
index b6d074ca5d..996acfcfbf 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ServerAddressesFeature.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ServerAddressesFeature.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using Microsoft.AspNetCore.Hosting.Server.Features;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class ServerAddressesFeature : IServerAddressesFeature
+internal sealed class ServerAddressesFeature : IServerAddressesFeature
{
public ServerAddressesCollection InternalCollection { get; } = new ServerAddressesCollection();
diff --git a/src/Servers/Kestrel/Core/src/Internal/ServiceContext.cs b/src/Servers/Kestrel/Core/src/Internal/ServiceContext.cs
index d1c81a3a37..689ece3dbf 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ServiceContext.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ServiceContext.cs
@@ -11,7 +11,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
// Ideally this type should be readonly and initialized with a constructor.
// Tests use TestServiceContext which inherits from this type and sets properties.
// Changing this type would be a lot of work.
+#pragma warning disable CA1852 // Seal internal types
internal class ServiceContext
+#pragma warning restore CA1852 // Seal internal types
{
public KestrelTrace Log { get; set; } = default!;
diff --git a/src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs b/src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs
index d16cb633e4..650d311214 100644
--- a/src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs
@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class SniOptionsSelector
+internal sealed class SniOptionsSelector
{
private const string WildcardHost = "*";
private const string WildcardPrefix = "*.";
@@ -43,9 +43,11 @@ internal class SniOptionsSelector
foreach (var (name, sniConfig) in sniDictionary)
{
+ var (serverCert, fullChain) = certifcateConfigLoader.LoadCertificate(sniConfig.Certificate, $"{endpointName}:Sni:{name}");
var sslOptions = new SslServerAuthenticationOptions
{
- ServerCertificate = certifcateConfigLoader.LoadCertificate(sniConfig.Certificate, $"{endpointName}:Sni:{name}"),
+
+ ServerCertificate = serverCert,
EnabledSslProtocols = sniConfig.SslProtocols ?? fallbackHttpsOptions.SslProtocols,
CertificateRevocationCheckMode = fallbackHttpsOptions.CheckCertificateRevocation ? X509RevocationMode.Online : X509RevocationMode.NoCheck,
};
@@ -68,7 +70,7 @@ internal class SniOptionsSelector
{
// This might be do blocking IO but it'll resolve the certificate chain up front before any connections are
// made to the server
- sslOptions.ServerCertificateContext = SslStreamCertificateContext.Create((X509Certificate2)sslOptions.ServerCertificate, additionalCertificates: null);
+ sslOptions.ServerCertificateContext = SslStreamCertificateContext.Create((X509Certificate2)sslOptions.ServerCertificate, additionalCertificates: fullChain);
}
if (!certifcateConfigLoader.IsTestMock && sslOptions.ServerCertificate is X509Certificate2 cert2)
@@ -194,9 +196,10 @@ internal class SniOptionsSelector
ServerCertificate = sslOptions.ServerCertificate,
ServerCertificateContext = sslOptions.ServerCertificateContext,
ServerCertificateSelectionCallback = sslOptions.ServerCertificateSelectionCallback,
+ CertificateChainPolicy = sslOptions.CertificateChainPolicy,
};
- private class SniOptions
+ private sealed class SniOptions
{
public SniOptions(SslServerAuthenticationOptions sslOptions, HttpProtocols httpProtocols, ClientCertificateMode clientCertificateMode)
{
@@ -210,7 +213,7 @@ internal class SniOptionsSelector
public ClientCertificateMode ClientCertificateMode { get; }
}
- private class LongestStringFirstComparer : IComparer<string>
+ private sealed class LongestStringFirstComparer : IComparer<string>
{
public static LongestStringFirstComparer Instance { get; } = new LongestStringFirstComparer();
@@ -221,7 +224,15 @@ internal class SniOptionsSelector
public int Compare(string? x, string? y)
{
// Flip x and y to put the longest instead of the shortest string first in the SortedList.
- return y!.Length.CompareTo(x!.Length);
+ var lengthResult = y!.Length.CompareTo(x!.Length);
+ if (lengthResult != 0)
+ {
+ return lengthResult;
+ }
+ else
+ {
+ return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
+ }
}
}
}
diff --git a/src/Servers/Kestrel/Core/src/Internal/ThrowHelper.cs b/src/Servers/Kestrel/Core/src/Internal/ThrowHelper.cs
index 5e3c07d255..277ba6122b 100644
--- a/src/Servers/Kestrel/Core/src/Internal/ThrowHelper.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/ThrowHelper.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
@@ -6,7 +6,7 @@ using System.Runtime.CompilerServices;
namespace System.Buffers;
-internal class BuffersThrowHelper
+internal sealed class BuffersThrowHelper
{
public static void ThrowArgumentOutOfRangeException(ExceptionArgument argument)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs b/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs
index c51c4d5a6f..30265afdd3 100644
--- a/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs
+++ b/src/Servers/Kestrel/Core/src/Internal/TlsConnectionFeature.cs
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class TlsConnectionFeature : ITlsConnectionFeature, ITlsApplicationProtocolFeature, ITlsHandshakeFeature
+internal sealed class TlsConnectionFeature : ITlsConnectionFeature, ITlsApplicationProtocolFeature, ITlsHandshakeFeature
{
private readonly SslStream _sslStream;
private X509Certificate2? _clientCert;
diff --git a/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportSession.cs b/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportSession.cs
new file mode 100644
index 0000000000..6b0d2fdc7e
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportSession.cs
@@ -0,0 +1,192 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.Concurrent;
+using System.Diagnostics;
+using System.Net.Http;
+using System.Threading.Channels;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Connections.Features;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
+
+internal sealed class WebTransportSession : IWebTransportSession
+{
+ private static readonly IStreamDirectionFeature _outputStreamDirectionFeature = new DefaultStreamDirectionFeature(canRead: false, canWrite: true);
+
+ private readonly CancellationTokenRegistration _connectionClosedRegistration;
+
+ // stores all created streams (pending or accepted)
+ private readonly ConcurrentDictionary<long, WebTransportStream> _openStreams = new();
+ // stores all pending streams that have not been accepted yet
+ private readonly Channel<WebTransportStream> _pendingStreams;
+
+ private readonly Http3Connection _connection;
+ private readonly Http3Stream _connectStream = default!;
+ private bool _isClosing;
+
+ private static readonly ReadOnlyMemory<byte> OutputStreamHeader = new(new byte[] {
+ 0x40 /*quic variable-length integer length*/,
+ (byte)Http3StreamType.WebTransportUnidirectional,
+ 0x00 /*body*/});
+
+ internal const string WebTransportProtocolValue = "webtransport";
+ internal const string VersionEnabledIndicator = "1";
+ internal const string SecPrefix = "sec-webtransport-http3-";
+ internal const string VersionHeaderPrefix = $"{SecPrefix}draft";
+ internal const string CurrentSuppportedVersion = $"{VersionHeaderPrefix}02";
+
+ public long SessionId => _connectStream.StreamId;
+
+ internal WebTransportSession(Http3Connection connection, Http3Stream connectStream)
+ {
+ _connection = connection;
+ _connectStream = connectStream;
+ _isClosing = false;
+ // unbounded as limits to number of streams is enforced elsewhere
+ _pendingStreams = Channel.CreateUnbounded<WebTransportStream>();
+
+ // listener to abort if this connection is closed
+ _connectionClosedRegistration = connection._multiplexedContext.ConnectionClosed.Register(static state =>
+ {
+ var session = (WebTransportSession)state!;
+ session.OnClientConnectionClosed();
+ }, this);
+ }
+
+ void IWebTransportSession.Abort(int errorCode)
+ {
+ Abort(new(), (Http3ErrorCode)errorCode);
+ }
+
+ internal void OnClientConnectionClosed()
+ {
+ if (_isClosing)
+ {
+ return;
+ }
+
+ _isClosing = true;
+
+ _connectionClosedRegistration.Dispose();
+
+ lock (_openStreams)
+ {
+ foreach (var stream in _openStreams)
+ {
+ stream.Value.DisposeAsync().AsTask().GetAwaiter().GetResult();
+ }
+
+ _openStreams.Clear();
+ }
+
+ _pendingStreams.Writer.Complete();
+ }
+
+ internal void Abort(ConnectionAbortedException exception, Http3ErrorCode error)
+ {
+ if (_isClosing)
+ {
+ return;
+ }
+
+ _isClosing = true;
+
+ _connectionClosedRegistration.Dispose();
+
+ lock (_openStreams)
+ {
+ _connectStream.Abort(exception, error);
+ foreach (var stream in _openStreams)
+ {
+ if (exception.InnerException is not null)
+ {
+ stream.Value.Abort(new ConnectionAbortedException(exception.Message, exception.InnerException));
+ }
+ else
+ {
+ stream.Value.Abort(new ConnectionAbortedException(exception.Message));
+ }
+ }
+ _openStreams.Clear();
+ }
+
+ _pendingStreams.Writer.Complete();
+ }
+
+ public async ValueTask<ConnectionContext?> OpenUnidirectionalStreamAsync(CancellationToken cancellationToken)
+ {
+ if (_isClosing)
+ {
+ return null;
+ }
+ // create the stream
+ var features = new FeatureCollection();
+ features.Set(_outputStreamDirectionFeature);
+ var connectionContext = await _connection._multiplexedContext.ConnectAsync(features, cancellationToken);
+ var streamContext = _connection.CreateHttpStreamContext(connectionContext);
+ var stream = new WebTransportStream(streamContext, WebTransportStreamType.Output);
+
+ var success = _openStreams.TryAdd(stream.StreamId, stream);
+ Debug.Assert(success);
+
+ // send the stream header
+ // https://ietf-wg-webtrans.github.io/draft-ietf-webtrans-http3/draft-ietf-webtrans-http3.html#name-unidirectional-streams
+ await stream.Transport.Output.WriteAsync(OutputStreamHeader, cancellationToken);
+
+ return stream;
+ }
+
+ internal void AddStream(WebTransportStream stream)
+ {
+ if (_isClosing)
+ {
+ stream.Abort();
+ return;
+ }
+
+ var addedToOpenStreams = _openStreams.TryAdd(stream.StreamId, stream);
+
+ if (!addedToOpenStreams || !_pendingStreams.Writer.TryWrite(stream))
+ {
+ if (addedToOpenStreams)
+ {
+ _openStreams.Remove(stream.StreamId, out _);
+ }
+
+ stream.Abort(new ConnectionAbortedException(CoreStrings.WebTransportFailedToAddStreamToPendingQueue));
+ }
+ }
+
+ public async ValueTask<ConnectionContext?> AcceptStreamAsync(CancellationToken cancellationToken)
+ {
+ if (_isClosing)
+ {
+ return null;
+ }
+
+ try
+ {
+ return await _pendingStreams.Reader.ReadAsync(cancellationToken);
+ }
+ catch (ChannelClosedException)
+ {
+ return null;
+ }
+ }
+
+ internal bool TryRemoveStream(long streamId)
+ {
+ var success = _openStreams.Remove(streamId, out var stream);
+
+ if (success && stream is not null)
+ {
+ stream.DisposeAsync().AsTask().GetAwaiter().GetResult();
+ }
+
+ return success;
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStream.cs b/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStream.cs
new file mode 100644
index 0000000000..aa4b1cd885
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStream.cs
@@ -0,0 +1,120 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.IO.Pipelines;
+using System.Net.Http;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Connections.Features;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
+
+internal sealed class WebTransportStream : ConnectionContext, IStreamDirectionFeature, IStreamIdFeature, IConnectionItemsFeature
+{
+ private readonly CancellationTokenRegistration _connectionClosedRegistration;
+ private readonly bool _canWrite;
+ private readonly bool _canRead;
+ private readonly DuplexPipe _duplexPipe;
+ private readonly IFeatureCollection _features;
+ private readonly KestrelTrace _log;
+ private readonly long _streamId;
+ private IDictionary<object, object?>? _items;
+ private bool _isClosed;
+
+ public override string ConnectionId { get => _streamId.ToString(NumberFormatInfo.InvariantInfo); set => throw new NotSupportedException(); }
+
+ public override IDuplexPipe Transport { get => _duplexPipe; set => throw new NotSupportedException(); }
+
+ public override IFeatureCollection Features => _features;
+
+ public override IDictionary<object, object?> Items
+ {
+ get => _items ??= new ConnectionItems();
+ set => _items = value;
+ }
+
+ public long StreamId => _streamId;
+
+ public bool CanRead => _canRead && !_isClosed;
+
+ public bool CanWrite => _canWrite && !_isClosed;
+
+ internal WebTransportStream(Http3StreamContext context, WebTransportStreamType type)
+ {
+ _canRead = type != WebTransportStreamType.Output;
+ _canWrite = type != WebTransportStreamType.Input;
+ _log = context.ServiceContext.Log;
+
+ var streamIdFeature = context.ConnectionFeatures.GetRequiredFeature<IStreamIdFeature>();
+ _streamId = streamIdFeature!.StreamId;
+
+ _features = context.ConnectionFeatures;
+ _features.Set<IStreamDirectionFeature>(this);
+ _features.Set<IStreamIdFeature>(this);
+ _features.Set<IConnectionItemsFeature>(this);
+
+ _duplexPipe = new DuplexPipe(context.Transport.Input, context.Transport.Output);
+
+ // will not trigger if closed only of of the directions of a stream. Stream must be fully
+ // ended before this will be called. Then it will be considered an abort
+ _connectionClosedRegistration = context.StreamContext.ConnectionClosed.Register(static state =>
+ {
+ var localContext = (Http3StreamContext)state!;
+ // get the stream id here again to minimize allocations that would have been created
+ // if we pass stuff via a value tuple
+ var streamId = localContext.ConnectionFeatures.GetRequiredFeature<IStreamIdFeature>().StreamId;
+
+ localContext.WebTransportSession?.TryRemoveStream(streamId);
+ }, context);
+
+ ConnectionClosed = _connectionClosedRegistration.Token;
+ }
+
+ public override void Abort(ConnectionAbortedException abortReason)
+ {
+ if (_isClosed)
+ {
+ return;
+ }
+
+ _isClosed = true;
+
+ _log.Http3StreamAbort(ConnectionId, Http3ErrorCode.InternalError, abortReason);
+
+ if (_canRead)
+ {
+ _duplexPipe.Input.Complete(abortReason);
+ }
+
+ if (_canWrite)
+ {
+ _duplexPipe.Output.Complete(abortReason);
+ }
+ }
+
+ public override async ValueTask DisposeAsync()
+ {
+ if (_isClosed)
+ {
+ return;
+ }
+
+ _isClosed = true;
+
+ await _connectionClosedRegistration.DisposeAsync();
+
+ if (_canRead)
+ {
+ await _duplexPipe.Input.CompleteAsync();
+ }
+
+ if (_canWrite)
+ {
+ await _duplexPipe.Output.CompleteAsync();
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStreamType.cs b/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStreamType.cs
new file mode 100644
index 0000000000..b471733ab5
--- /dev/null
+++ b/src/Servers/Kestrel/Core/src/Internal/WebTransport/WebTransportStreamType.cs
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
+
+/// <summary>
+/// Represents the different types of WebTransport streams.
+/// </summary>
+internal enum WebTransportStreamType
+{
+ /// <summary>
+ /// Represents a bidirectional WebTransport stream.
+ /// </summary>
+ Bidirectional,
+ /// <summary>
+ /// Represents a unidirectional inbound WebTransport stream.
+ /// </summary>
+ Input,
+ /// <summary>
+ /// Represents a unidirectional outbound WebTransport stream.
+ /// </summary>
+ Output,
+}
diff --git a/src/Servers/Kestrel/Core/src/KestrelConfigurationLoader.cs b/src/Servers/Kestrel/Core/src/KestrelConfigurationLoader.cs
index 8119db9df4..e81340454f 100644
--- a/src/Servers/Kestrel/Core/src/KestrelConfigurationLoader.cs
+++ b/src/Servers/Kestrel/Core/src/KestrelConfigurationLoader.cs
@@ -102,10 +102,7 @@ public class KestrelConfigurationLoader
/// </summary>
public KestrelConfigurationLoader Endpoint(IPAddress address, int port, Action<ListenOptions> configure)
{
- if (address == null)
- {
- throw new ArgumentNullException(nameof(address));
- }
+ ArgumentNullException.ThrowIfNull(address);
return Endpoint(new IPEndPoint(address, port), configure);
}
@@ -120,14 +117,8 @@ public class KestrelConfigurationLoader
/// </summary>
public KestrelConfigurationLoader Endpoint(IPEndPoint endPoint, Action<ListenOptions> configure)
{
- if (endPoint == null)
- {
- throw new ArgumentNullException(nameof(endPoint));
- }
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(endPoint);
+ ArgumentNullException.ThrowIfNull(configure);
EndpointsToAdd.Add(() =>
{
@@ -149,10 +140,7 @@ public class KestrelConfigurationLoader
/// </summary>
public KestrelConfigurationLoader LocalhostEndpoint(int port, Action<ListenOptions> configure)
{
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
EndpointsToAdd.Add(() =>
{
@@ -172,10 +160,7 @@ public class KestrelConfigurationLoader
/// </summary>
public KestrelConfigurationLoader AnyIPEndpoint(int port, Action<ListenOptions> configure)
{
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
EndpointsToAdd.Add(() =>
{
@@ -195,18 +180,12 @@ public class KestrelConfigurationLoader
/// </summary>
public KestrelConfigurationLoader UnixSocketEndpoint(string socketPath, Action<ListenOptions> configure)
{
- if (socketPath == null)
- {
- throw new ArgumentNullException(nameof(socketPath));
- }
+ ArgumentNullException.ThrowIfNull(socketPath);
if (socketPath.Length == 0 || socketPath[0] != '/')
{
throw new ArgumentException(CoreStrings.UnixSocketPathMustBeAbsolute, nameof(socketPath));
}
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
EndpointsToAdd.Add(() =>
{
@@ -226,10 +205,7 @@ public class KestrelConfigurationLoader
/// </summary>
public KestrelConfigurationLoader HandleEndpoint(ulong handle, Action<ListenOptions> configure)
{
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
EndpointsToAdd.Add(() =>
{
@@ -353,8 +329,9 @@ public class KestrelConfigurationLoader
}
// A cert specified directly on the endpoint overrides any defaults.
- httpsOptions.ServerCertificate = CertificateConfigLoader.LoadCertificate(endpoint.Certificate, endpoint.Name)
- ?? httpsOptions.ServerCertificate;
+ var (serverCert, fullChain) = CertificateConfigLoader.LoadCertificate(endpoint.Certificate, endpoint.Name);
+ httpsOptions.ServerCertificate = serverCert ?? httpsOptions.ServerCertificate;
+ httpsOptions.ServerCertificateChain = fullChain ?? httpsOptions.ServerCertificateChain;
if (httpsOptions.ServerCertificate == null && httpsOptions.ServerCertificateSelector == null)
{
@@ -423,7 +400,7 @@ public class KestrelConfigurationLoader
{
if (ConfigurationReader.Certificates.TryGetValue("Default", out var defaultCertConfig))
{
- var defaultCert = CertificateConfigLoader.LoadCertificate(defaultCertConfig, "Default");
+ var (defaultCert, _ /* cert chain */) = CertificateConfigLoader.LoadCertificate(defaultCertConfig, "Default");
if (defaultCert != null)
{
DefaultCertificateConfig = defaultCertConfig;
@@ -493,10 +470,9 @@ public class KestrelConfigurationLoader
private bool TryGetCertificatePath([NotNullWhen(true)] out string? path)
{
- // This will go away when we implement
- // https://github.com/aspnet/Hosting/issues/1294
+ // See https://github.com/aspnet/Hosting/issues/1294
var appData = Environment.GetEnvironmentVariable("APPDATA");
- var home = Environment.GetEnvironmentVariable("HOME");
+ var home = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
var basePath = appData != null ? Path.Combine(appData, "ASP.NET", "https") : null;
basePath = basePath ?? (home != null ? Path.Combine(home, ".aspnet", "https") : null);
path = basePath != null ? Path.Combine(basePath, $"{HostEnvironment.ApplicationName}.pfx") : null;
diff --git a/src/Servers/Kestrel/Core/src/KestrelServerOptions.cs b/src/Servers/Kestrel/Core/src/KestrelServerOptions.cs
index ec009ae0df..f31880e891 100644
--- a/src/Servers/Kestrel/Core/src/KestrelServerOptions.cs
+++ b/src/Servers/Kestrel/Core/src/KestrelServerOptions.cs
@@ -25,6 +25,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core;
/// </summary>
public class KestrelServerOptions
{
+ internal const string DisableHttp1LineFeedTerminatorsSwitchKey = "Microsoft.AspNetCore.Server.Kestrel.DisableHttp1LineFeedTerminators";
+
// internal to fast-path header decoding when RequestHeaderEncodingSelector is unchanged.
internal static readonly Func<string, Encoding?> DefaultHeaderEncodingSelector = _ => null;
@@ -158,6 +160,42 @@ public class KestrelServerOptions
internal bool IsDevCertLoaded { get; set; }
/// <summary>
+ /// Internal AppContext switch to toggle the WebTransport and HTTP/3 datagrams experiemental features.
+ /// </summary>
+ private bool? _enableWebTransportAndH3Datagrams;
+ internal bool EnableWebTransportAndH3Datagrams
+ {
+ get
+ {
+ if (!_enableWebTransportAndH3Datagrams.HasValue)
+ {
+ _enableWebTransportAndH3Datagrams = AppContext.TryGetSwitch("Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams", out var enabled) && enabled;
+ }
+
+ return _enableWebTransportAndH3Datagrams.Value;
+ }
+ set => _enableWebTransportAndH3Datagrams = value;
+ }
+
+ /// <summary>
+ /// Internal AppContext switch to toggle whether a request line can end with LF only instead of CR/LF.
+ /// </summary>
+ private bool? _disableHttp1LineFeedTerminators;
+ internal bool DisableHttp1LineFeedTerminators
+ {
+ get
+ {
+ if (!_disableHttp1LineFeedTerminators.HasValue)
+ {
+ _disableHttp1LineFeedTerminators = AppContext.TryGetSwitch(DisableHttp1LineFeedTerminatorsSwitchKey, out var disabled) && disabled;
+ }
+
+ return _disableHttp1LineFeedTerminators.Value;
+ }
+ set => _disableHttp1LineFeedTerminators = value;
+ }
+
+ /// <summary>
/// Specifies a configuration Action to run for each newly created endpoint. Calling this again will replace
/// the prior action.
/// </summary>
@@ -267,16 +305,13 @@ public class KestrelServerOptions
Debug.Assert(status.FailureMessage != null, "Status with a failure result must have a message.");
logger.DeveloperCertificateFirstRun(status.FailureMessage);
- // Now that we've displayed a warning in the logs so that the user gets a notification that a prompt might appear, try
- // and access the certificate key, which might trigger a prompt.
- status = CertificateManager.Instance.CheckCertificateState(DefaultCertificate, interactive: true);
- if (!status.Success)
- {
- logger.BadDeveloperCertificateState();
- }
+ // Prevent binding to HTTPS if the certificate is not valid (avoid the prompt)
+ DefaultCertificate = null;
+ }
+ else if (!CertificateManager.Instance.IsTrusted(DefaultCertificate))
+ {
+ logger.DeveloperCertificateNotTrusted();
}
-
- logger.LocatedDevelopmentCertificate(DefaultCertificate);
}
else
{
@@ -345,10 +380,7 @@ public class KestrelServerOptions
/// </summary>
public void Listen(IPAddress address, int port, Action<ListenOptions> configure)
{
- if (address == null)
- {
- throw new ArgumentNullException(nameof(address));
- }
+ ArgumentNullException.ThrowIfNull(address);
Listen(new IPEndPoint(address, port), configure);
}
@@ -385,14 +417,8 @@ public class KestrelServerOptions
/// </summary>
public void Listen(EndPoint endPoint, Action<ListenOptions> configure)
{
- if (endPoint == null)
- {
- throw new ArgumentNullException(nameof(endPoint));
- }
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(endPoint);
+ ArgumentNullException.ThrowIfNull(configure);
var listenOptions = new ListenOptions(endPoint);
ApplyEndpointDefaults(listenOptions);
@@ -412,10 +438,7 @@ public class KestrelServerOptions
/// </summary>
public void ListenLocalhost(int port, Action<ListenOptions> configure)
{
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
var listenOptions = new LocalhostListenOptions(port);
ApplyEndpointDefaults(listenOptions);
@@ -433,10 +456,7 @@ public class KestrelServerOptions
/// </summary>
public void ListenAnyIP(int port, Action<ListenOptions> configure)
{
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
var listenOptions = new AnyIPListenOptions(port);
ApplyEndpointDefaults(listenOptions);
@@ -458,19 +478,13 @@ public class KestrelServerOptions
/// </summary>
public void ListenUnixSocket(string socketPath, Action<ListenOptions> configure)
{
- if (socketPath == null)
- {
- throw new ArgumentNullException(nameof(socketPath));
- }
+ ArgumentNullException.ThrowIfNull(socketPath);
if (!Path.IsPathRooted(socketPath))
{
throw new ArgumentException(CoreStrings.UnixSocketPathMustBeAbsolute, nameof(socketPath));
}
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
var listenOptions = new ListenOptions(socketPath);
ApplyEndpointDefaults(listenOptions);
@@ -492,10 +506,7 @@ public class KestrelServerOptions
/// </summary>
public void ListenHandle(ulong handle, Action<ListenOptions> configure)
{
- if (configure == null)
- {
- throw new ArgumentNullException(nameof(configure));
- }
+ ArgumentNullException.ThrowIfNull(configure);
var listenOptions = new ListenOptions(handle);
ApplyEndpointDefaults(listenOptions);
diff --git a/src/Servers/Kestrel/Core/src/ListenOptions.cs b/src/Servers/Kestrel/Core/src/ListenOptions.cs
index d22777aa61..e8dabefde6 100644
--- a/src/Servers/Kestrel/Core/src/ListenOptions.cs
+++ b/src/Servers/Kestrel/Core/src/ListenOptions.cs
@@ -109,6 +109,7 @@ public class ListenOptions : IConnectionBuilder, IMultiplexedConnectionBuilder
internal bool IsTls { get; set; }
internal HttpsConnectionAdapterOptions? HttpsOptions { get; set; }
+ internal TlsHandshakeCallbackOptions? HttpsCallbackOptions { get; set; }
/// <summary>
/// Gets the name of this endpoint to display on command-line when the web server starts.
diff --git a/src/Servers/Kestrel/Core/src/ListenOptionsHttpsExtensions.cs b/src/Servers/Kestrel/Core/src/ListenOptionsHttpsExtensions.cs
index c0c644a1a3..7ea815e051 100644
--- a/src/Servers/Kestrel/Core/src/ListenOptionsHttpsExtensions.cs
+++ b/src/Servers/Kestrel/Core/src/ListenOptionsHttpsExtensions.cs
@@ -125,10 +125,7 @@ public static class ListenOptionsHttpsExtensions
/// <returns>The <see cref="ListenOptions"/>.</returns>
public static ListenOptions UseHttps(this ListenOptions listenOptions, X509Certificate2 serverCertificate)
{
- if (serverCertificate == null)
- {
- throw new ArgumentNullException(nameof(serverCertificate));
- }
+ ArgumentNullException.ThrowIfNull(serverCertificate);
return listenOptions.UseHttps(options =>
{
@@ -146,15 +143,9 @@ public static class ListenOptionsHttpsExtensions
public static ListenOptions UseHttps(this ListenOptions listenOptions, X509Certificate2 serverCertificate,
Action<HttpsConnectionAdapterOptions> configureOptions)
{
- if (serverCertificate == null)
- {
- throw new ArgumentNullException(nameof(serverCertificate));
- }
+ ArgumentNullException.ThrowIfNull(serverCertificate);
- if (configureOptions == null)
- {
- throw new ArgumentNullException(nameof(configureOptions));
- }
+ ArgumentNullException.ThrowIfNull(configureOptions);
return listenOptions.UseHttps(options =>
{
@@ -171,10 +162,7 @@ public static class ListenOptionsHttpsExtensions
/// <returns>The <see cref="ListenOptions"/>.</returns>
public static ListenOptions UseHttps(this ListenOptions listenOptions, Action<HttpsConnectionAdapterOptions> configureOptions)
{
- if (configureOptions == null)
- {
- throw new ArgumentNullException(nameof(configureOptions));
- }
+ ArgumentNullException.ThrowIfNull(configureOptions);
var options = new HttpsConnectionAdapterOptions();
listenOptions.KestrelServerOptions.ApplyHttpsDefaults(options);
@@ -254,10 +242,6 @@ public static class ListenOptionsHttpsExtensions
/// <returns>The <see cref="ListenOptions"/>.</returns>
public static ListenOptions UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
{
- if (listenOptions.Protocols.HasFlag(HttpProtocols.Http3))
- {
- throw new NotSupportedException($"{nameof(UseHttps)} with {nameof(ServerOptionsSelectionCallback)} is not supported with HTTP/3.");
- }
return listenOptions.UseHttps(new TlsHandshakeCallbackOptions()
{
OnConnection = context => serverOptionsSelectionCallback(context.SslStream, context.ClientHelloInfo, context.State, context.CancellationToken),
@@ -285,18 +269,17 @@ public static class ListenOptionsHttpsExtensions
throw new ArgumentException($"{nameof(TlsHandshakeCallbackOptions.OnConnection)} must not be null.");
}
- if (listenOptions.Protocols.HasFlag(HttpProtocols.Http3))
- {
- throw new NotSupportedException($"{nameof(UseHttps)} with {nameof(TlsHandshakeCallbackOptions)} is not supported with HTTP/3.");
- }
-
var loggerFactory = listenOptions.KestrelServerOptions?.ApplicationServices.GetRequiredService<ILoggerFactory>() ?? NullLoggerFactory.Instance;
listenOptions.IsTls = true;
+ listenOptions.HttpsCallbackOptions = callbackOptions;
+
listenOptions.Use(next =>
{
- // Set the list of protocols from listen options
+ // Set the list of protocols from listen options.
+ // Set it inside Use delegate so Protocols and UseHttps can be called out of order.
callbackOptions.HttpProtocols = listenOptions.Protocols;
+
var middleware = new HttpsConnectionMiddleware(next, callbackOptions, loggerFactory);
return middleware.OnConnectionAsync;
});
diff --git a/src/Servers/Kestrel/Core/src/LocalhostListenOptions.cs b/src/Servers/Kestrel/Core/src/LocalhostListenOptions.cs
index eead334950..0836952fdc 100644
--- a/src/Servers/Kestrel/Core/src/LocalhostListenOptions.cs
+++ b/src/Servers/Kestrel/Core/src/LocalhostListenOptions.cs
@@ -72,6 +72,7 @@ internal sealed class LocalhostListenOptions : ListenOptions
DisableAltSvcHeader = DisableAltSvcHeader,
IsTls = IsTls,
HttpsOptions = HttpsOptions,
+ HttpsCallbackOptions = HttpsCallbackOptions,
EndpointConfig = EndpointConfig
};
diff --git a/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj b/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj
index 857de5ef42..29990edece 100644
--- a/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj
+++ b/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj
@@ -11,6 +11,8 @@
<DefineConstants>$(DefineConstants);KESTREL</DefineConstants>
<NoWarn>$(NoWarn);IDE0060</NoWarn><!-- APIs in HTTP3 are work in progress and produce these warnings frequently-->
<IsTrimmable>true</IsTrimmable>
+ <EnablePreviewFeatures>true</EnablePreviewFeatures>
+ <GenerateRequiresPreviewFeaturesAttribute>false</GenerateRequiresPreviewFeaturesAttribute>
</PropertyGroup>
<ItemGroup>
@@ -20,12 +22,14 @@
<Compile Include="$(SharedSourceRoot)CertificateGeneration\**\*.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" />
<Compile Include="$(SharedSourceRoot)UrlDecoder\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\InternalHeaderNames.cs"/>
<Compile Include="$(SharedSourceRoot)Buffers\**\*.cs" LinkBase="Internal\Infrastructure\PipeWriterHelpers" />
<Compile Include="$(SharedSourceRoot)runtime\*.cs" Link="Shared\runtime\%(Filename)%(Extension)" />
<Compile Include="$(SharedSourceRoot)runtime\Http2\**\*.cs" Link="Shared\runtime\Http2\%(Filename)%(Extension)" />
<Compile Include="$(SharedSourceRoot)runtime\Http3\**\*.cs" Link="Shared\runtime\Http3\%(Filename)%(Extension)" />
<Compile Include="$(SharedSourceRoot)Hpack\**\*.cs" Link="Shared\Hpack\%(Filename)%(Extension)" />
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" />
+ <Compile Include="$(SharedSourceRoot)CancellationTokenSourcePool.cs" />
<Compile Include="$(RepoRoot)src\Shared\TaskToApm.cs" Link="Internal\TaskToApm.cs" />
</ItemGroup>
diff --git a/src/Servers/Kestrel/Core/src/Middleware/ConnectionLimitMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/ConnectionLimitMiddleware.cs
index 6633abedc3..d717a7717d 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/ConnectionLimitMiddleware.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/ConnectionLimitMiddleware.cs
@@ -7,7 +7,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class ConnectionLimitMiddleware<T> where T : BaseConnectionContext
+internal sealed class ConnectionLimitMiddleware<T> where T : BaseConnectionContext
{
private readonly Func<T, Task> _next;
private readonly ResourceCounter _concurrentConnectionCounter;
@@ -49,7 +49,7 @@ internal class ConnectionLimitMiddleware<T> where T : BaseConnectionContext
}
}
- private class ConnectionReleasor : IDecrementConcurrentConnectionCountFeature
+ private sealed class ConnectionReleasor : IDecrementConcurrentConnectionCountFeature
{
private readonly ResourceCounter _concurrentConnectionCounter;
private bool _connectionReleased;
diff --git a/src/Servers/Kestrel/Core/src/Middleware/HttpConnectionMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/HttpConnectionMiddleware.cs
index b47bc6f5d1..877027e9ce 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/HttpConnectionMiddleware.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/HttpConnectionMiddleware.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class HttpConnectionMiddleware<TContext> where TContext : notnull
+internal sealed class HttpConnectionMiddleware<TContext> where TContext : notnull
{
private readonly ServiceContext _serviceContext;
private readonly IHttpApplication<TContext> _application;
diff --git a/src/Servers/Kestrel/Core/src/Middleware/HttpMultiplexedConnectionMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/HttpMultiplexedConnectionMiddleware.cs
index c0d74aa1c8..8fcbd2fe2f 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/HttpMultiplexedConnectionMiddleware.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/HttpMultiplexedConnectionMiddleware.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class HttpMultiplexedConnectionMiddleware<TContext> where TContext : notnull
+internal sealed class HttpMultiplexedConnectionMiddleware<TContext> where TContext : notnull
{
private readonly ServiceContext _serviceContext;
private readonly IHttpApplication<TContext> _application;
diff --git a/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs
index 439da6460f..7d2f10a9ac 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/HttpsConnectionMiddleware.cs
@@ -12,6 +12,7 @@ using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
@@ -21,7 +22,7 @@ using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.Server.Kestrel.Https.Internal;
-internal class HttpsConnectionMiddleware
+internal sealed class HttpsConnectionMiddleware
{
private const string EnableWindows81Http2 = "Microsoft.AspNetCore.Server.Kestrel.EnableWindows81Http2";
@@ -53,10 +54,7 @@ internal class HttpsConnectionMiddleware
public HttpsConnectionMiddleware(ConnectionDelegate next, HttpsConnectionAdapterOptions options, ILoggerFactory loggerFactory)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
+ ArgumentNullException.ThrowIfNull(options);
if (options.ServerCertificate == null && options.ServerCertificateSelector == null)
{
@@ -103,7 +101,7 @@ internal class HttpsConnectionMiddleware
// This might be do blocking IO but it'll resolve the certificate chain up front before any connections are
// made to the server
- _serverCertificateContext = SslStreamCertificateContext.Create(certificate, additionalCertificates: null);
+ _serverCertificateContext = SslStreamCertificateContext.Create(certificate, additionalCertificates: options.ServerCertificateChain);
}
var remoteCertificateValidationCallback = _options.ClientCertificateMode == ClientCertificateMode.NoCertificate ?
@@ -513,7 +511,7 @@ internal class HttpsConnectionMiddleware
var sslServerAuthenticationOptions = new SslServerAuthenticationOptions
{
ServerCertificate = httpsOptions.ServerCertificate,
- ApplicationProtocols = new List<SslApplicationProtocol>() { SslApplicationProtocol.Http3, new SslApplicationProtocol("h3-29") },
+ ApplicationProtocols = new List<SslApplicationProtocol>() { SslApplicationProtocol.Http3 },
CertificateRevocationCheckMode = httpsOptions.CheckCertificateRevocation ? X509RevocationMode.Online : X509RevocationMode.NoCheck,
};
diff --git a/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs b/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs
index 1444ef8327..af3164df75 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/Internal/LoggingStream.cs
@@ -76,28 +76,40 @@ internal sealed class LoggingStream : Stream
public override int Read(byte[] buffer, int offset, int count)
{
int read = _inner.Read(buffer, offset, count);
- Log("Read", new ReadOnlySpan<byte>(buffer, offset, read));
+ if (count > 0)
+ {
+ Log("Read", new ReadOnlySpan<byte>(buffer, offset, read));
+ }
return read;
}
public override int Read(Span<byte> destination)
{
int read = _inner.Read(destination);
- Log("Read", destination.Slice(0, read));
+ if (!destination.IsEmpty)
+ {
+ Log("Read", destination.Slice(0, read));
+ }
return read;
}
public override async Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
{
int read = await _inner.ReadAsync(buffer.AsMemory(offset, count), cancellationToken);
- Log("ReadAsync", new ReadOnlySpan<byte>(buffer, offset, read));
+ if (count > 0)
+ {
+ Log("ReadAsync", new ReadOnlySpan<byte>(buffer, offset, read));
+ }
return read;
}
public override async ValueTask<int> ReadAsync(Memory<byte> destination, CancellationToken cancellationToken = default)
{
int read = await _inner.ReadAsync(destination, cancellationToken);
- Log("ReadAsync", destination.Span.Slice(0, read));
+ if (!destination.IsEmpty)
+ {
+ Log("ReadAsync", destination.Span.Slice(0, read));
+ }
return read;
}
diff --git a/src/Servers/Kestrel/Core/src/Middleware/LoggingConnectionMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/LoggingConnectionMiddleware.cs
index f2c1b4dc29..d3935b3b99 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/LoggingConnectionMiddleware.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/LoggingConnectionMiddleware.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class LoggingConnectionMiddleware
+internal sealed class LoggingConnectionMiddleware
{
private readonly ConnectionDelegate _next;
private readonly ILogger _logger;
diff --git a/src/Servers/Kestrel/Core/src/Middleware/LoggingDuplexPipe.cs b/src/Servers/Kestrel/Core/src/Middleware/LoggingDuplexPipe.cs
index d2ce6ff394..7ac0909f06 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/LoggingDuplexPipe.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/LoggingDuplexPipe.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.IO.Pipelines;
@@ -6,10 +6,13 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class LoggingDuplexPipe : DuplexPipeStreamAdapter<LoggingStream>
+internal sealed class LoggingDuplexPipe : DuplexPipeStreamAdapter<LoggingStream>
{
+ private static readonly StreamPipeReaderOptions _defaultReaderOptions = new(useZeroByteReads: true);
+ private static readonly StreamPipeWriterOptions _defaultWriterOptions = new();
+
public LoggingDuplexPipe(IDuplexPipe transport, ILogger logger) :
- base(transport, stream => new LoggingStream(stream, logger))
+ base(transport, _defaultReaderOptions, _defaultWriterOptions, stream => new LoggingStream(stream, logger))
{
}
}
diff --git a/src/Servers/Kestrel/Core/src/Middleware/LoggingMultiplexedConnectionMiddleware.cs b/src/Servers/Kestrel/Core/src/Middleware/LoggingMultiplexedConnectionMiddleware.cs
index df91dca255..63b1e75fff 100644
--- a/src/Servers/Kestrel/Core/src/Middleware/LoggingMultiplexedConnectionMiddleware.cs
+++ b/src/Servers/Kestrel/Core/src/Middleware/LoggingMultiplexedConnectionMiddleware.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
-internal class LoggingMultiplexedConnectionMiddleware
+internal sealed class LoggingMultiplexedConnectionMiddleware
{
private readonly MultiplexedConnectionDelegate _multiplexedNext;
private readonly ILogger _logger;
@@ -29,7 +29,7 @@ internal class LoggingMultiplexedConnectionMiddleware
/// Wrap the initial <see cref="MultiplexedConnectionContext"/>.
/// ConnectionContext's returned from ConnectAsync and AcceptAsync will then be wrapped.
/// </summary>
- private class LoggingMultiplexedConnectionContext : MultiplexedConnectionContext
+ private sealed class LoggingMultiplexedConnectionContext : MultiplexedConnectionContext
{
private readonly MultiplexedConnectionContext _inner;
private readonly ILogger _logger;
@@ -83,7 +83,7 @@ internal class LoggingMultiplexedConnectionMiddleware
/// <summary>
/// Wraps transport with <see cref="LoggingDuplexPipe"/>.
/// </summary>
- private class LoggingConnectionContext : ConnectionContext
+ private sealed class LoggingConnectionContext : ConnectionContext
{
private readonly ConnectionContext _inner;
private readonly ILogger _logger;
diff --git a/src/Servers/Kestrel/Core/src/PublicAPI.Shipped.txt b/src/Servers/Kestrel/Core/src/PublicAPI.Shipped.txt
index 83e510bd7b..0214077946 100644
--- a/src/Servers/Kestrel/Core/src/PublicAPI.Shipped.txt
+++ b/src/Servers/Kestrel/Core/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.KestrelServer(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions!>! options, Microsoft.AspNetCore.Connections.IConnectionListenerFactory! transportFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.KestrelServer(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions!>! options, Microsoft.AspNetCore.Connections.IConnectionListenerFactory! transportFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
Microsoft.AspNetCore.Hosting.KestrelServerOptionsSystemdExtensions
Microsoft.AspNetCore.Hosting.ListenOptionsConnectionLoggingExtensions
Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions
@@ -78,6 +78,7 @@ Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersion.Http2 = 2 ->
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersion.Http3 = 3 -> Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersion
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersion.Unknown = -1 -> Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersion
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersionAndMethod
+Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersionAndMethod.HttpVersionAndMethod() -> void
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersionAndMethod.HttpVersionAndMethod(Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpMethod method, int methodEnd) -> void
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersionAndMethod.Method.get -> Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpMethod
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersionAndMethod.MethodEnd.get -> int
@@ -91,6 +92,7 @@ Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.IHttpHeadersHandler.OnSta
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.IHttpRequestLineHandler
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.IHttpRequestLineHandler.OnStartLine(Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpVersionAndMethod versionAndMethod, Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.TargetOffsetPathLength targetPath, System.Span<byte> startLine) -> void
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.TargetOffsetPathLength
+Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.TargetOffsetPathLength.TargetOffsetPathLength() -> void
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.TargetOffsetPathLength.IsEncoded.get -> bool
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.TargetOffsetPathLength.Length.get -> int
Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.TargetOffsetPathLength.Offset.get -> int
diff --git a/src/Servers/Kestrel/Core/src/PublicAPI.Unshipped.txt b/src/Servers/Kestrel/Core/src/PublicAPI.Unshipped.txt
index d8986b9f2a..34eec7f5f0 100644
--- a/src/Servers/Kestrel/Core/src/PublicAPI.Unshipped.txt
+++ b/src/Servers/Kestrel/Core/src/PublicAPI.Unshipped.txt
@@ -1,3 +1,3 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.KestrelServer(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions!>! options, Microsoft.AspNetCore.Connections.IConnectionListenerFactory! transportFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServer.KestrelServer(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Core.KestrelServerOptions!>! options, Microsoft.AspNetCore.Connections.IConnectionListenerFactory! transportFactory, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionAdapterOptions.ServerCertificateChain.get -> System.Security.Cryptography.X509Certificates.X509Certificate2Collection?
+Microsoft.AspNetCore.Server.Kestrel.Https.HttpsConnectionAdapterOptions.ServerCertificateChain.set -> void
diff --git a/src/Servers/Kestrel/Core/test/AddressBinderTests.cs b/src/Servers/Kestrel/Core/test/AddressBinderTests.cs
index 84a57cae1f..c63d207f8a 100644
--- a/src/Servers/Kestrel/Core/test/AddressBinderTests.cs
+++ b/src/Servers/Kestrel/Core/test/AddressBinderTests.cs
@@ -248,28 +248,17 @@ public class AddressBinderTests
}
[Fact]
- public async Task DefaultAddressBinderWithoutDevCertButHttpsConfiguredBindsToHttpsPorts()
+ public async Task DefaultAddressBinderBindsToHttpPort5000()
{
- var x509Certificate2 = TestResources.GetTestCertificate();
var logger = new MockLogger();
var addresses = new ServerAddressesFeature();
var services = new ServiceCollection();
services.AddLogging();
var options = new KestrelServerOptions()
{
- // This stops the dev cert from being loaded
- IsDevCertLoaded = true,
ApplicationServices = services.BuildServiceProvider()
};
- options.ConfigureEndpointDefaults(e =>
- {
- if (e.IPEndPoint.Port == 5001)
- {
- e.UseHttps(new HttpsConnectionAdapterOptions { ServerCertificate = x509Certificate2 });
- }
- });
-
var endpoints = new List<ListenOptions>();
var addressBindContext = TestContextFactory.CreateAddressBindContext(
@@ -285,6 +274,5 @@ public class AddressBinderTests
await AddressBinder.BindAsync(options.ListenOptions, addressBindContext, CancellationToken.None);
Assert.Contains(endpoints, e => e.IPEndPoint.Port == 5000 && !e.IsTls);
- Assert.Contains(endpoints, e => e.IPEndPoint.Port == 5001 && e.IsTls);
}
}
diff --git a/src/Servers/Kestrel/Core/test/Http1/Http1ConnectionTests.cs b/src/Servers/Kestrel/Core/test/Http1/Http1ConnectionTests.cs
index 5832db1da1..45092dd97e 100644
--- a/src/Servers/Kestrel/Core/test/Http1/Http1ConnectionTests.cs
+++ b/src/Servers/Kestrel/Core/test/Http1/Http1ConnectionTests.cs
@@ -56,6 +56,17 @@ public class Http1ConnectionTests : Http1ConnectionTestsBase
}
[Fact]
+ public async Task MaxRequestHeadersTotalSizeDoesNotThrowForMaxValue()
+ {
+ const string headerLine = "Header: value\r\n";
+ _serviceContext.ServerOptions.Limits.MaxRequestHeadersTotalSize = int.MaxValue;
+ _http1Connection.Reset();
+
+ await _application.Output.WriteAsync(Encoding.ASCII.GetBytes($"{headerLine}\r\n"));
+ var readableBuffer = (await _transport.Input.ReadAsync()).Buffer;
+ }
+
+ [Fact]
public async Task TakeMessageHeadersThrowsWhenHeadersExceedTotalSizeLimit()
{
const string headerLine = "Header: value\r\n";
diff --git a/src/Servers/Kestrel/Core/test/Http1/Http1HttpProtocolFeatureCollectionTests.cs b/src/Servers/Kestrel/Core/test/Http1/Http1HttpProtocolFeatureCollectionTests.cs
index 82627f4065..3ffb325b61 100644
--- a/src/Servers/Kestrel/Core/test/Http1/Http1HttpProtocolFeatureCollectionTests.cs
+++ b/src/Servers/Kestrel/Core/test/Http1/Http1HttpProtocolFeatureCollectionTests.cs
@@ -124,8 +124,10 @@ public class Http1HttpProtocolFeatureCollectionTests
_collection[typeof(IHttpBodyControlFeature)] = CreateHttp1Connection();
_collection[typeof(IRouteValuesFeature)] = CreateHttp1Connection();
_collection[typeof(IEndpointFeature)] = CreateHttp1Connection();
+ _collection[typeof(IHttpExtendedConnectFeature)] = CreateHttp1Connection();
_collection[typeof(IHttpUpgradeFeature)] = CreateHttp1Connection();
_collection[typeof(IPersistentStateFeature)] = CreateHttp1Connection();
+ _collection.Set<IHttpWebTransportFeature>(CreateHttp1Connection());
CompareGenericGetterToIndexer();
@@ -150,8 +152,10 @@ public class Http1HttpProtocolFeatureCollectionTests
_collection.Set<IHttpBodyControlFeature>(CreateHttp1Connection());
_collection.Set<IRouteValuesFeature>(CreateHttp1Connection());
_collection.Set<IEndpointFeature>(CreateHttp1Connection());
+ _collection.Set<IHttpExtendedConnectFeature>(CreateHttp1Connection());
_collection.Set<IHttpUpgradeFeature>(CreateHttp1Connection());
_collection.Set<IPersistentStateFeature>(CreateHttp1Connection());
+ _collection.Set<IHttpWebTransportFeature>(CreateHttp1Connection());
CompareGenericGetterToIndexer();
diff --git a/src/Servers/Kestrel/Core/test/Http3/Http3HttpProtocolFeatureCollectionTests.cs b/src/Servers/Kestrel/Core/test/Http3/Http3HttpProtocolFeatureCollectionTests.cs
index 4cca5d8890..ba9d460474 100644
--- a/src/Servers/Kestrel/Core/test/Http3/Http3HttpProtocolFeatureCollectionTests.cs
+++ b/src/Servers/Kestrel/Core/test/Http3/Http3HttpProtocolFeatureCollectionTests.cs
@@ -67,7 +67,7 @@ public class Http3HttpProtocolFeatureCollectionTests
}
}
- private class TestConnectionFeatures : IProtocolErrorCodeFeature, IStreamIdFeature, IStreamAbortFeature
+ private class TestConnectionFeatures : IProtocolErrorCodeFeature, IStreamIdFeature, IStreamAbortFeature, IStreamClosedFeature
{
public TestConnectionFeatures()
{
@@ -75,6 +75,7 @@ public class Http3HttpProtocolFeatureCollectionTests
featureCollection.Set<IProtocolErrorCodeFeature>(this);
featureCollection.Set<IStreamIdFeature>(this);
featureCollection.Set<IStreamAbortFeature>(this);
+ featureCollection.Set<IStreamClosedFeature>(this);
FeatureCollection = featureCollection;
}
@@ -92,5 +93,10 @@ public class Http3HttpProtocolFeatureCollectionTests
{
throw new NotImplementedException();
}
+
+ void IStreamClosedFeature.OnClosed(Action<object> callback, object state)
+ {
+ throw new NotImplementedException();
+ }
}
}
diff --git a/src/Servers/Kestrel/Core/test/HttpParserTests.cs b/src/Servers/Kestrel/Core/test/HttpParserTests.cs
index e6898927d6..ffbd38b10a 100644
--- a/src/Servers/Kestrel/Core/test/HttpParserTests.cs
+++ b/src/Servers/Kestrel/Core/test/HttpParserTests.cs
@@ -3,9 +3,6 @@
using System;
using System.Buffers;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net.Http;
using System.Text;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
@@ -13,8 +10,6 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
-using Moq;
-using Xunit;
using HttpMethod = Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpMethod;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
@@ -39,7 +34,7 @@ public class HttpParserTests : LoggedTest
#pragma warning restore xUnit1026
string expectedVersion)
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
var requestHandler = new RequestHandler();
@@ -58,7 +53,7 @@ public class HttpParserTests : LoggedTest
[MemberData(nameof(RequestLineIncompleteData))]
public void ParseRequestLineReturnsFalseWhenGivenIncompleteRequestLines(string requestLine)
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
var requestHandler = new RequestHandler();
@@ -69,7 +64,7 @@ public class HttpParserTests : LoggedTest
[MemberData(nameof(RequestLineIncompleteData))]
public void ParseRequestLineDoesNotConsumeIncompleteRequestLine(string requestLine)
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
var requestHandler = new RequestHandler();
@@ -90,6 +85,34 @@ public class HttpParserTests : LoggedTest
#pragma warning disable CS0618 // Type or member is obsolete
var exception = Assert.Throws<BadHttpRequestException>(() =>
#pragma warning restore CS0618 // Type or member is obsolete
+ ParseRequestLine(parser, requestHandler, buffer, out var consumed, out var examined));
+
+ Assert.Equal(CoreStrings.FormatBadRequest_InvalidRequestLine_Detail(requestLine[..^1].EscapeNonPrintable()), exception.Message);
+ Assert.Equal(StatusCodes.Status400BadRequest, exception.StatusCode);
+ }
+
+ [Theory]
+ [MemberData(nameof(RequestLineInvalidDataLineFeedTerminator))]
+ public void ParseRequestSucceedsOnInvalidRequestLineLineFeedTerminator(string requestLine)
+ {
+ var parser = CreateParser(CreateEnabledTrace(), disableHttp1LineFeedTerminators: false);
+ var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
+ var requestHandler = new RequestHandler();
+
+ Assert.True(ParseRequestLine(parser, requestHandler, buffer, out var consumed, out var examined));
+ }
+
+ [Theory]
+ [MemberData(nameof(RequestLineInvalidDataLineFeedTerminator))]
+ public void ParseRequestLineThrowsOnInvalidRequestLineLineFeedTerminator(string requestLine)
+ {
+ var parser = CreateParser(CreateEnabledTrace());
+ var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
+ var requestHandler = new RequestHandler();
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ var exception = Assert.Throws<BadHttpRequestException>(() =>
+#pragma warning restore CS0618 // Type or member is obsolete
ParseRequestLine(parser, requestHandler, buffer, out var consumed, out var examined));
Assert.Equal(CoreStrings.FormatBadRequest_InvalidRequestLine_Detail(requestLine[..^1].EscapeNonPrintable()), exception.Message);
@@ -102,7 +125,7 @@ public class HttpParserTests : LoggedTest
{
var requestLine = $"{method} / HTTP/1.1\r\n";
- var parser = CreateParser(CreateEnabledTrace());
+ var parser = CreateParser(CreateEnabledTrace(), false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
var requestHandler = new RequestHandler();
@@ -121,7 +144,7 @@ public class HttpParserTests : LoggedTest
{
var requestLine = $"GET / {httpVersion}\r\n";
- var parser = CreateParser(CreateEnabledTrace());
+ var parser = CreateParser(CreateEnabledTrace(), false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
var requestHandler = new RequestHandler();
@@ -134,6 +157,24 @@ public class HttpParserTests : LoggedTest
Assert.Equal(StatusCodes.Status505HttpVersionNotsupported, exception.StatusCode);
}
+ [Fact]
+ public void StartOfPathNotFound()
+ {
+ var requestLine = $"GET \n";
+
+ var parser = CreateParser(CreateEnabledTrace(), false);
+ var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(requestLine));
+ var requestHandler = new RequestHandler();
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ var exception = Assert.Throws<BadHttpRequestException>(() =>
+#pragma warning restore CS0618 // Type or member is obsolete
+ ParseRequestLine(parser, requestHandler, buffer, out var consumed, out var examined));
+
+ Assert.Equal(CoreStrings.FormatBadRequest_InvalidRequestLine_Detail("GET "), exception.Message);
+ Assert.Equal(StatusCodes.Status400BadRequest, exception.StatusCode);
+ }
+
[Theory]
[InlineData("\r")]
[InlineData("H")]
@@ -173,7 +214,7 @@ public class HttpParserTests : LoggedTest
[InlineData("Header-1: value1\r\nHeader-2: value2\r\n\r")]
public void ParseHeadersReturnsFalseWhenGivenIncompleteHeaders(string rawHeaders)
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(rawHeaders));
var requestHandler = new RequestHandler();
@@ -199,7 +240,7 @@ public class HttpParserTests : LoggedTest
[InlineData("Header: value\r")]
public void ParseHeadersDoesNotConsumeIncompleteHeader(string rawHeaders)
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(rawHeaders));
var requestHandler = new RequestHandler();
@@ -224,6 +265,8 @@ public class HttpParserTests : LoggedTest
[InlineData("Cookie:\r\nConnection: close\r\n\r\n", "Cookie", "", "Connection", "close")]
[InlineData("Connection: close\r\nCookie: \r\n\r\n", "Connection", "close", "Cookie", "")]
[InlineData("Connection: close\r\nCookie:\r\n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("a:b\r\n\r\n", "a", "b", null, null)]
+ [InlineData("a: b\r\n\r\n", "a", "b", null, null)]
public void ParseHeadersCanParseEmptyHeaderValues(
string rawHeaders,
string expectedHeaderName1,
@@ -238,7 +281,116 @@ public class HttpParserTests : LoggedTest
? new[] { expectedHeaderValue1 }
: new[] { expectedHeaderValue1, expectedHeaderValue2 };
- VerifyRawHeaders(rawHeaders, expectedHeaderNames, expectedHeaderValues);
+ VerifyRawHeaders(rawHeaders, expectedHeaderNames, expectedHeaderValues, disableHttp1LineFeedTerminators: false);
+ }
+
+ [Theory]
+ [InlineData("Cookie: \n\r\n", "Cookie", "", null, null)]
+ [InlineData("Cookie:\n\r\n", "Cookie", "", null, null)]
+ [InlineData("Cookie: \nConnection: close\r\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Cookie: \r\nConnection: close\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Cookie:\nConnection: close\r\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Cookie:\r\nConnection: close\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Connection: close\nCookie: \r\n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("Connection: close\r\nCookie: \n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("Connection: close\nCookie:\r\n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("Connection: close\r\nCookie:\n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("a:b\n\r\n", "a", "b", null, null)]
+ [InlineData("a: b\n\r\n", "a", "b", null, null)]
+ [InlineData("a:b\n\n", "a", "b", null, null)]
+ [InlineData("a: b\n\n", "a", "b", null, null)]
+ public void ParseHeadersCantParseSingleLineFeedWihtoutLineFeedTerminatorEnabled(
+ string rawHeaders,
+ string expectedHeaderName1,
+ string expectedHeaderValue1,
+ string expectedHeaderName2,
+ string expectedHeaderValue2)
+ {
+ var expectedHeaderNames = expectedHeaderName2 == null
+ ? new[] { expectedHeaderName1 }
+ : new[] { expectedHeaderName1, expectedHeaderName2 };
+ var expectedHeaderValues = expectedHeaderValue2 == null
+ ? new[] { expectedHeaderValue1 }
+ : new[] { expectedHeaderValue1, expectedHeaderValue2 };
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ Assert.Throws<BadHttpRequestException>(() => VerifyRawHeaders(rawHeaders, expectedHeaderNames, expectedHeaderValues, disableHttp1LineFeedTerminators: true));
+#pragma warning restore CS0618 // Type or member is obsolete
+ }
+
+ [Theory]
+ [InlineData("Cookie: \n\r\n", "Cookie", "", null, null)]
+ [InlineData("Cookie:\n\r\n", "Cookie", "", null, null)]
+ [InlineData("Cookie: \nConnection: close\r\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Cookie: \r\nConnection: close\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Cookie:\nConnection: close\r\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Cookie:\r\nConnection: close\n\r\n", "Cookie", "", "Connection", "close")]
+ [InlineData("Connection: close\nCookie: \r\n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("Connection: close\r\nCookie: \n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("Connection: close\nCookie:\r\n\r\n", "Connection", "close", "Cookie", "")]
+ [InlineData("Connection: close\r\nCookie:\n\r\n", "Connection", "close", "Cookie", "")]
+ public void ParseHeadersCanParseSingleLineFeedWithLineFeedTerminatorEnabled(
+ string rawHeaders,
+ string expectedHeaderName1,
+ string expectedHeaderValue1,
+ string expectedHeaderName2,
+ string expectedHeaderValue2)
+ {
+ var expectedHeaderNames = expectedHeaderName2 == null
+ ? new[] { expectedHeaderName1 }
+ : new[] { expectedHeaderName1, expectedHeaderName2 };
+ var expectedHeaderValues = expectedHeaderValue2 == null
+ ? new[] { expectedHeaderValue1 }
+ : new[] { expectedHeaderValue1, expectedHeaderValue2 };
+
+ VerifyRawHeaders(rawHeaders, expectedHeaderNames, expectedHeaderValues, disableHttp1LineFeedTerminators: false);
+ }
+
+ [Theory]
+ [InlineData("a: b\r\n\n", "a", "b", null, null)]
+ [InlineData("a: b\n\n", "a", "b", null, null)]
+ [InlineData("a: b\nc: d\r\n\n", "a", "b", "c", "d")]
+ [InlineData("a: b\nc: d\n\n", "a", "b", "c", "d")]
+ public void ParseHeadersCantEndWithLineFeedTerminator(
+ string rawHeaders,
+ string expectedHeaderName1,
+ string expectedHeaderValue1,
+ string expectedHeaderName2,
+ string expectedHeaderValue2)
+ {
+ var expectedHeaderNames = expectedHeaderName2 == null
+ ? new[] { expectedHeaderName1 }
+ : new[] { expectedHeaderName1, expectedHeaderName2 };
+ var expectedHeaderValues = expectedHeaderValue2 == null
+ ? new[] { expectedHeaderValue1 }
+ : new[] { expectedHeaderValue1, expectedHeaderValue2 };
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ Assert.Throws<BadHttpRequestException>(() => VerifyRawHeaders(rawHeaders, expectedHeaderNames, expectedHeaderValues, disableHttp1LineFeedTerminators: true));
+#pragma warning restore CS0618 // Type or member is obsolete
+ }
+
+ [Theory]
+ [InlineData("a:b\n\r\n", "a", "b", null, null)]
+ [InlineData("a: b\n\r\n", "a", "b", null, null)]
+ [InlineData("a: b\nc: d\n\r\n", "a", "b", "c", "d")]
+ [InlineData("a: b\nc: d\n\n", "a", "b", "c", "d")]
+ [InlineData("a: b\n\n", "a", "b", null, null)]
+ public void ParseHeadersCanEndAfterLineFeedTerminator(
+ string rawHeaders,
+ string expectedHeaderName1,
+ string expectedHeaderValue1,
+ string expectedHeaderName2,
+ string expectedHeaderValue2)
+ {
+ var expectedHeaderNames = expectedHeaderName2 == null
+ ? new[] { expectedHeaderName1 }
+ : new[] { expectedHeaderName1, expectedHeaderName2 };
+ var expectedHeaderValues = expectedHeaderValue2 == null
+ ? new[] { expectedHeaderValue1 }
+ : new[] { expectedHeaderValue1, expectedHeaderValue2 };
+
+ VerifyRawHeaders(rawHeaders, expectedHeaderNames, expectedHeaderValues, disableHttp1LineFeedTerminators: false);
}
[Theory]
@@ -289,7 +441,7 @@ public class HttpParserTests : LoggedTest
[Fact]
public void ParseHeadersConsumesBytesCorrectlyAtEnd()
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
const string headerLine = "Header: value\r\n\r";
var buffer1 = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(headerLine));
@@ -312,7 +464,27 @@ public class HttpParserTests : LoggedTest
[MemberData(nameof(RequestHeaderInvalidData))]
public void ParseHeadersThrowsOnInvalidRequestHeaders(string rawHeaders, string expectedExceptionMessage)
{
- var parser = CreateParser(CreateEnabledTrace());
+ var parser = CreateParser(CreateEnabledTrace(), false);
+ var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(rawHeaders));
+ var requestHandler = new RequestHandler();
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ var exception = Assert.Throws<BadHttpRequestException>(() =>
+#pragma warning restore CS0618 // Type or member is obsolete
+ {
+ var reader = new SequenceReader<byte>(buffer);
+ parser.ParseHeaders(requestHandler, ref reader);
+ });
+
+ Assert.Equal(expectedExceptionMessage, exception.Message);
+ Assert.Equal(StatusCodes.Status400BadRequest, exception.StatusCode);
+ }
+
+ [Theory]
+ [MemberData(nameof(RequestHeaderInvalidDataLineFeedTerminator))]
+ public void ParseHeadersThrowsOnInvalidRequestHeadersLineFeedTerminator(string rawHeaders, string expectedExceptionMessage)
+ {
+ var parser = CreateParser(CreateEnabledTrace(), true);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(rawHeaders));
var requestHandler = new RequestHandler();
@@ -374,7 +546,7 @@ public class HttpParserTests : LoggedTest
[Fact]
public void ParseRequestLineSplitBufferWithoutNewLineDoesNotUpdateConsumed()
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = ReadOnlySequenceFactory.CreateSegments(
Encoding.ASCII.GetBytes("GET "),
Encoding.ASCII.GetBytes("/"));
@@ -390,7 +562,7 @@ public class HttpParserTests : LoggedTest
[Fact]
public void ParseRequestLineTlsOverHttp()
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = ReadOnlySequenceFactory.CreateSegments(new byte[] { 0x16, 0x03, 0x01, 0x02, 0x00, 0x01, 0x00, 0xfc, 0x03, 0x03, 0x03, 0xca, 0xe0, 0xfd, 0x0a });
var requestHandler = new RequestHandler();
@@ -410,7 +582,7 @@ public class HttpParserTests : LoggedTest
[MemberData(nameof(RequestHeaderInvalidData))]
public void ParseHeadersThrowsOnInvalidRequestHeadersWithGratuitouslySplitBuffers(string rawHeaders, string expectedExceptionMessage)
{
- var parser = CreateParser(CreateEnabledTrace());
+ var parser = CreateParser(CreateEnabledTrace(), false);
var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent(rawHeaders);
var requestHandler = new RequestHandler();
@@ -426,11 +598,33 @@ public class HttpParserTests : LoggedTest
Assert.Equal(StatusCodes.Status400BadRequest, exception.StatusCode);
}
- [Fact]
- public void ParseHeadersWithGratuitouslySplitBuffers()
+ [Theory]
+ [MemberData(nameof(RequestHeaderInvalidDataLineFeedTerminator))]
+ public void ParseHeadersThrowsOnInvalidRequestHeadersWithGratuitouslySplitBuffersLineFeedTerminator(string rawHeaders, string expectedExceptionMessage)
{
- var parser = CreateParser(_nullTrace);
- var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent("Host:\r\nConnection: keep-alive\r\n\r\n");
+ var parser = CreateParser(CreateEnabledTrace(), true);
+ var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent(rawHeaders);
+ var requestHandler = new RequestHandler();
+
+#pragma warning disable CS0618 // Type or member is obsolete
+ var exception = Assert.Throws<BadHttpRequestException>(() =>
+#pragma warning restore CS0618 // Type or member is obsolete
+ {
+ var reader = new SequenceReader<byte>(buffer);
+ parser.ParseHeaders(requestHandler, ref reader);
+ });
+
+ Assert.Equal(expectedExceptionMessage, exception.Message);
+ Assert.Equal(StatusCodes.Status400BadRequest, exception.StatusCode);
+ }
+
+ [Theory]
+ [InlineData("Host:\r\nConnection: keep-alive\r\n\r\n")]
+ [InlineData("A:B\r\nB: C\r\n\r\n")]
+ public void ParseHeadersWithGratuitouslySplitBuffers(string headers)
+ {
+ var parser = CreateParser(_nullTrace, false);
+ var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent(headers);
var requestHandler = new RequestHandler();
var reader = new SequenceReader<byte>(buffer);
@@ -439,11 +633,44 @@ public class HttpParserTests : LoggedTest
Assert.True(result);
}
- [Fact]
- public void ParseHeadersWithGratuitouslySplitBuffers2()
+ [Theory]
+ [InlineData("Host: \r\nConnection: keep-alive\r")]
+ public void ParseHeaderLineIncompleteDataWithGratuitouslySplitBuffers(string headers)
{
- var parser = CreateParser(_nullTrace);
- var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent("A:B\r\nB: C\r\n\r\n");
+ var parser = CreateParser(_nullTrace, false);
+ var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent(headers);
+
+ var requestHandler = new RequestHandler();
+ var reader = new SequenceReader<byte>(buffer);
+ var result = parser.ParseHeaders(requestHandler, ref reader);
+
+ Assert.False(result);
+ }
+
+ [Theory]
+ [InlineData("Host: \r\nConnection: keep-alive\r")]
+ public void ParseHeaderLineIncompleteData(string headers)
+ {
+ var parser = CreateParser(_nullTrace, false);
+ var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(headers));
+
+ var requestHandler = new RequestHandler();
+ var reader = new SequenceReader<byte>(buffer);
+ var result = parser.ParseHeaders(requestHandler, ref reader);
+
+ Assert.False(result);
+ }
+
+ [Theory]
+ [InlineData("Host:\nConnection: keep-alive\r\n\r\n")]
+ [InlineData("Host:\r\nConnection: keep-alive\n\r\n")]
+ [InlineData("A:B\nB: C\r\n\r\n")]
+ [InlineData("A:B\r\nB: C\n\r\n")]
+ [InlineData("Host:\r\nConnection: keep-alive\n\n")]
+ public void ParseHeadersWithGratuitouslySplitBuffersQuirkMode(string headers)
+ {
+ var parser = CreateParser(_nullTrace, disableHttp1LineFeedTerminators: false);
+ var buffer = BytePerSegmentTestSequenceFactory.Instance.CreateWithContent(headers);
var requestHandler = new RequestHandler();
var reader = new SequenceReader<byte>(buffer);
@@ -474,7 +701,7 @@ public class HttpParserTests : LoggedTest
string rawHeaderValue,
string expectedHeaderValue)
{
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, false);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes($"{headerName}:{rawHeaderValue}\r\n"));
var requestHandler = new RequestHandler();
@@ -488,11 +715,11 @@ public class HttpParserTests : LoggedTest
Assert.True(buffer.Slice(reader.Position).IsEmpty);
}
- private void VerifyRawHeaders(string rawHeaders, IEnumerable<string> expectedHeaderNames, IEnumerable<string> expectedHeaderValues)
+ private void VerifyRawHeaders(string rawHeaders, IEnumerable<string> expectedHeaderNames, IEnumerable<string> expectedHeaderValues, bool disableHttp1LineFeedTerminators = true)
{
Assert.True(expectedHeaderNames.Count() == expectedHeaderValues.Count(), $"{nameof(expectedHeaderNames)} and {nameof(expectedHeaderValues)} sizes must match");
- var parser = CreateParser(_nullTrace);
+ var parser = CreateParser(_nullTrace, disableHttp1LineFeedTerminators);
var buffer = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes(rawHeaders));
var requestHandler = new RequestHandler();
@@ -507,12 +734,14 @@ public class HttpParserTests : LoggedTest
Assert.True(buffer.Slice(reader.Position).IsEmpty);
}
- private IHttpParser<RequestHandler> CreateParser(KestrelTrace log) => new HttpParser<RequestHandler>(log.IsEnabled(LogLevel.Information));
+ private IHttpParser<RequestHandler> CreateParser(KestrelTrace log, bool disableHttp1LineFeedTerminators = true) => new HttpParser<RequestHandler>(log.IsEnabled(LogLevel.Information), disableHttp1LineFeedTerminators);
public static IEnumerable<object[]> RequestLineValidData => HttpParsingData.RequestLineValidData;
public static IEnumerable<object[]> RequestLineIncompleteData => HttpParsingData.RequestLineIncompleteData.Select(requestLine => new[] { requestLine });
+ public static IEnumerable<object[]> RequestLineInvalidDataLineFeedTerminator => HttpParsingData.RequestLineInvalidDataLineFeedTerminator.Select(requestLine => new[] { requestLine });
+
public static IEnumerable<object[]> RequestLineInvalidData => HttpParsingData.RequestLineInvalidData.Select(requestLine => new[] { requestLine });
public static IEnumerable<object[]> MethodWithNonTokenCharData => HttpParsingData.MethodWithNonTokenCharData.Select(method => new[] { method });
@@ -521,6 +750,8 @@ public class HttpParserTests : LoggedTest
public static IEnumerable<object[]> RequestHeaderInvalidData => HttpParsingData.RequestHeaderInvalidData;
+ public static IEnumerable<object[]> RequestHeaderInvalidDataLineFeedTerminator => HttpParsingData.RequestHeaderInvalidDataLineFeedTerminator;
+
private class RequestHandler : IHttpRequestLineHandler, IHttpHeadersHandler
{
public string Method { get; set; }
diff --git a/src/Servers/Kestrel/Core/test/HttpRequestHeadersTests.cs b/src/Servers/Kestrel/Core/test/HttpRequestHeadersTests.cs
index 32da70f8dc..91897ea235 100644
--- a/src/Servers/Kestrel/Core/test/HttpRequestHeadersTests.cs
+++ b/src/Servers/Kestrel/Core/test/HttpRequestHeadersTests.cs
@@ -390,7 +390,7 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void ValueReuseOnlyWhenAllowed(bool reuseValue, KnownHeader header)
+ public void ValueReuseOnlyWhenAllowed(bool reuseValue, string headerName)
{
const string HeaderValue = "Hello";
@@ -398,8 +398,8 @@ public class HttpRequestHeadersTests
for (var i = 0; i < 6; i++)
{
- var prevName = ChangeNameCase(header.Name, variant: i);
- var nextName = ChangeNameCase(header.Name, variant: i + 1);
+ var prevName = ChangeNameCase(headerName, variant: i);
+ var nextName = ChangeNameCase(headerName, variant: i + 1);
var values = GetHeaderValues(headers, prevName, nextName, HeaderValue, HeaderValue);
@@ -425,7 +425,7 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void ValueReuseChangedValuesOverwrite(bool reuseValue, KnownHeader header)
+ public void ValueReuseChangedValuesOverwrite(bool reuseValue, string headerName)
{
const string HeaderValue1 = "Hello1";
const string HeaderValue2 = "Hello2";
@@ -433,8 +433,8 @@ public class HttpRequestHeadersTests
for (var i = 0; i < 6; i++)
{
- var prevName = ChangeNameCase(header.Name, variant: i);
- var nextName = ChangeNameCase(header.Name, variant: i + 1);
+ var prevName = ChangeNameCase(headerName, variant: i);
+ var nextName = ChangeNameCase(headerName, variant: i + 1);
var values = GetHeaderValues(headers, prevName, nextName, HeaderValue1, HeaderValue2);
@@ -450,15 +450,15 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void ValueReuseMissingValuesClear(bool reuseValue, KnownHeader header)
+ public void ValueReuseMissingValuesClear(bool reuseValue, string headerName)
{
const string HeaderValue1 = "Hello1";
var headers = new HttpRequestHeaders(reuseHeaderValues: reuseValue);
for (var i = 0; i < 6; i++)
{
- var prevName = ChangeNameCase(header.Name, variant: i);
- var nextName = ChangeNameCase(header.Name, variant: i + 1);
+ var prevName = ChangeNameCase(headerName, variant: i);
+ var nextName = ChangeNameCase(headerName, variant: i + 1);
var values = GetHeaderValues(headers, prevName, nextName, HeaderValue1, nextValue: null);
@@ -473,7 +473,7 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void ValueReuseNeverWhenNotAscii(bool reuseValue, KnownHeader header)
+ public void ValueReuseNeverWhenNotAscii(bool reuseValue, string headerName)
{
const string HeaderValue = "Hello \u03a0";
@@ -481,8 +481,8 @@ public class HttpRequestHeadersTests
for (var i = 0; i < 6; i++)
{
- var prevName = ChangeNameCase(header.Name, variant: i);
- var nextName = ChangeNameCase(header.Name, variant: i + 1);
+ var prevName = ChangeNameCase(headerName, variant: i);
+ var nextName = ChangeNameCase(headerName, variant: i + 1);
var values = GetHeaderValues(headers, prevName, nextName, HeaderValue, HeaderValue);
@@ -500,7 +500,7 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void ValueReuseLatin1NotConfusedForUtf16AndStillRejected(bool reuseValue, KnownHeader header)
+ public void ValueReuseLatin1NotConfusedForUtf16AndStillRejected(bool reuseValue, string headerName)
{
var headers = new HttpRequestHeaders(reuseHeaderValues: reuseValue);
@@ -531,27 +531,27 @@ public class HttpRequestHeadersTests
headers.Reset();
- var headerName = Encoding.ASCII.GetBytes(header.Name).AsSpan();
+ var headerNameBytes = Encoding.ASCII.GetBytes(headerName).AsSpan();
var prevSpan = Encoding.UTF8.GetBytes(headerValueUtf16Latin1CrossOver).AsSpan();
- headers.Append(headerName, prevSpan, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, prevSpan, checkForNewlineChars: false);
headers.OnHeadersComplete();
- var prevHeaderValue = ((IHeaderDictionary)headers)[header.Name].ToString();
+ var prevHeaderValue = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.Equal(headerValueUtf16Latin1CrossOver, prevHeaderValue);
Assert.NotSame(headerValueUtf16Latin1CrossOver, prevHeaderValue);
headers.Reset();
- Assert.Throws<InvalidOperationException>(() =>
+ Assert.Throws<InvalidOperationException>((Action)(() =>
{
- var headerName = Encoding.ASCII.GetBytes(header.Name).AsSpan();
+ var headerNameBytes = Encoding.ASCII.GetBytes((string)headerName).AsSpan();
var nextSpan = Encoding.Latin1.GetBytes(headerValueUtf16Latin1CrossOver).AsSpan();
Assert.False(nextSpan.SequenceEqual(Encoding.ASCII.GetBytes(headerValueUtf16Latin1CrossOver)));
- headers.Append(headerName, nextSpan, checkForNewlineChars: false);
- });
+ headers.Append(headerNameBytes, nextSpan, checkForNewlineChars: false);
+ }));
}
// Reset back to Ascii
@@ -561,7 +561,7 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void Latin1ValuesAcceptedInLatin1ModeButNotReused(bool reuseValue, KnownHeader header)
+ public void Latin1ValuesAcceptedInLatin1ModeButNotReused(bool reuseValue, string headerName)
{
var headers = new HttpRequestHeaders(reuseHeaderValues: reuseValue, _ => Encoding.Latin1);
@@ -590,20 +590,20 @@ public class HttpRequestHeadersTests
headerValueUtf16Latin1CrossOver = new string(headerValue.AsSpan().Slice(0, i + 1));
}
- var headerName = Encoding.ASCII.GetBytes(header.Name).AsSpan();
+ var headerNameBytes = Encoding.ASCII.GetBytes(headerName).AsSpan();
var latinValueSpan = Encoding.Latin1.GetBytes(headerValueUtf16Latin1CrossOver).AsSpan();
Assert.False(latinValueSpan.SequenceEqual(Encoding.ASCII.GetBytes(headerValueUtf16Latin1CrossOver)));
headers.Reset();
- headers.Append(headerName, latinValueSpan, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, latinValueSpan, checkForNewlineChars: false);
headers.OnHeadersComplete();
- var parsedHeaderValue1 = ((IHeaderDictionary)headers)[header.Name].ToString();
+ var parsedHeaderValue1 = ((IHeaderDictionary)headers)[headerName].ToString();
headers.Reset();
- headers.Append(headerName, latinValueSpan, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, latinValueSpan, checkForNewlineChars: false);
headers.OnHeadersComplete();
- var parsedHeaderValue2 = ((IHeaderDictionary)headers)[header.Name].ToString();
+ var parsedHeaderValue2 = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.Equal(headerValueUtf16Latin1CrossOver, parsedHeaderValue1);
Assert.Equal(parsedHeaderValue1, parsedHeaderValue2);
@@ -617,7 +617,7 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void NullCharactersRejectedInUTF8AndLatin1Mode(bool useLatin1, KnownHeader header)
+ public void NullCharactersRejectedInUTF8AndLatin1Mode(bool useLatin1, string headerName)
{
var headers = new HttpRequestHeaders(encodingSelector: useLatin1 ? _ => Encoding.Latin1 : (Func<string, Encoding>)null);
@@ -637,10 +637,10 @@ public class HttpRequestHeadersTests
Assert.Throws<InvalidOperationException>(() =>
{
- var headerName = Encoding.ASCII.GetBytes(header.Name).AsSpan();
+ var headerNameBytes = Encoding.ASCII.GetBytes(headerName).AsSpan();
var valueSpan = Encoding.ASCII.GetBytes(valueString).AsSpan();
- headers.Append(headerName, valueSpan, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, valueSpan, checkForNewlineChars: false);
});
valueArray[i] = 'a';
@@ -723,17 +723,17 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void ValueReuseEmptyAfterReset(bool reuseValue, KnownHeader header)
+ public void ValueReuseEmptyAfterReset(bool reuseValue, string headerName)
{
const string HeaderValue = "Hello";
var headers = new HttpRequestHeaders(reuseHeaderValues: reuseValue);
- var headerName = Encoding.ASCII.GetBytes(header.Name).AsSpan();
+ var headerNameBytes = Encoding.ASCII.GetBytes(headerName).AsSpan();
var prevSpan = Encoding.UTF8.GetBytes(HeaderValue).AsSpan();
- headers.Append(headerName, prevSpan, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, prevSpan, checkForNewlineChars: false);
headers.OnHeadersComplete();
- var prevHeaderValue = ((IHeaderDictionary)headers)[header.Name].ToString();
+ var prevHeaderValue = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.NotNull(prevHeaderValue);
Assert.NotEqual(string.Empty, prevHeaderValue);
@@ -746,7 +746,7 @@ public class HttpRequestHeadersTests
headers.Reset();
// Empty after reset
- var nextHeaderValue = ((IHeaderDictionary)headers)[header.Name].ToString();
+ var nextHeaderValue = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.NotNull(nextHeaderValue);
Assert.Equal(string.Empty, nextHeaderValue);
@@ -758,7 +758,7 @@ public class HttpRequestHeadersTests
headers.OnHeadersComplete();
// Still empty after complete
- nextHeaderValue = ((IHeaderDictionary)headers)[header.Name].ToString();
+ nextHeaderValue = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.NotNull(nextHeaderValue);
Assert.Equal(string.Empty, nextHeaderValue);
@@ -770,20 +770,20 @@ public class HttpRequestHeadersTests
[Theory]
[MemberData(nameof(KnownRequestHeaders))]
- public void MultiValueReuseEmptyAfterReset(bool reuseValue, KnownHeader header)
+ public void MultiValueReuseEmptyAfterReset(bool reuseValue, string headerName)
{
const string HeaderValue1 = "Hello1";
const string HeaderValue2 = "Hello2";
var headers = new HttpRequestHeaders(reuseHeaderValues: reuseValue);
- var headerName = Encoding.ASCII.GetBytes(header.Name).AsSpan();
+ var headerNameBytes = Encoding.ASCII.GetBytes(headerName).AsSpan();
var prevSpan1 = Encoding.UTF8.GetBytes(HeaderValue1).AsSpan();
var prevSpan2 = Encoding.UTF8.GetBytes(HeaderValue2).AsSpan();
- headers.Append(headerName, prevSpan1, checkForNewlineChars: false);
- headers.Append(headerName, prevSpan2, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, prevSpan1, checkForNewlineChars: false);
+ headers.Append(headerNameBytes, prevSpan2, checkForNewlineChars: false);
headers.OnHeadersComplete();
- var prevHeaderValue = ((IHeaderDictionary)headers)[header.Name];
+ var prevHeaderValue = ((IHeaderDictionary)headers)[headerName];
Assert.Equal(2, prevHeaderValue.Count);
@@ -795,7 +795,7 @@ public class HttpRequestHeadersTests
headers.Reset();
// Empty after reset
- var nextHeaderValue = ((IHeaderDictionary)headers)[header.Name].ToString();
+ var nextHeaderValue = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.NotNull(nextHeaderValue);
Assert.Equal(string.Empty, nextHeaderValue);
@@ -806,7 +806,7 @@ public class HttpRequestHeadersTests
headers.OnHeadersComplete();
// Still empty after complete
- nextHeaderValue = ((IHeaderDictionary)headers)[header.Name].ToString();
+ nextHeaderValue = ((IHeaderDictionary)headers)[headerName].ToString();
Assert.NotNull(nextHeaderValue);
Assert.Equal(string.Empty, nextHeaderValue);
@@ -860,6 +860,6 @@ public class HttpRequestHeadersTests
// Content-Length is numeric not a string, so we exclude it from the string reuse tests
public static IEnumerable<object[]> KnownRequestHeaders =>
- RequestHeaders.Where(h => h.Name != "Content-Length").Select(h => new object[] { true, h }).Concat(
- RequestHeaders.Where(h => h.Name != "Content-Length").Select(h => new object[] { false, h }));
+ RequestHeaders.Where(h => h.Name != "Content-Length").Select(h => new object[] { true, h.Name }).Concat(
+ RequestHeaders.Where(h => h.Name != "Content-Length").Select(h => new object[] { false, h.Name }));
}
diff --git a/src/Servers/Kestrel/Core/test/KestrelServerTests.cs b/src/Servers/Kestrel/Core/test/KestrelServerTests.cs
index 658f35dbdb..8e7c282d2e 100644
--- a/src/Servers/Kestrel/Core/test/KestrelServerTests.cs
+++ b/src/Servers/Kestrel/Core/test/KestrelServerTests.cs
@@ -321,7 +321,7 @@ public class KestrelServerTests
options.ListenAnyIP(0, options =>
{
options.UseHttps(TestResources.GetTestCertificate());
- options.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ options.Protocols = HttpProtocols.Http1AndHttp2;
});
var mockTransportFactory = new MockTransportFactory();
@@ -336,16 +336,43 @@ public class KestrelServerTests
await server.StartAsync(new DummyApplication(context => Task.CompletedTask), CancellationToken.None);
var transportEndPoint = Assert.Single(mockTransportFactory.BoundEndPoints);
- var multiplexedTransportEndPoint = Assert.Single(mockMultiplexedTransportFactory.BoundEndPoints);
Assert.Equal(IPAddress.IPv6Any, ((IPEndPoint)transportEndPoint.OriginalEndPoint).Address);
- Assert.Equal(IPAddress.IPv6Any, ((IPEndPoint)multiplexedTransportEndPoint.OriginalEndPoint).Address);
// Should have been assigned a random value.
Assert.NotEqual(0, ((IPEndPoint)transportEndPoint.BoundEndPoint).Port);
+ }
+
+ [Fact]
+ public async Task ListenIPWithEphemeralPort_MultiplexedTransportsGetIPv6Any()
+ {
+ var options = new KestrelServerOptions();
+ options.ApplicationServices = new ServiceCollection()
+ .AddLogging()
+ .BuildServiceProvider();
+ options.ListenAnyIP(0, options =>
+ {
+ options.UseHttps(TestResources.GetTestCertificate());
+ options.Protocols = HttpProtocols.Http3;
+ });
- // Same random value should be used for both transports.
- Assert.Equal(((IPEndPoint)transportEndPoint.BoundEndPoint).Port, ((IPEndPoint)multiplexedTransportEndPoint.BoundEndPoint).Port);
+ var mockTransportFactory = new MockTransportFactory();
+ var mockMultiplexedTransportFactory = new MockMultiplexedTransportFactory();
+
+ using var server = new KestrelServerImpl(
+ Options.Create(options),
+ new List<IConnectionListenerFactory>() { mockTransportFactory },
+ new List<IMultiplexedConnectionListenerFactory>() { mockMultiplexedTransportFactory },
+ new LoggerFactory(new[] { new KestrelTestLoggerProvider() }));
+
+ await server.StartAsync(new DummyApplication(context => Task.CompletedTask), CancellationToken.None);
+
+ var multiplexedTransportEndPoint = Assert.Single(mockMultiplexedTransportFactory.BoundEndPoints);
+
+ Assert.Equal(IPAddress.IPv6Any, ((IPEndPoint)multiplexedTransportEndPoint.OriginalEndPoint).Address);
+
+ // Should have been assigned a random value.
+ Assert.NotEqual(0, ((IPEndPoint)multiplexedTransportEndPoint.BoundEndPoint).Port);
}
[Fact]
diff --git a/src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs b/src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs
index 674afb08df..943cec0b6c 100644
--- a/src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs
+++ b/src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs
@@ -1,10 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
using System.IO.Pipelines;
-using System.Linq;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
@@ -17,7 +14,6 @@ using Microsoft.AspNetCore.Server.Kestrel.Https.Internal;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
using Moq;
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
@@ -187,6 +183,155 @@ public class SniOptionsSelectorTests
}
[Fact]
+ public void FullChainCertsCanBeLoaded()
+ {
+ var sniDictionary = new Dictionary<string, SniConfig>
+ {
+ {
+ "Www.Example.Org",
+ new SniConfig
+ {
+ Certificate = new CertificateConfig
+ {
+ Path = "Exact"
+ }
+ }
+ },
+ {
+ "*.Example.Org",
+ new SniConfig
+ {
+ Certificate = new CertificateConfig
+ {
+ Path = "WildcardPrefix"
+ }
+ }
+ }
+ };
+
+ var mockCertificateConfigLoader = new MockCertificateConfigLoader();
+ var pathDictionary = mockCertificateConfigLoader.CertToPathDictionary;
+ var fullChainDictionary = mockCertificateConfigLoader.CertToFullChain;
+
+ var sniOptionsSelector = new SniOptionsSelector(
+ "TestEndpointName",
+ sniDictionary,
+ mockCertificateConfigLoader,
+ fallbackHttpsOptions: new HttpsConnectionAdapterOptions(),
+ fallbackHttpProtocols: HttpProtocols.Http1AndHttp2,
+ logger: Mock.Of<ILogger<HttpsConnectionMiddleware>>());
+
+ var (wwwSubdomainOptions, _) = sniOptionsSelector.GetOptions(new MockConnectionContext(), "wWw.eXample.oRg");
+ Assert.Equal("Exact", pathDictionary[wwwSubdomainOptions.ServerCertificate]);
+
+ var (baSubdomainOptions, _) = sniOptionsSelector.GetOptions(new MockConnectionContext(), "B.a.eXample.oRg");
+ Assert.Equal("WildcardPrefix", pathDictionary[baSubdomainOptions.ServerCertificate]);
+
+ var (aSubdomainOptions, _) = sniOptionsSelector.GetOptions(new MockConnectionContext(), "A.eXample.oRg");
+ Assert.Equal("WildcardPrefix", pathDictionary[aSubdomainOptions.ServerCertificate]);
+
+ /*
+ * Chain test certs were created using smallstep cli: https://github.com/smallstep/cli
+ * root_ca(pwd: testroot) ->
+ * intermediate_ca 1(pwd: inter) ->
+ * intermediate_ca 2(pwd: inter) ->
+ * leaf.com(pwd: leaf) (bundled)
+ */
+ var fullChain = fullChainDictionary[aSubdomainOptions.ServerCertificate];
+ // Expect intermediate 2 cert and leaf.com
+ Assert.Equal(2, fullChain.Count);
+ Assert.Equal("CN=leaf.com", fullChain[0].Subject);
+ Assert.Equal("CN=Test Intermediate CA 2", fullChain[0].IssuerName.Name);
+ Assert.Equal("CN=Test Intermediate CA 2", fullChain[1].Subject);
+ Assert.Equal("CN=Test Intermediate CA 1", fullChain[1].IssuerName.Name);
+ }
+
+ [Fact]
+ public void MultipleWildcardPrefixServerNamesOfSameLengthAreAllowed()
+ {
+ var sniDictionary = new Dictionary<string, SniConfig>
+ {
+ {
+ "*.a.example.org",
+ new SniConfig
+ {
+ Certificate = new CertificateConfig
+ {
+ Path = "a"
+ }
+ }
+ },
+ {
+ "*.b.example.org",
+ new SniConfig
+ {
+ Certificate = new CertificateConfig
+ {
+ Path = "b"
+ }
+ }
+ }
+ };
+
+ var mockCertificateConfigLoader = new MockCertificateConfigLoader();
+ var pathDictionary = mockCertificateConfigLoader.CertToPathDictionary;
+
+ var sniOptionsSelector = new SniOptionsSelector(
+ "TestEndpointName",
+ sniDictionary,
+ mockCertificateConfigLoader,
+ fallbackHttpsOptions: new HttpsConnectionAdapterOptions(),
+ fallbackHttpProtocols: HttpProtocols.Http1AndHttp2,
+ logger: Mock.Of<ILogger<HttpsConnectionMiddleware>>());
+
+ var (aSubdomainOptions, _) = sniOptionsSelector.GetOptions(new MockConnectionContext(), "c.a.example.org");
+ Assert.Equal("a", pathDictionary[aSubdomainOptions.ServerCertificate]);
+
+ var (bSubdomainOptions, _) = sniOptionsSelector.GetOptions(new MockConnectionContext(), "c.b.example.org");
+ Assert.Equal("b", pathDictionary[bSubdomainOptions.ServerCertificate]);
+ }
+
+ [Fact]
+ public void DuplicateWildcardPrefixServerNamesThrowsArgumentException()
+ {
+ var sniDictionary = new Dictionary<string, SniConfig>
+ {
+ {
+ "*.example.org",
+ new SniConfig
+ {
+ Certificate = new CertificateConfig
+ {
+ Path = "a"
+ }
+ }
+ },
+ {
+ "*.EXAMPLE.org",
+ new SniConfig
+ {
+ Certificate = new CertificateConfig
+ {
+ Path = "b"
+ }
+ }
+ }
+ };
+
+ var mockCertificateConfigLoader = new MockCertificateConfigLoader();
+ var pathDictionary = mockCertificateConfigLoader.CertToPathDictionary;
+
+ var exception = Assert.Throws<ArgumentException>(() => new SniOptionsSelector(
+ "TestEndpointName",
+ sniDictionary,
+ mockCertificateConfigLoader,
+ fallbackHttpsOptions: new HttpsConnectionAdapterOptions(),
+ fallbackHttpProtocols: HttpProtocols.Http1AndHttp2,
+ logger: Mock.Of<ILogger<HttpsConnectionMiddleware>>()));
+ Assert.Equal("An item with the same key has already been added. Key: .EXAMPLE.org (Parameter 'key')", exception.Message);
+ }
+
+ [Fact]
public void GetOptionsThrowsAnAuthenticationExceptionIfThereIsNoMatchingSniSection()
{
var sniOptionsSelector = new SniOptionsSelector(
@@ -709,6 +854,8 @@ public class SniOptionsSelectorTests
ServerCertificateContext = SslStreamCertificateContext.Create(_x509Certificate2, additionalCertificates: null, offline: true),
// Defaults to null
ServerCertificateSelectionCallback = (sender, serverName) => null,
+ // Defaults to null
+ CertificateChainPolicy = new X509ChainPolicy(),
};
var clonedOptions = SniOptionsSelector.CloneSslOptions(options);
@@ -751,6 +898,9 @@ public class SniOptionsSelectorTests
Assert.Same(options.ServerCertificateSelectionCallback, clonedOptions.ServerCertificateSelectionCallback);
Assert.True(propertyNames.Remove(nameof(options.ServerCertificateSelectionCallback)));
+ Assert.Same(options.CertificateChainPolicy, clonedOptions.CertificateChainPolicy);
+ Assert.True(propertyNames.Remove(nameof(options.CertificateChainPolicy)));
+
// Ensure we've checked every property. When new properties get added, we'll have to update this test along with the CloneSslOptions implementation.
Assert.Empty(propertyNames);
}
@@ -758,19 +908,24 @@ public class SniOptionsSelectorTests
private class MockCertificateConfigLoader : ICertificateConfigLoader
{
public Dictionary<object, string> CertToPathDictionary { get; } = new Dictionary<object, string>(ReferenceEqualityComparer.Instance);
+ public Dictionary<object, X509Certificate2Collection> CertToFullChain { get; } = new Dictionary<object, X509Certificate2Collection>(ReferenceEqualityComparer.Instance);
public bool IsTestMock => true;
- public X509Certificate2 LoadCertificate(CertificateConfig certInfo, string endpointName)
+ public (X509Certificate2, X509Certificate2Collection) LoadCertificate(CertificateConfig certInfo, string endpointName)
{
if (certInfo is null)
{
- return null;
+ return (null, null);
}
var cert = TestResources.GetTestCertificate();
CertToPathDictionary.Add(cert, certInfo.Path);
- return cert;
+
+ var fullChain = TestResources.GetTestChain();
+ CertToFullChain[cert] = fullChain;
+
+ return (cert, fullChain);
}
}
diff --git a/src/Servers/Kestrel/Core/test/StartLineTests.cs b/src/Servers/Kestrel/Core/test/StartLineTests.cs
index af19668fa7..701561f367 100644
--- a/src/Servers/Kestrel/Core/test/StartLineTests.cs
+++ b/src/Servers/Kestrel/Core/test/StartLineTests.cs
@@ -517,55 +517,6 @@ public class StartLineTests : IDisposable
DifferentFormsWorkTogether();
}
- public static IEnumerable<object[]> GetCrLfAndMethodCombinations()
- {
- // HTTP methods to test
- var methods = new string[] {
- HttpMethods.Connect,
- HttpMethods.Delete,
- HttpMethods.Get,
- HttpMethods.Head,
- HttpMethods.Options,
- HttpMethods.Patch,
- HttpMethods.Post,
- HttpMethods.Put,
- HttpMethods.Trace
- };
-
- // Prefixes to test
- var crLfPrefixes = new string[] {
- "\r",
- "\n",
- "\r\r\r\r\r",
- "\r\n",
- "\n\r"
- };
-
- foreach (var method in methods)
- {
- foreach (var prefix in crLfPrefixes)
- {
- yield return new object[] { prefix, method };
- }
- }
- }
-
- [Theory]
- [MemberData(nameof(GetCrLfAndMethodCombinations))]
- public void LeadingCrLfAreAllowed(string startOfRequestLine, string httpMethod)
- {
- var rawTarget = "http://localhost/path1?q=123&w=xyzw";
- Http1Connection.Reset();
- // RawTarget, Path, QueryString are null after reset
- Assert.Null(Http1Connection.RawTarget);
- Assert.Null(Http1Connection.Path);
- Assert.Null(Http1Connection.QueryString);
-
- var ros = new ReadOnlySequence<byte>(Encoding.ASCII.GetBytes($"{startOfRequestLine}{httpMethod} {rawTarget} HTTP/1.1\r\n"));
- var reader = new SequenceReader<byte>(ros);
- Assert.True(Parser.ParseRequestLine(ParsingHandler, ref reader));
- }
-
public StartLineTests()
{
MemoryPool = PinnedBlockMemoryPoolFactory.Create();
diff --git a/src/Servers/Kestrel/Kestrel.slnf b/src/Servers/Kestrel/Kestrel.slnf
index 7d80a8bf08..5841f4e445 100644
--- a/src/Servers/Kestrel/Kestrel.slnf
+++ b/src/Servers/Kestrel/Kestrel.slnf
@@ -2,19 +2,37 @@
"solution": {
"path": "..\\..\\..\\AspNetCore.sln",
"projects": [
+ "src\\DataProtection\\Abstractions\\src\\Microsoft.AspNetCore.DataProtection.Abstractions.csproj",
+ "src\\DataProtection\\Cryptography.Internal\\src\\Microsoft.AspNetCore.Cryptography.Internal.csproj",
+ "src\\DataProtection\\DataProtection\\src\\Microsoft.AspNetCore.DataProtection.csproj",
+ "src\\DefaultBuilder\\src\\Microsoft.AspNetCore.csproj",
"src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
"src\\Extensions\\Features\\test\\Microsoft.Extensions.Features.Tests.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
"src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj",
"src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj",
+ "src\\Http\\Authentication.Abstractions\\src\\Microsoft.AspNetCore.Authentication.Abstractions.csproj",
+ "src\\Http\\Authentication.Core\\src\\Microsoft.AspNetCore.Authentication.Core.csproj",
"src\\Http\\Headers\\src\\Microsoft.Net.Http.Headers.csproj",
"src\\Http\\Http.Abstractions\\src\\Microsoft.AspNetCore.Http.Abstractions.csproj",
"src\\Http\\Http.Extensions\\src\\Microsoft.AspNetCore.Http.Extensions.csproj",
"src\\Http\\Http.Features\\src\\Microsoft.AspNetCore.Http.Features.csproj",
"src\\Http\\Http\\src\\Microsoft.AspNetCore.Http.csproj",
+ "src\\Http\\Metadata\\src\\Microsoft.AspNetCore.Metadata.csproj",
+ "src\\Http\\Routing.Abstractions\\src\\Microsoft.AspNetCore.Routing.Abstractions.csproj",
+ "src\\Http\\Routing\\src\\Microsoft.AspNetCore.Routing.csproj",
"src\\Http\\WebUtilities\\src\\Microsoft.AspNetCore.WebUtilities.csproj",
+ "src\\Middleware\\Diagnostics.Abstractions\\src\\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj",
+ "src\\Middleware\\Diagnostics\\src\\Microsoft.AspNetCore.Diagnostics.csproj",
+ "src\\Middleware\\HostFiltering\\src\\Microsoft.AspNetCore.HostFiltering.csproj",
+ "src\\Middleware\\HttpOverrides\\src\\Microsoft.AspNetCore.HttpOverrides.csproj",
"src\\ObjectPool\\src\\Microsoft.Extensions.ObjectPool.csproj",
+ "src\\Security\\Authentication\\Core\\src\\Microsoft.AspNetCore.Authentication.csproj",
+ "src\\Security\\Authorization\\Core\\src\\Microsoft.AspNetCore.Authorization.csproj",
+ "src\\Security\\Authorization\\Policy\\src\\Microsoft.AspNetCore.Authorization.Policy.csproj",
"src\\Servers\\Connections.Abstractions\\src\\Microsoft.AspNetCore.Connections.Abstractions.csproj",
+ "src\\Servers\\IIS\\IISIntegration\\src\\Microsoft.AspNetCore.Server.IISIntegration.csproj",
+ "src\\Servers\\IIS\\IIS\\src\\Microsoft.AspNetCore.Server.IIS.csproj",
"src\\Servers\\Kestrel\\Core\\src\\Microsoft.AspNetCore.Server.Kestrel.Core.csproj",
"src\\Servers\\Kestrel\\Core\\test\\Microsoft.AspNetCore.Server.Kestrel.Core.Tests.csproj",
"src\\Servers\\Kestrel\\Kestrel\\src\\Microsoft.AspNetCore.Server.Kestrel.csproj",
@@ -30,13 +48,17 @@
"src\\Servers\\Kestrel\\samples\\PlaintextApp\\PlaintextApp.csproj",
"src\\Servers\\Kestrel\\samples\\SampleApp\\Kestrel.SampleApp.csproj",
"src\\Servers\\Kestrel\\samples\\SystemdTestApp\\SystemdTestApp.csproj",
+ "src\\Servers\\Kestrel\\samples\\WebTransportInteractiveSampleApp\\WebTransportInteractiveSampleApp.csproj",
+ "src\\Servers\\Kestrel\\samples\\WebTransportSampleApp\\WebTransportSampleApp.csproj",
"src\\Servers\\Kestrel\\samples\\http2cat\\http2cat.csproj",
+ "src\\Servers\\Kestrel\\stress\\HttpStress.csproj",
"src\\Servers\\Kestrel\\test\\InMemory.FunctionalTests\\InMemory.FunctionalTests.csproj",
"src\\Servers\\Kestrel\\test\\Interop.FunctionalTests\\Interop.FunctionalTests.csproj",
"src\\Servers\\Kestrel\\test\\Sockets.BindTests\\Sockets.BindTests.csproj",
"src\\Servers\\Kestrel\\test\\Sockets.FunctionalTests\\Sockets.FunctionalTests.csproj",
"src\\Servers\\Kestrel\\tools\\CodeGenerator\\CodeGenerator.csproj",
- "src\\Testing\\src\\Microsoft.AspNetCore.Testing.csproj"
+ "src\\Testing\\src\\Microsoft.AspNetCore.Testing.csproj",
+ "src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj"
]
}
} \ No newline at end of file
diff --git a/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs b/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs
index 7ddc532a7f..65babec406 100644
--- a/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs
+++ b/src/Servers/Kestrel/Kestrel/src/WebHostBuilderKestrelExtensions.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Net.Http;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Server.Kestrel.Core;
@@ -28,7 +29,14 @@ public static class WebHostBuilderKestrelExtensions
/// </returns>
public static IWebHostBuilder UseKestrel(this IWebHostBuilder hostBuilder)
{
- hostBuilder.UseQuic();
+ hostBuilder.UseQuic(options =>
+ {
+ // Configure server defaults to match client defaults.
+ // https://github.com/dotnet/runtime/blob/a5f3676cc71e176084f0f7f1f6beeecd86fbeafc/src/libraries/System.Net.Http/src/System/Net/Http/SocketsHttpHandler/ConnectHelper.cs#L118-L119
+ options.DefaultStreamErrorCode = (long)Http3ErrorCode.RequestCancelled;
+ options.DefaultCloseErrorCode = (long)Http3ErrorCode.NoError;
+ });
+
return hostBuilder.ConfigureServices(services =>
{
// Don't override an already-configured transport
@@ -104,10 +112,7 @@ public static class WebHostBuilderKestrelExtensions
/// </returns>
public static IWebHostBuilder ConfigureKestrel(this IWebHostBuilder hostBuilder, Action<WebHostBuilderContext, KestrelServerOptions> configureOptions)
{
- if (configureOptions == null)
- {
- throw new ArgumentNullException(nameof(configureOptions));
- }
+ ArgumentNullException.ThrowIfNull(configureOptions);
return hostBuilder.ConfigureServices((context, services) =>
{
diff --git a/src/Servers/Kestrel/Kestrel/test/GeneratedCodeTests.cs b/src/Servers/Kestrel/Kestrel/test/GeneratedCodeTests.cs
index 24418d7ff6..57b8a72d35 100644
--- a/src/Servers/Kestrel/Kestrel/test/GeneratedCodeTests.cs
+++ b/src/Servers/Kestrel/Kestrel/test/GeneratedCodeTests.cs
@@ -24,14 +24,12 @@ public class GeneratedCodeTests
var httpHeadersGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "HttpHeaders.Generated.cs");
var httpProtocolGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "HttpProtocol.Generated.cs");
var httpUtilitiesGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "HttpUtilities.Generated.cs");
- var http2ConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "Http2Connection.Generated.cs");
var transportMultiplexedConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "TransportMultiplexedConnection.Generated.cs");
var transportConnectionGeneratedPath = Path.Combine(AppContext.BaseDirectory, "shared", "GeneratedContent", "TransportConnection.Generated.cs");
var testHttpHeadersGeneratedPath = Path.GetTempFileName();
var testHttpProtocolGeneratedPath = Path.GetTempFileName();
var testHttpUtilitiesGeneratedPath = Path.GetTempFileName();
- var testHttp2ConnectionGeneratedPath = Path.GetTempFileName();
var testTransportMultiplexedConnectionGeneratedPath = Path.GetTempFileName();
var testTransportConnectionGeneratedPath = Path.GetTempFileName();
@@ -40,28 +38,24 @@ public class GeneratedCodeTests
var currentHttpHeadersGenerated = File.ReadAllText(httpHeadersGeneratedPath);
var currentHttpProtocolGenerated = File.ReadAllText(httpProtocolGeneratedPath);
var currentHttpUtilitiesGenerated = File.ReadAllText(httpUtilitiesGeneratedPath);
- var currentHttp2ConnectionGenerated = File.ReadAllText(http2ConnectionGeneratedPath);
var currentTransportConnectionBaseGenerated = File.ReadAllText(transportMultiplexedConnectionGeneratedPath);
var currentTransportConnectionGenerated = File.ReadAllText(transportConnectionGeneratedPath);
CodeGenerator.Program.Run(testHttpHeadersGeneratedPath,
testHttpProtocolGeneratedPath,
testHttpUtilitiesGeneratedPath,
- testHttp2ConnectionGeneratedPath,
testTransportMultiplexedConnectionGeneratedPath,
testTransportConnectionGeneratedPath);
var testHttpHeadersGenerated = File.ReadAllText(testHttpHeadersGeneratedPath);
var testHttpProtocolGenerated = File.ReadAllText(testHttpProtocolGeneratedPath);
var testHttpUtilitiesGenerated = File.ReadAllText(testHttpUtilitiesGeneratedPath);
- var testHttp2ConnectionGenerated = File.ReadAllText(testHttp2ConnectionGeneratedPath);
var testTransportMultiplxedConnectionGenerated = File.ReadAllText(testTransportMultiplexedConnectionGeneratedPath);
var testTransportConnectionGenerated = File.ReadAllText(testTransportConnectionGeneratedPath);
AssertFileContentEqual(currentHttpHeadersGenerated, testHttpHeadersGenerated, "HTTP headers");
AssertFileContentEqual(currentHttpProtocolGenerated, testHttpProtocolGenerated, "HTTP protocol");
AssertFileContentEqual(currentHttpUtilitiesGenerated, testHttpUtilitiesGenerated, "HTTP utilities");
- AssertFileContentEqual(currentHttp2ConnectionGenerated, testHttp2ConnectionGenerated, "HTTP2 connection");
AssertFileContentEqual(currentTransportConnectionBaseGenerated, testTransportMultiplxedConnectionGenerated, "TransportConnectionBase");
AssertFileContentEqual(currentTransportConnectionGenerated, testTransportConnectionGenerated, "TransportConnection");
}
@@ -70,7 +64,6 @@ public class GeneratedCodeTests
File.Delete(testHttpHeadersGeneratedPath);
File.Delete(testHttpProtocolGeneratedPath);
File.Delete(testHttpUtilitiesGeneratedPath);
- File.Delete(testHttp2ConnectionGeneratedPath);
File.Delete(testTransportMultiplexedConnectionGeneratedPath);
File.Delete(testTransportConnectionGeneratedPath);
}
diff --git a/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationLoaderTests.cs b/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationLoaderTests.cs
index 04361234ee..f4a1030246 100644
--- a/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationLoaderTests.cs
+++ b/src/Servers/Kestrel/Kestrel/test/KestrelConfigurationLoaderTests.cs
@@ -1,10 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
using System.Security.Authentication;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
@@ -16,7 +12,6 @@ using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Tests;
@@ -140,6 +135,7 @@ public class KestrelConfigurationLoaderTests
serverOptions.ConfigureHttpsDefaults(opt =>
{
opt.ServerCertificate = TestResources.GetTestCertificate();
+ opt.ServerCertificateChain = TestResources.GetTestChain();
opt.ClientCertificateMode = ClientCertificateMode.RequireCertificate;
});
@@ -155,6 +151,8 @@ public class KestrelConfigurationLoaderTests
ran1 = true;
Assert.True(opt.IsHttps);
Assert.NotNull(opt.HttpsOptions.ServerCertificate);
+ Assert.NotNull(opt.HttpsOptions.ServerCertificateChain);
+ Assert.Equal(2, opt.HttpsOptions.ServerCertificateChain.Count);
Assert.Equal(ClientCertificateMode.RequireCertificate, opt.HttpsOptions.ClientCertificateMode);
Assert.Equal(HttpProtocols.Http1, opt.ListenOptions.Protocols);
})
diff --git a/src/Servers/Kestrel/Kestrel/test/Microsoft.AspNetCore.Server.Kestrel.Tests.csproj b/src/Servers/Kestrel/Kestrel/test/Microsoft.AspNetCore.Server.Kestrel.Tests.csproj
index 89bf865772..cca8788dce 100644
--- a/src/Servers/Kestrel/Kestrel/test/Microsoft.AspNetCore.Server.Kestrel.Tests.csproj
+++ b/src/Servers/Kestrel/Kestrel/test/Microsoft.AspNetCore.Server.Kestrel.Tests.csproj
@@ -15,7 +15,6 @@
<Content Include="$(KestrelRoot)Core\src\Internal\Http\HttpHeaders.Generated.cs" LinkBase="shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
<Content Include="$(KestrelRoot)Core\src\Internal\Http\HttpProtocol.Generated.cs" LinkBase="shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
<Content Include="$(KestrelRoot)Core\src\Internal\Infrastructure\HttpUtilities.Generated.cs" LinkBase="shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
- <Content Include="$(KestrelRoot)Core\src\Internal\Http2\Http2Connection.Generated.cs" LinkBase="shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
<Content Include="$(KestrelSharedSourceRoot)\TransportConnection.Generated.cs" LinkBase="shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
<Content Include="$(KestrelSharedSourceRoot)\TransportMultiplexedConnection.Generated.cs" LinkBase="shared\GeneratedContent" CopyToOutputDirectory="PreserveNewest" />
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/ISystemClock.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/ISystemClock.cs
index 651c35d90b..30e3304516 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/ISystemClock.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/ISystemClock.cs
@@ -14,7 +14,7 @@ internal interface ISystemClock
DateTimeOffset UtcNow { get; }
}
-internal class SystemClock : ISystemClock
+internal sealed class SystemClock : ISystemClock
{
public DateTimeOffset UtcNow => DateTimeOffset.UtcNow;
}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionContext.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionContext.cs
index c3eb46b3ad..9263b53ef4 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionContext.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionContext.cs
@@ -3,6 +3,7 @@
using System.Diagnostics;
using System.Net.Quic;
+using System.Runtime.CompilerServices;
using System.Runtime.ExceptionServices;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
@@ -55,7 +56,7 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
{
lock (_shutdownLock)
{
- _closeTask ??= _connection.CloseAsync(errorCode: 0).AsTask();
+ _closeTask ??= _connection.CloseAsync(errorCode: _context.Options.DefaultCloseErrorCode).AsTask();
}
await _closeTask;
@@ -65,7 +66,7 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
_log.LogWarning(ex, "Failed to gracefully shutdown connection.");
}
- _connection.Dispose();
+ await _connection.DisposeAsync();
}
public override void Abort() => Abort(new ConnectionAbortedException("The connection was aborted by the application via MultiplexedConnectionContext.Abort()."));
@@ -87,11 +88,12 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
}
}
+ [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))]
public override async ValueTask<ConnectionContext?> AcceptAsync(CancellationToken cancellationToken = default)
{
try
{
- var stream = await _connection.AcceptStreamAsync(cancellationToken);
+ var stream = await _connection.AcceptInboundStreamAsync(cancellationToken);
QuicStreamContext? context = null;
@@ -108,25 +110,28 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
if (context == null)
{
context = new QuicStreamContext(this, _context);
+ context.Initialize(stream);
}
else
{
context.ResetFeatureCollection();
context.ResetItems();
+ context.Initialize(stream);
+
+ QuicLog.StreamReused(_log, context);
}
- context.Initialize(stream);
context.Start();
QuicLog.AcceptedStream(_log, context);
return context;
}
- catch (QuicConnectionAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError == QuicError.ConnectionAborted)
{
// Shutdown initiated by peer, abortive.
- _error = ex.ErrorCode;
- QuicLog.ConnectionAborted(_log, this, ex.ErrorCode, ex);
+ _error = ex.ApplicationErrorCode;
+ QuicLog.ConnectionAborted(_log, this, ex.ApplicationErrorCode.GetValueOrDefault(), ex);
ThreadPool.UnsafeQueueUserWorkItem(state =>
{
@@ -138,7 +143,7 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
// Throw error so consumer sees the connection is aborted by peer.
throw new ConnectionResetException(ex.Message, ex);
}
- catch (QuicOperationAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError == QuicError.OperationAborted)
{
lock (_shutdownLock)
{
@@ -185,7 +190,7 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
}
}
- public override ValueTask<ConnectionContext> ConnectAsync(IFeatureCollection? features = null, CancellationToken cancellationToken = default)
+ public override async ValueTask<ConnectionContext> ConnectAsync(IFeatureCollection? features = null, CancellationToken cancellationToken = default)
{
QuicStream quicStream;
@@ -194,16 +199,16 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
{
if (streamDirectionFeature.CanRead)
{
- quicStream = _connection.OpenBidirectionalStream();
+ quicStream = await _connection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional, cancellationToken);
}
else
{
- quicStream = _connection.OpenUnidirectionalStream();
+ quicStream = await _connection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional, cancellationToken);
}
}
else
{
- quicStream = _connection.OpenBidirectionalStream();
+ quicStream = await _connection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional, cancellationToken);
}
// Only a handful of control streams are created by the server and they last for the
@@ -214,7 +219,7 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
QuicLog.ConnectedStream(_log, context);
- return new ValueTask<ConnectionContext>(context);
+ return context;
}
internal bool TryReturnStream(QuicStreamContext stream)
@@ -246,6 +251,8 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
{
stream.PoolExpirationTicks = Volatile.Read(ref _heartbeatTicks) + StreamPoolExpiryTicks;
StreamPool.Push(stream);
+
+ QuicLog.StreamPooled(_log, stream);
return true;
}
}
@@ -253,6 +260,11 @@ internal partial class QuicConnectionContext : TransportMultiplexedConnection
return false;
}
+ internal QuicConnection GetInnerConnection()
+ {
+ return _connection;
+ }
+
private void RemoveExpiredStreams()
{
lock (_poolLock)
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs
index 55222da6bf..68eb810f13 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicConnectionListener.cs
@@ -1,9 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics;
using System.Net;
using System.Net.Quic;
using System.Net.Security;
+using System.Runtime.CompilerServices;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.Extensions.Logging;
@@ -13,60 +15,160 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
/// <summary>
/// Listens for new Quic Connections.
/// </summary>
-internal class QuicConnectionListener : IMultiplexedConnectionListener, IAsyncDisposable
+internal sealed class QuicConnectionListener : IMultiplexedConnectionListener, IAsyncDisposable
{
private readonly ILogger _log;
- private bool _disposed;
+ private readonly TlsConnectionCallbackOptions _tlsConnectionCallbackOptions;
private readonly QuicTransportContext _context;
- private readonly QuicListener _listener;
+ private readonly QuicListenerOptions _quicListenerOptions;
+ // Use a CWT to associate QuicConnectionContext with QuicConnection in the callback because there are some situations
+ // where the QuicConnection won't be returned and we can't manually remove the item. e.g. invalid connection options.
+ // Internal for unit testing.
+ internal readonly ConditionalWeakTable<QuicConnection, QuicConnectionContext> _pendingConnections;
+ private bool _disposed;
+ private QuicListener? _listener;
- public QuicConnectionListener(QuicTransportOptions options, ILogger log, EndPoint endpoint, SslServerAuthenticationOptions sslServerAuthenticationOptions)
+ public QuicConnectionListener(
+ QuicTransportOptions options,
+ ILogger log,
+ EndPoint endpoint,
+ TlsConnectionCallbackOptions tlsConnectionCallbackOptions)
{
- if (!QuicImplementationProviders.Default.IsSupported)
+ if (!QuicListener.IsSupported)
{
throw new NotSupportedException("QUIC is not supported or enabled on this platform. See https://aka.ms/aspnet/kestrel/http3reqs for details.");
}
- _log = log;
- _context = new QuicTransportContext(_log, options);
- var quicListenerOptions = new QuicListenerOptions();
-
- var listenEndPoint = endpoint as IPEndPoint;
-
- if (listenEndPoint == null)
+ if (endpoint is not IPEndPoint listenEndPoint)
{
throw new InvalidOperationException($"QUIC doesn't support listening on the configured endpoint type. Expected {nameof(IPEndPoint)} but got {endpoint.GetType().Name}.");
}
- quicListenerOptions.ServerAuthenticationOptions = sslServerAuthenticationOptions;
- quicListenerOptions.ListenEndPoint = listenEndPoint;
- quicListenerOptions.IdleTimeout = options.IdleTimeout;
- quicListenerOptions.MaxBidirectionalStreams = options.MaxBidirectionalStreamCount;
- quicListenerOptions.MaxUnidirectionalStreams = options.MaxUnidirectionalStreamCount;
- quicListenerOptions.ListenBacklog = options.Backlog;
+ if (tlsConnectionCallbackOptions.ApplicationProtocols.Count == 0)
+ {
+ throw new InvalidOperationException("No application protocols specified.");
+ }
- _listener = new QuicListener(quicListenerOptions);
+ _pendingConnections = new ConditionalWeakTable<QuicConnection, QuicConnectionContext>();
+ _log = log;
+ _tlsConnectionCallbackOptions = tlsConnectionCallbackOptions;
+ _context = new QuicTransportContext(_log, options);
+ _quicListenerOptions = new QuicListenerOptions
+ {
+ ApplicationProtocols = _tlsConnectionCallbackOptions.ApplicationProtocols,
+ ListenEndPoint = listenEndPoint,
+ ListenBacklog = options.Backlog,
+ ConnectionOptionsCallback = async (connection, helloInfo, cancellationToken) =>
+ {
+ // Create the connection context inside the callback because it's passed
+ // to the connection callback. The field is then read once AcceptConnectionAsync
+ // finishes awaiting.
+ var currentAcceptingConnection = new QuicConnectionContext(connection, _context);
+ _pendingConnections.Add(connection, currentAcceptingConnection);
+
+ var context = new TlsConnectionCallbackContext
+ {
+ ClientHelloInfo = helloInfo,
+ State = _tlsConnectionCallbackOptions.OnConnectionState,
+ Connection = currentAcceptingConnection,
+ };
+ var serverAuthenticationOptions = await _tlsConnectionCallbackOptions.OnConnection(context, cancellationToken);
+
+ // If the callback didn't set protocols then use the listener's list of protocols.
+ if (serverAuthenticationOptions.ApplicationProtocols == null)
+ {
+ serverAuthenticationOptions.ApplicationProtocols = _tlsConnectionCallbackOptions.ApplicationProtocols;
+ }
+
+ // If the SslServerAuthenticationOptions doesn't have a cert or protocols then the
+ // QUIC connection will fail and the client receives an unhelpful message.
+ // Validate the options on the server and log issues to improve debugging.
+ ValidateServerAuthenticationOptions(serverAuthenticationOptions);
+
+ var connectionOptions = new QuicServerConnectionOptions
+ {
+ ServerAuthenticationOptions = serverAuthenticationOptions,
+ IdleTimeout = Timeout.InfiniteTimeSpan, // Kestrel manages connection lifetimes itself so it can send GoAway's.
+ MaxInboundBidirectionalStreams = options.MaxBidirectionalStreamCount,
+ MaxInboundUnidirectionalStreams = options.MaxUnidirectionalStreamCount,
+ DefaultCloseErrorCode = options.DefaultCloseErrorCode,
+ DefaultStreamErrorCode = options.DefaultStreamErrorCode,
+ };
+ return connectionOptions;
+ }
+ };
+
+ // Setting to listenEndPoint to prevent the property from being null.
+ // This will be initialized when CreateListenerAsync() is invoked.
+ EndPoint = listenEndPoint;
+ }
- // Listener endpoint will resolve an ephemeral port, e.g. 127.0.0.1:0, into the actual port.
- EndPoint = _listener.ListenEndPoint;
+ private void ValidateServerAuthenticationOptions(SslServerAuthenticationOptions serverAuthenticationOptions)
+ {
+ if (serverAuthenticationOptions.ServerCertificate == null &&
+ serverAuthenticationOptions.ServerCertificateContext == null &&
+ serverAuthenticationOptions.ServerCertificateSelectionCallback == null)
+ {
+ QuicLog.ConnectionListenerCertificateNotSpecified(_log);
+ }
+ if (serverAuthenticationOptions.ApplicationProtocols == null || serverAuthenticationOptions.ApplicationProtocols.Count == 0)
+ {
+ QuicLog.ConnectionListenerApplicationProtocolsNotSpecified(_log);
+ }
}
public EndPoint EndPoint { get; set; }
+ public async ValueTask CreateListenerAsync()
+ {
+ QuicLog.ConnectionListenerStarting(_log, _quicListenerOptions.ListenEndPoint);
+
+ try
+ {
+ _listener = await QuicListener.ListenAsync(_quicListenerOptions);
+ }
+ catch (QuicException ex) when (ex.QuicError == QuicError.AddressInUse)
+ {
+ throw new AddressInUseException(ex.Message, ex);
+ }
+
+ // EndPoint could be configured with an ephemeral port of 0.
+ // Listener endpoint will resolve an ephemeral port, e.g. 127.0.0.1:0, into the actual port
+ // so we need to update the public listener endpoint property.
+ EndPoint = _listener.LocalEndPoint;
+ }
+
public async ValueTask<MultiplexedConnectionContext?> AcceptAsync(IFeatureCollection? features = null, CancellationToken cancellationToken = default)
{
+ if (_listener == null)
+ {
+ throw new InvalidOperationException($"The listener needs to be initialized by calling {nameof(CreateListenerAsync)}.");
+ }
+
try
{
var quicConnection = await _listener.AcceptConnectionAsync(cancellationToken);
- var connectionContext = new QuicConnectionContext(quicConnection, _context);
+
+ if (!_pendingConnections.TryGetValue(quicConnection, out var connectionContext))
+ {
+ throw new InvalidOperationException("Couldn't find ConnectionContext for QuicConnection.");
+ }
+ else
+ {
+ _pendingConnections.Remove(quicConnection);
+ }
+
+ // Verify the connection context was created and set correctly.
+ Debug.Assert(connectionContext != null);
+ Debug.Assert(connectionContext.GetInnerConnection() == quicConnection);
QuicLog.AcceptedConnection(_log, connectionContext);
return connectionContext;
}
- catch (QuicOperationAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError == QuicError.OperationAborted)
{
- _log.LogDebug($"Listener has aborted with exception: {ex.Message}");
+ QuicLog.ConnectionListenerAborted(_log, ex);
}
return null;
}
@@ -76,16 +178,17 @@ internal class QuicConnectionListener : IMultiplexedConnectionListener, IAsyncDi
await DisposeAsync();
}
- public ValueTask DisposeAsync()
+ public async ValueTask DisposeAsync()
{
if (_disposed)
{
- return ValueTask.CompletedTask;
+ return;
}
- _listener.Dispose();
+ if (_listener != null)
+ {
+ await _listener.DisposeAsync();
+ }
_disposed = true;
-
- return ValueTask.CompletedTask;
}
}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicLog.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicLog.cs
index d80fe799a2..d58061344f 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicLog.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicLog.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Net;
+using System.Net.Security;
using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging;
@@ -118,7 +120,7 @@ internal static partial class QuicLog
}
}
- [LoggerMessage(11, LogLevel.Debug, @"Stream id ""{ConnectionId}"" read aborted by peer with error code {ErrorCode}.", EventName = "StreamAborted", SkipEnabledCheck = true)]
+ [LoggerMessage(11, LogLevel.Debug, @"Stream id ""{ConnectionId}"" read aborted by peer with error code {ErrorCode}.", EventName = "StreamAbortedRead", SkipEnabledCheck = true)]
private static partial void StreamAbortedReadCore(ILogger logger, string connectionId, long errorCode);
public static void StreamAbortedRead(ILogger logger, QuicStreamContext streamContext, long errorCode)
@@ -129,7 +131,7 @@ internal static partial class QuicLog
}
}
- [LoggerMessage(12, LogLevel.Debug, @"Stream id ""{ConnectionId}"" write aborted by peer with error code {ErrorCode}.", EventName = "StreamAborted", SkipEnabledCheck = true)]
+ [LoggerMessage(12, LogLevel.Debug, @"Stream id ""{ConnectionId}"" write aborted by peer with error code {ErrorCode}.", EventName = "StreamAbortedWrite", SkipEnabledCheck = true)]
private static partial void StreamAbortedWriteCore(ILogger logger, string connectionId, long errorCode);
public static void StreamAbortedWrite(ILogger logger, QuicStreamContext streamContext, long errorCode)
@@ -151,7 +153,7 @@ internal static partial class QuicLog
}
}
- [LoggerMessage(14, LogLevel.Debug, @"Stream id ""{ConnectionId}"" read side aborted by application with error code {ErrorCode} because: ""{Reason}"".", SkipEnabledCheck = true)]
+ [LoggerMessage(14, LogLevel.Debug, @"Stream id ""{ConnectionId}"" read side aborted by application with error code {ErrorCode} because: ""{Reason}"".", EventName = "StreamAbortRead", SkipEnabledCheck = true)]
private static partial void StreamAbortReadCore(ILogger logger, string connectionId, long errorCode, string reason);
public static void StreamAbortRead(ILogger logger, QuicStreamContext streamContext, long errorCode, string reason)
@@ -162,7 +164,7 @@ internal static partial class QuicLog
}
}
- [LoggerMessage(15, LogLevel.Debug, @"Stream id ""{ConnectionId}"" write side aborted by application with error code {ErrorCode} because: ""{Reason}"".", SkipEnabledCheck = true)]
+ [LoggerMessage(15, LogLevel.Debug, @"Stream id ""{ConnectionId}"" write side aborted by application with error code {ErrorCode} because: ""{Reason}"".", EventName = "StreamAbortWrite", SkipEnabledCheck = true)]
private static partial void StreamAbortWriteCore(ILogger logger, string connectionId, long errorCode, string reason);
public static void StreamAbortWrite(ILogger logger, QuicStreamContext streamContext, long errorCode, string reason)
@@ -173,6 +175,63 @@ internal static partial class QuicLog
}
}
+ [LoggerMessage(16, LogLevel.Trace, @"Stream id ""{ConnectionId}"" pooled for reuse.", EventName = "StreamPooled", SkipEnabledCheck = true)]
+ private static partial void StreamPooledCore(ILogger logger, string connectionId);
+
+ public static void StreamPooled(ILogger logger, QuicStreamContext streamContext)
+ {
+ if (logger.IsEnabled(LogLevel.Trace))
+ {
+ StreamPooledCore(logger, streamContext.ConnectionId);
+ }
+ }
+
+ [LoggerMessage(17, LogLevel.Trace, @"Stream id ""{ConnectionId}"" reused from pool.", EventName = "StreamReused", SkipEnabledCheck = true)]
+ private static partial void StreamReusedCore(ILogger logger, string connectionId);
+
+ public static void StreamReused(ILogger logger, QuicStreamContext streamContext)
+ {
+ if (logger.IsEnabled(LogLevel.Trace))
+ {
+ StreamReusedCore(logger, streamContext.ConnectionId);
+ }
+ }
+
+ [LoggerMessage(18, LogLevel.Warning, $"{nameof(SslServerAuthenticationOptions)} must provide a server certificate using {nameof(SslServerAuthenticationOptions.ServerCertificate)}," +
+ $" {nameof(SslServerAuthenticationOptions.ServerCertificateContext)}, or {nameof(SslServerAuthenticationOptions.ServerCertificateSelectionCallback)}.", EventName = "ConnectionListenerCertificateNotSpecified")]
+ public static partial void ConnectionListenerCertificateNotSpecified(ILogger logger);
+
+ [LoggerMessage(19, LogLevel.Warning, $"{nameof(SslServerAuthenticationOptions)} must provide at least one application protocol using {nameof(SslServerAuthenticationOptions.ApplicationProtocols)}.", EventName = "ConnectionListenerApplicationProtocolsNotSpecified")]
+ public static partial void ConnectionListenerApplicationProtocolsNotSpecified(ILogger logger);
+
+ [LoggerMessage(20, LogLevel.Debug, "QUIC listener starting with configured endpoint {listenEndPoint}.", EventName = "ConnectionListenerStarting")]
+ public static partial void ConnectionListenerStarting(ILogger logger, IPEndPoint listenEndPoint);
+
+ [LoggerMessage(21, LogLevel.Debug, "QUIC listener aborted.", EventName = "ConnectionListenerAborted")]
+ public static partial void ConnectionListenerAborted(ILogger logger, Exception exception);
+
+ [LoggerMessage(22, LogLevel.Debug, @"Stream id ""{ConnectionId}"" read timed out.", EventName = "StreamTimeoutRead", SkipEnabledCheck = true)]
+ private static partial void StreamTimeoutReadCore(ILogger logger, string connectionId);
+
+ public static void StreamTimeoutRead(ILogger logger, QuicStreamContext streamContext)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ StreamTimeoutReadCore(logger, streamContext.ConnectionId);
+ }
+ }
+
+ [LoggerMessage(23, LogLevel.Debug, @"Stream id ""{ConnectionId}"" write timed out.", EventName = "StreamTimeoutWrite", SkipEnabledCheck = true)]
+ private static partial void StreamTimeoutWriteCore(ILogger logger, string connectionId);
+
+ public static void StreamTimeoutWrite(ILogger logger, QuicStreamContext streamContext)
+ {
+ if (logger.IsEnabled(LogLevel.Debug))
+ {
+ StreamTimeoutWriteCore(logger, streamContext.ConnectionId);
+ }
+ }
+
private static StreamType GetStreamType(QuicStreamContext streamContext) =>
streamContext.CanRead && streamContext.CanWrite
? StreamType.Bidirectional
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.FeatureCollection.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.FeatureCollection.cs
index c01209238b..057ae8464e 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.FeatureCollection.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.FeatureCollection.cs
@@ -1,15 +1,25 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Net.Quic;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
-internal sealed partial class QuicStreamContext : IPersistentStateFeature, IStreamDirectionFeature, IProtocolErrorCodeFeature, IStreamIdFeature, IStreamAbortFeature
+internal sealed partial class QuicStreamContext :
+ IPersistentStateFeature,
+ IStreamDirectionFeature,
+ IProtocolErrorCodeFeature,
+ IStreamIdFeature,
+ IStreamAbortFeature,
+ IStreamClosedFeature
{
+ private readonly record struct OnCloseRegistration(Action<object?> Callback, object? State);
+
private IDictionary<object, object?>? _persistentState;
private long? _error;
+ private List<OnCloseRegistration>? _onClosedRegistrations;
public bool CanRead { get; private set; }
public bool CanWrite { get; private set; }
@@ -41,7 +51,7 @@ internal sealed partial class QuicStreamContext : IPersistentStateFeature, IStre
{
_shutdownReadReason = abortReason;
QuicLog.StreamAbortRead(_log, this, errorCode, abortReason.Message);
- _stream.AbortRead(errorCode);
+ _stream.Abort(QuicAbortDirection.Read, errorCode);
}
else
{
@@ -61,7 +71,7 @@ internal sealed partial class QuicStreamContext : IPersistentStateFeature, IStre
{
_shutdownWriteReason = abortReason;
QuicLog.StreamAbortWrite(_log, this, errorCode, abortReason.Message);
- _stream.AbortWrite(errorCode);
+ _stream.Abort(QuicAbortDirection.Write, errorCode);
}
else
{
@@ -71,6 +81,25 @@ internal sealed partial class QuicStreamContext : IPersistentStateFeature, IStre
}
}
+ void IStreamClosedFeature.OnClosed(Action<object?> callback, object? state)
+ {
+ lock (_shutdownLock)
+ {
+ if (!_streamClosed)
+ {
+ if (_onClosedRegistrations == null)
+ {
+ _onClosedRegistrations = new List<OnCloseRegistration>();
+ }
+ _onClosedRegistrations.Add(new OnCloseRegistration(callback, state));
+ return;
+ }
+ }
+
+ // Stream has already closed. Execute callback inline.
+ callback(state);
+ }
+
private void InitializeFeatures()
{
_currentIPersistentStateFeature = this;
@@ -78,5 +107,6 @@ internal sealed partial class QuicStreamContext : IPersistentStateFeature, IStre
_currentIProtocolErrorCodeFeature = this;
_currentIStreamIdFeature = this;
_currentIStreamAbortFeature = this;
+ _currentIStreamClosedFeature = this;
}
}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.cs
index d7a47b65d5..9a95793a59 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicStreamContext.cs
@@ -5,6 +5,7 @@ using System.Buffers;
using System.Diagnostics;
using System.IO.Pipelines;
using System.Net.Quic;
+using System.Runtime.CompilerServices;
using System.Runtime.ExceptionServices;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
@@ -14,6 +15,8 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
internal partial class QuicStreamContext : TransportConnection, IPooledStream, IDisposable
{
+ private static readonly ConnectionAbortedException SendGracefullyCompletedException = new ConnectionAbortedException("The QUIC transport's send loop completed gracefully.");
+
// Internal for testing.
internal Task _processingTask = Task.CompletedTask;
@@ -27,7 +30,7 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
private readonly CompletionPipeReader _transportPipeReader;
private readonly CompletionPipeWriter _transportPipeWriter;
private readonly ILogger _log;
- private CancellationTokenSource _streamClosedTokenSource = default!;
+ private CancellationTokenSource? _streamClosedTokenSource;
private string? _connectionId;
private const int MinAllocBufferSize = 4096;
private volatile Exception? _shutdownReadReason;
@@ -37,7 +40,6 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
private bool _streamClosed;
private bool _serverAborted;
private bool _clientAbort;
- private TaskCompletionSource _waitForConnectionClosedTcs = default!;
private readonly object _shutdownLock = new object();
public QuicStreamContext(QuicConnectionContext connection, QuicTransportContext context)
@@ -80,19 +82,15 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
_stream = stream;
- if (!(_streamClosedTokenSource?.TryReset() ?? false))
- {
- _streamClosedTokenSource = new CancellationTokenSource();
- }
-
- ConnectionClosed = _streamClosedTokenSource.Token;
+ _streamClosedTokenSource = null;
+ _onClosedRegistrations?.Clear();
InitializeFeatures();
CanRead = _stream.CanRead;
CanWrite = _stream.CanWrite;
_error = null;
- StreamId = _stream.StreamId;
+ StreamId = _stream.Id;
PoolExpirationTicks = 0;
Transport = _originalTransport;
@@ -107,8 +105,6 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
_streamClosed = false;
_serverAborted = false;
_clientAbort = false;
- // TODO - resetable TCS
- _waitForConnectionClosedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
// Only reset pipes if the stream has been reused.
if (CanReuse)
@@ -120,6 +116,20 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
CanReuse = false;
}
+ public override CancellationToken ConnectionClosed
+ {
+ get
+ {
+ // Allocate CTS only if requested.
+ if (_streamClosedTokenSource == null)
+ {
+ _streamClosedTokenSource = new CancellationTokenSource();
+ }
+ return _streamClosedTokenSource.Token;
+ }
+ set => throw new NotSupportedException();
+ }
+
public override string ConnectionId
{
get => _connectionId ??= StringUtilities.ConcatAsHexSuffix(_connection.ConnectionId, ':', (uint)StreamId);
@@ -143,24 +153,24 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
{
// Spawn send and receive logic
// Streams may or may not have reading/writing, so only start tasks accordingly
- var receiveTask = Task.CompletedTask;
- var sendTask = Task.CompletedTask;
+ var receiveTask = ValueTask.CompletedTask;
+ var sendTask = ValueTask.CompletedTask;
if (_stream.CanRead)
{
- receiveTask = DoReceive();
+ receiveTask = DoReceiveAsync();
}
if (_stream.CanWrite)
{
- sendTask = DoSend();
+ sendTask = DoSendAsync();
}
// Now wait for both to complete
await receiveTask;
await sendTask;
- await FireStreamClosedAsync();
+ FireStreamClosed();
}
catch (Exception ex)
{
@@ -168,13 +178,14 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
}
}
- private async Task WaitForWritesCompleted()
+ [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
+ private async ValueTask WaitForWritesClosedAsync()
{
Debug.Assert(_stream != null);
try
{
- await _stream.WaitForWriteCompletionAsync();
+ await _stream.WritesClosed;
}
catch (Exception ex)
{
@@ -187,7 +198,8 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
}
}
- private async Task DoReceive()
+ [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
+ private async ValueTask DoReceiveAsync()
{
Debug.Assert(_stream != null);
@@ -211,7 +223,7 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
ValueTask<FlushResult> flushTask;
- if (_stream.ReadsCompleted)
+ if (_stream.ReadsClosed.IsCompletedSuccessfully)
{
// If the data returned from ReadAsync is the final chunk on the stream then
// flush data and end pipe together with CompleteAsync.
@@ -258,29 +270,26 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
}
}
}
- catch (QuicStreamAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError is QuicError.StreamAborted or QuicError.ConnectionAborted)
{
// Abort from peer.
- _error = ex.ErrorCode;
- QuicLog.StreamAbortedRead(_log, this, ex.ErrorCode);
+ _error = ex.ApplicationErrorCode;
+ QuicLog.StreamAbortedRead(_log, this, ex.ApplicationErrorCode.GetValueOrDefault());
// This could be ignored if _shutdownReason is already set.
error = new ConnectionResetException(ex.Message, ex);
_clientAbort = true;
}
- catch (QuicConnectionAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError is QuicError.ConnectionIdle)
{
- // Abort from peer.
- _error = ex.ErrorCode;
- QuicLog.StreamAbortedRead(_log, this, ex.ErrorCode);
+ // Abort from timeout.
+ QuicLog.StreamTimeoutRead(_log, this);
// This could be ignored if _shutdownReason is already set.
error = new ConnectionResetException(ex.Message, ex);
-
- _clientAbort = true;
}
- catch (QuicOperationAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError is QuicError.OperationAborted)
{
// AbortRead has been called for the stream.
error = new ConnectionAbortedException(ex.Message, ex);
@@ -309,30 +318,39 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
return _shutdownReadReason ?? _shutdownReason ?? error;
}
- private Task FireStreamClosedAsync()
+ private void FireStreamClosed()
{
// Guard against scheduling this multiple times
- if (_streamClosed)
+ lock (_shutdownLock)
{
- return Task.CompletedTask;
+ if (_streamClosed)
+ {
+ return;
+ }
+
+ _streamClosed = true;
}
- _streamClosed = true;
+ var onClosed = _onClosedRegistrations;
- ThreadPool.UnsafeQueueUserWorkItem(state =>
+ if (onClosed != null)
{
- state.CancelConnectionClosedToken();
-
- state._waitForConnectionClosedTcs.TrySetResult();
- },
- this,
- preferLocal: false);
+ foreach (var closeAction in onClosed)
+ {
+ closeAction.Callback(closeAction.State);
+ }
+ }
- return _waitForConnectionClosedTcs.Task;
+ if (_streamClosedTokenSource != null)
+ {
+ CancelConnectionClosedToken();
+ }
}
private void CancelConnectionClosedToken()
{
+ Debug.Assert(_streamClosedTokenSource != null);
+
try
{
_streamClosedTokenSource.Cancel();
@@ -343,14 +361,18 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
}
}
- private async Task DoSend()
+ [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
+ private async ValueTask DoSendAsync()
{
Debug.Assert(_stream != null);
Exception? shutdownReason = null;
Exception? unexpectedError = null;
- var sendCompletedTask = WaitForWritesCompleted();
+ // A client can abort a stream after it has finished sending data. We need a way to get that notification
+ // which is why we listen for a notification that the write-side of the stream is done.
+ // An exception can be thrown from the stream on client abort which will be captured and then wake up the output read.
+ var waitForWritesClosedTask = WaitForWritesClosedAsync();
try
{
@@ -378,7 +400,26 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
var isCompleted = result.IsCompleted;
if (!buffer.IsEmpty)
{
- await _stream.WriteAsync(buffer, endStream: isCompleted);
+ if (buffer.IsSingleSegment)
+ {
+ // Fast path when the buffer is a single segment.
+ await _stream.WriteAsync(buffer.First, completeWrites: isCompleted);
+ }
+ else
+ {
+ // When then buffer has multiple segments then write them in a loop.
+ // We're not using a standard foreach here because we want to detect
+ // the final write and pass end stream flag with that write.
+ var enumerator = buffer.GetEnumerator();
+ var isLastSegment = !enumerator.MoveNext();
+
+ while (!isLastSegment)
+ {
+ var currentSegment = enumerator.Current;
+ isLastSegment = !enumerator.MoveNext();
+ await _stream.WriteAsync(currentSegment, completeWrites: isLastSegment && isCompleted);
+ }
+ }
}
output.AdvanceTo(end);
@@ -390,29 +431,26 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
}
}
}
- catch (QuicStreamAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError is QuicError.StreamAborted or QuicError.ConnectionAborted)
{
// Abort from peer.
- _error = ex.ErrorCode;
- QuicLog.StreamAbortedWrite(_log, this, ex.ErrorCode);
+ _error = ex.ApplicationErrorCode;
+ QuicLog.StreamAbortedWrite(_log, this, ex.ApplicationErrorCode.GetValueOrDefault());
// This could be ignored if _shutdownReason is already set.
shutdownReason = new ConnectionResetException(ex.Message, ex);
_clientAbort = true;
}
- catch (QuicConnectionAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError is QuicError.ConnectionIdle)
{
- // Abort from peer.
- _error = ex.ErrorCode;
- QuicLog.StreamAbortedWrite(_log, this, ex.ErrorCode);
+ // Abort from timeout.
+ QuicLog.StreamTimeoutWrite(_log, this);
// This could be ignored if _shutdownReason is already set.
shutdownReason = new ConnectionResetException(ex.Message, ex);
-
- _clientAbort = true;
}
- catch (QuicOperationAbortedException ex)
+ catch (QuicException ex) when (ex.QuicError is QuicError.OperationAborted)
{
// AbortWrite has been called for the stream.
// Possibily might also get here from connection closing.
@@ -428,7 +466,8 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
finally
{
ShutdownWrite(_shutdownWriteReason ?? _shutdownReason ?? shutdownReason);
- await sendCompletedTask;
+
+ await waitForWritesClosedTask;
// Complete the output after completing stream sends
Output.Complete(unexpectedError);
@@ -440,32 +479,38 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
public override void Abort(ConnectionAbortedException abortReason)
{
- // This abort is called twice, make sure that doesn't happen.
- // Don't call _stream.Shutdown and _stream.Abort at the same time.
- if (_serverAborted)
+ // Make local copy of reference to avoid possibility of race with stream being set to null in dispose.
+ var stream = _stream;
+
+ lock (_shutdownLock)
{
- return;
- }
+ // Abort called after dispose. Stream is set to null in dispose.
+ if (stream == null)
+ {
+ return;
+ }
- _serverAborted = true;
- _shutdownReason = abortReason;
+ // This abort is called twice, make sure that doesn't happen.
+ // Don't call _stream.Shutdown and _stream.Abort at the same time.
+ if (_serverAborted)
+ {
+ return;
+ }
+
+ _serverAborted = true;
+ _shutdownReason = abortReason;
+ }
var resolvedErrorCode = _error ?? 0;
QuicLog.StreamAbort(_log, this, resolvedErrorCode, abortReason.Message);
- lock (_shutdownLock)
+ if (stream.CanRead)
{
- if (_stream != null)
- {
- if (_stream.CanRead)
- {
- _stream.AbortRead(resolvedErrorCode);
- }
- if (_stream.CanWrite)
- {
- _stream.AbortWrite(resolvedErrorCode);
- }
- }
+ stream.Abort(QuicAbortDirection.Read, resolvedErrorCode);
+ }
+ if (stream.CanWrite)
+ {
+ stream.Abort(QuicAbortDirection.Write, resolvedErrorCode);
}
// Cancel ProcessSends loop after calling shutdown to ensure the correct _shutdownReason gets set.
@@ -480,11 +525,10 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
{
lock (_shutdownLock)
{
- // TODO: Exception is always allocated. Consider only allocating if receive hasn't completed.
- _shutdownReason = shutdownReason ?? new ConnectionAbortedException("The QUIC transport's send loop completed gracefully.");
+ _shutdownReason = shutdownReason ?? SendGracefullyCompletedException;
QuicLog.StreamShutdownWrite(_log, this, _shutdownReason.Message);
- _stream.Shutdown();
+ _stream.CompleteWrites();
}
}
catch (Exception ex)
@@ -494,6 +538,7 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
}
}
+ [AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder))]
public override async ValueTask DisposeAsync()
{
if (_stream == null)
@@ -506,6 +551,8 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
await _processingTask;
+ await _stream.DisposeAsync();
+
lock (_shutdownLock)
{
// CanReuse must not be calculated while draining stream. It is possible for
@@ -514,7 +561,7 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
//
// Be conservative about what can be pooled.
// Only pool bidirectional streams whose pipes have completed successfully and haven't been aborted.
- CanReuse = _stream.CanRead && _stream.CanWrite
+ CanReuse = CanRead && CanWrite
&& _transportPipeReader.IsCompletedSuccessfully
&& _transportPipeWriter.IsCompletedSuccessfully
&& !_clientAbort
@@ -527,7 +574,7 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
DisposeCore();
}
- _stream.Dispose();
+ // QuicStream can't be reused. Don't hang onto it when QuicStreamContext it potentially cached.
_stream = null!;
}
}
@@ -547,6 +594,6 @@ internal partial class QuicStreamContext : TransportConnection, IPooledStream, I
// Called when the stream is no longer reused.
public void DisposeCore()
{
- _streamClosedTokenSource.Dispose();
+ _streamClosedTokenSource?.Dispose();
}
}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicTransportContext.cs b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicTransportContext.cs
index bd6efb2268..d975d6f737 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicTransportContext.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/Internal/QuicTransportContext.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
-internal class QuicTransportContext
+internal sealed class QuicTransportContext
{
public QuicTransportContext(ILogger log, QuicTransportOptions options)
{
diff --git a/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj b/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj
index ed2ea00b91..59ffd5596c 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj
+++ b/src/Servers/Kestrel/Transport.Quic/src/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj
@@ -7,8 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;kestrel</PackageTags>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
- <NoWarn>CA1416;CS0436;$(NoWarn)</NoWarn><!-- Conflicts between internal and public Quic APIs; Platform support warnings. -->
- <NoWarn>$(NoWarn);IDE0060</NoWarn> <!-- This project is work in progress and has incomplete APIs -->
+ <NoWarn>$(NoWarn);CA2252;CA1416</NoWarn><!-- Ignore preview features in System.Net.Quic; Platform support warnings. -->
<IsPackable>false</IsPackable>
<IsTrimmable>true</IsTrimmable>
</PropertyGroup>
diff --git a/src/Servers/Kestrel/Transport.Quic/src/PublicAPI.Unshipped.txt b/src/Servers/Kestrel/Transport.Quic/src/PublicAPI.Unshipped.txt
index 7dc5c58110..4e800a7e05 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/PublicAPI.Unshipped.txt
+++ b/src/Servers/Kestrel/Transport.Quic/src/PublicAPI.Unshipped.txt
@@ -1 +1,11 @@
#nullable enable
+Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.DefaultCloseErrorCode.get -> long
+Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.DefaultCloseErrorCode.set -> void
+Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.DefaultStreamErrorCode.get -> long
+Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.DefaultStreamErrorCode.set -> void
+Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.MaxBidirectionalStreamCount.get -> int
+Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.MaxUnidirectionalStreamCount.get -> int
+*REMOVED*Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.IdleTimeout.get -> System.TimeSpan
+*REMOVED*Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.IdleTimeout.set -> void
+*REMOVED*Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.MaxBidirectionalStreamCount.get -> ushort
+*REMOVED*Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.QuicTransportOptions.MaxUnidirectionalStreamCount.get -> ushort
diff --git a/src/Servers/Kestrel/Transport.Quic/src/QuicConnectionFactory.cs b/src/Servers/Kestrel/Transport.Quic/src/QuicConnectionFactory.cs
deleted file mode 100644
index 403cb17ce8..0000000000
--- a/src/Servers/Kestrel/Transport.Quic/src/QuicConnectionFactory.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Net;
-using System.Net.Quic;
-using System.Net.Security;
-using Microsoft.AspNetCore.Connections;
-using Microsoft.AspNetCore.Http.Features;
-using Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-
-namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic;
-
-// Not used anywhere. Remove?
-internal class QuicConnectionFactory : IMultiplexedConnectionFactory
-{
- private readonly QuicTransportContext _transportContext;
-
- public QuicConnectionFactory(IOptions<QuicTransportOptions> options, ILoggerFactory loggerFactory)
- {
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
-
- var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Client");
-
- _transportContext = new QuicTransportContext(logger, options.Value);
- }
-
- public async ValueTask<MultiplexedConnectionContext> ConnectAsync(EndPoint endPoint, IFeatureCollection? features = null, CancellationToken cancellationToken = default)
- {
- if (endPoint is not IPEndPoint)
- {
- throw new NotSupportedException($"{endPoint} is not supported");
- }
-
- var sslOptions = features?.Get<SslClientAuthenticationOptions>();
- var connection = new QuicConnection(QuicImplementationProviders.MsQuic, (IPEndPoint)endPoint, sslOptions);
-
- await connection.ConnectAsync(cancellationToken);
- return new QuicConnectionContext(connection, _transportContext);
- }
-}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/QuicTransportFactory.cs b/src/Servers/Kestrel/Transport.Quic/src/QuicTransportFactory.cs
index cc0c3aaf20..61d51540d0 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/QuicTransportFactory.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/QuicTransportFactory.cs
@@ -2,7 +2,6 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Net;
-using System.Net.Security;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
@@ -14,22 +13,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic;
/// <summary>
/// A factory for QUIC based connections.
/// </summary>
-internal class QuicTransportFactory : IMultiplexedConnectionListenerFactory
+internal sealed class QuicTransportFactory : IMultiplexedConnectionListenerFactory
{
private readonly ILogger _log;
private readonly QuicTransportOptions _options;
public QuicTransportFactory(ILoggerFactory loggerFactory, IOptions<QuicTransportOptions> options)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
+ ArgumentNullException.ThrowIfNull(options);
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(loggerFactory);
var logger = loggerFactory.CreateLogger("Microsoft.AspNetCore.Server.Kestrel.Transport.Quic");
_log = logger;
@@ -43,29 +36,24 @@ internal class QuicTransportFactory : IMultiplexedConnectionListenerFactory
/// <param name="features">Additional features to be used to create the listener.</param>
/// <param name="cancellationToken">To cancel the </param>
/// <returns>A </returns>
- public ValueTask<IMultiplexedConnectionListener> BindAsync(EndPoint endpoint, IFeatureCollection? features = null, CancellationToken cancellationToken = default)
+ public async ValueTask<IMultiplexedConnectionListener> BindAsync(EndPoint endpoint, IFeatureCollection? features = null, CancellationToken cancellationToken = default)
{
- if (endpoint == null)
- {
- throw new ArgumentNullException(nameof(endpoint));
- }
+ ArgumentNullException.ThrowIfNull(endpoint);
- var sslServerAuthenticationOptions = features?.Get<SslServerAuthenticationOptions>();
+ var tlsConnectionOptions = features?.Get<TlsConnectionCallbackOptions>();
- if (sslServerAuthenticationOptions == null)
+ if (tlsConnectionOptions == null)
{
throw new InvalidOperationException("Couldn't find HTTPS configuration for QUIC transport.");
}
- if (sslServerAuthenticationOptions.ServerCertificate == null
- && sslServerAuthenticationOptions.ServerCertificateContext == null
- && sslServerAuthenticationOptions.ServerCertificateSelectionCallback == null)
+ if (tlsConnectionOptions.ApplicationProtocols == null || tlsConnectionOptions.ApplicationProtocols.Count == 0)
{
- var message = $"{nameof(SslServerAuthenticationOptions)} must provide a server certificate using {nameof(SslServerAuthenticationOptions.ServerCertificate)},"
- + $" {nameof(SslServerAuthenticationOptions.ServerCertificateContext)}, or {nameof(SslServerAuthenticationOptions.ServerCertificateSelectionCallback)}.";
- throw new InvalidOperationException(message);
+ throw new InvalidOperationException("No application protocols specified for QUIC transport.");
}
- var transport = new QuicConnectionListener(_options, _log, endpoint, sslServerAuthenticationOptions);
- return new ValueTask<IMultiplexedConnectionListener>(transport);
+ var transport = new QuicConnectionListener(_options, _log, endpoint, tlsConnectionOptions);
+ await transport.CreateListenerAsync();
+
+ return transport;
}
}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/QuicTransportOptions.cs b/src/Servers/Kestrel/Transport.Quic/src/QuicTransportOptions.cs
index 5f07fe1c76..7896c8c237 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/QuicTransportOptions.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/QuicTransportOptions.cs
@@ -8,22 +8,20 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic;
/// <summary>
/// Options for Quic based connections.
/// </summary>
-public class QuicTransportOptions
+public sealed class QuicTransportOptions
{
+ private long _defaultStreamErrorCode;
+ private long _defaultCloseErrorCode;
+
/// <summary>
/// The maximum number of concurrent bi-directional streams per connection.
/// </summary>
- public ushort MaxBidirectionalStreamCount { get; set; } = 100;
+ public int MaxBidirectionalStreamCount { get; set; } = 100;
/// <summary>
/// The maximum number of concurrent inbound uni-directional streams per connection.
/// </summary>
- public ushort MaxUnidirectionalStreamCount { get; set; } = 10;
-
- /// <summary>
- /// Sets the idle timeout for connections and streams.
- /// </summary>
- public TimeSpan IdleTimeout { get; set; } = TimeSpan.FromSeconds(130); // Matches KestrelServerLimits.KeepAliveTimeout.
+ public int MaxUnidirectionalStreamCount { get; set; } = 10;
/// <summary>
/// The maximum read size.
@@ -40,5 +38,42 @@ public class QuicTransportOptions
/// </summary>
public int Backlog { get; set; } = 512;
+ /// <summary>
+ /// Error code used when the stream needs to abort the read or write side of the stream internally.
+ /// </summary>
+ public long DefaultStreamErrorCode
+ {
+ get => _defaultStreamErrorCode;
+ set
+ {
+ ValidateErrorCode(value);
+ _defaultStreamErrorCode = value;
+ }
+ }
+
+ /// <summary>
+ /// Error code used when an open connection is disposed.
+ /// </summary>
+ public long DefaultCloseErrorCode
+ {
+ get => _defaultCloseErrorCode;
+ set
+ {
+ ValidateErrorCode(value);
+ _defaultCloseErrorCode = value;
+ }
+ }
+
+ private static void ValidateErrorCode(long errorCode)
+ {
+ const long MinErrorCode = 0;
+ const long MaxErrorCode = (1L << 62) - 1;
+
+ if (errorCode < MinErrorCode || errorCode > MaxErrorCode)
+ {
+ throw new ArgumentOutOfRangeException(nameof(errorCode), errorCode, $"A value between {MinErrorCode} and {MaxErrorCode} is required.");
+ }
+ }
+
internal ISystemClock SystemClock = new SystemClock();
}
diff --git a/src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs b/src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs
index 0776270212..ad59ed4f99 100644
--- a/src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs
+++ b/src/Servers/Kestrel/Transport.Quic/src/WebHostBuilderQuicExtensions.cs
@@ -20,7 +20,7 @@ public static class WebHostBuilderQuicExtensions
/// <returns>The <see cref="IWebHostBuilder"/>.</returns>
public static IWebHostBuilder UseQuic(this IWebHostBuilder hostBuilder)
{
- if (QuicImplementationProviders.Default.IsSupported)
+ if (QuicListener.IsSupported)
{
return hostBuilder.ConfigureServices(services =>
{
diff --git a/src/Servers/Kestrel/Transport.Quic/test/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests.csproj b/src/Servers/Kestrel/Transport.Quic/test/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests.csproj
index 8a954dc2ca..e940f76424 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests.csproj
+++ b/src/Servers/Kestrel/Transport.Quic/test/Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests.csproj
@@ -4,11 +4,14 @@
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ServerGarbageCollection>true</ServerGarbageCollection>
+ <!-- Required for System.Net.Quic which has a preview API in .NET 7 -->
+ <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>
<Compile Include="$(SharedSourceRoot)NullScope.cs" />
<Compile Include="$(SharedSourceRoot)HttpClient\HttpEventSourceListener.cs" Link="shared\HttpEventSourceListener.cs" />
+ <Compile Include="$(SharedSourceRoot)SyncPoint\SyncPoint.cs" Link="SyncPoint.cs" />
<Compile Include="$(KestrelSharedSourceRoot)test\TestResources.cs" Link="shared\TestResources.cs" />
<Compile Include="$(KestrelSharedSourceRoot)test\StreamExtensions.cs" Link="shared\StreamExtensions.cs" />
<Compile Include="$(KestrelSharedSourceRoot)test\KestrelTestLoggerProvider.cs" Link="shared\KestrelTestLoggerProvider.cs" />
@@ -17,11 +20,7 @@
<Compile Include="$(KestrelSharedSourceRoot)test\TransportTestHelpers\IHostPortExtensions.cs" Link="shared\TransportTestHelpers\IHostPortExtensions.cs" />
<Compile Include="$(KestrelSharedSourceRoot)test\TransportTestHelpers\MsQuicSupportedAttribute.cs" Link="shared\TransportTestHelpers\MsQuicSupportedAttribute.cs" />
<Content Include="$(KestrelSharedSourceRoot)test\TestCertificates\*.pfx" LinkBase="shared\TestCertificates" CopyToOutputDirectory="PreserveNewest" />
- </ItemGroup>
-
- <ItemGroup>
- <!-- Required for QUIC & HTTP/3 in .NET 6 - https://github.com/dotnet/runtime/pull/55332 -->
- <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
+ <Compile Include="$(KestrelSharedSourceRoot)test\ServerRetryHelper.cs" LinkBase="shared" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/Kestrel/Transport.Quic/test/NoParallelCollection.cs b/src/Servers/Kestrel/Transport.Quic/test/NoParallelCollection.cs
new file mode 100644
index 0000000000..fb8828bdc1
--- /dev/null
+++ b/src/Servers/Kestrel/Transport.Quic/test/NoParallelCollection.cs
@@ -0,0 +1,10 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests;
+
+// Define test collection for tests to avoid all other tests.
+// Parallelization disable for QUIC test to avoid test flakiness from msquic refusing connections
+// because of high resource usage. See https://github.com/dotnet/runtime/issues/55979
+[CollectionDefinition(nameof(NoParallelCollection), DisableParallelization = true)]
+public partial class NoParallelCollection { }
diff --git a/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionContextTests.cs b/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionContextTests.cs
index 6efc176bb5..60f0d70d37 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionContextTests.cs
+++ b/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionContextTests.cs
@@ -14,17 +14,44 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests;
+[Collection(nameof(NoParallelCollection))]
public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
{
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Hello world");
[ConditionalFact]
[MsQuicSupported]
- public async Task AcceptAsync_CancellationThenAccept_AcceptStreamAfterCancellation()
+ public async Task DisposeAsync_DisposeConnectionAfterAcceptingStream_DefaultCloseErrorCodeReported()
{
// Arrange
- var connectionClosedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(
+ LoggerFactory,
+ defaultCloseErrorCode: (long)Http3ErrorCode.RequestCancelled);
+
+ // Act
+ var acceptTask = connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
+
+ var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
+
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
+
+ await using var serverConnection = await acceptTask.DefaultTimeout();
+
+ await serverConnection.DisposeAsync();
+ // Assert
+ var ex = await ExceptionAssert.ThrowsAsync<QuicException>(
+ () => clientConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional).AsTask(),
+ exceptionMessage: $"Connection aborted by peer ({(long)Http3ErrorCode.RequestCancelled}).");
+
+ Assert.Equal((long)Http3ErrorCode.RequestCancelled, ex.ApplicationErrorCode);
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task AcceptAsync_CancellationThenAccept_AcceptStreamAfterCancellation()
+ {
+ // Arrange
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
// Act
@@ -32,8 +59,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await acceptTask.DefaultTimeout();
@@ -48,7 +74,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
// Wait for stream after cancellation
acceptStreamTask = serverConnection.AcceptAsync();
- await using var clientStream = clientConnection.OpenBidirectionalStream();
+ await using var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData);
// Assert
@@ -74,8 +100,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await acceptTask.DefaultTimeout();
serverConnection.ConnectionClosed.Register(() => connectionClosedTcs.SetResult());
@@ -86,8 +111,9 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
// Assert
var ex = await Assert.ThrowsAsync<ConnectionResetException>(() => acceptStreamTask.AsTask()).DefaultTimeout();
- var innerEx = Assert.IsType<QuicConnectionAbortedException>(ex.InnerException);
- Assert.Equal(256, innerEx.ErrorCode);
+ var innerEx = Assert.IsType<QuicException>(ex.InnerException);
+ Assert.Equal(QuicError.ConnectionAborted, innerEx.QuicError);
+ Assert.Equal(256, innerEx.ApplicationErrorCode.Value);
await connectionClosedTcs.Task.DefaultTimeout();
}
@@ -100,15 +126,14 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
var acceptTask = serverConnection.AcceptAsync();
- await using var clientStream = quicConnection.OpenUnidirectionalStream();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional);
await clientStream.WriteAsync(TestData);
await using var serverStream = await acceptTask.DefaultTimeout();
@@ -126,7 +151,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
serverStream.Transport.Input.AdvanceTo(read.Buffer.End);
// Shutdown client.
- clientStream.Shutdown();
+ clientStream.CompleteWrites();
// Receive shutdown on server.
read = await serverStream.Transport.Input.ReadAsync().DefaultTimeout();
@@ -143,15 +168,14 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
var acceptTask = serverConnection.AcceptAsync();
- await using var clientStream = quicConnection.OpenBidirectionalStream();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData);
await using var serverStream = await acceptTask.DefaultTimeout();
@@ -175,7 +199,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
Assert.Equal(TestData, data);
// Shutdown from client.
- clientStream.Shutdown();
+ clientStream.CompleteWrites();
// Get shutdown from client.
read = await serverStream.Transport.Input.ReadAsync().DefaultTimeout();
@@ -194,13 +218,12 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- var acceptTask = quicConnection.AcceptStreamAsync();
+ var acceptTask = quicConnection.AcceptInboundStreamAsync();
await using var serverStream = await serverConnection.ConnectAsync();
await serverStream.Transport.Output.WriteAsync(TestData).DefaultTimeout();
@@ -240,8 +263,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -252,8 +274,9 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
// Assert
var ex = await Assert.ThrowsAsync<ConnectionResetException>(() => acceptTask).DefaultTimeout();
- var innerEx = Assert.IsType<QuicConnectionAbortedException>(ex.InnerException);
- Assert.Equal((long)Http3ErrorCode.NoError, innerEx.ErrorCode);
+ var innerEx = Assert.IsType<QuicException>(ex.InnerException);
+ Assert.Equal(QuicError.ConnectionAborted, innerEx.QuicError);
+ Assert.Equal((long)Http3ErrorCode.NoError, innerEx.ApplicationErrorCode.Value);
Assert.Equal((long)Http3ErrorCode.NoError, serverConnection.Features.Get<IProtocolErrorCodeFeature>().Error);
}
@@ -266,8 +289,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -278,8 +300,8 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var quicConnectionContext = Assert.IsType<QuicConnectionContext>(serverConnection);
Assert.Equal(0, quicConnectionContext.StreamPool.Count);
- var clientStream = clientConnection.OpenBidirectionalStream();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
@@ -310,8 +332,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -322,8 +343,8 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var quicConnectionContext = Assert.IsType<QuicConnectionContext>(serverConnection);
Assert.Equal(0, quicConnectionContext.StreamPool.Count);
- var clientStream = clientConnection.OpenBidirectionalStream();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
@@ -356,8 +377,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -368,19 +388,19 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var quicConnectionContext = Assert.IsType<QuicConnectionContext>(serverConnection);
Assert.Equal(0, quicConnectionContext.StreamPool.Count);
- var clientStream = clientConnection.OpenBidirectionalStream();
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
- clientStream.AbortWrite((long)Http3ErrorCode.InternalError);
+ clientStream.Abort(QuicAbortDirection.Write, (long)Http3ErrorCode.InternalError);
// Receive abort form client.
var ex = await Assert.ThrowsAsync<ConnectionResetException>(() => serverStream.Transport.Input.ReadAsync().AsTask()).DefaultTimeout();
Assert.Equal("Stream aborted by peer (258).", ex.Message);
- Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicStreamAbortedException)ex.InnerException).ErrorCode);
+ Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicException)ex.InnerException).ApplicationErrorCode.Value);
// Complete reading and then abort.
await serverStream.Transport.Input.CompleteAsync();
@@ -404,8 +424,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -416,19 +435,19 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var quicConnectionContext = Assert.IsType<QuicConnectionContext>(serverConnection);
Assert.Equal(0, quicConnectionContext.StreamPool.Count);
- var clientStream = clientConnection.OpenBidirectionalStream();
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
- clientStream.AbortWrite((long)Http3ErrorCode.InternalError);
+ clientStream.Abort(QuicAbortDirection.Write, (long)Http3ErrorCode.InternalError);
// Receive abort form client.
var serverEx = await Assert.ThrowsAsync<ConnectionResetException>(() => serverStream.Transport.Input.ReadAsync().AsTask()).DefaultTimeout();
Assert.Equal("Stream aborted by peer (258).", serverEx.Message);
- Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicStreamAbortedException)serverEx.InnerException).ErrorCode);
+ Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicException)serverEx.InnerException).ApplicationErrorCode.Value);
serverStream.Features.Get<IProtocolErrorCodeFeature>().Error = (long)Http3ErrorCode.RequestRejected;
serverStream.Abort(new ConnectionAbortedException("Test message."));
@@ -438,8 +457,9 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await serverStream.Transport.Output.CompleteAsync();
var buffer = new byte[1024];
- var clientEx = await Assert.ThrowsAsync<QuicStreamAbortedException>(() => clientStream.ReadAsync(buffer).AsTask()).DefaultTimeout();
- Assert.Equal((long)Http3ErrorCode.RequestRejected, clientEx.ErrorCode);
+ var clientEx = await Assert.ThrowsAsync<QuicException>(() => clientStream.ReadAsync(buffer).AsTask()).DefaultTimeout();
+ Assert.Equal(QuicError.StreamAborted, clientEx.QuicError);
+ Assert.Equal((long)Http3ErrorCode.RequestRejected, clientEx.ApplicationErrorCode.Value);
var quicStreamContext = Assert.IsType<QuicStreamContext>(serverStream);
@@ -457,13 +477,14 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
public async Task StreamPool_Heartbeat_ExpiredStreamRemoved()
{
// Arrange
+ using var httpEventSource = new HttpEventSourceListener(LoggerFactory);
+
var now = new DateTimeOffset(2021, 7, 6, 12, 0, 0, TimeSpan.Zero);
var testSystemClock = new TestSystemClock { UtcNow = now };
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory, testSystemClock);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -474,7 +495,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
var quicConnectionContext = Assert.IsType<QuicConnectionContext>(serverConnection);
Assert.Equal(0, quicConnectionContext.StreamPool.Count);
- var stream1 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection);
+ var stream1 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection, Logger);
Assert.Equal(1, quicConnectionContext.StreamPool.Count);
QuicStreamContext pooledStream = quicConnectionContext.StreamPool._array[0];
@@ -487,7 +508,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
// Not removed.
Assert.Equal(1, quicConnectionContext.StreamPool.Count);
- var stream2 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection);
+ var stream2 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection, Logger);
Assert.Equal(1, quicConnectionContext.StreamPool.Count);
pooledStream = quicConnectionContext.StreamPool._array[0];
@@ -517,8 +538,7 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -551,8 +571,8 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
static async Task SendStream(RequestState requestState)
{
- var clientStream = requestState.QuicConnection.OpenBidirectionalStream();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ var clientStream = await requestState.QuicConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
var serverStream = await requestState.ServerConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
@@ -596,15 +616,14 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
Logger.LogInformation("Client starting stream 1");
- var clientStream1 = clientConnection.OpenBidirectionalStream();
- await clientStream1.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ var clientStream1 = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+ await clientStream1.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
Logger.LogInformation("Server accept stream 1");
var serverStream1 = await serverConnection.AcceptAsync().DefaultTimeout();
@@ -631,8 +650,8 @@ public class QuicConnectionContextTests : TestApplicationErrorLoggerLoggedTest
quicStreamContext1.Dispose();
Logger.LogInformation("Client starting stream 2");
- var clientStream2 = clientConnection.OpenBidirectionalStream();
- await clientStream2.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ var clientStream2 = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+ await clientStream2.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
Logger.LogInformation("Server accept stream 2");
var serverStream2 = await serverConnection.AcceptAsync().DefaultTimeout();
diff --git a/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionListenerTests.cs b/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionListenerTests.cs
index 7205834ae4..4416e80c47 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionListenerTests.cs
+++ b/src/Servers/Kestrel/Transport.Quic/test/QuicConnectionListenerTests.cs
@@ -5,15 +5,19 @@ using System;
using System.Net;
using System.Net.Quic;
using System.Net.Security;
+using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
+using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Testing;
using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests;
+[Collection(nameof(NoParallelCollection))]
public class QuicConnectionListenerTests : TestApplicationErrorLoggerLoggedTest
{
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Hello world");
@@ -44,8 +48,7 @@ public class QuicConnectionListenerTests : TestApplicationErrorLoggerLoggedTest
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
// Assert
await using var serverConnection = await acceptTask.DefaultTimeout();
@@ -72,15 +75,14 @@ public class QuicConnectionListenerTests : TestApplicationErrorLoggerLoggedTest
options.ClientAuthenticationOptions.ClientCertificates = new X509CertificateCollection { testCert };
// Act
- using var quicConnection = new QuicConnection(options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Server waits for stream from client
var serverStreamTask = serverConnection.AcceptAsync().DefaultTimeout();
// Client creates stream
- using var clientStream = quicConnection.OpenBidirectionalStream();
+ using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
// Server finishes accepting
@@ -101,17 +103,220 @@ public class QuicConnectionListenerTests : TestApplicationErrorLoggerLoggedTest
[ConditionalFact]
[MsQuicSupported]
- // https://github.com/dotnet/runtime/issues/57308, RemoteCertificateValidationCallback should allow us to accept a null cert,
- // but it doesn't right now.
[OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)]
- public async Task ClientCertificate_Required_NotSent_ConnectionAborted()
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42389")]
+ public async Task ClientCertificate_Required_NotSent_AcceptedViaCallback()
{
+ using var httpEventSource = new HttpEventSourceListener(LoggerFactory);
+
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory, clientCertificateRequired: true);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(options);
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task AcceptAsync_NoCertificateOrApplicationProtocol_Log()
+ {
+ // Arrange
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(
+ new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = (context, cancellationToken) =>
+ {
+ var options = new SslServerAuthenticationOptions();
+ options.ApplicationProtocols = new List<SslApplicationProtocol>();
+ return ValueTask.FromResult(options);
+ }
+ },
+ LoggerFactory);
+
+ // Act
+ var acceptTask = connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
+
+ var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
+
+ await Assert.ThrowsAsync<AuthenticationException>(() => QuicConnection.ConnectAsync(options).AsTask());
+
+ // Assert
+ Assert.Contains(LogMessages, m => m.EventId.Name == "ConnectionListenerCertificateNotSpecified");
+ Assert.Contains(LogMessages, m => m.EventId.Name == "ConnectionListenerApplicationProtocolsNotSpecified");
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task BindAsync_ListenersSharePort_ThrowAddressInUse()
+ {
+ // Arrange
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
+
+ // Act & Assert
+ var port = ((IPEndPoint)connectionListener.EndPoint).Port;
+
+ // TODO - update to check for AddressInUseException when System.Net.Quic is updated to throw a descriptive error.
+ // See https://github.com/dotnet/aspnetcore/issues/43061
+ await Assert.ThrowsAsync<QuicException>(() => QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory, port: port));
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task AcceptAsync_NoApplicationProtocolsInCallback_DefaultToConnectionProtocols()
+ {
+ // Arrange
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(
+ new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = (context, cancellationToken) =>
+ {
+ var options = new SslServerAuthenticationOptions();
+ options.ServerCertificate = TestResources.GetTestCertificate();
+ return ValueTask.FromResult(options);
+ }
+ },
+ LoggerFactory);
+
+ // Act
+ var acceptTask = connectionListener.AcceptAndAddFeatureAsync();
+
+ var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
+
+ await using var clientConnection = await QuicConnection.ConnectAsync(options).DefaultTimeout();
+ await using var serverConnection = await acceptTask.DefaultTimeout();
+
+ // Assert
+ Assert.Equal(SslApplicationProtocol.Http3, clientConnection.NegotiatedApplicationProtocol);
+ Assert.NotNull(serverConnection);
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task AcceptAsync_Success_RemovedFromPendingConnections()
+ {
+ // Arrange
+ var syncPoint = new SyncPoint();
+
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(
+ new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = async (context, cancellationToken) =>
+ {
+ await syncPoint.WaitToContinue();
+
+ var options = new SslServerAuthenticationOptions();
+ options.ServerCertificate = TestResources.GetTestCertificate();
+ return options;
+ }
+ },
+ LoggerFactory);
+
+ // Act
+ var acceptTask = connectionListener.AcceptAndAddFeatureAsync();
+
+ var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
+
+ var clientConnectionTask = QuicConnection.ConnectAsync(options);
+
+ await syncPoint.WaitForSyncPoint().DefaultTimeout();
+ Assert.Single(connectionListener._pendingConnections);
+
+ syncPoint.Continue();
+
+ await using var serverConnection = await acceptTask.DefaultTimeout();
+ await using var clientConnection = await clientConnectionTask.DefaultTimeout();
+
+ // Assert
+ Assert.NotNull(serverConnection);
+ Assert.NotNull(clientConnection);
+ Assert.Empty(connectionListener._pendingConnections);
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task AcceptAsync_NoCertificateCallback_RemovedFromPendingConnections()
+ {
+ // Arrange
+ var syncPoint = new SyncPoint();
+
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(
+ new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = async (context, cancellationToken) =>
+ {
+ await syncPoint.WaitToContinue();
+
+ // Options are invalid and S.N.Q will throw an error from AcceptConnectionAsync.
+ return new SslServerAuthenticationOptions();
+ }
+ },
+ LoggerFactory);
+
+ // Act
+ var acceptTask = connectionListener.AcceptAndAddFeatureAsync();
+
+ var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
+ var clientConnectionTask = QuicConnection.ConnectAsync(options);
+
+ await syncPoint.WaitForSyncPoint().DefaultTimeout();
+ Assert.Single(connectionListener._pendingConnections);
+
+ syncPoint.Continue();
- var qex = await Assert.ThrowsAsync<QuicException>(async () => await clientConnection.ConnectAsync().DefaultTimeout());
- Assert.StartsWith("Connection has been shutdown by transport.", qex.Message);
+ await Assert.ThrowsAsync<ArgumentException>(() => acceptTask.AsTask()).DefaultTimeout();
+ await Assert.ThrowsAsync<AuthenticationException>(() => clientConnectionTask.AsTask()).DefaultTimeout();
+
+ // Assert
+ for (var i = 0; i < 20; i++)
+ {
+ // Wait until msquic and S.N.Q have finished with QuicConnection and verify it's removed from CWT.
+ GC.Collect();
+ GC.WaitForPendingFinalizers();
+
+ if (connectionListener._pendingConnections.Count() == 0)
+ {
+ return;
+ }
+
+ await Task.Delay(100 * i);
+ }
+
+ throw new Exception("Connection not removed from CWT.");
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task AcceptAsync_TlsCallback_ConnectionContextInArguments()
+ {
+ // Arrange
+ BaseConnectionContext connectionContext = null;
+ await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(
+ new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 },
+ OnConnection = (context, cancellationToken) =>
+ {
+ var options = new SslServerAuthenticationOptions();
+ options.ServerCertificate = TestResources.GetTestCertificate();
+
+ connectionContext = context.Connection;
+
+ return ValueTask.FromResult(options);
+ }
+ },
+ LoggerFactory);
+
+ // Act
+ var acceptTask = connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
+
+ var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
+
+ await using var clientConnection = await QuicConnection.ConnectAsync(options).DefaultTimeout();
+
+ // Assert
+ Assert.NotNull(connectionContext);
}
}
diff --git a/src/Servers/Kestrel/Transport.Quic/test/QuicStreamContextTests.cs b/src/Servers/Kestrel/Transport.Quic/test/QuicStreamContextTests.cs
index 4069ef9eab..4f58b87f22 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/QuicStreamContextTests.cs
+++ b/src/Servers/Kestrel/Transport.Quic/test/QuicStreamContextTests.cs
@@ -11,6 +11,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
using Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Internal;
using Microsoft.AspNetCore.Testing;
@@ -19,6 +20,7 @@ using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests;
+[Collection(nameof(NoParallelCollection))]
public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
{
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Hello world");
@@ -28,16 +30,17 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
public async Task BidirectionalStream_ServerReadsDataAndCompletes_GracefullyClosed()
{
// Arrange
+ using var httpEventSource = new HttpEventSourceListener(LoggerFactory);
+
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection);
+ await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection, Logger);
Assert.Contains(LogMessages, m => m.Message.Contains("send loop completed gracefully"));
@@ -56,13 +59,12 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- var clientStream = clientConnection.OpenBidirectionalStream();
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
@@ -100,39 +102,51 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
public async Task BidirectionalStream_ClientAbortedAfterDisposeCalled_NotPooled()
{
// Arrange
+ using var httpEventSource = new HttpEventSourceListener(LoggerFactory);
+
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- var clientStream = clientConnection.OpenBidirectionalStream();
+ Logger.LogInformation("Client starting stream.");
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
+ var readTask = clientStream.ReadUntilEndAsync();
+
+ Logger.LogInformation("Server accepted stream.");
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
// Server sends a large response that will make it wait to complete sends.
+ Logger.LogInformation("Server writing a large response.");
await serverStream.Transport.Output.WriteAsync(new byte[1024 * 1024 * 32]).DefaultTimeout();
// Complete reading and writing.
+ Logger.LogInformation("Server complete reading and writing.");
await serverStream.Transport.Input.CompleteAsync();
await serverStream.Transport.Output.CompleteAsync();
+ Logger.LogInformation("Client wait to finish reading.");
+ await readTask.DefaultTimeout();
+
var quicStreamContext = Assert.IsType<QuicStreamContext>(serverStream);
// Server starts disposing
+ Logger.LogInformation("Server starts disposing.");
var disposeTask = quicStreamContext.DisposeAsync();
// Client aborts while server is draining
- clientStream.AbortRead((long)Http3ErrorCode.RequestCancelled);
- clientStream.AbortWrite((long)Http3ErrorCode.RequestCancelled);
+ clientStream.Abort(QuicAbortDirection.Read, (long)Http3ErrorCode.RequestCancelled);
+ clientStream.Abort(QuicAbortDirection.Write, (long)Http3ErrorCode.RequestCancelled);
// Server finishes disposing
+ Logger.LogInformation("Wait for server finish disposing.");
await disposeTask.DefaultTimeout();
quicStreamContext.Dispose();
@@ -150,6 +164,8 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
public async Task BidirectionalStream_ServerWritesDataAndDisposes_ClientReadsData(int dataLength)
{
// Arrange
+ using var httpEventSource = new HttpEventSourceListener(LoggerFactory);
+
var testData = new byte[dataLength];
for (int i = 0; i < dataLength; i++)
{
@@ -159,15 +175,14 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
Logger.LogInformation("Client starting stream.");
- var clientStream = clientConnection.OpenBidirectionalStream();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
Logger.LogInformation("Server accepted stream.");
@@ -178,6 +193,9 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
readResult = await serverStream.Transport.Input.ReadAsync().DefaultTimeout();
Assert.True(readResult.IsCompleted);
+ Logger.LogInformation("Client starting to read.");
+ var readingTask = clientStream.ReadUntilEndAsync();
+
Logger.LogInformation("Server sending data.");
await serverStream.Transport.Output.WriteAsync(testData).DefaultTimeout();
@@ -186,7 +204,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await serverStream.Transport.Output.CompleteAsync().DefaultTimeout();
Logger.LogInformation("Client reading until end of stream.");
- var data = await clientStream.ReadUntilEndAsync().DefaultTimeout();
+ var data = await readingTask.DefaultTimeout();
Assert.Equal(testData.Length, data.Length);
Assert.Equal(testData, data);
@@ -214,14 +232,13 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var clientConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await clientConnection.ConnectAsync().DefaultTimeout();
+ await using var clientConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- var stream1 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection);
- var stream2 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection);
+ var stream1 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection, Logger);
+ var stream2 = await QuicTestHelpers.CreateAndCompleteBidirectionalStreamGracefully(clientConnection, serverConnection, Logger);
Assert.Same(stream1, stream2);
@@ -237,13 +254,12 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- await using var clientStream = quicConnection.OpenBidirectionalStream();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
await using var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
@@ -253,7 +269,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
var closedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
serverStream.ConnectionClosed.Register(() => closedTcs.SetResult());
- clientStream.AbortWrite((long)Http3ErrorCode.InternalError);
+ clientStream.Abort(QuicAbortDirection.Write, (long)Http3ErrorCode.InternalError);
// Receive abort from client.
var ex = await Assert.ThrowsAsync<ConnectionResetException>(() => serverStream.Transport.Input.ReadAsync().AsTask()).DefaultTimeout();
@@ -262,7 +278,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await serverStream.Transport.Output.CompleteAsync();
// Assert
- Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicStreamAbortedException)ex.InnerException).ErrorCode);
+ Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicException)ex.InnerException).ApplicationErrorCode.Value);
var quicStreamContext = Assert.IsType<QuicStreamContext>(serverStream);
@@ -282,14 +298,13 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- await using var clientStream = quicConnection.OpenUnidirectionalStream();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional);
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
await using var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
@@ -317,13 +332,12 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- await using var clientStream = quicConnection.OpenUnidirectionalStream();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
await using var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
@@ -333,13 +347,13 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
var closedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
serverStream.ConnectionClosed.Register(() => closedTcs.SetResult());
- clientStream.AbortWrite((long)Http3ErrorCode.InternalError);
+ clientStream.Abort(QuicAbortDirection.Write, (long)Http3ErrorCode.InternalError);
// Receive abort from client.
var ex = await Assert.ThrowsAsync<ConnectionResetException>(() => serverStream.Transport.Input.ReadAsync().AsTask()).DefaultTimeout();
// Assert
- Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicStreamAbortedException)ex.InnerException).ErrorCode);
+ Assert.Equal((long)Http3ErrorCode.InternalError, ((QuicException)ex.InnerException).ApplicationErrorCode.Value);
var quicStreamContext = Assert.IsType<QuicStreamContext>(serverStream);
@@ -357,13 +371,12 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- await using var clientStream = quicConnection.OpenUnidirectionalStream();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Unidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
await using var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
@@ -372,7 +385,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
var readResultTask = serverStream.Transport.Input.ReadAsync();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
// Assert
var completeReadResult = await readResultTask.DefaultTimeout();
@@ -389,8 +402,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -400,7 +412,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
var serverStream = await serverConnection.ConnectAsync(features).DefaultTimeout();
await serverStream.Transport.Output.WriteAsync(TestData).DefaultTimeout();
- await using var clientStream = await quicConnection.AcceptStreamAsync();
+ await using var clientStream = await quicConnection.AcceptInboundStreamAsync();
var data = await clientStream.ReadAtLeastLengthAsync(TestData.Length).DefaultTimeout();
@@ -431,8 +443,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
@@ -442,7 +453,7 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
var serverStream = await serverConnection.ConnectAsync(features).DefaultTimeout();
await serverStream.Transport.Output.WriteAsync(TestData).DefaultTimeout();
- await using var clientStream = await quicConnection.AcceptStreamAsync();
+ await using var clientStream = await quicConnection.AcceptInboundStreamAsync();
var data = await clientStream.ReadAtLeastLengthAsync(TestData.Length).DefaultTimeout();
@@ -452,10 +463,11 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
((IProtocolErrorCodeFeature)serverStream).Error = (long)Http3ErrorCode.InternalError;
serverStream.Abort(new ConnectionAbortedException("Test message"));
- var ex = await Assert.ThrowsAsync<QuicStreamAbortedException>(() => clientStream.ReadAsync(new byte[1024]).AsTask()).DefaultTimeout();
+ var ex = await Assert.ThrowsAsync<QuicException>(() => clientStream.ReadAsync(new byte[1024]).AsTask()).DefaultTimeout();
// Assert
- Assert.Equal((long)Http3ErrorCode.InternalError, ex.ErrorCode);
+ Assert.Equal(QuicError.StreamAborted, ex.QuicError);
+ Assert.Equal((long)Http3ErrorCode.InternalError, ex.ApplicationErrorCode.Value);
var quicStreamContext = Assert.IsType<QuicStreamContext>(serverStream);
Assert.True(quicStreamContext.CanWrite);
@@ -475,13 +487,12 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
await using var connectionListener = await QuicTestHelpers.CreateConnectionListenerFactory(LoggerFactory);
var options = QuicTestHelpers.CreateClientConnectionOptions(connectionListener.EndPoint);
- using var quicConnection = new QuicConnection(QuicImplementationProviders.MsQuic, options);
- await quicConnection.ConnectAsync().DefaultTimeout();
+ await using var quicConnection = await QuicConnection.ConnectAsync(options);
await using var serverConnection = await connectionListener.AcceptAndAddFeatureAsync().DefaultTimeout();
// Act
- await using var clientStream = quicConnection.OpenBidirectionalStream();
+ await using var clientStream = await quicConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
await clientStream.WriteAsync(TestData).DefaultTimeout();
await using var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
@@ -507,8 +518,9 @@ public class QuicStreamContextTests : TestApplicationErrorLoggerLoggedTest
Assert.Equal(TestData, data);
// Client errors when writing
- var clientEx = await Assert.ThrowsAsync<QuicStreamAbortedException>(() => clientStream.WriteAsync(data).AsTask()).DefaultTimeout();
- Assert.Equal((long)Http3ErrorCode.InternalError, clientEx.ErrorCode);
+ var clientEx = await Assert.ThrowsAsync<QuicException>(() => clientStream.WriteAsync(data).AsTask()).DefaultTimeout();
+ Assert.Equal(QuicError.StreamAborted, clientEx.QuicError);
+ Assert.Equal((long)Http3ErrorCode.InternalError, clientEx.ApplicationErrorCode.Value);
// Server errors when reading
var serverEx = await Assert.ThrowsAsync<ConnectionAbortedException>(() => serverReadTask).DefaultTimeout();
diff --git a/src/Servers/Kestrel/Transport.Quic/test/QuicTestHelpers.cs b/src/Servers/Kestrel/Transport.Quic/test/QuicTestHelpers.cs
index 94d3972568..3b26da87cb 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/QuicTestHelpers.cs
+++ b/src/Servers/Kestrel/Transport.Quic/test/QuicTestHelpers.cs
@@ -27,12 +27,15 @@ internal static class QuicTestHelpers
{
private static readonly byte[] TestData = Encoding.UTF8.GetBytes("Hello world");
- public static QuicTransportFactory CreateTransportFactory(ILoggerFactory loggerFactory = null, ISystemClock systemClock = null)
+ public static QuicTransportFactory CreateTransportFactory(
+ ILoggerFactory loggerFactory = null,
+ ISystemClock systemClock = null,
+ long defaultCloseErrorCode = 0)
{
var quicTransportOptions = new QuicTransportOptions();
- quicTransportOptions.IdleTimeout = TimeSpan.FromMinutes(1);
quicTransportOptions.MaxBidirectionalStreamCount = 200;
quicTransportOptions.MaxUnidirectionalStreamCount = 200;
+ quicTransportOptions.DefaultCloseErrorCode = defaultCloseErrorCode;
if (systemClock != null)
{
quicTransportOptions.SystemClock = systemClock;
@@ -41,17 +44,39 @@ internal static class QuicTestHelpers
return new QuicTransportFactory(loggerFactory ?? NullLoggerFactory.Instance, Options.Create(quicTransportOptions));
}
- public static async Task<QuicConnectionListener> CreateConnectionListenerFactory(ILoggerFactory loggerFactory = null, ISystemClock systemClock = null, bool clientCertificateRequired = false)
+ public static async Task<QuicConnectionListener> CreateConnectionListenerFactory(
+ ILoggerFactory loggerFactory = null,
+ ISystemClock systemClock = null,
+ bool clientCertificateRequired = false,
+ long defaultCloseErrorCode = 0,
+ int port = 0)
{
- var transportFactory = CreateTransportFactory(loggerFactory, systemClock);
+ var transportFactory = CreateTransportFactory(
+ loggerFactory,
+ systemClock,
+ defaultCloseErrorCode: defaultCloseErrorCode);
- // Use ephemeral port 0. OS will assign unused port.
- var endpoint = new IPEndPoint(IPAddress.Loopback, 0);
+ var endpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
var features = CreateBindAsyncFeatures(clientCertificateRequired);
return (QuicConnectionListener)await transportFactory.BindAsync(endpoint, features, cancellationToken: CancellationToken.None);
}
+ public static async Task<QuicConnectionListener> CreateConnectionListenerFactory(
+ TlsConnectionCallbackOptions tlsConnectionOptions,
+ ILoggerFactory loggerFactory = null,
+ ISystemClock systemClock = null,
+ int port = 0)
+ {
+ var transportFactory = CreateTransportFactory(loggerFactory, systemClock);
+
+ var endpoint = new IPEndPoint(IPAddress.Loopback, port);
+
+ var features = new FeatureCollection();
+ features.Set(tlsConnectionOptions);
+ return (QuicConnectionListener)await transportFactory.BindAsync(endpoint, features, cancellationToken: CancellationToken.None);
+ }
+
public static FeatureCollection CreateBindAsyncFeatures(bool clientCertificateRequired = false)
{
var cert = TestResources.GetTestCertificate();
@@ -63,7 +88,11 @@ internal static class QuicTestHelpers
sslServerAuthenticationOptions.ClientCertificateRequired = clientCertificateRequired;
var features = new FeatureCollection();
- features.Set(sslServerAuthenticationOptions);
+ features.Set(new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = sslServerAuthenticationOptions.ApplicationProtocols,
+ OnConnection = (context, cancellationToken) => ValueTask.FromResult(sslServerAuthenticationOptions)
+ });
return features;
}
@@ -71,7 +100,7 @@ internal static class QuicTestHelpers
public static async ValueTask<MultiplexedConnectionContext> AcceptAndAddFeatureAsync(this IMultiplexedConnectionListener listener)
{
var connection = await listener.AcceptAsync();
- connection.Features.Set<IConnectionHeartbeatFeature>(new TestConnectionHeartbeatFeature());
+ connection?.Features.Set<IConnectionHeartbeatFeature>(new TestConnectionHeartbeatFeature());
return connection;
}
@@ -91,25 +120,34 @@ internal static class QuicTestHelpers
{
return new QuicClientConnectionOptions
{
- MaxBidirectionalStreams = 200,
- MaxUnidirectionalStreams = 200,
+ MaxInboundBidirectionalStreams = 200,
+ MaxInboundUnidirectionalStreams = 200,
RemoteEndPoint = remoteEndPoint,
ClientAuthenticationOptions = new SslClientAuthenticationOptions
{
ApplicationProtocols = new List<SslApplicationProtocol>
- {
- SslApplicationProtocol.Http3
- },
+ {
+ SslApplicationProtocol.Http3
+ },
RemoteCertificateValidationCallback = RemoteCertificateValidationCallback
- }
+ },
+ DefaultStreamErrorCode = 0,
+ DefaultCloseErrorCode = 0,
};
}
- public static async Task<QuicStreamContext> CreateAndCompleteBidirectionalStreamGracefully(QuicConnection clientConnection, MultiplexedConnectionContext serverConnection)
+ public static async Task<QuicStreamContext> CreateAndCompleteBidirectionalStreamGracefully(QuicConnection clientConnection, MultiplexedConnectionContext serverConnection, ILogger logger)
{
- var clientStream = clientConnection.OpenBidirectionalStream();
- await clientStream.WriteAsync(TestData, endStream: true).DefaultTimeout();
+ logger.LogInformation("Client starting stream.");
+ var clientStream = await clientConnection.OpenOutboundStreamAsync(QuicStreamType.Bidirectional);
+
+ logger.LogInformation("Client sending data.");
+ await clientStream.WriteAsync(TestData, completeWrites: true).DefaultTimeout();
+
+ logger.LogInformation("Server accepting stream.");
var serverStream = await serverConnection.AcceptAsync().DefaultTimeout();
+
+ logger.LogInformation("Server reading data.");
var readResult = await serverStream.Transport.Input.ReadAtLeastAsync(TestData.Length).DefaultTimeout();
serverStream.Transport.Input.AdvanceTo(readResult.Buffer.End);
@@ -118,16 +156,19 @@ internal static class QuicTestHelpers
Assert.True(readResult.IsCompleted);
// Complete reading and writing.
+ logger.LogInformation("Server completing input and output.");
await serverStream.Transport.Input.CompleteAsync();
await serverStream.Transport.Output.CompleteAsync();
var quicStreamContext = Assert.IsType<QuicStreamContext>(serverStream);
// Both send and receive loops have exited.
+ logger.LogInformation("Server verifying stream is finished.");
await quicStreamContext._processingTask.DefaultTimeout();
Assert.True(quicStreamContext.CanWrite);
Assert.True(quicStreamContext.CanRead);
+ logger.LogInformation("Server disposing stream.");
await quicStreamContext.DisposeAsync();
quicStreamContext.Dispose();
diff --git a/src/Servers/Kestrel/Transport.Quic/test/QuicTransportFactoryTests.cs b/src/Servers/Kestrel/Transport.Quic/test/QuicTransportFactoryTests.cs
index 20554a59af..8db0082f85 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/QuicTransportFactoryTests.cs
+++ b/src/Servers/Kestrel/Transport.Quic/test/QuicTransportFactoryTests.cs
@@ -7,6 +7,7 @@ using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Threading;
using System.Threading.Tasks;
+using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Https;
using Microsoft.AspNetCore.Testing;
@@ -16,11 +17,12 @@ using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests;
+[Collection(nameof(NoParallelCollection))]
public class QuicTransportFactoryTests : TestApplicationErrorLoggerLoggedTest
{
[ConditionalFact]
[MsQuicSupported]
- public async Task BindAsync_NoFeature_Error()
+ public async Task BindAsync_NoFeatures_Error()
{
// Arrange
var quicTransportOptions = new QuicTransportOptions();
@@ -35,18 +37,38 @@ public class QuicTransportFactoryTests : TestApplicationErrorLoggerLoggedTest
[ConditionalFact]
[MsQuicSupported]
- public async Task BindAsync_NoServerCertificate_Error()
+ public async Task BindAsync_NoApplicationProtocols_Error()
{
// Arrange
var quicTransportOptions = new QuicTransportOptions();
var quicTransportFactory = new QuicTransportFactory(NullLoggerFactory.Instance, Options.Create(quicTransportOptions));
var features = new FeatureCollection();
- features.Set(new SslServerAuthenticationOptions());
+ features.Set(new TlsConnectionCallbackOptions());
// Act
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => quicTransportFactory.BindAsync(new IPEndPoint(0, 0), features: features, cancellationToken: CancellationToken.None).AsTask()).DefaultTimeout();
// Assert
- Assert.Equal("SslServerAuthenticationOptions must provide a server certificate using ServerCertificate, ServerCertificateContext, or ServerCertificateSelectionCallback.", ex.Message);
+ Assert.Equal("No application protocols specified for QUIC transport.", ex.Message);
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task BindAsync_SslServerAuthenticationOptions_Success()
+ {
+ // Arrange
+ var quicTransportOptions = new QuicTransportOptions();
+ var quicTransportFactory = new QuicTransportFactory(NullLoggerFactory.Instance, Options.Create(quicTransportOptions));
+ var features = new FeatureCollection();
+ features.Set(new TlsConnectionCallbackOptions
+ {
+ ApplicationProtocols = new List<SslApplicationProtocol>
+ {
+ SslApplicationProtocol.Http3
+ }
+ });
+
+ // Act & Assert
+ await quicTransportFactory.BindAsync(new IPEndPoint(0, 0), features: features, cancellationToken: CancellationToken.None).AsTask().DefaultTimeout();
}
}
diff --git a/src/Servers/Kestrel/Transport.Quic/test/WebHostTests.cs b/src/Servers/Kestrel/Transport.Quic/test/WebHostTests.cs
index 1fc8332337..05f64cba02 100644
--- a/src/Servers/Kestrel/Transport.Quic/test/WebHostTests.cs
+++ b/src/Servers/Kestrel/Transport.Quic/test/WebHostTests.cs
@@ -7,12 +7,16 @@ using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Internal;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Hosting;
+using Microsoft.Extensions.Logging;
using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.Tests;
+[Collection(nameof(NoParallelCollection))]
public class WebHostTests : LoggedTest
{
[ConditionalFact]
@@ -21,6 +25,8 @@ public class WebHostTests : LoggedTest
public async Task UseUrls_HelloWorld_ClientSuccess()
{
// Arrange
+ using var httpEventSource = new HttpEventSourceListener(LoggerFactory);
+
var builder = new HostBuilder()
.ConfigureWebHost(webHostBuilder =>
{
@@ -109,7 +115,7 @@ public class WebHostTests : LoggedTest
[ConditionalFact]
[MsQuicSupported]
- public async Task Listen_Http3AndSocketsCoexistOnSameEndpoint_ClientSuccess()
+ public async Task Listen_Http3AndSocketsOnDynamicEndpoint_Http3Disabled()
{
// Arrange
var builder = new HostBuilder()
@@ -118,7 +124,7 @@ public class WebHostTests : LoggedTest
webHostBuilder
.UseKestrel(o =>
{
- o.Listen(IPAddress.Parse("127.0.0.1"), 5005, listenOptions =>
+ o.Listen(IPAddress.Parse("127.0.0.1"), 0, listenOptions =>
{
listenOptions.Protocols = Core.HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps(TestResources.GetTestCertificate());
@@ -137,23 +143,63 @@ public class WebHostTests : LoggedTest
using var host = builder.Build();
await host.StartAsync().DefaultTimeout();
- await CallHttp3AndHttp1EndpointsAsync(http3Port: 5005, http1Port: 5005);
+ Assert.Contains(TestSink.Writes, w => w.Message == CoreStrings.DynamicPortOnMultipleTransportsNotSupported);
await host.StopAsync().DefaultTimeout();
}
[ConditionalFact]
[MsQuicSupported]
+ public async Task Listen_Http3AndSocketsCoexistOnSameEndpoint_ClientSuccess()
+ {
+ await ServerRetryHelper.BindPortsWithRetry(async port =>
+ {
+ // Arrange
+ var builder = new HostBuilder()
+ .ConfigureWebHost(webHostBuilder =>
+ {
+ webHostBuilder
+ .UseKestrel(o =>
+ {
+ o.Listen(IPAddress.Parse("127.0.0.1"), port, listenOptions =>
+ {
+ listenOptions.Protocols = Core.HttpProtocols.Http1AndHttp2AndHttp3;
+ listenOptions.UseHttps(TestResources.GetTestCertificate());
+ });
+ })
+ .Configure(app =>
+ {
+ app.Run(async context =>
+ {
+ await context.Response.WriteAsync("hello, world");
+ });
+ });
+ })
+ .ConfigureServices(AddTestLogging);
+
+ using var host = builder.Build();
+ await host.StartAsync().DefaultTimeout();
+
+ await CallHttp3AndHttp1EndpointsAsync(http3Port: port, http1Port: port);
+
+ await host.StopAsync().DefaultTimeout();
+ }, Logger);
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
public async Task Listen_Http3AndSocketsCoexistOnSameEndpoint_AltSvcEnabled_Upgrade()
{
- // Arrange
- var builder = new HostBuilder()
+ await ServerRetryHelper.BindPortsWithRetry(async port =>
+ {
+ // Arrange
+ var builder = new HostBuilder()
.ConfigureWebHost(webHostBuilder =>
{
webHostBuilder
.UseKestrel(o =>
{
- o.Listen(IPAddress.Parse("127.0.0.1"), 0, listenOptions =>
+ o.Listen(IPAddress.Parse("127.0.0.1"), port, listenOptions =>
{
listenOptions.Protocols = Core.HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps(TestResources.GetTestCertificate());
@@ -169,49 +215,52 @@ public class WebHostTests : LoggedTest
})
.ConfigureServices(AddTestLogging);
- using var host = builder.Build();
- await host.StartAsync().DefaultTimeout();
-
- using (var client = CreateClient())
- {
- // Act
- var request1 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
- request1.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
- var response1 = await client.SendAsync(request1).DefaultTimeout();
-
- // Assert
- response1.EnsureSuccessStatusCode();
- Assert.Equal(HttpVersion.Version20, response1.Version);
- var responseText1 = await response1.Content.ReadAsStringAsync().DefaultTimeout();
- Assert.Equal("hello, world", responseText1);
-
- Assert.True(response1.Headers.TryGetValues("alt-svc", out var altSvcValues1));
- Assert.Single(altSvcValues1, @$"h3="":{host.GetPort()}""");
-
- // Act
- var request2 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
- request2.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
- var response2 = await client.SendAsync(request2).DefaultTimeout();
-
- // Assert
- response2.EnsureSuccessStatusCode();
- Assert.Equal(HttpVersion.Version30, response2.Version);
- var responseText2 = await response2.Content.ReadAsStringAsync().DefaultTimeout();
- Assert.Equal("hello, world", responseText2);
-
- Assert.True(response2.Headers.TryGetValues("alt-svc", out var altSvcValues2));
- Assert.Single(altSvcValues2, @$"h3="":{host.GetPort()}""");
- }
+ using var host = builder.Build();
+ await host.StartAsync().DefaultTimeout();
- await host.StopAsync().DefaultTimeout();
+ using (var client = CreateClient())
+ {
+ // Act
+ var request1 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request1.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+ var response1 = await client.SendAsync(request1).DefaultTimeout();
+
+ // Assert
+ response1.EnsureSuccessStatusCode();
+ Assert.Equal(HttpVersion.Version20, response1.Version);
+ var responseText1 = await response1.Content.ReadAsStringAsync().DefaultTimeout();
+ Assert.Equal("hello, world", responseText1);
+
+ Assert.True(response1.Headers.TryGetValues("alt-svc", out var altSvcValues1));
+ Assert.Single(altSvcValues1, @$"h3="":{host.GetPort()}""");
+
+ // Act
+ var request2 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request2.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+ var response2 = await client.SendAsync(request2).DefaultTimeout();
+
+ // Assert
+ response2.EnsureSuccessStatusCode();
+ Assert.Equal(HttpVersion.Version30, response2.Version);
+ var responseText2 = await response2.Content.ReadAsStringAsync().DefaultTimeout();
+ Assert.Equal("hello, world", responseText2);
+
+ Assert.True(response2.Headers.TryGetValues("alt-svc", out var altSvcValues2));
+ Assert.Single(altSvcValues2, @$"h3="":{host.GetPort()}""");
+ }
+
+ await host.StopAsync().DefaultTimeout();
+ }, Logger);
}
[ConditionalFact]
[MsQuicSupported]
public async Task Listen_Http3AndSocketsCoexistOnSameEndpoint_AltSvcDisabled_NoUpgrade()
{
- // Arrange
- var builder = new HostBuilder()
+ await ServerRetryHelper.BindPortsWithRetry(async port =>
+ {
+ // Arrange
+ var builder = new HostBuilder()
.ConfigureWebHost(webHostBuilder =>
{
webHostBuilder
@@ -221,7 +270,7 @@ public class WebHostTests : LoggedTest
{
listenOptions.DisableAltSvcHeader = true;
});
- o.Listen(IPAddress.Parse("127.0.0.1"), 0, listenOptions =>
+ o.Listen(IPAddress.Parse("127.0.0.1"), port, listenOptions =>
{
listenOptions.Protocols = Core.HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps(TestResources.GetTestCertificate());
@@ -237,39 +286,40 @@ public class WebHostTests : LoggedTest
})
.ConfigureServices(AddTestLogging);
- using var host = builder.Build();
- await host.StartAsync().DefaultTimeout();
-
- using (var client = CreateClient())
- {
- // Act
- var request1 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
- request1.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
- var response1 = await client.SendAsync(request1).DefaultTimeout();
+ using var host = builder.Build();
+ await host.StartAsync().DefaultTimeout();
- // Assert
- response1.EnsureSuccessStatusCode();
- Assert.Equal(HttpVersion.Version20, response1.Version);
- var responseText1 = await response1.Content.ReadAsStringAsync().DefaultTimeout();
- Assert.Equal("hello, world", responseText1);
-
- Assert.False(response1.Headers.Contains("alt-svc"));
-
- // Act
- var request2 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
- request2.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
- var response2 = await client.SendAsync(request2).DefaultTimeout();
-
- // Assert
- response2.EnsureSuccessStatusCode();
- Assert.Equal(HttpVersion.Version20, response2.Version);
- var responseText2 = await response2.Content.ReadAsStringAsync().DefaultTimeout();
- Assert.Equal("hello, world", responseText2);
-
- Assert.False(response2.Headers.Contains("alt-svc"));
- }
-
- await host.StopAsync().DefaultTimeout();
+ using (var client = CreateClient())
+ {
+ // Act
+ var request1 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request1.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+ var response1 = await client.SendAsync(request1).DefaultTimeout();
+
+ // Assert
+ response1.EnsureSuccessStatusCode();
+ Assert.Equal(HttpVersion.Version20, response1.Version);
+ var responseText1 = await response1.Content.ReadAsStringAsync().DefaultTimeout();
+ Assert.Equal("hello, world", responseText1);
+
+ Assert.False(response1.Headers.Contains("alt-svc"));
+
+ // Act
+ var request2 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request2.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+ var response2 = await client.SendAsync(request2).DefaultTimeout();
+
+ // Assert
+ response2.EnsureSuccessStatusCode();
+ Assert.Equal(HttpVersion.Version20, response2.Version);
+ var responseText2 = await response2.Content.ReadAsStringAsync().DefaultTimeout();
+ Assert.Equal("hello, world", responseText2);
+
+ Assert.False(response2.Headers.Contains("alt-svc"));
+ }
+
+ await host.StopAsync().DefaultTimeout();
+ }, Logger);
}
private static async Task CallHttp3AndHttp1EndpointsAsync(int http3Port, int http1Port)
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs b/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs
index 2139250ec1..852684456f 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Client/SocketConnectionFactory.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets;
-internal class SocketConnectionFactory : IConnectionFactory, IAsyncDisposable
+internal sealed class SocketConnectionFactory : IConnectionFactory, IAsyncDisposable
{
private readonly SocketTransportOptions _options;
private readonly MemoryPool<byte> _memoryPool;
@@ -23,15 +23,9 @@ internal class SocketConnectionFactory : IConnectionFactory, IAsyncDisposable
public SocketConnectionFactory(IOptions<SocketTransportOptions> options, ILoggerFactory loggerFactory)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
+ ArgumentNullException.ThrowIfNull(options);
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(loggerFactory);
_options = options.Value;
_memoryPool = options.Value.MemoryPoolFactory();
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/IOQueue.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/IOQueue.cs
index 529b5d6a30..b378718f18 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/IOQueue.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/IOQueue.cs
@@ -8,7 +8,7 @@ using System.IO.Pipelines;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal;
-internal class IOQueue : PipeScheduler, IThreadPoolWorkItem
+internal sealed class IOQueue : PipeScheduler, IThreadPoolWorkItem
{
private readonly ConcurrentQueue<Work> _workItems = new ConcurrentQueue<Work>();
private int _doingWork;
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketAwaitableEventArgs.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketAwaitableEventArgs.cs
index f5571c85f3..86f66c4b94 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketAwaitableEventArgs.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketAwaitableEventArgs.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal;
// 2. Doesn't do ValueTask validation using the token
// 3. Doesn't support usage outside of async/await (doesn't try to capture and restore the execution context)
// 4. Doesn't use cancellation tokens
-internal class SocketAwaitableEventArgs : SocketAsyncEventArgs, IValueTaskSource<int>
+internal class SocketAwaitableEventArgs : SocketAsyncEventArgs, IValueTaskSource<SocketOperationResult>
{
private static readonly Action<object?> _continuationCompleted = _ => { };
@@ -40,21 +40,16 @@ internal class SocketAwaitableEventArgs : SocketAsyncEventArgs, IValueTaskSource
}
}
- public int GetResult(short token)
+ public SocketOperationResult GetResult(short token)
{
_continuation = null;
if (SocketError != SocketError.Success)
{
- ThrowSocketException(SocketError);
+ return new SocketOperationResult(CreateException(SocketError));
}
- return BytesTransferred;
-
- static void ThrowSocketException(SocketError e)
- {
- throw CreateException(e);
- }
+ return new SocketOperationResult(BytesTransferred);
}
protected static SocketException CreateException(SocketError e)
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs
index e986a6a299..ccfabeb310 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketConnection.cs
@@ -143,13 +143,25 @@ internal sealed partial class SocketConnection : TransportConnection
if (_waitForData)
{
// Wait for data before allocating a buffer.
- await _receiver.WaitForDataAsync(_socket);
+ var waitForDataResult = await _receiver.WaitForDataAsync(_socket);
+
+ if (!IsNormalCompletion(waitForDataResult))
+ {
+ break;
+ }
}
// Ensure we have some reasonable amount of buffer space
var buffer = Input.GetMemory(MinAllocBufferSize);
- var bytesReceived = await _receiver.ReceiveAsync(_socket, buffer);
+ var receiveResult = await _receiver.ReceiveAsync(_socket, buffer);
+
+ if (!IsNormalCompletion(receiveResult))
+ {
+ break;
+ }
+
+ var bytesReceived = receiveResult.BytesTransferred;
if (bytesReceived == 0)
{
@@ -181,23 +193,53 @@ internal sealed partial class SocketConnection : TransportConnection
// Pipe consumer is shut down, do we stop writing
break;
}
- }
- }
- catch (SocketException ex) when (IsConnectionResetError(ex.SocketErrorCode))
- {
- // This could be ignored if _shutdownReason is already set.
- error = new ConnectionResetException(ex.Message, ex);
- // There's still a small chance that both DoReceive() and DoSend() can log the same connection reset.
- // Both logs will have the same ConnectionId. I don't think it's worthwhile to lock just to avoid this.
- if (!_socketDisposed)
- {
- SocketsLog.ConnectionReset(_logger, this);
+ bool IsNormalCompletion(SocketOperationResult result)
+ {
+ if (!result.HasError)
+ {
+ return true;
+ }
+
+ if (IsConnectionResetError(result.SocketError.SocketErrorCode))
+ {
+ // This could be ignored if _shutdownReason is already set.
+ var ex = result.SocketError;
+ error = new ConnectionResetException(ex.Message, ex);
+
+ // There's still a small chance that both DoReceive() and DoSend() can log the same connection reset.
+ // Both logs will have the same ConnectionId. I don't think it's worthwhile to lock just to avoid this.
+ if (!_socketDisposed)
+ {
+ SocketsLog.ConnectionReset(_logger, this);
+ }
+
+ return false;
+ }
+
+ if (IsConnectionAbortError(result.SocketError.SocketErrorCode))
+ {
+ // This exception should always be ignored because _shutdownReason should be set.
+ error = result.SocketError;
+
+ if (!_socketDisposed)
+ {
+ // This is unexpected if the socket hasn't been disposed yet.
+ SocketsLog.ConnectionError(_logger, this, error);
+ }
+
+ return false;
+ }
+
+ // This is unexpected.
+ error = result.SocketError;
+ SocketsLog.ConnectionError(_logger, this, error);
+
+ return false;
+ }
}
}
- catch (Exception ex)
- when ((ex is SocketException socketEx && IsConnectionAbortError(socketEx.SocketErrorCode)) ||
- ex is ObjectDisposedException)
+ catch (ObjectDisposedException ex)
{
// This exception should always be ignored because _shutdownReason should be set.
error = ex;
@@ -216,7 +258,7 @@ internal sealed partial class SocketConnection : TransportConnection
}
finally
{
- // If Shutdown() has already bee called, assume that was the reason ProcessReceives() exited.
+ // If Shutdown() has already been called, assume that was the reason ProcessReceives() exited.
Input.Complete(_shutdownReason ?? error);
FireConnectionClosed();
@@ -245,7 +287,29 @@ internal sealed partial class SocketConnection : TransportConnection
if (!buffer.IsEmpty)
{
_sender = _socketSenderPool.Rent();
- await _sender.SendAsync(_socket, buffer);
+ var transferResult = await _sender.SendAsync(_socket, buffer);
+
+ if (transferResult.HasError)
+ {
+ if (IsConnectionResetError(transferResult.SocketError.SocketErrorCode))
+ {
+ var ex = transferResult.SocketError;
+ shutdownReason = new ConnectionResetException(ex.Message, ex);
+ SocketsLog.ConnectionReset(_logger, this);
+
+ break;
+ }
+
+ if (IsConnectionAbortError(transferResult.SocketError.SocketErrorCode))
+ {
+ shutdownReason = transferResult.SocketError;
+
+ break;
+ }
+
+ unexpectedError = shutdownReason = transferResult.SocketError;
+ }
+
// We don't return to the pool if there was an exception, and
// we keep the _sender assigned so that we can dispose it in StartAsync.
_socketSenderPool.Return(_sender);
@@ -260,14 +324,7 @@ internal sealed partial class SocketConnection : TransportConnection
}
}
}
- catch (SocketException ex) when (IsConnectionResetError(ex.SocketErrorCode))
- {
- shutdownReason = new ConnectionResetException(ex.Message, ex);
- SocketsLog.ConnectionReset(_logger, this);
- }
- catch (Exception ex)
- when ((ex is SocketException socketEx && IsConnectionAbortError(socketEx.SocketErrorCode)) ||
- ex is ObjectDisposedException)
+ catch (ObjectDisposedException ex)
{
// This should always be ignored since Shutdown() must have already been called by Abort().
shutdownReason = ex;
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketOperationResult.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketOperationResult.cs
new file mode 100644
index 0000000000..22c76bd9c0
--- /dev/null
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketOperationResult.cs
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Net.Sockets;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal;
+
+internal readonly struct SocketOperationResult
+{
+ public readonly SocketException? SocketError;
+
+ public readonly int BytesTransferred;
+
+ [MemberNotNullWhen(true, nameof(SocketError))]
+ public readonly bool HasError => SocketError != null;
+
+ public SocketOperationResult(int bytesTransferred)
+ {
+ SocketError = null;
+ BytesTransferred = bytesTransferred;
+ }
+
+ public SocketOperationResult(SocketException exception)
+ {
+ SocketError = exception;
+ BytesTransferred = 0;
+ }
+}
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketReceiver.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketReceiver.cs
index 88d8bfe171..917096dfcf 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketReceiver.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketReceiver.cs
@@ -12,37 +12,37 @@ internal sealed class SocketReceiver : SocketAwaitableEventArgs
{
}
- public ValueTask<int> WaitForDataAsync(Socket socket)
+ public ValueTask<SocketOperationResult> WaitForDataAsync(Socket socket)
{
SetBuffer(Memory<byte>.Empty);
if (socket.ReceiveAsync(this))
{
- return new ValueTask<int>(this, 0);
+ return new ValueTask<SocketOperationResult>(this, 0);
}
var bytesTransferred = BytesTransferred;
var error = SocketError;
- return error == SocketError.Success ?
- new ValueTask<int>(bytesTransferred) :
- ValueTask.FromException<int>(CreateException(error));
+ return error == SocketError.Success
+ ? new ValueTask<SocketOperationResult>(new SocketOperationResult(bytesTransferred))
+ : new ValueTask<SocketOperationResult>(new SocketOperationResult(CreateException(error)));
}
- public ValueTask<int> ReceiveAsync(Socket socket, Memory<byte> buffer)
+ public ValueTask<SocketOperationResult> ReceiveAsync(Socket socket, Memory<byte> buffer)
{
SetBuffer(buffer);
if (socket.ReceiveAsync(this))
{
- return new ValueTask<int>(this, 0);
+ return new ValueTask<SocketOperationResult>(this, 0);
}
var bytesTransferred = BytesTransferred;
var error = SocketError;
- return error == SocketError.Success ?
- new ValueTask<int>(bytesTransferred) :
- ValueTask.FromException<int>(CreateException(error));
+ return error == SocketError.Success
+ ? new ValueTask<SocketOperationResult>(new SocketOperationResult(bytesTransferred))
+ : new ValueTask<SocketOperationResult>(new SocketOperationResult(CreateException(error)));
}
}
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSender.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSender.cs
index b6fc02a2d7..ca8e962b1d 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSender.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSender.cs
@@ -17,7 +17,7 @@ internal sealed class SocketSender : SocketAwaitableEventArgs
{
}
- public ValueTask<int> SendAsync(Socket socket, in ReadOnlySequence<byte> buffers)
+ public ValueTask<SocketOperationResult> SendAsync(Socket socket, in ReadOnlySequence<byte> buffers)
{
if (buffers.IsSingleSegment)
{
@@ -28,15 +28,15 @@ internal sealed class SocketSender : SocketAwaitableEventArgs
if (socket.SendAsync(this))
{
- return new ValueTask<int>(this, 0);
+ return new ValueTask<SocketOperationResult>(this, 0);
}
var bytesTransferred = BytesTransferred;
var error = SocketError;
- return error == SocketError.Success ?
- new ValueTask<int>(bytesTransferred) :
- ValueTask.FromException<int>(CreateException(error));
+ return error == SocketError.Success
+ ? new ValueTask<SocketOperationResult>(new SocketOperationResult(bytesTransferred))
+ : new ValueTask<SocketOperationResult>(new SocketOperationResult(CreateException(error)));
}
public void Reset()
@@ -56,21 +56,21 @@ internal sealed class SocketSender : SocketAwaitableEventArgs
}
}
- private ValueTask<int> SendAsync(Socket socket, ReadOnlyMemory<byte> memory)
+ private ValueTask<SocketOperationResult> SendAsync(Socket socket, ReadOnlyMemory<byte> memory)
{
SetBuffer(MemoryMarshal.AsMemory(memory));
if (socket.SendAsync(this))
{
- return new ValueTask<int>(this, 0);
+ return new ValueTask<SocketOperationResult>(this, 0);
}
var bytesTransferred = BytesTransferred;
var error = SocketError;
- return error == SocketError.Success ?
- new ValueTask<int>(bytesTransferred) :
- ValueTask.FromException<int>(CreateException(error));
+ return error == SocketError.Success
+ ? new ValueTask<SocketOperationResult>(new SocketOperationResult(bytesTransferred))
+ : new ValueTask<SocketOperationResult>(new SocketOperationResult(CreateException(error)));
}
private void SetBufferList(in ReadOnlySequence<byte> buffer)
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderPool.cs b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderPool.cs
index 5a53632d77..dcd6ede9b4 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderPool.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/Internal/SocketSenderPool.cs
@@ -6,7 +6,7 @@ using System.IO.Pipelines;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal;
-internal class SocketSenderPool : IDisposable
+internal sealed class SocketSenderPool : IDisposable
{
private const int MaxQueueSize = 1024; // REVIEW: Is this good enough?
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Shipped.txt b/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Shipped.txt
index b6004231c5..ae33a8c32a 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Shipped.txt
+++ b/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Shipped.txt
@@ -1,7 +1,6 @@
#nullable enable
~Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.BindAsync(System.Net.EndPoint endpoint, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.ValueTask<Microsoft.AspNetCore.Connections.IConnectionListener>
-~Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.SocketTransportFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-~Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.SocketTransportFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
+Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.SocketTransportFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
~static Microsoft.AspNetCore.Hosting.WebHostBuilderSocketExtensions.UseSockets(this Microsoft.AspNetCore.Hosting.IWebHostBuilder hostBuilder) -> Microsoft.AspNetCore.Hosting.IWebHostBuilder
~static Microsoft.AspNetCore.Hosting.WebHostBuilderSocketExtensions.UseSockets(this Microsoft.AspNetCore.Hosting.IWebHostBuilder hostBuilder, System.Action<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions> configureOptions) -> Microsoft.AspNetCore.Hosting.IWebHostBuilder
Microsoft.AspNetCore.Hosting.WebHostBuilderSocketExtensions
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Unshipped.txt b/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Unshipped.txt
index 9c72e4caeb..7dc5c58110 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Unshipped.txt
+++ b/src/Servers/Kestrel/Transport.Sockets/src/PublicAPI.Unshipped.txt
@@ -1,4 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.SocketTransportFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.SocketTransportFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions> options, Microsoft.Extensions.Logging.ILoggerFactory loggerFactory) -> void
-Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportFactory.SocketTransportFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.SocketTransportOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs b/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs
index ee9b8bffba..903527ad39 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/SocketConnectionContextFactory.cs
@@ -15,7 +15,6 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets;
/// </summary>
public sealed class SocketConnectionContextFactory : IDisposable
{
- private readonly MemoryPool<byte> _memoryPool;
private readonly SocketConnectionFactoryOptions _options;
private readonly ILogger _logger;
private readonly int _settingsCount;
@@ -31,19 +30,12 @@ public sealed class SocketConnectionContextFactory : IDisposable
/// <param name="logger">The logger.</param>
public SocketConnectionContextFactory(SocketConnectionFactoryOptions options, ILogger logger)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
+ ArgumentNullException.ThrowIfNull(options);
- if (logger == null)
- {
- throw new ArgumentNullException(nameof(logger));
- }
+ ArgumentNullException.ThrowIfNull(logger);
_options = options;
_logger = logger;
- _memoryPool = _options.MemoryPoolFactory();
_settingsCount = _options.IOQueueCount;
var maxReadBufferSize = _options.MaxReadBufferSize ?? 0;
@@ -56,6 +48,7 @@ public sealed class SocketConnectionContextFactory : IDisposable
for (var i = 0; i < _settingsCount; i++)
{
+ var memoryPool = _options.MemoryPoolFactory();
var transportScheduler = options.UnsafePreferInlineScheduling ? PipeScheduler.Inline : new IOQueue();
// https://github.com/aspnet/KestrelHttpServer/issues/2573
var awaiterScheduler = OperatingSystem.IsWindows() ? transportScheduler : PipeScheduler.Inline;
@@ -63,26 +56,29 @@ public sealed class SocketConnectionContextFactory : IDisposable
_settings[i] = new QueueSettings()
{
Scheduler = transportScheduler,
- InputOptions = new PipeOptions(_memoryPool, applicationScheduler, transportScheduler, maxReadBufferSize, maxReadBufferSize / 2, useSynchronizationContext: false),
- OutputOptions = new PipeOptions(_memoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize, maxWriteBufferSize / 2, useSynchronizationContext: false),
- SocketSenderPool = new SocketSenderPool(awaiterScheduler)
+ InputOptions = new PipeOptions(memoryPool, applicationScheduler, transportScheduler, maxReadBufferSize, maxReadBufferSize / 2, useSynchronizationContext: false),
+ OutputOptions = new PipeOptions(memoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize, maxWriteBufferSize / 2, useSynchronizationContext: false),
+ SocketSenderPool = new SocketSenderPool(awaiterScheduler),
+ MemoryPool = memoryPool,
};
}
}
else
{
+ var memoryPool = _options.MemoryPoolFactory();
var transportScheduler = options.UnsafePreferInlineScheduling ? PipeScheduler.Inline : PipeScheduler.ThreadPool;
// https://github.com/aspnet/KestrelHttpServer/issues/2573
var awaiterScheduler = OperatingSystem.IsWindows() ? transportScheduler : PipeScheduler.Inline;
_settings = new QueueSettings[]
{
- new QueueSettings()
- {
- Scheduler = transportScheduler,
- InputOptions = new PipeOptions(_memoryPool, applicationScheduler, transportScheduler, maxReadBufferSize, maxReadBufferSize / 2, useSynchronizationContext: false),
- OutputOptions = new PipeOptions(_memoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize, maxWriteBufferSize / 2, useSynchronizationContext: false),
- SocketSenderPool = new SocketSenderPool(awaiterScheduler)
- }
+ new QueueSettings()
+ {
+ Scheduler = transportScheduler,
+ InputOptions = new PipeOptions(memoryPool, applicationScheduler, transportScheduler, maxReadBufferSize, maxReadBufferSize / 2, useSynchronizationContext: false),
+ OutputOptions = new PipeOptions(memoryPool, transportScheduler, applicationScheduler, maxWriteBufferSize, maxWriteBufferSize / 2, useSynchronizationContext: false),
+ SocketSenderPool = new SocketSenderPool(awaiterScheduler),
+ MemoryPool = memoryPool,
+ }
};
_settingsCount = 1;
}
@@ -98,7 +94,7 @@ public sealed class SocketConnectionContextFactory : IDisposable
var setting = _settings[Interlocked.Increment(ref _settingsIndex) % _settingsCount];
var connection = new SocketConnection(socket,
- _memoryPool,
+ setting.MemoryPool,
setting.Scheduler,
_logger,
setting.SocketSenderPool,
@@ -113,21 +109,20 @@ public sealed class SocketConnectionContextFactory : IDisposable
/// <inheritdoc />
public void Dispose()
{
- // Dispose the memory pool
- _memoryPool.Dispose();
-
- // Dispose any pooled senders
+ // Dispose any pooled senders and memory pools
foreach (var setting in _settings)
{
setting.SocketSenderPool.Dispose();
+ setting.MemoryPool.Dispose();
}
}
- private class QueueSettings
+ private sealed class QueueSettings
{
public PipeScheduler Scheduler { get; init; } = default!;
public PipeOptions InputOptions { get; init; } = default!;
public PipeOptions OutputOptions { get; init; } = default!;
public SocketSenderPool SocketSenderPool { get; init; } = default!;
+ public MemoryPool<byte> MemoryPool { get; init; } = default!;
}
}
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportFactory.cs b/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportFactory.cs
index 650977f7a2..afbe252bb9 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportFactory.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportFactory.cs
@@ -25,15 +25,9 @@ public sealed class SocketTransportFactory : IConnectionListenerFactory
IOptions<SocketTransportOptions> options,
ILoggerFactory loggerFactory)
{
- if (options == null)
- {
- throw new ArgumentNullException(nameof(options));
- }
+ ArgumentNullException.ThrowIfNull(options);
- if (loggerFactory == null)
- {
- throw new ArgumentNullException(nameof(loggerFactory));
- }
+ ArgumentNullException.ThrowIfNull(loggerFactory);
_options = options.Value;
_logger = loggerFactory;
diff --git a/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportOptions.cs b/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportOptions.cs
index 3483cf03fb..d6d93b08dd 100644
--- a/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportOptions.cs
+++ b/src/Servers/Kestrel/Transport.Sockets/src/SocketTransportOptions.cs
@@ -41,18 +41,32 @@ public class SocketTransportOptions
/// The maximum length of the pending connection queue.
/// </summary>
/// <remarks>
- /// Defaults to 512.
+ /// Defaults to 512 pending connections.
/// </remarks>
public int Backlog { get; set; } = 512;
/// <summary>
/// Gets or sets the maximum unconsumed incoming bytes the transport will buffer.
+ /// <para>
+ /// A value of <see langword="null"/> or 0 disables backpressure entirely allowing unlimited buffering.
+ /// Unlimited server buffering is a security risk given untrusted clients.
+ /// </para>
/// </summary>
+ /// <remarks>
+ /// Defaults to 1 MiB.
+ /// </remarks>
public long? MaxReadBufferSize { get; set; } = 1024 * 1024;
/// <summary>
/// Gets or sets the maximum outgoing bytes the transport will buffer before applying write backpressure.
+ /// <para>
+ /// A value of <see langword="null"/> or 0 disables backpressure entirely allowing unlimited buffering.
+ /// Unlimited server buffering is a security risk given untrusted clients.
+ /// </para>
/// </summary>
+ /// <remarks>
+ /// Defaults to 64 KiB.
+ /// </remarks>
public long? MaxWriteBufferSize { get; set; } = 64 * 1024;
/// <summary>
@@ -65,6 +79,9 @@ public class SocketTransportOptions
/// This setting can make performance worse if there is expensive work that will end up holding onto the IO thread for longer than needed.
/// Test to make sure this setting helps performance.
/// </remarks>
+ /// <remarks>
+ /// Defaults to false.
+ /// </remarks>
public bool UnsafePreferInlineScheduling { get; set; }
/// <summary>
@@ -77,6 +94,9 @@ public class SocketTransportOptions
/// calls <see cref="Socket.Bind"/> as part of its implementation, so implementors
/// using this method do not need to call it again.
/// </remarks>
+ /// <remarks>
+ /// Defaults to <see cref="CreateDefaultBoundListenSocket"/>.
+ /// </remarks>
public Func<EndPoint, Socket> CreateBoundListenSocket { get; set; } = CreateDefaultBoundListenSocket;
/// <summary>
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackDecoderBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackDecoderBenchmark.cs
index a8c4c8310b..00bbcb60eb 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackDecoderBenchmark.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/HPackDecoderBenchmark.cs
@@ -109,7 +109,7 @@ public class HPackDecoderBenchmark
_decoder.Decode(_indexedHeaderDynamic_Multiple, endHeaders: true, handler: _testHeadersHandler);
}
- private class TestHeadersHandler : IHttpStreamHeadersHandler
+ private sealed class TestHeadersHandler : IHttpStreamHeadersHandler
{
public void OnDynamicIndexedHeader(int? index, ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
{
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionBenchmarkBase.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionBenchmarkBase.cs
index 8c44390a9a..010d738541 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionBenchmarkBase.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionBenchmarkBase.cs
@@ -1,25 +1,17 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Buffers;
-using System.Buffers.Binary;
using System.Diagnostics;
-using System.IO;
using System.IO.Pipelines;
-using System.Linq;
using System.Net.Http.HPack;
-using System.Threading.Tasks;
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
-using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
using Http2HeadersEnumerator = Microsoft.AspNetCore.Server.Kestrel.Core.Tests.Http2HeadersEnumerator;
@@ -36,25 +28,40 @@ public abstract class Http2ConnectionBenchmarkBase
private int _currentStreamId;
private byte[] _headersBuffer;
private DuplexPipe.DuplexPipePair _connectionPair;
- private Http2Frame _httpFrame;
private int _dataWritten;
+ private Task _requestProcessingTask;
+
+ private readonly Http2Frame _receiveHttpFrame = new();
+ private readonly Http2Frame _sendHttpFrame = new();
protected abstract Task ProcessRequest(HttpContext httpContext);
+ [Params(0, 1, 3)]
+ public int NumCookies { get; set; }
+
public virtual void GlobalSetup()
{
_memoryPool = PinnedBlockMemoryPoolFactory.Create();
- _httpFrame = new Http2Frame();
var options = new PipeOptions(_memoryPool, readerScheduler: PipeScheduler.Inline, writerScheduler: PipeScheduler.Inline, useSynchronizationContext: false);
_connectionPair = DuplexPipe.CreateConnectionPair(options, options);
_httpRequestHeaders = new HttpRequestHeaders();
- _httpRequestHeaders[HeaderNames.Method] = new StringValues("GET");
- _httpRequestHeaders[HeaderNames.Path] = new StringValues("/");
- _httpRequestHeaders[HeaderNames.Scheme] = new StringValues("http");
- _httpRequestHeaders[HeaderNames.Authority] = new StringValues("localhost:80");
+ _httpRequestHeaders[InternalHeaderNames.Method] = new StringValues("GET");
+ _httpRequestHeaders[InternalHeaderNames.Path] = new StringValues("/");
+ _httpRequestHeaders[InternalHeaderNames.Scheme] = new StringValues("http");
+ _httpRequestHeaders[InternalHeaderNames.Authority] = new StringValues("localhost:80");
+
+ if (NumCookies > 0)
+ {
+ var cookies = new string[NumCookies];
+ for (var index = 0; index < NumCookies; index++)
+ {
+ cookies[index] = $"{index}={index + 1}";
+ }
+ _httpRequestHeaders[HeaderNames.Cookie] = cookies;
+ }
_headersBuffer = new byte[1024 * 16];
_hpackEncoder = new DynamicHPackEncoder();
@@ -79,7 +86,7 @@ public abstract class Http2ConnectionBenchmarkBase
_currentStreamId = 1;
- _ = _connection.ProcessRequestsAsync(new DummyApplication(ProcessRequest, new MockHttpContextFactory()));
+ _requestProcessingTask = _connection.ProcessRequestsAsync(new DummyApplication(ProcessRequest, new MockHttpContextFactory()));
_connectionPair.Application.Output.Write(Http2Connection.ClientPreface);
_connectionPair.Application.Output.WriteSettings(new Http2PeerSettings
@@ -89,12 +96,12 @@ public abstract class Http2ConnectionBenchmarkBase
_connectionPair.Application.Output.FlushAsync().GetAwaiter().GetResult();
// Read past connection setup frames
- ReceiveFrameAsync(_connectionPair.Application.Input, _httpFrame).GetAwaiter().GetResult();
- Debug.Assert(_httpFrame.Type == Http2FrameType.SETTINGS);
- ReceiveFrameAsync(_connectionPair.Application.Input, _httpFrame).GetAwaiter().GetResult();
- Debug.Assert(_httpFrame.Type == Http2FrameType.WINDOW_UPDATE);
- ReceiveFrameAsync(_connectionPair.Application.Input, _httpFrame).GetAwaiter().GetResult();
- Debug.Assert(_httpFrame.Type == Http2FrameType.SETTINGS);
+ ReceiveFrameAsync(_connectionPair.Application.Input).GetAwaiter().GetResult();
+ Debug.Assert(_receiveHttpFrame.Type == Http2FrameType.SETTINGS);
+ ReceiveFrameAsync(_connectionPair.Application.Input).GetAwaiter().GetResult();
+ Debug.Assert(_receiveHttpFrame.Type == Http2FrameType.WINDOW_UPDATE);
+ ReceiveFrameAsync(_connectionPair.Application.Input).GetAwaiter().GetResult();
+ Debug.Assert(_receiveHttpFrame.Type == Http2FrameType.SETTINGS);
}
[Benchmark]
@@ -102,32 +109,32 @@ public abstract class Http2ConnectionBenchmarkBase
{
_requestHeadersEnumerator.Initialize(_httpRequestHeaders);
_requestHeadersEnumerator.MoveNext();
- _connectionPair.Application.Output.WriteStartStream(streamId: _currentStreamId, _hpackEncoder, _requestHeadersEnumerator, _headersBuffer, endStream: true, frame: _httpFrame);
+ _connectionPair.Application.Output.WriteStartStream(streamId: _currentStreamId, _hpackEncoder, _requestHeadersEnumerator, _headersBuffer, endStream: true, frame: _sendHttpFrame);
await _connectionPair.Application.Output.FlushAsync();
while (true)
{
- await ReceiveFrameAsync(_connectionPair.Application.Input, _httpFrame);
+ await ReceiveFrameAsync(_connectionPair.Application.Input);
- if (_httpFrame.StreamId != _currentStreamId && _httpFrame.StreamId != 0)
+ if (_receiveHttpFrame.StreamId != _currentStreamId && _receiveHttpFrame.StreamId != 0)
{
- throw new Exception($"Unexpected stream ID: {_httpFrame.StreamId}");
+ throw new Exception($"Unexpected stream ID: {_receiveHttpFrame.StreamId}");
}
- if (_httpFrame.Type == Http2FrameType.DATA)
+ if (_receiveHttpFrame.Type == Http2FrameType.DATA)
{
- _dataWritten += _httpFrame.DataPayloadLength;
+ _dataWritten += _receiveHttpFrame.DataPayloadLength;
}
if (_dataWritten > 1024 * 32)
{
- _connectionPair.Application.Output.WriteWindowUpdateAsync(streamId: 0, _dataWritten, _httpFrame);
+ _connectionPair.Application.Output.WriteWindowUpdateAsync(streamId: 0, _dataWritten, _sendHttpFrame);
await _connectionPair.Application.Output.FlushAsync();
_dataWritten = 0;
}
- if ((_httpFrame.HeadersFlags & Http2HeadersFrameFlags.END_STREAM) == Http2HeadersFrameFlags.END_STREAM)
+ if ((_receiveHttpFrame.HeadersFlags & Http2HeadersFrameFlags.END_STREAM) == Http2HeadersFrameFlags.END_STREAM)
{
break;
}
@@ -136,7 +143,7 @@ public abstract class Http2ConnectionBenchmarkBase
_currentStreamId += 2;
}
- internal async ValueTask ReceiveFrameAsync(PipeReader pipeReader, Http2Frame frame, uint maxFrameSize = Http2PeerSettings.DefaultMaxFrameSize)
+ internal async ValueTask ReceiveFrameAsync(PipeReader pipeReader, uint maxFrameSize = Http2PeerSettings.DefaultMaxFrameSize)
{
while (true)
{
@@ -147,7 +154,7 @@ public abstract class Http2ConnectionBenchmarkBase
try
{
- if (Http2FrameReader.TryReadFrame(ref buffer, frame, maxFrameSize, out var framePayload))
+ if (Http2FrameReader.TryReadFrame(ref buffer, _receiveHttpFrame, maxFrameSize, out var framePayload))
{
consumed = examined = framePayload.End;
return;
@@ -170,9 +177,10 @@ public abstract class Http2ConnectionBenchmarkBase
}
[GlobalCleanup]
- public void Dispose()
+ public async ValueTask DisposeAsync()
{
_connectionPair.Application.Output.Complete();
+ await _requestProcessingTask;
_memoryPool?.Dispose();
}
}
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionEmptyBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionEmptyBenchmark.cs
index 79b6475970..04d395f58d 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionEmptyBenchmark.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http2/Http2ConnectionEmptyBenchmark.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
public class Http2ConnectionBenchmark : Http2ConnectionBenchmarkBase
{
- [Params(0, 128, 1024)]
+ [Params(0)]
public int ResponseDataLength { get; set; }
private string _responseData;
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http3/Http3ConnectionBenchmarkBase.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http3/Http3ConnectionBenchmarkBase.cs
index 8da4320345..9d1b828363 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http3/Http3ConnectionBenchmarkBase.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http3/Http3ConnectionBenchmarkBase.cs
@@ -22,7 +22,6 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Primitives;
-using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
@@ -36,7 +35,7 @@ public abstract class Http3ConnectionBenchmarkBase
protected abstract Task ProcessRequest(HttpContext httpContext);
- private class DefaultTimeoutHandler : ITimeoutHandler
+ private sealed class DefaultTimeoutHandler : ITimeoutHandler
{
public void OnTimeout(TimeoutReason reason) { }
}
@@ -48,10 +47,10 @@ public abstract class Http3ConnectionBenchmarkBase
_httpFrame = new Http3FrameWithPayload();
_httpRequestHeaders = new HttpRequestHeaders();
- _httpRequestHeaders[HeaderNames.Method] = new StringValues("GET");
- _httpRequestHeaders[HeaderNames.Path] = new StringValues("/");
- _httpRequestHeaders[HeaderNames.Scheme] = new StringValues("http");
- _httpRequestHeaders[HeaderNames.Authority] = new StringValues("localhost:80");
+ _httpRequestHeaders[InternalHeaderNames.Method] = new StringValues("GET");
+ _httpRequestHeaders[InternalHeaderNames.Path] = new StringValues("/");
+ _httpRequestHeaders[InternalHeaderNames.Scheme] = new StringValues("http");
+ _httpRequestHeaders[InternalHeaderNames.Authority] = new StringValues("localhost:80");
var serviceContext = TestContextFactory.CreateServiceContext(
serverOptions: new KestrelServerOptions(),
@@ -71,7 +70,7 @@ public abstract class Http3ConnectionBenchmarkBase
{
_requestHeadersEnumerator.Initialize(_httpRequestHeaders);
- var stream = await _http3.CreateRequestStream(_headerHandler);
+ var stream = await _http3.CreateRequestStream(_requestHeadersEnumerator, _headerHandler);
await stream.SendHeadersAsync(_requestHeadersEnumerator);
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Http3/QPackDecoderBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Http3/QPackDecoderBenchmark.cs
index 1bee9c3c42..8bd6541c4a 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Http3/QPackDecoderBenchmark.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Http3/QPackDecoderBenchmark.cs
@@ -98,7 +98,7 @@ public class QPackDecoderBenchmark
_decoder.Reset();
}
- private class TestHeadersHandler : IHttpStreamHeadersHandler
+ private sealed class TestHeadersHandler : IHttpStreamHeadersHandler
{
public void OnDynamicIndexedHeader(int? index, ReadOnlySpan<byte> name, ReadOnlySpan<byte> value)
{
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/InMemoryTransportBenchmark.cs b/src/Servers/Kestrel/perf/Microbenchmarks/InMemoryTransportBenchmark.cs
index 0ba5987c5b..4b59772a36 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/InMemoryTransportBenchmark.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/InMemoryTransportBenchmark.cs
@@ -101,7 +101,7 @@ public class InMemoryTransportBenchmark
await _connection.ReadResponseAsync(_plaintextPipelinedExpectedResponse.Length);
}
- internal class InMemoryTransportFactory : IConnectionListenerFactory
+ internal sealed class InMemoryTransportFactory : IConnectionListenerFactory
{
private readonly int _connectionsPerEndPoint;
@@ -129,7 +129,7 @@ public class InMemoryTransportBenchmark
}
}
- internal class InMemoryTransport : IConnectionListener
+ internal sealed class InMemoryTransport : IConnectionListener
{
private readonly IReadOnlyList<InMemoryConnection> _connections;
private readonly TaskCompletionSource<ConnectionContext> _tcs = new TaskCompletionSource<ConnectionContext>(TaskCreationOptions.RunContinuationsAsynchronously);
@@ -165,7 +165,7 @@ public class InMemoryTransportBenchmark
}
}
- internal class InMemoryConnection : TransportConnection
+ internal sealed class InMemoryConnection : TransportConnection
{
public InMemoryConnection()
{
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockDuplexPipe.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockDuplexPipe.cs
index 784c05e3f2..4c0ff04a2f 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockDuplexPipe.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockDuplexPipe.cs
@@ -5,7 +5,7 @@ using System.IO.Pipelines;
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
-internal class MockDuplexPipe : IDuplexPipe
+internal sealed class MockDuplexPipe : IDuplexPipe
{
public MockDuplexPipe(PipeReader input, PipeWriter output)
{
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockSystemClock.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockSystemClock.cs
index a963d57557..58ed52a202 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockSystemClock.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockSystemClock.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
-internal class MockSystemClock : ISystemClock
+internal sealed class MockSystemClock : ISystemClock
{
public DateTimeOffset UtcNow { get; }
public long UtcNowTicks { get; }
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockTimeoutControl.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockTimeoutControl.cs
index c9817ede61..eb32c081a3 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockTimeoutControl.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/MockTimeoutControl.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
-internal class MockTimeoutControl : ITimeoutControl
+internal sealed class MockTimeoutControl : ITimeoutControl
{
public TimeoutReason TimerReason { get; } = TimeoutReason.KeepAlive;
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullParser.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullParser.cs
index 503ab753bc..d7230edadf 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullParser.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullParser.cs
@@ -9,7 +9,7 @@ using HttpMethod = Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpMe
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
-internal class NullParser<TRequestHandler> : IHttpParser<TRequestHandler> where TRequestHandler : struct, IHttpHeadersHandler, IHttpRequestLineHandler
+internal sealed class NullParser<TRequestHandler> : IHttpParser<TRequestHandler> where TRequestHandler : struct, IHttpHeadersHandler, IHttpRequestLineHandler
{
private readonly byte[] _startLine = Encoding.ASCII.GetBytes("GET /plaintext HTTP/1.1\r\n");
private readonly byte[] _hostHeaderName = Encoding.ASCII.GetBytes("Host");
diff --git a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullPipeWriter.cs b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullPipeWriter.cs
index 00d4897e5d..ad6cb3d51b 100644
--- a/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullPipeWriter.cs
+++ b/src/Servers/Kestrel/perf/Microbenchmarks/Mocks/NullPipeWriter.cs
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Server.Kestrel.Microbenchmarks;
-internal class NullPipeWriter : PipeWriter
+internal sealed class NullPipeWriter : PipeWriter
{
// Should be large enough for any content attempting to write to the buffer
private readonly byte[] _buffer = new byte[1024 * 128];
diff --git a/src/Servers/Kestrel/samples/Http3SampleApp/Program.cs b/src/Servers/Kestrel/samples/Http3SampleApp/Program.cs
index 22a9d27911..d4a810bb38 100644
--- a/src/Servers/Kestrel/samples/Http3SampleApp/Program.cs
+++ b/src/Servers/Kestrel/samples/Http3SampleApp/Program.cs
@@ -1,7 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Net;
using System.Net.Security;
+using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Internal;
@@ -22,25 +24,18 @@ public class Program
})
.ConfigureWebHost(webHost =>
{
+ var cert = CertificateLoader.LoadFromStoreCert("localhost", StoreName.My.ToString(), StoreLocation.CurrentUser, false);
+
webHost.UseKestrel()
.ConfigureKestrel((context, options) =>
{
- var cert = CertificateLoader.LoadFromStoreCert("localhost", StoreName.My.ToString(), StoreLocation.CurrentUser, false);
-
- options.ConfigureHttpsDefaults(httpsOptions =>
- {
- httpsOptions.ServerCertificate = cert;
- // httpsOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
- // httpsOptions.AllowAnyClientCertificate();
- });
-
options.ListenAnyIP(5000, listenOptions =>
{
listenOptions.UseConnectionLogging();
listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
});
- options.ListenAnyIP(5001, listenOptions =>
+ options.Listen(IPAddress.Any, 5001, listenOptions =>
{
listenOptions.UseHttps();
listenOptions.UseConnectionLogging();
@@ -49,8 +44,8 @@ public class Program
options.ListenAnyIP(5002, listenOptions =>
{
- listenOptions.UseHttps(StoreName.My, "localhost");
listenOptions.UseConnectionLogging();
+ listenOptions.UseHttps(StoreName.My, "localhost");
listenOptions.Protocols = HttpProtocols.Http3;
});
diff --git a/src/Servers/Kestrel/samples/Http3SampleApp/Startup.cs b/src/Servers/Kestrel/samples/Http3SampleApp/Startup.cs
index e8b1fc3224..7a8727e8ff 100644
--- a/src/Servers/Kestrel/samples/Http3SampleApp/Startup.cs
+++ b/src/Servers/Kestrel/samples/Http3SampleApp/Startup.cs
@@ -1,6 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.IO;
+using Microsoft.AspNetCore.Http.Features;
+
namespace Http3SampleApp;
public class Startup
diff --git a/src/Servers/Kestrel/samples/Http3SampleApp/appsettings.Development.json b/src/Servers/Kestrel/samples/Http3SampleApp/appsettings.Development.json
index e203e9407e..331805c557 100644
--- a/src/Servers/Kestrel/samples/Http3SampleApp/appsettings.Development.json
+++ b/src/Servers/Kestrel/samples/Http3SampleApp/appsettings.Development.json
@@ -2,8 +2,8 @@
"Logging": {
"LogLevel": {
"Default": "Debug",
- "System": "Information",
- "Microsoft": "Information"
+ "System": "Debug",
+ "Microsoft": "Debug"
}
}
}
diff --git a/src/Servers/Kestrel/samples/HttpClientApp/HttpClientApp.csproj b/src/Servers/Kestrel/samples/HttpClientApp/HttpClientApp.csproj
index 075dc8ee37..6a651656c7 100644
--- a/src/Servers/Kestrel/samples/HttpClientApp/HttpClientApp.csproj
+++ b/src/Servers/Kestrel/samples/HttpClientApp/HttpClientApp.csproj
@@ -5,11 +5,6 @@
</PropertyGroup>
<ItemGroup>
- <!-- Required for QUIC & HTTP/3 in .NET 6 - https://github.com/dotnet/runtime/pull/55332 -->
- <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
- </ItemGroup>
-
- <ItemGroup>
<Compile Include="$(KestrelSharedSourceRoot)test\TestResources.cs" LinkBase="shared" />
<Content Include="$(KestrelSharedSourceRoot)test\TestCertificates\*.pfx" LinkBase="shared\TestCertificates" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
diff --git a/src/Servers/Kestrel/samples/SampleApp/Startup.cs b/src/Servers/Kestrel/samples/SampleApp/Startup.cs
index bf1f91084b..54352b5a86 100644
--- a/src/Servers/Kestrel/samples/SampleApp/Startup.cs
+++ b/src/Servers/Kestrel/samples/SampleApp/Startup.cs
@@ -87,7 +87,12 @@ public class Startup
options.ConfigureHttpsDefaults(httpsOptions =>
{
httpsOptions.SslProtocols = SslProtocols.Tls12;
- httpsOptions.ClientCertificateMode = ClientCertificateMode.DelayCertificate;
+
+ if (!OperatingSystem.IsMacOS())
+ {
+ // Delayed client certificate negotiation is not supported on macOS.
+ httpsOptions.ClientCertificateMode = ClientCertificateMode.DelayCertificate;
+ }
});
options.Listen(IPAddress.Loopback, basePort, listenOptions =>
diff --git a/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Program.cs b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Program.cs
new file mode 100644
index 0000000000..01fb023901
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Program.cs
@@ -0,0 +1,201 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+#nullable enable
+
+using System.Net;
+using System.Security.Cryptography;
+using System.Security.Cryptography.X509Certificates;
+using System.Text;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Connections.Features;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
+
+var builder = WebApplication.CreateBuilder(args);
+
+// generate a certificate and hash to be shared with the client
+var certificate = GenerateManualCertificate();
+var hash = SHA256.HashData(certificate.RawData);
+var certStr = Convert.ToBase64String(hash);
+
+// configure the ports
+builder.WebHost.ConfigureKestrel((context, options) =>
+{
+ // website configured port
+ options.Listen(IPAddress.Any, 5001, listenOptions =>
+ {
+ listenOptions.UseHttps();
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2;
+ });
+ // webtransport configured port
+ options.Listen(IPAddress.Any, 5002, listenOptions =>
+ {
+ listenOptions.UseHttps(certificate);
+ listenOptions.UseConnectionLogging();
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ });
+});
+
+var app = builder.Build();
+
+// make index.html accessible
+app.UseFileServer();
+
+app.Use(async (context, next) =>
+{
+ // configure /certificate.js to inject the certificate hash
+ if (context.Request.Path.Value?.Equals("/certificate.js") ?? false)
+ {
+ context.Response.ContentType = "application/javascript";
+ await context.Response.WriteAsync($"var CERTIFICATE = '{certStr}';");
+ }
+
+ // configure the serverside application
+ else
+ {
+ var feature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+ if (!feature.IsWebTransportRequest)
+ {
+ await next(context);
+ }
+
+ var session = await feature.AcceptAsync(CancellationToken.None);
+
+ if (session is null)
+ {
+ return;
+ }
+
+ while (true)
+ {
+ ConnectionContext? stream = null;
+ IStreamDirectionFeature? direction = null;
+ // wait until we get a stream
+ stream = await session.AcceptStreamAsync(CancellationToken.None);
+ if (stream is not null)
+ {
+ direction = stream.Features.GetRequiredFeature<IStreamDirectionFeature>();
+ if (direction.CanRead && direction.CanWrite)
+ {
+ _ = handleBidirectionalStream(session, stream);
+ }
+ else
+ {
+ _ = handleUnidirectionalStream(session, stream);
+ }
+ }
+ }
+ }
+});
+
+await app.RunAsync();
+
+static async Task handleUnidirectionalStream(IWebTransportSession session, ConnectionContext stream)
+{
+ var inputPipe = stream.Transport.Input;
+
+ // read some data from the stream into the memory
+ var memory = new Memory<byte>(new byte[4096]);
+ while (!stream.ConnectionClosed.IsCancellationRequested)
+ {
+ var length = await inputPipe.AsStream().ReadAsync(memory);
+
+ var message = Encoding.Default.GetString(memory[..length].ToArray());
+
+ await ApplySpecialCommands(session, message);
+
+ Console.WriteLine("RECEIVED FROM CLIENT:");
+ Console.WriteLine(message);
+
+ }
+}
+
+static async Task handleBidirectionalStream(IWebTransportSession session, ConnectionContext stream)
+{
+ var inputPipe = stream.Transport.Input;
+ var outputPipe = stream.Transport.Output;
+
+ // read some data from the stream into the memory
+ var memory = new Memory<byte>(new byte[4096]);
+ while (!stream.ConnectionClosed.IsCancellationRequested)
+ {
+ var length = await inputPipe.AsStream().ReadAsync(memory);
+
+ // slice to only keep the relevant parts of the memory
+ var outputMemory = memory[..length];
+
+ // handle special commands
+ await ApplySpecialCommands(session, Encoding.Default.GetString(outputMemory.ToArray()));
+
+ // do some operations on the contents of the data
+ outputMemory.Span.Reverse();
+
+ // write back the data to the stream
+ await outputPipe.WriteAsync(outputMemory);
+
+ memory.Span.Fill(0);
+ }
+}
+
+static async Task ApplySpecialCommands(IWebTransportSession session, string message)
+{
+ switch (message)
+ {
+ case "Initiate Stream":
+ var stream = await session.OpenUnidirectionalStreamAsync();
+ if (stream is not null)
+ {
+ await stream.Transport.Output.WriteAsync(new("Created a new stream from the client and sent this message then closing the stream."u8.ToArray()));
+ }
+ break;
+ case "Abort":
+ session.Abort(256 /*No error*/);
+ break;
+ default:
+ break; // in all other cases the string is not a special command
+ }
+}
+
+// Adapted from: https://github.com/wegylexy/webtransport
+// We will need to eventually merge this with existing Kestrel certificate generation
+// tracked in issue #41762
+static X509Certificate2 GenerateManualCertificate()
+{
+ X509Certificate2 cert;
+ var store = new X509Store("KestrelSampleWebTransportCertificates", StoreLocation.CurrentUser);
+ store.Open(OpenFlags.ReadWrite);
+ if (store.Certificates.Count > 0)
+ {
+ cert = store.Certificates[^1];
+
+ // rotate key after it expires
+ if (DateTime.Parse(cert.GetExpirationDateString(), null) >= DateTimeOffset.UtcNow)
+ {
+ store.Close();
+ return cert;
+ }
+ }
+ // generate a new cert
+ var now = DateTimeOffset.UtcNow;
+ SubjectAlternativeNameBuilder sanBuilder = new();
+ sanBuilder.AddDnsName("localhost");
+ using var ec = ECDsa.Create(ECCurve.NamedCurves.nistP256);
+ CertificateRequest req = new("CN=localhost", ec, HashAlgorithmName.SHA256);
+ // Adds purpose
+ req.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(new OidCollection
+ {
+ new("1.3.6.1.5.5.7.3.1") // serverAuth
+ }, false));
+ // Adds usage
+ req.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, false));
+ // Adds subject alternate names
+ req.CertificateExtensions.Add(sanBuilder.Build());
+ // Sign
+ using var crt = req.CreateSelfSigned(now, now.AddDays(14)); // 14 days is the max duration of a certificate for this
+ cert = new(crt.Export(X509ContentType.Pfx));
+
+ // Save
+ store.Add(cert);
+ store.Close();
+ return cert;
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Properties/launchSettings.json b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Properties/launchSettings.json
new file mode 100644
index 0000000000..634e23b5a4
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/Properties/launchSettings.json
@@ -0,0 +1,13 @@
+{
+ "profiles": {
+ "WebTransportInteractiveSample": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "applicationUrl": "https://localhost:5001",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/WebTransportInteractiveSampleApp.csproj b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/WebTransportInteractiveSampleApp.csproj
new file mode 100644
index 0000000000..c6814232ff
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/WebTransportInteractiveSampleApp.csproj
@@ -0,0 +1,30 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <AspNetCoreHostingModel>OutOfProcess</AspNetCoreHostingModel>
+ <!-- Turn on preview features so we can use Http3 -->
+ <EnablePreviewFeatures>True</EnablePreviewFeatures>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
+ <Reference Include="Microsoft.AspNetCore.Connections.Abstractions" />
+ <Reference Include="Microsoft.AspNetCore.Diagnostics" />
+ <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
+ <Reference Include="Microsoft.AspNetCore.StaticFiles" />
+ <Reference Include="Microsoft.Extensions.Logging.Console" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <Content Update="appsettings.json">
+ <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+ </Content>
+ </ItemGroup>
+
+ <ItemGroup>
+ <!-- Turn on the WebTransport AppContext switch -->
+ <RuntimeHostConfigurationOption Include="Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams" Value="true" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.Development.json b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.Development.json
new file mode 100644
index 0000000000..703489018a
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.Development.json
@@ -0,0 +1,10 @@
+{
+ "DetailedErrors": true,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "Microsoft": "Debug",
+ "Microsoft.AspNetCore": "Debug"
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.json b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.json
new file mode 100644
index 0000000000..c3dfa9d892
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/appsettings.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/wwwroot/index.html b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/wwwroot/index.html
new file mode 100644
index 0000000000..152707c325
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportInteractiveSampleApp/wwwroot/index.html
@@ -0,0 +1,366 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <title>WebTransport Test Page</title>
+</head>
+<body>
+ <script src="certificate.js"></script>
+
+ <div id="panel">
+ <h1 id="title">WebTransport Test Page</h1>
+ <h3 id="stateLabel">Ready to connect...</h3>
+ <div>
+ <label for="connectionUrl">WebTransport Server URL:</label>
+ <input id="connectionUrl" value="https://127.0.0.1:5002" disabled />
+ <p>Due to the need to synchronize certificates, you cannot modify the url at this time.</p>
+ <button id="connectButton" type="submit" onclick="connect()">Connect</button>
+ </div>
+
+ <div id="communicationPanel" hidden>
+ <div>
+ <button id="closeStream" type="submit" onclick="closeActiveStream()">Close active stream</button>
+ <button id="closeConnection" type="submit" onclick="closeConnection()">Close connection</button>
+ <button id="createBidirectionalStream" type="submit" onclick="createStream('bidirectional')">Create bidirectional stream</button>
+ <button id="createUnidirectionalStream" type="submit" onclick="createStream('output unidirectional')">Create unidirectional stream</button>
+ </div>
+ <h2>Open Streams</h2>
+ <div id="streamsList">
+ <p id="noStreams">Empty</p>
+ </div>
+
+ <div>
+ <h2>Send Message</h2>
+ <textarea id="messageInput" name="text" rows="12" cols="50"></textarea>
+ <button id="sendMessageButton" type="submit" onclick="sendMessage()">Send</button>
+ </div>
+ </div>
+ </div>
+
+ <div id="communicationLogPanel">
+ <h2 style="text-align: center;">Communication Log</h2>
+ <table style="overflow: auto; max-height: 1000px;">
+ <thead>
+ <tr>
+ <td>Timestamp</td>
+ <td>From</td>
+ <td>To</td>
+ <td>Data</td>
+ </tr>
+ </thead>
+ <tbody id="commsLog">
+ </tbody>
+ </table>
+ </div>
+
+ <script>
+ let connectionUrl = document.getElementById("connectionUrl");
+ let messageInput = document.getElementById("messageInput");
+ let stateLabel = document.getElementById("stateLabel");
+ let commsLog = document.getElementById("commsLog");
+ let streamsList = document.getElementById("streamsList");
+ let communicationPanel = document.getElementById("communicationPanel");
+ let noStreamsText = document.getElementById("noStreams");
+
+ let session;
+ let connected = false;
+ let openStreams = [];
+
+ async function connect() {
+ if (connected) {
+ alert("Already connected!");
+ return;
+ }
+
+ communicationPanel.hidden = true;
+ stateLabel.innerHTML = "Ready to connect...";
+
+ session = new WebTransport(connectionUrl.value, {
+ serverCertificateHashes: [
+ {
+ algorithm: "sha-256",
+ value: Uint8Array.from(atob(CERTIFICATE), c => c.charCodeAt(0))
+ }
+ ]
+ });
+ stateLabel.innerHTML = "Connecting...";
+
+ await session.ready;
+
+ startListeningForIncomingStreams();
+
+ setConnection(true);
+ }
+
+ async function closeConnection() {
+ if (!connected) {
+ alert("Not connected!");
+ return;
+ }
+
+ for (let i = 0; i < openStreams.length; i++) {
+ await closeStream(i);
+ }
+
+ await session.close();
+
+ setConnection(false);
+
+ openStreams = [];
+ updateOpenStreamsList();
+ }
+
+ function setConnection(state) {
+ connected = state;
+ communicationPanel.hidden = !state;
+
+ let msg = state ? "Connected!" : "Disconnected!";
+ stateLabel.innerHTML = msg;
+ addToCommsLog("Client", "Server", msg);
+ }
+
+ function updateOpenStreamsList() {
+ streamsList.innerHTML = "";
+ for (let i = 0; i < openStreams.length; i++) {
+ streamsList.innerHTML += '<div>' +
+ `<input type="radio" name = "streams" value = "${i}" id = "${i}" >` +
+ `<label for="${i}">${i} - ${openStreams[i].type}</label>` +
+ '</div >';
+ }
+
+ noStreamsText.hidden = openStreams.length > 0;
+ }
+
+ async function closeActiveStream() {
+ let streamIndex = getActiveStreamIndex();
+ await closeStream(streamIndex);
+ }
+
+ async function closeStream(index) {
+ let stream = openStreams[index].stream;
+ if (!stream) {
+ return;
+ }
+
+ // close the writable part of a stream if it exists
+ if (stream.writable) {
+ await stream.writable.close();
+ }
+
+ // close the readable part of a stream if it exists
+ if (stream.cancelReaderAndClose) {
+ await stream.cancelReaderAndClose();
+ }
+
+ // close the stream if it can be closed manually
+ if (stream.close) {
+ await stream.close();
+ }
+
+ // remove from the list of open streams
+ openStreams.splice(index, 1);
+
+ updateOpenStreamsList();
+ }
+
+ async function startListeningForIncomingStreams() {
+ try {
+ let streamReader = session.incomingUnidirectionalStreams.getReader();
+ let stream = await streamReader.read();
+ if (stream.value && confirm("New incoming stream. Would you like to accept it?")) {
+ startListeningForIncomingData(stream.value, openStreams.length, "input unidirectional");
+ // we don't add to the stream list here as the only stream type that we can receive is
+ // input. As we can't send data over these streams, there is no point in showing them to the user
+ }
+ } catch {
+ alert("Failed to accept incoming stream");
+ }
+ }
+
+ async function startListeningForIncomingData(stream, streamId, type) {
+ let reader = isBidirectional(type) ? stream.readable.getReader() : stream.getReader();
+
+ // define a function that we can use to abort the reading on this stream
+ var closed = false;
+ stream.cancelReaderAndClose = () => {
+ console.log(reader);
+ reader.cancel();
+ reader.releaseLock();
+ closed = true;
+ }
+
+ // read loop for the stream
+ try {
+ while (true) {
+ let data = await reader.read();
+ let msgOut = "";
+ data.value.forEach(x => msgOut += String.fromCharCode(x));
+ addToCommsLog("Server", "Client", `RECEIVED FROM STREAM ${streamId}: ${msgOut}`);
+ }
+ } catch {
+ alert(`Stream ${streamId} ${closed ? "was closed" : "failed to read"}. Ending reading from it.`);
+ }
+ }
+
+ async function createStream(type) {
+ if (!connected) {
+ return;
+ }
+ let stream;
+ switch (type) {
+ case 'output unidirectional':
+ stream = await session.createUnidirectionalStream();
+ break;
+ case 'bidirectional':
+ stream = await session.createBidirectionalStream();
+ startListeningForIncomingData(stream, openStreams.length, "bidirectional");
+ break;
+ default:
+ alert("Unknown stream type");
+ return;
+ }
+
+ addStream(stream, type);
+ }
+
+ function addStream(stream, type) {
+ openStreams.push({ stream: stream, type: type });
+
+ updateOpenStreamsList();
+
+ addToCommsLog("Client", "Server", `CREATING ${type} STREAM WITH ID ${openStreams.length}`);
+ }
+
+ async function sendMessage() {
+ if (!connected) {
+ return;
+ }
+
+ let activeStreamIndex = getActiveStreamIndex();
+
+ if (activeStreamIndex == -1) {
+ alert((openStreams.length > 0) ? "Please select a stream first" : "Please create a stream first");
+ }
+
+ let activeStreamObj = openStreams[activeStreamIndex];
+ let activeStream = activeStreamObj.stream;
+ let activeStreamType = activeStreamObj.type;
+
+ let writer = isBidirectional(activeStreamType) ? activeStream.writable.getWriter() : activeStream.getWriter();
+
+ let msg = messageInput.value.split("").map(x => (x).charCodeAt(0));
+ await writer.write(new Uint8Array(msg));
+
+ writer.releaseLock();
+
+ addToCommsLog("Client", "Server", `SENDING OVER STREAM ${activeStreamIndex}: ${messageInput.value}`);
+ }
+
+ function isBidirectional(type) {
+ return type === "bidirectional";
+ }
+
+ function getActiveStream() {
+ let index = getActiveStreamIndex();
+ return (index === -1) ? null : openStreams[index].stream;
+ }
+
+ function getActiveStreamIndex() {
+ let allStreams = document.getElementsByName("streams");
+
+ for (let i = 0; i < allStreams.length; i++) {
+ if (allStreams[i].checked) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ function addToCommsLog(from, to, data) {
+ commsLog.innerHTML += '<tr>' +
+ `<td>${getTimestamp()}</td>` +
+ `<td>${from}</td>` +
+ `<td>${to}</td>` +
+ `<td>${data}</td>`
+ '</tr>';
+ }
+
+ function getTimestamp() {
+ let now = new Date();
+ return `${now.getHours()}:${now.getMinutes()}:${now.getSeconds()}.${now.getMilliseconds()}`;
+ }
+ </script>
+</body>
+</html>
+<style>
+ html,
+ body {
+ background-color: #459eda;
+ padding: 0;
+ margin: 0;
+ height: 100%;
+ }
+
+ body {
+ display: flex;
+ flex-direction: row;
+ }
+
+ #panel {
+ background-color: white;
+ padding: 12px;
+ margin: 0;
+ border-top-right-radius: 12px;
+ border-bottom-right-radius: 12px;
+ border-right: #0d6cad 5px solid;
+ max-width: 400px;
+ min-width: 200px;
+ flex: 1;
+ min-height: 1200px;
+ overflow: auto;
+ }
+
+ #panel > * {
+ text-align: center;
+ }
+
+ #communicationLogPanel {
+ padding: 24px;
+ flex: 1;
+ }
+
+ #communicationLogPanel > * {
+ color: white;
+ width: 100%;
+ }
+
+ #connectButton {
+ background-color: #2e64a7;
+ }
+
+ #messageInput {
+ max-width: 100%;
+ }
+
+ #streamsList {
+ max-height: 400px;
+ overflow: auto;
+ }
+
+ input {
+ padding: 6px;
+ margin-bottom: 8px;
+ margin-right: 0;
+ }
+
+ button {
+ background-color: #459eda;
+ border-radius: 5px;
+ border: 0;
+ text-align: center;
+ color: white;
+ padding: 8px;
+ margin: 4px;
+ width: 100%;
+ }
+</style>
diff --git a/src/Servers/Kestrel/samples/WebTransportSampleApp/Program.cs b/src/Servers/Kestrel/samples/WebTransportSampleApp/Program.cs
new file mode 100644
index 0000000000..556fd7972a
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportSampleApp/Program.cs
@@ -0,0 +1,92 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Security.Cryptography;
+using System.Security.Cryptography.X509Certificates;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
+
+var builder = WebApplication.CreateBuilder(args);
+builder.WebHost.ConfigureKestrel((context, options) =>
+{
+ // Port configured for WebTransport
+ options.Listen(IPAddress.Any, 5007, listenOptions =>
+ {
+ listenOptions.UseHttps(GenerateManualCertificate());
+ listenOptions.UseConnectionLogging();
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ });
+});
+var host = builder.Build();
+
+host.Run(async (context) =>
+{
+ var feature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+ if (!feature.IsWebTransportRequest)
+ {
+ return;
+ }
+ var session = await feature.AcceptAsync(CancellationToken.None);
+
+ //// ACCEPT AN INCOMING STREAM
+ var stream = await session.AcceptStreamAsync(CancellationToken.None);
+
+ //// READ FROM A STREAM:
+ var memory = new Memory<byte>(new byte[4096]);
+ var test = await stream.Transport.Input.AsStream().ReadAsync(memory, CancellationToken.None);
+ Console.WriteLine(System.Text.Encoding.Default.GetString(memory.Span));
+});
+
+await host.RunAsync();
+
+// Adapted from: https://github.com/wegylexy/webtransport
+// We will need to eventually merge this with existing Kestrel certificate generation
+// tracked in issue #41762
+static X509Certificate2 GenerateManualCertificate()
+{
+ X509Certificate2 cert = null;
+ var store = new X509Store("KestrelSampleWebTransportCertificates", StoreLocation.CurrentUser);
+ store.Open(OpenFlags.ReadWrite);
+ if (store.Certificates.Count > 0)
+ {
+ cert = store.Certificates[^1];
+
+ // rotate key after it expires
+ if (DateTime.Parse(cert.GetExpirationDateString(), null) < DateTimeOffset.UtcNow)
+ {
+ cert = null;
+ }
+ }
+ if (cert == null)
+ {
+ // generate a new cert
+ var now = DateTimeOffset.UtcNow;
+ SubjectAlternativeNameBuilder sanBuilder = new();
+ sanBuilder.AddDnsName("localhost");
+ using var ec = ECDsa.Create(ECCurve.NamedCurves.nistP256);
+ CertificateRequest req = new("CN=localhost", ec, HashAlgorithmName.SHA256);
+ // Adds purpose
+ req.CertificateExtensions.Add(new X509EnhancedKeyUsageExtension(new OidCollection
+ {
+ new("1.3.6.1.5.5.7.3.1") // serverAuth
+ }, false));
+ // Adds usage
+ req.CertificateExtensions.Add(new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, false));
+ // Adds subject alternate names
+ req.CertificateExtensions.Add(sanBuilder.Build());
+ // Sign
+ using var crt = req.CreateSelfSigned(now, now.AddDays(14)); // 14 days is the max duration of a certificate for this
+ cert = new(crt.Export(X509ContentType.Pfx));
+
+ // Save
+ store.Add(cert);
+ }
+ store.Close();
+
+ var hash = SHA256.HashData(cert.RawData);
+ var certStr = Convert.ToBase64String(hash);
+ Console.WriteLine($"\n\n\n\n\nCertificate: {certStr}\n\n\n\n"); // <-- you will need to put this output into the JS API call to allow the connection
+ return cert;
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportSampleApp/Properties/launchSettings.json b/src/Servers/Kestrel/samples/WebTransportSampleApp/Properties/launchSettings.json
new file mode 100644
index 0000000000..5f58400fd9
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportSampleApp/Properties/launchSettings.json
@@ -0,0 +1,11 @@
+{
+ "profiles": {
+ "WebTransportSampleApp": {
+ "commandName": "Project",
+ "launchBrowser": false,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportSampleApp/WebTransportSampleApp.csproj b/src/Servers/Kestrel/samples/WebTransportSampleApp/WebTransportSampleApp.csproj
new file mode 100644
index 0000000000..243c338db3
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportSampleApp/WebTransportSampleApp.csproj
@@ -0,0 +1,21 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <!-- Turn on preview features so we can use Http3 -->
+ <EnablePreviewFeatures>True</EnablePreviewFeatures>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Reference Include="Microsoft.AspNetCore" />
+ <Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
+ <Reference Include="Microsoft.Extensions.Logging.Console" />
+ <Reference Include="Microsoft.Extensions.Hosting" />
+ <Reference Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <!-- Turn on the WebTransport AppContext switch -->
+ <RuntimeHostConfigurationOption Include="Microsoft.AspNetCore.Server.Kestrel.Experimental.WebTransportAndH3Datagrams" Value="true" />
+ </ItemGroup>
+</Project>
diff --git a/src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.Development.json b/src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.Development.json
new file mode 100644
index 0000000000..703489018a
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.Development.json
@@ -0,0 +1,10 @@
+{
+ "DetailedErrors": true,
+ "Logging": {
+ "LogLevel": {
+ "Default": "Debug",
+ "Microsoft": "Debug",
+ "Microsoft.AspNetCore": "Debug"
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.json b/src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.json
new file mode 100644
index 0000000000..c3dfa9d892
--- /dev/null
+++ b/src/Servers/Kestrel/samples/WebTransportSampleApp/appsettings.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ },
+ "AllowedHosts": "*"
+}
diff --git a/src/Servers/Kestrel/samples/http2cat/http2cat.csproj b/src/Servers/Kestrel/samples/http2cat/http2cat.csproj
index 14a6752e67..6947c48b1a 100644
--- a/src/Servers/Kestrel/samples/http2cat/http2cat.csproj
+++ b/src/Servers/Kestrel/samples/http2cat/http2cat.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
@@ -14,6 +14,7 @@
<Compile Include="$(SharedSourceRoot)ServerInfrastructure\**\*.cs" LinkBase="Shared\" />
<Compile Remove="$(SharedSourceRoot)ServerInfrastructure\DuplexPipe.cs" />
<Compile Include="$(SharedSourceRoot)TaskToApm.cs" Link="Shared\TaskToApm.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="InternalHeaderNames.cs" />
<Compile Include="$(SharedSourceRoot)ValueTaskExtensions\**\*.cs" />
</ItemGroup>
diff --git a/src/Servers/Kestrel/shared/KnownHeaders.cs b/src/Servers/Kestrel/shared/KnownHeaders.cs
index cb1c8cfa04..d93762f184 100644
--- a/src/Servers/Kestrel/shared/KnownHeaders.cs
+++ b/src/Servers/Kestrel/shared/KnownHeaders.cs
@@ -9,6 +9,7 @@ using System.Net.Http.HPack;
using System.Net.Http.QPack;
using System.Reflection;
using System.Text;
+using Microsoft.AspNetCore.Server;
using Microsoft.Net.Http.Headers;
namespace CodeGenerator;
@@ -25,32 +26,43 @@ public class KnownHeaders
HeaderNames.TransferEncoding,
HeaderNames.ContentLength,
HeaderNames.Connection,
- HeaderNames.Scheme,
- HeaderNames.Path,
- HeaderNames.Method,
- HeaderNames.Authority,
+ InternalHeaderNames.Scheme,
+ InternalHeaderNames.Path,
+ InternalHeaderNames.Protocol,
+ InternalHeaderNames.Method,
+ InternalHeaderNames.Authority,
HeaderNames.Host,
};
- public static readonly string[] DefinedHeaderNames = typeof(HeaderNames).GetFields(BindingFlags.Static | BindingFlags.Public).Select(h => h.Name).ToArray();
+ public static readonly string[] DefinedHeaderNames = typeof(HeaderNames)
+ .GetFields(BindingFlags.Static | BindingFlags.Public)
+ .Where(h => h.GetCustomAttribute(typeof(ObsoleteAttribute)) == null)
+ .Select(h => h.Name)
+ .ToArray();
- public static readonly string[] ObsoleteHeaderNames = new[]
+ // These headers are excluded from generated IHeadersDictionary implementaiton.
+ public static readonly string[] NonPublicHeaderNames = new[]
{
HeaderNames.DNT,
+ InternalHeaderNames.AltUsed
};
- public static readonly string[] PseudoHeaderNames = new[]
+ public record InternalHeader(string Identifier, string Name, bool IsPseudoHeader = false);
+
+ public static readonly InternalHeader[] FormattedInternalHeaderNames = new[]
{
- "Authority", // :authority
- "Method", // :method
- "Path", // :path
- "Scheme", // :scheme
- "Status" // :status
+ new InternalHeader("Authority", InternalHeaderNames.Authority, IsPseudoHeader: true),
+ new InternalHeader("Method", InternalHeaderNames.Method, IsPseudoHeader: true),
+ new InternalHeader("Path", InternalHeaderNames.Path, IsPseudoHeader: true),
+ new InternalHeader("Scheme", InternalHeaderNames.Scheme, IsPseudoHeader: true),
+ new InternalHeader("Status", InternalHeaderNames.Status, IsPseudoHeader: true),
+ new InternalHeader("Protocol", InternalHeaderNames.Protocol, IsPseudoHeader: true),
+ new InternalHeader("AltUsed", InternalHeaderNames.AltUsed)
};
public static readonly string[] NonApiHeaders =
- ObsoleteHeaderNames
- .Concat(PseudoHeaderNames)
+ NonPublicHeaderNames
+ .Concat(FormattedInternalHeaderNames.Select(x => x.Identifier))
.ToArray();
public static readonly string[] ApiHeaderNames =
@@ -101,6 +113,7 @@ public class KnownHeaders
};
var requestHeadersExistence = new[]
{
+ HeaderNames.Cookie,
HeaderNames.Connection,
HeaderNames.TransferEncoding,
};
@@ -110,14 +123,15 @@ public class KnownHeaders
};
RequestHeaders = commonHeaders.Concat(new[]
{
- HeaderNames.Authority,
- HeaderNames.Method,
- HeaderNames.Path,
- HeaderNames.Scheme,
+ InternalHeaderNames.Authority,
+ InternalHeaderNames.Method,
+ InternalHeaderNames.Path,
+ InternalHeaderNames.Scheme,
HeaderNames.Accept,
HeaderNames.AcceptCharset,
HeaderNames.AcceptEncoding,
HeaderNames.AcceptLanguage,
+ InternalHeaderNames.AltUsed,
HeaderNames.Authorization,
HeaderNames.Cookie,
HeaderNames.Expect,
@@ -131,6 +145,7 @@ public class KnownHeaders
HeaderNames.IfRange,
HeaderNames.IfUnmodifiedSince,
HeaderNames.MaxForwards,
+ InternalHeaderNames.Protocol,
HeaderNames.ProxyAuthorization,
HeaderNames.Referer,
HeaderNames.Range,
@@ -149,14 +164,16 @@ public class KnownHeaders
.ThenBy(header => header)
.Select((header, index) => new KnownHeader
{
+ ClassName = FormattedInternalHeaderNames.Select(x => x.Name).Contains(header) ? "InternalHeaderNames" : "HeaderNames",
Name = header,
Index = index,
PrimaryHeader = requestPrimaryHeaders.Contains(header),
ExistenceCheck = requestHeadersExistence.Contains(header),
- FastCount = requestHeadersCount.Contains(header)
+ FastCount = requestHeadersCount.Contains(header),
})
.Concat(new[] { new KnownHeader
{
+ ClassName = "HeaderNames",
Name = HeaderNames.ContentLength,
Index = -1,
PrimaryHeader = requestPrimaryHeaders.Contains(HeaderNames.ContentLength)
@@ -218,6 +235,7 @@ public class KnownHeaders
.ThenBy(header => header)
.Select((header, index) => new KnownHeader
{
+ ClassName = FormattedInternalHeaderNames.Select(x => x.Name).Contains(header) ? "InternalHeaderNames" : "HeaderNames",
Name = header,
Index = index,
EnhancedSetter = enhancedHeaders.Contains(header),
@@ -226,6 +244,7 @@ public class KnownHeaders
})
.Concat(new[] { new KnownHeader
{
+ ClassName = "HeaderNames",
Name = HeaderNames.ContentLength,
Index = 63,
EnhancedSetter = enhancedHeaders.Contains(HeaderNames.ContentLength),
@@ -243,6 +262,7 @@ public class KnownHeaders
.ThenBy(header => header)
.Select((header, index) => new KnownHeader
{
+ ClassName = FormattedInternalHeaderNames.Select(x => x.Name).Contains(header) ? "InternalHeaderNames" : "HeaderNames",
Name = header,
Index = index,
EnhancedSetter = enhancedHeaders.Contains(header),
@@ -266,7 +286,7 @@ public class KnownHeaders
.Aggregate((a, b) => a | b);
PseudoRequestHeadersBits = RequestHeaders
- .Where(header => PseudoHeaderNames.Contains(header.Identifier))
+ .Where(header => FormattedInternalHeaderNames.Where(x => x.IsPseudoHeader).Select(x => x.Identifier).Contains(header.Identifier))
.Select(header => 1L << header.Index)
.Aggregate((a, b) => a | b);
}
@@ -359,7 +379,7 @@ public class KnownHeaders
{
return $@"flag = {header.FlagBit()};
values = ref _headers._{header.Identifier};
- nameStr = HeaderNames.{header.Identifier};
+ nameStr = {header.StaticIdentifier};
break;";
}
}
@@ -403,7 +423,7 @@ public class KnownHeaders
return $@"
{extraIndent}flag = {header.FlagBit()};
{extraIndent}values = ref _headers._{header.Identifier};
- {extraIndent}nameStr = HeaderNames.{header.Identifier};";
+ {extraIndent}nameStr = {header.StaticIdentifier};";
}
}
@@ -428,10 +448,13 @@ public class KnownHeaders
[DebuggerDisplay("{Name}")]
public class KnownHeader
{
+ public string ClassName { get; set; }
public string Name { get; set; }
public int Index { get; set; }
public string Identifier => ResolveIdentifier(Name);
+ public string StaticIdentifier => ResolveIdentifier(Name, ClassName);
+
public byte[] Bytes => Encoding.ASCII.GetBytes($"\r\n{Name}: ");
public int BytesOffset { get; set; }
public int BytesCount { get; set; }
@@ -448,17 +471,15 @@ public class KnownHeaders
public string SetBit() => $"_bits |= {"0x" + (1L << Index).ToString("x", CultureInfo.InvariantCulture)}L";
public string ClearBit() => $"_bits &= ~{"0x" + (1L << Index).ToString("x", CultureInfo.InvariantCulture)}L";
- private static string ResolveIdentifier(string name)
+ private static string ResolveIdentifier(string name, string prefix = "")
{
- // Check the 3 lowercase headers
- switch (name)
+ var identifier = name switch
{
- case "baggage": return "Baggage";
- case "traceparent": return "TraceParent";
- case "tracestate": return "TraceState";
- }
-
- var identifier = name.Replace("-", "");
+ "baggage" => "Baggage",
+ "traceparent" => "TraceParent",
+ "tracestate" => "TraceState",
+ _ => name.Replace("-", "")
+ };
// Pseudo headers start with a colon. A colon isn't valid in C# names so
// remove it and pascal case the header name. e.g. :path -> Path, :scheme -> Scheme.
@@ -468,7 +489,7 @@ public class KnownHeaders
identifier = char.ToUpperInvariant(identifier[1]) + identifier.Substring(2);
}
- return identifier;
+ return prefix.Length != 0 ? $"{prefix}.{identifier}" : identifier;
}
private static void GetMaskAndComp(string name, int offset, int count, out ulong mask, out ulong comp)
@@ -891,7 +912,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
var flag = {header.FlagBit()};
if (value.Count > 0)
{{{(loop.ClassName != "HttpRequestHeaders" ? $@"
- ValidateHeaderValueCharacters(HeaderNames.{header.Identifier}, value, EncodingSelector);" : "")}
+ ValidateHeaderValueCharacters({header.StaticIdentifier}, value, EncodingSelector);" : "")}
_bits |= flag;
_headers._{header.Identifier} = value;
}}
@@ -941,7 +962,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{{{Each(loop.HeadersByLength, byLength => $@"
case {byLength.Key}:
{{{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (ReferenceEquals(HeaderNames.{header.Identifier}, key))
+ if (ReferenceEquals({header.StaticIdentifier}, key))
{{{(header.Name == HeaderNames.ContentLength ? @"
if (_contentLength.HasValue)
{
@@ -957,7 +978,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;")}
}}")}
{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (HeaderNames.{header.Identifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if ({header.StaticIdentifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
{{{(header.Name == HeaderNames.ContentLength ? @"
if (_contentLength.HasValue)
{
@@ -986,7 +1007,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{{{Each(loop.HeadersByLength, byLength => $@"
case {byLength.Key}:
{{{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (ReferenceEquals(HeaderNames.{header.Identifier}, key))
+ if (ReferenceEquals({header.StaticIdentifier}, key))
{{{(header.Name == HeaderNames.ContentLength ? $@"
_contentLength = ParseContentLength(value.ToString());" : $@"
{header.SetBit()};
@@ -995,7 +1016,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return;
}}")}
{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (HeaderNames.{header.Identifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if ({header.StaticIdentifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
{{{(header.Name == HeaderNames.ContentLength ? $@"
_contentLength = ParseContentLength(value.ToString());" : $@"
{header.SetBit()};
@@ -1017,7 +1038,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{{{Each(loop.HeadersByLength, byLength => $@"
case {byLength.Key}:
{{{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (ReferenceEquals(HeaderNames.{header.Identifier}, key))
+ if (ReferenceEquals({header.StaticIdentifier}, key))
{{{(header.Name == HeaderNames.ContentLength ? $@"
if (!_contentLength.HasValue)
{{
@@ -1035,7 +1056,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;")}
}}")}
{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (HeaderNames.{header.Identifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if ({header.StaticIdentifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
{{{(header.Name == HeaderNames.ContentLength ? $@"
if (!_contentLength.HasValue)
{{
@@ -1065,7 +1086,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
{{{Each(loop.HeadersByLength, byLength => $@"
case {byLength.Key}:
{{{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (ReferenceEquals(HeaderNames.{header.Identifier}, key))
+ if (ReferenceEquals({header.StaticIdentifier}, key))
{{{(header.Name == HeaderNames.ContentLength ? @"
if (_contentLength.HasValue)
{
@@ -1083,7 +1104,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http
return false;")}
}}")}
{Each(byLength.OrderBy(h => !h.PrimaryHeader), header => $@"
- if (HeaderNames.{header.Identifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
+ if ({header.StaticIdentifier}.Equals(key, StringComparison.OrdinalIgnoreCase))
{{{(header.Name == HeaderNames.ContentLength ? @"
if (_contentLength.HasValue)
{
@@ -1160,7 +1181,7 @@ $@" private void Clear(long bitsToClear)
{{
return false;
}}
- array[arrayIndex] = new KeyValuePair<string, StringValues>(HeaderNames.{header.Identifier}, _headers._{header.Identifier});
+ array[arrayIndex] = new KeyValuePair<string, StringValues>({header.StaticIdentifier}, _headers._{header.Identifier});
++arrayIndex;
}}")}
if (_contentLength.HasValue)
@@ -1225,7 +1246,7 @@ $@" private void Clear(long bitsToClear)
values = ref _headers._{header.Identifier};
keyStart = {header.BytesOffset};
keyLength = {header.BytesCount};
- headerName = HeaderNames.{header.Identifier};
+ headerName = {header.StaticIdentifier};
}}")}
break; // OutputHeader
")}
@@ -1365,7 +1386,7 @@ $@" private void Clear(long bitsToClear)
{{{Each(loop.Headers.Where(header => header.Identifier != "ContentLength"), header => $@"
case {header.Index}: // Header: ""{header.Name}""
Debug.Assert({header.TestBitCore("_currentBits")});
- _current = new KeyValuePair<string, StringValues>(HeaderNames.{header.Identifier}, _collection._headers._{header.Identifier});
+ _current = new KeyValuePair<string, StringValues>({header.StaticIdentifier}, _collection._headers._{header.Identifier});
{(loop.ClassName.Contains("Request") ? "" : @$"_currentKnownType = KnownHeaderType.{header.Identifier};
")}_currentBits ^= {"0x" + (1L << header.Index).ToString("x", CultureInfo.InvariantCulture)}L;
break;")}
@@ -1493,21 +1514,21 @@ $@" private void Clear(long bitsToClear)
return groupedHeaders;
}
- private class QPackGroup
+ private sealed class QPackGroup
{
public (int Index, System.Net.Http.QPack.HeaderField Field)[] QPackStaticTableFields { get; set; }
public KnownHeader Header { get; set; }
public string Name { get; set; }
}
- private class HPackGroup
+ private sealed class HPackGroup
{
public int[] HPackStaticTableIndexes { get; set; }
public KnownHeader Header { get; set; }
public string Name { get; set; }
}
- private class KnownHeaderComparer : IComparer<KnownHeader>
+ private sealed class KnownHeaderComparer : IComparer<KnownHeader>
{
public static readonly KnownHeaderComparer Instance = new KnownHeaderComparer();
diff --git a/src/Servers/Kestrel/shared/TransportConnection.Generated.cs b/src/Servers/Kestrel/shared/TransportConnection.Generated.cs
index b530dc8c15..090fa212e3 100644
--- a/src/Servers/Kestrel/shared/TransportConnection.Generated.cs
+++ b/src/Servers/Kestrel/shared/TransportConnection.Generated.cs
@@ -34,6 +34,7 @@ namespace Microsoft.AspNetCore.Connections
internal protected IStreamDirectionFeature? _currentIStreamDirectionFeature;
internal protected IStreamIdFeature? _currentIStreamIdFeature;
internal protected IStreamAbortFeature? _currentIStreamAbortFeature;
+ internal protected IStreamClosedFeature? _currentIStreamClosedFeature;
private int _featureRevision;
@@ -53,6 +54,7 @@ namespace Microsoft.AspNetCore.Connections
_currentIStreamDirectionFeature = null;
_currentIStreamIdFeature = null;
_currentIStreamAbortFeature = null;
+ _currentIStreamClosedFeature = null;
}
// Internal for testing
@@ -168,6 +170,10 @@ namespace Microsoft.AspNetCore.Connections
{
feature = _currentIStreamAbortFeature;
}
+ else if (key == typeof(IStreamClosedFeature))
+ {
+ feature = _currentIStreamClosedFeature;
+ }
else if (MaybeExtra != null)
{
feature = ExtraFeatureGet(key);
@@ -224,6 +230,10 @@ namespace Microsoft.AspNetCore.Connections
{
_currentIStreamAbortFeature = (IStreamAbortFeature?)value;
}
+ else if (key == typeof(IStreamClosedFeature))
+ {
+ _currentIStreamClosedFeature = (IStreamClosedFeature?)value;
+ }
else
{
ExtraFeatureSet(key, value);
@@ -282,6 +292,10 @@ namespace Microsoft.AspNetCore.Connections
{
feature = Unsafe.As<IStreamAbortFeature?, TFeature?>(ref _currentIStreamAbortFeature);
}
+ else if (typeof(TFeature) == typeof(IStreamClosedFeature))
+ {
+ feature = Unsafe.As<IStreamClosedFeature?, TFeature?>(ref _currentIStreamClosedFeature);
+ }
else if (MaybeExtra != null)
{
feature = (TFeature?)(ExtraFeatureGet(typeof(TFeature)));
@@ -346,6 +360,10 @@ namespace Microsoft.AspNetCore.Connections
{
_currentIStreamAbortFeature = Unsafe.As<TFeature?, IStreamAbortFeature?>(ref feature);
}
+ else if (typeof(TFeature) == typeof(IStreamClosedFeature))
+ {
+ _currentIStreamClosedFeature = Unsafe.As<TFeature?, IStreamClosedFeature?>(ref feature);
+ }
else
{
ExtraFeatureSet(typeof(TFeature), feature);
@@ -398,6 +416,10 @@ namespace Microsoft.AspNetCore.Connections
{
yield return new KeyValuePair<Type, object>(typeof(IStreamAbortFeature), _currentIStreamAbortFeature);
}
+ if (_currentIStreamClosedFeature != null)
+ {
+ yield return new KeyValuePair<Type, object>(typeof(IStreamClosedFeature), _currentIStreamClosedFeature);
+ }
if (MaybeExtra != null)
{
diff --git a/src/Servers/Kestrel/shared/test/CertHelper.cs b/src/Servers/Kestrel/shared/test/CertHelper.cs
new file mode 100644
index 0000000000..75f245da5e
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/CertHelper.cs
@@ -0,0 +1,191 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Sockets;
+using System.Runtime.CompilerServices;
+using System.Security.Authentication;
+using System.Security.Cryptography;
+using System.Security.Cryptography.X509Certificates;
+
+namespace Microsoft.AspNetCore.Testing;
+
+#nullable enable
+// Copied from https://github.com/dotnet/runtime/main/src/libraries/System.Net.Security/tests/FunctionalTests/TestHelper.cs
+public static class CertHelper
+{
+ private static readonly X509KeyUsageExtension s_eeKeyUsage =
+ new X509KeyUsageExtension(
+ X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DataEncipherment,
+ critical: false);
+
+ private static readonly X509EnhancedKeyUsageExtension s_tlsServerEku =
+ new X509EnhancedKeyUsageExtension(
+ new OidCollection
+ {
+ new Oid("1.3.6.1.5.5.7.3.1", null)
+ },
+ false);
+
+ private static readonly X509EnhancedKeyUsageExtension s_tlsClientEku =
+ new X509EnhancedKeyUsageExtension(
+ new OidCollection
+ {
+ new Oid("1.3.6.1.5.5.7.3.2", null)
+ },
+ false);
+
+ private static readonly X509BasicConstraintsExtension s_eeConstraints =
+ new X509BasicConstraintsExtension(false, false, 0, false);
+
+ public static bool AllowAnyServerCertificate(object sender, X509Certificate certificate, X509Chain chain)
+ {
+ return true;
+ }
+
+ internal static (NetworkStream ClientStream, NetworkStream ServerStream) GetConnectedTcpStreams()
+ {
+ using (Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
+ {
+ listener.Bind(new IPEndPoint(IPAddress.Loopback, 0));
+ listener.Listen(1);
+
+ var clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ clientSocket.Connect(listener.LocalEndPoint!);
+ Socket serverSocket = listener.Accept();
+
+ serverSocket.NoDelay = true;
+ clientSocket.NoDelay = true;
+
+ return (new NetworkStream(clientSocket, ownsSocket: true), new NetworkStream(serverSocket, ownsSocket: true));
+ }
+ }
+
+ internal static void CleanupCertificates([CallerMemberName] string? testName = null)
+ {
+ string caName = $"O={testName}";
+ try
+ {
+ using (X509Store store = new X509Store(StoreName.CertificateAuthority, StoreLocation.LocalMachine))
+ {
+ store.Open(OpenFlags.ReadWrite);
+ foreach (X509Certificate2 cert in store.Certificates)
+ {
+ if (cert.Subject.Contains(caName))
+ {
+ store.Remove(cert);
+ }
+ cert.Dispose();
+ }
+ }
+ }
+ catch { };
+
+ try
+ {
+ using (X509Store store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser))
+ {
+ store.Open(OpenFlags.ReadWrite);
+ foreach (X509Certificate2 cert in store.Certificates)
+ {
+ if (cert.Subject.Contains(caName))
+ {
+ store.Remove(cert);
+ }
+ cert.Dispose();
+ }
+ }
+ }
+ catch { };
+ }
+
+ internal static X509ExtensionCollection BuildTlsServerCertExtensions(string serverName)
+ {
+ return BuildTlsCertExtensions(serverName, true);
+ }
+
+ private static X509ExtensionCollection BuildTlsCertExtensions(string targetName, bool serverCertificate)
+ {
+ X509ExtensionCollection extensions = new X509ExtensionCollection();
+
+ SubjectAlternativeNameBuilder builder = new SubjectAlternativeNameBuilder();
+ builder.AddDnsName(targetName);
+ extensions.Add(builder.Build());
+ extensions.Add(s_eeConstraints);
+ extensions.Add(s_eeKeyUsage);
+ extensions.Add(serverCertificate ? s_tlsServerEku : s_tlsClientEku);
+
+ return extensions;
+ }
+
+ internal static (X509Certificate2 certificate, X509Certificate2Collection) GenerateCertificates(string targetName, [CallerMemberName] string? testName = null, bool longChain = false, bool serverCertificate = true)
+ {
+ const int keySize = 2048;
+ if (OperatingSystem.IsWindows() && testName != null)
+ {
+ CleanupCertificates(testName);
+ }
+
+ X509Certificate2Collection chain = new X509Certificate2Collection();
+ X509ExtensionCollection extensions = BuildTlsCertExtensions(targetName, serverCertificate);
+
+ CertificateAuthority.BuildPrivatePki(
+ PkiOptions.IssuerRevocationViaCrl,
+ out RevocationResponder responder,
+ out CertificateAuthority root,
+ out CertificateAuthority[] intermediates,
+ out X509Certificate2 endEntity,
+ intermediateAuthorityCount: longChain ? 3 : 1,
+ subjectName: targetName,
+ testName: testName,
+ keySize: keySize,
+ extensions: extensions);
+
+ // Walk the intermediates backwards so we build the chain collection as
+ // Issuer3
+ // Issuer2
+ // Issuer1
+ // Root
+ for (int i = intermediates.Length - 1; i >= 0; i--)
+ {
+ CertificateAuthority authority = intermediates[i];
+
+ chain.Add(authority.CloneIssuerCert());
+ authority.Dispose();
+ }
+
+ chain.Add(root.CloneIssuerCert());
+
+ responder.Dispose();
+ root.Dispose();
+
+ if (OperatingSystem.IsWindows())
+ {
+ X509Certificate2 ephemeral = endEntity;
+ endEntity = new X509Certificate2(endEntity.Export(X509ContentType.Pfx), (string?)null, X509KeyStorageFlags.Exportable);
+ ephemeral.Dispose();
+ }
+
+ return (endEntity, chain);
+ }
+
+ internal static string GetTestSNIName(string testMethodName, params SslProtocols?[] protocols)
+ {
+ static string ProtocolToString(SslProtocols? protocol)
+ {
+ return (protocol?.ToString() ?? "null").Replace(", ", "-");
+ }
+
+ var args = string.Join(".", protocols.Select(p => ProtocolToString(p)));
+ var name = testMethodName.Length > 63 ? testMethodName.Substring(0, 63) : testMethodName;
+
+ name = $"{name}.{args}";
+ if (OperatingSystem.IsAndroid())
+ {
+ // Android does not support underscores in host names
+ name = name.Replace("_", string.Empty);
+ }
+
+ return name;
+ }
+}
diff --git a/src/Servers/Kestrel/shared/test/CertificateAuthority.cs b/src/Servers/Kestrel/shared/test/CertificateAuthority.cs
new file mode 100644
index 0000000000..14075ccec7
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/CertificateAuthority.cs
@@ -0,0 +1,951 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Formats.Asn1;
+using System.Security.Cryptography;
+using System.Security.Cryptography.X509Certificates;
+
+// Copied from https://github.com/dotnet/runtime/blob/main/src/libraries/Common/tests/System/Security/Cryptography/X509Certificates/CertificateAuthority.cs
+namespace Microsoft.AspNetCore.Testing;
+
+// This class represents only a portion of what is required to be a proper Certificate Authority.
+//
+// Please do not use it as the basis for any real Public/Private Key Infrastructure (PKI) system
+// without understanding all of the portions of proper CA management that you're skipping.
+//
+// At minimum, read the current baseline requirements of the CA/Browser Forum.
+
+[Flags]
+public enum PkiOptions
+{
+ None = 0,
+
+ IssuerRevocationViaCrl = 1 << 0,
+ IssuerRevocationViaOcsp = 1 << 1,
+ EndEntityRevocationViaCrl = 1 << 2,
+ EndEntityRevocationViaOcsp = 1 << 3,
+
+ CrlEverywhere = IssuerRevocationViaCrl | EndEntityRevocationViaCrl,
+ OcspEverywhere = IssuerRevocationViaOcsp | EndEntityRevocationViaOcsp,
+ AllIssuerRevocation = IssuerRevocationViaCrl | IssuerRevocationViaOcsp,
+ AllEndEntityRevocation = EndEntityRevocationViaCrl | EndEntityRevocationViaOcsp,
+ AllRevocation = CrlEverywhere | OcspEverywhere,
+
+ IssuerAuthorityHasDesignatedOcspResponder = 1 << 16,
+ RootAuthorityHasDesignatedOcspResponder = 1 << 17,
+ NoIssuerCertDistributionUri = 1 << 18,
+ NoRootCertDistributionUri = 1 << 18,
+}
+
+internal sealed class CertificateAuthority : IDisposable
+{
+ private static readonly Asn1Tag s_context0 = new Asn1Tag(TagClass.ContextSpecific, 0);
+ private static readonly Asn1Tag s_context1 = new Asn1Tag(TagClass.ContextSpecific, 1);
+ private static readonly Asn1Tag s_context2 = new Asn1Tag(TagClass.ContextSpecific, 2);
+
+ private static readonly X500DistinguishedName s_nonParticipatingName =
+ new X500DistinguishedName("CN=The Ghost in the Machine");
+
+ private static readonly X509BasicConstraintsExtension s_eeConstraints =
+ new X509BasicConstraintsExtension(false, false, 0, false);
+
+ private static readonly X509KeyUsageExtension s_caKeyUsage =
+ new X509KeyUsageExtension(
+ X509KeyUsageFlags.KeyCertSign | X509KeyUsageFlags.CrlSign,
+ critical: false);
+
+ private static readonly X509KeyUsageExtension s_eeKeyUsage =
+ new X509KeyUsageExtension(
+ X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.KeyEncipherment | X509KeyUsageFlags.DataEncipherment,
+ critical: false);
+
+ private static readonly X509EnhancedKeyUsageExtension s_ocspResponderEku =
+ new X509EnhancedKeyUsageExtension(
+ new OidCollection
+ {
+ new Oid("1.3.6.1.5.5.7.3.9", null),
+ },
+ critical: false);
+
+ private static readonly X509EnhancedKeyUsageExtension s_tlsClientEku =
+ new X509EnhancedKeyUsageExtension(
+ new OidCollection
+ {
+ new Oid("1.3.6.1.5.5.7.3.2", null)
+ },
+ false);
+
+ private X509Certificate2 _cert;
+ private byte[] _certData;
+ private X509Extension _cdpExtension;
+ private X509Extension _aiaExtension;
+ private X509AuthorityKeyIdentifierExtension _akidExtension;
+
+ private List<(byte[], DateTimeOffset)> _revocationList;
+ private byte[] _crl;
+ private int _crlNumber;
+ private DateTimeOffset _crlExpiry;
+ private X509Certificate2 _ocspResponder;
+ private byte[] _dnHash;
+
+ internal string AiaHttpUri { get; }
+ internal string CdpUri { get; }
+ internal string OcspUri { get; }
+
+ internal bool CorruptRevocationSignature { get; set; }
+ internal DateTimeOffset? RevocationExpiration { get; set; }
+ internal bool CorruptRevocationIssuerName { get; set; }
+ internal bool OmitNextUpdateInCrl { get; set; }
+
+ // All keys created in this method are smaller than recommended,
+ // but they only live for a few seconds (at most),
+ // and never communicate out of process.
+ const int DefaultKeySize = 1024;
+
+ internal CertificateAuthority(
+ X509Certificate2 cert,
+ string aiaHttpUrl,
+ string cdpUrl,
+ string ocspUrl)
+ {
+ _cert = cert;
+ AiaHttpUri = aiaHttpUrl;
+ CdpUri = cdpUrl;
+ OcspUri = ocspUrl;
+ }
+
+ public void Dispose()
+ {
+ _cert.Dispose();
+ _ocspResponder?.Dispose();
+ }
+
+ internal string SubjectName => _cert.Subject;
+ internal bool HasOcspDelegation => _ocspResponder != null;
+ internal string OcspResponderSubjectName => (_ocspResponder ?? _cert).Subject;
+
+ internal X509Certificate2 CloneIssuerCert()
+ {
+ return new X509Certificate2(_cert.RawData);
+ }
+
+ internal void Revoke(X509Certificate2 certificate, DateTimeOffset revocationTime)
+ {
+ if (!certificate.IssuerName.RawData.SequenceEqual(_cert.SubjectName.RawData))
+ {
+ throw new ArgumentException("Certificate was not from this issuer", nameof(certificate));
+ }
+
+ if (_revocationList == null)
+ {
+ _revocationList = new List<(byte[], DateTimeOffset)>();
+ }
+
+ byte[] serial = certificate.SerialNumberBytes.ToArray();
+ _revocationList.Add((serial, revocationTime));
+ _crl = null;
+ }
+
+ internal X509Certificate2 CreateSubordinateCA(
+ string subject,
+ RSA publicKey,
+ int? depthLimit = null)
+ {
+ return CreateCertificate(
+ subject,
+ publicKey,
+ TimeSpan.FromMinutes(1),
+ new X509ExtensionCollection() {
+ new X509BasicConstraintsExtension(
+ certificateAuthority: true,
+ depthLimit.HasValue,
+ depthLimit.GetValueOrDefault(),
+ critical: true),
+ s_caKeyUsage });
+ }
+
+ internal X509Certificate2 CreateEndEntity(string subject, RSA publicKey, X509ExtensionCollection extensions)
+ {
+ return CreateCertificate(
+ subject,
+ publicKey,
+ TimeSpan.FromSeconds(2),
+ extensions);
+ }
+
+ internal X509Certificate2 CreateOcspSigner(string subject, RSA publicKey)
+ {
+ return CreateCertificate(
+ subject,
+ publicKey,
+ TimeSpan.FromSeconds(1),
+ new X509ExtensionCollection() { s_eeConstraints, s_eeKeyUsage, s_ocspResponderEku},
+ ocspResponder: true);
+ }
+
+ internal void RebuildRootWithRevocation()
+ {
+ if (_cdpExtension == null && CdpUri != null)
+ {
+ _cdpExtension = CreateCdpExtension(CdpUri);
+ }
+
+ if (_aiaExtension == null && (OcspUri != null || AiaHttpUri != null))
+ {
+ _aiaExtension = CreateAiaExtension(AiaHttpUri, OcspUri);
+ }
+
+ RebuildRootWithRevocation(_cdpExtension, _aiaExtension);
+ }
+
+ private void RebuildRootWithRevocation(X509Extension cdpExtension, X509Extension aiaExtension)
+ {
+ X500DistinguishedName subjectName = _cert.SubjectName;
+
+ if (!subjectName.RawData.SequenceEqual(_cert.IssuerName.RawData))
+ {
+ throw new InvalidOperationException();
+ }
+
+ var req = new CertificateRequest(subjectName, _cert.PublicKey, HashAlgorithmName.SHA256);
+
+ foreach (X509Extension ext in _cert.Extensions)
+ {
+ req.CertificateExtensions.Add(ext);
+ }
+
+ req.CertificateExtensions.Add(cdpExtension);
+ req.CertificateExtensions.Add(aiaExtension);
+
+ byte[] serial = _cert.SerialNumberBytes.ToArray();
+
+ X509Certificate2 dispose = _cert;
+
+ using (dispose)
+ using (RSA rsa = _cert.GetRSAPrivateKey())
+ using (X509Certificate2 tmp = req.Create(
+ subjectName,
+ X509SignatureGenerator.CreateForRSA(rsa, RSASignaturePadding.Pkcs1),
+ new DateTimeOffset(_cert.NotBefore),
+ new DateTimeOffset(_cert.NotAfter),
+ serial))
+ {
+ _cert = tmp.CopyWithPrivateKey(rsa);
+ }
+ }
+
+ private X509Certificate2 CreateCertificate(
+ string subject,
+ RSA publicKey,
+ TimeSpan nestingBuffer,
+ X509ExtensionCollection extensions,
+ bool ocspResponder = false)
+ {
+ if (_cdpExtension == null && CdpUri != null)
+ {
+ _cdpExtension = CreateCdpExtension(CdpUri);
+ }
+
+ if (_aiaExtension == null && (OcspUri != null || AiaHttpUri != null))
+ {
+ _aiaExtension = CreateAiaExtension(AiaHttpUri, OcspUri);
+ }
+
+ if (_akidExtension == null)
+ {
+ _akidExtension = CreateAkidExtension();
+ }
+
+ CertificateRequest request = new CertificateRequest(
+ subject,
+ publicKey,
+ HashAlgorithmName.SHA256,
+ RSASignaturePadding.Pkcs1);
+
+ foreach (X509Extension extension in extensions)
+ {
+ request.CertificateExtensions.Add(extension);
+ }
+
+ // Windows does not accept OCSP Responder certificates which have
+ // a CDP extension, or an AIA extension with an OCSP endpoint.
+ if (!ocspResponder)
+ {
+ request.CertificateExtensions.Add(_cdpExtension);
+ request.CertificateExtensions.Add(_aiaExtension);
+ }
+
+ request.CertificateExtensions.Add(_akidExtension);
+ request.CertificateExtensions.Add(
+ new X509SubjectKeyIdentifierExtension(request.PublicKey, false));
+
+ byte[] serial = new byte[sizeof(long)];
+ RandomNumberGenerator.Fill(serial);
+
+ return request.Create(
+ _cert,
+ _cert.NotBefore.Add(nestingBuffer),
+ _cert.NotAfter.Subtract(nestingBuffer),
+ serial);
+ }
+
+ internal byte[] GetCertData()
+ {
+ return (_certData ??= _cert.RawData);
+ }
+
+ internal byte[] GetCrl()
+ {
+ byte[] crl = _crl;
+ DateTimeOffset now = DateTimeOffset.UtcNow;
+
+ if (crl != null && now < _crlExpiry)
+ {
+ return crl;
+ }
+
+ DateTimeOffset newExpiry = now.AddSeconds(2);
+ X509AuthorityKeyIdentifierExtension akid = _akidExtension ??= CreateAkidExtension();
+
+ if (OmitNextUpdateInCrl)
+ {
+ crl = BuildCrlManually(now, newExpiry, akid);
+ }
+ else
+ {
+ CertificateRevocationListBuilder builder = new CertificateRevocationListBuilder();
+
+ if (_revocationList is not null)
+ {
+ foreach ((byte[] serial, DateTimeOffset when) in _revocationList)
+ {
+ builder.AddEntry(serial, when);
+ }
+ }
+
+ DateTimeOffset thisUpdate;
+ DateTimeOffset nextUpdate;
+
+ if (RevocationExpiration.HasValue)
+ {
+ nextUpdate = RevocationExpiration.GetValueOrDefault();
+ thisUpdate = _cert.NotBefore;
+ }
+ else
+ {
+ thisUpdate = now;
+ nextUpdate = newExpiry;
+ }
+
+ using (RSA key = _cert.GetRSAPrivateKey())
+ {
+ crl = builder.Build(
+ CorruptRevocationIssuerName ? s_nonParticipatingName : _cert.SubjectName,
+ X509SignatureGenerator.CreateForRSA(key, RSASignaturePadding.Pkcs1),
+ _crlNumber,
+ nextUpdate,
+ HashAlgorithmName.SHA256,
+ _akidExtension,
+ thisUpdate);
+ }
+ }
+
+ if (CorruptRevocationSignature)
+ {
+ crl[^2] ^= 0xFF;
+ }
+
+ _crl = crl;
+ _crlExpiry = newExpiry;
+ _crlNumber++;
+ return crl;
+ }
+
+ private byte[] BuildCrlManually(
+ DateTimeOffset now,
+ DateTimeOffset newExpiry,
+ X509AuthorityKeyIdentifierExtension akidExtension)
+ {
+ AsnWriter writer = new AsnWriter(AsnEncodingRules.DER);
+
+ using (writer.PushSequence())
+ {
+ writer.WriteObjectIdentifier("1.2.840.113549.1.1.11");
+ writer.WriteNull();
+ }
+
+ byte[] signatureAlgId = writer.Encode();
+ writer.Reset();
+
+ // TBSCertList
+ using (writer.PushSequence())
+ {
+ // version v2(1)
+ writer.WriteInteger(1);
+
+ // signature (AlgorithmIdentifier)
+ writer.WriteEncodedValue(signatureAlgId);
+
+ // issuer
+ if (CorruptRevocationIssuerName)
+ {
+ writer.WriteEncodedValue(s_nonParticipatingName.RawData);
+ }
+ else
+ {
+ writer.WriteEncodedValue(_cert.SubjectName.RawData);
+ }
+
+ if (RevocationExpiration.HasValue)
+ {
+ // thisUpdate
+ writer.WriteUtcTime(_cert.NotBefore);
+
+ // nextUpdate
+ if (!OmitNextUpdateInCrl)
+ {
+ writer.WriteUtcTime(RevocationExpiration.Value);
+ }
+ }
+ else
+ {
+ // thisUpdate
+ writer.WriteUtcTime(now);
+
+ // nextUpdate
+ if (!OmitNextUpdateInCrl)
+ {
+ writer.WriteUtcTime(newExpiry);
+ }
+ }
+
+ // revokedCertificates (don't write down if empty)
+ if (_revocationList?.Count > 0)
+ {
+ // SEQUENCE OF
+ using (writer.PushSequence())
+ {
+ foreach ((byte[] serial, DateTimeOffset when) in _revocationList)
+ {
+ // Anonymous CRL Entry type
+ using (writer.PushSequence())
+ {
+ writer.WriteInteger(serial);
+ writer.WriteUtcTime(when);
+ }
+ }
+ }
+ }
+
+ // extensions [0] EXPLICIT Extensions
+ using (writer.PushSequence(s_context0))
+ {
+ // Extensions (SEQUENCE OF)
+ using (writer.PushSequence())
+ {
+ // Authority Key Identifier Extension
+ using (writer.PushSequence())
+ {
+ writer.WriteObjectIdentifier(akidExtension.Oid.Value);
+
+ if (akidExtension.Critical)
+ {
+ writer.WriteBoolean(true);
+ }
+
+ writer.WriteOctetString(akidExtension.RawData);
+ }
+
+ // CRL Number Extension
+ using (writer.PushSequence())
+ {
+ writer.WriteObjectIdentifier("2.5.29.20");
+
+ using (writer.PushOctetString())
+ {
+ writer.WriteInteger(_crlNumber);
+ }
+ }
+ }
+ }
+ }
+
+ byte[] tbsCertList = writer.Encode();
+ writer.Reset();
+
+ byte[] signature;
+
+ using (RSA key = _cert.GetRSAPrivateKey())
+ {
+ signature =
+ key.SignData(tbsCertList, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
+
+ if (CorruptRevocationSignature)
+ {
+ signature[5] ^= 0xFF;
+ }
+ }
+
+ // CertificateList
+ using (writer.PushSequence())
+ {
+ writer.WriteEncodedValue(tbsCertList);
+ writer.WriteEncodedValue(signatureAlgId);
+ writer.WriteBitString(signature);
+ }
+
+ return writer.Encode();
+ }
+
+ internal void DesignateOcspResponder(X509Certificate2 responder)
+ {
+ _ocspResponder = responder;
+ }
+
+ internal byte[] BuildOcspResponse(
+ ReadOnlyMemory<byte> certId,
+ ReadOnlyMemory<byte> nonceExtension)
+ {
+ DateTimeOffset now = DateTimeOffset.UtcNow;
+
+ DateTimeOffset revokedTime = default;
+ CertStatus status = CheckRevocation(certId, ref revokedTime);
+ X509Certificate2 responder = (_ocspResponder ?? _cert);
+
+ AsnWriter writer = new AsnWriter(AsnEncodingRules.DER);
+
+ /*
+ResponseData ::= SEQUENCE {
+ version [0] EXPLICIT Version DEFAULT v1,
+ responderID ResponderID,
+ producedAt GeneralizedTime,
+ responses SEQUENCE OF SingleResponse,
+ responseExtensions [1] EXPLICIT Extensions OPTIONAL }
+ */
+ using (writer.PushSequence())
+ {
+ // Skip version (v1)
+
+ /*
+ResponderID ::= CHOICE {
+byName [1] Name,
+byKey [2] KeyHash }
+ */
+
+ using (writer.PushSequence(s_context1))
+ {
+ if (CorruptRevocationIssuerName)
+ {
+ writer.WriteEncodedValue(s_nonParticipatingName.RawData);
+ }
+ else
+ {
+ writer.WriteEncodedValue(responder.SubjectName.RawData);
+ }
+ }
+
+ writer.WriteGeneralizedTime(now, omitFractionalSeconds: true);
+
+ using (writer.PushSequence())
+ {
+ /*
+SingleResponse ::= SEQUENCE {
+certID CertID,
+certStatus CertStatus,
+thisUpdate GeneralizedTime,
+nextUpdate [0] EXPLICIT GeneralizedTime OPTIONAL,
+singleExtensions [1] EXPLICIT Extensions OPTIONAL }
+ */
+ using (writer.PushSequence())
+ {
+ writer.WriteEncodedValue(certId.Span);
+
+ if (status == CertStatus.OK)
+ {
+ writer.WriteNull(s_context0);
+ }
+ else if (status == CertStatus.Revoked)
+ {
+ // Android does not support all precisions for seconds - just omit fractional seconds for testing on Android
+ writer.PushSequence(s_context1);
+ writer.WriteGeneralizedTime(revokedTime, omitFractionalSeconds: OperatingSystem.IsAndroid());
+ writer.PopSequence(s_context1);
+ }
+ else
+ {
+ Assert.Equal(CertStatus.Unknown, status);
+ writer.WriteNull(s_context2);
+ }
+
+ if (RevocationExpiration.HasValue)
+ {
+ writer.WriteGeneralizedTime(
+ _cert.NotBefore,
+ omitFractionalSeconds: true);
+
+ using (writer.PushSequence(s_context0))
+ {
+ writer.WriteGeneralizedTime(
+ RevocationExpiration.Value,
+ omitFractionalSeconds: true);
+ }
+ }
+ else
+ {
+ writer.WriteGeneralizedTime(now, omitFractionalSeconds: true);
+ }
+ }
+ }
+
+ if (!nonceExtension.IsEmpty)
+ {
+ using (writer.PushSequence(s_context1))
+ using (writer.PushSequence())
+ {
+ writer.WriteEncodedValue(nonceExtension.Span);
+ }
+ }
+ }
+
+ byte[] tbsResponseData = writer.Encode();
+ writer.Reset();
+
+ /*
+ BasicOCSPResponse ::= SEQUENCE {
+tbsResponseData ResponseData,
+signatureAlgorithm AlgorithmIdentifier,
+signature BIT STRING,
+certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL }
+ */
+ using (writer.PushSequence())
+ {
+ writer.WriteEncodedValue(tbsResponseData);
+
+ using (writer.PushSequence())
+ {
+ writer.WriteObjectIdentifier("1.2.840.113549.1.1.11");
+ writer.WriteNull();
+ }
+
+ using (RSA rsa = responder.GetRSAPrivateKey())
+ {
+ byte[] signature = rsa.SignData(
+ tbsResponseData,
+ HashAlgorithmName.SHA256,
+ RSASignaturePadding.Pkcs1);
+
+ if (CorruptRevocationSignature)
+ {
+ signature[5] ^= 0xFF;
+ }
+
+ writer.WriteBitString(signature);
+ }
+
+ if (_ocspResponder != null)
+ {
+ using (writer.PushSequence(s_context0))
+ using (writer.PushSequence())
+ {
+ writer.WriteEncodedValue(_ocspResponder.RawData);
+ writer.PopSequence();
+ }
+ }
+ }
+
+ byte[] responseBytes = writer.Encode();
+ writer.Reset();
+
+ using (writer.PushSequence())
+ {
+ writer.WriteEnumeratedValue(OcspResponseStatus.Successful);
+
+ using (writer.PushSequence(s_context0))
+ using (writer.PushSequence())
+ {
+ writer.WriteObjectIdentifier("1.3.6.1.5.5.7.48.1.1");
+ writer.WriteOctetString(responseBytes);
+ }
+ }
+
+ return writer.Encode();
+ }
+
+ private CertStatus CheckRevocation(ReadOnlyMemory<byte> certId, ref DateTimeOffset revokedTime)
+ {
+ AsnReader reader = new AsnReader(certId, AsnEncodingRules.DER);
+ AsnReader idReader = reader.ReadSequence();
+ reader.ThrowIfNotEmpty();
+
+ AsnReader algIdReader = idReader.ReadSequence();
+
+ if (algIdReader.ReadObjectIdentifier() != "1.3.14.3.2.26")
+ {
+ return CertStatus.Unknown;
+ }
+
+ if (algIdReader.HasData)
+ {
+ algIdReader.ReadNull();
+ algIdReader.ThrowIfNotEmpty();
+ }
+
+ if (_dnHash == null)
+ {
+ _dnHash = SHA1.HashData(_cert.SubjectName.RawData);
+ }
+
+ if (!idReader.TryReadPrimitiveOctetString(out ReadOnlyMemory<byte> reqDn))
+ {
+ idReader.ThrowIfNotEmpty();
+ }
+
+ if (!reqDn.Span.SequenceEqual(_dnHash))
+ {
+ return CertStatus.Unknown;
+ }
+
+ if (!idReader.TryReadPrimitiveOctetString(out ReadOnlyMemory<byte> reqKeyHash))
+ {
+ idReader.ThrowIfNotEmpty();
+ }
+
+ // We could check the key hash...
+
+ ReadOnlyMemory<byte> reqSerial = idReader.ReadIntegerBytes();
+ idReader.ThrowIfNotEmpty();
+
+ if (_revocationList == null)
+ {
+ return CertStatus.OK;
+ }
+
+ ReadOnlySpan<byte> reqSerialSpan = reqSerial.Span;
+
+ foreach ((byte[] serial, DateTimeOffset time) in _revocationList)
+ {
+ if (reqSerialSpan.SequenceEqual(serial))
+ {
+ revokedTime = time;
+ return CertStatus.Revoked;
+ }
+ }
+
+ return CertStatus.OK;
+ }
+
+ private static X509Extension CreateAiaExtension(string certLocation, string ocspStem)
+ {
+ string[] ocsp = null;
+ string[] caIssuers = null;
+
+ if (ocspStem is not null)
+ {
+ ocsp = new[] { ocspStem };
+ }
+
+ if (certLocation is not null)
+ {
+ caIssuers = new[] { certLocation };
+ }
+
+ return new X509AuthorityInformationAccessExtension(ocsp, caIssuers);
+ }
+
+ private static X509Extension CreateCdpExtension(string cdp)
+ {
+ return CertificateRevocationListBuilder.BuildCrlDistributionPointExtension(new[] { cdp });
+ }
+
+ private X509AuthorityKeyIdentifierExtension CreateAkidExtension()
+ {
+ X509SubjectKeyIdentifierExtension skid =
+ _cert.Extensions.OfType<X509SubjectKeyIdentifierExtension>().SingleOrDefault();
+
+ if (skid is null)
+ {
+ return X509AuthorityKeyIdentifierExtension.CreateFromCertificate(
+ _cert,
+ includeKeyIdentifier: false,
+ includeIssuerAndSerial: true);
+ }
+
+ return X509AuthorityKeyIdentifierExtension.CreateFromSubjectKeyIdentifier(skid);
+ }
+
+ private enum OcspResponseStatus
+ {
+ Successful,
+ }
+
+ private enum CertStatus
+ {
+ Unknown,
+ OK,
+ Revoked,
+ }
+
+ internal static void BuildPrivatePki(
+ PkiOptions pkiOptions,
+ out RevocationResponder responder,
+ out CertificateAuthority rootAuthority,
+ out CertificateAuthority[] intermediateAuthorities,
+ out X509Certificate2 endEntityCert,
+ int intermediateAuthorityCount,
+ string testName = null,
+ bool registerAuthorities = true,
+ bool pkiOptionsInSubject = false,
+ string subjectName = null,
+ int keySize = DefaultKeySize,
+ X509ExtensionCollection extensions = null)
+ {
+ bool rootDistributionViaHttp = !pkiOptions.HasFlag(PkiOptions.NoRootCertDistributionUri);
+ bool issuerRevocationViaCrl = pkiOptions.HasFlag(PkiOptions.IssuerRevocationViaCrl);
+ bool issuerRevocationViaOcsp = pkiOptions.HasFlag(PkiOptions.IssuerRevocationViaOcsp);
+ bool issuerDistributionViaHttp = !pkiOptions.HasFlag(PkiOptions.NoIssuerCertDistributionUri);
+ bool endEntityRevocationViaCrl = pkiOptions.HasFlag(PkiOptions.EndEntityRevocationViaCrl);
+ bool endEntityRevocationViaOcsp = pkiOptions.HasFlag(PkiOptions.EndEntityRevocationViaOcsp);
+
+ Assert.True(
+ issuerRevocationViaCrl || issuerRevocationViaOcsp ||
+ endEntityRevocationViaCrl || endEntityRevocationViaOcsp,
+ "At least one revocation mode is enabled");
+
+ // default to client
+ extensions ??= new X509ExtensionCollection() { s_eeConstraints, s_eeKeyUsage, s_tlsClientEku };
+
+ using (RSA rootKey = RSA.Create(keySize))
+ using (RSA eeKey = RSA.Create(keySize))
+ {
+ var rootReq = new CertificateRequest(
+ BuildSubject("A Revocation Test Root", testName, pkiOptions, pkiOptionsInSubject),
+ rootKey,
+ HashAlgorithmName.SHA256,
+ RSASignaturePadding.Pkcs1);
+
+ X509BasicConstraintsExtension caConstraints =
+ new X509BasicConstraintsExtension(true, false, 0, true);
+
+ rootReq.CertificateExtensions.Add(caConstraints);
+ var rootSkid = new X509SubjectKeyIdentifierExtension(rootReq.PublicKey, false);
+ rootReq.CertificateExtensions.Add(
+ rootSkid);
+
+ DateTimeOffset start = DateTimeOffset.UtcNow;
+ DateTimeOffset end = start.AddMonths(3);
+
+ // Don't dispose this, it's being transferred to the CertificateAuthority
+ X509Certificate2 rootCert = rootReq.CreateSelfSigned(start.AddDays(-2), end.AddDays(2));
+ responder = RevocationResponder.CreateAndListen();
+
+ string certUrl = $"{responder.UriPrefix}cert/{rootSkid.SubjectKeyIdentifier}.cer";
+ string cdpUrl = $"{responder.UriPrefix}crl/{rootSkid.SubjectKeyIdentifier}.crl";
+ string ocspUrl = $"{responder.UriPrefix}ocsp/{rootSkid.SubjectKeyIdentifier}";
+
+ rootAuthority = new CertificateAuthority(
+ rootCert,
+ rootDistributionViaHttp ? certUrl : null,
+ issuerRevocationViaCrl ? cdpUrl : null,
+ issuerRevocationViaOcsp ? ocspUrl : null);
+
+ CertificateAuthority issuingAuthority = rootAuthority;
+ intermediateAuthorities = new CertificateAuthority[intermediateAuthorityCount];
+
+ for (int intermediateIndex = 0; intermediateIndex < intermediateAuthorityCount; intermediateIndex++)
+ {
+ using RSA intermediateKey = RSA.Create(keySize);
+
+ // Don't dispose this, it's being transferred to the CertificateAuthority
+ X509Certificate2 intermedCert;
+
+ {
+ X509Certificate2 intermedPub = issuingAuthority.CreateSubordinateCA(
+ BuildSubject($"A Revocation Test CA {intermediateIndex}", testName, pkiOptions, pkiOptionsInSubject),
+ intermediateKey);
+ intermedCert = intermedPub.CopyWithPrivateKey(intermediateKey);
+ intermedPub.Dispose();
+ }
+
+ X509SubjectKeyIdentifierExtension intermedSkid =
+ intermedCert.Extensions.OfType<X509SubjectKeyIdentifierExtension>().Single();
+
+ certUrl = $"{responder.UriPrefix}cert/{intermedSkid.SubjectKeyIdentifier}.cer";
+ cdpUrl = $"{responder.UriPrefix}crl/{intermedSkid.SubjectKeyIdentifier}.crl";
+ ocspUrl = $"{responder.UriPrefix}ocsp/{intermedSkid.SubjectKeyIdentifier}";
+
+ CertificateAuthority intermediateAuthority = new CertificateAuthority(
+ intermedCert,
+ issuerDistributionViaHttp ? certUrl : null,
+ endEntityRevocationViaCrl ? cdpUrl : null,
+ endEntityRevocationViaOcsp ? ocspUrl : null);
+
+ issuingAuthority = intermediateAuthority;
+ intermediateAuthorities[intermediateIndex] = intermediateAuthority;
+ }
+
+ endEntityCert = issuingAuthority.CreateEndEntity(
+ BuildSubject(subjectName ?? "A Revocation Test Cert", testName, pkiOptions, pkiOptionsInSubject),
+ eeKey,
+ extensions);
+
+ X509Certificate2 tmp = endEntityCert;
+ endEntityCert = endEntityCert.CopyWithPrivateKey(eeKey);
+ tmp.Dispose();
+ }
+
+ if (registerAuthorities)
+ {
+ responder.AddCertificateAuthority(rootAuthority);
+
+ foreach (CertificateAuthority authority in intermediateAuthorities)
+ {
+ responder.AddCertificateAuthority(authority);
+ }
+ }
+ }
+
+ internal static void BuildPrivatePki(
+ PkiOptions pkiOptions,
+ out RevocationResponder responder,
+ out CertificateAuthority rootAuthority,
+ out CertificateAuthority intermediateAuthority,
+ out X509Certificate2 endEntityCert,
+ string testName = null,
+ bool registerAuthorities = true,
+ bool pkiOptionsInSubject = false,
+ string subjectName = null,
+ int keySize = DefaultKeySize,
+ X509ExtensionCollection extensions = null)
+ {
+
+ BuildPrivatePki(
+ pkiOptions,
+ out responder,
+ out rootAuthority,
+ out CertificateAuthority[] intermediateAuthorities,
+ out endEntityCert,
+ intermediateAuthorityCount: 1,
+ testName: testName,
+ registerAuthorities: registerAuthorities,
+ pkiOptionsInSubject: pkiOptionsInSubject,
+ subjectName: subjectName,
+ keySize: keySize,
+ extensions: extensions);
+
+ intermediateAuthority = intermediateAuthorities.Single();
+ }
+
+ private static string BuildSubject(
+ string cn,
+ string testName,
+ PkiOptions pkiOptions,
+ bool includePkiOptions)
+ {
+ if (includePkiOptions)
+ {
+ return $"CN=\"{cn}\", O=\"{testName}\", OU=\"{pkiOptions}\"";
+ }
+
+ return $"CN=\"{cn}\", O=\"{testName}\"";
+ }
+}
diff --git a/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs b/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs
index 38300b3aa1..079ce4e2ec 100644
--- a/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs
+++ b/src/Servers/Kestrel/shared/test/Http3/Http3InMemory.cs
@@ -17,10 +17,12 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
using static System.IO.Pipelines.DuplexPipe;
@@ -87,7 +89,7 @@ internal class Http3InMemory
private long _currentStreamId;
internal Http3Connection Connection { get; private set; }
- internal Http3ControlStream OutboundControlStream { get; private set; }
+ internal Http3ControlStream OutboundControlStream { get; set; }
internal ChannelReader<KeyValuePair<Http3SettingType, long>> ServerReceivedSettingsReader => _serverReceivedSettings.Reader;
@@ -172,7 +174,7 @@ internal class Http3InMemory
}
}
- internal void AssertConnectionError<TException>(Http3ErrorCode expectedErrorCode, Action<Type, string[]> matchExpectedErrorMessage = null, params string[] expectedErrorMessage) where TException : Exception
+ private void AssertConnectionError<TException>(Http3ErrorCode expectedErrorCode, Action<Type, string[]> matchExpectedErrorMessage = null, params string[] expectedErrorMessage) where TException : Exception
{
var currentError = (Http3ErrorCode)MultiplexedConnectionContext.Error;
if (currentError != expectedErrorCode)
@@ -259,13 +261,13 @@ internal class Http3InMemory
}
}
- internal async ValueTask<Http3RequestStream> InitializeConnectionAndStreamsAsync(RequestDelegate application)
+ internal async ValueTask<Http3RequestStream> InitializeConnectionAndStreamsAsync(RequestDelegate application, IEnumerable<KeyValuePair<string, string>> headers, bool endStream = false)
{
await InitializeConnectionAsync(application);
OutboundControlStream = await CreateControlStream();
- return await CreateRequestStream();
+ return await CreateRequestStream(headers, endStream: endStream);
}
private class LifetimeHandlerInterceptor : IHttp3StreamLifetimeHandler
@@ -279,7 +281,7 @@ internal class Http3InMemory
_http3TestBase = http3TestBase;
}
- public bool OnInboundControlStream(Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream)
+ public bool OnInboundControlStream(Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream)
{
return _inner.OnInboundControlStream(stream);
}
@@ -293,12 +295,12 @@ internal class Http3InMemory
Debug.Assert(success);
}
- public bool OnInboundDecoderStream(Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream)
+ public bool OnInboundDecoderStream(Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream)
{
return _inner.OnInboundDecoderStream(stream);
}
- public bool OnInboundEncoderStream(Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream)
+ public bool OnInboundEncoderStream(Server.Kestrel.Core.Internal.Http3.Http3ControlStream stream)
{
return _inner.OnInboundEncoderStream(stream);
}
@@ -337,6 +339,16 @@ internal class Http3InMemory
testStream.OnHeaderReceivedTcs.TrySetResult();
}
}
+
+ public void OnUnidentifiedStreamReceived(Http3PendingStream stream)
+ {
+ _inner.OnUnidentifiedStreamReceived(stream);
+
+ if (_http3TestBase._runningStreams.TryGetValue(stream.StreamId, out var testStream))
+ {
+ testStream.OnUnidentifiedStreamCreatedTcs.TrySetResult();
+ }
+ }
}
protected void ConnectionClosed()
@@ -400,7 +412,46 @@ internal class Http3InMemory
return stream;
}
- internal ValueTask<Http3RequestStream> CreateRequestStream(Http3RequestHeaderHandler headerHandler = null)
+ internal async ValueTask<Http3RequestStream> CreateRequestStream(IEnumerable<KeyValuePair<string, string>> headers, Http3RequestHeaderHandler headerHandler = null, bool endStream = false, TaskCompletionSource tsc = null)
+ {
+ var stream = CreateRequestStreamCore(headerHandler);
+
+ if (tsc is not null)
+ {
+ stream.StartStreamDisposeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ }
+
+ if (headers is not null)
+ {
+ await stream.SendHeadersAsync(headers, endStream);
+ }
+
+ _runningStreams[stream.StreamId] = stream;
+
+ MultiplexedConnectionContext.ToServerAcceptQueue.Writer.TryWrite(stream.StreamContext);
+
+ return stream;
+ }
+
+ internal async ValueTask<Http3RequestStream> CreateRequestStream(Http3HeadersEnumerator headers, Http3RequestHeaderHandler headerHandler = null, bool endStream = false, TaskCompletionSource tsc = null)
+ {
+ var stream = CreateRequestStreamCore(headerHandler);
+
+ if (tsc is not null)
+ {
+ stream.StartStreamDisposeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ }
+
+ await stream.SendHeadersAsync(headers, endStream);
+
+ _runningStreams[stream.StreamId] = stream;
+
+ MultiplexedConnectionContext.ToServerAcceptQueue.Writer.TryWrite(stream.StreamContext);
+
+ return stream;
+ }
+
+ private Http3RequestStream CreateRequestStreamCore(Http3RequestHeaderHandler headerHandler)
{
var requestStreamId = GetStreamId(0x00);
if (!_streamContextPool.TryDequeue(out var testStreamContext))
@@ -413,16 +464,13 @@ internal class Http3InMemory
}
testStreamContext.Initialize(requestStreamId);
- var stream = new Http3RequestStream(this, Connection, testStreamContext, headerHandler ?? new Http3RequestHeaderHandler());
- _runningStreams[stream.StreamId] = stream;
-
- MultiplexedConnectionContext.ToServerAcceptQueue.Writer.TryWrite(stream.StreamContext);
- return new ValueTask<Http3RequestStream>(stream);
+ return new Http3RequestStream(this, Connection, testStreamContext, headerHandler ?? new Http3RequestHeaderHandler());
}
}
internal class Http3StreamBase
{
+ internal TaskCompletionSource OnUnidentifiedStreamCreatedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
internal TaskCompletionSource OnStreamCreatedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
internal TaskCompletionSource OnStreamCompletedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
internal TaskCompletionSource OnHeaderReceivedTcs { get; } = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
@@ -438,6 +486,7 @@ internal class Http3StreamBase
set => StreamContext.Error = value;
}
+ public Task OnUnidentifiedStreamCreatedTask => OnUnidentifiedStreamCreatedTcs.Task;
public Task OnStreamCreatedTask => OnStreamCreatedTcs.Task;
public Task OnStreamCompletedTask => OnStreamCompletedTcs.Task;
public Task OnHeaderReceivedTask => OnHeaderReceivedTcs.Task;
@@ -575,17 +624,27 @@ internal class Http3StreamBase
internal async Task WaitForStreamErrorAsync(Http3ErrorCode protocolError, Action<string> matchExpectedErrorMessage = null, string expectedErrorMessage = null)
{
- var result = await ReadApplicationInputAsync();
- if (!result.IsCompleted)
+ try
{
- throw new InvalidOperationException("Stream not ended.");
+ var result = await ReadApplicationInputAsync();
+ if (!result.IsCompleted)
+ {
+ throw new InvalidOperationException("Stream not ended.");
+ }
}
- if ((Http3ErrorCode)Error != protocolError)
+ catch (ConnectionAbortedException)
{
- throw new InvalidOperationException($"Expected error code {protocolError}, got {(Http3ErrorCode)Error}.");
+ // no-op, this just means that the stream was aborted prior to the read ending. This is probably
+ // intentional, so go onto invoking the comparisons
+ }
+ finally
+ {
+ if (protocolError != Http3ErrorCode.NoError && (Http3ErrorCode)Error != protocolError)
+ {
+ throw new InvalidOperationException($"Expected error code {protocolError}, got {(Http3ErrorCode)Error}.");
+ }
+ matchExpectedErrorMessage?.Invoke(expectedErrorMessage);
}
-
- matchExpectedErrorMessage?.Invoke(expectedErrorMessage);
}
}
@@ -1018,8 +1077,10 @@ internal class TestMultiplexedConnectionContext : MultiplexedConnectionContext,
}
}
-internal class TestStreamContext : ConnectionContext, IStreamDirectionFeature, IStreamIdFeature, IProtocolErrorCodeFeature, IPersistentStateFeature, IStreamAbortFeature, IDisposable
+internal class TestStreamContext : ConnectionContext, IStreamDirectionFeature, IStreamIdFeature, IProtocolErrorCodeFeature, IPersistentStateFeature, IStreamAbortFeature, IDisposable, IStreamClosedFeature
{
+ private readonly record struct CloseAction(Action<object> Callback, object State);
+
private readonly Http3InMemory _testBase;
internal DuplexPipePair _pair;
@@ -1037,6 +1098,7 @@ internal class TestStreamContext : ConnectionContext, IStreamDirectionFeature, I
private TaskCompletionSource _disposingTcs;
private TaskCompletionSource _disposedTcs;
internal long? _error;
+ private List<CloseAction> _onClosed;
public TestStreamContext(bool canRead, bool canWrite, Http3InMemory testBase)
{
@@ -1084,6 +1146,7 @@ internal class TestStreamContext : ConnectionContext, IStreamDirectionFeature, I
Features.Set<IStreamAbortFeature>(this);
Features.Set<IProtocolErrorCodeFeature>(this);
Features.Set<IPersistentStateFeature>(this);
+ Features.Set<IStreamClosedFeature>(this);
StreamId = streamId;
_testBase.Logger.LogInformation($"Initializing stream {streamId}");
@@ -1205,4 +1268,24 @@ internal class TestStreamContext : ConnectionContext, IStreamDirectionFeature, I
{
AbortWriteException = abortReason;
}
+
+ public void OnClosed(Action<object> callback, object state)
+ {
+ if (_onClosed == null)
+ {
+ _onClosed = new List<CloseAction>();
+ }
+ _onClosed.Add(new CloseAction(callback, state));
+ }
+
+ public void Close()
+ {
+ if (_onClosed != null)
+ {
+ foreach (var onClose in _onClosed)
+ {
+ onClose.Callback(onClose.State);
+ }
+ }
+ }
}
diff --git a/src/Servers/Kestrel/shared/test/HttpParsingData.cs b/src/Servers/Kestrel/shared/test/HttpParsingData.cs
index 8baf18513c..f259dd9232 100644
--- a/src/Servers/Kestrel/shared/test/HttpParsingData.cs
+++ b/src/Servers/Kestrel/shared/test/HttpParsingData.cs
@@ -205,7 +205,15 @@ public class HttpParsingData
"CUSTOM / HTTP/1.1a\n",
"CUSTOM / HTTP/1.1a\r\n",
"CUSTOM / HTTP/1.1ab\r\n",
+ "CUSTOM / H\n",
+ "CUSTOM / HT\n",
+ "CUSTOM / HTT\n",
+ "CUSTOM / HTTP\n",
+ "CUSTOM / HTTP/\n",
+ "CUSTOM / HTTP/1\n",
+ "CUSTOM / HTTP/1.\n",
"CUSTOM / hello\r\n",
+ "CUSTOM / hello\n",
"CUSTOM ? HTTP/1.1\r\n",
"CUSTOM /a?b=cHTTP/1.1\r\n",
"CUSTOM /a%20bHTTP/1.1\r\n",
@@ -217,6 +225,21 @@ public class HttpParsingData
}
}
+ // This list is valid in quirk mode
+ public static IEnumerable<string> RequestLineInvalidDataLineFeedTerminator
+ {
+ get
+ {
+ return new[]
+ {
+ "GET / HTTP/1.0\n",
+ "GET / HTTP/1.1\n",
+ "CUSTOM / HTTP/1.0\n",
+ "CUSTOM / HTTP/1.1\n",
+ };
+ }
+ }
+
// Bad HTTP Methods (invalid according to RFC)
public static IEnumerable<string> MethodWithNonTokenCharData
{
@@ -364,13 +387,19 @@ public class HttpParsingData
"8charact",
};
- public static IEnumerable<object[]> RequestHeaderInvalidData => new[]
+ public static IEnumerable<object[]> RequestHeaderInvalidDataLineFeedTerminator => new[]
{
// Missing CR
new[] { "Header: value\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header: value\x0A") },
new[] { "Header-1: value1\nHeader-2: value2\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header-1: value1\x0A") },
new[] { "Header-1: value1\r\nHeader-2: value2\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header-2: value2\x0A") },
+ // Empty header name
+ new[] { ":a\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@":a\x0A") },
+ };
+
+ public static IEnumerable<object[]> RequestHeaderInvalidData => new[]
+ {
// Line folding
new[] { "Header: line1\r\n line2\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@" line2\x0D\x0A") },
new[] { "Header: line1\r\n\tline2\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"\x09line2\x0D\x0A") },
@@ -404,7 +433,7 @@ public class HttpParsingData
new[] { "Header-1 value1\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header-1 value1\x0D\x0A") },
new[] { "Header-1 value1\r\nHeader-2: value2\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header-1 value1\x0D\x0A") },
new[] { "Header-1: value1\r\nHeader-2 value2\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header-2 value2\x0D\x0A") },
- new[] { "\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"\x0A") },
+ new[] { "HeaderValue1\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"HeaderValue1\x0D\x0A") },
// Starting with whitespace
new[] { " Header: value\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@" Header: value\x0D\x0A") },
@@ -435,11 +464,13 @@ public class HttpParsingData
// Headers not ending in CRLF line
new[] { "Header-1: value1\r\nHeader-2: value2\r\n\r\r", CoreStrings.BadRequest_InvalidRequestHeadersNoCRLF },
- new[] { "Header-1: value1\r\nHeader-2: value2\r\n\r ", CoreStrings.BadRequest_InvalidRequestHeadersNoCRLF },
+ new[] { "Header-1: value1\r\nHeader-2: value2\r\n\r ", CoreStrings.BadRequest_InvalidRequestHeadersNoCRLF },
new[] { "Header-1: value1\r\nHeader-2: value2\r\n\r \n", CoreStrings.BadRequest_InvalidRequestHeadersNoCRLF },
+ new[] { "Header-1: value1\r\nHeader-2\t: value2 \n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@"Header-2\x09: value2 \x0A") },
// Empty header name
new[] { ": value\r\n\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@": value\x0D\x0A") },
+ new[] { ":a\r\n", CoreStrings.FormatBadRequest_InvalidRequestHeader_Detail(@":a\x0D\x0A") },
};
public static TheoryData<string, string> HostHeaderData
diff --git a/src/Servers/Kestrel/shared/test/RevocationResponder.cs b/src/Servers/Kestrel/shared/test/RevocationResponder.cs
new file mode 100644
index 0000000000..9691f168b1
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/RevocationResponder.cs
@@ -0,0 +1,426 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Formats.Asn1;
+using System.Net;
+using System.Security.Cryptography;
+using System.Web;
+
+namespace Microsoft.AspNetCore.Testing;
+
+// Copied from https://github.com/dotnet/runtime/blob/main/src/libraries/Common/tests/System/Security/Cryptography/X509Certificates/RevocationResponder.cs
+internal sealed class RevocationResponder : IDisposable
+{
+ private static readonly bool s_traceEnabled =
+ Environment.GetEnvironmentVariable("TRACE_REVOCATION_RESPONSE") != null;
+
+ private readonly HttpListener _listener;
+
+ private readonly Dictionary<string, CertificateAuthority> _aiaPaths =
+ new Dictionary<string, CertificateAuthority>();
+
+ private readonly Dictionary<string, CertificateAuthority> _crlPaths
+ = new Dictionary<string, CertificateAuthority>();
+
+ private readonly List<(string, CertificateAuthority)> _ocspAuthorities =
+ new List<(string, CertificateAuthority)>();
+
+ public string UriPrefix { get; }
+
+ public bool RespondEmpty { get; set; }
+
+ public TimeSpan ResponseDelay { get; set; }
+ public DelayedActionsFlag DelayedActions { get; set; }
+
+ private RevocationResponder(HttpListener listener, string uriPrefix)
+ {
+ _listener = listener;
+ UriPrefix = uriPrefix;
+ }
+
+ public void Dispose()
+ {
+ _listener.Close();
+ }
+
+ internal void AddCertificateAuthority(CertificateAuthority authority)
+ {
+ if (authority.AiaHttpUri != null && authority.AiaHttpUri.StartsWith(UriPrefix, StringComparison.OrdinalIgnoreCase))
+ {
+ string path = authority.AiaHttpUri.Substring(UriPrefix.Length - 1);
+ Trace($"Adding AIA path : {path}");
+ _aiaPaths.Add(path, authority);
+ }
+
+ if (authority.CdpUri != null && authority.CdpUri.StartsWith(UriPrefix, StringComparison.OrdinalIgnoreCase))
+ {
+ string path = authority.CdpUri.Substring(UriPrefix.Length - 1);
+ Trace($"Adding CRL path : {path}");
+ _crlPaths.Add(path, authority);
+ }
+
+ if (authority.OcspUri != null && authority.OcspUri.StartsWith(UriPrefix, StringComparison.OrdinalIgnoreCase))
+ {
+ string path = authority.OcspUri.Substring(UriPrefix.Length - 1);
+ Trace($"Adding OCSP path : {path}");
+ _ocspAuthorities.Add((path, authority));
+ }
+ }
+
+ private void HandleRequests()
+ {
+ ThreadPool.QueueUserWorkItem(
+ state =>
+ {
+ while (state._listener.IsListening)
+ {
+ state.HandleRequest();
+ }
+ },
+ this,
+ true);
+ }
+
+ internal void HandleRequest()
+ {
+ HttpListenerContext context = null;
+
+ try
+ {
+ context = _listener.GetContext();
+ }
+ catch (Exception)
+ {
+ }
+
+ if (context != null)
+ {
+ ThreadPool.QueueUserWorkItem(
+ state => HandleRequest(state),
+ context,
+ true);
+ }
+ }
+
+ internal async Task HandleRequestAsync()
+ {
+ HttpListenerContext context = null;
+
+ try
+ {
+ context = await _listener.GetContextAsync();
+ }
+ catch (Exception)
+ {
+ }
+
+ if (context != null)
+ {
+ ThreadPool.QueueUserWorkItem(
+ state => HandleRequest(state),
+ context,
+ true);
+ }
+ }
+
+ internal void HandleRequest(HttpListenerContext context)
+ {
+ bool responded = false;
+ try
+ {
+ Trace($"{context.Request.HttpMethod} {context.Request.RawUrl} (HTTP {context.Request.ProtocolVersion})");
+ HandleRequest(context, ref responded);
+ }
+ catch (Exception e)
+ {
+ try
+ {
+ if (!responded && context != null)
+ {
+ context.Response.StatusCode = 500;
+ context.Response.StatusDescription = "Internal Server Error";
+ context.Response.Close();
+
+ Trace($"Sent 500 due to exception on {context.Request.HttpMethod} {context.Request.RawUrl}");
+ Trace(e.ToString());
+ }
+ }
+ catch (Exception)
+ {
+ }
+
+ return;
+ }
+
+ if (!responded)
+ {
+ Trace($"404 for {context.Request.HttpMethod} {context.Request.RawUrl}");
+
+ try
+ {
+ context.Response.StatusCode = 404;
+ context.Response.Close();
+ }
+ catch (Exception)
+ {
+ }
+ }
+ }
+
+ private void HandleRequest(HttpListenerContext context, ref bool responded)
+ {
+ CertificateAuthority authority;
+ string url = context.Request.RawUrl;
+
+ if (_aiaPaths.TryGetValue(url, out authority))
+ {
+ if (DelayedActions.HasFlag(DelayedActionsFlag.Aia))
+ {
+ Trace($"Delaying response by {ResponseDelay}.");
+ Thread.Sleep(ResponseDelay);
+ }
+
+ byte[] certData = RespondEmpty ? Array.Empty<byte>() : authority.GetCertData();
+
+ responded = true;
+ context.Response.StatusCode = 200;
+ context.Response.ContentType = "application/pkix-cert";
+ context.Response.Close(certData, willBlock: true);
+ Trace($"Responded with {certData.Length}-byte certificate from {authority.SubjectName}.");
+ return;
+ }
+
+ if (_crlPaths.TryGetValue(url, out authority))
+ {
+ if (DelayedActions.HasFlag(DelayedActionsFlag.Crl))
+ {
+ Trace($"Delaying response by {ResponseDelay}.");
+ Thread.Sleep(ResponseDelay);
+ }
+
+ byte[] crl = RespondEmpty ? Array.Empty<byte>() : authority.GetCrl();
+
+ responded = true;
+ context.Response.StatusCode = 200;
+ context.Response.ContentType = "application/pkix-crl";
+ context.Response.Close(crl, willBlock: true);
+ Trace($"Responded with {crl.Length}-byte CRL from {authority.SubjectName}.");
+ return;
+ }
+
+ string prefix;
+
+ foreach (var tuple in _ocspAuthorities)
+ {
+ (prefix, authority) = tuple;
+
+ if (url.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
+ {
+ byte[] reqBytes;
+ if (TryGetOcspRequestBytes(context.Request, prefix, out reqBytes))
+ {
+ ReadOnlyMemory<byte> certId;
+ ReadOnlyMemory<byte> nonce;
+ try
+ {
+ DecodeOcspRequest(reqBytes, out certId, out nonce);
+ }
+ catch (Exception e)
+ {
+ Trace($"OcspRequest Decode failed ({url}) - {e}");
+ context.Response.StatusCode = 400;
+ context.Response.Close();
+ return;
+ }
+
+ byte[] ocspResponse = RespondEmpty ? Array.Empty<byte>() : authority.BuildOcspResponse(certId, nonce);
+
+ if (DelayedActions.HasFlag(DelayedActionsFlag.Ocsp))
+ {
+ Trace($"Delaying response by {ResponseDelay}.");
+ Thread.Sleep(ResponseDelay);
+ }
+
+ responded = true;
+ context.Response.StatusCode = 200;
+ context.Response.StatusDescription = "OK";
+ context.Response.ContentType = "application/ocsp-response";
+ context.Response.Close(ocspResponse, willBlock: true);
+
+ if (authority.HasOcspDelegation)
+ {
+ Trace($"OCSP Response: {ocspResponse.Length} bytes from {authority.SubjectName} delegated to {authority.OcspResponderSubjectName}");
+ }
+ else
+ {
+ Trace($"OCSP Response: {ocspResponse.Length} bytes from {authority.SubjectName}");
+ }
+
+ return;
+ }
+ }
+ }
+ }
+
+ internal static RevocationResponder CreateAndListen()
+ {
+ HttpListener listener = OpenListener(out string uriPrefix);
+
+ RevocationResponder responder = new RevocationResponder(listener, uriPrefix);
+ responder.HandleRequests();
+ return responder;
+ }
+
+ private static HttpListener OpenListener(out string uriPrefix)
+ {
+ while (true)
+ {
+ int port = RandomNumberGenerator.GetInt32(41000, 42000);
+ uriPrefix = $"http://127.0.0.1:{port}/";
+
+ HttpListener listener = new HttpListener();
+ listener.Prefixes.Add(uriPrefix);
+ listener.IgnoreWriteExceptions = true;
+
+ try
+ {
+ listener.Start();
+ Trace($"Listening at {uriPrefix}");
+ return listener;
+ }
+ catch
+ {
+ }
+ }
+ }
+
+ private static bool TryGetOcspRequestBytes(HttpListenerRequest request, string prefix, out byte[] requestBytes)
+ {
+ requestBytes = null;
+ try
+ {
+ if (request.HttpMethod == "GET")
+ {
+ string base64 = HttpUtility.UrlDecode(request.RawUrl.Substring(prefix.Length + 1));
+ requestBytes = Convert.FromBase64String(base64);
+ return true;
+ }
+ else if (request.HttpMethod == "POST" && request.ContentType == "application/ocsp-request")
+ {
+ using (System.IO.Stream stream = request.InputStream)
+ {
+ requestBytes = new byte[request.ContentLength64];
+ int read = stream.Read(requestBytes, 0, requestBytes.Length);
+ System.Diagnostics.Debug.Assert(read == requestBytes.Length);
+ return true;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Trace($"Failed to get OCSP request bytes ({request.RawUrl}) - {e}");
+ }
+
+ return false;
+ }
+
+ private static void DecodeOcspRequest(
+ byte[] requestBytes,
+ out ReadOnlyMemory<byte> certId,
+ out ReadOnlyMemory<byte> nonceExtension)
+ {
+ Asn1Tag context0 = new Asn1Tag(TagClass.ContextSpecific, 0);
+ Asn1Tag context1 = new Asn1Tag(TagClass.ContextSpecific, 1);
+
+ AsnReader reader = new AsnReader(requestBytes, AsnEncodingRules.DER);
+ AsnReader request = reader.ReadSequence();
+ reader.ThrowIfNotEmpty();
+
+ AsnReader tbsRequest = request.ReadSequence();
+
+ if (request.HasData)
+ {
+ // Optional signature
+ request.ReadEncodedValue();
+ request.ThrowIfNotEmpty();
+ }
+
+ // Only v1(0) is supported, and it shouldn't be written per DER.
+ // But Apple writes it anyways, so let's go ahead and be lenient.
+ if (tbsRequest.PeekTag().HasSameClassAndValue(context0))
+ {
+ AsnReader versionReader = tbsRequest.ReadSequence(context0);
+
+ if (!versionReader.TryReadInt32(out int version) || version != 0)
+ {
+ throw new CryptographicException("ASN1 corrupted data");
+ }
+
+ versionReader.ThrowIfNotEmpty();
+ }
+
+ if (tbsRequest.PeekTag().HasSameClassAndValue(context1))
+ {
+ tbsRequest.ReadEncodedValue();
+ }
+
+ AsnReader requestList = tbsRequest.ReadSequence();
+ AsnReader requestExtensions = null;
+
+ if (tbsRequest.HasData)
+ {
+ AsnReader requestExtensionsWrapper = tbsRequest.ReadSequence(new Asn1Tag(TagClass.ContextSpecific, 2));
+ requestExtensions = requestExtensionsWrapper.ReadSequence();
+ requestExtensionsWrapper.ThrowIfNotEmpty();
+ }
+
+ tbsRequest.ThrowIfNotEmpty();
+
+ AsnReader firstRequest = requestList.ReadSequence();
+ requestList.ThrowIfNotEmpty();
+
+ certId = firstRequest.ReadEncodedValue();
+
+ if (firstRequest.HasData)
+ {
+ firstRequest.ReadSequence(context0);
+ }
+
+ firstRequest.ThrowIfNotEmpty();
+
+ nonceExtension = default;
+
+ if (requestExtensions != null)
+ {
+ while (requestExtensions.HasData)
+ {
+ ReadOnlyMemory<byte> wholeExtension = requestExtensions.PeekEncodedValue();
+ AsnReader extension = requestExtensions.ReadSequence();
+
+ if (extension.ReadObjectIdentifier() == "1.3.6.1.5.5.7.48.1.2")
+ {
+ nonceExtension = wholeExtension;
+ }
+ }
+ }
+ }
+
+ internal void Stop() => _listener.Stop();
+
+ private static void Trace(string trace)
+ {
+ if (s_traceEnabled)
+ {
+ Console.WriteLine(trace);
+ }
+ }
+}
+
+public enum DelayedActionsFlag : byte
+{
+ None = 0,
+ Ocsp = 0b1,
+ Crl = 0b10,
+ Aia = 0b100,
+ All = 0b11111111
+}
diff --git a/src/Servers/Kestrel/shared/test/ServerRetryHelper.cs b/src/Servers/Kestrel/shared/test/ServerRetryHelper.cs
new file mode 100644
index 0000000000..f61da6aadf
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/ServerRetryHelper.cs
@@ -0,0 +1,41 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Logging;
+
+namespace Microsoft.AspNetCore.Testing;
+
+public static class ServerRetryHelper
+{
+ /// <summary>
+ /// Retry a func. Useful when a test needs an explicit port and you want to avoid port conflicts.
+ /// </summary>
+ public static async Task BindPortsWithRetry(Func<int, Task> retryFunc, ILogger logger)
+ {
+ var retryCount = 0;
+ while (true)
+ {
+ // Approx dynamic port range on Windows and Linux.
+ var randomPort = Random.Shared.Next(35000, 60000);
+
+ try
+ {
+ await retryFunc(randomPort);
+ break;
+ }
+ catch (Exception ex)
+ {
+ retryCount++;
+
+ if (retryCount >= 5)
+ {
+ throw;
+ }
+ else
+ {
+ logger.LogError(ex, $"Error running test {retryCount}. Retrying.");
+ }
+ }
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.crt b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.crt
new file mode 100644
index 0000000000..e6ea0b1311
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.crt
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE-----
+MIIBpTCCAUygAwIBAgIQXGHz02xa/Z/TmuFnYJbDnzAKBggqhkjOPQQDAjAhMR8w
+HQYDVQQDExZUZXN0IEludGVybWVkaWF0ZSBDQSAxMB4XDTIyMDgwNDAyMDI1M1oX
+DTMyMDgwMTAyMDI1M1owITEfMB0GA1UEAxMWVGVzdCBJbnRlcm1lZGlhdGUgQ0Eg
+MjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKjRY+RZ5N7KuvqLUnRWf18B7uxP
++aSg0pZ+8rcuplFi+bFJ8RreFtnz5d3I9uay8GuLaRyBtf9TJ8xzr8msWAGjZjBk
+MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSz
+pp8o4D5Hj2GpaEGO4claKCh01TAfBgNVHSMEGDAWgBRXGAbzjveEmD2JdmRdRa83
+IYRoHDAKBggqhkjOPQQDAgNHADBEAiA9Dl8IEnwYQJFXGjLXqario1KKTl0na9yR
++5R75MPS6AIgHIvQ+L7skPW9vVwBPKh82Line0fTtFoXHVrncZmdWTQ=
+-----END CERTIFICATE-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.key b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.key
new file mode 100644
index 0000000000..7d2e427132
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate2_ca.key
@@ -0,0 +1,8 @@
+-----BEGIN EC PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,0820556173a34f7a1db6e906d87dd43f
+
+7Rl3JLUTNgy883s3jsrjFfYwPruP2wMZWNK8N0pVLmtwqBQpgPE5QZueO6dulwWh
+uHqM9OC/hMfgnKF4UD9gdNAkt8RS8EZE8yLbjNC30bstYnu+8wh8+mXe4JsNGZmK
+d/JFAzm0buQPNSZg7WjbQ+KdSI5NAvHxq4AzXl1LIyk=
+-----END EC PRIVATE KEY-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.crt b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.crt
new file mode 100644
index 0000000000..070a4d3e8e
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.crt
@@ -0,0 +1,11 @@
+-----BEGIN CERTIFICATE-----
+MIIBnTCCAUOgAwIBAgIRAKRzk+4+PcDayjDwDDwKQpowCgYIKoZIzj0EAwIwFzEV
+MBMGA1UEAxMMVGVzdCBSb290IENBMB4XDTIyMDgwNDAxMDUxN1oXDTMyMDgwMTAx
+MDUxN1owITEfMB0GA1UEAxMWVGVzdCBJbnRlcm1lZGlhdGUgQ0EgMTBZMBMGByqG
+SM49AgEGCCqGSM49AwEHA0IABPma66cve3jhsOW/GRRedTialf+q94fS1+5690A2
+9tECC4uiLShJjjyYY5NeCcyWkl+q6nAN0Mo2SbRf+H1NiV2jZjBkMA4GA1UdDwEB
+/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRXGAbzjveEmD2J
+dmRdRa83IYRoHDAfBgNVHSMEGDAWgBQtqkZL74lrcw8pLfHaEfxFOPQrUDAKBggq
+hkjOPQQDAgNIADBFAiA1Hle5SLZTMgQ0FZTHTmZMLSjfYhL6wju1mU8e20riCAIh
+AL8k/bDhCSi1ITZy7d2DUBsSuIOsCeur/n1NV/m0be9J
+-----END CERTIFICATE-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.key b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.key
new file mode 100644
index 0000000000..d1a2d57f8a
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/intermediate_ca.key
@@ -0,0 +1,8 @@
+-----BEGIN EC PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,b0b627e56cbb38608f42bebbc4c4994e
+
+QxsFr31IRPiBDGGAKXzLidIa9A/cX7k8828O22CPrmxn4XQTkloJV8f58p0vnKbi
+E5Qs5ryuBPUvw++By7S2sj7xnwRS8UerGVa2jDUZDAI20MFeaaHAlsBzthQgzovo
+PmXtG7ljkeN29Nreod844iaeHYkuG1QKcAXl04WMgCQ=
+-----END EC PRIVATE KEY-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.crt b/src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.crt
new file mode 100644
index 0000000000..1c5de09a28
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.crt
@@ -0,0 +1,23 @@
+-----BEGIN CERTIFICATE-----
+MIIBujCCAWCgAwIBAgIQLNgg8bTKvOyNVonxUdeOljAKBggqhkjOPQQDAjAhMR8w
+HQYDVQQDExZUZXN0IEludGVybWVkaWF0ZSBDQSAyMB4XDTIyMDgwNDAyMDMzN1oX
+DTMyMDgwMTAyMDMzNlowEzERMA8GA1UEAxMIbGVhZi5jb20wWTATBgcqhkjOPQIB
+BggqhkjOPQMBBwNCAAQvkWB9GQbJUgGeYBPMA0QXo9LCaTD8gg+In7DtJzPYS15x
+ofXWqxSHjZpcKa1VNuL81VCHEwuTPQb7QGFeId4Qo4GHMIGEMA4GA1UdDwEB/wQE
+AwIHgDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwHQYDVR0OBBYEFF7T
+/Y5c59Au/SXoDsMB1fS/AvRzMB8GA1UdIwQYMBaAFLOmnyjgPkePYaloQY7hyVoo
+KHTVMBMGA1UdEQQMMAqCCGxlYWYuY29tMAoGCCqGSM49BAMCA0gAMEUCIQCmIDmB
+RcqjhghXby0ALqv8ioCWsJ93TE+iQOWUZPr/8AIgQpEoP1V9+IkBLrjoGu5yhxOn
+Xd7OYw8w0BEyjocyh3I=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIBpTCCAUygAwIBAgIQXGHz02xa/Z/TmuFnYJbDnzAKBggqhkjOPQQDAjAhMR8w
+HQYDVQQDExZUZXN0IEludGVybWVkaWF0ZSBDQSAxMB4XDTIyMDgwNDAyMDI1M1oX
+DTMyMDgwMTAyMDI1M1owITEfMB0GA1UEAxMWVGVzdCBJbnRlcm1lZGlhdGUgQ0Eg
+MjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKjRY+RZ5N7KuvqLUnRWf18B7uxP
++aSg0pZ+8rcuplFi+bFJ8RreFtnz5d3I9uay8GuLaRyBtf9TJ8xzr8msWAGjZjBk
+MA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSz
+pp8o4D5Hj2GpaEGO4claKCh01TAfBgNVHSMEGDAWgBRXGAbzjveEmD2JdmRdRa83
+IYRoHDAKBggqhkjOPQQDAgNHADBEAiA9Dl8IEnwYQJFXGjLXqario1KKTl0na9yR
++5R75MPS6AIgHIvQ+L7skPW9vVwBPKh82Line0fTtFoXHVrncZmdWTQ=
+-----END CERTIFICATE-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.key b/src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.key
new file mode 100644
index 0000000000..3e72ea61b1
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/leaf.com.key
@@ -0,0 +1,8 @@
+-----BEGIN EC PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,987f2fd33cce32c30fad60047f769d05
+
+bEYnUZxs2otOyORHVP0guMbMzpn27qrF4p8LNJ8w7wbB8PhhBKFnOCECHBQfoM31
+bFOaEDGmwjTLIBhKvsWkxiMEe49kzI9lIPAjInNTjihS7oHEyQ93tH6Q/xsYdc2a
+d8lwqjY4a+w2uW2EJzU1ROySDyX+kQjaA2/mzPhVIfs=
+-----END EC PRIVATE KEY-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/root_ca.crt b/src/Servers/Kestrel/shared/test/TestCertificates/root_ca.crt
new file mode 100644
index 0000000000..5b903c24da
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/root_ca.crt
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE-----
+MIIBcTCCARegAwIBAgIQYdd9Ti/E/sP2fQ4gILJeoDAKBggqhkjOPQQDAjAXMRUw
+EwYDVQQDEwxUZXN0IFJvb3QgQ0EwHhcNMjIwODA0MDEwMzQ3WhcNMzIwODAxMDEw
+MzQ3WjAXMRUwEwYDVQQDEwxUZXN0IFJvb3QgQ0EwWTATBgcqhkjOPQIBBggqhkjO
+PQMBBwNCAAQLmzooyCtzLAztPVcrQKqGadFdTT7uiyFY1QGBP4e4pZHV6xqTaykL
+ci0slpWenTNJvRu99Ro8qLPp7hYDZTtXo0UwQzAOBgNVHQ8BAf8EBAMCAQYwEgYD
+VR0TAQH/BAgwBgEB/wIBATAdBgNVHQ4EFgQULapGS++Ja3MPKS3x2hH8RTj0K1Aw
+CgYIKoZIzj0EAwIDSAAwRQIgZkIuxnWDipP156JFsg0l4nwZ8WYhPh9GhO+zaAs5
+uTACIQCoj1KDH3Vgkc82EMZQ6QZ9MMxT0KtE/TivfdcRNgtUMA==
+-----END CERTIFICATE-----
diff --git a/src/Servers/Kestrel/shared/test/TestCertificates/root_ca.key b/src/Servers/Kestrel/shared/test/TestCertificates/root_ca.key
new file mode 100644
index 0000000000..54a8eaf748
--- /dev/null
+++ b/src/Servers/Kestrel/shared/test/TestCertificates/root_ca.key
@@ -0,0 +1,8 @@
+-----BEGIN EC PRIVATE KEY-----
+Proc-Type: 4,ENCRYPTED
+DEK-Info: AES-256-CBC,97ea8e6551b8fcf40317474d2ad81a28
+
+UHBjG7jKE+/Bdb0wLIw1Lb7MzmtG42eow+8tpWpGUk73EY0iL4x5Yppdz6hZyTdb
+peX2qEAtwKOXLeqI2Sup5bSpMACHKfjwGAh6/HGnrCc1MsLUIL2jR0FRpabjlVQV
+HfamkEfDaiVY4Rp9r2ckXaSm9waaVjhYMj4jSnhFt0s=
+-----END EC PRIVATE KEY-----
diff --git a/src/Servers/Kestrel/shared/test/TestContextFactory.cs b/src/Servers/Kestrel/shared/test/TestContextFactory.cs
index 3e3ed65b8e..c6da71957b 100644
--- a/src/Servers/Kestrel/shared/test/TestContextFactory.cs
+++ b/src/Servers/Kestrel/shared/test/TestContextFactory.cs
@@ -92,8 +92,10 @@ internal static class TestContextFactory
connectionFeatures ?? new FeatureCollection(),
memoryPool ?? PinnedBlockMemoryPoolFactory.Create(),
localEndPoint,
- remoteEndPoint);
- http3ConnectionContext.TimeoutControl = timeoutControl;
+ remoteEndPoint)
+ {
+ TimeoutControl = timeoutControl
+ };
return http3ConnectionContext;
}
@@ -177,7 +179,21 @@ internal static class TestContextFactory
ITimeoutControl timeoutControl = null,
IHttp3StreamLifetimeHandler streamLifetimeHandler = null)
{
- var context = new Http3StreamContext
+ var http3ConnectionContext = CreateHttp3ConnectionContext(
+ null,
+ serviceContext,
+ connectionFeatures,
+ memoryPool,
+ localEndPoint,
+ remoteEndPoint,
+ timeoutControl);
+
+ var http3Conection = new Http3Connection(http3ConnectionContext)
+ {
+ _streamLifetimeHandler = streamLifetimeHandler
+ };
+
+ return new Http3StreamContext
(
connectionId: connectionId ?? "TestConnectionId",
protocols: HttpProtocols.Http3,
@@ -188,15 +204,13 @@ internal static class TestContextFactory
memoryPool: memoryPool ?? MemoryPool<byte>.Shared,
localEndPoint: localEndPoint,
remoteEndPoint: remoteEndPoint,
- streamLifetimeHandler: streamLifetimeHandler,
streamContext: new DefaultConnectionContext(),
- clientPeerSettings: new Http3PeerSettings(),
- serverPeerSettings: null
- );
- context.TimeoutControl = timeoutControl;
- context.Transport = transport;
-
- return context;
+ connection: http3Conection
+ )
+ {
+ TimeoutControl = timeoutControl,
+ Transport = transport,
+ };
}
private class TestHttp2StreamLifetimeHandler : IHttp2StreamLifetimeHandler
diff --git a/src/Servers/Kestrel/shared/test/TestResources.cs b/src/Servers/Kestrel/shared/test/TestResources.cs
index 0db95cfdd3..125e7613e4 100644
--- a/src/Servers/Kestrel/shared/test/TestResources.cs
+++ b/src/Servers/Kestrel/shared/test/TestResources.cs
@@ -40,4 +40,38 @@ public static class TestResources
{
return new X509Certificate2(GetCertPath(certName), password);
}
+
+ public static X509Certificate2 GetTestCertificateWithKey(string certName, string keyName)
+ {
+ var cert = X509Certificate2.CreateFromPemFile(GetCertPath(certName), GetCertPath(keyName));
+ if (OperatingSystem.IsWindows())
+ {
+ using (cert)
+ {
+ return new X509Certificate2(cert.Export(X509ContentType.Pkcs12));
+ }
+ }
+ return cert;
+ }
+
+ public static X509Certificate2Collection GetTestChain(string certName = "leaf.com.crt")
+ {
+ // On Windows, applications should not import PFX files in parallel to avoid a known system-level
+ // race condition bug in native code which can cause crashes/corruption of the certificate state.
+ if (importPfxMutex != null && !importPfxMutex.WaitOne(MutexTimeout))
+ {
+ throw new InvalidOperationException("Cannot acquire the global certificate mutex.");
+ }
+
+ try
+ {
+ var fullChain = new X509Certificate2Collection();
+ fullChain.ImportFromPemFile(GetCertPath("leaf.com.crt"));
+ return fullChain;
+ }
+ finally
+ {
+ importPfxMutex?.ReleaseMutex();
+ }
+ }
}
diff --git a/src/Servers/Kestrel/shared/test/TestServiceContext.cs b/src/Servers/Kestrel/shared/test/TestServiceContext.cs
index e4fb4e4fd5..119a13020b 100644
--- a/src/Servers/Kestrel/shared/test/TestServiceContext.cs
+++ b/src/Servers/Kestrel/shared/test/TestServiceContext.cs
@@ -17,17 +17,17 @@ internal class TestServiceContext : ServiceContext
{
public TestServiceContext()
{
- Initialize(NullLoggerFactory.Instance, CreateLoggingTrace(NullLoggerFactory.Instance));
+ Initialize(NullLoggerFactory.Instance, CreateLoggingTrace(NullLoggerFactory.Instance), false);
}
- public TestServiceContext(ILoggerFactory loggerFactory)
+ public TestServiceContext(ILoggerFactory loggerFactory, bool disableHttp1LineFeedTerminators = true)
{
- Initialize(loggerFactory, CreateLoggingTrace(loggerFactory));
+ Initialize(loggerFactory, CreateLoggingTrace(loggerFactory), disableHttp1LineFeedTerminators);
}
- public TestServiceContext(ILoggerFactory loggerFactory, KestrelTrace kestrelTrace)
+ public TestServiceContext(ILoggerFactory loggerFactory, KestrelTrace kestrelTrace, bool disableHttp1LineFeedTerminators = true)
{
- Initialize(loggerFactory, kestrelTrace);
+ Initialize(loggerFactory, kestrelTrace, disableHttp1LineFeedTerminators);
}
private static KestrelTrace CreateLoggingTrace(ILoggerFactory loggerFactory)
@@ -49,7 +49,7 @@ internal class TestServiceContext : ServiceContext
SystemClock = heartbeatManager;
}
- private void Initialize(ILoggerFactory loggerFactory, KestrelTrace kestrelTrace)
+ private void Initialize(ILoggerFactory loggerFactory, KestrelTrace kestrelTrace, bool disableHttp1LineFeedTerminators)
{
LoggerFactory = loggerFactory;
Log = kestrelTrace;
@@ -58,7 +58,7 @@ internal class TestServiceContext : ServiceContext
SystemClock = MockSystemClock;
DateHeaderValueManager = new DateHeaderValueManager();
ConnectionManager = new ConnectionManager(Log, ResourceCounter.Unlimited);
- HttpParser = new HttpParser<Http1ParsingHandler>(Log.IsEnabled(LogLevel.Information));
+ HttpParser = new HttpParser<Http1ParsingHandler>(Log.IsEnabled(LogLevel.Information), disableHttp1LineFeedTerminators);
ServerOptions = new KestrelServerOptions
{
AddServerHeader = false
diff --git a/src/Servers/Kestrel/shared/test/TransportTestHelpers/HttpSysHttp3SupportedAttribute.cs b/src/Servers/Kestrel/shared/test/TransportTestHelpers/HttpSysHttp3SupportedAttribute.cs
index 0bb8bfa747..ebfac54cc2 100644
--- a/src/Servers/Kestrel/shared/test/TransportTestHelpers/HttpSysHttp3SupportedAttribute.cs
+++ b/src/Servers/Kestrel/shared/test/TransportTestHelpers/HttpSysHttp3SupportedAttribute.cs
@@ -11,7 +11,9 @@ namespace Microsoft.AspNetCore.Testing;
public class HttpSysHttp3SupportedAttribute : Attribute, ITestCondition
{
// We have the same OS and TLS version requirements as MsQuic so check that first.
- public bool IsMet => QuicImplementationProviders.MsQuic.IsSupported && IsRegKeySet;
+#pragma warning disable CA2252 // This API requires opting into preview features
+ public bool IsMet => QuicListener.IsSupported && IsRegKeySet;
+#pragma warning restore CA2252 // This API requires opting into preview features
public string SkipReason => "HTTP/3 is not supported or enabled on the current test machine";
diff --git a/src/Servers/Kestrel/shared/test/TransportTestHelpers/MsQuicSupportedAttribute.cs b/src/Servers/Kestrel/shared/test/TransportTestHelpers/MsQuicSupportedAttribute.cs
index a701b81a37..a4f31e605f 100644
--- a/src/Servers/Kestrel/shared/test/TransportTestHelpers/MsQuicSupportedAttribute.cs
+++ b/src/Servers/Kestrel/shared/test/TransportTestHelpers/MsQuicSupportedAttribute.cs
@@ -9,7 +9,9 @@ namespace Microsoft.AspNetCore.Testing;
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MsQuicSupportedAttribute : Attribute, ITestCondition
{
- public bool IsMet => QuicImplementationProviders.MsQuic.IsSupported;
+#pragma warning disable CA2252 // This API requires opting into preview features
+ public bool IsMet => QuicListener.IsSupported;
+#pragma warning restore CA2252 // This API requires opting into preview features
public string SkipReason => "QUIC is not supported on the current test machine";
}
diff --git a/src/Servers/Kestrel/stress/HttpStress.csproj b/src/Servers/Kestrel/stress/HttpStress.csproj
index 9e0cf19b4e..7349608451 100644
--- a/src/Servers/Kestrel/stress/HttpStress.csproj
+++ b/src/Servers/Kestrel/stress/HttpStress.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk.Web">
+<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -9,11 +9,9 @@
<ItemGroup>
<Reference Include="System.CommandLine.Experimental" />
<Reference Include="System.Net.Http.WinHttpHandler" />
- <Reference Include="Microsoft.AspNetCore" />
<Reference Include="Microsoft.AspNetCore.Hosting" />
<Reference Include="Microsoft.AspNetCore.Routing" />
<Reference Include="Microsoft.AspNetCore.Server.Kestrel" />
- <Reference Include="Microsoft.AspNetCore.Server.HttpSys" />
</ItemGroup>
<PropertyGroup>
diff --git a/src/Servers/Kestrel/stress/Program.cs b/src/Servers/Kestrel/stress/Program.cs
index 62f5590fa8..20a0b35e0d 100644
--- a/src/Servers/Kestrel/stress/Program.cs
+++ b/src/Servers/Kestrel/stress/Program.cs
@@ -112,6 +112,55 @@ public class Program
}
}
+ Func<ClientContext, Task> TestAbort(string path)
+ {
+ return async ctx =>
+ {
+ var httpVersion = ctx.GetRandomVersion(httpVersions);
+ try
+ {
+ using (var req = new HttpRequestMessage(HttpMethod.Get, serverUri + path) { Version = httpVersion })
+ {
+ await ctx.HttpClient.SendAsync(req);
+ }
+ throw new Exception("Completed unexpectedly");
+ }
+ catch (Exception e)
+ {
+ if (e is HttpRequestException hre && hre.InnerException is IOException)
+ {
+ e = hre.InnerException;
+ }
+
+ if (e is IOException ioe)
+ {
+ if (httpVersion < HttpVersion.Version20)
+ {
+ return;
+ }
+
+ var name = e.InnerException?.GetType().Name;
+ switch (name)
+ {
+ case "Http2ProtocolException":
+ case "Http2ConnectionException":
+ case "Http2StreamException":
+ // This can be improved when https://github.com/dotnet/runtime/issues/43239 is available.
+ if (e.InnerException.Message.Contains("INTERNAL_ERROR") || e.InnerException.Message.Contains("CANCEL"))
+ {
+ return;
+ }
+ break;
+ case "WinHttpException":
+ return;
+ }
+ }
+
+ throw;
+ }
+ };
+ }
+
// Set of operations that the client can select from to run. Each item is a tuple of the operation's name
// and the delegate to invoke for it, provided with the HttpClient instance on which to make the call and
// returning asynchronously the retrieved response string from the server. Individual operations can be
@@ -181,51 +230,9 @@ public class Program
}
}),
- ("GET Aborted",
- async ctx =>
- {
- Version httpVersion = ctx.GetRandomVersion(httpVersions);
- try
- {
- using (var req = new HttpRequestMessage(HttpMethod.Get, serverUri + "/abort") { Version = httpVersion })
- {
- await ctx.HttpClient.SendAsync(req);
- }
- throw new Exception("Completed unexpectedly");
- }
- catch (Exception e)
- {
- if (e is HttpRequestException hre && hre.InnerException is IOException)
- {
- e = hre.InnerException;
- }
-
- if (e is IOException ioe)
- {
- if (httpVersion < HttpVersion.Version20)
- {
- return;
- }
+ ("GET Abort", TestAbort("/abort")),
- string name = e.InnerException?.GetType().Name;
- switch (name)
- {
- case "Http2ProtocolException":
- case "Http2ConnectionException":
- case "Http2StreamException":
- if (e.InnerException.Message.Contains("INTERNAL_ERROR") || e.InnerException.Message.Contains("CANCEL"))
- {
- return;
- }
- break;
- case "WinHttpException":
- return;
- }
- }
-
- throw;
- }
- }),
+ ("GET Parallel Abort", TestAbort("/parallel-abort")),
("POST",
async ctx =>
@@ -365,7 +372,7 @@ public class Program
}
Console.WriteLine(" .NET Core: " + Path.GetFileName(Path.GetDirectoryName(typeof(object).Assembly.Location)));
- Console.WriteLine(" ASP.NET Core: " + Path.GetFileName(Path.GetDirectoryName(typeof(WebHost).Assembly.Location)));
+ Console.WriteLine(" ASP.NET Core: " + Path.GetFileName(Path.GetDirectoryName(typeof(IWebHostBuilder).Assembly.Location)));
Console.WriteLine(" Tracing: " + (logPath == null ? (object)false : logPath.Length == 0 ? (object)true : logPath));
Console.WriteLine(" ASP.NET Log: " + aspnetLog);
Console.WriteLine(" Concurrency: " + concurrentRequests);
@@ -378,10 +385,11 @@ public class Program
// Start the Kestrel web server in-proc.
Console.WriteLine("Starting server.");
- WebHost.CreateDefaultBuilder()
-
+ var host = Host.CreateDefaultBuilder();
+ host.ConfigureWebHost(webHost =>
+ {
//Use Kestrel, and configure it for HTTPS with a self - signed test certificate.
- .UseKestrel(ko =>
+ webHost.UseKestrel(ko =>
{
ko.ListenLocalhost(HttpsPort, listenOptions =>
{
@@ -451,6 +459,14 @@ public class Program
await context.Response.WriteAsync(contentSource.Substring(0, contentSource.Length / 2));
context.Abort();
});
+ endpoints.MapGet("/parallel-abort", async context =>
+ {
+ // Server writes some content and aborts the connection in the background.
+ var writeTask = context.Response.WriteAsync(contentSource.Substring(0, contentSource.Length));
+ await Task.Yield();
+ context.Abort();
+ await writeTask;
+ });
endpoints.MapPost("/", async context =>
{
// Post echos back the requested content, first buffering it all server-side, then sending it all back.
@@ -485,9 +501,11 @@ public class Program
await context.Request.Body.CopyToAsync(Stream.Null);
});
});
- })
- .Build()
- .Start();
+ });
+
+ })
+ .Build()
+ .Start();
// Start the client.
Console.WriteLine($"Starting {concurrentRequests} client workers.");
diff --git a/src/Servers/Kestrel/test/BindTests/AddressRegistrationTests.cs b/src/Servers/Kestrel/test/BindTests/AddressRegistrationTests.cs
index 1939e9e6e1..2ee418207f 100644
--- a/src/Servers/Kestrel/test/BindTests/AddressRegistrationTests.cs
+++ b/src/Servers/Kestrel/test/BindTests/AddressRegistrationTests.cs
@@ -130,12 +130,11 @@ public class AddressRegistrationTests : TestApplicationErrorLoggerLoggedTest
}
[ConditionalTheory]
- [MemberData(nameof(AddressRegistrationDataIPv6Port5000And5001Default))]
+ [MemberData(nameof(AddressRegistrationDataIPv6Port5000Default))]
[IPv6SupportedCondition]
- public async Task RegisterAddresses_IPv6Port5000And5001Default_Success(string addressInput, string[] testUrls)
+ public async Task RegisterAddresses_IPv6Port5000Default_Success(string addressInput, string[] testUrls)
{
- if ((!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5000)) &&
- (!CanBindToEndpoint(IPAddress.Loopback, 5001) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5001)))
+ if (!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5000))
{
return;
}
@@ -471,32 +470,30 @@ public class AddressRegistrationTests : TestApplicationErrorLoggerLoggedTest
[ConditionalFact]
[SkipOnCI]
- public Task DefaultsServerAddress_BindsToIPv4WithHttps()
+ public Task DefaultsServerAddress_BindsToIPv4WithHttp()
{
- if (!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.Loopback, 5001))
+ if (!CanBindToEndpoint(IPAddress.Loopback, 5000))
{
return Task.CompletedTask;
}
return RegisterDefaultServerAddresses_Success(
- new[] { "http://127.0.0.1:5000", "https://127.0.0.1:5001" }, mockHttps: true);
+ new[] { "http://127.0.0.1:5000" }, mockHttps: false);
}
[ConditionalFact]
[IPv6SupportedCondition]
[SkipOnCI]
- public Task DefaultsServerAddress_BindsToIPv6WithHttps()
+ public Task DefaultsServerAddress_BindsToIPv6WithHttp()
{
- if (!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5000)
- || !CanBindToEndpoint(IPAddress.Loopback, 5001) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5001))
+ if (!CanBindToEndpoint(IPAddress.Loopback, 5000) || !CanBindToEndpoint(IPAddress.IPv6Loopback, 5000))
{
return Task.CompletedTask;
}
- return RegisterDefaultServerAddresses_Success(new[] {
- "http://127.0.0.1:5000", "http://[::1]:5000",
- "https://127.0.0.1:5001", "https://[::1]:5001"},
- mockHttps: true);
+ return RegisterDefaultServerAddresses_Success(
+ new[] { "http://127.0.0.1:5000", "http://[::1]:5000" },
+ mockHttps: false);
}
private async Task RegisterDefaultServerAddresses_Success(IEnumerable<string> addresses, bool mockHttps = false)
@@ -522,13 +519,8 @@ public class AddressRegistrationTests : TestApplicationErrorLoggerLoggedTest
Assert.Equal(5000, host.GetPort());
- if (mockHttps)
- {
- Assert.Contains(5001, host.GetPorts());
- }
-
Assert.Single(LogMessages, log => log.LogLevel == LogLevel.Debug &&
- (string.Equals(CoreStrings.FormatBindingToDefaultAddresses(Constants.DefaultServerAddress, Constants.DefaultServerHttpsAddress), log.Message, StringComparison.Ordinal)
+ (string.Equals(CoreStrings.FormatBindingToDefaultAddress(Constants.DefaultServerAddress), log.Message, StringComparison.Ordinal)
|| string.Equals(CoreStrings.FormatBindingToDefaultAddress(Constants.DefaultServerAddress), log.Message, StringComparison.Ordinal)));
foreach (var address in addresses)
@@ -1144,11 +1136,11 @@ public class AddressRegistrationTests : TestApplicationErrorLoggerLoggedTest
}
}
- public static TheoryData<string, string[]> AddressRegistrationDataIPv6Port5000And5001Default =>
+ public static TheoryData<string, string[]> AddressRegistrationDataIPv6Port5000Default =>
new TheoryData<string, string[]>
{
- { null, new[] { "http://127.0.0.1:5000/", "http://[::1]:5000/", "https://127.0.0.1:5001/", "https://[::1]:5001/" } },
- { string.Empty, new[] { "http://127.0.0.1:5000/", "http://[::1]:5000/", "https://127.0.0.1:5001/", "https://[::1]:5001/" } }
+ { null, new[] { "http://127.0.0.1:5000/", "http://[::1]:5000/" } },
+ { string.Empty, new[] { "http://127.0.0.1:5000/", "http://[::1]:5000/" } }
};
public static TheoryData<string, string[]> AddressRegistrationDataIPv6Port80 =>
diff --git a/src/Servers/Kestrel/test/FunctionalTests/RequestTests.cs b/src/Servers/Kestrel/test/FunctionalTests/RequestTests.cs
index 50b06f519e..fff5268a4b 100644
--- a/src/Servers/Kestrel/test/FunctionalTests/RequestTests.cs
+++ b/src/Servers/Kestrel/test/FunctionalTests/RequestTests.cs
@@ -490,6 +490,51 @@ public class RequestTests : LoggedTest
}
[Fact]
+ public async Task RequestAbortedTokenUnchangedOnAbort()
+ {
+ var appDoneTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ CancellationToken? beforeAbort = null;
+ CancellationToken? afterAbort = null;
+
+ await using (var server = new TestServer(async context =>
+ {
+ var abortedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ context.RequestAborted.Register(() =>
+ {
+ abortedTcs.SetResult();
+ });
+
+ beforeAbort = context.RequestAborted;
+
+ context.Abort();
+
+ // Abort doesn't happen inline. Need to wait for it to complete before reading token again.
+ await abortedTcs.Task;
+
+ afterAbort = context.RequestAborted;
+
+ appDoneTcs.SetResult();
+ }, new TestServiceContext(LoggerFactory)))
+ {
+ using (var connection1 = server.CreateConnection())
+ {
+ await connection1.Send(
+ "GET / HTTP/1.1",
+ "Host:",
+ "",
+ "");
+
+ await appDoneTcs.Task.DefaultTimeout();
+ }
+ }
+
+ Assert.NotNull(beforeAbort);
+ Assert.NotNull(afterAbort);
+ Assert.Equal(beforeAbort.Value, afterAbort.Value);
+ }
+
+ [Fact]
public async Task AbortingTheConnectionSendsFIN()
{
var builder = TransportSelector.GetHostBuilder()
diff --git a/src/Servers/Kestrel/test/FunctionalTests/ResponseTests.cs b/src/Servers/Kestrel/test/FunctionalTests/ResponseTests.cs
index 17eb640826..fb0b7446a3 100644
--- a/src/Servers/Kestrel/test/FunctionalTests/ResponseTests.cs
+++ b/src/Servers/Kestrel/test/FunctionalTests/ResponseTests.cs
@@ -417,6 +417,7 @@ public class ResponseTests : TestApplicationErrorLoggerLoggedTest
[Theory]
[MemberData(nameof(ConnectionMiddlewareData))]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/41850")]
public async Task ClientAbortingConnectionImmediatelyIsNotLoggedHigherThanDebug(ListenOptions listenOptions)
{
// Attempt multiple connections to be extra sure the resets are consistently logged appropriately.
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs
index 4bc3117769..5bde02517f 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/BadHttpRequestTests.cs
@@ -9,6 +9,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests.TestTransport;
using Microsoft.AspNetCore.Testing;
+using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Logging;
using Moq;
using Xunit;
@@ -212,6 +213,15 @@ public class BadHttpRequestTests : LoggedTest
}
}
+ [Fact]
+ public Task BadRequestForAbsoluteFormTargetWithNonAsciiChars()
+ {
+ return TestBadRequest(
+ $"GET http://localhost/ÿÿÿ HTTP/1.1\r\n",
+ "400 Bad Request",
+ CoreStrings.FormatBadRequest_InvalidRequestTarget_Detail("http://localhost/\\xFF\\xFF\\xFF"));
+ }
+
private class BadRequestEventListener : IObserver<KeyValuePair<string, object>>, IDisposable
{
private IDisposable _subscription;
@@ -284,6 +294,191 @@ public class BadHttpRequestTests : LoggedTest
Assert.Contains(expectedExceptionMessage, exceptionString);
}
+ [Theory]
+ [InlineData("\r")]
+ [InlineData("\n")]
+ [InlineData("\r\n")]
+ [InlineData("\n\r")]
+ [InlineData("\n\n")]
+ [InlineData("\r\n\r\n")]
+ [InlineData("\r\r\r\r\r")]
+ public async Task ExtraLinesBetweenRequestsIgnored(string extraLines)
+ {
+ BadHttpRequestException loggedException = null;
+
+ TestSink.MessageLogged += context =>
+ {
+ if (context.EventId.Name == "ConnectionBadRequest" && context.Exception is BadHttpRequestException ex)
+ {
+ loggedException = ex;
+ }
+ };
+
+ // Set up a listener to catch the BadRequest event
+ var diagListener = new DiagnosticListener("NotBadRequestTestsDiagListener");
+ var badRequestEventListener = new BadRequestEventListener(diagListener, (pair) => { });
+
+ await using (var server = new TestServer(context => context.Request.Body.DrainAsync(default), new TestServiceContext(LoggerFactory) { DiagnosticSource = diagListener }))
+ {
+ using (var connection = server.CreateConnection())
+ {
+ await connection.SendAll(
+ "POST / HTTP/1.1",
+ "Host:",
+ "Content-Length: 5",
+ "",
+ "funny",
+ extraLines);
+
+ await connection.Receive(
+ "HTTP/1.1 200 OK",
+ "Content-Length: 0",
+ $"Date: {server.Context.DateHeaderValue}",
+ "",
+ "");
+
+ await connection.SendAll(
+ "POST / HTTP/1.1",
+ "Host:",
+ "Content-Length: 5",
+ "",
+ "funny");
+
+ await connection.Receive(
+ "HTTP/1.1 200 OK",
+ "Content-Length: 0",
+ $"Date: {server.Context.DateHeaderValue}",
+ "",
+ "");
+
+ connection.ShutdownSend();
+
+ await connection.ReceiveEnd();
+ }
+ }
+
+ Assert.Null(loggedException);
+ // Verify DiagnosticSource event for bad request
+ Assert.False(badRequestEventListener.EventFired);
+ }
+
+ [Fact]
+ public async Task ExtraLinesIgnoredBetweenAdjacentRequests()
+ {
+ BadHttpRequestException loggedException = null;
+
+ TestSink.MessageLogged += context =>
+ {
+ if (context.EventId.Name == "ConnectionBadRequest" && context.Exception is BadHttpRequestException ex)
+ {
+ loggedException = ex;
+ }
+ };
+
+ // Set up a listener to catch the BadRequest event
+ var diagListener = new DiagnosticListener("NotBadRequestTestsDiagListener");
+ var badRequestEventListener = new BadRequestEventListener(diagListener, (pair) => { });
+
+ await using (var server = new TestServer(context => context.Request.Body.DrainAsync(default), new TestServiceContext(LoggerFactory) { DiagnosticSource = diagListener }))
+ {
+ using (var connection = server.CreateConnection())
+ {
+ await connection.SendAll(
+ "POST / HTTP/1.1",
+ "Host:",
+ "Content-Length: 5",
+ "",
+ "funny",
+ "",
+ "",
+ "",
+ "POST /"); // Split the request line
+
+ await connection.Receive(
+ "HTTP/1.1 200 OK",
+ "Content-Length: 0",
+ $"Date: {server.Context.DateHeaderValue}",
+ "",
+ "");
+
+ await connection.SendAll(
+ " HTTP/1.1",
+ "Host:",
+ "Content-Length: 5",
+ "",
+ "funny");
+
+ await connection.Receive(
+ "HTTP/1.1 200 OK",
+ "Content-Length: 0",
+ $"Date: {server.Context.DateHeaderValue}",
+ "",
+ "");
+
+ connection.ShutdownSend();
+
+ await connection.ReceiveEnd();
+ }
+ }
+
+ Assert.Null(loggedException);
+ // Verify DiagnosticSource event for bad request
+ Assert.False(badRequestEventListener.EventFired);
+ }
+
+ [Theory]
+ [InlineData("\r")]
+ [InlineData("\n")]
+ [InlineData("\r\n")]
+ [InlineData("\n\r")]
+ [InlineData("\r\n\r\n")]
+ [InlineData("\r\r\r\r\r")]
+ public async Task ExtraLinesAtEndOfConnectionIgnored(string extraLines)
+ {
+ BadHttpRequestException loggedException = null;
+
+ TestSink.MessageLogged += context =>
+ {
+ if (context.EventId.Name == "ConnectionBadRequest" && context.Exception is BadHttpRequestException ex)
+ {
+ loggedException = ex;
+ }
+ };
+
+ // Set up a listener to catch the BadRequest event
+ var diagListener = new DiagnosticListener("NotBadRequestTestsDiagListener");
+ var badRequestEventListener = new BadRequestEventListener(diagListener, (pair) => { });
+
+ await using (var server = new TestServer(context => context.Request.Body.DrainAsync(default), new TestServiceContext(LoggerFactory) { DiagnosticSource = diagListener }))
+ {
+ using (var connection = server.CreateConnection())
+ {
+ await connection.SendAll(
+ "POST / HTTP/1.1",
+ "Host:",
+ "Content-Length: 5",
+ "",
+ "funny",
+ extraLines);
+
+ await connection.Receive(
+ "HTTP/1.1 200 OK",
+ "Content-Length: 0",
+ $"Date: {server.Context.DateHeaderValue}",
+ "",
+ "");
+
+ connection.ShutdownSend();
+
+ await connection.ReceiveEnd();
+ }
+ }
+
+ Assert.Null(loggedException);
+ // Verify DiagnosticSource event for bad request
+ Assert.False(badRequestEventListener.EventFired);
+ }
+
private async Task ReceiveBadRequestResponse(InMemoryConnection connection, string expectedResponseStatusCode, string expectedDateHeaderValue, string expectedAllowHeader = null)
{
var lines = new[]
@@ -329,5 +524,7 @@ public class BadHttpRequestTests : LoggedTest
public static IEnumerable<object[]> InvalidRequestHeaderData => HttpParsingData.RequestHeaderInvalidData;
+ public static IEnumerable<object[]> InvalidRequestHeaderDataLineFeedTerminator => HttpParsingData.RequestHeaderInvalidDataLineFeedTerminator;
+
public static TheoryData<string, string> InvalidHostHeaderData => HttpParsingData.HostHeaderInvalidData;
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2ConnectionTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2ConnectionTests.cs
index f4dc806cac..e2d71746cb 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2ConnectionTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2ConnectionTests.cs
@@ -163,14 +163,14 @@ public class Http2ConnectionTests : Http2TestBase
[Fact]
public async Task RequestHeaderStringReuse_MultipleStreams_KnownHeaderReused()
{
- IEnumerable<KeyValuePair<string, string>> requestHeaders = new[]
+ var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
+ };
await InitializeConnectionAsync(_readHeadersApplication);
@@ -214,22 +214,22 @@ public class Http2ConnectionTests : Http2TestBase
{
const BindingFlags privateFlags = BindingFlags.NonPublic | BindingFlags.Instance;
- IEnumerable<KeyValuePair<string, string>> requestHeaders1 = new[]
+ var requestHeaders1 = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
};
// Note: No content-type
- IEnumerable<KeyValuePair<string, string>> requestHeaders2 = new[]
+ var requestHeaders2 = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80")
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80")
};
await InitializeConnectionAsync(_noopApplication);
@@ -307,14 +307,14 @@ public class Http2ConnectionTests : Http2TestBase
[Fact]
public async Task ResponseTrailers_MultipleStreams_Reset()
{
- IEnumerable<KeyValuePair<string, string>> requestHeaders = new[]
+ var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
+ };
var requestCount = 0;
IHeaderDictionary trailersFirst = null;
@@ -427,6 +427,7 @@ public class Http2ConnectionTests : Http2TestBase
}
[Fact]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/39477")]
public async Task StreamPool_MultipleStreamsConcurrent_StreamsReturnedToPool()
{
await InitializeConnectionAsync(_echoApplication);
@@ -709,7 +710,7 @@ public class Http2ConnectionTests : Http2TestBase
var length = Http2PeerSettings.MinAllowedMaxFrameSize + 10;
_serviceContext.ServerOptions.Limits.Http2.MaxFrameSize = length;
- await InitializeConnectionAsync(_echoApplication, expectedSettingsCount: 4);
+ await InitializeConnectionAsync(_echoApplication, expectedSettingsCount: 5);
await StartStreamAsync(1, _browserRequestHeaders, endStream: false);
await SendDataAsync(1, new byte[length], endStream: true);
@@ -1344,6 +1345,10 @@ public class Http2ConnectionTests : Http2TestBase
[Fact]
public async Task DATA_BufferRequestBodyLargerThanStreamSizeSmallerThanConnectionPipe_Works()
{
+ // This test was not written to allow for arbitrary initial stream sizes. It was tuned to the old defaults.
+ _serviceContext.ServerOptions.Limits.Http2.InitialConnectionWindowSize = 128 * 1024;
+ _serviceContext.ServerOptions.Limits.Http2.InitialStreamWindowSize = 96 * 1024;
+
var initialStreamWindowSize = _serviceContext.ServerOptions.Limits.Http2.InitialStreamWindowSize;
var framesInStreamWindow = initialStreamWindowSize / Http2PeerSettings.DefaultMaxFrameSize;
var initialConnectionWindowSize = _serviceContext.ServerOptions.Limits.Http2.InitialConnectionWindowSize;
@@ -2194,7 +2199,7 @@ public class Http2ConnectionTests : Http2TestBase
{
_serviceContext.ServerOptions.Limits.Http2.HeaderTableSize = 0;
- await InitializeConnectionAsync(_noopApplication, expectedSettingsCount: 4);
+ await InitializeConnectionAsync(_noopApplication, expectedSettingsCount: 5);
await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
@@ -2631,11 +2636,11 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(":unknown", "0"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(":unknown", "0"),
+ };
return HEADERS_Received_InvalidHeaderFields_ConnectionError(headers, expectedErrorMessage: CoreStrings.HttpErrorUnknownPseudoHeaderField);
}
@@ -2645,11 +2650,11 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Status, "200"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Status, "200"),
+ };
return HEADERS_Received_InvalidHeaderFields_ConnectionError(headers, expectedErrorMessage: CoreStrings.HttpErrorResponsePseudoHeaderField);
}
@@ -2670,7 +2675,7 @@ public class Http2ConnectionTests : Http2TestBase
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
await ExpectAsync(Http2FrameType.HEADERS,
- withLength: 36,
+ withLength: 32,
withFlags: (byte)(Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM),
withStreamId: 1);
@@ -2722,18 +2727,18 @@ public class Http2ConnectionTests : Http2TestBase
// > 32kb
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue),
- new KeyValuePair<string, string>("e", _4kHeaderValue),
- new KeyValuePair<string, string>("f", _4kHeaderValue),
- new KeyValuePair<string, string>("g", _4kHeaderValue),
- new KeyValuePair<string, string>("h", _4kHeaderValue),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue),
+ new KeyValuePair<string, string>("e", _4kHeaderValue),
+ new KeyValuePair<string, string>("f", _4kHeaderValue),
+ new KeyValuePair<string, string>("g", _4kHeaderValue),
+ new KeyValuePair<string, string>("h", _4kHeaderValue),
+ };
return HEADERS_Received_InvalidHeaderFields_ConnectionError(headers, CoreStrings.BadRequest_HeadersExceedMaxTotalSize);
}
@@ -2745,10 +2750,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new List<KeyValuePair<string, string>>();
headers.AddRange(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- });
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ });
for (var i = 0; i < 100; i++)
{
headers.Add(new KeyValuePair<string, string>(i.ToString(CultureInfo.InvariantCulture), i.ToString(CultureInfo.InvariantCulture)));
@@ -2762,11 +2767,11 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("Custom", "val\0ue"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("Custom", "val\0ue"),
+ };
return HEADERS_Received_InvalidHeaderFields_ConnectionError(headers, CoreStrings.BadRequest_MalformedRequestInvalidHeaders);
}
@@ -2776,11 +2781,11 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("connection", "keep-alive")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("connection", "keep-alive")
+ };
return HEADERS_Received_InvalidHeaderFields_ConnectionError(headers, CoreStrings.HttpErrorConnectionSpecificHeaderField);
}
@@ -2790,11 +2795,11 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("te", "trailers, deflate")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("te", "trailers, deflate")
+ };
return HEADERS_Received_InvalidHeaderFields_ConnectionError(headers, CoreStrings.HttpErrorConnectionSpecificHeaderField);
}
@@ -2804,11 +2809,11 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("te", "trailers")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("te", "trailers")
+ };
await InitializeConnectionAsync(_noopApplication);
@@ -2827,10 +2832,10 @@ public class Http2ConnectionTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, new string('A', 8192 / 2)),
- new KeyValuePair<string, string>(HeaderNames.Path, "/" + new string('A', 8192 / 2)),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, new string('A', 8192 / 2)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/" + new string('A', 8192 / 2)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http")
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -2841,6 +2846,33 @@ public class Http2ConnectionTests : Http2TestBase
}
[Fact]
+ public async Task HEADERS_CookiesMergedIntoOne()
+ {
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.Cookie, "a=0"),
+ new KeyValuePair<string, string>(HeaderNames.Cookie, "b=1"),
+ new KeyValuePair<string, string>(HeaderNames.Cookie, "c=2"),
+ };
+
+ await InitializeConnectionAsync(_readHeadersApplication);
+
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
+
+ await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 36,
+ withFlags: (byte)(Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM),
+ withStreamId: 1);
+
+ Assert.Equal("a=0; b=1; c=2", _receivedHeaders[HeaderNames.Cookie]);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+ }
+
+ [Fact]
public async Task PRIORITY_Received_StreamIdZero_ConnectionError()
{
await InitializeConnectionAsync(_noopApplication);
@@ -3235,10 +3267,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context => tcs.Task);
await StartStreamAsync(1, headers, endStream: false);
@@ -3259,10 +3291,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context => tcs.Task);
await StartStreamAsync(1, headers, endStream: false);
@@ -3283,10 +3315,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context => tcs.Task);
await StartStreamAsync(1, headers, endStream: false);
@@ -3305,10 +3337,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context => tcs.Task);
await StartStreamAsync(1, headers, endStream: false);
@@ -3332,13 +3364,13 @@ public class Http2ConnectionTests : Http2TestBase
await SendSettingsAsync();
var frame = await ExpectAsync(Http2FrameType.SETTINGS,
- withLength: Http2FrameReader.SettingSize * 3,
+ withLength: Http2FrameReader.SettingSize * 4,
withFlags: 0,
withStreamId: 0);
// Only non protocol defaults are sent
var settings = Http2FrameReader.ReadSettings(frame.PayloadSequence);
- Assert.Equal(3, settings.Count);
+ Assert.Equal(4, settings.Count);
var setting = settings[0];
Assert.Equal(Http2SettingsParameter.SETTINGS_MAX_CONCURRENT_STREAMS, setting.Parameter);
@@ -3346,18 +3378,22 @@ public class Http2ConnectionTests : Http2TestBase
setting = settings[1];
Assert.Equal(Http2SettingsParameter.SETTINGS_INITIAL_WINDOW_SIZE, setting.Parameter);
- Assert.Equal(96 * 1024u, setting.Value);
+ Assert.Equal(768 * 1024u, setting.Value);
setting = settings[2];
Assert.Equal(Http2SettingsParameter.SETTINGS_MAX_HEADER_LIST_SIZE, setting.Parameter);
Assert.Equal(32 * 1024u, setting.Value);
+ setting = settings[3];
+ Assert.Equal(Http2SettingsParameter.SETTINGS_ENABLE_CONNECT_PROTOCOL, setting.Parameter);
+ Assert.Equal(1u, setting.Value);
+
var update = await ExpectAsync(Http2FrameType.WINDOW_UPDATE,
withLength: 4,
withFlags: (byte)Http2SettingsFrameFlags.NONE,
withStreamId: 0);
- Assert.Equal(1024 * 128 - (int)Http2PeerSettings.DefaultInitialWindowSize, update.WindowUpdateSizeIncrement);
+ Assert.Equal(1024 * 1024 - (int)Http2PeerSettings.DefaultInitialWindowSize, update.WindowUpdateSizeIncrement);
await ExpectAsync(Http2FrameType.SETTINGS,
withLength: 0,
@@ -3383,13 +3419,13 @@ public class Http2ConnectionTests : Http2TestBase
await SendSettingsAsync();
var frame = await ExpectAsync(Http2FrameType.SETTINGS,
- withLength: Http2FrameReader.SettingSize * 4,
+ withLength: Http2FrameReader.SettingSize * 5,
withFlags: 0,
withStreamId: 0);
// Only non protocol defaults are sent
var settings = Http2FrameReader.ReadSettings(frame.PayloadSequence);
- Assert.Equal(4, settings.Count);
+ Assert.Equal(5, settings.Count);
var setting = settings[0];
Assert.Equal(Http2SettingsParameter.SETTINGS_HEADER_TABLE_SIZE, setting.Parameter);
@@ -3407,12 +3443,16 @@ public class Http2ConnectionTests : Http2TestBase
Assert.Equal(Http2SettingsParameter.SETTINGS_MAX_HEADER_LIST_SIZE, setting.Parameter);
Assert.Equal(4 * 1024u, setting.Value);
+ setting = settings[4];
+ Assert.Equal(Http2SettingsParameter.SETTINGS_ENABLE_CONNECT_PROTOCOL, setting.Parameter);
+ Assert.Equal(1u, setting.Value);
+
var update = await ExpectAsync(Http2FrameType.WINDOW_UPDATE,
withLength: 4,
withFlags: (byte)Http2SettingsFrameFlags.NONE,
withStreamId: 0);
- Assert.Equal(1024 * 128u - Http2PeerSettings.DefaultInitialWindowSize, (uint)update.WindowUpdateSizeIncrement);
+ Assert.Equal(1024 * 1024u - Http2PeerSettings.DefaultInitialWindowSize, (uint)update.WindowUpdateSizeIncrement);
await ExpectAsync(Http2FrameType.SETTINGS,
withLength: 0,
@@ -3579,7 +3619,7 @@ public class Http2ConnectionTests : Http2TestBase
context.Response.Headers["A"] = new string('a', headerValueLength);
context.Response.Headers["B"] = new string('b', headerValueLength);
return context.Response.Body.WriteAsync(new byte[payloadLength], 0, payloadLength);
- }, expectedSettingsCount: 4);
+ }, expectedSettingsCount: 5);
// Update client settings
_clientSettings.MaxFrameSize = (uint)payloadLength;
@@ -3628,7 +3668,7 @@ public class Http2ConnectionTests : Http2TestBase
await InitializeConnectionAsync(context =>
{
return context.Response.Body.WriteAsync(new byte[clientMaxFrame], 0, clientMaxFrame);
- }, expectedSettingsCount: 4);
+ }, expectedSettingsCount: 5);
// Start request
await StartStreamAsync(1, _browserRequestHeaders, endStream: true);
@@ -3687,7 +3727,7 @@ public class Http2ConnectionTests : Http2TestBase
{
_serviceContext.ServerOptions.Limits.Http2.HeaderTableSize = 40000;
- await InitializeConnectionAsync(_noopApplication, expectedSettingsCount: 4);
+ await InitializeConnectionAsync(_noopApplication, expectedSettingsCount: 5);
// Update client settings
_clientSettings.HeaderTableSize = 65536; // Chrome's default, larger than the 4kb spec default
@@ -4538,7 +4578,7 @@ public class Http2ConnectionTests : Http2TestBase
await SendEmptyContinuationFrameAsync(1, Http2ContinuationFrameFlags.END_HEADERS);
await ExpectAsync(Http2FrameType.HEADERS,
- withLength: 36,
+ withLength: 32,
withFlags: (byte)(Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM),
withStreamId: 1);
@@ -4573,7 +4613,7 @@ public class Http2ConnectionTests : Http2TestBase
Assert.Equal(11, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
Assert.Equal(_4kHeaderValue, _decodedHeaders["a"]);
Assert.Equal(_4kHeaderValue, _decodedHeaders["b"]);
@@ -4890,10 +4930,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: false);
@@ -4941,10 +4981,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(_appAbort);
await StartStreamAsync(1, headers, endStream: false);
@@ -4985,10 +5025,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(_appReset);
await StartStreamAsync(1, headers, endStream: false);
@@ -5055,15 +5095,15 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await StartStreamAsync(1, headers, endStream: false);
await ExpectAsync(Http2FrameType.SETTINGS,
- withLength: 3 * Http2FrameReader.SettingSize,
+ withLength: 4 * Http2FrameReader.SettingSize,
withFlags: 0,
withStreamId: 0);
@@ -5135,10 +5175,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
// This mimics gRPC, sending headers and data close together before receiving a reset.
await StartStreamAsync(1, headers, endStream: false);
@@ -5151,7 +5191,7 @@ public class Http2ConnectionTests : Http2TestBase
await SendDataAsync(7, new byte[100], endStream: false);
await ExpectAsync(Http2FrameType.SETTINGS,
- withLength: 3 * Http2FrameReader.SettingSize,
+ withLength: 4 * Http2FrameReader.SettingSize,
withFlags: 0,
withStreamId: 0);
@@ -5186,10 +5226,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
@@ -5226,10 +5266,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(_appAbort);
await StartStreamAsync(1, headers, endStream: false);
@@ -5300,10 +5340,10 @@ public class Http2ConnectionTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(_appAbort);
await StartStreamAsync(1, headers, endStream: false);
@@ -5346,7 +5386,7 @@ public class Http2ConnectionTests : Http2TestBase
await SendAsync(Http2Connection.ClientPreface);
await ExpectAsync(Http2FrameType.SETTINGS,
- withLength: 3 * Http2FrameReader.SettingSize,
+ withLength: 4 * Http2FrameReader.SettingSize,
withFlags: 0,
withStreamId: 0);
@@ -5448,10 +5488,10 @@ public class Http2ConnectionTests : Http2TestBase
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
};
foreach (var headerField in requestHeaders)
@@ -5471,9 +5511,9 @@ public class Http2ConnectionTests : Http2TestBase
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
};
foreach (var headerField in requestHeaders)
@@ -5491,7 +5531,7 @@ public class Http2ConnectionTests : Http2TestBase
get
{
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
- var methodHeader = new KeyValuePair<string, string>(HeaderNames.Method, "CONNECT");
+ var methodHeader = new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT");
var headers = new[] { methodHeader };
data.Add(headers);
@@ -5506,10 +5546,10 @@ public class Http2ConnectionTests : Http2TestBase
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
new KeyValuePair<string, string>("content-length", "0")
};
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs
index d1262d61c1..b5e37940ab 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2StreamTests.cs
@@ -34,10 +34,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>("TestHeader", headerValue),
};
await InitializeConnectionAsync(_noopApplication);
@@ -52,11 +52,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, ""),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, ""),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -71,11 +71,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Hello,World"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Hello,World"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -96,11 +96,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await InitializeConnectionAsync(_echoMethodNoBody);
// First request
@@ -115,7 +115,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal(method, _decodedHeaders["Method"]);
_decodedHeaders.Clear();
@@ -134,7 +134,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal(method, _decodedHeaders["Method"]);
_decodedHeaders.Clear();
@@ -147,11 +147,11 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "HEAD"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "HEAD"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
@@ -165,7 +165,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("HEAD", _decodedHeaders["Method"]);
}
@@ -180,12 +180,12 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "11"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "11"),
+ };
await InitializeConnectionAsync(context =>
{
Assert.True(HttpMethods.Equals(method, context.Request.Method));
@@ -217,7 +217,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(dataFrame.Payload.Span));
}
@@ -232,11 +232,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, method),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, method),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await InitializeConnectionAsync(context =>
{
Assert.True(HttpMethods.Equals(method, context.Request.Method));
@@ -268,7 +268,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(dataFrame.Payload.Span));
}
@@ -278,11 +278,11 @@ public class Http2StreamTests : Http2TestBase
await InitializeConnectionAsync(_echoMethodNoBody);
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "CONNECT") };
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT") };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
- withLength: 52,
+ withLength: 48,
withFlags: (byte)(Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM),
withStreamId: 1);
@@ -290,11 +290,10 @@ public class Http2StreamTests : Http2TestBase
_hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
- Assert.Equal(4, _decodedHeaders.Count);
+ Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("CONNECT", _decodedHeaders["Method"]);
- Assert.Equal("0", _decodedHeaders["content-length"]);
}
[Fact]
@@ -303,9 +302,12 @@ public class Http2StreamTests : Http2TestBase
await InitializeConnectionAsync(_echoPath);
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "OPTIONS"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, "*")};
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "OPTIONS"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "*")
+ };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
@@ -319,7 +321,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(5, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("", _decodedHeaders["path"]);
Assert.Equal("*", _decodedHeaders["rawtarget"]);
Assert.Equal("0", _decodedHeaders["content-length"]);
@@ -331,9 +333,12 @@ public class Http2StreamTests : Http2TestBase
await InitializeConnectionAsync(_echoPath);
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "OPTIONS"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/")};
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "OPTIONS"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/")
+ };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
@@ -347,7 +352,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(5, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("/", _decodedHeaders["path"]);
Assert.Equal("/", _decodedHeaders["rawtarget"]);
Assert.Equal("0", _decodedHeaders["content-length"]);
@@ -365,9 +370,12 @@ public class Http2StreamTests : Http2TestBase
});
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/a/path?a&que%35ry")};
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/a/path?a&que%35ry")
+ };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
@@ -381,7 +389,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(6, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("/a/path", _decodedHeaders["path"]);
Assert.Equal("?a&que%35ry", _decodedHeaders["query"]);
Assert.Equal("/a/path?a&que%35ry", _decodedHeaders["rawtarget"]);
@@ -407,9 +415,12 @@ public class Http2StreamTests : Http2TestBase
});
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, input)};
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, input)
+ };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
@@ -423,7 +434,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
}
@@ -435,7 +446,7 @@ public class Http2StreamTests : Http2TestBase
await InitializeConnectionAsync(_noopApplication);
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "CONNECT"),
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
new KeyValuePair<string, string>(headerName, value) };
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
@@ -451,9 +462,9 @@ public class Http2StreamTests : Http2TestBase
{
await InitializeConnectionAsync(_noopApplication);
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, scheme) }; // Not the expected "http"
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, scheme) }; // Not the expected "http"
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
await WaitForStreamErrorAsync(expectedStreamId: 1, Http2ErrorCode.PROTOCOL_ERROR,
@@ -472,13 +483,16 @@ public class Http2StreamTests : Http2TestBase
await InitializeConnectionAsync(context =>
{
Assert.Equal(scheme, context.Request.Scheme);
- Assert.False(context.Request.Headers.ContainsKey(HeaderNames.Scheme));
+ Assert.False(context.Request.Headers.ContainsKey(InternalHeaderNames.Scheme));
return Task.CompletedTask;
});
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, scheme) }; // Not the expected "http"
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, scheme)
+ }; // Not the expected "http"
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
@@ -492,7 +506,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -505,9 +519,12 @@ public class Http2StreamTests : Http2TestBase
await InitializeConnectionAsync(_noopApplication);
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, scheme) }; // Not the expected "http"
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, scheme)
+ }; // Not the expected "http"
await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
await WaitForStreamErrorAsync(expectedStreamId: 1, Http2ErrorCode.PROTOCOL_ERROR,
@@ -521,10 +538,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -540,7 +557,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
}
@@ -549,11 +566,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, ""),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, ""),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -569,7 +586,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
}
@@ -578,11 +595,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
await InitializeConnectionAsync(_echoHost);
await StartStreamAsync(1, headers, endStream: true);
@@ -598,7 +615,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal("abc", _decodedHeaders[HeaderNames.Host]);
}
@@ -608,12 +625,12 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, ""),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, ""),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
await InitializeConnectionAsync(_echoHost);
await StartStreamAsync(1, headers, endStream: true);
@@ -629,7 +646,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal("abc", _decodedHeaders[HeaderNames.Host]);
}
@@ -639,12 +656,12 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "def"),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "def"),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
await InitializeConnectionAsync(_echoHost);
await StartStreamAsync(1, headers, endStream: true);
@@ -660,7 +677,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal("def", _decodedHeaders[HeaderNames.Host]);
}
@@ -670,12 +687,12 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "def"),
- new KeyValuePair<string, string>("Host", "a=bc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "def"),
+ new KeyValuePair<string, string>("Host", "a=bc"),
+ };
await InitializeConnectionAsync(_echoHost);
await StartStreamAsync(1, headers, endStream: true);
@@ -691,7 +708,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal("def", _decodedHeaders[HeaderNames.Host]);
}
@@ -701,11 +718,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "local=host:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "local=host:80"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -721,12 +738,12 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "d=ef"),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "d=ef"),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
await InitializeConnectionAsync(_echoHost);
await StartStreamAsync(1, headers, endStream: true);
@@ -742,12 +759,12 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("Host", "host1"),
- new KeyValuePair<string, string>("Host", "host2"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("Host", "host1"),
+ new KeyValuePair<string, string>("Host", "host2"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -766,11 +783,11 @@ public class Http2StreamTests : Http2TestBase
// https://github.com/aspnet/KestrelHttpServer/issues/2872
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET" + new string('a', 1024 * 3)),
- new KeyValuePair<string, string>(HeaderNames.Path, "/Hello/How/Are/You/" + new string('a', 1024 * 3)),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost" + new string('a', 1024 * 3) + ":80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET" + new string('a', 1024 * 3)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/Hello/How/Are/You/" + new string('a', 1024 * 3)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost" + new string('a', 1024 * 3) + ":80"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -785,11 +802,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
var buffer = new byte[100];
@@ -813,7 +830,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -831,15 +848,15 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await StartStreamAsync(1, headers, endStream: false);
await SendDataAsync(1, new byte[12], endStream: true);
@@ -854,7 +871,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -863,11 +880,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
var buffer = new byte[100];
@@ -897,7 +914,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -906,11 +923,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
var readResult = await context.Request.BodyReader.ReadAsync();
@@ -940,7 +957,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -950,11 +967,11 @@ public class Http2StreamTests : Http2TestBase
var tcs = new TaskCompletionSource();
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
var readResult = await context.Request.BodyReader.ReadAsync();
@@ -993,7 +1010,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1002,11 +1019,11 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestDelegateCalled = false;
await InitializeConnectionAsync(c =>
@@ -1031,15 +1048,15 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(_noopApplication);
await StartStreamAsync(1, headers, endStream: true);
@@ -1056,11 +1073,11 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
thrownEx = await Assert.ThrowsAsync<IOException>(async () =>
@@ -1091,11 +1108,11 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
thrownEx = await Assert.ThrowsAsync<IOException>(async () =>
@@ -1126,11 +1143,11 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
thrownEx = await Assert.ThrowsAsync<IOException>(async () =>
@@ -1162,11 +1179,11 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
thrownEx = await Assert.ThrowsAsync<IOException>(async () =>
@@ -1212,15 +1229,15 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await StartStreamAsync(1, headers, endStream: false);
await SendDataAsync(1, new byte[12], endStream: true);
@@ -1235,7 +1252,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1244,10 +1261,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.ContentLength = 11;
@@ -1273,7 +1290,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("11", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1282,10 +1299,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.ContentLength = 11;
@@ -1312,7 +1329,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("11", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1321,10 +1338,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context =>
{
context.Response.ContentLength = 11;
@@ -1346,7 +1363,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("500", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1355,10 +1372,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1381,7 +1398,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -1389,10 +1406,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.ContentLength = 0;
@@ -1416,7 +1433,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1427,10 +1444,10 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1456,19 +1473,18 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
public async Task StartAsync_StartsResponse()
{
-
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1492,7 +1508,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -1502,10 +1518,10 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1540,7 +1556,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -1550,10 +1566,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1580,19 +1596,18 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
public async Task StartAsync_WithContentLengthAndEmptyWriteCallsFinalFlush()
{
-
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.ContentLength = 0;
@@ -1617,7 +1632,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1626,10 +1641,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1659,7 +1674,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -1669,10 +1684,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.ContentLength = 11;
@@ -1695,7 +1710,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("11", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1704,10 +1719,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -1729,7 +1744,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -1737,10 +1752,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context =>
{
context.Response.ContentLength = 11;
@@ -1766,7 +1781,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("11", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1776,11 +1791,11 @@ public class Http2StreamTests : Http2TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 15;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
var buffer = new byte[100];
@@ -1804,7 +1819,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1817,11 +1832,11 @@ public class Http2StreamTests : Http2TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 10;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
await InitializeConnectionAsync(async context =>
{
#pragma warning disable CS0618 // Type or member is obsolete
@@ -1851,7 +1866,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("413", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("413", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.NotNull(exception);
@@ -1863,10 +1878,10 @@ public class Http2StreamTests : Http2TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 15;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
var buffer = new byte[100];
@@ -1890,7 +1905,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1903,10 +1918,10 @@ public class Http2StreamTests : Http2TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 10;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
#pragma warning disable CS0618 // Type or member is obsolete
@@ -1938,7 +1953,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("413", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("413", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.NotNull(exception);
@@ -1955,16 +1970,16 @@ public class Http2StreamTests : Http2TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 20;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
if (includeContentLength)
{
headers.Concat(new[]
{
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "18"),
- });
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "18"),
+ });
}
await InitializeConnectionAsync(async context =>
{
@@ -2001,7 +2016,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("413", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("413", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
Assert.NotNull(exception);
@@ -2015,16 +2030,16 @@ public class Http2StreamTests : Http2TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 10;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
if (includeContentLength)
{
headers.Concat(new[]
{
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- });
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ });
}
await InitializeConnectionAsync(async context =>
{
@@ -2052,7 +2067,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -2091,7 +2106,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -2132,7 +2147,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(4, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Custom 你好 Type", _decodedHeaders[HeaderNames.ContentType]);
Assert.Equal("Custom 你好 Value", _decodedHeaders["CustomName"]);
}
@@ -2182,7 +2197,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
_decodedHeaders.Clear();
@@ -2215,7 +2230,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("500", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -2303,7 +2318,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
_decodedHeaders.Clear();
@@ -2358,7 +2373,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
_decodedHeaders.Clear();
@@ -2416,7 +2431,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -2459,7 +2474,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
_decodedHeaders.Clear();
@@ -2500,7 +2515,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
await WaitForConnectionErrorAsync<Exception>(ignoreNonGoAwayFrames: false, int.MaxValue, Http2ErrorCode.INTERNAL_ERROR);
}
@@ -2548,10 +2563,10 @@ public class Http2StreamTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -2600,7 +2615,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
_decodedHeaders.Clear();
_hpackDecoder.Decode(trailersFrame.PayloadSequence, endHeaders: true, handler: this);
@@ -2614,10 +2629,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.StartAsync();
@@ -2652,7 +2667,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
_decodedHeaders.Clear();
_hpackDecoder.Decode(trailersFrame.PayloadSequence, endHeaders: true, handler: this);
@@ -2666,10 +2681,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(context =>
{
throw new Exception("App Faulted");
@@ -2690,7 +2705,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("500", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -2699,10 +2714,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.WriteAsync("hello,");
@@ -2728,7 +2743,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -3125,10 +3140,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
// The cancellation is checked at the start of WriteAsync and no application state is changed.
@@ -3149,7 +3164,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -3160,10 +3175,10 @@ public class Http2StreamTests : Http2TestBase
var writeStarted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
await context.Response.Body.FlushAsync(); // https://github.com/aspnet/KestrelHttpServer/issues/3031
@@ -3198,18 +3213,18 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
public async Task GetMemoryAdvance_Works()
{
var headers = new[]
- {
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(httpContext =>
{
var response = httpContext.Response;
@@ -3242,7 +3257,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -3251,11 +3266,11 @@ public class Http2StreamTests : Http2TestBase
public async Task GetMemoryAdvance_WithStartAsync_Works()
{
var headers = new[]
- {
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3288,7 +3303,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -3297,11 +3312,11 @@ public class Http2StreamTests : Http2TestBase
public async Task WriteAsync_GetMemoryLargeWriteBeforeFirstFlush()
{
var headers = new[]
- {
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3341,7 +3356,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal(Encoding.ASCII.GetBytes(new string('a', 4102)), dataFrame.PayloadSequence.ToArray());
}
@@ -3350,10 +3365,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3394,7 +3409,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal(Encoding.ASCII.GetBytes(new string('a', 4102)), dataFrame.PayloadSequence.ToArray());
}
@@ -3403,10 +3418,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3440,7 +3455,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -3449,10 +3464,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3490,7 +3505,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -3499,10 +3514,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3535,7 +3550,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame.PayloadSequence.ToArray()));
}
@@ -3543,11 +3558,11 @@ public class Http2StreamTests : Http2TestBase
public async Task WriteAsync_GetMemoryWithSizeHintAlwaysReturnsSameSize()
{
var headers = new[]
-{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3578,7 +3593,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -3586,10 +3601,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3616,7 +3631,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -3626,9 +3641,9 @@ public class Http2StreamTests : Http2TestBase
var appTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
};
await InitializeConnectionAsync(async httpContext =>
{
@@ -3661,9 +3676,9 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
};
await InitializeConnectionAsync(async httpContext =>
{
@@ -3703,9 +3718,9 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
};
await InitializeConnectionAsync(async httpContext =>
{
@@ -3759,7 +3774,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -3767,10 +3782,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3809,7 +3824,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("12", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -3818,10 +3833,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(httpContext =>
{
var response = httpContext.Response;
@@ -3855,7 +3870,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("12", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -3864,10 +3879,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
httpContext.Response.ContentLength = 12;
@@ -3895,7 +3910,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("12", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -3904,10 +3919,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -3959,7 +3974,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("54", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -3968,10 +3983,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.BodyWriter.Complete();
@@ -3991,7 +4006,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -4000,10 +4015,10 @@ public class Http2StreamTests : Http2TestBase
InvalidOperationException writeEx = null;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.BodyWriter.Complete();
@@ -4024,7 +4039,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.NotNull(writeEx);
}
@@ -4034,10 +4049,10 @@ public class Http2StreamTests : Http2TestBase
var expectedException = new Exception();
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
context.Response.BodyWriter.Complete(expectedException);
@@ -4057,7 +4072,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("500", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Contains(TestSink.Writes, w => w.EventId.Id == 13 && w.LogLevel == LogLevel.Error
&& w.Exception is ConnectionAbortedException && w.Exception.InnerException == expectedException);
@@ -4071,10 +4086,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4112,7 +4127,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
}
@@ -4124,10 +4139,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4172,7 +4187,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
_decodedHeaders.Clear();
@@ -4190,10 +4205,10 @@ public class Http2StreamTests : Http2TestBase
var appTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4233,7 +4248,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("500", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -4245,10 +4260,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4298,7 +4313,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
}
@@ -4311,10 +4326,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4355,7 +4370,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
}
@@ -4367,10 +4382,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4422,7 +4437,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
}
@@ -4433,10 +4448,10 @@ public class Http2StreamTests : Http2TestBase
var tcs = new TaskCompletionSource();
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
var memory = context.Response.BodyWriter.GetMemory(12);
@@ -4467,7 +4482,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders[HeaderNames.ContentLength]);
await tcs.Task.DefaultTimeout();
@@ -4481,10 +4496,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4540,7 +4555,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -4560,10 +4575,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4614,7 +4629,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -4634,10 +4649,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4690,7 +4705,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("25", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -4704,10 +4719,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
@@ -4761,7 +4776,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("25", _decodedHeaders[HeaderNames.ContentLength]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -4775,10 +4790,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4823,7 +4838,8 @@ public class Http2StreamTests : Http2TestBase
withLength: 25,
withFlags: (byte)(Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM),
withStreamId: 1);
- await WaitForStreamErrorAsync(1, Http2ErrorCode.INTERNAL_ERROR, expectedErrorMessage: null);
+ // Stream should return an INTERNAL_ERROR. If there is an unexpected exception from app TCS instead, then throw it here to avoid timeout waiting for the stream error.
+ await Task.WhenAny(WaitForStreamErrorAsync(1, Http2ErrorCode.INTERNAL_ERROR, expectedErrorMessage: null), appTcs.Task).Unwrap();
clientTcs.SetResult();
await appTcs.Task;
@@ -4834,7 +4850,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -4854,10 +4870,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -4918,7 +4934,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -4938,10 +4954,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -5000,7 +5016,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -5020,10 +5036,10 @@ public class Http2StreamTests : Http2TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async context =>
{
try
@@ -5087,7 +5103,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("Hello World", Encoding.UTF8.GetString(bodyFrame.Payload.Span));
@@ -5104,11 +5120,11 @@ public class Http2StreamTests : Http2TestBase
// :scheme = http
// X-Test = £
private static readonly byte[] LatinHeaderData = new byte[]
- {
- 0, 7, 58, 109, 101, 116, 104, 111, 100, 3, 71, 69, 84, 0, 5, 58, 112, 97, 116,
- 104, 1, 47, 0, 7, 58, 115, 99, 104, 101, 109, 101, 4, 104, 116, 116, 112, 0,
- 6, 120, 45, 116, 101, 115, 116, 1, 163
- };
+ {
+ 0, 7, 58, 109, 101, 116, 104, 111, 100, 3, 71, 69, 84, 0, 5, 58, 112, 97, 116,
+ 104, 1, 47, 0, 7, 58, 115, 99, 104, 101, 109, 101, 4, 104, 116, 116, 112, 0,
+ 6, 120, 45, 116, 101, 115, 116, 1, 163
+ };
[Fact]
public async Task HEADERS_Received_Latin1_AcceptedWhenLatin1OptionIsConfigured()
@@ -5134,7 +5150,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(3, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", _decodedHeaders["content-length"]);
}
@@ -5207,7 +5223,7 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
Assert.True(_helloWorldBytes.AsSpan().SequenceEqual(dataFrame1.PayloadSequence.ToArray()));
@@ -5222,10 +5238,10 @@ public class Http2StreamTests : Http2TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
await InitializeConnectionAsync(async httpContext =>
{
var response = httpContext.Response;
@@ -5259,6 +5275,6 @@ public class Http2StreamTests : Http2TestBase
Assert.Equal(2, _decodedHeaders.Count);
Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", _decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
}
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs
index cd2150c83b..f37749a946 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TestBase.cs
@@ -36,74 +36,74 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
protected static readonly IEnumerable<KeyValuePair<string, string>> _browserRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
- new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
- new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
- new KeyValuePair<string, string>("accept-encoding", "gzip, deflate, br"),
- new KeyValuePair<string, string>("upgrade-insecure-requests", "1"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
+ new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
+ new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
+ new KeyValuePair<string, string>("accept-encoding", "gzip, deflate, br"),
+ new KeyValuePair<string, string>("upgrade-insecure-requests", "1"),
+ };
protected static readonly IEnumerable<KeyValuePair<string, string>> _postRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
protected static readonly IEnumerable<KeyValuePair<string, string>> _expectContinueRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Expect, "100-continue"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.Expect, "100-continue"),
+ };
protected static readonly IEnumerable<KeyValuePair<string, string>> _requestTrailers = new[]
{
- new KeyValuePair<string, string>("trailer-one", "1"),
- new KeyValuePair<string, string>("trailer-two", "2"),
- };
+ new KeyValuePair<string, string>("trailer-one", "1"),
+ new KeyValuePair<string, string>("trailer-two", "2"),
+ };
protected static readonly IEnumerable<KeyValuePair<string, string>> _oneContinuationRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue)
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue)
+ };
protected static readonly IEnumerable<KeyValuePair<string, string>> _twoContinuationsRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue),
- new KeyValuePair<string, string>("e", _4kHeaderValue),
- new KeyValuePair<string, string>("f", _4kHeaderValue),
- new KeyValuePair<string, string>("g", _4kHeaderValue),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue),
+ new KeyValuePair<string, string>("e", _4kHeaderValue),
+ new KeyValuePair<string, string>("f", _4kHeaderValue),
+ new KeyValuePair<string, string>("g", _4kHeaderValue),
+ };
protected static IEnumerable<KeyValuePair<string, string>> ReadRateRequestHeaders(int expectedBytes) => new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/" + expectedBytes),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/" + expectedBytes),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
protected static readonly byte[] _helloBytes = Encoding.ASCII.GetBytes("hello");
protected static readonly byte[] _worldBytes = Encoding.ASCII.GetBytes("world");
@@ -343,7 +343,7 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
_echoMethodNoBody = context =>
{
Assert.False(context.Request.CanHaveBody());
- Assert.False(context.Request.Headers.ContainsKey(HeaderNames.Method));
+ Assert.False(context.Request.Headers.ContainsKey(InternalHeaderNames.Method));
context.Response.Headers["Method"] = context.Request.Method;
return Task.CompletedTask;
@@ -351,7 +351,7 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
_echoHost = context =>
{
- Assert.False(context.Request.Headers.ContainsKey(HeaderNames.Authority));
+ Assert.False(context.Request.Headers.ContainsKey(InternalHeaderNames.Authority));
context.Response.Headers.Host = context.Request.Headers.Host;
return Task.CompletedTask;
@@ -359,7 +359,7 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
_echoPath = context =>
{
- Assert.False(context.Request.Headers.ContainsKey(HeaderNames.Path));
+ Assert.False(context.Request.Headers.ContainsKey(InternalHeaderNames.Path));
context.Response.Headers["path"] = context.Request.Path.ToString();
context.Response.Headers["rawtarget"] = context.Features.Get<IHttpRequestFeature>().RawTarget;
@@ -525,7 +525,7 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
_connectionTask = CompletePipeOnTaskCompletion();
}
- protected async Task InitializeConnectionAsync(RequestDelegate application, int expectedSettingsCount = 3, bool expectedWindowUpdate = true)
+ protected async Task InitializeConnectionAsync(RequestDelegate application, int expectedSettingsCount = 4, bool expectedWindowUpdate = true)
{
InitializeConnectionWithoutPreface(application);
@@ -1211,9 +1211,9 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
var frame = await ReceiveFrameAsync((uint)withLength);
Assert.Equal(type, frame.Type);
- Assert.Equal(withLength, frame.PayloadLength);
- Assert.Equal(withFlags, frame.Flags);
Assert.Equal(withStreamId, frame.StreamId);
+ Assert.Equal(withFlags, frame.Flags);
+ Assert.Equal(withLength, frame.PayloadLength);
return frame;
}
@@ -1294,20 +1294,20 @@ public class Http2TestBase : TestApplicationErrorLoggerLoggedTest, IDisposable,
{
foreach (var header in expectedHeaders)
{
- if (header.Key == HeaderNames.Method)
+ if (header.Key == InternalHeaderNames.Method)
{
Assert.Equal(header.Value, _receivedRequestFields.Method);
}
- else if (header.Key == HeaderNames.Authority)
+ else if (header.Key == InternalHeaderNames.Authority)
{
Assert.True(_receivedHeaders.TryGetValue(HeaderNames.Host, out var host), header.Key);
Assert.Equal(header.Value, host);
}
- else if (header.Key == HeaderNames.Scheme)
+ else if (header.Key == InternalHeaderNames.Scheme)
{
Assert.Equal(header.Value, _receivedRequestFields.Scheme);
}
- else if (header.Key == HeaderNames.Path)
+ else if (header.Key == InternalHeaderNames.Path)
{
Assert.Equal(header.Value, _receivedRequestFields.RawTarget);
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs
index 7c47189caf..fcdb46d9c8 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2TimeoutTests.cs
@@ -7,7 +7,6 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
-using Microsoft.Net.Http.Headers;
using Moq;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
@@ -247,9 +246,9 @@ public class Http2TimeoutTests : Http2TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
};
await InitializeConnectionAsync(_appAbort);
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2WebSocketTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2WebSocketTests.cs
new file mode 100644
index 0000000000..0e22f37666
--- /dev/null
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http2/Http2WebSocketTests.cs
@@ -0,0 +1,440 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Buffers;
+using System.Net.Http;
+using System.Net.Http.HPack;
+using System.Runtime.ExceptionServices;
+using System.Text;
+using Microsoft.AspNetCore.Connections;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.Logging;
+using Microsoft.Net.Http.Headers;
+using Moq;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
+
+// https://datatracker.ietf.org/doc/html/rfc8441
+public class Http2WebSocketTests : Http2TestBase
+{
+ [Fact]
+ public async Task HEADERS_Received_ExtendedCONNECTMethod_Received()
+ {
+ await InitializeConnectionAsync(async context =>
+ {
+ var connectFeature = context.Features.Get<IHttpExtendedConnectFeature>();
+ Assert.True(connectFeature.IsExtendedConnect);
+ Assert.Equal(HttpMethods.Connect, context.Request.Method);
+ Assert.Equal("websocket", connectFeature.Protocol);
+ Assert.False(context.Request.Headers.TryGetValue(":protocol", out var _));
+ Assert.Equal("http", context.Request.Scheme);
+ Assert.Equal("/chat", context.Request.Path.Value);
+ Assert.Equal("server.example.com", context.Request.Host.Value);
+ Assert.Equal("chat, superchat", context.Request.Headers.WebSocketSubProtocols);
+ Assert.Equal("permessage-deflate", context.Request.Headers.SecWebSocketExtensions);
+ Assert.Equal("13", context.Request.Headers.SecWebSocketVersion);
+ Assert.Equal("http://www.example.com", context.Request.Headers.Origin);
+
+ Assert.Equal(0, await context.Request.Body.ReadAsync(new byte[1]));
+ });
+
+ // HEADERS + END_HEADERS
+ // :method = CONNECT
+ // :protocol = websocket
+ // :scheme = https
+ // :path = /chat
+ // :authority = server.example.com
+ // sec-websocket-protocol = chat, superchat
+ // sec-websocket-extensions = permessage-deflate
+ // sec-websocket-version = 13
+ // origin = http://www.example.com
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "websocket"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/chat"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.WebSocketSubProtocols, "chat, superchat"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketExtensions, "permessage-deflate"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketVersion, "13"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "http://www.example.com"),
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS, headers);
+ await SendDataAsync(1, Array.Empty<byte>(), endStream: true);
+
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)(Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM),
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+
+ _hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
+
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
+ }
+
+ [Fact]
+ public async Task HEADERS_Received_ExtendedCONNECTMethod_Accepted()
+ {
+ await InitializeConnectionAsync(async context =>
+ {
+ var connectFeature = context.Features.Get<IHttpExtendedConnectFeature>();
+ Assert.True(connectFeature.IsExtendedConnect);
+ Assert.Equal(HttpMethods.Connect, context.Request.Method);
+ Assert.Equal("websocket", connectFeature.Protocol);
+ Assert.False(context.Request.Headers.TryGetValue(":protocol", out var _));
+ Assert.Equal("http", context.Request.Scheme);
+ Assert.Equal("/chat", context.Request.Path.Value);
+ Assert.Equal("server.example.com", context.Request.Host.Value);
+ Assert.Equal("chat, superchat", context.Request.Headers.WebSocketSubProtocols);
+ Assert.Equal("permessage-deflate", context.Request.Headers.SecWebSocketExtensions);
+ Assert.Equal("13", context.Request.Headers.SecWebSocketVersion);
+ Assert.Equal("http://www.example.com", context.Request.Headers.Origin);
+
+ Assert.Equal(0, await context.Request.Body.ReadAsync(new byte[1]));
+
+ var stream = await connectFeature.AcceptAsync();
+ Assert.Equal(0, await stream.ReadAsync(new byte[1]));
+ await stream.WriteAsync(new byte[] { 0x01 });
+ });
+
+ // HEADERS + END_HEADERS
+ // :method = CONNECT
+ // :protocol = websocket
+ // :scheme = https
+ // :path = /chat
+ // :authority = server.example.com
+ // sec-websocket-protocol = chat, superchat
+ // sec-websocket-extensions = permessage-deflate
+ // sec-websocket-version = 13
+ // origin = http://www.example.com
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "websocket"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/chat"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.WebSocketSubProtocols, "chat, superchat"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketExtensions, "permessage-deflate"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketVersion, "13"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "http://www.example.com"),
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS, headers);
+ await SendDataAsync(1, Array.Empty<byte>(), endStream: true);
+
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
+
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
+
+ var dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 1,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+ Assert.Equal(0x01, dataFrame.Payload.Span[0]);
+
+ dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 0,
+ withFlags: (byte)Http2DataFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+ }
+
+ [Fact]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42133")]
+ public async Task HEADERS_Received_SecondRequest_Accepted()
+ {
+ // Add stream to Http2Connection._completedStreams inline with SetResult().
+ var appDelegateTcs = new TaskCompletionSource();
+ await InitializeConnectionAsync(async context =>
+ {
+ var connectFeature = context.Features.Get<IHttpExtendedConnectFeature>();
+ Assert.True(connectFeature.IsExtendedConnect);
+ Assert.Equal(HttpMethods.Connect, context.Request.Method);
+ Assert.Equal("websocket", connectFeature.Protocol);
+ Assert.False(context.Request.Headers.TryGetValue(":protocol", out var _));
+ Assert.Equal("http", context.Request.Scheme);
+ Assert.Equal("/chat", context.Request.Path.Value);
+ Assert.Equal("server.example.com", context.Request.Host.Value);
+ Assert.Equal("chat, superchat", context.Request.Headers.WebSocketSubProtocols);
+ Assert.Equal("permessage-deflate", context.Request.Headers.SecWebSocketExtensions);
+ Assert.Equal("13", context.Request.Headers.SecWebSocketVersion);
+ Assert.Equal("http://www.example.com", context.Request.Headers.Origin);
+
+ Assert.Equal(0, await context.Request.Body.ReadAsync(new byte[1]));
+
+ var stream = await connectFeature.AcceptAsync();
+ Assert.Equal(0, await stream.ReadAsync(new byte[1]));
+ await stream.WriteAsync(new byte[] { 0x01 });
+ await appDelegateTcs.Task;
+ });
+
+ // HEADERS + END_HEADERS
+ // :method = CONNECT
+ // :protocol = websocket
+ // :scheme = https
+ // :path = /chat
+ // :authority = server.example.com
+ // sec-websocket-protocol = chat, superchat
+ // sec-websocket-extensions = permessage-deflate
+ // sec-websocket-version = 13
+ // origin = http://www.example.com
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "websocket"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/chat"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.WebSocketSubProtocols, "chat, superchat"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketExtensions, "permessage-deflate"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketVersion, "13"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "http://www.example.com"),
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS, headers);
+ await SendDataAsync(1, Array.Empty<byte>(), endStream: true);
+
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
+
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
+
+ var dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 1,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+ Assert.Equal(0x01, dataFrame.Payload.Span[0]);
+
+ appDelegateTcs.TrySetResult();
+
+ dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 0,
+ withFlags: (byte)Http2DataFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ // TriggerTick will trigger the stream to be returned to the pool so we can assert it
+ TriggerTick();
+
+ // Stream has been returned to the pool
+ Assert.Equal(1, _connection.StreamPool.Count);
+ Assert.True(_connection.StreamPool.TryPeek(out var pooledStream));
+
+ await SendHeadersAsync(3, Http2HeadersFrameFlags.END_HEADERS, headers);
+ await SendDataAsync(3, Array.Empty<byte>(), endStream: true);
+
+ headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 2,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 3);
+
+ _decodedHeaders.Clear();
+ _hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
+
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
+
+ dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 1,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 3);
+ Assert.Equal(0x01, dataFrame.Payload.Span[0]);
+
+ dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 0,
+ withFlags: (byte)Http2DataFrameFlags.END_STREAM,
+ withStreamId: 3);
+
+ await StopConnectionAsync(expectedLastStreamId: 3, ignoreNonGoAwayFrames: false);
+ }
+
+ [Theory]
+ [InlineData(":path", "/")]
+ [InlineData(":scheme", "http")]
+ public async Task HEADERS_Received_ExtendedCONNECTMethod_WithoutSchemeOrPath_Reset(string headerName, string value)
+ {
+ await InitializeConnectionAsync(_noopApplication);
+
+ // :path and :scheme are required with :protocol, :authority is optional
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "WebSocket"),
+ new KeyValuePair<string, string>(headerName, value)
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
+
+ await WaitForStreamErrorAsync(expectedStreamId: 1, Http2ErrorCode.PROTOCOL_ERROR, CoreStrings.ConnectRequestsWithProtocolRequireSchemeAndPath);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+ }
+
+ [Fact]
+ public async Task HEADERS_Received_ProtocolWithoutCONNECTMethod_Reset()
+ {
+ await InitializeConnectionAsync(_noopApplication);
+
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "example.com"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "WebSocket")
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS | Http2HeadersFrameFlags.END_STREAM, headers);
+
+ await WaitForStreamErrorAsync(expectedStreamId: 1, Http2ErrorCode.PROTOCOL_ERROR, CoreStrings.ProtocolRequiresConnect);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+ }
+
+ [Fact]
+ public async Task ExtendedCONNECT_AcceptAsyncStream_IsNotLimitedByMinRequestBodyDataRate()
+ {
+ var limits = _serviceContext.ServerOptions.Limits;
+
+ // Use non-default value to ensure the min request and response rates aren't mixed up.
+ limits.MinRequestBodyDataRate = new MinDataRate(480, TimeSpan.FromSeconds(2.5));
+
+ await InitializeConnectionAsync(async context =>
+ {
+ var connectFeature = context.Features.Get<IHttpExtendedConnectFeature>();
+ var stream = await connectFeature.AcceptAsync();
+ Assert.Equal(0, await stream.ReadAsync(new byte[1]));
+ await stream.WriteAsync(new byte[] { 0x01 });
+ });
+
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "websocket"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/chat"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.WebSocketSubProtocols, "chat, superchat"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketExtensions, "permessage-deflate"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketVersion, "13"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "http://www.example.com"),
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS, headers);
+
+ // Don't send any more data and advance just to and then past the grace period.
+ AdvanceClock(limits.MinRequestBodyDataRate.GracePeriod + TimeSpan.FromTicks(1));
+
+ _mockTimeoutHandler.Verify(h => h.OnTimeout(It.IsAny<TimeoutReason>()), Times.Never);
+
+ await SendDataAsync(1, Array.Empty<byte>(), endStream: true);
+
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
+
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
+
+ var dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 1,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+ Assert.Equal(0x01, dataFrame.Payload.Span[0]);
+
+ dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 0,
+ withFlags: (byte)Http2DataFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+ }
+
+ [Fact]
+ public async Task ExtendedCONNECT_AcceptAsyncStream_IsNotLimitedByMaxRequestBodySize()
+ {
+ var limits = _serviceContext.ServerOptions.Limits;
+
+ // We're going to send more than the MaxRequestBodySize bytes from the client to the server over the connection
+ // Since this is not a request body, this should be allowed like it would be for an upgraded connection.
+ limits.MaxRequestBodySize = 5;
+
+ await InitializeConnectionAsync(async context =>
+ {
+ var connectFeature = context.Features.Get<IHttpExtendedConnectFeature>();
+ var maxRequestBodySizeFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
+ // Extended connects don't have a meaningful request body to limit.
+ Assert.True(maxRequestBodySizeFeature.IsReadOnly);
+ var stream = await connectFeature.AcceptAsync();
+ Assert.True(maxRequestBodySizeFeature.IsReadOnly);
+ using var memoryStream = new MemoryStream();
+ await stream.CopyToAsync(memoryStream);
+ Assert.Equal(_serviceContext.ServerOptions.Limits.MaxRequestBodySize + 1, memoryStream.Length);
+ await stream.WriteAsync(new byte[] { 0x01 });
+ });
+
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "websocket"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/chat"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.WebSocketSubProtocols, "chat, superchat"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketExtensions, "permessage-deflate"),
+ new KeyValuePair<string, string>(HeaderNames.SecWebSocketVersion, "13"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "http://www.example.com"),
+ };
+ await SendHeadersAsync(1, Http2HeadersFrameFlags.END_HEADERS, headers);
+
+ await SendDataAsync(1, new byte[(int)limits.MaxRequestBodySize + 1], endStream: true);
+
+ var headersFrame = await ExpectAsync(Http2FrameType.HEADERS,
+ withLength: 32,
+ withFlags: (byte)Http2HeadersFrameFlags.END_HEADERS,
+ withStreamId: 1);
+
+ _hpackDecoder.Decode(headersFrame.PayloadSequence, endHeaders: false, handler: this);
+
+ Assert.Equal(2, _decodedHeaders.Count);
+ Assert.Contains("date", _decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
+ Assert.Equal("200", _decodedHeaders[InternalHeaderNames.Status]);
+
+ var dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 1,
+ withFlags: (byte)Http2DataFrameFlags.NONE,
+ withStreamId: 1);
+ Assert.Equal(0x01, dataFrame.Payload.Span[0]);
+
+ dataFrame = await ExpectAsync(Http2FrameType.DATA,
+ withLength: 0,
+ withFlags: (byte)Http2DataFrameFlags.END_STREAM,
+ withStreamId: 1);
+
+ await StopConnectionAsync(expectedLastStreamId: 1, ignoreNonGoAwayFrames: false);
+ }
+}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs
index e7dd6999fe..f557c0ea34 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3ConnectionTests.cs
@@ -28,11 +28,11 @@ public class Http3ConnectionTests : Http3TestBase
{
private static readonly KeyValuePair<string, string>[] Headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
[Fact]
public async Task CreateRequestStream_RequestCompleted_Disposed()
@@ -54,17 +54,14 @@ public class Http3ConnectionTests : Http3TestBase
await Http3Api.CreateControlStream();
await Http3Api.GetInboundControlStream();
- var requestStream = await Http3Api.CreateRequestStream();
-
- var headers = new[]
+ var requestStream = await Http3Api.CreateRequestStream(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ });
- await requestStream.SendHeadersAsync(headers);
await requestStream.SendDataAsync(Encoding.ASCII.GetBytes("Hello world"), endStream: true);
Assert.False(requestStream.Disposed);
@@ -95,18 +92,14 @@ public class Http3ConnectionTests : Http3TestBase
await Http3Api.CreateControlStream();
await Http3Api.GetInboundControlStream();
- var requestStream = await Http3Api.CreateRequestStream();
-
- var expectContinueRequestHeaders = new[]
+ var requestStream = await Http3Api.CreateRequestStream(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Expect, "100-continue"),
- };
-
- await requestStream.SendHeadersAsync(expectContinueRequestHeaders);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.Expect, "100-continue"),
+ });
var frame = await requestStream.ReceiveFrameAsync();
Assert.Equal(Http3FrameType.Headers, frame.Type);
@@ -116,7 +109,7 @@ public class Http3ConnectionTests : Http3TestBase
await requestStream.SendDataAsync(Encoding.ASCII.GetBytes("Hello world"), endStream: false);
var headers = await requestStream.ExpectHeadersAsync();
- Assert.Equal("200", headers[HeaderNames.Status]);
+ Assert.Equal("200", headers[InternalHeaderNames.Status]);
var responseData = await requestStream.ExpectDataAsync();
Assert.Equal("Hello world", Encoding.ASCII.GetString(responseData.ToArray()));
@@ -130,6 +123,46 @@ public class Http3ConnectionTests : Http3TestBase
await requestStream.ExpectReceiveEndOfStream();
}
+ [Fact]
+ public async Task HEADERS_CookiesMergedIntoOne()
+ {
+ var requestHeaders = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.Cookie, "a=0"),
+ new KeyValuePair<string, string>(HeaderNames.Cookie, "b=1"),
+ new KeyValuePair<string, string>(HeaderNames.Cookie, "c=2"),
+ };
+
+ var receivedHeaders = "";
+
+ await Http3Api.InitializeConnectionAsync(async context =>
+ {
+ var buffer = new byte[16 * 1024];
+ var received = 0;
+
+ // verify that the cookies are all merged into a single string
+ receivedHeaders = context.Request.Headers[HeaderNames.Cookie];
+
+ while ((received = await context.Request.Body.ReadAsync(buffer, 0, buffer.Length)) > 0)
+ {
+ await context.Response.Body.WriteAsync(buffer, 0, received);
+ }
+ });
+
+ await Http3Api.CreateControlStream();
+ await Http3Api.GetInboundControlStream();
+ var requestStream = await Http3Api.CreateRequestStream(requestHeaders, endStream: true);
+ var responseHeaders = await requestStream.ExpectHeadersAsync();
+
+ await requestStream.ExpectReceiveEndOfStream();
+ await requestStream.OnDisposedTask.DefaultTimeout();
+
+ Assert.Equal("a=0; b=1; c=2", receivedHeaders);
+ }
+
[Theory]
[InlineData(0, 0)]
[InlineData(1, 4)]
@@ -144,8 +177,7 @@ public class Http3ConnectionTests : Http3TestBase
for (var i = 0; i < connectionRequests; i++)
{
- var request = await Http3Api.CreateRequestStream();
- await request.SendHeadersAsync(Headers);
+ var request = await Http3Api.CreateRequestStream(Headers);
await request.EndStreamAsync();
await request.ExpectReceiveEndOfStream();
@@ -168,8 +200,7 @@ public class Http3ConnectionTests : Http3TestBase
var inboundControlStream = await Http3Api.GetInboundControlStream();
await inboundControlStream.ExpectSettingsAsync();
- var activeRequest = await Http3Api.CreateRequestStream();
- await activeRequest.SendHeadersAsync(Headers);
+ var activeRequest = await Http3Api.CreateRequestStream(Headers);
// Trigger server shutdown.
Http3Api.CloseServerGracefully();
@@ -177,7 +208,7 @@ public class Http3ConnectionTests : Http3TestBase
await Http3Api.WaitForGoAwayAsync(false, VariableLengthIntegerHelper.EightByteLimit);
// Request made while shutting down is rejected.
- var rejectedRequest = await Http3Api.CreateRequestStream();
+ var rejectedRequest = await Http3Api.CreateRequestStream(Headers);
await rejectedRequest.WaitForStreamErrorAsync(Http3ErrorCode.RequestRejected);
// End active request.
@@ -212,6 +243,7 @@ public class Http3ConnectionTests : Http3TestBase
ignoreNonGoAwayFrames: true,
expectedLastStreamId: 0,
expectedErrorCode: Http3ErrorCode.SettingsError,
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
expectedErrorMessage: CoreStrings.FormatHttp3ErrorControlStreamReservedSetting($"0x{settingIdentifier.ToString("X", CultureInfo.InvariantCulture)}"));
}
@@ -230,6 +262,7 @@ public class Http3ConnectionTests : Http3TestBase
ignoreNonGoAwayFrames: true,
expectedLastStreamId: 0,
expectedErrorCode: Http3ErrorCode.StreamCreationError,
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
expectedErrorMessage: CoreStrings.FormatHttp3ControlStreamErrorMultipleInboundStreams(name));
}
@@ -250,44 +283,56 @@ public class Http3ConnectionTests : Http3TestBase
ignoreNonGoAwayFrames: true,
expectedLastStreamId: 0,
expectedErrorCode: Http3ErrorCode.UnexpectedFrame,
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
expectedErrorMessage: CoreStrings.FormatHttp3ErrorUnsupportedFrameOnControlStream(Http3Formatting.ToFormattedType(f)));
}
[Fact]
- public async Task ControlStream_ClientToServer_ClientCloses_ConnectionError()
+ public async Task ControlStream_ClientToServer_Completes_ConnectionError()
{
+ var now = _serviceContext.MockSystemClock.UtcNow;
+
await Http3Api.InitializeConnectionAsync(_noopApplication);
var controlStream = await Http3Api.CreateControlStream(id: 0);
await controlStream.SendSettingsAsync(new List<Http3PeerSetting>());
- await controlStream.EndStreamAsync();
+ await controlStream.EndStreamAsync().DefaultTimeout();
+
+ // Wait for control stream to finish processing and exit.
+ await controlStream.OnStreamCompletedTask.DefaultTimeout();
+
+ Http3Api.TriggerTick(now);
+ Http3Api.TriggerTick(now + TimeSpan.FromSeconds(1));
await Http3Api.WaitForConnectionErrorAsync<Http3ConnectionErrorException>(
ignoreNonGoAwayFrames: true,
expectedLastStreamId: 0,
expectedErrorCode: Http3ErrorCode.ClosedCriticalStream,
- expectedErrorMessage: CoreStrings.Http3ErrorControlStreamClientClosedInbound);
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
+ expectedErrorMessage: CoreStrings.Http3ErrorControlStreamClosed);
}
[Fact]
- public async Task ControlStream_ServerToClient_ErrorInitializing_ConnectionError()
+ public async Task ControlStream_ServerToClient_Closes_ConnectionError()
{
- Http3Api.OnCreateServerControlStream = testStreamContext =>
- {
- var controlStream = new Microsoft.AspNetCore.Testing.Http3ControlStream(Http3Api, testStreamContext);
+ var now = _serviceContext.MockSystemClock.UtcNow;
- // Make server connection error when trying to write to control stream.
- controlStream.StreamContext.Transport.Output.Complete();
+ await Http3Api.InitializeConnectionAsync(_noopApplication);
- return controlStream;
- };
+ var controlStream = await Http3Api.GetInboundControlStream();
- await Http3Api.InitializeConnectionAsync(_noopApplication);
+ controlStream.StreamContext.Close();
+
+ Http3Api.TriggerTick(now);
+ Http3Api.TriggerTick(now + TimeSpan.FromSeconds(1));
- Http3Api.AssertConnectionError<Http3ConnectionErrorException>(
+ await Http3Api.WaitForConnectionErrorAsync<Http3ConnectionErrorException>(
+ ignoreNonGoAwayFrames: true,
+ expectedLastStreamId: 0,
expectedErrorCode: Http3ErrorCode.ClosedCriticalStream,
- expectedErrorMessage: CoreStrings.Http3ControlStreamErrorInitializingOutbound);
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
+ expectedErrorMessage: CoreStrings.Http3ErrorControlStreamClosed);
}
[Fact]
@@ -323,11 +368,11 @@ public class Http3ConnectionTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await Http3Api.InitializeConnectionAsync(_echoApplication);
@@ -342,10 +387,10 @@ public class Http3ConnectionTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json"),
};
@@ -378,22 +423,22 @@ public class Http3ConnectionTests : Http3TestBase
{
const BindingFlags privateFlags = BindingFlags.NonPublic | BindingFlags.Instance;
- KeyValuePair<string, string>[] requestHeaders1 = new[]
+ var requestHeaders1 = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
};
// Note: No content-type
- KeyValuePair<string, string>[] requestHeaders2 = new[]
+ var requestHeaders2 = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80")
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80")
};
await Http3Api.InitializeConnectionAsync(_echoApplication);
@@ -424,11 +469,11 @@ public class Http3ConnectionTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await Http3Api.InitializeConnectionAsync(_echoApplication);
@@ -458,11 +503,11 @@ public class Http3ConnectionTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestDelegate = sendData ? _echoApplication : _noopApplication;
@@ -481,12 +526,12 @@ public class Http3ConnectionTests : Http3TestBase
{
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
+ };
var requestCount = 0;
IHeaderDictionary trailersFirst = null;
@@ -509,8 +554,7 @@ public class Http3ConnectionTests : Http3TestBase
for (int i = 0; i < 3; i++)
{
- var requestStream = await Http3Api.CreateRequestStream();
- await requestStream.SendHeadersAsync(requestHeaders, endStream: true);
+ var requestStream = await Http3Api.CreateRequestStream(requestHeaders, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var data = await requestStream.ExpectTrailersAsync();
@@ -528,11 +572,9 @@ public class Http3ConnectionTests : Http3TestBase
private async Task<ConnectionContext> MakeRequestAsync(int index, KeyValuePair<string, string>[] headers, bool sendData, bool waitForServerDispose)
{
- var requestStream = await Http3Api.CreateRequestStream();
+ var requestStream = await Http3Api.CreateRequestStream(headers, endStream: !sendData);
var streamContext = requestStream.StreamContext;
- await requestStream.SendHeadersAsync(headers, endStream: !sendData);
-
if (sendData)
{
await requestStream.SendDataAsync(Encoding.ASCII.GetBytes($"Hello world {index}"));
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3StreamTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3StreamTests.cs
index a23798ef99..884d3d9a4f 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3StreamTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3StreamTests.cs
@@ -29,19 +29,17 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
-
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
- await requestStream.SendHeadersAsync(headers);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, headers);
await requestStream.SendDataAsync(Encoding.ASCII.GetBytes("Hello world"), endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
var responseData = await requestStream.ExpectDataAsync();
Assert.Equal("Hello world", Encoding.ASCII.GetString(responseData.ToArray()));
@@ -52,22 +50,20 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
context.Response.StatusCode = 401;
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
- Assert.Equal("401", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("401", responseHeaders[InternalHeaderNames.Status]);
await requestStream.ExpectReceiveEndOfStream();
}
@@ -77,14 +73,13 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, ""),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, ""),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
- await requestStream.SendHeadersAsync(headers);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, headers);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
AssertExpectedErrorMessages,
@@ -96,14 +91,13 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Hello,World"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Hello,World"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
- await requestStream.SendHeadersAsync(headers);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, headers);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
AssertExpectedErrorMessages,
@@ -115,20 +109,19 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoMethod);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoMethod, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(4, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("Custom", responseHeaders["Method"]);
Assert.Equal("0", responseHeaders["content-length"]);
}
@@ -138,16 +131,14 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>("test", new string('a', 20000))
- };
-
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>("test", new string('a', 20000))
+ };
- await requestStream.SendHeadersAsync(headers);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, headers);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.InternalError,
@@ -158,37 +149,33 @@ public class Http3StreamTests : Http3TestBase
[Fact]
public async Task ConnectMethod_Accepted()
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoMethod);
-
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "CONNECT") };
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT") };
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoMethod, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
- Assert.Equal(4, responseHeaders.Count);
+ Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("CONNECT", responseHeaders["Method"]);
- Assert.Equal("0", responseHeaders["content-length"]);
}
[Fact]
public async Task OptionsStar_LeftOutOfPath()
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoPath);
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "OPTIONS"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, "*")};
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "OPTIONS"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "*")};
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoPath, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(5, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("", responseHeaders["path"]);
Assert.Equal("*", responseHeaders["rawtarget"]);
Assert.Equal("0", responseHeaders["content-length"]);
@@ -197,19 +184,17 @@ public class Http3StreamTests : Http3TestBase
[Fact]
public async Task OptionsSlash_Accepted()
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoPath);
-
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "OPTIONS"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/")};
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "OPTIONS"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/")};
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoPath, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(5, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("/", responseHeaders["path"]);
Assert.Equal("/", responseHeaders["rawtarget"]);
Assert.Equal("0", responseHeaders["content-length"]);
@@ -218,26 +203,24 @@ public class Http3StreamTests : Http3TestBase
[Fact]
public async Task PathAndQuery_Separated()
{
+ // :path and :scheme are not allowed, :authority is optional
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/a/path?a&que%35ry")};
+
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
context.Response.Headers["path"] = context.Request.Path.Value;
context.Response.Headers["query"] = context.Request.QueryString.Value;
context.Response.Headers["rawtarget"] = context.Features.Get<IHttpRequestFeature>().RawTarget;
return Task.CompletedTask;
- });
-
- // :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/a/path?a&que%35ry")};
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(6, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("/a/path", responseHeaders["path"]);
Assert.Equal("?a&que%35ry", responseHeaders["query"]);
Assert.Equal("/a/path?a&que%35ry", responseHeaders["rawtarget"]);
@@ -255,25 +238,23 @@ public class Http3StreamTests : Http3TestBase
[InlineData("/a/b/c/.%2E/d", "/a/b/d")] // Decode before navigation processing
public async Task Path_DecodedAndNormalized(string input, string expected)
{
+ // :path and :scheme are not allowed, :authority is optional
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, input)};
+
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
Assert.Equal(expected, context.Request.Path.Value);
Assert.Equal(input, context.Features.Get<IHttpRequestFeature>().RawTarget);
return Task.CompletedTask;
- });
-
- // :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Path, input)};
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders["content-length"]);
}
@@ -282,13 +263,11 @@ public class Http3StreamTests : Http3TestBase
[InlineData(":scheme", "http")]
public async Task ConnectMethod_WithSchemeOrPath_Reset(string headerName, string value)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
-
// :path and :scheme are not allowed, :authority is optional
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "CONNECT"),
- new KeyValuePair<string, string>(headerName, value) };
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(headerName, value) };
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -301,13 +280,11 @@ public class Http3StreamTests : Http3TestBase
[InlineData("ftp")]
public async Task SchemeMismatch_Reset(string scheme)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, scheme) }; // Not the expected "http"
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, scheme) }; // Not the expected "http"
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -322,23 +299,21 @@ public class Http3StreamTests : Http3TestBase
{
_serviceContext.ServerOptions.AllowAlternateSchemes = true;
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, scheme) }; // Not the expected "http"
+
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
Assert.Equal(scheme, context.Request.Scheme);
return Task.CompletedTask;
- });
-
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, scheme) }; // Not the expected "http"
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders["content-length"]);
}
@@ -349,13 +324,11 @@ public class Http3StreamTests : Http3TestBase
{
_serviceContext.ServerOptions.AllowAlternateSchemes = true;
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
+ var headers = new[] { new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, scheme) }; // Not the expected "http"
- var headers = new[] { new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, scheme) }; // Not the expected "http"
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -368,20 +341,18 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
-
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders["content-length"]);
}
@@ -390,20 +361,18 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, ""),
- };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, ""),
+ };
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders["content-length"]);
}
@@ -412,20 +381,19 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(4, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
Assert.Equal("abc", responseHeaders[HeaderNames.Host]);
}
@@ -435,21 +403,20 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, ""),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, ""),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(4, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
Assert.Equal("abc", responseHeaders[HeaderNames.Host]);
}
@@ -459,21 +426,20 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "def"),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "def"),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(4, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
Assert.Equal("def", responseHeaders[HeaderNames.Host]);
}
@@ -483,21 +449,20 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "def"),
- new KeyValuePair<string, string>("Host", "a=bc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "def"),
+ new KeyValuePair<string, string>("Host", "a=bc"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoHost, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(4, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
Assert.Equal("def", responseHeaders[HeaderNames.Host]);
}
@@ -507,14 +472,13 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "local=host:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "local=host:80"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -527,15 +491,14 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "d=ef"),
- new KeyValuePair<string, string>("Host", "abc"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "d=ef"),
+ new KeyValuePair<string, string>("Host", "abc"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -548,15 +511,14 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("Host", "host1"),
- new KeyValuePair<string, string>("Host", "host2"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("Host", "host1"),
+ new KeyValuePair<string, string>("Host", "host2"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -572,13 +534,12 @@ public class Http3StreamTests : Http3TestBase
// https://github.com/aspnet/KestrelHttpServer/issues/2872
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET" + new string('a', 1024 * 3)),
- new KeyValuePair<string, string>(HeaderNames.Path, "/Hello/How/Are/You/" + new string('a', 1024 * 3)),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost" + new string('a', 1024 * 3) + ":80"),
- };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET" + new string('a', 1024 * 3)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/Hello/How/Are/You/" + new string('a', 1024 * 3)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost" + new string('a', 1024 * 3) + ":80"),
+ };
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.RequestRejected,
@@ -591,11 +552,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -604,16 +565,14 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(12, read);
read = await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(0, read);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[12], endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
}
@@ -622,11 +581,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -639,9 +598,7 @@ public class Http3StreamTests : Http3TestBase
total += read;
}
Assert.Equal(12, total);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[1], endStream: false);
await requestStream.SendDataAsync(new byte[3], endStream: false);
@@ -651,7 +608,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
}
@@ -660,11 +617,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
var readResult = await context.Request.BodyReader.ReadAsync();
@@ -676,9 +633,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(12, readResult.Buffer.Length);
context.Request.BodyReader.AdvanceTo(readResult.Buffer.End);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[1], endStream: false);
await requestStream.SendDataAsync(new byte[3], endStream: false);
@@ -688,7 +643,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", responseHeaders[HeaderNames.ContentLength]);
}
@@ -697,11 +652,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -714,9 +669,7 @@ public class Http3StreamTests : Http3TestBase
response.Headers.Add(HeaderNames.ProxyConnection, "keep-alive");
await response.WriteAsync("Hello world");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, responseHeaders.Count);
@@ -732,11 +685,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestDelegateCalled = false;
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(c =>
@@ -745,9 +698,7 @@ public class Http3StreamTests : Http3TestBase
// is never called by the server.
requestDelegateCalled = true;
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.ProtocolError,
@@ -764,10 +715,10 @@ public class Http3StreamTests : Http3TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var data = new byte[] { 1, 2, 3, 4, 5, 6 };
@@ -782,9 +733,7 @@ public class Http3StreamTests : Http3TestBase
await Task.Delay(50);
await context.Response.BodyWriter.WriteAsync(new byte[] { data[i] });
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
await requestStream.ExpectHeadersAsync();
headersTcs.SetResult();
@@ -805,12 +754,12 @@ public class Http3StreamTests : Http3TestBase
public async Task FlushPipeAsync_OnStoppedHttp3Stream_ReturnsFlushResultWithIsCompletedTrue()
{
var appTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
- KeyValuePair<string, string>[] requestHeaders = new[]
+ var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
};
@@ -830,8 +779,7 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
- await requestStream.SendHeadersAsync(requestHeaders, endStream: true);
+ }, requestHeaders, endStream: true);
await requestStream.ExpectReceiveEndOfStream();
await appTcs.Task;
@@ -840,12 +788,12 @@ public class Http3StreamTests : Http3TestBase
[Fact]
public async Task FlushPipeAsync_OnCanceledPendingFlush_ReturnsFlushResultWithIsCanceledTrue()
{
- KeyValuePair<string, string>[] requestHeaders = new[]
+ var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/hello"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/hello"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>(HeaderNames.ContentType, "application/json")
};
@@ -859,8 +807,7 @@ public class Http3StreamTests : Http3TestBase
var secondPayload = Encoding.ASCII.GetBytes(" world");
var goodResult = await context.Response.BodyWriter.WriteAsync(secondPayload);
Assert.False(goodResult.IsCanceled);
- });
- await requestStream.SendHeadersAsync(requestHeaders, endStream:true);
+ }, requestHeaders, endStream: true);
await requestStream.ExpectHeadersAsync();
var response = await requestStream.ExpectDataAsync();
@@ -877,11 +824,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
@@ -891,9 +838,7 @@ public class Http3StreamTests : Http3TestBase
trailersFeature.Trailers.Add("Trailer2", "Value2");
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
@@ -909,11 +854,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -924,9 +869,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Throws<InvalidOperationException>(() => context.Response.Headers.Append("CustomName", "Custom 你好 Value"));
Assert.Throws<InvalidOperationException>(() => context.Response.Headers.Append("CustomName", "Custom \r Value"));
await context.Response.WriteAsync("Hello World");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var responseData = await requestStream.ExpectDataAsync();
@@ -934,7 +877,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(2, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
}
[Fact]
@@ -942,11 +885,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
_serviceContext.ServerOptions.ResponseHeaderEncodingSelector = _ => Encoding.UTF8;
_serviceContext.ServerOptions.RequestHeaderEncodingSelector = _ => Encoding.UTF8; // Used for decoding response.
@@ -960,9 +903,7 @@ public class Http3StreamTests : Http3TestBase
context.Response.ContentType = "Custom 你好 Type";
context.Response.Headers.Append("CustomName", "Custom 你好 Value");
await context.Response.WriteAsync("Hello World");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var responseData = await requestStream.ExpectDataAsync();
@@ -970,7 +911,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(4, responseHeaders.Count);
Assert.Contains("date", responseHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
Assert.Equal("Custom 你好 Type", responseHeaders[HeaderNames.ContentType]);
Assert.Equal("Custom 你好 Value", responseHeaders["CustomName"]);
}
@@ -980,11 +921,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var encoding = Encoding.GetEncoding(Encoding.Latin1.CodePage, EncoderFallback.ExceptionFallback,
DecoderFallback.ExceptionFallback);
@@ -994,9 +935,7 @@ public class Http3StreamTests : Http3TestBase
{
context.Response.Headers.Append("CustomName", "Custom 你好 Value");
await context.Response.WriteAsync("Hello World");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.InternalError,
@@ -1009,11 +948,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -1023,9 +962,7 @@ public class Http3StreamTests : Http3TestBase
trailersFeature.Trailers.Add("Trailer2", "Value2");
await context.Response.WriteAsync("Hello world");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var responseData = await requestStream.ExpectDataAsync();
@@ -1043,11 +980,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
@@ -1057,9 +994,7 @@ public class Http3StreamTests : Http3TestBase
trailersFeature.Trailers.Add("Trailer2", "Value2");
throw new NotImplementedException("Test Exception");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
@@ -1071,11 +1006,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -1086,9 +1021,7 @@ public class Http3StreamTests : Http3TestBase
// ETag is one of the few special cased trailers. Accept is not.
Assert.Throws<InvalidOperationException>(() => context.Features.Get<IHttpResponseTrailersFeature>().Trailers.ETag = "Custom 你好 Tag");
Assert.Throws<InvalidOperationException>(() => context.Features.Get<IHttpResponseTrailersFeature>().Trailers.Accept = "Custom 你好 Tag");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var responseData = await requestStream.ExpectDataAsync();
@@ -1101,11 +1034,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
_serviceContext.ServerOptions.ResponseHeaderEncodingSelector = _ => Encoding.UTF8;
_serviceContext.ServerOptions.RequestHeaderEncodingSelector = _ => Encoding.UTF8; // Used for decoding response.
@@ -1119,9 +1052,7 @@ public class Http3StreamTests : Http3TestBase
// ETag is one of the few special cased trailers. Accept is not.
context.Features.Get<IHttpResponseTrailersFeature>().Trailers.ETag = "Custom 你好 Tag";
context.Features.Get<IHttpResponseTrailersFeature>().Trailers.Accept = "Custom 你好 Accept";
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var responseData = await requestStream.ExpectDataAsync();
@@ -1141,11 +1072,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var encoding = Encoding.GetEncoding(Encoding.Latin1.CodePage, EncoderFallback.ExceptionFallback,
DecoderFallback.ExceptionFallback);
@@ -1155,9 +1086,7 @@ public class Http3StreamTests : Http3TestBase
{
await context.Response.WriteAsync("Hello World");
context.Response.AppendTrailer("CustomName", "Custom 你好 Value");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var responseHeaders = await requestStream.ExpectHeadersAsync();
var responseData = await requestStream.ExpectDataAsync();
@@ -1174,11 +1103,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
{
@@ -1187,9 +1116,7 @@ public class Http3StreamTests : Http3TestBase
resetFeature.Reset((int)Http3ErrorCode.RequestCancelled);
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.RequestCancelled,
@@ -1205,10 +1132,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -1229,9 +1156,7 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
@@ -1240,7 +1165,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", decodedHeaders["content-length"]);
await requestStream.ExpectReceiveEndOfStream();
@@ -1254,10 +1179,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1280,9 +1205,7 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
var decodedTrailers = await requestStream.ExpectHeadersAsync();
@@ -1294,7 +1217,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", decodedHeaders["content-length"]);
Assert.Single(decodedTrailers);
@@ -1308,10 +1231,10 @@ public class Http3StreamTests : Http3TestBase
var appTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1334,9 +1257,7 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
@@ -1346,7 +1267,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("500", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("500", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", decodedHeaders[HeaderNames.ContentLength]);
}
@@ -1358,10 +1279,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1385,15 +1306,13 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
@@ -1413,10 +1332,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1439,15 +1358,13 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", decodedHeaders[HeaderNames.ContentLength]);
clientTcs.SetResult();
@@ -1464,10 +1381,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1493,15 +1410,13 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -1518,10 +1433,10 @@ public class Http3StreamTests : Http3TestBase
var tcs = new TaskCompletionSource();
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
var memory = context.Response.BodyWriter.GetMemory(12);
@@ -1537,15 +1452,13 @@ public class Http3StreamTests : Http3TestBase
}
Assert.True(false);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", decodedHeaders["content-length"]);
await tcs.Task.DefaultTimeout();
@@ -1561,10 +1474,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1594,14 +1507,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -1623,10 +1534,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1651,14 +1562,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -1680,10 +1589,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1710,14 +1619,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("25", decodedHeaders[HeaderNames.ContentLength]);
var data = await requestStream.ExpectDataAsync();
@@ -1739,10 +1646,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -1770,14 +1677,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(3, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
Assert.Equal("25", decodedHeaders[HeaderNames.ContentLength]);
var data = await requestStream.ExpectDataAsync();
@@ -1799,10 +1704,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1831,14 +1736,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -1860,10 +1763,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1897,14 +1800,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -1926,10 +1827,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -1960,14 +1861,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ }, headers, endStream: true);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -1991,10 +1890,10 @@ public class Http3StreamTests : Http3TestBase
var clientTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
try
@@ -2030,14 +1929,12 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
Assert.Contains("date", decodedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
Assert.Equal("Hello World", Encoding.UTF8.GetString(data.Span));
@@ -2053,10 +1950,16 @@ public class Http3StreamTests : Http3TestBase
await appTcs.Task;
}
- [Fact]
- public async Task DataBeforeHeaders_UnexpectedFrameError()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task DataBeforeHeaders_UnexpectedFrameError(bool pendingStreamsEnabled)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = pendingStreamsEnabled;
+
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, null);
+
+ await (pendingStreamsEnabled ? requestStream.OnUnidentifiedStreamCreatedTask : requestStream.OnStreamCreatedTask);
await requestStream.SendDataAsync(Encoding.UTF8.GetBytes("This is invalid."));
@@ -2072,10 +1975,10 @@ public class Http3StreamTests : Http3TestBase
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var trailers = new[]
{
new KeyValuePair<string, string>("TestName", "TestValue"),
@@ -2085,9 +1988,7 @@ public class Http3StreamTests : Http3TestBase
await c.Request.Body.DrainAsync(default);
testValue = c.Request.GetTrailer("TestName");
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(Encoding.UTF8.GetBytes("Hello world"));
await requestStream.SendHeadersAsync(trailers, endStream: true);
@@ -2103,10 +2004,10 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var trailers = new[]
{
new KeyValuePair<string, string>("TestName", "TestValue"),
@@ -2118,9 +2019,7 @@ public class Http3StreamTests : Http3TestBase
await c.Response.Body.FlushAsync();
await tcs.Task;
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.ExpectHeadersAsync();
@@ -2142,10 +2041,10 @@ public class Http3StreamTests : Http3TestBase
var syncPoint = new SyncPoint();
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var trailers = new[]
{
new KeyValuePair<string, string>("TestName", "TestValue"),
@@ -2166,9 +2065,7 @@ public class Http3StreamTests : Http3TestBase
readTrailersTcs.TrySetException(ex);
throw;
}
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(Encoding.UTF8.GetBytes("Hello world"));
await requestStream.SendHeadersAsync(trailers, endStream: false);
@@ -2181,13 +2078,21 @@ public class Http3StreamTests : Http3TestBase
}
[Theory]
- [InlineData(nameof(Http3FrameType.MaxPushId))]
- [InlineData(nameof(Http3FrameType.Settings))]
- [InlineData(nameof(Http3FrameType.CancelPush))]
- [InlineData(nameof(Http3FrameType.GoAway))]
- public async Task UnexpectedRequestFrame(string frameType)
+ [InlineData(nameof(Http3FrameType.MaxPushId), true)]
+ [InlineData(nameof(Http3FrameType.Settings), true)]
+ [InlineData(nameof(Http3FrameType.CancelPush), true)]
+ [InlineData(nameof(Http3FrameType.GoAway), true)]
+ [InlineData(nameof(Http3FrameType.MaxPushId), false)]
+ [InlineData(nameof(Http3FrameType.Settings), false)]
+ [InlineData(nameof(Http3FrameType.CancelPush), false)]
+ [InlineData(nameof(Http3FrameType.GoAway), false)]
+ public async Task UnexpectedRequestFrame(string frameType, bool pendingStreamsEnabled)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = pendingStreamsEnabled;
+
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, null);
+
+ await (pendingStreamsEnabled ? requestStream.OnUnidentifiedStreamCreatedTask : requestStream.OnStreamCreatedTask);
var f = Enum.Parse<Http3FrameType>(frameType);
await requestStream.SendFrameAsync(f, Memory<byte>.Empty);
@@ -2200,6 +2105,7 @@ public class Http3StreamTests : Http3TestBase
ignoreNonGoAwayFrames: true,
expectedLastStreamId: 4,
expectedErrorCode: Http3ErrorCode.UnexpectedFrame,
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
expectedErrorMessage: CoreStrings.FormatHttp3ErrorUnsupportedFrameOnRequestStream(Http3Formatting.ToFormattedType(f)));
}
@@ -2207,7 +2113,16 @@ public class Http3StreamTests : Http3TestBase
[InlineData(nameof(Http3FrameType.PushPromise))]
public async Task UnexpectedServerFrame(string frameType)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
+ var headers = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
+
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, headers);
+
+ await requestStream.OnStreamCreatedTask;
var f = Enum.Parse<Http3FrameType>(frameType);
await requestStream.SendFrameAsync(f, Memory<byte>.Empty);
@@ -2220,7 +2135,7 @@ public class Http3StreamTests : Http3TestBase
[Fact]
public async Task RequestIncomplete()
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_echoApplication, null);
await requestStream.EndStreamAsync();
@@ -2234,11 +2149,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(":unknown", "0"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(":unknown", "0"),
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, expectedErrorMessage: CoreStrings.HttpErrorUnknownPseudoHeaderField);
}
@@ -2248,11 +2163,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Status, "200"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Status, "200"),
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, expectedErrorMessage: CoreStrings.HttpErrorResponsePseudoHeaderField);
}
@@ -2264,11 +2179,11 @@ public class Http3StreamTests : Http3TestBase
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
foreach (var headerField in requestHeaders)
{
@@ -2285,7 +2200,7 @@ public class Http3StreamTests : Http3TestBase
get
{
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
- var methodHeader = new KeyValuePair<string, string>(HeaderNames.Method, "CONNECT");
+ var methodHeader = new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT");
var headers = new[] { methodHeader };
data.Add(headers);
@@ -2300,12 +2215,12 @@ public class Http3StreamTests : Http3TestBase
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("content-length", "0")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("content-length", "0")
+ };
foreach (var headerField in requestHeaders.Where(h => h.Key.StartsWith(':')))
{
@@ -2324,10 +2239,10 @@ public class Http3StreamTests : Http3TestBase
var data = new TheoryData<IEnumerable<KeyValuePair<string, string>>>();
var requestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
foreach (var headerField in requestHeaders)
{
@@ -2350,9 +2265,7 @@ public class Http3StreamTests : Http3TestBase
[MemberData(nameof(ConnectMissingPseudoHeaderFieldData))]
public async Task HEADERS_Received_HeaderBlockDoesNotContainMandatoryPseudoHeaderField_MethodIsCONNECT_NoError(IEnumerable<KeyValuePair<string, string>> headers)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.ExpectHeadersAsync();
@@ -2368,8 +2281,7 @@ public class Http3StreamTests : Http3TestBase
private async Task HEADERS_Received_InvalidHeaderFields_StreamError(IEnumerable<KeyValuePair<string, string>> headers, string expectedErrorMessage, Http3ErrorCode? errorCode = null)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
errorCode ?? Http3ErrorCode.MessageError,
@@ -2381,9 +2293,7 @@ public class Http3StreamTests : Http3TestBase
[MemberData(nameof(MissingPseudoHeaderFieldData))]
public async Task HEADERS_Received_HeaderBlockDoesNotContainMandatoryPseudoHeaderField_StreamError(IEnumerable<KeyValuePair<string, string>> headers)
{
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
-
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.MessageError,
expectedErrorMessage: CoreStrings.HttpErrorMissingMandatoryPseudoHeaderFields);
@@ -2395,18 +2305,18 @@ public class Http3StreamTests : Http3TestBase
// > 32kb
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("a", _4kHeaderValue),
- new KeyValuePair<string, string>("b", _4kHeaderValue),
- new KeyValuePair<string, string>("c", _4kHeaderValue),
- new KeyValuePair<string, string>("d", _4kHeaderValue),
- new KeyValuePair<string, string>("e", _4kHeaderValue),
- new KeyValuePair<string, string>("f", _4kHeaderValue),
- new KeyValuePair<string, string>("g", _4kHeaderValue),
- new KeyValuePair<string, string>("h", _4kHeaderValue),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("a", _4kHeaderValue),
+ new KeyValuePair<string, string>("b", _4kHeaderValue),
+ new KeyValuePair<string, string>("c", _4kHeaderValue),
+ new KeyValuePair<string, string>("d", _4kHeaderValue),
+ new KeyValuePair<string, string>("e", _4kHeaderValue),
+ new KeyValuePair<string, string>("f", _4kHeaderValue),
+ new KeyValuePair<string, string>("g", _4kHeaderValue),
+ new KeyValuePair<string, string>("h", _4kHeaderValue),
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, CoreStrings.BadRequest_HeadersExceedMaxTotalSize, Http3ErrorCode.RequestRejected);
}
@@ -2418,10 +2328,10 @@ public class Http3StreamTests : Http3TestBase
var headers = new List<KeyValuePair<string, string>>();
headers.AddRange(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- });
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ });
for (var i = 0; i < 100; i++)
{
headers.Add(new KeyValuePair<string, string>(i.ToString(CultureInfo.InvariantCulture), i.ToString(CultureInfo.InvariantCulture)));
@@ -2435,11 +2345,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("Custom", "val\0ue"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("Custom", "val\0ue"),
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, CoreStrings.BadRequest_MalformedRequestInvalidHeaders);
}
@@ -2449,11 +2359,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("connection", "keep-alive")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("connection", "keep-alive")
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, CoreStrings.HttpErrorConnectionSpecificHeaderField);
}
@@ -2463,11 +2373,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("te", "trailers, deflate")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("te", "trailers, deflate")
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, CoreStrings.HttpErrorConnectionSpecificHeaderField);
}
@@ -2477,15 +2387,13 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>("te", "trailers")
- };
-
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication);
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>("te", "trailers")
+ };
- await requestStream.SendHeadersAsync(headers, endStream: true);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, headers, endStream: true);
await requestStream.ExpectHeadersAsync();
@@ -2498,11 +2406,11 @@ public class Http3StreamTests : Http3TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 15;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
var buffer = new byte[100];
@@ -2510,9 +2418,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(12, read);
read = await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(0, read);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[12], endStream: true);
var receivedHeaders = await requestStream.ExpectHeadersAsync();
@@ -2521,7 +2427,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, receivedHeaders.Count);
Assert.Contains("date", receivedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", receivedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", receivedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", receivedHeaders[HeaderNames.ContentLength]);
}
@@ -2534,11 +2440,11 @@ public class Http3StreamTests : Http3TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 10;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
#pragma warning disable CS0618 // Type or member is obsolete
@@ -2549,9 +2455,7 @@ public class Http3StreamTests : Http3TestBase
while (await context.Request.Body.ReadAsync(buffer, 0, buffer.Length) > 0) { }
});
ExceptionDispatchInfo.Capture(exception).Throw();
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
var receivedHeaders = await requestStream.ExpectHeadersAsync();
@@ -2564,7 +2468,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, receivedHeaders.Count);
Assert.Contains("date", receivedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("413", receivedHeaders[HeaderNames.Status]);
+ Assert.Equal("413", receivedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", receivedHeaders[HeaderNames.ContentLength]);
Assert.NotNull(exception);
@@ -2576,10 +2480,10 @@ public class Http3StreamTests : Http3TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 15;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
var buffer = new byte[100];
@@ -2587,9 +2491,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(12, read);
read = await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(0, read);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[12], endStream: true);
var receivedHeaders = await requestStream.ExpectHeadersAsync();
@@ -2598,7 +2500,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, receivedHeaders.Count);
Assert.Contains("date", receivedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", receivedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", receivedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", receivedHeaders[HeaderNames.ContentLength]);
}
@@ -2611,10 +2513,10 @@ public class Http3StreamTests : Http3TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 10;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
#pragma warning disable CS0618 // Type or member is obsolete
@@ -2625,9 +2527,7 @@ public class Http3StreamTests : Http3TestBase
while (await context.Request.Body.ReadAsync(buffer, 0, buffer.Length) > 0) { }
});
ExceptionDispatchInfo.Capture(exception).Throw();
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[6], endStream: false);
await requestStream.SendDataAsync(new byte[6], endStream: false);
@@ -2640,7 +2540,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, receivedHeaders.Count);
Assert.Contains("date", receivedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("413", receivedHeaders[HeaderNames.Status]);
+ Assert.Equal("413", receivedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", receivedHeaders[HeaderNames.ContentLength]);
Assert.NotNull(exception);
@@ -2657,10 +2557,10 @@ public class Http3StreamTests : Http3TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 20;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
if (includeContentLength)
{
headers.Concat(new[]
@@ -2681,9 +2581,7 @@ public class Http3StreamTests : Http3TestBase
});
Assert.True(context.Features.Get<IHttpMaxRequestBodySizeFeature>().IsReadOnly);
ExceptionDispatchInfo.Capture(exception).Throw();
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[6], endStream: false);
await requestStream.SendDataAsync(new byte[6], endStream: false);
await requestStream.SendDataAsync(new byte[6], endStream: false);
@@ -2697,7 +2595,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, receivedHeaders.Count);
Assert.Contains("date", receivedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("413", receivedHeaders[HeaderNames.Status]);
+ Assert.Equal("413", receivedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", receivedHeaders[HeaderNames.ContentLength]);
Assert.NotNull(exception);
@@ -2711,16 +2609,16 @@ public class Http3StreamTests : Http3TestBase
_serviceContext.ServerOptions.Limits.MaxRequestBodySize = 10;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
if (includeContentLength)
{
headers.Concat(new[]
{
- new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
- });
+ new KeyValuePair<string, string>(HeaderNames.ContentLength, "12"),
+ });
}
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
@@ -2732,9 +2630,7 @@ public class Http3StreamTests : Http3TestBase
Assert.True(context.Features.Get<IHttpMaxRequestBodySizeFeature>().IsReadOnly);
read = await context.Request.Body.ReadAsync(buffer, 0, buffer.Length);
Assert.Equal(0, read);
- });
-
- await requestStream.SendHeadersAsync(headers, endStream: false);
+ }, headers, endStream: false);
await requestStream.SendDataAsync(new byte[12], endStream: true);
var receivedHeaders = await requestStream.ExpectHeadersAsync();
@@ -2743,7 +2639,7 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(3, receivedHeaders.Count);
Assert.Contains("date", receivedHeaders.Keys, StringComparer.OrdinalIgnoreCase);
- Assert.Equal("200", receivedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", receivedHeaders[InternalHeaderNames.Status]);
Assert.Equal("0", receivedHeaders[HeaderNames.ContentLength]);
}
@@ -2752,10 +2648,10 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, new string('A', 8192 / 2)),
- new KeyValuePair<string, string>(HeaderNames.Path, "/" + new string('A', 8192 / 2)),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http")
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, new string('A', 8192 / 2)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/" + new string('A', 8192 / 2)),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http")
+ };
return HEADERS_Received_InvalidHeaderFields_StreamError(headers, CoreStrings.BadRequest_RequestLineTooLong, Http3ErrorCode.RequestRejected);
}
@@ -2782,14 +2678,13 @@ public class Http3StreamTests : Http3TestBase
CoreStrings.FormatHttp3ControlStreamErrorUnsupportedType(typeId)).DefaultTimeout();
// Connection is still alive and available for requests
- var requestStream = await Http3Api.CreateRequestStream().DefaultTimeout();
- await requestStream.SendHeadersAsync(new[]
+ var requestStream = await Http3Api.CreateRequestStream(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- }, endStream: true);
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ }, endStream: true).DefaultTimeout();
await requestStream.ExpectHeadersAsync().DefaultTimeout();
await requestStream.ExpectReceiveEndOfStream().DefaultTimeout();
@@ -2815,14 +2710,13 @@ public class Http3StreamTests : Http3TestBase
Assert.Equal(Core.Internal.Http3.Http3SettingType.MaxFieldSectionSize, maxFieldSetting.Key);
Assert.Equal(100, maxFieldSetting.Value);
- var requestStream = await Http3Api.CreateRequestStream().DefaultTimeout();
- await requestStream.SendHeadersAsync(new[]
+ var requestStream = await Http3Api.CreateRequestStream(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- }, endStream: true);
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ }, endStream: true).DefaultTimeout();
await requestStream.WaitForStreamErrorAsync(
Http3ErrorCode.InternalError,
@@ -2857,6 +2751,11 @@ public class Http3StreamTests : Http3TestBase
{
appTcs.SetException(ex);
}
+ }, new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
});
var sourceData = new byte[1024];
@@ -2865,17 +2764,10 @@ public class Http3StreamTests : Http3TestBase
sourceData[i] = (byte)(i % byte.MaxValue);
}
- await requestStream.SendHeadersAsync(new[]
- {
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- });
-
await requestStream.SendDataAsync(sourceData);
var decodedHeaders = await requestStream.ExpectHeadersAsync();
Assert.Equal(2, decodedHeaders.Count);
- Assert.Equal("200", decodedHeaders[HeaderNames.Status]);
+ Assert.Equal("200", decodedHeaders[InternalHeaderNames.Status]);
var data = await requestStream.ExpectDataAsync();
@@ -2897,11 +2789,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var headerText = string.Create(6 * 1024, new object(), (chars, state) =>
{
@@ -2919,12 +2811,10 @@ public class Http3StreamTests : Http3TestBase
}
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers);
+ }, headers);
var responseHeaders = await requestStream.ExpectHeadersAsync();
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
for (var i = 0; i < 10; i++)
{
@@ -2939,11 +2829,11 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var headerText = string.Create(6 * 1024, new object(), (chars, state) =>
{
@@ -2961,12 +2851,10 @@ public class Http3StreamTests : Http3TestBase
}
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers);
+ }, headers);
var responseHeaders = await requestStream.ExpectHeadersAsync();
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
var responseTrailers = await requestStream.ExpectHeadersAsync();
for (var i = 0; i < 10; i++)
@@ -2982,21 +2870,19 @@ public class Http3StreamTests : Http3TestBase
{
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(c =>
{
return Task.CompletedTask;
- });
-
- await requestStream.SendHeadersAsync(headers);
+ }, headers);
var responseHeaders = await requestStream.ExpectHeadersAsync(expectEnd: true);
- Assert.Equal("200", responseHeaders[HeaderNames.Status]);
+ Assert.Equal("200", responseHeaders[InternalHeaderNames.Status]);
}
[Theory]
@@ -3008,10 +2894,10 @@ public class Http3StreamTests : Http3TestBase
var tcs = new TaskCompletionSource();
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(async context =>
{
context.Abort();
@@ -3021,6 +2907,6 @@ public class Http3StreamTests : Http3TestBase
Assert.True(memory.Length >= sizeHint);
await context.Response.CompleteAsync();
context.Response.BodyWriter.Advance(memory.Length);
- });
+ }, headers);
}
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TestBase.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TestBase.cs
index 96992fde28..dc28eafb46 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TestBase.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TestBase.cs
@@ -28,7 +28,6 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Primitives;
-using Microsoft.Net.Http.Headers;
using Moq;
using Xunit;
using Xunit.Abstractions;
@@ -58,24 +57,24 @@ public abstract class Http3TestBase : TestApplicationErrorLoggerLoggedTest, IDis
protected static readonly IEnumerable<KeyValuePair<string, string>> _browserRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
- new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
- new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
- new KeyValuePair<string, string>("accept-encoding", "gzip, deflate, br"),
- new KeyValuePair<string, string>("upgrade-insecure-requests", "1"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
+ new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
+ new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
+ new KeyValuePair<string, string>("accept-encoding", "gzip, deflate, br"),
+ new KeyValuePair<string, string>("upgrade-insecure-requests", "1"),
+ };
protected static IEnumerable<KeyValuePair<string, string>> ReadRateRequestHeaders(int expectedBytes) => new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/" + expectedBytes),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/" + expectedBytes),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
public Http3TestBase()
{
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TimeoutTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TimeoutTests.cs
index 727f295025..fb741c527c 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TimeoutTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/Http3TimeoutTests.cs
@@ -1,11 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
-using System.Linq;
using System.Net.Http;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
@@ -13,30 +9,132 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
-using Microsoft.Net.Http.Headers;
using Moq;
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
public class Http3TimeoutTests : Http3TestBase
{
[Fact]
+ public async Task KeepAliveTimeout_ControlStreamNotReceived_ConnectionClosed()
+ {
+ var limits = _serviceContext.ServerOptions.Limits;
+
+ await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
+
+ var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
+ await controlStream.ExpectSettingsAsync().DefaultTimeout();
+
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout + TimeSpan.FromTicks(1));
+
+ await Http3Api.WaitForConnectionStopAsync(0, false, expectedErrorCode: Http3ErrorCode.NoError);
+ }
+
+ [Fact]
+ public async Task KeepAliveTimeout_RequestNotReceived_ConnectionClosed()
+ {
+ var limits = _serviceContext.ServerOptions.Limits;
+
+ await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
+ await Http3Api.CreateControlStream();
+
+ var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
+ await controlStream.ExpectSettingsAsync().DefaultTimeout();
+
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout + TimeSpan.FromTicks(1));
+
+ await Http3Api.WaitForConnectionStopAsync(0, false, expectedErrorCode: Http3ErrorCode.NoError);
+ }
+
+ [Fact]
+ public async Task KeepAliveTimeout_AfterRequestComplete_ConnectionClosed()
+ {
+ var requestHeaders = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
+
+ var limits = _serviceContext.ServerOptions.Limits;
+
+ await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
+
+ await Http3Api.CreateControlStream();
+ var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
+ await controlStream.ExpectSettingsAsync().DefaultTimeout();
+ var requestStream = await Http3Api.CreateRequestStream(requestHeaders, endStream: true);
+ await requestStream.ExpectHeadersAsync();
+
+ await requestStream.ExpectReceiveEndOfStream();
+ await requestStream.OnDisposedTask.DefaultTimeout();
+
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout + Heartbeat.Interval + TimeSpan.FromTicks(1));
+
+ await Http3Api.WaitForConnectionStopAsync(4, false, expectedErrorCode: Http3ErrorCode.NoError);
+ }
+
+ [Fact]
+ public async Task KeepAliveTimeout_LongRunningRequest_KeepsConnectionAlive()
+ {
+ var requestHeaders = new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ };
+
+ var limits = _serviceContext.ServerOptions.Limits;
+ var requestReceivedTcs = new TaskCompletionSource();
+ var requestFinishedTcs = new TaskCompletionSource();
+
+ await Http3Api.InitializeConnectionAsync(_ =>
+ {
+ requestReceivedTcs.SetResult();
+ return requestFinishedTcs.Task;
+ }).DefaultTimeout();
+
+ await Http3Api.CreateControlStream();
+ var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
+ await controlStream.ExpectSettingsAsync().DefaultTimeout();
+ var requestStream = await Http3Api.CreateRequestStream(requestHeaders, endStream: true);
+
+ await requestReceivedTcs.Task;
+
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout);
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout);
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout);
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout);
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout);
+
+ requestFinishedTcs.SetResult();
+
+ await requestStream.ExpectHeadersAsync();
+
+ await requestStream.ExpectReceiveEndOfStream();
+ await requestStream.OnDisposedTask.DefaultTimeout();
+
+ Http3Api.AdvanceClock(limits.KeepAliveTimeout + Heartbeat.Interval + TimeSpan.FromTicks(1));
+
+ await Http3Api.WaitForConnectionStopAsync(4, false, expectedErrorCode: Http3ErrorCode.NoError);
+ }
+
+ [Fact]
public async Task HEADERS_IncompleteFrameReceivedWithinRequestHeadersTimeout_StreamError()
{
var now = _serviceContext.MockSystemClock.UtcNow;
var limits = _serviceContext.ServerOptions.Limits;
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication).DefaultTimeout();
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, null).DefaultTimeout();
var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
await controlStream.ExpectSettingsAsync().DefaultTimeout();
- await requestStream.OnStreamCreatedTask.DefaultTimeout();
+ await requestStream.SendHeadersPartialAsync().DefaultTimeout();
- var serverRequestStream = Http3Api.Connection._streams[requestStream.StreamId];
+ await requestStream.OnStreamCreatedTask;
- await requestStream.SendHeadersPartialAsync().DefaultTimeout();
+ var serverRequestStream = Http3Api.Connection._streams[requestStream.StreamId];
Http3Api.TriggerTick(now);
Http3Api.TriggerTick(now + limits.RequestHeadersTimeout);
@@ -51,27 +149,42 @@ public class Http3TimeoutTests : Http3TestBase
CoreStrings.BadRequest_RequestHeadersTimeout);
}
- [Fact]
- public async Task HEADERS_HeaderFrameReceivedWithinRequestHeadersTimeout_Success()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task HEADERS_HeaderFrameReceivedWithinRequestHeadersTimeout_Success(bool pendingStreamsEnabled)
{
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = pendingStreamsEnabled;
+
var now = _serviceContext.MockSystemClock.UtcNow;
var limits = _serviceContext.ServerOptions.Limits;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication).DefaultTimeout();
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_noopApplication, null).DefaultTimeout();
var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
await controlStream.ExpectSettingsAsync().DefaultTimeout();
- await requestStream.OnStreamCreatedTask.DefaultTimeout();
+ dynamic serverRequestStream;
- var serverRequestStream = Http3Api.Connection._streams[requestStream.StreamId];
+ if (pendingStreamsEnabled)
+ {
+ await requestStream.OnUnidentifiedStreamCreatedTask.DefaultTimeout();
+
+ serverRequestStream = Http3Api.Connection._unidentifiedStreams[requestStream.StreamId];
+ }
+ else
+ {
+ await requestStream.OnStreamCreatedTask.DefaultTimeout();
+
+ serverRequestStream = Http3Api.Connection._streams[requestStream.StreamId];
+ }
Http3Api.TriggerTick(now);
Http3Api.TriggerTick(now + limits.RequestHeadersTimeout);
@@ -92,17 +205,45 @@ public class Http3TimeoutTests : Http3TestBase
}
[Fact]
+ public async Task ControlStream_HeaderNotReceivedWithinRequestHeadersTimeout_StreamError_PendingStreamsEnabled()
+ {
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = true;
+
+ var now = _serviceContext.MockSystemClock.UtcNow;
+ var limits = _serviceContext.ServerOptions.Limits;
+
+ await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
+
+ var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
+ await controlStream.ExpectSettingsAsync().DefaultTimeout();
+
+ var outboundControlStream = await Http3Api.CreateControlStream(id: null);
+
+ await outboundControlStream.OnUnidentifiedStreamCreatedTask.DefaultTimeout();
+ var serverInboundControlStream = Http3Api.Connection._unidentifiedStreams[outboundControlStream.StreamId];
+
+ Http3Api.TriggerTick(now);
+ Http3Api.TriggerTick(now + limits.RequestHeadersTimeout);
+
+ Assert.Equal((now + limits.RequestHeadersTimeout).Ticks, serverInboundControlStream.StreamTimeoutTicks);
+
+ Http3Api.TriggerTick(now + limits.RequestHeadersTimeout + TimeSpan.FromTicks(1));
+ }
+
+ [Fact]
public async Task ControlStream_HeaderNotReceivedWithinRequestHeadersTimeout_StreamError()
{
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = false;
+
var now = _serviceContext.MockSystemClock.UtcNow;
var limits = _serviceContext.ServerOptions.Limits;
var headers = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "Custom"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ };
await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
@@ -133,48 +274,33 @@ public class Http3TimeoutTests : Http3TestBase
{
var now = _serviceContext.MockSystemClock.UtcNow;
var limits = _serviceContext.ServerOptions.Limits;
- var headers = new[]
- {
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
await controlStream.ExpectSettingsAsync().DefaultTimeout();
- var outboundControlStream = await Http3Api.CreateControlStream(id: null);
-
- await outboundControlStream.OnStreamCreatedTask.DefaultTimeout();
-
Http3Api.TriggerTick(now);
- Http3Api.TriggerTick(now + limits.RequestHeadersTimeout);
+ Http3Api.TriggerTick(now + limits.RequestHeadersTimeout + TimeSpan.FromTicks(1));
- await outboundControlStream.WriteStreamIdAsync(id: 0);
+ var outboundControlStream = await Http3Api.CreateControlStream(id: 0);
- await outboundControlStream.OnHeaderReceivedTask.DefaultTimeout();
+ await outboundControlStream.OnStreamCreatedTask.DefaultTimeout();
Http3Api.TriggerTick(now + limits.RequestHeadersTimeout + TimeSpan.FromTicks(1));
}
- [Fact]
- public async Task ControlStream_RequestHeadersTimeoutMaxValue_ExpirationIsMaxValue()
+ [Theory]
+ [InlineData(true)]
+ [InlineData(false)]
+ public async Task ControlStream_RequestHeadersTimeoutMaxValue_ExpirationIsMaxValue(bool pendingStreamEnabled)
{
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = pendingStreamEnabled;
+
var now = _serviceContext.MockSystemClock.UtcNow;
var limits = _serviceContext.ServerOptions.Limits;
limits.RequestHeadersTimeout = TimeSpan.MaxValue;
- var headers = new[]
- {
- new KeyValuePair<string, string>(HeaderNames.Method, "Custom"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- };
-
await Http3Api.InitializeConnectionAsync(_noopApplication).DefaultTimeout();
var controlStream = await Http3Api.GetInboundControlStream().DefaultTimeout();
@@ -182,9 +308,17 @@ public class Http3TimeoutTests : Http3TestBase
var outboundControlStream = await Http3Api.CreateControlStream(id: null);
- await outboundControlStream.OnStreamCreatedTask.DefaultTimeout();
-
- var serverInboundControlStream = Http3Api.Connection._streams[outboundControlStream.StreamId];
+ dynamic serverInboundControlStream;
+ if (pendingStreamEnabled)
+ {
+ await outboundControlStream.OnUnidentifiedStreamCreatedTask.DefaultTimeout();
+ serverInboundControlStream = Http3Api.Connection._unidentifiedStreams[outboundControlStream.StreamId];
+ }
+ else
+ {
+ await outboundControlStream.OnStreamCreatedTask.DefaultTimeout();
+ serverInboundControlStream = Http3Api.Connection._streams[outboundControlStream.StreamId];
+ }
Http3Api.TriggerTick(now);
@@ -202,13 +336,13 @@ public class Http3TimeoutTests : Http3TestBase
Http3Api._timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_readRateApplication);
+ await Http3Api.InitializeConnectionAsync(_readRateApplication);
var inboundControlStream = await Http3Api.GetInboundControlStream();
await inboundControlStream.ExpectSettingsAsync();
// _helloWorldBytes is 12 bytes, and 12 bytes / 240 bytes/sec = .05 secs which is far below the grace period.
- await requestStream.SendHeadersAsync(ReadRateRequestHeaders(_helloWorldBytes.Length), endStream: false);
+ var requestStream = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_helloWorldBytes.Length), endStream: false);
await requestStream.SendDataAsync(_helloWorldBytes, endStream: false);
await requestStream.ExpectHeadersAsync();
@@ -248,17 +382,13 @@ public class Http3TimeoutTests : Http3TestBase
var inboundControlStream = await Http3Api.GetInboundControlStream();
await inboundControlStream.ExpectSettingsAsync();
- var requestStream = await Http3Api.CreateRequestStream();
-
- requestStream.StartStreamDisposeTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
-
- await requestStream.SendHeadersAsync(new[]
+ var requestStream = await Http3Api.CreateRequestStream(new[]
{
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
- }, endStream: true);
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
+ }, null, true, new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously));
await requestStream.OnDisposingTask.DefaultTimeout();
@@ -272,10 +402,11 @@ public class Http3TimeoutTests : Http3TestBase
requestStream.StartStreamDisposeTcs.TrySetResult();
- await Http3Api.WaitForConnectionErrorAsync<ConnectionAbortedException>(
+ await Http3Api.WaitForConnectionErrorAsync<Http3ConnectionErrorException>(
ignoreNonGoAwayFrames: false,
expectedLastStreamId: 4,
Http3ErrorCode.InternalError,
+ matchExpectedErrorMessage: AssertExpectedErrorMessages,
expectedErrorMessage: CoreStrings.ConnectionTimedBecauseResponseMininumDataRateNotSatisfied);
Assert.Contains(TestSink.Writes, w => w.EventId.Name == "ResponseMinimumDataRateNotSatisfied");
@@ -319,9 +450,7 @@ public class Http3TimeoutTests : Http3TestBase
Http3Api._timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
var app = new EchoAppWithNotification();
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(app.RunApp);
-
- await requestStream.SendHeadersAsync(_browserRequestHeaders, endStream: false);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(app.RunApp, _browserRequestHeaders, endStream: false);
await requestStream.SendDataAsync(_helloWorldBytes, endStream: true);
await requestStream.ExpectHeadersAsync();
@@ -363,9 +492,7 @@ public class Http3TimeoutTests : Http3TestBase
Http3Api._timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
var app = new EchoAppWithNotification();
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(app.RunApp);
-
- await requestStream.SendHeadersAsync(_browserRequestHeaders, endStream: false);
+ var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(app.RunApp, _browserRequestHeaders, endStream: false);
await requestStream.SendDataAsync(_maxData, endStream: true);
await requestStream.ExpectHeadersAsync();
@@ -404,13 +531,13 @@ public class Http3TimeoutTests : Http3TestBase
Http3Api._timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(_readRateApplication);
+ await Http3Api.InitializeConnectionAsync(_readRateApplication);
var inboundControlStream = await Http3Api.GetInboundControlStream();
await inboundControlStream.ExpectSettingsAsync();
// _maxData is 16 KiB, and 16 KiB / 240 bytes/sec ~= 68 secs which is far above the grace period.
- await requestStream.SendHeadersAsync(ReadRateRequestHeaders(_maxData.Length), endStream: false);
+ var requestStream = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_maxData.Length), endStream: false);
await requestStream.SendDataAsync(_maxData, endStream: false);
await requestStream.ExpectHeadersAsync();
@@ -455,18 +582,14 @@ public class Http3TimeoutTests : Http3TestBase
var inboundControlStream = await Http3Api.GetInboundControlStream();
await inboundControlStream.ExpectSettingsAsync();
- var requestStream1 = await Http3Api.CreateRequestStream();
-
// _maxData is 16 KiB, and 16 KiB / 240 bytes/sec ~= 68 secs which is far above the grace period.
- await requestStream1.SendHeadersAsync(ReadRateRequestHeaders(_maxData.Length), endStream: false);
+ var requestStream1 = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_maxData.Length), endStream: false);
await requestStream1.SendDataAsync(_maxData, endStream: false);
await requestStream1.ExpectHeadersAsync();
await requestStream1.ExpectDataAsync();
- var requestStream2 = await Http3Api.CreateRequestStream();
-
- await requestStream2.SendHeadersAsync(ReadRateRequestHeaders(_maxData.Length), endStream: false);
+ var requestStream2 = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_maxData.Length), endStream: false);
await requestStream2.SendDataAsync(_maxData, endStream: false);
await requestStream2.ExpectHeadersAsync();
@@ -515,10 +638,9 @@ public class Http3TimeoutTests : Http3TestBase
await inboundControlStream.ExpectSettingsAsync();
Logger.LogInformation("Sending first request");
- var requestStream1 = await Http3Api.CreateRequestStream();
// _maxData is 16 KiB, and 16 KiB / 240 bytes/sec ~= 68 secs which is far above the grace period.
- await requestStream1.SendHeadersAsync(ReadRateRequestHeaders(_maxData.Length), endStream: false);
+ var requestStream1 = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_maxData.Length), endStream: false);
await requestStream1.SendDataAsync(_maxData, endStream: true);
await requestStream1.ExpectHeadersAsync();
@@ -527,9 +649,7 @@ public class Http3TimeoutTests : Http3TestBase
await requestStream1.ExpectReceiveEndOfStream();
Logger.LogInformation("Sending second request");
- var requestStream2 = await Http3Api.CreateRequestStream();
-
- await requestStream2.SendHeadersAsync(ReadRateRequestHeaders(_maxData.Length), endStream: false);
+ var requestStream2 = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_maxData.Length), endStream: false);
await requestStream2.SendDataAsync(_maxData, endStream: false);
await requestStream2.ExpectHeadersAsync();
@@ -568,7 +688,7 @@ public class Http3TimeoutTests : Http3TestBase
Http3Api._timeoutControl.Initialize(mockSystemClock.UtcNow.Ticks);
- var requestStream = await Http3Api.InitializeConnectionAndStreamsAsync(context =>
+ await Http3Api.InitializeConnectionAsync(context =>
{
// Completely disable rate limiting for this stream.
context.Features.Get<IHttpMinRequestBodyDataRateFeature>().MinDataRate = null;
@@ -578,8 +698,10 @@ public class Http3TimeoutTests : Http3TestBase
var inboundControlStream = await Http3Api.GetInboundControlStream();
await inboundControlStream.ExpectSettingsAsync();
+ Http3Api.OutboundControlStream = await Http3Api.CreateControlStream();
+
// _helloWorldBytes is 12 bytes, and 12 bytes / 240 bytes/sec = .05 secs which is far below the grace period.
- await requestStream.SendHeadersAsync(ReadRateRequestHeaders(_helloWorldBytes.Length), endStream: false);
+ var requestStream = await Http3Api.CreateRequestStream(ReadRateRequestHeaders(_helloWorldBytes.Length), endStream: false);
await requestStream.SendDataAsync(_helloWorldBytes, endStream: false);
await requestStream.ExpectHeadersAsync();
@@ -601,5 +723,4 @@ public class Http3TimeoutTests : Http3TestBase
_mockTimeoutHandler.VerifyNoOtherCalls();
}
-
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportHandshakeTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportHandshakeTests.cs
new file mode 100644
index 0000000000..3020856705
--- /dev/null
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportHandshakeTests.cs
@@ -0,0 +1,166 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Net;
+using System.Net.Http;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.Net.Http.Headers;
+using Http3SettingType = Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3.Http3SettingType;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
+
+public class WebTransportHandshakeTests : Http3TestBase
+{
+ [Fact]
+ public async Task WebTransportHandshake_ClientToServerPasses()
+ {
+ _serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = true;
+
+ var appCompletedTcs = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ await Http3Api.InitializeConnectionAsync(async context =>
+ {
+ var success = true;
+
+ var webTransportFeature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+
+ success &= webTransportFeature.IsWebTransportRequest;
+
+#pragma warning disable CA2252 // This API requires opting into preview features
+ try
+ {
+ var session = await webTransportFeature.AcceptAsync(CancellationToken.None).DefaultTimeout(); // todo session is null here
+
+ success &= session is not null;
+
+ appCompletedTcs.SetResult(success);
+ }
+ catch (TimeoutException)
+ {
+ appCompletedTcs.SetResult(false);
+ }
+#pragma warning restore CA2252
+
+ });
+ var controlStream = await Http3Api.CreateControlStream();
+ var controlStream2 = await Http3Api.GetInboundControlStream();
+
+ var settings = new Http3PeerSettings()
+ {
+ EnableWebTransport = 1,
+ H3Datagram = 1,
+ };
+
+ await controlStream.SendSettingsAsync(settings.GetNonProtocolDefaults());
+ var response1 = await controlStream2.ExpectSettingsAsync();
+
+ await Http3Api.ServerReceivedSettingsReader.ReadAsync().DefaultTimeout();
+
+ Assert.Equal(1, response1[(long)Http3SettingType.EnableWebTransport]);
+
+ var requestStream = await Http3Api.CreateRequestStream(new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "webtransport"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "server.example.com"),
+ new KeyValuePair<string, string>(WebTransportSession.CurrentSuppportedVersion, "1")
+ });
+
+ var response2 = await requestStream.ExpectHeadersAsync();
+
+ Assert.Equal((int)HttpStatusCode.OK, Convert.ToInt32(response2[InternalHeaderNames.Status], null));
+
+ await requestStream.OnDisposedTask.DefaultTimeout();
+ Assert.True(await appCompletedTcs.Task);
+ }
+
+ [Theory]
+ [InlineData(
+ ((long)Http3ErrorCode.ProtocolError),
+ nameof(CoreStrings.Http3MethodMustBeConnectWhenUsingProtocolPseudoHeader),
+ nameof(InternalHeaderNames.Method), "GET", // incorrect method (verifies that webtransport doesn't break regular Http/3 get)
+ nameof(InternalHeaderNames.Protocol), "webtransport",
+ nameof(InternalHeaderNames.Scheme), "http",
+ nameof(InternalHeaderNames.Path), "/",
+ nameof(InternalHeaderNames.Authority), "server.example.com",
+ nameof(HeaderNames.Origin), "server.example.com")]
+ [InlineData(
+ ((long)Http3ErrorCode.ProtocolError),
+ nameof(CoreStrings.Http3MissingAuthorityOrPathPseudoHeaders),
+ nameof(InternalHeaderNames.Method), "CONNECT",
+ nameof(InternalHeaderNames.Protocol), "webtransport",
+ nameof(InternalHeaderNames.Scheme), "http",
+ nameof(InternalHeaderNames.Authority), "server.example.com",
+ nameof(HeaderNames.Origin), "server.example.com")] // no path
+ [InlineData(
+ ((long)Http3ErrorCode.ProtocolError),
+ nameof(CoreStrings.Http3MissingAuthorityOrPathPseudoHeaders),
+ nameof(InternalHeaderNames.Method), "CONNECT",
+ nameof(InternalHeaderNames.Protocol), "webtransport",
+ nameof(InternalHeaderNames.Scheme), "http",
+ nameof(InternalHeaderNames.Path), "/",
+ nameof(HeaderNames.Origin), "server.example.com")] // no authority
+ public async Task WebTransportHandshake_IncorrectHeadersRejects(long error, string targetErrorMessage, params string[] headers)
+ {
+ _serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = true;
+
+ await Http3Api.InitializeConnectionAsync(_noopApplication);
+ var controlStream = await Http3Api.CreateControlStream();
+ var controlStream2 = await Http3Api.GetInboundControlStream();
+
+ var settings = new Http3PeerSettings()
+ {
+ EnableWebTransport = 1,
+ H3Datagram = 1,
+ };
+
+ await controlStream.SendSettingsAsync(settings.GetNonProtocolDefaults());
+ var response1 = await controlStream2.ExpectSettingsAsync();
+
+ await Http3Api.ServerReceivedSettingsReader.ReadAsync().DefaultTimeout();
+
+ Assert.Equal(1, response1[(long)Http3SettingType.EnableWebTransport]);
+
+ var headersConnectFrame = new List<KeyValuePair<string, string>>();
+ for (var i = 0; i < headers.Length; i += 2)
+ {
+ headersConnectFrame.Add(new KeyValuePair<string, string>(GetHeaderFromName(headers[i]), headers[i + 1]));
+ }
+
+ var requestStream = await Http3Api.CreateRequestStream(headersConnectFrame);
+
+ await requestStream.WaitForStreamErrorAsync((Http3ErrorCode)error, AssertExpectedErrorMessages, GetCoreStringFromName(targetErrorMessage));
+ }
+
+ private static string GetCoreStringFromName(string headerName)
+ {
+ return headerName switch
+ {
+ nameof(CoreStrings.Http3MissingAuthorityOrPathPseudoHeaders) => CoreStrings.Http3MissingAuthorityOrPathPseudoHeaders,
+ nameof(CoreStrings.Http3MethodMustBeConnectWhenUsingProtocolPseudoHeader) => CoreStrings.Http3MethodMustBeConnectWhenUsingProtocolPseudoHeader,
+ _ => throw new Exception("Core string not mapped yet")
+ };
+ }
+
+ private static string GetHeaderFromName(string coreStringName)
+ {
+ return coreStringName switch
+ {
+ nameof(InternalHeaderNames.Method) => InternalHeaderNames.Method,
+ nameof(InternalHeaderNames.Protocol) => InternalHeaderNames.Protocol,
+ nameof(InternalHeaderNames.Scheme) => InternalHeaderNames.Scheme,
+ nameof(InternalHeaderNames.Path) => InternalHeaderNames.Path,
+ nameof(InternalHeaderNames.Authority) => InternalHeaderNames.Authority,
+ nameof(HeaderNames.Origin) => HeaderNames.Origin,
+ _ => throw new Exception("Header name not mapped yet")
+ };
+ }
+}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportSessionTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportSessionTests.cs
new file mode 100644
index 0000000000..310939aa06
--- /dev/null
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportSessionTests.cs
@@ -0,0 +1,101 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Connections.Features;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
+
+public class WebTransportSessionTests : Http3TestBase
+{
+ [Fact]
+ public async Task WebTransportSession_CanOpenNewStream()
+ {
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = true;
+
+ var exitTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ var session = await WebTransportTestUtilities.GenerateSession(Http3Api, exitTcs);
+
+ var stream = await session.OpenUnidirectionalStreamAsync(CancellationToken.None);
+
+ //verify that we opened an output stream
+ Assert.NotNull(stream);
+ var streamDirectionFeature = stream.Features.GetRequiredFeature<IStreamDirectionFeature>();
+ Assert.True(streamDirectionFeature.CanWrite);
+ Assert.False(streamDirectionFeature.CanRead);
+
+ // end the application
+ exitTcs.SetResult();
+ }
+
+ [Fact]
+ public async Task WebTransportSession_AcceptNewStreamsInOrderOfArrival()
+ {
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = true; // TODO add more sync code as now it is flaky
+
+ var exitTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var session = await WebTransportTestUtilities.GenerateSession(Http3Api, exitTcs);
+
+ // pretend that we received 2 new stream requests from a client
+ session.AddStream(WebTransportTestUtilities.CreateStream(WebTransportStreamType.Bidirectional));
+ session.AddStream(WebTransportTestUtilities.CreateStream(WebTransportStreamType.Input));
+
+ var stream = await session.AcceptStreamAsync(CancellationToken.None);
+
+ // verify that we accepted a bidirectional stream
+ Assert.NotNull(stream);
+ var streamDirectionFeature = stream.Features.GetRequiredFeature<IStreamDirectionFeature>();
+ Assert.True(streamDirectionFeature.CanWrite);
+ Assert.True(streamDirectionFeature.CanRead);
+
+ var stream2 = await session.AcceptStreamAsync(CancellationToken.None);
+
+ // verify that we accepted a unidirectional stream
+ Assert.NotNull(stream2);
+ var streamDirectionFeature2 = stream2.Features.GetRequiredFeature<IStreamDirectionFeature>();
+ Assert.False(streamDirectionFeature2.CanWrite);
+ Assert.True(streamDirectionFeature2.CanRead);
+
+ exitTcs.SetResult();
+ }
+
+ [Theory]
+ [InlineData(0)]
+ [InlineData(1)]
+ [InlineData(2)]
+ [InlineData(3)]
+ public async Task WebTransportSession_ClosesProperly(int method)
+ {
+ Http3Api._serviceContext.ServerOptions.EnableWebTransportAndH3Datagrams = true;
+
+ var exitTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var session = await WebTransportTestUtilities.GenerateSession(Http3Api, exitTcs);
+
+ switch (method)
+ {
+ case 0: // manual abort
+ session.Abort(new(), System.Net.Http.Http3ErrorCode.InternalError);
+ break;
+ case 1: // manual graceful close
+ session.OnClientConnectionClosed();
+ break;
+ case 2: // automatic graceful close due to application and connection ending
+ exitTcs.SetResult();
+ break;
+ case 3: // automatic abort due to host stream aborting
+ Http3Api.Connection._streams[session.SessionId].Abort(new(), System.Net.Http.Http3ErrorCode.InternalError);
+ break;
+ }
+
+ // check that all future method calls which are not related to closing throw
+ Assert.Null(await session.AcceptStreamAsync(CancellationToken.None));
+ Assert.Null(await session.OpenUnidirectionalStreamAsync(CancellationToken.None));
+
+ // doublec check that no exceptions are thrown
+ var _ = WebTransportTestUtilities.CreateStream(WebTransportStreamType.Bidirectional);
+
+ exitTcs.TrySetResult();
+ }
+}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportStreamTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportStreamTests.cs
new file mode 100644
index 0000000000..a3da524f66
--- /dev/null
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportStreamTests.cs
@@ -0,0 +1,52 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Connections.Features;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
+
+public class WebTransportStreamTests : Http3TestBase
+{
+ private static readonly byte[] RandomBytes = new byte[5] { 0x61, 0x62, 0x63, 0x64, 0x65 };
+
+ [Theory]
+ [InlineData(WebTransportStreamType.Bidirectional, true, true)]
+ [InlineData(WebTransportStreamType.Input, true, false)]
+ [InlineData(WebTransportStreamType.Output, false, true)]
+ internal async Task WebTransportStream_StreamTypesAreDefinedCorrectly(WebTransportStreamType type, bool canRead, bool canWrite)
+ {
+ var memory = new Memory<byte>(new byte[5]);
+ var stream = WebTransportTestUtilities.CreateStream(type, memory);
+
+ var streamDirectionFeature = stream.Features.GetRequiredFeature<IStreamDirectionFeature>();
+ Assert.Equal(canRead, streamDirectionFeature.CanRead);
+ Assert.Equal(canWrite, streamDirectionFeature.CanWrite);
+
+ await stream.DisposeAsync();
+
+ // test that you can't write or read from a stream after disposing
+ Assert.False(streamDirectionFeature.CanRead);
+ Assert.False(streamDirectionFeature.CanWrite);
+ }
+
+ [Fact]
+ internal async Task WebTransportStream_WritingFlushingReadingWorks()
+ {
+ var memory = new Memory<byte>(new byte[5]);
+
+ var stream = WebTransportTestUtilities.CreateStream(WebTransportStreamType.Bidirectional, memory);
+
+ var input = new ReadOnlyMemory<byte>(RandomBytes);
+ await stream.Transport.Output.WriteAsync(input, CancellationToken.None);
+
+ await stream.Transport.Output.FlushAsync();
+
+ var memoryOut = new Memory<byte>(new byte[5]);
+ var length = await stream.Transport.Input.AsStream().ReadAsync(memoryOut, CancellationToken.None);
+
+ Assert.Equal(5, length);
+ Assert.Equal(input.ToArray(), memoryOut.ToArray());
+ }
+}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportTestUtilities.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportTestUtilities.cs
new file mode 100644
index 0000000000..2196d8b836
--- /dev/null
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/Http3/WebTransport/WebTransportTestUtilities.cs
@@ -0,0 +1,199 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Buffers;
+using System.IO.Pipelines;
+using Microsoft.AspNetCore.Connections.Features;
+using Microsoft.AspNetCore.Http.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Features;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http3;
+using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.WebTransport;
+using Microsoft.AspNetCore.Server.Kestrel.Core.WebTransport;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.Net.Http.Headers;
+using Moq;
+
+namespace Microsoft.AspNetCore.Server.Kestrel.Core.Tests;
+
+internal class WebTransportTestUtilities
+{
+ private static int streamCounter;
+
+ public static async ValueTask<WebTransportSession> GenerateSession(Http3InMemory inMemory, TaskCompletionSource exitSessionTcs)
+ {
+ var appCompletedTcs = new TaskCompletionSource<IWebTransportSession>(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ await inMemory.InitializeConnectionAsync(async context =>
+ {
+ var webTransportFeature = context.Features.GetRequiredFeature<IHttpWebTransportFeature>();
+
+#pragma warning disable CA2252 // This API requires opting into preview features
+ try
+ {
+ var session = await webTransportFeature.AcceptAsync(CancellationToken.None).DefaultTimeout();
+ appCompletedTcs.SetResult(session);
+ }
+ catch (TimeoutException exception)
+ {
+ appCompletedTcs.SetException(exception);
+ }
+#pragma warning restore CA2252
+
+ // wait for the test to tell us to kill the application
+ await exitSessionTcs.Task;
+ });
+ var controlStream = await inMemory.CreateControlStream();
+ var controlStream2 = await inMemory.GetInboundControlStream();
+
+ var settings = new Http3PeerSettings()
+ {
+ EnableWebTransport = 1,
+ H3Datagram = 1,
+ };
+
+ await controlStream.SendSettingsAsync(settings.GetNonProtocolDefaults());
+ var response1 = await controlStream2.ExpectSettingsAsync();
+
+ await inMemory.ServerReceivedSettingsReader.ReadAsync().DefaultTimeout();
+
+ var requestStream = await inMemory.CreateRequestStream(new[]
+ {
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "CONNECT"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Protocol, "webtransport"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "server.example.com"),
+ new KeyValuePair<string, string>(HeaderNames.Origin, "server.example.com"),
+ new KeyValuePair<string, string>(WebTransportSession.CurrentSuppportedVersion, "1")
+ });
+
+ return (WebTransportSession)await appCompletedTcs.Task;
+ }
+
+ public static WebTransportStream CreateStream(WebTransportStreamType type, Memory<byte>? memory = null)
+ {
+ var features = new FeatureCollection();
+ features.Set<IStreamIdFeature>(new StreamId(streamCounter++));
+ features.Set<IStreamDirectionFeature>(new DefaultStreamDirectionFeature(type != WebTransportStreamType.Output, type != WebTransportStreamType.Input));
+ features.Set(Mock.Of<IConnectionItemsFeature>());
+ features.Set(Mock.Of<IProtocolErrorCodeFeature>());
+
+ var writer = new HttpResponsePipeWriter(new StreamWriterControl(memory));
+ writer.StartAcceptingWrites();
+ var transport = new DuplexPipe(new StreamReader(memory), writer);
+ return new WebTransportStream(TestContextFactory.CreateHttp3StreamContext("id", null, new TestServiceContext(), features, null, null, null, transport), type);
+ }
+
+ class StreamId : IStreamIdFeature
+ {
+ private readonly int _id;
+ long IStreamIdFeature.StreamId => _id;
+
+ public StreamId(int id = 1)
+ {
+ _id = id;
+ }
+ }
+
+ class StreamWriterControl : IHttpResponseControl
+ {
+ readonly Memory<byte>? _sharedMemory;
+
+ public StreamWriterControl(Memory<byte>? sharedMemory = null)
+ {
+ _sharedMemory = sharedMemory;
+ }
+
+ public void Advance(int bytes)
+ {
+ // no-op
+ }
+
+ public void CancelPendingFlush()
+ {
+ // no-op
+ }
+
+ public ValueTask<FlushResult> FlushPipeAsync(CancellationToken cancellationToken)
+ {
+ // no-op
+ return new ValueTask<FlushResult>();
+ }
+
+ public Memory<byte> GetMemory(int sizeHint = 0)
+ {
+ if (_sharedMemory is null)
+ {
+ throw new NullReferenceException();
+ }
+ return (Memory<byte>)_sharedMemory;
+ }
+
+ public Span<byte> GetSpan(int sizeHint = 0)
+ {
+ return GetMemory(sizeHint).Span;
+ }
+
+ public ValueTask<FlushResult> ProduceContinueAsync()
+ {
+ // no-op
+ return new ValueTask<FlushResult>();
+ }
+
+ public Task CompleteAsync(Exception exception)
+ {
+ // no-op
+ return Task.CompletedTask;
+ }
+
+ public ValueTask<FlushResult> WritePipeAsync(ReadOnlyMemory<byte> source, CancellationToken cancellationToken)
+ {
+ source.CopyTo(GetMemory());
+ return new ValueTask<FlushResult>();
+ }
+ }
+
+ class StreamReader : PipeReader
+ {
+ readonly Memory<byte>? _sharedMemory;
+
+ public StreamReader(Memory<byte>? sharedMemory = null)
+ {
+ _sharedMemory = sharedMemory;
+ }
+
+ public override void AdvanceTo(SequencePosition consumed)
+ {
+ // no-op
+ }
+
+ public override void AdvanceTo(SequencePosition consumed, SequencePosition examined)
+ {
+ // no-op
+ }
+
+ public override void CancelPendingRead()
+ {
+ throw new NotImplementedException();
+ }
+
+ public override void Complete(Exception exception = null)
+ {
+ // no-op
+ }
+
+ public override ValueTask<ReadResult> ReadAsync(CancellationToken cancellationToken = default)
+ {
+ // just return the whole memory as a readResult
+ return new ValueTask<ReadResult>(new ReadResult(
+ new ReadOnlySequence<byte>((ReadOnlyMemory<byte>)_sharedMemory), false, true));
+ }
+
+ public override bool TryRead(out ReadResult result)
+ {
+ result = new ReadResult(new ReadOnlySequence<byte>((ReadOnlyMemory<byte>)_sharedMemory), false, true);
+ return true;
+ }
+ }
+}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpProtocolSelectionTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpProtocolSelectionTests.cs
index 94fe411392..16a8908525 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpProtocolSelectionTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpProtocolSelectionTests.cs
@@ -40,14 +40,15 @@ public class HttpProtocolSelectionTests : TestApplicationErrorLoggerLoggedTest
// Expect a SETTINGS frame with default settings then a connection-level WINDOW_UPDATE frame.
var expected = new byte[]
{
- 0x00, 0x00, 0x12, // Payload Length (6 * settings count)
+ 0x00, 0x00, 0x18, // Payload Length (6 * settings count)
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, // SETTINGS frame (type 0x04)
0x00, 0x03, 0x00, 0x00, 0x00, 0x64, // Connection limit (100)
- 0x00, 0x04, 0x00, 0x01, 0x80, 0x00, // Initial stream window size (96 KiB)
+ 0x00, 0x04, 0x00, 0x0C, 0x00, 0x00, // Initial stream window size (768 KiB)
0x00, 0x06, 0x00, 0x00, 0x80, 0x00, // Header size limit (32 KiB)
+ 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, // CONNECT enabled
0x00, 0x00, 0x04, // Payload Length (4)
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, // WINDOW_UPDATE frame (type 0x08)
- 0x00, 0x01, 0x00, 0x01, // Diff between configured and protocol default (128 KiB - 0XFFFF)
+ 0x00, 0x0F, 0x00, 0x01, // Diff between configured and protocol default (1 MiB - 0XFFFF)
};
return TestSuccess(HttpProtocols.Http2,
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs
index e2bedfcf36..e0ec716e8f 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsConnectionMiddlewareTests.cs
@@ -1,18 +1,13 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
+using System.Globalization;
using System.Net;
using System.Net.Http;
using System.Net.Security;
using System.Security.Authentication;
using System.Security.Cryptography.X509Certificates;
using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
using Microsoft.AspNetCore.Connections.Features;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
@@ -27,7 +22,6 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Moq;
-using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests;
@@ -717,6 +711,77 @@ public class HttpsConnectionMiddlewareTests : LoggedTest
}
[ConditionalFact]
+ [OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Fails on OSX.")]
+ public async Task ServerCertificateChainInExtraStore()
+ {
+ var streams = new List<SslStream>();
+ CertHelper.CleanupCertificates(nameof(ServerCertificateChainInExtraStore));
+ (var clientCertificate, var clientChain) = CertHelper.GenerateCertificates(nameof(ServerCertificateChainInExtraStore), longChain: true, serverCertificate: false);
+
+ using (var store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser))
+ {
+ // add chain certificate so we can construct chain since there is no way how to pass intermediates directly.
+ store.Open(OpenFlags.ReadWrite);
+ store.AddRange(clientChain);
+ store.Close();
+ }
+
+ using (var chain = new X509Chain())
+ {
+ chain.ChainPolicy.VerificationFlags = X509VerificationFlags.AllFlags;
+ chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
+ chain.ChainPolicy.DisableCertificateDownloads = true;
+ var chainStatus = chain.Build(clientCertificate);
+ }
+
+ void ConfigureListenOptions(ListenOptions listenOptions)
+ {
+ listenOptions.UseHttps(new HttpsConnectionAdapterOptions
+ {
+ ServerCertificate = _x509Certificate2,
+ ServerCertificateChain = clientChain,
+ OnAuthenticate = (con, so) =>
+ {
+ so.ClientCertificateRequired = true;
+ so.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
+ {
+ Assert.NotEmpty(chain.ChainPolicy.ExtraStore);
+ Assert.Contains(clientChain[0], chain.ChainPolicy.ExtraStore);
+ return true;
+ };
+ so.CertificateRevocationCheckMode = X509RevocationMode.NoCheck;
+ }
+ });
+ }
+
+ await using (var server = new TestServer(
+ context => context.Response.WriteAsync("hello world"),
+ new TestServiceContext(LoggerFactory), ConfigureListenOptions))
+ {
+ using (var connection = server.CreateConnection())
+ {
+ var stream = OpenSslStreamWithCert(connection.Stream, clientCertificate);
+ await stream.AuthenticateAsClientAsync("localhost");
+ await AssertConnectionResult(stream, true);
+ }
+ }
+
+ CertHelper.CleanupCertificates(nameof(ServerCertificateChainInExtraStore));
+ clientCertificate.Dispose();
+ var list = (System.Collections.IList)clientChain;
+ for (var i = 0; i < list.Count; i++)
+ {
+ var c = (X509Certificate)list[i];
+ c.Dispose();
+ }
+
+ foreach (var s in streams)
+ {
+ s.Dispose();
+ }
+ }
+
+ [ConditionalFact]
// TLS 1.2 and lower have to renegotiate the whole connection to get a client cert, and if that hits an error
// then the connection is aborted.
[OSSkipCondition(OperatingSystems.MacOSX, SkipReason = "Missing platform support.")]
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsTests.cs
index 0cba39d6da..c78429ea1e 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/HttpsTests.cs
@@ -22,6 +22,7 @@ using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Internal;
using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests;
@@ -438,9 +439,11 @@ public class HttpsTests : LoggedTest
Assert.NotNull(bindFeatures);
- var sslOptions = bindFeatures.Get<SslServerAuthenticationOptions>();
+ var sslOptions = bindFeatures.Get<TlsConnectionCallbackOptions>();
Assert.NotNull(sslOptions);
- Assert.Equal(_x509Certificate2, sslOptions.ServerCertificate);
+
+ var sslServerAuthenticationOptions = await sslOptions.OnConnection(new TlsConnectionCallbackContext(), CancellationToken.None);
+ Assert.Equal(_x509Certificate2, sslServerAuthenticationOptions.ServerCertificate);
}
[Fact]
@@ -480,9 +483,11 @@ public class HttpsTests : LoggedTest
Assert.NotNull(bindFeatures);
- var sslOptions = bindFeatures.Get<SslServerAuthenticationOptions>();
- Assert.NotNull(sslOptions);
- Assert.Equal(_x509Certificate2, sslOptions.ServerCertificate);
+ var tlsOptions = bindFeatures.Get<TlsConnectionCallbackOptions>();
+ Assert.NotNull(tlsOptions);
+
+ var sslServerAuthenticationOptions = await tlsOptions.OnConnection(new TlsConnectionCallbackContext(), CancellationToken.None);
+ Assert.Equal(_x509Certificate2, sslServerAuthenticationOptions.ServerCertificate);
}
[Fact]
@@ -520,7 +525,7 @@ public class HttpsTests : LoggedTest
}
[Fact]
- public async Task Http2and3_NoUseHttps_Throws()
+ public async Task Http3_NoUseHttps_Throws()
{
var serverOptions = CreateServerOptions();
serverOptions.DefaultCertificate = _x509Certificate2;
@@ -556,80 +561,98 @@ public class HttpsTests : LoggedTest
}
[Fact]
- public async Task Http3_NoUseHttps_Throws()
+ public async Task Http3_ServerOptionsSelectionCallback_Works()
{
var serverOptions = CreateServerOptions();
serverOptions.DefaultCertificate = _x509Certificate2;
- var bindCalled = false;
+ IFeatureCollection bindFeatures = null;
var multiplexedConnectionListenerFactory = new MockMultiplexedConnectionListenerFactory();
multiplexedConnectionListenerFactory.OnBindAsync = (ep, features) =>
{
- bindCalled = true;
+ bindFeatures = features;
};
+ var testState = new object();
var testContext = new TestServiceContext(LoggerFactory);
testContext.ServerOptions = serverOptions;
- var ex = await Assert.ThrowsAsync<IOException>(async () =>
- {
- await using var server = new TestServer(context => Task.CompletedTask,
- testContext,
- serverOptions =>
+ await using (var server = new TestServer(context => Task.CompletedTask,
+ testContext,
+ serverOptions =>
+ {
+ serverOptions.ListenLocalhost(5001, listenOptions =>
{
- serverOptions.ListenLocalhost(5001, listenOptions =>
+ listenOptions.Protocols = HttpProtocols.Http3;
+ listenOptions.UseHttps((SslStream stream, SslClientHelloInfo clientHelloInfo, object state, CancellationToken cancellationToken) =>
{
- listenOptions.Protocols = HttpProtocols.Http3;
- });
- },
- services =>
- {
- services.AddSingleton<IMultiplexedConnectionListenerFactory>(multiplexedConnectionListenerFactory);
+ return ValueTask.FromResult(new SslServerAuthenticationOptions());
+ }, state: testState);
});
- });
+ },
+ services =>
+ {
+ services.AddSingleton<IMultiplexedConnectionListenerFactory>(multiplexedConnectionListenerFactory);
+ }))
+ {
+ }
- Assert.False(bindCalled);
- Assert.Equal("HTTP/3 requires HTTPS.", ex.InnerException.InnerException.Message);
- }
+ Assert.NotNull(bindFeatures);
- [Fact]
- public void Http3_ServerOptionsSelectionCallback_Throws()
- {
- var serverOptions = CreateServerOptions();
- serverOptions.DefaultCertificate = _x509Certificate2;
+ var tlsOptions = bindFeatures.Get<TlsConnectionCallbackOptions>();
+ Assert.NotNull(tlsOptions);
- serverOptions.ListenLocalhost(5001, options =>
- {
- options.Protocols = HttpProtocols.Http3;
- var exception = Assert.Throws<NotSupportedException>(() =>
- options.UseHttps((SslStream stream, SslClientHelloInfo clientHelloInfo, object state, CancellationToken cancellationToken) =>
- {
- return ValueTask.FromResult((new SslServerAuthenticationOptions()));
- }, state: null)
- );
- Assert.Equal("UseHttps with ServerOptionsSelectionCallback is not supported with HTTP/3.", exception.Message);
- });
+ Assert.Collection(tlsOptions.ApplicationProtocols, p => Assert.Equal(SslApplicationProtocol.Http3, p));
+
+ Assert.Equal(testState, tlsOptions.OnConnectionState);
}
[Fact]
- public void Http3_TlsHandshakeCallbackOptions_Throws()
+ public async Task Http3_TlsHandshakeCallbackOptions_Works()
{
var serverOptions = CreateServerOptions();
serverOptions.DefaultCertificate = _x509Certificate2;
- serverOptions.ListenLocalhost(5001, options =>
+ IFeatureCollection bindFeatures = null;
+ var multiplexedConnectionListenerFactory = new MockMultiplexedConnectionListenerFactory();
+ multiplexedConnectionListenerFactory.OnBindAsync = (ep, features) =>
{
- options.Protocols = HttpProtocols.Http3;
- var exception = Assert.Throws<NotSupportedException>(() =>
- options.UseHttps(new TlsHandshakeCallbackOptions()
+ bindFeatures = features;
+ };
+
+ var testState = new object();
+ var testContext = new TestServiceContext(LoggerFactory);
+ testContext.ServerOptions = serverOptions;
+ await using (var server = new TestServer(context => Task.CompletedTask,
+ testContext,
+ serverOptions =>
+ {
+ serverOptions.ListenLocalhost(5001, listenOptions =>
{
- OnConnection = context =>
+ listenOptions.Protocols = HttpProtocols.Http3;
+ listenOptions.UseHttps(new TlsHandshakeCallbackOptions()
{
- return ValueTask.FromResult(new SslServerAuthenticationOptions());
- }
- })
- );
- Assert.Equal("UseHttps with TlsHandshakeCallbackOptions is not supported with HTTP/3.", exception.Message);
- });
+ OnConnection = context =>
+ {
+ return ValueTask.FromResult(new SslServerAuthenticationOptions());
+ },
+ OnConnectionState = testState
+ });
+ });
+ },
+ services =>
+ {
+ services.AddSingleton<IMultiplexedConnectionListenerFactory>(multiplexedConnectionListenerFactory);
+ }))
+ {
+ }
+
+ Assert.NotNull(bindFeatures);
+
+ var tlsOptions = bindFeatures.Get<TlsConnectionCallbackOptions>();
+ Assert.Collection(tlsOptions.ApplicationProtocols, p => Assert.Equal(SslApplicationProtocol.Http3, p));
+
+ Assert.NotNull(tlsOptions.OnConnection);
+ Assert.Equal(testState, tlsOptions.OnConnectionState);
}
[Fact]
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTargetProcessingTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTargetProcessingTests.cs
index 71719e2004..8a7c2d9c2b 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTargetProcessingTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTargetProcessingTests.cs
@@ -90,11 +90,10 @@ public class RequestTargetProcessingTests : LoggedTest
}
[Theory]
- [InlineData((int)HttpMethod.Options, "*")]
- [InlineData((int)HttpMethod.Connect, "host")]
- public async Task NonPathRequestTargetSetInRawTarget(int intMethod, string requestTarget)
+ [InlineData(HttpMethod.Options, "*")]
+ [InlineData(HttpMethod.Connect, "host")]
+ public async Task NonPathRequestTargetSetInRawTarget(HttpMethod method, string requestTarget)
{
- var method = (HttpMethod)intMethod;
var testContext = new TestServiceContext(LoggerFactory);
await using (var server = new TestServer(async context =>
@@ -104,8 +103,7 @@ public class RequestTargetProcessingTests : LoggedTest
Assert.Empty(context.Request.PathBase.Value);
Assert.Empty(context.Request.QueryString.Value);
- context.Response.Headers["Content-Length"] = new[] { "11" };
- await context.Response.WriteAsync("Hello World");
+ await context.Response.CompleteAsync();
}, testContext))
{
using (var connection = server.CreateConnection())
@@ -119,12 +117,6 @@ public class RequestTargetProcessingTests : LoggedTest
$"Host: {host}",
"",
"");
- await connection.Receive(
- "HTTP/1.1 200 OK",
- "Content-Length: 11",
- $"Date: {testContext.DateHeaderValue}",
- "",
- "Hello World");
}
}
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTests.cs
index 5211b92468..7c2a98a2f6 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/RequestTests.cs
@@ -19,6 +19,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests.TestTransport;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.Logging;
+using Moq;
using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests;
@@ -81,6 +82,36 @@ public class RequestTests : TestApplicationErrorLoggerLoggedTest
}
[Fact]
+ public async Task RequestBodyPipeReaderDoesZeroByteReads()
+ {
+ await using (var server = new TestServer(async context =>
+ {
+ var bufferLengths = new List<int>();
+
+ var mockStream = new Mock<Stream>();
+
+ mockStream.Setup(s => s.CanRead).Returns(true);
+ mockStream.Setup(s => s.ReadAsync(It.IsAny<Memory<byte>>(), It.IsAny<CancellationToken>())).Returns<Memory<byte>, CancellationToken>((buffer, token) =>
+ {
+ bufferLengths.Add(buffer.Length);
+ return ValueTask.FromResult(0);
+ });
+
+ context.Request.Body = mockStream.Object;
+ var data = await context.Request.BodyReader.ReadAsync();
+
+ Assert.Equal(2, bufferLengths.Count);
+ Assert.Equal(0, bufferLengths[0]);
+ Assert.Equal(4096, bufferLengths[1]);
+
+ await context.Response.WriteAsync("hello, world");
+ }, new TestServiceContext(LoggerFactory)))
+ {
+ Assert.Equal("hello, world", await server.HttpClientSlim.GetStringAsync($"http://localhost:{server.Port}/"));
+ }
+ }
+
+ [Fact]
public async Task RequestBodyReadAsyncCanBeCancelled()
{
var helloTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
@@ -2253,6 +2284,49 @@ public class RequestTests : TestApplicationErrorLoggerLoggedTest
}
}
+ [Fact]
+ public async Task SingleLineFeedIsSupportedAnywhere()
+ {
+ // Exercises all combinations of LF and CRLF as line separators.
+ // Uses a bit mask for all the possible combinations.
+
+ var lines = new[]
+ {
+ $"GET / HTTP/1.1",
+ "Content-Length: 0",
+ $"Host: localhost",
+ "",
+ };
+
+ await using (var server = new TestServer(context => Task.CompletedTask, new TestServiceContext(LoggerFactory, disableHttp1LineFeedTerminators: false)))
+ {
+ var mask = Math.Pow(2, lines.Length) - 1;
+
+ for (var m = 0; m <= mask; m++)
+ {
+ using (var client = server.CreateConnection())
+ {
+ var sb = new StringBuilder();
+
+ for (var pos = 0; pos < lines.Length; pos++)
+ {
+ sb.Append(lines[pos]);
+ var separator = (m & (1 << pos)) != 0 ? "\n" : "\r\n";
+ sb.Append(separator);
+ }
+
+ var text = sb.ToString();
+ var writer = new StreamWriter(client.Stream, Encoding.GetEncoding("iso-8859-1"));
+ await writer.WriteAsync(text).ConfigureAwait(false);
+ await writer.FlushAsync().ConfigureAwait(false);
+ await client.Stream.FlushAsync().ConfigureAwait(false);
+
+ await client.Receive("HTTP/1.1 200");
+ }
+ }
+ }
+ }
+
public static TheoryData<string, string> HostHeaderData => HttpParsingData.HostHeaderData;
private class IntAsClass
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseHeaderTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseHeaderTests.cs
index 7129cece53..c88ab37393 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseHeaderTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseHeaderTests.cs
@@ -8,6 +8,7 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests.TestTransport;
using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.Primitives;
using Xunit;
namespace Microsoft.AspNetCore.Server.Kestrel.InMemory.FunctionalTests;
@@ -100,4 +101,40 @@ public class ResponseHeaderTests : TestApplicationErrorLoggerLoggedTest
await connection.ReceiveEnd();
}
+
+ [Fact]
+ public async Task ResponseHeaders_NullEntriesAreIgnored()
+ {
+ var tag = "Warning";
+
+ await using var server = new TestServer(context =>
+ {
+ Assert.Empty(context.Response.Headers[tag]);
+
+ context.Response.Headers.Add(tag, new StringValues((string)null));
+
+ Assert.Empty(context.Response.Headers[tag]);
+
+ // this should not throw
+ context.Response.Headers.Add(tag, new StringValues("Hello"));
+
+ context.Response.ContentLength = 11;
+ return context.Response.WriteAsync("Hello World");
+ }, new TestServiceContext(LoggerFactory));
+
+ using var connection = server.CreateConnection();
+ await connection.Send(
+ "GET / HTTP/1.1",
+ "Host:",
+ "",
+ "");
+
+ await connection.Receive(
+ $"HTTP/1.1 200 OK",
+ "Content-Length: 11",
+ $"Date: {server.Context.DateHeaderValue}",
+ $"{tag}: Hello",
+ "",
+ "Hello World");
+ }
}
diff --git a/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseTests.cs b/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseTests.cs
index 495a009856..670d65c0b8 100644
--- a/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseTests.cs
+++ b/src/Servers/Kestrel/test/InMemory.FunctionalTests/ResponseTests.cs
@@ -591,6 +591,130 @@ public class ResponseTests : TestApplicationErrorLoggerLoggedTest
}
}
+ public static IEnumerable<object[]> Get1xxAnd204MethodCombinations()
+ {
+ // Status codes to test
+ var statusCodes = new int[] {
+ StatusCodes.Status100Continue,
+ StatusCodes.Status101SwitchingProtocols,
+ StatusCodes.Status102Processing,
+ StatusCodes.Status204NoContent,
+ };
+
+ // HTTP methods to test
+ var methods = new HttpMethod[] {
+ HttpMethod.Connect,
+ HttpMethod.Delete,
+ HttpMethod.Get,
+ HttpMethod.Head,
+ HttpMethod.Options,
+ HttpMethod.Patch,
+ HttpMethod.Post,
+ HttpMethod.Put,
+ HttpMethod.Trace
+ };
+
+ foreach (var statusCode in statusCodes)
+ {
+ foreach (var method in methods)
+ {
+ yield return new object[] { statusCode, method };
+ }
+ }
+ }
+
+ [Theory]
+ [MemberData(nameof(Get1xxAnd204MethodCombinations))]
+ public async Task AttemptingToWriteContentLengthFailsFor1xxAnd204Responses(int statusCode, HttpMethod method)
+ => await AttemptingToWriteContentLengthFails(statusCode, method).ConfigureAwait(true);
+
+ [Theory]
+ [InlineData(StatusCodes.Status200OK)]
+ [InlineData(StatusCodes.Status201Created)]
+ [InlineData(StatusCodes.Status202Accepted)]
+ [InlineData(StatusCodes.Status203NonAuthoritative)]
+ [InlineData(StatusCodes.Status204NoContent)]
+ [InlineData(StatusCodes.Status205ResetContent)]
+ [InlineData(StatusCodes.Status206PartialContent)]
+ [InlineData(StatusCodes.Status207MultiStatus)]
+ [InlineData(StatusCodes.Status208AlreadyReported)]
+ [InlineData(StatusCodes.Status226IMUsed)]
+ public async Task AttemptingToWriteContentLengthFailsFor2xxResponsesOnConnect(int statusCode)
+ => await AttemptingToWriteContentLengthFails(statusCode, HttpMethod.Connect).ConfigureAwait(true);
+
+ private async Task AttemptingToWriteContentLengthFails(int statusCode, HttpMethod method)
+ {
+ var responseWriteTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ await using (var server = new TestServer(async httpContext =>
+ {
+ httpContext.Response.StatusCode = statusCode;
+ httpContext.Response.Headers.ContentLength = 0;
+
+ try
+ {
+ await httpContext.Response.StartAsync();
+ }
+ catch (Exception ex)
+ {
+ responseWriteTcs.TrySetException(ex);
+ throw;
+ }
+
+ responseWriteTcs.TrySetResult();
+ }, new TestServiceContext(LoggerFactory)))
+ {
+ using (var connection = server.CreateConnection())
+ {
+ await connection.Send(
+ $"{HttpUtilities.MethodToString(method)} / HTTP/1.1",
+ "Host:",
+ "",
+ "");
+
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => responseWriteTcs.Task).DefaultTimeout();
+ Assert.Equal(CoreStrings.FormatHeaderNotAllowedOnResponse("Content-Length", statusCode), ex.Message);
+ }
+ }
+ }
+
+ [Fact]
+ public async Task AttemptingToWriteNonzeroContentLengthFailsFor205Response()
+ {
+ var responseWriteTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+
+ await using (var server = new TestServer(async httpContext =>
+ {
+ httpContext.Response.StatusCode = 205;
+ httpContext.Response.Headers.ContentLength = 1;
+
+ try
+ {
+ await httpContext.Response.StartAsync();
+ }
+ catch (Exception ex)
+ {
+ responseWriteTcs.TrySetException(ex);
+ throw;
+ }
+
+ responseWriteTcs.TrySetResult();
+ }, new TestServiceContext(LoggerFactory)))
+ {
+ using (var connection = server.CreateConnection())
+ {
+ await connection.Send(
+ "GET / HTTP/1.1",
+ "Host:",
+ "",
+ "");
+
+ var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => responseWriteTcs.Task).DefaultTimeout();
+ Assert.Equal(CoreStrings.NonzeroContentLengthNotAllowedOn205, ex.Message);
+ }
+ }
+ }
+
[Theory]
[InlineData(StatusCodes.Status204NoContent)]
[InlineData(StatusCodes.Status304NotModified)]
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/H2SpecCommands.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/H2SpecCommands.cs
index e2cda11019..748e4e94a7 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/H2SpecCommands.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/H2SpecCommands.cs
@@ -14,7 +14,7 @@ using Xunit;
namespace Interop.FunctionalTests;
-public static class H2SpecCommands
+public static partial class H2SpecCommands
{
#region chmod
// user permissions
@@ -35,8 +35,8 @@ public static class H2SpecCommands
| S_IRGRP | S_IXGRP
| S_IROTH | S_IXOTH;
- [DllImport("libc", SetLastError = true)]
- private static extern int chmod(string pathname, int mode);
+ [LibraryImport("libc", StringMarshalling = StringMarshalling.Utf8, SetLastError = true)]
+ private static partial int chmod(string pathname, int mode);
private static int chmod755(string pathname) => chmod(pathname, _0755);
#endregion
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs
index 91917da34e..0109d41a2d 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http2/Http2RequestTests.cs
@@ -16,6 +16,7 @@ using Microsoft.Extensions.Logging;
namespace Interop.FunctionalTests.Http2;
+[Collection(nameof(NoParallelCollection))]
public class Http2RequestTests : LoggedTest
{
[Fact]
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3RequestTests.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3RequestTests.cs
index b4b6a03f77..e7276fe146 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3RequestTests.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3RequestTests.cs
@@ -2,9 +2,11 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
+using System.Globalization;
using System.Net;
using System.Net.Http;
using System.Net.Quic;
+using System.Net.Security;
using System.Text;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Connections.Features;
@@ -13,15 +15,18 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.Server.Kestrel.Core;
+using Microsoft.AspNetCore.Server.Kestrel.Https;
using Microsoft.AspNetCore.Testing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Testing;
+using Microsoft.Extensions.Primitives;
using Xunit;
namespace Interop.FunctionalTests.Http3;
+[Collection(nameof(NoParallelCollection))]
public class Http3RequestTests : LoggedTest
{
private class StreamingHttpContent : HttpContent
@@ -258,6 +263,84 @@ public class Http3RequestTests : LoggedTest
}
}
+ [ConditionalTheory]
+ [MsQuicSupported]
+ [InlineData(HttpProtocols.Http3)]
+ [InlineData(HttpProtocols.Http2)]
+ public async Task POST_MultipleRequests_PooledStreamAndHeaders(HttpProtocols protocol)
+ {
+ // Arrange
+ string contentType = null;
+ string authority = null;
+ var builder = CreateHostBuilder(async context =>
+ {
+ contentType = context.Request.ContentType;
+ authority = context.Request.Host.Value;
+
+ var data = await context.Request.Body.ReadUntilEndAsync();
+ await context.Response.Body.WriteAsync(data);
+ }, protocol: protocol);
+
+ using (var host = builder.Build())
+ using (var client = HttpHelpers.CreateClient())
+ {
+ await host.StartAsync();
+
+ // Act
+ var response1 = await SendRequestAsync(protocol, host, client);
+ var contentType1 = contentType;
+ var authority1 = authority;
+
+ if (protocol == HttpProtocols.Http3)
+ {
+ await WaitForLogAsync(logs =>
+ {
+ return logs.Any(w => w.LoggerName == "Microsoft.AspNetCore.Server.Kestrel.Transport.Quic" &&
+ w.EventId.Name == "StreamPooled");
+ }, "Wait for server to finish pooling stream.");
+ }
+
+ var response2 = await SendRequestAsync(protocol, host, client);
+ var contentType2 = contentType;
+ var authority2 = authority;
+
+ // Assert
+ Assert.NotNull(contentType1);
+ Assert.NotNull(authority1);
+
+ Assert.Same(contentType1, contentType2);
+ Assert.Same(authority1, authority2);
+
+ await host.StopAsync();
+ }
+
+ static async Task<HttpResponseMessage> SendRequestAsync(HttpProtocols protocol, IHost host, HttpMessageInvoker client)
+ {
+ var requestContent = new StreamingHttpContent();
+ requestContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");
+
+ var request = new HttpRequestMessage(HttpMethod.Post, $"https://127.0.0.1:{host.GetPort()}/");
+ request.Content = requestContent;
+ request.Version = GetProtocol(protocol);
+ request.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
+
+ var responseTask = client.SendAsync(request, CancellationToken.None).DefaultTimeout();
+
+ var requestStream = await requestContent.GetStreamAsync().DefaultTimeout();
+
+ await requestStream.WriteAsync(new byte[] { 1, 2, 3 }).DefaultTimeout();
+
+ requestContent.CompleteStream();
+
+ var response = await responseTask.DefaultTimeout();
+ response.EnsureSuccessStatusCode();
+
+ await response.Content.ReadAsByteArrayAsync();
+
+ return response;
+ }
+ }
+
[ConditionalFact]
[MsQuicSupported]
public async Task POST_ServerCompletesWithoutReadingRequestBody_ClientGetsResponse()
@@ -393,7 +476,6 @@ public class Http3RequestTests : LoggedTest
[MsQuicSupported]
[InlineData(HttpProtocols.Http3)]
[InlineData(HttpProtocols.Http2)]
- [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/35070")]
public async Task POST_ServerAbort_ClientReceivesAbort(HttpProtocols protocol)
{
// Arrange
@@ -437,7 +519,7 @@ public class Http3RequestTests : LoggedTest
// Assert
if (protocol == HttpProtocols.Http3)
{
- var innerEx = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
+ var innerEx = Assert.IsType<HttpProtocolException>(ex.InnerException);
Assert.Equal(Http3ErrorCode.InternalError, (Http3ErrorCode)innerEx.ErrorCode);
}
@@ -455,6 +537,58 @@ public class Http3RequestTests : LoggedTest
}
}
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task POST_ServerAbortAfterWrite_ClientReceivesAbort()
+ {
+ // Arrange
+ var builder = CreateHostBuilder(async context =>
+ {
+ Logger.LogInformation("Server writing content.");
+ await context.Response.Body.WriteAsync(new byte[16]);
+
+ // Note that there is a race here on what is sent before the abort is processed.
+ // Abort may happen before or after response headers have been sent.
+ Logger.LogInformation("Server aborting.");
+ context.Abort();
+ }, protocol: HttpProtocols.Http3);
+
+ using (var host = builder.Build())
+ using (var client = HttpHelpers.CreateClient())
+ {
+ await host.StartAsync().DefaultTimeout();
+
+ for (var i = 0; i < 100; i++)
+ {
+ Logger.LogInformation($"Client sending request {i}");
+
+ var request = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request.Version = GetProtocol(HttpProtocols.Http3);
+ request.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
+
+ // Act
+ var sendTask = client.SendAsync(request, CancellationToken.None);
+
+ // Assert
+ var ex = await Assert.ThrowsAsync<HttpRequestException>(async () =>
+ {
+ // Note that there is a race here on what is sent before the abort is processed.
+ // Abort may happen before or after response headers have been sent.
+ Logger.LogInformation($"Client awaiting response {i}");
+ var response = await sendTask;
+
+ Logger.LogInformation($"Client awaiting content {i}");
+ await response.Content.ReadAsByteArrayAsync();
+ }).DefaultTimeout();
+
+ var protocolException = ex.GetProtocolException();
+ Assert.Equal((long)Http3ErrorCode.InternalError, protocolException.ErrorCode);
+ }
+
+ await host.StopAsync().DefaultTimeout();
+ }
+ }
+
// Verify HTTP/2 and HTTP/3 match behavior
[ConditionalTheory]
[MsQuicSupported]
@@ -494,7 +628,7 @@ public class Http3RequestTests : LoggedTest
// Assert
if (protocol == HttpProtocols.Http3)
{
- var innerEx = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
+ var innerEx = Assert.IsType<HttpProtocolException>(ex.InnerException);
Assert.Equal(Http3ErrorCode.InternalError, (Http3ErrorCode)innerEx.ErrorCode);
}
@@ -569,6 +703,71 @@ public class Http3RequestTests : LoggedTest
}
[ConditionalFact]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/43374")]
+ [MsQuicSupported]
+ public async Task GET_ConnectionsMakingMultipleRequests_AllSuccess()
+ {
+ // Arrange
+ var requestCount = 0;
+
+ var builder = CreateHostBuilder(context =>
+ {
+ Interlocked.Increment(ref requestCount);
+ return Task.CompletedTask;
+ });
+
+ using (var host = builder.Build())
+ {
+ await host.StartAsync();
+
+ var address = $"https://127.0.0.1:{host.GetPort()}/";
+
+ // Act
+ var connectionRequestTasks = new List<Task<int>>();
+
+ for (var i = 0; i < 10; i++)
+ {
+ connectionRequestTasks.Add(RunConnection(address));
+ }
+
+ var calls = (await Task.WhenAll(connectionRequestTasks)).Sum();
+
+ // Assert
+ Assert.Equal(1000, calls);
+ Assert.Equal(1000, requestCount);
+
+ await host.StopAsync();
+ }
+
+ static async Task<int> RunConnection(string address)
+ {
+ using (var client = HttpHelpers.CreateClient())
+ {
+ var requestTasks = new List<Task>();
+
+ for (var j = 0; j < 100; j++)
+ {
+ requestTasks.Add(MakeRequest(client, address, j));
+ }
+
+ await Task.WhenAll(requestTasks);
+
+ return requestTasks.Count;
+ }
+ }
+
+ static async Task MakeRequest(HttpMessageInvoker client, string address, int count)
+ {
+ var request = new HttpRequestMessage(HttpMethod.Get, address);
+ request.Version = HttpVersion.Version30;
+ request.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
+
+ var response = await client.SendAsync(request, CancellationToken.None);
+ response.EnsureSuccessStatusCode();
+ }
+ }
+
+ [ConditionalFact]
[MsQuicSupported]
public async Task GET_MultipleRequestsInSequence_ReusedState()
{
@@ -625,6 +824,84 @@ public class Http3RequestTests : LoggedTest
}
}
+ [ConditionalFact]
+ [MsQuicSupported]
+ public async Task GET_MultipleRequests_RequestVersionOrHigher_UpgradeToHttp3()
+ {
+ // Arrange
+ await ServerRetryHelper.BindPortsWithRetry(async port =>
+ {
+ var requestHeaders = new List<Dictionary<string, StringValues>>();
+
+ var builder = CreateHostBuilder(
+ context =>
+ {
+ requestHeaders.Add(context.Request.Headers.ToDictionary(k => k.Key, k => k.Value, StringComparer.OrdinalIgnoreCase));
+ return Task.CompletedTask;
+ },
+ configureKestrel: o =>
+ {
+ o.Listen(IPAddress.Parse("127.0.0.1"), port, listenOptions =>
+ {
+ listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
+ listenOptions.UseHttps();
+ });
+ });
+
+ using (var host = builder.Build())
+ using (var client = HttpHelpers.CreateClient())
+ {
+ await host.StartAsync();
+
+ // Act 1
+ var request1 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request1.Headers.Add("id", "1");
+ request1.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+
+ var response1 = await client.SendAsync(request1, CancellationToken.None);
+ response1.EnsureSuccessStatusCode();
+ var request1Headers = requestHeaders.Single(i => i["id"] == "1");
+
+ // Assert 1
+ Assert.Equal(HttpVersion.Version20, response1.Version);
+ Assert.False(request1Headers.ContainsKey("alt-used"));
+
+ // Act 2
+ var request2 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request2.Headers.Add("id", "2");
+ request2.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+
+ var response2 = await client.SendAsync(request2, CancellationToken.None);
+ response2.EnsureSuccessStatusCode();
+ var request2Headers = requestHeaders.Single(i => i["id"] == "2");
+
+ // Assert 2
+ Assert.Equal(HttpVersion.Version30, response2.Version);
+ Assert.True(request2Headers.ContainsKey("alt-used"));
+
+ // Delay to ensure the stream has enough time to return to pool
+ await Task.Delay(100);
+
+ // Act 3
+ var request3 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request3.Headers.Add("id", "3");
+ request3.VersionPolicy = HttpVersionPolicy.RequestVersionOrHigher;
+
+ var response3 = await client.SendAsync(request3, CancellationToken.None);
+ response3.EnsureSuccessStatusCode();
+ var request3Headers = requestHeaders.Single(i => i["id"] == "3");
+
+ // Assert 3
+ Assert.Equal(HttpVersion.Version30, response3.Version);
+ Assert.True(request3Headers.ContainsKey("alt-used"));
+
+ Assert.Same((string)request2Headers["alt-used"], (string)request3Headers["alt-used"]);
+
+ await host.StopAsync();
+ }
+ }, Logger);
+ }
+
// Verify HTTP/2 and HTTP/3 match behavior
[ConditionalTheory]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/38008")]
@@ -1163,6 +1440,58 @@ public class Http3RequestTests : LoggedTest
[ConditionalFact]
[MsQuicSupported]
+ public async Task GET_UseHttpsCallback_ConnectionContextAvailable()
+ {
+ // Arrange
+ BaseConnectionContext connectionContext = null;
+ var builder = CreateHostBuilder(
+ context =>
+ {
+ return Task.CompletedTask;
+ },
+ configureKestrel: kestrel =>
+ {
+ kestrel.ListenLocalhost(5001, listenOptions =>
+ {
+ listenOptions.Protocols = HttpProtocols.Http3;
+ listenOptions.UseHttps(new TlsHandshakeCallbackOptions
+ {
+ OnConnection = context =>
+ {
+ connectionContext = context.Connection;
+ return ValueTask.FromResult(new SslServerAuthenticationOptions
+ {
+ ServerCertificate = TestResources.GetTestCertificate()
+ });
+ }
+ });
+ });
+ });
+
+ using (var host = builder.Build())
+ using (var client = HttpHelpers.CreateClient())
+ {
+ await host.StartAsync();
+
+ var port = 5001;
+
+ // Act
+ var request1 = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{port}/");
+ request1.Version = HttpVersion.Version30;
+ request1.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
+
+ var response1 = await client.SendAsync(request1, CancellationToken.None);
+ response1.EnsureSuccessStatusCode();
+
+ // Assert
+ Assert.NotNull(connectionContext);
+
+ await host.StopAsync();
+ }
+ }
+
+ [ConditionalFact]
+ [MsQuicSupported]
public async Task GET_ClientDisconnected_ConnectionAbortRaised()
{
// Arrange
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs
index 0da58c5118..ec6c7f250e 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/Http3/Http3TlsTests.cs
@@ -4,6 +4,7 @@
using System.Net;
using System.Net.Http;
using System.Net.Quic;
+using System.Net.Security;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.Kestrel.Core;
@@ -15,6 +16,7 @@ using Xunit;
namespace Interop.FunctionalTests.Http3;
+[Collection(nameof(NoParallelCollection))]
public class Http3TlsTests : LoggedTest
{
[ConditionalFact]
@@ -34,7 +36,7 @@ public class Http3TlsTests : LoggedTest
httpsOptions.ServerCertificateSelector = (context, host) =>
{
Assert.Null(context); // The context isn't available durring the quic handshake.
- Assert.Equal("localhost", host);
+ Assert.Equal("testhost", host);
return TestResources.GetTestCertificate();
};
});
@@ -46,11 +48,9 @@ public class Http3TlsTests : LoggedTest
await host.StartAsync().DefaultTimeout();
- // Using localhost instead of 127.0.0.1 because IPs don't set SNI and the Host header isn't currently used as an override.
- var request = new HttpRequestMessage(HttpMethod.Get, $"https://localhost:{host.GetPort()}/");
+ var request = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
request.Version = HttpVersion.Version30;
request.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
- // https://github.com/dotnet/runtime/issues/57169 Host isn't used for SNI
request.Headers.Host = "testhost";
var response = await client.SendAsync(request, CancellationToken.None).DefaultTimeout();
@@ -66,7 +66,6 @@ public class Http3TlsTests : LoggedTest
[InlineData(ClientCertificateMode.RequireCertificate)]
[InlineData(ClientCertificateMode.AllowCertificate)]
[MsQuicSupported]
- [OSSkipCondition(OperatingSystems.MacOSX | OperatingSystems.Linux, SkipReason = "https://github.com/dotnet/aspnetcore/issues/35800")]
[MaximumOSVersion(OperatingSystems.Windows, WindowsVersions.Win10_20H2,
SkipReason = "Windows versions newer than 20H2 do not enable TLS 1.1: https://github.com/dotnet/aspnetcore/issues/37761")]
public async Task ClientCertificate_AllowOrRequire_Available_Accepted(ClientCertificateMode mode)
@@ -111,7 +110,6 @@ public class Http3TlsTests : LoggedTest
[InlineData(ClientCertificateMode.NoCertificate)]
[InlineData(ClientCertificateMode.DelayCertificate)]
[MsQuicSupported]
- [OSSkipCondition(OperatingSystems.MacOSX | OperatingSystems.Linux, SkipReason = "https://github.com/dotnet/aspnetcore/issues/35800")]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/41131")]
public async Task ClientCertificate_NoOrDelayed_Available_Ignored(ClientCertificateMode mode)
{
@@ -157,7 +155,6 @@ public class Http3TlsTests : LoggedTest
[InlineData(ClientCertificateMode.AllowCertificate, false)]
[InlineData(ClientCertificateMode.AllowCertificate, true)]
[MsQuicSupported]
- [OSSkipCondition(OperatingSystems.MacOSX | OperatingSystems.Linux, SkipReason = "https://github.com/dotnet/aspnetcore/issues/35800")]
[QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/35070")]
public async Task ClientCertificate_AllowOrRequire_Available_Invalid_Refused(ClientCertificateMode mode, bool serverAllowInvalid)
{
@@ -196,17 +193,16 @@ public class Http3TlsTests : LoggedTest
if (!serverAllowInvalid)
{
- // In .NET 6 there is a race condition between throwing HttpRequestException and QuicException.
- // Unable to test the exact error.
- var ex = await Assert.ThrowsAnyAsync<Exception>(() => sendTask).DefaultTimeout();
+ var ex = await Assert.ThrowsAnyAsync<HttpRequestException>(() => sendTask).DefaultTimeout();
Logger.LogInformation(ex, "SendAsync successfully threw error.");
}
else
{
- // Because we can't verify the exact error reason, check that the cert is the cause be successfully
+ // Because we can't verify the exact error reason, check that the cert is the cause by successfully
// making a call when invalid certs are allowed.
- var response = await sendTask.DefaultTimeout();
+ using var response = await sendTask.DefaultTimeout();
response.EnsureSuccessStatusCode();
+ Assert.Equal("True", await response.Content.ReadAsStringAsync().DefaultTimeout());
}
await host.StopAsync().DefaultTimeout();
@@ -214,7 +210,7 @@ public class Http3TlsTests : LoggedTest
[ConditionalFact]
[MsQuicSupported]
- [OSSkipCondition(OperatingSystems.MacOSX | OperatingSystems.Linux, SkipReason = "https://github.com/dotnet/aspnetcore/issues/35800")]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42388")]
public async Task ClientCertificate_Allow_NotAvailable_Optional()
{
var builder = CreateHostBuilder(async context =>
@@ -244,17 +240,51 @@ public class Http3TlsTests : LoggedTest
request.Version = HttpVersion.Version30;
request.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
- // https://github.com/dotnet/runtime/issues/57308, optional client certs aren't supported.
- var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.SendAsync(request, CancellationToken.None).DefaultTimeout());
- Assert.StartsWith("Connection has been shutdown by transport.", ex.Message);
+ var response = await client.SendAsync(request, CancellationToken.None).DefaultTimeout();
+ Assert.True(response.IsSuccessStatusCode);
+ Assert.Equal("False", await response.Content.ReadAsStringAsync());
await host.StopAsync().DefaultTimeout();
}
+ [ConditionalTheory]
+ [MsQuicSupported]
+ [InlineData(HttpProtocols.Http3)]
+ [InlineData(HttpProtocols.Http1AndHttp2AndHttp3)]
+ public async Task OnAuthenticate_Available_Throws(HttpProtocols protocols)
+ {
+ await ServerRetryHelper.BindPortsWithRetry(async port =>
+ {
+ var builder = CreateHostBuilder(async context =>
+ {
+ await context.Response.WriteAsync("Hello World");
+ }, configureKestrel: kestrelOptions =>
+ {
+ kestrelOptions.ListenAnyIP(port, listenOptions =>
+ {
+ listenOptions.Protocols = protocols;
+ listenOptions.UseHttps(httpsOptions =>
+ {
+ httpsOptions.OnAuthenticate = (_, _) => { };
+ });
+ });
+ });
+
+ using var host = builder.Build();
+ using var client = HttpHelpers.CreateClient();
+
+ var exception = await Assert.ThrowsAsync<NotSupportedException>(() =>
+ host.StartAsync().DefaultTimeout());
+ Assert.Equal("The OnAuthenticate callback is not supported with HTTP/3.", exception.Message);
+ }, Logger);
+ }
+
[ConditionalFact]
[MsQuicSupported]
- public async Task OnAuthentice_Available_Throws()
+ public async Task TlsHandshakeCallbackOptions_Invoked()
{
+ var configuredState = new object();
+ object callbackState = null;
var builder = CreateHostBuilder(async context =>
{
await context.Response.WriteAsync("Hello World");
@@ -263,9 +293,18 @@ public class Http3TlsTests : LoggedTest
kestrelOptions.ListenAnyIP(0, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http3;
- listenOptions.UseHttps(httpsOptions =>
+ listenOptions.UseHttps(new TlsHandshakeCallbackOptions
{
- httpsOptions.OnAuthenticate = (_, _) => { };
+ OnConnection = (context) =>
+ {
+ callbackState = context.State;
+ return ValueTask.FromResult(new SslServerAuthenticationOptions
+ {
+ ServerCertificate = TestResources.GetTestCertificate(),
+ ApplicationProtocols = new List<SslApplicationProtocol> { SslApplicationProtocol.Http3 }
+ });
+ },
+ OnConnectionState = configuredState
});
});
});
@@ -273,9 +312,22 @@ public class Http3TlsTests : LoggedTest
using var host = builder.Build();
using var client = HttpHelpers.CreateClient();
- var exception = await Assert.ThrowsAsync<NotSupportedException>(() =>
- host.StartAsync().DefaultTimeout());
- Assert.Equal("The OnAuthenticate callback is not supported with HTTP/3.", exception.Message);
+ await host.StartAsync().DefaultTimeout();
+
+ var request = new HttpRequestMessage(HttpMethod.Get, $"https://127.0.0.1:{host.GetPort()}/");
+ request.Version = HttpVersion.Version30;
+ request.VersionPolicy = HttpVersionPolicy.RequestVersionExact;
+ request.Headers.Host = "testhost";
+
+ var response = await client.SendAsync(request, CancellationToken.None).DefaultTimeout();
+ response.EnsureSuccessStatusCode();
+ var result = await response.Content.ReadAsStringAsync();
+ Assert.Equal(HttpVersion.Version30, response.Version);
+ Assert.Equal("Hello World", result);
+
+ Assert.Equal(configuredState, callbackState);
+
+ await host.StopAsync().DefaultTimeout();
}
private IHostBuilder CreateHostBuilder(RequestDelegate requestDelegate, HttpProtocols? protocol = null, Action<KestrelServerOptions> configureKestrel = null)
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpClientHttp2InteropTests.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpClientHttp2InteropTests.cs
index 84b7dfed76..086a96b163 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpClientHttp2InteropTests.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpClientHttp2InteropTests.cs
@@ -600,7 +600,7 @@ public class HttpClientHttp2InteropTests : LoggedTest
var url = host.MakeUrl(scheme);
using var client = CreateClient();
var exception = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(url)).DefaultTimeout();
- Assert.Equal("The HTTP/2 server reset the stream. HTTP/2 error code 'CANCEL' (0x8).", exception?.InnerException?.InnerException.Message);
+ Assert.Equal("The HTTP/2 server reset the stream. HTTP/2 error code 'CANCEL' (0x8).", exception?.InnerException?.Message);
await host.StopAsync().DefaultTimeout();
}
@@ -629,7 +629,7 @@ public class HttpClientHttp2InteropTests : LoggedTest
response.EnsureSuccessStatusCode();
receivedHeaders.SetResult();
var exception = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync()).DefaultTimeout();
- Assert.Equal("The HTTP/2 server reset the stream. HTTP/2 error code 'CANCEL' (0x8).", exception?.InnerException?.InnerException.Message);
+ Assert.Equal("The HTTP/2 server reset the stream. HTTP/2 error code 'CANCEL' (0x8).", exception?.InnerException?.Message);
await host.StopAsync().DefaultTimeout();
}
@@ -742,7 +742,7 @@ public class HttpClientHttp2InteropTests : LoggedTest
await serverReset.Task.DefaultTimeout();
var responseEx = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync().DefaultTimeout());
Assert.Contains("The HTTP/2 server reset the stream. HTTP/2 error code 'CANCEL' (0x8)", responseEx.ToString());
- await Assert.ThrowsAsync<IOException>(() => streamingContent.SendAsync("Hello World").DefaultTimeout());
+ await Assert.ThrowsAsync<HttpProtocolException>(() => streamingContent.SendAsync("Hello World").DefaultTimeout());
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => clientEcho.Task.DefaultTimeout());
await host.StopAsync().DefaultTimeout();
@@ -801,7 +801,7 @@ public class HttpClientHttp2InteropTests : LoggedTest
await serverReset.Task.DefaultTimeout();
var responseEx = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync().DefaultTimeout());
Assert.Contains("The HTTP/2 server reset the stream. HTTP/2 error code 'CANCEL' (0x8)", responseEx.ToString());
- await Assert.ThrowsAsync<IOException>(() => streamingContent.SendAsync("Hello World").DefaultTimeout());
+ await Assert.ThrowsAsync<HttpProtocolException>(() => streamingContent.SendAsync("Hello World").DefaultTimeout());
await Assert.ThrowsAnyAsync<OperationCanceledException>(() => clientEcho.Task.DefaultTimeout());
await host.StopAsync().DefaultTimeout();
@@ -1311,6 +1311,7 @@ public class HttpClientHttp2InteropTests : LoggedTest
[Theory]
[MemberData(nameof(SupportedSchemes))]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/41363")]
public async Task Settings_MaxFrameSize_Larger_Server(string scheme)
{
var hostBuilder = new HostBuilder()
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs
index 6dec979584..1cf46a3d41 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/HttpHelpers.cs
@@ -19,6 +19,22 @@ namespace Interop.FunctionalTests;
internal static class HttpHelpers
{
+ public static HttpProtocolException GetProtocolException(this Exception ex)
+ {
+ var current = ex;
+ while (current != null)
+ {
+ if (current is HttpProtocolException httpProtocolException)
+ {
+ return httpProtocolException;
+ }
+
+ current = current.InnerException;
+ }
+
+ throw new Exception($"Couldn't find {nameof(HttpProtocolException)}. Original error: {ex}");
+ }
+
public static HttpMessageInvoker CreateClient(TimeSpan? idleTimeout = null, TimeSpan? expect100ContinueTimeout = null, bool includeClientCert = false)
{
var handler = new SocketsHttpHandler();
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/Interop.FunctionalTests.csproj b/src/Servers/Kestrel/test/Interop.FunctionalTests/Interop.FunctionalTests.csproj
index 358a06a38f..15abbc1151 100644
--- a/src/Servers/Kestrel/test/Interop.FunctionalTests/Interop.FunctionalTests.csproj
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/Interop.FunctionalTests.csproj
@@ -7,6 +7,9 @@
<!-- WebDriver is not strong named, so this test assembly cannot be strong-named either. -->
<SignAssembly>false</SignAssembly>
<SkipHelixAlpine>true</SkipHelixAlpine>
+ <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
+ <!-- Required for System.Net.Quic which has a preview API in .NET 7 -->
+ <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
<ItemGroup>
@@ -21,11 +24,7 @@
<Compile Include="$(SharedSourceRoot)HttpClient\HttpEventSourceListener.cs" LinkBase="shared" />
<Content Include="$(KestrelSharedSourceRoot)test\TestCertificates\*.pfx" LinkBase="shared\TestCertificates" CopyToOutputDirectory="PreserveNewest" />
<Compile Include="$(KestrelSharedSourceRoot)test\TransportTestHelpers\MsQuicSupportedAttribute.cs" LinkBase="shared\TransportTestHelpers\MsQuicSupportedAttribute.cs" />
- </ItemGroup>
-
- <ItemGroup>
- <!-- Required for QUIC & HTTP/3 in .NET 6 - https://github.com/dotnet/runtime/pull/55332 -->
- <RuntimeHostConfigurationOption Include="System.Net.SocketsHttpHandler.Http3Support" Value="true" />
+ <Compile Include="$(KestrelSharedSourceRoot)test\ServerRetryHelper.cs" LinkBase="shared" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Servers/Kestrel/test/Interop.FunctionalTests/NoParallelCollection.cs b/src/Servers/Kestrel/test/Interop.FunctionalTests/NoParallelCollection.cs
new file mode 100644
index 0000000000..247b844e58
--- /dev/null
+++ b/src/Servers/Kestrel/test/Interop.FunctionalTests/NoParallelCollection.cs
@@ -0,0 +1,10 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Interop.FunctionalTests;
+
+// Define test collection for tests to avoid all other tests.
+// Parallelization disable for QUIC test to avoid test flakiness from msquic refusing connections
+// because of high resource usage. See https://github.com/dotnet/runtime/issues/55979
+[CollectionDefinition(nameof(NoParallelCollection), DisableParallelization = true)]
+public partial class NoParallelCollection { }
diff --git a/src/Servers/Kestrel/test/SystemdActivation/Dockerfile b/src/Servers/Kestrel/test/SystemdActivation/Dockerfile
deleted file mode 100644
index 5aee5312dd..0000000000
--- a/src/Servers/Kestrel/test/SystemdActivation/Dockerfile
+++ /dev/null
@@ -1,23 +0,0 @@
-FROM microsoft/dotnet-nightly:2.0-runtime-deps
-
-# The "container" environment variable is read by systemd.
-ENV container=docker
-
-# Install and configure dependencies.
-RUN ["apt-get", "-o", "Acquire::Check-Valid-Until=false", "update"]
-RUN ["apt-get", "install", "-y", "--no-install-recommends", "systemd", "socat"]
-
-# Copy .NET installation.
-ADD .dotnet/ /usr/share/dotnet/
-RUN ["ln", "-s", "/usr/share/dotnet/dotnet", "/usr/bin/dotnet"]
-
-# Copy "publish" app.
-ADD publish/ /publish/
-
-# Expose target ports.
-EXPOSE 8080 8081 8082 8083 8084 8085
-
-# Set entrypoint.
-COPY ./docker-entrypoint.sh /
-RUN chmod +x /docker-entrypoint.sh
-ENTRYPOINT ["/docker-entrypoint.sh"]
diff --git a/src/Servers/Kestrel/test/SystemdActivation/docker-entrypoint.sh b/src/Servers/Kestrel/test/SystemdActivation/docker-entrypoint.sh
deleted file mode 100755
index cb8d2f2d6f..0000000000
--- a/src/Servers/Kestrel/test/SystemdActivation/docker-entrypoint.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-set -e
-
-cd /publish
-systemd-socket-activate -l 8080 -E ASPNETCORE_BASE_PORT=7000 dotnet SystemdTestApp.dll &
-socat TCP-LISTEN:8081,fork TCP-CONNECT:127.0.0.1:7000 &
-socat TCP-LISTEN:8082,fork TCP-CONNECT:127.0.0.1:7001 &
-systemd-socket-activate -l /tmp/activate-kestrel.sock -E ASPNETCORE_BASE_PORT=7100 dotnet SystemdTestApp.dll &
-socat TCP-LISTEN:8083,fork UNIX-CLIENT:/tmp/activate-kestrel.sock &
-socat TCP-LISTEN:8084,fork TCP-CONNECT:127.0.0.1:7100 &
-socat TCP-LISTEN:8085,fork TCP-CONNECT:127.0.0.1:7101 &
-trap 'exit 0' SIGTERM
-wait
diff --git a/src/Servers/Kestrel/test/SystemdActivation/docker.sh b/src/Servers/Kestrel/test/SystemdActivation/docker.sh
deleted file mode 100755
index 2983d5a9da..0000000000
--- a/src/Servers/Kestrel/test/SystemdActivation/docker.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/env bash
-
-set -e
-
-scriptDir=$(dirname "${BASH_SOURCE[0]}")
-dotnetDir="$PWD/.build/.dotnet"
-PATH="$dotnetDir:$PATH"
-dotnet publish -f netcoreapp2.2 ./samples/SystemdTestApp/
-cp -R ./samples/SystemdTestApp/bin/Debug/netcoreapp2.2/publish/ $scriptDir
-cp -R $dotnetDir $scriptDir
-
-image=$(docker build -qf $scriptDir/Dockerfile $scriptDir)
-container=$(docker run -Pd $image)
-
-# Try to connect to SystemdTestApp once a second up to 10 times via all available ports.
-for i in {1..10}; do
- curl -f http://$(docker port $container 8080/tcp) \
- && curl -f http://$(docker port $container 8081/tcp) \
- && curl -fk https://$(docker port $container 8082/tcp) \
- && curl -f http://$(docker port $container 8083/tcp) \
- && curl -f http://$(docker port $container 8084/tcp) \
- && curl -fk https://$(docker port $container 8085/tcp) \
- && exit 0 || sleep 1;
-done
-
-exit -1
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/CodeGenerator.csproj b/src/Servers/Kestrel/tools/CodeGenerator/CodeGenerator.csproj
index 1fbcacd357..207921c9a9 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/CodeGenerator.csproj
+++ b/src/Servers/Kestrel/tools/CodeGenerator/CodeGenerator.csproj
@@ -9,6 +9,7 @@
<ItemGroup>
<Compile Include="$(KestrelSharedSourceRoot)KnownHeaders.cs" />
+ <Compile Include="$(SharedSourceRoot)InternalHeaderNames.cs" Link="Shared\InternalHeaderNames.cs"/>
<Compile Include="$(SharedSourceRoot)runtime\Http2\Hpack\H2StaticTable.Http2.cs" Link="Shared\runtime\Http2\%(Filename)%(Extension)" />
<Compile Include="$(SharedSourceRoot)runtime\Http2\Hpack\H2StaticTable.cs" Link="Shared\runtime\Http2\%(Filename)%(Extension)" />
<Compile Include="$(SharedSourceRoot)runtime\Http2\Hpack\HeaderField.cs" Link="Shared\runtime\Http2\%(Filename)%(Extension)" />
@@ -24,7 +25,7 @@
<PropertyGroup>
<StartWorkingDirectory>$(MSBuildThisFileDirectory)..\..\</StartWorkingDirectory>
- <StartArguments>Core/src/Internal/Http/HttpHeaders.Generated.cs Core/src/Internal/Http/HttpProtocol.Generated.cs Core/src/Internal/Infrastructure/HttpUtilities.Generated.cs Core/src/Internal/Http2/Http2Connection.Generated.cs shared/TransportMultiplexedConnection.Generated.cs shared/TransportConnection.Generated.cs</StartArguments>
+ <StartArguments>Core/src/Internal/Http/HttpHeaders.Generated.cs Core/src/Internal/Http/HttpProtocol.Generated.cs Core/src/Internal/Infrastructure/HttpUtilities.Generated.cs shared/TransportMultiplexedConnection.Generated.cs shared/TransportConnection.Generated.cs</StartArguments>
</PropertyGroup>
</Project>
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/FeatureCollectionGenerator.cs b/src/Servers/Kestrel/tools/CodeGenerator/FeatureCollectionGenerator.cs
index 1181356f08..beb68b861c 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/FeatureCollectionGenerator.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/FeatureCollectionGenerator.cs
@@ -1,10 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
namespace CodeGenerator;
public static class FeatureCollectionGenerator
@@ -220,7 +216,7 @@ namespace {namespaceName}
return values.Any() ? values.Select(formatter).Aggregate((a, b) => a + b) : "";
}
- private class KnownFeature
+ private sealed class KnownFeature
{
public string Name;
public int Index;
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/Http2Connection.cs b/src/Servers/Kestrel/tools/CodeGenerator/Http2Connection.cs
deleted file mode 100644
index 2cb0a79290..0000000000
--- a/src/Servers/Kestrel/tools/CodeGenerator/Http2Connection.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Collections.Generic;
-using Microsoft.Net.Http.Headers;
-
-namespace CodeGenerator;
-
-public static class Http2Connection
-{
- public static string GenerateFile()
- {
- return ReadOnlySpanStaticDataGenerator.GenerateFile(
- namespaceName: "Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2",
- className: "Http2Connection",
- allProperties: GetStrings());
- }
-
- private static IEnumerable<(string Name, string Value)> GetStrings()
- {
- yield return ("ClientPreface", "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n");
- yield return ("Authority", HeaderNames.Authority);
- yield return ("Method", HeaderNames.Method);
- yield return ("Path", HeaderNames.Path);
- yield return ("Scheme", HeaderNames.Scheme);
- yield return ("Status", HeaderNames.Status);
- yield return ("Connection", "connection");
- yield return ("Te", "te");
- yield return ("Trailers", "trailers");
- yield return ("Connect", "CONNECT");
- }
-}
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/HttpProtocolFeatureCollection.cs b/src/Servers/Kestrel/tools/CodeGenerator/HttpProtocolFeatureCollection.cs
index 251a6b092e..6d43d799af 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/HttpProtocolFeatureCollection.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/HttpProtocolFeatureCollection.cs
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Linq;
-
namespace CodeGenerator;
public class HttpProtocolFeatureCollection
@@ -11,49 +9,51 @@ public class HttpProtocolFeatureCollection
{
var alwaysFeatures = new[]
{
- "IHttpRequestFeature",
- "IHttpResponseFeature",
- "IHttpResponseBodyFeature",
- "IRouteValuesFeature",
- "IEndpointFeature",
- "IServiceProvidersFeature",
- "IHttpActivityFeature"
- };
+ "IHttpRequestFeature",
+ "IHttpResponseFeature",
+ "IHttpResponseBodyFeature",
+ "IRouteValuesFeature",
+ "IEndpointFeature",
+ "IServiceProvidersFeature",
+ "IHttpActivityFeature"
+ };
var commonFeatures = new[]
{
- "IItemsFeature",
- "IQueryFeature",
- "IRequestBodyPipeFeature",
- "IFormFeature",
- "IHttpAuthenticationFeature",
- "IHttpRequestIdentifierFeature",
- };
+ "IItemsFeature",
+ "IQueryFeature",
+ "IRequestBodyPipeFeature",
+ "IFormFeature",
+ "IHttpAuthenticationFeature",
+ "IHttpRequestIdentifierFeature",
+ };
var sometimesFeatures = new[]
{
- "IHttpConnectionFeature",
- "ISessionFeature",
- "IResponseCookiesFeature",
- "IHttpRequestTrailersFeature",
- "IHttpResponseTrailersFeature",
- "ITlsConnectionFeature",
- "IHttpUpgradeFeature",
- "IHttpWebSocketFeature",
- "IBadRequestExceptionFeature"
- };
+ "IHttpConnectionFeature",
+ "ISessionFeature",
+ "IResponseCookiesFeature",
+ "IHttpRequestTrailersFeature",
+ "IHttpResponseTrailersFeature",
+ "ITlsConnectionFeature",
+ "IHttpExtendedConnectFeature",
+ "IHttpUpgradeFeature",
+ "IHttpWebSocketFeature",
+ "IHttpWebTransportFeature",
+ "IBadRequestExceptionFeature"
+ };
var maybeFeatures = new[]
{
- "IHttp2StreamIdFeature",
- "IHttpRequestLifetimeFeature",
- "IHttpMaxRequestBodySizeFeature",
- "IHttpMinRequestBodyDataRateFeature",
- "IHttpMinResponseDataRateFeature",
- "IHttpBodyControlFeature",
- "IHttpRequestBodyDetectionFeature",
- "IHttpResetFeature",
- "IPersistentStateFeature"
- };
+ "IHttp2StreamIdFeature",
+ "IHttpRequestLifetimeFeature",
+ "IHttpMaxRequestBodySizeFeature",
+ "IHttpMinRequestBodyDataRateFeature",
+ "IHttpMinResponseDataRateFeature",
+ "IHttpBodyControlFeature",
+ "IHttpRequestBodyDetectionFeature",
+ "IHttpResetFeature",
+ "IPersistentStateFeature"
+ };
var allFeatures = alwaysFeatures
.Concat(commonFeatures)
@@ -65,22 +65,24 @@ public class HttpProtocolFeatureCollection
// See also: src/Kestrel.Core/Internal/Http/HttpProtocol.FeatureCollection.cs
var implementedFeatures = new[]
{
- "IHttpRequestFeature",
- "IHttpResponseFeature",
- "IHttpResponseBodyFeature",
- "IRouteValuesFeature",
- "IEndpointFeature",
- "IHttpRequestIdentifierFeature",
- "IHttpRequestTrailersFeature",
- "IHttpUpgradeFeature",
- "IRequestBodyPipeFeature",
- "IHttpConnectionFeature",
- "IHttpRequestLifetimeFeature",
- "IHttpBodyControlFeature",
- "IHttpMaxRequestBodySizeFeature",
- "IHttpRequestBodyDetectionFeature",
- "IBadRequestExceptionFeature"
- };
+ "IHttpRequestFeature",
+ "IHttpResponseFeature",
+ "IHttpResponseBodyFeature",
+ "IRouteValuesFeature",
+ "IEndpointFeature",
+ "IHttpRequestIdentifierFeature",
+ "IHttpRequestTrailersFeature",
+ "IHttpExtendedConnectFeature",
+ "IHttpUpgradeFeature",
+ "IRequestBodyPipeFeature",
+ "IHttpConnectionFeature",
+ "IHttpRequestLifetimeFeature",
+ "IHttpBodyControlFeature",
+ "IHttpMaxRequestBodySizeFeature",
+ "IHttpRequestBodyDetectionFeature",
+ "IHttpWebTransportFeature",
+ "IBadRequestExceptionFeature"
+ };
var usings = $@"
using Microsoft.AspNetCore.Connections.Features;
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/CombinationsWithoutRepetition.cs b/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/CombinationsWithoutRepetition.cs
index 43fcf2a53c..49b7698b0e 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/CombinationsWithoutRepetition.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/CombinationsWithoutRepetition.cs
@@ -1,14 +1,12 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Collections;
-using System.Collections.Generic;
namespace CodeGenerator.HttpUtilities;
// C code for Algorithm L (Lexicographic combinations) in Section 7.2.1.3 of The Art of Computer Programming, Volume 4A: Combinatorial Algorithms, Part 1 :
-internal class CombinationsWithoutRepetition<T> : IEnumerator<T[]>
+internal sealed class CombinationsWithoutRepetition<T> : IEnumerator<T[]>
{
private bool _firstElement;
private int[] _pointers;
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilities.cs b/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilities.cs
index dba82a4c10..f2aa5ce0ca 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilities.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilities.cs
@@ -1,12 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Buffers.Binary;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
-using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Http;
@@ -245,10 +242,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
private static string GetMethodString(string method)
{
- if (method == null)
- {
- throw new ArgumentNullException(nameof(method));
- }
+ ArgumentNullException.ThrowIfNull(method);
const int length = sizeof(ulong);
@@ -276,7 +270,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure
return result;
}
- private class MethodInfo
+ private sealed class MethodInfo
{
public string MethodAsciiString;
public ulong AsciiStringAsLong;
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilitiesGeneratorHelpers.cs b/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilitiesGeneratorHelpers.cs
index 5ae0836816..f3e0fb9ac7 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilitiesGeneratorHelpers.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/HttpUtilities/HttpUtilitiesGeneratorHelpers.cs
@@ -1,17 +1,15 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Text;
namespace CodeGenerator.HttpUtilities;
-internal class HttpUtilitiesGeneratorHelpers
+internal sealed class HttpUtilitiesGeneratorHelpers
{
- public class ShiftInfo<TMask>
+ public sealed class ShiftInfo<TMask>
{
public TMask Mask;
public byte Shift;
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/Program.cs b/src/Servers/Kestrel/tools/CodeGenerator/Program.cs
index 46560ecef0..c620064a3e 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/Program.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/Program.cs
@@ -1,9 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.IO;
-
namespace CodeGenerator;
public class Program
@@ -27,21 +24,16 @@ public class Program
}
else if (args.Length < 4)
{
- Console.Error.WriteLine("Missing path to Http2Connection.Generated.cs");
- return 1;
- }
- else if (args.Length < 5)
- {
Console.Error.WriteLine("Missing path to TransportMultiplexedConnection.Generated.cs");
return 1;
}
- else if (args.Length < 6)
+ else if (args.Length < 5)
{
Console.Error.WriteLine("Missing path to TransportConnection.Generated.cs");
return 1;
}
- Run(args[0], args[1], args[2], args[3], args[4], args[5]);
+ Run(args[0], args[1], args[2], args[3], args[4]);
return 0;
}
@@ -50,7 +42,6 @@ public class Program
string knownHeadersPath,
string httpProtocolFeatureCollectionPath,
string httpUtilitiesPath,
- string http2ConnectionPath,
string transportMultiplexedConnectionFeatureCollectionPath,
string transportConnectionFeatureCollectionPath)
{
@@ -59,12 +50,10 @@ public class Program
var httpUtilitiesContent = HttpUtilities.HttpUtilities.GeneratedFile();
var transportMultiplexedConnectionFeatureCollectionContent = TransportMultiplexedConnectionFeatureCollection.GenerateFile();
var transportConnectionFeatureCollectionContent = TransportConnectionFeatureCollection.GenerateFile();
- var http2ConnectionContent = Http2Connection.GenerateFile();
UpdateFile(knownHeadersPath, knownHeadersContent);
UpdateFile(httpProtocolFeatureCollectionPath, httpProtocolFeatureCollectionContent);
UpdateFile(httpUtilitiesPath, httpUtilitiesContent);
- UpdateFile(http2ConnectionPath, http2ConnectionContent);
UpdateFile(transportMultiplexedConnectionFeatureCollectionPath, transportMultiplexedConnectionFeatureCollectionContent);
UpdateFile(transportConnectionFeatureCollectionPath, transportConnectionFeatureCollectionContent);
}
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/ReadOnlySpanStaticDataGenerator.cs b/src/Servers/Kestrel/tools/CodeGenerator/ReadOnlySpanStaticDataGenerator.cs
deleted file mode 100644
index db80edf8c0..0000000000
--- a/src/Servers/Kestrel/tools/CodeGenerator/ReadOnlySpanStaticDataGenerator.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Linq;
-using System.Text;
-
-namespace CodeGenerator;
-
-public static class ReadOnlySpanStaticDataGenerator
-{
- public static string GenerateFile(string namespaceName, string className, IEnumerable<(string Name, string Value)> allProperties)
- {
- var properties = allProperties.Select((p, index) => new Property
- {
- Data = p,
- Index = index
- });
-
- var s = $@"// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System;
-
-#nullable enable
-
-namespace {namespaceName}
-{{
- internal partial class {className}
- {{
- // This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- {Each(properties, p => $@"
- private static ReadOnlySpan<byte> {p.Data.Name}Bytes => new byte[{p.Data.Value.Length}] {{ {GetDataAsBytes(p.Data.Value)} }};")}
- }}
-}}
-";
-
- return s;
- }
-
- private static string Each<T>(IEnumerable<T> values, Func<T, string> formatter)
- {
- return values.Any() ? values.Select(formatter).Aggregate((a, b) => a + b) : "";
- }
-
- private static string GetDataAsBytes(string value)
- {
- var stringBuilder = new StringBuilder();
-
- for (var i = 0; i < value.Length; ++i)
- {
- var c = value[i];
- if (c == '\n')
- {
- stringBuilder.Append("(byte)'\\n'");
- }
- else if (c == '\r')
- {
- stringBuilder.Append("(byte)'\\r'");
- }
- else
- {
- stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "(byte)'{0}'", c);
- }
-
- if (i < value.Length - 1)
- {
- stringBuilder.Append(", ");
- }
- }
-
- return stringBuilder.ToString();
- }
-
- private class Property
- {
- public (string Name, string Value) Data;
- public int Index;
- }
-}
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/TransportConnectionFeatureCollection.cs b/src/Servers/Kestrel/tools/CodeGenerator/TransportConnectionFeatureCollection.cs
index cd28d4d0d7..056320c238 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/TransportConnectionFeatureCollection.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/TransportConnectionFeatureCollection.cs
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-
namespace CodeGenerator;
public class TransportConnectionFeatureCollection
@@ -14,27 +12,28 @@ public class TransportConnectionFeatureCollection
var allFeatures = new[]
{
- "IConnectionIdFeature",
- "IConnectionTransportFeature",
- "IConnectionItemsFeature",
- "IPersistentStateFeature",
- "IMemoryPoolFeature",
- "IConnectionLifetimeFeature",
- "IConnectionSocketFeature",
- "IProtocolErrorCodeFeature",
- "IStreamDirectionFeature",
- "IStreamIdFeature",
- "IStreamAbortFeature"
- };
+ "IConnectionIdFeature",
+ "IConnectionTransportFeature",
+ "IConnectionItemsFeature",
+ "IPersistentStateFeature",
+ "IMemoryPoolFeature",
+ "IConnectionLifetimeFeature",
+ "IConnectionSocketFeature",
+ "IProtocolErrorCodeFeature",
+ "IStreamDirectionFeature",
+ "IStreamIdFeature",
+ "IStreamAbortFeature",
+ "IStreamClosedFeature"
+ };
var implementedFeatures = new[]
{
- "IConnectionIdFeature",
- "IConnectionTransportFeature",
- "IConnectionItemsFeature",
- "IMemoryPoolFeature",
- "IConnectionLifetimeFeature"
- };
+ "IConnectionIdFeature",
+ "IConnectionTransportFeature",
+ "IConnectionItemsFeature",
+ "IMemoryPoolFeature",
+ "IConnectionLifetimeFeature"
+ };
var usings = $@"
using Microsoft.AspNetCore.Connections.Features;
diff --git a/src/Servers/Kestrel/tools/CodeGenerator/TransportMultiplexedConnectionFeatureCollection.cs b/src/Servers/Kestrel/tools/CodeGenerator/TransportMultiplexedConnectionFeatureCollection.cs
index 4c7baefcdf..29a4cd8a7c 100644
--- a/src/Servers/Kestrel/tools/CodeGenerator/TransportMultiplexedConnectionFeatureCollection.cs
+++ b/src/Servers/Kestrel/tools/CodeGenerator/TransportMultiplexedConnectionFeatureCollection.cs
@@ -1,8 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-
namespace CodeGenerator;
public class TransportMultiplexedConnectionFeatureCollection
diff --git a/src/Servers/test/FunctionalTests/HelloWorldTest.cs b/src/Servers/test/FunctionalTests/HelloWorldTest.cs
index 23cdf5eee2..f65126a04d 100644
--- a/src/Servers/test/FunctionalTests/HelloWorldTest.cs
+++ b/src/Servers/test/FunctionalTests/HelloWorldTest.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Server.IntegrationTesting;
using Microsoft.AspNetCore.Testing;
@@ -108,4 +109,57 @@ public class HelloWorldTests : LoggedTest
}
}
}
+
+ public static TestMatrix SelfHostTestVariants
+ => TestMatrix.ForServers(ServerType.Kestrel, ServerType.HttpSys)
+ .WithTfms(Tfm.Default)
+ .WithApplicationTypes(ApplicationType.Portable)
+ .WithAllHostingModels()
+ .WithAllArchitectures();
+
+ [ConditionalTheory]
+ [MemberData(nameof(SelfHostTestVariants))]
+ [QuarantinedTest("https://github.com/dotnet/aspnetcore/issues/42380")]
+ public async Task ApplicationException(TestVariant variant)
+ {
+ var testName = $"ApplicationException_{variant.Server}_{variant.Tfm}_{variant.Architecture}_{variant.ApplicationType}";
+ using (StartLog(out var loggerFactory, LogLevel.Debug, testName))
+ {
+ var logger = loggerFactory.CreateLogger("ApplicationException");
+
+ var deploymentParameters = new DeploymentParameters(variant)
+ {
+ ApplicationPath = Helpers.GetApplicationPath()
+ };
+
+ var output = string.Empty;
+ using (var deployer = new SelfHostDeployer(deploymentParameters, loggerFactory))
+ {
+ deployer.ProcessOutputListener = (data) =>
+ {
+ if (!string.IsNullOrWhiteSpace(data))
+ {
+ output += data + '\n';
+ }
+ };
+
+ var deploymentResult = await deployer.DeployAsync();
+
+ // Request to base address and check if various parts of the body are rendered & measure the cold startup time.
+ using (var response = await RetryHelper.RetryRequest(() =>
+ {
+ return deploymentResult.HttpClient.GetAsync("/throwexception");
+ }, logger, deploymentResult.HostShutdownToken))
+ {
+ Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode);
+
+ var body = await response.Content.ReadAsStringAsync();
+ Assert.Empty(body);
+ }
+ }
+ // Output should contain the ApplicationException and the 500 status code
+ Assert.Contains("System.ApplicationException: Application exception", output);
+ Assert.Contains("/throwexception - - - 500", output);
+ }
+ }
}
diff --git a/src/Servers/testassets/ServerComparison.TestSites/Startup.cs b/src/Servers/testassets/ServerComparison.TestSites/Startup.cs
index 61e3e3b27e..93ef6b8df8 100644
--- a/src/Servers/testassets/ServerComparison.TestSites/Startup.cs
+++ b/src/Servers/testassets/ServerComparison.TestSites/Startup.cs
@@ -12,6 +12,14 @@ public class Startup
{
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
+ app.Map("/throwexception", subApp =>
+ {
+ subApp.Run(context =>
+ {
+ throw new ApplicationException("Application exception");
+ });
+ });
+
app.Run(ctx =>
{
return ctx.Response.WriteAsync("Hello World " + RuntimeInformation.ProcessArchitecture);
diff --git a/src/Shared/BenchmarkRunner/DefaultCoreConfig.cs b/src/Shared/BenchmarkRunner/DefaultCoreConfig.cs
index ac93cfeea4..75a908411b 100644
--- a/src/Shared/BenchmarkRunner/DefaultCoreConfig.cs
+++ b/src/Shared/BenchmarkRunner/DefaultCoreConfig.cs
@@ -14,7 +14,7 @@ using BenchmarkDotNet.Validators;
namespace BenchmarkDotNet.Attributes;
-internal class DefaultCoreConfig : ManualConfig
+internal sealed class DefaultCoreConfig : ManualConfig
{
public DefaultCoreConfig()
{
diff --git a/src/Shared/BenchmarkRunner/DefaultCoreDebugConfig.cs b/src/Shared/BenchmarkRunner/DefaultCoreDebugConfig.cs
index e6ea6dee74..f96f2bee4e 100644
--- a/src/Shared/BenchmarkRunner/DefaultCoreDebugConfig.cs
+++ b/src/Shared/BenchmarkRunner/DefaultCoreDebugConfig.cs
@@ -9,7 +9,7 @@ using BenchmarkDotNet.Validators;
namespace BenchmarkDotNet.Attributes;
-internal class DefaultCoreDebugConfig : ManualConfig
+internal sealed class DefaultCoreDebugConfig : ManualConfig
{
public DefaultCoreDebugConfig()
{
diff --git a/src/Shared/BenchmarkRunner/DefaultCorePerfLabConfig.cs b/src/Shared/BenchmarkRunner/DefaultCorePerfLabConfig.cs
index 181cc8a267..d13ae29069 100644
--- a/src/Shared/BenchmarkRunner/DefaultCorePerfLabConfig.cs
+++ b/src/Shared/BenchmarkRunner/DefaultCorePerfLabConfig.cs
@@ -13,7 +13,7 @@ using BenchmarkDotNet.Validators;
namespace BenchmarkDotNet.Attributes;
-internal class DefaultCorePerfLabConfig : ManualConfig
+internal sealed class DefaultCorePerfLabConfig : ManualConfig
{
public DefaultCorePerfLabConfig()
{
diff --git a/src/Shared/BenchmarkRunner/DefaultCoreProfileConfig.cs b/src/Shared/BenchmarkRunner/DefaultCoreProfileConfig.cs
index d4563b5377..ac7876a7c8 100644
--- a/src/Shared/BenchmarkRunner/DefaultCoreProfileConfig.cs
+++ b/src/Shared/BenchmarkRunner/DefaultCoreProfileConfig.cs
@@ -12,7 +12,7 @@ using BenchmarkDotNet.Validators;
namespace BenchmarkDotNet.Attributes;
-internal class DefaultCoreProfileConfig : ManualConfig
+internal sealed class DefaultCoreProfileConfig : ManualConfig
{
public DefaultCoreProfileConfig()
{
diff --git a/src/Shared/BenchmarkRunner/DefaultCoreValidationConfig.cs b/src/Shared/BenchmarkRunner/DefaultCoreValidationConfig.cs
index 13851619b8..97e5f47df8 100644
--- a/src/Shared/BenchmarkRunner/DefaultCoreValidationConfig.cs
+++ b/src/Shared/BenchmarkRunner/DefaultCoreValidationConfig.cs
@@ -8,7 +8,7 @@ using BenchmarkDotNet.Toolchains.InProcess.NoEmit;
namespace BenchmarkDotNet.Attributes;
-internal class DefaultCoreValidationConfig : ManualConfig
+internal sealed class DefaultCoreValidationConfig : ManualConfig
{
public DefaultCoreValidationConfig()
{
diff --git a/src/Shared/BenchmarkRunner/ParameterizedJobConfigAttribute.cs b/src/Shared/BenchmarkRunner/ParameterizedJobConfigAttribute.cs
index ba4f8241d8..628ace0a03 100644
--- a/src/Shared/BenchmarkRunner/ParameterizedJobConfigAttribute.cs
+++ b/src/Shared/BenchmarkRunner/ParameterizedJobConfigAttribute.cs
@@ -6,7 +6,7 @@ using System;
namespace BenchmarkDotNet.Attributes;
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly)]
-internal class ParameterizedJobConfigAttribute : AspNetCoreBenchmarkAttribute
+internal sealed class ParameterizedJobConfigAttribute : AspNetCoreBenchmarkAttribute
{
public ParameterizedJobConfigAttribute(Type configType) : base(configType)
{
diff --git a/src/Shared/BenchmarkRunner/Program.cs b/src/Shared/BenchmarkRunner/Program.cs
index b7c089a9ea..1fb0890528 100644
--- a/src/Shared/BenchmarkRunner/Program.cs
+++ b/src/Shared/BenchmarkRunner/Program.cs
@@ -16,7 +16,7 @@ using BenchmarkDotNet.Toolchains.DotNetCli;
namespace Microsoft.AspNetCore.BenchmarkDotNet.Runner;
-partial class Program
+sealed partial class Program
{
private static TextWriter _standardOutput;
private static StringBuilder _standardOutputText;
diff --git a/src/Shared/BrowserTesting/src/BrowserTestOutputLogger.cs b/src/Shared/BrowserTesting/src/BrowserTestOutputLogger.cs
index 223f83a1ad..d9e2aa04d7 100644
--- a/src/Shared/BrowserTesting/src/BrowserTestOutputLogger.cs
+++ b/src/Shared/BrowserTesting/src/BrowserTestOutputLogger.cs
@@ -7,7 +7,7 @@ using Xunit.Abstractions;
namespace Microsoft.AspNetCore.BrowserTesting;
-internal class BrowserTestOutputLogger : ITestOutputHelper
+internal sealed class BrowserTestOutputLogger : ITestOutputHelper
{
private readonly ILogger _logger;
diff --git a/src/Shared/Buffers.MemoryPool/DiagnosticMemoryPool.cs b/src/Shared/Buffers.MemoryPool/DiagnosticMemoryPool.cs
index 0cf812934d..5c7f2cd686 100644
--- a/src/Shared/Buffers.MemoryPool/DiagnosticMemoryPool.cs
+++ b/src/Shared/Buffers.MemoryPool/DiagnosticMemoryPool.cs
@@ -10,7 +10,7 @@ namespace System.Buffers;
/// <summary>
/// Used to allocate and distribute re-usable blocks of memory.
/// </summary>
-internal class DiagnosticMemoryPool : MemoryPool<byte>
+internal sealed class DiagnosticMemoryPool : MemoryPool<byte>
{
private readonly MemoryPool<byte> _pool;
diff --git a/src/Shared/Buffers.MemoryPool/MemoryPoolThrowHelper.cs b/src/Shared/Buffers.MemoryPool/MemoryPoolThrowHelper.cs
index a0da635154..de41f133a1 100644
--- a/src/Shared/Buffers.MemoryPool/MemoryPoolThrowHelper.cs
+++ b/src/Shared/Buffers.MemoryPool/MemoryPoolThrowHelper.cs
@@ -1,4 +1,4 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Diagnostics;
@@ -7,7 +7,7 @@ using System.Text;
namespace System.Buffers;
-internal class MemoryPoolThrowHelper
+internal sealed class MemoryPoolThrowHelper
{
public static void ThrowArgumentOutOfRangeException(int sourceLength, int offset)
{
diff --git a/src/Shared/Buffers.Testing/BufferSegment.cs b/src/Shared/Buffers.Testing/BufferSegment.cs
index 79f063ba34..2fadaf00dd 100644
--- a/src/Shared/Buffers.Testing/BufferSegment.cs
+++ b/src/Shared/Buffers.Testing/BufferSegment.cs
@@ -3,7 +3,7 @@
namespace System.Buffers;
-internal class BufferSegment : ReadOnlySequenceSegment<byte>
+internal sealed class BufferSegment : ReadOnlySequenceSegment<byte>
{
public BufferSegment(Memory<byte> memory)
{
diff --git a/src/Shared/Buffers.Testing/CustomMemoryForTest.cs b/src/Shared/Buffers.Testing/CustomMemoryForTest.cs
index b26ab2f6ea..4b534091d6 100644
--- a/src/Shared/Buffers.Testing/CustomMemoryForTest.cs
+++ b/src/Shared/Buffers.Testing/CustomMemoryForTest.cs
@@ -3,7 +3,7 @@
namespace System.Buffers;
-internal class CustomMemoryForTest<T> : IMemoryOwner<T>
+internal sealed class CustomMemoryForTest<T> : IMemoryOwner<T>
{
private bool _disposed;
private T[] _array;
diff --git a/src/Shared/Buffers.Testing/ReadOnlySequenceFactory.cs b/src/Shared/Buffers.Testing/ReadOnlySequenceFactory.cs
index 861fead137..d7e044d91a 100644
--- a/src/Shared/Buffers.Testing/ReadOnlySequenceFactory.cs
+++ b/src/Shared/Buffers.Testing/ReadOnlySequenceFactory.cs
@@ -24,7 +24,7 @@ internal abstract class ReadOnlySequenceFactory
return CreateWithContent(Encoding.ASCII.GetBytes(data));
}
- internal class ArrayTestSequenceFactory : ReadOnlySequenceFactory
+ internal sealed class ArrayTestSequenceFactory : ReadOnlySequenceFactory
{
public override ReadOnlySequence<byte> CreateOfSize(int size)
{
@@ -39,7 +39,7 @@ internal abstract class ReadOnlySequenceFactory
}
}
- internal class MemoryTestSequenceFactory : ReadOnlySequenceFactory
+ internal sealed class MemoryTestSequenceFactory : ReadOnlySequenceFactory
{
public override ReadOnlySequence<byte> CreateOfSize(int size)
{
@@ -54,7 +54,7 @@ internal abstract class ReadOnlySequenceFactory
}
}
- internal class OwnedMemoryTestSequenceFactory : ReadOnlySequenceFactory
+ internal sealed class OwnedMemoryTestSequenceFactory : ReadOnlySequenceFactory
{
public override ReadOnlySequence<byte> CreateOfSize(int size)
{
@@ -69,7 +69,7 @@ internal abstract class ReadOnlySequenceFactory
}
}
- internal class SingleSegmentTestSequenceFactory : ReadOnlySequenceFactory
+ internal sealed class SingleSegmentTestSequenceFactory : ReadOnlySequenceFactory
{
public override ReadOnlySequence<byte> CreateOfSize(int size)
{
@@ -82,7 +82,7 @@ internal abstract class ReadOnlySequenceFactory
}
}
- internal class BytePerSegmentTestSequenceFactory : ReadOnlySequenceFactory
+ internal sealed class BytePerSegmentTestSequenceFactory : ReadOnlySequenceFactory
{
public override ReadOnlySequence<byte> CreateOfSize(int size)
{
diff --git a/src/Servers/Kestrel/Core/src/Internal/CancellationTokenSourcePool.cs b/src/Shared/CancellationTokenSourcePool.cs
index feca4acbd3..94279b1f97 100644
--- a/src/Servers/Kestrel/Core/src/Internal/CancellationTokenSourcePool.cs
+++ b/src/Shared/CancellationTokenSourcePool.cs
@@ -3,9 +3,9 @@
using System.Collections.Concurrent;
-namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
+namespace Microsoft.AspNetCore.Internal;
-internal class CancellationTokenSourcePool
+internal sealed class CancellationTokenSourcePool
{
private const int MaxQueueSize = 1024;
@@ -38,7 +38,7 @@ internal class CancellationTokenSourcePool
/// A <see cref="CancellationTokenSource"/> with a back pointer to the pool it came from.
/// Dispose will return it to the pool.
/// </summary>
- public class PooledCancellationTokenSource : CancellationTokenSource
+ public sealed class PooledCancellationTokenSource : CancellationTokenSource
{
private readonly CancellationTokenSourcePool _pool;
diff --git a/src/Shared/CertificateGeneration/CertificateManager.cs b/src/Shared/CertificateGeneration/CertificateManager.cs
index 9f7baf1de2..0bd57f57de 100644
--- a/src/Shared/CertificateGeneration/CertificateManager.cs
+++ b/src/Shared/CertificateGeneration/CertificateManager.cs
@@ -1,12 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Tracing;
-using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
@@ -19,6 +16,8 @@ namespace Microsoft.AspNetCore.Certificates.Generation;
internal abstract class CertificateManager
{
internal const int CurrentAspNetCoreCertificateVersion = 2;
+
+ // OID used for HTTPS certs
internal const string AspNetHttpsOid = "1.3.6.1.4.1.311.84.1.1";
internal const string AspNetHttpsOidFriendlyName = "ASP.NET Core HTTPS development certificate";
@@ -78,7 +77,7 @@ internal abstract class CertificateManager
{
using var store = new X509Store(storeName, location);
store.Open(OpenFlags.ReadOnly);
- certificates.AddRange(store.Certificates.OfType<X509Certificate2>());
+ PopulateCertificatesFromStore(store, certificates);
IEnumerable<X509Certificate2> matchingCertificates = certificates;
matchingCertificates = matchingCertificates
.Where(c => HasOid(c, AspNetHttpsOid));
@@ -161,6 +160,11 @@ internal abstract class CertificateManager
GetCertificateVersion(certificate) >= AspNetHttpsCertificateVersion;
}
+ protected virtual void PopulateCertificatesFromStore(X509Store store, List<X509Certificate2> certificates)
+ {
+ certificates.AddRange(store.Certificates.OfType<X509Certificate2>());
+ }
+
public IList<X509Certificate2> GetHttpsCertificates() =>
ListCertificates(StoreName.My, StoreLocation.CurrentUser, isValid: true, requireExportable: true);
@@ -340,6 +344,15 @@ internal abstract class CertificateManager
result = EnsureCertificateResult.FailedToTrustTheCertificate;
return result;
}
+
+ if (result == EnsureCertificateResult.ValidCertificatePresent)
+ {
+ result = EnsureCertificateResult.ExistingHttpsCertificateTrusted;
+ }
+ else
+ {
+ result = EnsureCertificateResult.NewHttpsCertificateTrusted;
+ }
}
DisposeCertificates(!isNewCertificate ? certificates : certificates.Append(certificate));
@@ -411,13 +424,6 @@ internal abstract class CertificateManager
public void CleanupHttpsCertificates()
{
- // On OS X we don't have a good way to manage trusted certificates in the system keychain
- // so we do everything by invoking the native toolchain.
- // This has some limitations, like for example not being able to identify our custom OID extension. For that
- // matter, when we are cleaning up certificates on the machine, we start by removing the trusted certificates.
- // To do this, we list the certificates that we can identify on the current user personal store and we invoke
- // the native toolchain to remove them from the sytem keychain. Once we have removed the trusted certificates,
- // we remove the certificates from the local user store to finish up the cleanup.
var certificates = ListCertificates(StoreName.My, StoreLocation.CurrentUser, isValid: false);
var filteredCertificates = certificates.Where(c => c.Subject == Subject);
@@ -430,6 +436,8 @@ internal abstract class CertificateManager
foreach (var certificate in filteredCertificates)
{
+ // RemoveLocations.All will first remove from the trusted roots (e.g. keychain on
+ // macOS) and then from the local user store.
RemoveCertificate(certificate, RemoveLocations.All);
}
}
@@ -494,11 +502,11 @@ internal abstract class CertificateManager
// Export the key first to an encrypted PEM to avoid issues with System.Security.Cryptography.Cng indicating that the operation is not supported.
// This is likely by design to avoid exporting the key by mistake.
// To bypass it, we export the certificate to pem temporarily and then we import it and export it as unprotected PEM.
- keyBytes = key.ExportEncryptedPkcs8PrivateKey("", new PbeParameters(PbeEncryptionAlgorithm.Aes256Cbc, HashAlgorithmName.SHA256, 1));
+ keyBytes = key.ExportEncryptedPkcs8PrivateKey(string.Empty, new PbeParameters(PbeEncryptionAlgorithm.Aes256Cbc, HashAlgorithmName.SHA256, 1));
pem = PemEncoding.Write("ENCRYPTED PRIVATE KEY", keyBytes);
key.Dispose();
key = RSA.Create();
- key.ImportFromEncryptedPem(pem, "");
+ key.ImportFromEncryptedPem(pem, string.Empty);
Array.Clear(keyBytes, 0, keyBytes.Length);
Array.Clear(pem, 0, pem.Length);
keyBytes = key.ExportPkcs8PrivateKey();
@@ -742,7 +750,7 @@ internal abstract class CertificateManager
}
}
- private static void RemoveCertificateFromUserStore(X509Certificate2 certificate)
+ protected virtual void RemoveCertificateFromUserStore(X509Certificate2 certificate)
{
try
{
@@ -750,14 +758,7 @@ internal abstract class CertificateManager
{
Log.RemoveCertificateFromUserStoreStart(GetDescription(certificate));
}
- using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
- store.Open(OpenFlags.ReadWrite);
- var matching = store.Certificates
- .OfType<X509Certificate2>()
- .Single(c => c.SerialNumber == certificate.SerialNumber);
-
- store.Remove(matching);
- store.Close();
+ RemoveCertificateFromUserStoreCore(certificate);
Log.RemoveCertificateFromUserStoreEnd();
}
catch (Exception ex) when (Log.IsEnabled())
@@ -767,6 +768,17 @@ internal abstract class CertificateManager
}
}
+ protected virtual void RemoveCertificateFromUserStoreCore(X509Certificate2 certificate)
+ {
+ using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
+ store.Open(OpenFlags.ReadWrite);
+ var matching = store.Certificates
+ .OfType<X509Certificate2>()
+ .Single(c => c.SerialNumber == certificate.SerialNumber);
+
+ store.Remove(matching);
+ }
+
internal static string ToCertificateDescription(IEnumerable<X509Certificate2> certificates)
{
var list = certificates.ToList();
@@ -784,7 +796,7 @@ internal abstract class CertificateManager
$"{c.Thumbprint} - {c.Subject} - Valid from {c.NotBefore:u} to {c.NotAfter:u} - IsHttpsDevelopmentCertificate: {IsHttpsDevelopmentCertificate(c).ToString().ToLowerInvariant()} - IsExportable: {Instance.IsExportable(c).ToString().ToLowerInvariant()}";
[EventSource(Name = "Dotnet-dev-certs")]
- public class CertificateManagerEventSource : EventSource
+ public sealed class CertificateManagerEventSource : EventSource
{
[Event(1, Level = EventLevel.Verbose, Message = "Listing certificates from {0}\\{1}")]
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Parameters passed to WriteEvent are all primative values.")]
@@ -941,8 +953,8 @@ internal abstract class CertificateManager
[Event(55, Level = EventLevel.Verbose, Message = "Finished importing the certificate to the keychain.")]
internal void MacOSAddCertificateToKeyChainEnd() => WriteEvent(55);
- [Event(56, Level = EventLevel.Error, Message = "An error has occurred while importing the certificate to the keychain: {0}.")]
- internal void MacOSAddCertificateToKeyChainError(int exitCode) => WriteEvent(56, exitCode);
+ [Event(56, Level = EventLevel.Error, Message = "An error has occurred while importing the certificate to the keychain: {0}, {1}")]
+ internal void MacOSAddCertificateToKeyChainError(int exitCode, string output) => WriteEvent(56, exitCode, output);
[Event(57, Level = EventLevel.Verbose, Message = "Writing the certificate to: {0}.")]
public void WritePemKeyToDisk(string path) => WriteEvent(57, path);
@@ -967,9 +979,30 @@ internal abstract class CertificateManager
[Event(64, Level = EventLevel.Error, Message = "The provided certificate '{0}' is not a valid ASP.NET Core HTTPS development certificate.")]
internal void NoHttpsDevelopmentCertificate(string description) => WriteEvent(64, description);
+
+ [Event(65, Level = EventLevel.Verbose, Message = "The certificate is already trusted.")]
+ public void MacOSCertificateAlreadyTrusted() => WriteEvent(65);
+
+ [Event(66, Level = EventLevel.Verbose, Message = "Saving the certificate {1} to the user profile folder '{0}'.")]
+ internal void MacOSAddCertificateToUserProfileDirStart(string directory, string certificate) => WriteEvent(66, directory, certificate);
+
+ [Event(67, Level = EventLevel.Verbose, Message = "Finished saving the certificate to the user profile folder.")]
+ internal void MacOSAddCertificateToUserProfileDirEnd() => WriteEvent(67);
+
+ [Event(68, Level = EventLevel.Error, Message = "An error has occurred while saving certificate '{0}' in the user profile folder: {1}.")]
+ internal void MacOSAddCertificateToUserProfileDirError(string certificateThumbprint, string errorMessage) => WriteEvent(68, certificateThumbprint, errorMessage);
+
+ [Event(69, Level = EventLevel.Error, Message = "An error has occurred while removing certificate '{0}' from the user profile folder: {1}.")]
+ internal void MacOSRemoveCertificateFromUserProfileDirError(string certificateThumbprint, string errorMessage) => WriteEvent(69, certificateThumbprint, errorMessage);
+
+ [Event(70, Level = EventLevel.Error, Message = "The file '{0}' is not a valid certificate.")]
+ internal void MacOSFileIsNotAValidCertificate(string path) => WriteEvent(70, path);
+
+ [Event(71, Level = EventLevel.Warning, Message = "The on-disk store directory was not found.")]
+ internal void MacOSDiskStoreDoesNotExist() => WriteEvent(71);
}
- internal class UserCancelledTrustException : Exception
+ internal sealed class UserCancelledTrustException : Exception
{
}
diff --git a/src/Shared/CertificateGeneration/EnsureCertificateResult.cs b/src/Shared/CertificateGeneration/EnsureCertificateResult.cs
index eb1e3c0b0a..842b84a364 100644
--- a/src/Shared/CertificateGeneration/EnsureCertificateResult.cs
+++ b/src/Shared/CertificateGeneration/EnsureCertificateResult.cs
@@ -13,5 +13,7 @@ internal enum EnsureCertificateResult
FailedToTrustTheCertificate,
UserCancelledTrustStep,
FailedToMakeKeyAccessible,
+ ExistingHttpsCertificateTrusted,
+ NewHttpsCertificateTrusted
}
diff --git a/src/Shared/CertificateGeneration/MacOSCertificateManager.cs b/src/Shared/CertificateGeneration/MacOSCertificateManager.cs
index 4ad94e7942..343a93f00b 100644
--- a/src/Shared/CertificateGeneration/MacOSCertificateManager.cs
+++ b/src/Shared/CertificateGeneration/MacOSCertificateManager.cs
@@ -1,11 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
using System.Globalization;
-using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
@@ -13,26 +11,58 @@ using System.Text.RegularExpressions;
namespace Microsoft.AspNetCore.Certificates.Generation;
-internal class MacOSCertificateManager : CertificateManager
+internal sealed class MacOSCertificateManager : CertificateManager
{
- private const string CertificateSubjectRegex = "CN=(.*[^,]+).*";
- private static readonly string MacOSUserKeyChain = Environment.GetEnvironmentVariable("HOME") + "/Library/Keychains/login.keychain-db";
- private const string MacOSSystemKeyChain = "/Library/Keychains/System.keychain";
- private const string MacOSFindCertificateCommandLine = "security";
- private const string MacOSFindCertificateCommandLineArgumentsFormat = "find-certificate -c {0} -a -Z -p " + MacOSSystemKeyChain;
- private const string MacOSFindCertificateOutputRegex = "SHA-1 hash: ([0-9A-Z]+)";
- private const string MacOSRemoveCertificateTrustCommandLine = "sudo";
- private const string MacOSRemoveCertificateTrustCommandLineArgumentsFormat = "security remove-trusted-cert -d {0}";
+ // User keychain. Guard with quotes when using in command lines since users may have set
+ // their user profile (HOME) directory to a non-standard path that includes whitespace.
+ private static readonly string MacOSUserKeychain = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "/Library/Keychains/login.keychain-db";
+
+ // System keychain. We no longer store certificates or create trust rules in the system
+ // keychain, but check for their presence here so that we can clean up state left behind
+ // by pre-.NET 7 versions of this tool.
+ private const string MacOSSystemKeychain = "/Library/Keychains/System.keychain";
+
+ // Well-known location on disk where dev-certs are stored.
+ private static readonly string MacOSUserHttpsCertificateLocation = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".aspnet", "dev-certs", "https");
+
+ // Verify the certificate {0} for the SSL and X.509 Basic Policy.
+ private const string MacOSVerifyCertificateCommandLine = "security";
+ private const string MacOSVerifyCertificateCommandLineArgumentsFormat = "verify-cert -c \"{0}\" -p basic -p ssl";
+
+ // Delete a certificate with the specified SHA-256 (or SHA-1) hash {0} from keychain {1}.
private const string MacOSDeleteCertificateCommandLine = "sudo";
- private const string MacOSDeleteCertificateCommandLineArgumentsFormat = "security delete-certificate -Z {0} {1}";
- private const string MacOSTrustCertificateCommandLine = "sudo";
- private const string MacOSTrustCertificateCommandLineArguments = "security add-trusted-cert -d -r trustRoot -k " + MacOSSystemKeyChain + " ";
+ private const string MacOSDeleteCertificateCommandLineArgumentsFormat = "security delete-certificate -Z {0} \"{1}\"";
+ // Add a certificate to the per-user trust settings in the user keychain. The trust policy
+ // for the certificate will be set to be always trusted for SSL and X.509 Basic Policy.
+ // Note: This operation will require user authentication.
+ private const string MacOSTrustCertificateCommandLine = "security";
+ private static readonly string MacOSTrustCertificateCommandLineArguments = $"add-trusted-cert -p basic -p ssl -k \"{MacOSUserKeychain}\" ";
+
+ // Import a pkcs12 certificate into the user keychain using the unwrapping passphrase {1}, and
+ // allow any application to access the imported key without warning.
private const string MacOSAddCertificateToKeyChainCommandLine = "security";
- private static readonly string MacOSAddCertificateToKeyChainCommandLineArgumentsFormat = "import {0} -k " + MacOSUserKeyChain + " -t cert -f pkcs12 -P {1} -A";
+ private static readonly string MacOSAddCertificateToKeyChainCommandLineArgumentsFormat = "import \"{0}\" -k \"" + MacOSUserKeychain + "\" -t cert -f pkcs12 -P {1} -A";
+
+ // Remove a certificate from the admin trust settings. We no longer add certificates to the
+ // admin trust settings, but need this for cleaning up certs generated by pre-.NET 7 versions
+ // of this tool that used to create trust settings in the system keychain.
+ // Note: This operation will require user authentication.
+ private const string MacOSUntrustLegacyCertificateCommandLine = "sudo";
+ private const string MacOSUntrustLegacyCertificateCommandLineArguments = "security remove-trusted-cert -d \"{0}\"";
+
+ // Find all matching certificates on the keychain {1} that have the name {0} and print
+ // print their SHA-256 and SHA-1 hashes.
+ private const string MacOSFindCertificateOnKeychainCommandLine = "security";
+ private const string MacOSFindCertificateOnKeychainCommandLineArgumentsFormat = "find-certificate -c {0} -a -Z -p \"{1}\"";
+
+ // Format used by the tool when printing SHA-1 hashes.
+ private const string MacOSFindCertificateOutputRegex = "SHA-1 hash: ([0-9A-Z]+)";
- public const string InvalidCertificateState = "The ASP.NET Core developer certificate is in an invalid state. " +
- "To fix this issue, run the following commands 'dotnet dev-certs https --clean' and 'dotnet dev-certs https' to remove all existing ASP.NET Core development certificates " +
+ public const string InvalidCertificateState =
+ "The ASP.NET Core developer certificate is in an invalid state. " +
+ "To fix this issue, run 'dotnet dev-certs https --clean' and 'dotnet dev-certs https' " +
+ "to remove all existing ASP.NET Core development certificates " +
"and create a new untrusted developer certificate. " +
"On macOS or Windows, use 'dotnet dev-certs https --trust' to trust the new certificate.";
@@ -41,8 +71,6 @@ internal class MacOSCertificateManager : CertificateManager
"A prompt might appear to ask for permission to access the key. " +
"When that happens, select 'Always Allow' to grant 'dotnet' access to the certificate key in the future.";
- private static readonly TimeSpan MaxRegexTimeout = TimeSpan.FromMinutes(1);
-
public MacOSCertificateManager()
{
}
@@ -54,6 +82,12 @@ internal class MacOSCertificateManager : CertificateManager
protected override void TrustCertificateCore(X509Certificate2 publicCertificate)
{
+ if (IsTrusted(publicCertificate))
+ {
+ Log.MacOSCertificateAlreadyTrusted();
+ return;
+ }
+
var tmpFile = Path.GetTempFileName();
try
{
@@ -77,10 +111,7 @@ internal class MacOSCertificateManager : CertificateManager
{
try
{
- if (File.Exists(tmpFile))
- {
- File.Delete(tmpFile);
- }
+ File.Delete(tmpFile);
}
catch
{
@@ -91,103 +122,75 @@ internal class MacOSCertificateManager : CertificateManager
internal override CheckCertificateStateResult CheckCertificateState(X509Certificate2 candidate, bool interactive)
{
- var sentinelPath = Path.Combine(Environment.GetEnvironmentVariable("HOME")!, ".dotnet", $"certificates.{candidate.GetCertHashString(HashAlgorithmName.SHA256)}.sentinel");
- if (!interactive && !File.Exists(sentinelPath))
- {
- return new CheckCertificateStateResult(false, KeyNotAccessibleWithoutUserInteraction);
- }
+ return File.Exists(GetCertificateFilePath(candidate)) ?
+ new CheckCertificateStateResult(true, null) :
+ new CheckCertificateStateResult(false, InvalidCertificateState);
+ }
- // Tries to use the certificate key to validate it can't access it
+ internal override void CorrectCertificateState(X509Certificate2 candidate)
+ {
try
{
- using var rsa = candidate.GetRSAPrivateKey();
- if (rsa == null)
- {
- return new CheckCertificateStateResult(false, InvalidCertificateState);
- }
-
- // Encrypting a random value is the ultimate test for a key validity.
- // Windows and Mac OS both return HasPrivateKey = true if there is (or there has been) a private key associated
- // with the certificate at some point.
- var value = new byte[32];
- RandomNumberGenerator.Fill(value);
- rsa.Decrypt(rsa.Encrypt(value, RSAEncryptionPadding.Pkcs1), RSAEncryptionPadding.Pkcs1);
+ // Ensure that the directory exists before writing to the file.
+ Directory.CreateDirectory(MacOSUserHttpsCertificateLocation);
- // If we were able to access the key, create a sentinel so that we don't have to show a prompt
- // on every kestrel run.
- if (Directory.Exists(Path.GetDirectoryName(sentinelPath)) && !File.Exists(sentinelPath))
- {
- File.WriteAllText(sentinelPath, "true");
- }
-
- // Being able to encrypt and decrypt a payload is the strongest guarantee that the key is valid.
- return new CheckCertificateStateResult(true, null);
- }
- catch (Exception)
- {
- return new CheckCertificateStateResult(false, InvalidCertificateState);
+ var certificatePath = GetCertificateFilePath(candidate);
+ ExportCertificate(candidate, certificatePath, includePrivateKey: true, null, CertificateKeyExportFormat.Pfx);
}
- }
-
- internal override void CorrectCertificateState(X509Certificate2 candidate)
- {
- var status = CheckCertificateState(candidate, true);
- if (!status.Success)
+ catch (Exception ex)
{
- throw new InvalidOperationException(InvalidCertificateState);
+ Log.MacOSAddCertificateToUserProfileDirError(candidate.Thumbprint, ex.Message);
}
}
+ // Use verify-cert to verify the certificate for the SSL and X.509 Basic Policy.
public override bool IsTrusted(X509Certificate2 certificate)
{
- var subjectMatch = Regex.Match(certificate.Subject, CertificateSubjectRegex, RegexOptions.Singleline, MaxRegexTimeout);
- if (!subjectMatch.Success)
+ var tmpFile = Path.GetTempFileName();
+ try
{
- throw new InvalidOperationException($"Can't determine the subject for the certificate with subject '{certificate.Subject}'.");
+ ExportCertificate(certificate, tmpFile, includePrivateKey: false, password: null, CertificateKeyExportFormat.Pem);
+
+ using var checkTrustProcess = Process.Start(new ProcessStartInfo(
+ MacOSVerifyCertificateCommandLine,
+ string.Format(CultureInfo.InvariantCulture, MacOSVerifyCertificateCommandLineArgumentsFormat, tmpFile))
+ {
+ RedirectStandardOutput = true,
+ // Do this to avoid showing output to the console when the cert is not trusted. It is trivial to export
+ // the cert and replicate the command to see details.
+ RedirectStandardError = true,
+ });
+ checkTrustProcess!.WaitForExit();
+ return checkTrustProcess.ExitCode == 0;
}
- var subject = subjectMatch.Groups[1].Value;
- using var checkTrustProcess = Process.Start(new ProcessStartInfo(
- MacOSFindCertificateCommandLine,
- string.Format(CultureInfo.InvariantCulture, MacOSFindCertificateCommandLineArgumentsFormat, subject))
+ finally
{
- RedirectStandardOutput = true
- });
- var output = checkTrustProcess!.StandardOutput.ReadToEnd();
- checkTrustProcess.WaitForExit();
- var matches = Regex.Matches(output, MacOSFindCertificateOutputRegex, RegexOptions.Multiline, MaxRegexTimeout);
- var hashes = matches.OfType<Match>().Select(m => m.Groups[1].Value).ToList();
- return hashes.Any(h => string.Equals(h, certificate.Thumbprint, StringComparison.Ordinal));
+ File.Delete(tmpFile);
+ }
}
protected override void RemoveCertificateFromTrustedRoots(X509Certificate2 certificate)
{
- if (IsTrusted(certificate)) // On OSX this check just ensures its on the system keychain
+ if (IsCertOnKeychain(MacOSSystemKeychain, certificate))
{
- // A trusted certificate in OSX is installed into the system keychain and
- // as a "trust rule" applied to it.
- // To remove the certificate we first need to remove the "trust rule" and then
- // remove the certificate from the keychain.
- // We don't care if we fail to remove the trust rule if
- // for some reason the certificate became untrusted.
- // Trying to remove the certificate from the keychain will fail if the certificate is
- // trusted.
+ // Pre-.NET 7 versions of this tool used to store certs and trust settings on the
+ // system keychain. Check if that's the case for this cert, and if so, remove the
+ // trust rule and the cert from the system keychain.
try
{
- RemoveCertificateTrustRule(certificate);
+ RemoveAdminTrustRule(certificate);
+ RemoveCertificateFromKeychain(MacOSSystemKeychain, certificate);
}
catch
{
}
-
- RemoveCertificateFromKeyChain(MacOSSystemKeyChain, certificate);
- }
- else
- {
- Log.MacOSCertificateUntrusted(GetDescription(certificate));
}
+
+ RemoveCertificateFromUserStoreCore(certificate);
}
- private static void RemoveCertificateTrustRule(X509Certificate2 certificate)
+ // Remove the certificate from the admin trust settings.
+ private static void RemoveAdminTrustRule(X509Certificate2 certificate)
{
Log.MacOSRemoveCertificateTrustRuleStart(GetDescription(certificate));
var certificatePath = Path.GetTempFileName();
@@ -196,37 +199,37 @@ internal class MacOSCertificateManager : CertificateManager
var certBytes = certificate.Export(X509ContentType.Cert);
File.WriteAllBytes(certificatePath, certBytes);
var processInfo = new ProcessStartInfo(
- MacOSRemoveCertificateTrustCommandLine,
+ MacOSUntrustLegacyCertificateCommandLine,
string.Format(
CultureInfo.InvariantCulture,
- MacOSRemoveCertificateTrustCommandLineArgumentsFormat,
+ MacOSUntrustLegacyCertificateCommandLineArguments,
certificatePath
));
+
using var process = Process.Start(processInfo);
process!.WaitForExit();
+
if (process.ExitCode != 0)
{
Log.MacOSRemoveCertificateTrustRuleError(process.ExitCode);
}
+
Log.MacOSRemoveCertificateTrustRuleEnd();
}
finally
{
try
{
- if (File.Exists(certificatePath))
- {
- File.Delete(certificatePath);
- }
+ File.Delete(certificatePath);
}
catch
{
- // We don't care about failing to do clean-up on a temp file.
+ // We don't care if we can't delete the temp file.
}
}
}
- private static void RemoveCertificateFromKeyChain(string keyChain, X509Certificate2 certificate)
+ private static void RemoveCertificateFromKeychain(string keychain, X509Certificate2 certificate)
{
var processInfo = new ProcessStartInfo(
MacOSDeleteCertificateCommandLine,
@@ -234,7 +237,7 @@ internal class MacOSCertificateManager : CertificateManager
CultureInfo.InvariantCulture,
MacOSDeleteCertificateCommandLineArgumentsFormat,
certificate.Thumbprint.ToUpperInvariant(),
- keyChain
+ keychain
))
{
RedirectStandardOutput = true,
@@ -243,7 +246,7 @@ internal class MacOSCertificateManager : CertificateManager
if (Log.IsEnabled())
{
- Log.MacOSRemoveCertificateFromKeyChainStart(keyChain, GetDescription(certificate));
+ Log.MacOSRemoveCertificateFromKeyChainStart(keychain, GetDescription(certificate));
}
using (var process = Process.Start(processInfo))
@@ -263,12 +266,70 @@ internal class MacOSCertificateManager : CertificateManager
Log.MacOSRemoveCertificateFromKeyChainEnd();
}
- // We don't have a good way of checking on the underlying implementation if ti is exportable, so just return true.
+ private static bool IsCertOnKeychain(string keychain, X509Certificate2 certificate)
+ {
+ TimeSpan MaxRegexTimeout = TimeSpan.FromMinutes(1);
+ const string CertificateSubjectRegex = "CN=(.*[^,]+).*";
+
+ var subjectMatch = Regex.Match(certificate.Subject, CertificateSubjectRegex, RegexOptions.Singleline, MaxRegexTimeout);
+ if (!subjectMatch.Success)
+ {
+ throw new InvalidOperationException($"Can't determine the subject for the certificate with subject '{certificate.Subject}'.");
+ }
+
+ var subject = subjectMatch.Groups[1].Value;
+
+ // Run the find-certificate command, and look for the cert's hash in the output
+ using var findCertificateProcess = Process.Start(new ProcessStartInfo(
+ MacOSFindCertificateOnKeychainCommandLine,
+ string.Format(CultureInfo.InvariantCulture, MacOSFindCertificateOnKeychainCommandLineArgumentsFormat, subject, keychain))
+ {
+ RedirectStandardOutput = true
+ });
+
+ var output = findCertificateProcess!.StandardOutput.ReadToEnd();
+ findCertificateProcess.WaitForExit();
+
+ var matches = Regex.Matches(output, MacOSFindCertificateOutputRegex, RegexOptions.Multiline, MaxRegexTimeout);
+ var hashes = matches.OfType<Match>().Select(m => m.Groups[1].Value).ToList();
+
+ return hashes.Any(h => string.Equals(h, certificate.Thumbprint, StringComparison.Ordinal));
+ }
+
+ // We don't have a good way of checking on the underlying implementation if it is exportable, so just return true.
protected override bool IsExportable(X509Certificate2 c) => true;
protected override X509Certificate2 SaveCertificateCore(X509Certificate2 certificate, StoreName storeName, StoreLocation storeLocation)
{
- // security import https.pfx -k $loginKeyChain -t cert -f pkcs12 -P password -A;
+ SaveCertificateToUserKeychain(certificate);
+
+ try
+ {
+ var certBytes = certificate.Export(X509ContentType.Pfx);
+
+ if (Log.IsEnabled())
+ {
+ Log.MacOSAddCertificateToUserProfileDirStart(MacOSUserKeychain, GetDescription(certificate));
+ }
+
+ // Ensure that the directory exists before writing to the file.
+ Directory.CreateDirectory(MacOSUserHttpsCertificateLocation);
+
+ File.WriteAllBytes(GetCertificateFilePath(certificate), certBytes);
+ }
+ catch (Exception ex)
+ {
+ Log.MacOSAddCertificateToUserProfileDirError(certificate.Thumbprint, ex.Message);
+ }
+
+ Log.MacOSAddCertificateToKeyChainEnd();
+ Log.MacOSAddCertificateToUserProfileDirEnd();
+
+ return certificate;
+ }
+
+ private static void SaveCertificateToUserKeychain(X509Certificate2 certificate)
+ {
var passwordBytes = new byte[48];
RandomNumberGenerator.Fill(passwordBytes.AsSpan()[0..35]);
var password = Convert.ToBase64String(passwordBytes, 0, 36);
@@ -278,12 +339,7 @@ internal class MacOSCertificateManager : CertificateManager
var processInfo = new ProcessStartInfo(
MacOSAddCertificateToKeyChainCommandLine,
- string.Format(
- CultureInfo.InvariantCulture,
- MacOSAddCertificateToKeyChainCommandLineArgumentsFormat,
- certificatePath,
- password
- ))
+ string.Format(CultureInfo.InvariantCulture, MacOSAddCertificateToKeyChainCommandLineArgumentsFormat, certificatePath, password))
{
RedirectStandardOutput = true,
RedirectStandardError = true
@@ -291,7 +347,7 @@ internal class MacOSCertificateManager : CertificateManager
if (Log.IsEnabled())
{
- Log.MacOSAddCertificateToKeyChainStart(MacOSUserKeyChain, GetDescription(certificate));
+ Log.MacOSAddCertificateToKeyChainStart(MacOSUserKeychain, GetDescription(certificate));
}
using (var process = Process.Start(processInfo))
@@ -301,20 +357,115 @@ internal class MacOSCertificateManager : CertificateManager
if (process.ExitCode != 0)
{
- Log.MacOSAddCertificateToKeyChainError(process.ExitCode);
- throw new InvalidOperationException($@"There was an error importing the certificate into the user key chain '{certificate.Thumbprint}'.
-
-{output}");
+ Log.MacOSAddCertificateToKeyChainError(process.ExitCode, output);
+ throw new InvalidOperationException("Failed to add the certificate to the keychain. Are you running in a non-interactive session perhaps?");
}
}
Log.MacOSAddCertificateToKeyChainEnd();
-
- return certificate;
}
+ private static string GetCertificateFilePath(X509Certificate2 certificate) =>
+ Path.Combine(MacOSUserHttpsCertificateLocation, $"aspnetcore-localhost-{certificate.Thumbprint}.pfx");
+
protected override IList<X509Certificate2> GetCertificatesToRemove(StoreName storeName, StoreLocation storeLocation)
{
return ListCertificates(StoreName.My, StoreLocation.CurrentUser, isValid: false);
}
+
+ protected override void PopulateCertificatesFromStore(X509Store store, List<X509Certificate2> certificates)
+ {
+ if (store.Name! == StoreName.My.ToString() && store.Location == StoreLocation.CurrentUser && Directory.Exists(MacOSUserHttpsCertificateLocation))
+ {
+ var certsFromDisk = GetCertsFromDisk();
+
+ var certsFromStore = new List<X509Certificate2>();
+ base.PopulateCertificatesFromStore(store, certsFromStore);
+
+ // Certs created by pre-.NET 7.
+ var onlyOnKeychain = certsFromStore.Except(certsFromDisk, ThumbprintComparer.Instance);
+
+ // Certs created (or "upgraded") by .NET 7+.
+ // .NET 7+ installs the certificate on disk as well as on the user keychain (for backwards
+ // compatibility with pre-.NET 7).
+ // Note that the actual certs we populate need to be the ones from the store location, and
+ // not the version from disk, since we may do other operations with these certs later (such
+ // as exporting) which would fail with crypto errors otherwise.
+ var onDiskAndKeychain = certsFromStore.Intersect(certsFromDisk, ThumbprintComparer.Instance);
+
+ // The only times we can find a certificate on the keychain and a certificate on keychain+disk
+ // are when the certificate on disk and keychain has expired and a pre-.NET 7 SDK has been
+ // used to create a new certificate, or when a pre-.NET 7 certificate has expired and .NET 7+
+ // has been used to create a new certificate. In both cases, the caller filters the invalid
+ // certificates out, so only the valid certificate is selected.
+ certificates.AddRange(onlyOnKeychain);
+ certificates.AddRange(onDiskAndKeychain);
+ }
+ else
+ {
+ base.PopulateCertificatesFromStore(store, certificates);
+ }
+ }
+
+ private sealed class ThumbprintComparer : IEqualityComparer<X509Certificate2>
+ {
+ public static readonly IEqualityComparer<X509Certificate2> Instance = new ThumbprintComparer();
+
+#pragma warning disable CS8769 // Nullability of reference types in type of parameter doesn't match implemented member (possibly because of nullability attributes).
+ bool IEqualityComparer<X509Certificate2>.Equals(X509Certificate2 x, X509Certificate2 y) =>
+ EqualityComparer<string>.Default.Equals(x?.Thumbprint, y?.Thumbprint);
+#pragma warning restore CS8769 // Nullability of reference types in type of parameter doesn't match implemented member (possibly because of nullability attributes).
+
+ int IEqualityComparer<X509Certificate2>.GetHashCode([DisallowNull] X509Certificate2 obj) =>
+ EqualityComparer<string>.Default.GetHashCode(obj.Thumbprint);
+ }
+
+ private static ICollection<X509Certificate2> GetCertsFromDisk()
+ {
+ var certsFromDisk = new List<X509Certificate2>();
+ if (!Directory.Exists(MacOSUserHttpsCertificateLocation))
+ {
+ Log.MacOSDiskStoreDoesNotExist();
+ }
+ else
+ {
+ var certificateFiles = Directory.EnumerateFiles(MacOSUserHttpsCertificateLocation, "aspnetcore-localhost-*.pfx");
+ foreach (var file in certificateFiles)
+ {
+ try
+ {
+ var certificate = new X509Certificate2(file);
+ certsFromDisk.Add(certificate);
+ }
+ catch (Exception)
+ {
+ Log.MacOSFileIsNotAValidCertificate(file);
+ throw;
+ }
+ }
+ }
+
+ return certsFromDisk;
+ }
+
+ protected override void RemoveCertificateFromUserStoreCore(X509Certificate2 certificate)
+ {
+ try
+ {
+ var certificatePath = GetCertificateFilePath(certificate);
+ if (File.Exists(certificatePath))
+ {
+ File.Delete(certificatePath);
+ }
+ }
+ catch (Exception ex)
+ {
+ Log.MacOSRemoveCertificateFromUserProfileDirError(certificate.Thumbprint, ex.Message);
+ }
+
+ if (IsCertOnKeychain(MacOSUserKeychain, certificate))
+ {
+ RemoveCertificateFromKeychain(MacOSUserKeychain, certificate);
+ }
+ }
}
diff --git a/src/Shared/CertificateGeneration/UnixCertificateManager.cs b/src/Shared/CertificateGeneration/UnixCertificateManager.cs
index 5e90ebe2ef..d322355689 100644
--- a/src/Shared/CertificateGeneration/UnixCertificateManager.cs
+++ b/src/Shared/CertificateGeneration/UnixCertificateManager.cs
@@ -7,7 +7,7 @@ using System.Security.Cryptography.X509Certificates;
namespace Microsoft.AspNetCore.Certificates.Generation;
-internal class UnixCertificateManager : CertificateManager
+internal sealed class UnixCertificateManager : CertificateManager
{
public UnixCertificateManager()
{
diff --git a/src/Shared/CertificateGeneration/WindowsCertificateManager.cs b/src/Shared/CertificateGeneration/WindowsCertificateManager.cs
index 0b1d92c1ef..69f5706643 100644
--- a/src/Shared/CertificateGeneration/WindowsCertificateManager.cs
+++ b/src/Shared/CertificateGeneration/WindowsCertificateManager.cs
@@ -11,7 +11,7 @@ using System.Security.Cryptography.X509Certificates;
namespace Microsoft.AspNetCore.Certificates.Generation;
[SupportedOSPlatform("windows")]
-internal class WindowsCertificateManager : CertificateManager
+internal sealed class WindowsCertificateManager : CertificateManager
{
private const int UserCancelledErrorCode = 1223;
@@ -41,7 +41,6 @@ internal class WindowsCertificateManager : CertificateManager
internal override CheckCertificateStateResult CheckCertificateState(X509Certificate2 candidate, bool interactive)
{
- // Return true as we don't perform any check.
return new CheckCertificateStateResult(true, null);
}
diff --git a/src/Shared/ChunkingCookieManager/ChunkingCookieManager.cs b/src/Shared/ChunkingCookieManager/ChunkingCookieManager.cs
index 1aaff5157f..462c2f610e 100644
--- a/src/Shared/ChunkingCookieManager/ChunkingCookieManager.cs
+++ b/src/Shared/ChunkingCookieManager/ChunkingCookieManager.cs
@@ -30,7 +30,7 @@ namespace Microsoft.AspNetCore.Internal;
/// This handles cookies that are limited by per cookie length. It breaks down long cookies for responses, and reassembles them
/// from requests.
/// </summary>
-internal class ChunkingCookieManager
+internal sealed class ChunkingCookieManager
{
#endif
/// <summary>
@@ -54,7 +54,7 @@ internal class ChunkingCookieManager
/// <summary>
/// The maximum size of cookie to send back to the client. If a cookie exceeds this size it will be broken down into multiple
- /// cookies. Set this value to null to disable this behavior. The default is 4090 characters, which is supported by all
+ /// cookies. Set this value to null to disable this behavior. The default is 4050 characters, which is supported by all
/// common browsers.
///
/// Note that browsers may also have limits on the total size of all cookies per domain, and on the number of cookies per domain.
@@ -103,7 +103,7 @@ internal class ChunkingCookieManager
var chunksCount = ParseChunksCount(value);
if (chunksCount > 0)
{
- var chunks = new string[chunksCount];
+ var chunks = new List<string>(10); // The client may not have sent all of the chunks, don't allocate based on chunksCount.
for (var chunkId = 1; chunkId <= chunksCount; chunkId++)
{
var chunk = requestCookies[key + ChunkKeySuffix + chunkId.ToString(CultureInfo.InvariantCulture)];
@@ -128,7 +128,7 @@ internal class ChunkingCookieManager
return value;
}
- chunks[chunkId - 1] = chunk;
+ chunks.Add(chunk);
}
return string.Join(string.Empty, chunks);
@@ -173,18 +173,7 @@ internal class ChunkingCookieManager
return;
}
- var template = new SetCookieHeaderValue(key)
- {
- Domain = options.Domain,
- Expires = options.Expires,
- SameSite = (Net.Http.Headers.SameSiteMode)options.SameSite,
- HttpOnly = options.HttpOnly,
- Path = options.Path,
- Secure = options.Secure,
- MaxAge = options.MaxAge,
- };
-
- var templateLength = template.ToString().Length;
+ var templateLength = options.CreateCookieHeader(key, string.Empty).ToString().Length;
// Normal cookie
if (!ChunkSize.HasValue || ChunkSize.Value > templateLength + value.Length)
@@ -252,17 +241,26 @@ internal class ChunkingCookieManager
}
var keys = new List<string>
- {
- key + "="
- };
+ {
+ key + "="
+ };
- var requestCookie = context.Request.Cookies[key];
- var chunks = ParseChunksCount(requestCookie);
+ var requestCookies = context.Request.Cookies;
+ var requestCookie = requestCookies[key];
+ long chunks = ParseChunksCount(requestCookie);
if (chunks > 0)
{
for (var i = 1; i <= chunks + 1; i++)
{
var subkey = key + ChunkKeySuffix + i.ToString(CultureInfo.InvariantCulture);
+
+ // Only delete cookies we received. We received the chunk count cookie so we should have received the others too.
+ if (string.IsNullOrEmpty(requestCookies[subkey]))
+ {
+ chunks = i - 1;
+ break;
+ }
+
keys.Add(subkey + "=");
}
}
@@ -315,15 +313,9 @@ internal class ChunkingCookieManager
keyValuePairs[i] = KeyValuePair.Create(string.Concat(key, "C", i.ToString(CultureInfo.InvariantCulture)), string.Empty);
}
- responseCookies.Append(keyValuePairs, new CookieOptions()
+ responseCookies.Append(keyValuePairs, new CookieOptions(options)
{
- Path = options.Path,
- Domain = options.Domain,
- SameSite = options.SameSite,
- Secure = options.Secure,
- IsEssential = options.IsEssential,
Expires = DateTimeOffset.UnixEpoch,
- HttpOnly = options.HttpOnly,
});
}
}
diff --git a/src/Shared/CommandLineUtils/CommandLine/AnsiConsole.cs b/src/Shared/CommandLineUtils/CommandLine/AnsiConsole.cs
index 977016495f..70a92b1f24 100644
--- a/src/Shared/CommandLineUtils/CommandLine/AnsiConsole.cs
+++ b/src/Shared/CommandLineUtils/CommandLine/AnsiConsole.cs
@@ -6,7 +6,7 @@ using System.IO;
namespace Microsoft.Extensions.CommandLineUtils;
-internal class AnsiConsole
+internal sealed class AnsiConsole
{
private AnsiConsole(TextWriter writer, bool useConsoleColor)
{
diff --git a/src/Shared/CommandLineUtils/CommandLine/CommandArgument.cs b/src/Shared/CommandLineUtils/CommandLine/CommandArgument.cs
index 5bcab95af9..fe69937d56 100644
--- a/src/Shared/CommandLineUtils/CommandLine/CommandArgument.cs
+++ b/src/Shared/CommandLineUtils/CommandLine/CommandArgument.cs
@@ -6,7 +6,7 @@ using System.Linq;
namespace Microsoft.Extensions.CommandLineUtils;
-internal class CommandArgument
+internal sealed class CommandArgument
{
public CommandArgument()
{
diff --git a/src/Shared/CommandLineUtils/CommandLine/CommandLineApplication.cs b/src/Shared/CommandLineUtils/CommandLine/CommandLineApplication.cs
index 43b6374d84..b4d85ac000 100644
--- a/src/Shared/CommandLineUtils/CommandLine/CommandLineApplication.cs
+++ b/src/Shared/CommandLineUtils/CommandLine/CommandLineApplication.cs
@@ -12,7 +12,9 @@ using System.Threading.Tasks;
namespace Microsoft.Extensions.CommandLineUtils;
+#pragma warning disable CA1852 // Seal internal types
internal class CommandLineApplication
+#pragma warning restore CA1852 // Seal internal types
{
// Indicates whether the parser should throw an exception when it runs into an unexpected argument. If this is
// set to true (the default), the parser will throw on the first unexpected argument. Otherwise, all unexpected
@@ -53,7 +55,7 @@ internal class CommandLineApplication
public CommandOption OptionVersion { get; private set; }
public readonly List<CommandArgument> Arguments;
public readonly List<string> RemainingArguments;
- public bool IsShowingInformation { get; protected set; } // Is showing help or version?
+ public bool IsShowingInformation { get; private set; } // Is showing help or version?
public Func<int> Invoke { get; set; }
public Func<string> LongVersionGetter { get; set; }
public Func<string> ShortVersionGetter { get; set; }
@@ -434,7 +436,7 @@ internal class CommandLineApplication
Out.WriteLine(GetHelpText(commandName));
}
- public virtual string GetHelpText(string commandName = null)
+ public string GetHelpText(string commandName = null)
{
var headerBuilder = new StringBuilder("Usage:");
for (var cmd = this; cmd != null; cmd = cmd.Parent)
@@ -596,7 +598,7 @@ internal class CommandLineApplication
}
}
- private class CommandArgumentEnumerator : IEnumerator<CommandArgument>
+ private sealed class CommandArgumentEnumerator : IEnumerator<CommandArgument>
{
private readonly IEnumerator<CommandArgument> _enumerator;
diff --git a/src/Shared/CommandLineUtils/CommandLine/CommandOption.cs b/src/Shared/CommandLineUtils/CommandLine/CommandOption.cs
index e053e6b0ce..588dd6af12 100644
--- a/src/Shared/CommandLineUtils/CommandLine/CommandOption.cs
+++ b/src/Shared/CommandLineUtils/CommandLine/CommandOption.cs
@@ -7,7 +7,7 @@ using System.Linq;
namespace Microsoft.Extensions.CommandLineUtils;
-internal class CommandOption
+internal sealed class CommandOption
{
public CommandOption(string template, CommandOptionType optionType)
{
diff --git a/src/Shared/CommandLineUtils/CommandLine/CommandParsingException.cs b/src/Shared/CommandLineUtils/CommandLine/CommandParsingException.cs
index 641d598431..a712611946 100644
--- a/src/Shared/CommandLineUtils/CommandLine/CommandParsingException.cs
+++ b/src/Shared/CommandLineUtils/CommandLine/CommandParsingException.cs
@@ -5,7 +5,7 @@ using System;
namespace Microsoft.Extensions.CommandLineUtils;
-internal class CommandParsingException : Exception
+internal sealed class CommandParsingException : Exception
{
public CommandParsingException(CommandLineApplication command, string message)
: base(message)
diff --git a/src/Shared/Components/PrerenderComponentApplicationStore.cs b/src/Shared/Components/PrerenderComponentApplicationStore.cs
index 6cf2c8f9e7..7edaf5dc14 100644
--- a/src/Shared/Components/PrerenderComponentApplicationStore.cs
+++ b/src/Shared/Components/PrerenderComponentApplicationStore.cs
@@ -6,7 +6,9 @@ using System.Text.Json;
namespace Microsoft.AspNetCore.Components;
+#pragma warning disable CA1852 // Seal internal types
internal class PrerenderComponentApplicationStore : IPersistentComponentStateStore
+#pragma warning restore CA1852 // Seal internal types
{
public PrerenderComponentApplicationStore()
{
diff --git a/src/Shared/Components/ProtectedPrerenderComponentApplicationStore.cs b/src/Shared/Components/ProtectedPrerenderComponentApplicationStore.cs
index 2a816f1150..42da5face2 100644
--- a/src/Shared/Components/ProtectedPrerenderComponentApplicationStore.cs
+++ b/src/Shared/Components/ProtectedPrerenderComponentApplicationStore.cs
@@ -11,7 +11,7 @@ using Microsoft.AspNetCore.DataProtection;
namespace Microsoft.AspNetCore.Components;
-internal class ProtectedPrerenderComponentApplicationStore : PrerenderComponentApplicationStore
+internal sealed class ProtectedPrerenderComponentApplicationStore : PrerenderComponentApplicationStore
{
private IDataProtector _protector;
diff --git a/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs b/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs
index 0fc8bcc54d..49f4b8869e 100644
--- a/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs
+++ b/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs
@@ -9,7 +9,7 @@ using System.Diagnostics.CodeAnalysis;
namespace Microsoft.Extensions.Internal;
-internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TKey : notnull
+internal sealed class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TKey : notnull
{
private readonly IDictionary<TKey, TValue> _sourceDictionary;
private readonly IEqualityComparer<TKey> _comparer;
@@ -55,7 +55,7 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
}
}
- public virtual ICollection<TKey> Keys
+ public ICollection<TKey> Keys
{
get
{
@@ -63,7 +63,7 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
}
}
- public virtual ICollection<TValue> Values
+ public ICollection<TValue> Values
{
get
{
@@ -71,7 +71,7 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
}
}
- public virtual int Count
+ public int Count
{
get
{
@@ -79,7 +79,7 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
}
}
- public virtual bool IsReadOnly
+ public bool IsReadOnly
{
get
{
@@ -87,7 +87,7 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
}
}
- public virtual TValue this[TKey key]
+ public TValue this[TKey key]
{
get
{
@@ -99,42 +99,42 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
}
}
- public virtual bool ContainsKey(TKey key)
+ public bool ContainsKey(TKey key)
{
return ReadDictionary.ContainsKey(key);
}
- public virtual void Add(TKey key, TValue value)
+ public void Add(TKey key, TValue value)
{
WriteDictionary.Add(key, value);
}
- public virtual bool Remove(TKey key)
+ public bool Remove(TKey key)
{
return WriteDictionary.Remove(key);
}
- public virtual bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
+ public bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
{
return ReadDictionary.TryGetValue(key, out value);
}
- public virtual void Add(KeyValuePair<TKey, TValue> item)
+ public void Add(KeyValuePair<TKey, TValue> item)
{
WriteDictionary.Add(item);
}
- public virtual void Clear()
+ public void Clear()
{
WriteDictionary.Clear();
}
- public virtual bool Contains(KeyValuePair<TKey, TValue> item)
+ public bool Contains(KeyValuePair<TKey, TValue> item)
{
return ReadDictionary.Contains(item);
}
- public virtual void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
+ public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
ReadDictionary.CopyTo(array, arrayIndex);
}
@@ -144,7 +144,7 @@ internal class CopyOnWriteDictionary<TKey, TValue> : IDictionary<TKey, TValue> w
return WriteDictionary.Remove(item);
}
- public virtual IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
+ public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
{
return ReadDictionary.GetEnumerator();
}
diff --git a/src/Shared/Diagnostics/AttributeValue.cs b/src/Shared/Diagnostics/AttributeValue.cs
index 4701708f44..52da9b553d 100644
--- a/src/Shared/Diagnostics/AttributeValue.cs
+++ b/src/Shared/Diagnostics/AttributeValue.cs
@@ -5,7 +5,7 @@ using System;
namespace Microsoft.AspNetCore.DiagnosticsViewPage.Views;
-internal class AttributeValue
+internal sealed class AttributeValue
{
public AttributeValue(string prefix, object value, bool literal)
{
diff --git a/src/Shared/Diagnostics/HelperResult.cs b/src/Shared/Diagnostics/HelperResult.cs
index cbf24abfa8..71b0bf11e7 100644
--- a/src/Shared/Diagnostics/HelperResult.cs
+++ b/src/Shared/Diagnostics/HelperResult.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.DiagnosticsViewPage.Views;
/// <summary>
/// Represents a deferred write operation in a <see cref="BaseView"/>.
/// </summary>
-internal class HelperResult
+internal sealed class HelperResult
{
/// <summary>
/// Creates a new instance of <see cref="HelperResult"/>.
diff --git a/src/Shared/Dictionary/AdaptiveCapacityDictionary.cs b/src/Shared/Dictionary/AdaptiveCapacityDictionary.cs
index f4fbbbb56e..ebc70fd3bb 100644
--- a/src/Shared/Dictionary/AdaptiveCapacityDictionary.cs
+++ b/src/Shared/Dictionary/AdaptiveCapacityDictionary.cs
@@ -14,7 +14,7 @@ namespace Microsoft.AspNetCore.Internal;
/// <summary>
/// An <see cref="IDictionary{String, Object}"/> type to hold a small amount of items (10 or less in the common case).
/// </summary>
-internal class AdaptiveCapacityDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue> where TKey : notnull
+internal sealed class AdaptiveCapacityDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue> where TKey : notnull
{
// Threshold for size of array to use.
private const int DefaultArrayThreshold = 10;
diff --git a/src/Shared/E2ETesting/BrowserFixture.cs b/src/Shared/E2ETesting/BrowserFixture.cs
index 7416e2dad0..89fee0cd76 100644
--- a/src/Shared/E2ETesting/BrowserFixture.cs
+++ b/src/Shared/E2ETesting/BrowserFixture.cs
@@ -352,7 +352,7 @@ public class BrowserFixture : IAsyncLifetime
}
// This is a workaround for https://github.com/SeleniumHQ/selenium/issues/8229
- private class RemoteWebDriverWithLogs : RemoteWebDriver, ISupportsLogs
+ private sealed class RemoteWebDriverWithLogs : RemoteWebDriver, ISupportsLogs
{
public RemoteWebDriverWithLogs(Uri remoteAddress, ICapabilities desiredCapabilities, TimeSpan commandTimeout)
: base(remoteAddress, desiredCapabilities, commandTimeout)
diff --git a/src/Shared/E2ETesting/SeleniumStandaloneServer.cs b/src/Shared/E2ETesting/SeleniumStandaloneServer.cs
index 7137289f0a..3026316800 100644
--- a/src/Shared/E2ETesting/SeleniumStandaloneServer.cs
+++ b/src/Shared/E2ETesting/SeleniumStandaloneServer.cs
@@ -178,7 +178,13 @@ public class SeleniumStandaloneServer : IDisposable
// Log
void LogOutput(object sender, DataReceivedEventArgs e)
{
- logOutput.TryAdd(e.Data);
+ try
+ {
+ logOutput.TryAdd(e.Data);
+ }
+ catch (Exception)
+ {
+ }
// We avoid logging on the output here because it is unreliable. We can only log in the diagnostics sink.
lock (_diagnosticsMessageSink)
diff --git a/src/Shared/E2ETesting/WaitAssert.cs b/src/Shared/E2ETesting/WaitAssert.cs
index aeca0f879b..022870aec0 100644
--- a/src/Shared/E2ETesting/WaitAssert.cs
+++ b/src/Shared/E2ETesting/WaitAssert.cs
@@ -116,7 +116,7 @@ public static class WaitAssert
// tests running concurrently might use the DefaultTimeout in their current assertion, which is fine.
TestRunFailed = true;
- var innerHtml = driver.FindElement(By.CssSelector(":first-child")).GetAttribute("innerHTML");
+ var innerHtml = driver.FindElement(By.CssSelector(":first-child"))?.GetAttribute("innerHTML");
var fileId = $"{Guid.NewGuid():N}.png";
var screenShotPath = Path.Combine(Path.GetFullPath(E2ETestOptions.Instance.ScreenShotsPath), fileId);
diff --git a/src/Shared/E2ETesting/selenium-config.json b/src/Shared/E2ETesting/selenium-config.json
index c370d8a9a6..a488002341 100644
--- a/src/Shared/E2ETesting/selenium-config.json
+++ b/src/Shared/E2ETesting/selenium-config.json
@@ -1,7 +1,7 @@
{
"drivers": {
"chrome": {
- "version" : "99.0.4844.35"
+ "version" : "103.0.5060.134"
}
},
"ignoreExtraDrivers": true
diff --git a/src/Shared/ErrorPage/ErrorPage.Designer.cs b/src/Shared/ErrorPage/ErrorPage.Designer.cs
index 0cf8e811b2..fd015c0468 100644
--- a/src/Shared/ErrorPage/ErrorPage.Designer.cs
+++ b/src/Shared/ErrorPage/ErrorPage.Designer.cs
@@ -46,7 +46,7 @@ using Microsoft.AspNetCore.Hosting.Views;
#line default
#line hidden
#nullable disable
- internal class ErrorPage : Microsoft.Extensions.RazorViews.BaseView
+ internal sealed class ErrorPage : Microsoft.Extensions.RazorViews.BaseView
{
#pragma warning disable 1998
public async override global::System.Threading.Tasks.Task ExecuteAsync()
diff --git a/src/Shared/ErrorPage/ErrorPageModel.cs b/src/Shared/ErrorPage/ErrorPageModel.cs
index 132b8ace79..84429b21fd 100644
--- a/src/Shared/ErrorPage/ErrorPageModel.cs
+++ b/src/Shared/ErrorPage/ErrorPageModel.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.Hosting.Views;
/// <summary>
/// Holds data to be displayed on the error page.
/// </summary>
-internal class ErrorPageModel
+internal sealed class ErrorPageModel
{
public ErrorPageModel(IEnumerable<ExceptionDetails> errorDetails, bool showRuntimeDetails, string runtimeDisplayName, string runtimeArchitecture, string clrVersion, string currentAssemblyVesion, string operatingSystemDescription)
{
diff --git a/src/Shared/EventSource.Testing/TestCounterListener.cs b/src/Shared/EventSource.Testing/TestCounterListener.cs
index d3a6ee8876..8b7810737c 100644
--- a/src/Shared/EventSource.Testing/TestCounterListener.cs
+++ b/src/Shared/EventSource.Testing/TestCounterListener.cs
@@ -8,7 +8,7 @@ using System.Threading.Channels;
namespace Microsoft.AspNetCore.Internal;
-internal class TestCounterListener : EventListener
+internal sealed class TestCounterListener : EventListener
{
private readonly Dictionary<string, Channel<double>> _counters = new Dictionary<string, Channel<double>>();
diff --git a/src/Shared/EventSource.Testing/TestEventListener.cs b/src/Shared/EventSource.Testing/TestEventListener.cs
index dfa1e9f268..0a432948fb 100644
--- a/src/Shared/EventSource.Testing/TestEventListener.cs
+++ b/src/Shared/EventSource.Testing/TestEventListener.cs
@@ -5,7 +5,7 @@ using System.Diagnostics.Tracing;
namespace Microsoft.AspNetCore.Internal;
-internal class TestEventListener : EventListener
+internal sealed class TestEventListener : EventListener
{
private readonly int _eventId;
diff --git a/src/Shared/Hpack/DynamicHPackEncoder.cs b/src/Shared/Hpack/DynamicHPackEncoder.cs
index 9bb2b257b2..a4a0aa7c01 100644
--- a/src/Shared/Hpack/DynamicHPackEncoder.cs
+++ b/src/Shared/Hpack/DynamicHPackEncoder.cs
@@ -7,7 +7,7 @@ using System.Text;
namespace System.Net.Http.HPack;
-internal class DynamicHPackEncoder
+internal sealed class DynamicHPackEncoder
{
public const int DefaultHeaderTableSize = 4096;
diff --git a/src/Shared/Hpack/EncoderHeaderEntry.cs b/src/Shared/Hpack/EncoderHeaderEntry.cs
index e1dc81c5f8..c4928080e2 100644
--- a/src/Shared/Hpack/EncoderHeaderEntry.cs
+++ b/src/Shared/Hpack/EncoderHeaderEntry.cs
@@ -6,7 +6,7 @@ using System.Diagnostics;
namespace System.Net.Http.HPack;
[DebuggerDisplay("Name = {Name} Value = {Value}")]
-internal class EncoderHeaderEntry
+internal sealed class EncoderHeaderEntry
{
// Header name and value
public string? Name;
diff --git a/src/Shared/Http2cat/Http2CatHostedService.cs b/src/Shared/Http2cat/Http2CatHostedService.cs
index 2887aa979c..f857ac101c 100644
--- a/src/Shared/Http2cat/Http2CatHostedService.cs
+++ b/src/Shared/Http2cat/Http2CatHostedService.cs
@@ -21,7 +21,7 @@ using Microsoft.Extensions.Options;
namespace Microsoft.AspNetCore.Http2Cat;
-internal class Http2CatHostedService : IHostedService
+internal sealed class Http2CatHostedService : IHostedService
{
private readonly IConnectionFactory _connectionFactory;
private readonly ILogger<Http2CatHostedService> _logger;
diff --git a/src/Shared/Http2cat/Http2CatOptions.cs b/src/Shared/Http2cat/Http2CatOptions.cs
index 18d661a02b..bd28e06adc 100644
--- a/src/Shared/Http2cat/Http2CatOptions.cs
+++ b/src/Shared/Http2cat/Http2CatOptions.cs
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Http2Cat;
-internal class Http2CatOptions
+internal sealed class Http2CatOptions
{
public string Url { get; set; }
public Func<Http2Utilities, Task> Scenaro { get; set; }
diff --git a/src/Shared/Http2cat/Http2Utilities.cs b/src/Shared/Http2cat/Http2Utilities.cs
index c5479147e1..96066f0545 100644
--- a/src/Shared/Http2cat/Http2Utilities.cs
+++ b/src/Shared/Http2cat/Http2Utilities.cs
@@ -16,6 +16,8 @@ using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Connections;
using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Server;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Infrastructure;
using Microsoft.AspNetCore.Testing;
@@ -24,19 +26,19 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.Http2Cat;
-internal class Http2Utilities : IHttpStreamHeadersHandler
+internal sealed class Http2Utilities : IHttpStreamHeadersHandler
{
- public static ReadOnlySpan<byte> ClientPreface => new byte[24] { (byte)'P', (byte)'R', (byte)'I', (byte)' ', (byte)'*', (byte)' ', (byte)'H', (byte)'T', (byte)'T', (byte)'P', (byte)'/', (byte)'2', (byte)'.', (byte)'0', (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n', (byte)'S', (byte)'M', (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' };
+ public static ReadOnlySpan<byte> ClientPreface => "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"u8;
public const int MaxRequestHeaderFieldSize = 16 * 1024;
public static readonly string FourKHeaderValue = new string('a', 4096);
private static readonly Encoding HeaderValueEncoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true);
public static readonly IEnumerable<KeyValuePair<string, string>> BrowserRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:443"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:443"),
new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
@@ -46,10 +48,10 @@ internal class Http2Utilities : IHttpStreamHeadersHandler
public static readonly IEnumerable<KeyValuePair<string, string>> BrowserRequestHeadersHttp = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "http"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "http"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>("user-agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:54.0) Gecko/20100101 Firefox/54.0"),
new KeyValuePair<string, string>("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"),
new KeyValuePair<string, string>("accept-language", "en-US,en;q=0.5"),
@@ -59,18 +61,18 @@ internal class Http2Utilities : IHttpStreamHeadersHandler
public static readonly IEnumerable<KeyValuePair<string, string>> PostRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
};
public static readonly IEnumerable<KeyValuePair<string, string>> ExpectContinueRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "127.0.0.1"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "127.0.0.1"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
new KeyValuePair<string, string>("expect", "100-continue"),
};
@@ -82,10 +84,10 @@ internal class Http2Utilities : IHttpStreamHeadersHandler
public static readonly IEnumerable<KeyValuePair<string, string>> OneContinuationRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>("a", FourKHeaderValue),
new KeyValuePair<string, string>("b", FourKHeaderValue),
new KeyValuePair<string, string>("c", FourKHeaderValue),
@@ -94,10 +96,10 @@ internal class Http2Utilities : IHttpStreamHeadersHandler
public static readonly IEnumerable<KeyValuePair<string, string>> TwoContinuationsRequestHeaders = new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "GET"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/"),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "GET"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
new KeyValuePair<string, string>("a", FourKHeaderValue),
new KeyValuePair<string, string>("b", FourKHeaderValue),
new KeyValuePair<string, string>("c", FourKHeaderValue),
@@ -109,10 +111,10 @@ internal class Http2Utilities : IHttpStreamHeadersHandler
public static IEnumerable<KeyValuePair<string, string>> ReadRateRequestHeaders(int expectedBytes) => new[]
{
- new KeyValuePair<string, string>(HeaderNames.Method, "POST"),
- new KeyValuePair<string, string>(HeaderNames.Path, "/" + expectedBytes),
- new KeyValuePair<string, string>(HeaderNames.Scheme, "https"),
- new KeyValuePair<string, string>(HeaderNames.Authority, "localhost:80"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Method, "POST"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Path, "/" + expectedBytes),
+ new KeyValuePair<string, string>(InternalHeaderNames.Scheme, "https"),
+ new KeyValuePair<string, string>(InternalHeaderNames.Authority, "localhost:80"),
};
public static readonly byte[] _helloBytes = Encoding.ASCII.GetBytes("hello");
@@ -979,7 +981,7 @@ internal class Http2Utilities : IHttpStreamHeadersHandler
((IHttpStreamHeadersHandler)this).OnHeader(name, value);
}
- internal class Http2FrameWithPayload : Http2Frame
+ internal sealed class Http2FrameWithPayload : Http2Frame
{
public Http2FrameWithPayload() : base()
{
diff --git a/src/Shared/HttpSys/NativeInterop/SafeLocalFreeChannelBinding.cs b/src/Shared/HttpSys/NativeInterop/SafeLocalFreeChannelBinding.cs
index f54956c682..4ba23548dd 100644
--- a/src/Shared/HttpSys/NativeInterop/SafeLocalFreeChannelBinding.cs
+++ b/src/Shared/HttpSys/NativeInterop/SafeLocalFreeChannelBinding.cs
@@ -6,7 +6,7 @@ using System.Security.Authentication.ExtendedProtection;
namespace Microsoft.AspNetCore.HttpSys.Internal;
-internal class SafeLocalFreeChannelBinding : ChannelBinding
+internal sealed class SafeLocalFreeChannelBinding : ChannelBinding
{
private const int LMEM_FIXED = 0;
private int size;
diff --git a/src/Shared/HttpSys/NativeInterop/SafeNativeOverlapped.cs b/src/Shared/HttpSys/NativeInterop/SafeNativeOverlapped.cs
index 64c1d46e9e..e2b5304ade 100644
--- a/src/Shared/HttpSys/NativeInterop/SafeNativeOverlapped.cs
+++ b/src/Shared/HttpSys/NativeInterop/SafeNativeOverlapped.cs
@@ -8,7 +8,7 @@ using System.Threading;
namespace Microsoft.AspNetCore.HttpSys.Internal;
-internal class SafeNativeOverlapped : SafeHandle
+internal sealed class SafeNativeOverlapped : SafeHandle
{
internal static readonly SafeNativeOverlapped Zero = new SafeNativeOverlapped();
private readonly ThreadPoolBoundHandle? _boundHandle;
diff --git a/src/Shared/HttpSys/NativeInterop/SocketAddress.cs b/src/Shared/HttpSys/NativeInterop/SocketAddress.cs
index 7fedc1cfc0..b7b4a52afa 100644
--- a/src/Shared/HttpSys/NativeInterop/SocketAddress.cs
+++ b/src/Shared/HttpSys/NativeInterop/SocketAddress.cs
@@ -23,7 +23,7 @@ namespace Microsoft.AspNetCore.HttpSys.Internal;
/// on how to format the memory buffers that winsock uses for network addresses.
/// </para>
/// </devdoc>
-internal class SocketAddress
+internal sealed class SocketAddress
{
private const int NumberOfIPv6Labels = 8;
// Lower case hex, no leading zeros
diff --git a/src/Shared/HttpSys/NativeInterop/UnsafeNativeMethods.cs b/src/Shared/HttpSys/NativeInterop/UnsafeNativeMethods.cs
index 0e62150056..7fed60b434 100644
--- a/src/Shared/HttpSys/NativeInterop/UnsafeNativeMethods.cs
+++ b/src/Shared/HttpSys/NativeInterop/UnsafeNativeMethods.cs
@@ -7,7 +7,7 @@ using System.Runtime.InteropServices;
namespace Microsoft.AspNetCore.HttpSys.Internal;
-internal static unsafe class UnsafeNclNativeMethods
+internal static unsafe partial class UnsafeNclNativeMethods
{
private const string sspicli_LIB = "sspicli.dll";
private const string api_ms_win_core_io_LIB = "api-ms-win-core-io-l1-1-0.dll";
@@ -37,11 +37,12 @@ internal static unsafe class UnsafeNclNativeMethods
internal const uint ERROR_CONNECTION_INVALID = 1229;
}
- [DllImport(api_ms_win_core_io_LIB, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern unsafe uint CancelIoEx(SafeHandle handle, SafeNativeOverlapped overlapped);
+ [LibraryImport(api_ms_win_core_io_LIB, SetLastError = true)]
+ internal static unsafe partial uint CancelIoEx(SafeHandle handle, SafeNativeOverlapped overlapped);
- [DllImport(api_ms_win_core_kernel32_legacy_LIB, ExactSpelling = true, CallingConvention = CallingConvention.StdCall, SetLastError = true)]
- internal static extern unsafe bool SetFileCompletionNotificationModes(SafeHandle handle, FileCompletionNotificationModes modes);
+ [LibraryImport(api_ms_win_core_kernel32_legacy_LIB, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static unsafe partial bool SetFileCompletionNotificationModes(SafeHandle handle, FileCompletionNotificationModes modes);
[Flags]
internal enum FileCompletionNotificationModes : byte
@@ -51,40 +52,42 @@ internal static unsafe class UnsafeNclNativeMethods
SkipSetEventOnHandle = 2
}
- [DllImport(TOKENBINDING, CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
- public static extern int TokenBindingVerifyMessage(
- [In] byte* tokenBindingMessage,
- [In] uint tokenBindingMessageSize,
- [In] char* keyType,
- [In] byte* tlsUnique,
- [In] uint tlsUniqueSize,
- [Out] out HeapAllocHandle resultList);
+ [LibraryImport(TOKENBINDING)]
+ public static partial int TokenBindingVerifyMessage(
+ byte* tokenBindingMessage,
+ uint tokenBindingMessageSize,
+ char* keyType,
+ byte* tlsUnique,
+ uint tlsUniqueSize,
+ out HeapAllocHandle resultList);
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa366569(v=vs.85).aspx
- [DllImport(api_ms_win_core_heap_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- internal static extern IntPtr GetProcessHeap();
+ [LibraryImport(api_ms_win_core_heap_LIB, SetLastError = true)]
+ internal static partial IntPtr GetProcessHeap();
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa366701(v=vs.85).aspx
- [DllImport(api_ms_win_core_heap_LIB, CallingConvention = CallingConvention.Winapi, SetLastError = true)]
- internal static extern bool HeapFree(
- [In] IntPtr hHeap,
- [In] uint dwFlags,
- [In] IntPtr lpMem);
-
- internal static class SafeNetHandles
+ [LibraryImport(api_ms_win_core_heap_LIB, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static partial bool HeapFree(
+ IntPtr hHeap,
+ uint dwFlags,
+ IntPtr lpMem);
+
+ internal static partial class SafeNetHandles
{
- [DllImport(sspicli_LIB, ExactSpelling = true, SetLastError = true)]
- internal static extern int FreeContextBuffer(
- [In] IntPtr contextBuffer);
+ [LibraryImport(sspicli_LIB, SetLastError = true)]
+ internal static partial int FreeContextBuffer(
+ IntPtr contextBuffer);
- [DllImport(api_ms_win_core_handle_LIB, ExactSpelling = true, SetLastError = true)]
- internal static extern bool CloseHandle(IntPtr handle);
+ [LibraryImport(api_ms_win_core_handle_LIB, SetLastError = true)]
+ [return: MarshalAs(UnmanagedType.Bool)]
+ internal static partial bool CloseHandle(IntPtr handle);
- [DllImport(api_ms_win_core_heap_obsolete_LIB, EntryPoint = "LocalAlloc", SetLastError = true)]
- internal static extern SafeLocalFreeChannelBinding LocalAllocChannelBinding(int uFlags, UIntPtr sizetdwBytes);
+ [LibraryImport(api_ms_win_core_heap_obsolete_LIB, EntryPoint = "LocalAlloc", SetLastError = true)]
+ internal static partial SafeLocalFreeChannelBinding LocalAllocChannelBinding(int uFlags, UIntPtr sizetdwBytes);
- [DllImport(api_ms_win_core_heap_obsolete_LIB, ExactSpelling = true, SetLastError = true)]
- internal static extern IntPtr LocalFree(IntPtr handle);
+ [LibraryImport(api_ms_win_core_heap_obsolete_LIB, SetLastError = true)]
+ internal static partial IntPtr LocalFree(IntPtr handle);
}
// from tokenbinding.h
@@ -140,17 +143,4 @@ internal static unsafe class UnsafeNclNativeMethods
public TOKENBINDING_RESULT_DATA* resultData;
}
}
-
- // DACL related stuff
-
- [SuppressMessage("Microsoft.Performance", "CA1812:AvoidUninstantiatedInternalClasses", Justification = "Instantiated natively")]
- [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable",
- Justification = "Does not own the resource.")]
- [StructLayout(LayoutKind.Sequential)]
- internal class SECURITY_ATTRIBUTES
- {
- public int nLength = 12;
- public SafeLocalMemHandle lpSecurityDescriptor = new SafeLocalMemHandle(IntPtr.Zero, false);
- public bool bInheritHandle;
- }
}
diff --git a/src/Shared/HttpSys/RequestProcessing/HeaderCollection.cs b/src/Shared/HttpSys/RequestProcessing/HeaderCollection.cs
index 0c7849fdc8..c5be1f489f 100644
--- a/src/Shared/HttpSys/RequestProcessing/HeaderCollection.cs
+++ b/src/Shared/HttpSys/RequestProcessing/HeaderCollection.cs
@@ -11,7 +11,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.HttpSys.Internal;
-internal class HeaderCollection : IHeaderDictionary
+internal sealed class HeaderCollection : IHeaderDictionary
{
// https://tools.ietf.org/html/rfc7230#section-4.1.2
internal static readonly HashSet<string> DisallowedTrailers = new HashSet<string>(StringComparer.OrdinalIgnoreCase)
diff --git a/src/Shared/HttpSys/RequestProcessing/NativeRequestContext.cs b/src/Shared/HttpSys/RequestProcessing/NativeRequestContext.cs
index 455a40ea6e..a9e5360c4f 100644
--- a/src/Shared/HttpSys/RequestProcessing/NativeRequestContext.cs
+++ b/src/Shared/HttpSys/RequestProcessing/NativeRequestContext.cs
@@ -17,7 +17,9 @@ using Microsoft.Extensions.Primitives;
namespace Microsoft.AspNetCore.HttpSys.Internal;
+#pragma warning disable CA1852 // Seal internal types
internal unsafe class NativeRequestContext : IDisposable
+#pragma warning restore CA1852 // Seal internal types
{
private const int AlignmentPadding = 8;
private const int DefaultBufferSize = 4096 - AlignmentPadding;
diff --git a/src/Shared/HttpSys/RequestProcessing/RequestHeaders.cs b/src/Shared/HttpSys/RequestProcessing/RequestHeaders.cs
index 9314a89672..1af4a663d7 100644
--- a/src/Shared/HttpSys/RequestProcessing/RequestHeaders.cs
+++ b/src/Shared/HttpSys/RequestProcessing/RequestHeaders.cs
@@ -12,7 +12,7 @@ using Microsoft.Net.Http.Headers;
namespace Microsoft.AspNetCore.HttpSys.Internal;
-internal partial class RequestHeaders : IHeaderDictionary
+internal sealed partial class RequestHeaders : IHeaderDictionary
{
private IDictionary<string, StringValues>? _extra;
private readonly NativeRequestContext _requestMemoryBlob;
diff --git a/src/Shared/InternalHeaderNames.cs b/src/Shared/InternalHeaderNames.cs
new file mode 100644
index 0000000000..7515c26cb0
--- /dev/null
+++ b/src/Shared/InternalHeaderNames.cs
@@ -0,0 +1,29 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Server;
+
+[System.Diagnostics.CodeAnalysis.SuppressMessage("Performance", "CA1802:Use literals where appropriate", Justification = "So referenceEquals works")]
+internal static class InternalHeaderNames
+{
+ /// <summary>Gets the <c>:authority</c> HTTP header name.</summary>
+ public static readonly string Authority = ":authority";
+
+ /// <summary>Gets the <c>:method</c> HTTP header name.</summary>
+ public static readonly string Method = ":method";
+
+ /// <summary>Gets the <c>:path</c> HTTP header name.</summary>
+ public static readonly string Path = ":path";
+
+ /// <summary>Gets the <c>:scheme</c> HTTP header name.</summary>
+ public static readonly string Scheme = ":scheme";
+
+ /// <summary>Gets the <c>:status</c> HTTP header name.</summary>
+ public static readonly string Status = ":status";
+
+ /// <summary>Gets the <c>:protocol</c> HTTP header name.</summary>
+ public static readonly string Protocol = ":protocol";
+
+ /// <summary>Gets the <c>Alt-Used</c> HTTP header name.</summary>
+ public static readonly string AltUsed = "Alt-Used";
+}
diff --git a/src/Shared/LinkerFlags.cs b/src/Shared/LinkerFlags.cs
index d0a7c88f61..1c9954b066 100644
--- a/src/Shared/LinkerFlags.cs
+++ b/src/Shared/LinkerFlags.cs
@@ -16,4 +16,9 @@ internal static class LinkerFlags
/// Flags for a component
/// </summary>
public const DynamicallyAccessedMemberTypes Component = DynamicallyAccessedMemberTypes.All;
+
+ /// <summary>
+ /// Flags for a JSInvokable type.
+ /// </summary>
+ public const DynamicallyAccessedMemberTypes JSInvokable = DynamicallyAccessedMemberTypes.PublicMethods;
}
diff --git a/src/Shared/NullScope.cs b/src/Shared/NullScope.cs
index a6f2ff6166..9611493cf0 100644
--- a/src/Shared/NullScope.cs
+++ b/src/Shared/NullScope.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.Internal;
/// <summary>
/// An empty scope without any logic
/// </summary>
-internal class NullScope : IDisposable
+internal sealed class NullScope : IDisposable
{
public static NullScope Instance { get; } = new NullScope();
diff --git a/src/Shared/ParameterBindingMethodCache.cs b/src/Shared/ParameterBindingMethodCache.cs
index 01b5c0895e..55fa8c19ae 100644
--- a/src/Shared/ParameterBindingMethodCache.cs
+++ b/src/Shared/ParameterBindingMethodCache.cs
@@ -24,6 +24,8 @@ internal sealed class ParameterBindingMethodCache
{
private static readonly MethodInfo ConvertValueTaskMethod = typeof(ParameterBindingMethodCache).GetMethod(nameof(ConvertValueTask), BindingFlags.NonPublic | BindingFlags.Static)!;
private static readonly MethodInfo ConvertValueTaskOfNullableResultMethod = typeof(ParameterBindingMethodCache).GetMethod(nameof(ConvertValueTaskOfNullableResult), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo BindAsyncMethod = typeof(ParameterBindingMethodCache).GetMethod(nameof(BindAsync), BindingFlags.NonPublic | BindingFlags.Static)!;
+ private static readonly MethodInfo UriTryCreateMethod = typeof(Uri).GetMethod(nameof(Uri.TryCreate), BindingFlags.Public | BindingFlags.Static, new[] { typeof(string), typeof(UriKind), typeof(Uri).MakeByRefType() })!;
internal static readonly ParameterExpression TempSourceStringExpr = Expression.Variable(typeof(string), "tempSourceString");
internal static readonly ParameterExpression HttpContextExpr = Expression.Parameter(typeof(HttpContext), "httpContext");
@@ -34,6 +36,7 @@ internal sealed class ParameterBindingMethodCache
// Since this is shared source, the cache won't be shared between RequestDelegateFactory and the ApiDescriptionProvider sadly :(
private readonly ConcurrentDictionary<Type, Func<ParameterExpression, Expression, Expression>?> _stringMethodCallCache = new();
private readonly ConcurrentDictionary<Type, (Func<ParameterInfo, Expression>?, int)> _bindAsyncMethodCallCache = new();
+ private readonly ConcurrentDictionary<Type, (ConstructorInfo?, ConstructorParameter[])> _constructorCache = new();
// If IsDynamicCodeSupported is false, we can't use the static Enum.TryParse<T> since there's no easy way for
// this code to generate the specific instantiation for any enums used
@@ -50,15 +53,18 @@ internal sealed class ParameterBindingMethodCache
_throwOnInvalidMethod = throwOnInvalidMethod;
}
+ [RequiresUnreferencedCode("Performs reflection on type hierarchy. This cannot be statically analyzed.")]
public bool HasTryParseMethod(Type type)
{
var nonNullableParameterType = Nullable.GetUnderlyingType(type) ?? type;
return FindTryParseMethod(nonNullableParameterType) is not null;
}
+ [RequiresUnreferencedCode("Performs reflection on type hierarchy. This cannot be statically analyzed.")]
public bool HasBindAsyncMethod(ParameterInfo parameter) =>
FindBindAsyncMethod(parameter).Expression is not null;
+ [RequiresUnreferencedCode("Performs reflection on type hierarchy. This cannot be statically analyzed.")]
public Func<ParameterExpression, Expression, Expression>? FindTryParseMethod(Type type)
{
Func<ParameterExpression, Expression, Expression>? Finder(Type type)
@@ -93,6 +99,16 @@ internal sealed class ParameterBindingMethodCache
};
}
+ if (type == typeof(Uri))
+ {
+ // UriKind.RelativeOrAbsolute is also used by UriTypeConverter which is used in MVC.
+ return (expression, formatProvider) => Expression.Call(
+ UriTryCreateMethod,
+ TempSourceStringExpr,
+ Expression.Constant(UriKind.RelativeOrAbsolute),
+ expression);
+ }
+
if (TryGetDateTimeTryParseMethod(type, out methodInfo))
{
// We generate `DateTimeStyles.AdjustToUniversal | DateTimeStyles.AllowWhiteSpaces ` to
@@ -175,17 +191,24 @@ internal sealed class ParameterBindingMethodCache
return _stringMethodCallCache.GetOrAdd(type, Finder);
}
+ [RequiresUnreferencedCode("Performs reflection on type hierarchy. This cannot be statically analyzed.")]
public (Expression? Expression, int ParamCount) FindBindAsyncMethod(ParameterInfo parameter)
{
(Func<ParameterInfo, Expression>?, int) Finder(Type nonNullableParameterType)
{
var hasParameterInfo = true;
- // There should only be one BindAsync method with these parameters since C# does not allow overloading on return type.
- var methodInfo = GetStaticMethodFromHierarchy(nonNullableParameterType, "BindAsync", new[] { typeof(HttpContext), typeof(ParameterInfo) }, ValidateReturnType);
+ var methodInfo = GetIBindableFromHttpContextMethod(nonNullableParameterType);
+
if (methodInfo is null)
{
- hasParameterInfo = false;
- methodInfo = GetStaticMethodFromHierarchy(nonNullableParameterType, "BindAsync", new[] { typeof(HttpContext) }, ValidateReturnType);
+ // There should only be one BindAsync method with these parameters since C# does not allow overloading on return type.
+ methodInfo = GetStaticMethodFromHierarchy(nonNullableParameterType, "BindAsync", new[] { typeof(HttpContext), typeof(ParameterInfo) }, ValidateReturnType);
+
+ if (methodInfo is null)
+ {
+ hasParameterInfo = false;
+ methodInfo = GetStaticMethodFromHierarchy(nonNullableParameterType, "BindAsync", new[] { typeof(HttpContext) }, ValidateReturnType);
+ }
}
// We're looking for a method with the following signatures:
@@ -272,6 +295,123 @@ internal sealed class ParameterBindingMethodCache
}
}
+ public (ConstructorInfo?, ConstructorParameter[]) FindConstructor(Type type)
+ {
+ static (ConstructorInfo? constructor, ConstructorParameter[] parameters) Finder(Type type)
+ {
+ var constructor = GetConstructor(type);
+
+ if (constructor is null || constructor.GetParameters().Length == 0)
+ {
+ return (constructor, Array.Empty<ConstructorParameter>());
+ }
+
+ var properties = type.GetProperties();
+ var lookupTable = new Dictionary<ParameterLookupKey, PropertyInfo>(properties.Length);
+ for (var i = 0; i < properties.Length; i++)
+ {
+ lookupTable.Add(new ParameterLookupKey(properties[i].Name, properties[i].PropertyType), properties[i]);
+ }
+
+ // This behavior diverge from the JSON serialization
+ // since we don't have an attribute, eg. JsonConstructor,
+ // we need to be very restrictive about the ctor
+ // and only accept if the parameterized ctor has
+ // only arguments that we can match (Type and Name)
+ // with a public property.
+
+ var parameters = constructor.GetParameters();
+ var parametersWithPropertyInfo = new ConstructorParameter[parameters.Length];
+
+ for (var i = 0; i < parameters.Length; i++)
+ {
+ var key = new ParameterLookupKey(parameters[i].Name!, parameters[i].ParameterType);
+ if (!lookupTable.TryGetValue(key, out var property))
+ {
+ throw new InvalidOperationException(
+ $"The public parameterized constructor must contain only parameters that match the declared public properties for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.");
+ }
+
+ parametersWithPropertyInfo[i] = new ConstructorParameter(parameters[i], property);
+ }
+
+ return (constructor, parametersWithPropertyInfo);
+ }
+
+ return _constructorCache.GetOrAdd(type, Finder);
+ }
+
+ private static ConstructorInfo? GetConstructor(Type type)
+ {
+ if (type.IsAbstract)
+ {
+ throw new InvalidOperationException($"The abstract type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}' is not supported.");
+ }
+
+ var constructors = type.GetConstructors(BindingFlags.Public | BindingFlags.Instance);
+
+ // if only one constructor is declared
+ // we will use it to try match the properties
+ if (constructors.Length == 1)
+ {
+ return constructors[0];
+ }
+
+ // We will try to get the parameterless ctor
+ // as priority before visit the others
+ var parameterlessConstructor = constructors.SingleOrDefault(c => c.GetParameters().Length == 0);
+ if (parameterlessConstructor is not null)
+ {
+ return parameterlessConstructor;
+ }
+
+ // If a parameterized constructors is not found at this point
+ // we will use a default constructor that is always available
+ // for value types.
+ if (type.IsValueType)
+ {
+ return null;
+ }
+
+ // We don't have an attribute, similar to JsonConstructor, to
+ // disambiguate ctors, so, we will throw if more than one
+ // ctor is defined without a parameterless constructor.
+ // Eg.:
+ // public class X
+ // {
+ // public X(int foo)
+ // public X(int foo, int bar)
+ // ...
+ // }
+ if (parameterlessConstructor is null && constructors.Length > 1)
+ {
+ throw new InvalidOperationException($"Only a single public parameterized constructor is allowed for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.");
+ }
+
+ throw new InvalidOperationException($"No public parameterless constructor found for type '{TypeNameHelper.GetTypeDisplayName(type, fullName: false)}'.");
+ }
+
+ private static MethodInfo? GetIBindableFromHttpContextMethod(Type type)
+ {
+ // Check if parameter is bindable via static abstract method on IBindableFromHttpContext<TSelf>
+ foreach (var i in type.GetInterfaces())
+ {
+ if (i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IBindableFromHttpContext<>) && i.GetGenericArguments()[0] == type)
+ {
+ return BindAsyncMethod.MakeGenericMethod(type);
+ }
+ }
+
+ return null;
+ }
+
+ private static ValueTask<TValue?> BindAsync<TValue>(HttpContext httpContext, ParameterInfo parameter)
+ where TValue : class?, IBindableFromHttpContext<TValue>
+ {
+ return TValue.BindAsync(httpContext, parameter);
+ }
+
+ [RequiresUnreferencedCode("Performs reflection on type hierarchy. This cannot be statically analyzed.")]
private MethodInfo? GetStaticMethodFromHierarchy(Type type, string name, Type[] parameterTypes, Func<MethodInfo, bool> validateReturnType)
{
bool IsMatch(MethodInfo? method) => method is not null && !method.IsAbstract && validateReturnType(method);
@@ -309,6 +449,7 @@ internal sealed class ParameterBindingMethodCache
return candidateInterfaceMethodInfo;
}
+ [RequiresUnreferencedCode("Performs reflection on type hierarchy. This cannot be statically analyzed.")]
private static MethodInfo? GetAnyMethodFromHierarchy(Type type, string name)
{
// Find first incorrectly formatted method
@@ -535,4 +676,41 @@ internal sealed class ParameterBindingMethodCache
static async ValueTask<object?> ConvertAwaited(ValueTask<Nullable<T>> typedValueTask) => await typedValueTask;
return ConvertAwaited(typedValueTask);
}
+
+ private sealed class ParameterLookupKey
+ {
+ public ParameterLookupKey(string name, Type type)
+ {
+ Name = name;
+ Type = type;
+ }
+
+ public string Name { get; }
+ public Type Type { get; }
+
+ public override int GetHashCode()
+ {
+ return StringComparer.OrdinalIgnoreCase.GetHashCode(Name);
+ }
+
+ public override bool Equals([NotNullWhen(true)] object? obj)
+ {
+ Debug.Assert(obj is ParameterLookupKey);
+
+ var other = (ParameterLookupKey)obj;
+ return Type == other.Type && string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase);
+ }
+ }
+
+ internal sealed class ConstructorParameter
+ {
+ public ConstructorParameter(ParameterInfo parameter, PropertyInfo propertyInfo)
+ {
+ ParameterInfo = parameter;
+ PropertyInfo = propertyInfo;
+ }
+
+ public ParameterInfo ParameterInfo { get; }
+ public PropertyInfo PropertyInfo { get; }
+ }
}
diff --git a/src/Shared/HttpValidationProblemDetailsJsonConverter.cs b/src/Shared/ProblemDetails/HttpValidationProblemDetailsJsonConverter.cs
index 9c8bd17871..9c8bd17871 100644
--- a/src/Shared/HttpValidationProblemDetailsJsonConverter.cs
+++ b/src/Shared/ProblemDetails/HttpValidationProblemDetailsJsonConverter.cs
diff --git a/src/Shared/ProblemDetailsDefaults.cs b/src/Shared/ProblemDetails/ProblemDetailsDefaults.cs
index 2e13e1bfd1..0a4ad2c2c7 100644
--- a/src/Shared/ProblemDetailsDefaults.cs
+++ b/src/Shared/ProblemDetails/ProblemDetailsDefaults.cs
@@ -1,10 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System.Collections.Generic;
-using System.Diagnostics.CodeAnalysis;
+using Microsoft.AspNetCore.Mvc;
-namespace Microsoft.AspNetCore.Http.Extensions;
+namespace Microsoft.AspNetCore.Http;
internal static class ProblemDetailsDefaults
{
@@ -34,6 +33,12 @@ internal static class ProblemDetailsDefaults
"Not Found"
),
+ [405] =
+ (
+ "https://tools.ietf.org/html/rfc7231#section-6.5.5",
+ "Method Not Allowed"
+ ),
+
[406] =
(
"https://tools.ietf.org/html/rfc7231#section-6.5.6",
@@ -64,4 +69,30 @@ internal static class ProblemDetailsDefaults
"An error occurred while processing your request."
),
};
+
+ public static void Apply(ProblemDetails problemDetails, int? statusCode)
+ {
+ // We allow StatusCode to be specified either on ProblemDetails or on the ObjectResult and use it to configure the other.
+ // This lets users write <c>return Conflict(new Problem("some description"))</c>
+ // or <c>return Problem("some-problem", 422)</c> and have the response have consistent fields.
+ if (problemDetails.Status is null)
+ {
+ if (statusCode is not null)
+ {
+ problemDetails.Status = statusCode;
+ }
+ else
+ {
+ problemDetails.Status = problemDetails is HttpValidationProblemDetails ?
+ StatusCodes.Status400BadRequest :
+ StatusCodes.Status500InternalServerError;
+ }
+ }
+
+ if (Defaults.TryGetValue(problemDetails.Status.Value, out var defaults))
+ {
+ problemDetails.Title ??= defaults.Title;
+ problemDetails.Type ??= defaults.Type;
+ }
+ }
}
diff --git a/src/Shared/ProblemDetailsJsonConverter.cs b/src/Shared/ProblemDetails/ProblemDetailsJsonConverter.cs
index 13120d36d2..13120d36d2 100644
--- a/src/Shared/ProblemDetailsJsonConverter.cs
+++ b/src/Shared/ProblemDetails/ProblemDetailsJsonConverter.cs
diff --git a/src/Shared/Process/ProcessEx.cs b/src/Shared/Process/ProcessEx.cs
index 3fe20633e9..76ed1f4f34 100644
--- a/src/Shared/Process/ProcessEx.cs
+++ b/src/Shared/Process/ProcessEx.cs
@@ -15,7 +15,7 @@ using Xunit.Abstractions;
namespace Microsoft.AspNetCore.Internal;
-internal class ProcessEx : IDisposable
+internal sealed class ProcessEx : IDisposable
{
private static readonly TimeSpan DefaultProcessTimeout = TimeSpan.FromMinutes(15);
private static readonly string NUGET_PACKAGES = GetNugetPackagesRestorePath();
diff --git a/src/Shared/PropertyActivator/PropertyActivator.cs b/src/Shared/PropertyActivator/PropertyActivator.cs
index 7499d5c404..c7c462d51a 100644
--- a/src/Shared/PropertyActivator/PropertyActivator.cs
+++ b/src/Shared/PropertyActivator/PropertyActivator.cs
@@ -9,7 +9,7 @@ using System.Reflection;
namespace Microsoft.Extensions.Internal;
-internal class PropertyActivator<TContext>
+internal sealed class PropertyActivator<TContext>
{
private readonly Func<TContext, object> _valueAccessor;
private readonly Action<object, object> _fastPropertySetter;
diff --git a/src/Shared/PropertyAsParameterInfo.cs b/src/Shared/PropertyAsParameterInfo.cs
new file mode 100644
index 0000000000..da184a7290
--- /dev/null
+++ b/src/Shared/PropertyAsParameterInfo.cs
@@ -0,0 +1,191 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Collections.ObjectModel;
+using System.Diagnostics;
+using System.Diagnostics.CodeAnalysis;
+using System.Linq;
+using System.Reflection;
+using System.Runtime.InteropServices;
+using Microsoft.Extensions.Internal;
+
+namespace Microsoft.AspNetCore.Http;
+
+internal sealed class PropertyAsParameterInfo : ParameterInfo
+{
+ private readonly PropertyInfo _underlyingProperty;
+ private readonly ParameterInfo? _constructionParameterInfo;
+
+ private readonly NullabilityInfoContext _nullabilityContext;
+ private NullabilityInfo? _nullabilityInfo;
+
+ public PropertyAsParameterInfo(PropertyInfo propertyInfo, NullabilityInfoContext? nullabilityContext = null)
+ {
+ Debug.Assert(null != propertyInfo);
+
+ AttrsImpl = (ParameterAttributes)propertyInfo.Attributes;
+ NameImpl = propertyInfo.Name;
+ MemberImpl = propertyInfo;
+ ClassImpl = propertyInfo.PropertyType;
+
+ // It is not a real parameter in the delegate, so,
+ // not defining a real position.
+ PositionImpl = -1;
+
+ _nullabilityContext = nullabilityContext ?? new NullabilityInfoContext();
+ _underlyingProperty = propertyInfo;
+ }
+
+ public PropertyAsParameterInfo(PropertyInfo property, ParameterInfo parameterInfo, NullabilityInfoContext? nullabilityContext = null)
+ : this(property, nullabilityContext)
+ {
+ _constructionParameterInfo = parameterInfo;
+ }
+
+ public override bool HasDefaultValue
+ => _constructionParameterInfo is not null && _constructionParameterInfo.HasDefaultValue;
+ public override object? DefaultValue
+ => _constructionParameterInfo is not null ? _constructionParameterInfo.DefaultValue : null;
+ public override int MetadataToken => _underlyingProperty.MetadataToken;
+ public override object? RawDefaultValue
+ => _constructionParameterInfo is not null ? _constructionParameterInfo.RawDefaultValue : null;
+
+ /// <summary>
+ /// Unwraps all parameters that contains <see cref="AsParametersAttribute"/> and
+ /// creates a flat list merging the current parameters, not including the
+ /// parametres that contain a <see cref="AsParametersAttribute"/>, and all additional
+ /// parameters detected.
+ /// </summary>
+ /// <param name="parameters">List of parameters to be flattened.</param>
+ /// <param name="cache">An instance of the method cache class.</param>
+ /// <returns>Flat list of parameters.</returns>
+ [UnconditionalSuppressMessage("Trimmer", "IL2075", Justification = "PropertyAsParameterInfo.Flatten requires unreferenced code.")]
+ public static ReadOnlySpan<ParameterInfo> Flatten(ParameterInfo[] parameters, ParameterBindingMethodCache cache)
+ {
+ ArgumentNullException.ThrowIfNull(parameters);
+ ArgumentNullException.ThrowIfNull(cache);
+
+ if (parameters.Length == 0)
+ {
+ return Array.Empty<ParameterInfo>();
+ }
+
+ List<ParameterInfo>? flattenedParameters = null;
+ NullabilityInfoContext? nullabilityContext = null;
+
+ for (var i = 0; i < parameters.Length; i++)
+ {
+ if (parameters[i].Name is null)
+ {
+ throw new InvalidOperationException($"Encountered a parameter of type '{parameters[i].ParameterType}' without a name. Parameters must have a name.");
+ }
+
+ if (parameters[i].CustomAttributes.Any(a => a.AttributeType == typeof(AsParametersAttribute)))
+ {
+ // Initialize the list with all parameter already processed
+ // to keep the same parameter ordering
+ flattenedParameters ??= new(parameters[0..i]);
+ nullabilityContext ??= new();
+
+ var isNullable = Nullable.GetUnderlyingType(parameters[i].ParameterType) != null ||
+ nullabilityContext.Create(parameters[i])?.ReadState == NullabilityState.Nullable;
+
+ if (isNullable)
+ {
+ throw new InvalidOperationException($"The nullable type '{TypeNameHelper.GetTypeDisplayName(parameters[i].ParameterType, fullName: false)}' is not supported.");
+ }
+
+ var (constructor, constructorParameters) = cache.FindConstructor(parameters[i].ParameterType);
+ if (constructor is not null && constructorParameters is { Length: > 0 })
+ {
+ foreach (var constructorParameter in constructorParameters)
+ {
+ flattenedParameters.Add(
+ new PropertyAsParameterInfo(
+ constructorParameter.PropertyInfo,
+ constructorParameter.ParameterInfo,
+ nullabilityContext));
+ }
+ }
+ else
+ {
+ var properties = parameters[i].ParameterType.GetProperties();
+
+ foreach (var property in properties)
+ {
+ if (property.CanWrite)
+ {
+ flattenedParameters.Add(new PropertyAsParameterInfo(property, nullabilityContext));
+ }
+ }
+ }
+ }
+ else if (flattenedParameters is not null)
+ {
+ flattenedParameters.Add(parameters[i]);
+ }
+ }
+
+ return flattenedParameters is not null ? CollectionsMarshal.AsSpan(flattenedParameters) : parameters.AsSpan();
+ }
+
+ public override object[] GetCustomAttributes(Type attributeType, bool inherit)
+ {
+ var attributes = _constructionParameterInfo?.GetCustomAttributes(attributeType, inherit);
+
+ if (attributes == null || attributes is { Length: 0 })
+ {
+ attributes = _underlyingProperty.GetCustomAttributes(attributeType, inherit);
+ }
+
+ return attributes;
+ }
+
+ public override object[] GetCustomAttributes(bool inherit)
+ {
+ var constructorAttributes = _constructionParameterInfo?.GetCustomAttributes(inherit);
+
+ if (constructorAttributes == null || constructorAttributes is { Length: 0 })
+ {
+ return _underlyingProperty.GetCustomAttributes(inherit);
+ }
+
+ var propertyAttributes = _underlyingProperty.GetCustomAttributes(inherit);
+
+ // Since the constructors attributes should take priority we will add them first,
+ // as we usually call it as First() or FirstOrDefault() in the argument creation
+ var mergedAttributes = new object[constructorAttributes.Length + propertyAttributes.Length];
+ Array.Copy(constructorAttributes, mergedAttributes, constructorAttributes.Length);
+ Array.Copy(propertyAttributes, 0, mergedAttributes, constructorAttributes.Length, propertyAttributes.Length);
+
+ return mergedAttributes;
+ }
+
+ public override IList<CustomAttributeData> GetCustomAttributesData()
+ {
+ var attributes = new List<CustomAttributeData>(
+ _constructionParameterInfo?.GetCustomAttributesData() ?? Array.Empty<CustomAttributeData>());
+ attributes.AddRange(_underlyingProperty.GetCustomAttributesData());
+
+ return attributes.AsReadOnly();
+ }
+
+ public override Type[] GetOptionalCustomModifiers()
+ => _underlyingProperty.GetOptionalCustomModifiers();
+
+ public override Type[] GetRequiredCustomModifiers()
+ => _underlyingProperty.GetRequiredCustomModifiers();
+
+ public override bool IsDefined(Type attributeType, bool inherit)
+ {
+ return (_constructionParameterInfo is not null && _constructionParameterInfo.IsDefined(attributeType, inherit)) ||
+ _underlyingProperty.IsDefined(attributeType, inherit);
+ }
+
+ public new bool IsOptional => HasDefaultValue || NullabilityInfo.ReadState != NullabilityState.NotNull;
+
+ public NullabilityInfo NullabilityInfo
+ => _nullabilityInfo ??= _constructionParameterInfo is not null ?
+ _nullabilityContext.Create(_constructionParameterInfo) :
+ _nullabilityContext.Create(_underlyingProperty);
+}
diff --git a/src/Shared/QueryStringEnumerable.cs b/src/Shared/QueryStringEnumerable.cs
index 4ce4a33392..5251e41411 100644
--- a/src/Shared/QueryStringEnumerable.cs
+++ b/src/Shared/QueryStringEnumerable.cs
@@ -184,17 +184,32 @@ internal
var i = (nint)0;
var n = (nint)(uint)buffer.Length;
- if (Sse41.IsSupported && n >= Vector128<ushort>.Count)
+ if (Vector256.IsHardwareAccelerated && n >= Vector256<ushort>.Count)
+ {
+ var vecPlus = Vector256.Create((ushort)'+');
+ var vecSpace = Vector256.Create((ushort)' ');
+
+ do
+ {
+ var vec = Vector256.Load(input + i);
+ var mask = Vector256.Equals(vec, vecPlus);
+ var res = Vector256.ConditionalSelect(mask, vecSpace, vec);
+ res.Store(output + i);
+ i += Vector256<ushort>.Count;
+ } while (i <= n - Vector256<ushort>.Count);
+ }
+
+ if (Vector128.IsHardwareAccelerated && n - i >= Vector128<ushort>.Count)
{
var vecPlus = Vector128.Create((ushort)'+');
var vecSpace = Vector128.Create((ushort)' ');
do
{
- var vec = Sse2.LoadVector128(input + i);
- var mask = Sse2.CompareEqual(vec, vecPlus);
- var res = Sse41.BlendVariable(vec, vecSpace, mask);
- Sse2.Store(output + i, res);
+ var vec = Vector128.Load(input + i);
+ var mask = Vector128.Equals(vec, vecPlus);
+ var res = Vector128.ConditionalSelect(mask, vecSpace, vec);
+ res.Store(output + i);
i += Vector128<ushort>.Count;
} while (i <= n - Vector128<ushort>.Count);
}
diff --git a/src/Shared/Razor/CaseSensitiveBoundAttributeComparer.cs b/src/Shared/Razor/CaseSensitiveBoundAttributeComparer.cs
index 59ff4fdd71..a400b943b0 100644
--- a/src/Shared/Razor/CaseSensitiveBoundAttributeComparer.cs
+++ b/src/Shared/Razor/CaseSensitiveBoundAttributeComparer.cs
@@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Html;
namespace Microsoft.AspNetCore.Razor.TagHelpers.Testing;
-internal class CaseSensitiveTagHelperAttributeComparer : IEqualityComparer<TagHelperAttribute>
+internal sealed class CaseSensitiveTagHelperAttributeComparer : IEqualityComparer<TagHelperAttribute>
{
public static readonly CaseSensitiveTagHelperAttributeComparer Default =
new CaseSensitiveTagHelperAttributeComparer();
diff --git a/src/Shared/RazorShared/RazorDiagnosticJsonConverter.cs b/src/Shared/RazorShared/RazorDiagnosticJsonConverter.cs
index 622be22866..069fb064f8 100644
--- a/src/Shared/RazorShared/RazorDiagnosticJsonConverter.cs
+++ b/src/Shared/RazorShared/RazorDiagnosticJsonConverter.cs
@@ -9,7 +9,7 @@ using Newtonsoft.Json.Linq;
namespace Microsoft.CodeAnalysis.Razor.Serialization;
-internal class RazorDiagnosticJsonConverter : JsonConverter
+internal sealed class RazorDiagnosticJsonConverter : JsonConverter
{
public static readonly RazorDiagnosticJsonConverter Instance = new RazorDiagnosticJsonConverter();
private const string RazorDiagnosticMessageKey = "Message";
diff --git a/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs b/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs
index 7fac431ebf..d5c7bbc37e 100644
--- a/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs
+++ b/src/Shared/RazorShared/TagHelperDescriptorJsonConverter.cs
@@ -8,7 +8,7 @@ using Newtonsoft.Json;
namespace Microsoft.CodeAnalysis.Razor.Serialization;
-internal class TagHelperDescriptorJsonConverter : JsonConverter
+internal sealed class TagHelperDescriptorJsonConverter : JsonConverter
{
public static readonly TagHelperDescriptorJsonConverter Instance = new TagHelperDescriptorJsonConverter();
diff --git a/src/Shared/RazorViews/AttributeValue.cs b/src/Shared/RazorViews/AttributeValue.cs
index 25df0d4c20..abb13bdd98 100644
--- a/src/Shared/RazorViews/AttributeValue.cs
+++ b/src/Shared/RazorViews/AttributeValue.cs
@@ -5,7 +5,7 @@ using System;
namespace Microsoft.Extensions.RazorViews;
-internal class AttributeValue
+internal sealed class AttributeValue
{
public AttributeValue(string prefix, object value, bool literal)
{
diff --git a/src/Shared/RazorViews/HelperResult.cs b/src/Shared/RazorViews/HelperResult.cs
index a87eef4695..04cb5a6cda 100644
--- a/src/Shared/RazorViews/HelperResult.cs
+++ b/src/Shared/RazorViews/HelperResult.cs
@@ -9,7 +9,7 @@ namespace Microsoft.Extensions.RazorViews;
/// <summary>
/// Represents a deferred write operation in a <see cref="BaseView"/>.
/// </summary>
-internal class HelperResult
+internal sealed class HelperResult
{
/// <summary>
/// Creates a new instance of <see cref="HelperResult"/>.
diff --git a/src/Shared/Reroute.cs b/src/Shared/Reroute.cs
new file mode 100644
index 0000000000..d44e103205
--- /dev/null
+++ b/src/Shared/Reroute.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+
+namespace Microsoft.AspNetCore.Routing;
+
+internal static class RerouteHelper
+{
+ internal const string GlobalRouteBuilderKey = "__GlobalEndpointRouteBuilder";
+ internal const string UseRoutingKey = "__UseRouting";
+
+ internal static RequestDelegate Reroute(IApplicationBuilder app, object routeBuilder, RequestDelegate next)
+ {
+ if (app.Properties.TryGetValue(UseRoutingKey, out var useRouting) && useRouting is Func<IApplicationBuilder, IApplicationBuilder> useRoutingFunc)
+ {
+ var builder = app.New();
+ // use the old routing pipeline if it exists so we preserve all the routes and matching logic
+ // ((IApplicationBuilder)WebApplication).New() does not copy GlobalRouteBuilderKey automatically like it does for all other properties.
+ builder.Properties[GlobalRouteBuilderKey] = routeBuilder;
+
+ // UseRouting()
+ useRoutingFunc(builder);
+
+ // apply the next middleware
+ builder.Run(next);
+
+ return builder.Build();
+ }
+
+ return next;
+ }
+}
diff --git a/src/Shared/ResultsTests/PhysicalFileResultTestBase.cs b/src/Shared/ResultsTests/PhysicalFileResultTestBase.cs
index 52b89481db..652300442e 100644
--- a/src/Shared/ResultsTests/PhysicalFileResultTestBase.cs
+++ b/src/Shared/ResultsTests/PhysicalFileResultTestBase.cs
@@ -419,7 +419,7 @@ public abstract class PhysicalFileResultTestBase
() => ExecuteAsync(httpContext, path, "text/plain"));
}
- private class TestSendFileFeature : IHttpResponseBodyFeature
+ private sealed class TestSendFileFeature : IHttpResponseBodyFeature
{
public string Name { get; set; }
public long Offset { get; set; }
diff --git a/src/Shared/ResultsTests/VirtualFileResultTestBase.cs b/src/Shared/ResultsTests/VirtualFileResultTestBase.cs
index 8f1fb2a53d..34eaf0ad10 100644
--- a/src/Shared/ResultsTests/VirtualFileResultTestBase.cs
+++ b/src/Shared/ResultsTests/VirtualFileResultTestBase.cs
@@ -522,7 +522,7 @@ public abstract class VirtualFileResultTestBase
return fileProvider.Object;
}
- private class TestSendFileFeature : IHttpResponseBodyFeature
+ private sealed class TestSendFileFeature : IHttpResponseBodyFeature
{
public string Name { get; set; }
public long Offset { get; set; }
diff --git a/src/Shared/RoslynUtils/GeneratedNameParser.cs b/src/Shared/RoslynUtils/GeneratedNameParser.cs
deleted file mode 100644
index 82d6c2da1f..0000000000
--- a/src/Shared/RoslynUtils/GeneratedNameParser.cs
+++ /dev/null
@@ -1,30 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-using System.Diagnostics.CodeAnalysis;
-
-// This code is a stop-gap and exists to address the issues with extracting
-// original method names from generated local functions. See https://github.com/dotnet/roslyn/issues/55651
-// for more info.
-namespace Microsoft.CodeAnalysis.CSharp.Symbols;
-
-internal static class GeneratedNameParser
-{
- /// <summary>
- /// Parses generated local function name out of a generated method name.
- /// </summary>
- internal static bool TryParseLocalFunctionName(string generatedName, [NotNullWhen(true)] out string? originalName)
- {
- originalName = null;
-
- var startIndex = generatedName.LastIndexOf(">g__", StringComparison.Ordinal);
- var endIndex = generatedName.LastIndexOf("|", StringComparison.Ordinal);
- if (startIndex >= 0 && endIndex >= 0 && endIndex - startIndex > 4)
- {
- originalName = generatedName.Substring(startIndex + 4, endIndex - startIndex - 4);
- return true;
- }
-
- return false;
- }
-}
diff --git a/src/Shared/RoslynUtils/TypeHelper.cs b/src/Shared/RoslynUtils/TypeHelper.cs
index b7f8a20ab8..51ca29d9c9 100644
--- a/src/Shared/RoslynUtils/TypeHelper.cs
+++ b/src/Shared/RoslynUtils/TypeHelper.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Diagnostics.CodeAnalysis;
using System.Reflection;
namespace System.Runtime.CompilerServices;
@@ -32,8 +33,44 @@ internal static class TypeHelper
/// </summary>
/// <param name="method">The method to evaluate.</param>
/// <returns><see langword="true" /> if <paramref name="method"/> is compiler generated.</returns>
- internal static bool IsCompilerGeneratedMethod(MethodInfo method)
+ private static bool IsCompilerGeneratedMethod(MethodInfo method)
{
return Attribute.IsDefined(method, typeof(CompilerGeneratedAttribute)) || IsCompilerGeneratedType(method.DeclaringType);
}
+
+ /// <summary>
+ /// Parses generated local function name out of a generated method name. This code is a stop-gap and exists to address the issues with extracting
+ /// original method names from generated local functions. See https://github.com/dotnet/roslyn/issues/55651 for more info.
+ /// </summary>
+ private static bool TryParseLocalFunctionName(string generatedName, [NotNullWhen(true)] out string? originalName)
+ {
+ originalName = null;
+
+ var startIndex = generatedName.LastIndexOf(">g__", StringComparison.Ordinal);
+ var endIndex = generatedName.LastIndexOf("|", StringComparison.Ordinal);
+ if (startIndex >= 0 && endIndex >= 0 && endIndex - startIndex > 4)
+ {
+ originalName = generatedName.Substring(startIndex + 4, endIndex - startIndex - 4);
+ return true;
+ }
+
+ return false;
+ }
+
+ /// <summary>
+ /// Tries to get non-compiler-generated name of function. This parses generated local function names out of a generated method name if possible.
+ /// </summary>
+ internal static bool TryGetNonCompilerGeneratedMethodName(MethodInfo method, [NotNullWhen(true)] out string? originalName)
+ {
+ var methodName = method.Name;
+
+ if (!IsCompilerGeneratedMethod(method))
+ {
+ originalName = methodName;
+ return true;
+ }
+
+ return TryParseLocalFunctionName(methodName, out originalName);
+ }
}
+
diff --git a/src/Shared/ServerInfrastructure/DuplexPipe.cs b/src/Shared/ServerInfrastructure/DuplexPipe.cs
index 7eeabd38f0..65c1f437ec 100644
--- a/src/Shared/ServerInfrastructure/DuplexPipe.cs
+++ b/src/Shared/ServerInfrastructure/DuplexPipe.cs
@@ -3,7 +3,7 @@
namespace System.IO.Pipelines;
-internal class DuplexPipe : IDuplexPipe
+internal sealed class DuplexPipe : IDuplexPipe
{
public DuplexPipe(PipeReader reader, PipeWriter writer)
{
diff --git a/src/Shared/ServerInfrastructure/Http2/Http2Frame.Continuation.cs b/src/Shared/ServerInfrastructure/Http2/Http2Frame.Continuation.cs
index 87f18d4592..dfbeafabbc 100644
--- a/src/Shared/ServerInfrastructure/Http2/Http2Frame.Continuation.cs
+++ b/src/Shared/ServerInfrastructure/Http2/Http2Frame.Continuation.cs
@@ -8,7 +8,9 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
| Header Block Fragment (*) ...
+---------------------------------------------------------------+
*/
+#pragma warning disable CA1852 // Seal internal types
internal partial class Http2Frame
+#pragma warning restore CA1852 // Seal internal types
{
public Http2ContinuationFrameFlags ContinuationFlags
{
diff --git a/src/Shared/ServerInfrastructure/Http2/Http2PeerSettings.cs b/src/Shared/ServerInfrastructure/Http2/Http2PeerSettings.cs
index 78940a0b5e..a9b286c61c 100644
--- a/src/Shared/ServerInfrastructure/Http2/Http2PeerSettings.cs
+++ b/src/Shared/ServerInfrastructure/Http2/Http2PeerSettings.cs
@@ -5,7 +5,7 @@ using System.Collections.Generic;
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
-internal class Http2PeerSettings
+internal sealed class Http2PeerSettings
{
// Note these are protocol defaults, not Kestrel defaults.
public const uint DefaultHeaderTableSize = 4096;
@@ -90,9 +90,9 @@ internal class Http2PeerSettings
// Gets the settings that are different from the protocol defaults (as opposed to the server defaults).
internal List<Http2PeerSetting> GetNonProtocolDefaults()
{
- // By default, there is only one setting that is sent from server to client.
+ // By default, there are only two settings that are sent from server to client.
// Set capacity to that value.
- var list = new List<Http2PeerSetting>(1);
+ var list = new List<Http2PeerSetting>(2);
if (HeaderTableSize != DefaultHeaderTableSize)
{
@@ -124,6 +124,8 @@ internal class Http2PeerSettings
list.Add(new Http2PeerSetting(Http2SettingsParameter.SETTINGS_MAX_HEADER_LIST_SIZE, MaxHeaderListSize));
}
+ list.Add(new Http2PeerSetting(Http2SettingsParameter.SETTINGS_ENABLE_CONNECT_PROTOCOL, 1u));
+
return list;
}
}
diff --git a/src/Shared/ServerInfrastructure/Http2/Http2SettingsParameter.cs b/src/Shared/ServerInfrastructure/Http2/Http2SettingsParameter.cs
index 7367b98f95..c62695045d 100644
--- a/src/Shared/ServerInfrastructure/Http2/Http2SettingsParameter.cs
+++ b/src/Shared/ServerInfrastructure/Http2/Http2SettingsParameter.cs
@@ -3,6 +3,7 @@
namespace Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http2;
+// https://www.iana.org/assignments/http2-parameters/http2-parameters.xhtml#settings
internal enum Http2SettingsParameter : ushort
{
SETTINGS_HEADER_TABLE_SIZE = 0x1,
@@ -11,4 +12,5 @@ internal enum Http2SettingsParameter : ushort
SETTINGS_INITIAL_WINDOW_SIZE = 0x4,
SETTINGS_MAX_FRAME_SIZE = 0x5,
SETTINGS_MAX_HEADER_LIST_SIZE = 0x6,
+ SETTINGS_ENABLE_CONNECT_PROTOCOL = 0x8,
}
diff --git a/src/Shared/ServerInfrastructure/SslDuplexPipe.cs b/src/Shared/ServerInfrastructure/SslDuplexPipe.cs
index 4c25a5863e..903abf6287 100644
--- a/src/Shared/ServerInfrastructure/SslDuplexPipe.cs
+++ b/src/Shared/ServerInfrastructure/SslDuplexPipe.cs
@@ -9,7 +9,7 @@ using Microsoft.AspNetCore.Server.Kestrel.Core.Internal;
namespace Microsoft.AspNetCore.Server.Kestrel.Https.Internal;
-internal class SslDuplexPipe : DuplexPipeStreamAdapter<SslStream>
+internal sealed class SslDuplexPipe : DuplexPipeStreamAdapter<SslStream>
{
public SslDuplexPipe(IDuplexPipe transport, StreamPipeReaderOptions readerOptions, StreamPipeWriterOptions writerOptions)
: this(transport, readerOptions, writerOptions, s => new SslStream(s))
diff --git a/src/Shared/ServerInfrastructure/StringUtilities.cs b/src/Shared/ServerInfrastructure/StringUtilities.cs
index ad361ddac0..3c354cefcc 100644
--- a/src/Shared/ServerInfrastructure/StringUtilities.cs
+++ b/src/Shared/ServerInfrastructure/StringUtilities.cs
@@ -769,7 +769,7 @@ internal static class StringUtilities
// This must be explicity typed as ReadOnlySpan<byte>
// This then becomes a non-allocating mapping to the data section of the assembly.
// If it is a var, Span<byte> or byte[], it allocates the byte array per call.
- ReadOnlySpan<byte> hexEncodeMap = new byte[] { (byte)'0', (byte)'1', (byte)'2', (byte)'3', (byte)'4', (byte)'5', (byte)'6', (byte)'7', (byte)'8', (byte)'9', (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F' };
+ ReadOnlySpan<byte> hexEncodeMap = "0123456789ABCDEF"u8;
// Note: this only works with byte due to endian ambiguity for other types,
// hence the later (char) casts
diff --git a/src/Shared/SignalR/InProcessTestServer.cs b/src/Shared/SignalR/InProcessTestServer.cs
index 80d4a0a450..296d72640e 100644
--- a/src/Shared/SignalR/InProcessTestServer.cs
+++ b/src/Shared/SignalR/InProcessTestServer.cs
@@ -162,7 +162,7 @@ public class InProcessTestServer<TStartup> : InProcessTestServer
}
}
- private class ForwardingLoggerProvider : ILoggerProvider
+ private sealed class ForwardingLoggerProvider : ILoggerProvider
{
private readonly ILoggerFactory _loggerFactory;
diff --git a/src/Shared/SignalR/LogSinkProvider.cs b/src/Shared/SignalR/LogSinkProvider.cs
index e11d8118e0..eaad046ee9 100644
--- a/src/Shared/SignalR/LogSinkProvider.cs
+++ b/src/Shared/SignalR/LogSinkProvider.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Logging.Testing;
namespace Microsoft.AspNetCore.SignalR.Tests;
// TestSink does not have an event
-internal class LogSinkProvider : ILoggerProvider
+internal sealed class LogSinkProvider : ILoggerProvider
{
private readonly ConcurrentQueue<LogRecord> _logs = new ConcurrentQueue<LogRecord>();
@@ -47,7 +47,7 @@ internal class LogSinkProvider : ILoggerProvider
RecordLogged?.Invoke(record);
}
- private class LogSinkLogger : ILogger
+ private sealed class LogSinkLogger : ILogger
{
private readonly string _categoryName;
private readonly LogSinkProvider _logSinkProvider;
diff --git a/src/Shared/SignalR/WrappingLoggerFactory.cs b/src/Shared/SignalR/WrappingLoggerFactory.cs
index 769b365caa..7846573c97 100644
--- a/src/Shared/SignalR/WrappingLoggerFactory.cs
+++ b/src/Shared/SignalR/WrappingLoggerFactory.cs
@@ -40,7 +40,7 @@ public class WrappingLoggerFactory : ILoggerFactory
_innerLoggerFactory.AddProvider(provider);
}
- private class DummyProvider : ILoggerProvider, ISupportExternalScope
+ private sealed class DummyProvider : ILoggerProvider, ISupportExternalScope
{
public IExternalScopeProvider ScopeProvider { get; private set; }
@@ -59,7 +59,7 @@ public class WrappingLoggerFactory : ILoggerFactory
}
}
- private class WrappingLogger : ILogger
+ private sealed class WrappingLogger : ILogger
{
private readonly DummyProvider _provider;
private readonly ILogger _logger;
diff --git a/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs
index 22719ab425..8298e5112f 100644
--- a/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs
+++ b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs
@@ -11,7 +11,7 @@ namespace Microsoft.Extensions.StackTrace.Sources;
/// <summary>
/// Contains details for individual exception messages.
/// </summary>
-internal class ExceptionDetails
+internal sealed class ExceptionDetails
{
public ExceptionDetails(Exception error, IEnumerable<StackFrameSourceCodeInfo> stackFrames)
{
diff --git a/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs
index 1daa7d5809..30645c4b9a 100644
--- a/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs
+++ b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Logging;
namespace Microsoft.Extensions.StackTrace.Sources;
-internal class ExceptionDetailsProvider
+internal sealed class ExceptionDetailsProvider
{
private readonly IFileProvider _fileProvider;
private readonly ILogger? _logger;
diff --git a/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs b/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs
index 913b6babc1..b2108098b8 100644
--- a/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs
+++ b/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs
@@ -9,7 +9,7 @@ using System.Text;
namespace Microsoft.Extensions.StackTrace.Sources;
-internal class MethodDisplayInfo
+internal sealed class MethodDisplayInfo
{
public MethodDisplayInfo(string? declaringTypeName, string name, string? genericArguments, string? subMethod, IEnumerable<ParameterDisplayInfo> parameters)
{
diff --git a/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs b/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs
index 8a6f597062..31dbfca881 100644
--- a/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs
+++ b/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs
@@ -6,7 +6,7 @@ using System.Text;
namespace Microsoft.Extensions.StackTrace.Sources;
-internal class ParameterDisplayInfo
+internal sealed class ParameterDisplayInfo
{
public string? Name { get; set; }
diff --git a/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs b/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs
index 9ebf50f78c..068af53adb 100644
--- a/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs
+++ b/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs
@@ -6,7 +6,7 @@ using System.Diagnostics;
namespace Microsoft.Extensions.StackTrace.Sources;
-internal class StackFrameInfo
+internal sealed class StackFrameInfo
{
public StackFrameInfo(int lineNumber, string? filePath, StackFrame? stackFrame, MethodDisplayInfo? methodDisplayInfo)
{
diff --git a/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs b/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs
index 610a115974..586b674367 100644
--- a/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs
+++ b/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs
@@ -11,7 +11,7 @@ namespace Microsoft.Extensions.StackTrace.Sources;
/// <summary>
/// Contains the source code where the exception occurred.
/// </summary>
-internal class StackFrameSourceCodeInfo
+internal sealed class StackFrameSourceCodeInfo
{
/// <summary>
/// Function containing instruction
diff --git a/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs b/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs
index b8f9000128..dd4bb9f6f4 100644
--- a/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs
+++ b/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs
@@ -15,7 +15,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.Extensions.StackTrace.Sources;
-internal class StackTraceHelper
+internal sealed class StackTraceHelper
{
[UnconditionalSuppressMessage("Trimmer", "IL2026", Justification = "MethodInfo for a stack frame might be incomplete or removed. GetFrames does the best it can to provide frame details.")]
public static IList<StackFrameInfo> GetFrames(Exception exception, out AggregateException? error)
diff --git a/src/Shared/StaticWebAssets/ManifestStaticWebAssetFileProvider.cs b/src/Shared/StaticWebAssets/ManifestStaticWebAssetFileProvider.cs
index 45aa301118..d1d5f2f4dc 100644
--- a/src/Shared/StaticWebAssets/ManifestStaticWebAssetFileProvider.cs
+++ b/src/Shared/StaticWebAssets/ManifestStaticWebAssetFileProvider.cs
@@ -331,7 +331,7 @@ internal sealed partial class ManifestStaticWebAssetFileProvider : IFileProvider
[JsonSourceGenerationOptions]
[JsonSerializable(typeof(StaticWebAssetManifest))]
[JsonSerializable(typeof(IDictionary<string, StaticWebAssetNode>))]
- internal partial class SourceGenerationContext : JsonSerializerContext
+ internal sealed partial class SourceGenerationContext : JsonSerializerContext
{
public static readonly SourceGenerationContext DefaultWithConverter = new SourceGenerationContext(new JsonSerializerOptions
{
diff --git a/src/Shared/StringHelpers.cs b/src/Shared/StringHelpers.cs
new file mode 100644
index 0000000000..fc61600c0c
--- /dev/null
+++ b/src/Shared/StringHelpers.cs
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace System;
+
+internal static class StringHelpers
+{
+ public static T ParseValueOrDefault<T>(string? stringValue, Func<string, T> parser, T defaultValue)
+ {
+ if (string.IsNullOrEmpty(stringValue))
+ {
+ return defaultValue;
+ }
+
+ return parser(stringValue);
+ }
+}
diff --git a/src/Shared/TaskToApm.cs b/src/Shared/TaskToApm.cs
index 0647dc4a00..cec6fa53df 100644
--- a/src/Shared/TaskToApm.cs
+++ b/src/Shared/TaskToApm.cs
@@ -42,7 +42,7 @@ internal static class TaskToApm
return;
}
- throw new ArgumentNullException(nameof(asyncResult));
+ ArgumentNullException.ThrowIfNull(asyncResult, nameof(asyncResult));
}
/// <summary>Processes an IAsyncResult returned by Begin.</summary>
diff --git a/src/Shared/TrimmingAttributes.cs b/src/Shared/TrimmingAttributes.cs
index c4b5bc0c65..30b6805a9f 100644
--- a/src/Shared/TrimmingAttributes.cs
+++ b/src/Shared/TrimmingAttributes.cs
@@ -119,3 +119,117 @@ internal sealed class UnconditionalSuppressMessageAttribute : Attribute
/// </summary>
public string? Justification { get; set; }
}
+
+[AttributeUsage(
+ AttributeTargets.Field | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter |
+ AttributeTargets.Parameter | AttributeTargets.Property | AttributeTargets.Method |
+ AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct,
+ Inherited = false)]
+internal sealed class DynamicallyAccessedMembersAttribute : Attribute
+{
+ /// <summary>
+ /// Initializes a new instance of the <see cref="DynamicallyAccessedMembersAttribute"/> class
+ /// with the specified member types.
+ /// </summary>
+ /// <param name="memberTypes">The types of members dynamically accessed.</param>
+ public DynamicallyAccessedMembersAttribute(DynamicallyAccessedMemberTypes memberTypes)
+ {
+ MemberTypes = memberTypes;
+ }
+
+ /// <summary>
+ /// Gets the <see cref="DynamicallyAccessedMemberTypes"/> which specifies the type
+ /// of members dynamically accessed.
+ /// </summary>
+ public DynamicallyAccessedMemberTypes MemberTypes { get; }
+}
+
+/// <summary>
+/// Specifies the types of members that are dynamically accessed.
+///
+/// This enumeration has a <see cref="FlagsAttribute"/> attribute that allows a
+/// bitwise combination of its member values.
+/// </summary>
+[Flags]
+internal enum DynamicallyAccessedMemberTypes
+{
+ /// <summary>
+ /// Specifies no members.
+ /// </summary>
+ None = 0,
+
+ /// <summary>
+ /// Specifies the default, parameterless public constructor.
+ /// </summary>
+ PublicParameterlessConstructor = 0x0001,
+
+ /// <summary>
+ /// Specifies all public constructors.
+ /// </summary>
+ PublicConstructors = 0x0002 | PublicParameterlessConstructor,
+
+ /// <summary>
+ /// Specifies all non-public constructors.
+ /// </summary>
+ NonPublicConstructors = 0x0004,
+
+ /// <summary>
+ /// Specifies all public methods.
+ /// </summary>
+ PublicMethods = 0x0008,
+
+ /// <summary>
+ /// Specifies all non-public methods.
+ /// </summary>
+ NonPublicMethods = 0x0010,
+
+ /// <summary>
+ /// Specifies all public fields.
+ /// </summary>
+ PublicFields = 0x0020,
+
+ /// <summary>
+ /// Specifies all non-public fields.
+ /// </summary>
+ NonPublicFields = 0x0040,
+
+ /// <summary>
+ /// Specifies all public nested types.
+ /// </summary>
+ PublicNestedTypes = 0x0080,
+
+ /// <summary>
+ /// Specifies all non-public nested types.
+ /// </summary>
+ NonPublicNestedTypes = 0x0100,
+
+ /// <summary>
+ /// Specifies all public properties.
+ /// </summary>
+ PublicProperties = 0x0200,
+
+ /// <summary>
+ /// Specifies all non-public properties.
+ /// </summary>
+ NonPublicProperties = 0x0400,
+
+ /// <summary>
+ /// Specifies all public events.
+ /// </summary>
+ PublicEvents = 0x0800,
+
+ /// <summary>
+ /// Specifies all non-public events.
+ /// </summary>
+ NonPublicEvents = 0x1000,
+
+ /// <summary>
+ /// Specifies all interfaces implemented by the type.
+ /// </summary>
+ Interfaces = 0x2000,
+
+ /// <summary>
+ /// Specifies all members.
+ /// </summary>
+ All = ~None
+}
diff --git a/src/Shared/UrlDecoder/UrlDecoder.cs b/src/Shared/UrlDecoder/UrlDecoder.cs
index 09bf6daf0a..e64e34ee97 100644
--- a/src/Shared/UrlDecoder/UrlDecoder.cs
+++ b/src/Shared/UrlDecoder/UrlDecoder.cs
@@ -6,7 +6,7 @@ using System.Runtime.CompilerServices;
namespace Microsoft.AspNetCore.Internal;
-internal class UrlDecoder
+internal sealed class UrlDecoder
{
/// <summary>
/// Unescape a URL path
diff --git a/src/Shared/runtime/Http2/Hpack/HPackDecoder.cs b/src/Shared/runtime/Http2/Hpack/HPackDecoder.cs
index f9d8dc45b8..cefb377f40 100644
--- a/src/Shared/runtime/Http2/Hpack/HPackDecoder.cs
+++ b/src/Shared/runtime/Http2/Hpack/HPackDecoder.cs
@@ -183,7 +183,7 @@ namespace System.Net.Http.HPack
while (currentIndex < data.Length);
// If a header range was set, but the value was not in the data, then copy the range
- // to the name buffer. Must copy because because the data will be replaced and the range
+ // to the name buffer. Must copy because the data will be replaced and the range
// will no longer be valid.
if (_headerNameRange != null)
{
diff --git a/src/Shared/runtime/Http2/Hpack/IntegerDecoder.cs b/src/Shared/runtime/Http2/Hpack/IntegerDecoder.cs
index 34ab1d294e..b717b3d4d8 100644
--- a/src/Shared/runtime/Http2/Hpack/IntegerDecoder.cs
+++ b/src/Shared/runtime/Http2/Hpack/IntegerDecoder.cs
@@ -73,7 +73,7 @@ namespace System.Net.Http.HPack
throw new HPackDecodingException(SR.net_http_hpack_bad_integer);
}
- _i = _i + ((b & 0x7f) << _m);
+ _i += ((b & 0x7f) << _m);
// If the addition overflowed, the result will be negative.
if (_i < 0)
@@ -81,7 +81,7 @@ namespace System.Net.Http.HPack
throw new HPackDecodingException(SR.net_http_hpack_bad_integer);
}
- _m = _m + 7;
+ _m += 7;
if ((b & 128) == 0)
{
diff --git a/src/Shared/runtime/Http2/Hpack/IntegerEncoder.cs b/src/Shared/runtime/Http2/Hpack/IntegerEncoder.cs
index b25b218522..22719673ff 100644
--- a/src/Shared/runtime/Http2/Hpack/IntegerEncoder.cs
+++ b/src/Shared/runtime/Http2/Hpack/IntegerEncoder.cs
@@ -50,7 +50,7 @@ namespace System.Net.Http.HPack
return false;
}
- value = value - ((1 << numBits) - 1);
+ value -= ((1 << numBits) - 1);
int i = 1;
while (value >= 128)
@@ -63,7 +63,7 @@ namespace System.Net.Http.HPack
return false;
}
- value = value / 128;
+ value /= 128;
}
destination[i++] = (byte)value;
diff --git a/src/Shared/runtime/Http2/Hpack/StatusCodes.cs b/src/Shared/runtime/Http2/Hpack/StatusCodes.cs
index c09236f841..f4e704a447 100644
--- a/src/Shared/runtime/Http2/Hpack/StatusCodes.cs
+++ b/src/Shared/runtime/Http2/Hpack/StatusCodes.cs
@@ -8,207 +8,138 @@ namespace System.Net.Http.HPack
{
internal static partial class StatusCodes
{
- // This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
-
- private static ReadOnlySpan<byte> BytesStatus100 => new byte[] { (byte)'1', (byte)'0', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus101 => new byte[] { (byte)'1', (byte)'0', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus102 => new byte[] { (byte)'1', (byte)'0', (byte)'2' };
-
- private static ReadOnlySpan<byte> BytesStatus200 => new byte[] { (byte)'2', (byte)'0', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus201 => new byte[] { (byte)'2', (byte)'0', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus202 => new byte[] { (byte)'2', (byte)'0', (byte)'2' };
- private static ReadOnlySpan<byte> BytesStatus203 => new byte[] { (byte)'2', (byte)'0', (byte)'3' };
- private static ReadOnlySpan<byte> BytesStatus204 => new byte[] { (byte)'2', (byte)'0', (byte)'4' };
- private static ReadOnlySpan<byte> BytesStatus205 => new byte[] { (byte)'2', (byte)'0', (byte)'5' };
- private static ReadOnlySpan<byte> BytesStatus206 => new byte[] { (byte)'2', (byte)'0', (byte)'6' };
- private static ReadOnlySpan<byte> BytesStatus207 => new byte[] { (byte)'2', (byte)'0', (byte)'7' };
- private static ReadOnlySpan<byte> BytesStatus208 => new byte[] { (byte)'2', (byte)'0', (byte)'8' };
- private static ReadOnlySpan<byte> BytesStatus226 => new byte[] { (byte)'2', (byte)'2', (byte)'6' };
-
- private static ReadOnlySpan<byte> BytesStatus300 => new byte[] { (byte)'3', (byte)'0', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus301 => new byte[] { (byte)'3', (byte)'0', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus302 => new byte[] { (byte)'3', (byte)'0', (byte)'2' };
- private static ReadOnlySpan<byte> BytesStatus303 => new byte[] { (byte)'3', (byte)'0', (byte)'3' };
- private static ReadOnlySpan<byte> BytesStatus304 => new byte[] { (byte)'3', (byte)'0', (byte)'4' };
- private static ReadOnlySpan<byte> BytesStatus305 => new byte[] { (byte)'3', (byte)'0', (byte)'5' };
- private static ReadOnlySpan<byte> BytesStatus306 => new byte[] { (byte)'3', (byte)'0', (byte)'6' };
- private static ReadOnlySpan<byte> BytesStatus307 => new byte[] { (byte)'3', (byte)'0', (byte)'7' };
- private static ReadOnlySpan<byte> BytesStatus308 => new byte[] { (byte)'3', (byte)'0', (byte)'8' };
-
- private static ReadOnlySpan<byte> BytesStatus400 => new byte[] { (byte)'4', (byte)'0', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus401 => new byte[] { (byte)'4', (byte)'0', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus402 => new byte[] { (byte)'4', (byte)'0', (byte)'2' };
- private static ReadOnlySpan<byte> BytesStatus403 => new byte[] { (byte)'4', (byte)'0', (byte)'3' };
- private static ReadOnlySpan<byte> BytesStatus404 => new byte[] { (byte)'4', (byte)'0', (byte)'4' };
- private static ReadOnlySpan<byte> BytesStatus405 => new byte[] { (byte)'4', (byte)'0', (byte)'5' };
- private static ReadOnlySpan<byte> BytesStatus406 => new byte[] { (byte)'4', (byte)'0', (byte)'6' };
- private static ReadOnlySpan<byte> BytesStatus407 => new byte[] { (byte)'4', (byte)'0', (byte)'7' };
- private static ReadOnlySpan<byte> BytesStatus408 => new byte[] { (byte)'4', (byte)'0', (byte)'8' };
- private static ReadOnlySpan<byte> BytesStatus409 => new byte[] { (byte)'4', (byte)'0', (byte)'9' };
- private static ReadOnlySpan<byte> BytesStatus410 => new byte[] { (byte)'4', (byte)'1', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus411 => new byte[] { (byte)'4', (byte)'1', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus412 => new byte[] { (byte)'4', (byte)'1', (byte)'2' };
- private static ReadOnlySpan<byte> BytesStatus413 => new byte[] { (byte)'4', (byte)'1', (byte)'3' };
- private static ReadOnlySpan<byte> BytesStatus414 => new byte[] { (byte)'4', (byte)'1', (byte)'4' };
- private static ReadOnlySpan<byte> BytesStatus415 => new byte[] { (byte)'4', (byte)'1', (byte)'5' };
- private static ReadOnlySpan<byte> BytesStatus416 => new byte[] { (byte)'4', (byte)'1', (byte)'6' };
- private static ReadOnlySpan<byte> BytesStatus417 => new byte[] { (byte)'4', (byte)'1', (byte)'7' };
- private static ReadOnlySpan<byte> BytesStatus418 => new byte[] { (byte)'4', (byte)'1', (byte)'8' };
- private static ReadOnlySpan<byte> BytesStatus419 => new byte[] { (byte)'4', (byte)'1', (byte)'9' };
- private static ReadOnlySpan<byte> BytesStatus421 => new byte[] { (byte)'4', (byte)'2', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus422 => new byte[] { (byte)'4', (byte)'2', (byte)'2' };
- private static ReadOnlySpan<byte> BytesStatus423 => new byte[] { (byte)'4', (byte)'2', (byte)'3' };
- private static ReadOnlySpan<byte> BytesStatus424 => new byte[] { (byte)'4', (byte)'2', (byte)'4' };
- private static ReadOnlySpan<byte> BytesStatus426 => new byte[] { (byte)'4', (byte)'2', (byte)'6' };
- private static ReadOnlySpan<byte> BytesStatus428 => new byte[] { (byte)'4', (byte)'2', (byte)'8' };
- private static ReadOnlySpan<byte> BytesStatus429 => new byte[] { (byte)'4', (byte)'2', (byte)'9' };
- private static ReadOnlySpan<byte> BytesStatus431 => new byte[] { (byte)'4', (byte)'3', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus451 => new byte[] { (byte)'4', (byte)'5', (byte)'1' };
-
- private static ReadOnlySpan<byte> BytesStatus500 => new byte[] { (byte)'5', (byte)'0', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus501 => new byte[] { (byte)'5', (byte)'0', (byte)'1' };
- private static ReadOnlySpan<byte> BytesStatus502 => new byte[] { (byte)'5', (byte)'0', (byte)'2' };
- private static ReadOnlySpan<byte> BytesStatus503 => new byte[] { (byte)'5', (byte)'0', (byte)'3' };
- private static ReadOnlySpan<byte> BytesStatus504 => new byte[] { (byte)'5', (byte)'0', (byte)'4' };
- private static ReadOnlySpan<byte> BytesStatus505 => new byte[] { (byte)'5', (byte)'0', (byte)'5' };
- private static ReadOnlySpan<byte> BytesStatus506 => new byte[] { (byte)'5', (byte)'0', (byte)'6' };
- private static ReadOnlySpan<byte> BytesStatus507 => new byte[] { (byte)'5', (byte)'0', (byte)'7' };
- private static ReadOnlySpan<byte> BytesStatus508 => new byte[] { (byte)'5', (byte)'0', (byte)'8' };
- private static ReadOnlySpan<byte> BytesStatus510 => new byte[] { (byte)'5', (byte)'1', (byte)'0' };
- private static ReadOnlySpan<byte> BytesStatus511 => new byte[] { (byte)'5', (byte)'1', (byte)'1' };
-
public static ReadOnlySpan<byte> ToStatusBytes(int statusCode)
{
switch (statusCode)
{
case (int)HttpStatusCode.Continue:
- return BytesStatus100;
+ return "100"u8;
case (int)HttpStatusCode.SwitchingProtocols:
- return BytesStatus101;
+ return "101"u8;
case (int)HttpStatusCode.Processing:
- return BytesStatus102;
+ return "102"u8;
case (int)HttpStatusCode.OK:
- return BytesStatus200;
+ return "200"u8;
case (int)HttpStatusCode.Created:
- return BytesStatus201;
+ return "201"u8;
case (int)HttpStatusCode.Accepted:
- return BytesStatus202;
+ return "202"u8;
case (int)HttpStatusCode.NonAuthoritativeInformation:
- return BytesStatus203;
+ return "203"u8;
case (int)HttpStatusCode.NoContent:
- return BytesStatus204;
+ return "204"u8;
case (int)HttpStatusCode.ResetContent:
- return BytesStatus205;
+ return "205"u8;
case (int)HttpStatusCode.PartialContent:
- return BytesStatus206;
+ return "206"u8;
case (int)HttpStatusCode.MultiStatus:
- return BytesStatus207;
+ return "207"u8;
case (int)HttpStatusCode.AlreadyReported:
- return BytesStatus208;
+ return "208"u8;
case (int)HttpStatusCode.IMUsed:
- return BytesStatus226;
+ return "226"u8;
case (int)HttpStatusCode.MultipleChoices:
- return BytesStatus300;
+ return "300"u8;
case (int)HttpStatusCode.MovedPermanently:
- return BytesStatus301;
+ return "301"u8;
case (int)HttpStatusCode.Found:
- return BytesStatus302;
+ return "302"u8;
case (int)HttpStatusCode.SeeOther:
- return BytesStatus303;
+ return "303"u8;
case (int)HttpStatusCode.NotModified:
- return BytesStatus304;
+ return "304"u8;
case (int)HttpStatusCode.UseProxy:
- return BytesStatus305;
+ return "305"u8;
case (int)HttpStatusCode.Unused:
- return BytesStatus306;
+ return "306"u8;
case (int)HttpStatusCode.TemporaryRedirect:
- return BytesStatus307;
+ return "307"u8;
case (int)HttpStatusCode.PermanentRedirect:
- return BytesStatus308;
+ return "308"u8;
case (int)HttpStatusCode.BadRequest:
- return BytesStatus400;
+ return "400"u8;
case (int)HttpStatusCode.Unauthorized:
- return BytesStatus401;
+ return "401"u8;
case (int)HttpStatusCode.PaymentRequired:
- return BytesStatus402;
+ return "402"u8;
case (int)HttpStatusCode.Forbidden:
- return BytesStatus403;
+ return "403"u8;
case (int)HttpStatusCode.NotFound:
- return BytesStatus404;
+ return "404"u8;
case (int)HttpStatusCode.MethodNotAllowed:
- return BytesStatus405;
+ return "405"u8;
case (int)HttpStatusCode.NotAcceptable:
- return BytesStatus406;
+ return "406"u8;
case (int)HttpStatusCode.ProxyAuthenticationRequired:
- return BytesStatus407;
+ return "407"u8;
case (int)HttpStatusCode.RequestTimeout:
- return BytesStatus408;
+ return "408"u8;
case (int)HttpStatusCode.Conflict:
- return BytesStatus409;
+ return "409"u8;
case (int)HttpStatusCode.Gone:
- return BytesStatus410;
+ return "410"u8;
case (int)HttpStatusCode.LengthRequired:
- return BytesStatus411;
+ return "411"u8;
case (int)HttpStatusCode.PreconditionFailed:
- return BytesStatus412;
+ return "412"u8;
case (int)HttpStatusCode.RequestEntityTooLarge:
- return BytesStatus413;
+ return "413"u8;
case (int)HttpStatusCode.RequestUriTooLong:
- return BytesStatus414;
+ return "414"u8;
case (int)HttpStatusCode.UnsupportedMediaType:
- return BytesStatus415;
+ return "415"u8;
case (int)HttpStatusCode.RequestedRangeNotSatisfiable:
- return BytesStatus416;
+ return "416"u8;
case (int)HttpStatusCode.ExpectationFailed:
- return BytesStatus417;
+ return "417"u8;
case (int)418:
- return BytesStatus418;
+ return "418"u8;
case (int)419:
- return BytesStatus419;
+ return "419"u8;
case (int)HttpStatusCode.MisdirectedRequest:
- return BytesStatus421;
+ return "421"u8;
case (int)HttpStatusCode.UnprocessableEntity:
- return BytesStatus422;
+ return "422"u8;
case (int)HttpStatusCode.Locked:
- return BytesStatus423;
+ return "423"u8;
case (int)HttpStatusCode.FailedDependency:
- return BytesStatus424;
+ return "424"u8;
case (int)HttpStatusCode.UpgradeRequired:
- return BytesStatus426;
+ return "426"u8;
case (int)HttpStatusCode.PreconditionRequired:
- return BytesStatus428;
+ return "428"u8;
case (int)HttpStatusCode.TooManyRequests:
- return BytesStatus429;
+ return "429"u8;
case (int)HttpStatusCode.RequestHeaderFieldsTooLarge:
- return BytesStatus431;
+ return "431"u8;
case (int)HttpStatusCode.UnavailableForLegalReasons:
- return BytesStatus451;
+ return "451"u8;
case (int)HttpStatusCode.InternalServerError:
- return BytesStatus500;
+ return "500"u8;
case (int)HttpStatusCode.NotImplemented:
- return BytesStatus501;
+ return "501"u8;
case (int)HttpStatusCode.BadGateway:
- return BytesStatus502;
+ return "502"u8;
case (int)HttpStatusCode.ServiceUnavailable:
- return BytesStatus503;
+ return "503"u8;
case (int)HttpStatusCode.GatewayTimeout:
- return BytesStatus504;
+ return "504"u8;
case (int)HttpStatusCode.HttpVersionNotSupported:
- return BytesStatus505;
+ return "505"u8;
case (int)HttpStatusCode.VariantAlsoNegotiates:
- return BytesStatus506;
+ return "506"u8;
case (int)HttpStatusCode.InsufficientStorage:
- return BytesStatus507;
+ return "507"u8;
case (int)HttpStatusCode.LoopDetected:
- return BytesStatus508;
+ return "508"u8;
case (int)HttpStatusCode.NotExtended:
- return BytesStatus510;
+ return "510"u8;
case (int)HttpStatusCode.NetworkAuthenticationRequired:
- return BytesStatus511;
+ return "511"u8;
default:
return Encoding.ASCII.GetBytes(statusCode.ToString(CultureInfo.InvariantCulture));
diff --git a/src/Shared/runtime/Http3/Helpers/VariableLengthIntegerHelper.cs b/src/Shared/runtime/Http3/Helpers/VariableLengthIntegerHelper.cs
index 6b6bb0ecd9..3a343a62a4 100644
--- a/src/Shared/runtime/Http3/Helpers/VariableLengthIntegerHelper.cs
+++ b/src/Shared/runtime/Http3/Helpers/VariableLengthIntegerHelper.cs
@@ -115,7 +115,7 @@ namespace System.Net.Http
if (reader.TryCopyTo(temp))
{
bool result = TryRead(temp, out value, out int bytesRead);
- Debug.Assert(result == true);
+ Debug.Assert(result);
Debug.Assert(bytesRead == length);
reader.Advance(bytesRead);
@@ -190,7 +190,7 @@ namespace System.Net.Http
public static int WriteInteger(Span<byte> buffer, long longToEncode)
{
bool res = TryWrite(buffer, longToEncode, out int bytesWritten);
- Debug.Assert(res == true);
+ Debug.Assert(res);
return bytesWritten;
}
diff --git a/src/Shared/runtime/Http3/Http3SettingType.cs b/src/Shared/runtime/Http3/Http3SettingType.cs
index 40958e3e0f..4919e8979c 100644
--- a/src/Shared/runtime/Http3/Http3SettingType.cs
+++ b/src/Shared/runtime/Http3/Http3SettingType.cs
@@ -33,6 +33,19 @@ namespace System.Net.Http
/// The maximum number of request streams that can be blocked waiting for QPack instructions. The default is 0.
/// https://tools.ietf.org/html/draft-ietf-quic-qpack-11#section-5
/// </summary>
- QPackBlockedStreams = 0x7
+ QPackBlockedStreams = 0x7,
+
+ /// <summary>
+ /// SETTINGS_ENABLE_WEBTRANSPORT, default is 0 (off)
+ /// https://www.ietf.org/archive/id/draft-ietf-webtrans-http3-01.html#name-http-3-settings-parameter-r
+ /// </summary>
+ EnableWebTransport = 0x2b603742,
+
+ /// <summary>
+ /// H3_DATAGRAM, default is 0 (off)
+ /// indicates that the server suppprts sending individual datagrams over Http/3
+ /// rather than just streams.
+ /// </summary>
+ H3Datagram = 0xffd277
}
}
diff --git a/src/Shared/runtime/Http3/Http3StreamType.cs b/src/Shared/runtime/Http3/Http3StreamType.cs
index b386125463..af711edd2e 100644
--- a/src/Shared/runtime/Http3/Http3StreamType.cs
+++ b/src/Shared/runtime/Http3/Http3StreamType.cs
@@ -26,6 +26,14 @@ namespace System.Net.Http
/// <summary>
/// https://tools.ietf.org/html/draft-ietf-quic-qpack-11#section-4.2
/// </summary>
- QPackDecoder = 0x03
+ QPackDecoder = 0x03,
+ /// <summary>
+ /// https://ietf-wg-webtrans.github.io/draft-ietf-webtrans-http3/draft-ietf-webtrans-http3.html#name-unidirectional-streams
+ /// </summary>
+ WebTransportUnidirectional = 0x54,
+ /// <summary>
+ /// https://ietf-wg-webtrans.github.io/draft-ietf-webtrans-http3/draft-ietf-webtrans-http3.html#name-bidirectional-streams
+ /// </summary>
+ WebTransportBidirectional = 0x41
}
}
diff --git a/src/Shared/runtime/Http3/QPack/H3StaticTable.Http3.cs b/src/Shared/runtime/Http3/QPack/H3StaticTable.Http3.cs
index e254c3a1ef..aa157ab41b 100644
--- a/src/Shared/runtime/Http3/QPack/H3StaticTable.Http3.cs
+++ b/src/Shared/runtime/Http3/QPack/H3StaticTable.Http3.cs
@@ -146,7 +146,7 @@ namespace System.Net.Http.QPack
CreateHeaderField("purpose", "prefetch"), // 91
CreateHeaderField("server", ""), // 92
CreateHeaderField("timing-allow-origin", "*"), // 93
- CreateHeaderField("upgrading-insecure-requests", "1"), // 94
+ CreateHeaderField("upgrade-insecure-requests", "1"), // 94
CreateHeaderField("user-agent", ""), // 95
CreateHeaderField("x-forwarded-for", ""), // 96
CreateHeaderField("x-frame-options", "deny"), // 97
diff --git a/src/Shared/runtime/Http3/QPack/QPackDecoder.cs b/src/Shared/runtime/Http3/QPack/QPackDecoder.cs
index 9e3d8fe8a2..394cc1aee7 100644
--- a/src/Shared/runtime/Http3/QPack/QPackDecoder.cs
+++ b/src/Shared/runtime/Http3/QPack/QPackDecoder.cs
@@ -239,7 +239,7 @@ namespace System.Net.Http.QPack
while (currentIndex < data.Length);
// If a header range was set, but the value was not in the data, then copy the range
- // to the name buffer. Must copy because because the data will be replaced and the range
+ // to the name buffer. Must copy because the data will be replaced and the range
// will no longer be valid.
if (_headerNameRange != null)
{
diff --git a/src/Shared/runtime/Http3/QPack/QPackEncoder.cs b/src/Shared/runtime/Http3/QPack/QPackEncoder.cs
index fb6e690b01..53ecff40a3 100644
--- a/src/Shared/runtime/Http3/QPack/QPackEncoder.cs
+++ b/src/Shared/runtime/Http3/QPack/QPackEncoder.cs
@@ -38,7 +38,7 @@ namespace System.Net.Http.QPack
Span<byte> buffer = stackalloc byte[IntegerEncoder.MaxInt32EncodedLength];
bool res = EncodeStaticIndexedHeaderField(index, buffer, out int bytesWritten);
- Debug.Assert(res == true);
+ Debug.Assert(res);
return buffer.Slice(0, bytesWritten).ToArray();
}
@@ -93,7 +93,7 @@ namespace System.Net.Http.QPack
temp[0] = 0b01110000;
bool res = IntegerEncoder.Encode(index, 4, temp, out int headerBytesWritten);
- Debug.Assert(res == true);
+ Debug.Assert(res);
return temp.Slice(0, headerBytesWritten).ToArray();
}
@@ -102,7 +102,7 @@ namespace System.Net.Http.QPack
{
Span<byte> temp = value.Length < 256 ? stackalloc byte[256 + IntegerEncoder.MaxInt32EncodedLength * 2] : new byte[value.Length + IntegerEncoder.MaxInt32EncodedLength * 2];
bool res = EncodeLiteralHeaderFieldWithStaticNameReference(index, value, temp, out int bytesWritten);
- Debug.Assert(res == true);
+ Debug.Assert(res);
return temp.Slice(0, bytesWritten).ToArray();
}
@@ -168,7 +168,7 @@ namespace System.Net.Http.QPack
Span<byte> temp = name.Length < 256 ? stackalloc byte[256 + IntegerEncoder.MaxInt32EncodedLength] : new byte[name.Length + IntegerEncoder.MaxInt32EncodedLength];
bool res = EncodeNameString(name, temp, out int nameLength);
- Debug.Assert(res == true);
+ Debug.Assert(res);
return temp.Slice(0, nameLength).ToArray();
}
@@ -178,7 +178,7 @@ namespace System.Net.Http.QPack
Span<byte> temp = (name.Length + value.Length) < 256 ? stackalloc byte[256 + IntegerEncoder.MaxInt32EncodedLength * 2] : new byte[name.Length + value.Length + IntegerEncoder.MaxInt32EncodedLength * 2];
bool res = EncodeLiteralHeaderFieldWithoutNameReference(name, value, temp, out int bytesWritten);
- Debug.Assert(res == true);
+ Debug.Assert(res);
return temp.Slice(0, bytesWritten).ToArray();
}
diff --git a/src/Shared/runtime/NetEventSource.Common.cs b/src/Shared/runtime/NetEventSource.Common.cs
deleted file mode 100644
index ff93dca9c5..0000000000
--- a/src/Shared/runtime/NetEventSource.Common.cs
+++ /dev/null
@@ -1,683 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-#if DEBUG
-// Uncomment to enable runtime checks to help validate that NetEventSource isn't being misused
-// in a way that will cause performance problems, e.g. unexpected boxing of value types.
-//#define DEBUG_NETEVENTSOURCE_MISUSE
-#endif
-
-#nullable enable
-using System.Collections;
-using System.Diagnostics;
-using System.Diagnostics.CodeAnalysis;
-using System.Diagnostics.Tracing;
-using System.Globalization;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-#pragma warning disable CA1823 // not all IDs are used by all partial providers
-
-namespace System.Net
-{
- // Implementation:
- // This partial file is meant to be consumed into each System.Net.* assembly that needs to log. Each such assembly also provides
- // its own NetEventSource partial class that adds an appropriate [EventSource] attribute, giving it a unique name for that assembly.
- // Those partials can then also add additional events if needed, starting numbering from the NextAvailableEventId defined by this partial.
-
- // Usage:
- // - Operations that may allocate (e.g. boxing a value type, using string interpolation, etc.) or that may have computations
- // at call sites should guard access like:
- // if (NetEventSource.Log.IsEnabled()) NetEventSource.Info(null, $"Found certificate: {cert}"); // info logging with a formattable string
- // - Operations that have zero allocations / measurable computations at call sites can use a simpler pattern, calling methods like:
- // NetEventSource.Info(this, "literal string"); // arbitrary message with a literal string
- // Debug.Asserts inside the logging methods will help to flag some misuse if the DEBUG_NETEVENTSOURCE_MISUSE compilation constant is defined.
- // However, because it can be difficult by observation to understand all of the costs involved, guarding can be done everywhere.
- // - Messages can be strings, formattable strings, or any other object. Objects (including those used in formattable strings) have special
- // formatting applied, controlled by the Format method. Partial specializations can also override this formatting by implementing a partial
- // method that takes an object and optionally provides a string representation of it, in case a particular library wants to customize further.
-
- /// <summary>Provides logging facilities for System.Net libraries.</summary>
- internal sealed partial class NetEventSource : EventSource
- {
- /// <summary>The single event source instance to use for all logging.</summary>
- public static readonly NetEventSource Log = new NetEventSource();
-
- #region Metadata
- public class Keywords
- {
- public const EventKeywords Default = (EventKeywords)0x0001;
- public const EventKeywords Debug = (EventKeywords)0x0002;
- public const EventKeywords EnterExit = (EventKeywords)0x0004;
- }
-
- private const string MissingMember = "(?)";
- private const string NullInstance = "(null)";
- private const string StaticMethodObject = "(static)";
- private const string NoParameters = "";
- private const int MaxDumpSize = 1024;
-
- private const int EnterEventId = 1;
- private const int ExitEventId = 2;
- private const int AssociateEventId = 3;
- private const int InfoEventId = 4;
- private const int ErrorEventId = 5;
- private const int DumpArrayEventId = 7;
-
- // These events are implemented in NetEventSource.Security.cs.
- // Define the ids here so that projects that include NetEventSource.Security.cs will not have conflicts.
- private const int EnumerateSecurityPackagesId = 8;
- private const int SspiPackageNotFoundId = 9;
- private const int AcquireDefaultCredentialId = 10;
- private const int AcquireCredentialsHandleId = 11;
- private const int InitializeSecurityContextId = 12;
- private const int SecurityContextInputBufferId = 13;
- private const int SecurityContextInputBuffersId = 14;
- private const int AcceptSecuritContextId = 15;
- private const int OperationReturnedSomethingId = 16;
-
- private const int NextAvailableEventId = 17; // Update this value whenever new events are added. Derived types should base all events off of this to avoid conflicts.
- #endregion
-
- #region Events
- #region Enter
- /// <summary>Logs entrance to a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="formattableString">A description of the entrance, including any arguments to the call.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Enter(object? thisOrContextObject, FormattableString? formattableString = null, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(formattableString);
- if (Log.IsEnabled()) Log.Enter(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters);
- }
-
- /// <summary>Logs entrance to a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="arg0">The object to log.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Enter(object? thisOrContextObject, object arg0, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(arg0);
- if (Log.IsEnabled()) Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)})");
- }
-
- /// <summary>Logs entrance to a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="arg0">The first object to log.</param>
- /// <param name="arg1">The second object to log.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Enter(object? thisOrContextObject, object arg0, object arg1, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(arg0);
- DebugValidateArg(arg1);
- if (Log.IsEnabled()) Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)})");
- }
-
- /// <summary>Logs entrance to a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="arg0">The first object to log.</param>
- /// <param name="arg1">The second object to log.</param>
- /// <param name="arg2">The third object to log.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Enter(object? thisOrContextObject, object arg0, object arg1, object arg2, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(arg0);
- DebugValidateArg(arg1);
- DebugValidateArg(arg2);
- if (Log.IsEnabled()) Log.Enter(IdOf(thisOrContextObject), memberName, $"({Format(arg0)}, {Format(arg1)}, {Format(arg2)})");
- }
-
- [Event(EnterEventId, Level = EventLevel.Informational, Keywords = Keywords.EnterExit)]
- private void Enter(string thisOrContextObject, string? memberName, string parameters) =>
- WriteEvent(EnterEventId, thisOrContextObject, memberName ?? MissingMember, parameters);
- #endregion
-
- #region Exit
- /// <summary>Logs exit from a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="formattableString">A description of the exit operation, including any return values.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Exit(object? thisOrContextObject, FormattableString? formattableString = null, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(formattableString);
- if (Log.IsEnabled()) Log.Exit(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters);
- }
-
- /// <summary>Logs exit from a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="arg0">A return value from the member.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Exit(object? thisOrContextObject, object arg0, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(arg0);
- if (Log.IsEnabled()) Log.Exit(IdOf(thisOrContextObject), memberName, Format(arg0).ToString());
- }
-
- /// <summary>Logs exit from a method.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="arg0">A return value from the member.</param>
- /// <param name="arg1">A second return value from the member.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Exit(object? thisOrContextObject, object arg0, object arg1, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(arg0);
- DebugValidateArg(arg1);
- if (Log.IsEnabled()) Log.Exit(IdOf(thisOrContextObject), memberName, $"{Format(arg0)}, {Format(arg1)}");
- }
-
- [Event(ExitEventId, Level = EventLevel.Informational, Keywords = Keywords.EnterExit)]
- private void Exit(string thisOrContextObject, string? memberName, string? result) =>
- WriteEvent(ExitEventId, thisOrContextObject, memberName ?? MissingMember, result);
- #endregion
-
- #region Info
- /// <summary>Logs an information message.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="formattableString">The message to be logged.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Info(object? thisOrContextObject, FormattableString? formattableString = null, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(formattableString);
- if (Log.IsEnabled()) Log.Info(IdOf(thisOrContextObject), memberName, formattableString != null ? Format(formattableString) : NoParameters);
- }
-
- /// <summary>Logs an information message.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="message">The message to be logged.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Info(object? thisOrContextObject, object? message, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(message);
- if (Log.IsEnabled()) Log.Info(IdOf(thisOrContextObject), memberName, Format(message).ToString());
- }
-
- [Event(InfoEventId, Level = EventLevel.Informational, Keywords = Keywords.Default)]
- private void Info(string thisOrContextObject, string? memberName, string? message) =>
- WriteEvent(InfoEventId, thisOrContextObject, memberName ?? MissingMember, message);
- #endregion
-
- #region Error
- /// <summary>Logs an error message.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="formattableString">The message to be logged.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Error(object? thisOrContextObject, FormattableString formattableString, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(formattableString);
- if (Log.IsEnabled()) Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(formattableString));
- }
-
- /// <summary>Logs an error message.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="message">The message to be logged.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Error(object? thisOrContextObject, object message, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(message);
- if (Log.IsEnabled()) Log.ErrorMessage(IdOf(thisOrContextObject), memberName, Format(message).ToString());
- }
-
- [Event(ErrorEventId, Level = EventLevel.Error, Keywords = Keywords.Default)]
- private void ErrorMessage(string thisOrContextObject, string? memberName, string? message) =>
- WriteEvent(ErrorEventId, thisOrContextObject, memberName ?? MissingMember, message);
- #endregion
-
- #region DumpBuffer
- /// <summary>Logs the contents of a buffer.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="buffer">The buffer to be logged.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void DumpBuffer(object? thisOrContextObject, byte[] buffer, [CallerMemberName] string? memberName = null)
- {
- DumpBuffer(thisOrContextObject, buffer, 0, buffer.Length, memberName);
- }
-
- /// <summary>Logs the contents of a buffer.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="buffer">The buffer to be logged.</param>
- /// <param name="offset">The starting offset from which to log.</param>
- /// <param name="count">The number of bytes to log.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void DumpBuffer(object? thisOrContextObject, byte[] buffer, int offset, int count, [CallerMemberName] string? memberName = null)
- {
- if (Log.IsEnabled() && offset >= 0 && offset <= buffer.Length - count)
- {
- count = Math.Min(count, MaxDumpSize);
-
- byte[] slice = buffer;
- if (offset != 0 || count != buffer.Length)
- {
- slice = new byte[count];
- Buffer.BlockCopy(buffer, offset, slice, 0, count);
- }
-
- Log.DumpBuffer(IdOf(thisOrContextObject), memberName, slice);
- }
- }
-
- /// <summary>Logs the contents of a buffer.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="bufferPtr">The starting location of the buffer to be logged.</param>
- /// <param name="count">The number of bytes to log.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static unsafe void DumpBuffer(object? thisOrContextObject, IntPtr bufferPtr, int count, [CallerMemberName] string? memberName = null)
- {
- Debug.Assert(bufferPtr != IntPtr.Zero);
- Debug.Assert(count >= 0);
-
- if (Log.IsEnabled())
- {
- var buffer = new byte[Math.Min(count, MaxDumpSize)];
- fixed (byte* targetPtr = buffer)
- {
- Buffer.MemoryCopy((byte*)bufferPtr, targetPtr, buffer.Length, buffer.Length);
- }
- Log.DumpBuffer(IdOf(thisOrContextObject), memberName, buffer);
- }
- }
-
- [Event(DumpArrayEventId, Level = EventLevel.Verbose, Keywords = Keywords.Debug)]
- private void DumpBuffer(string thisOrContextObject, string? memberName, byte[] buffer) =>
- WriteEvent(DumpArrayEventId, thisOrContextObject, memberName ?? MissingMember, buffer);
- #endregion
-
- #region Associate
- /// <summary>Logs a relationship between two objects.</summary>
- /// <param name="first">The first object.</param>
- /// <param name="second">The second object.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Associate(object first, object second, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(first);
- DebugValidateArg(second);
- if (Log.IsEnabled()) Log.Associate(IdOf(first), memberName, IdOf(first), IdOf(second));
- }
-
- /// <summary>Logs a relationship between two objects.</summary>
- /// <param name="thisOrContextObject">`this`, or another object that serves to provide context for the operation.</param>
- /// <param name="first">The first object.</param>
- /// <param name="second">The second object.</param>
- /// <param name="memberName">The calling member.</param>
- [NonEvent]
- public static void Associate(object? thisOrContextObject, object first, object second, [CallerMemberName] string? memberName = null)
- {
- DebugValidateArg(thisOrContextObject);
- DebugValidateArg(first);
- DebugValidateArg(second);
- if (Log.IsEnabled()) Log.Associate(IdOf(thisOrContextObject), memberName, IdOf(first), IdOf(second));
- }
-
- [Event(AssociateEventId, Level = EventLevel.Informational, Keywords = Keywords.Default, Message = "[{2}]<-->[{3}]")]
- private void Associate(string thisOrContextObject, string? memberName, string first, string second) =>
- WriteEvent(AssociateEventId, thisOrContextObject, memberName ?? MissingMember, first, second);
- #endregion
- #endregion
-
- #region Helpers
- [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")]
- private static void DebugValidateArg(object? arg)
- {
- if (!Log.IsEnabled())
- {
- Debug.Assert(!(arg is ValueType), $"Should not be passing value type {arg?.GetType()} to logging without IsEnabled check");
- Debug.Assert(!(arg is FormattableString), $"Should not be formatting FormattableString \"{arg}\" if tracing isn't enabled");
- }
- }
-
- [Conditional("DEBUG_NETEVENTSOURCE_MISUSE")]
- private static void DebugValidateArg(FormattableString? arg)
- {
- Debug.Assert(Log.IsEnabled() || arg == null, $"Should not be formatting FormattableString \"{arg}\" if tracing isn't enabled");
- }
-
- [NonEvent]
- public static string IdOf(object? value) => value != null ? value.GetType().Name + "#" + GetHashCode(value) : NullInstance;
-
- [NonEvent]
- public static int GetHashCode(object value) => value?.GetHashCode() ?? 0;
-
- [NonEvent]
- public static object Format(object? value)
- {
- // If it's null, return a known string for null values
- if (value == null)
- {
- return NullInstance;
- }
-
- // Give another partial implementation a chance to provide its own string representation
- string? result = null;
- AdditionalCustomizedToString(value, ref result);
- if (result != null)
- {
- return result;
- }
-
- // Format arrays with their element type name and length
- if (value is Array arr)
- {
- return $"{arr.GetType().GetElementType()}[{((Array)value).Length}]";
- }
-
- // Format ICollections as the name and count
- if (value is ICollection c)
- {
- return $"{c.GetType().Name}({c.Count})";
- }
-
- // Format SafeHandles as their type, hash code, and pointer value
- if (value is SafeHandle handle)
- {
- return $"{handle.GetType().Name}:{handle.GetHashCode()}(0x{handle.DangerousGetHandle():X})";
- }
-
- // Format IntPtrs as hex
- if (value is IntPtr)
- {
- return $"0x{value:X}";
- }
-
- // If the string representation of the instance would just be its type name,
- // use its id instead.
- string? toString = value.ToString();
- if (toString == null || toString == value.GetType().FullName)
- {
- return IdOf(value);
- }
-
- // Otherwise, return the original object so that the caller does default formatting.
- return value;
- }
-
- [NonEvent]
- private static string Format(FormattableString s)
- {
- switch (s.ArgumentCount)
- {
- case 0: return s.Format;
- case 1: return string.Format(CultureInfo.CurrentCulture, s.Format, Format(s.GetArgument(0)));
- case 2: return string.Format(CultureInfo.CurrentCulture, s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)));
- case 3: return string.Format(CultureInfo.CurrentCulture, s.Format, Format(s.GetArgument(0)), Format(s.GetArgument(1)), Format(s.GetArgument(2)));
- default:
- object?[] args = s.GetArguments();
- object[] formattedArgs = new object[args.Length];
- for (int i = 0; i < args.Length; i++)
- {
- formattedArgs[i] = Format(args[i]);
- }
- return string.Format(CultureInfo.CurrentCulture, s.Format, formattedArgs);
- }
- }
-
- static partial void AdditionalCustomizedToString<T>(T value, ref string? result);
- #endregion
-
- #region Custom WriteEvent overloads
-
- [NonEvent]
- [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Parameters passed to WriteEvent are all primative values.")]
- private unsafe void WriteEvent(int eventId, string? arg1, string? arg2, string? arg3, string? arg4)
- {
- if (IsEnabled())
- {
- if (arg1 == null) arg1 = "";
- if (arg2 == null) arg2 = "";
- if (arg3 == null) arg3 = "";
- if (arg4 == null) arg4 = "";
-
- fixed (char* string1Bytes = arg1)
- fixed (char* string2Bytes = arg2)
- fixed (char* string3Bytes = arg3)
- fixed (char* string4Bytes = arg4)
- {
- const int NumEventDatas = 4;
- var descrs = stackalloc EventData[NumEventDatas];
-
- descrs[0] = new EventData
- {
- DataPointer = (IntPtr)string1Bytes,
- Size = ((arg1.Length + 1) * 2)
- };
- descrs[1] = new EventData
- {
- DataPointer = (IntPtr)string2Bytes,
- Size = ((arg2.Length + 1) * 2)
- };
- descrs[2] = new EventData
- {
- DataPointer = (IntPtr)string3Bytes,
- Size = ((arg3.Length + 1) * 2)
- };
- descrs[3] = new EventData
- {
- DataPointer = (IntPtr)string4Bytes,
- Size = ((arg4.Length + 1) * 2)
- };
-
- WriteEventCore(eventId, NumEventDatas, descrs);
- }
- }
- }
-
- [NonEvent]
- [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Parameters passed to WriteEvent are all primative values.")]
- private unsafe void WriteEvent(int eventId, string? arg1, string? arg2, byte[]? arg3)
- {
- if (IsEnabled())
- {
- if (arg1 == null) arg1 = "";
- if (arg2 == null) arg2 = "";
- if (arg3 == null) arg3 = Array.Empty<byte>();
-
- fixed (char* arg1Ptr = arg1)
- fixed (char* arg2Ptr = arg2)
- fixed (byte* arg3Ptr = arg3)
- {
- int bufferLength = arg3.Length;
- const int NumEventDatas = 4;
- var descrs = stackalloc EventData[NumEventDatas];
-
- descrs[0] = new EventData
- {
- DataPointer = (IntPtr)arg1Ptr,
- Size = (arg1.Length + 1) * sizeof(char)
- };
- descrs[1] = new EventData
- {
- DataPointer = (IntPtr)arg2Ptr,
- Size = (arg2.Length + 1) * sizeof(char)
- };
- descrs[2] = new EventData
- {
- DataPointer = (IntPtr)(&bufferLength),
- Size = 4
- };
- descrs[3] = new EventData
- {
- DataPointer = (IntPtr)arg3Ptr,
- Size = bufferLength
- };
-
- WriteEventCore(eventId, NumEventDatas, descrs);
- }
- }
- }
-
- [NonEvent]
- private unsafe void WriteEvent(int eventId, string? arg1, int arg2, int arg3, int arg4)
- {
- if (IsEnabled())
- {
- if (arg1 == null) arg1 = "";
-
- fixed (char* arg1Ptr = arg1)
- {
- const int NumEventDatas = 4;
- var descrs = stackalloc EventData[NumEventDatas];
-
- descrs[0] = new EventData
- {
- DataPointer = (IntPtr)(arg1Ptr),
- Size = (arg1.Length + 1) * sizeof(char)
- };
- descrs[1] = new EventData
- {
- DataPointer = (IntPtr)(&arg2),
- Size = sizeof(int)
- };
- descrs[2] = new EventData
- {
- DataPointer = (IntPtr)(&arg3),
- Size = sizeof(int)
- };
- descrs[3] = new EventData
- {
- DataPointer = (IntPtr)(&arg4),
- Size = sizeof(int)
- };
-
- WriteEventCore(eventId, NumEventDatas, descrs);
- }
- }
- }
-
- [NonEvent]
- private unsafe void WriteEvent(int eventId, string? arg1, int arg2, string? arg3)
- {
- if (IsEnabled())
- {
- if (arg1 == null) arg1 = "";
- if (arg3 == null) arg3 = "";
-
- fixed (char* arg1Ptr = arg1)
- fixed (char* arg3Ptr = arg3)
- {
- const int NumEventDatas = 3;
- var descrs = stackalloc EventData[NumEventDatas];
-
- descrs[0] = new EventData
- {
- DataPointer = (IntPtr)(arg1Ptr),
- Size = (arg1.Length + 1) * sizeof(char)
- };
- descrs[1] = new EventData
- {
- DataPointer = (IntPtr)(&arg2),
- Size = sizeof(int)
- };
- descrs[2] = new EventData
- {
- DataPointer = (IntPtr)(arg3Ptr),
- Size = (arg3.Length + 1) * sizeof(char)
- };
-
- WriteEventCore(eventId, NumEventDatas, descrs);
- }
- }
- }
-
- [NonEvent]
- private unsafe void WriteEvent(int eventId, string? arg1, string? arg2, int arg3)
- {
- if (IsEnabled())
- {
- if (arg1 == null) arg1 = "";
- if (arg2 == null) arg2 = "";
-
- fixed (char* arg1Ptr = arg1)
- fixed (char* arg2Ptr = arg2)
- {
- const int NumEventDatas = 3;
- var descrs = stackalloc EventData[NumEventDatas];
-
- descrs[0] = new EventData
- {
- DataPointer = (IntPtr)(arg1Ptr),
- Size = (arg1.Length + 1) * sizeof(char)
- };
- descrs[1] = new EventData
- {
- DataPointer = (IntPtr)(arg2Ptr),
- Size = (arg2.Length + 1) * sizeof(char)
- };
- descrs[2] = new EventData
- {
- DataPointer = (IntPtr)(&arg3),
- Size = sizeof(int)
- };
-
- WriteEventCore(eventId, NumEventDatas, descrs);
- }
- }
- }
-
- [NonEvent]
- private unsafe void WriteEvent(int eventId, string? arg1, string? arg2, string? arg3, int arg4)
- {
- if (IsEnabled())
- {
- if (arg1 == null) arg1 = "";
- if (arg2 == null) arg2 = "";
- if (arg3 == null) arg3 = "";
-
- fixed (char* arg1Ptr = arg1)
- fixed (char* arg2Ptr = arg2)
- fixed (char* arg3Ptr = arg3)
- {
- const int NumEventDatas = 4;
- var descrs = stackalloc EventData[NumEventDatas];
-
- descrs[0] = new EventData
- {
- DataPointer = (IntPtr)(arg1Ptr),
- Size = (arg1.Length + 1) * sizeof(char)
- };
- descrs[1] = new EventData
- {
- DataPointer = (IntPtr)(arg2Ptr),
- Size = (arg2.Length + 1) * sizeof(char)
- };
- descrs[2] = new EventData
- {
- DataPointer = (IntPtr)(arg3Ptr),
- Size = (arg3.Length + 1) * sizeof(char)
- };
- descrs[3] = new EventData
- {
- DataPointer = (IntPtr)(&arg4),
- Size = sizeof(int)
- };
-
- WriteEventCore(eventId, NumEventDatas, descrs);
- }
- }
- }
- #endregion
- }
-}
diff --git a/src/Shared/test/Certificates/Certificates.cs b/src/Shared/test/Certificates/Certificates.cs
index 8124e9cdf0..d0c2a0c043 100644
--- a/src/Shared/test/Certificates/Certificates.cs
+++ b/src/Shared/test/Certificates/Certificates.cs
@@ -4,6 +4,8 @@
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
+namespace Microsoft.AspNetCore.Authentication.Certificate;
+
public static class Certificates
{
private static string ServerEku = "1.3.6.1.5.5.7.3.1";
diff --git a/src/SignalR/SignalR.slnf b/src/SignalR/SignalR.slnf
index e551d9f5ac..86f388f70c 100644
--- a/src/SignalR/SignalR.slnf
+++ b/src/SignalR/SignalR.slnf
@@ -39,6 +39,7 @@
"src\\Servers\\IIS\\IISIntegration\\src\\Microsoft.AspNetCore.Server.IISIntegration.csproj",
"src\\Servers\\Kestrel\\Core\\src\\Microsoft.AspNetCore.Server.Kestrel.Core.csproj",
"src\\Servers\\Kestrel\\Kestrel\\src\\Microsoft.AspNetCore.Server.Kestrel.csproj",
+ "src\\Servers\\Kestrel\\Transport.Quic\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Quic.csproj",
"src\\Servers\\Kestrel\\Transport.Sockets\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj",
"src\\SignalR\\clients\\csharp\\Client.Core\\src\\Microsoft.AspNetCore.SignalR.Client.Core.csproj",
"src\\SignalR\\clients\\csharp\\Client.SourceGenerator\\src\\Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj",
diff --git a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs
index 8f78b518a4..5479ceebe7 100644
--- a/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs
+++ b/src/SignalR/clients/csharp/Client.Core/src/HubConnection.cs
@@ -1646,7 +1646,7 @@ public partial class HubConnection : IAsyncDisposable
}
}
- private class Subscription : IDisposable
+ private sealed class Subscription : IDisposable
{
private readonly InvocationHandler _handler;
private readonly InvocationHandlerList _handlerList;
@@ -1663,7 +1663,7 @@ public partial class HubConnection : IAsyncDisposable
}
}
- private class InvocationHandlerList
+ private sealed class InvocationHandlerList
{
private readonly List<InvocationHandler> _invocationHandlers;
// A lazy cached copy of the handlers that doesn't change for thread safety.
@@ -1744,7 +1744,7 @@ public partial class HubConnection : IAsyncDisposable
}
}
- private class ConnectionState : IInvocationBinder
+ private sealed class ConnectionState : IInvocationBinder
{
private readonly HubConnection _hubConnection;
private readonly ILogger _logger;
@@ -2000,7 +2000,7 @@ public partial class HubConnection : IAsyncDisposable
}
}
- private class ReconnectingConnectionState
+ private sealed class ReconnectingConnectionState
{
// This lock protects the connection state.
private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(1, 1);
diff --git a/src/SignalR/clients/csharp/Client.Core/src/Internal/ConnectionLogScope.cs b/src/SignalR/clients/csharp/Client.Core/src/Internal/ConnectionLogScope.cs
index bf739515eb..da1352f8b3 100644
--- a/src/SignalR/clients/csharp/Client.Core/src/Internal/ConnectionLogScope.cs
+++ b/src/SignalR/clients/csharp/Client.Core/src/Internal/ConnectionLogScope.cs
@@ -8,7 +8,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.SignalR.Client.Internal;
-internal class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object?>>
+internal sealed class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object?>>
{
// Name chosen so as not to collide with Kestrel's "ConnectionId"
private const string ClientConnectionIdKey = "ClientConnectionId";
diff --git a/src/SignalR/clients/csharp/Client.Core/src/Internal/DefaultRetryPolicy.cs b/src/SignalR/clients/csharp/Client.Core/src/Internal/DefaultRetryPolicy.cs
index 52b66509a6..13cd6e664b 100644
--- a/src/SignalR/clients/csharp/Client.Core/src/Internal/DefaultRetryPolicy.cs
+++ b/src/SignalR/clients/csharp/Client.Core/src/Internal/DefaultRetryPolicy.cs
@@ -5,7 +5,7 @@ using System;
namespace Microsoft.AspNetCore.SignalR.Client.Internal;
-internal class DefaultRetryPolicy : IRetryPolicy
+internal sealed class DefaultRetryPolicy : IRetryPolicy
{
internal static TimeSpan?[] DEFAULT_RETRY_DELAYS_IN_MILLISECONDS = new TimeSpan?[]
{
diff --git a/src/SignalR/clients/csharp/Client.Core/src/Internal/InvocationRequest.cs b/src/SignalR/clients/csharp/Client.Core/src/Internal/InvocationRequest.cs
index f8d2cf658f..13a5e27f58 100644
--- a/src/SignalR/clients/csharp/Client.Core/src/Internal/InvocationRequest.cs
+++ b/src/SignalR/clients/csharp/Client.Core/src/Internal/InvocationRequest.cs
@@ -65,7 +65,7 @@ internal abstract partial class InvocationRequest : IDisposable
_cancellationTokenRegistration.Dispose();
}
- private class Streaming : InvocationRequest
+ private sealed class Streaming : InvocationRequest
{
private readonly Channel<object?> _channel = Channel.CreateUnbounded<object?>();
@@ -125,7 +125,7 @@ internal abstract partial class InvocationRequest : IDisposable
}
}
- private class NonStreaming : InvocationRequest
+ private sealed class NonStreaming : InvocationRequest
{
private readonly TaskCompletionSource<object?> _completionSource = new TaskCompletionSource<object?>(TaskCreationOptions.RunContinuationsAsynchronously);
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/GeneratorHelpers.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/GeneratorHelpers.cs
index 0417a19622..62e1c0ba7c 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/GeneratorHelpers.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/GeneratorHelpers.cs
@@ -25,4 +25,13 @@ internal static class GeneratorHelpers
return null;
}
}
+
+ public static string SourceFilePrefix()
+ {
+ return @"// <auto-generated>
+// Generated by Microsoft.AspNetCore.Client.SourceGenerator
+// </auto-generated>
+#nullable enable
+";
+ }
}
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Emitter.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Emitter.cs
index 3822dab43b..306cb9d677 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Emitter.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Emitter.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
internal partial class HubClientProxyGenerator
{
- public class Emitter
+ public sealed class Emitter
{
private readonly SourceProductionContext _context;
private readonly SourceGenerationSpec _spec;
@@ -53,7 +53,7 @@ internal partial class HubClientProxyGenerator
registerProviderBody.AppendLine($@"
if (typeof({_spec.SetterTypeParameterName}) == typeof({fqtn}))
{{
- return (System.IDisposable) new CallbackProviderRegistration({methodName}({_spec.SetterHubConnectionParameterName}, ({fqtn}) provider));
+ return (System.IDisposable) new CallbackProviderRegistration({methodName}({_spec.SetterHubConnectionParameterName}, ({fqtn}) {_spec.SetterProviderParameterName}));
}}");
}
@@ -61,12 +61,7 @@ internal partial class HubClientProxyGenerator
// RegisterCallbackProvider<T> is used by end-user to register their callback provider types
// CallbackProviderRegistration is a private implementation of IDisposable which simply holds
// an array of IDisposables acquired from registration of each callback method from HubConnection
- var extensions = $@"// <auto-generated>
-// Generated by Microsoft.AspNetCore.Client.SourceGenerator
-// </auto-generated>
-
-#nullable enable
-
+ var extensions = GeneratorHelpers.SourceFilePrefix() + $@"
using Microsoft.AspNetCore.SignalR.Client;
namespace {_spec.SetterNamespace}
@@ -133,12 +128,7 @@ namespace {_spec.SetterNamespace}
// The actual registration method goes thru each method that the callback provider type has and then
// registers the method with HubConnection and stashes the returned IDisposable into an array for
// later consumption by CallbackProviderRegistration's constructor
- var registrationMethodBody = new StringBuilder($@"// <auto-generated>
-// Generated by Microsoft.AspNetCore.Client.SourceGenerator
-// </auto-generated>
-
-#nullable enable
-
+ var registrationMethodBody = new StringBuilder(GeneratorHelpers.SourceFilePrefix() + $@"
using Microsoft.AspNetCore.SignalR.Client;
namespace {_spec.SetterNamespace}
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs
index 2828e89794..1dd1655dd8 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.Parser.cs
@@ -11,9 +11,9 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
-internal partial class HubClientProxyGenerator
+internal sealed partial class HubClientProxyGenerator
{
- public class Parser
+ public sealed class Parser
{
internal static bool IsSyntaxTargetForAttribute(SyntaxNode node) => node is AttributeSyntax
{
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.SourceGenerationSpec.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.SourceGenerationSpec.cs
index e9640fe586..5c3eaf50dc 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.SourceGenerationSpec.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.SourceGenerationSpec.cs
@@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
internal partial class HubClientProxyGenerator
{
- public class SourceGenerationSpec
+ public sealed class SourceGenerationSpec
{
public string? SetterNamespace;
public string? SetterClassName;
@@ -21,7 +21,7 @@ internal partial class HubClientProxyGenerator
public List<TypeSpec> Types = new();
}
- public class TypeSpec
+ public sealed class TypeSpec
{
public string TypeName;
public List<MethodSpec> Methods = new();
@@ -29,7 +29,7 @@ internal partial class HubClientProxyGenerator
public string FullyQualifiedTypeName;
}
- public class MethodSpec
+ public sealed class MethodSpec
{
public string Name;
public List<ArgumentSpec> Arguments = new();
@@ -43,7 +43,7 @@ internal partial class HubClientProxyGenerator
UnsupportedReturnType
}
- public class ArgumentSpec
+ public sealed class ArgumentSpec
{
public string Name;
public string FullyQualifiedTypeName;
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.cs
index 49797243d0..b55b64f2cc 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubClientProxyGenerator.cs
@@ -8,7 +8,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
[Generator]
-internal partial class HubClientProxyGenerator : IIncrementalGenerator
+internal sealed partial class HubClientProxyGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Emitter.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Emitter.cs
index 8c008a5a97..cdc30e6fe5 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Emitter.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Emitter.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
internal partial class HubServerProxyGenerator
{
- public class Emitter
+ public sealed class Emitter
{
private readonly SourceProductionContext _context;
private readonly SourceGenerationSpec _spec;
@@ -57,12 +57,7 @@ internal partial class HubServerProxyGenerator
}}");
}
- var getProxy = $@"// <auto-generated>
-// Generated by Microsoft.AspNetCore.Client.SourceGenerator
-// </auto-generated>
-
-#nullable enable
-
+ var getProxy = GeneratorHelpers.SourceFilePrefix() + $@"
using Microsoft.AspNetCore.SignalR.Client;
namespace {_spec.GetterNamespace}
@@ -146,12 +141,7 @@ namespace {_spec.GetterNamespace}
methods.Append(method);
}
- var proxy = $@"// <auto-generated>
-// Generated by Microsoft.AspNetCore.Client.SourceGenerator
-// </auto-generated>
-
-#nullable enable
-
+ var proxy = GeneratorHelpers.SourceFilePrefix() + $@"
using Microsoft.AspNetCore.SignalR.Client;
namespace {_spec.GetterNamespace}
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Parser.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Parser.cs
index de571f767d..4d69f053e6 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Parser.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.Parser.cs
@@ -13,7 +13,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
internal partial class HubServerProxyGenerator
{
- internal class Parser
+ internal sealed class Parser
{
internal static bool IsSyntaxTargetForAttribute(SyntaxNode node) => node is AttributeSyntax
{
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.SourceGenerationSpec.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.SourceGenerationSpec.cs
index cc65423621..ecf4b074ab 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.SourceGenerationSpec.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.SourceGenerationSpec.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
internal partial class HubServerProxyGenerator
{
- public class SourceGenerationSpec
+ public sealed class SourceGenerationSpec
{
public string? GetterNamespace;
public string? GetterClassName;
@@ -21,7 +21,7 @@ internal partial class HubServerProxyGenerator
public List<ClassSpec> Classes = new();
}
- public class ClassSpec
+ public sealed class ClassSpec
{
public string FullyQualifiedInterfaceTypeName;
public string ClassTypeName;
@@ -29,7 +29,7 @@ internal partial class HubServerProxyGenerator
public Location CallSite;
}
- public class MethodSpec
+ public sealed class MethodSpec
{
public string Name;
public string FullyQualifiedReturnTypeName;
@@ -58,7 +58,7 @@ internal partial class HubServerProxyGenerator
UnsupportedReturnType
}
- public class ArgumentSpec
+ public sealed class ArgumentSpec
{
public string Name;
public string FullyQualifiedTypeName;
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.cs b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.cs
index 16672acfe1..7e863719a6 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.cs
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/HubServerProxyGenerator.cs
@@ -8,7 +8,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax;
namespace Microsoft.AspNetCore.SignalR.Client.SourceGenerator;
[Generator]
-internal partial class HubServerProxyGenerator : IIncrementalGenerator
+internal sealed partial class HubServerProxyGenerator : IIncrementalGenerator
{
public void Initialize(IncrementalGeneratorInitializationContext context)
{
diff --git a/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj b/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj
index 8e8eedef59..049814d8bc 100644
--- a/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj
+++ b/src/SignalR/clients/csharp/Client.SourceGenerator/src/Microsoft.AspNetCore.SignalR.Client.SourceGenerator.csproj
@@ -4,7 +4,7 @@
<TargetFramework>netstandard2.0</TargetFramework>
<IncludeBuildOutput>false</IncludeBuildOutput>
<SuppressDependenciesWhenPacking>true</SuppressDependenciesWhenPacking>
- <Nullable>enable</Nullable>
+ <IsShipping>false</IsShipping>
</PropertyGroup>
<ItemGroup>
diff --git a/src/SignalR/clients/csharp/Client/src/HubConnectionBuilderHttpExtensions.cs b/src/SignalR/clients/csharp/Client/src/HubConnectionBuilderHttpExtensions.cs
index 6688995d14..cebe5375af 100644
--- a/src/SignalR/clients/csharp/Client/src/HubConnectionBuilderHttpExtensions.cs
+++ b/src/SignalR/clients/csharp/Client/src/HubConnectionBuilderHttpExtensions.cs
@@ -154,7 +154,7 @@ public static class HubConnectionBuilderHttpExtensions
return hubConnectionBuilder;
}
- private class HttpConnectionOptionsDerivedHttpEndPoint : UriEndPoint
+ private sealed class HttpConnectionOptionsDerivedHttpEndPoint : UriEndPoint
{
public HttpConnectionOptionsDerivedHttpEndPoint(IOptions<HttpConnectionOptions> httpConnectionOptions)
: base(httpConnectionOptions.Value.Url!)
@@ -162,7 +162,7 @@ public static class HubConnectionBuilderHttpExtensions
}
}
- private class HubProtocolDerivedHttpOptionsConfigurer : IConfigureNamedOptions<HttpConnectionOptions>
+ private sealed class HubProtocolDerivedHttpOptionsConfigurer : IConfigureNamedOptions<HttpConnectionOptions>
{
private readonly TransferFormat _defaultTransferFormat;
diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/HttpConnectionTests.Transport.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/HttpConnectionTests.Transport.cs
index e39a5f35f3..ae7906c459 100644
--- a/src/SignalR/clients/csharp/Client/test/UnitTests/HttpConnectionTests.Transport.cs
+++ b/src/SignalR/clients/csharp/Client/test/UnitTests/HttpConnectionTests.Transport.cs
@@ -72,6 +72,7 @@ public partial class HttpConnectionTests
});
// Fail safe in case the code is modified and some requests don't execute as a result
Assert.True(requestsExecuted);
+ Assert.Equal(1, callCount);
}
[Theory]
@@ -310,5 +311,314 @@ public partial class HttpConnectionTests
Assert.Equal(TransferFormat.Text, transport.Format);
});
}
+
+ [Fact]
+ public async Task HttpConnectionFailsOnNegotiateWhenAuthFails()
+ {
+ var testHttpHandler = new TestHttpMessageHandler(autoNegotiate: false);
+ var accessTokenCallCount = 0;
+ var negotiateCount = 0;
+
+ testHttpHandler.OnNegotiate((_, cancellationToken) =>
+ {
+ negotiateCount++;
+ return ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized);
+ });
+
+ Task<string> AccessTokenProvider()
+ {
+ accessTokenCallCount++;
+ return Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture));
+ }
+
+ await WithConnectionAsync(
+ CreateConnection(testHttpHandler, transportType: HttpTransportType.ServerSentEvents, accessTokenProvider: AccessTokenProvider),
+ async (connection) =>
+ {
+ await Assert.ThrowsAsync<HttpRequestException>(async () => await connection.StartAsync().DefaultTimeout());
+ });
+ Assert.Equal(1, negotiateCount);
+ Assert.Equal(1, accessTokenCallCount);
+ }
+
+ [Fact]
+ public async Task HttpConnectionRetriesAccessTokenProviderWhenAuthFailsLongPolling()
+ {
+ var testHttpHandler = new TestHttpMessageHandler(autoNegotiate: false);
+ var requestsExecuted = false;
+ var accessTokenCallCount = 0;
+ var pollCount = 0;
+
+ testHttpHandler.OnNegotiate((_, cancellationToken) =>
+ {
+ return ResponseUtils.CreateResponse(HttpStatusCode.OK, ResponseUtils.CreateNegotiationContent());
+ });
+
+ var startSendTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var longPollTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var messageFragments = new[] { "This ", "is ", "a ", "test" };
+ testHttpHandler.OnLongPoll(async _ =>
+ {
+ // fail every other request
+ if (pollCount % 2 == 0)
+ {
+ pollCount++;
+ return ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized);
+ }
+ if (pollCount / 2 >= messageFragments.Length)
+ {
+ startSendTcs.SetResult();
+ await longPollTcs.Task;
+ return ResponseUtils.CreateResponse(HttpStatusCode.NoContent);
+ }
+
+ var resp = ResponseUtils.CreateResponse(HttpStatusCode.OK, messageFragments[pollCount / 2]);
+ pollCount++;
+ return resp;
+ });
+
+ var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ testHttpHandler.OnRequest((request, next, token) =>
+ {
+ if (!requestsExecuted)
+ {
+ requestsExecuted = true;
+ return Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized));
+ }
+
+ Assert.Equal("Bearer", request.Headers.Authorization.Scheme);
+
+ Assert.Equal(accessTokenCallCount.ToString(CultureInfo.InvariantCulture), request.Headers.Authorization.Parameter);
+
+ tcs.SetResult();
+
+ return Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK));
+ });
+
+ Task<string> AccessTokenProvider()
+ {
+ accessTokenCallCount++;
+ return Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture));
+ }
+
+ await WithConnectionAsync(
+ CreateConnection(testHttpHandler, transportType: HttpTransportType.LongPolling, accessTokenProvider: AccessTokenProvider),
+ async (connection) =>
+ {
+ await connection.StartAsync().DefaultTimeout();
+ var message = await connection.Transport.Input.ReadAtLeastAsync(14);
+ Assert.Equal("This is a test", Encoding.UTF8.GetString(message.Buffer));
+ await startSendTcs.Task;
+ await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello world 1"));
+ await tcs.Task;
+ longPollTcs.SetResult();
+ });
+ // 1 negotiate + 4 (number of polls) + 1 for last poll + 1 for send
+ Assert.Equal(7, accessTokenCallCount);
+ }
+
+ [Fact]
+ public async Task HttpConnectionFailsAfterFirstRetryFailsLongPolling()
+ {
+ var testHttpHandler = new TestHttpMessageHandler(autoNegotiate: false);
+ var accessTokenCallCount = 0;
+
+ testHttpHandler.OnNegotiate((_, cancellationToken) =>
+ {
+ return ResponseUtils.CreateResponse(HttpStatusCode.OK, ResponseUtils.CreateNegotiationContent());
+ });
+
+ testHttpHandler.OnLongPoll(_ =>
+ {
+ return ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized);
+ });
+
+ Task<string> AccessTokenProvider()
+ {
+ accessTokenCallCount++;
+ return Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture));
+ }
+
+ await WithConnectionAsync(
+ CreateConnection(testHttpHandler, transportType: HttpTransportType.LongPolling, accessTokenProvider: AccessTokenProvider),
+ async (connection) =>
+ {
+ await connection.StartAsync().DefaultTimeout();
+ await Assert.ThrowsAsync<HttpRequestException>(async () => await connection.Transport.Input.ReadAllAsync());
+ });
+
+ // 1 negotiate + 1 retry initial poll
+ Assert.Equal(2, accessTokenCallCount);
+ }
+
+ [Fact]
+ public async Task HttpConnectionRetriesAccessTokenProviderWhenAuthFailsServerSentEvents()
+ {
+ var testHttpHandler = new TestHttpMessageHandler(autoNegotiate: false);
+ var requestsExecuted = false;
+ var accessTokenCallCount = 0;
+
+ testHttpHandler.OnNegotiate((_, cancellationToken) =>
+ {
+ return ResponseUtils.CreateResponse(HttpStatusCode.OK, ResponseUtils.CreateNegotiationContent());
+ });
+
+ var sendRequestExecuted = false;
+ var sendFinishedTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ testHttpHandler.OnSocketSend((_, _) =>
+ {
+ if (!sendRequestExecuted)
+ {
+ sendRequestExecuted = true;
+ return ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized);
+ }
+ sendFinishedTcs.SetResult();
+ return ResponseUtils.CreateResponse(HttpStatusCode.OK);
+ });
+
+ var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var stream = new BlockingStream(tcs);
+ testHttpHandler.OnRequest((request, next, token) =>
+ {
+ if (!requestsExecuted)
+ {
+ requestsExecuted = true;
+ return Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized));
+ }
+
+ Assert.Equal("Bearer", request.Headers.Authorization.Scheme);
+
+ Assert.Equal(accessTokenCallCount.ToString(CultureInfo.InvariantCulture), request.Headers.Authorization.Parameter);
+
+ return Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(stream)));
+ });
+
+ Task<string> AccessTokenProvider()
+ {
+ accessTokenCallCount++;
+ return Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture));
+ }
+
+ await WithConnectionAsync(
+ CreateConnection(testHttpHandler, transportType: HttpTransportType.ServerSentEvents, accessTokenProvider: AccessTokenProvider),
+ async (connection) =>
+ {
+ await connection.StartAsync().DefaultTimeout();
+ await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello world 1"));
+ await sendFinishedTcs.Task;
+ tcs.TrySetResult();
+ await connection.Transport.Input.ReadAllAsync();
+ });
+ // 1 negotiate + 1 retry stream request + 1 retry send
+ Assert.Equal(3, accessTokenCallCount);
+ }
+
+ [Fact]
+ public async Task HttpConnectionFailsAfterFirstRetryFailsServerSentEvents()
+ {
+ var testHttpHandler = new TestHttpMessageHandler(autoNegotiate: false);
+ var accessTokenCallCount = 0;
+
+ testHttpHandler.OnNegotiate((_, cancellationToken) =>
+ {
+ return ResponseUtils.CreateResponse(HttpStatusCode.OK, ResponseUtils.CreateNegotiationContent());
+ });
+
+ testHttpHandler.OnSocketSend((_, _) =>
+ {
+ return ResponseUtils.CreateResponse(HttpStatusCode.Unauthorized);
+ });
+
+ var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ var stream = new BlockingStream(tcs);
+ testHttpHandler.OnRequest((request, next, token) =>
+ {
+ return Task.FromResult(ResponseUtils.CreateResponse(HttpStatusCode.OK, new StreamContent(stream)));
+ });
+
+ Task<string> AccessTokenProvider()
+ {
+ accessTokenCallCount++;
+ return Task.FromResult(accessTokenCallCount.ToString(CultureInfo.InvariantCulture));
+ }
+
+ await WithConnectionAsync(
+ CreateConnection(testHttpHandler, transportType: HttpTransportType.ServerSentEvents, accessTokenProvider: AccessTokenProvider),
+ async (connection) =>
+ {
+ await connection.StartAsync().DefaultTimeout();
+ await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes("Hello world 1"));
+ await Assert.ThrowsAsync<HttpRequestException>(async () => await connection.Transport.Input.ReadAllAsync());
+ });
+ // 1 negotiate + 1 retry stream request
+ Assert.Equal(2, accessTokenCallCount);
+ }
+
+ private class BlockingStream : Stream
+ {
+ private readonly TaskCompletionSource _tcs;
+ private bool _ignoreFirstWrite = true;
+
+ public BlockingStream(TaskCompletionSource tcs)
+ {
+ _tcs = tcs;
+ }
+ public override bool CanRead => true;
+ public override bool CanSeek => false;
+ public override bool CanWrite => true;
+ public override long Length => throw new NotImplementedException();
+ public override long Position { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
+ public override Task CopyToAsync(Stream destination, int bufferSize, CancellationToken cancellationToken)
+ {
+ throw new NotImplementedException();
+ }
+ public override void Flush()
+ {
+ }
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ throw new NotImplementedException();
+ }
+ public override async ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default)
+ {
+ cancellationToken.Register(() => _tcs.TrySetResult());
+ await _tcs.Task;
+ return 0;
+ }
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NotImplementedException();
+ }
+ public override void SetLength(long value)
+ {
+ throw new NotImplementedException();
+ }
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ throw new NotImplementedException();
+ }
+ public override async Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken)
+ {
+ if (_ignoreFirstWrite)
+ {
+ // SSE does an initial write of :\r\n that we want to ignore in testing
+ _ignoreFirstWrite = false;
+ return;
+ }
+ await _tcs.Task;
+ cancellationToken.ThrowIfCancellationRequested();
+ }
+ public override async ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default)
+ {
+ if (_ignoreFirstWrite)
+ {
+ // SSE does an initial write of :\r\n that we want to ignore in testing
+ _ignoreFirstWrite = false;
+ return;
+ }
+ await _tcs.Task;
+ cancellationToken.ThrowIfCancellationRequested();
+ }
+ }
}
}
diff --git a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs
index ba45a0be65..a252a46a5e 100644
--- a/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs
+++ b/src/SignalR/clients/csharp/Client/test/UnitTests/HubClientProxyGeneratorTests.cs
@@ -18,7 +18,7 @@ internal class HubClientProxyAttribute : Attribute
internal static partial class RegisterCallbackProviderExtensions
{
[HubClientProxy]
- public static partial IDisposable SetHubClient<T>(this HubConnection conn, T provider);
+ public static partial IDisposable SetHubClient<T>(this HubConnection conn, T p);
}
public class HubClientProxyGeneratorTests
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.Log.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.Log.cs
index 6364855ca0..7d54757cec 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.Log.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.Log.cs
@@ -2,6 +2,7 @@
// The .NET Foundation licenses this file to you under the MIT license.
using System;
+using System.Net;
using Microsoft.AspNetCore.Connections;
using Microsoft.Extensions.Logging;
@@ -9,7 +10,7 @@ namespace Microsoft.AspNetCore.Http.Connections.Client;
public partial class HttpConnection
{
- private static partial class Log
+ internal static partial class Log
{
[LoggerMessage(1, LogLevel.Debug, "Starting HttpConnection.", EventName = "Starting")]
public static partial void Starting(ILogger logger);
@@ -104,5 +105,8 @@ public partial class HttpConnection
[LoggerMessage(20, LogLevel.Trace, "Cookies are not supported on this platform.", EventName = "CookiesNotSupported")]
public static partial void CookiesNotSupported(ILogger logger);
+
+ [LoggerMessage(21, LogLevel.Debug, "{StatusCode} received, getting a new access token and retrying request.", EventName = "RetryAccessToken")]
+ public static partial void RetryAccessToken(ILogger logger, HttpStatusCode statusCode);
}
}
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.cs
index 3f5b4b3c70..293ac92d71 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/HttpConnection.cs
@@ -32,7 +32,7 @@ public partial class HttpConnection : ConnectionContext, IConnectionInherentKeep
private static readonly TimeSpan HttpClientTimeout = TimeSpan.FromSeconds(120);
- private readonly ILogger _logger;
+ internal readonly ILogger _logger;
private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(1, 1);
private bool _started;
@@ -464,6 +464,12 @@ public partial class HttpConnection : ConnectionContext, IConnectionInherentKeep
// Corefx changed the default version and High Sierra curlhandler tries to upgrade request
request.Version = new Version(1, 1);
+#if NET5_0_OR_GREATER
+ request.Options.Set(new HttpRequestOptionsKey<bool>("IsNegotiate"), true);
+#else
+ request.Properties.Add("IsNegotiate", true);
+#endif
+
// ResponseHeadersRead instructs SendAsync to return once headers are read
// rather than buffer the entire response. This gives a small perf boost.
// Note that it is important to dispose of the response when doing this to
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/AccessTokenHttpMessageHandler.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/AccessTokenHttpMessageHandler.cs
index 23ff559121..eca0aed789 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/AccessTokenHttpMessageHandler.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/AccessTokenHttpMessageHandler.cs
@@ -1,6 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading;
@@ -8,9 +9,10 @@ using System.Threading.Tasks;
namespace Microsoft.AspNetCore.Http.Connections.Client.Internal;
-internal class AccessTokenHttpMessageHandler : DelegatingHandler
+internal sealed class AccessTokenHttpMessageHandler : DelegatingHandler
{
private readonly HttpConnection _httpConnection;
+ private string? _accessToken;
public AccessTokenHttpMessageHandler(HttpMessageHandler inner, HttpConnection httpConnection) : base(inner)
{
@@ -19,13 +21,41 @@ internal class AccessTokenHttpMessageHandler : DelegatingHandler
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
- var accessToken = await _httpConnection.GetAccessTokenAsync().ConfigureAwait(false);
+ var isNegotiate = false;
+ if (string.IsNullOrEmpty(_accessToken) ||
+ // Negotiate redirects likely will have a new access token so let's always grab a (potentially) new access token on negotiate
+#if NET5_0_OR_GREATER
+ request.Options.TryGetValue(new HttpRequestOptionsKey<bool>("IsNegotiate"), out var value) && value == true
+#else
+ request.Properties.TryGetValue("IsNegotiate", out var value) && value is true
+#endif
+ )
+ {
+ isNegotiate = true;
+ _accessToken = await _httpConnection.GetAccessTokenAsync().ConfigureAwait(false);
+ }
- if (!string.IsNullOrEmpty(accessToken))
+ if (!string.IsNullOrEmpty(_accessToken))
{
- request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
+ request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);
}
- return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
+ var result = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
+ // retry once with a new token on auth failure
+ if (!isNegotiate && result.StatusCode is HttpStatusCode.Unauthorized)
+ {
+ HttpConnection.Log.RetryAccessToken(_httpConnection._logger, result.StatusCode);
+ result.Dispose();
+ _accessToken = await _httpConnection.GetAccessTokenAsync().ConfigureAwait(false);
+
+ if (!string.IsNullOrEmpty(_accessToken))
+ {
+ request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", _accessToken);
+ }
+ // Retrying the request relies on any HttpContent being non-disposable.
+ // Currently this is true, the only HttpContent we send is type ReadOnlySequenceContent which is used by SSE and LongPolling for sending an already buffered byte[]
+ result = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
+ }
+ return result;
}
}
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ConnectionLogScope.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ConnectionLogScope.cs
index d62454f816..90f5179f64 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ConnectionLogScope.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ConnectionLogScope.cs
@@ -7,7 +7,7 @@ using System.Collections.Generic;
namespace Microsoft.AspNetCore.Http.Connections.Client.Internal;
-internal class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object?>>
+internal sealed class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object?>>
{
// Name chosen so as not to collide with Kestrel's "ConnectionId"
private const string ClientConnectionIdKey = "ClientConnectionId";
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/LongPollingTransport.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/LongPollingTransport.cs
index faee9c1c1f..adbb15d2e4 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/LongPollingTransport.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/LongPollingTransport.cs
@@ -14,7 +14,7 @@ using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.Http.Connections.Client.Internal;
-internal partial class LongPollingTransport : ITransport
+internal sealed partial class LongPollingTransport : ITransport
{
private readonly HttpClient _httpClient;
private readonly ILogger _logger;
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/SendUtils.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/SendUtils.cs
index 7d6118de31..25a0503984 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/SendUtils.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/SendUtils.cs
@@ -88,7 +88,8 @@ internal static partial class SendUtils
Log.SendStopped(logger);
}
- private class ReadOnlySequenceContent : HttpContent
+ // AccessTokenHttpMessageHandler relies on this being reusable
+ private sealed class ReadOnlySequenceContent : HttpContent
{
private readonly ReadOnlySequence<byte> _buffer;
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ServerSentEventsMessageParser.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ServerSentEventsMessageParser.cs
index 95f9bc5bac..07ade33a57 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ServerSentEventsMessageParser.cs
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/ServerSentEventsMessageParser.cs
@@ -10,15 +10,15 @@ using System.Text;
namespace Microsoft.AspNetCore.Http.Connections.Client.Internal;
-internal class ServerSentEventsMessageParser
+internal sealed class ServerSentEventsMessageParser
{
private const byte ByteCR = (byte)'\r';
private const byte ByteLF = (byte)'\n';
private const byte ByteColon = (byte)':';
// This uses C# compiler's ability to refer to static data directly. For more information see https://vcsjones.dev/2019/02/01/csharp-readonly-span-bytes-static
- private static ReadOnlySpan<byte> DataPrefix => new byte[] { (byte)'d', (byte)'a', (byte)'t', (byte)'a', (byte)':', (byte)' ' };
- private static ReadOnlySpan<byte> SseLineEnding => new byte[] { (byte)'\r', (byte)'\n' };
+ private static ReadOnlySpan<byte> DataPrefix => "data: "u8;
+ private static ReadOnlySpan<byte> SseLineEnding => "\r\n"u8;
private static readonly byte[] _newLine = Encoding.UTF8.GetBytes(Environment.NewLine);
private InternalParseState _internalParserState = InternalParseState.ReadMessagePayload;
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Shipped.txt b/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Shipped.txt
index 0dd7740e5a..6969d0f92b 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.HttpConnectionFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
+Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.HttpConnectionFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.HttpConnection(Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionOptions! httpConnectionOptions, Microsoft.Extensions.Logging.ILoggerFactory? loggerFactory) -> void
Microsoft.AspNetCore.Http.Connections.Client.HttpConnection.HttpConnection(System.Uri! url) -> void
diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Unshipped.txt b/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Unshipped.txt
index 707056a086..7dc5c58110 100644
--- a/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.HttpConnectionFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
-Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionFactory.HttpConnectionFactory(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Http.Connections.Client.HttpConnectionOptions!>! options, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory) -> void
diff --git a/src/SignalR/clients/java/signalr/build.gradle b/src/SignalR/clients/java/signalr/build.gradle
index 4dde32f599..7314185e2f 100644
--- a/src/SignalR/clients/java/signalr/build.gradle
+++ b/src/SignalR/clients/java/signalr/build.gradle
@@ -5,7 +5,7 @@ buildscript {
}
}
dependencies {
- classpath "com.diffplug.spotless:spotless-plugin-gradle:3.14.0"
+ classpath "com.diffplug.spotless:spotless-plugin-gradle:6.6.1"
classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
}
}
@@ -17,7 +17,7 @@ plugins {
allprojects {
apply plugin: "java-library"
- apply plugin: "com.diffplug.gradle.spotless"
+ apply plugin: "com.diffplug.spotless"
// If we're run from outside MSBuild, just assign a bogus dev version.
version project.findProperty('packageVersion') ?: "99.99.99-dev"
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/ActionBase.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/ActionBase.java
index e24630b53d..edca522a66 100644
--- a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/ActionBase.java
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/ActionBase.java
@@ -3,8 +3,10 @@
package com.microsoft.signalr;
+import io.reactivex.rxjava3.core.Completable;
+
interface ActionBase {
// We can't use the @FunctionalInterface annotation because it's only
// available on Android API Level 24 and above.
- void invoke(Object ... params);
+ Completable invoke(Object ... params);
}
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/CallbackMap.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/CallbackMap.java
index 2a7013cc5d..1f3bfcd59e 100644
--- a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/CallbackMap.java
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/CallbackMap.java
@@ -14,14 +14,29 @@ class CallbackMap {
private final Map<String, List<InvocationHandler>> handlers = new HashMap<>();
private final ReentrantLock lock = new ReentrantLock();
- public InvocationHandler put(String target, ActionBase action, Type... types) {
+ public InvocationHandler put(String target, Object action, Type... types) {
try {
lock.lock();
InvocationHandler handler = new InvocationHandler(action, types);
if (!handlers.containsKey(target)) {
handlers.put(target, new ArrayList<>());
}
- handlers.get(target).add(handler);
+
+ List<InvocationHandler> methodHandlers;
+ methodHandlers = handlers.get(target);
+ if (handler.getHasResult()) {
+ for (InvocationHandler existingHandler : methodHandlers) {
+ if (existingHandler.getHasResult()) {
+ throw new RuntimeException(String.format("'%s' already has a value returning handler. Multiple return values are not supported.", target));
+ }
+ }
+ }
+ methodHandlers = new ArrayList<>(methodHandlers);
+ methodHandlers.add(handler);
+
+ // replace List in handlers map
+ handlers.remove(target);
+ handlers.put(target, methodHandlers);
return handler;
} finally {
lock.unlock();
@@ -31,7 +46,7 @@ class CallbackMap {
public List<InvocationHandler> get(String key) {
try {
lock.lock();
- return handlers.get(key);
+ return this.handlers.get(key);
} finally {
lock.unlock();
}
@@ -45,4 +60,21 @@ class CallbackMap {
lock.unlock();
}
}
+
+ public void remove(String key, InvocationHandler handler) {
+ try {
+ lock.lock();
+ List<InvocationHandler> handlers = this.handlers.get(key);
+ if (handlers != null) {
+ handlers = new ArrayList<>(handlers);
+ handlers.remove(handler);
+
+ // replace List in handlers map
+ this.handlers.remove(key);
+ this.handlers.put(key, handlers);
+ }
+ } finally {
+ lock.unlock();
+ }
+ }
}
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function1Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function1Single.java
new file mode 100644
index 0000000000..1b1d599d3c
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function1Single.java
@@ -0,0 +1,17 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ */
+public interface Function1Single<T1, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function2Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function2Single.java
new file mode 100644
index 0000000000..75d2ba4d2d
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function2Single.java
@@ -0,0 +1,18 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ */
+public interface Function2Single<T1, T2, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function3Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function3Single.java
new file mode 100644
index 0000000000..027b0380db
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function3Single.java
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ * @param <T3> The type of the third parameter to the callback.
+ */
+public interface Function3Single<T1, T2, T3, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2, T3 param3);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function4Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function4Single.java
new file mode 100644
index 0000000000..af009deca1
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function4Single.java
@@ -0,0 +1,20 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ * @param <T3> The type of the third parameter to the callback.
+ * @param <T4> The type of the fourth parameter to the callback.
+ */
+public interface Function4Single<T1, T2, T3, T4, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2, T3 param3, T4 param4);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function5Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function5Single.java
new file mode 100644
index 0000000000..4776b8b062
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function5Single.java
@@ -0,0 +1,21 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ * @param <T3> The type of the third parameter to the callback.
+ * @param <T4> The type of the fourth parameter to the callback.
+ * @param <T5> The type of the fifth parameter to the callback.
+ */
+public interface Function5Single<T1, T2, T3, T4, T5, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2, T3 param3, T4 param4, T5 param5);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function6Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function6Single.java
new file mode 100644
index 0000000000..342cda35b0
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function6Single.java
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ * @param <T3> The type of the third parameter to the callback.
+ * @param <T4> The type of the fourth parameter to the callback.
+ * @param <T5> The type of the fifth parameter to the callback.
+ * @param <T6> The type of the sixth parameter to the callback.
+ */
+public interface Function6Single<T1, T2, T3, T4, T5, T6, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2, T3 param3, T4 param4, T5 param5, T6 param6);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function7Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function7Single.java
new file mode 100644
index 0000000000..da90e47adc
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function7Single.java
@@ -0,0 +1,23 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ * @param <T3> The type of the third parameter to the callback.
+ * @param <T4> The type of the fourth parameter to the callback.
+ * @param <T5> The type of the fifth parameter to the callback.
+ * @param <T6> The type of the sixth parameter to the callback.
+ * @param <T7> The type of the seventh parameter to the callback.
+ */
+public interface Function7Single<T1, T2, T3, T4, T5, T6, T7, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2, T3 param3, T4 param4, T5 param5, T6 param6, T7 param7);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function8Single.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function8Single.java
new file mode 100644
index 0000000000..b8932fef03
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Function8Single.java
@@ -0,0 +1,24 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes one parameter.
+ *
+ * @param <T1> The type of the first parameter to the callback.
+ * @param <T2> The type of the second parameter to the callback.
+ * @param <T3> The type of the third parameter to the callback.
+ * @param <T4> The type of the fourth parameter to the callback.
+ * @param <T5> The type of the fifth parameter to the callback.
+ * @param <T6> The type of the sixth parameter to the callback.
+ * @param <T7> The type of the seventh parameter to the callback.
+ * @param <T8> The type of the eighth parameter to the callback.
+ */
+public interface Function8Single<T1, T2, T3, T4, T5, T6, T7, T8, TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke(T1 param1, T2 param2, T3 param3, T4 param4, T5 param5, T6 param6, T7 param7, T8 param8);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionBase.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionBase.java
new file mode 100644
index 0000000000..c865afb7c8
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionBase.java
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes no parameters.
+ */
+interface FunctionBase {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<Object> invoke(Object ... params);
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionSingle.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionSingle.java
new file mode 100644
index 0000000000..11f198de1e
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/FunctionSingle.java
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import io.reactivex.rxjava3.core.Single;
+
+/**
+ * A callback that takes no parameters.
+ */
+public interface FunctionSingle<TResult> {
+ // We can't use the @FunctionalInterface annotation because it's only
+ // available on Android API Level 24 and above.
+ Single<TResult> invoke();
+} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java
index 1e2ce1bc5a..b10afb4fd2 100644
--- a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/HubConnection.java
@@ -22,6 +22,7 @@ import com.google.gson.stream.JsonReader;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.schedulers.Schedulers;
import io.reactivex.rxjava3.subjects.*;
import okhttp3.OkHttpClient;
@@ -55,7 +56,6 @@ public class HubConnection implements AutoCloseable {
// Private property, modified for testing
private long tickRate = 1000;
-
// Holds all mutable state other than user-defined handlers and settable properties.
private final ReconnectingConnectionState state;
@@ -471,20 +471,8 @@ public class HubConnection implements AutoCloseable {
logger.error("Failed to bind arguments received in invocation '{}' of '{}'.", msg.getInvocationId(), msg.getTarget(), msg.getException());
break;
case INVOCATION:
-
InvocationMessage invocationMessage = (InvocationMessage) message;
- List<InvocationHandler> handlers = this.handlers.get(invocationMessage.getTarget());
- if (handlers != null) {
- for (InvocationHandler handler : handlers) {
- try {
- handler.getAction().invoke(invocationMessage.getArguments());
- } catch (Exception e) {
- logger.error("Invoking client side method '{}' failed:", invocationMessage.getTarget(), e);
- }
- }
- } else {
- logger.warn("Failed to find handler for '{}' method.", invocationMessage.getTarget());
- }
+ connectionState.dispatchInvocation(invocationMessage);
break;
case CLOSE:
logger.info("Close message received from server.");
@@ -868,7 +856,10 @@ public class HubConnection implements AutoCloseable {
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
*/
public Subscription on(String target, Action callback) {
- ActionBase action = args -> callback.invoke();
+ ActionBase action = args -> {
+ callback.invoke();
+ return Completable.complete();
+ };
return registerHandler(target, action);
}
@@ -883,9 +874,11 @@ public class HubConnection implements AutoCloseable {
* @return A {@link Subscription} that can be disposed to unsubscribe from the hub method.
*/
public <T1> Subscription on(String target, Action1<T1> callback, Class<T1> param1) {
- ActionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]));
+ ActionBase action = params -> {
+ callback.invoke(Utils.<T1>cast(param1, params[0]));
+ return Completable.complete();
+ };
return registerHandler(target, action, param1);
-
}
/**
@@ -903,6 +896,7 @@ public class HubConnection implements AutoCloseable {
public <T1, T2> Subscription on(String target, Action2<T1, T2> callback, Class<T1> param1, Class<T2> param2) {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2);
}
@@ -925,6 +919,7 @@ public class HubConnection implements AutoCloseable {
Class<T1> param1, Class<T2> param2, Class<T3> param3) {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3);
}
@@ -950,6 +945,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4);
}
@@ -977,6 +973,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5);
}
@@ -1006,6 +1003,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5, param6);
}
@@ -1037,6 +1035,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7);
}
@@ -1071,6 +1070,7 @@ public class HubConnection implements AutoCloseable {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]),
Utils.<T8>cast(param8, params[7]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7, param8);
}
@@ -1089,6 +1089,7 @@ public class HubConnection implements AutoCloseable {
public <T1> Subscription on(String target, Action1<T1> callback, Type param1) {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]));
+ return Completable.complete();
};
return registerHandler(target, action, param1);
}
@@ -1109,6 +1110,7 @@ public class HubConnection implements AutoCloseable {
public <T1, T2> Subscription on(String target, Action2<T1, T2> callback, Type param1, Type param2) {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2);
}
@@ -1132,6 +1134,7 @@ public class HubConnection implements AutoCloseable {
Type param1, Type param2, Type param3) {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3);
}
@@ -1158,6 +1161,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4);
}
@@ -1186,6 +1190,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5);
}
@@ -1216,6 +1221,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5, param6);
}
@@ -1248,6 +1254,7 @@ public class HubConnection implements AutoCloseable {
ActionBase action = params -> {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7);
}
@@ -1284,11 +1291,75 @@ public class HubConnection implements AutoCloseable {
callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]),
Utils.<T8>cast(param8, params[7]));
+ return Completable.complete();
};
return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7, param8);
}
- private Subscription registerHandler(String target, ActionBase action, Type... types) {
+ public <TResult> Subscription onWithResult(String target, FunctionSingle<TResult> callback) {
+ FunctionBase action = args -> callback.invoke().cast(Object.class);
+ return registerHandler(target, action);
+ }
+
+ public <T1, TResult> Subscription onWithResult(String target, Function1Single<T1, TResult> callback, Class<T1> param1) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0])).cast(Object.class);
+ return registerHandler(target, action, param1);
+ }
+
+ public <T1, T2, TResult> Subscription onWithResult(String target, Function2Single<T1, T2, TResult> callback,
+ Class<T1> param1, Class<T2> param2) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]),
+ Utils.<T2>cast(param2, params[1])).cast(Object.class);
+ return registerHandler(target, action, param1, param2);
+ }
+
+ public <T1, T2, T3, TResult> Subscription onWithResult(String target, Function3Single<T1, T2, T3, TResult> callback,
+ Class<T1> param1, Class<T2> param2, Class<T3> param3) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]),
+ Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2])).cast(Object.class);
+ return registerHandler(target, action, param1, param2, param3);
+ }
+
+ public <T1, T2, T3, T4, TResult> Subscription onWithResult(String target, Function4Single<T1, T2, T3, T4, TResult> callback,
+ Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]),
+ Utils.<T3>cast(param3, params[2]), Utils.<T4>cast(param4, params[3])).cast(Object.class);
+ return registerHandler(target, action, param1, param2, param3, param4);
+ }
+
+ public <T1, T2, T3, T4, T5, TResult> Subscription onWithResult(String target, Function5Single<T1, T2, T3, T4, T5, TResult> callback,
+ Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4, Class<T5> param5) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]),
+ Utils.<T3>cast(param3, params[2]), Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4])).cast(Object.class);
+ return registerHandler(target, action, param1, param2, param3, param4, param5);
+ }
+
+ public <T1, T2, T3, T4, T5, T6, TResult> Subscription onWithResult(String target, Function6Single<T1, T2, T3, T4, T5, T6, TResult> callback,
+ Class<T1> param1, Class<T2> param2, Class<T3> param3,
+ Class<T4> param4, Class<T5> param5, Class<T6> param6) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
+ Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5])).cast(Object.class);
+ return registerHandler(target, action, param1, param2, param3, param4, param5, param6);
+ }
+
+ public <T1, T2, T3, T4, T5, T6, T7, TResult> Subscription onWithResult(String target, Function7Single<T1, T2, T3, T4, T5, T6, T7, TResult> callback,
+ Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4,
+ Class<T5> param5, Class<T6> param6, Class<T7> param7) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]), Utils.<T3>cast(param3, params[2]),
+ Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]), Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6])).cast(Object.class);
+ return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7);
+ }
+
+ public <T1, T2, T3, T4, T5, T6, T7, T8, TResult> Subscription onWithResult(String target, Function8Single<T1, T2, T3, T4, T5, T6, T7, T8, TResult> callback,
+ Class<T1> param1, Class<T2> param2, Class<T3> param3, Class<T4> param4, Class<T5> param5,
+ Class<T6> param6, Class<T7> param7, Class<T8> param8) {
+ FunctionBase action = params -> callback.invoke(Utils.<T1>cast(param1, params[0]), Utils.<T2>cast(param2, params[1]),
+ Utils.<T3>cast(param3, params[2]), Utils.<T4>cast(param4, params[3]), Utils.<T5>cast(param5, params[4]),
+ Utils.<T6>cast(param6, params[5]), Utils.<T7>cast(param7, params[6]), Utils.<T8>cast(param8, params[7])).cast(Object.class);
+ return registerHandler(target, action, param1, param2, param3, param4, param5, param6, param7, param8);
+ }
+
+ private Subscription registerHandler(String target, Object action, Type... types) {
InvocationHandler handler = handlers.put(target, action, types);
logger.debug("Registering handler for client method: '{}'.", target);
return new Subscription(handlers, handler, target);
@@ -1303,6 +1374,7 @@ public class HubConnection implements AutoCloseable {
private Timer pingTimer = null;
private Boolean handshakeReceived = false;
private ScheduledExecutorService handshakeTimeout = null;
+ private BehaviorSubject<InvocationMessage> messages = BehaviorSubject.create();
public final Lock lock = new ReentrantLock();
public final CompletableSubject handshakeResponseSubject = CompletableSubject.create();
@@ -1434,6 +1506,7 @@ public class HubConnection implements AutoCloseable {
}
handshakeReceived = true;
handshakeResponseSubject.onComplete();
+ handleInvocations();
}
}
@@ -1446,6 +1519,7 @@ public class HubConnection implements AutoCloseable {
public void close() {
handshakeResponseSubject.onComplete();
+ messages.onComplete();
if (pingTimer != null) {
pingTimer.cancel();
@@ -1456,6 +1530,66 @@ public class HubConnection implements AutoCloseable {
}
}
+ public void dispatchInvocation(InvocationMessage message) {
+ messages.onNext(message);
+ }
+
+ private void handleInvocations() {
+ messages.observeOn(Schedulers.io()).subscribe(invocationMessage -> {
+ List<InvocationHandler> handlers = this.connection.handlers.get(invocationMessage.getTarget());
+ boolean expectsResult = invocationMessage.getInvocationId() != null;
+ if (handlers == null) {
+ if (expectsResult) {
+ logger.warn("Failed to find a value returning handler for '{}' method. Sending error to server.", invocationMessage.getTarget());
+ sendHubMessageWithLock(new CompletionMessage(null, invocationMessage.getInvocationId(),
+ null, "Client did not provide a result."));
+ } else {
+ logger.warn("Failed to find handler for '{}' method.", invocationMessage.getTarget());
+ }
+ return;
+ }
+ Object result = null;
+ Exception resultException = null;
+ Boolean hasResult = false;
+ for (InvocationHandler handler : handlers) {
+ try {
+ Object action = handler.getAction();
+ if (handler.getHasResult()) {
+ FunctionBase function = (FunctionBase)action;
+ result = function.invoke(invocationMessage.getArguments()).blockingGet();
+ hasResult = true;
+ } else {
+ ((ActionBase)action).invoke(invocationMessage.getArguments()).blockingAwait();
+ }
+ } catch (Exception e) {
+ logger.error("Invoking client side method '{}' failed:", invocationMessage.getTarget(), e);
+ if (handler.getHasResult()) {
+ resultException = e;
+ }
+ }
+ }
+
+ if (expectsResult) {
+ if (resultException != null) {
+ sendHubMessageWithLock(new CompletionMessage(null, invocationMessage.getInvocationId(),
+ null, resultException.getMessage()));
+ } else if (hasResult) {
+ sendHubMessageWithLock(new CompletionMessage(null, invocationMessage.getInvocationId(),
+ result, null));
+ } else {
+ logger.warn("Failed to find a value returning handler for '{}' method. Sending error to server.", invocationMessage.getTarget());
+ sendHubMessageWithLock(new CompletionMessage(null, invocationMessage.getInvocationId(),
+ null, "Client did not provide a result."));
+ }
+ } else if (hasResult) {
+ logger.warn("Result given for '{}' method but server is not expecting a result.", invocationMessage.getTarget());
+ }
+ }, (e) -> {
+ stop(e.getMessage());
+ }, () -> {
+ });
+ }
+
@Override
public Type getReturnType(String invocationId) {
InvocationRequest irq = getInvocation(invocationId);
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/InvocationHandler.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/InvocationHandler.java
index 98fa53aaf3..135a4d4779 100644
--- a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/InvocationHandler.java
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/InvocationHandler.java
@@ -9,9 +9,9 @@ import java.util.List;
class InvocationHandler {
private final List<Type> types;
- private final ActionBase action;
+ private final Object action;
- InvocationHandler(ActionBase action, Type... types) {
+ InvocationHandler(Object action, Type... types) {
this.action = action;
this.types = Arrays.asList(types);
}
@@ -20,7 +20,11 @@ class InvocationHandler {
return types;
}
- public ActionBase getAction() {
+ public Object getAction() {
return action;
}
+
+ public boolean getHasResult() {
+ return action instanceof FunctionBase;
+ }
} \ No newline at end of file
diff --git a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Subscription.java b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Subscription.java
index ab72531472..e67e04bd59 100644
--- a/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Subscription.java
+++ b/src/SignalR/clients/java/signalr/core/src/main/java/com/microsoft/signalr/Subscription.java
@@ -23,9 +23,6 @@ public class Subscription {
* Removes the client method handler represented by this subscription.
*/
public void unsubscribe() {
- List<InvocationHandler> handler = this.handlers.get(target);
- if (handler != null) {
- handler.remove(this.handler);
- }
+ this.handlers.remove(this.target, this.handler);
}
}
diff --git a/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnection.ReturnResultTest.java b/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnection.ReturnResultTest.java
new file mode 100644
index 0000000000..1340eae726
--- /dev/null
+++ b/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnection.ReturnResultTest.java
@@ -0,0 +1,398 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+package com.microsoft.signalr;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.nio.ByteBuffer;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+
+import io.reactivex.rxjava3.core.Single;
+import io.reactivex.rxjava3.subjects.CompletableSubject;
+import io.reactivex.rxjava3.subjects.SingleSubject;
+
+@ExtendWith({RxJavaUnhandledExceptionsExtensions.class})
+class HubConnectionReturnResultTest {
+ private static final String RECORD_SEPARATOR = "\u001e";
+
+ @Test
+ public void returnFromOnHandlerNoParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicBoolean handlerCalled = new AtomicBoolean();
+
+ hubConnection.onWithResult("inc", () -> {
+ handlerCalled.set(true);
+ return Single.just(10);
+ });
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertTrue(handlerCalled.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":10}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void missingReturningOnHandlerWithRequestedResult() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicBoolean handlerCalled = new AtomicBoolean();
+
+ hubConnection.on("inc", () -> {
+ handlerCalled.set(true);
+ });
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertTrue(handlerCalled.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"error\":\"Client did not provide a result.\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void missingOnHandlerWithRequestedResult() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"error\":\"Client did not provide a result.\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void throwFromReturningOnHandlerWithRequestedResult() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+
+ hubConnection.onWithResult("inc", () -> {
+ boolean b = true;
+ if (b) {
+ throw new RuntimeException("Custom error.");
+ }
+ return Single.just("value");
+ });
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"error\":\"Custom error.\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void cannotRegisterMultipleReturnHandlers() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+
+ hubConnection.onWithResult("inc", () -> {
+ return Single.just("value");
+ });
+
+ RuntimeException ex = assertThrows(RuntimeException.class, () -> {
+ hubConnection.onWithResult("inc", () -> {
+ return Single.just("value2");
+ });
+ });
+ assertEquals("'inc' already has a value returning handler. Multiple return values are not supported.", ex.getMessage());
+ }
+
+ @Test
+ public void logsWhenReturningResultButResultNotExpected() {
+ try (TestLogger logger = new TestLogger()) {
+ CompletableSubject complete = CompletableSubject.create();
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+
+ hubConnection.onWithResult("m", () -> {
+ return Single.just(42);
+ });
+
+ hubConnection.on("fin", () -> {
+ complete.onComplete();
+ });
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ mockTransport.receiveMessage("{\"type\":1,\"target\":\"m\",\"arguments\":[]}" + RECORD_SEPARATOR);
+ // send another invocation message and wait for it to be processed to make sure the first invocation was processed
+ mockTransport.receiveMessage("{\"type\":1,\"target\":\"fin\",\"arguments\":[]}" + RECORD_SEPARATOR);
+
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
+
+ logger.assertLog("Result given for 'm' method but server is not expecting a result.");
+ }
+ }
+
+ @Test
+ public void returnFromOnHandlerOneParam() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i) -> {
+ handlerCalled.set(i);
+ return Single.just(10);
+ }, String.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[1]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":10}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerTwoParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ return Single.just("bob");
+ }, String.class, Integer.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[1,13]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerThreeParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+ AtomicReference<Integer[]> handler3Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j, k) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ handler3Called.set(k);
+ return Single.just("bob");
+ }, String.class, Integer.class, Integer[].class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[1,13,[1,2,3]]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ assertArrayEquals(new Integer[] { 1, 2, 3 }, handler3Called.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerFourParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+ AtomicReference<Integer[]> handler3Called = new AtomicReference<>();
+ AtomicReference<Boolean> handler4Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j, k, l) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ handler3Called.set(k);
+ handler4Called.set(l);
+ return Single.just("bob");
+ }, String.class, Integer.class, Integer[].class, Boolean.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[\"1\",13,[1,2,3],true]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ assertArrayEquals(new Integer[] { 1, 2, 3 }, handler3Called.get());
+ assertEquals(true, handler4Called.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerFiveParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+ AtomicReference<Integer[]> handler3Called = new AtomicReference<>();
+ AtomicReference<Boolean> handler4Called = new AtomicReference<>();
+ AtomicReference<String> handler5Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j, k, l, m) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ handler3Called.set(k);
+ handler4Called.set(l);
+ handler5Called.set(m);
+ return Single.just("bob");
+ }, String.class, Integer.class, Integer[].class, Boolean.class, String.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[\"1\",13,[1,2,3],true,\"t\"]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ assertArrayEquals(new Integer[] { 1, 2, 3 }, handler3Called.get());
+ assertEquals(true, handler4Called.get());
+ assertEquals("t", handler5Called.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerSixParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+ AtomicReference<Integer[]> handler3Called = new AtomicReference<>();
+ AtomicReference<Boolean> handler4Called = new AtomicReference<>();
+ AtomicReference<String> handler5Called = new AtomicReference<>();
+ AtomicReference<Double> handler6Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j, k, l, m, n) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ handler3Called.set(k);
+ handler4Called.set(l);
+ handler5Called.set(m);
+ handler6Called.set(n);
+ return Single.just("bob");
+ }, String.class, Integer.class, Integer[].class, Boolean.class,
+ String.class, Double.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[\"1\",13,[1,2,3],true,\"t\",1.5]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ assertArrayEquals(new Integer[] { 1, 2, 3 }, handler3Called.get());
+ assertEquals(true, handler4Called.get());
+ assertEquals("t", handler5Called.get());
+ assertEquals(1.5, handler6Called.get().doubleValue());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerSevenParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+ AtomicReference<Integer[]> handler3Called = new AtomicReference<>();
+ AtomicReference<Boolean> handler4Called = new AtomicReference<>();
+ AtomicReference<String> handler5Called = new AtomicReference<>();
+ AtomicReference<Double> handler6Called = new AtomicReference<>();
+ AtomicReference<String> handler7Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j, k, l, m, n, o) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ handler3Called.set(k);
+ handler4Called.set(l);
+ handler5Called.set(m);
+ handler6Called.set(n);
+ handler7Called.set(o);
+ return Single.just("bob");
+ }, String.class, Integer.class, Integer[].class, Boolean.class,
+ String.class, Double.class, String.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[\"1\",13,[1,2,3],true,\"t\",1.5,\"h\"]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ assertArrayEquals(new Integer[] { 1, 2, 3 }, handler3Called.get());
+ assertEquals(true, handler4Called.get());
+ assertEquals("t", handler5Called.get());
+ assertEquals(1.5, handler6Called.get().doubleValue());
+ assertEquals("h", handler7Called.get());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+
+ @Test
+ public void returnFromOnHandlerEightParams() {
+ MockTransport mockTransport = new MockTransport();
+ HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
+ AtomicReference<String> handlerCalled = new AtomicReference<>();
+ AtomicReference<Integer> handler2Called = new AtomicReference<>();
+ AtomicReference<Integer[]> handler3Called = new AtomicReference<>();
+ AtomicReference<Boolean> handler4Called = new AtomicReference<>();
+ AtomicReference<String> handler5Called = new AtomicReference<>();
+ AtomicReference<Double> handler6Called = new AtomicReference<>();
+ AtomicReference<String> handler7Called = new AtomicReference<>();
+ AtomicReference<Integer> handler8Called = new AtomicReference<>();
+
+ hubConnection.onWithResult("inc", (i, j, k, l, m, n, o, p) -> {
+ handlerCalled.set(i);
+ handler2Called.set(j);
+ handler3Called.set(k);
+ handler4Called.set(l);
+ handler5Called.set(m);
+ handler6Called.set(n);
+ handler7Called.set(o);
+ handler8Called.set(p);
+ return Single.just("bob");
+ }, String.class, Integer.class, Integer[].class, Boolean.class,
+ String.class, Double.class, String.class, Integer.class);
+
+ hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
+ SingleSubject<ByteBuffer> sendTask = mockTransport.getNextSentMessage();
+ mockTransport.receiveMessage("{\"type\":1,\"invocationId\":\"1\",\"target\":\"inc\",\"arguments\":[\"1\",13,[1,2,3],true,\"t\",1.5,\"h\",33]}" + RECORD_SEPARATOR);
+
+ ByteBuffer message = sendTask.timeout(30, TimeUnit.SECONDS).blockingGet();
+ assertEquals("1", handlerCalled.get());
+ assertEquals(13, handler2Called.get().intValue());
+ assertArrayEquals(new Integer[] { 1, 2, 3 }, handler3Called.get());
+ assertEquals(true, handler4Called.get());
+ assertEquals("t", handler5Called.get());
+ assertEquals(1.5, handler6Called.get().doubleValue());
+ assertEquals("h", handler7Called.get());
+ assertEquals(33, handler8Called.get().intValue());
+ String expected = "{\"type\":3,\"invocationId\":\"1\",\"result\":\"bob\"}" + RECORD_SEPARATOR;
+ assertEquals(expected, TestUtils.byteBufferToString(message));
+ }
+}
diff --git a/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java
index 4df658ee1d..34cf8cd64a 100644
--- a/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java
+++ b/src/SignalR/clients/java/signalr/test/src/main/java/com/microsoft/signalr/HubConnectionTest.java
@@ -22,7 +22,6 @@ import org.junit.jupiter.api.extension.ExtendWith;
import ch.qos.logback.classic.spi.ILoggingEvent;
import io.reactivex.rxjava3.core.Completable;
import io.reactivex.rxjava3.core.Observable;
-import io.reactivex.rxjava3.core.Scheduler;
import io.reactivex.rxjava3.core.Single;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;
@@ -220,10 +219,17 @@ class HubConnectionTest {
@Test
public void registeringMultipleHandlersAndBothGetTriggered() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- Action action = () -> value.getAndUpdate((val) -> val + 1);
+ Action action = () -> {
+ value.getAndUpdate((val) -> val + 1);
+
+ if (value.get() == 2) {
+ complete.onComplete();
+ }
+ };
hubConnection.on("inc", action);
hubConnection.on("inc", action);
@@ -240,19 +246,23 @@ class HubConnectionTest {
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(2), value.get());
}
@Test
public void removeHandlerByName() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- Action action = () -> value.getAndUpdate((val) -> val + 1);
+ Action action = () -> {
+ value.getAndUpdate((val) -> val + 1);
- hubConnection.on("inc", action);
+ complete.onComplete();
+ };
- assertEquals(Double.valueOf(0), value.get());
+ hubConnection.on("inc", action);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
String message = TestUtils.byteBufferToString(mockTransport.getSentMessages()[0]);
@@ -263,10 +273,12 @@ class HubConnectionTest {
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(1), value.get());
hubConnection.remove("inc");
- assertEquals(Double.valueOf(1), value.get());
+
+ mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
}
@Test
@@ -295,17 +307,20 @@ class HubConnectionTest {
@Test
public void removingMultipleHandlersWithOneCallToRemove() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
Action action = () -> value.getAndUpdate((val) -> val + 1);
- Action secondAction = () -> value.getAndUpdate((val) -> val + 2);
+ Action secondAction = () -> {
+ value.getAndUpdate((val) -> val + 2);
+
+ complete.onComplete();
+ };
hubConnection.on("inc", action);
hubConnection.on("inc", secondAction);
- assertEquals(Double.valueOf(0), value.get());
-
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
String message = TestUtils.byteBufferToString(mockTransport.getSentMessages()[0]);
String expectedHanshakeRequest = "{\"protocol\":\"json\",\"version\":1}" + RECORD_SEPARATOR;
@@ -314,6 +329,7 @@ class HubConnectionTest {
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(3), value.get());
hubConnection.remove("inc");
@@ -326,10 +342,15 @@ class HubConnectionTest {
@Test
public void removeHandlerWithUnsubscribe() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- Action action = () -> value.getAndUpdate((val) -> val + 1);
+ Action action = () -> {
+ value.getAndUpdate((val) -> val + 1);
+
+ complete.onComplete();
+ };
Subscription subscription = hubConnection.on("inc", action);
@@ -344,6 +365,7 @@ class HubConnectionTest {
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(1), value.get());
subscription.unsubscribe();
@@ -358,10 +380,14 @@ class HubConnectionTest {
@Test
public void unsubscribeTwice() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- Action action = () -> value.getAndUpdate((val) -> val + 1);
+ Action action = () -> {
+ value.getAndUpdate((val) -> val + 1);
+ complete.onComplete();
+ };
Subscription subscription = hubConnection.on("inc", action);
@@ -376,6 +402,7 @@ class HubConnectionTest {
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(1), value.get());
subscription.unsubscribe();
@@ -391,14 +418,23 @@ class HubConnectionTest {
@Test
public void removeSingleHandlerWithUnsubscribe() {
+ CompletableSubject complete1 = CompletableSubject.create();
+ CompletableSubject complete2 = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
Action action = () -> value.getAndUpdate((val) -> val + 1);
- Action secondAction = () -> value.getAndUpdate((val) -> val + 2);
+ Action secondAction = () -> {
+ value.getAndUpdate((val) -> val + 2);
+ if (!complete1.hasComplete()) {
+ complete1.onComplete();
+ } else {
+ complete2.onComplete();
+ }
+ };
Subscription subscription = hubConnection.on("inc", action);
- Subscription secondSubscription = hubConnection.on("inc", secondAction);
+ hubConnection.on("inc", secondAction);
assertEquals(Double.valueOf(0), value.get());
@@ -410,11 +446,14 @@ class HubConnectionTest {
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete1.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(3), value.get());
// This removes the first handler so when "inc" is invoked secondAction should still run.
subscription.unsubscribe();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
+
+ complete2.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(5), value.get());
}
@@ -444,20 +483,26 @@ class HubConnectionTest {
@Test
public void registeringMultipleHandlersThatTakeParamsAndBothGetTriggered() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<>(0.0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- Action1<Double> action = (number) -> value.getAndUpdate((val) -> val + number);
+ Action1<Double> action = (number) -> {
+ value.getAndUpdate((val) -> val + number);
+ if (value.get() == 24.0) {
+ complete.onComplete();
+ }
+ };
hubConnection.on("add", action, Double.class);
hubConnection.on("add", action, Double.class);
- assertEquals(Double.valueOf(0), value.get());
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"add\",\"arguments\":[12]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(24), value.get());
}
@@ -1846,31 +1891,36 @@ class HubConnectionTest {
@Test
public void sendWithNoParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Integer> value = new AtomicReference<>(0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", () ->{
- assertEquals(Integer.valueOf(0), value.get());
value.getAndUpdate((val) -> val + 1);
+
+ complete.onComplete();
});
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Integer.valueOf(1), value.get());
}
@Test
public void sendWithParamTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value = new AtomicReference<>();
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- hubConnection.on("inc", (param) ->{
- assertNull(value.get());
+ hubConnection.on("inc", (param) -> {
value.set(param);
+
+ complete.onComplete();
}, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -1878,23 +1928,24 @@ class HubConnectionTest {
hubConnection.send("inc", "Hello World");
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("Hello World", value.get());
}
@Test
public void sendWithTwoParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<Double> value2 = new AtomicReference<>();
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- hubConnection.on("inc", (param1, param2) ->{
- assertNull(value1.get());
- assertNull((value2.get()));
-
+ hubConnection.on("inc", (param1, param2) -> {
value1.set(param1);
value2.set(param2);
+
+ complete.onComplete();
}, String.class, double.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -1902,12 +1953,14 @@ class HubConnectionTest {
hubConnection.send("inc", "Hello World", 12);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("Hello World", value1.get());
assertEquals(12d, value2.get().doubleValue());
}
@Test
public void sendWithThreeParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -1915,14 +1968,12 @@ class HubConnectionTest {
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- hubConnection.on("inc", (param1, param2, param3) ->{
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
-
+ hubConnection.on("inc", (param1, param2, param3) -> {
value1.set(param1);
value2.set(param2);
value3.set(param3);
+
+ complete.onComplete();
}, String.class, String.class, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -1930,6 +1981,7 @@ class HubConnectionTest {
hubConnection.send("inc", "A", "B", "C");
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -1937,6 +1989,7 @@ class HubConnectionTest {
@Test
public void sendWithFourParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -1945,22 +1998,20 @@ class HubConnectionTest {
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- hubConnection.on("inc", (param1, param2, param3, param4) ->{
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
-
+ hubConnection.on("inc", (param1, param2, param3, param4) -> {
value1.set(param1);
value2.set(param2);
value3.set(param3);
value4.set(param4);
+
+ complete.onComplete();
}, String.class, String.class, String.class, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[\"A\", \"B\", \"C\", \"D\"]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -1969,6 +2020,7 @@ class HubConnectionTest {
@Test
public void sendWithFiveParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -1978,24 +2030,21 @@ class HubConnectionTest {
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
- hubConnection.on("inc", (param1, param2, param3, param4, param5) ->{
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
-
+ hubConnection.on("inc", (param1, param2, param3, param4, param5) -> {
value1.set(param1);
value2.set(param2);
value3.set(param3);
value4.set(param4);
value5.set(param5);
+
+ complete.onComplete();
}, String.class, String.class, String.class, boolean.class, double.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[\"A\", \"B\", \"C\",true,12 ]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2005,6 +2054,7 @@ class HubConnectionTest {
@Test
public void sendWithSixParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2016,25 +2066,21 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", (param1, param2, param3, param4, param5, param6) -> {
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
- assertNull(value6.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
value4.set(param4);
value5.set(param5);
value6.set(param6);
+
+ complete.onComplete();
}, String.class, String.class, String.class, boolean.class, double.class, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[\"A\", \"B\", \"C\",true,12,\"D\"]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2045,6 +2091,7 @@ class HubConnectionTest {
@Test
public void sendWithSevenParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2057,14 +2104,6 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", (param1, param2, param3, param4, param5, param6, param7) -> {
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
- assertNull(value6.get());
- assertNull(value7.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
@@ -2072,12 +2111,15 @@ class HubConnectionTest {
value5.set(param5);
value6.set(param6);
value7.set(param7);
+
+ complete.onComplete();
}, String.class, String.class, String.class, boolean.class, double.class, String.class, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[\"A\", \"B\", \"C\",true,12,\"D\",\"E\"]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2089,6 +2131,7 @@ class HubConnectionTest {
@Test
public void sendWithEightParamsTriggersOnHandler() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2102,15 +2145,6 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", (param1, param2, param3, param4, param5, param6, param7, param8) -> {
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
- assertNull(value6.get());
- assertNull(value7.get());
- assertNull(value8.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
@@ -2119,11 +2153,14 @@ class HubConnectionTest {
value6.set(param6);
value7.set(param7);
value8.set(param8);
+
+ complete.onComplete();
}, String.class, String.class, String.class, boolean.class, double.class, String.class, String.class, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[\"A\", \"B\", \"C\",true,12,\"D\",\"E\",\"F\"]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2136,13 +2173,15 @@ class HubConnectionTest {
@Test
public void sendWithNoParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Integer> value = new AtomicReference<>(0);
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
- hubConnection.on("inc", () ->{
- assertEquals(Integer.valueOf(0), value.get());
+ hubConnection.on("inc", () -> {
value.getAndUpdate((val) -> val + 1);
+
+ complete.onComplete();
});
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2150,18 +2189,21 @@ class HubConnectionTest {
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Integer.valueOf(1), value.get());
}
@Test
public void sendWithParamTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value = new AtomicReference<>();
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
- hubConnection.<String>on("inc", (param) ->{
- assertNull(value.get());
+ hubConnection.<String>on("inc", (param) -> {
value.set(param);
+
+ complete.onComplete();
}, stringType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2171,23 +2213,24 @@ class HubConnectionTest {
hubConnection.send("inc", "A");
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value.get());
}
@Test
public void sendWithTwoParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<Double> value2 = new AtomicReference<>();
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
- hubConnection.<String, Double>on("inc", (param1, param2) ->{
- assertNull(value1.get());
- assertNull((value2.get()));
-
+ hubConnection.<String, Double>on("inc", (param1, param2) -> {
value1.set(param1);
value2.set(param2);
+
+ complete.onComplete();
}, stringType, doubleType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2197,12 +2240,14 @@ class HubConnectionTest {
hubConnection.send("inc", "A", 12);
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals(Double.valueOf(12), value2.get());
}
@Test
public void sendWithThreeParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2210,14 +2255,12 @@ class HubConnectionTest {
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
- hubConnection.<String, String, String>on("inc", (param1, param2, param3) ->{
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
-
+ hubConnection.<String, String, String>on("inc", (param1, param2, param3) -> {
value1.set(param1);
value2.set(param2);
value3.set(param3);
+
+ complete.onComplete();
}, stringType, stringType, stringType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2227,6 +2270,7 @@ class HubConnectionTest {
hubConnection.send("inc", "A", "B", "C");
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2234,6 +2278,7 @@ class HubConnectionTest {
@Test
public void sendWithFourParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2242,16 +2287,13 @@ class HubConnectionTest {
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
- hubConnection.<String, String, String, String>on("inc", (param1, param2, param3, param4) ->{
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
-
+ hubConnection.<String, String, String, String>on("inc", (param1, param2, param3, param4) -> {
value1.set(param1);
value2.set(param2);
value3.set(param3);
value4.set(param4);
+
+ complete.onComplete();
}, stringType, stringType, stringType, stringType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2260,6 +2302,7 @@ class HubConnectionTest {
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2267,7 +2310,8 @@ class HubConnectionTest {
}
@Test
- public void sendWithFiveParamsTriggersOnHandlerWithMessagePack() {
+ public void sendWithFiveParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2278,17 +2322,13 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
hubConnection.<String, String, String, Boolean, Double>on("inc", (param1, param2, param3, param4, param5) ->{
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
value4.set(param4);
value5.set(param5);
+
+ complete.onComplete();
}, stringType, stringType, stringType, booleanType, doubleType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2297,6 +2337,7 @@ class HubConnectionTest {
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2305,7 +2346,8 @@ class HubConnectionTest {
}
@Test
- public void sendWithSixParamsTriggersOnHandlerWithMessagePack() {
+ public void sendWithSixParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2317,19 +2359,14 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
hubConnection.<String, String, String, Boolean, Double, String>on("inc", (param1, param2, param3, param4, param5, param6) -> {
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
- assertNull(value6.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
value4.set(param4);
value5.set(param5);
value6.set(param6);
+
+ complete.onComplete();
}, stringType, stringType, stringType, booleanType, doubleType, stringType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2338,6 +2375,7 @@ class HubConnectionTest {
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2348,6 +2386,7 @@ class HubConnectionTest {
@Test
public void sendWithSevenParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2360,14 +2399,6 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
hubConnection.<String, String, String, Boolean, Double, String, String>on("inc", (param1, param2, param3, param4, param5, param6, param7) -> {
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
- assertNull(value6.get());
- assertNull(value7.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
@@ -2375,6 +2406,8 @@ class HubConnectionTest {
value5.set(param5);
value6.set(param6);
value7.set(param7);
+
+ complete.onComplete();
}, stringType, stringType, stringType, booleanType, doubleType, stringType, stringType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2384,6 +2417,7 @@ class HubConnectionTest {
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2395,6 +2429,7 @@ class HubConnectionTest {
@Test
public void sendWithEightParamsTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<String> value1 = new AtomicReference<>();
AtomicReference<String> value2 = new AtomicReference<>();
AtomicReference<String> value3 = new AtomicReference<>();
@@ -2408,15 +2443,6 @@ class HubConnectionTest {
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
hubConnection.<String, String, String, Boolean, Double, String, String, String>on("inc", (param1, param2, param3, param4, param5, param6, param7, param8) -> {
- assertNull(value1.get());
- assertNull(value2.get());
- assertNull(value3.get());
- assertNull(value4.get());
- assertNull(value5.get());
- assertNull(value6.get());
- assertNull(value7.get());
- assertNull(value8.get());
-
value1.set(param1);
value2.set(param2);
value3.set(param3);
@@ -2425,6 +2451,8 @@ class HubConnectionTest {
value6.set(param6);
value7.set(param7);
value8.set(param8);
+
+ complete.onComplete();
}, stringType, stringType, stringType, booleanType, doubleType, stringType, stringType, stringType);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2433,6 +2461,7 @@ class HubConnectionTest {
0x45, (byte) 0xA1, 0x46, (byte) 0x90 };
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals("A", value1.get());
assertEquals("B", value2.get());
assertEquals("C", value3.get());
@@ -2451,22 +2480,20 @@ class HubConnectionTest {
@Test
public void sendWithCustomObjectTriggersOnHandler() {
- AtomicReference<Custom> value1 = new AtomicReference<>();
+ SingleSubject<Custom> value1 = SingleSubject.create();
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", (param1) -> {
- assertNull(value1.get());
-
- value1.set(param1);
+ value1.onSuccess(param1);
}, Custom.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[{\"number\":1,\"str\":\"A\",\"bools\":[true,false]}]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
- Custom custom = value1.get();
+ Custom custom = value1.timeout(30, TimeUnit.SECONDS).blockingGet();
assertEquals(1, custom.number);
assertEquals("A", custom.str);
assertEquals(2, custom.bools.length);
@@ -2476,15 +2503,16 @@ class HubConnectionTest {
@Test
public void sendWithCustomObjectTriggersOnHandlerWithMessagePack() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<PersonPojo<Short>> value1 = new AtomicReference<>();
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport, true);
hubConnection.<PersonPojo<Short>>on("inc", (param1) -> {
- assertNull(value1.get());
-
value1.set(param1);
+
+ complete.onComplete();
}, (new TypeReference<PersonPojo<Short>>() { }).getType());
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2494,6 +2522,7 @@ class HubConnectionTest {
mockTransport.receiveMessage(ByteBuffer.wrap(messageBytes));
// Confirming that our handler was called and the correct message was passed in.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
PersonPojo<Short> person = value1.get();
assertEquals("John", person.getFirstName());
assertEquals("Doe", person.getLastName());
@@ -2503,27 +2532,29 @@ class HubConnectionTest {
@Test
public void throwFromOnHandlerRunsAllHandlers() {
- AtomicReference<String> value1 = new AtomicReference<>();
- AtomicReference<String> value2 = new AtomicReference<>();
+ SingleSubject<String> value1 = SingleSubject.create();
+ SingleSubject<String> value2 = SingleSubject.create();
try (TestLogger logger = new TestLogger()) {
MockTransport mockTransport = new MockTransport();
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", (param1) -> {
- value1.set(param1);
- throw new RuntimeException("throw from on handler");
+ value1.onSuccess(param1);
+ if (true) {
+ throw new RuntimeException("throw from on handler");
+ }
}, String.class);
hubConnection.on("inc", (param1) -> {
- value2.set(param1);
+ value2.onSuccess(param1);
}, String.class);
hubConnection.start().timeout(30, TimeUnit.SECONDS).blockingAwait();
mockTransport.receiveMessage("{\"type\":1,\"target\":\"inc\",\"arguments\":[\"Hello World\"]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and the correct message was passed in.
- assertEquals("Hello World", value1.get());
- assertEquals("Hello World", value2.get());
+ assertEquals("Hello World", value1.timeout(30, TimeUnit.SECONDS).blockingGet());
+ assertEquals("Hello World", value2.timeout(30, TimeUnit.SECONDS).blockingGet());
hubConnection.stop().timeout(30, TimeUnit.SECONDS).blockingAwait();
@@ -2534,13 +2565,15 @@ class HubConnectionTest {
@Test
public void receiveHandshakeResponseAndMessage() {
+ CompletableSubject complete = CompletableSubject.create();
AtomicReference<Double> value = new AtomicReference<Double>(0.0);
MockTransport mockTransport = new MockTransport(false);
HubConnection hubConnection = TestUtils.createHubConnection("http://example.com", mockTransport);
hubConnection.on("inc", () -> {
- assertEquals(Double.valueOf(0), value.get());
value.getAndUpdate((val) -> val + 1);
+
+ complete.onComplete();
});
SingleSubject<ByteBuffer> handshakeMessageTask = mockTransport.getNextSentMessage();
@@ -2553,6 +2586,7 @@ class HubConnectionTest {
mockTransport.receiveMessage("{}" + RECORD_SEPARATOR + "{\"type\":1,\"target\":\"inc\",\"arguments\":[]}" + RECORD_SEPARATOR);
// Confirming that our handler was called and that the counter property was incremented.
+ complete.timeout(30, TimeUnit.SECONDS).blockingAwait();
assertEquals(Double.valueOf(1), value.get());
}
diff --git a/src/SignalR/clients/ts/.npmrc b/src/SignalR/clients/ts/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/SignalR/clients/ts/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/SignalR/clients/ts/FunctionalTests/.npmrc b/src/SignalR/clients/ts/FunctionalTests/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/SignalR/clients/ts/FunctionalTests/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/SignalR/clients/ts/FunctionalTests/Startup.cs b/src/SignalR/clients/ts/FunctionalTests/Startup.cs
index ef67be4b91..67eb2878ad 100644
--- a/src/SignalR/clients/ts/FunctionalTests/Startup.cs
+++ b/src/SignalR/clients/ts/FunctionalTests/Startup.cs
@@ -202,7 +202,11 @@ public class Startup
// This is for testing purposes only (karma hosts the client on its own server), never do this in production
app.UseCors(policy =>
{
- policy.SetIsOriginAllowed(host => host.StartsWith("http://localhost:", StringComparison.Ordinal) || host.StartsWith("http://127.0.0.1:", StringComparison.Ordinal))
+ policy.SetIsOriginAllowed(host =>
+ host.StartsWith("http://localhost:", StringComparison.Ordinal)
+ || host.StartsWith("http://127.0.0.1:", StringComparison.Ordinal)
+ || host.StartsWith("https://localhost:", StringComparison.Ordinal)
+ || host.StartsWith("https://127.0.0.1:", StringComparison.Ordinal))
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials();
@@ -228,7 +232,7 @@ public class Startup
{
try
{
- var result = await hubContext.Clients.Single(id).InvokeAsync<int>("Result");
+ var result = await hubContext.Clients.Client(id).InvokeAsync<int>("Result", cancellationToken: default);
return result.ToString(CultureInfo.InvariantCulture);
}
catch (Exception ex)
diff --git a/src/SignalR/clients/ts/FunctionalTests/package.json b/src/SignalR/clients/ts/FunctionalTests/package.json
index 67032e21c6..19516bb10e 100644
--- a/src/SignalR/clients/ts/FunctionalTests/package.json
+++ b/src/SignalR/clients/ts/FunctionalTests/package.json
@@ -33,7 +33,7 @@
"rxjs": "^6.3.3",
"ts-node": "^8.6.2",
"typescript": "^3.7.5",
- "webpack": "^5.23.0",
+ "webpack": "^5.72.1",
"ws": " ^6.0.0"
},
"scripts": {
@@ -54,9 +54,9 @@
},
"resolutions": {
"lodash": ">=4.17.21",
- "url-parse": ">=1.5.6",
"ua-parser-js": "^0.7.30",
- "minimist": ">=1.2.6"
+ "minimist": ">=1.2.6",
+ "ws": ">=7.4.6"
},
"author": "",
"license": "MIT"
diff --git a/src/SignalR/clients/ts/FunctionalTests/ts/ConnectionTests.ts b/src/SignalR/clients/ts/FunctionalTests/ts/ConnectionTests.ts
index 9d2d6bf423..aaf622c571 100644
--- a/src/SignalR/clients/ts/FunctionalTests/ts/ConnectionTests.ts
+++ b/src/SignalR/clients/ts/FunctionalTests/ts/ConnectionTests.ts
@@ -201,6 +201,9 @@ describe("connection", () => {
const connection = new HttpConnection(USED_ECHOENDPOINT_URL + "redirect", {
...commonOptions,
httpClient,
+ // bug in eventsource makes relative redirect URLs throw an unhandled exception which fails the test
+ // https://github.com/EventSource/eventsource/issues/277
+ transport: HttpTransportType.WebSockets | HttpTransportType.LongPolling
});
connection.onreceive = async (data: any) => {
diff --git a/src/SignalR/clients/ts/FunctionalTests/ts/HubConnectionTests.ts b/src/SignalR/clients/ts/FunctionalTests/ts/HubConnectionTests.ts
index 2b9d6efacb..676aa698d1 100644
--- a/src/SignalR/clients/ts/FunctionalTests/ts/HubConnectionTests.ts
+++ b/src/SignalR/clients/ts/FunctionalTests/ts/HubConnectionTests.ts
@@ -1019,29 +1019,6 @@ describe("hubConnection", () => {
}
});
- it("populates the Content-Type header when sending XMLHttpRequest", async () => {
- // Skip test on Node as this header isn't set (it was added for React-Native)
- if (typeof window === "undefined") {
- return;
- }
- const hubConnection = getConnectionBuilder(HttpTransportType.LongPolling, TESTHUB_NOWEBSOCKETS_ENDPOINT_URL)
- .withHubProtocol(new JsonHubProtocol())
- .build();
-
- try {
- await hubConnection.start();
-
- // Check what transport was used by asking the server to tell us.
- expect(await hubConnection.invoke("GetActiveTransportName")).toEqual("LongPolling");
- // Check to see that the Content-Type header is set the expected value
- expect(await hubConnection.invoke("GetContentTypeHeader")).toEqual("text/plain;charset=UTF-8");
-
- await hubConnection.stop();
- } catch (e) {
- fail(e);
- }
- });
-
eachTransport((t) => {
it("sets the user agent header", async () => {
const hubConnection = getConnectionBuilder(t, TESTHUBENDPOINT_URL)
diff --git a/src/SignalR/clients/ts/FunctionalTests/yarn.lock b/src/SignalR/clients/ts/FunctionalTests/yarn.lock
index 2d7b05e126..3b7d860670 100644
--- a/src/SignalR/clients/ts/FunctionalTests/yarn.lock
+++ b/src/SignalR/clients/ts/FunctionalTests/yarn.lock
@@ -2,6 +2,46 @@
# yarn lockfile v1
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
"@microsoft/signalr-protocol-msgpack@link:../signalr-protocol-msgpack":
version "0.0.0"
uid ""
@@ -67,10 +107,10 @@
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-0.0.30.tgz#dc1e40f7af3b9c815013a7860e6252f6352a84df"
integrity sha512-orGL5LXERPYsLov6CWs3Fh6203+dXzJkR7OnddIr2514Hsecwc8xRpzCapshBbKFImCsvS/mk6+FWiN5LyZJAQ==
-"@types/eslint-scope@^3.7.0":
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
- integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
dependencies:
"@types/eslint" "*"
"@types/estree" "*"
@@ -83,11 +123,16 @@
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^0.0.47":
+"@types/estree@*":
version "0.0.47"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
"@types/http-cache-semantics@*":
version "4.0.1"
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812"
@@ -98,11 +143,16 @@
resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.17.tgz#65fa3be377126253f6c7988b365dfc78d62d536e"
integrity sha512-lXmY2lBjE38ASvP7ah38yZwXCdc7DTCKhHqx4J3WGNiVzp134U0BD9VKdL5x9q9AAfhnpJeQr4owL6ZOXhOpfA==
-"@types/json-schema@*", "@types/json-schema@^7.0.6":
+"@types/json-schema@*":
version "7.0.7"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
+"@types/json-schema@^7.0.8":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
"@types/karma@^6.3.1":
version "6.3.1"
resolved "https://registry.yarnpkg.com/@types/karma/-/karma-6.3.1.tgz#a9e05df4a5d898bffd619c4e109fff9e4f3c676a"
@@ -204,125 +254,125 @@
dependencies:
"@wdio/logger" "6.10.10"
-"@webassemblyjs/ast@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f"
- integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
dependencies:
- "@webassemblyjs/helper-numbers" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
-"@webassemblyjs/floating-point-hex-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c"
- integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
-"@webassemblyjs/helper-api-error@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4"
- integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
-"@webassemblyjs/helper-buffer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642"
- integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
-"@webassemblyjs/helper-numbers@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9"
- integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webassemblyjs/helper-wasm-bytecode@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1"
- integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
-"@webassemblyjs/helper-wasm-section@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b"
- integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
-"@webassemblyjs/ieee754@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf"
- integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==
+"@webassemblyjs/ieee754@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
dependencies:
"@xtuc/ieee754" "^1.2.0"
-"@webassemblyjs/leb128@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b"
- integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
dependencies:
"@xtuc/long" "4.2.2"
-"@webassemblyjs/utf8@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf"
- integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==
-
-"@webassemblyjs/wasm-edit@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78"
- integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/helper-wasm-section" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-opt" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- "@webassemblyjs/wast-printer" "1.11.0"
-
-"@webassemblyjs/wasm-gen@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe"
- integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
-"@webassemblyjs/wasm-opt@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978"
- integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
-
-"@webassemblyjs/wasm-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754"
- integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
-"@webassemblyjs/wast-printer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e"
- integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-opt" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
"@xtuc/ieee754@^1.2.0":
@@ -350,10 +400,15 @@ accepts@~1.3.4:
mime-types "~2.1.24"
negotiator "0.6.2"
-acorn@^8.2.1:
- version "8.2.4"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0"
- integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
+acorn@^8.4.1, acorn@^8.5.0:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
agent-base@5:
version "5.1.1"
@@ -623,9 +678,9 @@ buffer-fill@^1.0.0:
integrity sha1-+PeLdniYiO858gXNY39o5wISKyw=
buffer-from@^1.0.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
- integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer@^5.2.1, buffer@^5.5.0:
version "5.7.1"
@@ -1234,10 +1289,10 @@ engine.io@~6.1.0:
engine.io-parser "~5.0.0"
ws "~8.2.3"
-enhanced-resolve@^5.8.0:
- version "5.8.2"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b"
- integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==
+enhanced-resolve@^5.9.3:
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
+ integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@@ -1247,10 +1302,10 @@ ent@~2.2.0:
resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
-es-module-lexer@^0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e"
- integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
es6-error@^4.1.1:
version "4.1.1"
@@ -1282,7 +1337,7 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
-eslint-scope@^5.1.1:
+eslint-scope@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -1322,12 +1377,10 @@ events@^3.2.0:
resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
-eventsource@^1.0.7:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf"
- integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==
- dependencies:
- original "^1.0.0"
+eventsource@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
+ integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
execa@^0.7.0:
version "0.7.0"
@@ -1420,12 +1473,13 @@ fd-slicer@~1.1.0:
dependencies:
pend "~1.2.0"
-fetch-cookie@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407"
- integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==
+fetch-cookie@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.0.5.tgz#d49b0886f79c71ce927245d928b9c230a2ddc69e"
+ integrity sha512-zsX/vrrLLCrLUKS/45u/NqZDwRSyopUscM/0huSH5clYe8dmkxIiDs3g4po+f5baWiXiTAOqPMtflP80CtR5rA==
dependencies:
- tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+ set-cookie-parser "^2.4.8"
+ tough-cookie "^4.0.0"
file-type@^3.8.0:
version "3.9.0"
@@ -1695,6 +1749,11 @@ graceful-fs@^4.1.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0,
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
grapheme-splitter@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
@@ -1939,14 +1998,14 @@ jasmine@^3.2.0:
glob "^7.1.6"
jasmine-core "~3.7.0"
-jest-worker@^26.6.2:
- version "26.6.2"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
- integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
dependencies:
"@types/node" "*"
merge-stream "^2.0.0"
- supports-color "^7.0.0"
+ supports-color "^8.0.0"
json-buffer@3.0.0:
version "3.0.0"
@@ -1958,10 +2017,10 @@ json-buffer@3.0.1:
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
-json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
json-schema-traverse@^0.4.1:
version "0.4.1"
@@ -2382,12 +2441,7 @@ no-case@^3.0.4:
lower-case "^2.0.2"
tslib "^2.0.3"
-node-fetch@^2.6.1:
- version "2.6.1"
- resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
- integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
-
-node-fetch@^2.6.7:
+node-fetch@^2.6.1, node-fetch@^2.6.7:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
@@ -2457,13 +2511,6 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
-original@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
- integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
- dependencies:
- url-parse "^1.4.3"
-
os-filter-obj@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/os-filter-obj/-/os-filter-obj-2.0.0.tgz#1c0b62d5f3a2442749a2d139e6dddee6e81d8d16"
@@ -2505,13 +2552,6 @@ p-limit@^2.2.0:
dependencies:
p-try "^2.0.0"
-p-limit@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
- integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
- dependencies:
- yocto-queue "^0.1.0"
-
p-locate@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
@@ -2714,11 +2754,6 @@ query-string@^5.0.1:
object-assign "^4.1.0"
strict-uri-encode "^1.0.0"
-querystringify@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
- integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
-
quick-lru@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
@@ -2882,12 +2917,12 @@ saucelabs@^4.6.3:
tunnel "0.0.6"
yargs "^16.0.3"
-schema-utils@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef"
- integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==
+schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
dependencies:
- "@types/json-schema" "^7.0.6"
+ "@types/json-schema" "^7.0.8"
ajv "^6.12.5"
ajv-keywords "^3.5.2"
@@ -2950,13 +2985,18 @@ serialize-error@^8.0.0:
dependencies:
type-fest "^0.20.2"
-serialize-javascript@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
- integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+serialize-javascript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
dependencies:
randombytes "^2.1.0"
+set-cookie-parser@^2.4.8:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz#d0da0ed388bc8f24e706a391f9c9e252a13c58b2"
+ integrity sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==
+
setprototypeof@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
@@ -3034,15 +3074,10 @@ sort-keys@^2.0.0:
dependencies:
is-plain-obj "^1.0.0"
-source-list-map@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
- integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-
-source-map-support@^0.5.17, source-map-support@~0.5.19:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+source-map-support@^0.5.17, source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -3052,11 +3087,6 @@ source-map@^0.6.0, source-map@^0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@~0.7.2:
- version "0.7.3"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
- integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
-
sprintf-js@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
@@ -3144,13 +3174,20 @@ supports-color@^5.3.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.0.0, supports-color@^7.1.0:
+supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
tapable@^2.1.1, tapable@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b"
@@ -3190,26 +3227,26 @@ tar-stream@^2.1.4, tar-stream@^2.2.0:
inherits "^2.0.3"
readable-stream "^3.1.1"
-terser-webpack-plugin@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673"
- integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==
+terser-webpack-plugin@^5.1.3:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
+ integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==
dependencies:
- jest-worker "^26.6.2"
- p-limit "^3.1.0"
- schema-utils "^3.0.0"
- serialize-javascript "^5.0.1"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
source-map "^0.6.1"
- terser "^5.5.1"
+ terser "^5.7.2"
-terser@^5.5.1:
- version "5.7.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693"
- integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==
+terser@^5.7.2:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
commander "^2.20.0"
- source-map "~0.7.2"
- source-map-support "~0.5.19"
+ source-map-support "~0.5.20"
through@^2.3.8:
version "2.3.8"
@@ -3245,7 +3282,7 @@ toidentifier@1.0.0:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+tough-cookie@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
@@ -3257,7 +3294,7 @@ toidentifier@1.0.0:
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
- integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=
+ integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
trim-repeated@^1.0.0:
version "1.0.0"
@@ -3378,14 +3415,6 @@ url-parse-lax@^3.0.0:
dependencies:
prepend-http "^2.0.0"
-url-parse@>=1.5.6, url-parse@^1.4.3:
- version "1.5.10"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
- integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
- dependencies:
- querystringify "^2.1.1"
- requires-port "^1.0.0"
-
url-to-options@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/url-to-options/-/url-to-options-1.0.1.tgz#1505a03a289a48cbd7a434efbaeec5055f5633a9"
@@ -3416,10 +3445,10 @@ void-elements@^2.0.0:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
-watchpack@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7"
- integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
@@ -3468,49 +3497,47 @@ webdriverio@^6.7.0:
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
- integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=
+ integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
-webpack-sources@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac"
- integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==
- dependencies:
- source-list-map "^2.0.1"
- source-map "^0.6.1"
-
-webpack@^5.23.0:
- version "5.37.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.37.0.tgz#2ab00f613faf494504eb2beef278dab7493cc39d"
- integrity sha512-yvdhgcI6QkQkDe1hINBAJ1UNevqNGTVaCkD2SSJcB8rcrNNl922RI8i2DXUAuNfANoxwsiXXEA4ZPZI9q2oGLA==
- dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.47"
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/wasm-edit" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- acorn "^8.2.1"
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.72.1:
+ version "5.72.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13"
+ integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/wasm-edit" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ acorn "^8.4.1"
+ acorn-import-assertions "^1.7.6"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.8.0"
- es-module-lexer "^0.4.0"
- eslint-scope "^5.1.1"
+ enhanced-resolve "^5.9.3"
+ es-module-lexer "^0.9.0"
+ eslint-scope "5.1.1"
events "^3.2.0"
glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.4"
- json-parse-better-errors "^1.0.2"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
loader-runner "^4.2.0"
mime-types "^2.1.27"
neo-async "^2.6.2"
- schema-utils "^3.0.0"
+ schema-utils "^3.1.0"
tapable "^2.1.1"
- terser-webpack-plugin "^5.1.1"
- watchpack "^2.0.0"
- webpack-sources "^2.1.1"
+ terser-webpack-plugin "^5.1.3"
+ watchpack "^2.3.1"
+ webpack-sources "^3.2.3"
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
- integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0=
+ integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
@@ -3550,20 +3577,10 @@ wrappy@1:
dependencies:
async-limiter "~1.0.0"
-ws@^7.2.3:
- version "7.5.5"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881"
- integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==
-
-ws@^7.4.5:
- version "7.4.5"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1"
- integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==
-
-ws@~8.2.3:
- version "8.2.3"
- resolved "https://registry.yarnpkg.com/ws/-/ws-8.2.3.tgz#63a56456db1b04367d0b721a0b80cae6d8becbba"
- integrity sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==
+ws@>=7.4.6, ws@^7.2.3, ws@^7.4.5, ws@~8.2.3:
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23"
+ integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==
xmlbuilder@12.0.0:
version "12.0.0"
@@ -3621,11 +3638,6 @@ yn@3.1.1:
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
-yocto-queue@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
- integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
-
zip-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.1.0.tgz#51dd326571544e36aa3f756430b313576dc8fc79"
diff --git a/src/SignalR/clients/ts/common/.npmrc b/src/SignalR/clients/ts/common/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/SignalR/clients/ts/common/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/SignalR/clients/ts/common/package.json b/src/SignalR/clients/ts/common/package.json
index 9e72399596..33dde856c4 100644
--- a/src/SignalR/clients/ts/common/package.json
+++ b/src/SignalR/clients/ts/common/package.json
@@ -14,21 +14,21 @@
"@types/jest": "^26.0.20",
"@types/node": "^14.14.31",
"@types/webpack": "^4.41.26",
- "@typescript-eslint/eslint-plugin": "^4.23.0",
- "@typescript-eslint/parser": "^4.23.0",
- "eslint": "^7.26.0",
- "eslint-plugin-jsdoc": "^33.0.0",
+ "@typescript-eslint/eslint-plugin": "^5.26.0",
+ "@typescript-eslint/parser": "^5.26.0",
+ "eslint": "^8.16.0",
+ "eslint-plugin-jsdoc": "^39.3.2",
"inspectpack": "^4.6.1",
"jest": "^26.6.3",
"jest-junit": "^13.0.0",
"rimraf": "^3.0.2",
- "terser": "^5.6.0",
- "terser-webpack-plugin": "^5.1.1",
+ "terser": "^5.14.2",
+ "terser-webpack-plugin": "^5.3.1",
"ts-jest": "^26.5.2",
"ts-loader": "^8.0.17",
"typescript": "^4.2.2",
- "webpack": "^5.24.1",
- "webpack-cli": "^4.5.0"
+ "webpack": "^5.72.1",
+ "webpack-cli": "^4.9.2"
},
"dependencies": {},
"resolutions": {
diff --git a/src/SignalR/clients/ts/common/yarn.lock b/src/SignalR/clients/ts/common/yarn.lock
index d85d111daa..1a21bec793 100644
--- a/src/SignalR/clients/ts/common/yarn.lock
+++ b/src/SignalR/clients/ts/common/yarn.lock
@@ -2,13 +2,6 @@
# yarn lockfile v1
-"@babel/code-frame@7.12.11":
- version "7.12.11"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
- integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==
- dependencies:
- "@babel/highlight" "^7.10.4"
-
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
@@ -160,7 +153,7 @@
"@babel/traverse" "^7.14.0"
"@babel/types" "^7.14.0"
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13":
+"@babel/highlight@^7.12.13":
version "7.14.0"
resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf"
integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==
@@ -307,30 +300,44 @@
resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752"
integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==
-"@es-joy/jsdoccomment@^0.4.4":
- version "0.4.4"
- resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.4.4.tgz#8a25154156edbfc29e310943ebb17ee29122c9df"
- integrity sha512-ua4qDt9dQb4qt5OI38eCZcQZYE5Bq3P0GzgvDARdT8Lt0mAUpxKTPy8JGGqEvF77tG1irKDZ3WreeezEa3P43w==
+"@es-joy/jsdoccomment@~0.31.0":
+ version "0.31.0"
+ resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.31.0.tgz#dbc342cc38eb6878c12727985e693eaef34302bc"
+ integrity sha512-tc1/iuQcnaiSIUVad72PBierDFpsxdUHtEF/OrfqvM1CBAsIoMP51j52jTMb3dXriwhieTo289InzZj72jL3EQ==
dependencies:
- comment-parser "^1.1.5"
+ comment-parser "1.3.1"
esquery "^1.4.0"
- jsdoctypeparser "^9.0.0"
+ jsdoc-type-pratt-parser "~3.1.0"
-"@eslint/eslintrc@^0.4.1":
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.1.tgz#442763b88cecbe3ee0ec7ca6d6dd6168550cbf14"
- integrity sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==
+"@eslint/eslintrc@^1.3.0":
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.0.tgz#29f92c30bb3e771e4a2048c95fa6855392dfac4f"
+ integrity sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==
dependencies:
ajv "^6.12.4"
- debug "^4.1.1"
- espree "^7.3.0"
- globals "^12.1.0"
- ignore "^4.0.6"
+ debug "^4.3.2"
+ espree "^9.3.2"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.2.1"
- js-yaml "^3.13.1"
- minimatch "^3.0.4"
+ js-yaml "^4.1.0"
+ minimatch "^3.1.2"
strip-json-comments "^3.1.1"
+"@humanwhocodes/config-array@^0.9.2":
+ version "0.9.5"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.9.5.tgz#2cbaf9a89460da24b5ca6531b8bbfc23e1df50c7"
+ integrity sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==
+ dependencies:
+ "@humanwhocodes/object-schema" "^1.2.1"
+ debug "^4.1.1"
+ minimatch "^3.0.4"
+
+"@humanwhocodes/object-schema@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45"
+ integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==
+
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@@ -518,6 +525,46 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
+"@jridgewell/gen-mapping@^0.3.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.14"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed"
+ integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
"@nodelib/fs.scandir@2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69"
@@ -591,10 +638,10 @@
dependencies:
"@babel/types" "^7.3.0"
-"@types/eslint-scope@^3.7.0":
- version "3.7.0"
- resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.0.tgz#4792816e31119ebd506902a482caec4951fabd86"
- integrity sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==
+"@types/eslint-scope@^3.7.3":
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224"
+ integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==
dependencies:
"@types/eslint" "*"
"@types/estree" "*"
@@ -607,11 +654,16 @@
"@types/estree" "*"
"@types/json-schema" "*"
-"@types/estree@*", "@types/estree@^0.0.47":
+"@types/estree@*":
version "0.0.47"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg==
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
"@types/graceful-fs@^4.1.2":
version "4.1.5"
resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
@@ -646,11 +698,16 @@
jest-diff "^26.0.0"
pretty-format "^26.0.0"
-"@types/json-schema@*", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.6":
+"@types/json-schema@*":
version "7.0.7"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad"
integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==
+"@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
"@types/node@*":
version "15.0.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.0.2.tgz#51e9c0920d1b45936ea04341aa3e2e58d339fb67"
@@ -726,213 +783,223 @@
dependencies:
"@types/yargs-parser" "*"
-"@typescript-eslint/eslint-plugin@^4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.23.0.tgz#29d3c9c81f6200b1fd6d8454cfb007ba176cde80"
- integrity sha512-tGK1y3KIvdsQEEgq6xNn1DjiFJtl+wn8JJQiETtCbdQxw1vzjXyAaIkEmO2l6Nq24iy3uZBMFQjZ6ECf1QdgGw==
+"@typescript-eslint/eslint-plugin@^5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.26.0.tgz#c1f98ccba9d345e38992975d3ca56ed6260643c2"
+ integrity sha512-oGCmo0PqnRZZndr+KwvvAUvD3kNE4AfyoGCwOZpoCncSh4MVD06JTE8XQa2u9u+NX5CsyZMBTEc2C72zx38eYA==
dependencies:
- "@typescript-eslint/experimental-utils" "4.23.0"
- "@typescript-eslint/scope-manager" "4.23.0"
- debug "^4.1.1"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/type-utils" "5.26.0"
+ "@typescript-eslint/utils" "5.26.0"
+ debug "^4.3.4"
functional-red-black-tree "^1.0.1"
- lodash "^4.17.15"
- regexpp "^3.0.0"
- semver "^7.3.2"
- tsutils "^3.17.1"
-
-"@typescript-eslint/experimental-utils@4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz#f2059434cd6e5672bfeab2fb03b7c0a20622266f"
- integrity sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA==
- dependencies:
- "@types/json-schema" "^7.0.3"
- "@typescript-eslint/scope-manager" "4.23.0"
- "@typescript-eslint/types" "4.23.0"
- "@typescript-eslint/typescript-estree" "4.23.0"
- eslint-scope "^5.0.0"
- eslint-utils "^2.0.0"
-
-"@typescript-eslint/parser@^4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.23.0.tgz#239315d38e42e852bef43a4b0b01bef78f78911c"
- integrity sha512-wsvjksHBMOqySy/Pi2Q6UuIuHYbgAMwLczRl4YanEPKW5KVxI9ZzDYh3B5DtcZPQTGRWFJrfcbJ6L01Leybwug==
- dependencies:
- "@typescript-eslint/scope-manager" "4.23.0"
- "@typescript-eslint/types" "4.23.0"
- "@typescript-eslint/typescript-estree" "4.23.0"
- debug "^4.1.1"
-
-"@typescript-eslint/scope-manager@4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz#8792ef7eacac122e2ec8fa2d30a59b8d9a1f1ce4"
- integrity sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w==
- dependencies:
- "@typescript-eslint/types" "4.23.0"
- "@typescript-eslint/visitor-keys" "4.23.0"
-
-"@typescript-eslint/types@4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.23.0.tgz#da1654c8a5332f4d1645b2d9a1c64193cae3aa3b"
- integrity sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw==
-
-"@typescript-eslint/typescript-estree@4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz#0753b292097523852428a6f5a1aa8ccc1aae6cd9"
- integrity sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw==
- dependencies:
- "@typescript-eslint/types" "4.23.0"
- "@typescript-eslint/visitor-keys" "4.23.0"
- debug "^4.1.1"
- globby "^11.0.1"
- is-glob "^4.0.1"
- semver "^7.3.2"
- tsutils "^3.17.1"
-
-"@typescript-eslint/visitor-keys@4.23.0":
- version "4.23.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz#7215cc977bd3b4ef22467b9023594e32f9e4e455"
- integrity sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg==
- dependencies:
- "@typescript-eslint/types" "4.23.0"
- eslint-visitor-keys "^2.0.0"
-
-"@webassemblyjs/ast@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f"
- integrity sha512-kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==
- dependencies:
- "@webassemblyjs/helper-numbers" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
-
-"@webassemblyjs/floating-point-hex-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz#34d62052f453cd43101d72eab4966a022587947c"
- integrity sha512-Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==
-
-"@webassemblyjs/helper-api-error@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz#aaea8fb3b923f4aaa9b512ff541b013ffb68d2d4"
- integrity sha512-baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==
-
-"@webassemblyjs/helper-buffer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz#d026c25d175e388a7dbda9694e91e743cbe9b642"
- integrity sha512-u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==
-
-"@webassemblyjs/helper-numbers@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz#7ab04172d54e312cc6ea4286d7d9fa27c88cd4f9"
- integrity sha512-DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==
- dependencies:
- "@webassemblyjs/floating-point-hex-parser" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
+ ignore "^5.2.0"
+ regexpp "^3.2.0"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/parser@^5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.26.0.tgz#a61b14205fe2ab7533deb4d35e604add9a4ceee2"
+ integrity sha512-n/IzU87ttzIdnAH5vQ4BBDnLPly7rC5VnjN3m0xBG82HK6rhRxnCb3w/GyWbNDghPd+NktJqB/wl6+YkzZ5T5Q==
+ dependencies:
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/typescript-estree" "5.26.0"
+ debug "^4.3.4"
+
+"@typescript-eslint/scope-manager@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.26.0.tgz#44209c7f649d1a120f0717e0e82da856e9871339"
+ integrity sha512-gVzTJUESuTwiju/7NiTb4c5oqod8xt5GhMbExKsCTp6adU3mya6AGJ4Pl9xC7x2DX9UYFsjImC0mA62BCY22Iw==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/visitor-keys" "5.26.0"
+
+"@typescript-eslint/type-utils@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.26.0.tgz#937dee97702361744a3815c58991acf078230013"
+ integrity sha512-7ccbUVWGLmcRDSA1+ADkDBl5fP87EJt0fnijsMFTVHXKGduYMgienC/i3QwoVhDADUAPoytgjbZbCOMj4TY55A==
+ dependencies:
+ "@typescript-eslint/utils" "5.26.0"
+ debug "^4.3.4"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/types@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.26.0.tgz#cb204bb154d3c103d9cc4d225f311b08219469f3"
+ integrity sha512-8794JZFE1RN4XaExLWLI2oSXsVImNkl79PzTOOWt9h0UHROwJedNOD2IJyfL0NbddFllcktGIO2aOu10avQQyA==
+
+"@typescript-eslint/typescript-estree@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.26.0.tgz#16cbceedb0011c2ed4f607255f3ee1e6e43b88c3"
+ integrity sha512-EyGpw6eQDsfD6jIqmXP3rU5oHScZ51tL/cZgFbFBvWuCwrIptl+oueUZzSmLtxFuSOQ9vDcJIs+279gnJkfd1w==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/visitor-keys" "5.26.0"
+ debug "^4.3.4"
+ globby "^11.1.0"
+ is-glob "^4.0.3"
+ semver "^7.3.7"
+ tsutils "^3.21.0"
+
+"@typescript-eslint/utils@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.26.0.tgz#896b8480eb124096e99c8b240460bb4298afcfb4"
+ integrity sha512-PJFwcTq2Pt4AMOKfe3zQOdez6InIDOjUJJD3v3LyEtxHGVVRK3Vo7Dd923t/4M9hSH2q2CLvcTdxlLPjcIk3eg==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ "@typescript-eslint/scope-manager" "5.26.0"
+ "@typescript-eslint/types" "5.26.0"
+ "@typescript-eslint/typescript-estree" "5.26.0"
+ eslint-scope "^5.1.1"
+ eslint-utils "^3.0.0"
+
+"@typescript-eslint/visitor-keys@5.26.0":
+ version "5.26.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.26.0.tgz#7195f756e367f789c0e83035297c45b417b57f57"
+ integrity sha512-wei+ffqHanYDOQgg/fS6Hcar6wAWv0CUPQ3TZzOWd2BLfgP539rb49bwua8WRAs7R6kOSLn82rfEu2ro6Llt8Q==
+ dependencies:
+ "@typescript-eslint/types" "5.26.0"
+ eslint-visitor-keys "^3.3.0"
+
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webassemblyjs/helper-wasm-bytecode@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz#85fdcda4129902fe86f81abf7e7236953ec5a4e1"
- integrity sha512-MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
-"@webassemblyjs/helper-wasm-section@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz#9ce2cc89300262509c801b4af113d1ca25c1a75b"
- integrity sha512-3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
-"@webassemblyjs/ieee754@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz#46975d583f9828f5d094ac210e219441c4e6f5cf"
- integrity sha512-KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==
+"@webassemblyjs/ieee754@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
dependencies:
"@xtuc/ieee754" "^1.2.0"
-"@webassemblyjs/leb128@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.0.tgz#f7353de1df38aa201cba9fb88b43f41f75ff403b"
- integrity sha512-aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
dependencies:
"@xtuc/long" "4.2.2"
-"@webassemblyjs/utf8@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.0.tgz#86e48f959cf49e0e5091f069a709b862f5a2cadf"
- integrity sha512-A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==
-
-"@webassemblyjs/wasm-edit@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz#ee4a5c9f677046a210542ae63897094c2027cb78"
- integrity sha512-JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/helper-wasm-section" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-opt" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- "@webassemblyjs/wast-printer" "1.11.0"
-
-"@webassemblyjs/wasm-gen@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz#3cdb35e70082d42a35166988dda64f24ceb97abe"
- integrity sha512-BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
-"@webassemblyjs/wasm-opt@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz#1638ae188137f4bb031f568a413cd24d32f92978"
- integrity sha512-tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-buffer" "1.11.0"
- "@webassemblyjs/wasm-gen" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
-
-"@webassemblyjs/wasm-parser@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz#3e680b8830d5b13d1ec86cc42f38f3d4a7700754"
- integrity sha512-6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/helper-api-error" "1.11.0"
- "@webassemblyjs/helper-wasm-bytecode" "1.11.0"
- "@webassemblyjs/ieee754" "1.11.0"
- "@webassemblyjs/leb128" "1.11.0"
- "@webassemblyjs/utf8" "1.11.0"
-
-"@webassemblyjs/wast-printer@1.11.0":
- version "1.11.0"
- resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz#680d1f6a5365d6d401974a8e949e05474e1fab7e"
- integrity sha512-Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==
- dependencies:
- "@webassemblyjs/ast" "1.11.0"
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-opt" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
"@xtuc/long" "4.2.2"
-"@webpack-cli/configtest@^1.0.3":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.3.tgz#204bcff87cda3ea4810881f7ea96e5f5321b87b9"
- integrity sha512-WQs0ep98FXX2XBAfQpRbY0Ma6ADw8JR6xoIkaIiJIzClGOMqVRvPCWqndTxf28DgFopWan0EKtHtg/5W1h0Zkw==
+"@webpack-cli/configtest@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356"
+ integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==
-"@webpack-cli/info@^1.2.4":
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.4.tgz#7381fd41c9577b2d8f6c2594fad397ef49ad5573"
- integrity sha512-ogE2T4+pLhTTPS/8MM3IjHn0IYplKM4HbVNMCWA9N4NrdPzunwenpCsqKEXyejMfRu6K8mhauIPYf8ZxWG5O6g==
+"@webpack-cli/info@^1.4.1":
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea"
+ integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==
dependencies:
envinfo "^7.7.3"
-"@webpack-cli/serve@^1.4.0":
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.4.0.tgz#f84fd07bcacefe56ce762925798871092f0f228e"
- integrity sha512-xgT/HqJ+uLWGX+Mzufusl3cgjAcnqYYskaB7o0vRcwOEfuu6hMzSILQpnIzFMGsTaeaX4Nnekl+6fadLbl1/Vg==
+"@webpack-cli/serve@^1.6.1":
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe"
+ integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==
"@xtuc/ieee754@^1.2.0":
version "1.2.0"
@@ -957,25 +1024,30 @@ acorn-globals@^6.0.0:
acorn "^7.1.1"
acorn-walk "^7.1.1"
-acorn-jsx@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b"
- integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
+acorn-jsx@^5.3.2:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
+ integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==
acorn-walk@^7.1.1:
version "7.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
-acorn@^7.1.1, acorn@^7.4.0:
+acorn@^7.1.1:
version "7.4.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
-acorn@^8.1.0, acorn@^8.2.1:
- version "8.2.4"
- resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0"
- integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg==
+acorn@^8.1.0, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1:
+ version "8.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30"
+ integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==
ajv-keywords@^3.5.2:
version "3.5.2"
@@ -992,21 +1064,6 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
-ajv@^8.0.1:
- version "8.3.0"
- resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.3.0.tgz#25ee7348e32cdc4a1dbb38256bf6bdc451dd577c"
- integrity sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q==
- dependencies:
- fast-deep-equal "^3.1.1"
- json-schema-traverse "^1.0.0"
- require-from-string "^2.0.2"
- uri-js "^4.2.2"
-
-ansi-colors@^4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348"
- integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==
-
ansi-escapes@^4.2.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
@@ -1056,6 +1113,11 @@ argparse@^1.0.7:
dependencies:
sprintf-js "~1.0.2"
+argparse@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
+ integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
+
arr-diff@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -1098,11 +1160,6 @@ assign-symbols@^1.0.0:
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
-astral-regex@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31"
- integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==
-
asynckit@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
@@ -1238,7 +1295,7 @@ braces@^2.3.1:
split-string "^3.0.2"
to-regex "^3.0.1"
-braces@^3.0.1:
+braces@^3.0.1, braces@^3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
@@ -1443,11 +1500,16 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-colorette@^1.2.1, colorette@^1.2.2:
+colorette@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+colorette@^2.0.14:
+ version "2.0.16"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
+ integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==
+
combined-stream@^1.0.6, combined-stream@~1.0.6:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
@@ -1465,10 +1527,10 @@ commander@^7.0.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
-comment-parser@1.1.5, comment-parser@^1.1.5:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.1.5.tgz#453627ef8f67dbcec44e79a9bd5baa37f0bce9b2"
- integrity sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==
+comment-parser@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/comment-parser/-/comment-parser-1.3.1.tgz#3d7ea3adaf9345594aedee6563f422348f165c1b"
+ integrity sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==
component-emitter@^1.2.1:
version "1.3.0"
@@ -1557,13 +1619,20 @@ debug@^2.2.0, debug@^2.3.3:
dependencies:
ms "2.0.0"
-debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1:
+debug@^4.1.0, debug@^4.1.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
dependencies:
ms "2.1.2"
+debug@^4.3.2, debug@^4.3.4:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
decamelize@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -1691,21 +1760,14 @@ enhanced-resolve@^4.0.0:
memory-fs "^0.5.0"
tapable "^1.0.0"
-enhanced-resolve@^5.8.0:
- version "5.8.2"
- resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b"
- integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA==
+enhanced-resolve@^5.9.3:
+ version "5.9.3"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
+ integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
-enquirer@^2.3.5:
- version "2.3.6"
- resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d"
- integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==
- dependencies:
- ansi-colors "^4.1.1"
-
envinfo@^7.7.3:
version "7.8.1"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
@@ -1725,10 +1787,10 @@ error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-module-lexer@^0.4.0:
- version "0.4.1"
- resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.4.1.tgz#dda8c6a14d8f340a24e34331e0fab0cb50438e0e"
- integrity sha512-ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
escalade@^3.1.1:
version "3.1.1"
@@ -1745,6 +1807,11 @@ escape-string-regexp@^2.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
escodegen@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
@@ -1757,22 +1824,20 @@ escodegen@^2.0.0:
optionalDependencies:
source-map "~0.6.1"
-eslint-plugin-jsdoc@^33.0.0:
- version "33.3.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-33.3.0.tgz#a287db838d2cac4b36b76d99213901be6a31e9f5"
- integrity sha512-wt6I9X8JoOyUtnsafM7AWBEfLCD3BI1wR5/vTu0hti4CoZc37bB4ZX9A7DsWKbEC/xROAAcBV2VAT638w9VKyQ==
+eslint-plugin-jsdoc@^39.3.2:
+ version "39.3.2"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.3.2.tgz#b9c3becdbd860a75b8bd07bd04a0eaaad7c79403"
+ integrity sha512-RSGN94RYzIJS/WfW3l6cXzRLfJWxvJgNQZ4w0WCaxJWDJMigtwTsILEAfKqmmPkT2rwMH/s3C7G5ChDE6cwPJg==
dependencies:
- "@es-joy/jsdoccomment" "^0.4.4"
- comment-parser "1.1.5"
- debug "^4.3.1"
+ "@es-joy/jsdoccomment" "~0.31.0"
+ comment-parser "1.3.1"
+ debug "^4.3.4"
+ escape-string-regexp "^4.0.0"
esquery "^1.4.0"
- jsdoctypeparser "^9.0.0"
- lodash "^4.17.21"
- regextras "^0.7.1"
- semver "^7.3.5"
+ semver "^7.3.7"
spdx-expression-parse "^3.0.1"
-eslint-scope@^5.0.0, eslint-scope@^5.1.1:
+eslint-scope@5.1.1, eslint-scope@^5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
@@ -1780,74 +1845,80 @@ eslint-scope@^5.0.0, eslint-scope@^5.1.1:
esrecurse "^4.3.0"
estraverse "^4.1.1"
-eslint-utils@^2.0.0, eslint-utils@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27"
- integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==
+eslint-scope@^7.1.1:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+ integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
dependencies:
- eslint-visitor-keys "^1.1.0"
+ esrecurse "^4.3.0"
+ estraverse "^5.2.0"
-eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e"
- integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+eslint-utils@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672"
+ integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==
+ dependencies:
+ eslint-visitor-keys "^2.0.0"
eslint-visitor-keys@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303"
integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
-eslint@^7.26.0:
- version "7.26.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.26.0.tgz#d416fdcdcb3236cd8f282065312813f8c13982f6"
- integrity sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==
+eslint-visitor-keys@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+ integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
+
+eslint@^8.16.0:
+ version "8.16.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.16.0.tgz#6d936e2d524599f2a86c708483b4c372c5d3bbae"
+ integrity sha512-MBndsoXY/PeVTDJeWsYj7kLZ5hQpJOfMYLsF6LicLHQWbRDG19lK5jOix4DPl8yY4SUFcE3txy86OzFLWT+yoA==
dependencies:
- "@babel/code-frame" "7.12.11"
- "@eslint/eslintrc" "^0.4.1"
+ "@eslint/eslintrc" "^1.3.0"
+ "@humanwhocodes/config-array" "^0.9.2"
ajv "^6.10.0"
chalk "^4.0.0"
cross-spawn "^7.0.2"
- debug "^4.0.1"
+ debug "^4.3.2"
doctrine "^3.0.0"
- enquirer "^2.3.5"
- eslint-scope "^5.1.1"
- eslint-utils "^2.1.0"
- eslint-visitor-keys "^2.0.0"
- espree "^7.3.1"
+ escape-string-regexp "^4.0.0"
+ eslint-scope "^7.1.1"
+ eslint-utils "^3.0.0"
+ eslint-visitor-keys "^3.3.0"
+ espree "^9.3.2"
esquery "^1.4.0"
esutils "^2.0.2"
+ fast-deep-equal "^3.1.3"
file-entry-cache "^6.0.1"
functional-red-black-tree "^1.0.1"
- glob-parent "^5.0.0"
- globals "^13.6.0"
- ignore "^4.0.6"
+ glob-parent "^6.0.1"
+ globals "^13.15.0"
+ ignore "^5.2.0"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
is-glob "^4.0.0"
- js-yaml "^3.13.1"
+ js-yaml "^4.1.0"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.4.1"
- lodash "^4.17.21"
- minimatch "^3.0.4"
+ lodash.merge "^4.6.2"
+ minimatch "^3.1.2"
natural-compare "^1.4.0"
optionator "^0.9.1"
- progress "^2.0.0"
- regexpp "^3.1.0"
- semver "^7.2.1"
- strip-ansi "^6.0.0"
+ regexpp "^3.2.0"
+ strip-ansi "^6.0.1"
strip-json-comments "^3.1.0"
- table "^6.0.4"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
-espree@^7.3.0, espree@^7.3.1:
- version "7.3.1"
- resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
- integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==
+espree@^9.3.2:
+ version "9.3.2"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.2.tgz#f58f77bd334731182801ced3380a8cc859091596"
+ integrity sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==
dependencies:
- acorn "^7.4.0"
- acorn-jsx "^5.3.1"
- eslint-visitor-keys "^1.3.0"
+ acorn "^8.7.1"
+ acorn-jsx "^5.3.2"
+ eslint-visitor-keys "^3.3.0"
esprima@^4.0.0, esprima@^4.0.1:
version "4.0.1"
@@ -2010,22 +2081,21 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-glob@^3.1.1:
- version "3.2.5"
- resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661"
- integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==
+fast-glob@^3.2.9:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
+ integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==
dependencies:
"@nodelib/fs.stat" "^2.0.2"
"@nodelib/fs.walk" "^1.2.3"
- glob-parent "^5.1.0"
+ glob-parent "^5.1.2"
merge2 "^1.3.0"
- micromatch "^4.0.2"
- picomatch "^2.2.1"
+ micromatch "^4.0.4"
fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0:
version "2.1.0"
@@ -2198,13 +2268,20 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
-glob-parent@^5.0.0, glob-parent@^5.1.0:
+glob-parent@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
dependencies:
is-glob "^4.0.1"
+glob-parent@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3"
+ integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==
+ dependencies:
+ is-glob "^4.0.3"
+
glob-to-regexp@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
@@ -2227,30 +2304,23 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-globals@^12.1.0:
- version "12.4.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
- integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
- dependencies:
- type-fest "^0.8.1"
-
-globals@^13.6.0:
- version "13.8.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3"
- integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==
+globals@^13.15.0:
+ version "13.15.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac"
+ integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==
dependencies:
type-fest "^0.20.2"
-globby@^11.0.1:
- version "11.0.3"
- resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb"
- integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==
+globby@^11.1.0:
+ version "11.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
+ integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
dependencies:
array-union "^2.1.0"
dir-glob "^3.0.1"
- fast-glob "^3.1.1"
- ignore "^5.1.4"
- merge2 "^1.3.0"
+ fast-glob "^3.2.9"
+ ignore "^5.2.0"
+ merge2 "^1.4.1"
slash "^3.0.0"
graceful-fs@^4.1.2, graceful-fs@^4.2.4:
@@ -2258,6 +2328,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.4:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
growly@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -2367,15 +2442,10 @@ iconv-lite@0.4.24:
dependencies:
safer-buffer ">= 2.1.2 < 3"
-ignore@^4.0.6:
- version "4.0.6"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
- integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
-
-ignore@^5.1.4:
- version "5.1.8"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57"
- integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==
+ignore@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
+ integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
import-fresh@^3.0.0, import-fresh@^3.2.1:
version "3.3.0"
@@ -2548,6 +2618,13 @@ is-glob@^4.0.0, is-glob@^4.0.1:
dependencies:
is-extglob "^2.1.1"
+is-glob@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
is-number@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -3046,6 +3123,15 @@ jest-worker@^26.6.2:
merge-stream "^2.0.0"
supports-color "^7.0.0"
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
jest@^26.6.3:
version "26.6.3"
resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
@@ -3068,15 +3154,22 @@ js-yaml@^3.13.1:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
+ integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
+ dependencies:
+ argparse "^2.0.1"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
-jsdoctypeparser@^9.0.0:
- version "9.0.0"
- resolved "https://registry.yarnpkg.com/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz#8c97e2fb69315eb274b0f01377eaa5c940bd7b26"
- integrity sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==
+jsdoc-type-pratt-parser@~3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz#a4a56bdc6e82e5865ffd9febc5b1a227ff28e67e"
+ integrity sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==
jsdom@^16.4.0:
version "16.5.3"
@@ -3115,12 +3208,7 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-json-parse-better-errors@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
- integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
-
-json-parse-even-better-errors@^2.3.0:
+json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
@@ -3130,11 +3218,6 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
-json-schema-traverse@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
- integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
-
json-schema@0.2.3:
version "0.2.3"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
@@ -3243,17 +3326,12 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
-lodash.clonedeep@^4.5.0:
- version "4.5.0"
- resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
- integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
-
-lodash.truncate@^4.4.2:
- version "4.4.2"
- resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193"
- integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=
+lodash.merge@^4.6.2:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
+ integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
-lodash@4.x, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0:
+lodash@4.x, lodash@^4.17.19, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -3309,7 +3387,7 @@ merge-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-merge2@^1.3.0:
+merge2@^1.3.0, merge2@^1.4.1:
version "1.4.1"
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
@@ -3341,6 +3419,14 @@ micromatch@^4.0.0, micromatch@^4.0.2:
braces "^3.0.1"
picomatch "^2.2.3"
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
mime-db@1.47.0:
version "1.47.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
@@ -3365,6 +3451,13 @@ minimatch@^3.0.4:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
minimist@>=1.2.6, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.6"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44"
@@ -3576,13 +3669,6 @@ p-limit@^2.2.0:
dependencies:
p-try "^2.0.0"
-p-limit@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
- integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
- dependencies:
- yocto-queue "^0.1.0"
-
p-locate@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
@@ -3657,11 +3743,16 @@ performance-now@^2.1.0:
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
-picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3:
+picomatch@^2.0.4, picomatch@^2.2.3:
version "2.2.3"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d"
integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==
+picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
pify@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f"
@@ -3711,11 +3802,6 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
-progress@^2.0.0:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
- integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
-
prompts@^2.0.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61"
@@ -3816,15 +3902,10 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-regexpp@^3.0.0, regexpp@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2"
- integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==
-
-regextras@^0.7.1:
- version "0.7.1"
- resolved "https://registry.yarnpkg.com/regextras/-/regextras-0.7.1.tgz#be95719d5f43f9ef0b9fa07ad89b7c606995a3b2"
- integrity sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==
+regexpp@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
+ integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
remove-trailing-separator@^1.0.1:
version "1.1.0"
@@ -3888,11 +3969,6 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
-require-from-string@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
- integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
-
require-main-filename@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
@@ -4001,12 +4077,12 @@ saxes@^5.0.1:
dependencies:
xmlchars "^2.2.0"
-schema-utils@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef"
- integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==
+schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
dependencies:
- "@types/json-schema" "^7.0.6"
+ "@types/json-schema" "^7.0.8"
ajv "^6.12.5"
ajv-keywords "^3.5.2"
@@ -4020,7 +4096,7 @@ semver-compare@^1.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
-semver@7.x, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5:
+semver@7.x, semver@^7.3.2, semver@^7.3.4:
version "7.3.5"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
@@ -4032,10 +4108,17 @@ semver@^6.0.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-serialize-javascript@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
- integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+semver@^7.3.7:
+ version "7.3.7"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f"
+ integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==
+ dependencies:
+ lru-cache "^6.0.0"
+
+serialize-javascript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
dependencies:
randombytes "^2.1.0"
@@ -4103,15 +4186,6 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-slice-ansi@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
- integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==
- dependencies:
- ansi-styles "^4.0.0"
- astral-regex "^2.0.0"
- is-fullwidth-code-point "^3.0.0"
-
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -4142,11 +4216,6 @@ snapdragon@^0.8.1:
source-map-resolve "^0.5.0"
use "^3.1.0"
-source-list-map@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34"
- integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
-
source-map-resolve@^0.5.0:
version "0.5.3"
resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
@@ -4158,10 +4227,10 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
-source-map-support@^0.5.6, source-map-support@~0.5.19:
- version "0.5.19"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
- integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+source-map-support@^0.5.6, source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
dependencies:
buffer-from "^1.0.0"
source-map "^0.6.0"
@@ -4181,7 +4250,7 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-source-map@^0.7.3, source-map@~0.7.2:
+source-map@^0.7.3:
version "0.7.3"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
@@ -4331,6 +4400,13 @@ supports-color@^7.0.0, supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
supports-hyperlinks@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
@@ -4344,18 +4420,6 @@ symbol-tree@^3.2.4:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
-table@^6.0.4:
- version "6.7.1"
- resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2"
- integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==
- dependencies:
- ajv "^8.0.1"
- lodash.clonedeep "^4.5.0"
- lodash.truncate "^4.4.2"
- slice-ansi "^4.0.0"
- string-width "^4.2.0"
- strip-ansi "^6.0.0"
-
tapable@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
@@ -4374,26 +4438,26 @@ terminal-link@^2.0.0:
ansi-escapes "^4.2.1"
supports-hyperlinks "^2.0.0"
-terser-webpack-plugin@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz#7effadee06f7ecfa093dbbd3e9ab23f5f3ed8673"
- integrity sha512-5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==
+terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz#0320dcc270ad5372c1e8993fabbd927929773e54"
+ integrity sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==
dependencies:
- jest-worker "^26.6.2"
- p-limit "^3.1.0"
- schema-utils "^3.0.0"
- serialize-javascript "^5.0.1"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
source-map "^0.6.1"
- terser "^5.5.1"
+ terser "^5.7.2"
-terser@^5.5.1, terser@^5.6.0:
- version "5.7.0"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693"
- integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g==
+terser@^5.14.2, terser@^5.7.2:
+ version "5.14.2"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.14.2.tgz#9ac9f22b06994d736174f4091aa368db896f1c10"
+ integrity sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==
dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
commander "^2.20.0"
- source-map "~0.7.2"
- source-map-support "~0.5.19"
+ source-map-support "~0.5.20"
test-exclude@^6.0.0:
version "6.0.0"
@@ -4512,7 +4576,7 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tsutils@^3.17.1:
+tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==
@@ -4637,7 +4701,7 @@ uuid@^8.3.0, uuid@^8.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
-v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0:
+v8-compile-cache@^2.0.3:
version "2.3.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee"
integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==
@@ -4689,10 +4753,10 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"
-watchpack@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7"
- integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==
+watchpack@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
+ integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
@@ -4707,23 +4771,22 @@ webidl-conversions@^6.1.0:
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
-webpack-cli@^4.5.0:
- version "4.7.0"
- resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.0.tgz#3195a777f1f802ecda732f6c95d24c0004bc5a35"
- integrity sha512-7bKr9182/sGfjFm+xdZSwgQuFjgEcy0iCTIBxRUeteJ2Kr8/Wz0qNJX+jw60LU36jApt4nmMkep6+W5AKhok6g==
+webpack-cli@^4.9.2:
+ version "4.9.2"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d"
+ integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==
dependencies:
"@discoveryjs/json-ext" "^0.5.0"
- "@webpack-cli/configtest" "^1.0.3"
- "@webpack-cli/info" "^1.2.4"
- "@webpack-cli/serve" "^1.4.0"
- colorette "^1.2.1"
+ "@webpack-cli/configtest" "^1.1.1"
+ "@webpack-cli/info" "^1.4.1"
+ "@webpack-cli/serve" "^1.6.1"
+ colorette "^2.0.14"
commander "^7.0.0"
execa "^5.0.0"
fastest-levenshtein "^1.0.12"
import-local "^3.0.2"
interpret "^2.2.0"
rechoir "^0.7.0"
- v8-compile-cache "^2.2.0"
webpack-merge "^5.7.3"
webpack-merge@^5.7.3:
@@ -4734,42 +4797,40 @@ webpack-merge@^5.7.3:
clone-deep "^4.0.1"
wildcard "^2.0.0"
-webpack-sources@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-2.2.0.tgz#058926f39e3d443193b6c31547229806ffd02bac"
- integrity sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==
- dependencies:
- source-list-map "^2.0.1"
- source-map "^0.6.1"
-
-webpack@^5.24.1:
- version "5.37.0"
- resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.37.0.tgz#2ab00f613faf494504eb2beef278dab7493cc39d"
- integrity sha512-yvdhgcI6QkQkDe1hINBAJ1UNevqNGTVaCkD2SSJcB8rcrNNl922RI8i2DXUAuNfANoxwsiXXEA4ZPZI9q2oGLA==
- dependencies:
- "@types/eslint-scope" "^3.7.0"
- "@types/estree" "^0.0.47"
- "@webassemblyjs/ast" "1.11.0"
- "@webassemblyjs/wasm-edit" "1.11.0"
- "@webassemblyjs/wasm-parser" "1.11.0"
- acorn "^8.2.1"
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.72.1:
+ version "5.72.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.1.tgz#3500fc834b4e9ba573b9f430b2c0a61e1bb57d13"
+ integrity sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/wasm-edit" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ acorn "^8.4.1"
+ acorn-import-assertions "^1.7.6"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
- enhanced-resolve "^5.8.0"
- es-module-lexer "^0.4.0"
- eslint-scope "^5.1.1"
+ enhanced-resolve "^5.9.3"
+ es-module-lexer "^0.9.0"
+ eslint-scope "5.1.1"
events "^3.2.0"
glob-to-regexp "^0.4.1"
- graceful-fs "^4.2.4"
- json-parse-better-errors "^1.0.2"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
loader-runner "^4.2.0"
mime-types "^2.1.27"
neo-async "^2.6.2"
- schema-utils "^3.0.0"
+ schema-utils "^3.1.0"
tapable "^2.1.1"
- terser-webpack-plugin "^5.1.1"
- watchpack "^2.0.0"
- webpack-sources "^2.1.1"
+ terser-webpack-plugin "^5.1.3"
+ watchpack "^2.3.1"
+ webpack-sources "^3.2.3"
whatwg-encoding@^1.0.5:
version "1.0.5"
@@ -4931,8 +4992,3 @@ yargs@^16.2.0:
string-width "^4.2.0"
y18n "^5.0.5"
yargs-parser "^20.2.2"
-
-yocto-queue@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
- integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==
diff --git a/src/SignalR/clients/ts/signalr-protocol-msgpack/.npmrc b/src/SignalR/clients/ts/signalr-protocol-msgpack/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/SignalR/clients/ts/signalr-protocol-msgpack/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/SignalR/clients/ts/signalr-protocol-msgpack/package.json b/src/SignalR/clients/ts/signalr-protocol-msgpack/package.json
index 6b8cafb36c..7dbdc02dc9 100644
--- a/src/SignalR/clients/ts/signalr-protocol-msgpack/package.json
+++ b/src/SignalR/clients/ts/signalr-protocol-msgpack/package.json
@@ -49,6 +49,6 @@
},
"devDependencies": {},
"resolutions": {
- "url-parse": ">=1.5.6"
+ "ws": ">=7.4.6"
}
}
diff --git a/src/SignalR/clients/ts/signalr-protocol-msgpack/yarn.lock b/src/SignalR/clients/ts/signalr-protocol-msgpack/yarn.lock
index 47b995cca8..8d53aea974 100644
--- a/src/SignalR/clients/ts/signalr-protocol-msgpack/yarn.lock
+++ b/src/SignalR/clients/ts/signalr-protocol-msgpack/yarn.lock
@@ -23,19 +23,18 @@ event-target-shim@^5.0.0:
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
-eventsource@^1.0.7:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf"
- integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==
+eventsource@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
+ integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
+
+fetch-cookie@^2.0.3:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.0.5.tgz#d49b0886f79c71ce927245d928b9c230a2ddc69e"
+ integrity sha512-zsX/vrrLLCrLUKS/45u/NqZDwRSyopUscM/0huSH5clYe8dmkxIiDs3g4po+f5baWiXiTAOqPMtflP80CtR5rA==
dependencies:
- original "^1.0.0"
-
-fetch-cookie@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407"
- integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==
- dependencies:
- tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+ set-cookie-parser "^2.4.8"
+ tough-cookie "^4.0.0"
node-fetch@^2.6.7:
version "2.6.7"
@@ -44,13 +43,6 @@ node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
-original@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
- integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
- dependencies:
- url-parse "^1.4.3"
-
psl@^1.1.33:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -61,17 +53,12 @@ punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-querystringify@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
- integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+set-cookie-parser@^2.4.8:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.0.tgz#96b59525e1362c94335c3c761100bb6e8f2da4b0"
+ integrity sha512-cHMAtSXilfyBePduZEBVPTCftTQWz6ehWJD5YNUg4mqvRosrrjKbo4WS8JkB0/RxonMoohHm7cOGH60mDkRQ9w==
-requires-port@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
- integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
-
-"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+tough-cookie@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
@@ -90,14 +77,6 @@ universalify@^0.1.2:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-url-parse@>=1.5.6, url-parse@^1.4.3:
- version "1.5.10"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
- integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
- dependencies:
- querystringify "^2.1.1"
- requires-port "^1.0.0"
-
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -111,7 +90,7 @@ whatwg-url@^5.0.0:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
-ws@^7.4.5:
- version "7.4.5"
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1"
- integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==
+ws@>=7.4.6, ws@^7.4.5:
+ version "8.6.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.6.0.tgz#e5e9f1d9e7ff88083d0c0dd8281ea662a42c9c23"
+ integrity sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==
diff --git a/src/SignalR/clients/ts/signalr/.npmrc b/src/SignalR/clients/ts/signalr/.npmrc
new file mode 100644
index 0000000000..8701ec2998
--- /dev/null
+++ b/src/SignalR/clients/ts/signalr/.npmrc
@@ -0,0 +1 @@
+registry=https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-public-npm/npm/registry/
diff --git a/src/SignalR/clients/ts/signalr/package.json b/src/SignalR/clients/ts/signalr/package.json
index 1fdd32c78c..52c57f9863 100644
--- a/src/SignalR/clients/ts/signalr/package.json
+++ b/src/SignalR/clients/ts/signalr/package.json
@@ -44,7 +44,7 @@
"src/**/*"
],
"devDependencies": {
- "@types/eventsource": "^1.1.5",
+ "@types/eventsource": "^1.1.8",
"@types/jest": "^26.0.20",
"@types/node": "^14.14.31",
"@types/tough-cookie": "^4.0.0",
@@ -52,13 +52,12 @@
},
"dependencies": {
"abort-controller": "^3.0.0",
- "eventsource": "^1.0.7",
- "fetch-cookie": "^0.11.0",
+ "eventsource": "^2.0.2",
+ "fetch-cookie": "^2.0.3",
"node-fetch": "^2.6.7",
"ws": "^7.4.5"
},
"resolutions": {
- "ansi-regex": "5.0.1",
- "url-parse": ">=1.5.6"
+ "ansi-regex": "5.0.1"
}
}
diff --git a/src/SignalR/clients/ts/signalr/src/FetchHttpClient.ts b/src/SignalR/clients/ts/signalr/src/FetchHttpClient.ts
index b7eef31951..9dd3610aa0 100644
--- a/src/SignalR/clients/ts/signalr/src/FetchHttpClient.ts
+++ b/src/SignalR/clients/ts/signalr/src/FetchHttpClient.ts
@@ -7,7 +7,7 @@ import { CookieJar } from "@types/tough-cookie";
import { AbortError, HttpError, TimeoutError } from "./Errors";
import { HttpClient, HttpRequest, HttpResponse } from "./HttpClient";
import { ILogger, LogLevel } from "./ILogger";
-import { Platform, getGlobalThis } from "./Utils";
+import { Platform, getGlobalThis, isArrayBuffer } from "./Utils";
export class FetchHttpClient extends HttpClient {
private readonly _abortControllerType: { prototype: AbortController, new(): AbortController };
@@ -84,14 +84,26 @@ export class FetchHttpClient extends HttpClient {
}, msTimeout);
}
+ if (request.content === "") {
+ request.content = undefined;
+ }
+ if (request.content) {
+ // Explicitly setting the Content-Type header for React Native on Android platform.
+ request.headers = request.headers || {};
+ if (isArrayBuffer(request.content)) {
+ request.headers["Content-Type"] = "application/octet-stream";
+ } else {
+ request.headers["Content-Type"] = "text/plain;charset=UTF-8";
+ }
+ }
+
let response: Response;
try {
response = await this._fetchType(request.url!, {
- body: request.content!,
+ body: request.content,
cache: "no-cache",
credentials: request.withCredentials === true ? "include" : "same-origin",
headers: {
- "Content-Type": "text/plain;charset=UTF-8",
"X-Requested-With": "XMLHttpRequest",
...request.headers,
},
diff --git a/src/SignalR/clients/ts/signalr/src/XhrHttpClient.ts b/src/SignalR/clients/ts/signalr/src/XhrHttpClient.ts
index 8812d1218f..21992813c6 100644
--- a/src/SignalR/clients/ts/signalr/src/XhrHttpClient.ts
+++ b/src/SignalR/clients/ts/signalr/src/XhrHttpClient.ts
@@ -4,6 +4,7 @@
import { AbortError, HttpError, TimeoutError } from "./Errors";
import { HttpClient, HttpRequest, HttpResponse } from "./HttpClient";
import { ILogger, LogLevel } from "./ILogger";
+import { isArrayBuffer } from "./Utils";
export class XhrHttpClient extends HttpClient {
private readonly _logger: ILogger;
@@ -33,8 +34,17 @@ export class XhrHttpClient extends HttpClient {
xhr.open(request.method!, request.url!, true);
xhr.withCredentials = request.withCredentials === undefined ? true : request.withCredentials;
xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
- // Explicitly setting the Content-Type header for React Native on Android platform.
- xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
+ if (request.content === "") {
+ request.content = undefined;
+ }
+ if (request.content) {
+ // Explicitly setting the Content-Type header for React Native on Android platform.
+ if (isArrayBuffer(request.content)) {
+ xhr.setRequestHeader("Content-Type", "application/octet-stream");
+ } else {
+ xhr.setRequestHeader("Content-Type", "text/plain;charset=UTF-8");
+ }
+ }
const headers = request.headers;
if (headers) {
@@ -81,7 +91,7 @@ export class XhrHttpClient extends HttpClient {
reject(new TimeoutError());
};
- xhr.send(request.content || "");
+ xhr.send(request.content);
});
}
}
diff --git a/src/SignalR/clients/ts/signalr/tests/FetchHttpClient.test.ts b/src/SignalR/clients/ts/signalr/tests/FetchHttpClient.test.ts
index e31c0e1274..5f7432392e 100644
--- a/src/SignalR/clients/ts/signalr/tests/FetchHttpClient.test.ts
+++ b/src/SignalR/clients/ts/signalr/tests/FetchHttpClient.test.ts
@@ -17,4 +17,52 @@ describe("FetchHttpClient", () => {
expect(e).toEqual(new Error("error from test"));
}
});
+
+ it("sets Content-type header for plaintext", async () => {
+ (global.fetch as any) = (_: string, request: RequestInit) => {
+ expect((request.headers as any)!["Content-Type"]).toEqual("text/plain;charset=UTF-8")
+ throw new Error("error from test");
+ };
+ const httpClient = new FetchHttpClient(NullLogger.instance);
+
+ try {
+ await httpClient.post("/", { content: "content" });
+ } catch (e) {
+ expect(e).toEqual(new Error("error from test"));
+ }
+ });
+
+ it("sets Content-Type header for binary", async () => {
+ (global.fetch as any) = (_: string, request: RequestInit) => {
+ expect((request.headers as any)!["Content-Type"]).toEqual("application/octet-stream")
+ throw new Error("error from test");
+ };
+ const httpClient = new FetchHttpClient(NullLogger.instance);
+
+ try {
+ await httpClient.post("/", { content: new ArrayBuffer(1) });
+ } catch (e) {
+ expect(e).toEqual(new Error("error from test"));
+ }
+ });
+
+ it("does not set Content-Type header for empty content", async () => {
+ (global.fetch as any) = (_: string, request: RequestInit) => {
+ expect((request.headers as any)!["Content-Type"]).toBeUndefined()
+ throw new Error("error from test");
+ };
+ const httpClient = new FetchHttpClient(NullLogger.instance);
+
+ try {
+ await httpClient.post("/", { content: "" });
+ } catch (e) {
+ expect(e).toEqual(new Error("error from test"));
+ }
+
+ try {
+ await httpClient.post("/");
+ } catch (e) {
+ expect(e).toEqual(new Error("error from test"));
+ }
+ });
});
diff --git a/src/SignalR/clients/ts/signalr/yarn.lock b/src/SignalR/clients/ts/signalr/yarn.lock
index 1c2bf76eec..095e4a6e0f 100644
--- a/src/SignalR/clients/ts/signalr/yarn.lock
+++ b/src/SignalR/clients/ts/signalr/yarn.lock
@@ -13,10 +13,10 @@
"@types/yargs" "^15.0.0"
chalk "^4.0.0"
-"@types/eventsource@^1.1.5":
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/@types/eventsource/-/eventsource-1.1.5.tgz#408e9b45efb176c8bea672ab58c81e7ab00d24bc"
- integrity sha512-BA9q9uC2PAMkUS7DunHTxWZZaVpeNzDG8lkBxcKwzKJClfDQ4Z59/Csx7HSH/SIqFN2JWh0tAKAM6k/wRR0OZg==
+"@types/eventsource@^1.1.8":
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/@types/eventsource/-/eventsource-1.1.8.tgz#48ae1f3aaf9bb84c713038f354112cc7ceaad519"
+ integrity sha512-fJQNt9LijJCZwYvM6O30uLzdpAK9zs52Uc9iUW9M2Zsg0HQM6DLf6QysjC/wuFX+0798B8AppVMvgdO6IftPKQ==
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
version "2.0.3"
@@ -121,19 +121,18 @@ event-target-shim@^5.0.0:
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
-eventsource@^1.0.7:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.1.0.tgz#00e8ca7c92109e94b0ddf32dac677d841028cfaf"
- integrity sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==
- dependencies:
- original "^1.0.0"
+eventsource@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-2.0.2.tgz#76dfcc02930fb2ff339520b6d290da573a9e8508"
+ integrity sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==
-fetch-cookie@^0.11.0:
- version "0.11.0"
- resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407"
- integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==
+fetch-cookie@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-2.0.3.tgz#e81a364d1fb1952f4ba3aa7881025d6c4a758b15"
+ integrity sha512-Awxvuqsf0Rc4tckszW1iJpBIRrKwEiYDL/XxQkRhpCTcuQdiCN1XP9MFOyzGaGbf0MU7gjBkcgwxT7IyjpCz3g==
dependencies:
- tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+ set-cookie-parser "^2.4.8"
+ tough-cookie "^4.0.0"
has-flag@^4.0.0:
version "4.0.0"
@@ -162,13 +161,6 @@ node-fetch@^2.6.7:
dependencies:
whatwg-url "^5.0.0"
-original@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
- integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==
- dependencies:
- url-parse "^1.4.3"
-
pretty-format@^26.0.0, pretty-format@^26.6.2:
version "26.6.2"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
@@ -194,20 +186,15 @@ punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
-querystringify@^2.1.1:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
- integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
-
react-is@^17.0.1:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
-requires-port@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
- integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=
+set-cookie-parser@^2.4.8:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.4.8.tgz#d0da0ed388bc8f24e706a391f9c9e252a13c58b2"
+ integrity sha512-edRH8mBKEWNVIVMKejNnuJxleqYE/ZSdcT8/Nem9/mmosx12pctd80s2Oy00KNZzrogMZS5mauK2/ymL1bvlvg==
supports-color@^7.1.0:
version "7.2.0"
@@ -216,7 +203,7 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
-"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+tough-cookie@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
@@ -235,14 +222,6 @@ universalify@^0.1.2:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
-url-parse@>=1.5.6, url-parse@^1.4.3:
- version "1.5.10"
- resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
- integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
- dependencies:
- querystringify "^2.1.1"
- requires-port "^1.0.0"
-
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
diff --git a/src/SignalR/common/Http.Connections.Common/src/NegotiateProtocol.cs b/src/SignalR/common/Http.Connections.Common/src/NegotiateProtocol.cs
index 11cbfa1640..72b6838753 100644
--- a/src/SignalR/common/Http.Connections.Common/src/NegotiateProtocol.cs
+++ b/src/SignalR/common/Http.Connections.Common/src/NegotiateProtocol.cs
@@ -37,7 +37,7 @@ public static class NegotiateProtocol
// Use C#7.3's ReadOnlySpan<byte> optimization for static data https://vcsjones.com/2019/02/01/csharp-readonly-span-bytes-static/
// Used to detect ASP.NET SignalR Server connection attempt
- private static ReadOnlySpan<byte> ProtocolVersionPropertyNameBytes => new byte[] { (byte)'P', (byte)'r', (byte)'o', (byte)'t', (byte)'o', (byte)'c', (byte)'o', (byte)'l', (byte)'V', (byte)'e', (byte)'r', (byte)'s', (byte)'i', (byte)'o', (byte)'n' };
+ private static ReadOnlySpan<byte> ProtocolVersionPropertyNameBytes => "ProtocolVersion"u8;
/// <summary>
/// Writes the <paramref name="response"/> to the <paramref name="output"/>.
diff --git a/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilder.cs b/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilder.cs
index 969949b58d..83895be8f0 100644
--- a/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilder.cs
+++ b/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilder.cs
@@ -23,4 +23,10 @@ public sealed class ConnectionEndpointRouteBuilder : IEndpointConventionBuilder
{
_endpointConventionBuilder.Add(convention);
}
+
+ /// <inheritdoc/>
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ _endpointConventionBuilder.Finally(finalConvention);
+ }
}
diff --git a/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs b/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs
index 5e533cfce1..91e52fde4a 100644
--- a/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs
+++ b/src/SignalR/common/Http.Connections/src/ConnectionEndpointRouteBuilderExtensions.cs
@@ -127,7 +127,7 @@ public static class ConnectionEndpointRouteBuilderExtensions
return new ConnectionEndpointRouteBuilder(compositeConventionBuilder);
}
- private class CompositeEndpointConventionBuilder : IEndpointConventionBuilder
+ private sealed class CompositeEndpointConventionBuilder : IEndpointConventionBuilder
{
private readonly List<IEndpointConventionBuilder> _endpointConventionBuilders;
@@ -143,5 +143,13 @@ public static class ConnectionEndpointRouteBuilderExtensions
endpointConventionBuilder.Add(convention);
}
}
+
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ foreach (var endpointConventionBuilder in _endpointConventionBuilders)
+ {
+ endpointConventionBuilder.Finally(finalConvention);
+ }
+ }
}
}
diff --git a/src/SignalR/common/Http.Connections/src/Internal/ConnectionLogScope.cs b/src/SignalR/common/Http.Connections/src/Internal/ConnectionLogScope.cs
index 87f8ed8e98..f96ac10f43 100644
--- a/src/SignalR/common/Http.Connections/src/Internal/ConnectionLogScope.cs
+++ b/src/SignalR/common/Http.Connections/src/Internal/ConnectionLogScope.cs
@@ -6,7 +6,7 @@ using System.Globalization;
namespace Microsoft.AspNetCore.Http.Connections.Internal;
-internal class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object?>>
+internal sealed class ConnectionLogScope : IReadOnlyList<KeyValuePair<string, object?>>
{
private string? _cachedToString;
diff --git a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs
index 2e4d7a841b..5af5f316de 100644
--- a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs
+++ b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionContext.cs
@@ -633,7 +633,7 @@ internal sealed partial class HttpConnectionContext : ConnectionContext,
[LoggerMessage(5, LogLevel.Trace, "{TransportType} transport complete.", EventName = "TransportComplete")]
public static partial void TransportComplete(ILogger logger, HttpTransportType transportType);
-
+
[LoggerMessage(6, LogLevel.Trace, "Shutting down both the application and the {TransportType} transport.", EventName = "ShuttingDownTransportAndApplication")]
public static partial void ShuttingDownTransportAndApplication(ILogger logger, HttpTransportType transportType);
diff --git a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionDispatcher.cs b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionDispatcher.cs
index b004055413..7071b7f886 100644
--- a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionDispatcher.cs
+++ b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionDispatcher.cs
@@ -78,7 +78,7 @@ internal sealed partial class HttpConnectionDispatcher
// POST /{path}
await ProcessSend(context);
}
- else if (HttpMethods.IsGet(context.Request.Method))
+ else if (HttpMethods.IsGet(context.Request.Method) || HttpMethods.IsConnect(context.Request.Method))
{
// GET /{path}
await ExecuteAsync(context, connectionDelegate, options, logScope);
@@ -751,7 +751,7 @@ internal sealed partial class HttpConnectionDispatcher
response.Headers.Expires = HeaderValueEpochDate;
}
- private class EmptyServiceProvider : IServiceProvider
+ private sealed class EmptyServiceProvider : IServiceProvider
{
public static EmptyServiceProvider Instance { get; } = new EmptyServiceProvider();
public object? GetService(Type serviceType) => null;
diff --git a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionsEventSource.cs b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionsEventSource.cs
index 144a231760..1fd5cf1483 100644
--- a/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionsEventSource.cs
+++ b/src/SignalR/common/Http.Connections/src/Internal/HttpConnectionsEventSource.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Http.Connections.Internal;
-internal class HttpConnectionsEventSource : EventSource
+internal sealed class HttpConnectionsEventSource : EventSource
{
public static readonly HttpConnectionsEventSource Log = new HttpConnectionsEventSource();
diff --git a/src/SignalR/common/Http.Connections/src/PublicAPI.Unshipped.txt b/src/SignalR/common/Http.Connections/src/PublicAPI.Unshipped.txt
index 7dc5c58110..36e706a622 100644
--- a/src/SignalR/common/Http.Connections/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/common/Http.Connections/src/PublicAPI.Unshipped.txt
@@ -1 +1,2 @@
#nullable enable
+Microsoft.AspNetCore.Builder.ConnectionEndpointRouteBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finalConvention) -> void
diff --git a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj
index 34a5f17dd1..38694e211d 100644
--- a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj
+++ b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj
@@ -17,6 +17,7 @@
<Compile Include="$(SignalRSharedSourceRoot)Utf8BufferTextReader.cs" Link="Utf8BufferTextReader.cs" />
<Compile Include="$(SignalRSharedSourceRoot)Utf8BufferTextWriter.cs" Link="Utf8BufferTextWriter.cs" />
<Compile Include="$(SignalRSharedSourceRoot)ReusableUtf8JsonWriter.cs" Link="ReusableUtf8JsonWriter.cs" />
+ <Compile Include="$(SignalRSharedSourceRoot)TryGetReturnType.cs" Link="TryGetReturnType.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs b/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs
index bed3c046ff..6d726e0c2c 100644
--- a/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs
+++ b/src/SignalR/common/Protocols.Json/src/Protocol/JsonHubProtocol.cs
@@ -8,6 +8,7 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Runtime.ExceptionServices;
+using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -174,19 +175,38 @@ public sealed class JsonHubProtocol : IHubProtocol
$"Expected '{StreamIdsPropertyName}' to be of type {SystemTextJsonExtensions.GetTokenString(JsonTokenType.StartArray)}.");
}
- var newStreamIds = new List<string>();
+ List<string>? newStreamIds = null;
reader.Read();
while (reader.TokenType != JsonTokenType.EndArray)
{
+ newStreamIds ??= new();
newStreamIds.Add(reader.GetString() ?? throw new InvalidDataException($"Null value for '{StreamIdsPropertyName}' is not valid."));
reader.Read();
}
- streamIds = newStreamIds.ToArray();
+ streamIds = newStreamIds?.ToArray() ?? Array.Empty<string>();
}
else if (reader.ValueTextEquals(TargetPropertyNameBytes.EncodedUtf8Bytes))
{
+#if NETCOREAPP
+ reader.Read();
+
+ if (reader.TokenType != JsonTokenType.String)
+ {
+ throw new InvalidDataException($"Expected '{TargetPropertyName}' to be of type {JsonTokenType.String}.");
+ }
+
+ if (!reader.HasValueSequence)
+ {
+ target = binder.GetTarget(reader.ValueSpan) ?? reader.GetString();
+ }
+ else
+ {
+ target = reader.GetString();
+ }
+#else
target = reader.ReadAsString(TargetPropertyName);
+#endif
}
else if (reader.ValueTextEquals(ErrorPropertyNameBytes.EncodedUtf8Bytes))
{
@@ -210,8 +230,16 @@ public sealed class JsonHubProtocol : IHubProtocol
else
{
// If we have an invocation id already we can parse the end result
- var returnType = binder.GetReturnType(invocationId);
- result = BindType(ref reader, input, returnType);
+ var returnType = ProtocolHelper.TryGetReturnType(binder, invocationId);
+ if (returnType is null)
+ {
+ reader.Skip();
+ result = null;
+ }
+ else
+ {
+ result = BindType(ref reader, input, returnType);
+ }
}
}
else if (reader.ValueTextEquals(ItemPropertyNameBytes.EncodedUtf8Bytes))
@@ -388,8 +416,15 @@ public sealed class JsonHubProtocol : IHubProtocol
if (hasResultToken)
{
- var returnType = binder.GetReturnType(invocationId);
- result = BindType(ref resultToken, input, returnType);
+ var returnType = ProtocolHelper.TryGetReturnType(binder, invocationId);
+ if (returnType is null)
+ {
+ result = null;
+ }
+ else
+ {
+ result = BindType(ref resultToken, input, returnType);
+ }
}
message = BindCompletionMessage(invocationId, error, result, hasResult);
diff --git a/src/SignalR/common/Protocols.Json/src/PublicAPI.Shipped.txt b/src/SignalR/common/Protocols.Json/src/PublicAPI.Shipped.txt
index c9b7cb1c7b..533bc08424 100644
--- a/src/SignalR/common/Protocols.Json/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/common/Protocols.Json/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.JsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions!>! options) -> void
+Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.JsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions!>! options) -> void
Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions
Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions.JsonHubProtocolOptions() -> void
Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions.PayloadSerializerOptions.get -> System.Text.Json.JsonSerializerOptions!
diff --git a/src/SignalR/common/Protocols.Json/src/PublicAPI.Unshipped.txt b/src/SignalR/common/Protocols.Json/src/PublicAPI.Unshipped.txt
index fbff88dcd3..7dc5c58110 100644
--- a/src/SignalR/common/Protocols.Json/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/common/Protocols.Json/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.JsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions!>! options) -> void
-Microsoft.AspNetCore.SignalR.Protocol.JsonHubProtocol.JsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.JsonHubProtocolOptions!>! options) -> void
diff --git a/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj b/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj
index 69554b03f1..7d3882c020 100644
--- a/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj
+++ b/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj
@@ -12,6 +12,7 @@
<Compile Include="$(SignalRSharedSourceRoot)BinaryMessageFormatter.cs" Link="BinaryMessageFormatter.cs" />
<Compile Include="$(SignalRSharedSourceRoot)BinaryMessageParser.cs" Link="BinaryMessageParser.cs" />
<Compile Include="$(SignalRSharedSourceRoot)MemoryBufferWriter.cs" Link="Internal\MemoryBufferWriter.cs" />
+ <Compile Include="$(SignalRSharedSourceRoot)TryGetReturnType.cs" Link="TryGetReturnType.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs b/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs
index dda7dd09f2..5e825ceee2 100644
--- a/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs
+++ b/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocol.cs
@@ -76,7 +76,7 @@ public class MessagePackHubProtocol : IHubProtocol
.WithResolver(SignalRResolver.Instance)
.WithSecurity(MessagePackSecurity.UntrustedData);
- internal class SignalRResolver : IFormatterResolver
+ internal sealed class SignalRResolver : IFormatterResolver
{
public static readonly IFormatterResolver Instance = new SignalRResolver();
diff --git a/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocolWorker.cs b/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocolWorker.cs
index e665b67aa6..df0dc0c7a8 100644
--- a/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocolWorker.cs
+++ b/src/SignalR/common/Protocols.MessagePack/src/Protocol/MessagePackHubProtocolWorker.cs
@@ -10,6 +10,7 @@ using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Runtime.ExceptionServices;
+using System.Text;
using MessagePack;
using Microsoft.AspNetCore.Internal;
@@ -77,7 +78,7 @@ internal abstract class MessagePackHubProtocolWorker
invocationId = null;
}
- var target = ReadString(ref reader, "target");
+ var target = ReadString(ref reader, binder, "target");
object[]? arguments;
try
@@ -161,14 +162,21 @@ internal abstract class MessagePackHubProtocolWorker
error = ReadString(ref reader, "error");
break;
case NonVoidResult:
- var itemType = binder.GetReturnType(invocationId);
- if (itemType == typeof(RawResult))
+ var itemType = ProtocolHelper.TryGetReturnType(binder, invocationId);
+ if (itemType is null)
{
- result = new RawResult(reader.ReadRaw());
+ reader.Skip();
}
else
{
- result = DeserializeObject(ref reader, itemType, "argument");
+ if (itemType == typeof(RawResult))
+ {
+ result = new RawResult(reader.ReadRaw());
+ }
+ else
+ {
+ result = DeserializeObject(ref reader, itemType, "argument");
+ }
}
hasResult = true;
break;
@@ -569,6 +577,26 @@ internal abstract class MessagePackHubProtocolWorker
}
}
+ protected static string ReadString(ref MessagePackReader reader, IInvocationBinder binder, string field)
+ {
+ try
+ {
+#if NETCOREAPP
+ if (reader.TryReadStringSpan(out var span))
+ {
+ return binder.GetTarget(span) ?? Encoding.UTF8.GetString(span);
+ }
+ return reader.ReadString();
+#else
+ return reader.ReadString();
+#endif
+ }
+ catch (Exception ex)
+ {
+ throw new InvalidDataException($"Reading '{field}' as String failed.", ex);
+ }
+ }
+
protected static string ReadString(ref MessagePackReader reader, string field)
{
try
diff --git a/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Shipped.txt b/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Shipped.txt
index 9ceef7f408..1b3d9e6d4f 100644
--- a/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol.MessagePackHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions!>! options) -> void
+Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol.MessagePackHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions!>! options) -> void
Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions
Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions.MessagePackHubProtocolOptions() -> void
Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions.SerializerOptions.get -> MessagePack.MessagePackSerializerOptions!
diff --git a/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Unshipped.txt b/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Unshipped.txt
index 62e074329f..7dc5c58110 100644
--- a/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/common/Protocols.MessagePack/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol.MessagePackHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions!>! options) -> void
-Microsoft.AspNetCore.SignalR.Protocol.MessagePackHubProtocol.MessagePackHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.MessagePackHubProtocolOptions!>! options) -> void
diff --git a/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj b/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj
index 2167aa456d..f905437355 100644
--- a/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj
+++ b/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj
@@ -15,6 +15,7 @@
<Compile Include="$(SignalRSharedSourceRoot)Utf8BufferTextReader.cs" Link="Utf8BufferTextReader.cs" />
<Compile Include="$(SignalRSharedSourceRoot)Utf8BufferTextWriter.cs" Link="Utf8BufferTextWriter.cs" />
<Compile Include="$(SignalRSharedSourceRoot)MemoryBufferWriter.cs" Link="MemoryBufferWriter.cs" />
+ <Compile Include="$(SignalRSharedSourceRoot)TryGetReturnType.cs" Link="TryGetReturnType.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs b/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs
index 51eb9310dd..11dd9d107a 100644
--- a/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs
+++ b/src/SignalR/common/Protocols.NewtonsoftJson/src/Protocol/NewtonsoftJsonHubProtocol.cs
@@ -176,15 +176,16 @@ public class NewtonsoftJsonHubProtocol : IHubProtocol
throw new InvalidDataException($"Expected '{StreamIdsPropertyName}' to be of type {JTokenType.Array}.");
}
- var newStreamIds = new List<string>();
+ List<string>? newStreamIds = null;
reader.Read();
while (reader.TokenType != JsonToken.EndArray)
{
+ newStreamIds ??= new();
newStreamIds.Add(reader.Value?.ToString() ?? throw new InvalidDataException($"Null value for '{StreamIdsPropertyName}' is not valid."));
reader.Read();
}
- streamIds = newStreamIds.ToArray();
+ streamIds = newStreamIds?.ToArray() ?? Array.Empty<string>();
break;
case TargetPropertyName:
target = JsonUtils.ReadAsString(reader, TargetPropertyName);
@@ -208,21 +209,28 @@ public class NewtonsoftJsonHubProtocol : IHubProtocol
else
{
// If we have an invocation id already we can parse the end result
- var returnType = binder.GetReturnType(invocationId);
-
- if (!JsonUtils.ReadForType(reader, returnType))
- {
- throw new JsonReaderException("Unexpected end when reading JSON");
- }
-
- if (returnType == typeof(RawResult))
+ var returnType = ProtocolHelper.TryGetReturnType(binder, invocationId);
+ if (returnType is null)
{
- var token = JToken.Load(reader);
- result = GetRawResult(token);
+ reader.Skip();
+ result = null;
}
else
{
- result = PayloadSerializer.Deserialize(reader, returnType);
+ if (!JsonUtils.ReadForType(reader, returnType))
+ {
+ throw new JsonReaderException("Unexpected end when reading JSON");
+ }
+
+ if (returnType == typeof(RawResult))
+ {
+ var token = JToken.Load(reader);
+ result = GetRawResult(token);
+ }
+ else
+ {
+ result = PayloadSerializer.Deserialize(reader, returnType);
+ }
}
}
break;
@@ -396,14 +404,21 @@ public class NewtonsoftJsonHubProtocol : IHubProtocol
if (resultToken != null)
{
- var returnType = binder.GetReturnType(invocationId);
- if (returnType == typeof(RawResult))
+ var returnType = ProtocolHelper.TryGetReturnType(binder, invocationId);
+ if (returnType is null)
{
- result = GetRawResult(resultToken);
+ result = null;
}
else
{
- result = resultToken.ToObject(returnType, PayloadSerializer);
+ if (returnType == typeof(RawResult))
+ {
+ result = GetRawResult(resultToken);
+ }
+ else
+ {
+ result = resultToken.ToObject(returnType, PayloadSerializer);
+ }
}
}
diff --git a/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Shipped.txt b/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Shipped.txt
index dbb793453f..59f4cc718f 100644
--- a/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Shipped.txt
@@ -1,5 +1,5 @@
#nullable enable
-~Microsoft.AspNetCore.SignalR.Protocol.NewtonsoftJsonHubProtocol.NewtonsoftJsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions!>! options) -> void
+Microsoft.AspNetCore.SignalR.Protocol.NewtonsoftJsonHubProtocol.NewtonsoftJsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions!>! options) -> void
Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions
Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions.NewtonsoftJsonHubProtocolOptions() -> void
Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions.PayloadSerializerSettings.get -> Newtonsoft.Json.JsonSerializerSettings!
diff --git a/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Unshipped.txt b/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Unshipped.txt
index 85ebcf1583..7dc5c58110 100644
--- a/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/common/Protocols.NewtonsoftJson/src/PublicAPI.Unshipped.txt
@@ -1,3 +1 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.SignalR.Protocol.NewtonsoftJsonHubProtocol.NewtonsoftJsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions!>! options) -> void
-Microsoft.AspNetCore.SignalR.Protocol.NewtonsoftJsonHubProtocol.NewtonsoftJsonHubProtocol(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.NewtonsoftJsonHubProtocolOptions!>! options) -> void
diff --git a/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs b/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs
index 91c75d0ca1..9df94d2791 100644
--- a/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs
+++ b/src/SignalR/common/Shared/AsyncEnumerableAdapters.cs
@@ -27,7 +27,7 @@ internal static class AsyncEnumerableAdapters
return new ChannelAsyncEnumerator<T>(channel, cancellationToken);
}
- private class ChannelAsyncEnumerator<T> : IAsyncEnumerator<object?>
+ private sealed class ChannelAsyncEnumerator<T> : IAsyncEnumerator<object?>
{
private readonly ChannelReader<T> _channel;
private readonly CancellationToken _cancellationToken;
@@ -63,7 +63,7 @@ internal static class AsyncEnumerableAdapters
public ValueTask DisposeAsync() => default;
}
- private class CancelableTypedAsyncEnumerable<TResult> : IAsyncEnumerable<TResult>
+ private sealed class CancelableTypedAsyncEnumerable<TResult> : IAsyncEnumerable<TResult>
{
private readonly IAsyncEnumerable<TResult> _asyncEnumerable;
private readonly CancellationTokenSource _cts;
@@ -90,7 +90,7 @@ internal static class AsyncEnumerableAdapters
return enumerator;
}
- private class CancelableEnumerator<T> : IAsyncEnumerator<T>
+ private sealed class CancelableEnumerator<T> : IAsyncEnumerator<T>
{
private readonly IAsyncEnumerator<T> _asyncEnumerator;
private readonly CancellationTokenRegistration _cancellationTokenRegistration;
@@ -116,7 +116,7 @@ internal static class AsyncEnumerableAdapters
}
}
- private class BoxedAsyncEnumerator<T> : IAsyncEnumerator<object?>
+ private sealed class BoxedAsyncEnumerator<T> : IAsyncEnumerator<object?>
{
private readonly IAsyncEnumerator<T> _asyncEnumerator;
diff --git a/src/SignalR/common/Shared/ClientResultsManager.cs b/src/SignalR/common/Shared/ClientResultsManager.cs
index 68be58269e..12544fb649 100644
--- a/src/SignalR/common/Shared/ClientResultsManager.cs
+++ b/src/SignalR/common/Shared/ClientResultsManager.cs
@@ -11,7 +11,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal;
// Common type used by our HubLifetimeManager implementations to manage client results.
// Handles cancellation, cleanup, and completion, so any bugs or improvements can be made in a single place
-internal class ClientResultsManager : IInvocationBinder
+internal sealed class ClientResultsManager : IInvocationBinder
{
private readonly ConcurrentDictionary<string, (Type Type, string ConnectionId, object Tcs, Action<object, CompletionMessage> Complete)> _pendingInvocations = new();
@@ -144,7 +144,7 @@ internal class ClientResultsManager : IInvocationBinder
{
// TODO: RedisHubLifetimeManager will want to notify the other server (if there is one) about the cancellation
// so it can clean up state and potentially forward that info to the connection
- _clientResultsManager.TryCompleteResult(_connectionId, CompletionMessage.WithError(_invocationId, "Canceled"));
+ _clientResultsManager.TryCompleteResult(_connectionId, CompletionMessage.WithError(_invocationId, "Invocation canceled by the server."));
}
public new void SetResult(T result)
diff --git a/src/SignalR/common/Shared/DuplexPipe.cs b/src/SignalR/common/Shared/DuplexPipe.cs
index 7eeabd38f0..65c1f437ec 100644
--- a/src/SignalR/common/Shared/DuplexPipe.cs
+++ b/src/SignalR/common/Shared/DuplexPipe.cs
@@ -3,7 +3,7 @@
namespace System.IO.Pipelines;
-internal class DuplexPipe : IDuplexPipe
+internal sealed class DuplexPipe : IDuplexPipe
{
public DuplexPipe(PipeReader reader, PipeWriter writer)
{
diff --git a/src/SignalR/common/Shared/JsonUtils.cs b/src/SignalR/common/Shared/JsonUtils.cs
index 41aec72718..99870fd3d5 100644
--- a/src/SignalR/common/Shared/JsonUtils.cs
+++ b/src/SignalR/common/Shared/JsonUtils.cs
@@ -176,7 +176,7 @@ internal static class JsonUtils
return reader.TokenType != JsonToken.None;
}
- private class JsonArrayPool<T> : IArrayPool<T>
+ private sealed class JsonArrayPool<T> : IArrayPool<T>
{
private readonly ArrayPool<T> _inner;
diff --git a/src/SignalR/common/Shared/PipeWriterStream.cs b/src/SignalR/common/Shared/PipeWriterStream.cs
index d10f90f161..42a1a9873d 100644
--- a/src/SignalR/common/Shared/PipeWriterStream.cs
+++ b/src/SignalR/common/Shared/PipeWriterStream.cs
@@ -8,7 +8,7 @@ using System.Threading.Tasks;
namespace System.IO.Pipelines;
// Write only stream implementation for efficiently writing bytes from the request body
-internal class PipeWriterStream : Stream
+internal sealed class PipeWriterStream : Stream
{
private long _length;
private readonly PipeWriter _pipeWriter;
diff --git a/src/SignalR/common/Shared/SystemClock.cs b/src/SignalR/common/Shared/SystemClock.cs
index c5b42b58ff..124079fe93 100644
--- a/src/SignalR/common/Shared/SystemClock.cs
+++ b/src/SignalR/common/Shared/SystemClock.cs
@@ -6,7 +6,7 @@ namespace Microsoft.AspNetCore.Internal;
/// <summary>
/// Provides access to the normal system clock.
/// </summary>
-internal class SystemClock : ISystemClock
+internal sealed class SystemClock : ISystemClock
{
/// <inheritdoc />
public long CurrentTicks => Environment.TickCount64;
diff --git a/src/SignalR/common/Shared/TimerAwaitable.cs b/src/SignalR/common/Shared/TimerAwaitable.cs
index 186fc5ded5..035a75bca9 100644
--- a/src/SignalR/common/Shared/TimerAwaitable.cs
+++ b/src/SignalR/common/Shared/TimerAwaitable.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.Internal;
-internal class TimerAwaitable : IDisposable, ICriticalNotifyCompletion
+internal sealed class TimerAwaitable : IDisposable, ICriticalNotifyCompletion
{
private Timer? _timer;
private Action? _callback;
diff --git a/src/SignalR/common/Shared/TryGetReturnType.cs b/src/SignalR/common/Shared/TryGetReturnType.cs
new file mode 100644
index 0000000000..1cfcd0d189
--- /dev/null
+++ b/src/SignalR/common/Shared/TryGetReturnType.cs
@@ -0,0 +1,24 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+
+namespace Microsoft.AspNetCore.SignalR.Protocol;
+
+internal static class ProtocolHelper
+{
+ internal static Type? TryGetReturnType(IInvocationBinder binder, string invocationId)
+ {
+ try
+ {
+ return binder.GetReturnType(invocationId);
+ }
+ // GetReturnType throws if invocationId not found, this can be caused by the server canceling a client-result but the client still sending a result
+ // For now let's ignore the failure and skip parsing the result, server will log that the result wasn't expected anymore and ignore the message
+ // In the future we may want a CompletionBindingFailureMessage that we can flow to the dispatcher for handling
+ catch (Exception)
+ {
+ return null;
+ }
+ }
+}
diff --git a/src/SignalR/common/SignalR.Common/src/IInvocationBinder.cs b/src/SignalR/common/SignalR.Common/src/IInvocationBinder.cs
index e986df69ca..690f621c51 100644
--- a/src/SignalR/common/SignalR.Common/src/IInvocationBinder.cs
+++ b/src/SignalR/common/SignalR.Common/src/IInvocationBinder.cs
@@ -32,4 +32,13 @@ public interface IInvocationBinder
/// <param name="streamId">The ID of the stream the stream item is a part of.</param>
/// <returns>The <see cref="Type"/> of the item the stream contains.</returns>
Type GetStreamItemType(string streamId);
+
+#if NETCOREAPP
+ /// <summary>
+ /// Gets the <see cref="string"/> representation for the target from bytes.
+ /// </summary>
+ /// <param name="utf8Bytes">The target name as a utf8 sequence.</param>
+ /// <returns>A string that represents the target or null if the target string couldn't be determined.</returns>
+ string? GetTarget(ReadOnlySpan<byte> utf8Bytes) => null;
+#endif
}
diff --git a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj
index 967d687ba2..0aa4d053be 100644
--- a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj
+++ b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<Description>Common serialization primitives for SignalR Clients Servers</Description>
@@ -43,4 +43,9 @@
<SupportedPlatform Include="browser" />
</ItemGroup>
+ <ItemGroup>
+ <AdditionalFiles Include="PublicAPI/$(TargetFramework)/PublicAPI.Shipped.txt" />
+ <AdditionalFiles Include="PublicAPI/$(TargetFramework)/PublicAPI.Unshipped.txt" />
+ </ItemGroup>
+
</Project>
diff --git a/src/SignalR/common/SignalR.Common/src/PublicAPI.Shipped.txt b/src/SignalR/common/SignalR.Common/src/PublicAPI/net462/PublicAPI.Shipped.txt
index 644b23ecd4..644b23ecd4 100644
--- a/src/SignalR/common/SignalR.Common/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/common/SignalR.Common/src/PublicAPI/net462/PublicAPI.Shipped.txt
diff --git a/src/SignalR/common/SignalR.Common/src/PublicAPI.Unshipped.txt b/src/SignalR/common/SignalR.Common/src/PublicAPI/net462/PublicAPI.Unshipped.txt
index 76fd06c813..76fd06c813 100644
--- a/src/SignalR/common/SignalR.Common/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/common/SignalR.Common/src/PublicAPI/net462/PublicAPI.Unshipped.txt
diff --git a/src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Shipped.txt b/src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..644b23ecd4
--- /dev/null
+++ b/src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Shipped.txt
@@ -0,0 +1,98 @@
+#nullable enable
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.CancelInvocationMessageType = 5 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.CloseMessageType = 7 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.CompletionMessageType = 3 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.InvocationMessageType = 1 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.PingMessageType = 6 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.StreamInvocationMessageType = 4 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.StreamItemMessageType = 2 -> int
+Microsoft.AspNetCore.SignalR.HubException
+Microsoft.AspNetCore.SignalR.HubException.HubException() -> void
+Microsoft.AspNetCore.SignalR.HubException.HubException(string? message) -> void
+Microsoft.AspNetCore.SignalR.HubException.HubException(string? message, System.Exception? innerException) -> void
+Microsoft.AspNetCore.SignalR.HubException.HubException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
+Microsoft.AspNetCore.SignalR.IInvocationBinder
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetParameterTypes(string! methodName) -> System.Collections.Generic.IReadOnlyList<System.Type!>!
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetReturnType(string! invocationId) -> System.Type!
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetStreamItemType(string! streamId) -> System.Type!
+Microsoft.AspNetCore.SignalR.ISignalRBuilder
+Microsoft.AspNetCore.SignalR.ISignalRBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+Microsoft.AspNetCore.SignalR.Protocol.CancelInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.CancelInvocationMessage.CancelInvocationMessage(string! invocationId) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.AllowReconnect.get -> bool
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.CloseMessage(string? error) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.CloseMessage(string? error, bool allowReconnect) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.Error.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.CompletionMessage(string! invocationId, string? error, object? result, bool hasResult) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.Error.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.HasResult.get -> bool
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.Result.get -> object?
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage.HandshakeRequestMessage(string! protocol, int version) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage.Protocol.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage.Version.get -> int
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage.Error.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage.HandshakeResponseMessage(string? error) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.Headers.get -> System.Collections.Generic.IDictionary<string!, string!>?
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.Headers.set -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.HubInvocationMessage(string? invocationId) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.InvocationId.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.HubMessage
+Microsoft.AspNetCore.SignalR.Protocol.HubMessage.HubMessage() -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.Arguments.get -> object?[]!
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.HubMethodInvocationMessage(string? invocationId, string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.HubMethodInvocationMessage(string? invocationId, string! target, object?[]! arguments, string![]? streamIds) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.StreamIds.get -> string![]?
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.Target.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants
+Microsoft.AspNetCore.SignalR.Protocol.HubProtocolExtensions
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.GetMessageBytes(Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message) -> System.ReadOnlyMemory<byte>
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.IsVersionSupported(int version) -> bool
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.Name.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.TransferFormat.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.TryParseMessage(ref System.Buffers.ReadOnlySequence<byte> input, Microsoft.AspNetCore.SignalR.IInvocationBinder! binder, out Microsoft.AspNetCore.SignalR.Protocol.HubMessage? message) -> bool
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.Version.get -> int
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.WriteMessage(Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message, System.Buffers.IBufferWriter<byte>! output) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage.BindingFailure.get -> System.Runtime.ExceptionServices.ExceptionDispatchInfo!
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage.InvocationBindingFailureMessage(string? invocationId, string! target, System.Runtime.ExceptionServices.ExceptionDispatchInfo! bindingFailure) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage.Target.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.InvocationMessage(string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.InvocationMessage(string? invocationId, string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.InvocationMessage(string? invocationId, string! target, object?[]! arguments, string![]? streamIds) -> void
+Microsoft.AspNetCore.SignalR.Protocol.PingMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage.BindingFailure.get -> System.Runtime.ExceptionServices.ExceptionDispatchInfo!
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage.Id.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage.StreamBindingFailureMessage(string! id, System.Runtime.ExceptionServices.ExceptionDispatchInfo! bindingFailure) -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage.StreamInvocationMessage(string! invocationId, string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage.StreamInvocationMessage(string! invocationId, string! target, object?[]! arguments, string![]? streamIds) -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.Item.get -> object?
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.Item.set -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.StreamItemMessage(string! invocationId, object? item) -> void
+override Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.ToString() -> string!
+override Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.ToString() -> string!
+override Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage.ToString() -> string!
+override Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.ToString() -> string!
+static Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.Empty(string! invocationId) -> Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage!
+static Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.WithError(string! invocationId, string? error) -> Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage!
+static Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.WithResult(string! invocationId, object? payload) -> Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage!
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.GetSuccessfulHandshake(Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol! protocol) -> System.ReadOnlySpan<byte>
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.TryParseRequestMessage(ref System.Buffers.ReadOnlySequence<byte> buffer, out Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage? requestMessage) -> bool
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.TryParseResponseMessage(ref System.Buffers.ReadOnlySequence<byte> buffer, out Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage? responseMessage) -> bool
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.WriteRequestMessage(Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage! requestMessage, System.Buffers.IBufferWriter<byte>! output) -> void
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.WriteResponseMessage(Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage! responseMessage, System.Buffers.IBufferWriter<byte>! output) -> void
+static Microsoft.AspNetCore.SignalR.Protocol.HubProtocolExtensions.GetMessageBytes(this Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol! hubProtocol, Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message) -> byte[]!
+static readonly Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.Empty -> Microsoft.AspNetCore.SignalR.Protocol.CloseMessage!
+static readonly Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage.Empty -> Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage!
+static readonly Microsoft.AspNetCore.SignalR.Protocol.PingMessage.Instance -> Microsoft.AspNetCore.SignalR.Protocol.PingMessage!
diff --git a/src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt b/src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..abbf7421f9
--- /dev/null
+++ b/src/SignalR/common/SignalR.Common/src/PublicAPI/net7.0/PublicAPI.Unshipped.txt
@@ -0,0 +1,5 @@
+#nullable enable
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetTarget(System.ReadOnlySpan<byte> utf8Bytes) -> string?
+Microsoft.AspNetCore.SignalR.Protocol.RawResult
+Microsoft.AspNetCore.SignalR.Protocol.RawResult.RawResult(System.Buffers.ReadOnlySequence<byte> rawBytes) -> void
+Microsoft.AspNetCore.SignalR.Protocol.RawResult.RawSerializedData.get -> System.Buffers.ReadOnlySequence<byte>
diff --git a/src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt b/src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt
new file mode 100644
index 0000000000..644b23ecd4
--- /dev/null
+++ b/src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Shipped.txt
@@ -0,0 +1,98 @@
+#nullable enable
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.CancelInvocationMessageType = 5 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.CloseMessageType = 7 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.CompletionMessageType = 3 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.InvocationMessageType = 1 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.PingMessageType = 6 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.StreamInvocationMessageType = 4 -> int
+const Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants.StreamItemMessageType = 2 -> int
+Microsoft.AspNetCore.SignalR.HubException
+Microsoft.AspNetCore.SignalR.HubException.HubException() -> void
+Microsoft.AspNetCore.SignalR.HubException.HubException(string? message) -> void
+Microsoft.AspNetCore.SignalR.HubException.HubException(string? message, System.Exception? innerException) -> void
+Microsoft.AspNetCore.SignalR.HubException.HubException(System.Runtime.Serialization.SerializationInfo! info, System.Runtime.Serialization.StreamingContext context) -> void
+Microsoft.AspNetCore.SignalR.IInvocationBinder
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetParameterTypes(string! methodName) -> System.Collections.Generic.IReadOnlyList<System.Type!>!
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetReturnType(string! invocationId) -> System.Type!
+Microsoft.AspNetCore.SignalR.IInvocationBinder.GetStreamItemType(string! streamId) -> System.Type!
+Microsoft.AspNetCore.SignalR.ISignalRBuilder
+Microsoft.AspNetCore.SignalR.ISignalRBuilder.Services.get -> Microsoft.Extensions.DependencyInjection.IServiceCollection!
+Microsoft.AspNetCore.SignalR.Protocol.CancelInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.CancelInvocationMessage.CancelInvocationMessage(string! invocationId) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.AllowReconnect.get -> bool
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.CloseMessage(string? error) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.CloseMessage(string? error, bool allowReconnect) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.Error.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.CompletionMessage(string! invocationId, string? error, object? result, bool hasResult) -> void
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.Error.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.HasResult.get -> bool
+Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.Result.get -> object?
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage.HandshakeRequestMessage(string! protocol, int version) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage.Protocol.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage.Version.get -> int
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage.Error.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage.HandshakeResponseMessage(string? error) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.Headers.get -> System.Collections.Generic.IDictionary<string!, string!>?
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.Headers.set -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.HubInvocationMessage(string? invocationId) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubInvocationMessage.InvocationId.get -> string?
+Microsoft.AspNetCore.SignalR.Protocol.HubMessage
+Microsoft.AspNetCore.SignalR.Protocol.HubMessage.HubMessage() -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.Arguments.get -> object?[]!
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.HubMethodInvocationMessage(string? invocationId, string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.HubMethodInvocationMessage(string? invocationId, string! target, object?[]! arguments, string![]? streamIds) -> void
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.StreamIds.get -> string![]?
+Microsoft.AspNetCore.SignalR.Protocol.HubMethodInvocationMessage.Target.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.HubProtocolConstants
+Microsoft.AspNetCore.SignalR.Protocol.HubProtocolExtensions
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.GetMessageBytes(Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message) -> System.ReadOnlyMemory<byte>
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.IsVersionSupported(int version) -> bool
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.Name.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.TransferFormat.get -> Microsoft.AspNetCore.Connections.TransferFormat
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.TryParseMessage(ref System.Buffers.ReadOnlySequence<byte> input, Microsoft.AspNetCore.SignalR.IInvocationBinder! binder, out Microsoft.AspNetCore.SignalR.Protocol.HubMessage? message) -> bool
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.Version.get -> int
+Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol.WriteMessage(Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message, System.Buffers.IBufferWriter<byte>! output) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage.BindingFailure.get -> System.Runtime.ExceptionServices.ExceptionDispatchInfo!
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage.InvocationBindingFailureMessage(string? invocationId, string! target, System.Runtime.ExceptionServices.ExceptionDispatchInfo! bindingFailure) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationBindingFailureMessage.Target.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.InvocationMessage(string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.InvocationMessage(string? invocationId, string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.InvocationMessage(string? invocationId, string! target, object?[]! arguments, string![]? streamIds) -> void
+Microsoft.AspNetCore.SignalR.Protocol.PingMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage.BindingFailure.get -> System.Runtime.ExceptionServices.ExceptionDispatchInfo!
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage.Id.get -> string!
+Microsoft.AspNetCore.SignalR.Protocol.StreamBindingFailureMessage.StreamBindingFailureMessage(string! id, System.Runtime.ExceptionServices.ExceptionDispatchInfo! bindingFailure) -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage.StreamInvocationMessage(string! invocationId, string! target, object?[]! arguments) -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage.StreamInvocationMessage(string! invocationId, string! target, object?[]! arguments, string![]? streamIds) -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.Item.get -> object?
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.Item.set -> void
+Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.StreamItemMessage(string! invocationId, object? item) -> void
+override Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.ToString() -> string!
+override Microsoft.AspNetCore.SignalR.Protocol.InvocationMessage.ToString() -> string!
+override Microsoft.AspNetCore.SignalR.Protocol.StreamInvocationMessage.ToString() -> string!
+override Microsoft.AspNetCore.SignalR.Protocol.StreamItemMessage.ToString() -> string!
+static Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.Empty(string! invocationId) -> Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage!
+static Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.WithError(string! invocationId, string? error) -> Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage!
+static Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage.WithResult(string! invocationId, object? payload) -> Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage!
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.GetSuccessfulHandshake(Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol! protocol) -> System.ReadOnlySpan<byte>
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.TryParseRequestMessage(ref System.Buffers.ReadOnlySequence<byte> buffer, out Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage? requestMessage) -> bool
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.TryParseResponseMessage(ref System.Buffers.ReadOnlySequence<byte> buffer, out Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage? responseMessage) -> bool
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.WriteRequestMessage(Microsoft.AspNetCore.SignalR.Protocol.HandshakeRequestMessage! requestMessage, System.Buffers.IBufferWriter<byte>! output) -> void
+static Microsoft.AspNetCore.SignalR.Protocol.HandshakeProtocol.WriteResponseMessage(Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage! responseMessage, System.Buffers.IBufferWriter<byte>! output) -> void
+static Microsoft.AspNetCore.SignalR.Protocol.HubProtocolExtensions.GetMessageBytes(this Microsoft.AspNetCore.SignalR.Protocol.IHubProtocol! hubProtocol, Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message) -> byte[]!
+static readonly Microsoft.AspNetCore.SignalR.Protocol.CloseMessage.Empty -> Microsoft.AspNetCore.SignalR.Protocol.CloseMessage!
+static readonly Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage.Empty -> Microsoft.AspNetCore.SignalR.Protocol.HandshakeResponseMessage!
+static readonly Microsoft.AspNetCore.SignalR.Protocol.PingMessage.Instance -> Microsoft.AspNetCore.SignalR.Protocol.PingMessage!
diff --git a/src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt b/src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
new file mode 100644
index 0000000000..76fd06c813
--- /dev/null
+++ b/src/SignalR/common/SignalR.Common/src/PublicAPI/netstandard2.0/PublicAPI.Unshipped.txt
@@ -0,0 +1,4 @@
+#nullable enable
+Microsoft.AspNetCore.SignalR.Protocol.RawResult
+Microsoft.AspNetCore.SignalR.Protocol.RawResult.RawResult(System.Buffers.ReadOnlySequence<byte> rawBytes) -> void
+Microsoft.AspNetCore.SignalR.Protocol.RawResult.RawSerializedData.get -> System.Buffers.ReadOnlySequence<byte>
diff --git a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs
index deccbb188e..59e765acf0 100644
--- a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs
+++ b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/JsonHubProtocolTestsBase.cs
@@ -1,16 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Buffers;
-using System.Collections.Generic;
using System.Globalization;
-using System.IO;
-using System.Linq;
using System.Text;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.SignalR.Protocol;
-using Xunit;
namespace Microsoft.AspNetCore.SignalR.Common.Tests.Internal.Protocol;
@@ -194,6 +189,18 @@ public abstract class JsonHubProtocolTestsBase
Assert.Equal(expectedMessage, ex.Message);
}
+ [Fact]
+ public void EmptyStreamIdsDoesNotAllocateNewArray()
+ {
+ var testData = Frame("{\"type\":1,\"target\":\"Target\",\"arguments\":[],\"streamIds\":[]}");
+
+ var binder = new TestBinder(Array.Empty<Type>(), typeof(object));
+ var data = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(testData));
+ JsonHubProtocol.TryParseMessage(ref data, binder, out var message);
+ Assert.IsType<InvocationMessage>(message);
+ Assert.Same(Array.Empty<string>(), (message as InvocationMessage).StreamIds);
+ }
+
[Theory]
[MemberData(nameof(OutOfOrderJsonTestDataNames))]
public void ParseOutOfOrderJson(string outOfOrderJsonTestDataName)
@@ -448,6 +455,19 @@ public abstract class JsonHubProtocolTestsBase
}
}
+ [Fact]
+ public void UnexpectedClientResultGivesEmptyCompletionMessage()
+ {
+ var binder = new TestBinder();
+ var message = Frame("{\"type\":3,\"result\":1,\"invocationId\":\"1\"}");
+ var data = new ReadOnlySequence<byte>(Encoding.UTF8.GetBytes(message));
+ Assert.True(JsonHubProtocol.TryParseMessage(ref data, binder, out var hubMessage));
+
+ var completion = Assert.IsType<CompletionMessage>(hubMessage);
+ Assert.Null(completion.Result);
+ Assert.Equal("1", completion.InvocationId);
+ }
+
public static string Frame(string input)
{
var data = Encoding.UTF8.GetBytes(input);
diff --git a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTests.cs b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTests.cs
index 978d729cc4..647f50cd33 100644
--- a/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTests.cs
+++ b/src/SignalR/common/SignalR.Common/test/Internal/Protocol/MessagePackHubProtocolTests.cs
@@ -1,15 +1,9 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
using System.Buffers;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
using Microsoft.AspNetCore.Internal;
using Microsoft.AspNetCore.SignalR.Protocol;
-using Xunit;
namespace Microsoft.AspNetCore.SignalR.Common.Tests.Internal.Protocol;
@@ -249,6 +243,19 @@ public class MessagePackHubProtocolTests : MessagePackHubProtocolTestBase
}
}
+ [Fact]
+ public void UnexpectedClientResultGivesEmptyCompletionMessage()
+ {
+ var binder = new TestBinder();
+ var input = Frame(Convert.FromBase64String("lQOAo3h5egPA"));
+ var data = new ReadOnlySequence<byte>(input);
+ Assert.True(HubProtocol.TryParseMessage(ref data, binder, out var hubMessage));
+
+ var completion = Assert.IsType<CompletionMessage>(hubMessage);
+ Assert.Null(completion.Result);
+ Assert.Equal("xyz", completion.InvocationId);
+ }
+
public class ClientResultTestData
{
public string Name { get; }
diff --git a/src/SignalR/perf/Microbenchmarks/RedisHubLifetimeManagerBenchmark.cs b/src/SignalR/perf/Microbenchmarks/RedisHubLifetimeManagerBenchmark.cs
index 45ceb9ce4a..9c3be2711f 100644
--- a/src/SignalR/perf/Microbenchmarks/RedisHubLifetimeManagerBenchmark.cs
+++ b/src/SignalR/perf/Microbenchmarks/RedisHubLifetimeManagerBenchmark.cs
@@ -166,7 +166,7 @@ public class RedisHubLifetimeManagerBenchmark
{
}
- private class WrappedHubProtocol : IHubProtocol
+ private sealed class WrappedHubProtocol : IHubProtocol
{
private readonly string _name;
private readonly IHubProtocol _innerProtocol;
diff --git a/src/SignalR/perf/Microbenchmarks/RedisProtocolBenchmark.cs b/src/SignalR/perf/Microbenchmarks/RedisProtocolBenchmark.cs
index 98c38dbd39..a4fb2961c5 100644
--- a/src/SignalR/perf/Microbenchmarks/RedisProtocolBenchmark.cs
+++ b/src/SignalR/perf/Microbenchmarks/RedisProtocolBenchmark.cs
@@ -119,7 +119,7 @@ public class RedisProtocolBenchmark
return ids;
}
- private class DummyProtocol : IHubProtocol
+ private sealed class DummyProtocol : IHubProtocol
{
private static readonly byte[] _fixedOutput = new byte[] { 0x68, 0x68, 0x6C, 0x6C, 0x6F };
diff --git a/src/SignalR/perf/Microbenchmarks/TypedClientBuilderBenchmark.cs b/src/SignalR/perf/Microbenchmarks/TypedClientBuilderBenchmark.cs
index dc41a8e46c..691dd526a7 100644
--- a/src/SignalR/perf/Microbenchmarks/TypedClientBuilderBenchmark.cs
+++ b/src/SignalR/perf/Microbenchmarks/TypedClientBuilderBenchmark.cs
@@ -18,7 +18,7 @@ public class TypedClientBuilderBenchmark
public interface ITestClient { }
- private class DummyProxy : IClientProxy
+ private sealed class DummyProxy : IClientProxy
{
public Task SendCoreAsync(string method, object[] args, CancellationToken cancellationToken = default)
{
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Commands/AgentCommand.cs b/src/SignalR/perf/benchmarkapps/Crankier/Commands/AgentCommand.cs
index 9b64ab7c66..18c66e3680 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Commands/AgentCommand.cs
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Commands/AgentCommand.cs
@@ -7,7 +7,7 @@ using static Microsoft.AspNetCore.SignalR.Crankier.Commands.CommandLineUtilities
namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
{
- internal class AgentCommand
+ internal sealed class AgentCommand
{
public static void Register(CommandLineApplication app)
{
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Commands/LocalCommand.cs b/src/SignalR/perf/benchmarkapps/Crankier/Commands/LocalCommand.cs
index 7dc7d26411..d6c5d0b410 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Commands/LocalCommand.cs
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Commands/LocalCommand.cs
@@ -10,7 +10,7 @@ using static Microsoft.AspNetCore.SignalR.Crankier.Commands.CommandLineUtilities
namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
{
- internal class LocalCommand
+ internal sealed class LocalCommand
{
public static void Register(CommandLineApplication app)
{
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs b/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs
index 5dc109b2c4..7ed72032c7 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Commands/ServerCommand.cs
@@ -15,7 +15,7 @@ using System.Collections.Generic;
namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
{
- internal class ServerCommand
+ internal sealed class ServerCommand
{
public static void Register(CommandLineApplication app)
{
diff --git a/src/SignalR/perf/benchmarkapps/Crankier/Commands/WorkerCommand.cs b/src/SignalR/perf/benchmarkapps/Crankier/Commands/WorkerCommand.cs
index 5a5c88c453..2647cb5c72 100644
--- a/src/SignalR/perf/benchmarkapps/Crankier/Commands/WorkerCommand.cs
+++ b/src/SignalR/perf/benchmarkapps/Crankier/Commands/WorkerCommand.cs
@@ -11,7 +11,7 @@ using static Microsoft.AspNetCore.SignalR.Crankier.Commands.CommandLineUtilities
namespace Microsoft.AspNetCore.SignalR.Crankier.Commands
{
- internal class WorkerCommand
+ internal sealed class WorkerCommand
{
public static void Register(CommandLineApplication app)
{
diff --git a/src/SignalR/samples/SignalRSamples/Hubs/Streaming.cs b/src/SignalR/samples/SignalRSamples/Hubs/Streaming.cs
index b11c5d9ae3..bdcaec5abb 100644
--- a/src/SignalR/samples/SignalRSamples/Hubs/Streaming.cs
+++ b/src/SignalR/samples/SignalRSamples/Hubs/Streaming.cs
@@ -14,7 +14,7 @@ public class Streaming : Hub
for (var i = 0; i < count; i++)
{
yield return i;
- await Task.Delay((int)delay);
+ await Task.Delay(TimeSpan.FromMilliseconds(delay));
}
}
@@ -27,7 +27,7 @@ public class Streaming : Hub
return observable.AsChannelReader(Context.ConnectionAborted);
}
- public ChannelReader<int> ChannelCounter(int count, int delay)
+ public ChannelReader<int> ChannelCounter(int count, double delay)
{
var channel = Channel.CreateUnbounded<int>();
@@ -36,7 +36,7 @@ public class Streaming : Hub
for (var i = 0; i < count; i++)
{
await channel.Writer.WriteAsync(i);
- await Task.Delay(delay);
+ await Task.Delay(TimeSpan.FromMilliseconds(delay));
}
channel.Writer.TryComplete();
diff --git a/src/SignalR/samples/SocialWeather/SocialWeather.csproj b/src/SignalR/samples/SocialWeather/SocialWeather.csproj
index fe8e362e2c..77f1c99b7a 100644
--- a/src/SignalR/samples/SocialWeather/SocialWeather.csproj
+++ b/src/SignalR/samples/SocialWeather/SocialWeather.csproj
@@ -3,6 +3,8 @@
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
<GenerateRazorAssemblyInfo>false</GenerateRazorAssemblyInfo>
+ <!-- Suppress warnings about lowercase variable names in generated code -->
+ <NoWarn>$(NoWarn);CS8981</NoWarn>
</PropertyGroup>
<ItemGroup>
diff --git a/src/SignalR/server/Core/src/ClientProxyExtensions.cs b/src/SignalR/server/Core/src/ClientProxyExtensions.cs
index 7b2f0c8c8b..c7716ef8af 100644
--- a/src/SignalR/server/Core/src/ClientProxyExtensions.cs
+++ b/src/SignalR/server/Core/src/ClientProxyExtensions.cs
@@ -227,7 +227,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, Array.Empty<object>(), cancellationToken);
}
@@ -241,7 +241,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1 }, cancellationToken);
}
@@ -256,7 +256,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2 }, cancellationToken);
}
@@ -272,7 +272,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3 }, cancellationToken);
}
@@ -289,7 +289,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4 }, cancellationToken);
}
@@ -307,7 +307,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4, arg5 }, cancellationToken);
}
@@ -326,7 +326,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4, arg5, arg6 }, cancellationToken);
}
@@ -346,7 +346,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7 }, cancellationToken);
}
@@ -367,7 +367,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 }, cancellationToken);
}
@@ -389,7 +389,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9 }, cancellationToken);
}
@@ -412,7 +412,7 @@ public static class ClientProxyExtensions
/// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke.</returns>
[SuppressMessage("ApiDesign", "RS0026:Do not add multiple overloads with optional parameters", Justification = "Required to maintain compatibility")]
- public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, CancellationToken cancellationToken = default)
+ public static Task<T> InvokeAsync<T>(this ISingleClientProxy clientProxy, string method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, CancellationToken cancellationToken)
{
return clientProxy.InvokeCoreAsync<T>(method, new[] { arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10 }, cancellationToken);
}
diff --git a/src/SignalR/server/Core/src/DefaultHubLifetimeManager.cs b/src/SignalR/server/Core/src/DefaultHubLifetimeManager.cs
index 08b4d0f632..230af87fc3 100644
--- a/src/SignalR/server/Core/src/DefaultHubLifetimeManager.cs
+++ b/src/SignalR/server/Core/src/DefaultHubLifetimeManager.cs
@@ -51,6 +51,11 @@ public class DefaultHubLifetimeManager<THub> : HubLifetimeManager<THub> where TH
}
_groups.Add(connection, groupName);
+ // Connection disconnected while adding to group, remove it in case the Add was called after OnDisconnectedAsync removed items from the group
+ if (connection.ConnectionAborted.IsCancellationRequested)
+ {
+ _groups.Remove(connection.ConnectionId, groupName);
+ }
return Task.CompletedTask;
}
@@ -321,7 +326,7 @@ public class DefaultHubLifetimeManager<THub> : HubLifetimeManager<THub> where TH
}
/// <inheritdoc/>
- public override async Task<T> InvokeConnectionAsync<T>(string connectionId, string methodName, object?[] args, CancellationToken cancellationToken = default)
+ public override async Task<T> InvokeConnectionAsync<T>(string connectionId, string methodName, object?[] args, CancellationToken cancellationToken)
{
if (connectionId == null)
{
@@ -336,6 +341,7 @@ public class DefaultHubLifetimeManager<THub> : HubLifetimeManager<THub> where TH
}
var invocationId = Interlocked.Increment(ref _lastInvocationId).ToString(NumberFormatInfo.InvariantInfo);
+
using var _ = CancellationTokenUtils.CreateLinkedToken(cancellationToken,
connection.ConnectionAborted, out var linkedToken);
var task = _clientResultsManager.AddInvocation<T>(connectionId, invocationId, linkedToken);
diff --git a/src/SignalR/server/Core/src/HubConnectionContext.cs b/src/SignalR/server/Core/src/HubConnectionContext.cs
index 04e211d74f..5ac7769617 100644
--- a/src/SignalR/server/Core/src/HubConnectionContext.cs
+++ b/src/SignalR/server/Core/src/HubConnectionContext.cs
@@ -79,12 +79,8 @@ public partial class HubConnectionContext
_systemClock = contextOptions.SystemClock ?? new SystemClock();
_lastSendTick = _systemClock.CurrentTicks;
- // We'll be avoiding using the semaphore when the limit is set to 1, so no need to allocate it
var maxInvokeLimit = contextOptions.MaximumParallelInvocations;
- if (maxInvokeLimit != 1)
- {
- ActiveInvocationLimit = new SemaphoreSlim(maxInvokeLimit, maxInvokeLimit);
- }
+ ActiveInvocationLimit = new ChannelBasedSemaphore(maxInvokeLimit);
}
internal StreamTracker StreamTracker
@@ -102,11 +98,10 @@ public partial class HubConnectionContext
}
internal HubCallerContext HubCallerContext { get; }
- internal HubCallerClients HubCallerClients { get; set; } = null!;
internal Exception? CloseException { get; private set; }
- internal SemaphoreSlim? ActiveInvocationLimit { get; }
+ internal ChannelBasedSemaphore ActiveInvocationLimit { get; }
/// <summary>
/// Gets a <see cref="CancellationToken"/> that notifies when the connection is aborted.
diff --git a/src/SignalR/server/Core/src/HubConnectionHandler.cs b/src/SignalR/server/Core/src/HubConnectionHandler.cs
index 3bb5566e6a..3269d6f7af 100644
--- a/src/SignalR/server/Core/src/HubConnectionHandler.cs
+++ b/src/SignalR/server/Core/src/HubConnectionHandler.cs
@@ -200,6 +200,9 @@ public class HubConnectionHandler<THub> : ConnectionHandler where THub : Hub
// Ensure the connection is aborted before firing disconnect
await connection.AbortAsync();
+ // If a client result is requested in OnDisconnectedAsync we want to avoid the SemaphoreFullException and get the better connection disconnected IOException
+ _ = connection.ActiveInvocationLimit.TryAcquire();
+
try
{
await _dispatcher.OnDisconnectedAsync(connection, exception);
diff --git a/src/SignalR/server/Core/src/HubLifetimeManager.cs b/src/SignalR/server/Core/src/HubLifetimeManager.cs
index 14a2941908..f1bc8b0580 100644
--- a/src/SignalR/server/Core/src/HubLifetimeManager.cs
+++ b/src/SignalR/server/Core/src/HubLifetimeManager.cs
@@ -142,9 +142,9 @@ public abstract class HubLifetimeManager<THub> where THub : Hub
/// <param name="connectionId">The connection ID.</param>
/// <param name="methodName">The invocation method name.</param>
/// <param name="args">The invocation arguments.</param>
- /// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
+ /// <param name="cancellationToken">The token to monitor for cancellation requests. It is recommended to set a max wait for expecting a result.</param>
/// <returns>The response from the connection.</returns>
- public virtual Task<T> InvokeConnectionAsync<T>(string connectionId, string methodName, object?[] args, CancellationToken cancellationToken = default)
+ public virtual Task<T> InvokeConnectionAsync<T>(string connectionId, string methodName, object?[] args, CancellationToken cancellationToken)
{
throw new NotImplementedException($"{GetType().Name} does not support client return values.");
}
diff --git a/src/SignalR/server/Core/src/IHubCallerClients.cs b/src/SignalR/server/Core/src/IHubCallerClients.cs
index 82968013d2..688591a37c 100644
--- a/src/SignalR/server/Core/src/IHubCallerClients.cs
+++ b/src/SignalR/server/Core/src/IHubCallerClients.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.SignalR.Internal;
+
namespace Microsoft.AspNetCore.SignalR;
/// <summary>
@@ -13,5 +15,11 @@ public interface IHubCallerClients : IHubCallerClients<IClientProxy>
/// </summary>
/// <param name="connectionId">The connection ID.</param>
/// <returns>A client caller.</returns>
- new ISingleClientProxy Single(string connectionId) => throw new NotImplementedException();
+ new ISingleClientProxy Client(string connectionId) => new NonInvokingSingleClientProxy(((IHubCallerClients<IClientProxy>)this).Client(connectionId), "IHubCallerClients.Client(string connectionId)");
+
+ /// <summary>
+ /// Gets a proxy that can be used to invoke methods on the calling client and receive results.
+ /// </summary>
+ /// <returns>A client caller.</returns>
+ new ISingleClientProxy Caller => new NonInvokingSingleClientProxy(((IHubCallerClients<IClientProxy>)this).Caller, "IHubCallerClients.Caller");
}
diff --git a/src/SignalR/server/Core/src/IHubClients.cs b/src/SignalR/server/Core/src/IHubClients.cs
index 3646d4bc82..008b1df2d6 100644
--- a/src/SignalR/server/Core/src/IHubClients.cs
+++ b/src/SignalR/server/Core/src/IHubClients.cs
@@ -1,6 +1,8 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
+using Microsoft.AspNetCore.SignalR.Internal;
+
namespace Microsoft.AspNetCore.SignalR;
/// <summary>
@@ -13,5 +15,5 @@ public interface IHubClients : IHubClients<IClientProxy>
/// </summary>
/// <param name="connectionId">The connection ID.</param>
/// <returns>A client caller.</returns>
- new ISingleClientProxy Single(string connectionId) => throw new NotImplementedException();
+ new ISingleClientProxy Client(string connectionId) => new NonInvokingSingleClientProxy(((IHubClients<IClientProxy>)this).Client(connectionId), "IHubClients.Client(string connectionId)");
}
diff --git a/src/SignalR/server/Core/src/IHubClients`T.cs b/src/SignalR/server/Core/src/IHubClients`T.cs
index 0dee6f33b1..b6cc0634bd 100644
--- a/src/SignalR/server/Core/src/IHubClients`T.cs
+++ b/src/SignalR/server/Core/src/IHubClients`T.cs
@@ -10,13 +10,6 @@ namespace Microsoft.AspNetCore.SignalR;
public interface IHubClients<T>
{
/// <summary>
- /// Gets a <typeparamref name="T" /> that can be used to invoke methods on a single client connected to the hub and receive results.
- /// </summary>
- /// <param name="connectionId">The connection ID.</param>
- /// <returns>A client caller.</returns>
- T Single(string connectionId) => throw new NotImplementedException();
-
- /// <summary>
/// Gets a <typeparamref name="T" /> that can be used to invoke methods on all clients connected to the hub.
/// </summary>
/// <returns>A client caller.</returns>
diff --git a/src/SignalR/server/Core/src/ISingleClientProxy.cs b/src/SignalR/server/Core/src/ISingleClientProxy.cs
index f400b13e6a..9a4451e381 100644
--- a/src/SignalR/server/Core/src/ISingleClientProxy.cs
+++ b/src/SignalR/server/Core/src/ISingleClientProxy.cs
@@ -18,7 +18,7 @@ public interface ISingleClientProxy : IClientProxy
/// <typeparam name="T"></typeparam>
/// <param name="method">Name of the method to invoke.</param>
/// <param name="args">A collection of arguments to pass to the client.</param>
- /// <param name="cancellationToken">The token to monitor for cancellation requests. The default value is <see cref="CancellationToken.None" />.</param>
+ /// <param name="cancellationToken">The token to monitor for cancellation requests. It is recommended to set a max wait for expecting a result.</param>
/// <returns>A <see cref="Task"/> that represents the asynchronous invoke and wait for a client result.</returns>
- Task<T> InvokeCoreAsync<T>(string method, object?[] args, CancellationToken cancellationToken = default);
+ Task<T> InvokeCoreAsync<T>(string method, object?[] args, CancellationToken cancellationToken);
}
diff --git a/src/SignalR/server/Core/src/Internal/ChannelBasedSemaphore.cs b/src/SignalR/server/Core/src/Internal/ChannelBasedSemaphore.cs
new file mode 100644
index 0000000000..8b6bbbe0ec
--- /dev/null
+++ b/src/SignalR/server/Core/src/Internal/ChannelBasedSemaphore.cs
@@ -0,0 +1,77 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Diagnostics;
+using System.Threading.Channels;
+
+namespace Microsoft.AspNetCore.SignalR.Internal;
+
+// Use a Channel instead of a SemaphoreSlim so that we can potentially save task allocations (ValueTask!)
+// Additionally initial perf results show faster RPS when using Channel instead of SemaphoreSlim
+internal sealed class ChannelBasedSemaphore
+{
+ private readonly Channel<int> _channel;
+
+ public ChannelBasedSemaphore(int maxCapacity)
+ {
+ _channel = Channel.CreateBounded<int>(maxCapacity);
+ for (var i = 0; i < maxCapacity; i++)
+ {
+ _channel.Writer.TryWrite(1);
+ }
+ }
+
+ public bool TryAcquire()
+ {
+ return _channel.Reader.TryRead(out _);
+ }
+
+ // The int result isn't important, only reason it's exposed is because ValueTask<T> doesn't implement ValueTask so we can't cast like we could with Task<T> to Task
+ public ValueTask<int> WaitAsync(CancellationToken cancellationToken = default)
+ {
+ return _channel.Reader.ReadAsync(cancellationToken);
+ }
+
+ public void Release()
+ {
+ if (!_channel.Writer.TryWrite(1))
+ {
+ throw new SemaphoreFullException();
+ }
+ }
+
+ public ValueTask RunAsync<TState>(Func<TState, Task<bool>> callback, TState state)
+ {
+ if (TryAcquire())
+ {
+ _ = RunTask(callback, state);
+ return ValueTask.CompletedTask;
+ }
+
+ return RunSlowAsync(callback, state);
+ }
+
+ private async ValueTask RunSlowAsync<TState>(Func<TState, Task<bool>> callback, TState state)
+ {
+ _ = await WaitAsync();
+ _ = RunTask(callback, state);
+ }
+
+ private async Task RunTask<TState>(Func<TState, Task<bool>> callback, TState state)
+ {
+ try
+ {
+ var shouldRelease = await callback(state);
+ if (shouldRelease)
+ {
+ Release();
+ }
+ }
+ catch
+ {
+ // DefaultHubDispatcher catches and handles exceptions
+ // It does write to the connection in exception cases which also can't throw because we catch and log in HubConnectionContext
+ Debug.Assert(false);
+ }
+ }
+}
diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubActivator.cs b/src/SignalR/server/Core/src/Internal/DefaultHubActivator.cs
index d0bc270a6d..018854227d 100644
--- a/src/SignalR/server/Core/src/Internal/DefaultHubActivator.cs
+++ b/src/SignalR/server/Core/src/Internal/DefaultHubActivator.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class DefaultHubActivator<THub> : IHubActivator<THub> where THub : Hub
+internal sealed class DefaultHubActivator<THub> : IHubActivator<THub> where THub : Hub
{
// Object factory for THub instances
private static readonly Lazy<ObjectFactory> _objectFactory = new Lazy<ObjectFactory>(() => ActivatorUtilities.CreateFactory(typeof(THub), Type.EmptyTypes));
@@ -18,7 +18,7 @@ internal class DefaultHubActivator<THub> : IHubActivator<THub> where THub : Hub
_serviceProvider = serviceProvider;
}
- public virtual THub Create()
+ public THub Create()
{
Debug.Assert(!_created.HasValue, "hub activators must not be reused.");
@@ -33,7 +33,7 @@ internal class DefaultHubActivator<THub> : IHubActivator<THub> where THub : Hub
return hub;
}
- public virtual void Release(THub hub)
+ public void Release(THub hub)
{
if (hub == null)
{
diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubCallerContext.cs b/src/SignalR/server/Core/src/Internal/DefaultHubCallerContext.cs
index 77b215cb30..d4d19c68a3 100644
--- a/src/SignalR/server/Core/src/Internal/DefaultHubCallerContext.cs
+++ b/src/SignalR/server/Core/src/Internal/DefaultHubCallerContext.cs
@@ -9,7 +9,7 @@ namespace Microsoft.AspNetCore.SignalR.Internal;
/// <summary>
/// A context for accessing information about the hub caller from their connection.
/// </summary>
-internal class DefaultHubCallerContext : HubCallerContext
+internal sealed class DefaultHubCallerContext : HubCallerContext
{
private readonly HubConnectionContext _connection;
diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs b/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs
index f4f299cd80..30c06e594c 100644
--- a/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs
+++ b/src/SignalR/server/Core/src/Internal/DefaultHubDispatcher.cs
@@ -16,9 +16,10 @@ using Log = Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcherLog;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where THub : Hub
+internal sealed partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where THub : Hub
{
- private readonly Dictionary<string, HubMethodDescriptor> _methods = new Dictionary<string, HubMethodDescriptor>(StringComparer.OrdinalIgnoreCase);
+ private readonly Dictionary<string, HubMethodDescriptor> _methods = new(StringComparer.OrdinalIgnoreCase);
+ private readonly Utf8HashLookup _cachedMethodNames = new();
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IHubContext<THub> _hubContext;
private readonly ILogger<HubDispatcher<THub>> _logger;
@@ -72,13 +73,13 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
public override async Task OnConnectedAsync(HubConnectionContext connection)
{
await using var scope = _serviceScopeFactory.CreateAsyncScope();
- connection.HubCallerClients = new HubCallerClients(_hubContext.Clients, connection.ConnectionId, connection.ActiveInvocationLimit is not null);
var hubActivator = scope.ServiceProvider.GetRequiredService<IHubActivator<THub>>();
var hub = hubActivator.Create();
try
{
- InitializeHub(hub, connection);
+ // OnConnectedAsync won't work with client results (ISingleClientProxy.InvokeAsync)
+ InitializeHub(hub, connection, invokeAllowed: false);
if (_onConnectedMiddleware != null)
{
@@ -252,13 +253,13 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
else
{
bool isStreamCall = descriptor.StreamingParameters != null;
- if (connection.ActiveInvocationLimit != null && !isStreamCall && !isStreamResponse)
+ if (!isStreamCall && !isStreamResponse)
{
return connection.ActiveInvocationLimit.RunAsync(static state =>
{
var (dispatcher, descriptor, connection, invocationMessage) = state;
return dispatcher.Invoke(descriptor, connection, invocationMessage, isStreamResponse: false, isStreamCall: false);
- }, (this, descriptor, connection, hubMethodInvocationMessage));
+ }, (this, descriptor, connection, hubMethodInvocationMessage)).AsTask();
}
else
{
@@ -267,11 +268,12 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
}
}
- private async Task Invoke(HubMethodDescriptor descriptor, HubConnectionContext connection,
+ private async Task<bool> Invoke(HubMethodDescriptor descriptor, HubConnectionContext connection,
HubMethodInvocationMessage hubMethodInvocationMessage, bool isStreamResponse, bool isStreamCall)
{
var methodExecutor = descriptor.MethodExecutor;
+ var wasSemaphoreReleased = false;
var disposeScope = true;
var scope = _serviceScopeFactory.CreateAsyncScope();
IHubActivator<THub>? hubActivator = null;
@@ -286,12 +288,12 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
Log.HubMethodNotAuthorized(_logger, hubMethodInvocationMessage.Target);
await SendInvocationError(hubMethodInvocationMessage.InvocationId, connection,
$"Failed to invoke '{hubMethodInvocationMessage.Target}' because user is unauthorized");
- return;
+ return true;
}
if (!await ValidateInvocationMode(descriptor, isStreamResponse, hubMethodInvocationMessage, connection))
{
- return;
+ return true;
}
try
@@ -304,7 +306,7 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
Log.InvalidHubParameters(_logger, hubMethodInvocationMessage.Target, ex);
await SendInvocationError(hubMethodInvocationMessage.InvocationId, connection,
ErrorMessageHelper.BuildErrorMessage($"An unexpected error occurred invoking '{hubMethodInvocationMessage.Target}' on the server.", ex, _enableDetailedErrors));
- return;
+ return true;
}
InitializeHub(hub, connection);
@@ -400,9 +402,15 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
{
if (disposeScope)
{
+ if (hub?.Clients is HubCallerClients hubCallerClients)
+ {
+ wasSemaphoreReleased = Interlocked.CompareExchange(ref hubCallerClients.ShouldReleaseSemaphore, 0, 1) == 0;
+ }
await CleanupInvocation(connection, hubMethodInvocationMessage, hubActivator, hub, scope);
}
}
+
+ return !wasSemaphoreReleased;
}
private static ValueTask CleanupInvocation(HubConnectionContext connection, HubMethodInvocationMessage hubMessage, IHubActivator<THub>? hubActivator,
@@ -473,6 +481,7 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
catch (ChannelClosedException ex)
{
// If the channel closes from an exception in the streaming method, grab the innerException for the error from the streaming method
+ Log.FailedStreaming(_logger, invocationId, descriptor.MethodExecutor.MethodInfo.Name, ex.InnerException ?? ex);
error = ErrorMessageHelper.BuildErrorMessage("An error occurred on the server while streaming results.", ex.InnerException ?? ex, _enableDetailedErrors);
}
catch (Exception ex)
@@ -480,6 +489,7 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
// If the streaming method was canceled we don't want to send a HubException message - this is not an error case
if (!(ex is OperationCanceledException && streamCts.IsCancellationRequested))
{
+ Log.FailedStreaming(_logger, invocationId, descriptor.MethodExecutor.MethodInfo.Name, ex);
error = ErrorMessageHelper.BuildErrorMessage("An error occurred on the server while streaming results.", ex, _enableDetailedErrors);
}
}
@@ -547,9 +557,9 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
await connection.WriteAsync(CompletionMessage.WithError(invocationId, errorMessage));
}
- private void InitializeHub(THub hub, HubConnectionContext connection)
+ private void InitializeHub(THub hub, HubConnectionContext connection, bool invokeAllowed = true)
{
- hub.Clients = connection.HubCallerClients;
+ hub.Clients = new HubCallerClients(_hubContext.Clients, connection.ConnectionId, connection.ActiveInvocationLimit) { InvokeAllowed = invokeAllowed };
hub.Context = connection.HubCallerContext;
hub.Groups = _hubContext.Groups;
}
@@ -688,6 +698,7 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
var executor = ObjectMethodExecutor.Create(methodInfo, hubTypeInfo);
var authorizeAttributes = methodInfo.GetCustomAttributes<AuthorizeAttribute>(inherit: true);
_methods[methodName] = new HubMethodDescriptor(executor, serviceProviderIsService, authorizeAttributes);
+ _cachedMethodNames.Add(methodName);
Log.HubMethodBound(_logger, hubName, methodName);
}
@@ -701,4 +712,14 @@ internal partial class DefaultHubDispatcher<THub> : HubDispatcher<THub> where TH
}
return descriptor.ParameterTypes;
}
+
+ public override string? GetTargetName(ReadOnlySpan<byte> targetUtf8Bytes)
+ {
+ if (_cachedMethodNames.TryGetValue(targetUtf8Bytes, out var targetName))
+ {
+ return targetName;
+ }
+
+ return null;
+ }
}
diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubDispatcherLog.cs b/src/SignalR/server/Core/src/Internal/DefaultHubDispatcherLog.cs
index f80a970935..6394c47845 100644
--- a/src/SignalR/server/Core/src/Internal/DefaultHubDispatcherLog.cs
+++ b/src/SignalR/server/Core/src/Internal/DefaultHubDispatcherLog.cs
@@ -105,4 +105,7 @@ internal static partial class DefaultHubDispatcherLog
[LoggerMessage(24, LogLevel.Debug, "CompletionMessage for invocation ID '{InvocationId}' received unexpectedly.", EventName = "UnexpectedCompletion")]
public static partial void UnexpectedCompletion(ILogger logger, string invocationId);
+
+ [LoggerMessage(25, LogLevel.Error, "Invocation ID {InvocationId}: Failed while sending stream items from hub method {HubMethod}.", EventName = "FailedStreaming")]
+ public static partial void FailedStreaming(ILogger logger, string invocationId, string hubMethod, Exception exception);
}
diff --git a/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs b/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs
index fa2f27ab17..12e6fc3b1d 100644
--- a/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs
+++ b/src/SignalR/server/Core/src/Internal/DefaultHubProtocolResolver.cs
@@ -8,7 +8,7 @@ using Microsoft.Extensions.Logging.Abstractions;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal partial class DefaultHubProtocolResolver : IHubProtocolResolver
+internal sealed partial class DefaultHubProtocolResolver : IHubProtocolResolver
{
private readonly ILogger<DefaultHubProtocolResolver> _logger;
private readonly List<IHubProtocol> _hubProtocols;
@@ -29,7 +29,7 @@ internal partial class DefaultHubProtocolResolver : IHubProtocolResolver
_hubProtocols = _availableProtocols.Values.ToList();
}
- public virtual IHubProtocol? GetProtocol(string protocolName, IReadOnlyList<string>? supportedProtocols)
+ public IHubProtocol? GetProtocol(string protocolName, IReadOnlyList<string>? supportedProtocols)
{
protocolName = protocolName ?? throw new ArgumentNullException(nameof(protocolName));
diff --git a/src/SignalR/server/Core/src/Internal/DynamicClientProxy.cs b/src/SignalR/server/Core/src/Internal/DynamicClientProxy.cs
index a5c4d78666..e8f1f49f90 100644
--- a/src/SignalR/server/Core/src/Internal/DynamicClientProxy.cs
+++ b/src/SignalR/server/Core/src/Internal/DynamicClientProxy.cs
@@ -5,7 +5,7 @@ using System.Dynamic;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class DynamicClientProxy : DynamicObject
+internal sealed class DynamicClientProxy : DynamicObject
{
private readonly IClientProxy _clientProxy;
diff --git a/src/SignalR/server/Core/src/Internal/GroupManager.cs b/src/SignalR/server/Core/src/Internal/GroupManager.cs
index 326f63d875..9c17c34854 100644
--- a/src/SignalR/server/Core/src/Internal/GroupManager.cs
+++ b/src/SignalR/server/Core/src/Internal/GroupManager.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class GroupManager<THub> : IGroupManager where THub : Hub
+internal sealed class GroupManager<THub> : IGroupManager where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
diff --git a/src/SignalR/server/Core/src/Internal/HubCallerClients.cs b/src/SignalR/server/Core/src/Internal/HubCallerClients.cs
index 6d3a31332f..8e6ec0fa0d 100644
--- a/src/SignalR/server/Core/src/Internal/HubCallerClients.cs
+++ b/src/SignalR/server/Core/src/Internal/HubCallerClients.cs
@@ -3,53 +3,40 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubCallerClients : IHubCallerClients
+internal sealed class HubCallerClients : IHubCallerClients
{
private readonly string _connectionId;
private readonly IHubClients _hubClients;
- private readonly string[] _currentConnectionId;
- private readonly bool _parallelEnabled;
+ internal readonly ChannelBasedSemaphore _parallelInvokes;
- public HubCallerClients(IHubClients hubClients, string connectionId, bool parallelEnabled)
+ internal int ShouldReleaseSemaphore = 1;
+
+ // Client results don't work in OnConnectedAsync
+ // This property is set by the hub dispatcher when those methods are being called
+ // so we can prevent users from making blocking client calls by returning a custom ISingleClientProxy instance
+ internal bool InvokeAllowed { get; set; }
+
+ public HubCallerClients(IHubClients hubClients, string connectionId, ChannelBasedSemaphore parallelInvokes)
{
_connectionId = connectionId;
_hubClients = hubClients;
- _currentConnectionId = new[] { _connectionId };
- _parallelEnabled = parallelEnabled;
- }
-
- private class NotParallelSingleClientProxy : ISingleClientProxy
- {
- private readonly ISingleClientProxy _proxy;
-
- public NotParallelSingleClientProxy(ISingleClientProxy hubClients)
- {
- _proxy = hubClients;
- }
-
- public Task<T> InvokeCoreAsync<T>(string method, object?[] args, CancellationToken cancellationToken = default)
- {
- throw new InvalidOperationException("Client results inside a Hub method requires HubOptions.MaximumParallelInvocationsPerClient to be greater than 1.");
- }
-
- public Task SendCoreAsync(string method, object?[] args, CancellationToken cancellationToken = default)
- {
- return _proxy.SendCoreAsync(method, args, cancellationToken);
- }
+ _parallelInvokes = parallelInvokes;
}
- public ISingleClientProxy Single(string connectionId)
+ IClientProxy IHubCallerClients<IClientProxy>.Caller => Caller;
+ public ISingleClientProxy Caller
{
- if (!_parallelEnabled)
+ get
{
- return new NotParallelSingleClientProxy(_hubClients.Single(connectionId));
+ if (!InvokeAllowed)
+ {
+ return new NoInvokeSingleClientProxy(_hubClients.Client(_connectionId));
+ }
+ return new SingleClientProxy(_hubClients.Client(_connectionId), this);
}
- return _hubClients.Single(connectionId);
}
- public IClientProxy Caller => _hubClients.Client(_connectionId);
-
- public IClientProxy Others => _hubClients.AllExcept(_currentConnectionId);
+ public IClientProxy Others => _hubClients.AllExcept(new[] { _connectionId });
public IClientProxy All => _hubClients.All;
@@ -58,9 +45,14 @@ internal class HubCallerClients : IHubCallerClients
return _hubClients.AllExcept(excludedConnectionIds);
}
- public IClientProxy Client(string connectionId)
+ IClientProxy IHubClients<IClientProxy>.Client(string connectionId) => Client(connectionId);
+ public ISingleClientProxy Client(string connectionId)
{
- return _hubClients.Client(connectionId);
+ if (!InvokeAllowed)
+ {
+ return new NoInvokeSingleClientProxy(_hubClients.Client(_connectionId));
+ }
+ return new SingleClientProxy(_hubClients.Client(connectionId), this);
}
public IClientProxy Group(string groupName)
@@ -75,7 +67,7 @@ internal class HubCallerClients : IHubCallerClients
public IClientProxy OthersInGroup(string groupName)
{
- return _hubClients.GroupExcept(groupName, _currentConnectionId);
+ return _hubClients.GroupExcept(groupName, new[] { _connectionId });
}
public IClientProxy GroupExcept(string groupName, IReadOnlyList<string> excludedConnectionIds)
@@ -97,4 +89,55 @@ internal class HubCallerClients : IHubCallerClients
{
return _hubClients.Users(userIds);
}
+
+ private sealed class NoInvokeSingleClientProxy : ISingleClientProxy
+ {
+ private readonly ISingleClientProxy _proxy;
+
+ public NoInvokeSingleClientProxy(ISingleClientProxy hubClients)
+ {
+ _proxy = hubClients;
+ }
+
+ public Task<T> InvokeCoreAsync<T>(string method, object?[] args, CancellationToken cancellationToken = default)
+ {
+ throw new InvalidOperationException("Client results inside OnConnectedAsync Hub methods are not allowed.");
+ }
+
+ public Task SendCoreAsync(string method, object?[] args, CancellationToken cancellationToken = default)
+ {
+ return _proxy.SendCoreAsync(method, args, cancellationToken);
+ }
+ }
+
+ private sealed class SingleClientProxy : ISingleClientProxy
+ {
+ private readonly ISingleClientProxy _proxy;
+ private readonly HubCallerClients _hubCallerClients;
+
+ public SingleClientProxy(ISingleClientProxy hubClients, HubCallerClients hubCallerClients)
+ {
+ _proxy = hubClients;
+ _hubCallerClients = hubCallerClients;
+ }
+
+ public async Task<T> InvokeCoreAsync<T>(string method, object?[] args, CancellationToken cancellationToken = default)
+ {
+ // Releases the Channel that is blocking pending invokes, which in turn can block the receive loop.
+ // Because we are waiting for a result from the client we need to let the receive loop run otherwise we'll be blocked forever
+ var value = Interlocked.CompareExchange(ref _hubCallerClients.ShouldReleaseSemaphore, 0, 1);
+ // Only release once, and we set ShouldReleaseSemaphore to 0 so the DefaultHubDispatcher knows not to call Release again
+ if (value == 1)
+ {
+ _hubCallerClients._parallelInvokes.Release();
+ }
+ var result = await _proxy.InvokeCoreAsync<T>(method, args, cancellationToken);
+ return result;
+ }
+
+ public Task SendCoreAsync(string method, object?[] args, CancellationToken cancellationToken = default)
+ {
+ return _proxy.SendCoreAsync(method, args, cancellationToken);
+ }
+ }
}
diff --git a/src/SignalR/server/Core/src/Internal/HubClients.cs b/src/SignalR/server/Core/src/Internal/HubClients.cs
index 203b3fe4ff..9430803888 100644
--- a/src/SignalR/server/Core/src/Internal/HubClients.cs
+++ b/src/SignalR/server/Core/src/Internal/HubClients.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubClients<THub> : IHubClients where THub : Hub
+internal sealed class HubClients<THub> : IHubClients where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -13,11 +13,6 @@ internal class HubClients<THub> : IHubClients where THub : Hub
All = new AllClientProxy<THub>(_lifetimeManager);
}
- public ISingleClientProxy Single(string connectionId)
- {
- return new SingleClientProxyWithInvoke<THub>(_lifetimeManager, connectionId);
- }
-
public IClientProxy All { get; }
public IClientProxy AllExcept(IReadOnlyList<string> excludedConnectionIds)
@@ -25,7 +20,8 @@ internal class HubClients<THub> : IHubClients where THub : Hub
return new AllClientsExceptProxy<THub>(_lifetimeManager, excludedConnectionIds);
}
- public IClientProxy Client(string connectionId)
+ IClientProxy IHubClients<IClientProxy>.Client(string connectionId) => Client(connectionId);
+ public ISingleClientProxy Client(string connectionId)
{
return new SingleClientProxy<THub>(_lifetimeManager, connectionId);
}
diff --git a/src/SignalR/server/Core/src/Internal/HubClients`T.cs b/src/SignalR/server/Core/src/Internal/HubClients`T.cs
index 568af0b397..e168174b64 100644
--- a/src/SignalR/server/Core/src/Internal/HubClients`T.cs
+++ b/src/SignalR/server/Core/src/Internal/HubClients`T.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubClients<THub, T> : IHubClients<T> where THub : Hub
+internal sealed class HubClients<THub, T> : IHubClients<T> where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -20,7 +20,7 @@ internal class HubClients<THub, T> : IHubClients<T> where THub : Hub
return TypedClientBuilder<T>.Build(new AllClientsExceptProxy<THub>(_lifetimeManager, excludedConnectionIds));
}
- public virtual T Client(string connectionId)
+ public T Client(string connectionId)
{
return TypedClientBuilder<T>.Build(new SingleClientProxy<THub>(_lifetimeManager, connectionId));
}
@@ -30,7 +30,7 @@ internal class HubClients<THub, T> : IHubClients<T> where THub : Hub
return TypedClientBuilder<T>.Build(new MultipleClientProxy<THub>(_lifetimeManager, connectionIds));
}
- public virtual T Group(string groupName)
+ public T Group(string groupName)
{
return TypedClientBuilder<T>.Build(new GroupProxy<THub>(_lifetimeManager, groupName));
}
@@ -45,12 +45,12 @@ internal class HubClients<THub, T> : IHubClients<T> where THub : Hub
return TypedClientBuilder<T>.Build(new MultipleGroupProxy<THub>(_lifetimeManager, groupNames));
}
- public virtual T User(string userId)
+ public T User(string userId)
{
return TypedClientBuilder<T>.Build(new UserProxy<THub>(_lifetimeManager, userId));
}
- public virtual T Users(IReadOnlyList<string> userIds)
+ public T Users(IReadOnlyList<string> userIds)
{
return TypedClientBuilder<T>.Build(new MultipleUserProxy<THub>(_lifetimeManager, userIds));
}
diff --git a/src/SignalR/server/Core/src/Internal/HubConnectionBinder.cs b/src/SignalR/server/Core/src/Internal/HubConnectionBinder.cs
index 086624a81d..9b844929b9 100644
--- a/src/SignalR/server/Core/src/Internal/HubConnectionBinder.cs
+++ b/src/SignalR/server/Core/src/Internal/HubConnectionBinder.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubConnectionBinder<THub> : IInvocationBinder where THub : Hub
+internal sealed class HubConnectionBinder<THub> : IInvocationBinder where THub : Hub
{
private readonly HubDispatcher<THub> _dispatcher;
private readonly HubConnectionContext _connection;
@@ -27,6 +27,7 @@ internal class HubConnectionBinder<THub> : IInvocationBinder where THub : Hub
{
return type;
}
+ // If the id isn't found then it's possible the server canceled the request for a result but the client still sent the result.
throw new InvalidOperationException($"Unknown invocation ID '{invocationId}'.");
}
@@ -34,4 +35,9 @@ internal class HubConnectionBinder<THub> : IInvocationBinder where THub : Hub
{
return _connection.StreamTracker.GetStreamItemType(streamId);
}
+
+ public string? GetTarget(ReadOnlySpan<byte> targetUtf8Bytes)
+ {
+ return _dispatcher.GetTargetName(targetUtf8Bytes);
+ }
}
diff --git a/src/SignalR/server/Core/src/Internal/HubContext.cs b/src/SignalR/server/Core/src/Internal/HubContext.cs
index 0432d0c13e..ce4e0721dc 100644
--- a/src/SignalR/server/Core/src/Internal/HubContext.cs
+++ b/src/SignalR/server/Core/src/Internal/HubContext.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubContext<THub> : IHubContext, IHubContext<THub> where THub : Hub
+internal sealed class HubContext<THub> : IHubContext, IHubContext<THub> where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
private readonly IHubClients _clients;
@@ -17,5 +17,5 @@ internal class HubContext<THub> : IHubContext, IHubContext<THub> where THub : Hu
public IHubClients Clients => _clients;
- public virtual IGroupManager Groups { get; }
+ public IGroupManager Groups { get; }
}
diff --git a/src/SignalR/server/Core/src/Internal/HubContext`T.cs b/src/SignalR/server/Core/src/Internal/HubContext`T.cs
index 2d655304d4..e7e154d7e7 100644
--- a/src/SignalR/server/Core/src/Internal/HubContext`T.cs
+++ b/src/SignalR/server/Core/src/Internal/HubContext`T.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubContext<THub, T> : IHubContext<THub, T>
+internal sealed class HubContext<THub, T> : IHubContext<THub, T>
where THub : Hub<T>
where T : class
{
@@ -19,5 +19,5 @@ internal class HubContext<THub, T> : IHubContext<THub, T>
public IHubClients<T> Clients => _clients;
- public virtual IGroupManager Groups { get; }
+ public IGroupManager Groups { get; }
}
diff --git a/src/SignalR/server/Core/src/Internal/HubDispatcher.cs b/src/SignalR/server/Core/src/Internal/HubDispatcher.cs
index 9a150757ba..efae161bdd 100644
--- a/src/SignalR/server/Core/src/Internal/HubDispatcher.cs
+++ b/src/SignalR/server/Core/src/Internal/HubDispatcher.cs
@@ -11,4 +11,5 @@ internal abstract class HubDispatcher<THub> where THub : Hub
public abstract Task OnDisconnectedAsync(HubConnectionContext connection, Exception? exception);
public abstract Task DispatchMessageAsync(HubConnectionContext connection, HubMessage hubMessage);
public abstract IReadOnlyList<Type> GetParameterTypes(string name);
+ public abstract string? GetTargetName(ReadOnlySpan<byte> targetUtf8Bytes);
}
diff --git a/src/SignalR/server/Core/src/Internal/HubFilterFactory.cs b/src/SignalR/server/Core/src/Internal/HubFilterFactory.cs
index 19e987bfc0..6aee7448ce 100644
--- a/src/SignalR/server/Core/src/Internal/HubFilterFactory.cs
+++ b/src/SignalR/server/Core/src/Internal/HubFilterFactory.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubFilterFactory : IHubFilter
+internal sealed class HubFilterFactory : IHubFilter
{
private readonly ObjectFactory _objectFactory;
diff --git a/src/SignalR/server/Core/src/Internal/HubGroupList.cs b/src/SignalR/server/Core/src/Internal/HubGroupList.cs
index a924fb748f..138595d5be 100644
--- a/src/SignalR/server/Core/src/Internal/HubGroupList.cs
+++ b/src/SignalR/server/Core/src/Internal/HubGroupList.cs
@@ -7,7 +7,7 @@ using System.Linq;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubGroupList : IReadOnlyCollection<ConcurrentDictionary<string, HubConnectionContext>>
+internal sealed class HubGroupList : IReadOnlyCollection<ConcurrentDictionary<string, HubConnectionContext>>
{
private readonly ConcurrentDictionary<string, GroupConnectionList> _groups =
new ConcurrentDictionary<string, GroupConnectionList>(StringComparer.Ordinal);
@@ -82,7 +82,7 @@ internal class HubGroupList : IReadOnlyCollection<ConcurrentDictionary<string, H
}
}
-internal class GroupConnectionList : ConcurrentDictionary<string, HubConnectionContext>
+internal sealed class GroupConnectionList : ConcurrentDictionary<string, HubConnectionContext>
{
public override bool Equals(object? obj)
{
diff --git a/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs b/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs
index 79d364d0ec..916cc4b6ba 100644
--- a/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs
+++ b/src/SignalR/server/Core/src/Internal/HubMethodDescriptor.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class HubMethodDescriptor
+internal sealed class HubMethodDescriptor
{
private static readonly MethodInfo MakeCancelableAsyncEnumeratorMethod = typeof(AsyncEnumerableAdapters)
.GetRuntimeMethods()
diff --git a/src/SignalR/server/Core/src/Internal/NonInvokingSingleClientProxy.cs b/src/SignalR/server/Core/src/Internal/NonInvokingSingleClientProxy.cs
new file mode 100644
index 0000000000..4f45ad43f1
--- /dev/null
+++ b/src/SignalR/server/Core/src/Internal/NonInvokingSingleClientProxy.cs
@@ -0,0 +1,22 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.SignalR.Internal;
+
+internal sealed class NonInvokingSingleClientProxy : ISingleClientProxy
+{
+ private readonly IClientProxy _clientProxy;
+ private readonly string _memberName;
+
+ public NonInvokingSingleClientProxy(IClientProxy clientProxy, string memberName)
+ {
+ _clientProxy = clientProxy;
+ _memberName = memberName;
+ }
+
+ public Task SendCoreAsync(string method, object?[] args, CancellationToken cancellationToken = default) =>
+ _clientProxy.SendCoreAsync(method, args, cancellationToken);
+
+ public Task<T> InvokeCoreAsync<T>(string method, object?[] args, CancellationToken cancellationToken = default) =>
+ throw new NotImplementedException($"The default implementation of {_memberName} does not support client return results.");
+}
diff --git a/src/SignalR/server/Core/src/Internal/Proxies.cs b/src/SignalR/server/Core/src/Internal/Proxies.cs
index 7dead0caf9..46f42beead 100644
--- a/src/SignalR/server/Core/src/Internal/Proxies.cs
+++ b/src/SignalR/server/Core/src/Internal/Proxies.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class UserProxy<THub> : IClientProxy where THub : Hub
+internal sealed class UserProxy<THub> : IClientProxy where THub : Hub
{
private readonly string _userId;
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -20,7 +20,7 @@ internal class UserProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class MultipleUserProxy<THub> : IClientProxy where THub : Hub
+internal sealed class MultipleUserProxy<THub> : IClientProxy where THub : Hub
{
private readonly IReadOnlyList<string> _userIds;
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -37,7 +37,7 @@ internal class MultipleUserProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class GroupProxy<THub> : IClientProxy where THub : Hub
+internal sealed class GroupProxy<THub> : IClientProxy where THub : Hub
{
private readonly string _groupName;
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -54,7 +54,7 @@ internal class GroupProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class MultipleGroupProxy<THub> : IClientProxy where THub : Hub
+internal sealed class MultipleGroupProxy<THub> : IClientProxy where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
private readonly IReadOnlyList<string> _groupNames;
@@ -71,7 +71,7 @@ internal class MultipleGroupProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class GroupExceptProxy<THub> : IClientProxy where THub : Hub
+internal sealed class GroupExceptProxy<THub> : IClientProxy where THub : Hub
{
private readonly string _groupName;
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -90,7 +90,7 @@ internal class GroupExceptProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class AllClientProxy<THub> : IClientProxy where THub : Hub
+internal sealed class AllClientProxy<THub> : IClientProxy where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
@@ -105,7 +105,7 @@ internal class AllClientProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class AllClientsExceptProxy<THub> : IClientProxy where THub : Hub
+internal sealed class AllClientsExceptProxy<THub> : IClientProxy where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
private readonly IReadOnlyList<string> _excludedConnectionIds;
@@ -122,24 +122,7 @@ internal class AllClientsExceptProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class SingleClientProxy<THub> : IClientProxy where THub : Hub
-{
- private readonly string _connectionId;
- private readonly HubLifetimeManager<THub> _lifetimeManager;
-
- public SingleClientProxy(HubLifetimeManager<THub> lifetimeManager, string connectionId)
- {
- _lifetimeManager = lifetimeManager;
- _connectionId = connectionId;
- }
-
- public Task SendCoreAsync(string method, object?[] args, CancellationToken cancellationToken = default)
- {
- return _lifetimeManager.SendConnectionAsync(_connectionId, method, args, cancellationToken);
- }
-}
-
-internal class MultipleClientProxy<THub> : IClientProxy where THub : Hub
+internal sealed class MultipleClientProxy<THub> : IClientProxy where THub : Hub
{
private readonly HubLifetimeManager<THub> _lifetimeManager;
private readonly IReadOnlyList<string> _connectionIds;
@@ -156,12 +139,12 @@ internal class MultipleClientProxy<THub> : IClientProxy where THub : Hub
}
}
-internal class SingleClientProxyWithInvoke<THub> : ISingleClientProxy where THub : Hub
+internal sealed class SingleClientProxy<THub> : ISingleClientProxy where THub : Hub
{
private readonly string _connectionId;
private readonly HubLifetimeManager<THub> _lifetimeManager;
- public SingleClientProxyWithInvoke(HubLifetimeManager<THub> lifetimeManager, string connectionId)
+ public SingleClientProxy(HubLifetimeManager<THub> lifetimeManager, string connectionId)
{
_lifetimeManager = lifetimeManager;
_connectionId = connectionId;
diff --git a/src/SignalR/server/Core/src/Internal/SemaphoreSlimExtensions.cs b/src/SignalR/server/Core/src/Internal/SemaphoreSlimExtensions.cs
deleted file mode 100644
index a238d09643..0000000000
--- a/src/SignalR/server/Core/src/Internal/SemaphoreSlimExtensions.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-
-namespace Microsoft.AspNetCore.SignalR.Internal;
-
-internal static class SemaphoreSlimExtensions
-{
- public static Task RunAsync<TState>(this SemaphoreSlim semaphoreSlim, Func<TState, Task> callback, TState state)
- {
- if (semaphoreSlim.Wait(0))
- {
- _ = RunTask(callback, semaphoreSlim, state);
- return Task.CompletedTask;
- }
-
- return RunSlowAsync(semaphoreSlim, callback, state);
- }
-
- private static async Task<Task> RunSlowAsync<TState>(this SemaphoreSlim semaphoreSlim, Func<TState, Task> callback, TState state)
- {
- await semaphoreSlim.WaitAsync();
- return RunTask(callback, semaphoreSlim, state);
- }
-
- static async Task RunTask<TState>(Func<TState, Task> callback, SemaphoreSlim semaphoreSlim, TState state)
- {
- try
- {
- await callback(state);
- }
- finally
- {
- semaphoreSlim.Release();
- }
- }
-}
diff --git a/src/SignalR/server/Core/src/Internal/SignalRBuilder.cs b/src/SignalR/server/Core/src/Internal/SignalRBuilder.cs
index fe1a349129..4aec82d147 100644
--- a/src/SignalR/server/Core/src/Internal/SignalRBuilder.cs
+++ b/src/SignalR/server/Core/src/Internal/SignalRBuilder.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.DependencyInjection;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class SignalRServerBuilder : ISignalRServerBuilder
+internal sealed class SignalRServerBuilder : ISignalRServerBuilder
{
public SignalRServerBuilder(IServiceCollection services)
{
diff --git a/src/SignalR/server/Core/src/Internal/SignalRCoreMarkerService.cs b/src/SignalR/server/Core/src/Internal/SignalRCoreMarkerService.cs
index 3a2950d5e1..5dc4bcbb47 100644
--- a/src/SignalR/server/Core/src/Internal/SignalRCoreMarkerService.cs
+++ b/src/SignalR/server/Core/src/Internal/SignalRCoreMarkerService.cs
@@ -1,8 +1,8 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class SignalRCoreMarkerService
+internal sealed class SignalRCoreMarkerService
{
}
diff --git a/src/SignalR/server/Core/src/Internal/TypedHubClients.cs b/src/SignalR/server/Core/src/Internal/TypedHubClients.cs
index 0bffb3d83a..723d09e7fb 100644
--- a/src/SignalR/server/Core/src/Internal/TypedHubClients.cs
+++ b/src/SignalR/server/Core/src/Internal/TypedHubClients.cs
@@ -3,7 +3,7 @@
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class TypedHubClients<T> : IHubCallerClients<T>
+internal sealed class TypedHubClients<T> : IHubCallerClients<T>
{
private readonly IHubCallerClients _hubClients;
@@ -12,7 +12,7 @@ internal class TypedHubClients<T> : IHubCallerClients<T>
_hubClients = dynamicContext;
}
- public T Single(string connectionId) => TypedClientBuilder<T>.Build(_hubClients.Single(connectionId));
+ public T Client(string connectionId) => TypedClientBuilder<T>.Build(_hubClients.Client(connectionId));
public T All => TypedClientBuilder<T>.Build(_hubClients.All);
@@ -22,11 +22,6 @@ internal class TypedHubClients<T> : IHubCallerClients<T>
public T AllExcept(IReadOnlyList<string> excludedConnectionIds) => TypedClientBuilder<T>.Build(_hubClients.AllExcept(excludedConnectionIds));
- public T Client(string connectionId)
- {
- return TypedClientBuilder<T>.Build(_hubClients.Client(connectionId));
- }
-
public T Group(string groupName)
{
return TypedClientBuilder<T>.Build(_hubClients.Group(groupName));
diff --git a/src/SignalR/server/Core/src/Internal/Utf8HashLookup.cs b/src/SignalR/server/Core/src/Internal/Utf8HashLookup.cs
new file mode 100644
index 0000000000..39fac373e7
--- /dev/null
+++ b/src/SignalR/server/Core/src/Internal/Utf8HashLookup.cs
@@ -0,0 +1,160 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Buffers;
+using System.Diagnostics.CodeAnalysis;
+using System.Text;
+
+namespace Microsoft.AspNetCore.SignalR.Internal;
+
+/// <summary>
+/// A small dictionary optimized for utf8 string lookup via spans. Adapted from https://github.com/dotnet/runtime/blob/4ed596ef63e60ce54cfb41d55928f0fe45f65cf3/src/libraries/System.Linq.Parallel/src/System/Linq/Parallel/Utils/HashLookup.cs.
+/// </summary>
+internal sealed class Utf8HashLookup
+{
+ private int[] _buckets;
+ private int[] _caseSensitiveBuckets;
+ private Slot[] _slots;
+ private int _count;
+
+ private const int HashCodeMask = 0x7fffffff;
+
+ internal Utf8HashLookup()
+ {
+ _buckets = new int[7];
+ _caseSensitiveBuckets = new int[7];
+ _slots = new Slot[7];
+ }
+
+ internal void Add(string value)
+ {
+ if (_count == _slots.Length)
+ {
+ Resize();
+ }
+
+ int slotIndex = _count;
+ _count++;
+
+ var encodedValue = Encoding.UTF8.GetBytes(value);
+ var hashCode = GetHashCode(value.AsSpan());
+ var caseSensitiveHashCode = GetCaseSensitiveHashCode(encodedValue);
+ int bucketIndex = hashCode % _buckets.Length;
+ int caseSensitiveBucketIndex = caseSensitiveHashCode % _caseSensitiveBuckets.Length;
+
+ _slots[slotIndex].hashCode = hashCode;
+ _slots[slotIndex].caseSensitiveHashCode = caseSensitiveHashCode;
+
+ _slots[slotIndex].value = value;
+ _slots[slotIndex].encodedValue = encodedValue;
+
+ _slots[slotIndex].next = _buckets[bucketIndex] - 1;
+ _slots[slotIndex].caseSensitiveNext = _caseSensitiveBuckets[caseSensitiveBucketIndex] - 1;
+
+ _buckets[bucketIndex] = slotIndex + 1;
+ _caseSensitiveBuckets[caseSensitiveBucketIndex] = slotIndex + 1;
+ }
+
+ internal bool TryGetValue(ReadOnlySpan<byte> encodedValue, [MaybeNullWhen(false), AllowNull] out string value)
+ {
+ var caseSensitiveHashCode = GetCaseSensitiveHashCode(encodedValue);
+
+ for (var i = _caseSensitiveBuckets[caseSensitiveHashCode % _caseSensitiveBuckets.Length] - 1; i >= 0; i = _slots[i].caseSensitiveNext)
+ {
+ if (_slots[i].caseSensitiveHashCode == caseSensitiveHashCode && encodedValue.SequenceEqual(_slots[i].encodedValue.AsSpan()))
+ {
+ value = _slots[i].value;
+ return true;
+ }
+ }
+
+ // If we cannot find a case-sensitive match, we transcode the encodedValue to a stackalloced UTF16 string
+ // and do an OrdinalIgnoreCase comparison.
+ return TryGetValueSlow(encodedValue, out value);
+ }
+
+ private bool TryGetValueSlow(ReadOnlySpan<byte> encodedValue, [MaybeNullWhen(false), AllowNull] out string value)
+ {
+ const int StackAllocThreshold = 128;
+
+ char[]? pooled = null;
+ var count = Encoding.UTF8.GetCharCount(encodedValue);
+ var chars = count <= StackAllocThreshold ?
+ stackalloc char[StackAllocThreshold] :
+ (pooled = ArrayPool<char>.Shared.Rent(count));
+ var encoded = Encoding.UTF8.GetChars(encodedValue, chars);
+ var hasValue = TryGetValueFromChars(chars[..encoded], out value);
+ if (pooled is not null)
+ {
+ ArrayPool<char>.Shared.Return(pooled);
+ }
+
+ return hasValue;
+ }
+
+ private bool TryGetValueFromChars(ReadOnlySpan<char> key, [MaybeNullWhen(false), AllowNull] out string value)
+ {
+ var hashCode = GetHashCode(key);
+
+ for (var i = _buckets[hashCode % _buckets.Length] - 1; i >= 0; i = _slots[i].next)
+ {
+ if (_slots[i].hashCode == hashCode && key.Equals(_slots[i].value, StringComparison.OrdinalIgnoreCase))
+ {
+ value = _slots[i].value;
+ return true;
+ }
+ }
+
+ value = null;
+ return false;
+ }
+
+ private static int GetHashCode(ReadOnlySpan<char> value) =>
+ HashCodeMask & string.GetHashCode(value, StringComparison.OrdinalIgnoreCase);
+
+ private static int GetCaseSensitiveHashCode(ReadOnlySpan<byte> encodedValue)
+ {
+ var hashCode = new HashCode();
+ hashCode.AddBytes(encodedValue);
+ return HashCodeMask & hashCode.ToHashCode();
+ }
+
+ private void Resize()
+ {
+ var newSize = checked(_count * 2 + 1);
+ var newSlots = new Slot[newSize];
+
+ var newBuckets = new int[newSize];
+ var newCaseSensitiveBuckets = new int[newSize];
+
+ Array.Copy(_slots, newSlots, _count);
+
+ for (int i = 0; i < _count; i++)
+ {
+ int bucket = newSlots[i].hashCode % newSize;
+ newSlots[i].next = newBuckets[bucket] - 1;
+ newBuckets[bucket] = i + 1;
+
+ int caseSensitiveBucket = newSlots[i].caseSensitiveHashCode % newSize;
+ newSlots[i].caseSensitiveNext = newCaseSensitiveBuckets[caseSensitiveBucket] - 1;
+ newCaseSensitiveBuckets[caseSensitiveBucket] = i + 1;
+ }
+
+ _slots = newSlots;
+
+ _buckets = newBuckets;
+ _caseSensitiveBuckets = newCaseSensitiveBuckets;
+ }
+
+ private struct Slot
+ {
+ internal int hashCode;
+ internal int caseSensitiveHashCode;
+
+ internal string value;
+ internal byte[] encodedValue;
+
+ internal int next;
+ internal int caseSensitiveNext;
+ }
+}
diff --git a/src/SignalR/server/Core/src/PublicAPI.Shipped.txt b/src/SignalR/server/Core/src/PublicAPI.Shipped.txt
index d34a7dd2e7..bc3896b65d 100644
--- a/src/SignalR/server/Core/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/server/Core/src/PublicAPI.Shipped.txt
@@ -1,15 +1,15 @@
#nullable enable
-~Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<THub>
-~Microsoft.AspNetCore.SignalR.Hub<T>
-~Microsoft.AspNetCore.SignalR.HubConnectionHandler<THub>
-~Microsoft.AspNetCore.SignalR.HubConnectionHandler<THub>.HubConnectionHandler(Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub!>! lifetimeManager, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! protocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>! hubOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.SignalR.IUserIdProvider! userIdProvider, Microsoft.Extensions.DependencyInjection.IServiceScopeFactory! serviceScopeFactory) -> void
-~Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub>
-~Microsoft.AspNetCore.SignalR.HubOptions<THub>
-~Microsoft.AspNetCore.SignalR.HubOptionsSetup<THub>
-~Microsoft.AspNetCore.SignalR.HubOptionsSetup<THub>.HubOptionsSetup(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! options) -> void
-~Microsoft.AspNetCore.SignalR.IHubActivator<THub>
-~Microsoft.AspNetCore.SignalR.IHubContext<THub, T>
-~Microsoft.AspNetCore.SignalR.IHubContext<THub>
+Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<THub>
+Microsoft.AspNetCore.SignalR.Hub<T>
+Microsoft.AspNetCore.SignalR.HubConnectionHandler<THub>
+Microsoft.AspNetCore.SignalR.HubConnectionHandler<THub>.HubConnectionHandler(Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub!>! lifetimeManager, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! protocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>! hubOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.SignalR.IUserIdProvider! userIdProvider, Microsoft.Extensions.DependencyInjection.IServiceScopeFactory! serviceScopeFactory) -> void
+Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub>
+Microsoft.AspNetCore.SignalR.HubOptions<THub>
+Microsoft.AspNetCore.SignalR.HubOptionsSetup<THub>
+Microsoft.AspNetCore.SignalR.HubOptionsSetup<THub>.HubOptionsSetup(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! options) -> void
+Microsoft.AspNetCore.SignalR.IHubActivator<THub>
+Microsoft.AspNetCore.SignalR.IHubContext<THub, T>
+Microsoft.AspNetCore.SignalR.IHubContext<THub>
abstract Microsoft.AspNetCore.SignalR.HubCallerContext.Abort() -> void
abstract Microsoft.AspNetCore.SignalR.HubCallerContext.ConnectionAborted.get -> System.Threading.CancellationToken
abstract Microsoft.AspNetCore.SignalR.HubCallerContext.ConnectionId.get -> string!
@@ -87,6 +87,7 @@ Microsoft.AspNetCore.SignalR.HubConnectionStore
Microsoft.AspNetCore.SignalR.HubConnectionStore.Add(Microsoft.AspNetCore.SignalR.HubConnectionContext! connection) -> void
Microsoft.AspNetCore.SignalR.HubConnectionStore.Count.get -> int
Microsoft.AspNetCore.SignalR.HubConnectionStore.Enumerator
+Microsoft.AspNetCore.SignalR.HubConnectionStore.Enumerator.Enumerator() -> void
Microsoft.AspNetCore.SignalR.HubConnectionStore.Enumerator.Current.get -> Microsoft.AspNetCore.SignalR.HubConnectionContext!
Microsoft.AspNetCore.SignalR.HubConnectionStore.Enumerator.Dispose() -> void
Microsoft.AspNetCore.SignalR.HubConnectionStore.Enumerator.Enumerator(Microsoft.AspNetCore.SignalR.HubConnectionStore! hubConnectionList) -> void
@@ -186,6 +187,7 @@ Microsoft.AspNetCore.SignalR.SerializedHubMessage.Message.get -> Microsoft.AspNe
Microsoft.AspNetCore.SignalR.SerializedHubMessage.SerializedHubMessage(Microsoft.AspNetCore.SignalR.Protocol.HubMessage! message) -> void
Microsoft.AspNetCore.SignalR.SerializedHubMessage.SerializedHubMessage(System.Collections.Generic.IReadOnlyList<Microsoft.AspNetCore.SignalR.SerializedMessage>! messages) -> void
Microsoft.AspNetCore.SignalR.SerializedMessage
+Microsoft.AspNetCore.SignalR.SerializedMessage.SerializedMessage() -> void
Microsoft.AspNetCore.SignalR.SerializedMessage.ProtocolName.get -> string!
Microsoft.AspNetCore.SignalR.SerializedMessage.Serialized.get -> System.ReadOnlyMemory<byte>
Microsoft.AspNetCore.SignalR.SerializedMessage.SerializedMessage(string! protocolName, System.ReadOnlyMemory<byte> serialized) -> void
diff --git a/src/SignalR/server/Core/src/PublicAPI.Unshipped.txt b/src/SignalR/server/Core/src/PublicAPI.Unshipped.txt
index a3686554ff..f7dd250a0c 100644
--- a/src/SignalR/server/Core/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/server/Core/src/PublicAPI.Unshipped.txt
@@ -1,29 +1,25 @@
#nullable enable
Microsoft.AspNetCore.SignalR.HubOptions.DisableImplicitFromServicesParameters.get -> bool
Microsoft.AspNetCore.SignalR.HubOptions.DisableImplicitFromServicesParameters.set -> void
-*REMOVED*~Microsoft.AspNetCore.SignalR.HubConnectionHandler<THub>.HubConnectionHandler(Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub!>! lifetimeManager, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! protocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>! hubOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.SignalR.IUserIdProvider! userIdProvider, Microsoft.Extensions.DependencyInjection.IServiceScopeFactory! serviceScopeFactory) -> void
-Microsoft.AspNetCore.SignalR.HubConnectionHandler<THub>.HubConnectionHandler(Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub!>! lifetimeManager, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! protocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>! hubOptions, Microsoft.Extensions.Logging.ILoggerFactory! loggerFactory, Microsoft.AspNetCore.SignalR.IUserIdProvider! userIdProvider, Microsoft.Extensions.DependencyInjection.IServiceScopeFactory! serviceScopeFactory) -> void
-*REMOVED*~Microsoft.AspNetCore.SignalR.HubOptionsSetup<THub>.HubOptionsSetup(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! options) -> void
-Microsoft.AspNetCore.SignalR.HubOptionsSetup<THub>.HubOptionsSetup(Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>! options) -> void
-Microsoft.AspNetCore.SignalR.IHubCallerClients.Single(string! connectionId) -> Microsoft.AspNetCore.SignalR.ISingleClientProxy!
-Microsoft.AspNetCore.SignalR.IHubClients.Single(string! connectionId) -> Microsoft.AspNetCore.SignalR.ISingleClientProxy!
-Microsoft.AspNetCore.SignalR.IHubClients<T>.Single(string! connectionId) -> T
+Microsoft.AspNetCore.SignalR.IHubCallerClients.Caller.get -> Microsoft.AspNetCore.SignalR.ISingleClientProxy!
+Microsoft.AspNetCore.SignalR.IHubCallerClients.Client(string! connectionId) -> Microsoft.AspNetCore.SignalR.ISingleClientProxy!
+Microsoft.AspNetCore.SignalR.IHubClients.Client(string! connectionId) -> Microsoft.AspNetCore.SignalR.ISingleClientProxy!
Microsoft.AspNetCore.SignalR.ISingleClientProxy
-Microsoft.AspNetCore.SignalR.ISingleClientProxy.InvokeCoreAsync<T>(string! method, object?[]! args, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-override Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<THub>.InvokeConnectionAsync<T>(string! connectionId, string! methodName, object?[]! args, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
+Microsoft.AspNetCore.SignalR.ISingleClientProxy.InvokeCoreAsync<T>(string! method, object?[]! args, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+override Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<THub>.InvokeConnectionAsync<T>(string! connectionId, string! methodName, object?[]! args, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
override Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<THub>.SetConnectionResultAsync(string! connectionId, Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage! result) -> System.Threading.Tasks.Task!
override Microsoft.AspNetCore.SignalR.DefaultHubLifetimeManager<THub>.TryGetReturnType(string! invocationId, out System.Type? type) -> bool
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
-virtual Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub>.InvokeConnectionAsync<T>(string! connectionId, string! methodName, object?[]! args, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, object? arg10, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, object? arg9, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, object? arg8, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, object? arg7, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, object? arg6, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, object? arg5, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, object? arg4, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, object? arg3, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, object? arg2, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, object? arg1, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+static Microsoft.AspNetCore.SignalR.ClientProxyExtensions.InvokeAsync<T>(this Microsoft.AspNetCore.SignalR.ISingleClientProxy! clientProxy, string! method, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
+virtual Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub>.InvokeConnectionAsync<T>(string! connectionId, string! methodName, object?[]! args, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
virtual Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub>.SetConnectionResultAsync(string! connectionId, Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage! result) -> System.Threading.Tasks.Task!
virtual Microsoft.AspNetCore.SignalR.HubLifetimeManager<THub>.TryGetReturnType(string! invocationId, out System.Type? type) -> bool
diff --git a/src/SignalR/server/Core/src/StreamTracker.cs b/src/SignalR/server/Core/src/StreamTracker.cs
index c491dde40f..f0f9d0513c 100644
--- a/src/SignalR/server/Core/src/StreamTracker.cs
+++ b/src/SignalR/server/Core/src/StreamTracker.cs
@@ -10,7 +10,7 @@ using Microsoft.AspNetCore.SignalR.Protocol;
namespace Microsoft.AspNetCore.SignalR;
-internal class StreamTracker
+internal sealed class StreamTracker
{
private static readonly MethodInfo _buildConverterMethod = typeof(StreamTracker).GetMethods(BindingFlags.NonPublic | BindingFlags.Static).Single(m => m.Name.Equals(nameof(BuildStream)));
private readonly object[] _streamConverterArgs;
@@ -95,7 +95,7 @@ internal class StreamTracker
void TryComplete(Exception? ex);
}
- private class ChannelConverter<T> : IStreamConverter
+ private sealed class ChannelConverter<T> : IStreamConverter
{
private readonly Channel<T?> _channel;
diff --git a/src/SignalR/server/SignalR/src/HubEndpointConventionBuilder.cs b/src/SignalR/server/SignalR/src/HubEndpointConventionBuilder.cs
index 955720ecef..1233cea760 100644
--- a/src/SignalR/server/SignalR/src/HubEndpointConventionBuilder.cs
+++ b/src/SignalR/server/SignalR/src/HubEndpointConventionBuilder.cs
@@ -23,4 +23,10 @@ public sealed class HubEndpointConventionBuilder : IHubEndpointConventionBuilder
{
_endpointConventionBuilder.Add(convention);
}
+
+ /// <inheritdoc/>
+ public void Finally(Action<EndpointBuilder> finalConvention)
+ {
+ _endpointConventionBuilder.Finally(finalConvention);
+ }
}
diff --git a/src/SignalR/server/SignalR/src/PublicAPI.Unshipped.txt b/src/SignalR/server/SignalR/src/PublicAPI.Unshipped.txt
index 7dc5c58110..aaa77a7632 100644
--- a/src/SignalR/server/SignalR/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/server/SignalR/src/PublicAPI.Unshipped.txt
@@ -1 +1,2 @@
#nullable enable
+Microsoft.AspNetCore.Builder.HubEndpointConventionBuilder.Finally(System.Action<Microsoft.AspNetCore.Builder.EndpointBuilder!>! finalConvention) -> void
diff --git a/src/SignalR/server/SignalR/src/SignalRMarkerService.cs b/src/SignalR/server/SignalR/src/SignalRMarkerService.cs
index f05fd14ea8..41fb8c92be 100644
--- a/src/SignalR/server/SignalR/src/SignalRMarkerService.cs
+++ b/src/SignalR/server/SignalR/src/SignalRMarkerService.cs
@@ -1,8 +1,8 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
namespace Microsoft.Extensions.DependencyInjection;
-internal class SignalRMarkerService
+internal sealed class SignalRMarkerService
{
}
diff --git a/src/SignalR/server/SignalR/test/ClientProxyTests.cs b/src/SignalR/server/SignalR/test/ClientProxyTests.cs
index ede98b1c50..708935fc8e 100644
--- a/src/SignalR/server/SignalR/test/ClientProxyTests.cs
+++ b/src/SignalR/server/SignalR/test/ClientProxyTests.cs
@@ -212,8 +212,8 @@ public class ClientHubProxyTests
{
var hubLifetimeManager = new EmptyHubLifetimeManager<FakeHub>();
- var proxy = new SingleClientProxyWithInvoke<FakeHub>(hubLifetimeManager, "");
- var ex = await Assert.ThrowsAsync<NotImplementedException>(async () => await proxy.InvokeAsync<int>("method")).DefaultTimeout();
+ var proxy = new SingleClientProxy<FakeHub>(hubLifetimeManager, "");
+ var ex = await Assert.ThrowsAsync<NotImplementedException>(async () => await proxy.InvokeAsync<int>("method", cancellationToken: default)).DefaultTimeout();
Assert.Equal("EmptyHubLifetimeManager`1 does not support client return values.", ex.Message);
}
diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs
index db7359370a..dc4ad91929 100644
--- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs
+++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTestUtils/Hubs.cs
@@ -335,9 +335,27 @@ public class MethodHub : TestHub
public async Task<int> GetClientResult(int num)
{
- var sum = await Clients.Single(Context.ConnectionId).InvokeAsync<int>("Sum", num);
+ var sum = await Clients.Caller.InvokeAsync<int>("Sum", num, cancellationToken: default);
return sum;
}
+
+ public void BackgroundClientResult(TcsService tcsService)
+ {
+ var caller = Clients.Caller;
+ _ = Task.Run(async () =>
+ {
+ try
+ {
+ await tcsService.StartedMethod.Task;
+ var result = await caller.InvokeAsync<int>("GetResult", 1, CancellationToken.None);
+ tcsService.EndMethod.SetResult(result);
+ }
+ catch (Exception ex)
+ {
+ tcsService.EndMethod.SetException(ex);
+ }
+ });
+ }
}
internal class SelfRef
@@ -440,7 +458,7 @@ public class DynamicTestHub : DynamicHub
}
}
-public class HubT : Hub<Test>
+public class HubT : Hub<ITest>
{
public override Task OnConnectedAsync()
{
@@ -524,14 +542,25 @@ public class HubT : Hub<Test>
{
return Clients.Caller.Send(message);
}
+
+ public async Task<ClientResults> GetClientResultTwoWays(int clientValue, int callerValue) =>
+ new ClientResults(
+ await Clients.Client(Context.ConnectionId).GetClientResult(clientValue),
+ await Clients.Caller.GetClientResult(callerValue));
}
-public interface Test
+public interface ITest
{
Task Send(string message);
Task Broadcast(string message);
+
+ Task<int> GetClientResult(int value);
+
+ Task<int> GetClientResultWithCancellation(int value, CancellationToken cancellationToken);
}
+public record ClientResults(int ClientResult, int CallerResult);
+
public class OnConnectedThrowsHub : Hub
{
public override Task OnConnectedAsync()
@@ -682,6 +711,15 @@ public class StreamingHub : TestHub
}
}
+ public async IAsyncEnumerable<string> ExceptionAsyncEnumerable()
+ {
+ await Task.Yield();
+ throw new Exception("Exception from async enumerable");
+#pragma warning disable CS0162 // Unreachable code detected
+ yield break;
+#pragma warning restore CS0162 // Unreachable code detected
+ }
+
public async Task<IAsyncEnumerable<string>> CounterAsyncEnumerableAsync(int count)
{
await Task.Yield();
@@ -710,6 +748,20 @@ public class StreamingHub : TestHub
return channel.Reader;
}
+ public ChannelReader<int> ChannelClosedExceptionStream()
+ {
+ var channel = Channel.CreateUnbounded<int>();
+ channel.Writer.TryComplete(new ChannelClosedException("ChannelClosedException from channel"));
+ return channel.Reader;
+ }
+
+ public ChannelReader<int> ChannelClosedExceptionInnerExceptionStream()
+ {
+ var channel = Channel.CreateUnbounded<int>();
+ channel.Writer.TryComplete(new ChannelClosedException(new Exception("ChannelClosedException from channel")));
+ return channel.Reader;
+ }
+
public ChannelReader<int> ThrowStream()
{
throw new Exception("Throw from hub method");
@@ -1222,6 +1274,22 @@ public class ConnectionLifetimeState
public Exception DisconnectedException { get; set; }
}
+public class OnConnectedClientResultHub : Hub
+{
+ public override async Task OnConnectedAsync()
+ {
+ await Clients.Caller.InvokeAsync<int>("Test", cancellationToken: default);
+ }
+}
+
+public class OnDisconnectedClientResultHub : Hub
+{
+ public override async Task OnDisconnectedAsync(Exception ex)
+ {
+ await Clients.Caller.InvokeAsync<int>("Test", cancellationToken: default);
+ }
+}
+
public class CallerServiceHub : Hub
{
private readonly CallerService _service;
diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.ClientResult.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.ClientResult.cs
index b179f92acb..1320c674d6 100644
--- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.ClientResult.cs
+++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.ClientResult.cs
@@ -14,11 +14,7 @@ public partial class HubConnectionHandlerTests
{
using (StartVerifiableLog())
{
- var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
- {
- // Waiting for a client result blocks the hub dispatcher pipeline, need to allow multiple invocations
- builder.AddSignalR(o => o.MaximumParallelInvocationsPerClient = 2);
- }, LoggerFactory);
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder => { }, LoggerFactory);
var connectionHandler = serviceProvider.GetService<HubConnectionHandler<MethodHub>>();
using (var client = new TestClient())
@@ -47,10 +43,8 @@ public partial class HubConnectionHandlerTests
{
var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
{
- // Waiting for a client result blocks the hub dispatcher pipeline, need to allow multiple invocations
builder.AddSignalR(o =>
{
- o.MaximumParallelInvocationsPerClient = 2;
o.EnableDetailedErrors = true;
});
}, LoggerFactory);
@@ -75,32 +69,381 @@ public partial class HubConnectionHandlerTests
}
[Fact]
- public async Task ThrowsWhenParallelHubInvokesNotEnabled()
+ public async Task ThrowsWhenUsedInOnConnectedAsync()
{
- using (StartVerifiableLog(write => write.EventId.Name == "FailedInvokingHubMethod"))
+ using (StartVerifiableLog(write => write.EventId.Name == "ErrorDispatchingHubEvent"))
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
+ {
+ builder.AddSignalR(o =>
+ {
+ o.EnableDetailedErrors = true;
+ });
+ }, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<OnConnectedClientResultHub>>();
+
+ using (var client = new TestClient())
+ {
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler).DefaultTimeout();
+
+ // Hub asks client for a result, this is an invocation message with an ID
+ var closeMessage = Assert.IsType<CloseMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.Equal("Connection closed with an error. InvalidOperationException: Client results inside OnConnectedAsync Hub methods are not allowed.", closeMessage.Error);
+ }
+ }
+
+ Assert.Single(TestSink.Writes.Where(write => write.EventId.Name == "ErrorDispatchingHubEvent"));
+ }
+
+ [Fact]
+ public async Task ThrowsWhenUsedInOnDisconnectedAsync()
+ {
+ using (StartVerifiableLog(write => write.EventId.Name == "ErrorDispatchingHubEvent"))
{
var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
{
builder.AddSignalR(o =>
{
- o.MaximumParallelInvocationsPerClient = 1;
o.EnableDetailedErrors = true;
});
}, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<OnDisconnectedClientResultHub>>();
+
+ using (var client = new TestClient())
+ {
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler).DefaultTimeout();
+ client.Connection.Abort();
+
+ // Hub asks client for a result, this is an invocation message with an ID
+ var closeMessage = Assert.IsType<CloseMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.Null(closeMessage.Error);
+
+ var ex = await Assert.ThrowsAsync<IOException>(() => connectionHandlerTask).DefaultTimeout();
+ Assert.Equal($"Connection '{client.Connection.ConnectionId}' disconnected.", ex.Message);
+ }
+ }
+
+ Assert.Single(TestSink.Writes.Where(write => write.EventId.Name == "ErrorDispatchingHubEvent"));
+ }
+
+ [Fact]
+ public async Task CanUseClientResultsWithIHubContext()
+ {
+ using (StartVerifiableLog())
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<MethodHub>>();
+
+ using var client = new TestClient();
+
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
+
+ // Wait for a connection, or for the endpoint to fail.
+ await client.Connected.OrThrowIfOtherFails(connectionHandlerTask).DefaultTimeout();
+
+ var context = serviceProvider.GetRequiredService<IHubContext<MethodHub>>();
+ var resultTask = context.Clients.Client(client.Connection.ConnectionId).InvokeAsync<int>("GetClientResult", 1, cancellationToken: default);
+
+ var message = await client.ReadAsync().DefaultTimeout();
+ var invocation = Assert.IsType<InvocationMessage>(message);
+
+ Assert.Single(invocation.Arguments);
+ Assert.Equal(1L, invocation.Arguments[0]);
+ Assert.Equal("GetClientResult", invocation.Target);
+
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocation.InvocationId, 2)).DefaultTimeout();
+
+ var result = await resultTask.DefaultTimeout();
+ Assert.Equal(2, result);
+ }
+ }
+
+ [Fact]
+ public async Task CanUseClientResultsWithIHubContextT()
+ {
+ using (StartVerifiableLog())
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<HubT>>();
+
+ using var client = new TestClient();
+ var connectionId = client.Connection.ConnectionId;
+
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
+
+ // Wait for a connection, or for the endpoint to fail.
+ await client.Connected.OrThrowIfOtherFails(connectionHandlerTask).DefaultTimeout();
+
+ var context = serviceProvider.GetRequiredService<IHubContext<HubT, ITest>>();
+
+ var resultTask = context.Clients.Client(connectionId).GetClientResult(1);
+
+ var message = await client.ReadAsync().DefaultTimeout();
+ var invocation = Assert.IsType<InvocationMessage>(message);
+
+ Assert.Single(invocation.Arguments);
+ Assert.Equal(1L, invocation.Arguments[0]);
+ Assert.Equal("GetClientResult", invocation.Target);
+
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocation.InvocationId, 2)).DefaultTimeout();
+
+ var result = await resultTask.DefaultTimeout();
+ Assert.Equal(2, result);
+ }
+ }
+
+ [Fact]
+ public async Task CanReturnClientResultToTypedHubTwoWays()
+ {
+ using (StartVerifiableLog())
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder => { }, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<HubT>>();
+
+ using var client = new TestClient(invocationBinder: new GetClientResultTwoWaysInvocationBinder());
+
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler).DefaultTimeout();
+
+ var invocationId = await client.SendHubMessageAsync(new InvocationMessage(
+ invocationId: "1",
+ nameof(HubT.GetClientResultTwoWays),
+ new object[] { 7, 3 })).DefaultTimeout();
+
+ // Send back "value + 4" to both invocations.
+ for (int i = 0; i < 2; i++)
+ {
+ // Hub asks client for a result, this is an invocation message with an ID.
+ var invocationMessage = Assert.IsType<InvocationMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.NotNull(invocationMessage.InvocationId);
+ var res = 4 + (int)invocationMessage.Arguments[0];
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocationMessage.InvocationId, res)).DefaultTimeout();
+ }
+
+ var completion = Assert.IsType<CompletionMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.Equal(new ClientResults(11, 7), completion.Result);
+ }
+ }
+
+ [Fact]
+ public async Task ClientResultFromHubDoesNotBlockReceiveLoop()
+ {
+ using (StartVerifiableLog())
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
+ {
+ builder.AddSignalR(o => o.MaximumParallelInvocationsPerClient = 2);
+ }, LoggerFactory);
var connectionHandler = serviceProvider.GetService<HubConnectionHandler<MethodHub>>();
using (var client = new TestClient())
{
var connectionHandlerTask = await client.ConnectAsync(connectionHandler).DefaultTimeout();
- var invocationId = await client.SendHubMessageAsync(new InvocationMessage("1", nameof(MethodHub.GetClientResult), new object[] { 5 })).DefaultTimeout();
+ // block 1 of the 2 parallel invocations
+ _ = await client.SendHubMessageAsync(new InvocationMessage("1", nameof(MethodHub.BlockingMethod), Array.Empty<object>())).DefaultTimeout();
+ // make multiple invocations which would normally block the invocation processing
+ var invocationId = await client.SendHubMessageAsync(new InvocationMessage("2", nameof(MethodHub.GetClientResult), new object[] { 5 })).DefaultTimeout();
+ var invocationId2 = await client.SendHubMessageAsync(new InvocationMessage("3", nameof(MethodHub.GetClientResult), new object[] { 5 })).DefaultTimeout();
+ var invocationId3 = await client.SendHubMessageAsync(new InvocationMessage("4", nameof(MethodHub.GetClientResult), new object[] { 5 })).DefaultTimeout();
+
+ // Read all 3 invocation messages from the server, shows that the hub processing continued even though parallel invokes is 2
+ // Hub asks client for a result, this is an invocation message with an ID
+ var invocationMessage = Assert.IsType<InvocationMessage>(await client.ReadAsync().DefaultTimeout());
+ var invocationMessage2 = Assert.IsType<InvocationMessage>(await client.ReadAsync().DefaultTimeout());
+ var invocationMessage3 = Assert.IsType<InvocationMessage>(await client.ReadAsync().DefaultTimeout());
+
+ Assert.NotNull(invocationMessage.InvocationId);
+ Assert.NotNull(invocationMessage2.InvocationId);
+ Assert.NotNull(invocationMessage3.InvocationId);
+ var res = 4 + ((long)invocationMessage.Arguments[0]);
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocationMessage.InvocationId, res)).DefaultTimeout();
+ var completion = Assert.IsType<CompletionMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.Equal(9L, completion.Result);
+ Assert.Equal(invocationId, completion.InvocationId);
+
+ res = 5 + ((long)invocationMessage2.Arguments[0]);
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocationMessage2.InvocationId, res)).DefaultTimeout();
+ completion = Assert.IsType<CompletionMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.Equal(10L, completion.Result);
+ Assert.Equal(invocationId2, completion.InvocationId);
+
+ res = 6 + ((long)invocationMessage3.Arguments[0]);
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocationMessage3.InvocationId, res)).DefaultTimeout();
+ completion = Assert.IsType<CompletionMessage>(await client.ReadAsync().DefaultTimeout());
+ Assert.Equal(11L, completion.Result);
+ Assert.Equal(invocationId3, completion.InvocationId);
+ }
+ }
+ }
+
+ [Fact]
+ public async Task ClientResultFromBackgroundThreadInHubMethodWorks()
+ {
+ using (StartVerifiableLog())
+ {
+ var tcsService = new TcsService();
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
+ {
+ builder.AddSingleton(tcsService);
+ }, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<MethodHub>>();
+
+ using (var client = new TestClient())
+ {
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler).DefaultTimeout();
+
+ var completionMessage = await client.InvokeAsync(nameof(MethodHub.BackgroundClientResult)).DefaultTimeout();
+
+ tcsService.StartedMethod.SetResult(null);
+
+ var task = await Task.WhenAny(tcsService.EndMethod.Task, client.ReadAsync()).DefaultTimeout();
+ if (task == tcsService.EndMethod.Task)
+ {
+ await tcsService.EndMethod.Task;
+ }
// Hub asks client for a result, this is an invocation message with an ID
- var completionMessage = Assert.IsType<CompletionMessage>(await client.ReadAsync().DefaultTimeout());
- Assert.Equal(invocationId, completionMessage.InvocationId);
- Assert.Equal("An unexpected error occurred invoking 'GetClientResult' on the server. InvalidOperationException: Client results inside a Hub method requires HubOptions.MaximumParallelInvocationsPerClient to be greater than 1.",
- completionMessage.Error);
+ var invocationMessage = Assert.IsType<InvocationMessage>(await (Task<HubMessage>)task);
+ Assert.NotNull(invocationMessage.InvocationId);
+ var res = 4 + ((long)invocationMessage.Arguments[0]);
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocationMessage.InvocationId, res)).DefaultTimeout();
+
+ Assert.Equal(5, await tcsService.EndMethod.Task.DefaultTimeout());
+
+ // Make sure we can still do a Hub invocation and that the semaphore state didn't get messed up
+ completionMessage = await client.InvokeAsync(nameof(MethodHub.ValueMethod)).DefaultTimeout();
+ Assert.Equal(43L, completionMessage.Result);
}
}
}
+
+ private class TestBinder : IInvocationBinder
+ {
+ public IReadOnlyList<Type> GetParameterTypes(string methodName)
+ {
+ return new Type[] { typeof(int) };
+ }
+
+ public Type GetReturnType(string invocationId)
+ {
+ return typeof(string);
+ }
+
+ public Type GetStreamItemType(string streamId)
+ {
+ throw new NotImplementedException();
+ }
+ }
+
+ [Theory]
+ [InlineData("MessagePack")]
+ [InlineData("Json")]
+ public async Task CanCancelClientResultsWithIHubContextT(string protocol)
+ {
+ IHubProtocol hubProtocol;
+ if (string.Equals(protocol, "MessagePack"))
+ {
+ hubProtocol = new MessagePackHubProtocol();
+ }
+ else if (string.Equals(protocol, "Json"))
+ {
+ hubProtocol = new JsonHubProtocol();
+ }
+ else
+ {
+ throw new Exception($"Protocol {protocol} not handled by test.");
+ }
+ using (StartVerifiableLog())
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<HubT>>();
+
+ using var client = new TestClient(hubProtocol, new TestBinder());
+ var connectionId = client.Connection.ConnectionId;
+
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
+
+ // Wait for a connection, or for the endpoint to fail.
+ await client.Connected.OrThrowIfOtherFails(connectionHandlerTask).DefaultTimeout();
+
+ var context = serviceProvider.GetRequiredService<IHubContext<HubT, ITest>>();
+
+ var cts = new CancellationTokenSource();
+ var resultTask = context.Clients.Client(connectionId).GetClientResultWithCancellation(1, cts.Token);
+
+ var message = await client.ReadAsync().DefaultTimeout();
+ var invocation = Assert.IsType<InvocationMessage>(message);
+
+ Assert.Single(invocation.Arguments);
+ Assert.Equal(1, invocation.Arguments[0]);
+ Assert.Equal("GetClientResultWithCancellation", invocation.Target);
+
+ cts.Cancel();
+
+ var ex = await Assert.ThrowsAsync<Exception>(() => resultTask).DefaultTimeout();
+ Assert.Equal("Invocation canceled by the server.", ex.Message);
+
+ // Sending result after the server is no longer expecting one results in a log and no-ops
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocation.InvocationId, 2)).DefaultTimeout();
+
+ // Send another message from the client and get a result back to make sure the connection is still active.
+ // Regression test for when sending a client result after it was canceled would close the connection
+ var completion = await client.InvokeAsync(nameof(HubT.Echo), "test").DefaultTimeout();
+ Assert.Equal("test", completion.Result);
+
+ Assert.Contains(TestSink.Writes, c => c.EventId.Name == "UnexpectedCompletion");
+ }
+ }
+
+ [Fact]
+ public async Task CanCancelClientResultsWithIHubContext()
+ {
+ using (StartVerifiableLog())
+ {
+ var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(null, LoggerFactory);
+ var connectionHandler = serviceProvider.GetService<HubConnectionHandler<MethodHub>>();
+
+ using var client = new TestClient();
+ var connectionId = client.Connection.ConnectionId;
+
+ var connectionHandlerTask = await client.ConnectAsync(connectionHandler);
+
+ // Wait for a connection, or for the endpoint to fail.
+ await client.Connected.OrThrowIfOtherFails(connectionHandlerTask).DefaultTimeout();
+
+ var context = serviceProvider.GetRequiredService<IHubContext<MethodHub>>();
+
+ var cts = new CancellationTokenSource();
+ var resultTask = context.Clients.Client(connectionId).InvokeAsync<int>(nameof(MethodHub.GetClientResult), 1, cts.Token);
+
+ var message = await client.ReadAsync().DefaultTimeout();
+ var invocation = Assert.IsType<InvocationMessage>(message);
+
+ Assert.Single(invocation.Arguments);
+ Assert.Equal(1L, invocation.Arguments[0]);
+ Assert.Equal("GetClientResult", invocation.Target);
+
+ cts.Cancel();
+
+ var ex = await Assert.ThrowsAsync<Exception>(() => resultTask).DefaultTimeout();
+ Assert.Equal("Invocation canceled by the server.", ex.Message);
+
+ // Sending result after the server is no longer expecting one results in a log and no-ops
+ await client.SendHubMessageAsync(CompletionMessage.WithResult(invocation.InvocationId, 2)).DefaultTimeout();
+
+ // Send another message from the client and get a result back to make sure the connection is still active.
+ // Regression test for when sending a client result after it was canceled would close the connection
+ var completion = await client.InvokeAsync("Echo", "test").DefaultTimeout();
+ Assert.Equal("test", completion.Result);
+
+ Assert.Contains(TestSink.Writes, c => c.EventId.Name == "UnexpectedCompletion");
+ }
+ }
+
+ private class GetClientResultTwoWaysInvocationBinder : IInvocationBinder
+ {
+ public IReadOnlyList<Type> GetParameterTypes(string methodName) => new[] { typeof(int) };
+ public Type GetReturnType(string invocationId) => typeof(ClientResults);
+ public Type GetStreamItemType(string streamId) => throw new NotImplementedException();
+ }
}
diff --git a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs
index bce1522e59..32af4cfe62 100644
--- a/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs
+++ b/src/SignalR/server/SignalR/test/HubConnectionHandlerTests.cs
@@ -2066,16 +2066,28 @@ public partial class HubConnectionHandlerTests : VerifiableLoggedTest
}
[Theory]
- [InlineData(true)]
- [InlineData(false)]
- public async Task ReceiveCorrectErrorFromStreamThrowing(bool detailedErrors)
+ [InlineData(nameof(StreamingHub.ExceptionAsyncEnumerable), "Exception: Exception from async enumerable")]
+ [InlineData(nameof(StreamingHub.ExceptionAsyncEnumerable), null)]
+ [InlineData(nameof(StreamingHub.ExceptionStream), "Exception: Exception from channel")]
+ [InlineData(nameof(StreamingHub.ExceptionStream), null)]
+ [InlineData(nameof(StreamingHub.ChannelClosedExceptionStream), "ChannelClosedException: ChannelClosedException from channel")]
+ [InlineData(nameof(StreamingHub.ChannelClosedExceptionStream), null)]
+ [InlineData(nameof(StreamingHub.ChannelClosedExceptionInnerExceptionStream), "Exception: ChannelClosedException from channel")]
+ [InlineData(nameof(StreamingHub.ChannelClosedExceptionInnerExceptionStream), null)]
+ public async Task ReceiveCorrectErrorFromStreamThrowing(string streamMethod, string detailedError)
{
- using (StartVerifiableLog())
+ bool ExpectedErrors(WriteContext writeContext)
+ {
+ return writeContext.LoggerName == "Microsoft.AspNetCore.SignalR.Internal.DefaultHubDispatcher" &&
+ writeContext.EventId.Name == "FailedStreaming";
+ }
+
+ using (StartVerifiableLog(ExpectedErrors))
{
var serviceProvider = HubConnectionHandlerTestUtils.CreateServiceProvider(builder =>
builder.AddSignalR(options =>
{
- options.EnableDetailedErrors = detailedErrors;
+ options.EnableDetailedErrors = detailedError != null;
}), LoggerFactory);
var connectionHandler = serviceProvider.GetService<HubConnectionHandler<StreamingHub>>();
@@ -2085,14 +2097,14 @@ public partial class HubConnectionHandlerTests : VerifiableLoggedTest
await client.Connected.DefaultTimeout();
- var messages = await client.StreamAsync(nameof(StreamingHub.ExceptionStream));
+ var messages = await client.StreamAsync(streamMethod);
Assert.Equal(1, messages.Count);
var completion = messages[0] as CompletionMessage;
Assert.NotNull(completion);
- if (detailedErrors)
+ if (detailedError != null)
{
- Assert.Equal("An error occurred on the server while streaming results. Exception: Exception from channel", completion.Error);
+ Assert.Equal($"An error occurred on the server while streaming results. {detailedError}", completion.Error);
}
else
{
@@ -2979,16 +2991,23 @@ public partial class HubConnectionHandlerTests : VerifiableLoggedTest
await client.SendHubMessageAsync(PingMessage.Instance);
// Call long running hub method
- var hubMethodTask = client.InvokeAsync(nameof(LongRunningHub.LongRunningMethod));
+ var hubMethodTask1 = client.InvokeAsync(nameof(LongRunningHub.LongRunningMethod));
await tcsService.StartedMethod.Task.DefaultTimeout();
+ // Wait for server to start reading again
+ await customDuplex.WrappedPipeReader.WaitForReadStart().DefaultTimeout();
+ // Send another invocation to server, since we use Inline scheduling we know that once this call completes the server will have read and processed
+ // the message, it should be stuck waiting for the in-progress invoke now
+ _ = await client.SendInvocationAsync(nameof(LongRunningHub.LongRunningMethod)).DefaultTimeout();
+
// Tick heartbeat while hub method is running to show that close isn't triggered
client.TickHeartbeat();
// Unblock long running hub method
tcsService.EndMethod.SetResult(null);
- await hubMethodTask.DefaultTimeout();
+ await hubMethodTask1.DefaultTimeout();
+ await client.ReadAsync().DefaultTimeout();
// There is a small window when the hub method finishes and the timer starts again
// So we need to delay a little before ticking the heart beat.
diff --git a/src/SignalR/server/Specification.Tests/src/HubLifetimeManagerTestBase.cs b/src/SignalR/server/Specification.Tests/src/HubLifetimeManagerTestBase.cs
index 19b061d1c6..426a06ddee 100644
--- a/src/SignalR/server/Specification.Tests/src/HubLifetimeManagerTestBase.cs
+++ b/src/SignalR/server/Specification.Tests/src/HubLifetimeManagerTestBase.cs
@@ -186,7 +186,7 @@ public abstract class HubLifetimeManagerTestsBase<THub> where THub : Hub
await manager.OnConnectedAsync(connection1).DefaultTimeout();
- var resultTask = manager.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var resultTask = manager.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
Assert.NotNull(invocation.InvocationId);
Assert.Equal("test", invocation.Arguments[0]);
@@ -213,7 +213,7 @@ public abstract class HubLifetimeManagerTestsBase<THub> where THub : Hub
await manager.OnConnectedAsync(connection1).DefaultTimeout();
- var resultTask = manager.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var resultTask = manager.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
Assert.NotNull(invocation.InvocationId);
Assert.Equal("test", invocation.Arguments[0]);
@@ -243,7 +243,7 @@ public abstract class HubLifetimeManagerTestsBase<THub> where THub : Hub
await manager.OnConnectedAsync(connection1).DefaultTimeout();
await manager.OnConnectedAsync(connection2).DefaultTimeout();
- var resultTask = manager.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var resultTask = manager.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
Assert.NotNull(invocation.InvocationId);
Assert.Equal("test", invocation.Arguments[0]);
@@ -277,7 +277,7 @@ public abstract class HubLifetimeManagerTestsBase<THub> where THub : Hub
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
// No client with this ID
- await Assert.ThrowsAsync<IOException>(() => manager1.InvokeConnectionAsync<int>("none", "Result", new object[] { "test" })).DefaultTimeout();
+ await Assert.ThrowsAsync<IOException>(() => manager1.InvokeConnectionAsync<int>("none", "Result", new object[] { "test" }, cancellationToken: default)).DefaultTimeout();
}
}
@@ -299,8 +299,8 @@ public abstract class HubLifetimeManagerTestsBase<THub> where THub : Hub
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
await manager1.OnConnectedAsync(connection2).DefaultTimeout();
- var invoke1 = manager1.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
- var invoke2 = manager1.InvokeConnectionAsync<int>(connection2.ConnectionId, "Result", new object[] { "test" });
+ var invoke1 = manager1.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
+ var invoke2 = manager1.InvokeConnectionAsync<int>(connection2.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation1 = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
var invocation2 = Assert.IsType<InvocationMessage>(await client2.ReadAsync().DefaultTimeout());
@@ -329,7 +329,7 @@ public abstract class HubLifetimeManagerTestsBase<THub> where THub : Hub
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
- var invoke1 = manager1.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var invoke1 = manager1.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
connection1.Abort();
await manager1.OnDisconnectedAsync(connection1).DefaultTimeout();
diff --git a/src/SignalR/server/Specification.Tests/src/ScaleoutHubLifetimeManagerTests.cs b/src/SignalR/server/Specification.Tests/src/ScaleoutHubLifetimeManagerTests.cs
index 5fc1c9637c..fcaad6c863 100644
--- a/src/SignalR/server/Specification.Tests/src/ScaleoutHubLifetimeManagerTests.cs
+++ b/src/SignalR/server/Specification.Tests/src/ScaleoutHubLifetimeManagerTests.cs
@@ -482,7 +482,7 @@ public abstract class ScaleoutHubLifetimeManagerTests<TBackplane> : HubLifetimeM
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
// Server2 asks for a result from client1 on Server1
- var resultTask = manager2.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var resultTask = manager2.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
Assert.NotNull(invocation.InvocationId);
Assert.Equal("test", invocation.Arguments[0]);
@@ -513,7 +513,7 @@ public abstract class ScaleoutHubLifetimeManagerTests<TBackplane> : HubLifetimeM
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
// Server2 asks for a result from client1 on Server1
- var resultTask = manager2.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var resultTask = manager2.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
Assert.NotNull(invocation.InvocationId);
Assert.Equal("test", invocation.Arguments[0]);
@@ -544,7 +544,7 @@ public abstract class ScaleoutHubLifetimeManagerTests<TBackplane> : HubLifetimeM
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
// No client on any backplanes with this ID
- await Assert.ThrowsAsync<IOException>(() => manager1.InvokeConnectionAsync<int>("none", "Result", new object[] { "test" })).DefaultTimeout();
+ await Assert.ThrowsAsync<IOException>(() => manager1.InvokeConnectionAsync<int>("none", "Result", new object[] { "test" }, cancellationToken: default)).DefaultTimeout();
}
}
@@ -565,7 +565,7 @@ public abstract class ScaleoutHubLifetimeManagerTests<TBackplane> : HubLifetimeM
await manager2.OnConnectedAsync(connection1).DefaultTimeout();
- var invoke1 = manager1.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var invoke1 = manager1.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
connection1.Abort();
@@ -597,10 +597,10 @@ public abstract class ScaleoutHubLifetimeManagerTests<TBackplane> : HubLifetimeM
await manager1.OnConnectedAsync(connection1).DefaultTimeout();
await manager2.OnConnectedAsync(connection2).DefaultTimeout();
- var invoke1 = manager1.InvokeConnectionAsync<int>(connection2.ConnectionId, "Result", new object[] { "test" });
+ var invoke1 = manager1.InvokeConnectionAsync<int>(connection2.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation2 = Assert.IsType<InvocationMessage>(await client2.ReadAsync().DefaultTimeout());
- var invoke2 = manager2.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" });
+ var invoke2 = manager2.InvokeConnectionAsync<int>(connection1.ConnectionId, "Result", new object[] { "test" }, cancellationToken: default);
var invocation1 = Assert.IsType<InvocationMessage>(await client1.ReadAsync().DefaultTimeout());
Assert.NotEqual(invocation1.InvocationId, invocation2.InvocationId);
@@ -626,7 +626,7 @@ public abstract class ScaleoutHubLifetimeManagerTests<TBackplane> : HubLifetimeM
var manager1 = CreateNewHubLifetimeManager(backplane);
var manager2 = CreateNewHubLifetimeManager(backplane);
- var ex = await Assert.ThrowsAsync<IOException>(() => manager1.InvokeConnectionAsync<int>("1234", "Result", new object[] { "test" })).DefaultTimeout();
+ var ex = await Assert.ThrowsAsync<IOException>(() => manager1.InvokeConnectionAsync<int>("1234", "Result", new object[] { "test" }, cancellationToken: default)).DefaultTimeout();
Assert.Equal("Connection '1234' does not exist.", ex.Message);
}
}
diff --git a/src/SignalR/server/StackExchangeRedis/src/Internal/AckHandler.cs b/src/SignalR/server/StackExchangeRedis/src/Internal/AckHandler.cs
index 749dac72fd..c48a4976af 100644
--- a/src/SignalR/server/StackExchangeRedis/src/Internal/AckHandler.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/Internal/AckHandler.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Internal;
namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Internal;
-internal class AckHandler : IDisposable
+internal sealed class AckHandler : IDisposable
{
private readonly ConcurrentDictionary<int, AckInfo> _acks = new ConcurrentDictionary<int, AckInfo>();
private readonly Timer _timer;
@@ -81,7 +81,7 @@ internal class AckHandler : IDisposable
}
}
- private class AckInfo
+ private sealed class AckInfo
{
public TaskCompletionSource Tcs { get; private set; }
public long CreatedTick { get; private set; }
diff --git a/src/SignalR/server/StackExchangeRedis/src/Internal/DefaultHubMessageSerializer.cs b/src/SignalR/server/StackExchangeRedis/src/Internal/DefaultHubMessageSerializer.cs
index b8e09c7446..1731cfb370 100644
--- a/src/SignalR/server/StackExchangeRedis/src/Internal/DefaultHubMessageSerializer.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/Internal/DefaultHubMessageSerializer.cs
@@ -6,7 +6,7 @@ using Microsoft.AspNetCore.SignalR.Protocol;
namespace Microsoft.AspNetCore.SignalR.Internal;
-internal class DefaultHubMessageSerializer
+internal sealed class DefaultHubMessageSerializer
{
private readonly List<IHubProtocol> _hubProtocols;
diff --git a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs
index eea3d94992..a079309138 100644
--- a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisChannels.cs
@@ -5,7 +5,7 @@ using System.Runtime.CompilerServices;
namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Internal;
-internal class RedisChannels
+internal sealed class RedisChannels
{
private readonly string _prefix;
diff --git a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisLog.cs b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisLog.cs
index ba7217748a..5df4804c52 100644
--- a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisLog.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisLog.cs
@@ -58,6 +58,9 @@ internal static partial class RedisLog
[LoggerMessage(13, LogLevel.Error, "Error forwarding client result with ID '{InvocationID}' to server.", EventName = "ErrorForwardingResult")]
public static partial void ErrorForwardingResult(ILogger logger, string invocationId, Exception ex);
+ [LoggerMessage(14, LogLevel.Error, "Error connecting to Redis.", EventName = "ErrorConnecting")]
+ public static partial void ErrorConnecting(ILogger logger, Exception ex);
+
// This isn't DefineMessage-based because it's just the simple TextWriter logging from ConnectionMultiplexer
public static void ConnectionMultiplexerMessage(ILogger logger, string? message)
{
diff --git a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisProtocol.cs b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisProtocol.cs
index 7a60143c97..ef658eb1bf 100644
--- a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisProtocol.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisProtocol.cs
@@ -11,7 +11,7 @@ using Microsoft.AspNetCore.SignalR.Protocol;
namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Internal;
-internal class RedisProtocol
+internal sealed class RedisProtocol
{
private readonly DefaultHubMessageSerializer _messageSerializer;
diff --git a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisSubscriptionManager.cs b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisSubscriptionManager.cs
index abb5bd327d..1f69a1406b 100644
--- a/src/SignalR/server/StackExchangeRedis/src/Internal/RedisSubscriptionManager.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/Internal/RedisSubscriptionManager.cs
@@ -1,11 +1,11 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
using System.Collections.Concurrent;
namespace Microsoft.AspNetCore.SignalR.StackExchangeRedis.Internal;
-internal class RedisSubscriptionManager
+internal sealed class RedisSubscriptionManager
{
private readonly ConcurrentDictionary<string, HubConnectionStore> _subscriptions = new ConcurrentDictionary<string, HubConnectionStore>(StringComparer.Ordinal);
private readonly SemaphoreSlim _lock = new SemaphoreSlim(1, 1);
@@ -16,6 +16,13 @@ internal class RedisSubscriptionManager
try
{
+ // Avoid adding subscription if connection is closing/closed
+ // We're in a lock and ConnectionAborted is triggered before OnDisconnectedAsync is called so this is guaranteed to be safe when adding while connection is closing and removing items
+ if (connection.ConnectionAborted.IsCancellationRequested)
+ {
+ return;
+ }
+
var subscription = _subscriptions.GetOrAdd(id, _ => new HubConnectionStore());
subscription.Add(connection);
@@ -32,7 +39,7 @@ internal class RedisSubscriptionManager
}
}
- public async Task RemoveSubscriptionAsync(string id, HubConnectionContext connection, Func<string, Task> unsubscribeMethod)
+ public async Task RemoveSubscriptionAsync(string id, HubConnectionContext connection, object state, Func<object, string, Task> unsubscribeMethod)
{
await _lock.WaitAsync();
@@ -48,7 +55,7 @@ internal class RedisSubscriptionManager
if (subscription.Count == 0)
{
_subscriptions.TryRemove(id, out _);
- await unsubscribeMethod(id);
+ await unsubscribeMethod(state, id);
}
}
finally
diff --git a/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Shipped.txt b/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Shipped.txt
index 5aaa4c1f2e..3259c2463e 100644
--- a/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Shipped.txt
+++ b/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Shipped.txt
@@ -1,7 +1,7 @@
#nullable enable
-~Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>
-~Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver) -> void
-~Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>? globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>? hubOptions) -> void
+Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>
+Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver) -> void
+Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>? globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>? hubOptions) -> void
Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.Dispose() -> void
Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions
Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions.Configuration.get -> StackExchange.Redis.ConfigurationOptions!
diff --git a/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Unshipped.txt b/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Unshipped.txt
index bdac4aa9fd..09d6bc8784 100644
--- a/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Unshipped.txt
+++ b/src/SignalR/server/StackExchangeRedis/src/PublicAPI.Unshipped.txt
@@ -1,8 +1,4 @@
#nullable enable
-*REMOVED*~Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver) -> void
-*REMOVED*~Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>? globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>? hubOptions) -> void
-Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver) -> void
-Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.RedisHubLifetimeManager(Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub!>!>! logger, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisOptions!>! options, Microsoft.AspNetCore.SignalR.IHubProtocolResolver! hubProtocolResolver, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions!>? globalHubOptions, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.SignalR.HubOptions<THub!>!>? hubOptions) -> void
-override Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.InvokeConnectionAsync<T>(string! connectionId, string! methodName, object?[]! args, System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Threading.Tasks.Task<T>!
+override Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.InvokeConnectionAsync<T>(string! connectionId, string! methodName, object?[]! args, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<T>!
override Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.SetConnectionResultAsync(string! connectionId, Microsoft.AspNetCore.SignalR.Protocol.CompletionMessage! result) -> System.Threading.Tasks.Task!
override Microsoft.AspNetCore.SignalR.StackExchangeRedis.RedisHubLifetimeManager<THub>.TryGetReturnType(string! invocationId, out System.Type? type) -> bool
diff --git a/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs b/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs
index 6af795083e..1d8397272a 100644
--- a/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs
+++ b/src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs
@@ -35,6 +35,7 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
private readonly SemaphoreSlim _connectionLock = new SemaphoreSlim(1);
private readonly IHubProtocolResolver _hubProtocolResolver;
private readonly ClientResultsManager _clientResultsManager = new();
+ private bool _redisConnectErrorLogged;
private readonly AckHandler _ackHandler;
private int _internalAckId;
@@ -90,6 +91,7 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
public override async Task OnConnectedAsync(HubConnectionContext connection)
{
await EnsureRedisServerConnection();
+
var feature = new RedisFeature();
connection.Features.Set<IRedisFeature>(feature);
@@ -112,11 +114,17 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
{
_connections.Remove(connection);
- var tasks = new List<Task>();
+ // If the bus is null then the Redis connection failed to be established and none of the other connection setup ran
+ if (_bus is null)
+ {
+ return Task.CompletedTask;
+ }
var connectionChannel = _channels.Connection(connection.ConnectionId);
+ var tasks = new List<Task>();
+
RedisLog.Unsubscribe(_logger, connectionChannel);
- tasks.Add(_bus!.UnsubscribeAsync(connectionChannel));
+ tasks.Add(_bus.UnsubscribeAsync(connectionChannel));
var feature = connection.Features.GetRequiredFeature<IRedisFeature>();
var groupNames = feature.Groups;
@@ -346,10 +354,11 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
{
var groupChannel = _channels.Group(groupName);
- await _groups.RemoveSubscriptionAsync(groupChannel, connection, channelName =>
+ await _groups.RemoveSubscriptionAsync(groupChannel, connection, this, static (state, channelName) =>
{
- RedisLog.Unsubscribe(_logger, channelName);
- return _bus!.UnsubscribeAsync(channelName);
+ var lifetimeManager = (RedisHubLifetimeManager<THub>)state;
+ RedisLog.Unsubscribe(lifetimeManager._logger, channelName);
+ return lifetimeManager._bus!.UnsubscribeAsync(channelName);
});
var feature = connection.Features.GetRequiredFeature<IRedisFeature>();
@@ -378,10 +387,11 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
{
var userChannel = _channels.User(connection.UserIdentifier!);
- return _users.RemoveSubscriptionAsync(userChannel, connection, channelName =>
+ return _users.RemoveSubscriptionAsync(userChannel, connection, this, static (state, channelName) =>
{
- RedisLog.Unsubscribe(_logger, channelName);
- return _bus!.UnsubscribeAsync(channelName);
+ var lifetimeManager = (RedisHubLifetimeManager<THub>)state;
+ RedisLog.Unsubscribe(lifetimeManager._logger, channelName);
+ return lifetimeManager._bus!.UnsubscribeAsync(channelName);
});
}
@@ -396,7 +406,7 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
}
/// <inheritdoc/>
- public override async Task<T> InvokeConnectionAsync<T>(string connectionId, string methodName, object?[] args, CancellationToken cancellationToken = default)
+ public override async Task<T> InvokeConnectionAsync<T>(string connectionId, string methodName, object?[] args, CancellationToken cancellationToken)
{
// send thing
if (connectionId == null)
@@ -418,8 +428,8 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
if (connection == null)
{
// TODO: Need to handle other server going away while waiting for connection result
- var m = _protocol.WriteInvocation(methodName, args, invocationId, returnChannel: _channels.ReturnResults(_serverName));
- var received = await PublishAsync(_channels.Connection(connectionId), m);
+ var messageBytes = _protocol.WriteInvocation(methodName, args, invocationId, returnChannel: _channels.ReturnResults(_serverName));
+ var received = await PublishAsync(_channels.Connection(connectionId), messageBytes);
if (received < 1)
{
throw new IOException($"Connection '{connectionId}' does not exist.");
@@ -704,7 +714,21 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
if (_redisServerConnection == null)
{
var writer = new LoggerTextWriter(_logger);
- _redisServerConnection = await _options.ConnectAsync(writer);
+ try
+ {
+ _redisServerConnection = await _options.ConnectAsync(writer);
+ }
+ catch (Exception ex)
+ {
+ // If the connection hasn't been established yet we shouldn't keep logging the same error over and over
+ // for every new client connection.
+ if (!_redisConnectErrorLogged)
+ {
+ RedisLog.ErrorConnecting(_logger, ex);
+ _redisConnectErrorLogged = true;
+ }
+ throw;
+ }
_bus = _redisServerConnection.GetSubscriber();
_redisServerConnection.ConnectionRestored += (_, e) =>
@@ -760,7 +784,7 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
return $"{Environment.MachineName}_{Guid.NewGuid():N}";
}
- private class LoggerTextWriter : TextWriter
+ private sealed class LoggerTextWriter : TextWriter
{
private readonly ILogger _logger;
@@ -787,7 +811,7 @@ public class RedisHubLifetimeManager<THub> : HubLifetimeManager<THub>, IDisposab
HashSet<string> Groups { get; }
}
- private class RedisFeature : IRedisFeature
+ private sealed class RedisFeature : IRedisFeature
{
public HashSet<string> Groups { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
}
diff --git a/src/SignalR/server/StackExchangeRedis/test/RedisHubLifetimeManagerTests.cs b/src/SignalR/server/StackExchangeRedis/test/RedisHubLifetimeManagerTests.cs
index 1d413bb54b..57827e499c 100644
--- a/src/SignalR/server/StackExchangeRedis/test/RedisHubLifetimeManagerTests.cs
+++ b/src/SignalR/server/StackExchangeRedis/test/RedisHubLifetimeManagerTests.cs
@@ -7,8 +7,11 @@ using Microsoft.AspNetCore.SignalR.Protocol;
using Microsoft.AspNetCore.SignalR.Specification.Tests;
using Microsoft.AspNetCore.SignalR.Tests;
using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Logging.Testing;
using Microsoft.Extensions.Options;
+using Moq;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization;
using Xunit;
@@ -83,6 +86,45 @@ public class RedisHubLifetimeManagerTests : ScaleoutHubLifetimeManagerTests<Test
}
}
+ [Fact]
+ public async Task ErrorFromConnectionFactoryLogsAndAllowsDisconnect()
+ {
+ var server = new TestRedisServer();
+
+ var testSink = new TestSink();
+ var logger = new TestLogger("", testSink, true);
+ var mockLoggerFactory = new Mock<ILoggerFactory>();
+ mockLoggerFactory
+ .Setup(m => m.CreateLogger(It.IsAny<string>()))
+ .Returns((string categoryName) => (ILogger)logger);
+ var loggerT = mockLoggerFactory.Object.CreateLogger<RedisHubLifetimeManager<Hub>>();
+
+ var manager = new RedisHubLifetimeManager<Hub>(
+ loggerT,
+ Options.Create(new RedisOptions()
+ {
+ ConnectionFactory = _ => throw new Exception("throw from connect")
+ }),
+ new DefaultHubProtocolResolver(new IHubProtocol[]
+ {
+ }, NullLogger<DefaultHubProtocolResolver>.Instance));
+
+ using (var client = new TestClient())
+ {
+ var connection = HubConnectionContextUtils.Create(client.Connection);
+
+ var ex = await Assert.ThrowsAsync<Exception>(() => manager.OnConnectedAsync(connection)).DefaultTimeout();
+ Assert.Equal("throw from connect", ex.Message);
+
+ await manager.OnDisconnectedAsync(connection).DefaultTimeout();
+ }
+
+ var logs = testSink.Writes.ToArray();
+ Assert.Single(logs);
+ Assert.Equal("Error connecting to Redis.", logs[0].Message);
+ Assert.Equal("throw from connect", logs[0].Exception.Message);
+ }
+
public override TestRedisServer CreateBackplane()
{
return new TestRedisServer();
diff --git a/src/SignalR/server/StackExchangeRedis/test/TestConnectionMultiplexer.cs b/src/SignalR/server/StackExchangeRedis/test/TestConnectionMultiplexer.cs
index a6671a44fa..99190e6488 100644
--- a/src/SignalR/server/StackExchangeRedis/test/TestConnectionMultiplexer.cs
+++ b/src/SignalR/server/StackExchangeRedis/test/TestConnectionMultiplexer.cs
@@ -232,9 +232,12 @@ public class TestRedisServer
{
if (_subscriptions.TryGetValue(channel, out var handlers))
{
- foreach (var (_, handler) in handlers)
+ lock (handlers)
{
- handler(channel, message);
+ foreach (var (_, handler) in handlers)
+ {
+ handler(channel, message);
+ }
}
}
@@ -253,7 +256,10 @@ public class TestRedisServer
_subscriptions.AddOrUpdate(messageQueue.Channel, _ => new List<(int, Action<RedisChannel, RedisValue>)> { (subscriberId, handler) }, (_, list) =>
{
- list.Add((subscriberId, handler));
+ lock (list)
+ {
+ list.Add((subscriberId, handler));
+ }
return list;
});
}
@@ -262,7 +268,10 @@ public class TestRedisServer
{
if (_subscriptions.TryGetValue(channel, out var list))
{
- list.RemoveAll((item) => item.Item1 == subscriberId);
+ lock (list)
+ {
+ list.RemoveAll((item) => item.Item1 == subscriberId);
+ }
}
}
}
diff --git a/src/Testing/src/AssemblyTestLog.cs b/src/Testing/src/AssemblyTestLog.cs
index 027e41f53c..5475b6b905 100644
--- a/src/Testing/src/AssemblyTestLog.cs
+++ b/src/Testing/src/AssemblyTestLog.cs
@@ -286,7 +286,11 @@ public class AssemblyTestLog : IAcceptFailureReports, IDisposable
.Enrich.FromLogContext()
.Enrich.With(new AssemblyLogTimestampOffsetEnricher(logStart))
.MinimumLevel.Verbose()
- .WriteTo.File(fileName, outputTemplate: "[{TimestampOffset}] [{SourceContext}] [{Level}] {Message:l}{NewLine}{Exception}", flushToDiskInterval: TimeSpan.FromSeconds(1), shared: true)
+ .WriteTo.File(fileName,
+ outputTemplate: "[{TimestampOffset}] [{SourceContext}] [{Level}] {Message:l}{NewLine}{Exception}",
+ flushToDiskInterval: TimeSpan.FromSeconds(1),
+ shared: true,
+ formatProvider: CultureInfo.InvariantCulture)
.CreateLogger();
return new SerilogLoggerProvider(serilogger, dispose: true);
@@ -316,7 +320,7 @@ public class AssemblyTestLog : IAcceptFailureReports, IDisposable
}
}
- private class AssemblyLogTimestampOffsetEnricher : ILogEventEnricher
+ private sealed class AssemblyLogTimestampOffsetEnricher : ILogEventEnricher
{
private readonly DateTimeOffset? _logStart;
@@ -334,7 +338,7 @@ public class AssemblyTestLog : IAcceptFailureReports, IDisposable
: DateTimeOffset.UtcNow.ToString("s", CultureInfo.InvariantCulture)));
}
- private class Disposable : IDisposable
+ private sealed class Disposable : IDisposable
{
private readonly Action _action;
diff --git a/src/Testing/src/DumpCollector/DumpCollector.Windows.cs b/src/Testing/src/DumpCollector/DumpCollector.Windows.cs
index 65d9579c01..cbc2b9b15c 100644
--- a/src/Testing/src/DumpCollector/DumpCollector.Windows.cs
+++ b/src/Testing/src/DumpCollector/DumpCollector.Windows.cs
@@ -31,7 +31,9 @@ public static partial class DumpCollector
private static class NativeMethods
{
[DllImport("Dbghelp.dll")]
+#pragma warning disable SYSLIB1054 // Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time
public static extern bool MiniDumpWriteDump(IntPtr hProcess, uint ProcessId, SafeFileHandle hFile, MINIDUMP_TYPE DumpType, ref MINIDUMP_EXCEPTION_INFORMATION ExceptionParam, IntPtr UserStreamParam, IntPtr CallbackParam);
+#pragma warning restore SYSLIB1054 // Use 'LibraryImportAttribute' instead of 'DllImportAttribute' to generate P/Invoke marshalling code at compile time
[StructLayout(LayoutKind.Sequential, Pack = 4)]
public struct MINIDUMP_EXCEPTION_INFORMATION
diff --git a/src/Testing/src/HelixHelper.cs b/src/Testing/src/HelixHelper.cs
new file mode 100644
index 0000000000..687147b86c
--- /dev/null
+++ b/src/Testing/src/HelixHelper.cs
@@ -0,0 +1,24 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.IO;
+
+namespace Microsoft.AspNetCore.Testing;
+
+public static class HelixHelper
+{
+ public static bool OnHelix() => !string.IsNullOrEmpty(GetTargetHelixQueue());
+
+ public static string GetTargetHelixQueue() => Environment.GetEnvironmentVariable("helix");
+
+ // Uploads the file on helix, or puts the file in your user temp folder when running locally
+ public static void PreserveFile(string filePath, string uploadFileName)
+ {
+ var uploadRoot = Environment.GetEnvironmentVariable("HELIX_WORKITEM_UPLOAD_ROOT");
+ var uploadPath = string.IsNullOrEmpty(uploadRoot)
+ ? Path.Combine(Path.GetTempPath(), uploadFileName)
+ : Path.Combine(uploadRoot, uploadFileName);
+ File.Copy(filePath, uploadPath, overwrite: true);
+ }
+}
diff --git a/src/Testing/src/Logging/LogValuesAssert.cs b/src/Testing/src/Logging/LogValuesAssert.cs
index c6a49cbdc7..e60f5777dd 100644
--- a/src/Testing/src/Logging/LogValuesAssert.cs
+++ b/src/Testing/src/Logging/LogValuesAssert.cs
@@ -62,7 +62,7 @@ public static class LogValuesAssert
return string.Join(",", logValues.Select(kvp => $"[{kvp.Key} {kvp.Value}]"));
}
- private class LogValueComparer : IEqualityComparer<KeyValuePair<string, object>>
+ private sealed class LogValueComparer : IEqualityComparer<KeyValuePair<string, object>>
{
public bool Equals(KeyValuePair<string, object> x, KeyValuePair<string, object> y)
{
diff --git a/src/Testing/src/Logging/TestLogger.cs b/src/Testing/src/Logging/TestLogger.cs
index 50474b5797..996c48358f 100644
--- a/src/Testing/src/Logging/TestLogger.cs
+++ b/src/Testing/src/Logging/TestLogger.cs
@@ -63,7 +63,7 @@ public class TestLogger : ILogger
return logLevel != LogLevel.None && _filter(logLevel);
}
- private class TestDisposable : IDisposable
+ private sealed class TestDisposable : IDisposable
{
public static readonly TestDisposable Instance = new TestDisposable();
diff --git a/src/Testing/src/Logging/XunitLoggerProvider.cs b/src/Testing/src/Logging/XunitLoggerProvider.cs
index 1c3204907d..52ff9cd3ce 100644
--- a/src/Testing/src/Logging/XunitLoggerProvider.cs
+++ b/src/Testing/src/Logging/XunitLoggerProvider.cs
@@ -119,7 +119,7 @@ public class XunitLogger : ILogger
public IDisposable BeginScope<TState>(TState state)
=> new NullScope();
- private class NullScope : IDisposable
+ private sealed class NullScope : IDisposable
{
public void Dispose()
{
diff --git a/src/Testing/src/xunit/AspNetTestCaseRunner.cs b/src/Testing/src/xunit/AspNetTestCaseRunner.cs
index d67465c5e3..e05401010b 100644
--- a/src/Testing/src/xunit/AspNetTestCaseRunner.cs
+++ b/src/Testing/src/xunit/AspNetTestCaseRunner.cs
@@ -10,7 +10,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Testing;
-internal class AspNetTestCaseRunner : XunitTestCaseRunner
+internal sealed class AspNetTestCaseRunner : XunitTestCaseRunner
{
public AspNetTestCaseRunner(
IXunitTestCase testCase,
diff --git a/src/Testing/src/xunit/AspNetTestClassRunner.cs b/src/Testing/src/xunit/AspNetTestClassRunner.cs
index e3d07cec25..493ee13199 100644
--- a/src/Testing/src/xunit/AspNetTestClassRunner.cs
+++ b/src/Testing/src/xunit/AspNetTestClassRunner.cs
@@ -10,7 +10,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Testing;
-internal class AspNetTestClassRunner : XunitTestClassRunner
+internal sealed class AspNetTestClassRunner : XunitTestClassRunner
{
public AspNetTestClassRunner(
ITestClass testClass,
diff --git a/src/Testing/src/xunit/AspNetTestInvoker.cs b/src/Testing/src/xunit/AspNetTestInvoker.cs
index 4dbe5e607e..76b5525569 100644
--- a/src/Testing/src/xunit/AspNetTestInvoker.cs
+++ b/src/Testing/src/xunit/AspNetTestInvoker.cs
@@ -12,7 +12,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Testing;
-internal class AspNetTestInvoker : XunitTestInvoker
+internal sealed class AspNetTestInvoker : XunitTestInvoker
{
private readonly TestOutputHelper _testOutputHelper;
diff --git a/src/Testing/src/xunit/AspNetTestMethodRunner.cs b/src/Testing/src/xunit/AspNetTestMethodRunner.cs
index e80ba5f8b0..c67e888007 100644
--- a/src/Testing/src/xunit/AspNetTestMethodRunner.cs
+++ b/src/Testing/src/xunit/AspNetTestMethodRunner.cs
@@ -10,7 +10,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Testing;
-internal class AspNetTestMethodRunner : XunitTestMethodRunner
+internal sealed class AspNetTestMethodRunner : XunitTestMethodRunner
{
private readonly object[] _constructorArguments;
private readonly IMessageSink _diagnosticMessageSink;
diff --git a/src/Testing/src/xunit/AspNetTestRunner.cs b/src/Testing/src/xunit/AspNetTestRunner.cs
index f0df056853..2285dc88ca 100644
--- a/src/Testing/src/xunit/AspNetTestRunner.cs
+++ b/src/Testing/src/xunit/AspNetTestRunner.cs
@@ -11,7 +11,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Testing;
-internal class AspNetTestRunner : XunitTestRunner
+internal sealed class AspNetTestRunner : XunitTestRunner
{
private readonly TestOutputHelper _testOutputHelper;
private readonly bool _ownsTestOutputHelper;
diff --git a/src/Testing/src/xunit/AspNetTheoryTestCaseRunner.cs b/src/Testing/src/xunit/AspNetTheoryTestCaseRunner.cs
index a43d2b7a7e..71da348a2d 100644
--- a/src/Testing/src/xunit/AspNetTheoryTestCaseRunner.cs
+++ b/src/Testing/src/xunit/AspNetTheoryTestCaseRunner.cs
@@ -10,7 +10,7 @@ using Xunit.Sdk;
namespace Microsoft.AspNetCore.Testing.xunit;
-internal class AspNetTheoryTestCaseRunner : XunitTheoryTestCaseRunner
+internal sealed class AspNetTheoryTestCaseRunner : XunitTheoryTestCaseRunner
{
public AspNetTheoryTestCaseRunner(
IXunitTestCase testCase,
diff --git a/src/Testing/src/xunit/ConditionalFactDiscoverer.cs b/src/Testing/src/xunit/ConditionalFactDiscoverer.cs
index 77af5cf5cc..d9350cc224 100644
--- a/src/Testing/src/xunit/ConditionalFactDiscoverer.cs
+++ b/src/Testing/src/xunit/ConditionalFactDiscoverer.cs
@@ -7,7 +7,7 @@ using Xunit.Sdk;
// Do not change this namespace without changing the usage in ConditionalFactAttribute
namespace Microsoft.AspNetCore.Testing;
-internal class ConditionalFactDiscoverer : FactDiscoverer
+internal sealed class ConditionalFactDiscoverer : FactDiscoverer
{
private readonly IMessageSink _diagnosticMessageSink;
diff --git a/src/Testing/src/xunit/ConditionalTheoryDiscoverer.cs b/src/Testing/src/xunit/ConditionalTheoryDiscoverer.cs
index 770586b08b..2572a100c9 100644
--- a/src/Testing/src/xunit/ConditionalTheoryDiscoverer.cs
+++ b/src/Testing/src/xunit/ConditionalTheoryDiscoverer.cs
@@ -9,7 +9,7 @@ using Xunit.Sdk;
// Do not change this namespace without changing the usage in ConditionalTheoryAttribute
namespace Microsoft.AspNetCore.Testing;
-internal class ConditionalTheoryDiscoverer : TheoryDiscoverer
+internal sealed class ConditionalTheoryDiscoverer : TheoryDiscoverer
{
public ConditionalTheoryDiscoverer(IMessageSink diagnosticMessageSink)
: base(diagnosticMessageSink)
diff --git a/src/Testing/src/xunit/SkipNonHelix.cs b/src/Testing/src/xunit/SkipNonHelix.cs
index f504093d3d..f43ff1e65f 100644
--- a/src/Testing/src/xunit/SkipNonHelix.cs
+++ b/src/Testing/src/xunit/SkipNonHelix.cs
@@ -34,6 +34,6 @@ public class SkipNonHelixAttribute : Attribute, ITestCondition
}
}
- public static bool OnHelix() => !string.IsNullOrEmpty(GetTargetHelixQueue());
- public static string GetTargetHelixQueue() => Environment.GetEnvironmentVariable("helix");
+ public static bool OnHelix() => HelixHelper.OnHelix();
+ public static string GetTargetHelixQueue() => HelixHelper.GetTargetHelixQueue();
}
diff --git a/src/Testing/src/xunit/SkipOnCIAttribute.cs b/src/Testing/src/xunit/SkipOnCIAttribute.cs
index d1308567d6..e5bd5f458f 100644
--- a/src/Testing/src/xunit/SkipOnCIAttribute.cs
+++ b/src/Testing/src/xunit/SkipOnCIAttribute.cs
@@ -35,8 +35,8 @@ public class SkipOnCIAttribute : Attribute, ITestCondition
}
public static bool OnCI() => OnHelix() || OnAzdo();
- public static bool OnHelix() => !string.IsNullOrEmpty(GetTargetHelixQueue());
- public static string GetTargetHelixQueue() => Environment.GetEnvironmentVariable("helix");
+ public static bool OnHelix() => HelixHelper.OnHelix();
+ public static string GetTargetHelixQueue() => HelixHelper.GetTargetHelixQueue();
public static bool OnAzdo() => !string.IsNullOrEmpty(GetIfOnAzdo());
public static string GetIfOnAzdo() => Environment.GetEnvironmentVariable("AGENT_OS");
}
diff --git a/src/Testing/src/xunit/SkipOnHelixAttribute.cs b/src/Testing/src/xunit/SkipOnHelixAttribute.cs
index e187e201b3..e1ef756fb7 100644
--- a/src/Testing/src/xunit/SkipOnHelixAttribute.cs
+++ b/src/Testing/src/xunit/SkipOnHelixAttribute.cs
@@ -65,7 +65,7 @@ public class SkipOnHelixAttribute : Attribute, ITestCondition
return Queues.ToLowerInvariant().Split(';').Contains(targetQueue);
}
- public static bool OnHelix() => !string.IsNullOrEmpty(GetTargetHelixQueue());
+ public static bool OnHelix() => HelixHelper.OnHelix();
- public static string GetTargetHelixQueue() => Environment.GetEnvironmentVariable("helix");
+ public static string GetTargetHelixQueue() => HelixHelper.GetTargetHelixQueue();
}
diff --git a/src/Testing/src/xunit/WORKAROUND_SkippedDataRowTestCase.cs b/src/Testing/src/xunit/WORKAROUND_SkippedDataRowTestCase.cs
index d0f09f5344..73786ee821 100644
--- a/src/Testing/src/xunit/WORKAROUND_SkippedDataRowTestCase.cs
+++ b/src/Testing/src/xunit/WORKAROUND_SkippedDataRowTestCase.cs
@@ -12,7 +12,7 @@ namespace Microsoft.AspNetCore.Testing;
// from xUnit with the exception of fixing the bug.
//
// This will only work with [ConditionalTheory].
-internal class WORKAROUND_SkippedDataRowTestCase : XunitTestCase
+internal sealed class WORKAROUND_SkippedDataRowTestCase : XunitTestCase
{
string skipReason;
diff --git a/src/Testing/test/QuarantinedTestAttributeTest.cs b/src/Testing/test/QuarantinedTestAttributeTest.cs
index bc1a4aaeb0..7c0a35d690 100644
--- a/src/Testing/test/QuarantinedTestAttributeTest.cs
+++ b/src/Testing/test/QuarantinedTestAttributeTest.cs
@@ -18,4 +18,12 @@ public class QuarantinedTestAttributeTest
throw new Exception("Flaky!");
}
}
+
+ [Fact]
+ [QuarantinedTest("No issue, used to verify retry is working")]
+ public void FlakyTestToEnsureRetryWorks()
+ {
+ // Fail 20% of the time
+ Assert.True(new Random().Next(100) <= 80);
+ }
}
diff --git a/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs b/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs
index f5970d8a11..0dacfb93ff 100644
--- a/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs
+++ b/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs
@@ -25,7 +25,7 @@ public class CertificateManagerTests : IClassFixture<CertFixture>
Output = output;
}
- public const string TestCertificateSubject = "CN=aspnet.test";
+ private const string TestCertificateSubject = "CN=aspnet.test";
public ITestOutputHelper Output { get; }
@@ -94,7 +94,7 @@ public class CertificateManagerTests : IClassFixture<CertFixture>
Assert.Contains(
httpsCertificate.Extensions.OfType<X509Extension>(),
e => e.Critical == false &&
- e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" &&
+ e.Oid.Value == CertificateManager.AspNetHttpsOid &&
e.RawData[0] == _manager.AspNetHttpsCertificateVersion);
Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString());
@@ -409,13 +409,13 @@ public class CertificateManagerTests : IClassFixture<CertFixture>
Assert.Contains(
firstCertificate.Extensions.OfType<X509Extension>(),
e => e.Critical == false &&
- e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" &&
+ e.Oid.Value == CertificateManager.AspNetHttpsOid &&
e.RawData[0] == 2);
Assert.Contains(
secondCertificate.Extensions.OfType<X509Extension>(),
e => e.Critical == false &&
- e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" &&
+ e.Oid.Value == CertificateManager.AspNetHttpsOid &&
e.RawData[0] == 1);
}
}
diff --git a/src/Tools/GetDocumentInsider/src/CommandException.cs b/src/Tools/GetDocumentInsider/src/CommandException.cs
index a1221460de..f46c412199 100644
--- a/src/Tools/GetDocumentInsider/src/CommandException.cs
+++ b/src/Tools/GetDocumentInsider/src/CommandException.cs
@@ -5,7 +5,7 @@ using System;
namespace Microsoft.Extensions.ApiDescription.Tool;
-internal class CommandException : Exception
+internal sealed class CommandException : Exception
{
public CommandException(string message)
: base(message)
diff --git a/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommand.cs b/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommand.cs
index e834b3665f..599fbd9941 100644
--- a/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommand.cs
+++ b/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommand.cs
@@ -13,7 +13,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.Extensions.ApiDescription.Tool.Commands;
-internal class GetDocumentCommand : ProjectCommandBase
+internal sealed class GetDocumentCommand : ProjectCommandBase
{
private CommandOption _fileListPath;
private CommandOption _output;
@@ -141,7 +141,7 @@ internal class GetDocumentCommand : ProjectCommandBase
}
}
- private class AssemblyInfo
+ private sealed class AssemblyInfo
{
public AssemblyInfo(string path)
{
diff --git a/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommandWorker.cs b/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommandWorker.cs
index 144c2219c1..13d3faab7b 100644
--- a/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommandWorker.cs
+++ b/src/Tools/GetDocumentInsider/src/Commands/GetDocumentCommandWorker.cs
@@ -12,7 +12,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.Extensions.ApiDescription.Tool.Commands;
-internal class GetDocumentCommandWorker
+internal sealed class GetDocumentCommandWorker
{
private const string DefaultDocumentName = "v1";
private const string DocumentService = "Microsoft.Extensions.ApiDescriptions.IDocumentProvider";
diff --git a/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj b/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj
index 323336d985..93a7fac782 100644
--- a/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj
+++ b/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj
@@ -7,6 +7,8 @@
<RootNamespace>Microsoft.Extensions.ApiDescription.Tool</RootNamespace>
<TargetFrameworks>netcoreapp2.1;$(DefaultNetFxTargetFramework)</TargetFrameworks>
<IsShippingPackage>false</IsShippingPackage>
+ <Nullable>disable</Nullable>
+ <NoWarn>$(NoWarn);nullable</NoWarn>
</PropertyGroup>
<ItemGroup Condition="'$(TargetFramework)' == '$(DefaultNetFxTargetFramework)'">
diff --git a/src/Tools/GetDocumentInsider/src/Program.cs b/src/Tools/GetDocumentInsider/src/Program.cs
index 56d1b0df83..b7f2463234 100644
--- a/src/Tools/GetDocumentInsider/src/Program.cs
+++ b/src/Tools/GetDocumentInsider/src/Program.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.Extensions.ApiDescription.Tool;
-internal class Program : ProgramBase
+internal sealed class Program : ProgramBase
{
public Program(IConsole console) : base(console)
{
diff --git a/src/Tools/LinkabilityChecker/LinkabilityChecker.csproj b/src/Tools/LinkabilityChecker/LinkabilityChecker.csproj
index 2643063b73..394ebbfcfb 100644
--- a/src/Tools/LinkabilityChecker/LinkabilityChecker.csproj
+++ b/src/Tools/LinkabilityChecker/LinkabilityChecker.csproj
@@ -13,6 +13,7 @@
<ItemGroup>
<!-- Packages required to produce a complete dependency graph for the trimmer -->
+ <Reference Include="System.Configuration.ConfigurationManager" />
<Reference Include="System.Security.Permissions" />
<Reference Include="System.Threading.AccessControl" />
</ItemGroup>
diff --git a/src/Tools/LinkabilityChecker/Program.cs b/src/Tools/LinkabilityChecker/Program.cs
index 6977a16379..51173b7c6d 100644
--- a/src/Tools/LinkabilityChecker/Program.cs
+++ b/src/Tools/LinkabilityChecker/Program.cs
@@ -1,7 +1,7 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-internal class Program
+internal sealed class Program
{
private static int Main()
{
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Application.cs b/src/Tools/Microsoft.dotnet-openapi/src/Application.cs
index e69ebfc33d..f217549e6c 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Application.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Application.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.CommandLineUtils;
namespace Microsoft.DotNet.OpenApi;
-internal class Application : CommandLineApplication
+internal sealed class Application : CommandLineApplication
{
static Application()
{
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddCommand.cs b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddCommand.cs
index cb39268ee3..e4066cdf2e 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddCommand.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddCommand.cs
@@ -6,7 +6,7 @@ using Microsoft.DotNet.Openapi.Tools;
namespace Microsoft.DotNet.OpenApi.Commands;
-internal class AddCommand : BaseCommand
+internal sealed class AddCommand : BaseCommand
{
private const string CommandName = "add";
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddFileCommand.cs b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddFileCommand.cs
index 4224b4995a..c4b44c4b26 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddFileCommand.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddFileCommand.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.DotNet.OpenApi.Commands;
-internal class AddFileCommand : BaseCommand
+internal sealed class AddFileCommand : BaseCommand
{
private const string CommandName = "file";
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddProjectCommand.cs b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddProjectCommand.cs
index 4e65fbee92..05946860e7 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddProjectCommand.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddProjectCommand.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.DotNet.OpenApi.Commands;
-internal class AddProjectCommand : BaseCommand
+internal sealed class AddProjectCommand : BaseCommand
{
private const string CommandName = "project";
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddURLCommand.cs b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddURLCommand.cs
index 78ff78b7d5..14cb18c4d5 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddURLCommand.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Commands/AddURLCommand.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.DotNet.OpenApi.Commands;
-internal class AddURLCommand : BaseCommand
+internal sealed class AddURLCommand : BaseCommand
{
private const string CommandName = "url";
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Commands/RefreshCommand.cs b/src/Tools/Microsoft.dotnet-openapi/src/Commands/RefreshCommand.cs
index ca45c65404..21e5527662 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Commands/RefreshCommand.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Commands/RefreshCommand.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.DotNet.OpenApi.Commands;
-internal class RefreshCommand : BaseCommand
+internal sealed class RefreshCommand : BaseCommand
{
private const string CommandName = "refresh";
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Commands/RemoveCommand.cs b/src/Tools/Microsoft.dotnet-openapi/src/Commands/RemoveCommand.cs
index 9de20e2b3e..dac4c07b93 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Commands/RemoveCommand.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Commands/RemoveCommand.cs
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.DotNet.OpenApi.Commands;
-internal class RemoveCommand : BaseCommand
+internal sealed class RemoveCommand : BaseCommand
{
private const string CommandName = "remove";
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Internal/OpenapiDependencyAttribute.cs b/src/Tools/Microsoft.dotnet-openapi/src/Internal/OpenapiDependencyAttribute.cs
index 8fa1a207be..74813f4197 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Internal/OpenapiDependencyAttribute.cs
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Internal/OpenapiDependencyAttribute.cs
@@ -9,7 +9,7 @@ using Microsoft.DotNet.OpenApi;
namespace Microsoft.DotNet.Openapi.Tools.Internal;
[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
-internal class OpenApiDependencyAttribute : Attribute
+internal sealed class OpenApiDependencyAttribute : Attribute
{
public OpenApiDependencyAttribute(string name, string version, string codeGenerators)
{
diff --git a/src/Tools/Microsoft.dotnet-openapi/src/Microsoft.dotnet-openapi.csproj b/src/Tools/Microsoft.dotnet-openapi/src/Microsoft.dotnet-openapi.csproj
index 1248c38308..58f97791a9 100644
--- a/src/Tools/Microsoft.dotnet-openapi/src/Microsoft.dotnet-openapi.csproj
+++ b/src/Tools/Microsoft.dotnet-openapi/src/Microsoft.dotnet-openapi.csproj
@@ -17,6 +17,7 @@
<ItemGroup>
<Reference Include="Microsoft.Build" ExcludeAssets="runtime" />
<Reference Include="Microsoft.Build.Locator" />
+ <Reference Include="System.Private.Uri" />
</ItemGroup>
<ItemGroup>
diff --git a/src/Tools/SDK-Analyzers/Components/src/ComponentSymbols.cs b/src/Tools/SDK-Analyzers/Components/src/ComponentSymbols.cs
index a278907a82..d1e7f9c671 100644
--- a/src/Tools/SDK-Analyzers/Components/src/ComponentSymbols.cs
+++ b/src/Tools/SDK-Analyzers/Components/src/ComponentSymbols.cs
@@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis;
namespace Microsoft.AspNetCore.Components.Analyzers;
-internal class ComponentSymbols
+internal sealed class ComponentSymbols
{
public static bool TryCreate(Compilation compilation, out ComponentSymbols symbols)
{
diff --git a/src/Tools/SDK-Analyzers/Components/src/InternalUsageAnalyzer.cs b/src/Tools/SDK-Analyzers/Components/src/InternalUsageAnalyzer.cs
index fe6ce82a35..264ec4bcc2 100644
--- a/src/Tools/SDK-Analyzers/Components/src/InternalUsageAnalyzer.cs
+++ b/src/Tools/SDK-Analyzers/Components/src/InternalUsageAnalyzer.cs
@@ -9,7 +9,7 @@ using Microsoft.CodeAnalysis.Operations;
namespace Microsoft.Extensions.Internal;
-internal class InternalUsageAnalyzer
+internal sealed class InternalUsageAnalyzer
{
private readonly Func<ISymbol, bool> _isInternalNamespace;
private readonly Func<ISymbol, bool> _hasInternalAttribute;
diff --git a/src/Tools/SDK-Analyzers/Components/test/Verifiers/DiagnosticVerifier.cs b/src/Tools/SDK-Analyzers/Components/test/Verifiers/DiagnosticVerifier.cs
index f020e0a221..8dde75a736 100644
--- a/src/Tools/SDK-Analyzers/Components/test/Verifiers/DiagnosticVerifier.cs
+++ b/src/Tools/SDK-Analyzers/Components/test/Verifiers/DiagnosticVerifier.cs
@@ -169,13 +169,13 @@ public abstract partial class DiagnosticVerifier
expected.Severity, actual.Severity, FormatDiagnostics(analyzer, actual)));
}
- if (actual.GetMessage() != expected.Message)
+ if (actual.GetMessage(CultureInfo.InvariantCulture) != expected.Message)
{
Assert.True(false,
string.Format(
CultureInfo.InvariantCulture,
"Expected diagnostic message to be \"{0}\" was \"{1}\"\r\n\r\nDiagnostic:\r\n {2}\r\n",
- expected.Message, actual.GetMessage(), FormatDiagnostics(analyzer, actual)));
+ expected.Message, actual.GetMessage(CultureInfo.InvariantCulture), FormatDiagnostics(analyzer, actual)));
}
}
}
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/MsBuildProjectFinder.cs b/src/Tools/Shared/SecretsHelpers/MsBuildProjectFinder.cs
index ee93ddb7d5..3133799e95 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/MsBuildProjectFinder.cs
+++ b/src/Tools/Shared/SecretsHelpers/MsBuildProjectFinder.cs
@@ -1,14 +1,11 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.IO;
using System.Linq;
+using Microsoft.AspNetCore.Tools;
using Microsoft.Extensions.Tools.Internal;
-namespace Microsoft.Extensions.SecretManager.Tools.Internal;
-
-internal class MsBuildProjectFinder
+internal sealed class MsBuildProjectFinder
{
private readonly string _directory;
@@ -36,12 +33,12 @@ internal class MsBuildProjectFinder
if (projects.Count > 1)
{
- throw new FileNotFoundException(Resources.FormatError_MultipleProjectsFound(projectPath));
+ throw new FileNotFoundException(SecretsHelpersResources.FormatError_MultipleProjectsFound(projectPath));
}
if (projects.Count == 0)
{
- throw new FileNotFoundException(Resources.FormatError_NoProjectsFound(projectPath));
+ throw new FileNotFoundException(SecretsHelpersResources.FormatError_NoProjectsFound(projectPath));
}
return projects[0];
@@ -49,7 +46,7 @@ internal class MsBuildProjectFinder
if (!File.Exists(projectPath))
{
- throw new FileNotFoundException(Resources.FormatError_ProjectPath_NotFound(projectPath));
+ throw new FileNotFoundException(SecretsHelpersResources.FormatError_ProjectPath_NotFound(projectPath));
}
return projectPath;
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/ProjectIdResolver.cs b/src/Tools/Shared/SecretsHelpers/ProjectIdResolver.cs
index 95657b8c0b..d9c794586a 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/ProjectIdResolver.cs
+++ b/src/Tools/Shared/SecretsHelpers/ProjectIdResolver.cs
@@ -6,16 +6,15 @@ using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
+using Microsoft.AspNetCore.Tools;
using Microsoft.Extensions.CommandLineUtils;
using Microsoft.Extensions.Tools.Internal;
-namespace Microsoft.Extensions.SecretManager.Tools.Internal;
-
/// <summary>
/// This API supports infrastructure and is not intended to be used
/// directly from your code. This API may change or be removed in future releases.
/// </summary>
-public class ProjectIdResolver
+internal sealed class ProjectIdResolver
{
private const string DefaultConfig = "Debug";
private readonly IReporter _reporter;
@@ -32,9 +31,18 @@ public class ProjectIdResolver
public string Resolve(string project, string configuration)
{
var finder = new MsBuildProjectFinder(_workingDirectory);
- var projectFile = finder.FindMsBuildProject(project);
+ string projectFile;
+ try
+ {
+ projectFile = finder.FindMsBuildProject(project);
+ }
+ catch (Exception ex)
+ {
+ _reporter.Error(ex.Message);
+ return null;
+ }
- _reporter.Verbose(Resources.FormatMessage_Project_File_Path(projectFile));
+ _reporter.Verbose(SecretsHelpersResources.FormatMessage_Project_File_Path(projectFile));
configuration = !string.IsNullOrEmpty(configuration)
? configuration
@@ -98,18 +106,20 @@ public class ProjectIdResolver
_reporter.Verbose(outputBuilder.ToString());
_reporter.Verbose(errorBuilder.ToString());
_reporter.Error($"Exit code: {process.ExitCode}");
- throw new InvalidOperationException(Resources.FormatError_ProjectFailedToLoad(projectFile));
+ _reporter.Error(SecretsHelpersResources.FormatError_ProjectFailedToLoad(projectFile));
+ return null;
}
if (!File.Exists(outputFile))
{
- throw new InvalidOperationException(Resources.FormatError_ProjectMissingId(projectFile));
+ _reporter.Error(SecretsHelpersResources.FormatError_ProjectMissingId(projectFile));
+ return null;
}
var id = File.ReadAllText(outputFile)?.Trim();
if (string.IsNullOrEmpty(id))
{
- throw new InvalidOperationException(Resources.FormatError_ProjectMissingId(projectFile));
+ _reporter.Error(SecretsHelpersResources.FormatError_ProjectMissingId(projectFile));
}
return id;
diff --git a/src/Tools/Shared/SecretsHelpers/SecretsHelpersResources.resx b/src/Tools/Shared/SecretsHelpers/SecretsHelpersResources.resx
new file mode 100644
index 0000000000..bdc7cd88d5
--- /dev/null
+++ b/src/Tools/Shared/SecretsHelpers/SecretsHelpersResources.resx
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="Error_InvalidSecretsId" xml:space="preserve">
+ <value>The UserSecretsId '{userSecretsId}' cannot contain any characters that cannot be used in a file path.</value>
+ </data>
+ <data name="Error_MultipleProjectsFound" xml:space="preserve">
+ <value>Multiple MSBuild project files found in '{projectPath}'. Specify which to use with the --project option.</value>
+ </data>
+ <data name="Error_NoProjectsFound" xml:space="preserve">
+ <value>Could not find a MSBuild project file in '{projectPath}'. Specify which project to use with the --project option.</value>
+ </data>
+ <data name="Error_ProjectFailedToLoad" xml:space="preserve">
+ <value>Could not load the MSBuild project '{project}'.</value>
+ </data>
+ <data name="Error_ProjectMissingId" xml:space="preserve">
+ <value>Could not find the global property 'UserSecretsId' in MSBuild project '{project}'. Ensure this property is set in the project or use the '--id' command line option.</value>
+ </data>
+ <data name="Error_ProjectPath_NotFound" xml:space="preserve">
+ <value>The project file '{0}' does not exist.</value>
+ </data>
+ <data name="Message_ProjectAlreadyInitialized" xml:space="preserve">
+ <value>The MSBuild project '{project}' has already been initialized with a UserSecretsId.</value>
+ </data>
+ <data name="Message_Project_File_Path" xml:space="preserve">
+ <value>Project file path {project}.</value>
+ </data>
+ <data name="Message_SetUserSecretsIdForProject" xml:space="preserve">
+ <value>Set UserSecretsId to '{userSecretsId}' for MSBuild project '{project}'.</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/src/Tools/Shared/SecretsHelpers/UserSecretsCreator.cs b/src/Tools/Shared/SecretsHelpers/UserSecretsCreator.cs
new file mode 100644
index 0000000000..19c2a6e5c1
--- /dev/null
+++ b/src/Tools/Shared/SecretsHelpers/UserSecretsCreator.cs
@@ -0,0 +1,84 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using System.Xml;
+using System.Xml.Linq;
+using System.Xml.XPath;
+using Microsoft.AspNetCore.Tools;
+using Microsoft.Extensions.Tools.Internal;
+
+internal static class UserSecretsCreator
+{
+ public static string CreateUserSecretsId(IReporter reporter, string project, string workingDirectory, string overrideId = null)
+ {
+ var projectPath = ResolveProjectPath(project, workingDirectory);
+
+ // Load the project file as XML
+ var projectDocument = XDocument.Load(projectPath, LoadOptions.PreserveWhitespace);
+
+ // Accept the `--id` CLI option to the main app
+ string newSecretsId = string.IsNullOrWhiteSpace(overrideId)
+ ? Guid.NewGuid().ToString()
+ : overrideId;
+
+ // Confirm secret ID does not contain invalid characters
+ if (Path.GetInvalidPathChars().Any(newSecretsId.Contains))
+ {
+ throw new ArgumentException(SecretsHelpersResources.FormatError_InvalidSecretsId(newSecretsId));
+ }
+
+ var existingUserSecretsId = projectDocument.XPathSelectElements("//UserSecretsId").FirstOrDefault();
+
+ // Check if a UserSecretsId is already set
+ if (existingUserSecretsId is not null)
+ {
+ // Only set the UserSecretsId if the user specified an explicit value
+ if (string.IsNullOrWhiteSpace(overrideId))
+ {
+ reporter.Output(SecretsHelpersResources.FormatMessage_ProjectAlreadyInitialized(projectPath));
+ return existingUserSecretsId.Value;
+ }
+
+ existingUserSecretsId.SetValue(newSecretsId);
+ }
+ else
+ {
+ // Find the first non-conditional PropertyGroup
+ var propertyGroup = projectDocument.Root.DescendantNodes()
+ .FirstOrDefault(node => node is XElement el
+ && el.Name == "PropertyGroup"
+ && el.Attributes().All(attr =>
+ attr.Name != "Condition")) as XElement;
+
+ // No valid property group, create a new one
+ if (propertyGroup == null)
+ {
+ propertyGroup = new XElement("PropertyGroup");
+ projectDocument.Root.AddFirst(propertyGroup);
+ }
+
+ // Add UserSecretsId element
+ propertyGroup.Add(" ");
+ propertyGroup.Add(new XElement("UserSecretsId", newSecretsId));
+ propertyGroup.Add($"{Environment.NewLine} ");
+ }
+
+ var settings = new XmlWriterSettings
+ {
+ OmitXmlDeclaration = true,
+ };
+
+ using var xw = XmlWriter.Create(projectPath, settings);
+ projectDocument.Save(xw);
+
+ reporter.Output(SecretsHelpersResources.FormatMessage_SetUserSecretsIdForProject(newSecretsId, projectPath));
+ return newSecretsId;
+ }
+
+ private static string ResolveProjectPath(string name, string path)
+ {
+ var finder = new MsBuildProjectFinder(path);
+ return finder.FindMsBuildProject(name);
+ }
+}
diff --git a/src/Tools/dotnet-user-secrets/src/assets/SecretManager.targets b/src/Tools/Shared/SecretsHelpers/assets/SecretManager.targets
index 8cf63eac00..8cf63eac00 100644
--- a/src/Tools/dotnet-user-secrets/src/assets/SecretManager.targets
+++ b/src/Tools/Shared/SecretsHelpers/assets/SecretManager.targets
diff --git a/src/Tools/Shared/TestHelpers/TestConsole.cs b/src/Tools/Shared/TestHelpers/TestConsole.cs
index 9bfab671b4..c0e0e6dcd2 100644
--- a/src/Tools/Shared/TestHelpers/TestConsole.cs
+++ b/src/Tools/Shared/TestHelpers/TestConsole.cs
@@ -69,7 +69,7 @@ public class TestConsole : IConsole
_testWriter.ClearOutput();
}
- private class TestOutputWriter : TextWriter
+ private sealed class TestOutputWriter : TextWriter
{
private readonly ITestOutputHelper _output;
private readonly StringBuilder _sb = new StringBuilder();
diff --git a/src/Tools/Tools.slnf b/src/Tools/Tools.slnf
index 9e1a35eff8..096ec397aa 100644
--- a/src/Tools/Tools.slnf
+++ b/src/Tools/Tools.slnf
@@ -2,8 +2,10 @@
"solution": {
"path": "..\\..\\AspNetCore.sln",
"projects": [
+ "src\\Antiforgery\\src\\Microsoft.AspNetCore.Antiforgery.csproj",
"src\\Components\\Authorization\\src\\Microsoft.AspNetCore.Components.Authorization.csproj",
"src\\Components\\Components\\src\\Microsoft.AspNetCore.Components.csproj",
+ "src\\Components\\CustomElements\\src\\Microsoft.AspNetCore.Components.CustomElements.csproj",
"src\\Components\\Forms\\src\\Microsoft.AspNetCore.Components.Forms.csproj",
"src\\Components\\WebAssembly\\Authentication.Msal\\src\\Microsoft.Authentication.WebAssembly.Msal.csproj",
"src\\Components\\WebAssembly\\JSInterop\\src\\Microsoft.JSInterop.WebAssembly.csproj",
@@ -17,12 +19,14 @@
"src\\DataProtection\\EntityFrameworkCore\\src\\Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.csproj",
"src\\DataProtection\\Extensions\\src\\Microsoft.AspNetCore.DataProtection.Extensions.csproj",
"src\\DataProtection\\StackExchangeRedis\\src\\Microsoft.AspNetCore.DataProtection.StackExchangeRedis.csproj",
+ "src\\DefaultBuilder\\src\\Microsoft.AspNetCore.csproj",
"src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
"src\\HealthChecks\\Abstractions\\src\\Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj",
"src\\HealthChecks\\HealthChecks\\src\\Microsoft.Extensions.Diagnostics.HealthChecks.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
"src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj",
"src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj",
+ "src\\Html.Abstractions\\src\\Microsoft.AspNetCore.Html.Abstractions.csproj",
"src\\Http\\Authentication.Abstractions\\src\\Microsoft.AspNetCore.Authentication.Abstractions.csproj",
"src\\Http\\Authentication.Core\\src\\Microsoft.AspNetCore.Authentication.Core.csproj",
"src\\Http\\Headers\\src\\Microsoft.Net.Http.Headers.csproj",
@@ -34,7 +38,11 @@
"src\\Http\\Routing.Abstractions\\src\\Microsoft.AspNetCore.Routing.Abstractions.csproj",
"src\\Http\\Routing\\src\\Microsoft.AspNetCore.Routing.csproj",
"src\\Http\\WebUtilities\\src\\Microsoft.AspNetCore.WebUtilities.csproj",
+ "src\\Identity\\Core\\src\\Microsoft.AspNetCore.Identity.csproj",
+ "src\\Identity\\Extensions.Core\\src\\Microsoft.Extensions.Identity.Core.csproj",
+ "src\\Identity\\Extensions.Stores\\src\\Microsoft.Extensions.Identity.Stores.csproj",
"src\\JSInterop\\Microsoft.JSInterop\\src\\Microsoft.JSInterop.csproj",
+ "src\\Localization\\Abstractions\\src\\Microsoft.Extensions.Localization.Abstractions.csproj",
"src\\Middleware\\CORS\\src\\Microsoft.AspNetCore.Cors.csproj",
"src\\Middleware\\ConcurrencyLimiter\\src\\Microsoft.AspNetCore.ConcurrencyLimiter.csproj",
"src\\Middleware\\Diagnostics.Abstractions\\src\\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj",
@@ -50,15 +58,34 @@
"src\\Middleware\\Localization.Routing\\src\\Microsoft.AspNetCore.Localization.Routing.csproj",
"src\\Middleware\\Localization\\src\\Microsoft.AspNetCore.Localization.csproj",
"src\\Middleware\\MiddlewareAnalysis\\src\\Microsoft.AspNetCore.MiddlewareAnalysis.csproj",
+ "src\\Middleware\\OutputCaching\\src\\Microsoft.AspNetCore.OutputCaching.csproj",
+ "src\\Middleware\\RateLimiting\\src\\Microsoft.AspNetCore.RateLimiting.csproj",
+ "src\\Middleware\\RequestDecompression\\src\\Microsoft.AspNetCore.RequestDecompression.csproj",
"src\\Middleware\\ResponseCaching.Abstractions\\src\\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj",
"src\\Middleware\\ResponseCaching\\src\\Microsoft.AspNetCore.ResponseCaching.csproj",
"src\\Middleware\\ResponseCompression\\src\\Microsoft.AspNetCore.ResponseCompression.csproj",
"src\\Middleware\\Rewrite\\src\\Microsoft.AspNetCore.Rewrite.csproj",
"src\\Middleware\\Session\\src\\Microsoft.AspNetCore.Session.csproj",
+ "src\\Middleware\\Spa\\SpaProxy\\src\\Microsoft.AspNetCore.SpaProxy.csproj",
+ "src\\Middleware\\Spa\\SpaServices.Extensions\\src\\Microsoft.AspNetCore.SpaServices.Extensions.csproj",
"src\\Middleware\\StaticFiles\\src\\Microsoft.AspNetCore.StaticFiles.csproj",
"src\\Middleware\\WebSockets\\src\\Microsoft.AspNetCore.WebSockets.csproj",
"src\\ObjectPool\\src\\Microsoft.Extensions.ObjectPool.csproj",
+ "src\\Security\\Authentication\\Certificate\\src\\Microsoft.AspNetCore.Authentication.Certificate.csproj",
+ "src\\Security\\Authentication\\Cookies\\src\\Microsoft.AspNetCore.Authentication.Cookies.csproj",
+ "src\\Security\\Authentication\\Core\\src\\Microsoft.AspNetCore.Authentication.csproj",
+ "src\\Security\\Authentication\\Facebook\\src\\Microsoft.AspNetCore.Authentication.Facebook.csproj",
+ "src\\Security\\Authentication\\Google\\src\\Microsoft.AspNetCore.Authentication.Google.csproj",
+ "src\\Security\\Authentication\\JwtBearer\\src\\Microsoft.AspNetCore.Authentication.JwtBearer.csproj",
+ "src\\Security\\Authentication\\MicrosoftAccount\\src\\Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj",
+ "src\\Security\\Authentication\\Negotiate\\src\\Microsoft.AspNetCore.Authentication.Negotiate.csproj",
+ "src\\Security\\Authentication\\OAuth\\src\\Microsoft.AspNetCore.Authentication.OAuth.csproj",
+ "src\\Security\\Authentication\\OpenIdConnect\\src\\Microsoft.AspNetCore.Authentication.OpenIdConnect.csproj",
+ "src\\Security\\Authentication\\Twitter\\src\\Microsoft.AspNetCore.Authentication.Twitter.csproj",
+ "src\\Security\\Authentication\\WsFederation\\src\\Microsoft.AspNetCore.Authentication.WsFederation.csproj",
"src\\Security\\Authorization\\Core\\src\\Microsoft.AspNetCore.Authorization.csproj",
+ "src\\Security\\Authorization\\Policy\\src\\Microsoft.AspNetCore.Authorization.Policy.csproj",
+ "src\\Security\\CookiePolicy\\src\\Microsoft.AspNetCore.CookiePolicy.csproj",
"src\\Servers\\Connections.Abstractions\\src\\Microsoft.AspNetCore.Connections.Abstractions.csproj",
"src\\Servers\\HttpSys\\src\\Microsoft.AspNetCore.Server.HttpSys.csproj",
"src\\Servers\\IIS\\IISIntegration\\src\\Microsoft.AspNetCore.Server.IISIntegration.csproj",
@@ -80,8 +107,11 @@
"src\\Tools\\dotnet-dev-certs\\src\\dotnet-dev-certs.csproj",
"src\\Tools\\dotnet-getdocument\\src\\dotnet-getdocument.csproj",
"src\\Tools\\dotnet-sql-cache\\src\\dotnet-sql-cache.csproj",
+ "src\\Tools\\dotnet-user-jwts\\src\\dotnet-user-jwts.csproj",
+ "src\\Tools\\dotnet-user-jwts\\test\\dotnet-user-jwts.Tests.csproj",
"src\\Tools\\dotnet-user-secrets\\src\\dotnet-user-secrets.csproj",
- "src\\Tools\\dotnet-user-secrets\\test\\dotnet-user-secrets.Tests.csproj"
+ "src\\Tools\\dotnet-user-secrets\\test\\dotnet-user-secrets.Tests.csproj",
+ "src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj"
]
}
-} \ No newline at end of file
+}
diff --git a/src/Tools/dotnet-dev-certs/src/Program.cs b/src/Tools/dotnet-dev-certs/src/Program.cs
index 9c8728a5fd..642bdc3e55 100644
--- a/src/Tools/dotnet-dev-certs/src/Program.cs
+++ b/src/Tools/dotnet-dev-certs/src/Program.cs
@@ -1,9 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.Collections.Generic;
-using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
@@ -13,8 +10,10 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.AspNetCore.DeveloperCertificates.Tools;
-internal class Program
+internal sealed class Program
{
+ // NOTE: Exercise caution when touching these exit codes, since existing tooling
+ // might depend on some of these values.
private const int CriticalError = -1;
private const int Success = 0;
private const int ErrorCreatingTheCertificate = 1;
@@ -74,8 +73,8 @@ internal class Program
// We want to force generating a key without a password to not be an accident.
var noPassword = c.Option("-np|--no-password",
- "Explicitly request that you don't use a password for the key when exporting a certificate to a PEM format",
- CommandOptionType.NoValue);
+ "Explicitly request that you don't use a password for the key when exporting a certificate to a PEM format",
+ CommandOptionType.NoValue);
var check = c.Option(
"-c|--check",
@@ -170,10 +169,10 @@ internal class Program
if (clean.HasValue())
{
- var clean = CleanHttpsCertificates(reporter);
- if (clean != Success || !import.HasValue())
+ var cleanResult = CleanHttpsCertificates(reporter);
+ if (cleanResult != Success || !import.HasValue())
{
- return clean;
+ return cleanResult;
}
return ImportCertificate(import, password, reporter);
@@ -365,9 +364,9 @@ internal class Program
{
reporter.Warn("Trusting the HTTPS development certificate was requested. If the certificate is not " +
"already trusted we will run the following command:" + Environment.NewLine +
- "'sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain <<certificate>>'" +
+ "'security add-trusted-cert -p basic -p ssl -k <<login-keychain>> <<certificate>>'" +
Environment.NewLine + "This command might prompt you for your password to install the certificate " +
- "on the system keychain. To undo these changes: 'sudo security remove-trusted-cert -d <<certificate>>'");
+ "on the keychain. To undo these changes: 'security remove-trusted-cert <<certificate>>'" + Environment.NewLine);
}
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -430,6 +429,12 @@ internal class Program
case EnsureCertificateResult.UserCancelledTrustStep:
reporter.Warn("The user cancelled the trust step.");
return ErrorUserCancelledTrustPrompt;
+ case EnsureCertificateResult.ExistingHttpsCertificateTrusted:
+ reporter.Output("Successfully trusted the existing HTTPS certificate.");
+ return Success;
+ case EnsureCertificateResult.NewHttpsCertificateTrusted:
+ reporter.Output("Successfully created and trusted a new HTTPS certificate.");
+ return Success;
default:
reporter.Error("Something went wrong. The HTTPS developer certificate could not be created.");
return CriticalError;
diff --git a/src/Tools/dotnet-dev-certs/src/ReporterEventListener.cs b/src/Tools/dotnet-dev-certs/src/ReporterEventListener.cs
index 3263a2899c..7a7f843935 100644
--- a/src/Tools/dotnet-dev-certs/src/ReporterEventListener.cs
+++ b/src/Tools/dotnet-dev-certs/src/ReporterEventListener.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.AspNetCore.DeveloperCertificates.Tools;
-internal class ReporterEventListener : EventListener
+internal sealed class ReporterEventListener : EventListener
{
private readonly IReporter _reporter;
diff --git a/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj b/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj
index 922933eecd..c644415502 100644
--- a/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj
+++ b/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj
@@ -18,4 +18,8 @@
<Compile Include="$(ToolSharedSourceRoot)CommandLine\**\*.cs" />
</ItemGroup>
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests" />
+ </ItemGroup>
+
</Project>
diff --git a/src/Tools/dotnet-getdocument/src/Commands/InvokeCommand.cs b/src/Tools/dotnet-getdocument/src/Commands/InvokeCommand.cs
index 9e0aa2e2c9..7c7b8fb568 100644
--- a/src/Tools/dotnet-getdocument/src/Commands/InvokeCommand.cs
+++ b/src/Tools/dotnet-getdocument/src/Commands/InvokeCommand.cs
@@ -13,7 +13,7 @@ using Newtonsoft.Json.Linq;
namespace Microsoft.Extensions.ApiDescription.Tool.Commands;
-internal class InvokeCommand : HelpCommandBase
+internal sealed class InvokeCommand : HelpCommandBase
{
private const string InsideManName = "GetDocument.Insider";
diff --git a/src/Tools/dotnet-getdocument/src/Program.cs b/src/Tools/dotnet-getdocument/src/Program.cs
index a7a8a9bdd8..8e77d01f4f 100644
--- a/src/Tools/dotnet-getdocument/src/Program.cs
+++ b/src/Tools/dotnet-getdocument/src/Program.cs
@@ -6,7 +6,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.Extensions.ApiDescription.Tool;
-internal class Program : ProgramBase
+internal sealed class Program : ProgramBase
{
public Program(IConsole console) : base(console)
{
diff --git a/src/Tools/dotnet-getdocument/src/ProjectOptions.cs b/src/Tools/dotnet-getdocument/src/ProjectOptions.cs
index 1e8b89f4c6..f2b55eec5e 100644
--- a/src/Tools/dotnet-getdocument/src/ProjectOptions.cs
+++ b/src/Tools/dotnet-getdocument/src/ProjectOptions.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.CommandLineUtils;
namespace Microsoft.Extensions.ApiDescription.Tool;
-internal class ProjectOptions
+internal sealed class ProjectOptions
{
public CommandOption AssemblyPath { get; private set; }
diff --git a/src/Tools/dotnet-sql-cache/src/SqlQueries.cs b/src/Tools/dotnet-sql-cache/src/SqlQueries.cs
index 6494c575e8..2a4595a868 100644
--- a/src/Tools/dotnet-sql-cache/src/SqlQueries.cs
+++ b/src/Tools/dotnet-sql-cache/src/SqlQueries.cs
@@ -6,7 +6,7 @@ using System.Globalization;
namespace Microsoft.Extensions.Caching.SqlConfig.Tools;
-internal class SqlQueries
+internal sealed class SqlQueries
{
private const string CreateTableFormat = "CREATE TABLE {0}(" +
// Maximum size of primary key column is 900 bytes (898 bytes from key + 2 additional bytes used by the
diff --git a/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj b/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj
index 24f2823009..ca9fb454c3 100644
--- a/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj
+++ b/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj
@@ -15,6 +15,7 @@
<ItemGroup>
<Reference Include="Microsoft.Data.SqlClient" />
+ <Reference Include="System.Private.Uri" />
</ItemGroup>
</Project>
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/ClearCommand.cs b/src/Tools/dotnet-user-jwts/src/Commands/ClearCommand.cs
new file mode 100644
index 0000000000..2b977e3f63
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/ClearCommand.cs
@@ -0,0 +1,70 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class ClearCommand
+{
+ public static void Register(ProjectCommandLineApplication app)
+ {
+ app.Command("clear", cmd =>
+ {
+ cmd.Description = Resources.ClearCommand_Description;
+
+ var forceOption = cmd.Option(
+ "--force",
+ Resources.ClearCommand_ForceOption_Description,
+ CommandOptionType.NoValue);
+
+ cmd.HelpOption("-h|--help");
+
+ cmd.OnExecute(() =>
+ {
+ return Execute(cmd.Reporter, cmd.ProjectOption.Value(), forceOption.HasValue());
+ });
+ });
+ }
+
+ private static int Execute(IReporter reporter, string projectPath, bool force)
+ {
+ if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var project, out var userSecretsId))
+ {
+ return 1;
+ }
+ var jwtStore = new JwtStore(userSecretsId);
+ var count = jwtStore.Jwts.Count;
+
+ if (count == 0)
+ {
+ reporter.Output(Resources.FormatClearCommand_NoJwtsRemoved(project));
+ return 0;
+ }
+
+ if (!force)
+ {
+ reporter.Output(Resources.FormatClearCommand_Permission(count, project));
+ reporter.Output("[Y]es / [N]o");
+ if (Console.ReadLine().Trim().ToUpperInvariant() != "Y")
+ {
+ reporter.Output(Resources.ClearCommand_Canceled);
+ return 0;
+ }
+ }
+
+ var appsettingsFilePath = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ foreach (var jwt in jwtStore.Jwts)
+ {
+ JwtAuthenticationSchemeSettings.RemoveScheme(appsettingsFilePath, jwt.Value.Scheme);
+ }
+
+ jwtStore.Jwts.Clear();
+ jwtStore.Save();
+
+ reporter.Output(Resources.FormatClearCommand_Confirmed(count, project));
+
+ return 0;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/CreateCommand.cs b/src/Tools/dotnet-user-jwts/src/Commands/CreateCommand.cs
new file mode 100644
index 0000000000..efe415057f
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/CreateCommand.cs
@@ -0,0 +1,271 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.Linq;
+using System.Text.Json;
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class CreateCommand
+{
+ private static readonly string[] _dateTimeFormats = new[] {
+ "yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy/MM/dd", "yyyy/MM/dd HH:mm", "yyyy-MM-ddTHH:mm:ss.fffffffzzz" };
+ private static readonly string[] _timeSpanFormats = new[] {
+ @"d\dh\hm\ms\s", @"d\dh\hm\m", @"d\dh\h", @"d\d",
+ @"h\hm\ms\s", @"h\hm\m", @"h\h",
+ @"m\ms\s", @"m\m",
+ @"s\s"
+ };
+
+ public static void Register(ProjectCommandLineApplication app)
+ {
+ app.Command("create", cmd =>
+ {
+ cmd.Description = Resources.CreateCommand_Description;
+
+ var schemeNameOption = cmd.Option(
+ "--scheme",
+ Resources.CreateCommand_SchemeOption_Description,
+ CommandOptionType.SingleValue
+ );
+
+ var nameOption = cmd.Option(
+ "-n|--name",
+ Resources.CreateCommand_NameOption_Description,
+ CommandOptionType.SingleValue);
+
+ var audienceOption = cmd.Option(
+ "--audience",
+ Resources.CreateCommand_AudienceOption_Description,
+ CommandOptionType.MultipleValue);
+
+ var issuerOption = cmd.Option(
+ "--issuer",
+ Resources.CreateCommand_IssuerOption_Description,
+ CommandOptionType.SingleValue);
+
+ var scopesOption = cmd.Option(
+ "--scope",
+ Resources.CreateCommand_ScopeOption_Description,
+ CommandOptionType.MultipleValue);
+
+ var rolesOption = cmd.Option(
+ "--role",
+ Resources.CreateCommand_RoleOption_Description,
+ CommandOptionType.MultipleValue);
+
+ var claimsOption = cmd.Option(
+ "--claim",
+ Resources.CreateCommand_ClaimOption_Description,
+ CommandOptionType.MultipleValue);
+
+ var notBeforeOption = cmd.Option(
+ "--not-before",
+ Resources.CreateCommand_NotBeforeOption_Description,
+ CommandOptionType.SingleValue);
+
+ var expiresOnOption = cmd.Option(
+ "--expires-on",
+ Resources.CreateCommand_ExpiresOnOption_Description,
+ CommandOptionType.SingleValue);
+
+ var validForOption = cmd.Option(
+ "--valid-for",
+ Resources.CreateCommand_ValidForOption_Description,
+ CommandOptionType.SingleValue);
+
+ var outputOption = cmd.Option(
+ "-o|--output",
+ Resources.CreateCommand_OutputOption_Description,
+ CommandOptionType.SingleValue);
+
+ cmd.HelpOption("-h|--help");
+
+ cmd.OnExecute(() =>
+ {
+ var (options, isValid, optionsString) = ValidateArguments(
+ cmd.Reporter, cmd.ProjectOption, schemeNameOption, nameOption, audienceOption, issuerOption, notBeforeOption, expiresOnOption, validForOption, rolesOption, scopesOption, claimsOption);
+
+ if (!isValid)
+ {
+ return 1;
+ }
+
+ return Execute(cmd.Reporter, cmd.ProjectOption.Value(), options, optionsString, outputOption.Value());
+ });
+ });
+ }
+
+ private static (JwtCreatorOptions, bool, string) ValidateArguments(
+ IReporter reporter,
+ CommandOption projectOption,
+ CommandOption schemeNameOption,
+ CommandOption nameOption,
+ CommandOption audienceOption,
+ CommandOption issuerOption,
+ CommandOption notBeforeOption,
+ CommandOption expiresOnOption,
+ CommandOption validForOption,
+ CommandOption rolesOption,
+ CommandOption scopesOption,
+ CommandOption claimsOption)
+ {
+ var isValid = true;
+ var project = DevJwtCliHelpers.GetProject(projectOption.Value());
+
+ if (project == null)
+ {
+ reporter.Error(Resources.ProjectOption_ProjectNotFound);
+ isValid = false;
+ // Break out early if we haven't been able to resolve a project
+ // since we depend on it for the managing of JWT tokens
+ return (
+ null,
+ isValid,
+ string.Empty
+ );
+ }
+
+ var scheme = schemeNameOption.HasValue() ? schemeNameOption.Value() : "Bearer";
+ var optionsString = schemeNameOption.HasValue() ? $"{Resources.JwtPrint_Scheme}: {scheme}{Environment.NewLine}" : string.Empty;
+
+ var name = nameOption.HasValue() ? nameOption.Value() : Environment.UserName;
+ optionsString += $"{Resources.JwtPrint_Name}: {name}{Environment.NewLine}";
+
+ var audience = audienceOption.HasValue() ? audienceOption.Values : DevJwtCliHelpers.GetAudienceCandidatesFromLaunchSettings(project);
+ optionsString += audienceOption.HasValue() ? $"{Resources.JwtPrint_Audiences}: {string.Join(", ", audience)}{Environment.NewLine}" : string.Empty;
+ if (audience is null || audience.Count == 0)
+ {
+ reporter.Error(Resources.CreateCommand_NoAudience_Error);
+ isValid = false;
+ }
+ var issuer = issuerOption.HasValue() ? issuerOption.Value() : DevJwtsDefaults.Issuer;
+ optionsString += issuerOption.HasValue() ? $"{Resources.JwtPrint_Issuer}: {issuer}{Environment.NewLine}" : string.Empty;
+
+ var notBefore = DateTime.UtcNow;
+ if (notBeforeOption.HasValue())
+ {
+ if (!ParseDate(notBeforeOption.Value(), out notBefore))
+ {
+ reporter.Error(Resources.FormatCreateCommand_InvalidDate_Error("--not-before"));
+ isValid = false;
+ }
+ optionsString += $"{Resources.JwtPrint_NotBefore}: {notBefore:O}{Environment.NewLine}";
+ }
+
+ var expiresOn = notBefore.AddMonths(3);
+ if (expiresOnOption.HasValue())
+ {
+ if (!ParseDate(expiresOnOption.Value(), out expiresOn))
+ {
+ reporter.Error(Resources.FormatCreateCommand_InvalidDate_Error("--expires-on"));
+ isValid = false;
+ }
+
+ if (validForOption.HasValue())
+ {
+ reporter.Error(Resources.CreateCommand_InvalidExpiresOn_Error);
+ isValid = false;
+ }
+ else
+ {
+ optionsString += $"{Resources.JwtPrint_ExpiresOn}: {expiresOn:O}{Environment.NewLine}";
+ }
+
+ }
+
+ if (validForOption.HasValue())
+ {
+ if (!TimeSpan.TryParseExact(validForOption.Value(), _timeSpanFormats, CultureInfo.InvariantCulture, out var validForValue))
+ {
+ reporter.Error(Resources.FormatCreateCommand_InvalidPeriod_Error("--valid-for"));
+ }
+ expiresOn = notBefore.Add(validForValue);
+
+ if (expiresOnOption.HasValue())
+ {
+ reporter.Error(Resources.CreateCommand_InvalidExpiresOn_Error);
+ isValid = false;
+ }
+ else
+ {
+ optionsString += $"{Resources.JwtPrint_ExpiresOn}: {expiresOn:O}{Environment.NewLine}";
+ }
+ }
+
+ var roles = rolesOption.HasValue() ? rolesOption.Values : new List<string>();
+ optionsString += rolesOption.HasValue() ? $"{Resources.JwtPrint_Roles}: [{string.Join(", ", roles)}]{Environment.NewLine}" : string.Empty;
+
+ var scopes = scopesOption.HasValue() ? scopesOption.Values : new List<string>();
+ optionsString += scopesOption.HasValue() ? $"{Resources.JwtPrint_Scopes}: {string.Join(", ", scopes)}{Environment.NewLine}" : string.Empty;
+
+ var claims = new Dictionary<string, string>();
+ if (claimsOption.HasValue())
+ {
+ if (!DevJwtCliHelpers.TryParseClaims(claimsOption.Values, out claims))
+ {
+ reporter.Error(Resources.CreateCommand_InvalidClaims_Error);
+ isValid = false;
+ }
+ optionsString += $"{Resources.JwtPrint_CustomClaims}: [{string.Join(", ", claims.Select(kvp => $"{kvp.Key}={kvp.Value}"))}]{Environment.NewLine}";
+ }
+
+ return (
+ new JwtCreatorOptions(scheme, name, audience, issuer, notBefore, expiresOn, roles, scopes, claims),
+ isValid,
+ optionsString);
+
+ static bool ParseDate(string datetime, out DateTime parsedDateTime) =>
+ DateTime.TryParseExact(datetime, _dateTimeFormats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out parsedDateTime);
+ }
+
+ private static int Execute(
+ IReporter reporter,
+ string projectPath,
+ JwtCreatorOptions options,
+ string optionsString,
+ string outputFormat)
+ {
+ if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var project, out var userSecretsId))
+ {
+ return 1;
+ }
+ var keyMaterial = SigningKeysHandler.GetOrCreateSigningKeyMaterial(userSecretsId, options.Scheme, options.Issuer);
+
+ var jwtIssuer = new JwtIssuer(options.Issuer, keyMaterial);
+ var jwtToken = jwtIssuer.Create(options);
+
+ var jwtStore = new JwtStore(userSecretsId);
+ var jwt = Jwt.Create(options.Scheme, jwtToken, JwtIssuer.WriteToken(jwtToken), options.Scopes, options.Roles, options.Claims);
+ if (options.Claims is { } customClaims)
+ {
+ jwt.CustomClaims = customClaims;
+ }
+ jwtStore.Jwts.Add(jwtToken.Id, jwt);
+ jwtStore.Save();
+
+ var appsettingsFilePath = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ var settingsToWrite = new JwtAuthenticationSchemeSettings(options.Scheme, options.Audiences, options.Issuer);
+ settingsToWrite.Save(appsettingsFilePath);
+
+ switch (outputFormat)
+ {
+ case "token":
+ reporter.Output(jwt.Token);
+ break;
+ case "json":
+ reporter.Output(JsonSerializer.Serialize(jwt, new JsonSerializerOptions { WriteIndented = true }));
+ break;
+ default:
+ reporter.Output(Resources.FormatCreateCommand_Confirmed(jwtToken.Id));
+ reporter.Output(optionsString);
+ reporter.Output($"{Resources.JwtPrint_Token}: {jwt.Token}");
+ break;
+ }
+
+ return 0;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/KeyCommand.cs b/src/Tools/dotnet-user-jwts/src/Commands/KeyCommand.cs
new file mode 100644
index 0000000000..c4e899d999
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/KeyCommand.cs
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class KeyCommand
+{
+ public static void Register(ProjectCommandLineApplication app)
+ {
+ app.Command("key", cmd =>
+ {
+ cmd.Description = Resources.KeyCommand_Description;
+
+ var schemeOption = cmd.Option(
+ "--scheme",
+ Resources.KeyCommand_SchemeOption_Description,
+ CommandOptionType.SingleValue);
+
+ var issuerOption = cmd.Option(
+ "--issuer",
+ Resources.KeyCommand_IssuerOption_Description,
+ CommandOptionType.SingleValue
+ );
+
+ var resetOption = cmd.Option(
+ "--reset",
+ Resources.KeyCommand_ResetOption_Description,
+ CommandOptionType.NoValue);
+
+ var forceOption = cmd.Option(
+ "--force",
+ Resources.KeyCommand_ForceOption_Description,
+ CommandOptionType.NoValue);
+
+ cmd.HelpOption("-h|--help");
+
+ cmd.OnExecute(() =>
+ {
+ return Execute(cmd.Reporter,
+ cmd.ProjectOption.Value(),
+ schemeOption.Value() ?? DevJwtsDefaults.Scheme,
+ issuerOption.Value() ?? DevJwtsDefaults.Issuer,
+ resetOption.HasValue(), forceOption.HasValue());
+ });
+ });
+ }
+
+ private static int Execute(IReporter reporter, string projectPath, string scheme, string issuer, bool reset, bool force)
+ {
+ if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var _, out var userSecretsId))
+ {
+ return 1;
+ }
+
+ if (reset == true)
+ {
+ if (!force)
+ {
+ reporter.Output(Resources.KeyCommand_Permission);
+ reporter.Error("[Y]es / [N]o");
+ if (Console.ReadLine().Trim().ToUpperInvariant() != "Y")
+ {
+ reporter.Output(Resources.KeyCommand_Canceled);
+ return 0;
+ }
+ }
+
+ var key = SigningKeysHandler.CreateSigningKeyMaterial(userSecretsId, scheme, issuer, reset: true);
+ reporter.Output(Resources.FormatKeyCommand_KeyCreated(Convert.ToBase64String(key)));
+ return 0;
+ }
+
+ var signingKeyMaterial = SigningKeysHandler.GetSigningKeyMaterial(userSecretsId, scheme, issuer);
+
+ if (signingKeyMaterial is null)
+ {
+ reporter.Output(Resources.KeyCommand_KeyNotFound);
+ return 0;
+ }
+
+ reporter.Output(Resources.FormatKeyCommand_Confirmed(signingKeyMaterial));
+ return 0;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/ListCommand.cs b/src/Tools/dotnet-user-jwts/src/Commands/ListCommand.cs
new file mode 100644
index 0000000000..6ed346d20d
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/ListCommand.cs
@@ -0,0 +1,74 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class ListCommand
+{
+ public static void Register(ProjectCommandLineApplication app)
+ {
+ app.Command("list", cmd =>
+ {
+ cmd.Description = Resources.ListCommand_Description;
+
+ var showTokensOption = cmd.Option(
+ "--show-tokens",
+ Resources.ListCommand_ShowTokenOption_Description,
+ CommandOptionType.NoValue);
+
+ cmd.HelpOption("-h|--help");
+
+ cmd.OnExecute(() =>
+ {
+ return Execute(cmd.Reporter, cmd.ProjectOption.Value(), showTokensOption.HasValue());
+ });
+ });
+ }
+
+ private static int Execute(IReporter reporter, string projectPath, bool showTokens)
+ {
+ if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var project, out var userSecretsId))
+ {
+ return 1;
+ }
+ var jwtStore = new JwtStore(userSecretsId);
+
+ reporter.Output(Resources.FormatListCommand_Project(project));
+ reporter.Output(Resources.FormatListCommand_UserSecretsId(userSecretsId));
+
+ if (jwtStore.Jwts is { Count: > 0 } jwts)
+ {
+ var table = new ConsoleTable(reporter);
+ table.AddColumns(Resources.JwtPrint_Id, Resources.JwtPrint_Scheme, Resources.JwtPrint_Audiences, Resources.JwtPrint_IssuedOn, Resources.JwtPrint_ExpiresOn);
+
+ if (showTokens)
+ {
+ table.AddColumns(Resources.JwtPrint_Token);
+ }
+
+ foreach (var jwtRow in jwts)
+ {
+ var jwt = jwtRow.Value;
+ if (showTokens)
+ {
+ table.AddRow(jwt.Id, jwt.Scheme, jwt.Audience, jwt.Issued.ToString("O"), jwt.Expires.ToString("O"), jwt.Token);
+ }
+ else
+ {
+ table.AddRow(jwt.Id, jwt.Scheme, jwt.Audience, jwt.Issued.ToString("O"), jwt.Expires.ToString("O"));
+ }
+ }
+
+ table.Write();
+ }
+ else
+ {
+ reporter.Output(Resources.ListCommand_NoJwts);
+ }
+
+ return 0;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/PrintCommand.cs b/src/Tools/dotnet-user-jwts/src/Commands/PrintCommand.cs
new file mode 100644
index 0000000000..97873ad818
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/PrintCommand.cs
@@ -0,0 +1,58 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IdentityModel.Tokens.Jwt;
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+internal sealed class PrintCommand
+{
+ public static void Register(ProjectCommandLineApplication app)
+ {
+ app.Command("print", cmd =>
+ {
+ cmd.Description = Resources.PrintCommand_Description;
+
+ var idArgument = cmd.Argument("[id]", Resources.PrintCommand_IdArgument_Description);
+ var showAllOption = cmd.Option("--show-all", Resources.PrintCommand_ShowAllOption_Description, CommandOptionType.NoValue);
+
+ cmd.HelpOption("-h|--help");
+
+ cmd.OnExecute(() =>
+ {
+ if (idArgument.Value is null)
+ {
+ cmd.ShowHelp();
+ return 0;
+ }
+ return Execute(
+ cmd.Reporter,
+ cmd.ProjectOption.Value(),
+ idArgument.Value,
+ showAllOption.HasValue());
+ });
+ });
+ }
+
+ private static int Execute(IReporter reporter, string projectPath, string id, bool showAll)
+ {
+ if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var _, out var userSecretsId))
+ {
+ return 1;
+ }
+ var jwtStore = new JwtStore(userSecretsId);
+
+ if (!jwtStore.Jwts.TryGetValue(id, out var jwt))
+ {
+ reporter.Output(Resources.FormatPrintCommand_NoJwtFound(id));
+ return 1;
+ }
+
+ reporter.Output(Resources.FormatPrintCommand_Confirmed(id));
+ JwtSecurityToken fullToken = JwtIssuer.Extract(jwt.Token);
+ DevJwtCliHelpers.PrintJwt(reporter, jwt, showAll, fullToken);
+
+ return 0;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/ProjectCommandLineApplication.cs b/src/Tools/dotnet-user-jwts/src/Commands/ProjectCommandLineApplication.cs
new file mode 100644
index 0000000000..497543297a
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/ProjectCommandLineApplication.cs
@@ -0,0 +1,32 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class ProjectCommandLineApplication : CommandLineApplication
+{
+ public CommandOption ProjectOption { get; private set; }
+
+ public IReporter Reporter { get; private set; }
+
+ public ProjectCommandLineApplication(IReporter reporter, bool throwOnUnexpectedArg = true, bool continueAfterUnexpectedArg = false, bool treatUnmatchedOptionsAsArguments = false)
+ : base(throwOnUnexpectedArg, continueAfterUnexpectedArg, treatUnmatchedOptionsAsArguments)
+ {
+ ProjectOption = Option(
+ "-p|--project",
+ Resources.ProjectOption_Description,
+ CommandOptionType.SingleValue);
+ Reporter = reporter;
+ }
+
+ public ProjectCommandLineApplication Command(string name, Action<ProjectCommandLineApplication> configuration)
+ {
+ var command = new ProjectCommandLineApplication(Reporter) { Name = name, Parent = this };
+ Commands.Add(command);
+ configuration(command);
+ return command;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Commands/RemoveCommand.cs b/src/Tools/dotnet-user-jwts/src/Commands/RemoveCommand.cs
new file mode 100644
index 0000000000..1efa3beed8
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Commands/RemoveCommand.cs
@@ -0,0 +1,56 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class RemoveCommand
+{
+ public static void Register(ProjectCommandLineApplication app)
+ {
+ app.Command("remove", cmd =>
+ {
+ cmd.Description = Resources.RemoveCommand_Description;
+
+ var idArgument = cmd.Argument("[id]", Resources.RemoveCommand_IdArgument_Description);
+ cmd.HelpOption("-h|--help");
+
+ cmd.OnExecute(() =>
+ {
+ if (idArgument.Value is null)
+ {
+ cmd.ShowHelp();
+ return 0;
+ }
+ return Execute(cmd.Reporter, cmd.ProjectOption.Value(), idArgument.Value);
+ });
+ });
+ }
+
+ private static int Execute(IReporter reporter, string projectPath, string id)
+ {
+ if (!DevJwtCliHelpers.GetProjectAndSecretsId(projectPath, reporter, out var project, out var userSecretsId))
+ {
+ return 1;
+ }
+ var jwtStore = new JwtStore(userSecretsId);
+
+ if (!jwtStore.Jwts.ContainsKey(id))
+ {
+ reporter.Error(Resources.FormatRemoveCommand_NoJwtFound(id));
+ return 1;
+ }
+
+ var jwt = jwtStore.Jwts[id];
+ var appsettingsFilePath = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ JwtAuthenticationSchemeSettings.RemoveScheme(appsettingsFilePath, jwt.Scheme);
+ jwtStore.Jwts.Remove(id);
+ jwtStore.Save();
+
+ reporter.Output(Resources.FormatRemoveCommand_Confirmed(id));
+
+ return 0;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/ConsoleTable.cs b/src/Tools/dotnet-user-jwts/src/Helpers/ConsoleTable.cs
new file mode 100644
index 0000000000..3970804461
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/ConsoleTable.cs
@@ -0,0 +1,137 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Data;
+using System.Globalization;
+using System.Linq;
+using System.Text;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.Extensions.CommandLineUtils;
+
+internal sealed class ConsoleTable
+{
+ private readonly List<string> _columns = new();
+ private readonly List<string[]> _rows = new();
+ private readonly IReporter _reporter;
+
+ public ConsoleTable(IReporter reporter)
+ {
+ _reporter = reporter;
+ }
+
+ public void AddColumns(params string[] names)
+ {
+ _columns.AddRange(names);
+ }
+
+ public void AddRow(params string[] values)
+ {
+ if (values == null)
+ {
+ throw new ArgumentNullException(nameof(values));
+ }
+
+ if (!_columns.Any())
+ {
+ throw new Exception("Columns must be set before rows can be added.");
+ }
+
+ if (_columns.Count != values.Length)
+ {
+ throw new Exception(
+ $"The number of columns in the table '{_columns.Count}' does not match the number of columns in the row '{values.Length}'.");
+ }
+
+ _rows.Add(values);
+ }
+
+ public void Write()
+ {
+ var builder = new StringBuilder();
+
+ var maxColumnLengths = _columns
+ .Select((t, i) => _rows.Select(x => x[i])
+ .Concat(new[] { _columns[i] })
+ .Where(x => x != null)
+ .Select(x => x!.ToString()!.Length).Max())
+ .ToList();
+
+ // The table borders constructed using "|" have whitespaces before and after.
+ // This number accounts for those spaces to ensure that the table width is not longer than the console window's width.
+ var EXCESS_LENGTH_CREATED_BY_BORDERS = 4;
+
+ var equalColumnLengths = Math.Max((Console.WindowWidth / _columns.Count) - EXCESS_LENGTH_CREATED_BY_BORDERS, 5);
+
+ var excessLength = 0;
+ var numberOfColumnsThatNeedMoreLength = 0;
+
+ // Keep track of the excess length left behind by narrow columns and the number of columns that could use the extra length.
+ for (var i = 0; i < maxColumnLengths.Count; i++)
+ {
+ if (maxColumnLengths[i] < equalColumnLengths)
+ {
+ excessLength += equalColumnLengths - maxColumnLengths[i];
+ }
+ else
+ {
+ numberOfColumnsThatNeedMoreLength += 1;
+ maxColumnLengths[i] = equalColumnLengths;
+ }
+ }
+
+ // Share the excess length amongst the columns that could use it.
+ for (var i = 0; i < maxColumnLengths.Count; i++)
+ {
+ if (maxColumnLengths[i] == equalColumnLengths)
+ {
+ maxColumnLengths[i] += excessLength / numberOfColumnsThatNeedMoreLength;
+ }
+ }
+
+ var formatRow = Enumerable.Range(0, _columns.Count)
+ .Select(i => " | {" + i + ", " + maxColumnLengths[i] + "}")
+ .Aggregate((previousRowColumn, nextRowColumn) => previousRowColumn + nextRowColumn) + " |";
+
+ var columnHeaders = string.Format(CultureInfo.InvariantCulture, formatRow, _columns.ToArray());
+ var rowDivider = $" {new string('-', columnHeaders.Length - 1)} ";
+
+ builder.AppendLine(rowDivider);
+ builder.AppendLine(columnHeaders);
+
+ WriteTableContent(_rows, maxColumnLengths, rowDivider, builder);
+
+ void WriteTableContent(List<string[]> rows, List<int> columnLengths, string divider, StringBuilder stringBuilder)
+ {
+ stringBuilder.AppendLine(divider);
+
+ for (var i = 0; i < rows.Count; i++)
+ {
+ while (!rows[i].All(i => i == string.Empty))
+ {
+ var outputRow = string.Empty;
+
+ for (var j = 0; j < rows[i].Length; j++)
+ {
+ outputRow = string.Concat(outputRow, " | ");
+
+ if (rows[i][j].Length <= columnLengths[j])
+ {
+ outputRow = string.Concat(outputRow, rows[i][j], new string(' ', columnLengths[j] - rows[i][j].Length));
+ rows[i][j] = string.Empty;
+ }
+ else
+ {
+ outputRow = string.Concat(outputRow, rows[i][j].Substring(0, columnLengths[j]));
+ rows[i][j] = rows[i][j].Substring(columnLengths[j]);
+ }
+ }
+ outputRow = string.Concat(outputRow, " |");
+ stringBuilder.AppendLine(outputRow);
+ }
+ stringBuilder.AppendLine(divider);
+ }
+ _reporter.Output(builder.ToString());
+ }
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/DevJwtCliHelpers.cs b/src/Tools/dotnet-user-jwts/src/Helpers/DevJwtCliHelpers.cs
new file mode 100644
index 0000000000..273037f5a7
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/DevJwtCliHelpers.cs
@@ -0,0 +1,208 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Text.Json;
+using System.Text.Json.Nodes;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.Configuration.UserSecrets;
+using Microsoft.Extensions.Tools.Internal;
+using Microsoft.IdentityModel.Tokens;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal static class DevJwtCliHelpers
+{
+ public static string GetOrSetUserSecretsId(string projectFilePath)
+ {
+ var resolver = new ProjectIdResolver(NullReporter.Singleton, projectFilePath);
+ var id = resolver.Resolve(projectFilePath, configuration: null);
+ if (string.IsNullOrEmpty(id))
+ {
+ return UserSecretsCreator.CreateUserSecretsId(NullReporter.Singleton, projectFilePath, projectFilePath);
+ }
+ return id;
+ }
+
+ public static string GetProject(string projectPath = null)
+ {
+ if (projectPath is not null)
+ {
+ return projectPath;
+ }
+
+ var csprojFiles = Directory.EnumerateFileSystemEntries(Directory.GetCurrentDirectory(), "*.*proj", SearchOption.TopDirectoryOnly)
+ .Where(f => !".xproj".Equals(Path.GetExtension(f), StringComparison.OrdinalIgnoreCase))
+ .ToList();
+ if (csprojFiles is [var path])
+ {
+ return path;
+ }
+ return null;
+ }
+
+ public static bool GetProjectAndSecretsId(string projectPath, IReporter reporter, out string project, out string userSecretsId)
+ {
+ project = GetProject(projectPath);
+ userSecretsId = null;
+ if (project == null)
+ {
+ reporter.Error(Resources.ProjectOption_ProjectNotFound);
+ return false;
+ }
+
+ userSecretsId = GetOrSetUserSecretsId(project);
+ if (userSecretsId == null)
+ {
+ reporter.Error(Resources.ProjectOption_SercretIdNotFound);
+ return false;
+ }
+ return true;
+ }
+
+ public static List<string> GetAudienceCandidatesFromLaunchSettings(string project)
+ {
+ if (string.IsNullOrEmpty(project))
+ {
+ return new List<string>();
+ }
+
+ var launchSettingsFilePath = Path.Combine(Path.GetDirectoryName(project)!, "Properties", "launchSettings.json");
+ var applicationUrls = new HashSet<string>();
+ if (File.Exists(launchSettingsFilePath))
+ {
+ using var launchSettingsFileStream = new FileStream(launchSettingsFilePath, FileMode.Open, FileAccess.Read);
+ if (launchSettingsFileStream.Length > 0)
+ {
+ var launchSettingsJson = JsonDocument.Parse(launchSettingsFileStream);
+
+ if (ExtractIISExpressUrlFromProfile(launchSettingsJson.RootElement) is { } iisUrls)
+ {
+ applicationUrls.UnionWith(iisUrls);
+ }
+
+ if (launchSettingsJson.RootElement.TryGetProperty("profiles", out var profiles))
+ {
+ var profilesEnumerator = profiles.EnumerateObject();
+ foreach (var profile in profilesEnumerator)
+ {
+ if (ExtractKestrelUrlsFromProfile(profile) is { } kestrelUrls)
+ {
+ applicationUrls.UnionWith(kestrelUrls);
+ }
+ }
+ }
+ }
+ }
+
+ return applicationUrls.ToList();
+
+ static List<string> ExtractIISExpressUrlFromProfile(JsonElement rootElement)
+ {
+ if (rootElement.TryGetProperty("iisSettings", out var iisSettings))
+ {
+ if (iisSettings.TryGetProperty("iisExpress", out var iisExpress))
+ {
+ List<string> iisUrls = new();
+ if (iisExpress.TryGetProperty("applicationUrl", out var iisUrl))
+ {
+ iisUrls.Add(iisUrl.GetString());
+ }
+
+ if (iisExpress.TryGetProperty("sslPort", out var sslPort))
+ {
+ iisUrls.Add($"https://localhost:{sslPort.GetInt32()}");
+ }
+
+ return iisUrls;
+ }
+ }
+
+ return null;
+ }
+
+ static string[] ExtractKestrelUrlsFromProfile(JsonProperty profile)
+ {
+ if (profile.Value.TryGetProperty("commandName", out var commandName))
+ {
+ if (commandName.ValueEquals("Project"))
+ {
+ if (profile.Value.TryGetProperty("applicationUrl", out var applicationUrl))
+ {
+ var value = applicationUrl.GetString();
+ if (value is { } urls)
+ {
+ return urls.Split(';');
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+ }
+
+ public static void PrintJwt(IReporter reporter, Jwt jwt, bool showAll, JwtSecurityToken fullToken = null)
+ {
+ reporter.Output($"{Resources.JwtPrint_Id}: {jwt.Id}");
+ reporter.Output($"{Resources.JwtPrint_Name}: {jwt.Name}");
+ reporter.Output($"{Resources.JwtPrint_Scheme}: {jwt.Scheme}");
+ reporter.Output($"{Resources.JwtPrint_Audiences}: {jwt.Audience}");
+ reporter.Output($"{Resources.JwtPrint_NotBefore}: {jwt.NotBefore:O}");
+ reporter.Output($"{Resources.JwtPrint_ExpiresOn}: {jwt.Expires:O}");
+ reporter.Output($"{Resources.JwtPrint_IssuedOn}: {jwt.Issued:O}");
+
+ if (!jwt.Scopes.IsNullOrEmpty() || showAll)
+ {
+ var scopesValue = jwt.Scopes.IsNullOrEmpty()
+ ? "none"
+ : string.Join(", ", jwt.Scopes);
+ reporter.Output($"{Resources.JwtPrint_Scopes}: {scopesValue}");
+ }
+
+ if (!jwt.Roles.IsNullOrEmpty() || showAll)
+ {
+ var rolesValue = jwt.Roles.IsNullOrEmpty()
+ ? "none"
+ : string.Join(", ", jwt.Roles);
+ reporter.Output($"{Resources.JwtPrint_Roles}: [{rolesValue}]");
+ }
+
+ if (!jwt.CustomClaims.IsNullOrEmpty() || showAll)
+ {
+ var customClaimsValue = jwt.CustomClaims.IsNullOrEmpty()
+ ? "none"
+ : string.Join(", ", jwt.CustomClaims.Select(kvp => $"{kvp.Key}={kvp.Value}"));
+ reporter.Output($"{Resources.JwtPrint_CustomClaims}: [{customClaimsValue}]");
+ }
+
+ if (showAll)
+ {
+ reporter.Output($"{Resources.JwtPrint_TokenHeader}: {fullToken.Header.SerializeToJson()}");
+ reporter.Output($"{Resources.JwtPrint_TokenPayload}: {fullToken.Payload.SerializeToJson()}");
+ }
+
+ var tokenValueFieldName = showAll ? Resources.JwtPrint_CompactToken : Resources.JwtPrint_Token;
+ reporter.Output($"{tokenValueFieldName}: {jwt.Token}");
+ }
+
+ public static bool TryParseClaims(List<string> input, out Dictionary<string, string> claims)
+ {
+ claims = new Dictionary<string, string>();
+ foreach (var claim in input)
+ {
+ var parts = claim.Split('=');
+ if (parts.Length != 2)
+ {
+ return false;
+ }
+
+ var key = parts[0];
+ var value = parts[1];
+
+ claims.Add(key, value);
+ }
+ return true;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/DevJwtDefaults.cs b/src/Tools/dotnet-user-jwts/src/Helpers/DevJwtDefaults.cs
new file mode 100644
index 0000000000..e4db7e0e72
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/DevJwtDefaults.cs
@@ -0,0 +1,14 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal static class DevJwtsDefaults
+{
+ public static string Scheme => "Bearer";
+ public static string Issuer => "dotnet-user-jwts";
+
+ public static string SigningKeyConfigurationKey => "SigningKeys";
+
+ public static int SigningKeyLength => 32;
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/Jwt.cs b/src/Tools/dotnet-user-jwts/src/Helpers/Jwt.cs
new file mode 100644
index 0000000000..f465c9a955
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/Jwt.cs
@@ -0,0 +1,34 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+public record Jwt(string Id, string Scheme, string Name, string Audience, DateTimeOffset NotBefore, DateTimeOffset Expires, DateTimeOffset Issued, string Token)
+{
+ public IEnumerable<string> Scopes { get; set; } = new List<string>();
+
+ public IEnumerable<string> Roles { get; set; } = new List<string>();
+
+ public IDictionary<string, string> CustomClaims { get; set; } = new Dictionary<string, string>();
+
+ public override string ToString() => Token;
+
+ public static Jwt Create(
+ string scheme,
+ JwtSecurityToken token,
+ string encodedToken,
+ IEnumerable<string> scopes = null,
+ IEnumerable<string> roles = null,
+ IDictionary<string, string> customClaims = null)
+ {
+ return new Jwt(token.Id, scheme, token.Subject, string.Join(", ", token.Audiences), token.ValidFrom, token.ValidTo, token.IssuedAt, encodedToken)
+ {
+ Scopes = scopes,
+ Roles = roles,
+ CustomClaims = customClaims
+ };
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/JwtAuthenticationSchemeSettings.cs b/src/Tools/dotnet-user-jwts/src/Helpers/JwtAuthenticationSchemeSettings.cs
new file mode 100644
index 0000000000..63f16cb765
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/JwtAuthenticationSchemeSettings.cs
@@ -0,0 +1,79 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Linq;
+using System.Text.Json;
+using System.Text.Json.Nodes;
+using Microsoft.IdentityModel.Tokens;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed record JwtAuthenticationSchemeSettings(string SchemeName, List<string> Audiences, string ClaimsIssuer)
+{
+ private const string AuthenticationKey = "Authentication";
+ private const string SchemesKey = "Schemes";
+
+ private static readonly JsonSerializerOptions _jsonSerializerOptions = new JsonSerializerOptions
+ {
+ WriteIndented = true,
+ };
+
+ public void Save(string filePath)
+ {
+ using var reader = new FileStream(filePath, FileMode.Open, FileAccess.Read);
+ var config = JsonSerializer.Deserialize<JsonObject>(reader, _jsonSerializerOptions);
+ reader.Close();
+
+ var settingsObject = new JsonObject
+ {
+ [nameof(TokenValidationParameters.ValidAudiences)] = new JsonArray(Audiences.Select(aud => JsonValue.Create(aud)).ToArray()),
+ [nameof(TokenValidationParameters.ValidIssuer)] = ClaimsIssuer
+ };
+
+ if (config[AuthenticationKey] is JsonObject authentication)
+ {
+ if (authentication[SchemesKey] is JsonObject schemes)
+ {
+ // If a scheme with the same name has already been registered, we
+ // override with the latest token's options
+ schemes[SchemeName] = settingsObject;
+ }
+ else
+ {
+ authentication.Add(SchemesKey, new JsonObject
+ {
+ [SchemeName] = settingsObject
+ });
+ }
+ }
+ else
+ {
+ config[AuthenticationKey] = new JsonObject
+ {
+ [SchemesKey] = new JsonObject
+ {
+ [SchemeName] = settingsObject
+ }
+ };
+ }
+
+ using var writer = new FileStream(filePath, FileMode.Open, FileAccess.Write);
+ JsonSerializer.Serialize(writer, config, _jsonSerializerOptions);
+ }
+
+ public static void RemoveScheme(string filePath, string name)
+ {
+ using var reader = new FileStream(filePath, FileMode.Open, FileAccess.Read);
+ var config = JsonSerializer.Deserialize<JsonObject>(reader);
+ reader.Close();
+
+ if (config[AuthenticationKey] is JsonObject authentication &&
+ authentication[SchemesKey] is JsonObject schemes)
+ {
+ schemes.Remove(name);
+ }
+
+ using var writer = new FileStream(filePath, FileMode.Create, FileAccess.Write);
+ JsonSerializer.Serialize(writer, config, _jsonSerializerOptions);
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/JwtCreatorOptions.cs b/src/Tools/dotnet-user-jwts/src/Helpers/JwtCreatorOptions.cs
new file mode 100644
index 0000000000..589f3d5d07
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/JwtCreatorOptions.cs
@@ -0,0 +1,15 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed record JwtCreatorOptions(
+ string Scheme,
+ string Name,
+ List<string> Audiences,
+ string Issuer,
+ DateTime NotBefore,
+ DateTime ExpiresOn,
+ List<string> Roles,
+ List<string> Scopes,
+ Dictionary<string, string> Claims);
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/JwtIssuer.cs b/src/Tools/dotnet-user-jwts/src/Helpers/JwtIssuer.cs
new file mode 100644
index 0000000000..cf086d1d76
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/JwtIssuer.cs
@@ -0,0 +1,88 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Globalization;
+using System.IdentityModel.Tokens.Jwt;
+using System.Linq;
+using System.Security.Claims;
+using System.Security.Principal;
+using Microsoft.IdentityModel.Tokens;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+internal sealed class JwtIssuer
+{
+ private readonly SymmetricSecurityKey _signingKey;
+
+ public JwtIssuer(string issuer, byte[] signingKeyMaterial)
+ {
+ Issuer = issuer;
+ _signingKey = new SymmetricSecurityKey(signingKeyMaterial);
+ }
+
+ public string Issuer { get; }
+
+ public JwtSecurityToken Create(JwtCreatorOptions options)
+ {
+ var identity = new GenericIdentity(options.Name);
+
+ identity.AddClaim(new Claim(JwtRegisteredClaimNames.Sub, options.Name));
+
+ var id = Guid.NewGuid().ToString().GetHashCode().ToString("x", CultureInfo.InvariantCulture);
+ identity.AddClaim(new Claim(JwtRegisteredClaimNames.Jti, id));
+
+ if (options.Scopes is { } scopesToAdd)
+ {
+ identity.AddClaims(scopesToAdd.Select(s => new Claim("scope", s)));
+ }
+
+ if (options.Roles is { } rolesToAdd)
+ {
+ identity.AddClaims(rolesToAdd.Select(r => new Claim(ClaimTypes.Role, r)));
+ }
+
+ if (options.Claims is { Count: > 0 } claimsToAdd)
+ {
+ identity.AddClaims(claimsToAdd.Select(kvp => new Claim(kvp.Key, kvp.Value)));
+ }
+
+ // Although the JwtPayload supports having multiple audiences registered, the
+ // creator methods and constructors don't provide a way of setting multiple
+ // audiences. Instead, we have to register an `aud` claim for each audience
+ // we want to add so that the multiple audiences are populated correctly.
+ if (options.Audiences is { Count: > 0} audiences)
+ {
+ identity.AddClaims(audiences.Select(aud => new Claim(JwtRegisteredClaimNames.Aud, aud)));
+ }
+
+ var handler = new JwtSecurityTokenHandler();
+ var jwtSigningCredentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256Signature);
+ var jwtToken = handler.CreateJwtSecurityToken(Issuer, audience: null, identity, options.NotBefore, options.ExpiresOn, issuedAt: DateTime.UtcNow, jwtSigningCredentials);
+ return jwtToken;
+ }
+
+ public static string WriteToken(JwtSecurityToken token)
+ {
+ var handler = new JwtSecurityTokenHandler();
+ return handler.WriteToken(token);
+ }
+
+ public static JwtSecurityToken Extract(string token) => new JwtSecurityToken(token);
+
+ public bool IsValid(string encodedToken)
+ {
+ var handler = new JwtSecurityTokenHandler();
+ var tokenValidationParameters = new TokenValidationParameters
+ {
+ IssuerSigningKey = _signingKey,
+ ValidateAudience = false,
+ ValidateIssuer = false,
+ ValidateIssuerSigningKey = true
+ };
+ if (handler.ValidateToken(encodedToken, tokenValidationParameters, out _).Identity?.IsAuthenticated == true)
+ {
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/JwtStore.cs b/src/Tools/dotnet-user-jwts/src/Helpers/JwtStore.cs
new file mode 100644
index 0000000000..8bffc9d9c2
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/JwtStore.cs
@@ -0,0 +1,44 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.Text.Json;
+using Microsoft.Extensions.Configuration.UserSecrets;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+public class JwtStore
+{
+ private const string FileName = "user-jwts.json";
+ private readonly string _userSecretsId;
+ private readonly string _filePath;
+
+ public JwtStore(string userSecretsId)
+ {
+ _userSecretsId = userSecretsId;
+ _filePath = Path.Combine(Path.GetDirectoryName(PathHelper.GetSecretsPathFromSecretsId(userSecretsId)), FileName);
+ Load();
+ }
+
+ public IDictionary<string, Jwt> Jwts { get; private set; } = new Dictionary<string, Jwt>();
+
+ public void Load()
+ {
+ if (File.Exists(_filePath))
+ {
+ using var fileStream = new FileStream(_filePath, FileMode.Open, FileAccess.Read);
+ if (fileStream.Length > 0)
+ {
+ Jwts = JsonSerializer.Deserialize<IDictionary<string, Jwt>>(fileStream) ?? new Dictionary<string, Jwt>();
+ }
+ }
+ }
+
+ public void Save()
+ {
+ if (Jwts is not null)
+ {
+ using var fileStream = new FileStream(_filePath, FileMode.Create, FileAccess.Write);
+ JsonSerializer.Serialize(fileStream, Jwts);
+ }
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/SigningKey.cs b/src/Tools/dotnet-user-jwts/src/Helpers/SigningKey.cs
new file mode 100644
index 0000000000..199e3c3d7d
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/SigningKey.cs
@@ -0,0 +1,7 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+public record SigningKey(string Id, string Issuer, string Value, int Length)
+{
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Helpers/SigningKeysHandler.cs b/src/Tools/dotnet-user-jwts/src/Helpers/SigningKeysHandler.cs
new file mode 100644
index 0000000000..e533cc1e17
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Helpers/SigningKeysHandler.cs
@@ -0,0 +1,104 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.Configuration.UserSecrets;
+using Microsoft.Extensions.Configuration;
+using System.Text.Json.Nodes;
+using System.Text.Json;
+using System.Linq;
+using System.Globalization;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+// This class manages signing keys for JWT tokens stored in user secrets.
+// These signing keys are stored under the following configuration scheme:
+//
+// Authentication:
+// Schemes:
+// Bearer:
+// SigningKeys: [{
+// Id: abcdefghi,
+// Value: somekeyhere,
+// Issuer: someissuer,
+// Length: 32
+// },
+// {
+// Id: ihgfedcba,
+// Value: somekeyhere,
+// Issuer: someissuer2,
+// Length: 32
+// }]
+internal static class SigningKeysHandler
+{
+ public static byte[] GetSigningKeyMaterial(string userSecretsId, string scheme, string issuer)
+ {
+ var projectConfiguration = new ConfigurationBuilder()
+ .AddUserSecrets(userSecretsId)
+ .Build();
+
+ var signingKey = projectConfiguration
+ .GetSection(GetSigningKeyPropertyName(scheme))
+ .Get<SigningKey[]>()
+ ?.SingleOrDefault(key => key.Issuer == issuer);
+ var signingKeyLength = signingKey?.Length ?? DevJwtsDefaults.SigningKeyLength;
+
+ var keyMaterial = new byte[signingKeyLength];
+ if (!string.IsNullOrEmpty(signingKey?.Value)
+ && Convert.TryFromBase64String(signingKey.Value, keyMaterial, out var bytesWritten)
+ && bytesWritten == signingKeyLength)
+ {
+ return keyMaterial;
+ }
+
+ return null;
+ }
+
+ public static byte[] GetOrCreateSigningKeyMaterial(string userSecretsId, string scheme, string issuer) =>
+ GetSigningKeyMaterial(userSecretsId, scheme, issuer) ?? CreateSigningKeyMaterial(userSecretsId, scheme, issuer);
+
+ public static byte[] CreateSigningKeyMaterial(string userSecretsId, string scheme, string issuer, int signingKeyLength = 32, bool reset = false)
+ {
+ // Create signing material and save to user secrets
+ var newKeyMaterial = System.Security.Cryptography.RandomNumberGenerator.GetBytes(signingKeyLength);
+ var secretsFilePath = PathHelper.GetSecretsPathFromSecretsId(userSecretsId);
+ Directory.CreateDirectory(Path.GetDirectoryName(secretsFilePath));
+
+ JsonObject secrets = null;
+ if (File.Exists(secretsFilePath))
+ {
+ using var secretsFileStream = new FileStream(secretsFilePath, FileMode.Open, FileAccess.Read);
+ if (secretsFileStream.Length > 0)
+ {
+ secrets = JsonSerializer.Deserialize<JsonObject>(secretsFileStream);
+ }
+ }
+
+ secrets ??= new JsonObject();
+ var signkingKeysPropertyName = GetSigningKeyPropertyName(scheme);
+ var shortId = Guid.NewGuid().ToString("N").Substring(0, 8);
+ var key = new SigningKey(shortId, issuer, Convert.ToBase64String(newKeyMaterial), signingKeyLength);
+
+ if (secrets.ContainsKey(signkingKeysPropertyName))
+ {
+ var signingKeys = secrets[signkingKeysPropertyName].AsArray();
+ if (reset)
+ {
+ var toRemove = signingKeys.SingleOrDefault(key => key["Issuer"].GetValue<string>() == issuer);
+ signingKeys.Remove(toRemove);
+ }
+ signingKeys.Add(key);
+ }
+ else
+ {
+ secrets.Add(signkingKeysPropertyName, JsonValue.Create(new[] { key }));
+ }
+
+ using var secretsWriteStream = new FileStream(secretsFilePath, FileMode.Create, FileAccess.Write);
+ JsonSerializer.Serialize(secretsWriteStream, secrets);
+
+ return newKeyMaterial;
+ }
+
+ public static string GetSigningKeyPropertyName(string scheme)
+ => $"Authentication:Schemes:{scheme}:{DevJwtsDefaults.SigningKeyConfigurationKey}";
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Program.cs b/src/Tools/dotnet-user-jwts/src/Program.cs
new file mode 100644
index 0000000000..96ce31449c
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Program.cs
@@ -0,0 +1,64 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using Microsoft.Extensions.CommandLineUtils;
+using Microsoft.Extensions.Tools.Internal;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+
+public class Program
+{
+ private readonly IConsole _console;
+ private readonly IReporter _reporter;
+
+ public Program(IConsole console)
+ {
+ _console = console;
+ _reporter = new ConsoleReporter(console);
+ }
+
+ public static void Main(string[] args)
+ {
+ new Program(PhysicalConsole.Singleton).Run(args);
+ }
+
+ public void Run(string[] args)
+ {
+ ProjectCommandLineApplication userJwts = new(_reporter)
+ {
+ Name = "dotnet user-jwts"
+ };
+
+ userJwts.HelpOption("-h|--help");
+
+ // dotnet user-jwts list
+ ListCommand.Register(userJwts);
+ // dotnet user-jwts create
+ CreateCommand.Register(userJwts);
+ // dotnet user-jwts print ecd045
+ PrintCommand.Register(userJwts);
+ // dotnet user-jwts remove ecd045
+ RemoveCommand.Register(userJwts);
+ // dotnet user-jwts clear
+ ClearCommand.Register(userJwts);
+ // dotnet user-jwts key
+ KeyCommand.Register(userJwts);
+
+ // Show help information if no subcommand/option was specified.
+ userJwts.OnExecute(() => userJwts.ShowHelp());
+
+ try
+ {
+ userJwts.Execute(args);
+ }
+ catch (CommandParsingException parsingException)
+ {
+ _reporter.Error(parsingException.Message);
+ userJwts.ShowHelp();
+ }
+ catch (Exception ex)
+ {
+ _reporter.Error(ex.Message);
+ }
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/src/Resources.resx b/src/Tools/dotnet-user-jwts/src/Resources.resx
new file mode 100644
index 0000000000..6bb1597028
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/Resources.resx
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="utf-8"?>
+<root>
+ <!--
+ Microsoft ResX Schema
+
+ Version 2.0
+
+ The primary goals of this format is to allow a simple XML format
+ that is mostly human readable. The generation and parsing of the
+ various data types are done through the TypeConverter classes
+ associated with the data types.
+
+ Example:
+
+ ... ado.net/XML headers & schema ...
+ <resheader name="resmimetype">text/microsoft-resx</resheader>
+ <resheader name="version">2.0</resheader>
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
+ <value>[base64 mime encoded serialized .NET Framework object]</value>
+ </data>
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
+ <comment>This is a comment</comment>
+ </data>
+
+ There are any number of "resheader" rows that contain simple
+ name/value pairs.
+
+ Each data row contains a name, and value. The row also contains a
+ type or mimetype. Type corresponds to a .NET class that support
+ text/value conversion through the TypeConverter architecture.
+ Classes that don't support this are serialized and stored with the
+ mimetype set.
+
+ The mimetype is used for serialized objects, and tells the
+ ResXResourceReader how to depersist the object. This is currently not
+ extensible. For a given mimetype the value must be set accordingly:
+
+ Note - application/x-microsoft.net.object.binary.base64 is the format
+ that the ResXResourceWriter will generate, however the reader can
+ read any of the formats listed below.
+
+ mimetype: application/x-microsoft.net.object.binary.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.soap.base64
+ value : The object must be serialized with
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter
+ : and then encoded with base64 encoding.
+
+ mimetype: application/x-microsoft.net.object.bytearray.base64
+ value : The object must be serialized into a byte array
+ : using a System.ComponentModel.TypeConverter
+ : and then encoded with base64 encoding.
+ -->
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+ <xsd:element name="root" msdata:IsDataSet="true">
+ <xsd:complexType>
+ <xsd:choice maxOccurs="unbounded">
+ <xsd:element name="metadata">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />
+ </xsd:sequence>
+ <xsd:attribute name="name" use="required" type="xsd:string" />
+ <xsd:attribute name="type" type="xsd:string" />
+ <xsd:attribute name="mimetype" type="xsd:string" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="assembly">
+ <xsd:complexType>
+ <xsd:attribute name="alias" type="xsd:string" />
+ <xsd:attribute name="name" type="xsd:string" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="data">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+ <xsd:attribute ref="xml:space" />
+ </xsd:complexType>
+ </xsd:element>
+ <xsd:element name="resheader">
+ <xsd:complexType>
+ <xsd:sequence>
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required" />
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:choice>
+ </xsd:complexType>
+ </xsd:element>
+ </xsd:schema>
+ <resheader name="resmimetype">
+ <value>text/microsoft-resx</value>
+ </resheader>
+ <resheader name="version">
+ <value>2.0</value>
+ </resheader>
+ <resheader name="reader">
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <resheader name="writer">
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+ </resheader>
+ <data name="ClearCommand_Canceled" xml:space="preserve">
+ <value>Canceled! No JWTs were deleted.</value>
+ </data>
+ <data name="ClearCommand_Confirmed" xml:space="preserve">
+ <value>Deleted {0} token(s) from '{1}' successfully.</value>
+ </data>
+ <data name="ClearCommand_Description" xml:space="preserve">
+ <value>Remove all issued JWTs for a project</value>
+ </data>
+ <data name="ClearCommand_ForceOption_Description" xml:space="preserve">
+ <value>Don't prompt for confirmation before deleting JWTs.</value>
+ </data>
+ <data name="ClearCommand_NoJwtsRemoved" xml:space="preserve">
+ <value>There are no JWTs to delete from '{0}'.</value>
+ </data>
+ <data name="ClearCommand_Permission" xml:space="preserve">
+ <value>Are you sure you want to delete {0} JWT(s) for '{1}'?</value>
+ </data>
+ <data name="CreateCommand_AudienceOption_Description" xml:space="preserve">
+ <value>The audiences to create the JWT for. Defaults to the URLs configured in the project's launchSettings.json.</value>
+ </data>
+ <data name="CreateCommand_ClaimOption_Description" xml:space="preserve">
+ <value>Claims to add to the JWT. Specify once for each claim in the format "name=value".</value>
+ </data>
+ <data name="CreateCommand_Confirmed" xml:space="preserve">
+ <value>New JWT saved with ID '{id}'.</value>
+ </data>
+ <data name="CreateCommand_Description" xml:space="preserve">
+ <value>Issue a new JSON Web Token</value>
+ </data>
+ <data name="CreateCommand_ExpiresOnOption_Description" xml:space="preserve">
+ <value>The UTC date &amp; time the JWT should expire in the format 'yyyy-MM-dd [[[[HH:mm]]:ss]]'. Defaults to 6 months after the --not-before date. Do not use this option in conjunction with the --valid-for option.</value>
+ </data>
+ <data name="CreateCommand_InvalidClaims_Error" xml:space="preserve">
+ <value>Malformed claims supplied. Ensure each claim is in the format "name=value".</value>
+ </data>
+ <data name="CreateCommand_InvalidDate_Error" xml:space="preserve">
+ <value>The date provided for '{type}' could not be parsed. Dates must consist of a date and can include an optional timestamp.</value>
+ </data>
+ <data name="CreateCommand_InvalidExpiresOn_Error" xml:space="preserve">
+ <value>'--valid-for' and '--expires-on' are mutually exclusive flags. Provide either option but not both.</value>
+ </data>
+ <data name="CreateCommand_InvalidPeriod_Error" xml:space="preserve">
+ <value>The period provided for '{0}' could not be parsed. Ensure you use a format like '10d', '22h', '45s' etc.</value>
+ </data>
+ <data name="CreateCommand_IssuerOption_Description" xml:space="preserve">
+ <value>The issuer of the JWT. Defaults to 'dotnet-user-jwts'.</value>
+ </data>
+ <data name="CreateCommand_NameOption_Description" xml:space="preserve">
+ <value>The name of the user to create the JWT for. Defaults to the current environment user.</value>
+ </data>
+ <data name="CreateCommand_NoAudience_Error" xml:space="preserve">
+ <value>Could not determine the project's URL. Please specify an audience for the JWT using the --audience option or ensure that launchSettings.json is configured properly.</value>
+ </data>
+ <data name="CreateCommand_NotBeforeOption_Description" xml:space="preserve">
+ <value>The UTC date &amp; time the JWT should not be valid before in the format 'yyyy-MM-dd [[HH:mm[[:ss]]]]'. Defaults to the date &amp; time the JWT is created.</value>
+ </data>
+ <data name="CreateCommand_OutputOption_Description" xml:space="preserve">
+ <value>The format to use for displaying output from the command. Can be one of 'default', 'token', or 'json'.</value>
+ </data>
+ <data name="CreateCommand_RoleOption_Description" xml:space="preserve">
+ <value>A role claim to add to the JWT. Specify once for each role.</value>
+ </data>
+ <data name="CreateCommand_SchemeOption_Description" xml:space="preserve">
+ <value>The scheme name to use for the generated token. Defaults to 'Bearer'.</value>
+ </data>
+ <data name="CreateCommand_ScopeOption_Description" xml:space="preserve">
+ <value>A scope claim to add to the JWT. Specify once for each scope.</value>
+ </data>
+ <data name="CreateCommand_ValidForOption_Description" xml:space="preserve">
+ <value>The period the JWT should expire after. Specify using a number followed by a duration type like 'd' for days, 'h' for hours, 'm' for minutes, and 's' for seconds, e.g. '365d'. Do not use this option in conjunction with the --expires-on option.</value>
+ </data>
+ <data name="JwtPrint_Audiences" xml:space="preserve">
+ <value>Audience(s)</value>
+ </data>
+ <data name="JwtPrint_CompactToken" xml:space="preserve">
+ <value>Compact Token</value>
+ </data>
+ <data name="JwtPrint_CustomClaims" xml:space="preserve">
+ <value>Custom Claims</value>
+ </data>
+ <data name="JwtPrint_ExpiresOn" xml:space="preserve">
+ <value>Expires On</value>
+ </data>
+ <data name="JwtPrint_Id" xml:space="preserve">
+ <value>ID</value>
+ </data>
+ <data name="JwtPrint_IssuedOn" xml:space="preserve">
+ <value>Issued On</value>
+ </data>
+ <data name="JwtPrint_Issuer" xml:space="preserve">
+ <value>Issuer</value>
+ </data>
+ <data name="JwtPrint_Name" xml:space="preserve">
+ <value>Name</value>
+ </data>
+ <data name="JwtPrint_NotBefore" xml:space="preserve">
+ <value>Not Before</value>
+ </data>
+ <data name="JwtPrint_Roles" xml:space="preserve">
+ <value>Roles</value>
+ </data>
+ <data name="JwtPrint_Scheme" xml:space="preserve">
+ <value>Scheme</value>
+ </data>
+ <data name="JwtPrint_Scopes" xml:space="preserve">
+ <value>Scopes</value>
+ </data>
+ <data name="JwtPrint_Token" xml:space="preserve">
+ <value>Token</value>
+ </data>
+ <data name="JwtPrint_TokenHeader" xml:space="preserve">
+ <value>Token Header</value>
+ </data>
+ <data name="JwtPrint_TokenPayload" xml:space="preserve">
+ <value>Token Payload</value>
+ </data>
+ <data name="KeyCommand_Canceled" xml:space="preserve">
+ <value>Key reset canceled.</value>
+ </data>
+ <data name="KeyCommand_Confirmed" xml:space="preserve">
+ <value>Signing Key: '{0}'</value>
+ </data>
+ <data name="KeyCommand_Description" xml:space="preserve">
+ <value>Display or reset the signing key used to issue JWTs</value>
+ </data>
+ <data name="KeyCommand_ForceOption_Description" xml:space="preserve">
+ <value>Don't prompt for confirmation before resetting the signing key.</value>
+ </data>
+ <data name="KeyCommand_KeyCreated" xml:space="preserve">
+ <value>New signing key created: '{0}'</value>
+ </data>
+ <data name="KeyCommand_KeyNotFound" xml:space="preserve">
+ <value>Signing key for JWTs was not found. One will be created automatically when the first JWT is created, or you can force creation of a key with the --reset option.</value>
+ </data>
+ <data name="KeyCommand_Permission" xml:space="preserve">
+ <value>Are you sure you want to reset the JWT signing key? This will invalidate all JWTs previously issued for this project.</value>
+ </data>
+ <data name="KeyCommand_ResetOption_Description" xml:space="preserve">
+ <value>Reset the signing key. This will invalidate all previously issued JWTs for this project.</value>
+ </data>
+ <data name="KeyCommand_SchemeOption_Description" xml:space="preserve">
+ <value>The scheme name associated with the signing key to be reset or displayed. Defaults to 'Bearer'.</value>
+ </data>
+ <data name="ListCommand_Description" xml:space="preserve">
+ <value>Lists the JWTs issued for the project</value>
+ </data>
+ <data name="ListCommand_NoJwts" xml:space="preserve">
+ <value>No JWTs created yet!</value>
+ </data>
+ <data name="ListCommand_Project" xml:space="preserve">
+ <value>Project: '{0}'</value>
+ </data>
+ <data name="ListCommand_ShowTokenOption_Description" xml:space="preserve">
+ <value>Indicates whether JWT base64 strings should be shown.</value>
+ </data>
+ <data name="ListCommand_UserSecretsId" xml:space="preserve">
+ <value>User Secrets ID: '{0}'</value>
+ </data>
+ <data name="PrintCommand_Confirmed" xml:space="preserve">
+ <value>Found JWT with ID '{0}'.</value>
+ </data>
+ <data name="PrintCommand_Description" xml:space="preserve">
+ <value>Print the details of a given JWT</value>
+ </data>
+ <data name="PrintCommand_IdArgument_Description" xml:space="preserve">
+ <value>The ID of the JWT to print.</value>
+ </data>
+ <data name="PrintCommand_NoJwtFound" xml:space="preserve">
+ <value>No token with ID '{0}' found.</value>
+ </data>
+ <data name="PrintCommand_ShowAllOption_Description" xml:space="preserve">
+ <value>Whether to show all details associated with the JWT.</value>
+ </data>
+ <data name="ProjectOption_ProjectNotFound" xml:space="preserve">
+ <value>No project found at `-p|--project` path or current directory.</value>
+ </data>
+ <data name="ProjectOption_SercretIdNotFound" xml:space="preserve">
+ <value>Project does not contain a user secrets ID.</value>
+ </data>
+ <data name="ProjectOption_Description" xml:space="preserve">
+ <value>The path of the project to operate on. Defaults to the project in the current directory.</value>
+ </data>
+ <data name="RemoveCommand_Confirmed" xml:space="preserve">
+ <value>Deleted JWT with ID '{0}'.</value>
+ </data>
+ <data name="RemoveCommand_Description" xml:space="preserve">
+ <value>Remove a given JWT</value>
+ </data>
+ <data name="RemoveCommand_IdArgument_Description" xml:space="preserve">
+ <value>The ID of the JWT to delete.</value>
+ </data>
+ <data name="RemoveCommand_NoJwtFound" xml:space="preserve">
+ <value>No JWT with ID '{0}' found.</value>
+ </data>
+ <data name="KeyCommand_IssuerOption_Description" xml:space="preserve">
+ <value>The issuer associated with the signing key to be reset or displayed. Defaults to 'dotnet-user-jwts'.</value>
+ </data>
+</root> \ No newline at end of file
diff --git a/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj b/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj
new file mode 100644
index 0000000000..b718158881
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/src/dotnet-user-jwts.csproj
@@ -0,0 +1,39 @@
+<Project Sdk="Microsoft.NET.Sdk">
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <OutputType>exe</OutputType>
+ <Description>Command line tool to manage JSON Web Tokens in a user application.</Description>
+ <GenerateUserSecretsAttribute>false</GenerateUserSecretsAttribute>
+ <PackageTags>configuration;authentication;authorization;jwt</PackageTags>
+ <RootNamespace>Microsoft.AspNetCore.Authentication.JwtBearer.Tools</RootNamespace>
+ <PackAsTool>true</PackAsTool>
+ <!-- This package is for internal use only. It contains a CLI which is bundled in the .NET Core SDK. -->
+ <IsShippingPackage>false</IsShippingPackage>
+ <ExcludeFromSourceBuild>false</ExcludeFromSourceBuild>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" LinkBase="Shared" />
+ <Compile Include="$(ToolSharedSourceRoot)CommandLine\**\*.cs" LinkBase="Shared" />
+ <Compile Include="$(ToolSharedSourceRoot)SecretsHelpers\*.cs" LinkBase="Shared" />
+ <None Include="$(ToolSharedSourceRoot)\SecretsHelpers\assets\SecretManager.targets" Link="assets\SecretManager.targets" CopyToOutputDirectory="PreserveNewest" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <EmbeddedResource Include="$(ToolSharedSourceRoot)\SecretsHelpers\SecretsHelpersResources.resx">
+ <ManifestResourceName>Microsoft.AspNetCore.Tools.SecretsHelpersResources</ManifestResourceName>
+ <Generator></Generator>
+ </EmbeddedResource>
+ </ItemGroup>
+
+ <ItemGroup>
+ <Reference Include="System.IdentityModel.Tokens.Jwt" />
+ <Reference Include="Microsoft.Extensions.Configuration.Abstractions" />
+ <Reference Include="Microsoft.Extensions.Configuration" />
+ <Reference Include="Microsoft.Extensions.Configuration.UserSecrets" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <InternalsVisibleTo Include="Microsoft.AspNetCore.Authentication.JwtBearer.Tools.Tests" />
+ </ItemGroup>
+</Project>
diff --git a/src/Tools/dotnet-user-jwts/test/UserJwtsTestFixture.cs b/src/Tools/dotnet-user-jwts/test/UserJwtsTestFixture.cs
new file mode 100644
index 0000000000..08a232a65a
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/test/UserJwtsTestFixture.cs
@@ -0,0 +1,127 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using Microsoft.Extensions.Configuration.UserSecrets;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools.Tests;
+
+public class UserJwtsTestFixture : IDisposable
+{
+ private Stack<Action> _disposables = new Stack<Action>();
+ internal string TestSecretsId;
+
+ private const string ProjectTemplate = @"<Project Sdk=""Microsoft.NET.Sdk"">
+ <PropertyGroup>
+ <OutputType>Exe</OutputType>
+ <TargetFramework>net7.0</TargetFramework>
+ {0}
+ <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
+ </PropertyGroup>
+</Project>";
+
+ private const string LaunchSettingsTemplate = @"
+{
+ ""iisSettings"": {
+ ""windowsAuthentication"": false,
+ ""anonymousAuthentication"": true,
+ ""iisExpress"": {
+ ""applicationUrl"": ""http://localhost:23528"",
+ ""sslPort"": 44395
+ }
+ },
+ ""profiles"": {
+ ""HttpWebApp"": {
+ ""commandName"": ""Project"",
+ ""dotnetRunMessages"": true,
+ ""launchBrowser"": true,
+ ""applicationUrl"": ""https://localhost:5001;http://localhost:5000"",
+ ""environmentVariables"": {
+ ""ASPNETCORE_ENVIRONMENT"": ""Development""
+ }
+ },
+ ""HttpsOnly"": {
+ ""commandName"": ""Project"",
+ ""dotnetRunMessages"": true,
+ ""launchBrowser"": true,
+ ""applicationUrl"": ""https://localhost:5001"",
+ ""environmentVariables"": {
+ ""ASPNETCORE_ENVIRONMENT"": ""Development""
+ }
+ },
+ ""IIS Express"": {
+ ""commandName"": ""IISExpress"",
+ ""launchBrowser"": true,
+ ""environmentVariables"": {
+ ""ASPNETCORE_ENVIRONMENT"": ""Development""
+ }
+ }
+ }
+}";
+
+ public string CreateProject(bool hasSecret = true)
+ {
+ var projectPath = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "userjwtstest", Guid.NewGuid().ToString()));
+ Directory.CreateDirectory(Path.Combine(projectPath.FullName, "Properties"));
+ TestSecretsId = Guid.NewGuid().ToString("N");
+ var prop = hasSecret ? $"<UserSecretsId>{TestSecretsId}</UserSecretsId>" : string.Empty;
+ if (hasSecret)
+ {
+ Directory.CreateDirectory(Path.GetDirectoryName(PathHelper.GetSecretsPathFromSecretsId(TestSecretsId)));
+ }
+
+ File.WriteAllText(
+ Path.Combine(projectPath.FullName, "TestProject.csproj"),
+ string.Format(CultureInfo.InvariantCulture, ProjectTemplate, prop));
+
+ File.WriteAllText(Path.Combine(projectPath.FullName, "Properties", "launchSettings.json"),
+ LaunchSettingsTemplate);
+
+ File.WriteAllText(
+ Path.Combine(projectPath.FullName, "appsettings.Development.json"),
+ "{}");
+
+ if (hasSecret)
+ {
+ _disposables.Push(() =>
+ {
+ try
+ {
+ var secretsDir = Path.GetDirectoryName(PathHelper.GetSecretsPathFromSecretsId(TestSecretsId));
+ TryDelete(TestSecretsId);
+ }
+ catch { }
+ });
+ }
+
+ _disposables.Push(() => TryDelete(projectPath.FullName));
+
+ return projectPath.FullName;
+ }
+
+ private static void TryDelete(string directory)
+ {
+ try
+ {
+ if (Directory.Exists(directory))
+ {
+ Directory.Delete(directory, true);
+ }
+ }
+ catch (Exception)
+ {
+ Console.WriteLine("Failed to delete " + directory);
+ }
+ }
+
+ public void Dispose()
+ {
+ while (_disposables.Count > 0)
+ {
+ _disposables.Pop()?.Invoke();
+ }
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs b/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs
new file mode 100644
index 0000000000..83b48764ba
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/test/UserJwtsTests.cs
@@ -0,0 +1,558 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.IO;
+using System.Text;
+using Microsoft.AspNetCore.Testing;
+using Microsoft.Extensions.Configuration.UserSecrets;
+using Microsoft.Extensions.Tools.Internal;
+using Microsoft.AspNetCore.Authentication.JwtBearer.Tools;
+using Xunit;
+using Xunit.Abstractions;
+using System.Text.RegularExpressions;
+using System.Text.Json;
+using System.Text.Json.Nodes;
+using System.IdentityModel.Tokens.Jwt;
+using System.Reflection;
+using System.Numerics;
+
+namespace Microsoft.AspNetCore.Authentication.JwtBearer.Tools.Tests;
+
+public class UserJwtsTests : IClassFixture<UserJwtsTestFixture>
+{
+ private readonly TestConsole _console;
+ private readonly UserJwtsTestFixture _fixture;
+ private readonly ITestOutputHelper _testOut;
+
+ public UserJwtsTests(UserJwtsTestFixture fixture, ITestOutputHelper output)
+ {
+ _fixture = fixture;
+ _testOut = output;
+ _console = new TestConsole(output);
+ }
+
+ [Fact]
+ public void List_NoTokensForNewProject()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "list", "--project", project });
+ Assert.Contains("No JWTs created yet!", _console.GetOutput());
+ }
+
+ [Fact]
+ public void List_HandlesNoSecretsInProject()
+ {
+ var project = Path.Combine(_fixture.CreateProject(false), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "list", "--project", project });
+ Assert.DoesNotContain("Set UserSecretsId to ", _console.GetOutput());
+ Assert.Contains("No JWTs created yet!", _console.GetOutput());
+ }
+
+ [Fact]
+ public void Create_CreatesSecretOnNoSecretInproject()
+ {
+ var project = Path.Combine(_fixture.CreateProject(false), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ var output = _console.GetOutput();
+ Assert.DoesNotContain("could not find SecretManager.targets", output);
+ Assert.DoesNotContain("Set UserSecretsId to ", output);
+ Assert.Contains("New JWT saved", output);
+ }
+
+ [Fact]
+ public void Create_WritesGeneratedTokenToDisk()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var appsettings = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ Assert.Contains("New JWT saved", _console.GetOutput());
+ Assert.Contains("dotnet-user-jwts", File.ReadAllText(appsettings));
+ }
+
+ [Fact]
+ public void Print_ReturnsNothingForMissingToken()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "print", "invalid-id", "--project", project });
+ Assert.Contains("No token with ID 'invalid-id' found", _console.GetOutput());
+ }
+
+ [Fact]
+ public void List_ReturnsIdForGeneratedToken()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var appsettings = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--scheme", "MyCustomScheme" });
+ Assert.Contains("New JWT saved", _console.GetOutput());
+
+ app.Run(new[] { "list", "--project", project });
+ Assert.Contains("MyCustomScheme", _console.GetOutput());
+ }
+
+ [Fact]
+ public void Remove_RemovesGeneratedToken()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var appsettings = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ var matches = Regex.Matches(_console.GetOutput(), "New JWT saved with ID '(.*?)'");
+ var id = matches.SingleOrDefault().Groups[1].Value;
+ app.Run(new[] { "create", "--project", project, "--scheme", "Scheme2" });
+
+ app.Run(new[] { "remove", id, "--project", project });
+ var appsettingsContent = File.ReadAllText(appsettings);
+ Assert.DoesNotContain(DevJwtsDefaults.Scheme, appsettingsContent);
+ Assert.Contains("Scheme2", appsettingsContent);
+ }
+
+ [Fact]
+ public void Clear_RemovesGeneratedTokens()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var appsettings = Path.Combine(Path.GetDirectoryName(project), "appsettings.Development.json");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ app.Run(new[] { "create", "--project", project, "--scheme", "Scheme2" });
+
+ Assert.Contains("New JWT saved", _console.GetOutput());
+
+ app.Run(new[] { "clear", "--project", project, "--force" });
+ var appsettingsContent = File.ReadAllText(appsettings);
+ Assert.DoesNotContain(DevJwtsDefaults.Scheme, appsettingsContent);
+ Assert.DoesNotContain("Scheme2", appsettingsContent);
+ }
+
+ [Fact]
+ public void Key_CanResetSigningKey()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ app.Run(new[] { "key", "--project", project });
+ Assert.Contains("Signing Key:", _console.GetOutput());
+
+ app.Run(new[] { "key", "--reset", "--force", "--project", project });
+ Assert.Contains("New signing key created:", _console.GetOutput());
+ }
+
+ [Fact]
+ public async Task Key_CanResetSigningKey_WhenSecretsHasPrepulatedData()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+ var secretsFilePath = PathHelper.GetSecretsPathFromSecretsId(_fixture.TestSecretsId);
+ await File.WriteAllTextAsync(secretsFilePath,
+@"{
+ ""Foo"": {
+ ""Bar"": ""baz""
+ }
+}");
+
+ app.Run(new[] { "create", "--project", project });
+ app.Run(new[] { "key", "--project", project });
+ Assert.Contains("Signing Key:", _console.GetOutput());
+
+ app.Run(new[] { "key", "--reset", "--force", "--project", project });
+ Assert.Contains("New signing key created:", _console.GetOutput());
+
+ using FileStream openStream = File.OpenRead(secretsFilePath);
+ var secretsJson = await JsonSerializer.DeserializeAsync<JsonObject>(openStream);
+ Assert.NotNull(secretsJson);
+ Assert.True(secretsJson.ContainsKey(SigningKeysHandler.GetSigningKeyPropertyName(DevJwtsDefaults.Scheme)));
+ Assert.True(secretsJson.TryGetPropertyValue("Foo", out var fooField));
+ Assert.Equal("baz", fooField["Bar"].GetValue<string>());
+ }
+
+ [Fact]
+ public void Command_ShowsHelpForInvalidCommand()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ var exception = Record.Exception(() => app.Run(new[] { "not-real", "--project", project }));
+
+ Assert.Null(exception);
+ Assert.Contains("Unrecognized command or argument 'not-real'", _console.GetOutput());
+ }
+
+ [Fact]
+ public void CreateCommand_ShowsBasicTokenDetails()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"Name: {Environment.UserName}", output);
+ Assert.Contains("Token: ", output);
+ Assert.DoesNotContain("Scheme", output);
+ }
+
+ [Fact]
+ public void CreateCommand_SupportsODateTimeFormats()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--expires-on", DateTime.Now.AddDays(2).ToString("O") });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"Name: {Environment.UserName}", output);
+ Assert.Contains("Token: ", output);
+ Assert.Contains("Expires On", output);
+ Assert.DoesNotContain("Scheme", output);
+ }
+
+ [Fact]
+ public void CreateCommand_ShowsCustomizedTokenDetails()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--scheme", "customScheme" });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"Name: {Environment.UserName}", output);
+ Assert.Contains("Token: ", output);
+ Assert.Contains("Scheme: customScheme", output);
+ }
+
+ [Fact]
+ public void CreateCommand_DisplaysErrorForInvalidExpiresOnCombination()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--expires-on", DateTime.UtcNow.AddDays(2).ToString("O"), "--valid-for", "2h" });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"'--valid-for' and '--expires-on' are mutually exclusive flags. Provide either option but not both.", output);
+ Assert.DoesNotContain("Expires On: ", output);
+ }
+
+ [Fact]
+ public void PrintCommand_ShowsBasicOptions()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project });
+ var matches = Regex.Matches(_console.GetOutput(), "New JWT saved with ID '(.*?)'");
+ var id = matches.SingleOrDefault().Groups[1].Value;
+
+ app.Run(new[] { "print", id, "--project", project });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"ID: {id}", output);
+ Assert.Contains($"Name: {Environment.UserName}", output);
+ Assert.Contains($"Scheme: {DevJwtsDefaults.Scheme}", output);
+ Assert.Contains($"Audience(s): http://localhost:23528, https://localhost:44395, https://localhost:5001, http://localhost:5000", output);
+ }
+
+ [Fact]
+ public void PrintCommand_ShowsCustomizedOptions()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--role", "foobar" });
+ var matches = Regex.Matches(_console.GetOutput(), "New JWT saved with ID '(.*?)'");
+ var id = matches.SingleOrDefault().Groups[1].Value;
+
+ app.Run(new[] { "print", id, "--project", project });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"ID: {id}", output);
+ Assert.Contains($"Name: {Environment.UserName}", output);
+ Assert.Contains($"Scheme: {DevJwtsDefaults.Scheme}", output);
+ Assert.Contains($"Audience(s): http://localhost:23528, https://localhost:44395, https://localhost:5001, http://localhost:5000", output);
+ Assert.Contains($"Roles: [foobar]", output);
+ Assert.DoesNotContain("Custom Claims", output);
+ }
+
+ [Fact]
+ public void PrintComamnd_ShowsAllOptionsWithShowAll()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--claim", "foo=bar" });
+ var matches = Regex.Matches(_console.GetOutput(), "New JWT saved with ID '(.*?)'");
+ var id = matches.SingleOrDefault().Groups[1].Value;
+
+ app.Run(new[] { "print", id, "--project", project, "--show-all" });
+ var output = _console.GetOutput();
+
+ Assert.Contains($"ID: {id}", output);
+ Assert.Contains($"Name: {Environment.UserName}", output);
+ Assert.Contains($"Scheme: {DevJwtsDefaults.Scheme}", output);
+ Assert.Contains($"Audience(s): http://localhost:23528, https://localhost:44395, https://localhost:5001, http://localhost:5000", output);
+ Assert.Contains($"Scopes: none", output);
+ Assert.Contains($"Roles: [none]", output);
+ Assert.Contains($"Custom Claims: [foo=bar]", output);
+ }
+
+ [Fact]
+ public void Create_WithJsonOutput_CanBeSerialized()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "--output", "json" });
+ var output = _console.GetOutput();
+ var deserialized = JsonSerializer.Deserialize<Jwt>(output);
+
+ Assert.NotNull(deserialized);
+ Assert.Equal(DevJwtsDefaults.Scheme, deserialized.Scheme);
+ Assert.Equal(Environment.UserName, deserialized.Name);
+ }
+
+ [Fact]
+ public void Create_WithTokenOutput_ProducesSingleValue()
+ {
+ var project = Path.Combine(_fixture.CreateProject(), "TestProject.csproj");
+ var app = new Program(_console);
+
+ app.Run(new[] { "create", "--project", project, "-o", "token" });
+ var output = _console.GetOutput();
+
+ var handler = new JwtSecurityTokenHandler();
+ Assert.True(handler.CanReadToken(output.Trim()));
+ }
+
+ [Fact]
+ public void Create_GracefullyHandles_NoLaunchSettings()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+ var app = new Program(_console);
+ var launchSettingsPath = Path.Combine(projectPath, "Properties", "launchSettings.json");
+
+ File.Delete(launchSettingsPath);
+
+ app.Run(new[] { "create", "--project", project });
+ var output = _console.GetOutput();
+
+ Assert.Contains(Resources.CreateCommand_NoAudience_Error, output);
+ }
+
+ [Fact]
+ public async Task Create_GracefullyHandles_PrepopulatedSecrets()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+ var secretsFilePath = PathHelper.GetSecretsPathFromSecretsId(_fixture.TestSecretsId);
+ await File.WriteAllTextAsync(secretsFilePath,
+@"{
+ ""Foo"": {
+ ""Bar"": ""baz""
+ }
+}");
+ var app = new Program(_console);
+ app.Run(new[] { "create", "--project", project});
+ var output = _console.GetOutput();
+
+ Assert.Contains("New JWT saved", output);
+ using FileStream openStream = File.OpenRead(secretsFilePath);
+ var secretsJson = await JsonSerializer.DeserializeAsync<JsonObject>(openStream);
+ Assert.NotNull(secretsJson);
+ var signingKey = Assert.Single(secretsJson[SigningKeysHandler.GetSigningKeyPropertyName(DevJwtsDefaults.Scheme)].AsArray());
+ Assert.Equal(32, signingKey["Length"].GetValue<int>());
+ Assert.True(Convert.TryFromBase64String(signingKey["Value"].GetValue<string>(), new byte[32], out var _));
+ Assert.True(secretsJson.TryGetPropertyValue("Foo", out var fooField));
+ Assert.Equal("baz", fooField["Bar"].GetValue<string>());
+ }
+
+ [Fact]
+ public void Create_GetsAudiencesFromAllIISAndKestrel()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+
+ var app = new Program(_console);
+ app.Run(new[] { "create", "--project", project});
+ var matches = Regex.Matches(_console.GetOutput(), "New JWT saved with ID '(.*?)'");
+ var id = matches.SingleOrDefault().Groups[1].Value;
+ app.Run(new[] { "print", id, "--project", project, "--show-all" });
+ var output = _console.GetOutput();
+
+ Assert.Contains("New JWT saved", output);
+ Assert.Contains($"Audience(s): http://localhost:23528, https://localhost:44395, https://localhost:5001, http://localhost:5000", output);
+ }
+
+ [Fact]
+ public async Task Create_SupportsSettingACustomIssuerAndScheme()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+ var secretsFilePath = PathHelper.GetSecretsPathFromSecretsId(_fixture.TestSecretsId);
+
+ var app = new Program(_console);
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer", "--scheme", "test-scheme" });
+
+ Assert.Contains("New JWT saved", _console.GetOutput());
+
+ using FileStream openStream = File.OpenRead(secretsFilePath);
+ var secretsJson = await JsonSerializer.DeserializeAsync<JsonObject>(openStream);
+ Assert.True(secretsJson.ContainsKey(SigningKeysHandler.GetSigningKeyPropertyName("test-scheme")));
+ var signingKey = Assert.Single(secretsJson[SigningKeysHandler.GetSigningKeyPropertyName("test-scheme")].AsArray());
+ Assert.Equal(32, signingKey["Length"].GetValue<int>());
+ Assert.True(Convert.TryFromBase64String(signingKey["Value"].GetValue<string>(), new byte[32], out var _));
+ Assert.Equal("test-issuer", signingKey["Issuer"].GetValue<string>());
+ }
+
+ [Fact]
+ public async Task Create_SupportsSettingMutlipleIssuersAndSingleScheme()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+ var secretsFilePath = PathHelper.GetSecretsPathFromSecretsId(_fixture.TestSecretsId);
+
+ var app = new Program(_console);
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer", "--scheme", "test-scheme" });
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer-2", "--scheme", "test-scheme" });
+
+ Assert.Contains("New JWT saved", _console.GetOutput());
+
+ using FileStream openStream = File.OpenRead(secretsFilePath);
+ var secretsJson = await JsonSerializer.DeserializeAsync<JsonObject>(openStream);
+ Assert.True(secretsJson.ContainsKey(SigningKeysHandler.GetSigningKeyPropertyName("test-scheme")));
+ var signingKeys = secretsJson[SigningKeysHandler.GetSigningKeyPropertyName("test-scheme")].AsArray();
+ Assert.Equal(2, signingKeys.Count);
+ Assert.NotNull(signingKeys.SingleOrDefault(signingKey => signingKey["Issuer"].GetValue<string>() == "test-issuer"));
+ Assert.NotNull(signingKeys.SingleOrDefault(signingKey => signingKey["Issuer"].GetValue<string>() == "test-issuer-2"));
+ }
+
+ [Fact]
+ public async Task Create_SupportsSettingSingleIssuerAndMultipleSchemes()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+ var secretsFilePath = PathHelper.GetSecretsPathFromSecretsId(_fixture.TestSecretsId);
+
+ var app = new Program(_console);
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer", "--scheme", "test-scheme" });
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer", "--scheme", "test-scheme-2" });
+
+ Assert.Contains("New JWT saved", _console.GetOutput());
+
+ using FileStream openStream = File.OpenRead(secretsFilePath);
+ var secretsJson = await JsonSerializer.DeserializeAsync<JsonObject>(openStream);
+ var signingKey1 = Assert.Single(secretsJson[SigningKeysHandler.GetSigningKeyPropertyName("test-scheme")].AsArray());
+ Assert.Equal("test-issuer", signingKey1["Issuer"].GetValue<string>());
+ Assert.Equal(32, signingKey1["Length"].GetValue<int>());
+ Assert.True(Convert.TryFromBase64String(signingKey1["Value"].GetValue<string>(), new byte[32], out var _));
+ var signingKey2 = Assert.Single(secretsJson[SigningKeysHandler.GetSigningKeyPropertyName("test-scheme-2")].AsArray());
+ Assert.Equal("test-issuer", signingKey2["Issuer"].GetValue<string>());
+ Assert.Equal(32, signingKey2["Length"].GetValue<int>());
+ Assert.True(Convert.TryFromBase64String(signingKey2["Value"].GetValue<string>(), new byte[32], out var _));
+ }
+
+ [Fact]
+ public void Key_CanPrintAndReset_BySchemeAndIssuer()
+ {
+ var projectPath = _fixture.CreateProject();
+ var project = Path.Combine(projectPath, "TestProject.csproj");
+
+ var app = new Program(_console);
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer", "--scheme", "test-scheme" });
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer", "--scheme", "test-scheme-2" });
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer-2", "--scheme", "test-scheme" });
+ app.Run(new[] { "create", "--project", project, "--issuer", "test-issuer-2", "--scheme", "test-scheme-3" });
+
+ Assert.Contains("New JWT saved", _console.GetOutput());
+ _console.ClearOutput();
+
+ app.Run(new[] { "key", "--project", project, "--scheme", "test-scheme", "--issuer", "test-issuer" });
+ var printMatches = Regex.Matches(_console.GetOutput(), "Signing Key: '(.*?)'");
+ var key = printMatches.SingleOrDefault().Groups[1].Value;
+ _console.ClearOutput();
+
+ app.Run(new[] { "key", "--project", project, "--reset", "--force", "--scheme", "test-scheme", "--issuer", "test-issuer" });
+ var resetMatches = Regex.Matches(_console.GetOutput(), "New signing key created: '(.*?)'");
+ var resetKey = resetMatches.SingleOrDefault().Groups[1].Value;
+ Assert.NotEqual(key, resetKey);
+ }
+
+ [Fact]
+ public void Create_CanHandleNoProjectOptionProvided()
+ {
+ var projectPath = _fixture.CreateProject();
+ Directory.SetCurrentDirectory(projectPath);
+
+ var app = new Program(_console);
+ app.Run(new[] { "create" });
+
+ Assert.DoesNotContain("No project found at `-p|--project` path or current directory.", _console.GetOutput());
+ Assert.Contains("New JWT saved", _console.GetOutput());
+ }
+
+ [Fact]
+ public void Create_CanHandleNoProjectOptionProvided_WithNoProjects()
+ {
+ var path = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "userjwtstest"));
+ Directory.SetCurrentDirectory(path.FullName);
+
+ var app = new Program(_console);
+ app.Run(new[] { "create" });
+
+ Assert.Contains("No project found at `-p|--project` path or current directory.", _console.GetOutput());
+ Assert.DoesNotContain(Resources.CreateCommand_NoAudience_Error, _console.GetOutput());
+ }
+
+ [Fact]
+ public void Delete_CanHandleNoProjectOptionProvided_WithNoProjects()
+ {
+ var path = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "userjwtstest"));
+ Directory.SetCurrentDirectory(path.FullName);
+
+ var app = new Program(_console);
+ app.Run(new[] { "remove", "some-id" });
+
+ Assert.Contains("No project found at `-p|--project` path or current directory.", _console.GetOutput());
+ }
+
+ [Fact]
+ public void Clear_CanHandleNoProjectOptionProvided_WithNoProjects()
+ {
+ var path = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "userjwtstest"));
+ Directory.SetCurrentDirectory(path.FullName);
+
+ var app = new Program(_console);
+ app.Run(new[] { "clear" });
+
+ Assert.Contains("No project found at `-p|--project` path or current directory.", _console.GetOutput());
+ }
+
+ [Fact]
+ public void List_CanHandleNoProjectOptionProvided_WithNoProjects()
+ {
+ var path = Directory.CreateDirectory(Path.Combine(Path.GetTempPath(), "userjwtstest"));
+ Directory.SetCurrentDirectory(path.FullName);
+
+ var app = new Program(_console);
+ app.Run(new[] { "list" });
+
+ Assert.Contains("No project found at `-p|--project` path or current directory.", _console.GetOutput());
+ }
+}
diff --git a/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj b/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj
new file mode 100644
index 0000000000..5ad17868a9
--- /dev/null
+++ b/src/Tools/dotnet-user-jwts/test/dotnet-user-jwts.Tests.csproj
@@ -0,0 +1,17 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
+ <AssemblyName>Microsoft.AspNetCore.Authentication.JwtBearer.Tools.Tests</AssemblyName>
+ </PropertyGroup>
+
+ <ItemGroup>
+ <Compile Include="$(ToolSharedSourceRoot)TestHelpers\**\*.cs" />
+ <Content Include="$(ToolSharedSourceRoot)\SecretsHelpers\assets\SecretManager.targets" Link="assets\SecretManager.targets" CopyToOutputDirectory="PreserveNewest" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Include="..\src\dotnet-user-jwts.csproj" />
+ </ItemGroup>
+
+</Project>
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/ClearCommand.cs b/src/Tools/dotnet-user-secrets/src/Internal/ClearCommand.cs
index 5b0285278e..dc047c1a86 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/ClearCommand.cs
+++ b/src/Tools/dotnet-user-secrets/src/Internal/ClearCommand.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.CommandLineUtils;
namespace Microsoft.Extensions.SecretManager.Tools.Internal;
-internal class ClearCommand : ICommand
+internal sealed class ClearCommand : ICommand
{
public static void Configure(CommandLineApplication command, CommandLineOptions options)
{
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/InitCommand.cs b/src/Tools/dotnet-user-secrets/src/Internal/InitCommand.cs
index 1668473925..d6aa7edd15 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/InitCommand.cs
+++ b/src/Tools/dotnet-user-secrets/src/Internal/InitCommand.cs
@@ -1,12 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
-using System;
-using System.IO;
-using System.Linq;
-using System.Xml;
-using System.Xml.Linq;
-using System.Xml.XPath;
using Microsoft.Extensions.CommandLineUtils;
namespace Microsoft.Extensions.SecretManager.Tools.Internal;
@@ -73,72 +67,6 @@ public class InitCommand : ICommand
public void Execute(CommandContext context)
{
- var projectPath = ResolveProjectPath(ProjectPath, WorkingDirectory);
-
- // Load the project file as XML
- var projectDocument = XDocument.Load(projectPath, LoadOptions.PreserveWhitespace);
-
- // Accept the `--id` CLI option to the main app
- string newSecretsId = string.IsNullOrWhiteSpace(OverrideId)
- ? Guid.NewGuid().ToString()
- : OverrideId;
-
- // Confirm secret ID does not contain invalid characters
- if (Path.GetInvalidPathChars().Any(invalidChar => newSecretsId.Contains(invalidChar)))
- {
- throw new ArgumentException(Resources.FormatError_InvalidSecretsId(newSecretsId));
- }
-
- var existingUserSecretsId = projectDocument.XPathSelectElements("//UserSecretsId").FirstOrDefault();
-
- // Check if a UserSecretsId is already set
- if (existingUserSecretsId is object)
- {
- // Only set the UserSecretsId if the user specified an explicit value
- if (string.IsNullOrWhiteSpace(OverrideId))
- {
- context.Reporter.Output(Resources.FormatMessage_ProjectAlreadyInitialized(projectPath));
- return;
- }
-
- existingUserSecretsId.SetValue(newSecretsId);
- }
- else
- {
- // Find the first non-conditional PropertyGroup
- var propertyGroup = projectDocument.Root.DescendantNodes()
- .FirstOrDefault(node => node is XElement el
- && el.Name == "PropertyGroup"
- && el.Attributes().All(attr =>
- attr.Name != "Condition")) as XElement;
-
- // No valid property group, create a new one
- if (propertyGroup == null)
- {
- propertyGroup = new XElement("PropertyGroup");
- projectDocument.Root.AddFirst(propertyGroup);
- }
-
- // Add UserSecretsId element
- propertyGroup.Add(" ");
- propertyGroup.Add(new XElement("UserSecretsId", newSecretsId));
- propertyGroup.Add($"{Environment.NewLine} ");
- }
-
- var settings = new XmlWriterSettings
- {
- OmitXmlDeclaration = true,
- };
-
- using var xw = XmlWriter.Create(projectPath, settings);
- projectDocument.Save(xw);
-
- context.Reporter.Output(Resources.FormatMessage_SetUserSecretsIdForProject(newSecretsId, projectPath));
- }
-
- private static string ResolveProjectPath(string name, string path)
- {
- var finder = new MsBuildProjectFinder(path);
- return finder.FindMsBuildProject(name);
+ UserSecretsCreator.CreateUserSecretsId(context.Reporter, ProjectPath, WorkingDirectory, OverrideId);
}
}
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/ListCommand.cs b/src/Tools/dotnet-user-secrets/src/Internal/ListCommand.cs
index 4f4dddd0df..e89a7e3be3 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/ListCommand.cs
+++ b/src/Tools/dotnet-user-secrets/src/Internal/ListCommand.cs
@@ -7,7 +7,7 @@ using Newtonsoft.Json.Linq;
namespace Microsoft.Extensions.SecretManager.Tools.Internal;
-internal class ListCommand : ICommand
+internal sealed class ListCommand : ICommand
{
private readonly bool _jsonOutput;
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/RemoveCommand.cs b/src/Tools/dotnet-user-secrets/src/Internal/RemoveCommand.cs
index f2ddb23cee..9db906e927 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/RemoveCommand.cs
+++ b/src/Tools/dotnet-user-secrets/src/Internal/RemoveCommand.cs
@@ -5,7 +5,7 @@ using Microsoft.Extensions.CommandLineUtils;
namespace Microsoft.Extensions.SecretManager.Tools.Internal;
-internal class RemoveCommand : ICommand
+internal sealed class RemoveCommand : ICommand
{
private readonly string _keyName;
diff --git a/src/Tools/dotnet-user-secrets/src/Internal/SetCommand.cs b/src/Tools/dotnet-user-secrets/src/Internal/SetCommand.cs
index 8860d41b98..75f16e2bdd 100644
--- a/src/Tools/dotnet-user-secrets/src/Internal/SetCommand.cs
+++ b/src/Tools/dotnet-user-secrets/src/Internal/SetCommand.cs
@@ -9,7 +9,7 @@ using Microsoft.Extensions.Tools.Internal;
namespace Microsoft.Extensions.SecretManager.Tools.Internal;
-internal class SetCommand
+internal sealed class SetCommand
{
public static void Configure(CommandLineApplication command, CommandLineOptions options, IConsole console)
{
@@ -56,7 +56,7 @@ Examples:
});
}
- public class FromStdInStrategy : ICommand
+ public sealed class FromStdInStrategy : ICommand
{
public void Execute(CommandContext context)
{
@@ -84,7 +84,7 @@ Examples:
}
}
- public class ForOneValueStrategy : ICommand
+ public sealed class ForOneValueStrategy : ICommand
{
private readonly string _keyName;
private readonly string _keyValue;
diff --git a/src/Tools/dotnet-user-secrets/src/Program.cs b/src/Tools/dotnet-user-secrets/src/Program.cs
index 362a0701ae..d6102f5163 100644
--- a/src/Tools/dotnet-user-secrets/src/Program.cs
+++ b/src/Tools/dotnet-user-secrets/src/Program.cs
@@ -75,14 +75,10 @@ public class Program
return 0;
}
- string userSecretsId;
- try
- {
- userSecretsId = ResolveId(options, reporter);
- }
- catch (Exception ex) when (ex is InvalidOperationException || ex is FileNotFoundException)
+ var userSecretsId = ResolveId(options, reporter);
+
+ if (string.IsNullOrEmpty(userSecretsId))
{
- reporter.Error(ex.Message);
return 1;
}
diff --git a/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj b/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj
index 1ef774e1c5..61586af02e 100644
--- a/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj
+++ b/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -16,7 +16,15 @@
<ItemGroup>
<Compile Include="$(SharedSourceRoot)CommandLineUtils\**\*.cs" />
<Compile Include="$(ToolSharedSourceRoot)CommandLine\**\*.cs" />
- <None Include="assets\**\*" CopyToOutputDirectory="PreserveNewest" CopyToPublishDirectory="PreserveNewest" />
+ <Compile Include="$(ToolSharedSourceRoot)SecretsHelpers\*.cs" />
+ <None Include="$(ToolSharedSourceRoot)\SecretsHelpers\assets\SecretManager.targets" Link="assets\SecretManager.targets" CopyToOutputDirectory="PreserveNewest" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <EmbeddedResource Include="$(ToolSharedSourceRoot)\SecretsHelpers\SecretsHelpersResources.resx">
+ <ManifestResourceName>Microsoft.AspNetCore.Tools.SecretsHelpersResources</ManifestResourceName>
+ <Generator></Generator>
+ </EmbeddedResource>
</ItemGroup>
<ItemGroup>
diff --git a/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj b/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj
index 94aa9103bd..87d33c99a1 100644
--- a/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj
+++ b/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj
@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.NET.Sdk">
+<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -7,7 +7,7 @@
<ItemGroup>
<Compile Include="$(ToolSharedSourceRoot)TestHelpers\**\*.cs" />
- <Content Include="..\src\assets\SecretManager.targets" Link="assets\SecretManager.targets" CopyToOutputDirectory="PreserveNewest" />
+ <Content Include="$(ToolSharedSourceRoot)\SecretsHelpers\assets\SecretManager.targets" Link="assets\SecretManager.targets" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
diff --git a/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj b/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj
index 6f832eb8a1..13b3a521af 100644
--- a/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj
+++ b/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj
@@ -7,7 +7,7 @@
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore</PackageTags>
<IsAspNetCoreApp>true</IsAspNetCoreApp>
- <Nullable>enable</Nullable>
+ <IsTrimmable>true</IsTrimmable>
</PropertyGroup>
<ItemGroup>
diff --git a/src/submodules/MessagePack-CSharp b/src/submodules/MessagePack-CSharp
-Subproject 6caf2996c82d2b91528fad41e9c78e09770e73d
+Subproject fe9fa0834d18492eb229ff2923024af2c87553f
diff --git a/src/submodules/googletest b/src/submodules/googletest
-Subproject 80600e56cc9afe7ee02737429f9177aa8702505
+Subproject c0e032efe587efa99413dd9ac54c3953a791558
diff --git a/src/submodules/spa-templates b/src/submodules/spa-templates
-Subproject 800ef5837e1a23da863001d2448df67ec31ce2a
+Subproject 257f68f6b82a72d15a0cb342ad07755fe3b36d6